Changeset 96 for trunk/UEngine.pas
- Timestamp:
- Sep 28, 2022, 1:54:11 AM (20 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/UEngine.pas
r95 r96 148 148 end; 149 149 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; 151 155 152 156 { TEngine } … … 188 192 procedure DrawGameOver(Canvas: TCanvas; CanvasSize: TPoint); 189 193 procedure DrawNewWeek(Canvas: TCanvas; CanvasSize: TPoint); 194 procedure DrawNewImprovement(Canvas: TCanvas; CanvasSize: TPoint); 190 195 procedure DrawStationPassengerOverload(Canvas: TCanvas); 191 196 procedure DrawLines(Canvas: TCanvas); … … 211 216 procedure ButtonFastForward(Sender: TObject); 212 217 procedure ButtonNewTrain(Sender: TObject); 218 procedure ButtonNewImprovement1(Sender: TObject); 219 procedure ButtonNewImprovement2(Sender: TObject); 213 220 procedure ButtonBackClick(Sender: TObject); 214 221 procedure DarkModeChanged(Sender: TObject); … … 217 224 procedure UpdateInterface; 218 225 procedure InitCities; 226 function GetImprovementText(Improvement: TMetroImprovement): string; 227 function GetImprovementBitmap(Improvement: TMetroImprovement): TBitmap; 228 procedure EvaluateImprovement(Improvement: TMetroImprovement); 219 229 public 220 230 Week: Integer; … … 243 253 ImageFastForward: TImage; 244 254 ImageCarriage: TImage; 255 ImageTerminal: TImage; 256 ImageTunnel: TImage; 257 ImageLine: TImage; 245 258 ImageNewTrain: TImage; 259 ImageNewImprovement1: TImage; 260 ImageNewImprovement2: TImage; 261 AvailableImprovements: TMetroImprovementSet; 262 Improvement1: TMetroImprovement; 263 Improvement2: TMetroImprovement; 246 264 HighestServedPassengerCount: Integer; 247 265 HighestServedDaysCount: Integer; … … 324 342 SStationWithoutMapStation = 'Station have to have MapStation'; 325 343 SNewTrain = 'You get a new train for your metro'; 344 SNewImprovement = 'Select a new improvement for your metro'; 326 345 SWeek = 'week'; 327 346 STrain = 'Train'; … … 339 358 SContinue = 'Continue'; 340 359 SRestart = 'Try again'; 360 STerminal = 'Terminal'; 361 SLine = 'Line'; 362 SCarriage = 'Carriage'; 363 STunnel = 'Tunnel'; 341 364 342 365 // Cities … … 1686 1709 1687 1710 procedure TEngine.ButtonNewTrain(Sender: TObject); 1711 var 1712 Improvements: TList<TMetroImprovement>; 1713 Improvement: TMetroImprovement; 1714 Index: Integer; 1688 1715 begin 1689 1716 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; 1749 end; 1750 1751 procedure TEngine.ButtonNewImprovement1(Sender: TObject); 1752 begin 1753 EvaluateImprovement(Improvement1); 1754 State := gsRunning; 1755 Redraw; 1756 end; 1757 1758 procedure TEngine.ButtonNewImprovement2(Sender: TObject); 1759 begin 1760 EvaluateImprovement(Improvement2); 1691 1761 State := gsRunning; 1692 1762 Redraw; … … 1750 1820 AddNew(SParis); 1751 1821 AddNew(STokyo); 1822 end; 1823 end; 1824 1825 function TEngine.GetImprovementText(Improvement: TMetroImprovement): string; 1826 begin 1827 case Improvement of 1828 miCarriage: Result := SCarriage; 1829 miTerminal: Result := STerminal; 1830 miTunnel: Result := STunnel; 1831 miLine: Result := SLine; 1832 end; 1833 end; 1834 1835 function TEngine.GetImprovementBitmap(Improvement: TMetroImprovement): TBitmap; 1836 begin 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; 1843 end; 1844 1845 procedure TEngine.EvaluateImprovement(Improvement: TMetroImprovement); 1846 begin 1847 case Improvement of 1848 miLine: Lines.AddNew; 1849 miCarriage: Carriages.AddNew; 1850 //miTunnel: Tunnels.AddNew; 1851 //miTerminal: Terminals.AddNew; 1752 1852 end; 1753 1853 end; … … 2087 2187 TextSize := TextExtent(Text); 2088 2188 TextOut((CanvasSize.X - TextSize.Width) div 2, Y, Text); 2189 end; 2190 end; 2191 2192 procedure TEngine.DrawNewImprovement(Canvas: TCanvas; CanvasSize: TPoint); 2193 var 2194 Text: string; 2195 TextSize: TSize; 2196 Y: Integer; 2197 X: Integer; 2198 const 2199 ImageZoom = 4; 2200 begin 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; 2089 2264 end; 2090 2265 end; … … 2501 2676 if State = gsNewWeek then begin 2502 2677 ImageNewTrain.MouseUp(Position); 2678 end else 2679 if State = gsNewImprovement then begin 2680 ImageNewImprovement1.MouseUp(Position); 2681 ImageNewImprovement2.MouseUp(Position); 2503 2682 end 2504 2683 else … … 2713 2892 procedure TEngine.Clear; 2714 2893 begin 2715 Week := 0;2894 Week := 1; 2716 2895 Trains.Clear; 2717 2896 Passengers.Clear; … … 2728 2907 begin 2729 2908 Clear; 2909 AvailableImprovements := [miCarriage, miLine]; 2730 2910 ShapeCount := 3; 2731 2911 ServedPassengerCount := 0; … … 2812 2992 Trains := TMetroTrains.Create; 2813 2993 Carriages := TMetroCarriages.Create; 2994 ImageTunnel := TImage.Create; 2995 ImageLine := TImage.Create; 2996 ImageTerminal := TImage.Create; 2814 2997 ImagePassenger := TImage.Create; 2815 2998 ImageLocomotive := TImage.Create; … … 2823 3006 ImageNewTrain := TImage.Create; 2824 3007 ImageNewTrain.OnClick := ButtonNewTrain; 3008 ImageNewImprovement1 := TImage.Create; 3009 ImageNewImprovement1.OnClick := ButtonNewImprovement1; 3010 ImageNewImprovement2 := TImage.Create; 3011 ImageNewImprovement2.OnClick := ButtonNewImprovement2; 2825 3012 //if FileExists(ImagePassengerName) then 2826 3013 // ImagePassenger.Picture.LoadFromFile(ImagePassengerName); … … 2839 3026 FreeAndNil(Trains); 2840 3027 FreeAndNil(Carriages); 3028 FreeAndNil(ImageTunnel); 3029 FreeAndNil(ImageTerminal); 3030 FreeAndNil(ImageLine); 3031 FreeAndNil(ImageNewImprovement1); 3032 FreeAndNil(ImageNewImprovement2); 2841 3033 FreeAndNil(ImageNewTrain); 2842 3034 FreeAndNil(ImagePlay); … … 2890 3082 DrawNewWeek(Canvas, CanvasSize); 2891 3083 end else 3084 if State = gsNewImprovement then begin 3085 DrawNewImprovement(Canvas, CanvasSize); 3086 end else 2892 3087 if State in [gsRunning, gsPaused] then begin 2893 3088 DrawGameControls(Canvas, CanvasSize);
Note:
See TracChangeset
for help on using the changeset viewer.