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