General Modding Resource
This is a compilation of several help threads, advice topics, and so on, with the purpose of letting people know how to make a successful mod.
Contents
IceCC Quick Tips
Identifying crashes
Here are some quick tips to help you out in common issues. I'll go from the absolute basics to a bit of guidelines. Here's how you can try to identify the source of a crash.
First off -
- if the game closes, as in completely shuts down, chances are this is a .dat error. Make sure your values are correct, ect.
- If you get a "Cbullet" error, this means you attempted to use mind control or another hardcoded spell as a weapon. This is not possible and unfortunately your changes will need to be altered not to use these types of abilities.
- If the game freezes up and you can alt-tab to an error message, it is very likely this is an iscript-related error, most likely related to either wait/playfram overlaps, or calling non-existent frames, or bad flingy/images.dat setups in relation to animations.
Iscript - Identifying an iscript crash
In iscript crashes, it is a general rule of thumb that most of the time, the unit or projectile that is causing an iscript crash has to be rendered to crash. This means that if you switch your view to something, and it crashes, that something is responsible. This can also be why the unstable something doesn't crash until you view to it; it's not actually being "rendered".
The most basic causes of animation crashes are things like this,
attackscript: playfram 0x00 wait1 attack playfram 0x11 gotorepeat eect
Why?
When it repeats, it is running two playframs at once. Gotorepeat and other goto commands do not count as "waits" so two playfram commands in the same "tick" can and will cause problems.
Another example. Of course I am not writing out actual opcodes.
Walk: playframe 0x00 wait 1 playframe 0x11 wait 1 playframe 0x22 wait 1 goto walk walktoidle: wait 1 playframe wait 1 playframe idle: playframe local00: wait 125 goto local00
You can see that even though these blocks may be sorted differently and look differently the same thing still applies. Sometimes waits called one after another can cause crashes, and playframs right after another will generally explode.
This is an example of the Heretic Wizard's script from AO. It is tested to be 100% stable. This guy disappears when he starts "moving", to simulate teleportation. He also has a forced "phase-in" so that he doesn't appear permanently invisible or other strangeness.
# ----------------------------------------------------------------------------- # # This is a decompile of the iscript.bin file 'data\scripts\iscript.bin' # created on: Fri Nov 16 13:35:47 2007 # ----------------------------------------------------------------------------- # # ----------------------------------------------------------------------------- # # This header is used by images.dat entries: # 013 MatureChrysalis (zerg\MatureChrysalis.grp) .headerstart IsId 47 Type 26 Init MatureChrysalisInit Death MatureChrysalisDeath GndAttkInit MatureChrysalisGndAttkInit AirAttkInit MatureChrysalisGndAttkInit SpAbility1 [NONE] GndAttkRpt MatureChrysalisGndAttkInit AirAttkRpt MatureChrysalisGndAttkInit SpAbility2 MatureChrysalisSpAbility2 GndAttkToIdle MatureChrysalisGndAttkToIdle AirAttkToIdle MatureChrysalisGndAttkToIdle SpAbility3 [NONE] Walking MatureChrysalisWalking Other MatureChrysalisWalkToIdle BurrowInit [NONE] ConstrctHarvst MatureChrysalisConstrctHarvst IsWorking [NONE] Landing [NONE] LiftOff [NONE] Unknown18 [NONE] Unknown19 [NONE] Unknown20 [NONE] Unknown21 [NONE] Unknown22 [NONE] Unknown23 [NONE] Unknown24 [NONE] Burrow MatureChrysalisBurrow UnBurrow MatureChrysalisUnBurrow Unknown27 [NONE] .headerend # ----------------------------------------------------------------------------- # MatureChrysalisInit: #imgul09 14 0 3 # MatureChrysalisShad (zerg\MatureChrysalis.grp) playfram 0x00 # frame set 0 waitrand 1 4 MatureChrysalisGndAttkToIdle: playfram 0xaa # frame set 0 wait 1 playfram 0xbb # frame set 1 wait 1 playfram 0xcc # frame set 2 wait 1 playfram 0xdd # frame set 1 wait 1 playfram 0xee # frame set 0 wait 1 playfram 0xff # frame set 1 wait 1 playfram 0x110 # frame set 2 wait 1 playfram 0x121 # frame set 1 wait 1 playfram 0x132 # frame set 2 wait 1 playfram 0x143 # frame set 1 wait 1 goto MatureChrysalisGndAttkToIdle MatureChrysalisWalkToIdle: #nobrkcodestart tmprmgraphicend playfram 0x1dc # frame set 0 wait 1 playfram 0x1cb # frame set 1 wait 1 playfram 0x1ba # frame set 2 wait 1 playfram 0x1a9 # frame set 3 wait 1 playfram 0x198 # frame set 4 wait 1 playfram 0x187 # frame set 5 wait 1 playfram 0x176 # frame set 6 wait 1 playfram 0x165 # frame set 7 wait 1 playfram 0x154 # frame set 4 wait 1 #nobrkcodeend ignorerest goto MatureChrysalisGndAttkToIdle MatureChrysalisDeath: playsnd 815 # Zerg\MatureChrysalis\ZDeDth00.WAV imgol08 214 0 0 playframno 0 wait 1 end MatureChrysalisGndAttkInit: #playframno 0 tmprmgraphicend playfram 0x00 # frame set 0 wait 1 playfram 0x11 # frame set 1 wait 1 playfram 0x22 # frame set 2 wait 1 playfram 0x33 # frame set 0 wait 1 playfram 0x44 # frame set 1 playsnd 110 # Bullet\zdeAtt00.wav attack25 1 wait 4 playfram 0x55 # frame set 2 wait 1 playfram 0x66 # frame set 0 wait 1 playfram 0x77 # frame set 1 wait 1 playfram 0x88 # frame set 2 wait 1 playfram 0x99 # frame set 0 wait 1 gotorepeatattk goto MatureChrysalisGndAttkToIdle MatureChrysalisSpAbility2: playfram 0x00 # frame set 0 nobrkcodestart wait 1 playfram 0x11 # frame set 1 wait 1 playfram 0x22 # frame set 2 wait 1 playfram 0x33 # frame set 0 wait 1 playfram 0x44 # frame set 1 playsnd 110 # Bullet\zdeAtt00.wav castspell wait 4 playfram 0x55 # frame set 2 wait 1 playfram 0x66 # frame set 0 wait 1 playfram 0x77 # frame set 1 wait 1 playfram 0x88 # frame set 2 wait 1 playfram 0x99 # frame set 0 wait 1 nobrkcodeend gotorepeatattk sigorder 2 goto MatureChrysalisGndAttkToIdle MatureChrysalisWalking: #nobrkcodestart playfram 0x154 # frame set 0 wait 1 playfram 0x165 # frame set 1 wait 1 playfram 0x176 # frame set 2 wait 1 playfram 0x187 # frame set 3 wait 1 playfram 0x198 # frame set 4 wait 1 playfram 0x1a9 # frame set 5 wait 1 playfram 0x1ba # frame set 6 wait 1 playfram 0x1cb # frame set 7 wait 1 playfram 0x1dc # frame set 4 wait 1 tmprmgraphicstart move 60 wait 1 move 60 wait 1 move 60 wait 1 move 60 wait 1 move 60 wait 1 move 60 tmprmgraphicend playfram 0x1dc # frame set 0 wait 1 playfram 0x1cb # frame set 1 wait 1 playfram 0x1ba # frame set 2 wait 1 playfram 0x1a9 # frame set 3 wait 1 playfram 0x198 # frame set 4 wait 1 playfram 0x187 # frame set 5 wait 1 playfram 0x176 # frame set 6 wait 1 playfram 0x165 # frame set 7 wait 1 playfram 0x154 # frame set 4 wait 1 #nobrkcodeend goto MatureChrysalisWalking MatureChrysalisConstrctHarvst: playfram 0x110 # frame set 16 goto local00 local00: wait 125 goto local00 MatureChrysalisBurrow: imgol08 423 0 0 # BurrowingDust (thingy\bDust.grp) playfram 0xcc # frame set 12 wait 1 playfram 0xdd # frame set 13 wait 1 playfram 0xee # frame set 14 wait 1 playfram 0xff # frame set 15 wait 1 playfram 0x110 # frame set 16 wait 1 sigorder 4 goto local00 MatureChrysalisUnBurrow: waitrand 1 5 imgul09 423 0 0 # BurrowingDust (thingy\bDust.grp) playfram 0xff # frame set 15 wait 1 playfram 0xee # frame set 14 wait 1 playfram 0xdd # frame set 13 wait 1 playfram 0xcc # frame set 12 wait 1 sigorder 4 goto MatureChrysalisGndAttkToIdle
Custom advice
Lord_agamemnon's advices
- Don't let Starcraft's scaling hold you down. Just because Starcraft scales resources in increments of 50 and generally has armies of a certain size as a result doesn't mean you have to stick with that. Look at Stratosphere, for instance--with Firegraft's exe edits, this is easier than ever.
- Just because that's how Starcraft plays doesn't mean that's how you mod has to play. Go on, try something different. Really, really different. Invent a whole new style of gameplay--think of Ascendancy, for example, with its levelling, or Ad Astras.
- Just because it's not a map doesn't mean you can't use triggers. Go crazy with .got triggers...as long as they don't use locations*, of course. And I don't just mean little changes: the triggers in Entropy's Edge are 1.1 MB and took a week to program!
(*: Locations can now be used thanks to Poiuy_Qwert's LocUnlock MPQDraft and FireGraft v0.93 plugin. BWAI thread.)
- Iscript, iscript, iscript. Iscripting is the most valuable modding skill simply because it's extremely useful and one of the few that's actually difficult. Get used to ICECC and Notepad, and learn to write, edit, and debug iscript code early. But...
- Don't get too carried away with fancy effects. In a "serious" mod, gameplay should always come before explosions and fancy animations. If you're just showing off or being silly (like in the Aetherflame Lord, or Doom Dragoon) then it's fine to have burning wheels of fire and uber-killer-attacks. But remember that gameplay is the main course and effects are dessert.
- KISS: Keep It Simple, Stupid. Your mod shouldn't be too complicated to learn. Admittedly, you can make things too simple, but it shouldn't be too complicated either. Tooltips go a long way towards remedying overcomplication, but tangled tech trees are still messy. I got Stratosphere by taking a concept (Missile Command) and seeing if I could fit all the main military units at one building!
- Balance. Do your absolute best to ensure that your mods are balanced. Eventually, there's nothing for this but playtesting, but try to figure it out as well as you can beforehand. One of the best ways to begin balance is to make sure every unit has a clearly defined role, and that it works best in that role. If your anti-infantry unit is killing buildings like they're going out of style, it's time to go back to the drawing board. See Project Miranda; people tell me it's one of the most balanced mods they're ever played.
- Everything worth having is worth working for. Like pimping, modding ain't easy. It takes a lot of work to learn the skills you need, and it takes just as much to finish a project. Don't give up, though. I spent six months each, on and off, on Project Miranda and Ad Astras. Ad Astras particularly took well over a hundred hours of work. But shoddy workmanship won't get you very far.
How to sell a mod?
Most of the things why people get angry is because their mods are never played. A reason for this is people considering others as recent starters I recommend staying away from assistance forums until you definately don't know how to solve the crash or bug. Posting a topic asking for help lowers your reputation, makes people think you're a newb and a spammer specially if after you post a topic and you solve the problem then you post another one.
If people think you're a newb they're bound to NOT play your mod.
Other remarkable problem is the lack of information. Modders usually get too excited when they're makign a new mod thus, making a whole topic to announce the production of it. But they don't have anything at all?
I recommend you to post the production thread until you're at least nearly 2 weeks from being done. People will ask questions provide suggestions you might take some or not. but most important of all your mod will be seen as something done and amazing and not something cheap and unstarted. Provide enough information, what the mod is about a background storyline if possible and keep the suspense to the people. Instead of posting everything you have you can prepare a movie with big explosions (people like explosions), cool effects, great armies and such. And post nothing more than the video. The interest of people for your mod will raise like you have no idea if you achieve this successfully.
Mod really weird things that no one has even bothered to do. Such as the console, the .bin files, the backgrounds and so on.
Use a lot of images. Images draw eyes instead of boring text. Make the production as graphically as possible.
It's simply the way you sell your mod that will get it played and downloaded.
Make it clean, simple, provide information, wake up people's interest on your mod and so.
Doesn't matter if your mod is not the best ever, it only matter how you sell it.