Changeset 62 for trunk/UEngine.pas


Ignore:
Timestamp:
Nov 25, 2020, 4:25:09 PM (3 years ago)
Author:
chronos
Message:
  • Added: Main game menu.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UEngine.pas

    r61 r62  
    77uses
    88  Classes, SysUtils, Graphics, Controls, ExtCtrls, Math, DateUtils,
    9   UMetaCanvas, fgl;
     9  UMetaCanvas, fgl, UMenu;
    1010
    1111type
     
    259259  end;
    260260
    261   TGameState = (gsNotStarted, gsRunning, gsPaused, gsGameOver);
     261  TGameState = (gsNotStarted, gsRunning, gsPaused, gsGameOver, gsMenu);
    262262
    263263  { TEngine }
     
    276276    FLastTime: TDateTime;
    277277    MetaCanvas: TMetaCanvas;
     278    Menu: TMenu;
     279    MenuMain: TMenu;
     280    MenuOptions: TMenu;
    278281    procedure ResizeView;
    279282    function GetExistStationShapes: TStationShapeSet;
     
    292295    function GetUnusedLine: TMetroLine;
    293296    procedure ShiftTrackPoints;
     297    procedure MenuItemExit(Sender: TObject);
     298    procedure MenuItemPlay(Sender: TObject);
     299    procedure MenuItemOptions(Sender: TObject);
     300    procedure MenuItemBack(Sender: TObject);
     301    procedure DarkModeChanged(Sender: TObject);
     302    procedure LanguageChanged(Sender: TObject);
     303    procedure InitMenus;
    294304  public
    295305    Passengers: TMetroPassengers;
     
    312322    procedure MouseUp(Button: TMouseButton; Position: TPoint);
    313323    procedure MouseDown(Button: TMouseButton; Position: TPoint);
    314     procedure Reset;
     324    procedure MainMenu;
     325    procedure NewGame;
    315326    procedure Redraw;
    316327    constructor Create;
     
    345356  EndStationLength = 50;
    346357  ShowDistances = False;
    347   //TimePerSecond = (60 * OneMinute);
    348   TimePerSecond = (60 * OneMinute);
     358  TimePerSecond = 60 * OneMinute;
    349359  NewStationPeriod = 1;
    350360  NewShapePeriod = 10;
     
    354364  VisiblePassengersPerLine = 6;
    355365
     366
    356367implementation
    357368
    358369uses
    359   UGeometric;
     370  UGeometric, UFormMain, ULanguages;
    360371
    361372resourcestring
     
    375386  I := 0;
    376387  while (I < 0) and
    377   ((Items[I].Points.First <> Point1) or (Items[I].Points.Last <> Point2))
    378   and ((Items[I].Points.First <> Point2) or (Items[I].Points.Last <> Point1)) do
     388    ((Items[I].Points.First <> Point1) or (Items[I].Points.Last <> Point2)) and
     389    ((Items[I].Points.First <> Point2) or (Items[I].Points.Last <> Point1)) do
    379390  Inc(I);
    380391  if I < 0 then Result := Items[I]
     
    15361547  Station: TMapStation;
    15371548begin
    1538   // Reset all distances
     1549  // NewGame all distances
    15391550  for Station in Stations do
    15401551  with Station do begin
     
    15781589        end else begin
    15791590          // If circular then trains might go in single direction so passengers
    1580           // waiting for oposite directions are wrong
     1591          // waiting for opposite directions are wrong
    15811592          DirectionUp := False;
    15821593          DirectionDown := False;
     
    17811792  MapStation: TMapStation;
    17821793begin
    1783   // Reset all trackpoints position shift
     1794  // NewGame all trackpoints position shift
    17841795  for MetroLine in Lines do
    17851796    for TrackPoint in MetroLine.Track.Points do
     
    18391850end;
    18401851
     1852procedure TEngine.MenuItemExit(Sender: TObject);
     1853begin
     1854  FormMain.Close;
     1855end;
     1856
     1857procedure TEngine.MenuItemPlay(Sender: TObject);
     1858begin
     1859  NewGame;
     1860end;
     1861
     1862procedure TEngine.MenuItemOptions(Sender: TObject);
     1863begin
     1864  Menu := MenuOptions;
     1865  Redraw;
     1866end;
     1867
     1868procedure TEngine.MenuItemBack(Sender: TObject);
     1869begin
     1870  if Assigned(Menu.Parent) then begin
     1871    Menu := Menu.Parent;
     1872    Redraw;
     1873  end;
     1874end;
     1875
     1876procedure TEngine.DarkModeChanged(Sender: TObject);
     1877begin
     1878
     1879end;
     1880
     1881procedure TEngine.LanguageChanged(Sender: TObject);
     1882var
     1883  NewLanguage: TLanguage;
     1884begin
     1885  NewLanguage := TLanguage(TMenuItemComboBox(MenuOptions.Items[0]).States.Objects[TMenuItemComboBox(MenuOptions.Items[0]).Index]);
     1886  if FormMain.Translator1.Language <> NewLanguage then begin
     1887    FormMain.Translator1.Language := NewLanguage;
     1888    FormMain.Translator1.Translate;
     1889    InitMenus;
     1890  end;
     1891end;
     1892
     1893procedure TEngine.InitMenus;
     1894begin
     1895  with MenuMain.Items do begin
     1896    Clear;
     1897    AddButton(SPlay, MenuItemPlay);
     1898    AddButton(SOptions, MenuItemOptions);
     1899    AddButton(SExit, MenuItemExit);
     1900  end;
     1901  MenuOptions.Parent := MenuMain;
     1902  with MenuOptions.Items do begin
     1903    Clear;
     1904    with AddComboBox(SLanguage, [], LanguageChanged) do begin
     1905      FormMain.Translator1.LanguageListToStrings(States);
     1906      Index := States.IndexOfObject(FormMain.Translator1.Language);
     1907      if Index = -1 then Index := 0;
     1908    end;
     1909    AddCheckBox(SDarkMode, DarkModeChanged);
     1910    AddButton(SBack, MenuItemBack);
     1911  end;
     1912end;
     1913
    18411914procedure TEngine.DrawClock(Canvas: TCanvas);
    18421915var
     
    18781951  Passenger: TMetroPassenger;
    18791952begin
    1880   // Draw trains
    18811953  for Train in Trains do
    18821954  with Train do begin
     
    19992071  LineStationUp: TLineStation;
    20002072  CurrentTrackPoint: TTrackPoint;
    2001 begin
     2073  I: Integer;
     2074begin
     2075  if State = gsMenu then begin
     2076    Menu.MouseMove(Position);
     2077    Redraw;
     2078  end;
     2079
    20022080  LastMousePos := Position;
    20032081  if MouseHold then begin
     
    20522130begin
    20532131  if Button = mbLeft then begin
    2054     // Place selected train if focused track
    2055     if Assigned(SelectedTrain) then begin
    2056       SelectedTrain.TargetStation := nil;
    2057       SelectedTrain.BaseTrackPoint := nil;
    2058       if Assigned(SelectedTrain.Line) then begin
    2059         SelectedTrain.Line.Trains.Remove(SelectedTrain);
    2060         SelectedTrain.Line := nil;
    2061       end;
    2062       FocusedTrack := GetTrackOnPos(View.PointDestToSrc(Position));
    2063       if Assigned(FocusedTrack.Points[0]) then begin
    2064         SelectedTrain.Line := FocusedTrack.Points[0].Track.Line;
    2065         SelectedTrain.Line.Trains.Add(SelectedTrain);
    2066         SelectedTrain.BaseTrackPoint := FocusedTrack.Points[0];
    2067       end else
    2068       if Assigned(FocusedTrack.Points[1]) then begin
    2069         SelectedTrain.Line := FocusedTrack.Points[1].Track.Line;
    2070         SelectedTrain.Line.Trains.Add(SelectedTrain);
    2071         SelectedTrain.BaseTrackPoint := FocusedTrack.Points[1];
    2072       end;
    2073       FocusedTrack.Free;
    2074     end;
    2075 
    2076     // Line color selection
    2077     for I := 0 to Lines.Count - 1 do
    2078       if Distance(Point(View.DestRect.Right div 2 - Length(LineColors) div 2 * LineColorsDist + I * LineColorsDist,
    2079         View.DestRect.Bottom - LineColorsDist), Position) < 20 then begin
    2080           SelectedLine := Lines[I];
    2081           Exit;
     2132    if State = gsMenu then begin
     2133      Menu.MouseUp(Button, Position);
     2134      Redraw;
     2135    end else begin
     2136        // Place selected train if focused track
     2137      if Assigned(SelectedTrain) then begin
     2138        SelectedTrain.TargetStation := nil;
     2139        SelectedTrain.BaseTrackPoint := nil;
     2140        if Assigned(SelectedTrain.Line) then begin
     2141          SelectedTrain.Line.Trains.Remove(SelectedTrain);
     2142          SelectedTrain.Line := nil;
    20822143        end;
    2083 
    2084     // Remove single line station on line
    2085     if Assigned(TrackStationDown) and (TrackStationDown.Track.Line.LineStations.Count = 1) then begin
    2086       TrackStationDown.Track.Line.DisconnectStation(TrackStationDown.Track.Line.LineStations.First);
    2087     end;
    2088     if Assigned(TrackStationUp) and (TrackStationUp.Track.Line.LineStations.Count = 1) then begin
    2089       TrackStationUp.Track.Line.DisconnectStation(TrackStationUp.Track.Line.LineStations.First);
     2144        FocusedTrack := GetTrackOnPos(View.PointDestToSrc(Position));
     2145        if Assigned(FocusedTrack.Points[0]) then begin
     2146          SelectedTrain.Line := FocusedTrack.Points[0].Track.Line;
     2147          SelectedTrain.Line.Trains.Add(SelectedTrain);
     2148          SelectedTrain.BaseTrackPoint := FocusedTrack.Points[0];
     2149        end else
     2150        if Assigned(FocusedTrack.Points[1]) then begin
     2151          SelectedTrain.Line := FocusedTrack.Points[1].Track.Line;
     2152          SelectedTrain.Line.Trains.Add(SelectedTrain);
     2153          SelectedTrain.BaseTrackPoint := FocusedTrack.Points[1];
     2154        end;
     2155        FocusedTrack.Free;
     2156      end;
     2157
     2158      // Line color selection
     2159      for I := 0 to Lines.Count - 1 do
     2160        if Distance(Point(View.DestRect.Right div 2 - Length(LineColors) div 2 * LineColorsDist + I * LineColorsDist,
     2161          View.DestRect.Bottom - LineColorsDist), Position) < 20 then begin
     2162            SelectedLine := Lines[I];
     2163            Exit;
     2164          end;
     2165
     2166      // Remove single line station on line
     2167      if Assigned(TrackStationDown) and (TrackStationDown.Track.Line.LineStations.Count = 1) then begin
     2168        TrackStationDown.Track.Line.DisconnectStation(TrackStationDown.Track.Line.LineStations.First);
     2169      end;
     2170      if Assigned(TrackStationUp) and (TrackStationUp.Track.Line.LineStations.Count = 1) then begin
     2171        TrackStationUp.Track.Line.DisconnectStation(TrackStationUp.Track.Line.LineStations.First);
     2172      end;
    20902173    end;
    20912174  end else
     
    21642247end;
    21652248
    2166 procedure TEngine.Reset;
     2249procedure TEngine.MainMenu;
     2250begin
     2251  State := gsMenu;
     2252  Redraw;
     2253end;
     2254
     2255procedure TEngine.NewGame;
    21672256var
    21682257  NewTrain: TMetroTrain;
     
    22142303constructor TEngine.Create;
    22152304begin
     2305  MenuMain := TMenu.Create;
     2306  MenuOptions := TMenu.Create;
     2307  Menu := MenuMain;
     2308  InitMenus;
    22162309  Stations := TMapStations.Create;
    22172310  Stations.Engine := Self;
     
    22432336  FreeAndNil(Stations);
    22442337  FreeAndNil(Lines);
     2338  FreeAndNil(MenuMain);
     2339  FreeAndNil(MenuOptions);
    22452340  inherited;
    22462341end;
     
    23422437    *)
    23432438  end;
     2439
    23442440  // Draw design time lines
    23452441  if Assigned(TrackStationDown) and Assigned(TrackStationDown.LineStation) then begin
     
    24052501  end;
    24062502
    2407   // Clear background
     2503  // MainMenu background
    24082504  TargetCanvas.Brush.Color := $eff0e0;
    24092505  TargetCanvas.Brush.Style := bsSolid;
     
    24162512  MetaCanvas.DrawTo(TargetCanvas);
    24172513
    2418   // Line selection
    2419   TargetCanvas.Pen.Width := 4;
    2420   for I := 0 to High(LineColors) do begin
    2421     if Assigned(Lines.SearchByColor(LineColors[I])) then begin
    2422       TargetCanvas.Brush.Color := LineColors[I];
    2423       Size := 15;
    2424     end else begin
    2425       TargetCanvas.Brush.Color := clSilver;
    2426       Size := 5;
    2427     end;
    2428     TargetCanvas.Pen.Color := clBlack;
    2429     if Assigned(SelectedLine) and (SelectedLine.Color = LineColors[I]) then begin
    2430       TargetCanvas.Pen.Style := psSolid;
    2431     end else begin
    2432       TargetCanvas.Pen.Style := psClear;
    2433     end;
    2434 
    2435     TargetCanvas.EllipseC(TargetCanvas.Width div 2 - Length(LineColors) div 2 * LineColorsDist + I * LineColorsDist,
    2436       TargetCanvas.Height - LineColorsDist, Size, Size);
    2437   end;
    2438 
    2439   // Draw unused trains
    2440   Text := IntToStr(Trains.GetUnusedCount);
    2441   TargetCanvas.Draw(Canvas.Width div 2 - Length(LineColors) div 2 * LineColorsDist - 100,
    2442     TargetCanvas.Height - LineColorsDist - ImageLocomotive.Picture.Bitmap.Height div 2, ImageLocomotive.Picture.Bitmap);
    2443   TargetCanvas.Brush.Style := bsClear;
    2444   TargetCanvas.Font.Size := 14;
    2445   TargetCanvas.Font.Color := clBlack;
    2446   TargetCanvas.TextOut(TargetCanvas.Width div 2 - Length(LineColors) div 2 * LineColorsDist - 50 - TargetCanvas.TextWidth(Text),
    2447     TargetCanvas.Height - LineColorsDist - TargetCanvas.TextHeight(Text) div 2, Text);
    2448 
    2449   // Status interface
    2450   Text := IntToStr(ServedPassengerCount);
    2451   TargetCanvas.Draw(TargetCanvas.Width - 50, TargetCanvas.Height - 60, ImagePassenger.Picture.Bitmap);
    2452   TargetCanvas.Brush.Style := bsClear;
    2453   TargetCanvas.Font.Size := 14;
    2454   TargetCanvas.Font.Color := clBlack;
    2455   TargetCanvas.TextOut(TargetCanvas.Width - 70 - TargetCanvas.TextWidth(Text), TargetCanvas.Height - 55, Text);
    2456 
    2457   DrawClock(TargetCanvas);
    2458 
    2459   // Show grabbed train by mouse
     2514  if State <> gsMenu then begin
     2515    // Line selection
     2516    TargetCanvas.Pen.Width := 4;
     2517    for I := 0 to High(LineColors) do begin
     2518      if Assigned(Lines.SearchByColor(LineColors[I])) then begin
     2519        TargetCanvas.Brush.Color := LineColors[I];
     2520        Size := 15;
     2521      end else begin
     2522        TargetCanvas.Brush.Color := clSilver;
     2523        Size := 5;
     2524      end;
     2525      TargetCanvas.Pen.Color := clBlack;
     2526      if Assigned(SelectedLine) and (SelectedLine.Color = LineColors[I]) then begin
     2527        TargetCanvas.Pen.Style := psSolid;
     2528      end else begin
     2529        TargetCanvas.Pen.Style := psClear;
     2530      end;
     2531
     2532      TargetCanvas.EllipseC(TargetCanvas.Width div 2 - Length(LineColors) div 2 * LineColorsDist + I * LineColorsDist,
     2533        TargetCanvas.Height - LineColorsDist, Size, Size);
     2534    end;
     2535
     2536    // Draw unused trains
     2537    Text := IntToStr(Trains.GetUnusedCount);
     2538    TargetCanvas.Draw(Canvas.Width div 2 - Length(LineColors) div 2 * LineColorsDist - 100,
     2539      TargetCanvas.Height - LineColorsDist - ImageLocomotive.Picture.Bitmap.Height div 2, ImageLocomotive.Picture.Bitmap);
     2540    TargetCanvas.Brush.Style := bsClear;
     2541    TargetCanvas.Font.Size := 14;
     2542    TargetCanvas.Font.Color := clBlack;
     2543    TargetCanvas.TextOut(TargetCanvas.Width div 2 - Length(LineColors) div 2 * LineColorsDist - 50 - TargetCanvas.TextWidth(Text),
     2544      TargetCanvas.Height - LineColorsDist - TargetCanvas.TextHeight(Text) div 2, Text);
     2545
     2546    // Status interface
     2547    Text := IntToStr(ServedPassengerCount);
     2548    TargetCanvas.Draw(TargetCanvas.Width - 50, TargetCanvas.Height - 60, ImagePassenger.Picture.Bitmap);
     2549    TargetCanvas.Brush.Style := bsClear;
     2550    TargetCanvas.Font.Size := 14;
     2551    TargetCanvas.Font.Color := clBlack;
     2552    TargetCanvas.TextOut(TargetCanvas.Width - 70 - TargetCanvas.TextWidth(Text), TargetCanvas.Height - 55, Text);
     2553
     2554    DrawClock(TargetCanvas);
     2555  end;
     2556
     2557  // Show train grabbed by mouse
    24602558  if Assigned(SelectedTrain) then begin
    24612559    TargetCanvas.Brush.Color := clBlack; //SelectedTrain.Line.Color;
     
    24832581    Text := Format(SGameOverStatistic, [ServedPassengerCount, Trunc(Time)]);
    24842582    TargetCanvas.TextOut((TargetCanvas.Width - TargetCanvas.TextWidth(Text)) div 2, 180, Text);
    2485   end;
     2583  end else
     2584  if State = gsMenu then begin
     2585    Menu.Paint(TargetCanvas);
     2586  end;
     2587
    24862588  RedrawPending := False;
    24872589end;
Note: See TracChangeset for help on using the changeset viewer.