⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 select.pas

📁 类似文明的游戏源代码。
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    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 + -