Modding a game is fun and it can also teach you some important skills. In this thread I'd like to talk about modding Zuma Deluxe.
From this post, you can find out how to:
* Edit graphics of Zuma Deluxe
* Add extra covers to levels
* Change level specifications
* Create levels with three skulls
* Change ingame music
* Alter coin spwaning spots
* Determine player frog position on the screen
* Change level order in Adventure Mode and Gauntlet Mode
* Add more levels to choose in the Gauntlet mode
In the very beginning, you should make a backup copy of the whole Zuma Deluxe folder - therefore if something goes wrong, you can bring back the original files.
Let's start with graphics. Images for levels are kept within the "levels" subfolder, whether all other graphics are kept within the "images" subfolder. While editing them, you must pay lots of attention to their formats (Zuma uses gif's, jpg's and png's). Also, note that almost every image has its black and white equivalent - for example "SMALLFROGonpad.gif" and "_SMALLFROGonpad.gif" (note the "_" in the beginning). The image without the "_" sign in the beginning of its filename is the actual graphic of a given object. The image with the "_" sign in the beginning of its filename defines which parts of the graphic are transparent. White - this is visible in game. Black - this is invisible in the game. Gray - this is partially transparent in the game. When editing graphics, you must remember to edit BOTH images, otherwise your graphics won't look correctly ingame.
When editing graphics for levels, you can let your imagination run. However, there are certain useful hints to know when doing so. For example, you can add covers to your levels or make levels with many curves of balls. To do so, open the "levels.xml" file in the "levels" subfolder" with a notepad. For every level, you will see similar description, as below:
<Graphics id="underover" curve="underover" image="underover" dispname="Mud Slide" gx="334" gy="247">
<Cutout image="left" pri="1" x="0" y="118" />
<Cutout image="right" pri="1" x="311" y="0" />
<TreasurePoint x="76" y="431" dist1="32" />
<TreasurePoint x="590" y="437" dist1="50" />
<TreasurePoint x="584" y="100" dist1="60" />
</Graphics>
Let's discuss each part of this piece of code, from the very beginning:
Graphics id="underover"
The above indicates which level it refers to. Note that these names are different than those displayed in-game, for example "underover" stands for the level "Mud Slide". You can find all level names in the "levels" folder.
curve="underover"
The above determines the curves used in the level. Curve is the whole track that balls will take and it always ends with a skull. You unfortunately can't edit the curves themselves. Sometimes the level has two curves and this part of the code looks like this:
curve="blackswirley-1" curve2="blackswirley-2"
You can add up to three curves to a level. For example:
curve="space" curve2="spacee" curve3="spaceee"
The curve files must be all within level's folder. You may copy curve files from other levels to another level and then change this part of the code, so that there are names of those curves within quotation marks.
You level will then contain three curves. Cool, huh?
Let's look at the next part of the code:
image="underover"
This simply determines the image used as level's background. The image must be within the given level's folder, obviously.
dispname="Mud Slide"
The above tells how the level will be named in-game.
gx="334" gy="247"
The above determines where the player frog will be positioned. The bigger the number in "gx" the more the player frog will be positioned to the right. The bigger the number in "gy" the more the player frog will be positioned to the lower part of the screen. The numbers determine the exact pixel of the postion of frog's center. Maximum value for gx="640" and for "gy=480".
<Cutout image="left" pri="1" x="0" y="118" />
The above is optional and will only appear for level which have covers. You can always add a line of code like this to any level.
Cutout image="left"
This determines the name of an image used as a cover. The image has to be in gif format and it has to be in the shades of gray. And it's filename HAS to start with the "_" symbol which is to be OMITTED in the code. The above example refers to an image called "_left.gif" even though in the code it only says "left".
pri="1"
The above value can be either "0", "1" or "2" and determines a "layer", that is, which balls will go under the cover and which will go above it. "0" means all balls go above the cover (therefore the cover is technically non-existant, except that it can hide the skull). "1" means that balls in the first half of the curve will go under the cover and balls in the second half of the curve will go above it (this is clearly seen in a level like "Mud Slide"). "2" means all balls go under the cover.
x="0" y="118"
This determines the position of the cover image. The "x" determines the position of the uppermost and leftmost pixel of your cover image on the horizontal axis. "y" does the same for vertical axis. To avoid tedious search for the correct pixel, you can make you cover image full-sized (640x480) and leave both those values at "0".
Now for the last part: location of coins.
<TreasurePoint x="76" y="431" dist1="32" />
The "x" determines the position of the coin on the horizontal axis and "y" determines the vertical axis.
dist1="32" determines the percentage of curve that has to be full of balls to allow a coin appear in the given spot. In the above example, the coin will only appear when the balls have reached 32% of the whole track. This is to avoid coins from spawning in too easy locations.
EDIT: Additional levels
Adding an extra level to the game is not difficult. In the levels.xml file you need to copy the whole information of any level, for instance:
<Graphics id="underover" curve="underover" image="underover" dispname="Mud Slide" gx="334" gy="247">
<Cutout image="left" pri="1" x="0" y="118" />
<Cutout image="right" pri="1" x="311" y="0" />
<TreasurePoint x="76" y="431" dist1="32" />
<TreasurePoint x="590" y="437" dist1="50" />
<TreasurePoint x="584" y="100" dist1="60" />
</Graphics>
Now, change Graphics id="underover" to anything you want, for example: Gaphics id="mylevel"
In the "levels" folder create a new subfolder with the selected name.
Your level may consist of tracks used in other levels (creating own tracks is not possible yet). You can edit its code just as normal.
However, your level won't appear in the Gauntlet Mode until it has been unlocked via Adventure Mode. Therefore, you need to scroll down the levels.xml file till you see: <StageProgression
Now, change:
stage1 = "spiral,claw,riverbed,targetglyph,blackswirley"
to:
stage1 = "
mylevel,claw,riverbed,targetglyph,blackswirley"
Save the file and run the game. Start the first temple of adventure mode and you should see your own level! It will be listed as the last level in Gauntlet Mode as well.
Now that you know how to edit properties of individual levels, we will look at the whole sequence of levels. Scroll the "levels.xml" file till you see:
<LevelProgression
id="dual"
settings="dual1,dual2,dual3,dual4,dual5,dual6,dual7,dual8,dual9,dual10,dual11,dual12,dual13,dual14,dual15,dual16,dual17,dual18,dual19,dual20,dual21,dual22,dual23,dual24"
difficulty="4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27"
/>
<LevelProgression
id="standard"
settings="level1,level2,level3,level4,level5,level6,level7,level8,level9,level10,level11,level12,level13,level14,level15,level16,level17,level18,level19,level20,level21,level22,level23,level24,level25,level26,level27,level28,level29,level30"
difficulty="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30"
/>
<Level graphics="spiral" progression="standard" />
<Level graphics="riverbed" progression="standard" />
<Level graphics="targetglyph" progression="standard" />
<Level graphics="tunnellevel" progression="standard" />
<Level graphics="groovefest" progression="standard" />
<Level graphics="blackswirley" progression="dual" />
<Level graphics="snakepit" progression="dual" />
<Level graphics="serpents" progression="dual" />
<Level graphics="longrange" progression="standard" />
<Level graphics="tiltspiral" progression="standard" />
<Level graphics="underover" progression="standard" />
<Level graphics="claw" progression="standard" />
<Level graphics="triangle" progression="standard" />
<Level graphics="inversespiral" progression="standard" />
<Level graphics="loopy" progression="standard" />
<Level graphics="turnaround" progression="standard" />
<Level graphics="squaresville" progression="standard" />
<Level graphics="warshak" progression="standard" />
<Level graphics="overunder" progression="standard" />
<Level graphics="spaceinvaders" progression="standard" />
<Level graphics="coaster" progression="standard" />
<Level graphics="space" progression="standard" />
<!--
L1 = spiral,claw,riverbed,targetglyph,blackswirley,turnaround,longrange
L2 = tiltspiral,underover,warshak,loopy,snakepit,groovefest,spaceinvaders
L3 = triangle,coaster,squaresville,tunnellevel,serpents,overunder,inversespiral
-->
<StageProgression
stage1 = "spiral,claw,riverbed,targetglyph,blackswirley"
diffi1 = "lvl11,lvl12,lvl13,lvl14,lvl15"
stage2 = "tiltspiral,underover,warshak,loopy,snakepit"
diffi2 = "lvl21,lvl22,lvl23,lvl24,lvl25"
stage3 = "triangle,coaster,squaresville,tunnellevel,serpents"
diffi3 = "lvl31,lvl32,lvl33,lvl34,lvl35"
stage4 = "spiral,claw,riverbed,targetglyph,blackswirley,turnaround"
diffi4 = "lvl41,lvl42,lvl43,lvl44,lvl45,lvl46"
stage5 = "tiltspiral,underover,warshak,loopy,snakepit,groovefest"
diffi5 = "lvl51,lvl52,lvl53,lvl54,lvl55,lvl56"
stage6 = "triangle,coaster,squaresville,tunnellevel,serpents,overunder"
diffi6 = "lvl61,lvl62,lvl63,lvl64,lvl65,lvl66"
stage7 = "spiral,claw,riverbed,targetglyph,blackswirley,turnaround,longrange"
diffi7 = "lvl71,lvl72,lvl73,lvl74,lvl75,lvl76,lvl77"
stage8 = "tiltspiral,underover,warshak,loopy,snakepit,groovefest,spaceinvaders"
diffi8 = "lvl81,lvl82,lvl83,lvl84,lvl85,lvl86,lvl87"
stage9 = "triangle,coaster,squaresville,tunnellevel,serpents,overunder,inversespiral"
diffi9 = "lvl91,lvl92,lvl93,lvl94,lvl95,lvl96,lvl97"
stage10 = "spiral,claw,riverbed,targetglyph,blackswirley,turnaround,longrange"
diffi10 = "lvl101,lvl102,lvl103,lvl104,lvl105,lvl106,lvl107"
stage11 = "tiltspiral,underover,warshak,loopy,snakepit,groovefest,spaceinvaders"
diffi11 = "lvl111,lvl112,lvl113,lvl114,lvl115,lvl116,lvl117"
stage12 = "triangle,coaster,squaresville,tunnellevel,serpents,overunder,inversespiral"
diffi12 = "lvl121,lvl122,lvl123,lvl124,lvl125,lvl126,lvl127"
stage13 = "space"
diffi13 = "lvl131"
/>
<!-- Easy Stage Progression -->
<!--
<StageProgression
stage1 = "spiral,claw,riverbed,targetglyph,blackswirley"
diffi1 = "1,1,1,1,1"
stage2 = "tiltspiral,underover,warshak,loopy,snakepit"
diffi2 = "2,2,2,2,3"
stage3 = "triangle,coaster,squaresville,tunnellevel,serpents"
diffi3 = "3,3,3,3,4"
stage4 = "spiral,claw,riverbed,targetglyph,blackswirley,turnaround"
diffi4 = "2,2,2,2,2,3"
stage5 = "tiltspiral,underover,warshak,loopy,snakepit,groovefest"
diffi5 = "3,3,3,3,3,4"
stage6 = "triangle,coaster,squaresville,tunnellevel,serpents,overunder"
diffi6 = "4,4,4,4,4,5"
stage7 = "spiral,claw,riverbed,targetglyph,blackswirley,turnaround,longrange"
diffi7 = "3,3,3,3,3,3,4"
stage8 = "tiltspiral,underover,warshak,loopy,snakepit,groovefest,spaceinvaders"
diffi8 = "4,4,4,4,4,4,5"
stage9 = "triangle,coaster,squaresville,tunnellevel,serpents,overunder,inversespiral"
diffi9 = "5,5,5,5,5,5,6"
/>
In here you are able to change the level progression to your own fancy. You can also add and remove levels from stages. You can change their difficulty, points required to beat the level, speed of balls, change between dual or standard progression (triple progression is not allowed; for your triple levels just use dual progression) and play with many more specifications of the levels. Most of them are self-explanatory, just play with different values to see the outcome. Just make sure to create a backup copy the "levels.xml" file, so that if something goes wrong, you will be able to reverse it.
Let's move on to the sound part. Firstly - music.
The most important thing to remember is that Zuma Deluxe uses mo3 file format for storing music data. Which is quite unfortunate, as mo3 is not a common format and may require some explanation. If you're struggling to use your own songs in Zuma Deluxe, I made an instruction on this topic:
spherematchers.proboards.com/thread/61/change-music-zuma-deluxeNow for the soundeffects. In the game folder, you may find two subfolder with soundeffects: "cached" and "sounds". You should ONLY replace soundeffects within the "sounds" folder - leave the "cached" soundeffects intact! Then, you can replace existing ones with your own. Sometimes conversion to a supported format may be necessary - do that if your soundeffect is not working or if the game crashes upon you have changed a sound effect.
I think that's all for now. There's much more you can do, but I'm sure you'll find it out yourself
Please make comments and if you find something unclear, ask questions below - I'll gladly respond to them all.
Also, if you're looking for living examples of modded Zuma Deluxe versions, check out this thread:
spherematchers.proboards.com/thread/53/zuma-modsYou may also give my own mod a try - look it up here:
spherematchers.proboards.com/thread/38/zumaluxor-mod