17
17
18
18
import java .util .*;
19
19
20
- import static de .amr .pacmanfx .Globals .TS ;
21
20
import static de .amr .pacmanfx .uilib .Ufx .exchangeNES_ColorScheme ;
22
21
import static java .util .Objects .requireNonNull ;
23
22
31
30
*/
32
31
public class TengenMsPacMan_MapRepository implements Disposable {
33
32
34
- private record CacheKey (MapCategory mapCategory , int spriteNumber , NES_ColorScheme colorScheme ) {}
33
+ private record CacheKey (MapCategory mapCategory , Object mazeID , NES_ColorScheme colorScheme ) {}
35
34
36
- // Map row counts as they appear in the non-ARCADE mazes sprite sheet (row by row)
37
- private static final byte [] NON_ARCADE_MAP_ROW_COUNTS = {
38
- 31 , 31 , 31 , 31 , 31 , 31 , 30 , 31 ,
39
- 31 , 37 , 31 , 31 , 31 , 37 , 31 , 25 ,
40
- 37 , 31 , 37 , 37 , 37 , 37 , 37 , 31 ,
41
- 37 , 37 , 31 , 25 , 31 , 25 , 31 , 31 , 37 ,
42
- 25 , 25 , 25 , 25 ,
43
- };
44
-
45
- private static NES_ColorScheme colorSchemeFromNonArcadeMapsSpriteSheet (int spriteNumber ){
46
- return switch (spriteNumber ) {
47
- case 1 -> NES_ColorScheme ._36_15_20_PINK_RED_WHITE ;
48
- case 2 -> NES_ColorScheme ._21_20_28_BLUE_WHITE_YELLOW ;
49
- case 3 -> NES_ColorScheme ._16_20_15_ORANGE_WHITE_RED ;
50
- case 4 -> NES_ColorScheme ._01_38_20_BLUE_YELLOW_WHITE ;
51
- case 5 -> NES_ColorScheme ._35_28_20_PINK_YELLOW_WHITE ;
52
- case 6 -> NES_ColorScheme ._36_15_20_PINK_RED_WHITE ;
53
- case 7 -> NES_ColorScheme ._17_20_20_BROWN_WHITE_WHITE ;
54
- case 8 -> NES_ColorScheme ._13_20_28_VIOLET_WHITE_YELLOW ;
55
- case 9 -> NES_ColorScheme ._0F_20_28_BLACK_WHITE_YELLOW ;
56
- case 10 -> NES_ColorScheme ._0F_01_20_BLACK_BLUE_WHITE ;
57
- case 11 -> NES_ColorScheme ._14_25_20_VIOLET_ROSE_WHITE ;
58
- case 12 -> NES_ColorScheme ._15_20_20_RED_WHITE_WHITE ;
59
- case 13 -> NES_ColorScheme ._1B_20_20_GREEN_WHITE_WHITE ;
60
- case 14 -> NES_ColorScheme ._28_20_2A_YELLOW_WHITE_GREEN ;
61
- case 15 -> NES_ColorScheme ._1A_20_28_GREEN_WHITE_YELLOW ;
62
- case 16 -> NES_ColorScheme ._18_20_20_KHAKI_WHITE_WHITE ;
63
- case 17 -> NES_ColorScheme ._25_20_20_ROSE_WHITE_WHITE ;
64
- case 18 -> NES_ColorScheme ._12_20_28_BLUE_WHITE_YELLOW ;
65
- case 19 -> NES_ColorScheme ._07_20_20_BROWN_WHITE_WHITE ;
66
- case 20 -> NES_ColorScheme ._15_25_20_RED_ROSE_WHITE ;
67
- case 21 -> NES_ColorScheme ._0F_20_1C_BLACK_WHITE_GREEN ;
68
- case 22 -> NES_ColorScheme ._19_20_20_GREEN_WHITE_WHITE ;
69
- case 23 -> NES_ColorScheme ._0C_20_14_GREEN_WHITE_VIOLET ;
70
- case 24 -> NES_ColorScheme ._23_20_2B_VIOLET_WHITE_GREEN ;
71
- case 25 -> NES_ColorScheme ._10_20_28_GRAY_WHITE_YELLOW ;
72
- case 26 -> NES_ColorScheme ._03_20_20_BLUE_WHITE_WHITE ;
73
- case 27 -> NES_ColorScheme ._04_20_20_VIOLET_WHITE_WHITE ;
74
- case 28 -> NES_ColorScheme ._00_2A_24_GRAY_GREEN_PINK ;
75
- case 29 -> NES_ColorScheme ._21_35_20_BLUE_PINK_WHITE ;
76
- case 30 -> NES_ColorScheme ._28_16_20_YELLOW_RED_WHITE ;
77
- case 31 -> NES_ColorScheme ._12_16_20_BLUE_RED_WHITE ;
78
- case 32 -> NES_ColorScheme ._15_25_20_RED_ROSE_WHITE ;
79
- default -> throw new IllegalArgumentException ("Illegal sprite number: " + spriteNumber );
35
+ private static NES_ColorScheme colorSchemeFromNonArcadeMapsSpriteSheet (NonArcadeMapsSpriteSheet .MazeID mazeID ){
36
+ return switch (mazeID ) {
37
+ case MAZE1 -> NES_ColorScheme ._36_15_20_PINK_RED_WHITE ;
38
+ case MAZE2 -> NES_ColorScheme ._21_20_28_BLUE_WHITE_YELLOW ;
39
+ case MAZE3 -> NES_ColorScheme ._16_20_15_ORANGE_WHITE_RED ;
40
+ case MAZE4 -> NES_ColorScheme ._01_38_20_BLUE_YELLOW_WHITE ;
41
+ case MAZE5 -> NES_ColorScheme ._35_28_20_PINK_YELLOW_WHITE ;
42
+ case MAZE6 -> NES_ColorScheme ._36_15_20_PINK_RED_WHITE ;
43
+ case MAZE7 -> NES_ColorScheme ._17_20_20_BROWN_WHITE_WHITE ;
44
+ case MAZE8 -> NES_ColorScheme ._13_20_28_VIOLET_WHITE_YELLOW ;
45
+ case MAZE9 -> NES_ColorScheme ._0F_20_28_BLACK_WHITE_YELLOW ;
46
+ case MAZE10_BIG -> NES_ColorScheme ._0F_01_20_BLACK_BLUE_WHITE ;
47
+ case MAZE11 -> NES_ColorScheme ._14_25_20_VIOLET_ROSE_WHITE ;
48
+ case MAZE12 -> NES_ColorScheme ._15_20_20_RED_WHITE_WHITE ;
49
+ case MAZE13 -> NES_ColorScheme ._1B_20_20_GREEN_WHITE_WHITE ;
50
+ case MAZE14_BIG -> NES_ColorScheme ._28_20_2A_YELLOW_WHITE_GREEN ;
51
+ case MAZE15 -> NES_ColorScheme ._1A_20_28_GREEN_WHITE_YELLOW ;
52
+ case MAZE16_MINI -> NES_ColorScheme ._18_20_20_KHAKI_WHITE_WHITE ;
53
+ case MAZE17_BIG -> NES_ColorScheme ._25_20_20_ROSE_WHITE_WHITE ;
54
+ case MAZE18 -> NES_ColorScheme ._12_20_28_BLUE_WHITE_YELLOW ;
55
+ case MAZE19_BIG -> NES_ColorScheme ._07_20_20_BROWN_WHITE_WHITE ;
56
+ case MAZE20_BIG -> NES_ColorScheme ._15_25_20_RED_ROSE_WHITE ;
57
+ case MAZE21_BIG -> NES_ColorScheme ._0F_20_1C_BLACK_WHITE_GREEN ;
58
+ case MAZE22_BIG -> NES_ColorScheme ._19_20_20_GREEN_WHITE_WHITE ;
59
+ case MAZE23_BIG -> NES_ColorScheme ._0C_20_14_GREEN_WHITE_VIOLET ;
60
+ case MAZE24 -> NES_ColorScheme ._23_20_2B_VIOLET_WHITE_GREEN ;
61
+ case MAZE25_BIG -> NES_ColorScheme ._10_20_28_GRAY_WHITE_YELLOW ;
62
+ case MAZE26_BIG -> NES_ColorScheme ._03_20_20_BLUE_WHITE_WHITE ;
63
+ case MAZE27 -> NES_ColorScheme ._04_20_20_VIOLET_WHITE_WHITE ;
64
+ case MAZE28_MINI -> NES_ColorScheme ._00_2A_24_GRAY_GREEN_PINK ;
65
+ case MAZE29 -> NES_ColorScheme ._21_35_20_BLUE_PINK_WHITE ;
66
+ case MAZE30_MINI -> NES_ColorScheme ._28_16_20_YELLOW_RED_WHITE ;
67
+ case MAZE31 -> NES_ColorScheme ._12_16_20_BLUE_RED_WHITE ;
68
+ case MAZE32_ANIMATED -> NES_ColorScheme ._15_25_20_RED_ROSE_WHITE ;
69
+ default -> throw new IllegalArgumentException ("Illegal non-Arcade maze ID: " + mazeID );
80
70
};
81
71
}
82
72
@@ -125,7 +115,7 @@ public ColoredMazeSpriteSet createMazeSpriteSet(WorldMap worldMap, int flashCoun
125
115
case MINI -> miniMazeSpriteSet (mapNumber , nesColorScheme , flashCount , multipleFlashColors );
126
116
case BIG -> bigMazeSpriteSet (mapNumber , nesColorScheme , flashCount , multipleFlashColors );
127
117
case STRANGE -> strangeMazeSpriteSet (
128
- worldMap .getConfigValue ("levelNumber " ),
118
+ worldMap .getConfigValue ("mazeID " ), // set by map selector!
129
119
multipleFlashColors ? worldMap .getConfigValue ("nesColorScheme" ) : null ,
130
120
flashCount ,
131
121
multipleFlashColors );
@@ -166,13 +156,13 @@ private ColoredMazeSpriteSet arcadeMazeSpriteSet(int mapNumber, NES_ColorScheme
166
156
private ColoredMazeSpriteSet miniMazeSpriteSet (
167
157
int mapNumber , NES_ColorScheme colorScheme , int flashCount , boolean multipleFlashColors )
168
158
{
169
- int spriteNumber = switch (mapNumber ) {
170
- case 1 -> 34 ;
171
- case 2 -> 35 ;
172
- case 3 -> 36 ;
173
- case 4 -> 30 ;
174
- case 5 -> 28 ;
175
- case 6 -> 37 ;
159
+ NonArcadeMapsSpriteSheet . MazeID mazeID = switch (mapNumber ) {
160
+ case 1 -> NonArcadeMapsSpriteSheet . MazeID . MAZE34_MINI ;
161
+ case 2 -> NonArcadeMapsSpriteSheet . MazeID . MAZE35_MINI ;
162
+ case 3 -> NonArcadeMapsSpriteSheet . MazeID . MAZE36_MINI ;
163
+ case 4 -> NonArcadeMapsSpriteSheet . MazeID . MAZE30_MINI ;
164
+ case 5 -> NonArcadeMapsSpriteSheet . MazeID . MAZE28_MINI ;
165
+ case 6 -> NonArcadeMapsSpriteSheet . MazeID . MAZE37_MINI ;
176
166
default -> throw new IllegalArgumentException ("Illegal MINI map number: " + mapNumber );
177
167
};
178
168
NES_ColorScheme availableColorScheme = switch (mapNumber ) {
@@ -184,20 +174,20 @@ private ColoredMazeSpriteSet miniMazeSpriteSet(
184
174
case 6 -> NES_ColorScheme ._23_20_2B_VIOLET_WHITE_GREEN ;
185
175
default -> null ;
186
176
};
187
- RectShort originalMazeSprite = nonArcadeMazesSprite ( spriteNumber );
177
+ RectShort originalMazeSprite = nonArcadeMazesSpriteSheet . sprite ( mazeID );
188
178
RecoloredSpriteImage mazeSprite = colorScheme .equals (availableColorScheme )
189
- ? new RecoloredSpriteImage (nonArcadeMazesSpriteSheet .sourceImage (), nonArcadeMazesSprite ( spriteNumber ) , colorScheme )
190
- : recoloredMazeImage (MapCategory .MINI , spriteNumber , originalMazeSprite , colorScheme , availableColorScheme );
179
+ ? new RecoloredSpriteImage (nonArcadeMazesSpriteSheet .sourceImage (), originalMazeSprite , colorScheme )
180
+ : recoloredMazeImage (MapCategory .MINI , mazeID , originalMazeSprite , colorScheme , availableColorScheme );
191
181
192
182
var flashingMazeSprites = new ArrayList <RecoloredSpriteImage >();
193
183
if (multipleFlashColors ) {
194
184
for (var randomScheme : randomColorSchemes (flashCount , colorScheme )) {
195
- RecoloredSpriteImage randomMazeSprite = recoloredMazeImage (MapCategory .MINI , spriteNumber , originalMazeSprite ,
185
+ RecoloredSpriteImage randomMazeSprite = recoloredMazeImage (MapCategory .MINI , mazeID , originalMazeSprite ,
196
186
randomScheme , availableColorScheme );
197
187
flashingMazeSprites .add (randomMazeSprite );
198
188
}
199
189
} else {
200
- RecoloredSpriteImage blackWhiteMazeSprite = recoloredMazeImage (MapCategory .MINI , spriteNumber , originalMazeSprite ,
190
+ RecoloredSpriteImage blackWhiteMazeSprite = recoloredMazeImage (MapCategory .MINI , mazeID , originalMazeSprite ,
201
191
NES_ColorScheme ._0F_20_0F_BLACK_WHITE_BLACK , availableColorScheme );
202
192
for (int i = 0 ; i < flashCount ; ++i ) {
203
193
flashingMazeSprites .add (blackWhiteMazeSprite );
@@ -207,20 +197,19 @@ private ColoredMazeSpriteSet miniMazeSpriteSet(
207
197
}
208
198
209
199
private ColoredMazeSpriteSet bigMazeSpriteSet (
210
- int mapNumber , NES_ColorScheme colorScheme , int flashCount , boolean multipleFlashColors )
211
- {
212
- int spriteNumber = switch (mapNumber ) {
213
- case 1 -> 19 ;
214
- case 2 -> 20 ;
215
- case 3 -> 21 ;
216
- case 4 -> 22 ;
217
- case 5 -> 23 ;
218
- case 6 -> 17 ;
219
- case 7 -> 10 ;
220
- case 8 -> 14 ;
221
- case 9 -> 26 ;
222
- case 10 -> 25 ;
223
- case 11 -> 33 ;
200
+ int mapNumber , NES_ColorScheme colorScheme , int flashCount , boolean multipleFlashColors ) {
201
+ NonArcadeMapsSpriteSheet .MazeID mazeID = switch (mapNumber ) {
202
+ case 1 -> NonArcadeMapsSpriteSheet .MazeID .MAZE19_BIG ;
203
+ case 2 -> NonArcadeMapsSpriteSheet .MazeID .MAZE20_BIG ;
204
+ case 3 -> NonArcadeMapsSpriteSheet .MazeID .MAZE21_BIG ;
205
+ case 4 -> NonArcadeMapsSpriteSheet .MazeID .MAZE22_BIG ;
206
+ case 5 -> NonArcadeMapsSpriteSheet .MazeID .MAZE23_BIG ;
207
+ case 6 -> NonArcadeMapsSpriteSheet .MazeID .MAZE17_BIG ;
208
+ case 7 -> NonArcadeMapsSpriteSheet .MazeID .MAZE10_BIG ;
209
+ case 8 -> NonArcadeMapsSpriteSheet .MazeID .MAZE14_BIG ;
210
+ case 9 -> NonArcadeMapsSpriteSheet .MazeID .MAZE26_BIG ;
211
+ case 10 -> NonArcadeMapsSpriteSheet .MazeID .MAZE25_BIG ;
212
+ case 11 -> NonArcadeMapsSpriteSheet .MazeID .MAZE33_BIG ;
224
213
default -> throw new IllegalArgumentException ("Illegal BIG map number: " + mapNumber );
225
214
};
226
215
NES_ColorScheme colorSchemeInSpriteSheet = switch (mapNumber ) {
@@ -237,20 +226,20 @@ private ColoredMazeSpriteSet bigMazeSpriteSet(
237
226
case 11 -> NES_ColorScheme ._15_25_20_RED_ROSE_WHITE ;
238
227
default -> null ;
239
228
};
240
- RectShort originalMazeSprite = nonArcadeMazesSprite ( spriteNumber );
229
+ RectShort originalMazeSprite = nonArcadeMazesSpriteSheet . sprite ( mazeID );
241
230
RecoloredSpriteImage mazeSprite = colorScheme .equals (colorSchemeInSpriteSheet )
242
- ? new RecoloredSpriteImage (nonArcadeMazesSpriteSheet .sourceImage (), nonArcadeMazesSprite ( spriteNumber ) , colorScheme )
243
- : recoloredMazeImage (MapCategory .BIG , spriteNumber , originalMazeSprite , colorScheme , colorSchemeInSpriteSheet );
231
+ ? new RecoloredSpriteImage (nonArcadeMazesSpriteSheet .sourceImage (), originalMazeSprite , colorScheme )
232
+ : recoloredMazeImage (MapCategory .BIG , mazeID , originalMazeSprite , colorScheme , colorSchemeInSpriteSheet );
244
233
245
234
var flashingMazeSprites = new ArrayList <RecoloredSpriteImage >();
246
235
if (multipleFlashColors ) {
247
236
for (var randomScheme : randomColorSchemes (flashCount , colorScheme )) {
248
- RecoloredSpriteImage randomColorMazeSprite = recoloredMazeImage (MapCategory .BIG , spriteNumber , originalMazeSprite ,
237
+ RecoloredSpriteImage randomColorMazeSprite = recoloredMazeImage (MapCategory .BIG , mazeID , originalMazeSprite ,
249
238
randomScheme , colorSchemeInSpriteSheet );
250
239
flashingMazeSprites .add (randomColorMazeSprite );
251
240
}
252
241
} else {
253
- RecoloredSpriteImage blackWhiteMazeSprite = recoloredMazeImage (MapCategory .BIG , spriteNumber , originalMazeSprite ,
242
+ RecoloredSpriteImage blackWhiteMazeSprite = recoloredMazeImage (MapCategory .BIG , mazeID , originalMazeSprite ,
254
243
NES_ColorScheme ._0F_20_0F_BLACK_WHITE_BLACK , colorSchemeInSpriteSheet );
255
244
for (int i = 0 ; i < flashCount ; ++i ) {
256
245
flashingMazeSprites .add (blackWhiteMazeSprite );
@@ -260,24 +249,26 @@ private ColoredMazeSpriteSet bigMazeSpriteSet(
260
249
}
261
250
262
251
private ColoredMazeSpriteSet strangeMazeSpriteSet (
263
- int spriteNumber , NES_ColorScheme randomColorScheme , int flashCount , boolean multipleFlashColors )
252
+ NonArcadeMapsSpriteSheet . MazeID mazeID , NES_ColorScheme randomColorScheme , int flashCount , boolean multipleFlashColors )
264
253
{
265
- final RectShort originalMazeSprite = nonArcadeMazesSprite (spriteNumber );
266
- final NES_ColorScheme originalColorScheme = colorSchemeFromNonArcadeMapsSpriteSheet (spriteNumber );
254
+ final RectShort originalMazeSprite = mazeID == NonArcadeMapsSpriteSheet .MazeID .MAZE32_ANIMATED
255
+ ? nonArcadeMazesSpriteSheet .spriteSequence (mazeID )[0 ]
256
+ : nonArcadeMazesSpriteSheet .sprite (mazeID );
257
+ final NES_ColorScheme originalColorScheme = colorSchemeFromNonArcadeMapsSpriteSheet (mazeID );
267
258
final NES_ColorScheme requestedColorScheme = randomColorScheme != null ? randomColorScheme : originalColorScheme ;
268
259
final RecoloredSpriteImage mazeSprite = requestedColorScheme .equals (originalColorScheme )
269
260
? new RecoloredSpriteImage (nonArcadeMazesSpriteSheet .sourceImage (), originalMazeSprite , originalColorScheme )
270
- : recoloredMazeImage (MapCategory .STRANGE , spriteNumber , originalMazeSprite , requestedColorScheme , originalColorScheme );
261
+ : recoloredMazeImage (MapCategory .STRANGE , mazeID , originalMazeSprite , requestedColorScheme , originalColorScheme );
271
262
272
263
final var flashingMazeSprites = new ArrayList <RecoloredSpriteImage >();
273
264
if (multipleFlashColors ) {
274
265
for (NES_ColorScheme colorScheme : randomColorSchemes (flashCount , requestedColorScheme )) {
275
- RecoloredSpriteImage randomColorMazeSprite = recoloredMazeImage (MapCategory .STRANGE , spriteNumber , originalMazeSprite ,
266
+ RecoloredSpriteImage randomColorMazeSprite = recoloredMazeImage (MapCategory .STRANGE , mazeID , originalMazeSprite ,
276
267
colorScheme , originalColorScheme );
277
268
flashingMazeSprites .add (randomColorMazeSprite );
278
269
}
279
270
} else {
280
- RecoloredSpriteImage blackWhiteMazeSprite = recoloredMazeImage (MapCategory .STRANGE , spriteNumber , originalMazeSprite ,
271
+ RecoloredSpriteImage blackWhiteMazeSprite = recoloredMazeImage (MapCategory .STRANGE , mazeID , originalMazeSprite ,
281
272
NES_ColorScheme ._0F_20_0F_BLACK_WHITE_BLACK , originalColorScheme );
282
273
for (int i = 0 ; i < flashCount ; ++i ) {
283
274
flashingMazeSprites .add (blackWhiteMazeSprite );
@@ -286,25 +277,11 @@ private ColoredMazeSpriteSet strangeMazeSpriteSet(
286
277
return new ColoredMazeSpriteSet (mazeSprite , flashingMazeSprites );
287
278
}
288
279
289
- private RectShort nonArcadeMazesSprite (int spriteNumber ) {
290
- int colIndex , y ;
291
- switch (spriteNumber ) {
292
- case 1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 -> { colIndex = (spriteNumber - 1 ); y = 0 ; }
293
- case 9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 -> { colIndex = (spriteNumber - 9 ); y = 248 ; }
294
- case 17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 -> { colIndex = (spriteNumber - 17 ); y = 544 ; }
295
- case 25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 -> { colIndex = (spriteNumber - 25 ); y = 840 ; }
296
- case 34 ,35 ,36 ,37 -> { colIndex = (spriteNumber - 34 ); y = 1136 ; }
297
- default -> throw new IllegalArgumentException ("Illegal non-Arcade map number: " + spriteNumber );
298
- }
299
- int width = 28 * TS , height = NON_ARCADE_MAP_ROW_COUNTS [spriteNumber - 1 ] * TS ;
300
- return new RectShort (colIndex * width , y , width , height );
301
- }
302
-
303
280
private RecoloredSpriteImage recoloredMazeImage (
304
- MapCategory mapCategory , int spriteNumber , RectShort mazeSprite ,
281
+ MapCategory mapCategory , Object mazeID , RectShort mazeSprite ,
305
282
NES_ColorScheme requestedScheme , NES_ColorScheme existingScheme ) {
306
283
307
- var key = new CacheKey (mapCategory , spriteNumber , requestedScheme );
284
+ var key = new CacheKey (mapCategory , mazeID , requestedScheme );
308
285
RecoloredSpriteImage mazeImage = recoloredMazeImageCache .get (key );
309
286
if (mazeImage == null ) {
310
287
SpriteSheet <?> spriteSheet = mapCategory == MapCategory .ARCADE ? arcadeMazesSpriteSheet : nonArcadeMazesSpriteSheet ;
@@ -313,7 +290,7 @@ private RecoloredSpriteImage recoloredMazeImage(
313
290
new RectShort (0 , 0 , mazeSprite .width (), mazeSprite .height ()),
314
291
requestedScheme );
315
292
recoloredMazeImageCache .put (key , mazeImage );
316
- Logger .info ("{} maze image recolored to {}, cache size: {}" , mapCategory , requestedScheme , recoloredMazeImageCache .size ());
293
+ Logger .info ("{} maze ({}) recolored to {}, cache size: {}" , mapCategory , mazeID , requestedScheme , recoloredMazeImageCache .size ());
317
294
}
318
295
return mazeImage ;
319
296
}
0 commit comments