Changeset 671


Ignore:
Timestamp:
Jul 16, 2025, 11:09:53 AM (13 hours ago)
Author:
chronos
Message:
  • Modified: Select dialog layers code refactoring.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LocalPlayer/Select.pas

    r670 r671  
    1717    kStealTech, kGov, kMission);
    1818
    19   TLayer = (laImprovements, laWonders, laClasses);
     19  TLayerIndex = (laImprovements, laWonders, laClasses);
     20
     21  { TLayer }
     22
     23  TLayer = class
     24    Index: TLayerIndex;
     25    Lines: Integer;
     26    FirstShrinkedLine: Integer;
     27    Code: array [0..4095] of Integer;
     28    procedure SwapCode(I, J: Integer);
     29    constructor Create(AIndex: TLayerIndex);
     30    procedure AddCode(Value: Integer);
     31  end;
    2032
    2133  { TListDlg }
     
    5870    ScienceNation: Integer;
    5971    ScrollBar: TPVScrollbar;
    60     Lines: array [TLayer] of Integer;
    61     FirstShrinkedLine: array [TLayer] of Integer;
    62     Code: array [TLayer, 0 .. 4095] of Integer;
     72    Layers: array [TLayerIndex] of TLayer;
    6373    Column: array [0 .. nPl - 1] of Integer;
    6474    Closable: Boolean;
     
    108118  MustChooseKind = [kTribe, kStealTech, kGov];
    109119
     120{ TLayer }
     121
     122procedure TLayer.SwapCode(I, J: Integer);
     123var
     124  Temp: Integer;
     125begin
     126  Temp := Code[I];
     127  Code[I] := Code[J];
     128  Code[J] := Code[I];
     129end;
     130
     131constructor TLayer.Create(AIndex: TLayerIndex);
     132begin
     133  Index := AIndex;
     134end;
     135
     136procedure TLayer.AddCode(Value: Integer);
     137begin
     138  Code[Lines] := Value;
     139  Inc(Lines);
     140end;
     141
    110142procedure TListDlg.FormCreate(Sender: TObject);
    111143begin
    112144  inherited;
     145  Layers[laImprovements] := TLayer.Create(laImprovements);
     146  Layers[laWonders] := TLayer.Create(laWonders);
     147  Layers[laClasses] := TLayer.Create(laClasses);
    113148  Canvas.Font.Assign(UniFont[ftNormal]);
    114149  ScrollBar := TPVScrollbar.Create(Self);
     
    130165  FreeAndNil(ScrollBar);
    131166  FreeAndNil(ScienceNationDotBuffer);
     167  FreeAndNil(Layers[laImprovements]);
     168  FreeAndNil(Layers[laWonders]);
     169  FreeAndNil(Layers[laClasses]);
    132170end;
    133171
     
    245283  CanGrow: Boolean;
    246284begin
    247   lix := Code[Layer, ScrollBar.Position + L];
     285  lix := Layer.Code[ScrollBar.Position + L];
    248286  y0 := 2 + (L + 1) * LineDistance;
    249   if ScrollBar.Position + L >= FirstShrinkedLine[Layer] then
    250     ofs := (ScrollBar.Position + L - FirstShrinkedLine[Layer]) and 1 * 33
     287  if ScrollBar.Position + L >= Layer.FirstShrinkedLine then
     288    ofs := (ScrollBar.Position + L - Layer.FirstShrinkedLine) and 1 * 33
    251289  else { if FirstShrinkedLine[Layer] < Lines[Layer] then }
    252290    ofs := 33;
     
    480518          begin
    481519            S := Tribe[mox.Owner].ModelName[mox.mix];
    482             if (Kind = kAllEModels) and (Code[laWonders, ScrollBar.Position + L] = 0) then
     520            if (Kind = kAllEModels) and (Layers[laWonders].Code[ScrollBar.Position + L] = 0) then
    483521              S := Format(Tribe[mox.Owner].TPhrase('OWNED'), [S]);
    484522          end
     
    692730    case Kind of
    693731      kTribe, kMission: // center text
    694         if Lines[laImprovements] > MaxLines then
     732        if Layers[laImprovements].Lines > MaxLines then
    695733          X := (InnerWidth - GetSystemMetrics(SM_CXVSCROLL)) div 2 -
    696734            BiColorTextWidth(ca, S) div 2
     
    765803
    766804    for I := -1 to DispLines do
    767       if (I + ScrollBar.Position >= 0) and (I + ScrollBar.Position < Lines[Layer]) then
     805      if (I + ScrollBar.Position >= 0) and (I + ScrollBar.Position < Layer.Lines) then
    768806        Self.Line(Offscreen.Canvas, I, True, False);
    769807  end;
     
    787825    Selected := -2;
    788826  if (Selected < -1) or (Selected > DispLines) or (Selected + i0 < 0) or
    789     (Selected + i0 >= Lines[Layer]) then
     827    (Selected + i0 >= Layer.Lines) then
    790828    Selected := -2;
    791829  if Selected <> Sel0 then begin
     
    914952begin
    915953  if ScrollBar.Position + Selected >= 0 then
    916     lix := Code[Layer, ScrollBar.Position + Selected];
     954    lix := Layer.Code[ScrollBar.Position + Selected];
    917955  if Kind in [kScience, kCities, kCityEvents, kModels, kEModels, kAllEModels]
    918956  then
     
    941979        kEModels:
    942980          MainScreen.UnitStatDlg.ShowNewContent_EnemyModel(wmPersistent,
    943             Code[laWonders, ScrollBar.Position + Selected]);
     981            Layers[laWonders].Code[ScrollBar.Position + Selected]);
    944982        kAllEModels, kChooseEModel:
    945983          if lix <> mixAll then
     
    9951033    then
    9961034    begin
    997       Code[Layer, Lines[Layer]] := Project;
    998       Inc(Lines[Layer]);
     1035      Layer.Code[Layer.Lines] := Project;
     1036      Inc(Layer.Lines);
    9991037    end;
    10001038  end;
     
    10021040  procedure SortTechs;
    10031041  var
    1004     I, J, Swap: Integer;
     1042    I, J: Integer;
    10051043  begin // sort by advancedness
    1006     for I := 0 to Lines[laImprovements] - 2 do
    1007       if Code[laImprovements, I] < adMilitary then
    1008         for J := I + 1 to Lines[laImprovements] - 1 do
    1009           if AdvValue[Code[laImprovements, I]] * nAdv + Code[laImprovements, I] < AdvValue[Code[laImprovements, J]] *
    1010             nAdv + Code[laImprovements, J] then
    1011           begin
    1012             Swap := Code[laImprovements, I];
    1013             Code[laImprovements, I] := Code[laImprovements, J];
    1014             Code[laImprovements, J] := Swap;
     1044    for I := 0 to Layers[laImprovements].Lines - 2 do
     1045      if Layers[laImprovements].Code[I] < adMilitary then
     1046        for J := I + 1 to Layers[laImprovements].Lines - 1 do
     1047          if AdvValue[Layers[laImprovements].Code[I]] * nAdv + Layers[laImprovements].Code[I] < AdvValue[Layers[laImprovements].Code[J]] *
     1048            nAdv + Layers[laImprovements].Code[J] then
     1049          begin
     1050            Layers[laImprovements].SwapCode(I, J);
    10151051          end;
    10161052  end;
     
    10181054  procedure SortCities;
    10191055  var
    1020     I, J, Swap: Integer;
    1021   begin
    1022     for I := 0 to Lines[laImprovements] - 2 do
    1023       for J := I + 1 to Lines[laImprovements] - 1 do
    1024         if CityName(MyCity[Code[laImprovements, I]].ID) > CityName(MyCity[Code[laImprovements, J]].ID)
     1056    I, J: Integer;
     1057  begin
     1058    for I := 0 to Layers[laImprovements].Lines - 2 do
     1059      for J := I + 1 to Layers[laImprovements].Lines - 1 do
     1060        if CityName(MyCity[Layers[laImprovements].Code[I]].ID) > CityName(MyCity[Layers[laImprovements].Code[J]].ID)
    10251061        then
    1026         begin
    1027           Swap := Code[laImprovements, I];
    1028           Code[laImprovements, I] := Code[laImprovements, J];
    1029           Code[laImprovements, J] := Swap;
    1030         end;
     1062          Layers[laImprovements].SwapCode(I, J);
    10311063  end;
    10321064
     
    10431075    I, J, Swap: Integer;
    10441076  begin // sort by code[2]
    1045     for I := 0 to Lines[laImprovements] - 2 do
    1046       for J := I + 1 to Lines[laImprovements] - 1 do
    1047         if Code[laClasses, I] > Code[laClasses, J] then
    1048         begin
    1049           Swap := Code[laImprovements, I];
    1050           Code[laImprovements, I] := Code[laImprovements, J];
    1051           Code[laImprovements, J] := Swap;
    1052           Swap := Code[laWonders, I];
    1053           Code[laWonders, I] := Code[laWonders, J];
    1054           Code[laWonders, J] := Swap;
    1055           Swap := Code[laClasses, I];
    1056           Code[laClasses, I] := Code[laClasses, J];
    1057           Code[laClasses, J] := Swap;
     1077    for I := 0 to Layers[laImprovements].Lines - 2 do
     1078      for J := I + 1 to Layers[laImprovements].Lines - 1 do
     1079        if Layers[laClasses].Code[I] > Layers[laClasses].Code[J] then
     1080        begin
     1081          Layers[laImprovements].SwapCode(I, J);
     1082          Layers[laWonders].SwapCode(I, J);
     1083          Layers[laClasses].SwapCode(I, J);
    10581084        end;
    10591085  end;
     
    10721098
    10731099var
    1074   L: TLayer;
     1100  L: TLayerIndex;
    10751101  Loc1, I, J, p1, dx, dy, mix, emix, EnemyType, TestEnemyType: Integer;
    10761102  mi: TModelInfo;
     
    10791105  Ok: Boolean;
    10801106begin
    1081   for L := Low(TLayer) to High(TLayer) do
    1082   begin
    1083     Lines[L] := 0;
    1084     FirstShrinkedLine[L] := MaxInt;
    1085   end;
     1107  for L := Low(TLayerIndex) to High(TLayerIndex) do
     1108  begin
     1109    Layers[L].Lines := 0;
     1110    Layers[L].FirstShrinkedLine := MaxInt;
     1111  end;
     1112
    10861113  case Kind of
    10871114    kProject:
    10881115      begin
    10891116        // improvements
    1090         Code[laImprovements, 0] := cpImp + imTrGoods;
    1091         Lines[laImprovements] := 1;
     1117        Layers[laImprovements].AddCode(cpImp + imTrGoods);
    10921118        for I := nWonder to nImp - 1 do
    10931119          if Imp[I].Kind = ikCommon then
    1094             TryAddImpLine(laImprovements, I + cpImp);
     1120            TryAddImpLine(Layers[laImprovements], I + cpImp);
    10951121        for I := nWonder to nImp - 1 do
    10961122          if not (Imp[I].Kind in [ikCommon, ikTrGoods]) and
    10971123            ((MyRO.NatBuilt[I] = 0) or (Imp[I].Kind = ikNatLocal)) then
    1098             TryAddImpLine(laImprovements, I + cpImp);
     1124            TryAddImpLine(Layers[laImprovements], I + cpImp);
    10991125        for I := 0 to nCityType - 1 do
    11001126          if MyData.ImpOrder[I, 0] >= 0 then
    1101           begin
    1102             Code[laImprovements, Lines[laImprovements]] := cpType + I;
    1103             Inc(Lines[laImprovements]);
    1104           end;
     1127            Layers[laImprovements].AddCode(cpType + I);
    11051128
    11061129        // wonders
    11071130        for I := 0 to nWonder - 1 do
    1108           TryAddImpLine(laWonders, I + cpImp);
     1131          TryAddImpLine(Layers[laWonders], I + cpImp);
    11091132
    11101133        // units
     
    11351158            if MyModel[I].Status and msObsolete = 0 then
    11361159            begin
    1137               Code[laClasses, Lines[laClasses]] := I;
    1138               Inc(Lines[laClasses]);
     1160              Layers[laClasses].AddCode(I);
    11391161            end;
    11401162            if MyModel[I].Status and msAllowConscripts <> 0 then
    11411163            begin
    1142               Code[laClasses, Lines[laClasses]] := I + cpConscripts;
    1143               Inc(Lines[laClasses]);
     1164              Layers[laClasses].AddCode(I + cpConscripts);
    11441165            end;
    11451166          end;
    11461167        end;
    1147         FirstShrinkedLine[laClasses] := 0;
     1168        Layers[laClasses].FirstShrinkedLine := 0;
    11481169      end;
    11491170    kAdvance:
     
    11601181            ((MyData.FarTech = adNone) or (Required[I] > 0)) then
    11611182          begin
    1162             Code[laImprovements, Lines[laImprovements]] := I;
    1163             Inc(Lines[laImprovements]);
     1183            Layers[laImprovements].AddCode(I);
    11641184          end;
    11651185        SortTechs;
    1166         if Lines[laImprovements] = 0 then // no more techs -- offer nexus
    1167         begin
    1168           Code[laImprovements, Lines[laImprovements]] := adNexus;
    1169           Inc(Lines[laImprovements]);
    1170         end;
     1186        if Layers[laImprovements].Lines = 0 then // no more techs -- offer nexus
     1187          Layers[laImprovements].AddCode(adNexus);
    11711188        Ok := False;
    11721189        for I := 0 to nDomains - 1 do
     
    11771194            end;
    11781195        if Ok then { new unit class }
    1179         begin
    1180           Code[laImprovements, Lines[laImprovements]] := adMilitary;
    1181           Inc(Lines[laImprovements]);
    1182         end;
     1196          Layers[laImprovements].AddCode(adMilitary);
    11831197      end;
    11841198    kFarAdvance:
    11851199      begin
    1186         Code[laImprovements, Lines[laImprovements]] := adNone;
    1187         Inc(Lines[laImprovements]);
     1200        Layers[laImprovements].AddCode(adNone);
    11881201        for I := 0 to nAdv - 1 do
    11891202          if not (I in FutureTech) and (MyRO.Tech[I] < tsApplicable) and
     
    11911204            ((AdvValue[I] < 1000) or (MyRO.Tech[adScience] > tsNA)) then
    11921205          begin
    1193             Code[laImprovements, Lines[laImprovements]] := I;
    1194             Inc(Lines[laImprovements]);
     1206            Layers[laImprovements].AddCode(I);
    11951207          end;
    11961208        SortTechs;
     
    12021214            (MyRO.EnemyReport[DipMem[Me].pContact].Tech[I] < tsSeen) then
    12031215          begin
    1204             Code[laImprovements, Lines[laImprovements]] := I;
    1205             Inc(Lines[laImprovements]);
     1216            Layers[laImprovements].AddCode(I);
    12061217          end;
    12071218        SortTechs;
    1208         // if Lines[0]>1 then
    1209         begin
    1210           Code[laImprovements, Lines[laImprovements]] := adAll;
    1211           Inc(Lines[laImprovements]);
     1219        // if Lines[0] > 1 then
     1220        begin
     1221          Layers[laImprovements].AddCode(adAll);
    12121222        end;
    12131223      end;
     
    12181228            (MyRO.EnemyReport[DipMem[Me].pContact].Tech[I] >= tsApplicable) then
    12191229          begin
    1220             Code[laImprovements, Lines[laImprovements]] := I;
    1221             Inc(Lines[laImprovements]);
     1230            Layers[laImprovements].AddCode(I);
    12221231          end;
    12231232        SortTechs;
    12241233        // if Lines[0] > 1 then
    12251234        begin
    1226           Code[laImprovements, Lines[laImprovements]] := adAll;
    1227           Inc(Lines[laImprovements]);
     1235          Layers[laImprovements].AddCode(adAll);
    12281236        end;
    12291237      end;
     
    12331241          if Server(sStealTech - sExecute, Me, I, nil^) >= rExecuted then
    12341242          begin
    1235             Code[laImprovements, Lines[laImprovements]] := I;
    1236             Inc(Lines[laImprovements]);
     1243            Layers[laImprovements].AddCode(I);
    12371244          end;
    12381245        SortTechs;
     
    12701277                Ok := True;
    12711278          if Ok then
    1272           begin
    1273             Code[laImprovements, Lines[laImprovements]] := I;
    1274             Inc(Lines[laImprovements]);
    1275           end;
     1279            Layers[laImprovements].AddCode(I);
    12761280        end;
    12771281        SortTechs;
     
    12861290              end;
    12871291        if Ok then
    1288         begin
    1289           Code[laImprovements, Lines[laImprovements]] := adMilitary;
    1290           Inc(Lines[laImprovements]);
    1291         end
     1292          Layers[laImprovements].AddCode(adMilitary);
    12921293      end;
    12931294    kCities { , kChooseCity } :
     
    12971298            if MyCity[I].Loc >= 0 then
    12981299            begin
    1299               Code[laImprovements, Lines[laImprovements]] := I;
    1300               Inc(Lines[laImprovements]);
     1300              Layers[laImprovements].AddCode(I);
    13011301            end;
    13021302        SortCities;
    1303         FirstShrinkedLine[laImprovements] := 0;
     1303        Layers[laImprovements].FirstShrinkedLine := 0;
    13041304      end;
    13051305    kCityEvents:
     
    13071307        for I := 0 to MyRO.nCity - 1 do
    13081308          if (MyCity[I].Loc >= 0) and (MyCity[I].Flags and CityRepMask <> 0)
    1309           then
    1310           begin
    1311             Code[laImprovements, Lines[laImprovements]] := I;
    1312             Inc(Lines[laImprovements]);
     1309          then begin
     1310            Layers[laImprovements].AddCode(I);
    13131311          end;
    13141312        SortCities;
    1315         FirstShrinkedLine[laImprovements] := 0;
     1313        Layers[laImprovements].FirstShrinkedLine := 0;
    13161314      end;
    13171315    { kChooseECity:
     
    13211319        and (MyRO.EnemyCity[I].Owner = DipMem[Me].pContact) then
    13221320        begin
    1323           Code[laImprovements, Lines[laImprovements]] := I;
    1324           Inc(Lines[laImprovements]);
    1325         end;
    1326         FirstShrinkedLine := 0;
     1321          Layers[laImprovements].AddCode(I);
     1322        end;
     1323        Layers[laImprovements].FirstShrinkedLine := 0;
    13271324      end; }
    13281325    kModels:
     
    13301327        for mix := 0 to MyRO.nModel - 1 do
    13311328        begin
    1332           Code[laImprovements, mix] := mix;
     1329          Layers[laImprovements].Code[mix] := mix;
    13331330          MakeModelInfo(Me, mix, MyModel[mix], mi);
    1334           Code[laClasses, mix] := ModelSortValue(mi);
    1335         end;
    1336         Lines[laImprovements] := MyRO.nModel;
     1331          Layers[laClasses].Code[mix] := ModelSortValue(mi);
     1332        end;
     1333        Layers[laImprovements].Lines := MyRO.nModel;
    13371334        SortModels;
    1338         FirstShrinkedLine[laImprovements] := 0;
     1335        Layers[laImprovements].FirstShrinkedLine := 0;
    13391336      end;
    13401337    kChooseModel:
     
    13521349          if Ok then
    13531350          begin
    1354             Code[laImprovements, Lines[laImprovements]] := mix;
     1351            Layers[laImprovements].Code[Layers[laImprovements].Lines] := mix;
    13551352            MakeModelInfo(Me, mix, MyModel[mix], mi);
    1356             Code[laClasses, Lines[laImprovements]] := ModelSortValue(mi);
    1357             Inc(Lines[laImprovements]);
     1353            Layers[laClasses].Code[Layers[laImprovements].Lines] := ModelSortValue(mi);
     1354            Inc(Layers[laImprovements].Lines);
    13581355          end;
    13591356        end;
    13601357        SortModels;
    1361         // if Lines[0]>1 then
    1362         begin
    1363           Code[laImprovements, Lines[laImprovements]] := mixAll;
    1364           Inc(Lines[laImprovements]);
    1365         end;
    1366         FirstShrinkedLine[laImprovements] := 0;
     1358          Layers[laImprovements].AddCode(mixAll);
     1359          Layers[laImprovements].FirstShrinkedLine := 0;
    13671360      end;
    13681361    kChooseEModel:
     
    13851378              [MyRO.EnemyModel[emix].mix].HGr) then
    13861379              InitEnemyModel(emix);
    1387             Code[laImprovements, Lines[laImprovements]] := emix;
    1388             Code[laClasses, Lines[laImprovements]] := ModelSortValue(MyRO.EnemyModel[emix]);
    1389             Inc(Lines[laImprovements]);
     1380            Layers[laImprovements].Code[Layers[laImprovements].Lines] := emix;
     1381            Layers[laClasses].Code[Layers[laImprovements].Lines] := ModelSortValue(MyRO.EnemyModel[emix]);
     1382            Inc(Layers[laImprovements].Lines);
    13901383          end;
    13911384        SortModels;
    1392         // if not IsMilReportNew(DipMem[me].pContact) or (Lines[laImprovements] > 1) then
    1393         begin
    1394           Code[laImprovements, Lines[laImprovements]] := mixAll;
    1395           Inc(Lines[laImprovements]);
    1396         end;
    1397         FirstShrinkedLine[laImprovements] := 0;
     1385        // if not IsMilReportNew(DipMem[me].pContact) or (Layers[laImprovements].Lines > 1) then
     1386        begin
     1387          Layers[laImprovements].AddCode(mixAll);
     1388        end;
     1389        Layers[laImprovements].FirstShrinkedLine := 0;
    13981390      end;
    13991391    kEModels:
     
    14011393        for I := 0 to MyRO.EnemyReport[pView].nModelCounted - 1 do
    14021394        begin
    1403           Code[laWonders, Lines[laImprovements]] := MyRO.nEnemyModel - 1;
    1404           while (Code[laWonders, Lines[laImprovements]] >= 0) and
    1405             not ((MyRO.EnemyModel[Code[laWonders, Lines[laImprovements]]].Owner = pView) and
    1406             (MyRO.EnemyModel[Code[laWonders, Lines[laImprovements]]].mix = I)) do
    1407             Dec(Code[laWonders, Lines[laImprovements]]);
     1395          Layers[laWonders].Code[Layers[laImprovements].Lines] := MyRO.nEnemyModel - 1;
     1396          while (Layers[laWonders].Code[Layers[laImprovements].Lines] >= 0) and
     1397            not ((MyRO.EnemyModel[Layers[laWonders].Code[Layers[laImprovements].Lines]].Owner = pView) and
     1398            (MyRO.EnemyModel[Layers[laWonders].Code[Layers[laImprovements].Lines]].mix = I)) do
     1399            Dec(Layers[laWonders].Code[Layers[laImprovements].Lines]);
    14081400          if not Assigned(Tribe[pView].ModelPicture[I].HGr) then
    1409             InitEnemyModel(Code[laWonders, Lines[laImprovements]]);
    1410           Code[laImprovements, Lines[laImprovements]] := I;
    1411           Code[laClasses, Lines[laImprovements]] :=
    1412             ModelSortValue(MyRO.EnemyModel[Code[laWonders, Lines[laImprovements]]]);
    1413           Inc(Lines[laImprovements]);
     1401            InitEnemyModel(Layers[laWonders].Code[Layers[laImprovements].Lines]);
     1402          Layers[laImprovements].Code[Layers[laImprovements].Lines] := I;
     1403          Layers[laClasses].Code[Layers[laImprovements].Lines] :=
     1404            ModelSortValue(MyRO.EnemyModel[Layers[laWonders].Code[Layers[laImprovements].Lines]]);
     1405          Inc(Layers[laImprovements].Lines);
    14141406        end;
    14151407        SortModels;
    1416         FirstShrinkedLine[laImprovements] := 0;
     1408        Layers[laImprovements].FirstShrinkedLine := 0;
    14171409      end;
    14181410    kAllEModels:
     
    14311423            Ok := True;
    14321424            if MainScreen.mNames.Checked then
    1433               for J := 0 to Lines[laImprovements] - 1 do
     1425              for J := 0 to Layers[laImprovements].Lines - 1 do
    14341426              begin
    1435                 PTestPicture := @Tribe[MyRO.EnemyModel[Code[laImprovements, J]].Owner]
    1436                   .ModelPicture[MyRO.EnemyModel[Code[laImprovements, J]].mix];
     1427                PTestPicture := @Tribe[MyRO.EnemyModel[Layers[laImprovements].Code[J]].Owner]
     1428                  .ModelPicture[MyRO.EnemyModel[Layers[laImprovements].Code[J]].mix];
    14371429                if (PPicture.HGr = PTestPicture.HGr) and
    14381430                  (PPicture.pix = PTestPicture.pix) and
    14391431                  (ModelHash(MyRO.EnemyModel[emix])
    1440                   = ModelHash(MyRO.EnemyModel[Code[laImprovements, J]])) then
     1432                  = ModelHash(MyRO.EnemyModel[Layers[laImprovements].Code[J]])) then
    14411433                begin
    1442                   Code[laWonders, J] := 1;
     1434                  Layers[laWonders].Code[J] := 1;
    14431435                  Ok := False;
    14441436                  Break;
     
    14471439            if Ok then
    14481440            begin
    1449               Code[laImprovements, Lines[laImprovements]] := emix;
    1450               Code[laWonders, Lines[laImprovements]] := 0;
    1451               Code[laClasses, Lines[laImprovements]] := ModelSortValue(MyRO.EnemyModel[emix], True);
    1452               Inc(Lines[laImprovements]);
     1441              Layers[laImprovements].Code[Layers[laImprovements].Lines] := emix;
     1442              Layers[laWonders].Code[Layers[laImprovements].Lines] := 0;
     1443              Layers[laClasses].Code[Layers[laImprovements].Lines] := ModelSortValue(MyRO.EnemyModel[emix], True);
     1444              Inc(Layers[laImprovements].Lines);
    14531445            end;
    14541446          end;
    14551447        SortModels;
    1456         FirstShrinkedLine[laImprovements] := 0;
     1448        Layers[laImprovements].FirstShrinkedLine := 0;
    14571449      end;
    14581450    kTribe:
    14591451      for I := 0 to TribeNames.Count - 1 do
    14601452      begin
    1461         Code[laImprovements, Lines[laImprovements]] := I;
    1462         Inc(Lines[laImprovements]);
     1453        Layers[laImprovements].AddCode(I);
    14631454      end;
    14641455    (* kDeliver:
     
    14801471    kShipPart:
    14811472      begin
    1482         Lines[laImprovements] := 0;
     1473        Layers[laImprovements].Lines := 0;
    14831474        for I := 0 to nShipPart - 1 do
    14841475          if MyRO.Ship[Me].Parts[I] > 0 then
    14851476          begin
    1486             Code[laImprovements, Lines[laImprovements]] := I;
    1487             Inc(Lines[laImprovements]);
     1477            Layers[laImprovements].AddCode(I);
    14881478          end;
    14891479      end;
    14901480    kEShipPart:
    14911481      begin
    1492         Lines[laImprovements] := 0;
     1482        Layers[laImprovements].Lines := 0;
    14931483        for I := 0 to nShipPart - 1 do
    14941484          if MyRO.Ship[DipMem[Me].pContact].Parts[I] > 0 then
    14951485          begin
    1496             Code[laImprovements, Lines[laImprovements]] := I;
    1497             Inc(Lines[laImprovements]);
     1486            Layers[laImprovements].AddCode(I);
    14981487          end;
    14991488      end;
     
    15041493        then
    15051494        begin
    1506           Code[laImprovements, Lines[laImprovements]] := I;
    1507           Inc(Lines[laImprovements]);
     1495          Layers[laImprovements].AddCode(I);
    15081496        end;
    15091497    kMission:
    15101498      for I := 0 to nSpyMission - 1 do
    15111499      begin
    1512         Code[laImprovements, Lines[laImprovements]] := I;
    1513         Inc(Lines[laImprovements]);
    1514       end;
    1515   end;
    1516 
    1517   if Kind = kProject then // test if choice fitting to one screen
    1518     if Lines[laImprovements] + Lines[laWonders] + Lines[laClasses] <= MaxLines then
     1500        Layers[laImprovements].AddCode(I);
     1501      end;
     1502  end;
     1503
     1504  // Test if choice fitting to one screen
     1505  if Kind = kProject then
     1506    if Layers[laImprovements].Lines + Layers[laWonders].Lines + Layers[laClasses].Lines <= MaxLines then
    15191507    begin
    1520       for I := 0 to Lines[laWonders] - 1 do // add wonders to first page
    1521       begin
    1522         Code[laImprovements, Lines[laImprovements]] := Code[laWonders, I];
    1523         Inc(Lines[laImprovements]);
    1524       end;
    1525       Lines[laWonders] := 0;
    1526       FirstShrinkedLine[laImprovements] := Lines[laImprovements];
    1527       for I := 0 to Lines[laClasses] - 1 do // add models to first page
    1528       begin
    1529         Code[laImprovements, Lines[laImprovements]] := Code[laClasses, I];
    1530         Inc(Lines[laImprovements]);
    1531       end;
    1532       Lines[laClasses] := 0;
     1508      // Add wonders to first page
     1509      for I := 0 to Layers[laWonders].Lines - 1 do
     1510        Layers[laImprovements].AddCode(Layers[laWonders].Code[I]);
     1511      Layers[laWonders].Lines := 0;
     1512
     1513      Layers[laImprovements].FirstShrinkedLine := Layers[laImprovements].Lines;
     1514
     1515      // Add models to first page
     1516      for I := 0 to Layers[laClasses].Lines - 1 do
     1517        Layers[laImprovements].AddCode(Layers[laClasses].Code[I]);
     1518      Layers[laClasses].Lines := 0;
    15331519    end;
    15341520end;
     
    15381524  Kind := TestKind;
    15391525  InitLines;
    1540   if Lines[laImprovements] = 0 then
     1526  if Layers[laImprovements].Lines = 0 then
    15411527    Result := -2
    1542   else if Lines[laImprovements] > 1 then
     1528  else if Layers[laImprovements].Lines > 1 then
    15431529    Result := -1
    15441530  else
    1545     Result := Code[laImprovements, 0];
     1531    Result := Layers[laImprovements].Code[0];
    15461532end;
    15471533
    15481534procedure TListDlg.FormShow(Sender: TObject);
    15491535var
    1550   L: TLayer;
     1536  L: TLayerIndex;
    15511537  NewTop, NewLeft: Integer;
    15521538begin
     
    15691555
    15701556  MultiPage := False;
    1571   for L := Low(Layer) to High(Layer) do
    1572     if Lines[L] > 0 then begin
     1557  for L := laWonders to High(TLayerIndex) do
     1558    if Layers[L].Lines > 0 then begin
    15731559      MultiPage := True;
    15741560      Break;
    15751561    end;
     1562
    15761563  WideBottom := MultiPage or (Kind = kScience) or
    15771564    not Phrases2FallenBackToEnglish and
     
    15861573  end;
    15871574
    1588   DispLines := Lines[laImprovements];
    1589   for L := Low(Layer) to High(Layer) do
    1590     if Lines[L] > DispLines then
    1591       DispLines := Lines[L];
     1575  DispLines := Layers[laImprovements].Lines;
     1576  for L := Low(TLayerIndex) to High(TLayerIndex) do
     1577    if Layers[L].Lines > DispLines then
     1578      DispLines := Layers[L].Lines;
    15921579  if WideBottom then
    15931580  begin
     
    16131600      InnerWidth := 640 - 18;
    16141601    kTribe:
    1615       if Lines[laImprovements] > MaxLines then
     1602      if Layers[laImprovements].Lines > MaxLines then
    16161603        InnerWidth := 280 + GetSystemMetrics(SM_CXVSCROLL)
    16171604      else
     
    16571644  end;
    16581645
    1659   LayerImprovementsButton.Visible := MultiPage and (Lines[laImprovements] > 0);
    1660   LayerWondersButton.Visible := MultiPage and (Lines[laWonders] > 0);
    1661   LayerClassesButton.Visible := MultiPage and (Lines[laClasses] > 0);
     1646  LayerImprovementsButton.Visible := MultiPage and (Layers[laImprovements].Lines > 0);
     1647  LayerWondersButton.Visible := MultiPage and (Layers[laWonders].Lines > 0);
     1648  LayerClassesButton.Visible := MultiPage and (Layers[laClasses].Lines > 0);
     1649
    16621650  if Kind = kProject then
    16631651  begin
     
    16731661  end;
    16741662
    1675   Layer := laImprovements;
     1663  Layer := Layers[laImprovements];
    16761664  Selected := -2;
    16771665  ScienceNation := -1;
    1678   ScrollBar.Init(Lines[Layer] - 1, DispLines);
     1666  ScrollBar.Init(Layer.Lines - 1, DispLines);
    16791667
    16801668  OffscreenPaint;
     
    17941782  InitLines;
    17951783  Selected := -2;
    1796   ScrollBar.Init(Lines[Layer] - 1, DispLines);
     1784  ScrollBar.Init(Layer.Lines - 1, DispLines);
    17971785  OffscreenPaint;
    17981786  Invalidate;
     
    18041792  LayerWondersButton.Down := Sender = LayerWondersButton;
    18051793  LayerClassesButton.Down := Sender = LayerClassesButton;
    1806   Layer := TLayer(TComponent(Sender).Tag);
     1794  Layer := Layers[TLayerIndex(TComponent(Sender).Tag)];
    18071795
    18081796  Selected := -2;
    1809   ScrollBar.Init(Lines[Layer] - 1, DispLines);
     1797  ScrollBar.Init(Layer.Lines - 1, DispLines);
    18101798  SmartUpdateContent;
    18111799end;
     
    18791867begin
    18801868  if Index < 0 then Index := 0;
    1881   if Index > Lines[Layer] - 1 then Index := Lines[Layer] - 1;
     1869  if Index > Layer.Lines - 1 then Index := Layer.Lines - 1;
    18821870
    18831871  NewSelected := Index - ScrollBar.Position;
    18841872  NewScrollBarPos := ScrollBar.Position;
    18851873
    1886   Over := NewSelected - Min(DispLines, Lines[Layer] - NewScrollBarPos);
     1874  Over := NewSelected - Min(DispLines, Layer.Lines - NewScrollBarPos);
    18871875  if Over > 0 then begin
    18881876    Inc(NewScrollBarPos, Over);
     
    19121900begin
    19131901  if (Key = VK_RIGHT) or (Key = VK_NUMPAD6) then begin
    1914     if MultiPage and (Layer <= High(Layer)) then begin
     1902    if MultiPage and (Layer.Index <= High(TLayerIndex)) then begin
    19151903      LastSelectionIndex := GetSelectionIndex;
    1916       if Layer = laImprovements then Layer := laClasses
    1917       else if Layer = laClasses then Layer := laWonders;
    1918       if Lines[Layer] = 0 then Layer := laWonders;
    1919       LayerImprovementsButton.Down := Layer = laImprovements;
    1920       LayerWondersButton.Down := Layer = laWonders;
    1921       LayerClassesButton.Down := Layer = laClasses;
    1922       ScrollBar.Init(Lines[Layer] - 1, DispLines);
     1904      if Layer = Layers[laImprovements] then Layer := Layers[laClasses]
     1905      else if Layer = Layers[laClasses] then Layer := Layers[laWonders];
     1906      if Layer.Lines = 0 then Layer := Layers[laWonders];
     1907      LayerImprovementsButton.Down := Layer = Layers[laImprovements];
     1908      LayerWondersButton.Down := Layer = Layers[laWonders];
     1909      LayerClassesButton.Down := Layer = Layers[laClasses];
     1910      ScrollBar.Init(Layer.Lines - 1, DispLines);
    19231911      SetSelectionIndex(LastSelectionIndex);
    19241912      SmartUpdateContent;
     
    19261914  end else
    19271915  if (Key = VK_LEFT) or (Key = VK_NUMPAD4) then begin
    1928     if MultiPage and (Layer > laImprovements) then begin
     1916    if MultiPage and (Layer.Index > laImprovements) then begin
    19291917      LastSelectionIndex := GetSelectionIndex;
    1930       if Layer = laWonders then Layer := laClasses
    1931       else if Layer = laClasses then Layer := laImprovements;
    1932       if Lines[Layer] = 0 then Layer := laImprovements;
    1933       LayerImprovementsButton.Down := Layer = laImprovements;
    1934       LayerWondersButton.Down := Layer = laWonders;
    1935       LayerClassesButton.Down := Layer = laClasses;
    1936       ScrollBar.Init(Lines[Layer] - 1, DispLines);
     1918      if Layer = Layers[laWonders] then Layer := Layers[laClasses]
     1919      else if Layer = Layers[laClasses] then Layer := Layers[laImprovements];
     1920      if Layer.Lines = 0 then Layer := Layers[laImprovements];
     1921      LayerImprovementsButton.Down := Layer = Layers[laImprovements];
     1922      LayerWondersButton.Down := Layer = Layers[laWonders];
     1923      LayerClassesButton.Down := Layer = Layers[laClasses];
     1924      ScrollBar.Init(Layer.Lines - 1, DispLines);
    19371925      SetSelectionIndex(LastSelectionIndex);
    19381926      SmartUpdateContent;
     
    19491937  end else
    19501938  if (Key = VK_END) or (Key = VK_NUMPAD1) then begin
    1951     SetSelectionIndex(Lines[Layer]);
     1939    SetSelectionIndex(Layer.Lines);
    19521940  end else
    19531941  if (Key = VK_PRIOR) or (Key = VK_NUMPAD9) then begin
Note: See TracChangeset for help on using the changeset viewer.