📄 select.pas
字号:
for i:=27 downto 0 do if MyRO.Wonder[i].CityID<>-1 then
begin code[0,Lines[0]]:=i; inc(Lines[0]); end;
kFarAdvance, kAdvance:
begin
nColumn:=1;
if Kind=kFarAdvance then
begin code[0,Lines[0]]:=adNone; inc(Lines[0]); end;
for i:=0 to nAdv-1 do
if (MyRO.Tech[i]=tsSeen)
or ((Kind=kFarAdvance) or MainScreen.mTechExt.Checked)
and (MyRO.Tech[i]=tsNA) and not (i in FutureTech)
and ((AdvValue[i]<2000) or (MyRO.Tech[adMassProduction]>tsNA))
and ((AdvValue[i]<1000) or (MyRO.Tech[adScience]>tsNA)) then
begin code[0,Lines[0]]:=i; inc(Lines[0]); end
else if (Kind=kAdvance)
and (Server(sSetResearch-sExecute,me,i,nil^)>=rExecuted) then
begin code[0,Lines[0]]:=i; inc(Lines[0]); end;
SortTechs;
if Kind=kAdvance then
begin
ok:=false;
for i:=0 to nDomains-1 do
if (upgrade[i,0].Preq=preNone)
or (MyRO.Tech[upgrade[i,0].Preq]>=tsApplicable) then
ok:=true;
if ok then {new unit class}
begin code[0,Lines[0]]:=adMilitary; inc(Lines[0]) end;
// remember whether direct research possible
for i:=0 to Lines[0]-1 do
if Server(sSetResearch-sExecute,me,code[0,i],nil^)>=rExecuted then
code[1,i]:=1
else code[1,i]:=0
end;
end;
kChooseTech:
begin
for i:=0 to nAdv-1 do
if not (i in FutureTech) and (MyRO.Tech[i]>=tsApplicable)
and (MyRO.EnemyReport[DipMem[me].pContact].Tech[i]<tsSeen) then
begin code[0,Lines[0]]:=i; inc(Lines[0]); end;
SortTechs;
end;
kChooseETech:
begin
for i:=0 to nAdv-1 do
if not (i in FutureTech) and (MyRO.Tech[i]<tsSeen)
and (MyRO.EnemyReport[DipMem[me].pContact].Tech[i]>=tsApplicable) then
begin code[0,Lines[0]]:=i; inc(Lines[0]); end;
SortTechs;
end;
kStealTech:
begin
for i:=0 to nAdv-1 do
if Server(sStealTech-sExecute, me, i, nil^)>=rExecuted then
begin code[0,Lines[0]]:=i; inc(Lines[0]); end;
SortTechs;
end;
kScience:
begin
Column[0]:=me;
nColumn:=1;
for p1:=0 to nPl-1 do
if (MyRO.EnemyReport[p1]<>nil) and ((MyRO.EnemyReport[p1].TurnOfContact>=0)
or (MyRO.EnemyReport[p1].TurnOfCivilReport>=0)) then
begin Column[nColumn]:=p1; inc(nColumn); end;
for i:=0 to nAdv-1 do
begin
ok:= (MyRO.Tech[i]<>tsNA) or (MyRO.ResearchTech=i);
for j:=1 to nColumn-1 do with MyRO.EnemyReport[Column[j]]^ do
if (Tech[i]<>tsNA) or (TurnOfCivilReport>=0) and (ResearchTech=i) then
ok:=true;
if ok then
begin code[0,Lines[0]]:=i; inc(Lines[0]); end;
end;
SortTechs;
ok:= MyRO.ResearchTech=adMilitary;
for j:=1 to nColumn-1 do with MyRO.EnemyReport[Column[j]]^ do
if (TurnOfCivilReport>=0) and (ResearchTech=adMilitary) then
ok:=true;
if ok then
begin code[0,Lines[0]]:=adMilitary; inc(Lines[0]); end
end;
kCities{, kChooseCity}:
begin
for i:=0 to MyRO.nCity-1 do if MyCity[i].Loc>=0 then
begin code[0,Lines[0]]:=i; inc(Lines[0]) end;
FirstShrinkedLine[0]:=0
end;
kCityEvents:
begin
for i:=0 to MyRO.nCity-1 do
if (MyCity[i].Loc>=0) and (MyCity[i].Flags and CityRepMask<>0) then
begin code[0,Lines[0]]:=i; inc(Lines[0]) end;
FirstShrinkedLine[0]:=0
end;
{ kChooseECity:
begin
for i:=0 to MyRO.nEnemyCity-1 do
if (MyRO.EnemyCity[i].Loc>=0)
and (MyRO.EnemyCity[i].owner=DipMem[me].pContact) then
begin code[0,Lines[0]]:=i; inc(Lines[0]); end;
FirstShrinkedLine:=0
end;}
kModels:
begin
for mix:=0 to MyRO.nModel-1 do code[0,MyRO.nModel-1-mix]:=mix;
Lines[0]:=MyRO.nModel;
FirstShrinkedLine[0]:=0
end;
kChooseModel:
begin
for mix:=MyRO.nModel-1 downto 0 do
begin // check if opponent already has this model
MakeModelInfo(me,mix,MyModel[mix],mi);
ok:=true;
for emix:=0 to MyRO.nEnemyModel-1 do
if (MyRO.EnemyModel[emix].Owner=DipMem[me].pContact)
and IsSameModel(MyRO.EnemyModel[emix],mi) then
ok:=false;
if ok then
begin code[0,Lines[0]]:=mix; inc(Lines[0]); end;
end;
FirstShrinkedLine[0]:=0
end;
kChooseEModel:
begin
if MyRO.TestFlags and tfUncover<>0 then
Server(sGetModels,me,0,nil^);
for emix:=0 to MyRO.nEnemyModel-1 do
ModelOk[emix]:=MyRO.EnemyModel[emix].Owner=DipMem[me].pContact;
for mix:=0 to MyRO.nModel-1 do
begin // don't list models I already have
MakeModelInfo(me,mix,MyModel[mix],mi);
for emix:=0 to MyRO.nEnemyModel-1 do
ModelOk[emix]:=ModelOk[emix]
and not IsSameModel(MyRO.EnemyModel[emix],mi);
end;
for emix:=MyRO.nEnemyModel-1 downto 0 do if ModelOk[emix] then
begin
if Tribe[DipMem[me].pContact].ModelPicture[MyRO.EnemyModel[emix].mix].HGr=0 then
InitEnemyModel(MyRO.EnemyModel[emix],true);
code[0,Lines[0]]:=emix;
inc(Lines[0]);
end;
FirstShrinkedLine[0]:=0
end;
kEModels:
begin
for i:=MyRO.EnemyReport[pOwner].nModelCounted-1 downto 0 do
begin
code[1,Lines[0]]:=MyRO.nEnemyModel-1;
while (code[1,Lines[0]]>=0)
and not ((MyRO.EnemyModel[code[1,Lines[0]]].Owner=pOwner)
and (MyRO.EnemyModel[code[1,Lines[0]]].mix=i)) do
dec(code[1,Lines[0]]);
if Tribe[pOwner].ModelPicture[i].HGr=0 then
InitEnemyModel(MyRO.EnemyModel[code[1,Lines[0]]],true);
code[0,Lines[0]]:=i;
inc(Lines[0]);
end;
FirstShrinkedLine[0]:=0
end;
kAllEModels:
begin
if (MyRO.TestFlags and tfUncover<>0) or (G.Difficulty[me]=0) then
Server(sGetModels,me,0,nil^);
for mix:=MyRO.nEnemyModel-1 downto 0 do
begin
PPicture:=@Tribe[MyRO.EnemyModel[mix].Owner].ModelPicture[MyRO.EnemyModel[mix].mix];
if PPicture.HGr=0 then InitEnemyModel(MyRO.EnemyModel[mix],true);
ok:=true;
if MainScreen.mNames.Checked then
for j:=0 to Lines[0]-1 do
begin
PTestPicture:=@Tribe[MyRO.EnemyModel[code[0,j]].Owner].ModelPicture[MyRO.EnemyModel[code[0,j]].mix];
if (PPicture.HGr=PTestPicture.HGr) and (PPicture.pix=PTestPicture.pix)
and (ModelHash(MyRO.EnemyModel[mix])=ModelHash(MyRO.EnemyModel[code[0,j]])) then
begin code[1,j]:=1; ok:=false; Break end;
end;
if ok then
begin
code[0,Lines[0]]:=mix;
code[1,Lines[0]]:=0;
inc(Lines[0]);
end
end;
FirstShrinkedLine[0]:=0
end;
kTribe:
for i:=0 to TribeNames.Count-1 do
begin code[0,Lines[0]]:=i; inc(Lines[0]) end;
kDeliver, kCost:
begin
if Kind=kDeliver then
begin
Kind:=kChooseTech; InitLines; ShowTech:= Lines[0]>0;
Kind:=kChooseModel; InitLines; ShowModel:= Lines[0]>0;
// Kind:=kChooseCity; InitLines; ShowCity:= Lines[0]>0;
Kind:=kDeliver;
Exchanged:=@DipMem[me].DeliveredPrices;
end
else // if kind=kCost then
begin
Kind:=kChooseETech; InitLines; ShowTech:= Lines[0]>0;
Kind:=kChooseEModel; InitLines; ShowModel:= Lines[0]>0;
// Kind:=kChooseECity; InitLines; ShowCity:= Lines[0]>0;
Kind:=kCost;
Exchanged:=@DipMem[me].ReceivedPrices;
end;
Lines[0]:=0;
if not (opCivilReport shr 24 in Exchanged^) then
begin code[0,Lines[0]]:=opCivilReport; inc(Lines[0]); end;
if not (opMilReport shr 24 in Exchanged^) then
begin code[0,Lines[0]]:=opMilReport; inc(Lines[0]); end;
if not (opMap shr 24 in Exchanged^) then
begin code[0,Lines[0]]:=opMap; inc(Lines[0]); end;
if MyRO.Treaty[DipMem[me].pContact]<trAlliance then
begin // suggest next treaty level
code[0,Lines[0]]:=opTreaty+MyRO.Treaty[DipMem[me].pContact]+1;
inc(Lines[0]);
end;
if MyRO.Treaty[DipMem[me].pContact]=trNone then
begin // suggest peace
code[0,Lines[0]]:=opTreaty+trPeace;
inc(Lines[0]);
end;
if MyRO.Treaty[DipMem[me].pContact]>trNone then
begin // suggest next treaty level
code[0,Lines[0]]:=opTreaty+MyRO.Treaty[DipMem[me].pContact]-1;
inc(Lines[0]);
end;
if Kind=kDeliver then
begin
for i:=0 to nShipPart-1 do
if MyRO.Ship[me].Parts[i]>0 then
begin code[0,Lines[0]]:=opShipParts+i shl 16; inc(Lines[0]); end;
end
else // if kind=kCost then
begin
for i:=0 to nShipPart-1 do
if MyRO.Ship[DipMem[me].pContact].Parts[i]>0 then
begin code[0,Lines[0]]:=opShipParts+i shl 16; inc(Lines[0]); end;
end;
code[0,Lines[0]]:=opMoney; inc(Lines[0]);
code[0,Lines[0]]:=opTribute; inc(Lines[0]);
if ShowTech then
begin code[0,Lines[0]]:=opTech; inc(Lines[0]); end;
if not (opAllTech shr 24 in Exchanged^) then
begin code[0,Lines[0]]:=opAllTech; inc(Lines[0]); end;
if ShowModel then
begin code[0,Lines[0]]:=opModel; inc(Lines[0]); end;
if not (opAllModel shr 24 in Exchanged^) then
begin code[0,Lines[0]]:=opAllModel; inc(Lines[0]); end;
// if ShowCity then begin code[0,Lines[0]]:=opCity; inc(Lines[0]); end;
code[0,Lines[0]]:=opChoose; inc(Lines[0]);
end;
kGov:
for i:=1 to nGov-1 do
if (GovPreq[i]<>preNA) and ((GovPreq[i]=preNone)
or (MyRO.Tech[GovPreq[i]]>=tsApplicable)) then
begin code[0,Lines[0]]:=i; inc(Lines[0]) end;
kMission:
for i:=0 to nSpyMission-1 do
begin code[0,Lines[0]]:=i; inc(Lines[0]) end;
end;
if Kind=kProject then // test if choice fitting to one screen
if Lines[0]+Lines[1]+Lines[2]<=MaxLines then
begin
for i:=0 to Lines[1]-1 do // add wonders to first page
begin code[0,Lines[0]]:=code[1,i]; inc(Lines[0]); end;
Lines[1]:=0;
FirstShrinkedLine[0]:=Lines[0];
for i:=0 to Lines[2]-1 do // add models to first page
begin code[0,Lines[0]]:=code[2,i]; inc(Lines[0]); end;
Lines[2]:=0;
end;
end; // InitLines
procedure TSelectDlg.FormShow(Sender: TObject);
var
i: integer;
begin
result:=-1;
Closable:=false;
InitLines;
WideBottom:=false;
for i:=1 to MaxLayer-1 do if Lines[i]>0 then WideBottom:=true;
case Kind of
kCities, kCityEvents: InnerWidth:=496+CityNameSpace;
kTribe,kDeliver,kCost: InnerWidth:=280;
kWonders: InnerWidth:=560;
kScience:
InnerWidth:=104+15+8+TechNameSpace+24*nColumn+GetSystemMetrics(SM_CXVSCROLL);
kAdvance,kFarAdvance:
InnerWidth:=104+15+8+TechNameSpace+24+GetSystemMetrics(SM_CXVSCROLL);
{ kChooseCity,kChooseECity:
InnerWidth:=104+15+8+CityNameSpace+GetSystemMetrics(SM_CXVSCROLL)}
else InnerWidth:=363;
end;
ClientWidth:=InnerWidth+2*SideFrame;
DispLines:=Lines[0];
for i:=0 to MaxLayer-1 do if Lines[i]>DispLines then DispLines:=Lines[i];
if DispLines>MaxLines then
begin
DispLines:=MaxLines;
SetWindowPos(sb.h,0,SideFrame+InnerWidth-GetSystemMetrics(SM_CXVSCROLL),36,
GetSystemMetrics(SM_CXVSCROLL),24*DispLines+48,
SWP_NOZORDER or SWP_NOREDRAW or SWP_SHOWWINDOW);
end;
InnerHeight:=24*DispLines+48;
if WideBottom then ClientHeight:=InnerHeight+2*WideFrame
else ClientHeight:=InnerHeight+WideFrame+NarrowFrame;
Layer0Btn.Visible:= WideBottom and (Lines[0]>0);
Layer1Btn.Visible:= WideBottom and (Lines[1]>0);
Layer2Btn.Visible:= WideBottom and (Lines[2]>0);
if Kind=kProject then
begin
Layer0Btn.Top:=ClientHeight-31;
Layer0Btn.Left:=ClientWidth div 2-(12+29);
Layer0Btn.Down:=true;
Layer1Btn.Top:=ClientHeight-31;
Layer1Btn.Left:=ClientWidth div 2-12;
Layer1Btn.Down:=false;
Layer2Btn.Top:=ClientHeight-31;
Layer2Btn.Left:=ClientWidth div 2-(12-29);
Layer2Btn.Down:=false;
end;
CloseBtn.Left:=ClientWidth-38;
CaptionLeft:=ToggleBtn.Left+ToggleBtn.Width;
CaptionRight:=CloseBtn.Left;
if Kind in [kCities,kCityEvents] then
begin Left:=8; Top:=8; end
else
begin {centre on screen}
Left:=(Screen.Width-Width) div 2;
Top:=(Screen.Height-Height) div 2;
end;
ToggleBtn.Visible:= Kind in [kCities,kCityEvents];
CloseBtn.Visible:= not(Kind in [kAdvance,kTribe,kStealTech]);
Layer:=0;
Sel:=-2;
InitPVSB(sb,Lines[Layer]-1,DispLines);
if Kind=kAdvance then EndPVSB(sb);
OffscreenPaint;
end;
procedure TSelectDlg.ModeBtnClick(Sender: TObject);
begin
Layer0Btn.Down:= Sender=Layer0Btn;
Layer1Btn.Down:= Sender=Layer1Btn;
Layer2Btn.Down:= Sender=Layer2Btn;
Layer:=TComponent(Sender).Tag;
Sel:=-2;
InitPVSB(sb,Lines[Layer]-1,DispLines);
OffscreenPaint;
SmartInvalidate;
end;
procedure TSelectDlg.ToggleBtnClick(Sender: TObject);
begin
if Kind=kCities then Kind:=kCityEvents
else Kind:=kCities;
OffscreenPaint;
Invalidate
end;
procedure TSelectDlg.FormKeyDown(Sender: TObject; var Key: word;
Shift: TShiftState);
begin
if (Key=VK_F3) and (Kind in [kCities,kCityEvents]) then ToggleBtnClick(nil)
else if (Key=VK_ESCAPE) and CloseBtn.Visible then Close
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -