Page 3 of 6

Posted: Sun Nov 13, 2005 14:19
by Chilvence
Graf Zahl wrote: That would work for simple monsters but as soon as complex DECORATE constructions come into play it'd fail completely. Such a simple definition format can't handle all that is needed. If you can solve that I'd appreciate it.
Could you elaborate on how it would fail? I'm not saying you're wrong, but I thought I'd accounted for that - if theres some important detail I've missed I'll gladly try and brainstorm a solution for it.

Also, I hope you'll at least consider an extra model format - the existing models may all be md2s, but as far as creating new ones go, the md2 format is extremely counter productive - there is just too little software support for it. We would be much more likely to see people take advantage of model support if they can actually make them ;)

Posted: Sun Nov 13, 2005 16:50
by Graf Zahl
Have you seen some of the more complex monsters? They jump around wildly between states so that in some cases it is nearly impossible to recognize any loops at all. Defining models for Doom's standard monster isn't that hard. But trying to define a model for something like the monster pack's Imp Warlord or even some more complex monsters from other WADS is an entirely different story.

As for considering, I must say up front that my experience with models is nearly zero. I have no idea whatsoever where the problems are and how to avoid them in the code. The only guidelines I have so far are the animation routines of Doomsday, Vavoom. And they are strictly state-bound. I'll be glad if I get something to work any time soon. So far this stuff is only giving me headaches... :(

Posted: Sun Nov 13, 2005 23:00
by BlazingPhoenix
so........are there going to be test wads for models when they're finally done?

Posted: Sun Nov 13, 2005 23:20
by QBasicer
Graf, couldn't you just use MD2/3 models, add that to the WAD, and in the wad specify which animation to use?

Posted: Mon Nov 14, 2005 0:53
by Chilvence
I agree that it would be a pain to define a model for a really mashed up decorate actor, but not completely impossible - this syntax would still be flexible enough to handle any number of A_Jumps and gotos if the author pays attetion to what he is doing. All you need to do is grab a pen and make a precise note of each set of uninterrupted frames, then key model anims to the beginning of each of them. Find me a complete bastard of a decorate actor and I'll see if my guess is right ;)

Besides that, I very much doubt anyone would start making custom models/defs for every wad out there that has new actors anytime soon. The focus should be on making the syntax comfortable to work with, so that future projects are more encouraged to take advantage of it.

Posted: Mon Nov 14, 2005 1:03
by Enjay
Chilvence wrote:Find me a complete bastard of a decorate actor and I'll see if my guess is right ;)
I'm guessing LilWhiteMouse's "Hammer Hound" may well come into that category. Or perhaps her "Hell's Battery" though I'm not so familiar with how that one is done. I don't think it's as complex as the hound. I think you can get the hound from the boss resource wad. Not so sure about hell's battery - was it featured in ZenDynamics?

Posted: Mon Nov 14, 2005 1:04
by Phoenix
Hell's Battery is also in the boss resource, unless for some reason it was taken out in a later version or whatnot (i downloaded it a long time ago)

Posted: Mon Nov 14, 2005 12:10
by TheDarkArchon
It's still there.

Posted: Mon Nov 14, 2005 19:24
by Chilvence
Couldn't post it up for me in a spoiler could you? I can't find it, and I'm stuck on 56k at the moment.

Posted: Mon Nov 14, 2005 19:29
by solarsnowfall
*cough* KillBot *cough*

Wish I still had the model though...

Posted: Mon Nov 14, 2005 20:00
by Nash
Find me a complete bastard of a decorate actor and I'll see if my guess is right :)
1337man!!!!!!!!!!!

Posted: Mon Nov 14, 2005 20:03
by Chilvence
Hmm. Thats bulky, but still relatively simple. Using the classic Doomsday style method you'd end up with a 50 page long ded file for it, but since the sprite animation itself is quite simple, you would only have to define 3 or 4 different animation loops for it with my proposed system.


edit: Heres a rough idea of where I would plant animation triggers in it:


[spoiler]

