If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Zuma's Revenge! (Windows)

From The Cutting Room Floor
Jump to navigation Jump to search

Title Screen

Zuma's Revenge!

Developer: PopCap Games
Publisher: PopCap Games
Platforms: Windows, Mac OS X
Released in US: September 15, 2009


CodeIcon.png This game has unused code.
DevTextIcon.png This game has hidden development-related text.
SoundIcon.png This game has unused sounds.
TextIcon.png This game has unused text.
DebugIcon.png This game has debugging material.


So very stubbly.
This page is rather stubbly and could use some expansion.
Are you a bad enough dude to rescue this article?
Hmmm...
To do:
  • Figure out the HUGE boss-related settings.
  • Mac version has uncompiled effects in the effects directory, they are technically used by it but are they worth mentioning?
  • Look at executable strings to see if all interesting strings were found.
  • Enable and use the debug console if possible.
  • There are apparently unused music in zuma.mo3 file.
  • Look at test, jeff and ben level files, most likely curve binary tests for and/or made by said developers Jeff Weinstein and Ben Lyon.
  • 0042FFE4 of v1.0.4.9495 is a flag referencing a debug powerup frequency file, setting it to 1 displays text.
  • If possible, make the alternative crash reporter code work and remove the related text dump.

Zuma's Revenge! is the sequel to the previous ball shooter puzzle game from PopCap, with enhanced visuals and high definition graphics!

Development Leftovers

DevTextIcon.png
LevelArchive folder
A LOT of development leftovers, including MANY levels, even from the first game!

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

Hmmm...
To do:
Get screenshots of these levels in the game, check if these values are correct.

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

ZumasRevenge Jungle9-all.png

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

512px

Pretty much a copy of Fossil Food with both curves in one file, exact same layout.

TODO

IronFrog8-all

512px

Pretty much a copy of Web Two Point Oh with both curves in one file, exact same layout.

TODO

City10-all

512px

Pretty much a copy of Double Danger with both curves in one file, exact same layout.

Grotto10-all

512px

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

ZumasRevenge boss1test2.png

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

ZumasRevenge boss1test3.png

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

ZumasRevenge boss1test4.png

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

ZumasRevenge boss1test5.png

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

ZumasRevenge boss1test6.png

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

ZumasRevenge boss1test7.png

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

ZumasRevenge boss1test8.png

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

ZumasRevenge boss1test8v2.png

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

ZumasRevenge boss1test8v3.png

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

ZumasRevenge boss1test8v4.png

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

ZumasRevenge boss1test8v5.png

A slight modification of boss1test8v4.dat, version 14. Not defined so the XML parameters are lost.

boss1/boss1test8v6.dat

ZumasRevenge boss1test8v6.png

Seems to be based off boss1test8v3.dat, version 14. Not defined so the XML parameters are lost.

boss1/boss1test9.dat

ZumasRevenge boss1test9.png

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

ZumasRevenge boss1test9v2.png

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

ZumasRevenge boss1v2.png

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

ZumasRevenge boss1v3.png

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

ZumasRevenge boss1v4.png

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

Hmmm...
To do:
Some functions of the game have swears.

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.

Hmmm...
To do:
There's a function to convert level data.
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:
<Difficulty time="18000" colors="6" speed=".85" startdist="50" zumascore="1550" ballrepeat="37" powerup="560" rollback="50" dangerratio="2.5" maxclumps="2" maxsingles="6" rollbackduration="0"/>
<Difficulty time="20000" colors="6" speed=".88" startdist="50" zumascore="1550" ballrepeat="37" powerup="550" rollback="50" dangerratio="2.4" maxclumps="2" maxsingles="6" rollbackduration="0"/>
<Difficulty time="22000" colors="6" speed=".92" startdist="50" zumascore="1550" ballrepeat="36" powerup="550" rollback="50" dangerratio="2.4" maxclumps="2" maxsingles="6" rollbackduration="0"/>
<Difficulty time="24000" colors="6" speed=".96" startdist="50" zumascore="1550" ballrepeat="36" powerup="560" rollback="50" dangerratio="2.3" maxclumps="2" maxsingles="6" rollbackduration="0"/>
<Difficulty time="26000" colors="6" speed=".99" startdist="50" zumascore="1550" ballrepeat="35" powerup="570" rollback="50" dangerratio="2.3" maxclumps="2" maxsingles="7" rollbackduration="0"/>
<Difficulty time="28000" colors="6" speed="1.03" startdist="50" zumascore="1550" ballrepeat="35" powerup="580" rollback="50" dangerratio="2.1" maxclumps="2" maxsingles="7" rollbackduration="0"/>
<Difficulty time="30000" colors="6" speed="1.07" startdist="50" zumascore="1550" ballrepeat="34" powerup="590" rollback="50" dangerratio="1.9" maxclumps="2" maxsingles="7" rollbackduration="0"/>
<Difficulty time="32000" colors="6" speed="1.1" startdist="50" zumascore="1550" ballrepeat="34" powerup="600" rollback="50" dangerratio="1.8" maxclumps="2" maxsingles="7" rollbackduration="0"/>
Double curve levels:
<Difficulty time="18000" colors="6" speed="0.625" startdist="50" zumascore="1550" ballrepeat="36" powerup="500" rollback="50" dangerratio="2.1" maxclumps="3" maxsingles="5" rollbackduration="0"/>
<Difficulty time="20000" colors="6" speed="0.625" startdist="50" zumascore="1550" ballrepeat="35" powerup="480" rollback="50" dangerratio="1.9" maxclumps="2" maxsingles="5" rollbackduration="0"/>
<Difficulty time="22000" colors="6" speed="0.65" startdist="50" zumascore="1550" ballrepeat="34" powerup="460" rollback="50" dangerratio="1.9" maxclumps="2" maxsingles="5" rollbackduration="0"/>
<Difficulty time="24000" colors="6" speed="0.65" startdist="50" zumascore="1550" ballrepeat="34" powerup="450" rollback="50" dangerratio="1.85" maxclumps="2" maxsingles="5" rollbackduration="0"/>
<Difficulty time="26000" colors="6" speed="0.675" startdist="50" zumascore="1550" ballrepeat="34" powerup="460" rollback="50" dangerratio="1.8" maxclumps="2" maxsingles="5" rollbackduration="0"/>
<Difficulty time="28000" colors="6" speed="0.675" startdist="50" zumascore="1550" ballrepeat="34" powerup="470" rollback="50" dangerratio="1.75" maxclumps="2" maxsingles="5" rollbackduration="0"/>
<Difficulty time="30000" colors="6" speed="0.7" startdist="50" zumascore="1550" ballrepeat="34" powerup="480" rollback="50" dangerratio="1.7" maxclumps="2" maxsingles="5" rollbackduration="0"/>
<Difficulty time="32000" colors="6" speed="0.725" startdist="50" zumascore="1550" ballrepeat="34" powerup="490" rollback="50" dangerratio="1.65" maxclumps="2" maxsingles="5" rollbackduration="0"/>

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

Hmmm...
To do:
What does DDS for the game mean? It's obviously not meaning the term for textures of DirectX. 0042D139 in memory of final is interesting but crashes the game when set to 1 after either loading a level afterwards, clicking Menu or pausing the game. NOP'ing the related JNE enables the boss DDS window when pausing in all modes but is there a way to properly enable it? There's a boss DDS window too.

Curve Drawing

Unwelcoming Mat.

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

ZumasRevengeInGameDDSWindow.png

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.

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

Hmmm...
To do:
Check the Mac version.

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

Elementary, my dear Cactus.
This needs some investigation.
Discuss ideas and findings on the talk page.
Specifically: Ranidae in MacOS version source filepath, it roughly translates to "True Frog", would that be another?

The internal name of the game is Zuma2, most likely Zuma 2 Deluxe.