TOC
jDoom definitions tricks
    MD2 modelling tutorials
    Tools
    Monster states list
  
  
jDoom's definition tricks
  (Results of my hard experience)
  
  
1. If you use "Copy model", in next state after you're used Inter,
you should put "Inter = 0", or Inter value from pevious model frame will
be used (Don't forget, "Copy model" copies really ALL properties of previous
model frame, including "Inter"!)! 
      It is very important, because else you would be in big trouble: If
there no "Inter=0" frame, Doomsday just silently going crazy, and you'll
get nice things, like monster models stretched from their location right
to your face, or chaotically shaking instead of moving properly.
      So, don't confuse Doomsday! Set Inter to 0, like in this example:
  
CORRECT:
  Copy Model {State = "CYBER_DIE3";
                       Md2 {frame = "die3";};}
  Copy Model {Inter = 0.5;
                        Md2 {frame = "die34";};}
  Copy Model {State = "CYBER_DIE4";
                        Inter = 0;
                        Md2 {frame = "die4";};}
  WRONG:
  Copy Model {State = "CYBER_DIE3";
                       Md2 {frame = "die3";};}
  Copy Model {Inter = 0.5;
                        Md2 {frame = "die34";};}
  Copy Model {State = "CYBER_DIE4";
                        Md2 {frame = "die4";};} #Inter = 0.5 will
be used... Crash!
  
  2. Watch carefully, that DED file not ends with comment! In this
case, comment-skipping code wil just enter infinite loop, and you'll guess
endlessly, why Doomsday hangs at startup...
  
MD2 modeling tutorials
  http://www.loonygames.com/content/1.13/totb/
  http://www.geocities.com/darinp52/qtip/index.html
  http://www.planetquake.com/polycount/cottages/shadokat/q2mtut.html
  http://www.planetquake.com/polycount/articles/Steed-gdc99/steed-gdc99-1.shtml
  (comment: don't use "weld vertexes" in Q2Modeller - it works incorrectly
there, and not deletes any vertices or polygons but just "glues" them together...
and use SkyJake's md2tool to delete double vertices. you also can use md2tool
to decrease polycount of your model)
  
http://www.planetquake.com/polycount/resources/quake2/tutorials.shtml
  
Tools
  (If some link here will appear broken - please, 
tell me, I'll correct
it.)
At first, the SkyJake's md2tool
  (search for it at DHQ)
  Can convert MD2s to DMDs and automatically decrease polcount - a "must
have" thing!                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  
      I'm still a newbie in OpenGL programming, so this program probably
may do many merry things, including system crashes or OpenGL driver lockups
- use it with caution.
      Also it cannot read PCX skins in old format (those from initial ZDoom
model pack) and cannot use skins which dimensions are not power of 2 (Doomsday
can) 
      And it still cannot view multiple MD2s at once (i.e. you cannot view
multipart monsters) - i will correct this in the future.
  
  
A
level, containing things of all types (MAP01)  (has one bug: the only
type of things that it DOES NOT CONTAIN is Revenant).
  
   - For easy per-vertex editing of skin mapping. 
  
  
Warning: at startup it always tries to load model, on which you're
worked last, and may crash if you've removed that file, or it has no skins
defined, or wrong size of skin - use Q2Modeller to correct skin sizes and
file names
  
   - can properly display skins with any palette, but cannot play model animation.
   - cannot properly display skins with palette other than one of Quake2,
but can play model animation (on any speed and with inter-frame interpolation)
  
  
  
Severe bugs list:
  1. (Nasty) After you rotated 3d-view, each first attempt to move vertices
forces them to "jump" in a random direction. Watch out, and hold your fingers
over Ctrl-Z keys (undo). Second attempt always works well.
  2. (Dangerous) Often crashes at deleting vertices (especially if 3d view
is set to "textured")
  3. (Dangerous) Sometimes crashes at switching 3d-view to "Textured", and
often crashes at loading model if 3d view is set to "textured".
  4. (Dangerous) in v0.91, attempt to play animation writes some frames over
other ones - DON'T TRY USING IT!  Use only in v0.90.
  5. (Dangerous) in v0.91, loading reference model causes frame #0 to be