Code: Select all

    States
    {
    Spawn:
killbot/hover
        BOTT A 1 A_Look 
        Loop
    See: 
killbot/hover
        BOTT A 0 A_ChangeFlag("FloatBob", 1)
        BOTT A 0 A_ChangeFlag("NoGravity", 1)
        BOTT A 0 A_UnSetInvulnerable
        BOTT A 0 A_UnsetReflective
        BOTT A 0 A_SetShootable
        BOTT A 0 A_SetTranslucent(1,0)
        BOTT A 0 A_JumpIfHealthLower(5000, 5)
        BOTT A 0 A_Jump(4, 2)
        BOTT A 2 A_Chase
        Loop

        BOTT A 0 A_Scream
        BOTT A 2 A_Chase
        Loop

        BOTT A 0 A_Jump(64, 2)
        BOTT A 4 A_Chase
        Loop

        BOTT A 0 A_Jump(128, 9)
        BOTT A 0 A_PlaySound("world/spark1")
        BOTT A 0 BRIGHT A_CustomMissile("Spark1", 120, 0, 0)
        BOTT A 0 BRIGHT A_CustomMissile("Spark2", 120, 0, 8)
        BOTT A 0 BRIGHT A_CustomMissile("Spark3", 120, 0, -8)
        BOTT A 0 BRIGHT A_CustomMissile("Spark1", 120, 0, 16)
        BOTT A 0 BRIGHT A_CustomMissile("Spark2", 120, 0, -16)
        BOTT A 4
        BOTT A 4 A_Chase
        Loop

    	BOTT A 0 A_Jump(128, 11)
        BOTT A 0 A_PlaySound("world/spark2")
        BOTT A 0 BRIGHT A_CustomMissile("Spark2", 64, 16, 0)
        BOTT A 0 BRIGHT A_CustomMissile("Spark3", 64, 16, 8)
        BOTT A 0 BRIGHT A_CustomMissile("Spark1", 64, 16, -8)
        BOTT A 0 BRIGHT A_CustomMissile("Spark2", 64, 16, 16)
        BOTT A 0 BRIGHT A_CustomMissile("Spark3", 64, 16, -16)
killbot/twitch1 see+29 (i dont know the purpose of this animation..)
        BOTT ABC 4
        BOTT A 4 A_Chase
        Loop

        BOTT A 0 A_PlaySound("world/spark3")
        BOTT A 0 BRIGHT A_CustomMissile("Spark3", 96, -32, 0)
        BOTT A 0 BRIGHT A_CustomMissile("Spark1", 96, -32, 8)
        BOTT A 0 BRIGHT A_CustomMissile("Spark2", 96, -32, -8)
        BOTT A 0 BRIGHT A_CustomMissile("Spark3", 96, -32, 16)
        BOTT A 0 BRIGHT A_CustomMissile("Spark1", 96, -32, -16)
killbot/twitch2 see+38
        BOTT ADF 4
        BOTT A 4 A_Chase 
        Loop
    Missile:
killbot/missile
        BOTT A 0 A_ChangeFlag("FloatBob", 0)
        BOTT A 0 A_JumpIfCloser(1216, 9)
        BOTT A 0 A_Jump(64, 8)
        BOTT A 8 A_FaceTarget
        BOTT A 8 A_SpawnItem("BotRail", 0, 120, 0)
        BOTT A 8 A_FaceTarget
        BOTT A 8 A_SpawnItem("BotRail", 0, 120, 0)
        BOTT A 8 A_FaceTarget
        BOTT A 8 A_SpawnItem("BotRail", 0, 120, 0)
        BOTT A 8
        Goto See
killbot/rockets missile+10
        BOTT B 0 A_JumpIfCloser(704, 18)
        BOTT BC 4 A_FaceTarget
    	BOTT G 4 BRIGHT A_CustomMissile("BotRocket", 140, 40, 0)
        BOTT C 4 A_FaceTarget
        BOTT H 4 BRIGHT A_CustomMissile("BotRocket", 140, -40, 0)
        BOTT C 4 A_FaceTarget
    	BOTT G 4 BRIGHT A_CustomMissile("BotRocket", 140, 40, 0)
        BOTT C 4 A_FaceTarget
        BOTT H 4 BRIGHT A_CustomMissile("BotRocket", 140, -40, 0)
        BOTT C 4 A_FaceTarget
        BOTT G 4 BRIGHT A_CustomMissile("BotRocket", 140, 40, 0)
        BOTT C 4 A_FaceTarget
        BOTT H 4 BRIGHT A_CustomMissile("BotRocket", 140, -40, 0)
        BOTT C 4 A_FaceTarget
        BOTT G 4 BRIGHT A_CustomMissile("BotRocket", 140, 40, 0)
        BOTT C 4 A_FaceTarget
        BOTT H 4 BRIGHT A_CustomMissile("BotRocket", 140, -40, 0)
        Goto See
killbot/chaingun missile+27 (28/29? lost count..)
        BOTT D 0 A_JumpIfCloser(384, 8)
        BOTT D 2 A_FaceTarget
        BOTT E 0 BRIGHT A_CposAttack
        BOTT E 0 BRIGHT A_CposAttack
        BOTT E 0 BRIGHT A_PlaySound("spider/attack")
        BOTT E 2 BRIGHT
        BOTT F 2 A_FaceTarget
        BOTT F 0 A_SpidRefire
        Goto Missile+30
killbot/sonics missile+36
        BOTT A 0 A_Jump(64, 66)
        BOTT A 0 A_PlaySound("lichflam")
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        BOTT A 1 BRIGHT A_FaceTarget
        BOTT A 1 BRIGHT A_CustomMissile("SonicAttack", 120, -8, 0)
        Goto See

        BOTT A 0
        Goto Missile+29
    Pain:
killbot/pain
    	BOTT A 0 A_ChangeFlag("FloatBob", 0)
        BOTT A 0 A_Jump(128, 4)
    	BOTT A 0 A_ChangeFlag("NoGravity", 0)
    	BOTT A 32
        Goto See
        BOTT A 0 A_SetInvulnerable
        BOTT A 0 A_SetReflective
        BOTT A 1 A_PlaySound("shldup")
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
    	BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
    	BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
    	BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
    	BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
    	BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 1 A_FaceTarget
    	BOTT A 1 A_CustomMissile("BotShield", 0, 0, 0)
        BOTT A 0 A_Jump(128, 2)
        BOTT A 0 A_FaceTarget
        Goto Pain+7
        BOTT A 0 A_PlaySound("shlddown")
        BOTT A 0 A_Jump(204, 12)
        BOTT A 0 A_UnsetShootable
        BOTT A 1 A_SetTranslucent(.9, 1)
        BOTT A 1 A_SetTranslucent(.8, 1)
        BOTT A 1 A_SetTranslucent(.7, 1)
        BOTT A 1 A_SetTranslucent(.6, 1)
        BOTT A 1 A_SetTranslucent(.5, 1)
        BOTT A 1 A_SetTranslucent(.4, 1)
        BOTT A 1 A_SetTranslucent(.3, 1)
        BOTT A 1 A_SetTranslucent(.2, 1)
        BOTT A 1 A_SetTranslucent(.1, 1)
        BOTT A 0 TeleportOther(52, 53, 0)
        Goto See
        BOTT A 0 A_Jump(204, 12)
        BOTT A 0 A_UnsetShootable
        BOTT A 1 A_SetTranslucent(.9, 1)
        BOTT A 1 A_SetTranslucent(.8, 1)
        BOTT A 1 A_SetTranslucent(.7, 1)
        BOTT A 1 A_SetTranslucent(.6, 1)
        BOTT A 1 A_SetTranslucent(.5, 1)
        BOTT A 1 A_SetTranslucent(.4, 1)
        BOTT A 1 A_SetTranslucent(.3, 1)
        BOTT A 1 A_SetTranslucent(.2, 1)
        BOTT A 1 A_SetTranslucent(.1, 1)
        BOTT A 0 TeleportOther(52, 54, 0)
        Goto See
        BOTT A 0 A_Jump(204, 12)
        BOTT A 0 A_UnsetShootable
        BOTT A 1 A_SetTranslucent(.9, 1)
        BOTT A 1 A_SetTranslucent(.8, 1)
        BOTT A 1 A_SetTranslucent(.7, 1)
        BOTT A 1 A_SetTranslucent(.6, 1)
        BOTT A 1 A_SetTranslucent(.5, 1)
        BOTT A 1 A_SetTranslucent(.4, 1)
        BOTT A 1 A_SetTranslucent(.3, 1)
        BOTT A 1 A_SetTranslucent(.2, 1)
        BOTT A 1 A_SetTranslucent(.1, 1)
        BOTT A 0 TeleportOther(52, 55, 0)
        Goto See
        BOTT A 0 A_Jump(204, 12)
        BOTT A 0 A_UnsetShootable
        BOTT A 1 A_SetTranslucent(.9, 1)
        BOTT A 1 A_SetTranslucent(.8, 1)
        BOTT A 1 A_SetTranslucent(.7, 1)
        BOTT A 1 A_SetTranslucent(.6, 1)
        BOTT A 1 A_SetTranslucent(.5, 1)
        BOTT A 1 A_SetTranslucent(.4, 1)
        BOTT A 1 A_SetTranslucent(.3, 1)
        BOTT A 1 A_SetTranslucent(.2, 1)
        BOTT A 1 A_SetTranslucent(.1, 1)
        BOTT A 0 TeleportOther(52, 56, 0)
        Goto See
        BOTT A 0 A_Jump(204, 12)
        BOTT A 0 A_UnsetShootable
        BOTT A 1 A_SetTranslucent(.9, 1)
        BOTT A 1 A_SetTranslucent(.8, 1)
        BOTT A 1 A_SetTranslucent(.7, 1)
        BOTT A 1 A_SetTranslucent(.6, 1)
        BOTT A 1 A_SetTranslucent(.5, 1)
        BOTT A 1 A_SetTranslucent(.4, 1)
        BOTT A 1 A_SetTranslucent(.3, 1)
        BOTT A 1 A_SetTranslucent(.2, 1)
        BOTT A 1 A_SetTranslucent(.1, 1)
        BOTT A 0 TeleportOther(52, 57, 0)
        Goto See
        BOTT A 0 A_Jump(153, 12)
        BOTT A 0 A_UnsetShootable
        BOTT A 1 A_SetTranslucent(.9, 1)
        BOTT A 1 A_SetTranslucent(.8, 1)
        BOTT A 1 A_SetTranslucent(.7, 1)
        BOTT A 1 A_SetTranslucent(.6, 1)
        BOTT A 1 A_SetTranslucent(.5, 1)
        BOTT A 1 A_SetTranslucent(.4, 1)
        BOTT A 1 A_SetTranslucent(.3, 1)
        BOTT A 1 A_SetTranslucent(.2, 1)
        BOTT A 1 A_SetTranslucent(.1, 1)
        BOTT A 0 TeleportOther(52, 58, 0)
        Goto See
        BOTT A 0 A_Jump(153, 12)
        BOTT A 0 A_UnsetShootable
        BOTT A 1 A_SetTranslucent(.9, 1)
        BOTT A 1 A_SetTranslucent(.8, 1)
        BOTT A 1 A_SetTranslucent(.7, 1)
        BOTT A 1 A_SetTranslucent(.6, 1)
        BOTT A 1 A_SetTranslucent(.5, 1)
        BOTT A 1 A_SetTranslucent(.4, 1)
        BOTT A 1 A_SetTranslucent(.3, 1)
        BOTT A 1 A_SetTranslucent(.2, 1)
        BOTT A 1 A_SetTranslucent(.1, 1)
        BOTT A 0 TeleportOther(52, 59, 0)
        Goto See
        BOTT A 0 A_Jump(153, 12)
        BOTT A 0 A_UnsetShootable
        BOTT A 1 A_SetTranslucent(.9, 1)
        BOTT A 1 A_SetTranslucent(.8, 1)
        BOTT A 1 A_SetTranslucent(.7, 1)
        BOTT A 1 A_SetTranslucent(.6, 1)
        BOTT A 1 A_SetTranslucent(.5, 1)
        BOTT A 1 A_SetTranslucent(.4, 1)
        BOTT A 1 A_SetTranslucent(.3, 1)
        BOTT A 1 A_SetTranslucent(.2, 1)
        BOTT A 1 A_SetTranslucent(.1, 1)
        BOTT A 0 TeleportOther(52, 60, 0)
        Goto See
        BOTT A 0 A_UnsetShootable
        BOTT A 1 A_SetTranslucent(.9, 1)
        BOTT A 1 A_SetTranslucent(.8, 1)
        BOTT A 1 A_SetTranslucent(.7, 1)
        BOTT A 1 A_SetTranslucent(.6, 1)
        BOTT A 1 A_SetTranslucent(.5, 1)
        BOTT A 1 A_SetTranslucent(.4, 1)
        BOTT A 1 A_SetTranslucent(.3, 1)
        BOTT A 1 A_SetTranslucent(.2, 1)
        BOTT A 1 A_SetTranslucent(.1, 1)
        BOTT A 0 TeleportOther(52, 61, 0)
        Goto See
    Death:
killbot/death
    	BOTT A 0 A_ChangeFlag("NoGravity", 0)
    	BOTT A 0 A_ChangeFlag("FloatBob", 0)
    	BOTT A 16
        BOTT A 1 A_CustomMissile("BotRuptionA", 32, -8, 0)
    	BOTT A 4
    	BOTT A 1 A_CustomMissile("BotRuptionB", 64, 16, 0)
    	BOTT A 2
    	Bott A 1 A_CustomMissile("BotRuptionA", 48, 0, 0)
    	BOTT A 6 
        BOTT A 1 A_CustomMissile("BotRuptionC", 96, -16, 0)
        BOTT A 0 Radius_Quake(5, 35, 0, 1216, 52)
        BOTT A 4
        BOTT A 1 A_CustomMissile("BotRuptionB", 56, 32, 0)
    	BOTT A 2
        Bott A 1 A_CustomMissile("BotRuptionA", 128, 0, 0)
    	BOTT A 6 
        Bott A 1 A_CustomMissile("BotRuptionA", 80, -32, 0)
    	BOTT A 6
 	BOTT A 1 A_CustomMissile("BotRuptionC", 96, 16, 0)
        BOTT A 0 Radius_Quake(5, 35, 0, 1216, 52)
        BOTT A 4
        BOTT A 1 A_CustomMissile("BotRuptionA", 64, -8, 0)
    	BOTT A 4
    	BOTT A 1 A_CustomMissile("BotRuptionB", 96, 16, 0)
    	BOTT A 2
    	Bott A 1 A_CustomMissile("BotRuptionA", 56, 0, 0)
    	BOTT A 6 
        BOTT A 1 A_CustomMissile("BotRuptionC", 128, -16, 0)
        BOTT A 0 Radius_Quake(5, 35, 0, 1216, 52)
        BOTT A 4
        BOTT A 1 A_CustomMissile("BotRuptionB", 32, 32, 0)
    	BOTT A 2
        Bott A 1 A_CustomMissile("BotRuptionA", 112, 0, 0)
    	BOTT A 6 
        Bott A 1 A_CustomMissile("BotRuptionA", 48, -32, 0)
    	BOTT A 6
 	BOTT A 1 A_CustomMissile("BotRuptionC", 80, 16, 0)
        BOTT A 0 Radius_Quake(5, 35, 0, 1216, 52)
        BOTT A 0 A_SpawnItem("BotDebrisQue", 0, 200, 0)
        BOTT I -1
        STOP
    }
}
[/spoiler]

