Changeset 419 for trunk/LocalPlayer


Ignore:
Timestamp:
Dec 28, 2021, 3:34:33 PM (3 years ago)
Author:
chronos
Message:
  • Modified: Split Term form MenuClick method into separate menuitem handlers for better readability and navigation in code.
Location:
trunk/LocalPlayer
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/LocalPlayer/Term.lfm

    r387 r419  
    11object MainScreen: TMainScreen
    2   Left = 516
     2  Left = 469
    33  Height = 480
    4   Top = 834
     4  Top = 251
    55  Width = 800
    66  HorzScrollBar.Visible = False
     
    1212  Constraints.MinHeight = 480
    1313  Constraints.MinWidth = 800
    14   DesignTimePPI = 144
     14  DesignTimePPI = 120
    1515  Font.Color = clWindowText
    1616  Font.Height = -13
     
    227227      Tag = 7
    228228      ShortCut = 112
    229       OnClick = MenuClick
     229      OnClick = mHelpClick
    230230    end
    231231    object mTechTree: TMenuItem
    232232      GroupIndex = 1
    233233      ShortCut = 84
    234       OnClick = MenuClick
     234      OnClick = mTechTreeClick
    235235    end
    236236    object N12: TMenuItem
     
    491491          Tag = 54
    492492          ShortCut = 16458
    493           OnClick = MenuClick
     493          OnClick = mJumpClick
    494494        end
    495495        object mRun: TMenuItem
    496496          Tag = 63
    497497          ShortCut = 16466
    498           OnClick = MenuClick
     498          OnClick = mRunClick
    499499        end
    500500        object mNames: TMenuItem
     
    552552      object mEnhanceDef: TMenuItem
    553553        Tag = 40
    554         OnClick = MenuClick
     554        OnClick = mEnhanceDefClick
    555555      end
    556556      object mCityTypes: TMenuItem
    557557        Tag = 11
    558         OnClick = MenuClick
     558        OnClick = mCityTypesClick
    559559      end
    560560    end
     
    563563      GroupIndex = 1
    564564      ShortCut = 16466
    565       OnClick = MenuClick
     565      OnClick = mRandomMapClick
    566566    end
    567567    object N3: TMenuItem
     
    572572      Tag = 88
    573573      GroupIndex = 1
    574       OnClick = MenuClick
     574      OnClick = mWebsiteClick
    575575    end
    576576    object N2: TMenuItem
     
    582582      GroupIndex = 1
    583583      ShortCut = 16465
    584       OnClick = MenuClick
     584      OnClick = mResignClick
    585585    end
    586586  end
     
    592592      Tag = 72
    593593      ShortCut = 16452
    594       OnClick = MenuClick
     594      OnClick = mDisbandOrUtilizeClick
    595595    end
    596596    object mUtilize: TMenuItem
    597597      ShortCut = 90
    598       OnClick = MenuClick
     598      OnClick = mDisbandOrUtilizeClick
    599599    end
    600600    object N1: TMenuItem
     
    603603    object mcity: TMenuItem
    604604      ShortCut = 66
    605       OnClick = MenuClick
     605      OnClick = mcityClick
    606606    end
    607607    object mPillage: TMenuItem
    608608      Tag = 19
    609609      ShortCut = 16464
    610       OnClick = MenuClick
     610      OnClick = mPillageClick
    611611    end
    612612    object N5: TMenuItem
     
    615615    object mhome: TMenuItem
    616616      ShortCut = 72
    617       OnClick = MenuClick
     617      OnClick = mhomeClick
    618618    end
    619619    object mLoad: TMenuItem
    620620      Tag = 24
    621621      ShortCut = 76
    622       OnClick = MenuClick
     622      OnClick = mLoadClick
    623623    end
    624624    object mUnload: TMenuItem
    625625      Tag = 70
    626626      ShortCut = 85
    627       OnClick = MenuClick
     627      OnClick = mUnloadClick
    628628    end
    629629    object mSelectTransport: TMenuItem
    630630      Tag = 73
    631631      ShortCut = 16468
    632       OnClick = MenuClick
     632      OnClick = mSelectTransportClick
    633633    end
    634634    object mGoOn: TMenuItem
    635635      Tag = 13
    636636      ShortCut = 71
    637       OnClick = MenuClick
     637      OnClick = mGoOnClick
    638638    end
    639639    object mCancel: TMenuItem
    640640      Tag = 1
    641641      ShortCut = 16451
    642       OnClick = MenuClick
     642      OnClick = mCancelClick
    643643    end
    644644    object mRecover: TMenuItem
    645645      Tag = 69
    646646      ShortCut = 86
    647       OnClick = MenuClick
     647      OnClick = mRecoverClick
    648648    end
    649649    object mwait: TMenuItem
    650650      Tag = 25
    651651      ShortCut = 87
    652       OnClick = MenuClick
     652      OnClick = mwaitClick
    653653    end
    654654    object mnoorders: TMenuItem
    655655      Tag = 26
    656656      ShortCut = 32
    657       OnClick = MenuClick
     657      OnClick = mnoordersClick
    658658    end
    659659    object mstay: TMenuItem
    660660      Tag = 22
    661661      ShortCut = 83
    662       OnClick = MenuClick
     662      OnClick = mstayClick
    663663    end
    664664    object mCentre: TMenuItem
    665665      Tag = 12
    666666      ShortCut = 67
    667       OnClick = MenuClick
     667      OnClick = mCentreClick
    668668    end
    669669    object N13: TMenuItem
     
    673673      Tag = 100
    674674      ShortCut = 46
    675       OnClick = MenuClick
     675      OnClick = mPrevUnitClick
    676676    end
    677677    object mNextUnit: TMenuItem
    678678      Tag = 101
    679679      ShortCut = 45
    680       OnClick = MenuClick
     680      OnClick = mNextUnitClick
    681681    end
    682682  end
     
    688688      Tag = 9
    689689      ShortCut = 113
    690       OnClick = MenuClick
     690      OnClick = mUnitStatClick
    691691    end
    692692    object mCityStat: TMenuItem
    693693      Tag = 37
    694694      ShortCut = 114
    695       OnClick = MenuClick
     695      OnClick = mCityStatClick
    696696    end
    697697    object mScienceStat: TMenuItem
    698698      Tag = 38
    699699      ShortCut = 115
    700       OnClick = MenuClick
     700      OnClick = mScienceStatClick
    701701    end
    702702    object mEUnitStat: TMenuItem
    703703      Tag = 50
    704704      ShortCut = 116
    705       OnClick = MenuClick
     705      OnClick = mEUnitStatClick
    706706    end
    707707    object mDiagram: TMenuItem
    708708      Tag = 21
    709709      ShortCut = 117
    710       OnClick = MenuClick
     710      OnClick = mDiagramClick
    711711    end
    712712    object mWonders: TMenuItem
    713713      Tag = 6
    714714      ShortCut = 118
    715       OnClick = MenuClick
     715      OnClick = mWondersClick
    716716    end
    717717    object mShips: TMenuItem
    718718      Tag = 41
    719719      ShortCut = 119
    720       OnClick = MenuClick
     720      OnClick = mShipsClick
    721721    end
    722722    object N4: TMenuItem
     
    726726      Tag = 55
    727727      ShortCut = 120
    728       OnClick = MenuClick
     728      OnClick = mNationsClick
    729729    end
    730730    object mEmpire: TMenuItem
    731731      Tag = 3
    732732      ShortCut = 121
    733       OnClick = MenuClick
     733      OnClick = mEmpireClick
    734734    end
    735735    object mRevolution: TMenuItem
    736736      Tag = 89
    737       OnClick = MenuClick
     737      OnClick = mRevolutionClick
    738738    end
    739739  end
     
    751751      Tag = 273
    752752      ShortCut = 79
    753       OnClick = MenuClick
     753      OnClick = mtransClick
    754754    end
    755755    object mAfforest: TMenuItem
    756756      Tag = 301
    757757      ShortCut = 77
    758       OnClick = MenuClick
     758      OnClick = mAfforestClick
    759759    end
    760760    object mClear: TMenuItem
    761761      Tag = 298
    762762      ShortCut = 73
    763       OnClick = MenuClick
     763      OnClick = mClearClick
    764764    end
    765765    object mfort: TMenuItem
    766766      Tag = 276
    767767      ShortCut = 70
    768       OnClick = MenuClick
     768      OnClick = mfortClick
    769769    end
    770770    object mAirBase: TMenuItem
    771771      Tag = 272
    772772      ShortCut = 65
    773       OnClick = MenuClick
     773      OnClick = mAirBaseClick
    774774    end
    775775    object mCanal: TMenuItem
    776776      Tag = 279
    777777      ShortCut = 78
    778       OnClick = MenuClick
     778      OnClick = mCanalClick
    779779    end
    780780    object mmine: TMenuItem
    781781      Tag = 302
    782782      ShortCut = 77
    783       OnClick = MenuClick
     783      OnClick = mmineClick
    784784    end
    785785    object mFarm: TMenuItem
    786786      Tag = 300
    787787      ShortCut = 73
    788       OnClick = MenuClick
     788      OnClick = mFarmClick
    789789    end
    790790    object mirrigation: TMenuItem
    791791      Tag = 299
    792792      ShortCut = 73
    793       OnClick = MenuClick
    794     end
    795     object mrr: TMenuItem
     793      OnClick = mirrigationClick
     794    end
     795    object mRailRoad: TMenuItem
    796796      Tag = 297
    797797      ShortCut = 82
    798       OnClick = MenuClick
     798      OnClick = mRailRoadClick
    799799    end
    800800    object mroad: TMenuItem
    801801      Tag = 296
    802802      ShortCut = 82
    803       OnClick = MenuClick
     803      OnClick = mroadClick
    804804    end
    805805    object mpollution: TMenuItem
    806806      Tag = 274
    807807      ShortCut = 80
    808       OnClick = MenuClick
     808      OnClick = mpollutionClick
    809809    end
    810810    object mEnhance: TMenuItem
    811811      Tag = 295
    812812      ShortCut = 69
    813       OnClick = MenuClick
     813      OnClick = mEnhanceClick
    814814    end
    815815  end
  • trunk/LocalPlayer/Term.pas

    r417 r419  
    6868    mWonders: TMenuItem;
    6969    mScienceStat: TMenuItem;
    70     mRR: TMenuItem;
     70    mRailRoad: TMenuItem;
    7171    mClear: TMenuItem;
    7272    mFarm: TMenuItem;
     
    181181    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
    182182      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
     183    procedure mAfforestClick(Sender: TObject);
     184    procedure mAirBaseClick(Sender: TObject);
     185    procedure mCanalClick(Sender: TObject);
     186    procedure mCancelClick(Sender: TObject);
     187    procedure mCentreClick(Sender: TObject);
     188    procedure mcityClick(Sender: TObject);
     189    procedure mCityStatClick(Sender: TObject);
     190    procedure mCityTypesClick(Sender: TObject);
     191    procedure mClearClick(Sender: TObject);
     192    procedure mDiagramClick(Sender: TObject);
     193    procedure mEmpireClick(Sender: TObject);
     194    procedure mEnhanceClick(Sender: TObject);
     195    procedure mEnhanceDefClick(Sender: TObject);
     196    procedure mEUnitStatClick(Sender: TObject);
     197    procedure mFarmClick(Sender: TObject);
     198    procedure mfortClick(Sender: TObject);
     199    procedure mGoOnClick(Sender: TObject);
     200    procedure mHelpClick(Sender: TObject);
     201    procedure mhomeClick(Sender: TObject);
     202    procedure mirrigationClick(Sender: TObject);
     203    procedure mirrigationDrawItem(Sender: TObject; ACanvas: TCanvas;
     204      ARect: TRect; AState: TOwnerDrawState);
     205    procedure mJumpClick(Sender: TObject);
     206    procedure mLoadClick(Sender: TObject);
     207    procedure mmineClick(Sender: TObject);
     208    procedure mNationsClick(Sender: TObject);
     209    procedure mNextUnitClick(Sender: TObject);
     210    procedure mnoordersClick(Sender: TObject);
     211    procedure mPillageClick(Sender: TObject);
     212    procedure mpollutionClick(Sender: TObject);
     213    procedure mPrevUnitClick(Sender: TObject);
     214    procedure mRandomMapClick(Sender: TObject);
     215    procedure mRecoverClick(Sender: TObject);
     216    procedure mResignClick(Sender: TObject);
     217    procedure mRevolutionClick(Sender: TObject);
     218    procedure mroadClick(Sender: TObject);
     219    procedure mRailRoadClick(Sender: TObject);
     220    procedure mRunClick(Sender: TObject);
     221    procedure mScienceStatClick(Sender: TObject);
     222    procedure mSelectTransportClick(Sender: TObject);
     223    procedure mShipsClick(Sender: TObject);
     224    procedure mstayClick(Sender: TObject);
     225    procedure mTechTreeClick(Sender: TObject);
     226    procedure mtransClick(Sender: TObject);
     227    procedure mUnitStatClick(Sender: TObject);
     228    procedure mUnloadClick(Sender: TObject);
     229    procedure mwaitClick(Sender: TObject);
     230    procedure mWebsiteClick(Sender: TObject);
     231    procedure mWondersClick(Sender: TObject);
    183232    procedure Timer1Timer(Sender: TObject);
    184233    procedure MapBoxMouseDown(Sender: TObject; Button: TMouseButton;
     
    188237      Shift: TShiftState; x, y: integer);
    189238    procedure FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
    190     procedure MenuClick(Sender: TObject);
     239    procedure mDisbandOrUtilizeClick(Sender: TObject);
    191240    procedure FormResize(Sender: TObject);
    192241    procedure PanelBtnClick(Sender: TObject);
     
    276325    NoMapPanel: TIsoMap;
    277326    function ChooseUnusedTribe: integer;
     327    function DoJob(j0: Integer): Integer;
    278328    procedure GetTribeList;
    279329    procedure InitModule;
     
    35813631end;
    35823632
     3633procedure TMainScreen.mAfforestClick(Sender: TObject);
     3634begin
     3635  if UnFocus >= 0 then
     3636    with TUn(MyUn[UnFocus]) do
     3637      DoJob(jAfforest);
     3638end;
     3639
     3640procedure TMainScreen.mAirBaseClick(Sender: TObject);
     3641begin
     3642  if UnFocus >= 0 then
     3643    with TUn(MyUn[UnFocus]) do
     3644      DoJob(jBase);
     3645end;
     3646
     3647procedure TMainScreen.mCanalClick(Sender: TObject);
     3648begin
     3649  if UnFocus >= 0 then
     3650    with TUn(MyUn[UnFocus]) do
     3651      DoJob(jCanal);
     3652end;
     3653
     3654procedure TMainScreen.mCancelClick(Sender: TObject);
     3655begin
     3656  if UnFocus >= 0 then
     3657  with MyUn[UnFocus] do begin
     3658    DestinationMarkON := False;
     3659    PaintDestination;
     3660    Status := Status and ($FFFF - usRecover - usGoto - usEnhance);
     3661    if Job > jNone then
     3662      Server(sStartJob + jNone shl 4, me, UnFocus, nil^);
     3663  end;
     3664end;
     3665
     3666procedure TMainScreen.mCentreClick(Sender: TObject);
     3667begin
     3668  if UnFocus >= 0 then
     3669  with TUn(MyUn[UnFocus]) do begin
     3670    Centre(Loc);
     3671    PaintAllMaps;
     3672  end;
     3673end;
     3674
     3675procedure TMainScreen.mcityClick(Sender: TObject);
     3676var
     3677  Loc0: Integer;
     3678  cix: Integer;
     3679  ServerResult: Integer;
     3680begin
     3681  if UnFocus >= 0 then
     3682  with TUn(MyUn[UnFocus]) do begin
     3683    Loc0 := Loc;
     3684    if MyMap[Loc] and fCity = 0 then
     3685    begin // build city
     3686      if DoJob(jCity) = eCity then
     3687      begin
     3688        MapValid := false;
     3689        PaintAll;
     3690        ZoomToCity(Loc0, true, chFounded);
     3691      end;
     3692    end else begin
     3693      CityOptimizer_BeforeRemoveUnit(UnFocus);
     3694      ServerResult := Server(sAddToCity, me, UnFocus, nil^);
     3695      if ServerResult >= rExecuted then
     3696      begin
     3697        cix := MyRO.nCity - 1;
     3698        while (cix >= 0) and (MyCity[cix].Loc <> Loc0) do
     3699          dec(cix);
     3700        assert(cix >= 0);
     3701        CityOptimizer_CityChange(cix);
     3702        CityOptimizer_AfterRemoveUnit; // does nothing here
     3703        SetTroopLoc(Loc0);
     3704        UpdateViews(true);
     3705        DestinationMarkON := false;
     3706        PaintDestination;
     3707        UnFocus := -1;
     3708        PaintLoc(Loc0);
     3709        NextUnit(UnStartLoc, true);
     3710      end
     3711      else if ServerResult = eMaxSize then
     3712        SimpleMessage(Phrases.Lookup('ADDTOMAXSIZE'));
     3713    end;
     3714  end;
     3715end;
     3716
     3717procedure TMainScreen.mCityStatClick(Sender: TObject);
     3718begin
     3719  ListDlg.ShowNewContent(wmPersistent, kCities);
     3720end;
     3721
     3722procedure TMainScreen.mCityTypesClick(Sender: TObject);
     3723begin
     3724  CityTypeDlg.ShowNewContent(wmModal);
     3725  // must be modal because types are not saved before closing
     3726end;
     3727
     3728procedure TMainScreen.mClearClick(Sender: TObject);
     3729begin
     3730  if UnFocus >= 0 then
     3731    with TUn(MyUn[UnFocus]) do
     3732      DoJob(jClear);
     3733end;
     3734
     3735procedure TMainScreen.mDiagramClick(Sender: TObject);
     3736begin
     3737  DiaDlg.ShowNewContent_Charts(wmPersistent);
     3738end;
     3739
     3740procedure TMainScreen.mEmpireClick(Sender: TObject);
     3741begin
     3742  RatesDlg.ShowNewContent(wmPersistent);
     3743end;
     3744
     3745procedure TMainScreen.mEnhanceClick(Sender: TObject);
     3746begin
     3747  if UnFocus >= 0 then
     3748    with TUn(MyUn[UnFocus]) do
     3749      DoJob(-1);
     3750end;
     3751
     3752procedure TMainScreen.mEnhanceDefClick(Sender: TObject);
     3753begin
     3754  if UnFocus >= 0 then
     3755    EnhanceDlg.ShowNewContent(wmPersistent,
     3756      MyMap[MyUn[UnFocus].Loc] and fTerrain)
     3757  else
     3758    EnhanceDlg.ShowNewContent(wmPersistent);
     3759end;
     3760
     3761procedure TMainScreen.mEUnitStatClick(Sender: TObject);
     3762begin
     3763  if MyRO.nEnemyModel > 0 then
     3764    ListDlg.ShowNewContent(wmPersistent, kAllEModels);
     3765end;
     3766
     3767procedure TMainScreen.mFarmClick(Sender: TObject);
     3768begin
     3769  if UnFocus >= 0 then
     3770    with TUn(MyUn[UnFocus]) do
     3771      DoJob(jFarm);
     3772end;
     3773
     3774procedure TMainScreen.mfortClick(Sender: TObject);
     3775begin
     3776  if UnFocus >= 0 then
     3777    with TUn(MyUn[UnFocus]) do
     3778      DoJob(jFort);
     3779end;
     3780
     3781procedure TMainScreen.mGoOnClick(Sender: TObject);
     3782var
     3783  Destination: Integer;
     3784begin
     3785  if UnFocus >= 0 then
     3786  with TUn(MyUn[UnFocus]) do begin
     3787    if Status shr 16 = $7FFF then
     3788      Destination := maNextCity
     3789    else
     3790      Destination := Status shr 16;
     3791    Status := Status and not(usStay or usRecover) or usWaiting;
     3792    MoveToLoc(Destination, true);
     3793  end;
     3794end;
     3795
     3796procedure TMainScreen.mHelpClick(Sender: TObject);
     3797begin
     3798  if ClientMode = cEditMap then
     3799    HelpDlg.ShowNewContent(wmPersistent, hkText, HelpDlg.TextIndex('MAPEDIT'))
     3800  else
     3801    HelpDlg.ShowNewContent(wmPersistent, hkMisc, miscMain);
     3802end;
     3803
     3804procedure TMainScreen.mhomeClick(Sender: TObject);
     3805var
     3806  cixOldHome: Integer;
     3807begin
     3808  if UnFocus >= 0 then
     3809  with TUn(MyUn[UnFocus]) do begin
     3810    if MyMap[Loc] and fCity <> 0 then
     3811    begin
     3812      cixOldHome := Home;
     3813      if Server(sSetUnitHome, me, UnFocus, nil^) >= rExecuted then
     3814      begin
     3815        CityOptimizer_CityChange(cixOldHome);
     3816        CityOptimizer_CityChange(Home);
     3817        UpdateViews(true);
     3818      end
     3819      else
     3820        Play('INVALID');
     3821    end
     3822    else
     3823    begin
     3824      Status := Status and not(usStay or usRecover or usEnhance);
     3825      MoveToLoc(maNextCity, true);
     3826    end;
     3827  end;
     3828end;
     3829
     3830procedure TMainScreen.mirrigationClick(Sender: TObject);
     3831begin
     3832  if UnFocus >= 0 then
     3833    with TUn(MyUn[UnFocus]) do
     3834        DoJob(jIrr);
     3835end;
     3836
     3837procedure TMainScreen.mirrigationDrawItem(Sender: TObject; ACanvas: TCanvas;
     3838  ARect: TRect; AState: TOwnerDrawState);
     3839begin
     3840
     3841end;
     3842
     3843procedure TMainScreen.mJumpClick(Sender: TObject);
     3844begin
     3845  if supervising then
     3846    Jump[0] := 20
     3847  else
     3848    Jump[me] := 20;
     3849  EndTurn(true);
     3850end;
     3851
     3852procedure TMainScreen.mLoadClick(Sender: TObject);
     3853var
     3854  I: Integer;
     3855begin
     3856  if UnFocus >= 0 then
     3857  with MyUn[UnFocus] do begin
     3858    i := Server(sLoadUnit, me, UnFocus, nil^);
     3859    if i >= rExecuted then
     3860    begin
     3861      if MyModel[mix].Domain = dAir then
     3862        Play('MOVE_PLANELANDING')
     3863      else
     3864        Play('MOVE_LOAD');
     3865      DestinationMarkON := false;
     3866      PaintDestination;
     3867      Status := Status and ($FFFF - usWaiting - usStay - usRecover - usGoto - usEnhance);
     3868      NextUnit(UnStartLoc, true);
     3869    end
     3870    else if i = eNoTime_Load then
     3871      if MyModel[mix].Domain = dAir then
     3872        SoundMessage(Phrases.Lookup('NOTIMELOADAIR'), 'NOMOVE_TIME')
     3873      else
     3874        SoundMessage(Format(Phrases.Lookup('NOTIMELOADGROUND'),
     3875          [MovementToString(MyModel[mix].speed)]), 'NOMOVE_TIME');
     3876  end;
     3877end;
     3878
     3879procedure TMainScreen.mmineClick(Sender: TObject);
     3880begin
     3881  if UnFocus >= 0 then
     3882    with TUn(MyUn[UnFocus]) do
     3883      DoJob(jMine);
     3884end;
     3885
     3886procedure TMainScreen.mNationsClick(Sender: TObject);
     3887begin
     3888  NatStatDlg.ShowNewContent(wmPersistent);
     3889end;
     3890
     3891procedure TMainScreen.mNextUnitClick(Sender: TObject);
     3892begin
     3893  if UnFocus >= 0 then
     3894  with MyUn[UnFocus] do begin
     3895    Status := Status and not usWaiting;
     3896    FocusNextUnit(1);
     3897  end;
     3898end;
     3899
     3900procedure TMainScreen.mnoordersClick(Sender: TObject);
     3901begin
     3902  if UnFocus >= 0 then
     3903  with MyUn[UnFocus] do begin
     3904    Status := Status and not usWaiting;
     3905    NextUnit(UnStartLoc, true);
     3906  end;
     3907end;
     3908
     3909procedure TMainScreen.mPillageClick(Sender: TObject);
     3910begin
     3911  DoJob(jPillage);
     3912end;
     3913
     3914procedure TMainScreen.mpollutionClick(Sender: TObject);
     3915begin
     3916  if UnFocus >= 0 then
     3917    with TUn(MyUn[UnFocus]) do
     3918      DoJob(jPoll);
     3919end;
     3920
     3921procedure TMainScreen.mPrevUnitClick(Sender: TObject);
     3922begin
     3923  if UnFocus >= 0 then
     3924  with MyUn[UnFocus] do begin
     3925    Status := Status and not usWaiting;
     3926    FocusNextUnit(-1);
     3927  end;
     3928end;
     3929
     3930procedure TMainScreen.mRandomMapClick(Sender: TObject);
     3931begin
     3932  if not Edited or (SimpleQuery(mkYesNo, Phrases.Lookup('MAP_RANDOM'), '')
     3933      = mrOK) then begin
     3934    Server(sRandomMap, me, 0, nil^);
     3935    Edited := true;
     3936    MapValid := false;
     3937    PaintAllMaps;
     3938  end;
     3939end;
     3940
     3941procedure TMainScreen.mRecoverClick(Sender: TObject);
     3942begin
     3943  if UnFocus >= 0 then
     3944  with MyUn[UnFocus] do begin
     3945    DestinationMarkON := false;
     3946    PaintDestination;
     3947    Status := Status and ($FFFF - usStay - usGoto - usEnhance) or usRecover;
     3948    if Job > jNone then
     3949      Server(sStartJob + jNone shl 4, me, UnFocus, nil^);
     3950    NextUnit(UnStartLoc, true);
     3951  end;
     3952end;
     3953
     3954procedure TMainScreen.mResignClick(Sender: TObject);
     3955var
     3956  QueryText: string;
     3957begin
     3958  if ClientMode = cEditMap then begin
     3959    if Edited then begin
     3960      QueryText := Phrases.Lookup('MAP_CLOSE');
     3961      case SimpleQuery(mkYesNoCancel, QueryText, '') of
     3962        mrIgnore: Server(sAbandonMap, me, 0, nil^);
     3963        mrOK: Server(sSaveMap, me, 0, nil^);
     3964      end;
     3965    end else
     3966      Server(sAbandonMap, me, 0, nil^);
     3967  end else begin
     3968    if Server(sGetGameChanged, 0, 0, nil^) = eOK then begin
     3969      QueryText := Phrases.Lookup('RESIGN');
     3970      case SimpleQuery(mkYesNoCancel, QueryText, '') of
     3971        mrIgnore: Server(sResign, 0, 0, nil^);
     3972        mrOK: Server(sBreak, 0, 0, nil^);
     3973      end;
     3974    end else
     3975      Server(sResign, 0, 0, nil^);
     3976  end;
     3977end;
     3978
     3979procedure TMainScreen.mRevolutionClick(Sender: TObject);
     3980var
     3981  AltGovs: Boolean;
     3982  RevolutionChanged: Boolean;
     3983  I: Integer;
     3984begin
     3985  AltGovs := false;
     3986    for i := 2 to nGov - 1 do
     3987      if (GovPreq[i] <> preNA) and
     3988        ((GovPreq[i] = preNone) or (MyRO.Tech[GovPreq[i]] >= tsApplicable)) then
     3989        AltGovs := true;
     3990
     3991    if not AltGovs then
     3992      SoundMessage(Phrases.Lookup('NOALTGOVS'), 'MSG_DEFAULT')
     3993    else
     3994    begin
     3995      RevolutionChanged := false;
     3996      if MyRO.Happened and phChangeGov <> 0 then
     3997      begin
     3998        ModalSelectDlg.ShowNewContent(wmModal, kGov);
     3999        if ModalSelectDlg.result >= 0 then
     4000        begin
     4001          Play('NEWGOV');
     4002          Server(sSetGovernment, me, ModalSelectDlg.result, nil^);
     4003          CityOptimizer_BeginOfTurn;
     4004          RevolutionChanged := true;
     4005        end;
     4006      end
     4007      else
     4008      with MessgExDlg do
     4009      begin // revolution!
     4010        MessgExDlg.MessgText := Tribe[me].TPhrase('REVOLUTION');
     4011        MessgExDlg.Kind := mkYesNo;
     4012        MessgExDlg.IconKind := mikPureIcon;
     4013        MessgExDlg.IconIndex := 72; // anarchy palace
     4014        MessgExDlg.ShowModal;
     4015        if ModalResult = mrOK then
     4016        begin
     4017          Play('REVOLUTION');
     4018          Server(sRevolution, me, 0, nil^);
     4019          RevolutionChanged := true;
     4020          if NatStatDlg.Visible then
     4021            NatStatDlg.Close;
     4022          if CityDlg.Visible then
     4023            CityDlg.Close;
     4024        end
     4025      end;
     4026      if RevolutionChanged then
     4027        UpdateViews(true);
     4028    end;
     4029end;
     4030
     4031procedure TMainScreen.mroadClick(Sender: TObject);
     4032begin
     4033  if UnFocus >= 0 then
     4034    with TUn(MyUn[UnFocus]) do
     4035      DoJob(jRoad);
     4036end;
     4037
     4038procedure TMainScreen.mRailRoadClick(Sender: TObject);
     4039begin
     4040  if UnFocus >= 0 then
     4041    with TUn(MyUn[UnFocus]) do
     4042      DoJob(jRR);
     4043end;
     4044
     4045procedure TMainScreen.mRunClick(Sender: TObject);
     4046begin
     4047  if supervising then
     4048    Jump[0] := 999999
     4049  else
     4050    Jump[me] := 999999;
     4051  EndTurn(true);
     4052end;
     4053
     4054procedure TMainScreen.mScienceStatClick(Sender: TObject);
     4055begin
     4056  ListDlg.ShowNewContent(wmPersistent, kScience);
     4057end;
     4058
     4059procedure TMainScreen.mSelectTransportClick(Sender: TObject);
     4060begin
     4061  if UnFocus >= 0 then
     4062    with TUn(MyUn[UnFocus]) do
     4063      Server(sSelectTransport, me, UnFocus, nil^);
     4064end;
     4065
     4066procedure TMainScreen.mShipsClick(Sender: TObject);
     4067begin
     4068  DiaDlg.ShowNewContent_Ship(wmPersistent);
     4069end;
     4070
     4071procedure TMainScreen.mstayClick(Sender: TObject);
     4072begin
     4073  if UnFocus >= 0 then
     4074  with TUn(MyUn[UnFocus]) do begin
     4075    DestinationMarkON := false;
     4076    PaintDestination;
     4077    Status := Status and ($FFFF - usRecover - usGoto - usEnhance) or usStay;
     4078    if Job > jNone then
     4079      Server(sStartJob + jNone shl 4, me, UnFocus, nil^);
     4080    NextUnit(UnStartLoc, true);
     4081  end;
     4082end;
     4083
     4084procedure TMainScreen.mTechTreeClick(Sender: TObject);
     4085begin
     4086  TechTreeDlg.ShowModal;
     4087end;
     4088
     4089procedure TMainScreen.mtransClick(Sender: TObject);
     4090begin
     4091  if UnFocus >= 0 then
     4092    with TUn(MyUn[UnFocus]) do
     4093      DoJob(jTrans);
     4094end;
     4095
     4096procedure TMainScreen.mUnitStatClick(Sender: TObject);
     4097var
     4098  I: Integer;
     4099begin
     4100  if G.Difficulty[me] > 0 then
     4101    ListDlg.ShowNewContent_MilReport(wmPersistent, me)
     4102  else
     4103  begin
     4104    i := 1;
     4105    while (i < nPl) and (1 shl i and MyRO.Alive = 0) do
     4106      inc(i);
     4107    if i < nPl then
     4108      ListDlg.ShowNewContent_MilReport(wmPersistent, i);
     4109  end;
     4110end;
     4111
     4112procedure TMainScreen.mUnloadClick(Sender: TObject);
     4113var
     4114  I: Integer;
     4115  OldMaster: Integer;
     4116  NewFocus: Integer;
     4117  uix: Integer;
     4118begin
     4119  if UnFocus >= 0 then
     4120  with MyUn[UnFocus] do begin
     4121    if Master >= 0 then begin
     4122      OldMaster := Master;
     4123      i := Server(sUnloadUnit, me, UnFocus, nil^);
     4124      if i >= rExecuted then
     4125      begin
     4126        if MyModel[mix].Domain = dAir then
     4127          Play('MOVE_PLANESTART')
     4128        else if (MyModel[MyUn[OldMaster].mix].Domain = dAir) and
     4129          (MyMap[Loc] and fCity = 0) and (MyMap[Loc] and fTerImp <> tiBase)
     4130        then
     4131          Play('MOVE_PARACHUTE')
     4132        else
     4133          Play('MOVE_UNLOAD');
     4134        Status := Status and not usWaiting;
     4135        if MyModel[mix].Domain <> dAir then
     4136          NextUnit(Loc, true)
     4137        else
     4138          PanelPaint;
     4139      end
     4140      else if i = eNoTime_Load then
     4141        if MyModel[mix].Domain = dAir then
     4142          SoundMessage(Phrases.Lookup('NOTIMELOADAIR'), 'NOMOVE_TIME')
     4143        else
     4144          SoundMessage(Format(Phrases.Lookup('NOTIMELOADGROUND'),
     4145            [MovementToString(MyModel[mix].speed)]), 'NOMOVE_TIME');
     4146    end else begin
     4147      NewFocus := -1;
     4148      uix := UnFocus;
     4149      for i := 1 to MyRO.nUn - 1 do
     4150      begin
     4151        uix := (uix + MyRO.nUn - 1) mod MyRO.nUn;
     4152        if (MyUn[uix].Master = UnFocus) and
     4153          (MyUn[uix].Movement = integer(MyModel[MyUn[uix].mix].speed)) then
     4154        begin
     4155          MyUn[uix].Status := MyUn[uix].Status or usWaiting;
     4156          NewFocus := uix;
     4157        end;
     4158      end;
     4159      if NewFocus >= 0 then
     4160      begin
     4161        SetUnFocus(NewFocus);
     4162        SetTroopLoc(Loc);
     4163        PanelPaint;
     4164      end;
     4165    end;
     4166  end;
     4167end;
     4168
     4169procedure TMainScreen.mwaitClick(Sender: TObject);
     4170begin
     4171  if UnFocus >= 0 then
     4172  with MyUn[UnFocus] do begin
     4173    DestinationMarkON := false;
     4174    PaintDestination;
     4175    Status := Status and ($FFFF - usStay - usRecover - usGoto - usEnhance) or usWaiting;
     4176  end;
     4177  NextUnit(-1, false);
     4178end;
     4179
     4180procedure TMainScreen.mWebsiteClick(Sender: TObject);
     4181begin
     4182  OpenURL(CevoHomepage);
     4183end;
     4184
     4185procedure TMainScreen.mWondersClick(Sender: TObject);
     4186begin
     4187  WondersDlg.ShowNewContent(wmPersistent);
     4188end;
     4189
    35834190procedure TMainScreen.FormResize(Sender: TObject);
    35844191var
     
    36704277  CanClose := Closable;
    36714278  if not Closable and idle and (me = 0) and (ClientMode < scContact) then
    3672     MenuClick(mResign);
     4279    mResign.Click;
    36734280end;
    36744281
     
    53986005      MoveToLoc(MouseLoc, true); { goto }
    53996006    if (UnFocus = uix) and (MyUn[uix].Loc = MouseLoc) then
    5400       MenuClick(mEnhance);
     6007      mEnhance.Click;
    54016008  end
    54026009  else if (Button = mbLeft) and (ssShift in Shift) and
     
    64657072  MTrans.ShortCut := BTrans.ShortCut;
    64667073  mPollution.ShortCut := BPollution.ShortCut;
    6467   mRR.ShortCut := BRailRoad.ShortCut;
     7074  mRailRoad.ShortCut := BRailRoad.ShortCut;
    64687075  mRoad.ShortCut := BRailRoad.ShortCut;
    64697076  mUnload.ShortCut := BUnload.ShortCut;
     
    65077114    InitPopup(Popup);
    65087115    if Item.Visible and Item.Enabled then
    6509       MenuClick(Item);
     7116      Item.Click;
    65107117  end;
    65117118
     
    65427149
    65437150  if ClientMode = cEditMap then begin
    6544     if BResign.Test(ShortCut) then MenuClick(mResign)
    6545     else if BRandomMap.Test(ShortCut) then MenuClick(mRandomMap)
    6546     else if BHelp.Test(ShortCut) then MenuClick(mHelp);
     7151    if BResign.Test(ShortCut) then mResign.Click
     7152    else if BRandomMap.Test(ShortCut) then mRandomMap.Click
     7153    else if BHelp.Test(ShortCut) then mHelp.Click;
    65477154    (*if Shift = [ssCtrl] then
    65487155      case char(Key) of
     
    65707177    SetFullScreen(FullScreen);
    65717178  end
    6572   else if BHelp.Test(ShortCut) then MenuClick(mHelp)
     7179  else if BHelp.Test(ShortCut) then mHelp.Click
    65737180  else if BUnitStat.Test(ShortCut) then MenuClick_Check(StatPopup, mUnitStat)
    65747181  else if BCityStat.Test(ShortCut) then MenuClick_Check(StatPopup, mCityStat)
     
    65927199  else if BSetDebugMap9.Test(ShortCut) then SetDebugMap(9)
    65937200
    6594   else if BJump.Test(ShortCut) then MenuClick(mJump)
     7201  else if BJump.Test(ShortCut) then mJump.Click
    65957202  else if BDebugMap.Test(ShortCut) then mShowClick(mDebugMap)
    65967203  else if BLocCodes.Test(ShortCut) then mShowClick(mLocCodes)
     
    66017208  else if BNames.Test(ShortCut) then mNamesClick(mNames)
    66027209  else if BResign.Test(ShortCut) then MenuClick_Check(GamePopup, mResign)
    6603   else if BRun.Test(ShortCut) then MenuClick(mRun)
     7210  else if BRun.Test(ShortCut) then mRun.Click
    66047211  else if BTestMapRepaint.Test(ShortCut) then begin // test map repaint time
    66057212    Time0 := NowPrecise;
     
    66267233  else if BMapBtn5.Test(ShortCut) then MapBtnClick(MapBtn5)
    66277234  else if BMapBtn6.Test(ShortCut) then MapBtnClick(MapBtn6)
    6628   else if BTechTree.Test(ShortCut) then MenuClick(mTechTree)
    6629   else if BWait.Test(ShortCut) then MenuClick(mWait);
     7235  else if BTechTree.Test(ShortCut) then mTechTree.Click
     7236  else if BWait.Test(ShortCut) then mWait.Click;
    66307237
    66317238  if UnFocus >= 0 then begin
    6632     if BDisbandUnit.Test(ShortCut) then MenuClick(mDisband)
     7239    if BDisbandUnit.Test(ShortCut) then mDisband.Click
    66337240    else if BFortify.Test(ShortCut) then MenuClick_Check(TerrainPopup, mFort)
    6634     else if BCenterUnit.Test(ShortCut) then MenuClick(mCentre)
    6635     else if BStay.Test(ShortCut) then MenuClick(mStay)
    6636     else if BNoOrders.Test(ShortCut) then MenuClick(mNoOrders)
    6637     else if BPrevUnit.Test(ShortCut) then MenuClick(mPrevUnit)
    6638     else if BNextUnit.Test(ShortCut) then MenuClick(mNextUnit)
     7241    else if BCenterUnit.Test(ShortCut) then mCentre.Click
     7242    else if BStay.Test(ShortCut) then mStay.Click
     7243    else if BNoOrders.Test(ShortCut) then mNoOrders.Click
     7244    else if BPrevUnit.Test(ShortCut) then mPrevUnit.Click
     7245    else if BNextUnit.Test(ShortCut) then mNextUnit.Click
    66397246    else if BCancel.Test(ShortCut) then MenuClick_Check(UnitPopup, mCancel)
    66407247    else if BPillage.Test(ShortCut) then MenuClick_Check(UnitPopup, mPillage)
     
    66447251    else if BEnhance.Test(ShortCut) then begin
    66457252      InitPopup(TerrainPopup);
    6646       if mEnhance.Visible and mEnhance.Enabled then MenuClick(mEnhance)
    6647         else MenuClick(mEnhanceDef)
     7253      if mEnhance.Visible and mEnhance.Enabled then mEnhance.Click
     7254        else mEnhanceDef.Click
    66487255    end
    66497256    else if BGoOn.Test(ShortCut) then MenuClick_Check(UnitPopup, mGoOn)
     
    66517258    else if BFarmClearIrrigation.Test(ShortCut) then begin
    66527259      if JobTest(UnFocus, jFarm, [eTreaty]) then
    6653         MenuClick(mFarm)
     7260        mFarm.Click
    66547261      else if JobTest(UnFocus, jClear, [eTreaty]) then
    6655         MenuClick(mClear)
     7262        mClear.Click
    66567263      else MenuClick_Check(TerrainPopup, mIrrigation);
    66577264    end
    66587265    else if BLoad.Test(ShortCut) then MenuClick_Check(UnitPopup, mLoad)
    66597266    else if BAfforestMine.Test(ShortCut) then begin
    6660       if JobTest(UnFocus, jAfforest, [eTreaty]) then MenuClick(mAfforest)
     7267      if JobTest(UnFocus, jAfforest, [eTreaty]) then mAfforest.Click
    66617268        else MenuClick_Check(TerrainPopup, mMine);
    66627269    end
     
    66657272    else if BPollution.Test(ShortCut) then MenuClick_Check(TerrainPopup, mPollution)
    66667273    else if BRailRoad.Test(ShortCut) then begin
    6667       if JobTest(UnFocus, jRR, [eTreaty]) then MenuClick(mRR)
     7274      if JobTest(UnFocus, jRR, [eTreaty]) then mRailRoad.Click
    66687275        else MenuClick_Check(TerrainPopup, mRoad);
    66697276    end
     
    66827289end;
    66837290
    6684 procedure TMainScreen.MenuClick(Sender: TObject);
    6685 
    6686   function DoJob(j0: integer): integer;
    6687   var
    6688     Loc0, Movement0: integer;
    6689   begin
    6690     with MyUn[UnFocus] do
    6691     begin
    6692       DestinationMarkON := false;
    6693       PaintDestination;
    6694       Loc0 := Loc;
    6695       Movement0 := Movement;
    6696       if j0 < 0 then
    6697         result := ProcessEnhancement(UnFocus, MyData.EnhancementJobs)
    6698         // terrain enhancement
    6699       else
    6700         result := Server(sStartJob + j0 shl 4, me, UnFocus, nil^);
    6701       if result >= rExecuted then
    6702       begin
    6703         if result = eDied then
    6704           UnFocus := -1;
    6705         PaintLoc(Loc0);
    6706         if UnFocus >= 0 then
     7291function TMainScreen.DoJob(j0: Integer): Integer;
     7292var
     7293  Loc0, Movement0: integer;
     7294begin
     7295  with MyUn[UnFocus] do
     7296  begin
     7297    DestinationMarkON := false;
     7298    PaintDestination;
     7299    Loc0 := Loc;
     7300    Movement0 := Movement;
     7301    if j0 < 0 then
     7302      result := ProcessEnhancement(UnFocus, MyData.EnhancementJobs)
     7303      // terrain enhancement
     7304    else
     7305      result := Server(sStartJob + j0 shl 4, me, UnFocus, nil^);
     7306    if result >= rExecuted then
     7307    begin
     7308      if result = eDied then
     7309        UnFocus := -1;
     7310      PaintLoc(Loc0);
     7311      if UnFocus >= 0 then
     7312      begin
     7313        if (j0 < 0) and (result <> eJobDone) then
     7314          // multi-turn terrain enhancement
     7315          Status := Status and ($FFFF - usStay - usRecover - usGoto) or
     7316            usEnhance
     7317        else
     7318          Status := Status and
     7319            ($FFFF - usStay - usRecover - usGoto - usEnhance);
     7320        if (Job <> jNone) or (Movement0 < 100) then
    67077321        begin
    6708           if (j0 < 0) and (result <> eJobDone) then
    6709             // multi-turn terrain enhancement
    6710             Status := Status and ($FFFF - usStay - usRecover - usGoto) or
    6711               usEnhance
    6712           else
    6713             Status := Status and
    6714               ($FFFF - usStay - usRecover - usGoto - usEnhance);
    6715           if (Job <> jNone) or (Movement0 < 100) then
    6716           begin
    6717             Status := Status and not usWaiting;
    6718             NextUnit(UnStartLoc, true);
    6719           end
    6720           else
    6721             PanelPaint;
     7322          Status := Status and not usWaiting;
     7323          NextUnit(UnStartLoc, true);
    67227324        end
    67237325        else
    6724           NextUnit(UnStartLoc, true);
    6725       end;
    6726     end;
    6727     case result of
    6728       eNoBridgeBuilding:
    6729         SoundMessage(Phrases.Lookup('NOBB'), 'INVALID');
    6730       eNoCityTerrain:
    6731         SoundMessage(Phrases.Lookup('NOCITY'), 'INVALID');
    6732       eTreaty:
    6733         SoundMessage(Tribe[MyRO.Territory[Loc0]].TPhrase('PEACE_NOWORK'),
    6734           'NOMOVE_TREATY');
    6735     else
    6736       if result < rExecuted then
    6737         Play('INVALID');
    6738     end;
    6739   end;
    6740 
    6741 var
    6742   i, uix, NewFocus, Loc0, OldMaster, Destination, cix, cixOldHome,
    6743     ServerResult: integer;
    6744   AltGovs, RevolutionChanged: boolean;
    6745   QueryText: string;
    6746 
    6747 begin
    6748   if Sender = mResign then
    6749     if ClientMode = cEditMap then
    6750     begin
    6751       if Edited then
    6752       begin
    6753         QueryText := Phrases.Lookup('MAP_CLOSE');
    6754         case SimpleQuery(mkYesNoCancel, QueryText, '') of
    6755           mrIgnore:
    6756             Server(sAbandonMap, me, 0, nil^);
    6757           mrOK:
    6758             Server(sSaveMap, me, 0, nil^);
    6759         end
     7326          PanelPaint;
    67607327      end
    67617328      else
    6762         Server(sAbandonMap, me, 0, nil^);
    6763     end
     7329        NextUnit(UnStartLoc, true);
     7330    end;
     7331  end;
     7332  case result of
     7333    eNoBridgeBuilding:
     7334      SoundMessage(Phrases.Lookup('NOBB'), 'INVALID');
     7335    eNoCityTerrain:
     7336      SoundMessage(Phrases.Lookup('NOCITY'), 'INVALID');
     7337    eTreaty:
     7338      SoundMessage(Tribe[MyRO.Territory[Loc0]].TPhrase('PEACE_NOWORK'),
     7339        'NOMOVE_TREATY');
     7340  else
     7341    if result < rExecuted then
     7342      Play('INVALID');
     7343  end;
     7344end;
     7345
     7346procedure TMainScreen.mDisbandOrUtilizeClick(Sender: TObject);
     7347var
     7348  Loc0: Integer;
     7349begin
     7350  if UnFocus >= 0 then
     7351  with TUn(MyUn[UnFocus]) do begin
     7352    if (Sender = mUtilize) and
     7353      not(Server(sRemoveUnit - sExecute, me, UnFocus, nil^) = eUtilized) then
     7354    begin
     7355      SimpleMessage(Phrases2.Lookup('SHIP_UTILIZE'));
     7356      // freight for colony ship is the only case in which the command is
     7357      // available to player though not valid
     7358      exit;
     7359    end;
     7360    if (Sender = mUtilize) and (Health < 100) then
     7361      if SimpleQuery(mkYesNo, Phrases.Lookup('DAMAGED_UTILIZE'), '') <> mrOK
     7362      then
     7363        exit;
     7364    Loc0 := Loc;
     7365    CityOptimizer_BeforeRemoveUnit(UnFocus);
     7366    if Server(sRemoveUnit, me, UnFocus, nil^) = eUtilized then
     7367      Play('CITY_UTILIZE')
    67647368    else
    6765     begin
    6766       if Server(sGetGameChanged, 0, 0, nil^) = eOK then
    6767       begin
    6768         QueryText := Phrases.Lookup('RESIGN');
    6769         case SimpleQuery(mkYesNoCancel, QueryText, '') of
    6770           mrIgnore:
    6771             Server(sResign, 0, 0, nil^);
    6772           mrOK:
    6773             Server(sBreak, 0, 0, nil^);
    6774         end
    6775       end
    6776       else
    6777         Server(sResign, 0, 0, nil^);
    6778     end
    6779   else if Sender = mEmpire then
    6780     RatesDlg.ShowNewContent(wmPersistent)
    6781   else if Sender = mRevolution then
    6782   begin
    6783     AltGovs := false;
    6784     for i := 2 to nGov - 1 do
    6785       if (GovPreq[i] <> preNA) and
    6786         ((GovPreq[i] = preNone) or (MyRO.Tech[GovPreq[i]] >= tsApplicable)) then
    6787         AltGovs := true;
    6788 
    6789     if not AltGovs then
    6790       SoundMessage(Phrases.Lookup('NOALTGOVS'), 'MSG_DEFAULT')
    6791     else
    6792     begin
    6793       RevolutionChanged := false;
    6794       if MyRO.Happened and phChangeGov <> 0 then
    6795       begin
    6796         ModalSelectDlg.ShowNewContent(wmModal, kGov);
    6797         if ModalSelectDlg.result >= 0 then
    6798         begin
    6799           Play('NEWGOV');
    6800           Server(sSetGovernment, me, ModalSelectDlg.result, nil^);
    6801           CityOptimizer_BeginOfTurn;
    6802           RevolutionChanged := true;
    6803         end;
    6804       end
    6805       else
    6806       with MessgExDlg do
    6807       begin // revolution!
    6808         MessgExDlg.MessgText := Tribe[me].TPhrase('REVOLUTION');
    6809         MessgExDlg.Kind := mkYesNo;
    6810         MessgExDlg.IconKind := mikPureIcon;
    6811         MessgExDlg.IconIndex := 72; // anarchy palace
    6812         MessgExDlg.ShowModal;
    6813         if ModalResult = mrOK then
    6814         begin
    6815           Play('REVOLUTION');
    6816           Server(sRevolution, me, 0, nil^);
    6817           RevolutionChanged := true;
    6818           if NatStatDlg.Visible then
    6819             NatStatDlg.Close;
    6820           if CityDlg.Visible then
    6821             CityDlg.Close;
    6822         end
    6823       end;
    6824       if RevolutionChanged then
    6825         UpdateViews(true);
    6826     end;
    6827   end
    6828   else if Sender = mWebsite then
    6829     OpenURL(CevoHomepage)
    6830   else if Sender = mRandomMap then
    6831   begin
    6832     if not Edited or (SimpleQuery(mkYesNo, Phrases.Lookup('MAP_RANDOM'), '')
    6833       = mrOK) then
    6834     begin
    6835       Server(sRandomMap, me, 0, nil^);
    6836       Edited := true;
    6837       MapValid := false;
    6838       PaintAllMaps;
    6839     end;
    6840   end
    6841   else if Sender = mJump then
    6842   begin
    6843     if supervising then
    6844       Jump[0] := 20
    6845     else
    6846       Jump[me] := 20;
    6847     EndTurn(true);
    6848   end
    6849   else if Sender = mRun then
    6850   begin
    6851     if supervising then
    6852       Jump[0] := 999999
    6853     else
    6854       Jump[me] := 999999;
    6855     EndTurn(true);
    6856   end
    6857   else if Sender = mEnhanceDef then
    6858   begin
    6859     if UnFocus >= 0 then
    6860       EnhanceDlg.ShowNewContent(wmPersistent,
    6861         MyMap[MyUn[UnFocus].Loc] and fTerrain)
    6862     else
    6863       EnhanceDlg.ShowNewContent(wmPersistent);
    6864   end
    6865   else if Sender = mCityTypes then
    6866     CityTypeDlg.ShowNewContent(wmModal)
    6867     // must be modal because types are not saved before closing
    6868   else if Sender = mUnitStat then
    6869   begin
    6870     if G.Difficulty[me] > 0 then
    6871       ListDlg.ShowNewContent_MilReport(wmPersistent, me)
    6872     else
    6873     begin
    6874       i := 1;
    6875       while (i < nPl) and (1 shl i and MyRO.Alive = 0) do
    6876         inc(i);
    6877       if i < nPl then
    6878         ListDlg.ShowNewContent_MilReport(wmPersistent, i);
    6879     end;
    6880   end
    6881   else if Sender = mEUnitStat then
    6882   begin
    6883     if MyRO.nEnemyModel > 0 then
    6884       ListDlg.ShowNewContent(wmPersistent, kAllEModels);
    6885   end
    6886   else if Sender = mCityStat then
    6887     ListDlg.ShowNewContent(wmPersistent, kCities)
    6888   else if Sender = mScienceStat then
    6889     ListDlg.ShowNewContent(wmPersistent, kScience)
    6890   else if Sender = mNations then
    6891     NatStatDlg.ShowNewContent(wmPersistent)
    6892   else if Sender = mHelp then
    6893     if ClientMode = cEditMap then
    6894       HelpDlg.ShowNewContent(wmPersistent, hkText, HelpDlg.TextIndex('MAPEDIT'))
    6895     else
    6896       HelpDlg.ShowNewContent(wmPersistent, hkMisc, miscMain)
    6897   else if Sender = mTechTree then
    6898     TechTreeDlg.ShowModal
    6899   else if Sender = mWonders then
    6900     WondersDlg.ShowNewContent(wmPersistent)
    6901   else if Sender = mDiagram then
    6902     DiaDlg.ShowNewContent_Charts(wmPersistent)
    6903   else if Sender = mShips then
    6904     DiaDlg.ShowNewContent_Ship(wmPersistent)
    6905   else if Sender = mWait then
    6906   begin
    6907     if UnFocus >= 0 then
    6908     begin
    6909       DestinationMarkON := false;
    6910       PaintDestination;
    6911       MyUn[UnFocus].Status := MyUn[UnFocus].Status and
    6912         ($FFFF - usStay - usRecover - usGoto - usEnhance) or usWaiting;
    6913     end;
    6914     NextUnit(-1, false);
    6915   end
    6916   else if UnFocus >= 0 then
    6917     with TUn(MyUn[UnFocus]) do
    6918       if Sender = mGoOn then
    6919       begin
    6920         if Status shr 16 = $7FFF then
    6921           Destination := maNextCity
    6922         else
    6923           Destination := Status shr 16;
    6924         Status := Status and not(usStay or usRecover) or usWaiting;
    6925         MoveToLoc(Destination, true);
    6926       end
    6927       else if Sender = mHome then
    6928         if MyMap[Loc] and fCity <> 0 then
    6929         begin
    6930           cixOldHome := Home;
    6931           if Server(sSetUnitHome, me, UnFocus, nil^) >= rExecuted then
    6932           begin
    6933             CityOptimizer_CityChange(cixOldHome);
    6934             CityOptimizer_CityChange(Home);
    6935             UpdateViews(true);
    6936           end
    6937           else
    6938             Play('INVALID');
    6939         end
    6940         else
    6941         begin
    6942           Status := Status and not(usStay or usRecover or usEnhance);
    6943           MoveToLoc(maNextCity, true)
    6944         end
    6945       else if Sender = mCentre then
    6946       begin
    6947         Centre(Loc);
    6948         PaintAllMaps;
    6949       end
    6950       else if Sender = mCity then
    6951       begin
    6952         Loc0 := Loc;
    6953         if MyMap[Loc] and fCity = 0 then
    6954         begin // build city
    6955           if DoJob(jCity) = eCity then
    6956           begin
    6957             MapValid := false;
    6958             PaintAll;
    6959             ZoomToCity(Loc0, true, chFounded);
    6960           end;
    6961         end
    6962         else
    6963         begin
    6964           CityOptimizer_BeforeRemoveUnit(UnFocus);
    6965           ServerResult := Server(sAddToCity, me, UnFocus, nil^);
    6966           if ServerResult >= rExecuted then
    6967           begin
    6968             cix := MyRO.nCity - 1;
    6969             while (cix >= 0) and (MyCity[cix].Loc <> Loc0) do
    6970               dec(cix);
    6971             assert(cix >= 0);
    6972             CityOptimizer_CityChange(cix);
    6973             CityOptimizer_AfterRemoveUnit; // does nothing here
    6974             SetTroopLoc(Loc0);
    6975             UpdateViews(true);
    6976             DestinationMarkON := false;
    6977             PaintDestination;
    6978             UnFocus := -1;
    6979             PaintLoc(Loc0);
    6980             NextUnit(UnStartLoc, true);
    6981           end
    6982           else if ServerResult = eMaxSize then
    6983             SimpleMessage(Phrases.Lookup('ADDTOMAXSIZE'));
    6984         end
    6985       end
    6986       else if Sender = mRoad then
    6987         DoJob(jRoad)
    6988       else if Sender = mRR then
    6989         DoJob(jRR)
    6990       else if Sender = mClear then
    6991         DoJob(jClear)
    6992       else if Sender = mIrrigation then
    6993         DoJob(jIrr)
    6994       else if Sender = mFarm then
    6995         DoJob(jFarm)
    6996       else if Sender = mAfforest then
    6997         DoJob(jAfforest)
    6998       else if Sender = mMine then
    6999         DoJob(jMine)
    7000       else if Sender = mCanal then
    7001         DoJob(jCanal)
    7002       else if Sender = MTrans then
    7003         DoJob(jTrans)
    7004       else if Sender = mFort then
    7005         DoJob(jFort)
    7006       else if Sender = mAirBase then
    7007         DoJob(jBase)
    7008       else if Sender = mPollution then
    7009         DoJob(jPoll)
    7010       else if Sender = mPillage then
    7011         DoJob(jPillage)
    7012       else if Sender = mEnhance then
    7013         DoJob(-1)
    7014       else if Sender = mStay then
    7015       begin
    7016         DestinationMarkON := false;
    7017         PaintDestination;
    7018         Status := Status and ($FFFF - usRecover - usGoto - usEnhance) or usStay;
    7019         if Job > jNone then
    7020           Server(sStartJob + jNone shl 4, me, UnFocus, nil^);
    7021         NextUnit(UnStartLoc, true);
    7022       end
    7023       else if Sender = mRecover then
    7024       begin
    7025         DestinationMarkON := false;
    7026         PaintDestination;
    7027         Status := Status and ($FFFF - usStay - usGoto - usEnhance) or usRecover;
    7028         if Job > jNone then
    7029           Server(sStartJob + jNone shl 4, me, UnFocus, nil^);
    7030         NextUnit(UnStartLoc, true);
    7031       end
    7032       else if Sender = mNoOrders then
    7033       begin
    7034         Status := Status and not usWaiting;
    7035         NextUnit(UnStartLoc, true);
    7036       end
    7037       else if Sender = mPrevUnit then
    7038       begin
    7039         Status := Status and not usWaiting;
    7040         FocusNextUnit(-1);
    7041       end
    7042       else if Sender = mNextUnit then
    7043       begin
    7044         Status := Status and not usWaiting;
    7045         FocusNextUnit(1);
    7046       end
    7047       else if Sender = mCancel then
    7048       begin
    7049         DestinationMarkON := false;
    7050         PaintDestination;
    7051         Status := Status and ($FFFF - usRecover - usGoto - usEnhance);
    7052         if Job > jNone then
    7053           Server(sStartJob + jNone shl 4, me, UnFocus, nil^);
    7054       end
    7055       else if (Sender = mDisband) or (Sender = mUtilize) then
    7056       begin
    7057         if (Sender = mUtilize) and
    7058           not(Server(sRemoveUnit - sExecute, me, UnFocus, nil^) = eUtilized)
    7059         then
    7060         begin
    7061           SimpleMessage(Phrases2.Lookup('SHIP_UTILIZE'));
    7062           // freight for colony ship is the only case in which the command is
    7063           // available to player though not valid
    7064           exit
    7065         end;
    7066         if (Sender = mUtilize) and (Health < 100) then
    7067           if SimpleQuery(mkYesNo, Phrases.Lookup('DAMAGED_UTILIZE'), '') <> mrOK
    7068           then
    7069             exit;
    7070         Loc0 := Loc;
    7071         CityOptimizer_BeforeRemoveUnit(UnFocus);
    7072         if Server(sRemoveUnit, me, UnFocus, nil^) = eUtilized then
    7073           Play('CITY_UTILIZE')
    7074         else
    7075           Play('DISBAND');
    7076         CityOptimizer_AfterRemoveUnit;
    7077         SetTroopLoc(Loc0);
    7078         UpdateViews(true);
    7079         DestinationMarkON := false;
    7080         PaintDestination;
    7081         UnFocus := -1;
    7082         PaintLoc(Loc0);
    7083         NextUnit(UnStartLoc, true);
    7084       end
    7085       else if Sender = mLoad then
    7086       begin
    7087         i := Server(sLoadUnit, me, UnFocus, nil^);
    7088         if i >= rExecuted then
    7089         begin
    7090           if MyModel[mix].Domain = dAir then
    7091             Play('MOVE_PLANELANDING')
    7092           else
    7093             Play('MOVE_LOAD');
    7094           DestinationMarkON := false;
    7095           PaintDestination;
    7096           Status := Status and ($FFFF - usWaiting - usStay - usRecover - usGoto
    7097             - usEnhance);
    7098           NextUnit(UnStartLoc, true);
    7099         end
    7100         else if i = eNoTime_Load then
    7101           if MyModel[mix].Domain = dAir then
    7102             SoundMessage(Phrases.Lookup('NOTIMELOADAIR'), 'NOMOVE_TIME')
    7103           else
    7104             SoundMessage(Format(Phrases.Lookup('NOTIMELOADGROUND'),
    7105               [MovementToString(MyModel[mix].speed)]), 'NOMOVE_TIME');
    7106       end
    7107       else if Sender = mUnload then
    7108         if Master >= 0 then
    7109         begin
    7110           OldMaster := Master;
    7111           i := Server(sUnloadUnit, me, UnFocus, nil^);
    7112           if i >= rExecuted then
    7113           begin
    7114             if MyModel[mix].Domain = dAir then
    7115               Play('MOVE_PLANESTART')
    7116             else if (MyModel[MyUn[OldMaster].mix].Domain = dAir) and
    7117               (MyMap[Loc] and fCity = 0) and (MyMap[Loc] and fTerImp <> tiBase)
    7118             then
    7119               Play('MOVE_PARACHUTE')
    7120             else
    7121               Play('MOVE_UNLOAD');
    7122             Status := Status and not usWaiting;
    7123             if MyModel[mix].Domain <> dAir then
    7124               NextUnit(Loc, true)
    7125             else
    7126               PanelPaint;
    7127           end
    7128           else if i = eNoTime_Load then
    7129             if MyModel[mix].Domain = dAir then
    7130               SoundMessage(Phrases.Lookup('NOTIMELOADAIR'), 'NOMOVE_TIME')
    7131             else
    7132               SoundMessage(Format(Phrases.Lookup('NOTIMELOADGROUND'),
    7133                 [MovementToString(MyModel[mix].speed)]), 'NOMOVE_TIME');
    7134         end
    7135         else
    7136         begin
    7137           NewFocus := -1;
    7138           uix := UnFocus;
    7139           for i := 1 to MyRO.nUn - 1 do
    7140           begin
    7141             uix := (uix + MyRO.nUn - 1) mod MyRO.nUn;
    7142             if (MyUn[uix].Master = UnFocus) and
    7143               (MyUn[uix].Movement = integer(MyModel[MyUn[uix].mix].speed)) then
    7144             begin
    7145               MyUn[uix].Status := MyUn[uix].Status or usWaiting;
    7146               NewFocus := uix;
    7147             end;
    7148           end;
    7149           if NewFocus >= 0 then
    7150           begin
    7151             SetUnFocus(NewFocus);
    7152             SetTroopLoc(Loc);
    7153             PanelPaint;
    7154           end;
    7155         end
    7156       else if Sender = mSelectTransport then
    7157         Server(sSelectTransport, me, UnFocus, nil^);
     7369      Play('DISBAND');
     7370    CityOptimizer_AfterRemoveUnit;
     7371    SetTroopLoc(Loc0);
     7372    UpdateViews(true);
     7373    DestinationMarkON := false;
     7374    PaintDestination;
     7375    UnFocus := -1;
     7376    PaintLoc(Loc0);
     7377    NextUnit(UnStartLoc, true);
     7378  end;
    71587379end;
    71597380
     
    73747595    begin
    73757596      mRoad.Caption := Phrases.Lookup('BTN_BUILDBRIDGE');
    7376       mRR.Caption := Phrases.Lookup('BTN_BUILDRRBRIDGE');
     7597      mRailRoad.Caption := Phrases.Lookup('BTN_BUILDRRBRIDGE');
    73777598    end
    73787599    else
    73797600    begin
    73807601      mRoad.Caption := Phrases.Lookup('BTN_BUILDROAD');
    7381       mRR.Caption := Phrases.Lookup('BTN_BUILDRR');
     7602      mRailRoad.Caption := Phrases.Lookup('BTN_BUILDRR');
    73827603    end;
    73837604    if Tile and fTerrain = fForest then
     
    73947615    begin
    73957616      mRoad.Visible := JobTest(UnFocus, jRoad, [eNoBridgeBuilding, eTreaty]);
    7396       mRR.Visible := JobTest(UnFocus, jRR, [eNoBridgeBuilding, eTreaty]);
     7617      mRailRoad.Visible := JobTest(UnFocus, jRR, [eNoBridgeBuilding, eTreaty]);
    73977618      mClear.Visible := JobTest(UnFocus, jClear, [eTreaty]);
    73987619      mIrrigation.Visible := JobTest(UnFocus, jIrr, [eTreaty]);
Note: See TracChangeset for help on using the changeset viewer.