powergrid-engine 1.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +31 -0
  3. package/dist/index.d.ts +6 -0
  4. package/dist/index.js +17 -0
  5. package/dist/src/available-moves.d.ts +24 -0
  6. package/dist/src/available-moves.js +363 -0
  7. package/dist/src/engine.d.ts +20 -0
  8. package/dist/src/engine.js +1937 -0
  9. package/dist/src/gamestate.d.ts +135 -0
  10. package/dist/src/gamestate.js +30 -0
  11. package/dist/src/log.d.ts +14 -0
  12. package/dist/src/log.js +2 -0
  13. package/dist/src/maps/america.d.ts +55 -0
  14. package/dist/src/maps/america.js +411 -0
  15. package/dist/src/maps/australia.d.ts +46 -0
  16. package/dist/src/maps/australia.js +138 -0
  17. package/dist/src/maps/badenwurttemberg.d.ts +46 -0
  18. package/dist/src/maps/badenwurttemberg.js +163 -0
  19. package/dist/src/maps/benelux.d.ts +46 -0
  20. package/dist/src/maps/benelux.js +210 -0
  21. package/dist/src/maps/brazil.d.ts +54 -0
  22. package/dist/src/maps/brazil.js +292 -0
  23. package/dist/src/maps/centraleurope.d.ts +54 -0
  24. package/dist/src/maps/centraleurope.js +236 -0
  25. package/dist/src/maps/china.d.ts +54 -0
  26. package/dist/src/maps/china.js +262 -0
  27. package/dist/src/maps/france.d.ts +54 -0
  28. package/dist/src/maps/france.js +290 -0
  29. package/dist/src/maps/germany.d.ts +57 -0
  30. package/dist/src/maps/germany.js +328 -0
  31. package/dist/src/maps/indian.d.ts +54 -0
  32. package/dist/src/maps/indian.js +283 -0
  33. package/dist/src/maps/italy.d.ts +54 -0
  34. package/dist/src/maps/italy.js +190 -0
  35. package/dist/src/maps/japan.d.ts +46 -0
  36. package/dist/src/maps/japan.js +144 -0
  37. package/dist/src/maps/korea.d.ts +54 -0
  38. package/dist/src/maps/korea.js +186 -0
  39. package/dist/src/maps/middleeast.d.ts +54 -0
  40. package/dist/src/maps/middleeast.js +225 -0
  41. package/dist/src/maps/northerneurope.d.ts +54 -0
  42. package/dist/src/maps/northerneurope.js +197 -0
  43. package/dist/src/maps/quebec.d.ts +54 -0
  44. package/dist/src/maps/quebec.js +283 -0
  45. package/dist/src/maps/russia.d.ts +54 -0
  46. package/dist/src/maps/russia.js +286 -0
  47. package/dist/src/maps/southafrica.d.ts +46 -0
  48. package/dist/src/maps/southafrica.js +152 -0
  49. package/dist/src/maps/spainportugal.d.ts +54 -0
  50. package/dist/src/maps/spainportugal.js +289 -0
  51. package/dist/src/maps/ukireland.d.ts +52 -0
  52. package/dist/src/maps/ukireland.js +176 -0
  53. package/dist/src/maps.d.ts +50 -0
  54. package/dist/src/maps.js +61 -0
  55. package/dist/src/move.d.ts +63 -0
  56. package/dist/src/move.js +15 -0
  57. package/dist/src/powerPlants.d.ts +4 -0
  58. package/dist/src/powerPlants.js +60 -0
  59. package/dist/src/prices.d.ts +7 -0
  60. package/dist/src/prices.js +10 -0
  61. package/dist/src/randomizeMap.d.ts +3 -0
  62. package/dist/src/randomizeMap.js +244 -0
  63. package/dist/src/utils.d.ts +2 -0
  64. package/dist/src/utils.js +24 -0
  65. package/dist/wrapper.d.ts +30 -0
  66. package/dist/wrapper.js +127 -0
  67. package/index.ts +6 -0
  68. package/package.json +51 -0
  69. package/src/available-moves.ts +450 -0
  70. package/src/engine.spec.ts +163 -0
  71. package/src/engine.ts +2270 -0
  72. package/src/fixtures/GermanyRecharged.json +6627 -0
  73. package/src/fixtures/USAOriginal.json +5216 -0
  74. package/src/fixtures/supply.json +5792 -0
  75. package/src/fixtures/undo.json +4102 -0
  76. package/src/gamestate.ts +164 -0
  77. package/src/log.ts +17 -0
  78. package/src/maps/america.ts +411 -0
  79. package/src/maps/australia.ts +137 -0
  80. package/src/maps/badenwurttemberg.ts +162 -0
  81. package/src/maps/benelux.ts +210 -0
  82. package/src/maps/brazil.ts +306 -0
  83. package/src/maps/centraleurope.ts +235 -0
  84. package/src/maps/china.ts +268 -0
  85. package/src/maps/france.ts +295 -0
  86. package/src/maps/germany.ts +328 -0
  87. package/src/maps/indian.ts +289 -0
  88. package/src/maps/italy.ts +189 -0
  89. package/src/maps/japan.ts +143 -0
  90. package/src/maps/korea.ts +185 -0
  91. package/src/maps/middleeast.ts +225 -0
  92. package/src/maps/northerneurope.ts +196 -0
  93. package/src/maps/quebec.ts +304 -0
  94. package/src/maps/russia.ts +292 -0
  95. package/src/maps/southafrica.ts +151 -0
  96. package/src/maps/spainportugal.ts +295 -0
  97. package/src/maps/ukireland.ts +175 -0
  98. package/src/maps.ts +123 -0
  99. package/src/move.ts +83 -0
  100. package/src/powerPlants.ts +59 -0
  101. package/src/prices.ts +10 -0
  102. package/src/randomizeMap.ts +288 -0
  103. package/src/rankings.spec.ts +18 -0
  104. package/src/utils.spec.ts +13 -0
  105. package/src/utils.ts +23 -0
  106. package/tsconfig.json +17 -0
  107. package/wrapper.ts +126 -0
