Changeset 96 for trunk/UEngine.pas


Ignore:
Timestamp:
Sep 28, 2022, 1:54:11 AM (20 months ago)
Author:
chronos
Message:
  • Added: Improvement selection dialog after new train dialog.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UEngine.pas

    r95 r96  
    148148  end;
    149149
    150   TGameState = (gsNotStarted, gsRunning, gsPaused, gsGameOver, gsMenu, gsNewWeek);
     150  TGameState = (gsNotStarted, gsRunning, gsPaused, gsGameOver, gsMenu, gsNewWeek,
     151    gsNewImprovement);
     152
     153  TMetroImprovement = (miNone, miTunnel, miTerminal, miLine, miCarriage);
     154  TMetroImprovementSet = set of TMetroImprovement;
    151155
    152156  { TEngine }
     
    188192    procedure DrawGameOver(Canvas: TCanvas; CanvasSize: TPoint);
    189193    procedure DrawNewWeek(Canvas: TCanvas; CanvasSize: TPoint);
     194    procedure DrawNewImprovement(Canvas: TCanvas; CanvasSize: TPoint);
    190195    procedure DrawStationPassengerOverload(Canvas: TCanvas);
    191196    procedure DrawLines(Canvas: TCanvas);
     
    211216    procedure ButtonFastForward(Sender: TObject);
    212217    procedure ButtonNewTrain(Sender: TObject);
     218    procedure ButtonNewImprovement1(Sender: TObject);
     219    procedure ButtonNewImprovement2(Sender: TObject);
    213220    procedure ButtonBackClick(Sender: TObject);
    214221    procedure DarkModeChanged(Sender: TObject);
     
    217224    procedure UpdateInterface;
    218225    procedure InitCities;
     226    function GetImprovementText(Improvement: TMetroImprovement): string;
     227    function GetImprovementBitmap(Improvement: TMetroImprovement): TBitmap;
     228    procedure EvaluateImprovement(Improvement: TMetroImprovement);
    219229  public
    220230    Week: Integer;
     
    243253    ImageFastForward: TImage;
    244254    ImageCarriage: TImage;
     255    ImageTerminal: TImage;
     256    ImageTunnel: TImage;
     257    ImageLine: TImage;
    245258    ImageNewTrain: TImage;
     259    ImageNewImprovement1: TImage;
     260    ImageNewImprovement2: TImage;
     261    AvailableImprovements: TMetroImprovementSet;
     262    Improvement1: TMetroImprovement;
     263    Improvement2: TMetroImprovement;
    246264    HighestServedPassengerCount: Integer;
    247265    HighestServedDaysCount: Integer;
     
    324342  SStationWithoutMapStation = 'Station have to have MapStation';
    325343  SNewTrain = 'You get a new train for your metro';
     344  SNewImprovement = 'Select a new improvement for your metro';
    326345  SWeek = 'week';
    327346  STrain = 'Train';
     
    339358  SContinue = 'Continue';
    340359  SRestart = 'Try again';
     360  STerminal = 'Terminal';
     361  SLine = 'Line';
     362  SCarriage = 'Carriage';
     363  STunnel = 'Tunnel';
    341364
    342365  // Cities
     
    16861709
    16871710procedure TEngine.ButtonNewTrain(Sender: TObject);
     1711var
     1712  Improvements: TList<TMetroImprovement>;
     1713  Improvement: TMetroImprovement;
     1714  Index: Integer;
    16881715begin
    16891716  Trains.AddNew;
    1690   if Random < 0.2 then Carriages.AddNew;
     1717  State := gsNewImprovement;
     1718  if Lines.Count <= (High(LineColors) - Low(LineColors)) then
     1719    AvailableImprovements := AvailableImprovements + [miLine]
     1720    else AvailableImprovements := AvailableImprovements - [miLine];
     1721
     1722  Improvements := TList<TMetroImprovement>.Create;
     1723  try
     1724    for Improvement := Low(TMetroImprovement) to High(TMetroImprovement) do
     1725    if Improvement in AvailableImprovements then begin
     1726      Improvements.Add(Improvement);
     1727    end;
     1728
     1729    Index := Random(Integer(Improvements.Count));
     1730    Improvement1 := Improvements[Index];
     1731    Improvements.Delete(Index);
     1732
     1733    if Improvements.Count > 0 then begin
     1734      Index := Random(Integer(Improvements.Count));
     1735      Improvement2 := Improvements[Index];
     1736    end else Improvement2 := miNone;
     1737
     1738    if Improvement1 <> miNone then
     1739      ImageNewImprovement1.Bitmap.Assign(GetImprovementBitmap(Improvement1));
     1740    ImageNewImprovement1.Enabled := Improvement1 <> miNone;
     1741
     1742    if Improvement2 <> miNone then
     1743      ImageNewImprovement2.Bitmap.Assign(GetImprovementBitmap(Improvement2));
     1744    ImageNewImprovement2.Enabled := Improvement2 <> miNone;
     1745  finally
     1746    Improvements.Free;
     1747  end;
     1748  Redraw;
     1749end;
     1750
     1751procedure TEngine.ButtonNewImprovement1(Sender: TObject);
     1752begin
     1753  EvaluateImprovement(Improvement1);
     1754  State := gsRunning;
     1755  Redraw;
     1756end;
     1757
     1758procedure TEngine.ButtonNewImprovement2(Sender: TObject);
     1759begin
     1760  EvaluateImprovement(Improvement2);
    16911761  State := gsRunning;
    16921762  Redraw;
     
    17501820    AddNew(SParis);
    17511821    AddNew(STokyo);
     1822  end;
     1823end;
     1824
     1825function TEngine.GetImprovementText(Improvement: TMetroImprovement): string;
     1826begin
     1827  case Improvement of
     1828    miCarriage: Result := SCarriage;
     1829    miTerminal: Result := STerminal;
     1830    miTunnel: Result := STunnel;
     1831    miLine: Result := SLine;
     1832  end;
     1833end;
     1834
     1835function TEngine.GetImprovementBitmap(Improvement: TMetroImprovement): TBitmap;
     1836begin
     1837  case Improvement of
     1838    miCarriage: Result := ImageCarriage.Bitmap;
     1839    miTerminal: Result := ImageTerminal.Bitmap;
     1840    miTunnel: Result := ImageTunnel.Bitmap;
     1841    miLine: Result := ImageLine.Bitmap;
     1842  end;
     1843end;
     1844
     1845procedure TEngine.EvaluateImprovement(Improvement: TMetroImprovement);
     1846begin
     1847  case Improvement of
     1848    miLine: Lines.AddNew;
     1849    miCarriage: Carriages.AddNew;
     1850    //miTunnel: Tunnels.AddNew;
     1851    //miTerminal: Terminals.AddNew;
    17521852  end;
    17531853end;
     
    20872187    TextSize := TextExtent(Text);
    20882188    TextOut((CanvasSize.X - TextSize.Width) div 2, Y, Text);
     2189  end;
     2190end;
     2191
     2192procedure TEngine.DrawNewImprovement(Canvas: TCanvas; CanvasSize: TPoint);
     2193var
     2194  Text: string;
     2195  TextSize: TSize;
     2196  Y: Integer;
     2197  X: Integer;
     2198const
     2199  ImageZoom = 4;
     2200begin
     2201  with Canvas do begin
     2202    Pen.Color := Self.Colors.Text;
     2203    Pen.Style := psSolid;
     2204    Pen.Width := ScaleX(2, 96);
     2205    Brush.Color := Self.Colors.Background2;
     2206    Brush.Style := bsSolid;
     2207    Rectangle(Bounds(CanvasSize.X div 4, CanvasSize.Y div 4, CanvasSize.X div 2, CanvasSize.Y div 2));
     2208    Pen.Style := psClear;
     2209    X := CanvasSize.X div 4 + ScaleX(10, 96);
     2210    Y := CanvasSize.Y div 4 + ScaleX(10, 96);
     2211
     2212    Text := IntToStr(Week) + '. ' + SWeek;
     2213    Font.Size := 30;
     2214    Font.Color := Self.Colors.Text;
     2215    TextSize := TextExtent(Text);
     2216    TextOut(X, Y, Text);
     2217    Y := Y + Round(1.1 * TextSize.Height);
     2218
     2219    Text := SNewImprovement;
     2220    Font.Size := 14;
     2221    Font.Color := Self.Colors.Text;
     2222    TextSize := TextExtent(Text);
     2223    TextOut(X, Y, Text);
     2224    Y := Y + Round(1.1 * TextSize.Height);
     2225
     2226    if Improvement1 <> miNone then begin
     2227      ImageNewImprovement1.Canvas := Canvas;
     2228      ImageNewImprovement1.Bounds := Bounds(CanvasSize.X div 2 - CanvasSize.X div 8 -
     2229        ImageNewImprovement1.Bitmap.Width * ImageZoom div 2,
     2230        (CanvasSize.Y - ImageNewImprovement1.Bitmap.Height * ImageZoom) div 2,
     2231        ImageNewImprovement1.Bitmap.Width * ImageZoom,
     2232        ImageNewImprovement1.Bitmap.Height * ImageZoom);
     2233      ImageNewImprovement1.Paint;
     2234    end;
     2235
     2236    if Improvement2 <> miNone then begin
     2237      ImageNewImprovement2.Canvas := Canvas;
     2238      ImageNewImprovement2.Bounds := Bounds(CanvasSize.X div 2 + CanvasSize.X div 8 -
     2239        ImageNewImprovement2.Bitmap.Width * ImageZoom div 2,
     2240        (CanvasSize.Y - ImageNewImprovement2.Bitmap.Height * ImageZoom) div 2,
     2241        ImageNewImprovement2.Bitmap.Width * ImageZoom,
     2242        ImageNewImprovement2.Bitmap.Height * ImageZoom);
     2243     ImageNewImprovement2.Paint;
     2244    end;
     2245
     2246    Y := (CanvasSize.Y - ImageLocomotive.Bitmap.Height * ImageZoom) div 2 +
     2247      Round(ImageLocomotive.Bitmap.Height * ImageZoom * 1.1);
     2248
     2249    if Improvement1 <> miNone then begin
     2250      Text := GetImprovementText(Improvement1);
     2251      Font.Size := 20;
     2252      Font.Color := Self.Colors.Text;
     2253      TextSize := TextExtent(Text);
     2254      TextOut(CanvasSize.X div 2 - CanvasSize.X div 8 - TextSize.Width div 2, Y, Text);
     2255    end;
     2256
     2257    if Improvement2 <> miNone then begin
     2258      Text := GetImprovementText(Improvement2);
     2259      Font.Size := 20;
     2260      Font.Color := Self.Colors.Text;
     2261      TextSize := TextExtent(Text);
     2262      TextOut(CanvasSize.X div 2 + CanvasSize.X div 8 - TextSize.Width div 2, Y, Text);
     2263    end;
    20892264  end;
    20902265end;
     
    25012676    if State = gsNewWeek then begin
    25022677      ImageNewTrain.MouseUp(Position);
     2678    end else
     2679    if State = gsNewImprovement then begin
     2680      ImageNewImprovement1.MouseUp(Position);
     2681      ImageNewImprovement2.MouseUp(Position);
    25032682    end
    25042683    else
     
    27132892procedure TEngine.Clear;
    27142893begin
    2715   Week := 0;
     2894  Week := 1;
    27162895  Trains.Clear;
    27172896  Passengers.Clear;
     
    27282907begin
    27292908  Clear;
     2909  AvailableImprovements := [miCarriage, miLine];
    27302910  ShapeCount := 3;
    27312911  ServedPassengerCount := 0;
     
    28122992  Trains := TMetroTrains.Create;
    28132993  Carriages := TMetroCarriages.Create;
     2994  ImageTunnel := TImage.Create;
     2995  ImageLine := TImage.Create;
     2996  ImageTerminal := TImage.Create;
    28142997  ImagePassenger := TImage.Create;
    28152998  ImageLocomotive := TImage.Create;
     
    28233006  ImageNewTrain := TImage.Create;
    28243007  ImageNewTrain.OnClick := ButtonNewTrain;
     3008  ImageNewImprovement1 := TImage.Create;
     3009  ImageNewImprovement1.OnClick := ButtonNewImprovement1;
     3010  ImageNewImprovement2 := TImage.Create;
     3011  ImageNewImprovement2.OnClick := ButtonNewImprovement2;
    28253012  //if FileExists(ImagePassengerName) then
    28263013  //  ImagePassenger.Picture.LoadFromFile(ImagePassengerName);
     
    28393026  FreeAndNil(Trains);
    28403027  FreeAndNil(Carriages);
     3028  FreeAndNil(ImageTunnel);
     3029  FreeAndNil(ImageTerminal);
     3030  FreeAndNil(ImageLine);
     3031  FreeAndNil(ImageNewImprovement1);
     3032  FreeAndNil(ImageNewImprovement2);
    28413033  FreeAndNil(ImageNewTrain);
    28423034  FreeAndNil(ImagePlay);
     
    28903082    DrawNewWeek(Canvas, CanvasSize);
    28913083  end else
     3084  if State = gsNewImprovement then begin
     3085    DrawNewImprovement(Canvas, CanvasSize);
     3086  end else
    28923087  if State in [gsRunning, gsPaused] then begin
    28933088    DrawGameControls(Canvas, CanvasSize);
Note: See TracChangeset for help on using the changeset viewer.