For the pain and death loops, it doesn't seem to actually animate much from what I can see which makes it a lot easier. As for the missile attacks, you could easily take advantage of the extra animation potential that models have to do some cool animations independant of the sprite.

Gimme something really crazy please.

Posted: Mon Nov 14, 2005 21:50
by Enjay
Boss resource decorate

Posted: Mon Nov 14, 2005 22:25
by Graf Zahl
Chilvence wrote:Hmm. Thats bulky, but still relatively simple. Using the classic Doomsday style method you'd end up with a 50 page long ded file for it,

Guess why I haven't implemented it yet! ;)

Posted: Mon Nov 14, 2005 22:36
by Chilvence
Hmm. I'm sure LWM has done worse than that. Just having gobloads of states doesn't really mean the monster is complex. Theres a difference between how many fireballs it spews out and how complex the actual animation of the sprite is - take out all the 0 duration states from the missile attack and you have this:

Code: Select all

    Missile:
        HHND A 0
        Goto Missile+3
        HHND A 0 A_CustomMissile("HHBlastingCap", 0, 48, 0)
        HHND A 16 A_CustomMissile("HHBlastingCap", 0, -48, 0)
        Goto See+12
        HHND A 0 A_Jump (144, 8)
        HHND APQ 4 A_FaceTarget
        HHND R 0 A_CustomMissile("HHTorp", 0, 48, 250)
        HHND R 0 A_CustomMissile("HHTorp", 0, -48, 110)
        HHND R 0 A_CustomMissile("HHTorp", 0, -48, 20)
        HHND R 16 A_CustomMissile("HHTorp", 0, 48, -20)
        Goto See+1
        HHND C 4 A_FaceTarget
        HHND B 8 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND D 16 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND B 16 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND D 16 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND B 16 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND D 16 A_MissileAttack
        Goto See+1