@@ -0,0 +1,328 @@
1
+ import { GameMap } from './../maps';
2
+
3
+ export enum Regions {
4
+ Purple = 'purple',
5
+ Green = 'green',
6
+ Red = 'red',
7
+ Yellow = 'yellow',
8
+ Cyan = 'cyan',
9
+ Brown = 'brown',
10
+ }
11
+
12
+ export enum Cities {
13
+ Flensburg = 'Flensburg',
14
+ Kiel = 'Kiel',
15
+ Hamburg = 'Hamburg',
16
+ Hannover = 'Hannover',
17
+ Bremen = 'Bremen',
18
+ Wilhelmshaven = 'Wilhelmshaven',
19
+ Cuxhaven = 'Cuxhaven',
20
+ Lubeck = 'Lubeck',
21
+ Rostock = 'Rostock',
22
+ Schwerin = 'Schwerin',
23
+ Torgelow = 'Torgelow',
24
+ Magdeburg = 'Magdeburg',
25
+ Berlin = 'Berlin',
26
+ FrankfurtO = 'Frankfurt-O',
27
+ Halle = 'Halle',
28
+ Leipzig = 'Leipzig',
29
+ Dresden = 'Dresden',
30
+ Erfurt = 'Erfurt',
31
+ Fulda = 'Fulda',
32
+ Würzburg = 'Würzburg',
33
+ Nurnberg = 'Nurnberg',
34
+ Osnabrück = 'Osnabrück',
35
+ Münster = 'Münster',
36
+ Essen = 'Essen',
37
+ Duisburg = 'Duisburg',
38
+ Dortmund = 'Dortmund',
39
+ Dusseldorf = 'Dusseldorf',
40
+ Kassel = 'Kassel',
41
+ Aachen = 'Aachen',
42
+ Köln = 'Köln',
43
+ Trier = 'Trier',
44
+ Wiesbaden = 'Wiesbaden',
45
+ FrankfurtM = 'Frankfurt-M',
46
+ Saarbrücken = 'Saarbrücken',
47
+ Mannheim = 'Mannheim',
48
+ Freiburg = 'Freiburg',
49
+ Stuttgart = 'Stuttgart',
50
+ Konstanz = 'Konstanz',
51
+ Augsburg = 'Augsburg',
52
+ Regensburg = 'Regensburg',
53
+ München = 'München',
54
+ Passau = 'Passau',
55
+ Stralsund = 'Stralsund',
56
+ Mainz = 'Mainz',
57
+ }
58
+
59
+ export const map: GameMap = {
60
+ name: 'Germany',
61
+ cities: [
62
+ { name: Cities.Flensburg, region: Regions.Green, x: 37, y: 427 },
63
+ { name: Cities.Kiel, region: Regions.Green, x: 106, y: 392 },
64
+ { name: Cities.Hamburg, region: Regions.Green, x: 212, y: 396 },
65
+ { name: Cities.Hannover, region: Regions.Green, x: 378, y: 395 },
66
+ { name: Cities.Bremen, region: Regions.Green, x: 276, y: 463 },
67
+ { name: Cities.Wilhelmshaven, region: Regions.Green, x: 211, y: 521 },
68
+ { name: Cities.Cuxhaven, region: Regions.Green, x: 168, y: 474 },
69
+ { name: Cities.Lubeck, region: Regions.Brown, x: 153, y: 341 },
70
+ { name: Cities.Rostock, region: Regions.Brown, x: 128, y: 256 },
71
+ { name: Cities.Schwerin, region: Regions.Brown, x: 217, y: 297 },
72
+ { name: Cities.Torgelow, region: Regions.Brown, x: 210, y: 126 },
73
+ { name: Cities.Magdeburg, region: Regions.Brown, x: 389, y: 271 },
74
+ { name: Cities.Berlin, region: Regions.Brown, x: 355, y: 170 },
75
+ { name: Cities.FrankfurtO, region: Regions.Brown, x: 381, y: 99 },
76
+ { name: Cities.Halle, region: Regions.Yellow, x: 493, y: 259 },
77
+ { name: Cities.Leipzig, region: Regions.Yellow, x: 526, y: 222 },
78
+ { name: Cities.Dresden, region: Regions.Yellow, x: 572, y: 126 },
79
+ { name: Cities.Erfurt, region: Regions.Yellow, x: 567, y: 309 },
80
+ { name: Cities.Fulda, region: Regions.Yellow, x: 628, y: 398 },
81
+ { name: Cities.Würzburg, region: Regions.Yellow, x: 735, y: 386 },
82
+ { name: Cities.Nurnberg, region: Regions.Yellow, x: 780, y: 309 },
83
+ { name: Cities.Osnabrück, region: Regions.Red, x: 359, y: 516 },
84
+ { name: Cities.Münster, region: Regions.Red, x: 427, y: 554 },
85
+ { name: Cities.Essen, region: Regions.Red, x: 475, y: 603 },
86
+ { name: Cities.Duisburg, region: Regions.Red, x: 456, y: 645 },
87
+ { name: Cities.Dortmund, region: Regions.Red, x: 505, y: 543 },
88
+ { name: Cities.Dusseldorf, region: Regions.Red, x: 537, y: 635 },
89
+ { name: Cities.Kassel, region: Regions.Red, x: 524, y: 430 },
90
+ { name: Cities.Aachen, region: Regions.Cyan, x: 614, y: 654 },
91
+ { name: Cities.Köln, region: Regions.Cyan, x: 590, y: 589 },
92
+ { name: Cities.Trier, region: Regions.Cyan, x: 739, y: 628 },
93
+ { name: Cities.Wiesbaden, region: Regions.Cyan, x: 697, y: 514 },
94
+ { name: Cities.FrankfurtM, region: Regions.Cyan, x: 672, y: 473 },
95
+ { name: Cities.Saarbrücken, region: Regions.Cyan, x: 818, y: 568 },
96
+ { name: Cities.Mannheim, region: Regions.Cyan, x: 796, y: 479 },
97
+ { name: Cities.Freiburg, region: Regions.Purple, x: 966, y: 537 },
98
+ { name: Cities.Stuttgart, region: Regions.Purple, x: 884, y: 458 },
99
+ { name: Cities.Konstanz, region: Regions.Purple, x: 1011, y: 459 },
100
+ { name: Cities.Augsburg, region: Regions.Purple, x: 911, y: 346 },
101
+ { name: Cities.Regensburg, region: Regions.Purple, x: 846, y: 256 },
102
+ { name: Cities.München, region: Regions.Purple, x: 967, y: 278 },
103
+ { name: Cities.Passau, region: Regions.Purple, x: 904, y: 153 },
104
+ ],
105
+ connections: [
106
+ { nodes: [Cities.Flensburg, Cities.Kiel], cost: 4 },
107
+ { nodes: [Cities.Kiel, Cities.Hamburg], cost: 8 },
108
+ { nodes: [Cities.Kiel, Cities.Lubeck], cost: 4 },
109
+ { nodes: [Cities.Hamburg, Cities.Hannover], cost: 17 },
110
+ { nodes: [Cities.Hamburg, Cities.Bremen], cost: 11 },
111
+ { nodes: [Cities.Hamburg, Cities.Cuxhaven], cost: 11 },
112
+ { nodes: [Cities.Hamburg, Cities.Lubeck], cost: 6 },
113
+ { nodes: [Cities.Hamburg, Cities.Schwerin], cost: 8 },
114
+ { nodes: [Cities.Bremen, Cities.Wilhelmshaven], cost: 11 },
115
+ { nodes: [Cities.Bremen, Cities.Hannover], cost: 10 },
116
+ { nodes: [Cities.Bremen, Cities.Cuxhaven], cost: 8 },
117
+ { nodes: [Cities.Bremen, Cities.Osnabrück], cost: 11 },
118
+ { nodes: [Cities.Hannover, Cities.Schwerin], cost: 19 },
119
+ { nodes: [Cities.Hannover, Cities.Magdeburg], cost: 15 },
120
+ { nodes: [Cities.Hannover, Cities.Erfurt], cost: 19 },
121
+ { nodes: [Cities.Hannover, Cities.Osnabrück], cost: 16 },
122
+ { nodes: [Cities.Hannover, Cities.Kassel], cost: 15 },
123
+ { nodes: [Cities.Wilhelmshaven, Cities.Osnabrück], cost: 14 },
124
+ { nodes: [Cities.Lubeck, Cities.Schwerin], cost: 6 },
125
+ { nodes: [Cities.Schwerin, Cities.Rostock], cost: 6 },
126
+ { nodes: [Cities.Schwerin, Cities.Torgelow], cost: 19 },
127
+ { nodes: [Cities.Schwerin, Cities.Berlin], cost: 18 },
128
+ { nodes: [Cities.Schwerin, Cities.Magdeburg], cost: 16 },
129
+ { nodes: [Cities.Torgelow, Cities.Rostock], cost: 19 },
130
+ { nodes: [Cities.Torgelow, Cities.Berlin], cost: 15 },
131
+ { nodes: [Cities.Berlin, Cities.Magdeburg], cost: 10 },
132
+ { nodes: [Cities.Berlin, Cities.FrankfurtO], cost: 6 },
133
+ { nodes: [Cities.Berlin, Cities.Halle], cost: 17 },
134
+ { nodes: [Cities.Magdeburg, Cities.Halle], cost: 11 },
135
+ { nodes: [Cities.FrankfurtO, Cities.Leipzig], cost: 21 },
136
+ { nodes: [Cities.FrankfurtO, Cities.Dresden], cost: 16 },
137
+ { nodes: [Cities.Halle, Cities.Leipzig], cost: 0 },
138
+ { nodes: [Cities.Leipzig, Cities.Dresden], cost: 13 },
139
+ { nodes: [Cities.Erfurt, Cities.Halle], cost: 6 },
140
+ { nodes: [Cities.Erfurt, Cities.Dresden], cost: 19 },
141
+ { nodes: [Cities.Erfurt, Cities.Nurnberg], cost: 21 },
142
+ { nodes: [Cities.Erfurt, Cities.Fulda], cost: 13 },
143
+ { nodes: [Cities.Erfurt, Cities.Kassel], cost: 15 },
144
+ { nodes: [Cities.Fulda, Cities.Würzburg], cost: 11 },
145
+ { nodes: [Cities.Fulda, Cities.Kassel], cost: 8 },
146
+ { nodes: [Cities.Fulda, Cities.FrankfurtM], cost: 8 },
147
+ { nodes: [Cities.Würzburg, Cities.Nurnberg], cost: 8 },
148
+ { nodes: [Cities.Würzburg, Cities.FrankfurtM], cost: 13 },
149
+ { nodes: [Cities.Würzburg, Cities.Mannheim], cost: 10 },
150
+ { nodes: [Cities.Würzburg, Cities.Stuttgart], cost: 12 },
151
+ { nodes: [Cities.Würzburg, Cities.Augsburg], cost: 19 },
152
+ { nodes: [Cities.Nurnberg, Cities.Augsburg], cost: 18 },
153
+ { nodes: [Cities.Nurnberg, Cities.Regensburg], cost: 12 },
154
+ { nodes: [Cities.Osnabrück, Cities.Münster], cost: 7 },
155
+ { nodes: [Cities.Osnabrück, Cities.Kassel], cost: 20 },
156
+ { nodes: [Cities.Münster, Cities.Essen], cost: 6 },
157
+ { nodes: [Cities.Münster, Cities.Dortmund], cost: 2 },
158
+ { nodes: [Cities.Essen, Cities.Duisburg], cost: 0 },
159
+ { nodes: [Cities.Essen, Cities.Dusseldorf], cost: 2 },
160
+ { nodes: [Cities.Essen, Cities.Dortmund], cost: 4 },
161
+ { nodes: [Cities.Dortmund, Cities.Kassel], cost: 18 },
162
+ { nodes: [Cities.Dortmund, Cities.Köln], cost: 10 },
163
+ { nodes: [Cities.Dortmund, Cities.FrankfurtM], cost: 20 },
164
+ { nodes: [Cities.Kassel, Cities.FrankfurtM], cost: 13 },
165
+ { nodes: [Cities.Dusseldorf, Cities.Aachen], cost: 9 },
166
+ { nodes: [Cities.Dusseldorf, Cities.Köln], cost: 4 },
167
+ { nodes: [Cities.Aachen, Cities.Köln], cost: 7 },
168
+ { nodes: [Cities.Aachen, Cities.Trier], cost: 19 },
169
+ { nodes: [Cities.Trier, Cities.Köln], cost: 20 },
170
+ { nodes: [Cities.Trier, Cities.Wiesbaden], cost: 18 },
171
+ { nodes: [Cities.Trier, Cities.Saarbrücken], cost: 11 },
172
+ { nodes: [Cities.Wiesbaden, Cities.FrankfurtM], cost: 0 },
173
+ { nodes: [Cities.Wiesbaden, Cities.Köln], cost: 21 },
174
+ { nodes: [Cities.Wiesbaden, Cities.Saarbrücken], cost: 10 },
175
+ { nodes: [Cities.Wiesbaden, Cities.Mannheim], cost: 11 },
176
+ { nodes: [Cities.Mannheim, Cities.Saarbrücken], cost: 11 },
177
+ { nodes: [Cities.Mannheim, Cities.Stuttgart], cost: 6 },
178
+ { nodes: [Cities.Stuttgart, Cities.Saarbrücken], cost: 17 },
179
+ { nodes: [Cities.Stuttgart, Cities.Freiburg], cost: 16 },
180
+ { nodes: [Cities.Stuttgart, Cities.Konstanz], cost: 16 },
181
+ { nodes: [Cities.Stuttgart, Cities.Augsburg], cost: 15 },
182
+ { nodes: [Cities.Konstanz, Cities.Freiburg], cost: 14 },
183
+ { nodes: [Cities.Konstanz, Cities.Augsburg], cost: 17 },
184
+ { nodes: [Cities.Regensburg, Cities.Augsburg], cost: 13 },
185
+ { nodes: [Cities.Regensburg, Cities.München], cost: 10 },
186
+ { nodes: [Cities.Regensburg, Cities.Passau], cost: 12 },
187
+ { nodes: [Cities.Augsburg, Cities.München], cost: 6 },
188
+ { nodes: [Cities.Passau, Cities.München], cost: 14 },
189
+ ],
190
+ layout: 'Landscape',
191
+ mapPosition: [20, 20],
192
+ };
193
+
194
+ export const mapRecharged: GameMap = {
195
+ name: 'Germany',
196
+ cities: [
197
+ { name: Cities.Flensburg, region: Regions.Green, x: 37, y: 427 },
198
+ { name: Cities.Kiel, region: Regions.Green, x: 106, y: 392 },
199
+ { name: Cities.Hamburg, region: Regions.Green, x: 212, y: 396 },
200
+ { name: Cities.Hannover, region: Regions.Green, x: 378, y: 395 },
201
+ { name: Cities.Bremen, region: Regions.Green, x: 276, y: 463 },
202
+ { name: Cities.Wilhelmshaven, region: Regions.Green, x: 211, y: 521 },
203
+ { name: Cities.Cuxhaven, region: Regions.Green, x: 168, y: 474 },
204
+ { name: Cities.Lubeck, region: Regions.Brown, x: 153, y: 341 },
205
+ { name: Cities.Rostock, region: Regions.Brown, x: 128, y: 256 },
206
+ { name: Cities.Schwerin, region: Regions.Brown, x: 217, y: 297 },
207
+ { name: Cities.Stralsund, region: Regions.Brown, x: 210, y: 126 },
208
+ { name: Cities.Magdeburg, region: Regions.Brown, x: 389, y: 271 },
209
+ { name: Cities.Berlin, region: Regions.Brown, x: 355, y: 170 },
210
+ { name: Cities.FrankfurtO, region: Regions.Brown, x: 381, y: 99 },
211
+ { name: Cities.Halle, region: Regions.Yellow, x: 493, y: 259 },
212
+ { name: Cities.Leipzig, region: Regions.Yellow, x: 526, y: 222 },
213
+ { name: Cities.Dresden, region: Regions.Yellow, x: 572, y: 126 },
214
+ { name: Cities.Erfurt, region: Regions.Yellow, x: 567, y: 309 },
215
+ { name: Cities.Fulda, region: Regions.Yellow, x: 628, y: 398 },
216
+ { name: Cities.Würzburg, region: Regions.Yellow, x: 735, y: 386 },
217
+ { name: Cities.Nurnberg, region: Regions.Yellow, x: 780, y: 309 },
218
+ { name: Cities.Osnabrück, region: Regions.Red, x: 359, y: 516 },
219
+ { name: Cities.Münster, region: Regions.Red, x: 427, y: 554 },
220
+ { name: Cities.Essen, region: Regions.Red, x: 475, y: 603 },
221
+ { name: Cities.Duisburg, region: Regions.Red, x: 456, y: 645 },
222
+ { name: Cities.Dortmund, region: Regions.Red, x: 505, y: 543 },
223
+ { name: Cities.Dusseldorf, region: Regions.Red, x: 537, y: 635 },
224
+ { name: Cities.Kassel, region: Regions.Red, x: 524, y: 430 },
225
+ { name: Cities.Aachen, region: Regions.Cyan, x: 614, y: 654 },
226
+ { name: Cities.Köln, region: Regions.Cyan, x: 590, y: 589 },
227
+ { name: Cities.Trier, region: Regions.Cyan, x: 739, y: 628 },
228
+ { name: Cities.Mainz, region: Regions.Cyan, x: 697, y: 514 },
229
+ { name: Cities.FrankfurtM, region: Regions.Cyan, x: 672, y: 473 },
230
+ { name: Cities.Saarbrücken, region: Regions.Cyan, x: 818, y: 568 },
231
+ { name: Cities.Mannheim, region: Regions.Cyan, x: 796, y: 479 },
232
+ { name: Cities.Freiburg, region: Regions.Purple, x: 966, y: 537 },
233
+ { name: Cities.Stuttgart, region: Regions.Purple, x: 884, y: 458 },
234
+ { name: Cities.Konstanz, region: Regions.Purple, x: 1011, y: 459 },
235
+ { name: Cities.Augsburg, region: Regions.Purple, x: 911, y: 346 },
236
+ { name: Cities.Regensburg, region: Regions.Purple, x: 846, y: 256 },
237
+ { name: Cities.München, region: Regions.Purple, x: 967, y: 278 },
238
+ { name: Cities.Passau, region: Regions.Purple, x: 904, y: 153 },
239
+ ],
240
+ connections: [
241
+ { nodes: [Cities.Flensburg, Cities.Kiel], cost: 4 },
242
+ { nodes: [Cities.Kiel, Cities.Hamburg], cost: 8 },
243
+ { nodes: [Cities.Kiel, Cities.Lubeck], cost: 4 },
244
+ { nodes: [Cities.Hamburg, Cities.Hannover], cost: 17 },
245
+ { nodes: [Cities.Hamburg, Cities.Bremen], cost: 11 },
246
+ { nodes: [Cities.Hamburg, Cities.Cuxhaven], cost: 11 },
247
+ { nodes: [Cities.Hamburg, Cities.Lubeck], cost: 6 },
248
+ { nodes: [Cities.Hamburg, Cities.Schwerin], cost: 8 },
249
+ { nodes: [Cities.Bremen, Cities.Wilhelmshaven], cost: 11 },
250
+ { nodes: [Cities.Bremen, Cities.Hannover], cost: 10 },
251
+ { nodes: [Cities.Bremen, Cities.Cuxhaven], cost: 8 },
252
+ { nodes: [Cities.Bremen, Cities.Osnabrück], cost: 11 },
253
+ { nodes: [Cities.Hannover, Cities.Schwerin], cost: 19 },
254
+ { nodes: [Cities.Hannover, Cities.Magdeburg], cost: 15 },
255
+ { nodes: [Cities.Hannover, Cities.Erfurt], cost: 19 },
256
+ { nodes: [Cities.Hannover, Cities.Osnabrück], cost: 16 },
257
+ { nodes: [Cities.Hannover, Cities.Kassel], cost: 15 },
258
+ { nodes: [Cities.Wilhelmshaven, Cities.Osnabrück], cost: 14 },
259
+ { nodes: [Cities.Lubeck, Cities.Schwerin], cost: 6 },
260
+ { nodes: [Cities.Schwerin, Cities.Rostock], cost: 6 },
261
+ { nodes: [Cities.Schwerin, Cities.Stralsund], cost: 19 },
262
+ { nodes: [Cities.Schwerin, Cities.Berlin], cost: 18 },
263
+ { nodes: [Cities.Schwerin, Cities.Magdeburg], cost: 16 },
264
+ { nodes: [Cities.Stralsund, Cities.Rostock], cost: 19 },
265
+ { nodes: [Cities.Stralsund, Cities.Berlin], cost: 15 },
266
+ { nodes: [Cities.Berlin, Cities.Magdeburg], cost: 10 },
267
+ { nodes: [Cities.Berlin, Cities.FrankfurtO], cost: 6 },
268
+ { nodes: [Cities.Berlin, Cities.Halle], cost: 17 },
269
+ { nodes: [Cities.Magdeburg, Cities.Halle], cost: 11 },
270
+ { nodes: [Cities.FrankfurtO, Cities.Leipzig], cost: 21 },
271
+ { nodes: [Cities.FrankfurtO, Cities.Dresden], cost: 16 },
272
+ { nodes: [Cities.Halle, Cities.Leipzig], cost: 0 },
273
+ { nodes: [Cities.Leipzig, Cities.Dresden], cost: 13 },
274
+ { nodes: [Cities.Erfurt, Cities.Halle], cost: 6 },
275
+ { nodes: [Cities.Erfurt, Cities.Dresden], cost: 19 },
276
+ { nodes: [Cities.Erfurt, Cities.Nurnberg], cost: 21 },
277
+ { nodes: [Cities.Erfurt, Cities.Fulda], cost: 13 },
278
+ { nodes: [Cities.Erfurt, Cities.Kassel], cost: 15 },
279
+ { nodes: [Cities.Fulda, Cities.Würzburg], cost: 11 },
280
+ { nodes: [Cities.Fulda, Cities.Kassel], cost: 8 },
281
+ { nodes: [Cities.Fulda, Cities.FrankfurtM], cost: 8 },
282
+ { nodes: [Cities.Würzburg, Cities.Nurnberg], cost: 8 },
283
+ { nodes: [Cities.Würzburg, Cities.FrankfurtM], cost: 13 },
284
+ { nodes: [Cities.Würzburg, Cities.Mannheim], cost: 10 },
285
+ { nodes: [Cities.Würzburg, Cities.Stuttgart], cost: 12 },
286
+ { nodes: [Cities.Würzburg, Cities.Augsburg], cost: 19 },
287
+ { nodes: [Cities.Nurnberg, Cities.Augsburg], cost: 18 },
288
+ { nodes: [Cities.Nurnberg, Cities.Regensburg], cost: 12 },
289
+ { nodes: [Cities.Osnabrück, Cities.Münster], cost: 7 },
290
+ { nodes: [Cities.Osnabrück, Cities.Kassel], cost: 20 },
291
+ { nodes: [Cities.Münster, Cities.Essen], cost: 6 },
292
+ { nodes: [Cities.Münster, Cities.Dortmund], cost: 2 },
293
+ { nodes: [Cities.Essen, Cities.Duisburg], cost: 0 },
294
+ { nodes: [Cities.Essen, Cities.Dusseldorf], cost: 2 },
295
+ { nodes: [Cities.Essen, Cities.Dortmund], cost: 5 },
296
+ { nodes: [Cities.Dortmund, Cities.Kassel], cost: 18 },
297
+ { nodes: [Cities.Dortmund, Cities.Köln], cost: 10 },
298
+ { nodes: [Cities.Dortmund, Cities.FrankfurtM], cost: 20 },
299
+ { nodes: [Cities.Kassel, Cities.FrankfurtM], cost: 13 },
300
+ { nodes: [Cities.Dusseldorf, Cities.Aachen], cost: 9 },
301
+ { nodes: [Cities.Dusseldorf, Cities.Köln], cost: 4 },
302
+ { nodes: [Cities.Aachen, Cities.Köln], cost: 7 },
303
+ { nodes: [Cities.Aachen, Cities.Trier], cost: 19 },
304
+ { nodes: [Cities.Trier, Cities.Köln], cost: 20 },
305
+ { nodes: [Cities.Trier, Cities.Mainz], cost: 18 },
306
+ { nodes: [Cities.Trier, Cities.Saarbrücken], cost: 11 },
307
+ { nodes: [Cities.Mainz, Cities.FrankfurtM], cost: 0 },
308
+ { nodes: [Cities.Mainz, Cities.Köln], cost: 21 },
309
+ { nodes: [Cities.Mainz, Cities.Saarbrücken], cost: 10 },
310
+ { nodes: [Cities.Mainz, Cities.Mannheim], cost: 11 },
311
+ { nodes: [Cities.Mannheim, Cities.Saarbrücken], cost: 16 },
312
+ { nodes: [Cities.Mannheim, Cities.Stuttgart], cost: 6 },
313
+ { nodes: [Cities.Stuttgart, Cities.Saarbrücken], cost: 17 },
314
+ { nodes: [Cities.Stuttgart, Cities.Freiburg], cost: 16 },
315
+ { nodes: [Cities.Stuttgart, Cities.Konstanz], cost: 16 },
316
+ { nodes: [Cities.Stuttgart, Cities.Augsburg], cost: 15 },
317
+ { nodes: [Cities.Konstanz, Cities.Freiburg], cost: 14 },
318
+ { nodes: [Cities.Konstanz, Cities.Augsburg], cost: 17 },
319
+ { nodes: [Cities.Regensburg, Cities.Augsburg], cost: 13 },
320
+ { nodes: [Cities.Regensburg, Cities.München], cost: 10 },
321
+ { nodes: [Cities.Regensburg, Cities.Passau], cost: 12 },
322
+ { nodes: [Cities.Augsburg, Cities.München], cost: 6 },
323
+ { nodes: [Cities.Passau, Cities.München], cost: 14 },
324
+ ],
325
+ layout: 'Landscape',
326
+ mapPosition: [20, 20],
327
+ mapSpecificRules: 'Stop resupplying uranium after power plant 39 has been bought.',
328
+ };
@@ -0,0 +1,289 @@
1
+ import { cloneDeep } from 'lodash';
2
+ import { getPowerPlant } from '../engine';
3
+ import { PowerPlant } from '../gamestate';
4
+ import { indiaPowerPlants } from '../powerPlants';
5
+ import { shuffle } from '../utils';
6
+ import { GameMap } from './../maps';
7
+
8
+ export enum Regions {
9
+ Red = 'red',
10
+ Brown = 'brown',
11
+ Green = 'green',
12
+ Orange = 'orange',
13
+ Yellow = 'yellow',
14
+ Pink = 'pink',
15
+ }
16
+
17
+ export enum Cities {
18
+ Thiruvananthapuram = 'Thiruvananthapuram',
19
+ Madurai = 'Madurai',
20
+ Coimbatore = 'Coimbatore',
21
+ Chennai = 'Chennai',
22
+ Hyderabad = 'Hyderabad',
23
+ Bangalore1 = 'Bangalore 1',
24
+ Bangalore2 = 'Bangalore 2',
25
+ Dibrugarh = 'Dibrugarh',
26
+ Imphal = 'Imphal',
27
+ Aizawi = 'Aizawi',
28
+ Chittagong = 'Chittagong',
29
+ Shillong = 'Shillong',
30
+ Dhaka = 'Dhaka',
31
+ Khulna = 'Khulna',
32
+ Darjeeling = 'Darjeeling',
33
+ Kathmandu = 'Kathmandu',
34
+ Patna = 'Patna',
35
+ Lakhnau = 'Lakhnau',
36
+ Varanasi = 'Varanasi',
37
+ Agra = 'Agra',
38
+ Kanpur = 'Kanpur',
39
+ Srinagar = 'Srinagar',
40
+ Ludhiana = 'Ludhiana',
41
+ Delhi1 = 'Delhi 1',
42
+ Delhi2 = 'Delhi 2',
43
+ Jaipur = 'Jaipur',
44
+ Udaipur = 'Udaipur',
45
+ Ahmedabad = 'Ahmedabad',
46
+ Dhanbad = 'Dhanbad',
47
+ Kolkata = 'Kolkata',
48
+ Bhudaneswar = 'Bhudaneswar',
49
+ Sambalpur = 'Sambalpur',
50
+ Jabalpur = 'Jabalpur',
51
+ Nagpur = 'Nagpur',
52
+ Visakhapatnam = 'Visakhapatnam',
53
+ Goa = 'Goa',
54
+ Pune = 'Pune',
55
+ Surat = 'Surat',
56
+ Indore = 'Indore',
57
+ Bhopal = 'Bhopal',
58
+ Mumbai1 = 'Mumbai 1',
59
+ Mumbai2 = 'Mumbai 2',
60
+ }
61
+
62
+ export const map: GameMap = {
63
+ name: 'India',
64
+ cities: [
65
+ { name: Cities.Thiruvananthapuram, region: Regions.Red, x: 217, y: 868 },
66
+ { name: Cities.Madurai, region: Regions.Red, x: 230, y: 829 },
67
+ { name: Cities.Coimbatore, region: Regions.Red, x: 197, y: 797 },
68
+ { name: Cities.Chennai, region: Regions.Red, x: 289, y: 740 },
69
+ { name: Cities.Hyderabad, region: Regions.Red, x: 232, y: 618 },
70
+ { name: Cities.Bangalore1, region: Regions.Red, x: 205, y: 710 },
71
+ { name: Cities.Bangalore2, region: Regions.Red, x: 205, y: 735 },
72
+ { name: Cities.Dibrugarh, region: Regions.Brown, x: 669, y: 328 },
73
+ { name: Cities.Imphal, region: Regions.Brown, x: 658, y: 392 },
74
+ { name: Cities.Aizawi, region: Regions.Brown, x: 625, y: 427 },
75
+ { name: Cities.Chittagong, region: Regions.Brown, x: 589, y: 483 },
76
+ { name: Cities.Shillong, region: Regions.Brown, x: 586, y: 395 },
77
+ { name: Cities.Dhaka, region: Regions.Brown, x: 548, y: 432 },
78
+ { name: Cities.Khulna, region: Regions.Brown, x: 528, y: 468 },
79
+ { name: Cities.Darjeeling, region: Regions.Green, x: 496, y: 333 },
80
+ { name: Cities.Kathmandu, region: Regions.Green, x: 418, y: 307 },
81
+ { name: Cities.Patna, region: Regions.Green, x: 416, y: 373 },
82
+ { name: Cities.Lakhnau, region: Regions.Green, x: 310, y: 338 },
83
+ { name: Cities.Varanasi, region: Regions.Green, x: 350, y: 385 },
84
+ { name: Cities.Agra, region: Regions.Green, x: 228, y: 335 },
85
+ { name: Cities.Kanpur, region: Regions.Green, x: 269, y: 373 },
86
+ { name: Cities.Srinagar, region: Regions.Orange, x: 135, y: 115 },
87
+ { name: Cities.Ludhiana, region: Regions.Orange, x: 186, y: 215 },
88
+ { name: Cities.Delhi1, region: Regions.Orange, x: 190, y: 281 },
89
+ { name: Cities.Delhi2, region: Regions.Orange, x: 190, y: 303 },
90
+ { name: Cities.Jaipur, region: Regions.Orange, x: 158, y: 341 },
91
+ { name: Cities.Udaipur, region: Regions.Orange, x: 105, y: 410 },
92
+ { name: Cities.Ahmedabad, region: Regions.Orange, x: 75, y: 456 },
93
+ { name: Cities.Dhanbad, region: Regions.Yellow, x: 424, y: 427 },
94
+ { name: Cities.Kolkata, region: Regions.Yellow, x: 463, y: 477 },
95
+ { name: Cities.Bhudaneswar, region: Regions.Yellow, x: 428, y: 533 },
96
+ { name: Cities.Sambalpur, region: Regions.Yellow, x: 376, y: 494 },
97
+ { name: Cities.Jabalpur, region: Regions.Yellow, x: 293, y: 478 },
98
+ { name: Cities.Nagpur, region: Regions.Yellow, x: 250, y: 510 },
99
+ { name: Cities.Visakhapatnam, region: Regions.Yellow, x: 358, y: 597 },
100
+ { name: Cities.Goa, region: Regions.Pink, x: 109, y: 677 },
101
+ { name: Cities.Pune, region: Regions.Pink, x: 133, y: 587 },
102
+ { name: Cities.Surat, region: Regions.Pink, x: 80, y: 510 },
103
+ { name: Cities.Indore, region: Regions.Pink, x: 160, y: 476 },
104
+ { name: Cities.Bhopal, region: Regions.Pink, x: 208, y: 437 },
105
+ { name: Cities.Mumbai1, region: Regions.Pink, x: 58, y: 570 },
106
+ { name: Cities.Mumbai2, region: Regions.Pink, x: 58, y: 593 },
107
+ ],
108
+ connections: [
109
+ { nodes: [Cities.Srinagar, Cities.Ludhiana], cost: 15 },
110
+ { nodes: [Cities.Ludhiana, Cities.Delhi1], cost: 9 },
111
+ { nodes: [Cities.Delhi1, Cities.Delhi2], cost: 0 },
112
+ { nodes: [Cities.Delhi2, Cities.Jaipur], cost: 7 },
113
+ { nodes: [Cities.Delhi2, Cities.Agra], cost: 6 },
114
+ { nodes: [Cities.Jaipur, Cities.Bhopal], cost: 12 },
115
+ { nodes: [Cities.Jaipur, Cities.Kanpur], cost: 12 },
116
+ { nodes: [Cities.Agra, Cities.Lakhnau], cost: 8 },
117
+ { nodes: [Cities.Lakhnau, Cities.Kathmandu], cost: 15 },
118
+ { nodes: [Cities.Kathmandu, Cities.Darjeeling], cost: 13 },
119
+ { nodes: [Cities.Darjeeling, Cities.Shillong], cost: 12 },
120
+ { nodes: [Cities.Shillong, Cities.Patna], cost: 18 },
121
+ { nodes: [Cities.Patna, Cities.Kathmandu], cost: 10 },
122
+ { nodes: [Cities.Imphal, Cities.Dibrugarh], cost: 11 },
123
+ { nodes: [Cities.Dibrugarh, Cities.Shillong], cost: 9 },
124
+ { nodes: [Cities.Shillong, Cities.Imphal], cost: 12 },
125
+ { nodes: [Cities.Imphal, Cities.Aizawi], cost: 7 },
126
+ { nodes: [Cities.Shillong, Cities.Dhaka], cost: 10 },
127
+ { nodes: [Cities.Dhaka, Cities.Khulna], cost: 6 },
128
+ { nodes: [Cities.Khulna, Cities.Kolkata], cost: 3 },
129
+ { nodes: [Cities.Dhanbad, Cities.Dhaka], cost: 14 },
130
+ { nodes: [Cities.Jabalpur, Cities.Sambalpur], cost: 13 },
131
+ { nodes: [Cities.Sambalpur, Cities.Nagpur], cost: 13 },
132
+ { nodes: [Cities.Nagpur, Cities.Visakhapatnam], cost: 17 },
133
+ { nodes: [Cities.Visakhapatnam, Cities.Sambalpur], cost: 12 },
134
+ { nodes: [Cities.Jabalpur, Cities.Kanpur], cost: 11 },
135
+ { nodes: [Cities.Varanasi, Cities.Jabalpur], cost: 11 },
136
+ { nodes: [Cities.Kanpur, Cities.Varanasi], cost: 8 },
137
+ { nodes: [Cities.Varanasi, Cities.Patna], cost: 5 },
138
+ { nodes: [Cities.Patna, Cities.Lakhnau], cost: 11 },
139
+ { nodes: [Cities.Kanpur, Cities.Bhopal], cost: 13 },
140
+ { nodes: [Cities.Ahmedabad, Cities.Bhopal], cost: 11 },
141
+ { nodes: [Cities.Bhopal, Cities.Udaipur], cost: 11 },
142
+ { nodes: [Cities.Udaipur, Cities.Jaipur], cost: 9 },
143
+ { nodes: [Cities.Ahmedabad, Cities.Surat], cost: 7 },
144
+ { nodes: [Cities.Ahmedabad, Cities.Indore], cost: 8 },
145
+ { nodes: [Cities.Indore, Cities.Surat], cost: 10 },
146
+ { nodes: [Cities.Mumbai1, Cities.Mumbai2], cost: 0 },
147
+ { nodes: [Cities.Mumbai2, Cities.Pune], cost: 4 },
148
+ { nodes: [Cities.Pune, Cities.Hyderabad], cost: 13 },
149
+ { nodes: [Cities.Pune, Cities.Nagpur], cost: 17 },
150
+ { nodes: [Cities.Pune, Cities.Indore], cost: 15 },
151
+ { nodes: [Cities.Goa, Cities.Coimbatore], cost: 18 },
152
+ { nodes: [Cities.Bangalore1, Cities.Bangalore2], cost: 0 },
153
+ { nodes: [Cities.Bangalore2, Cities.Coimbatore], cost: 9 },
154
+ { nodes: [Cities.Coimbatore, Cities.Thiruvananthapuram], cost: 10 },
155
+ { nodes: [Cities.Thiruvananthapuram, Cities.Madurai], cost: 7 },
156
+ { nodes: [Cities.Madurai, Cities.Chennai], cost: 12 },
157
+ { nodes: [Cities.Chennai, Cities.Bangalore1], cost: 9 },
158
+ { nodes: [Cities.Bangalore1, Cities.Hyderabad], cost: 14 },
159
+ { nodes: [Cities.Hyderabad, Cities.Goa], cost: 15 },
160
+ { nodes: [Cities.Goa, Cities.Bangalore2], cost: 14 },
161
+ { nodes: [Cities.Mumbai2, Cities.Goa], cost: 11 },
162
+ { nodes: [Cities.Indore, Cities.Nagpur], cost: 10 },
163
+ { nodes: [Cities.Sambalpur, Cities.Dhanbad], cost: 8 },
164
+ { nodes: [Cities.Sambalpur, Cities.Bhudaneswar], cost: 7 },
165
+ { nodes: [Cities.Bhudaneswar, Cities.Kolkata], cost: 11 },
166
+ { nodes: [Cities.Kolkata, Cities.Dhanbad], cost: 9 },
167
+ { nodes: [Cities.Dhanbad, Cities.Patna], cost: 8 },
168
+ { nodes: [Cities.Nagpur, Cities.Hyderabad], cost: 12 },
169
+ { nodes: [Cities.Hyderabad, Cities.Visakhapatnam], cost: 13 },
170
+ { nodes: [Cities.Visakhapatnam, Cities.Chennai], cost: 17 },
171
+ { nodes: [Cities.Chittagong, Cities.Aizawi], cost: 7 },
172
+ { nodes: [Cities.Dhaka, Cities.Aizawi], cost: 8 },
173
+ { nodes: [Cities.Dhaka, Cities.Chittagong], cost: 7 },
174
+ { nodes: [Cities.Patna, Cities.Darjeeling], cost: 11 },
175
+ { nodes: [Cities.Visakhapatnam, Cities.Bhudaneswar], cost: 12 },
176
+ { nodes: [Cities.Udaipur, Cities.Ahmedabad], cost: 6 },
177
+ { nodes: [Cities.Madurai, Cities.Coimbatore], cost: 6 },
178
+ { nodes: [Cities.Bangalore2, Cities.Madurai], cost: 10 },
179
+ { nodes: [Cities.Bhopal, Cities.Jabalpur], cost: 8 },
180
+ { nodes: [Cities.Bhopal, Cities.Nagpur], cost: 7 },
181
+ { nodes: [Cities.Bhopal, Cities.Indore], cost: 4 },
182
+ { nodes: [Cities.Surat, Cities.Mumbai1], cost: 6 },
183
+ { nodes: [Cities.Agra, Cities.Kanpur], cost: 8 },
184
+ { nodes: [Cities.Kanpur, Cities.Lakhnau], cost: 3 },
185
+ { nodes: [Cities.Lakhnau, Cities.Varanasi], cost: 7 },
186
+ ],
187
+ layout: 'Portrait',
188
+ mapPosition: [200, -60],
189
+ adjustRatio: [1.25, 1.25],
190
+ resupply: [
191
+ [
192
+ [4, 5, 4],
193
+ [5, 6, 4],
194
+ [6, 7, 5],
195
+ [7, 8, 6],
196
+ [8, 10, 7],
197
+ ],
198
+ [
199
+ [1, 2, 2],
200
+ [2, 2, 2],
201
+ [2, 3, 3],
202
+ [3, 4, 4],
203
+ [4, 5, 5],
204
+ ],
205
+ [
206
+ [1, 3, 4],
207
+ [1, 3, 4],
208
+ [3, 4, 6],
209
+ [4, 5, 7],
210
+ [4, 7, 9],
211
+ ],
212
+ [
213
+ [1, 1, 1],
214
+ [1, 1, 1],
215
+ [1, 2, 1],
216
+ [2, 2, 2],
217
+ [2, 3, 2],
218
+ ],
219
+ ],
220
+ startingResources: [24, 21, 20, 2], // Prices begin at: coal 1 Elektro, oil 2 Elektro, garbage 2 Elektro and uranium 6 Elektro.
221
+ startingSupply: [24, 24, 24, 8], // Use only 8 uranium instead of 12
222
+ maxPriceAvailable: [3, 5, 8], // In step 1, only resources up to $3 can be bought. In step 2, only resources up to $5 can be bought.
223
+ coalPrices: [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8],
224
+ garbagePrices: [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6],
225
+ uraniumPrices: [1, 2, 3, 4, 5, 6, 7, 8],
226
+
227
+ setupDeck(numPlayers: number, variant: string, rng: seedrandom.prng) {
228
+ let powerPlantsDeck = cloneDeep(indiaPowerPlants);
229
+ let actualMarket: PowerPlant[];
230
+ let futureMarket: PowerPlant[];
231
+
232
+ // Except for adjusting the garbage plant cost, the setup is identical to the normal game.
233
+ if (variant == 'original') {
234
+ powerPlantsDeck = powerPlantsDeck.slice(8);
235
+ const powerPlant13 = powerPlantsDeck.splice(2, 1)[0];
236
+ const step3 = powerPlantsDeck.pop()!;
237
+
238
+ powerPlantsDeck = shuffle(powerPlantsDeck, rng() + '');
239
+ if (numPlayers == 2 || numPlayers == 3) {
240
+ powerPlantsDeck = powerPlantsDeck.slice(8);
241
+ } else if (numPlayers == 4) {
242
+ powerPlantsDeck = powerPlantsDeck.slice(4);
243
+ }
244
+
245
+ powerPlantsDeck.unshift(powerPlant13);
246
+ powerPlantsDeck.push(step3);
247
+
248
+ actualMarket = [
249
+ getPowerPlant(3, 'India'),
250
+ getPowerPlant(4, 'India'),
251
+ getPowerPlant(5, 'India'),
252
+ getPowerPlant(6, 'India'),
253
+ ];
254
+ futureMarket = [
255
+ getPowerPlant(7, 'India'),
256
+ getPowerPlant(8, 'India'),
257
+ getPowerPlant(9, 'India'),
258
+ getPowerPlant(10, 'India'),
259
+ ];
260
+ } else {
261
+ let initialPowerPlants = shuffle(powerPlantsDeck.splice(0, 12), rng() + '');
262
+ let initialPlantMarket = initialPowerPlants.splice(0, 8);
263
+ initialPlantMarket = initialPlantMarket.sort((a, b) => a.number - b.number);
264
+ actualMarket = initialPlantMarket.slice(0, 4);
265
+ futureMarket = initialPlantMarket.slice(4);
266
+
267
+ const first = initialPowerPlants.shift()!;
268
+ const step3 = powerPlantsDeck.pop()!;
269
+
270
+ powerPlantsDeck = shuffle(powerPlantsDeck, rng() + '');
271
+ if (numPlayers == 2 || numPlayers == 3) {
272
+ initialPowerPlants = initialPowerPlants.slice(2);
273
+ powerPlantsDeck = shuffle(powerPlantsDeck.slice(6).concat(initialPowerPlants), rng() + '');
274
+ } else if (numPlayers == 4) {
275
+ initialPowerPlants = initialPowerPlants.slice(1);
276
+ powerPlantsDeck = shuffle(powerPlantsDeck.slice(3).concat(initialPowerPlants), rng() + '');
277
+ } else {
278
+ powerPlantsDeck = shuffle(powerPlantsDeck.concat(initialPowerPlants), rng() + '');
279
+ }
280
+
281
+ powerPlantsDeck.unshift(first);
282
+ powerPlantsDeck.push(step3);
283
+ }
284
+
285
+ return { actualMarket, futureMarket, powerPlantsDeck };
286
+ },
287
+ mapSpecificRules:
288
+ 'The power grid will suffer a power outage if too many cities are built in one round, penalizing players $3 per city built.\nPlayers take turns buying one resource at a time. The resource market is limited in steps 1 and 2.\nGarbage plants are less efficient. Their cost is one higher, but their storage capacity is not changed.\nPlayers must power as many cities as possible in each round.',
289
+ };