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.