Which is really a simple sequence with only one jump and 3 different goto's. In fact the whole point of my idea is that you'd only need an animation trigger anywhere that a goto or an A_Jump leads to, rather than rigidly defining a model frame for each and every sprite state. Surely the value of that is plain to see?

Anyway, I've marked out all the places the hammerhound would need triggers:
[spoiler]

Code: Select all

ACTOR HammerHound 30006
{
    States
    {
    Spawn:
#       HHND A 10 A_Look
        Loop
    See:
        HHND S 0 A_Jump (64, 12)
        HHND E 0 A_PlaySound ("hammerhound/step")
#       HHND EEFF 5 A_Chase
        HHND G 0 A_PlaySound ("hammerhound/step")
        HHND GGHH 5 A_Chase
        HHND S 0 A_CPosRefire
        Goto See+1
#       HHND SSSSSTTTTT 1 A_Chase
        HHND U 0 A_PlaySound ("hammerhound/step")
        HHND UUUUU 1 A_Chase
        HHND A 0 A_Jump (32, 1)
        Goto See+12
#       HHND A 0
        Goto Missile+1
    Missile:
        HHND A 0
        Goto Missile+3
        HHND A 0 A_CustomMissile("HHBlastingCap", 0, 48, 0)
#       HHND A 16 A_CustomMissile("HHBlastingCap", 0, -48, 0)
        Goto See+12
        HHND A 0 A_Jump (144, 8)
#       HHND APQ 4 A_FaceTarget
        HHND R 0 A_CustomMissile("HHTorp", 0, 48, 250)
        HHND R 0 A_CustomMissile("HHTorp", 0, -48, 110)
        HHND R 0 A_CustomMissile("HHTorp", 0, -48, 20)
        HHND R 16 A_CustomMissile("HHTorp", 0, 48, -20)
        Goto See+1
#       HHND C 4 A_FaceTarget
        HHND B 8 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND D 16 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND B 16 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND D 16 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND B 16 A_MissileAttack
        HHND C 4 A_FaceTarget
        HHND D 16 A_MissileAttack
        Goto See+1
    Pain:
#       HHND I 6 A_Pain
        HHND I 0 A_Jump(80, 3)
        HHND JI 6
        Goto See+1
        HHND J 0 A_CustomMissile ("HHOrbitRockSpawn", 32, 0, -180)
        HHND J 0 A_CustomMissile ("HHOrbitRockSpawn", 32, 0, -60)
        HHND J 6 A_CustomMissile ("HHOrbitRockSpawn", 32, 0, 60)
        HHND I 6
        Goto See+1
    Death:
#       HHND I 5
        HHND J 5 A_Scream
        HHND K 2 A_CustomMissile("HHBoom", 64, 0, 0)  
        HHND K 3 A_CustomMissile("HHHead", 64, 0, -45)  
        HHND LLL 2 A_CustomMissile("HHBlood", 48, 0, -40)  
        HHND L 0 A_CustomMissile("HHBoom", 48, -32, 0)  
        HHND MMM 2 A_CustomMissile("HHBlood", 48, 0, -50)  
        HHND M 0 A_CustomMissile("HHBoom", 16, 32, 0)  
        HHND NN 2 A_CustomMissile("HHBlood", 48, 0, -60)  
        HHND M 0 A_CustomMissile("HHBoom", 8, -64, 0)  
        HHND N 2 A_NoBlocking
        HHND O -1
        Stop
    }
}
[/spoiler]

For all its billions of frames, you'd only have to define 9 model animation sequences for it. Thats less than a Q3 player character...

Additionally, the way the individual sequences are defined is entirely open. If you wanted to make it really easy, you could just define a name, a start and end point, speed, and whether it loops like so:

hammerhound/walk { 0, 7, 5, loop }
hammerhound/attack { 8, 19, 2 }

edit: I'm pushing this idea on the jdoom forum as well, with a much more extensive example: http://forums.newdoom.com/showthread.ph ... post450532