General Modding Resource

From Staredit Network Wiki
Jump to: navigation, search

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.

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.