replaced with some other frame. 
  6. (Annoying) At exporting MD2, you each time must select all skins that
model uses. 
  7. (Disadvantage) AQM files (native Q2Modeller's format, that not adds
quantization errors, and MUST be used for saving the work-in-progress) from
v0.90 and v.091 are not compatible...  :(
  
  
  
Important keys:
  Shift: pan views (synchronously, and it's great!)  or rotate 3d-view
by left mouse button, or zoom views by right mouse button. 
  Also, when pressing "shift" you can drag the view's border (clicking on
central intersection), thus resizing wiews.
  
Alt: substractive selection mode (else additive)
  
  
Tips
  1. 3d view is always aimed at point, defined by center position of 2d views,
and rotates around this point. Great for aiming at part of the model, and
rotating around it!
  2. To copy part of one model to another model, you may copy-load-paste
(unfortunately, Q2Modeler not uses Windows clipboard)
  3. There is a great thing: support of reference models (good for synchronising
multipart models), but it works properly only if all numbers, names and total
number of frames in both models are equal. And often crashes at loading of
reference model - be careful, save often (.AQM, of course, to not accumulate
quantization distortions)
  
  
Warnings:
  1. Make sure, that "base path" in "directories" settings is set to folder,
containing model that you currently editing (to leave skin path empty), or
jDoom will not find skins.
  2. option "weld vertices" don't makes one vertex from them, and don't deletes
faces using them! It just sets same coordinates for them - so be careful,
don't spawn "triple" vertices and zero-size triangles, that will just unnecessarily
strain the game engine
  
  - much worse than Q2Modeller, but knows a lot of file formats, and has
ability of skeletal animation. It is 30-day shareware with very good crack
protection.
  A good tutorial about how to use MilkShape for skeletal animation may be
found somewhere on the 
polycount
website.
  
  
Warnings:
  1. Cannot import animated model. Can import only single frame - you should
made full skeletal animation yourself.
  2. Exported MD2s couldn't be instantly used by jDoom, they are rotated
90degrees clockwise and haven't skins defined. You should open such MD2 in
Q2Modeller, rotate (use "Effect frame range" to rotate all frames at once),
and create skins. Only then Milkshape product will become the valid MD2.
  
Sources of my work
      Mancubus
(163K) - MilkShape model with skeletal animation (about 250 frames).
Don't forget to set animation length to 273 frames before loading it, or
MilkShape will cut off all frames except of first 30.
  
      
Imp
(70K) - MilkShape model with skeleton (slightly raw, because I finished
imp model later in Q2Modeller), but at least it has skeleton
Monster states list
  here, if state name is spelled as "CYBER_", then further calling "DIE8(10)14"
will mean "State CYBER_DIE8 is 10 game tic long and is presented by 14th
sprite frame" - and so on.
  
Cyberdemon (sprite CYBR)
  name: CYBER_
  idle: STND(10) - STND2(10) - STND 
  (if state is not followed by "(<tic length>)", it means that it is
defined elsewhere, and cited here only for show state sequence. Also, I don't
cite sprite frames for idle states here.)
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN7(3)3 - RUN8(3)3 - RUN1
  pain: PAIN(10)6 - RUN1
  attack: ATK1(6)4 - ATK2(12)5* - ATK3(12)4 - ATK4(12)5* - ATK5(12)4 - ATK6(12)5*
- RUN1
  (* means "full-bright sprite")
  death: DIE1(10)7 - DIE2(10)8 - DIE3(10)9 - DIE4(10)10 - DIE5(10)11 - DIE6(10)12
- DIE7(10)13 - DIE8(10)14 - DIE9(30)15 - DIE10(-1)15.
  (tic length of -1 means "final state of infinite durability")
  
Demon / Spectre (sprite SARG) 
  name: SARG_
  idle: STND(10) - STND2(10) - STND
  run: RUN1(2)0 - RUN2(2)0 - RUN3(2)1 - RUN4(2)1 - RUN5(2)2 - RUN6(2)2 -
RUN7(2)3 - RUN8(2)3 - RUN1
  pain: PAIN(2)7 - PAIN2(2)7 - RUN1
  attack: ATK1(8)4 - ATK2(8)5 -ATK3(8)6 - RUN1
  death: DIE1(8)8 - DIE2(8)9 - DIE3(4)10 - DIE4(4)11 - DIE5(4)12 - DIE6(-1)13
  raise: RAISE1(5)13 - RAISE2(5)12 - RAISE3(5)11 - RAISE4(5)10 - RAISE5(5)9
- RAISE6(5)8 - RUN1
  
Keen (sprite KEEN)
  name: (variable, so states are cited here with their full names)
  idle: KEENSTND(-1)0
  pain: KEENPAIN(4)12 - KEENPAIN2(8)12 - KEENSTND
  death: COMMKEEN(6)0 - COMMKEEN2(6)1 - COMMKEEN3(6)2 - COMMKEEN4(6)3 - COMMKEEN5(6)4
- COMMKEEN6(6)5 - COMMKEEN7(6)6 - COMMKEEN8(6)7 - COMMKEEN9(6)8 - COMMKEEN10(6)9
- COMMKEEN11(6)10 - COMMKEEN12(-1)11
  
Zombie (sprite POSS)
  name: POSS_
  idle: STND(10) - STND2(10) - STND
  pain: PAIN(3)6 - PAIN2(3)6 - RUN1
  death: DIE1(5)7 - DIE2(5)8 - DIE3(5)9 - DIE4(5)10 - DIE5(-1)11
  xdeath: XDIE1(5)12 - XDIE2(5)13 - XDIE3(5)14 - XDIE4(5)15 -XDIE5(5)16 -XDIE6(5)17
- XDIE7(5)18 - XDIE8(5)19 - XDIE9(-1)20
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN7(3)3 - RUN8(3)3
  attack: ATK1(10)4 - ATK2(8)5* - ATK3(8)4 - RUN1
  raise: RAISE1(5)10 - RAISE2(5)9 - RAISE3(5)8 - RAISE4(5)7 - RUN1
  
Sargeant (sprite SPOS)
  name: SPOS_
  idle: STND(10) - STND2(10) - STND
  pain: PAIN(3)6 - PAIN2(3)6 - RUN1
  death: DIE1(5)7 - DIE2(5)8 - DIE3(5)9 - DIE4(5)10 - DIE5(-1)11
  xdeath: XDIE1(5)12 - XDIE2(5)13 - XDIE3(5)14 - XDIE4(5)15 -XDIE5(5)16 -XDIE6(5)17
- XDIE7(5)18 - XDIE8(5)19 - XDIE9(-1)20
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN7(3)3 - RUN8(3)3
  attack: ATK1(10)4 - ATK2(10)5* - ATK3(10)4 - RUN1
  raise: RAISE1(5)10 - RAISE2(5)9 - RAISE3(5)8 - RAISE4(5)7 -  RUN1
  
Chaingun guy (sprite CPOS)
  name: CPOS_
  idle: STND(10) - STND2(10) - STND
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN7(3)3 - RUN8(3)3
  attack: ATK1(10)4 - ATK2(4)5* - ATK3(4)4* - ATK4(1)5 - ATK2
  pain: PAIN(3)6 - PAIN2(3)6 - RUN1
  death: DIE1(5)7 - DIE2(5)8DIE3(5)9 - DIE4(5)10 - DIE5(5)11 - DIE6(5)12
- DIE7(-1)13
  xdeath: XDIE1(5)14 - XDIE(5)15 -XDIE3(5)16 - XDIE4(5)17 - XDIE5(5)18 -
XDDIE6(-1)19
  raise: RAISE1(5)13 - RAISE2(5)12- RAISE3(5)11 - RAISE4(5)10 - RAISE5(5)9
- RAISE6(5)8 - RAISE7(5)7 - RUN1
  
  
Imp (sprite TROO)
  name: TROO_
  idle: STND(10) - STND2(10) - STND
  pain: PAIN(2)7 - PAIN2(2)7 - RUN1
  death: DIE1(8)8 - DIE2(8)9 - DIE3(6)10 - DIE4(6)11 - DIE5(-1)12
  xdeath: XDIE1(5)13 - XDIE2(5)14 - XDIE3(5)15 - XDIE4(5)16 -XDIE5(5)17 -XDIE6(5)18
- XDIE7(5)19 - XDIE8(-1)20
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN7(3)3 - RUN8(3)3
  attack: ATK1(8)4 - ATK2(8)5 - ATK3(6)6 - RUN1
  raise: RAISE1(8)12 RAISE2(8)11 - RAISE3(6)10 - RAISE4(6)9 - RAISE5(6)8
- RUN1
  
Arachnotron (sprite BSPI)
  name: BSPI_
  idle: STND(10) - STND2(10) - STND
  see: SIGHT(20)0 - RUN1
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2  -
RUN7(3)3 - RUN8(3)3 - RUN9(3)4 - RUN10(3)4 - RUN11(3)5 - RUN12(3)5
  pain: PAIN(3)8 - PAIN2(3)8 - RUN1
  attack: ATK1(20)0* - ATK2(4)6* - ATK3(4)7* - ATK4(1)7* - ATK2
  death: DIE1(20)9 - DIE2(7)10 - DIE3(7)11 - DIE4(7)12 - DIE5(7)13 - DIE6(7)14
- DIE7(-1)15
  raise: RAISE1(5)15 - RAISE2(5)14 - RAISE3(5)13 - RAISE4(5)12 - RAISE5(5)11
- RAISE6(5)10  - RAISE7(5)9 - RUN1
  
Mancubus (sprite FATT)
  name: FATT_
  idle: STND(15) - STND2(15) - STND
  run: RUN1(4)0 - RUN2(4)0 - RUN3(4)1 - RUN4(4)1 - RUN5(4)2 - RUN6(4)2 -
RUN7(4)3 - RUN8(4)3 - RUN9(4)4 - RUN10(4)4 - RUN11(4)5 - RUN12(4)5 - RUN1
  attack: ATK1(20)6 - ATK2(10)7* - ATK3(5)8 - ATK4(5)6 - ATK5(10)7* - ATK6(5)8
- ATK7(5)6 - ATK8(10)7* - ATK9(5)8 - ATK10(5)6 - RUN1
  pain: PAIN(3)9 - PAIN2(3)9 - RUN1
  death: DIE1(6)10 - DIE2 (6)11 - DIE3(6)12 - DIE4(6)13 - DIE5(6)14 - DIE6(6)15
- DIE7(6)16 - DIE8(6)18 - DIE9(6)18 - DIE10(-1)19
  raise: RAISE1(5)17 - RAISE2(5)16 - RAISE3(5)15 - RAISE4(5)14 - RAISE5(5)13
- RAISE6(5)12 - RAISE7(5)11 - RAISE8(5)10 - RUN1
  
  
Baron of hell (sprite BOSS)
  name: BOSS_
  idle: STND(10) - STND2(10) - STND
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN7(3)3 - RUN8(3)3
  pain: PAIN(2)7 - PAIN2(2)7  - RUN1
  attack:  ATK1(8)4 - ATK2(8)5 - ATK3(8)6 - RUN1
  death:  DIE1(8)8 - ... - DIE7(-1)14
  raise: RAISE1(8)14 - ... - RAISE7(8)8 - RUN1
  
Knight of hell (sprite BOS2)
  name: BOS2_
  idle: STND(10) - STND2(10) - STND
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN7(3)3 - RUN8(3)3
  pain: PAIN(2)7 - PAIN2(2)7  - RUN1
  attack:  ATK1(8)4 - ATK2(8)5 - ATK3(8)6 - RUN1
  death:  DIE1(8)8 - ... - DIE7(-1)14
  raise: RAISE1(8)14 - ... - RAISE7(8)8 - RUN1
  
Pain elemental (sprite PAIN)
  name: PAIN_
  idle: STND(10)0 - STND
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN1
  pain: PAIN(6)6 - PAIN2(6)6 - RUN1
  attack: ATK1(5)3 - ATK2(5)4 - ATK3(5)5* - ATK4(0)5* - RUN1
  death: DIE1(8)7* - DIE2(8)8* - DIE3(8)9* - DIE4(8)10* - DIE5(8)11* - DIE6(8)12*
- NULL
  raise: RAISE1(8)12 - ... - RAISE6(8)7 - What a stupidity! He cannot be
raised because after explosion he turns to NULL, and thus, has no corpse!
  
Lost soul (sprite SKUL (note: with one "L"!))
  name: SKULL_ (note: with two "L"s!)
  idle: STND(10)0* - STND2(10)1*
  run: RUN1(6)0* - RUN2(6)1* - RUN1
  pain: PAIN(3)4* - PAIN2(3)4*
  attack: ATK1(10)2* - ATK2(4)3* - ATK3(4)2* - ATK4(4)3* - ATK3
  death: DIE1(6)5* - ... - DIE4(6)8* - DIE5(6)9 - DIE6(6)10 - NULL
  
Cacodemon (sprite HEAD)
  name: HEAD_
  idle: STND(10)0 - STND
  run: RUN1(3)0 - RUN1
  pain: PAIN(3)4 - PAIN2(3)4 - PAIN3(6)5
  attack: ATK1(5)1 - ATK2(5)2 - ATK3(5)3* - RUN1
  death: DIE1(8)6 - ... - DIE5(8)10 - DIE6(-1)11
  raise: RAISE1(8)11 - ... - RAISE6(8)6
  
Spider-mastermind (sprite SPID)
  name: SPID_
  idle: STND(10) - STND2(10) - STND
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN7(3)3 - RUN8(3)3 - RUN9(3)4 - RUN10(3)4 - RUN11(3)5 - RUN12(3)5 - RUN1
  pain: PAIN(3)8 - PAIN2(3)8 - RUN1
  attack: ATK1(20)0* - ATK2(4)6* - ATK3(4)7* - ATK4(1)7* - ATK2
  death: DIE1(20)9 - DIE2(10)10 - DIE3(10)11 - DIE4(10)12* - DIE5(10)13*
- ... - DIE9(10)17* - DIE10(30)18 - DIE11(-1)18
  
Wolf SS (sprite SSWV)
  name: SSWV_
  idle: STND(10) - STND2(10) - STND
  pain: PAIN(3)7 - PAIN2(3)7 - RUN1
  death: DIE1(5)8 - DIE2(5)9 - DIE3(5)10 - DIE4(5)11 - DIE5(-1)12
  xdeath: XDIE1(5)13 - XDIE2(5)14 - XDIE3(5)15 - XDIE4(5)16 -XDIE5(5)17 -XDIE6(5)18
- XDIE7(5)19 - XDIE8(5)20 - XDIE9(-1)21
  run: RUN1(3)0 - RUN2(3)0 - RUN3(3)1 - RUN4(3)1 - RUN5(3)2 - RUN6(3)2 -
RUN7(3)3 - RUN8(3)3
  attack: ATK1(10)4 - ATK2(10)5 - ATK3(4)6* - ATK4(6)5 - ATK5(4)6* - ATK6(1)5
- ATK2
  raise: RAISE1(5)12 - RAISE2(5)11 - RAISE3(5)10 - RAISE4(5)9 - RAISE5(5)8
- RUN1
  
Revenant (sprite SKEL)
  name: SKEL_
  idle: STND(10) - STND2(10) - STND
  run: RUN1(2)0 - RUN2(2)0 - RUN3(2)1 - RUN4(2)1 - RUN5(2)2 - RUN6(2)2 -
RUN7(2)3 - RUN8(2)3 - RUN9(2)4 - RUN10(2)4 - RUN11(2)5 - RUN12(2)5 - RUN1
  melee attack: FIST1(0)6 - FIST2(6)6 - FIST3(6)7 - FIST4(6)8 - RUN1
  missile attack: MISS1(0)9* - MISS2(10)9* - MISS3(10)10 - MISS4(10)10 -
RUN1
  pain: PAIN(5)11 - PAIN2(5)11 - RUN1
  death: DIE1(7)11 - ... - DIE5(7)15 - DIE6(-1)16
  raise: RAISE1(5)16 - ... - RAISE6(5)11 - RUN1
  
Boss cube (sprite BOSF)
  SPAWN1(3)0* - SPAWN2(3)1 - SPAWN3(3)2 - SPAWN4(3)3 - SPAWN1