Text Documents#
The Spanish Mac OS X distribution has two rich text documents titled level.rtf and levels_hard.rtf in the levels directory. They have pretty much the exact same data as the English release, only changing \ to /. They were both written and modified around 3 PM on July 22nd, 2009 by mcoffey, most likely Mark Coffey.
CFGASM file#
compat.cfgasm is present in the Korean version, it has a plaintext numeric list of content from the compatibility configuration file that has no use from the game, maybe a debug engine build can make use of it.
0: Load Const Int "4318"
3: Store Var "VENDOR_NVIDIA" [0:0]
6: Pop
7: Load Const Int "4098"
10: Store Var "VENDOR_ATI" [0:2]
13: Pop
14: Load Const Int "32902"
17: Store Var "VENDOR_INTEL" [0:4]
20: Pop
21: Load Const Int "4153"
24: Store Var "VENDOR_SIS" [0:6]
27: Pop
28: Load Const Int "4139"
31: Store Var "VENDOR_MATROX" [0:8]
34: Pop
35: Jmp @60
37: Load Property "compat_D3DVendorID" [0:15]
40: Load Var "VENDOR_NVIDIA" [0:0]
43: CmpEQ
44: Copy
45: Jt @55
47: Pop
48: Load Property "compat_D3DVendorID" [0:15]
51: Load Var "VENDOR_ATI" [0:2]
54: CmpEQ
55: Ret
56: Load Const Bool "false"
59: Ret
60: Jmp @128
62: Call @37
64: Store Var "isHiResHardware" [2:0]
67: Pop
68: Load Const String "isHiResHardware = "
71: Load Var "isHiResHardware" [2:0]
74: Add
75: Log
76: Load Var "isHiResHardware" [2:0]
79: Copy
80: Jf @90
82: Pop
83: Load Property "compat_AppSysMemTotalMB" [0:12]
86: Load Const Int "768"
89: CmpGE
90: Copy
91: Jf @101
93: Pop
94: Load Property "compat_AppOrigScreenHeight" [0:14]
97: Load Const Int "1000"
100: CmpGE
101: Copy
102: Jf @112
104: Pop
105: Load Property "compat_AppVidMemory" [0:10]
108: Load Const Int "92"
111: CmpGE
112: Jf @120
114: Load Const Int "1200"
117: Ret
118: Jmp @124
120: Load Const Int "600"
123: Ret
124: Load Const Bool "false"
127: Ret
128: Jmp @151
130: Load Property "compat_AppVidMemory" [0:10]
133: Load Const Int "92"
136: CmpLT
137: Jf @143
139: Load Const Bool "false"
142: Ret
143: Load Const Bool "true"
146: Ret
147: Load Const Bool "false"
150: Ret
151: Jmp @306
153: Load Property "compat_D3DVendorID" [0:15]
156: Load Var "VENDOR_SIS" [0:6]
159: CmpEQ
160: Jf @172
162: Load Const String "Returning Is3DSupported false due to SIS"
165: Log
166: Load Const Bool "false"
169: Ret
170: Jmp @298
172: Load Property "compat_D3DVendorID" [0:15]
175: Load Var "VENDOR_NVIDIA" [0:0]
178: CmpEQ
179: Jf @217
181: Load Property "compat_D3DDeviceID" [0:16]
184: Load Const Int "256"
187: CmpGE
188: Copy
189: Jf @199
191: Pop
192: Load Property "compat_D3DDeviceID" [0:16]
195: Load Const Int "272"
198: CmpLT
199: Jf @211
201: Load Const String "Returning Is3DSupported false due to old nVidia GeForce 1 card"
204: Log
205: Load Const Bool "false"
208: Ret
209: Jmp @215
211: Load Const Bool "true"
214: Ret
215: Jmp @298
217: Load Property "compat_D3DVendorID" [0:15]
220: Load Var "VENDOR_ATI" [0:2]
223: CmpEQ
224: Jf @281
226: Load Property "compat_D3DDeviceID" [0:16]
229: Load Const Int "20825"
232: CmpEQ
233: Jf @245
235: Load Const String "Returning Is3DSupported false due to old Radeon 7000 card"
238: Log
239: Load Const Bool "false"
242: Ret
243: Jmp @279
245: Load Property "compat_D3DInterface" [0:17]
248: Load Const Int "9"
251: CmpEQ
252: Copy
253: Jf @263
255: Pop
256: Load Property "compat_D3DDriverVersion" [0:23]
259: Load Const String "6.14.10.6599"
262: CmpEQ
263: Jf @275
265: Load Const String "Returning Is3DSupported false due to bad ATI D3D9 driver"
268: Log
269: Load Const Bool "false"
272: Ret
273: Jmp @279
275: Load Const Bool "true"
278: Ret
279: Jmp @298
281: Load Property "compat_D3DVendorID" [0:15]
284: Load Var "VENDOR_MATROX" [0:8]
287: CmpEQ
288: Jf @298
290: Load Const String "Returning Is3DSupported false due to Matrox"
293: Log
294: Load Const Bool "false"
297: Ret
298: Load Const Bool "true"
301: Ret
302: Load Const Bool "false"
305: Ret
306: Jmp @479
308: Load Property "compat_D3DDeviceID" [0:16]
311: Store Var "d" [16:0]
314: Pop
315: Load Var "d" [16:0]
318: Load Const Int "272"
321: CmpGE
322: Copy
323: Jf @333
325: Pop
326: Load Var "d" [16:0]
329: Load Const Int "275"
332: CmpLE
333: Copy
334: Jt @355
336: Pop
337: Load Var "d" [16:0]
340: Load Const Int "336"
343: CmpGE
344: Copy
345: Jf @355
347: Pop
348: Load Var "d" [16:0]
351: Load Const Int "339"
354: CmpLE
355: Copy
356: Jt @377
358: Pop
359: Load Var "d" [16:0]
362: Load Const Int "368"
365: CmpGE
366: Copy
367: Jf @377
369: Pop
370: Load Var "d" [16:0]
373: Load Const Int "378"
376: CmpLE
377: Copy
378: Jt @388
380: Pop
381: Load Var "d" [16:0]
384: Load Const Int "380"
387: CmpEQ
388: Copy
389: Jt @399
391: Pop
392: Load Var "d" [16:0]
395: Load Const Int "381"
398: CmpEQ
399: Copy
400: Jt @421
402: Pop
403: Load Var "d" [16:0]
406: Load Const Int "385"
409: CmpGE
410: Copy
411: Jf @421
413: Pop
414: Load Var "d" [16:0]
417: Load Const Int "387"
420: CmpLE
421: Copy
422: Jt @443
424: Pop
425: Load Var "d" [16:0]
428: Load Const Int "389"
431: CmpGE
432: Copy
433: Jf @443
435: Pop
436: Load Var "d" [16:0]
439: Load Const Int "392"
442: CmpLE
443: Copy
444: Jt @465
446: Pop
447: Load Var "d" [16:0]
450: Load Const Int "394"
453: CmpGE
454: Copy
455: Jf @465
457: Pop
458: Load Var "d" [16:0]
461: Load Const Int "397"
464: CmpLE
465: Jf @471
467: Load Const Bool "true"
470: Ret
471: Load Const Bool "false"
474: Ret
475: Load Const Bool "false"
478: Ret
479: Jmp @674
481: Load Property "compat_D3DVendorID" [0:15]
484: Load Var "VENDOR_NVIDIA" [0:0]
487: CmpEQ
488: Jf @640
490: Load Property "compat_IsVista" [0:27]
493: Copy
494: Jf @504
496: Pop
497: Load Property "compat_D3DDriverVersion" [0:23]
500: Load Const String "7.15.10.9686"
503: CmpEQ
504: Jf @516
506: Load Const String "Returning Is3DRecommended false due to bad default Vista driver for nVidia cards"
509: Log
510: Load Const Bool "false"
513: Ret
514: Jmp @638
516: Call @308
518: Jf @638
520: Load Const Bool "true"
523: Store Var "isGoodDriver" [21:0]
526: Pop
527: Load Property "compat_D3DDriverVersionA" [0:19]
530: Load Const Int "6"
533: CmpLT
534: Jf @545
536: Load Const Bool "false"
539: Store Var "isGoodDriver" [21:0]
542: Pop
543: Jmp @624
545: Load Property "compat_D3DDriverVersionA" [0:19]
548: Load Const Int "6"
551: CmpEQ
552: Jf @624
554: Load Property "compat_D3DDriverVersionB" [0:20]
557: Load Const Int "14"
560: CmpLT
561: Jf @572
563: Load Const Bool "false"
566: Store Var "isGoodDriver" [21:0]
569: Pop
570: Jmp @624
572: Load Property "compat_D3DDriverVersionB" [0:20]
575: Load Const Int "14"
578: CmpEQ
579: Jf @624
581: Load Property "compat_D3DDriverVersionC" [0:21]
584: Load Const Int "10"
587: CmpLT
588: Jf @599
590: Load Const Bool "false"
593: Store Var "isGoodDriver" [21:0]
596: Pop
597: Jmp @624
599: Load Property "compat_D3DDriverVersionC" [0:21]
602: Load Const Int "10"
605: CmpEQ
606: Jf @624
608: Load Property "compat_D3DDriverVersionD" [0:22]
611: Load Const Int "9371"
614: CmpLT
615: Jf @624
617: Load Const Bool "false"
620: Store Var "isGoodDriver" [21:0]
623: Pop
624: Load Var "isGoodDriver" [21:0]
627: LNot
628: Jf @638
630: Load Const String "Returning Is3DRecommended false due to outdated legacy GeForce2/4MX driver"
633: Log
634: Load Const Bool "false"
637: Ret
638: Jmp @666
640: Load Property "compat_D3DVendorID" [0:15]
643: Load Var "VENDOR_ATI" [0:2]
646: CmpEQ
647: Jf @666
649: Load Property "compat_D3DDeviceID" [0:16]
652: Load Const Int "22880"
655: CmpEQ
656: Jf @666
658: Load Const String "Returning Is3DRecommended false due to Radeon 9250 card"
661: Log
662: Load Const Bool "false"
665: Ret
666: Load Const Bool "true"
669: Ret
670: Load Const Bool "false"
673: Ret
674: Jmp @701
676: Load Property "compat_D3DVendorID" [0:15]
679: Load Var "VENDOR_NVIDIA" [0:0]
682: CmpEQ
683: Jf @693
685: Call @308
687: Jf @693
689: Load Const Bool "true"
692: Ret
693: Load Const Bool "false"
696: Ret
697: Load Const Bool "false"
700: Ret
701: Jmp @717
703: Load Property "compat_D3DInterface" [0:17]
706: Load Const Int "0"
709: CmpGT
710: Jf @713
712: Nop
713: Load Const Bool "false"
716: Ret
Unused levels#
|
|
To do: |
A portion of unused levels are present in the final game. As of this game, the format for the levels was upgraded, granting the ability to add general level parameters.
Jungle9/Jungle9-all#
Pretty much a copy of Creeper Copse with both curves in one file, exact same layout. The game cannot render two death areas from one curve file, making the second curve's skull texture not be drawn, and also be replaced with a tunnel. most likely the developers scrapped it for use of a separate level file to make it not use identical parameters of only one curve. The _hard variant is similar except most parameters are changed to make the level harder, including rarity of powerups.
TODO
IronFrog5-all#
Pretty much a copy of Fossil Food with both curves in one file, exact same layout.
TODO
IronFrog8-all#
Pretty much a copy of Web Two Point Oh with both curves in one file, exact same layout.
TODO
City10-all#
Pretty much a copy of Double Danger with both curves in one file, exact same layout.
Grotto10-all#
Pretty much a copy of Shark Den with both curves in one file, exact same layout.
Boss Level Tests#
LevelArchive's levels_scott.xml file reveals a small portion of level display names and boss parameters.
boss1/boss1test.dat#
Identical to the original except the level version is 12.
<Level id="boss1test1" dispname="Boss 1 test1" hurryamt=".75" noflip="true" drawcurve="true" drawtunnel="true" curve1="boss1\boss1test" background="" tfreq="1000" partime="100">
<Gun type="horiz" startx="97" starty="497" width="590"/>
<Boss type="3" subtype="2" MaxBullets="1" shotdelay="60" AllowLevelDDS="false" hpdec="10" startx="115" endx="611" y="108" minhover="50" maxhover="150" movespeed="2.5" xshake="5" yshake="5" shottype="target" minfire="250" maxfire="350" stun="200" minbullet="2.6" maxbullet="3.0" CanCompact="false" endhoveronhit="true" flightspeed="5.0" minflightdist="300" art="tiger" HeartXOff="100" HeartYOff="0">
<DDS value="maxhover" min="550" max="350" ddsmin="0" ddsmax="20"/>
<DDS value="maxhover" min="350" max="300" ddsmin="20" ddsmax="50"/>
<DDS value="maxhover" min="300" max="250" ddsmin="50" ddsmax="101"/>
<DDS value="minhover" min="500" max="300" ddsmin="0" ddsmax="20"/>
<DDS value="minhover" min="300" max="250" ddsmin="20" ddsmax="50"/>
<DDS value="minhover" min="250" max="150" ddsmin="50" ddsmax="101"/>
<DDS value="minfire" min="400" max="300" ddsmin="0" ddsmax="20"/>
<DDS value="minfire" min="300" max="260" ddsmin="20" ddsmax="80"/>
<DDS value="minfire" min="260" max="180" ddsmin="80" ddsmax="101"/>
<DDS value="maxfire" min="300" max="200" ddsmin="0" ddsmax="20"/>
<DDS value="maxfire" min="200" max="140" ddsmin="20" ddsmax="80"/>
<DDS value="maxfire" min="140" max="100" ddsmin="80" ddsmax="101"/>
<DDS value="minbullet" min="2.0" max="2.3" ddsmin="0" ddsmax="50"/>
<DDS value="minbullet" min="2.3" max="2.5" ddsmin="50" ddsmax="75"/>
<DDS value="minbullet" min="2.5" max="3.1" ddsmin="75" ddsmax="101"/>
<DDS value="maxbullet" min="2.5" max="3.0" ddsmin="0" ddsmax="50"/>
<DDS value="maxbullet" min="3.0" max="3.3" ddsmin="50" ddsmax="75"/>
<DDS value="maxbullet" min="3.3" max="3.8" ddsmin="75" ddsmax="101"/>
<DDS value="movespeed" min="1.75" max="2.0" ddsmin="0" ddsmax="50"/>
<DDS value="movespeed" min="2.0" max="2.25" ddsmin="50" ddsmax="75"/>
<DDS value="movespeed" min="2.25" max="2.75" ddsmin="75" ddsmax="101"/>
<DDS value="frogstun" min="150" max="200" ddsmin="0" ddsmax="50"/>
<DDS value="frogstun" min="200" max="250" ddsmin="50" ddsmax="101"/>
<DDS value="hurryamt" min=".50" max=".75" ddsmin="0" ddsmax="50"/>
<DDS value="hurryamt" min=".75" max=".95" ddsmin="50" ddsmax="101"/>
<Berserk value="maxbullets" amount="1" HealthLimit="30"/>
<Berserk value="maxbullet" amount=".5" HealthLimit="30"/>
<Berserk value="minbullet" amount=".9" HealthLimit="30"/>
<Berserk value="movespeed" amount="2.0" HealthLimit="30"/>
<Berserk value="minhover" amount="-100" HealthLimit="30"/>
<Berserk value="maxhover" amount="-100" HealthLimit="30"/>
</Boss>
</Level>
boss1/boss1test2.dat#
This version of the level uses diagonal paths. Level version is 12. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
startDistance |
39 |
50 |
ballRepeat |
44 |
50 |
maxSingle |
6 |
10 |
boss1/boss1test3.dat#
This version of the level uses oval paths. Level version is 12. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
startDistance |
43 |
50 |
maxSingle |
6 |
10 |
editTypeByteCount |
84 |
144 |
boss1/boss1test4.dat#
Largely identical to boss1/boss1test4.dat but one pathpoint was removed, the first's Y offset was edited and some were altered. Not defined so the XML parameters are lost.
boss1/boss1test5.dat#
Layout is largely identical to the final but moved and some parameters were edited. Level format version 12. The level ID and XML parameters are not present but suggests the file is used for boss 3, 4 and 6.
Param |
Value |
Final Value |
|---|---|---|
isLinear |
true |
false |
startDistance |
47 |
50 |
editTypeByteCount |
94 |
144 |
boss1/boss1test6.dat#
Some parameters were edited. Level format version 12. The level ID and XML parameters are not present but suggests the file is used for boss 2.
Param |
Value |
Final Value |
|---|---|---|
startDistance |
43 |
50 |
maxSingle |
6 |
10 |
editTypeByteCount |
94 |
144 |
boss1/boss1test7.dat#
Similar to boss1test2.dat, with most identical parameters. The level ID and XML parameters are not present but suggests the file is used for boss 5.
Level format version 12.
Param |
Value |
Final Value |
|---|---|---|
startDistance |
39 |
50 |
ballRepeat |
44 |
50 |
maxSingle |
6 |
10 |
editTypeByteCount |
184 |
144 |
boss1/boss1test8.dat#
This one went through 6 revisions. Level format version 14. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
pwrUpChance |
300 |
1200 |
editTypeByteCount |
74 |
144 |
boss1/boss1test8v2.dat#
Similar to boss1test8.dat but the curve in the middle is changed, version 14. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
speed |
0.8 |
0.5 |
pwrUpChance |
300 |
1200 |
editTypeByteCount |
114 |
144 |
boss1/boss1test8v3.dat#
Similar to boss1test8v2.dat but the angle of the curve at the top is changed, version 14. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
speed |
0.8 |
0.5 |
PowerType_ProximityBomb.frequency (Deprecated Powerup) |
100 |
0 |
pwrUpChance |
300 |
1200 |
editTypeByteCount |
134 |
144 |
boss1/boss1test8v4.dat#
Identical version and parameters as boss1test8v3.dat but the pathpoint data is different, version 14. Not defined so the XML parameters are lost.
boss1/boss1test8v5.dat#
A slight modification of boss1test8v4.dat, version 14. Not defined so the XML parameters are lost.
boss1/boss1test8v6.dat#
Seems to be based off boss1test8v3.dat, version 14. Not defined so the XML parameters are lost.
boss1/boss1test9.dat#
Went through one revision. Level version 15. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
speed |
45 |
50 |
maxSingle |
5 |
10 |
maxClumpSize |
5 |
10 |
editTypeByteCount |
194 |
144 |
boss1/boss1test9v2.dat#
The top and middle curves were altered from the original. Level version 14. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
maxSingle |
6 |
10 |
editTypeByteCount |
194 |
144 |
boss1/boss1v2.dat#
The only level file without test in the name but unused. Level version 12. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
startDistance |
65 |
50 |
ballRepeat |
17 |
50 |
speed |
1.45 |
0.5 |
slowDist |
450 |
200 |
accelRate |
0.025 |
0.000 |
maxSpeed |
1.75 |
100.00 |
PowerType_ProximityBomb.frequency (Deprecated Powerup) |
100 |
0 |
PowerType_SlowDown.frequency (Deprecated Powerup) |
20 |
0 |
PowerType_Accuracy.frequency (Deprecated Powerup) |
20 |
0 |
PowerType_MoveBackwards.frequency (Deprecated Powerup) |
20 |
0 |
PowerType_Cannon.frequency (Deprecated Powerup) |
100 |
0 |
pwrUpChance |
2000 |
1200 |
editTypeByteCount |
284 |
144 |
boss1/boss1v3.dat#
Seems to be based off boss1v2.dat but inverted. Level version 12. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
startDistance |
45 |
50 |
ballRepeat |
17 |
50 |
speed |
0.95 |
0.5 |
slowDist |
350 |
200 |
accelRate |
0.001 |
0.000 |
maxSpeed |
0.95 |
100.00 |
PowerType_ProximityBomb.frequency (Deprecated Powerup) |
100 |
0 |
PowerType_SlowDown.frequency (Deprecated Powerup) |
20 |
0 |
PowerType_MoveBackwards.frequency (Deprecated Powerup) |
20 |
0 |
pwrUpChance |
2000 |
1200 |
editTypeByteCount |
214 |
144 |
boss1/boss1v4.dat#
Level version 12. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
startDistance |
60 |
50 |
ballRepeat |
40 |
50 |
maxSingle |
8 |
10 |
speed |
0.75 |
0.5 |
slowDist |
75 |
200 |
pwrUpChance |
2000 |
1200 |
editTypeByteCount |
174 |
144 |
boss1/TikiTest.dat#
Curve path is identical to the final version so a screenshot won't be necessary. Level version 12. Not defined so the XML parameters are lost.
Param |
Value |
Final Value |
|---|---|---|
maxSingle |
4 |
10 |
Development Compilation Directories#
C:\Documents and Settings\jeff\Desktop\
C:\work\games\Art\ZumasRevenge\Working\
C:\Documents and Settings\Architekt\Desktop\
The PAX files have some metadata which describes part of a few directories in the game. Jeff is most likely Jeff Weinstein, a programmer of many games from PopCap; "Architekt" is his alternative name, commonly seen on forums. Guess he has two user accounts.
Development Text#
|
|
To do: |
There's a lot of interesting strings.
Your boss DDS parameters were all reset. You should quit and restart.
A message displayed when all level managers are reloaded.
ADVENTURE STATS DO NOT DELETE.csv
HEROIC STATS DO NOT DELETE.csv
CHALLENGE STATS DO NOT DELETE.csv
IRON FROG STATS DO NOT DELETE.csv
ERROR.csv
users/user%d_%s_stats.dat
Possible names for save files from beta testing.
Message
Maybe you don't care?
Unabled to load level file:
Error message when a curve binary file is missing or improperly created.
One or more of your levels is outdated. The latest version of Zuma's Revenge
has a new option to control overall powerup frequency
and uses a weighted system to pick the one that appears.
Powerups have been disabled. Please edit your curve to fix this.
This message will only be displayed once per session.
The first level found with this error is:
%s
Error message for use of an older level format.
Instantly causes a game over
gameover
Causes the balls to rush towards the danger point
danger
Restarts the current level
restart
Jumps to the next level, restarts current one if no more
nextlevel
Also jumps to the next level
nl
Indicate the level ID to switch to. Example: changelevel new2
changelevel
Also changes level
cl
Displays a list of all the available levels to choose from
listlevels
Also lists levels
ll
Reparses the level xml file and restarts the current level.
reload
Hides all balls and pauses the game.
hide
Mouse cheat mode: Mouse over a ball, 0-5/DEL changes color/deletes
mcheat
Specify a resource XML file to load to replace existing sounds.
soundres
Forces the equivalent of the reverse/backwards powerup.
reverse
Toggles on/off the accuracy powerup.
accuracy
Warps to a challenge level. Specify level ID.
challenge
Nukes all balls and ends the level.
killall
Toggles if the game is paused when you lose focus.
nopause
Sets it so that the game thinks you've beaten adventure mode once.
beatgame
Unlocks this zone for play in challenge mode: the same as beating level 10 of the zone naturally.
beatzone
Sets the number of lives the player has left.
lives
Makes the game crash.
crash
Makes the game assert (and then immediately quit).
assert
Sets your score to the specified value.
score
For challenge mode only: Sets the time remaining IN SECONDS (will inc difficulty, can be float)
time
For challenge mode only: Sets ALL BUT ONE level in the zone as if it were aced (unlocks if needed)
acecup
For challenge mode only: Sets ALL BUT ONE levle in the zone as it were normally beat (unlocks if needed)
beatcup
Resets steam achievements (steam builds only)
resetsteam
Displays all unlocked Steam achievements.
showsteam
Displays all stats recoreded for this user.
showsteamstats
Text for a cheat console. resetsteam, showsteam ' and showsteamstats were added in the Steam, Final and multilingual Mac release. mcheat has no references to the game, making it have no effect.
*** Command Console ***
Type /help for a list of commands.
^fff71f^ctrl-UP^FFFFFF^: Scrolls the currently displayed text up a line
^fff71f^ctrl-DOWN^FFFFFF^: Scrolls the currently displayed text down a line
^fff71f^UP^FFFFFF^: Scrolls up in the command history buffer
^fff71f^DOWN^FFFFFF^: Scrolls down in the command history buffer
^fff71f^/clear^ffffff^: Clears the console
^fff71f^` key^FFFFFF^: Closes/opens this window
*** Help Menu ***
^fff71f^/help^ffffff^: Displays this menu
^fff71f^ctrl-UP^ffffff^: Scrolls the currently displayed text up a line
^fff71f^ctrl-DOWN^ffffff^: Scrolls the currently displayed text down a line
^fff71f^UP^ffffff^: Scrolls up in the command history buffer
^fff71f^DOWN^ffffff^: Scrolls down in the command history buffer
^fff71f^` key^ffffff^: Closes/opens this window
Commands valid in the current context:
^ffffff^:
^fff71f^
/help
/clear
Error: unknown command \"
Text and commands for a debug console, titled a Command Console.
Zuma's Revenge!.app/Contents/MacOS/Cheat.app
%20
open \"%s\
Popcap/Zuma's Revenge!/console.rbs
Related to the debug console, but the Mac version appears to use a separate app named Cheat which isn't bundled in any way.
|
|
To do: |
resprops\\resprops2.txt
ShaderDefaults * PSEntry=main VSEntry=main;
ImageDefaults * Group=
FontDefaults * Group=
SoundDefaults * Group=
\\
/
/../
Font
Sound
id=
alias=
cols=
rows=
volume=
tags=
;
Image
resprops\\resprops.txt
..\\..\\..\\..\\..\\bin\\ResourceGen2.exe
properties\\resources.xml
Text for a function to convert the game's resources.
%s\\Zuma2 Crash Data SUBMIT THIS FILE ASAP %d.zip
_
_%d_
ZUMA2 CRASH_
\\\\sea-jeff\\c\\dump\\Zuma2Crashes\\
\\\\10.1.2.181\\c\\dump\\Zuma2Crashes\\
%s\\%s %s Crash %d.mdmp
_%d_minidump.zip
crash_tmp.zip
crash %d.mdmp
There was a problem creating a zip file of your crash information.
Please report this problem at once to jeff@popcap.com. Thank you.
You appear to have crash information saved on your desktop.
This is VERY important data. You should post it to burrito,
or barring that, email it to jeff@popcap.com.
After you do that, you may delete the file. The file is ON YOUR DESKTOP and named:
Text for an alternative crash reporter. Burrito is an internal forum PopCap developers used to hitch ideas/logs and also post internal builds of games; a tool is also present. SEA likely relates to PopCap Seattle, the main branch of the company.
Unused Challenge Mode Difficulty#
Normally, each game of Challenge mode lasts only 3 minutes (18000 in game's internal timer value) and get gradually more difficult as they go along. However, in one of the game's XML files (main.pak/levels/levels.xml), difficulty settings for lengths through 5:20 (32000 in game's internal timer value) exist:
Single curve levels:
Double curve levels:
It's possible to extend the time limit of Challenge mode by editing the "GauntletSessionLength" property in the same XML file. After 3 minutes, the balls move even faster and the colors become more scattered, so the player will likely perish very soon.
Additionally, if you change the "time" parameter to a "points" parameter, the difficulty goes up based on the player's score. This is described in a developer's comment in levels.xml:
<!-- if you use "points" instead of "time" then when the users crosses that point threshhold the difficulty increases, otherwise it goes up over time -->
Debug Displays#
|
|
To do: |
Curve Drawing#
Most levels have a property "drawcurve" in levels.xml. Changing them to true will draw the ball path as a red line in gameplay. On Mac OS X, this only works with the final worldwide version of the game. In certain levels like Shipwrecked!, this doesn't render properly without modification as the chutes below overlap the red line drawn.
Tunnel Drawing#
Most levels have a property "drawtunnel" in levels.xml. Changing them to true unfortunately does nothing, as the function is stripped from the game.
DDS Window#
A display of level parameters is hidden with no references to enable it. Changing the following byte at the end of the value on the memory address to 1 will enable it and draws related text in a colored blue square on the bottom left corner of the game. The text is only visible in Challenge Mode but leaving the game window unfocused or paused (most notably with space), also renders it temporarily.
Build |
Address |
|---|---|
v1.0.4.9495 |
0042CB8F |
Debug Commands#
Pressing CTRL-ALT-D will play a sound to indicate debug key input is enabled, allowing the option of typing unique keys for debugging displays or mechanisms; another use will disable it. Two of the functions was slightly altered from Bejeweled Twist and F11 does not exist.
- F1 - The ArtRes entry was removed. You can enable the UpdateCount display with setting 004A3E76 (JPN) or 004A3E76 (Final) to NOP.
- F3 - Now includes the virtual memory FPS and changes the existing FPS string to ActFPS and being an older framework version, this doesn't include the Shift key inclusion for mouse coordinates.
ActFPS: %d
VirtFPS: %.1f
- F8 - Now includes Texture Memory.
Unused Sound Effects#
The loading screen has two unused sound effects.
logoappears1.ogg#
This cool "Zuma!" title call voice wasn't used.
shipwreck1.ogg#
The scene where the frog's ship is wrecked doesn't exist, but this sound effect suggests that PopCap might have planned it to.
Unused Text#
Kahtiki Khan
Maga Maga
Baron Digo
Kulo Komari
Cephalo Ka
Zhaka Mu
Drumstick Willie
His Crumbleness
Each boss battle has a level name, which is never displayed. The bottom three are each section of the final boss.
Oh no! Jungle Boss is on a rampage! Blast him through holes in the curve when his shield is down. But don't let the curve reach the skull!
You've awakened Village Boss from his slumber! Use the lilypads to take shots at his heads when they glow. Be sure to keep the balls out of the skull!
Level 10 and 20 in levels.xml have a parameter called "NextLevelText", as described in developer's comment:
<!-- NEW LEVEL PARAMETER:
NextLevelText - In addition to displaying this round's stats, this text will be displayed so that the user
can know what to expect on the next level.
-->
The idea of NextLevelText appears to be dropped early in development, as they only exist in the first two worlds. In the final version of the game, it was replaced by a boss "placard", and the accompanying text is part of the graphics.
<!--
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Berserk mode: This is for bosses only. This lets you alter any of the boss' parameters when his health drops
below a certain amount. CURRENTLY, *ALL* VALUES DESCRIBED IN THE ABOVE DDS SECTION CAN BE USED AS BERSERK VALUES.
I will list extra values below when they are added. When the boss' health drops below a threshhold you specify,
the values are modified by the amount you set. Like the <DDS> tag, <Berserk> tags go between a <Boss> section.
Here's an example tag:
<Berserk value="HPDecPerHit" amount="-5" HealthLimit="75"/>
The number in /amount/ is ADDED to the present value of the variable. /HealthLimit/ indicates that if the boss
previously had a health greater than or equal to this but is now less than this (i.e. you damaged him and he dropped
below the number) then this rule should take effect. It only happens the first time the boss crosses that threshhold,
so it won't keep constantly apply -5 to HPDecPerHit when he's below 75 health. If you have multiple entries you want
affected at the same HealthLimit, just specify them with another <Berserk> tag, using the same HealthLimit value.
If you wanted HPDecPerHit to change again if say the boss dropped below 30 health, you would simply add another <Berserk>
tag like so:
<Berserk value="HPDecPerHit" amount="-5" HealthLimit="30"/>
Skip to the end of this file for a testbed boss for more examples on the <Berserk> section.
SPECIAL BERSERK MOVEMENT RELATED COMMANDS:
------------------------------------------
You can have the boss switch to a different movement pattern completely upon berserking. This requires a berserk tag of this form:
<Berserk value="movement" HealthLimit="<num>" .../>
NOTE THAT YOU HAVE TO SPECIFY "movement" FOR YOUR VALUE TAG!!!! And you don't specify /amount/ or /override/.
Set any parameters here relating to position that you normally would set up for the boss' default movement pattern.
The following are the ONLY valid tags that can be used here: please note that their usage and combination are subject to
the same rules as described elsewhere in this doc.
startx, endx, starty, endy, x, y, x1 and y1 through infinity
2 examples: This would switch movement to rail based:
<Berserk value="movement" HealthLimit="60" startx="123" endx="456" y="123"/>
This would switch to waypoint based:
<Berserk value="movement" HealthLimit="95" x1="175" y1="217" x2="647" y2="217"/>
This will COMPLETELY wipe out the values for these previous variables (all others aren't touched, like strafe, move speed, etc etc).
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-->
<!--
==================================================================================================================
The following is a list of all valid parameters for bosses only:
Common to all:
--------------
HPDec - How much health the boss loses per shot fire. Must be multiple of 5 (each 5 indicates a 1/4 heart)
HPDecProxBomb - Like above but for how much health damage a proximity bomb does. IF NOT DEFINED AT ALL, DEFAULTS TO /HPDec/!
ImpatientTimer - If specified, when this time runs out the boss becomes impatient and every 10 seconds, the curve moves 10% faster,
the boss starts firing faster and more often.
NormalPassUnder - If true, normal bullets don't affect the boss and he can only be hit by cannon balls.
BombDelay - In frames, this will make it so the proximity bomb can spawn multiple times but limited by this delay instead of the present cap
of 1 per curve.
X/YShake - Makes the boss shake when hit by the specified amount. Use 0 for none.
CanCompact - If "true", the boss will compact the curve when he's hit
HeartXOff/HeartYOff - Lets you position the location of the boss heart gauge, relative to the boss' location.
TikiStunTime - how long the tiki stops moving for if hit. If this is 0, the tiki will behave like the others do in regards to getting hit.
Only valid for moving tikis.
tiki<num>track - if true, this tiki follows the player, otherwise it behaves like the others do
tiki<num>accel - If tracking the player, this is how fast it accelerates after overshooting
You can put a tiki on a rail, either vert or horiz. Just do /tiki<num>w/ or /tiki<num>h/ to set the
rail width or height, respectively. To set the traveltime between the rail points, use /tiki<num>time/.
You can setup the location and size of a wall by inserting any of the following tags still on the <BOSS> line, where the #
symbol is an integer ID number of the wall:
wall#x, wall#y - location of the wall
wall#w, wall#h - width/height of the wall
If you have an even number of tikis to walls, then the tikis will make the wall of the same ID disappear when hit. If you have only 1 wall but
more than 1 tiki, you must hit all tikis to make the wall disappear.
Specific to boss type 3 (present "Ace" style boss permutations):
----------------------------------------------------------------
USE ONLY 1 OF THE FOLLOWING MOVEMENT METHODS
MOVEMENT METHOD1
StartX/EndX - The boss moves horizontally between these points. He'll randomly start somewhere in between
y - He doesn't change Y coordinate, so just set 1 value for this
MOVEMENT METHOD2
x1/y1, x2/y2, etc - Specify any number of paired coordinates and the boss will instantly warp between them, rather than
picking a spot on a rail between endpoints. Hovering parameters and all other parameters are respected.
BombFreqMin/Max - Lets you force a prox bomb to spawn every this number of balls
BombDuration - Lets you override how long the prox bomb powerup stays on screen for (default is 20 seconds)
minhover/maxhover - Min/max time to hover in place
movespeed - How fast he moves after hovering to the next spot
minfire/maxfire - Min/Max firing delay when he's hovering
ONLY USE 1 OF THE FOLLOWING 3 OPTIONS:
stun - how long the frog is stunned for
poison - how long frog is poisoned and has mouse controls inverted for
hallucinate - how long ball colors are messed up for
SHIELD RELATED
UseShield - If true, the boss gets a shield around him that is made of 4 quadrants that must be destroyed by a prox bomb.
If false, none of the rest of the parameters matter.
ShieldRotSpeed - How fast (degrees per update frame) the shield SMOOTHLY rotates
ShieldPauseTime - Use ONLY this or ShieldRotSpeed: if set, the shield will sit still until this time elapse, then it rotates 90 degrees.
ShieldRespawnTime - How quickly the shield segments respawn.
ShieldHP - Use with the next parameter: lets you set how much HP a shield segment has.
BallShieldDamage - If the above is set, then this is how much HP a normal bullet does to a shield segment. When the segment drops to 0 HP,
it disappears for /ShieldRespawnTime/. So if you set this to 1 and /ShieldHP/ to 3, you'd need to make 3 hits
to open the shield segment. Hitting a shield segment with a prox bomb always instantly opens it up.
EnrageShieldRestore - If true, the entire shield regens instantly when the boss goes berserk
DrawRadius - If true, will draw a radius that indicates a region in which, if a prox bomb goes off in, will damage the boss.
minbullet/maxbullet - Min/max speed of the projectiles he fires
noflip - Disables the ability to flip back and forth on the rail.
subtype - Set to 1 for how boss1 works: just fires a bullet right at the player. Set to 2 to allow the
boss to fire multiple bullets at the player. ONLY IF SUBTYPE IS 2 WILL THE NEXT PARAMETER,
/maxbullets/ APPLY! Otherwise it'll be ignored.
shottype - If you're using subtype 2, aka multishot, this lets you set a specific type of shot to do for the boss' regular attacks.
Specify "any" or leave blank to allow any (randomly chosen) shot type. Specify "target" to have the bullet target the player,
specify "sine" for one of the sinusoidal variants (works for both the sine types we made), and finally the new one, specify
"straight" to make the boss fire a perpendicular shot that isn't targeted.
NEW ADDITION: specify "homing" to make the projectile's X velocity track the player. Used in conjunction with /homingspeed/
homingspeed - A floating point value only used with homing shot type. This is how fast the missile corrects its speed.
shotdelay - In MS, this is only used if firing multiple shots. This lets you make shots delayed by an amount so as to stagger them.
retalshotdelay - Like the above but for retaliatory shots.
EndHoverOnHit - If true, when the boss is shot, he'll stop hovering and go to his next spot
flightspeed - a floating point value that overrides the speed for when the boss is hit and is fleeing immediate fleeing effect. Only valid with endhoveronhit.
minflightdist - the minimum pixel distance the dude has to travel if he is fleeing in terror. Only valid with endhoveronhit.
EnrageAmt - Every time the boss loses this amount of health, he increments the maxbullets amount by 1
RetalEnrageAmt - Like above but for his retaliation shot counter
maxbullets - If subtype is 2, this controls how many bullets the boss will fire when he's ready to
retaliation - For either subtype, when the boss is hit, this is how many shots he'll fire
retaltype - Retaliation shot type: set to "sine" to make the shots be sinusoidal. If you fire more than 1,
he'll alternate firing a left/right sine pattern. If anything but "sine" he'll fire right
at the player.
THE FOLLOWING ARE ONLY USED IF /retaltype/ IS SINE:
(Only one of these sections can be valid at a time)
min/maxamp - Sets the min/max amplitude for the sine wave function. The large the value, the taller/higher the
sine wave goes to. Think of this as the volume of a sound wave.
min/maxfreq - Sets teh min/max range for the frequency of the wave shape. Think of this as how close together
the actual humps/curves of the sine graph are. Higher values put them closer together.
Min/MaxSineYInc - How fast in the Y direction the bullet moves
SineShotsTargetPlayer - Only use this for vertical bosses at the moment.
MinSineShotTime - How long sine shots take to travel from the boss to the player, min in a range
MaxSineShotTime - How long sine shots take to travel from the boss to the player, max in a range
CanShootBullets - Allows the bullets to be destroyed by frog balls. haha
/FrogShield/ How long the frog shield powerup will last for
/BossFreeze/ How long the boss freeze powerup will last for
COLOR VAMP PARAMETERS:
ColorVampire - If true, he's a color vampire, if not, stop reading the rest of this.
AvoidColor - If true, the player has to AVOID hitting the boss when he's displaying the color. In that case, if you hit him with the color he's showing, he can
regain health, if you let him. If false, you HAVE TO hit him with the displayed color. He won't regain health no matter what.
VampHealthInc - If avoidcolor, this is how much health he'll get back. It follows the same rules/restrictions as the /hpdec/ parameter. Ignored if not avoidcolor.
VampColorChangeMin/Max - The min/max time for him to change colors, though he'll change after being hit regardless.
ColorHelp - Only valid for color vampire bosses whom you have to hit with the showing color: this is the % chance that when hit,
the next color chosen will be the same as the 2nd ball color.
==================================================================================================================
-->
Information on boss parameters.
<!-- DDS tiers must be added in order. /powerpct/ is the % increase to all powerups, /slowadd/ is the extra pixel distance to add to the danger/slowdown value.
The /speedpct/ value affects the cruising speed of the balls. Set it to 200 (200%) to make the balls go twice as fast...which would be dumb.
Set it to 50 (50%) to make them go half as fast at cruising speed.
/zumapct/ is the amount to reduce the number of points needed for zuma by. Set it to 0 to leave it the same. Set it to 50 to make the
user only need 50% of the points to achieve zuma.
-->
<!-- don't touch this. If you change the boss names for some odd reason though, the /boss/ tag will need to be updated.
So let's just not do that. -->
<!-- PLEASE DON'T REMOVE THESE: You may update them and modify them to balance and stuff but leave at least
something defined for gauntlet mode so I can continue to test it w/out crashing -->
<pre>
<!-- for the PopCap logo -->
<!-- "Level" for level locked, empty/undefined for none or some overidden other DRM method -->
<!-- If this is true, we'll display the upsell if the user hits the exit button on the main menu, otherwise
we'll just quit. Note: This will never display an upsell if you hit alt-f4 or the "x" to close the app -->
<!-- Set the number of partner logos to display in the "NumLogos" field.
For EACH logo, make a Logo#File and a Logo#HoldTime entry. The file entry should be a path relative to the game's .exe.
DO NOT SPECIFY A FILE EXTENSION. Supported file types are: gif, jpg, jp2, png, j2k, and limited support for tga.
The hold time is specified in hundredths of a second, so 100 is equal to 1 second.
-->
<!--
<Integer id="NumLogos">2</Integer>
<String id="Logo1File">images/1</String>
<Integer id="Logo1HoldTime">300</Integer>
<String id="Logo2File">images/2</String>
<Integer id="Logo2HoldTime">150</Integer>
-->
Interestingly, the Mac version has this information in partner.xml.
Localized Text Source Comments#
properties/default.xml in the multilingual releases while used to change hardcoded text for a localizable build of the game has comments mentioning source code file paths and their line numbers for the localization which could be useful for reverse engineering. They also contain a compilation tag.
<!-- Framework Strings -->
<!-- AUTOGEN: Wonka Wed Jul 22 13:27:47 2009
<!-- File: JeffLib\NewUserDialog.cpp -->
<!-- Line 18 -->
<!-- Line 26 -->
<!-- Line 41 -->
<!-- File: Zuma2\BetaStats.cpp -->
<!-- BetaStats::SaveCSVFile:152 -->
<!-- File: Zuma2\Board.cpp -->
<!-- Board::Init:1095 -->
<!-- Board::Init:1096 -->
<!-- Board::Init:1097 -->
<!-- Board::SetupLevelText:1469 -->
<!-- Board::SetupLevelText:1471 -->
<!-- Board::KeyChar:2485 -->
<!-- Board::KeyChar:2719 -->
<!-- Board::CueLevelTransition:2916 -->
<!-- Board::IncScore:3244 -->
<!-- Board::IncScore:3251 -->
<!-- Board::IncScore:3288 -->
<!-- Board::CheckIfGotExtraLife:3326 -->
<!-- Board::DoHitTreasure:3531 -->
<!-- Board::DoHitTreasure:3534 -->
<!-- Board::DoHitTreasure:3540 -->
<!-- Board::ActivatePower:3794 -->
<!-- Board::ActivatePower:3833 -->
<!-- Board::CheckEndConditions:4254 -->
<!-- Board::CheckEndConditions:4254 -->
<!-- Board::UpdateLosing:4975 -->
<!-- Board::UpdateLosing:4975 -->
<!-- Board::UpdateLosing:4982 -->
<!-- Board::UpdateLosing:4982 -->
<!-- Board::UpdateLosing:4989 -->
<!-- Board::UpdateLosing:4999 -->
<!-- Board::UpdateLosing:5001 -->
<!-- Board::UpdateLosing:5001 -->
<!-- Board::UpdatePlaying:5724 -->
<!-- Board::UpdatePlaying:5732 -->
<!-- Board::UpdatePlaying:5752 -->
<!-- Board::Update:6470 -->
<!-- Board::Update:6482 -->
<!-- Board::Update:6505 -->
<!-- Board::UpdateBeatLevelBonus:6696 -->
<!-- Board::DrawGauntletWidget:7532 -->
<!-- Board::DrawPlaying:7634 -->
<!-- Board::DrawPlaying:7659 -->
<!-- Board::DrawPlaying:7659 -->
<!-- Board::DrawPlaying:7659 -->
<!-- Board::DrawPlaying:7659 -->
<!-- Board::DrawPlaying:7667 -->
<!-- Board::DrawPlaying:7677 -->
<!-- Board::DrawPlaying:7677 -->
<!-- Board::DrawPlaying:7690 -->
<!-- Board::DrawPlaying:7691 -->
<!-- Board::DrawPlaying:7703 -->
<!-- Board::DrawPlaying:7730 -->
<!-- Board::DrawPlaying:7747 -->
<!-- Board::DrawPlaying:7823 -->
<!-- Board::DrawPlaying:7823 -->
<!-- Board::DrawPlaying:8082 -->
<!-- Board::DrawOverlay:8158 -->
<!-- Board::DrawOverlay:8161 -->
<!-- Board::DrawOverlay:8168 -->
<!-- Board::DrawOverlay:8172 -->
<!-- Board::DrawOverlay:8179 -->
<!-- Board::DrawOverlay:8191 -->
<!-- Board::DrawOverlay:8195 -->
<!-- Board::DrawOverlay:8195 -->
<!-- Board::DrawOverlay:8203 -->
<!-- Board::DrawOverlay:8204 -->
<!-- Board::DrawOverlay:8471 -->
<!-- Board::DrawOverlay:8471 -->
<!-- Board::DrawOverlay:8471 -->
<!-- Board::DrawOverlay:8486 -->
<!-- Board::DrawOverlay:8487 -->
<!-- Board::DrawOverlay:8493 -->
<!-- Board::DrawOverlay:8494 -->
<!-- Board::DrawOverlay:8498 -->
<!-- Board::DrawOverlay:8499 -->
<!-- Board::DrawOverlay:8501 -->
<!-- Board::DrawOverlay:8502 -->
<!-- Board::DrawOverlay:8509 -->
<!-- Board::DrawOverlay:8513 -->
<!-- Board::DrawOverlay:8517 -->
<!-- Board::DrawOverlay:8552 -->
<!-- Board::DrawOverlay:8680 -->
<!-- Board::DrawIronFrogWin:8920 -->
<!-- Board::DrawIronFrogWin:8923 -->
<!-- Board::DrawIronFrogWin:8927 -->
<!-- Board::DrawIronFrogWin:8932 -->
<!-- Board::DrawIronFrogWin:8938 -->
<!-- Board::DrawIronFrogWin:8941 -->
<!-- Board::Draw:9206 -->
<!-- Board::Draw:9210 -->
<!-- Board::Draw:9259 -->
<!-- Board::Draw:9263 -->
<!-- Board::Draw:9293 -->
<!-- Board::Draw:9295 -->
<!-- Board::Draw:9295 -->
<!-- Board::Draw:9321 -->
<!-- Board::Draw:9324 -->
<!-- Board::Draw:9335 -->
<!-- Board::Draw:9351 -->
<!-- Board::Draw:9364 -->
<!-- Board::LoadGame:10544 -->
<!-- Board::SetHallucinateTimer:10657 -->
<!-- Board::DoClearCurveBonus:10884 -->
<!-- Board::DoClearCurveBonus:10885 -->
<!-- Board::DoClearCurveBonus:10889 -->
<!-- Board::UpdateBoss6StoneHeadBurst:10961 -->
<!-- Board::UpdateBoss6StoneHeadBurst:10961 -->
<!-- Board::DrawBoss6DarkFrog:11142 -->
<!-- Board::DrawBoss6DarkFrog:11142 -->
<!-- Board::DrawBoss6DarkFrog:11145 -->
<!-- Board::DrawBoss6DarkFrog:11146 -->
<!-- Board::DrawBoss6DarkFrog:11147 -->
<!-- File: Zuma2\Boss.cpp -->
<!-- Boss::DrawMisc:1086 -->
<!-- Boss::DrawMisc:1095 -->
<!-- Boss::DrawDeathText:1238 -->
<!-- File: Zuma2\BossDoctor.cpp -->
<!-- BossDoctor::ResetWallAndTikis:416 -->
<!-- BossDoctor::DoHit:458 -->
<!-- BossDoctor::DoHit:462 -->
<!-- BossDoctor::CollidesWithWall:1053 -->
<!-- File: Zuma2\BossLame.cpp -->
<!-- BossLame::Init:82 -->
<!-- BossLame::DrawTopLevel:656 -->
<!-- BossLame::DrawTopLevel:656 -->
<!-- BossLame::DrawTopLevel:656 -->
<!-- BossLame::DrawTopLevel:661 -->
<!-- BossLame::DrawTopLevel:662 -->
<!-- File: Zuma2\BossMosquito.cpp -->
<!-- BossMosquito::BallEaten:113 -->
<!-- File: Zuma2\BossSquid.cpp -->
<!-- BossSquid::DoHit:754 -->
<!-- BossSquid::DoHit:759 -->
<!-- File: Zuma2\BossStoneHead.cpp -->
<!-- BossStoneHead::DrawBossSpecificArt:841 -->
<!-- BossStoneHead::DrawBossSpecificArt:842 -->
<!-- BossStoneHead::DrawBossSpecificArt:843 -->
<!-- BossStoneHead::DrawBossSpecificArt:847 -->
<!-- BossStoneHead::DrawBossSpecificArt:848 -->
<!-- BossStoneHead::DrawBossSpecificArt:849 -->
<!-- File: Zuma2\BossTiger.cpp -->
<!-- BossTiger::Update:620 -->
<!-- BossTiger::Update:624 -->
<!-- BossTiger::Update:657 -->
<!-- BossTiger::Update:679 -->
<!-- BossTiger::Update:697 -->
<!-- BossTiger::SyncState:943 -->
<!-- BossTiger::SyncState:947 -->
<!-- BossTiger::SyncState:951 -->
<!-- BossTiger::Collides:1546 -->
<!-- BossTiger::Collides:1551 -->
<!-- File: Zuma2\ChallengeHelp.cpp -->
<!-- Line 55 -->
<!-- Line 55 -->
<!-- Line 73 -->
<!-- ChallengeHelp::Draw:149 -->
<!-- ChallengeHelp::Draw:153 -->
<!-- ChallengeHelp::Draw:166 -->
<!-- ChallengeHelp::Draw:192 -->
<!-- ChallengeHelp::Draw:201 -->
<!-- ChallengeHelp::Draw:217 -->
<!-- File: Zuma2\Checkpoint.cpp -->
<!-- Checkpoint::Draw:229 -->
<!-- Checkpoint::Draw:237 -->
<!-- Checkpoint::Draw:243 -->
<!-- Checkpoint::Draw:260 -->
<!-- Checkpoint::Draw:261 -->
<!-- File: Zuma2\Credits.cpp -->
<!-- Credits::Draw:347 -->
<!-- File: Zuma2\CurveMgr.cpp -->
<!-- CurveMgr::DoScoring:1193 -->
<!-- CurveMgr::DoScoring:1208 -->
<!-- CurveMgr::DoScoring:1238 -->
<!-- CurveMgr::DoScoring:1244 -->
<!-- CurveMgr::DoScoring:1251 -->
<!-- CurveMgr::DoScoring:1255 -->
<!-- CurveMgr::DoScoring:1279 -->
<!-- File: Zuma2\DDS.cpp -->
<!-- DDS::GetBossParam:284 -->
<!-- DDS::GetBossParam:284 -->
<!-- DDS::GetBossParam:284 -->
<!-- File: Zuma2\DarkFrogSequence.cpp -->
<!-- DarkFrogSequence::Init:75 -->
<!-- DarkFrogSequence::Init:75 -->
<!-- DarkFrogSequence::Init:75 -->
<!-- DarkFrogSequence::Init:78 -->
<!-- DarkFrogSequence::Init:79 -->
<!-- DarkFrogSequence::Init:80 -->
<!-- File: Zuma2\DeathSkull.cpp -->
<!-- DeathSkull::Update:112 -->
<!-- DeathSkull::Update:114 -->
<!-- DeathSkull::Update:116 -->
<!-- DeathSkull::Update:118 -->
<!-- File: Zuma2\FakeCredits.cpp -->
<!-- FakeCredits::Init:46 -->
<!-- FakeCredits::Init:46 -->
<!-- FakeCredits::Init:46 -->
<!-- FakeCredits::Init:49 -->
<!-- FakeCredits::Init:50 -->
<!-- FakeCredits::Init:51 -->
<!-- File: Zuma2\GameApp.cpp -->
<!-- Line 392 -->
<!-- Line 398 -->
<!-- Line 665 -->
<!-- Line 668 -->
<!-- Line 670 -->
<!-- GameApp::InitHook:1751 -->
<!-- GameApp::InitHook:1751 -->
<!-- GameApp::ShowMainMenu:2264 -->
<!-- GameApp::ShowMainMenu:2264 -->
<!-- GameApp::InGameLoadThread_DrawFunc:2767 -->
<!-- GameApp::InGameLoadThread_DrawFunc:2767 -->
<!-- GameApp::InGameLoadThread_DrawFunc:2789 -->
<!-- GameApp::InGameLoadThread_DrawFunc:2799 -->
<!-- GameApp::InGameLoadThread_DrawFunc:2812 -->
<!-- GameApp::InGameLoadThread_DrawFunc:2831 -->
<!-- GameApp::UpdateFrames:3000 -->
<!-- GameApp::DoGenericDialog:3541 -->
<!-- GameApp::ChangeUser:3668 -->
<!-- GameApp::ChangeUser:3668 -->
<!-- GameApp::ChangeUser:3671 -->
<!-- GameApp::ChangeUser:3683 -->
<!-- GameApp::ChangeUser:3683 -->
<!-- GameApp::ChangeUser:3695 -->
<!-- GameApp::ChangeUser:3695 -->
<!-- GameApp::DoNewUserDialog:3728 -->
<!-- GameApp::BlankNameEntered:3767 -->
<!-- GameApp::BlankNameEntered:3767 -->
<!-- GameApp::NameIsAllSpaces:3772 -->
<!-- GameApp::NameIsAllSpaces:3772 -->
<!-- GameApp::FinishedNewUser:3793 -->
<!-- GameApp::FinishedNewUser:3793 -->
<!-- File: Zuma2\GameCommon.cpp -->
<!-- Sexy::PowerupToStr:210 -->
<!-- Sexy::PowerupToStr:210 -->
<!-- Sexy::PowerupToStr:211 -->
<!-- Sexy::PowerupToStr:211 -->
<!-- Sexy::PowerupToStr:212 -->
<!-- Sexy::PowerupToStr:212 -->
<!-- Sexy::PowerupToStr:213 -->
<!-- Sexy::PowerupToStr:213 -->
<!-- Sexy::PowerupToStr:214 -->
<!-- Sexy::PowerupToStr:214 -->
<!-- Sexy::PowerupToStr:215 -->
<!-- Sexy::PowerupToStr:215 -->
<!-- Sexy::PowerupToStr:216 -->
<!-- Sexy::PowerupToStr:216 -->
<!-- Sexy::PowerupToStr:217 -->
<!-- Sexy::PowerupToStr:217 -->
<!-- Sexy::GetGauntletAwardStrFromScore:310 -->
<!-- Sexy::GetGauntletAwardStrFromScore:312 -->
<!-- Sexy::GetGauntletAwardStrFromScore:314 -->
<!-- Sexy::GetGauntletAwardStrFromScore:316 -->
<!-- File: Zuma2\GenericHelp.cpp -->
<!-- Line 23 -->
<!-- Line 29 -->
<!-- Line 29 -->
<!-- Line 29 -->
<!-- Line 29 -->
<!-- Line 29 -->
<!-- Line 29 -->
<!-- Line 29 -->
<!-- Line 32 -->
<!-- Line 33 -->
<!-- Line 34 -->
<!-- Line 35 -->
<!-- Line 36 -->
<!-- Line 37 -->
<!-- Line 38 -->
<!-- GenericHelp::Draw:86 -->
<!-- File: Zuma2\Gun.cpp -->
<!-- Gun::Draw:2283 -->
<!-- Gun::Draw:2290 -->
<!-- File: Zuma2\LevelMgr.cpp -->
<!-- Level::GetStatsScreenText:549 -->
<!-- Level::DrawToplevel:2477 -->
<!-- Level::DrawToplevel:2477 -->
<!-- Level::DrawToplevel:2478 -->
<!-- Level::DrawToplevel:2478 -->
<!-- Level::DrawToplevel:2544 -->
<!-- Level::DrawToplevel:2544 -->
<!-- Level::DrawToplevel:2544 -->
<!-- Level::DrawToplevel:2548 -->
<!-- Level::DrawToplevel:2549 -->
<!-- LevelMgr::DoParseLevels:5194 -->
<!-- LevelMgr::GetZoneName:5457 -->
<!-- LevelMgr::GetZoneName:5458 -->
<!-- LevelMgr::GetZoneName:5459 -->
<!-- LevelMgr::GetZoneName:5460 -->
<!-- LevelMgr::GetZoneName:5461 -->
<!-- LevelMgr::GetZoneName:5462 -->
<!-- LevelMgr::GetZoneName:5463 -->
<!-- LevelMgr::GetTerseZoneName:5476 -->
<!-- LevelMgr::GetTerseZoneName:5477 -->
<!-- LevelMgr::GetTerseZoneName:5478 -->
<!-- LevelMgr::GetTerseZoneName:5479 -->
<!-- LevelMgr::GetTerseZoneName:5480 -->
<!-- LevelMgr::GetTerseZoneName:5481 -->
<!-- LevelMgr::GetTerseZoneName:5482 -->
<!-- File: Zuma2\LoadingScreen.cpp -->
<!-- LoadingScreen::Draw:1030 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1205 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1206 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1207 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1208 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1209 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1210 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1211 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1212 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1213 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1214 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1215 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1216 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1217 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1218 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1219 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1220 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1221 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1222 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1223 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1224 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1225 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1226 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1227 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1228 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1229 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1230 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1231 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1232 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1233 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1234 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1235 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1236 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1237 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1238 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1239 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1241 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1242 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1243 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1244 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1245 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1246 -->
<!-- LoadingScreen::LoadingTextContainer::LoadingTextContainer:1247 -->
<!-- File: Zuma2\MainMenu.cpp -->
<!-- MainMenu::Init:549 -->
<!-- MainMenu::DialogButtonDepress:1014 -->
<!-- MainMenu::DialogButtonDepress:1014 -->
<!-- MainMenu::ButtonDepress:1229 -->
<!-- MainMenu::ButtonDepress:1242 -->
<!-- MainMenu::ButtonDepress:1257 -->
<!-- MainMenu::ButtonDepress:1257 -->
<!-- MainMenu::ButtonDepress:1272 -->
<!-- MainMenu::ButtonDepress:1272 -->
<!-- MainMenu::ButtonDepress:1319 -->
<!-- MainMenu::ButtonDepress:1323 -->
<!-- MainMenu::ButtonDepress:1325 -->
<!-- MainMenu::ButtonDepress:1327 -->
<!-- MainMenu::DoChangeUserDialog:1393 -->
<!-- MainMenu::ButtonMouseEnter:1903 -->
<!-- MainMenu::ButtonMouseEnter:1917 -->
<!-- MainMenu::ButtonMouseEnter:1918 -->
<!-- MainMenu::ButtonMouseEnter:1922 -->
<!-- MainMenu::ButtonMouseEnter:1924 -->
<!-- MainMenu::ButtonMouseEnter:1926 -->
<!-- MainMenu::ButtonMouseEnter:1929 -->
<!-- MainMenu::ButtonMouseEnter:1933 -->
<!-- MainMenu::Draw:2066 -->
<!-- MainMenu::Draw:2066 -->
<!-- MainMenu::Draw:2068 -->
<!-- MainMenu::Draw:2218 -->
<!-- MainMenu::Draw:2221 -->
<!-- MainMenu::Draw:2226 -->
<!-- MainMenu::Draw:2246 -->
<!-- MainMenu::Draw:2251 -->
<!-- MainMenu::Draw:2255 -->
<!-- MainMenu::Draw:2256 -->
<!-- MainMenu::Draw:2260 -->
<!-- MainMenu::Draw:2261 -->
<!-- MainMenu::DrawCupInfo:2280 -->
<!-- MainMenu::DrawCupInfo:2288 -->
<!-- MainMenu::PopAnimStopped:2373 -->
<!-- MainMenu::PopAnimStopped:2374 -->
<!-- MainMenu::PopAnimStopped:2375 -->
<!-- MainMenu::PopAnimStopped:2376 -->
<!-- MainMenu::PopAnimStopped:2377 -->
<!-- MainMenu::DoChangeUserDialog:1394 -->
<!-- MainMenu::DoChangeUserDialog:1395 -->
<!-- File: Zuma2\MapScreen.cpp -->
<!-- MapScreen::Init:367 -->
<!-- MapScreen::Init:367 -->
<!-- MapScreen::Init:368 -->
<!-- MapScreen::Init:381 -->
<!-- MapScreen::Init:427 -->
<!-- MapScreen::Init:432 -->
<!-- MapScreen::Init:436 -->
<!-- MapScreen::Init:436 -->
<!-- MapScreen::Init:437 -->
<!-- MapScreen::Init:437 -->
<!-- MapScreen::Init:442 -->
<!-- MapScreen::Init:442 -->
<!-- MapScreen::Init:446 -->
<!-- MapScreen::Init:446 -->
<!-- MapScreen::MouseUp:674 -->
<!-- MapScreen::Draw:1269 -->
<!-- MapScreen::Draw:1273 -->
<!-- File: Zuma2\OptionsDialog.cpp -->
<!-- Line 29 -->
<!-- Line 32 -->
<!-- Line 36 -->
<!-- Line 37 -->
<!-- Line 38 -->
<!-- Line 39 -->
<!-- Line 40 -->
<!-- Line 41 -->
<!-- Line 44 -->
<!-- Line 45 -->
<!-- Line 46 -->
<!-- OptionsDialog::SliderVal:203 -->
<!-- OptionsDialog::SliderVal:205 -->
<!-- OptionsDialog::SliderVal:207 -->
<!-- OptionsDialog::CheckboxChecked:249 -->
<!-- OptionsDialog::CheckboxChecked:274 -->
<!-- OptionsDialog::CheckboxChecked:274 -->
<!-- OptionsDialog::CheckboxChecked:278 -->
<!-- OptionsDialog::CheckboxChecked:288 -->
<!-- OptionsDialog::CheckboxChecked:300 -->
<!-- OptionsDialog::CheckboxChecked:300 -->
<!-- OptionsDialog::CheckboxChecked:306 -->
<!-- OptionsDialog::CheckboxChecked:323 -->
<!-- OptionsDialog::CheckboxChecked:328 -->
<!-- OptionsDialog::CheckboxChecked:338 -->
<!-- OptionsDialog::CheckboxChecked:350 -->
<!-- OptionsDialog::CheckboxChecked:361 -->
<!-- OptionsDialog::ButtonDepress:406 -->
<!-- OptionsDialog::ButtonDepress:408 -->
<!-- OptionsDialog::ButtonDepress:410 -->
<!-- OptionsDialog::ButtonDepress:413 -->
<!-- OptionsDialog::ButtonDepress:413 -->
<!-- OptionsDialog::ButtonDepress:413 -->
<!-- File: Zuma2\TikiTemple.cpp -->
<!-- TikiTemple::SetupIronFrogText:240 -->
<!-- TikiTemple::SetupIronFrogText:247 -->
<!-- TikiTemple::SetupIronFrogText:248 -->
<!-- TikiTemple::SetupIronFrogText:255 -->
<!-- TikiTemple::SetupIronFrogText:256 -->
<!-- TikiTemple::SetupIronFrogText:263 -->
<!-- TikiTemple::SetupIronFrogText:264 -->
<!-- TikiTemple::SetupIronFrogText:271 -->
<!-- TikiTemple::SetupIronFrogText:279 -->
<!-- TikiTemple::SetupIronFrogText:287 -->
<!-- TikiTemple::SetupIronFrogText:298 -->
<!-- TikiTemple::SetupIronFrogText:298 -->
<!-- TikiTemple::SetupIronFrogText:305 -->
<!-- TikiTemple::SetupMiscText:324 -->
<!-- TikiTemple::SetupMiscText:331 -->
<!-- TikiTemple::SetupMiscText:339 -->
<!-- TikiTemple::SetupMiscText:347 -->
<!-- TikiTemple::SetupMiscText:355 -->
<!-- TikiTemple::SetupMiscText:363 -->
<!-- TikiTemple::SetupMiscText:371 -->
<!-- TikiTemple::SetupMiscText:379 -->
<!-- TikiTemple::SetupMiscText:387 -->
<!-- TikiTemple::SetupMiscText:395 -->
<!-- TikiTemple::SetupMiscText:403 -->
<!-- TikiTemple::SetupMiscText:411 -->
<!-- TikiTemple::SetupMiscText:421 -->
<!-- TikiTemple::SetupMiscText:429 -->
<!-- TikiTemple::SetupMiscText:450 -->
<!-- TikiTemple::SetupMiscText:451 -->
<!-- TikiTemple::SetupMiscText:451 -->
<!-- TikiTemple::SetupMiscText:458 -->
<!-- TikiTemple::SetupMiscText:466 -->
<!-- TikiTemple::SetupMiscText:474 -->
<!-- TikiTemple::SetupMiscText:485 -->
<!-- TikiTemple::SetupMiscText:496 -->
<!-- TikiTemple::SetupMiscText:504 -->
<!-- TikiTemple::SetupMiscText:512 -->
<!-- TikiTemple::SetupMiscText:520 -->
<!-- TikiTemple::SetupChallengeText:539 -->
<!-- TikiTemple::SetupChallengeText:546 -->
<!-- TikiTemple::SetupChallengeText:569 -->
<!-- TikiTemple::SetupChallengeText:577 -->
<!-- TikiTemple::SetupChallengeText:599 -->
<!-- TikiTemple::SetupChallengeText:600 -->
<!-- TikiTemple::SetupChallengeText:607 -->
<!-- TikiTemple::SetupChallengeText:608 -->
<!-- TikiTemple::SetupChallengeText:615 -->
<!-- TikiTemple::SetupChallengeText:616 -->
<!-- TikiTemple::SetupChallengeText:623 -->
<!-- TikiTemple::SetupChallengeText:634 -->
<!-- TikiTemple::SetupChallengeText:641 -->
<!-- TikiTemple::SetupAdventureText:662 -->
<!-- TikiTemple::SetupAdventureText:662 -->
<!-- TikiTemple::SetupAdventureText:669 -->
<!-- TikiTemple::SetupAdventureText:677 -->
<!-- TikiTemple::SetupAdventureText:678 -->
<!-- TikiTemple::SetupAdventureText:685 -->
<!-- TikiTemple::SetupAdventureText:686 -->
<!-- TikiTemple::SetupAdventureText:693 -->
<!-- TikiTemple::SetupAdventureText:701 -->
<!-- TikiTemple::SetupAdventureText:721 -->
<!-- TikiTemple::SetupAdventureText:729 -->
<!-- TikiTemple::SetupAdventureText:737 -->
<!-- TikiTemple::SetupAdventureText:748 -->
<!-- TikiTemple::SetupAdventureText:748 -->
<!-- TikiTemple::SetupAdventureText:755 -->
<!-- TikiTemple::SetupAdventureText:756 -->
<!-- TikiTemple::SetupAdventureText:756 -->
<!-- TikiTemple::SetupAdventureText:763 -->
<!-- File: Zuma2\ZumaTip.cpp -->
<!-- ZumaTip::Draw:263 -->
<!-- !AUTOGEN -->
Unused Code#
3D Object Loader#
A function called Load3DObject is present in the executable, which has later been renamed to Load3DMesh in Prime, PopCap's multiplatform revision of their engine. It loads P3D files that only were used in the Bejeweled series beyond 2, despite being engine-specific code. Perhaps it was carried over from Bejeweled Twist's engine revision.
Resource Generator 2#
|
|
To do: |
There is code for executing a program called ResourceGen2.exe in ..\..\..\..\..\bin. It's possible it relates to resprops\resprops.txt as well as properties\resources.xml.
Oddities#
Debug Boss Naming#
IMAGE_LEVELS_DEBUGBOSS6PART5_BKGRND
IMAGE_LEVELS_DEBUGBOSS6PART5_CHUTE1
IMAGE_LEVELS_DEBUGBOSS6PART5_CHUTE2
IMAGE_LEVELS_DEBUGBOSS6PART5_CHUTE3
IMAGE_LEVELS_DEBUGBOSS6PART3_BKGRND
IMAGE_LEVELS_DEBUGBOSS6PART3_CHUTE1
IMAGE_LEVELS_DEBUGBOSS6PART3_CHUTE2
IMAGE_LEVELS_DEBUGBOSS6PART3_CHUTE3
IMAGE_LEVELS_DEBUGBOSS6PART3_CHUTE4
IMAGE_LEVELS_DEBUGBOSS6PART3_CHUTE5
IMAGE_LEVELS_DEBUGBOSS6PART2_BKGRND
IMAGE_LEVELS_DEBUGBOSS6PART2_CHUTE1
IMAGE_LEVELS_DEBUGBOSS6PART2_CHUTE2
The rest of the final bosses have debug in their internal resource names, despite being used. In the WP7 version, this was corrected.
Internal Project Name#
|
|
This needs some investigation. |
The internal name of the game is Zuma2, most likely Zuma 2 Deluxe.
|
The Zuma series | |
|---|---|
|
Windows |
|
|
Mac OS X |
|
|
Adobe Flash |
Zuma • Zuma High Speed Challenge! • Zuma's Revenge! • Zuma Blitz: Kroakatoa Island |
|
Nintendo DS |
|
|
PlayStation 3, Xbox 360 |
Zuma's Revenge! (Prototype) |
|
PopCap Loader |
|