📄 protocol.pas
字号:
(Kind:ikCommon;Preq:adUniversity;Cost:160;Maint:5), //imUniversity
(Kind:ikCommon;Preq:adSeafaring;Cost:60;Maint:1), //imHarbor
(Kind:ikCommon;Preq:adPoetry;Cost:60;Maint:2), //imTheater
(Kind:ikCommon;Preq:adIndustrialization;Cost:200;Maint:3), //imFactory
(Kind:ikCommon;Preq:adRobotics;Cost:320;Maint:5), //imMfgPlant
(Kind:ikCommon;Preq:adRecycling;Cost:320;Maint:4), //imRecycling
(Kind:ikCommon;Preq:adElectricity;Cost:120;Maint:2), //imPower
(Kind:ikCommon;Preq:adElectronics;Cost:120;Maint:1), //imHydro
(Kind:ikCommon;Preq:adNuclearPower;Cost:240;Maint:2), //imNuclear
(Kind:ikCommon;Preq:adRefining;Cost:160;Maint:2), //imPlatform
(Kind:ikCommon;Preq:preNone;Cost:40;Maint:1), //imTownHall
(Kind:ikCommon;Preq:adSanitation;Cost:120;Maint:2), //imSewer
(Kind:ikCommon;Preq:adRefrigeration;Cost:80;Maint:2), //imSupermarket
(Kind:ikCommon;Preq:adAutomobile;Cost:160;Maint:4), //imHighways
(Kind:ikCommon;Preq:adComputers;Cost:240;Maint:6), //imResLab
(Kind:ikCommon;Preq:adAdvancedRocketry;Cost:100;Maint:1), //imMissileBat
(Kind:ikCommon;Preq:adMetallurgy;Cost:80;Maint:1), //imCoastalFort
(Kind:ikCommon;Preq:adAdvancedFlight;Cost:160;Maint:1), //imAirport
(Kind:ikCommon;Preq:adAmphibiousWarfare;Cost:80;Maint:1), //imDockyard
(Kind:ikNatLocal;Preq:preNone;Cost:100;Maint:0), //imPalace
(Kind:ikNatLocal;Preq:adEngineering;Cost:400;Maint:4), //imGrWall
(Kind:ikNatLocal;Preq:adConstruction;Cost:200;Maint:4), //imColosseum
(Kind:ikNatLocal;Preq:adAstronomy;Cost:300;Maint:4), //imNatObs
(Kind:ikNatLocal;Preq:adTactics;Cost:100;Maint:4), //imElite
(Kind:ikNatLocal;Preq:adSteel;Cost:200;Maint:2), //imBunker
(Kind:ikNatLocal;Preq:adSyntheticFood;Cost:120;Maint:2), //imAlgae
(Kind:ikNatGlobal;Preq:adTheCorporation;Cost:320;Maint:4), //imStockEx
(Kind:ikNatGlobal;Preq:adSpaceFlight;Cost:400;Maint:3), //imSpacePort
(Kind:ikShipPart;Preq:adTransstellarColonization;Cost:240;Maint:0), //imShipComp
(Kind:ikShipPart;Preq:adImpulseDrive;Cost:600;Maint:0), //imShipPow
(Kind:ikShipPart;Preq:adSelfContainedEnvironment;Cost:800;Maint:0)); //imShipHab
nImpReplacement=5;
ImpReplacement: array[0..nImpReplacement-1] of
record New,Old: integer; end=
((New:imSewer;Old:imAqueduct),
(New:imCourt;Old:imTownHall),
(New:imPalace;Old:imTownHall),
(New:imPalace;Old:imCourt),
(New:imElite;Old:imBarracks));
GovPreq:array[1..nGov-1] of integer= {government prerequisites}
(preNone,adMonarchy,adTheRepublic,adTheology,adCommunism,adDemocracy,adLybertarianism);
AgePreq:array[1..3] of integer= (adScience,adMassProduction,adTransstellarColonization);
Terrain:array[0..11] of record
MoveCost,Defense,ClearTerrain,IrrEff,IrrClearWork,AfforestTerrain,MineEff,
MineAfforestWork,TransTerrain,TransWork:integer;
FoodRes,ProdRes,TradeRes:array[0..2] of integer;
end=
((MoveCost:1;Defense:4;ClearTerrain:-1;IrrEff:0;IrrClearWork:0;
AfforestTerrain:-1;MineEff:0;MineAfforestWork:0;TransTerrain:-1;
TransWork:0;FoodRes:(0,0,0);ProdRes:(0,0,0);TradeRes:(0,0,0)), {Ocn}
(MoveCost:1;Defense:4;ClearTerrain:-1;IrrEff:0;IrrClearWork:0;
AfforestTerrain:-1;MineEff:0;MineAfforestWork:0;TransTerrain:-1;
TransWork:0;FoodRes:(1,5,1);ProdRes:(0,0,5);TradeRes:(3,3,3)), {Sho}
(MoveCost:1;Defense:4;ClearTerrain:-1;IrrEff:1;IrrClearWork:600;
AfforestTerrain:fForest;MineEff:0;MineAfforestWork:1800;TransTerrain:fHills;
TransWork:3000;FoodRes:(3,2,2);ProdRes:(0,1,0);TradeRes:(1,1,1)), {Gra}
(MoveCost:1;Defense:4;ClearTerrain:fGrass;IrrEff:0;IrrClearWork:1800;
AfforestTerrain:-1;MineEff:1;MineAfforestWork:600;TransTerrain:fPrairie;
TransWork:3000;FoodRes:(0,3,0);ProdRes:(1,1,4);TradeRes:(1,1,1)), {Dst}
(MoveCost:1;Defense:4;ClearTerrain:-1;IrrEff:1;IrrClearWork:600;
AfforestTerrain:fForest;MineEff:0;MineAfforestWork:2400;TransTerrain:-1;
TransWork:0;FoodRes:(1,3,1);ProdRes:(1,1,3);TradeRes:(1,1,1)), {Pra}
(MoveCost:1;Defense:4;ClearTerrain:-1;IrrEff:1;IrrClearWork:600;
AfforestTerrain:-1;MineEff:0;MineAfforestWork:0;TransTerrain:fGrass;
TransWork:3000;FoodRes:(1,1,1);ProdRes:(0,0,4);TradeRes:(1,6,1)), {Tun}
(MoveCost:2;Defense:4;ClearTerrain:-1;IrrEff:0;IrrClearWork:0;
AfforestTerrain:-1;MineEff:3;MineAfforestWork:1800;TransTerrain:-1;
TransWork:0;FoodRes:(0,3,0);ProdRes:(1,1,0);TradeRes:(0,4,0)), {Arc}
(MoveCost:2;Defense:6;ClearTerrain:fGrass;IrrEff:0;IrrClearWork:2400;
AfforestTerrain:fForest;MineEff:0;MineAfforestWork:2400;TransTerrain:fHills;
TransWork:3000;FoodRes:(1,1,1);ProdRes:(0,4,1);TradeRes:(1,1,5)), {Swa}
(), {-}
(MoveCost:2;Defense:6;ClearTerrain:fPrairie;IrrEff:0;IrrClearWork:600;
AfforestTerrain:-1;MineEff:0;MineAfforestWork:0;TransTerrain:-1;
TransWork:0;FoodRes:(1,3,1);ProdRes:(2,2,2);TradeRes:(1,1,4)), {For}
(MoveCost:2;Defense:8;ClearTerrain:-1;IrrEff:1;IrrClearWork:600;
AfforestTerrain:-1;MineEff:3;MineAfforestWork:1200;TransTerrain:fGrass;
TransWork:6000;FoodRes:(1,1,1);ProdRes:(0,0,2);TradeRes:(0,4,0)), {Hil}
(MoveCost:3;Defense:12;ClearTerrain:-1;IrrEff:0;IrrClearWork:0;
AfforestTerrain:-1;MineEff:2;MineAfforestWork:1200;TransTerrain:-1;
TransWork:0;FoodRes:(0,0,0);ProdRes:(1,4,1);TradeRes:(0,0,7))); {Mou}
//settler work required MP
PillageWork=100;
CityWork=900;
FarmWork=3; // *IrrClearWork
RoadWork=300; // *MoveCost
RoadBridgeWork=900;
RRWork=600; // *MoveCost
RRBridgeWork=900;
CanalWork=1800;
FortWork=600; // *MoveCost
BaseWork=600; // *MoveCost
PollWork=1800;
// upgrades for new unit models
// upgrade[domain,0].preq is domain precondition advance
// cost values accumulate if prerequisite is future tech / are maximized if not
nUpgrade=15;
upgrade: array [0..nDomains-1,0..nUpgrade-1] of
record Preq,Strength,Trans,Cost: integer end=
(((Preq:adWarriorCode;Strength:4;Trans:0;Cost:3),
(Preq:adBronzeWorking;Strength:2;Trans:0;Cost:4),
(Preq:adIronWorking;Strength:2;Trans:0;Cost:5),
(Preq:adChivalry;Strength:2;Trans:0;Cost:5),
(Preq:adMonotheism;Strength:3;Trans:0;Cost:7),
(Preq:adGunpowder;Strength:3;Trans:0;Cost:8),
(Preq:adExplosives;Strength:4;Trans:0;Cost:9),
(Preq:adTactics;Strength:5;Trans:0;Cost:10),
(Preq:adRadioCommunication;Strength:6;Trans:0;Cost:11),
(Preq:adDemocracy;Strength:6;Trans:0;Cost:5),
(Preq:adMobileWarfare;Strength:7;Trans:0;Cost:12),
(Preq:adRobotics;Strength:8;Trans:0;Cost:15),
(Preq:adComposites;Strength:8;Trans:0;Cost:15),
(Preq:adTheLaser;Strength:8;Trans:0;Cost:14),
(Preq:futArmorTechnology;Strength:10;Trans:0;Cost:2)),
((Preq:adMapMaking;Strength:4;Trans:1;Cost:8),
(Preq:adNavigation;Strength:4;Trans:0;Cost:10),
(Preq:adEngineering;Strength:0;Trans:1;Cost:8),
(Preq:adGunpowder;Strength:8;Trans:0;Cost:12),
(Preq:adMagnetism;Strength:12;Trans:1;Cost:20),
(Preq:adExplosives;Strength:16;Trans:0;Cost:24),
(Preq:adSteamEngine;Strength:24;Trans:0;Cost:28),
(Preq:adAmphibiousWarfare;Strength:24;Trans:1;Cost:18),
(Preq:adAdvancedRocketry;Strength:32;Trans:0;Cost:38),
(Preq:futArmorTechnology;Strength:14;Trans:0;Cost:4),
(Preq:futMissileTechnology;Strength:14;Trans:0;Cost:4),
(Preq:preNA),(Preq:preNA),(Preq:preNA),(Preq:preNA)),
((Preq:adFlight;Strength:12;Trans:1;Cost:14),
(Preq:adTactics;Strength:6;Trans:0;Cost:17),
(Preq:adElectronics;Strength:6;Trans:0;Cost:20),
(Preq:adMin;Strength:8;Trans:0;Cost:24),
(Preq:adComposites;Strength:8;Trans:0;Cost:26),
(Preq:adIntelligenArms;Strength:11;Trans:0;Cost:32),
(Preq:futMissileTechnology;Strength:7;Trans:0;Cost:4),
(Preq:preNA),(Preq:preNA),(Preq:preNA),(Preq:preNA),(Preq:preNA),(Preq:preNA),
(Preq:preNA),(Preq:preNA)));
{model features}
nFeature=27;
mcOffense=0;mcDefense=1;mcMob=2;mcSeaTrans=3;mcCarrier=4;mcTurbines=5;
mcBombs=6;mcFuel=7;mcAirTrans=8;mcNav=9;mcRadar=10;mcSub=11;mcLongRange=12;
mcAlpine=13;mcHospital=14;mcOver=15;mcAirDef=16;mcSpy=17;mcSE=18;mcNP=19;
mcJet=20;mcStealth=21;mcFanatic=22;mcFirst=23;mcWill=24;mcAcademy=25;mcLine=26;
mcFirstNonCap=mcNav;
AutoFeature: Set of mcFirstNonCap..nFeature-1 =
[mcNav,mcSE,mcNP,mcJet,mcAcademy]; // unit class advances, automatically applied if available
Feature:array [0..nFeature-1] of {unit model features}
record Domains,Preq,Weight,Cost: integer; end=
((Domains:7;Preq:preNone;Weight:1;Cost:1), {mcOffense}
(Domains:7;Preq:preNone;Weight:1;Cost:1), {mcDefense}
(Domains:1;Preq:adHorsebackRiding;Weight:1;Cost:1), {mcMob}
(Domains:2;Preq:preNone;Weight:2;Cost:1), {mcSeaTrans}
(Domains:2;Preq:adAdvancedFlight;Weight:2;Cost:2), {mcCarrier}
(Domains:2;Preq:adPhysics;Weight:3;Cost:1), {mcTurbines}
(Domains:4;Preq:adAdvancedFlight;Weight:1;Cost:1), {mcBombs}
(Domains:4;Preq:preNone;Weight:1;Cost:1), {mcFuel}
(Domains:4;Preq:adCombinedArms;Weight:2;Cost:1), {mcAirTrans}
(Domains:2;Preq:adNavigation;Weight:0;Cost:0), {mcNav}
(Domains:2;Preq:adRadioCommunication;Weight:0;Cost:1), {mcRadar}
(Domains:2;Preq:adCombustionEngine;Weight:2;Cost:1), {mcSub}
(Domains:3;Preq:adBallistics;Weight:1;Cost:1), {mcLongRange}
(Domains:1;Preq:adTactics;Weight:2;Cost:1), {mcAlpine}
(Domains:2;Preq:adMedicine;Weight:1;Cost:1), {mcHospital}
(Domains:1;Preq:adBridgeBuilding;Weight:0;Cost:2), {mcOver}
(Domains:2;Preq:adAdvancedRocketry;Weight:1;Cost:1), {mcAirDef}
(Domains:4;Preq:adIntelligence;Weight:2;Cost:1), {mcSpy}
(Domains:2;Preq:adSteamEngine;Weight:0;Cost:0), {mcSE}
(Domains:2;Preq:adNuclearPower;Weight:0;Cost:0), {mcNP}
(Domains:4;Preq:adRocketry;Weight:0;Cost:0), {mcJet}
(Domains:4;Preq:adStealth;Weight:1;Cost:2), {mcStealth}
(Domains:5;Preq:adCommunism;Weight:0;Cost:1), {mcFanatic}
(Domains:1;Preq:preSun;Weight:0;Cost:1), {mcFirst}
(Domains:1;Preq:preSun;Weight:0;Cost:1), {mcWill}
(Domains:1;Preq:preSun;Weight:0;Cost:0), {mcAcademy}
(Domains:7;Preq:adMassProduction;Weight:0;Cost:0)); {mcLine}
WeightPreq7: array[0..nDomains-1] of integer=
(adHorsebackRiding,adSeafaring,adAdvancedFlight);
WeightPreq10: array[0..nDomains-1] of integer=
(adAutomobile,adSteel,preNA);
INFIN=999999;
type
TServerCall=function(Command,Player,Subject:integer;var Data): integer; stdcall;
TClientCall=procedure(Command,Player:integer;var Data); stdcall;
TUn=packed record
Loc, {location}
Status, // free for AI use
SavedStatus: LongInt; // for server internal use only
ID: word; // unit number, never changes, unique within this nation
mix, {model index}
Home, {home city index, -1 if none}
Master, {index of transporting unit, -1 if none}
Movement: SmallInt; {movement left for this turn}
Health, // = 100-Damage
Fuel: ShortInt;
Job, {current terrain improvement job}
Exp, {micro experience, the level is Exp div ExpCost}
TroopLoad, {number of transported ground units}
AirLoad: Byte; //number of transported air units
Flags: Cardinal;
end;
TCity=packed record
Loc, {location}
Status, // free for AI use
SavedStatus: LongInt; // for server internal use only
ID, // founding player shl 12 + number, never changes, unique within the whole game
Size: word;
Project, // current production project, see city project flags
Project0, // for server use only
Food, //collected food in storage
Pollution, //collected pollution in dump
Prod, //for project collected production points
Prod0: SmallInt; //for project collected production points in the beginning of the turn
Flags, //what happened within the last turnaround
Tiles, {currently by city exploited tiles, bitset with index
(dy+3) shl 2+(dx+3) shr 1, (dx,dy) relative to central tile}
ResourceWeights: Cardinal; // reserved for future use
Built: array[0..(nImp+3) div 4 *4 -1] of ShortInt; //array value =1 indicates built improvement
end;
TModel=packed record
Status, // free for AI use
SavedStatus: LongInt; // for server internal use only
ID, // developing player shl 12 + number, never changes, unique within the whole game
IntroTurn,
Built, //units built with this model
Lost: word; //units of this model lost in combat
Kind,
Domain: Byte;
Attack,
Defense,
Speed,
Cost,
MStrength: word; // construction time multipliers, only valid if kind is mkSelfDeveloped or mkEnemyDeveloped
MTrans,
MCost,
Weight, MaxWeight: Byte; // weight and maximum weight (construction time)
Upgrades, //bitarray indicating all upgrades
Flags: Cardinal;
Cap: array [0..(nFeature+3) div 4 *4 -1] of Byte; //special features
end;
TUnitInfo=packed record
Loc: LongInt;
mix, // index of unit model for its owner
emix: word; // index in enemy model list
Owner: Byte;
Health, // = 100-Damage
Fuel: ShortInt;
Job, //current terrain improvement job
Exp, {micro experience, the level is Exp div ExpCost}
Load: Byte; {number of transported units}
Flags: word
end;
TCityInfo=packed record
Loc,
Status, // free for AI use
SavedStatus: LongInt; // for server internal use only
Owner, // last known owner, even if not alive anymore!
ID, // founding player <<12 + number, never changes, unique within the whole game
Size,
Flags: word;
end;
TModelInfo=packed record
Owner, //Player which owns the model
mix, //index of unit model for its owner
ID: word; // developing player shl 12 + number, never changes, unique within the whole game
Kind,
Domain: Byte;
Attack,
Defense,
Speed,
Cost: word;
TTrans, //ground unit transport capability
ATrans_Fuel: Byte; //air unit transport capability resp. fuel
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -