Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Dad Raulo

Adding monsters without DECORATE

Recommended Posts

I want some custom monsters in my map, without the use of this DECORATE thing, I saw this in a couple of maps like coopbuild for example, where you can see the green cacodemon.

Share this post


Link to post

Why don't you want to use decorate?
If you aim for generic Doom compatibility, you'll have to use dehacked, and that means that you can't add anything new -- you can just modify stuff until they're completely different, so a useless monster like the commander keen or the wolf SS can be turned into something else.

Share this post


Link to post

Exactly what Gez said. Unless you're using ZDoom or anything that supports DECORATE, you cannot add any new objects, or even new frames of animation. If you look at Scythe II as an example, it does not use DECORATE but introduces both the afrit and the evil marine as characters. If you open the WAD with XWE or whatever, you'll notice that the afrit replaces Commander Keen, and the evil marine replaces the Wolfenstein SS. That's the best demonstration I can think of for "adding" new monsters without DECORATE.

In all honesty, though, DECORATE isn't that hard to use and is a lot more flexible and probably easier in the long run. The only reason not to that I can think of is if you want your WAD to be able to run outside of ZDoom and equivalent source ports.

Share this post


Link to post

The main reason is because i was messing around with XWE, and the I read about this DECORATE stuff, but it seems I can't get it to work, even though I read the tutorials thousand of times.

I really don't want to ADD new monsters, but to modify some monsters colours, nothing out if this world. Maybe fool around with their speeds and HP.

(Sorry for my english)

Share this post


Link to post

It's quite possible to replace animation frames for existing monsters, and speed and HP (as well as a lot of other aspects) can be altered with DeHacked or something similar. But if you put in a revamped version of a monster, will you want to keep the original version of the monster as well? Because if so, you won't be able to; the new monster will entirely replace the old one. If that's what you want then DECORATE won't be necessary. Otherwise, what is the error you're getting when you try running the WAD with DECORATE?

Share this post


Link to post
Gez said:

so a useless monster like the commander keen or the wolf SS can be turned into something else.


Is it true that you can modify decorations and stuff too? You could use one of the many hanging corpse and bloody mess sprites to replace as a new monster too right?

Share this post


Link to post
JohnnyRancid said:

Is it true that you can modify decorations and stuff too? You could use one of the many hanging corpse and bloody mess sprites to replace as a new monster too right?

You could, but the frames themselves (i.e. what programs the monster's actual behavior and animations) have to be borrowed from somewhere, too. A monster needs a ton of them, whereas decorations only have something like 1 or maybe 4 if it's a torch or something.

Share this post


Link to post
StupidBunny said:

Unless you're using ZDoom or anything that supports DECORATE, you cannot add any new objects, or even new frames of animation.


While Decorate may be the most popular and by far the most powerful, other ports do have the ability to add new objects, frames etc to varying degrees.

Share this post


Link to post

Also note that ZDaemon has DEHSUPP support, so adding new custom monsters built from Heretic/Hexen classes will be possible once the Spawn() ACS is functional in 1.09. Half the work is already done.

And heh, it's funny you mentioned the green cacodemon from coopbuild. I was the one who suggested the idea (the original plan was to use the color translations to turn it into gray, red, and brown cacodemon variants, but toke didn't get the chance to follow through on it ;_;).

Share this post


Link to post

Keep in mind that for vanilla Doom you can use a replaced sprite and get away with it, with Dehacked (here). And the sprite frame/rotation codes don't have to be exactly like in doom(2).wad -- you can use TROOB0 or POSSA1C3 for instance and it won't bomb. Note that for vanilla Doom compatibility you need to cover all letters in range -- between frames A and N, for example, there can't be a missing L or it will bomb.

Share this post


Link to post
Vermil said:

While Decorate may be the most popular and by far the most powerful, other ports do have the ability to add new objects, frames etc to varying degrees.


EDF, DDF, and svstrife definitions just to name a few :)

Share this post


Link to post
Vermil said:

and by far the most powerful,

What do you base this off?
VavoomC for starters is most likely a lot more versatile than Decorate. But it's also a lot more complex and as such no one is really using it (on top of that hardly anyone is using Vavoom that is).

Share this post


Link to post

Decorate is also only marginally "more powerful" than EDF. Both are data specification languages and both define almost the same set of objects (and more or less *will* after the addition of inventory and weapons to EDF, which is upcoming).

Ever since EDF was added to EE, people have been calling DECORATE more powerful, including when EDF was first to be able to define arbitrary thing types including monsters, arbitrary frames, and the first with an inheritance system (only by a matter of a week or two in that case, though). So you can understand why it wears a little thin on me :)

The only reason people aren't aware of what EDF does is because nobody's used it so far. I am hoping that esselfortium is going to fix that problem though ;)

Share this post


Link to post

I didn't mean to start anything. Indeed I didn't thoroughly research the abilities of every port in the area of new mobj defining before making a comment about power. My apologies.

I wonder what the very first port to be able to define new actors/frames freely was?

Share this post


Link to post

DosDoom (EDGE) IIRC

You may not have intended to start anything, but spreading uneducated assumptions as fact is counter productive.

Share this post


Link to post

Yes, to my knowledge EDGE was the first with DDF. I had been planning such for EE since way back in '97, but my programming skills had to catch up dramatically with my goals ;)

Share this post


Link to post
Quasar said:

Decorate is also only marginally "more powerful" than EDF. Both are data specification languages and both define almost the same set of objects (and more or less *will* after the addition of inventory and weapons to EDF, which is upcoming).

Ever since EDF was added to EE, people have been calling DECORATE more powerful, including when EDF was first to be able to define arbitrary thing types including monsters, arbitrary frames, and the first with an inheritance system (only by a matter of a week or two in that case, though). So you can understand why it wears a little thin on me :)

The only reason people aren't aware of what EDF does is because nobody's used it so far. I am hoping that esselfortium is going to fix that problem though ;)


Concerning 'more powerful', one important aspect here is how easy it is to define something. But when I look at this I think that many potential users may be put off by the clumsy way in which states are defined. Wasn't there an easier way to do it? I believe I can remember such discussions a few years back.

It was one very important aspect for me not to expose too many engine internals to the user so all states are part of the actor itself and not an external definition block.

Share this post


Link to post

It's kind of off-topic to discuss it here, but the main reason that EDF states were defined separate from thingtypes is that they have always been shareable, and EDF has always defined all objects, not just a subset of them. Since all EDF things can be edited through DeHackEd, they needed to be immediately addressable. Making them global objects seemed like the best way to do this at the time.

There are obvious problems with it, and it is less ideal (not less powerful) than DECORATE's state syntax. However, this has been previously discussed with users, and since addition of heredocs to EDF's tokenizer, I may in fact be able to add something similar to DECORATE state syntax, and this has been on my TODO list for a while now.

Share this post


Link to post
Graf Zahl said:

Concerning 'more powerful', one important aspect here is how easy it is to define something. But when I look at this I think that many potential users may be put off by the clumsy way in which states are defined.

Yeah potential users may be detracted when they lack patience to learn. If you compare the EDF definition syntax then it's not too different from DEH anyway: every object has variables to set, like in Dehacked.

Share this post


Link to post

I'd welcome it. The ZDoom family are still my favorite port, but I follow Eternity's development with interest. EDF looks rather unwieldy as it is now, too low-level and too close to the original C code. Contrasting EDF frame definitions with DECORATE states, there's a lot more "meaningless" characters in EDF. ("Meaningless" in quotes because I know they really have a purpose; and it's also required because the language specs prevent from using newlines or whitespace as delimiters, so more tokens are necessary for correct parsing.)

Still, when comparing DECORATE:

  See:
    BMBE AAABBBCCCDDD 2 A_Chase
    BMBE A 0 A_PlaySound("suicide/scream")
    loop
with EDF:
frame BMBE_SEE_A	{ cmp = "BMBE|A|*|2|Chase|@next" }
frame BMBE_SEE_B	{ cmp = "BMBE|A|*|2|Chase|@next" }
frame BMBE_SEE_C	{ cmp = "BMBE|A|*|2|Chase|@next" }
frame BMBE_SEE_D	{ cmp = "BMBE|B|*|2|Chase|@next" }
frame BMBE_SEE_E	{ cmp = "BMBE|B|*|2|Chase|@next" }
frame BMBE_SEE_F	{ cmp = "BMBE|B|*|2|Chase|@next" }
frame BMBE_SEE_G	{ cmp = "BMBE|C|*|2|Chase|@next" }
frame BMBE_SEE_H	{ cmp = "BMBE|C|*|2|Chase|@next" }
frame BMBE_SEE_I	{ cmp = "BMBE|C|*|2|Chase|@next" }
frame BMBE_SEE_J	{ cmp = "BMBE|D|*|2|Chase|@next" }
frame BMBE_SEE_K	{ cmp = "BMBE|D|*|2|Chase|@next" }
frame BMBE_SEE_L	{ cmp = "BMBE|D|*|0|PlaySound|BMBE_SEE_A" misc1 = sound:suscrm }
There's a lot more redundant information given in the EDF version, which could be factorized somehow I'm sure. Maybe something a bit like this (just for illustration, not an actual proposal):
state BMBE_SEE
{
   frames A,B,C : { cmp = "BMBE|A|*|2|Chase|@next" }
   frames D,E,F : { cmp = "BMBE|B|*|2|Chase|@next" }
   frames G,H,I : { cmp = "BMBE|C|*|2|Chase|@next" }
   frames J,K : { cmp = "BMBE|D|*|2|Chase|@next" }
   frames L : { cmp = "BMBE|D|*|0|PlaySound|BMBE_SEE_A" misc1 = sound:suscrm }
}
That would already remove a lot of redundant (for a human) code. Even better would be something like this:
state BMBE_SEE
{
   frames A,B,C,D,E,F,G,H,I,J,K : { cmp = "BMBE|AAABBBCCCDD|*|2|Chase|@next" }
   frames L : { cmp = "BMBE|D|*|0|PlaySound|BMBE_SEE_A" misc1 = sound:suscrm }
}
Such a method would still give a unique name to each frame, but it's the engine that would expand frame A from state BMBE_SEE into frame BMBE_SEE_A, and the modder would have a lot less identical stuff to type.

Just my two cents.

Share this post


Link to post

I don't understand why a definition format needs to be more machine friendly than human friendly as all your suggestions are.

For example, get rid of @next - and what does the * mean? At least in the listed examples it serves no purpose. I'm taking a guess here but it seems to me that most of EDF's syntax is dictated by the underlying parser's limited capabilities and not by what would be nice to have.

As the DECORATE code shows most of this information does not even need to be specified because it can easily be deduced from the definition without explicitly spelling it out.

Share this post


Link to post

Maybe it's because ZDoom is older and Eternity has important things still in development (including other games' support; some things may also change), that the EDF system looks more machine-like than DECORATE, for now.

Don't ignore the dehackednum variable, which is still needed where flexible codepointers are employed. Dehackednum requires to allocate a unique number at least 10000 to each key frame or thing (that are addressed by codepointers) and to every sound. That may add a bit to the difficulty to write :)

Good thing there's cmp and there's copy-paste, and I may write myself an EDF front-end if need be.

Regarding adding monsters without DECORATE, I noticed that in Doom 1, if you define with Dehacked a new monster with an ID # of a Doom 2 monster, no it won't appear in the game if you place it.

EDIT: @next is started by an AT in order to be marked as a symbol, not as a state name, but perhaps you knew it. I agree that it's not a good idea to link frames topographically with markers like this, though.

Share this post


Link to post

Don't ignore the dehackednum variable, which is still needed where flexible codepointers are employed. Dehackednum requires to allocate a unique number at least 10000 to each key frame or thing (that are addressed by codepointers) and to every sound. That may add a bit to the difficulty to write :)

What? I've never had any need for this, ever.

Share this post


Link to post

Eternity does not require explicit allocation of DeHackEd numbers any longer, and has not for several versions now. If you use an entity's name in a place where it must be translated into a numeric id, and the object in question hasn't been assigned a numeric id, one is assigned to it at that time automatically.

In addition, as of 3.35.90, it was no longer necessary to explicitly specify namespace qualifiers when doing this as long as the name in question is unambiguous.

That is, where you used to have to do this:

thingtype Foobar { dehackednum = 20000 }
frame blah { ... args = { thing:Foobar } }
You can now simply do this:
thingtype Foobar { ... }
frame blah { ... args = { Foobar } }
Automatic resolution of names to numbers is done amongst the supported namespaces in a predefined order. In short, this wasn't implemented in EDF originally simply because I didn't think of it.

EDF's syntax *is* defined by the abilities of the libConfuse parser - it must be based on a fixed, orthogonal set of tokenization rules, and a finite-state-automaton parser. This means that it is a formally specified language, but also that it has to accept certain limitations. This is why I added heredocs, to enable isolation of embedded languages that can be parsed by submodules.

This will enable this sort of syntax:
thingtype Foobar
{
   states = 
   @"
    See:
      BMBE AAABBBCCCDDD 2 Chase
      BMBE A 0 PlaySoundEx("SuicideScream")
      loop
   "@
}
The only added syntax here over DECORATE are the heredoc string delimiters.

The reason this hasn't been implemented yet is chiefly because Eternity still expects all states to be contained within a cohesive array. There are code segments surviving from DOOM which expect "state - states" to evaluate to an index into the states table, and some of these, particularly in the handling of weapon flash state, are exceptionally difficult to deal with in a backwardly compatible manner.

I am working on it, though.

Share this post


Link to post
printz said:

Maybe it's because ZDoom is older and Eternity has important things still in development (including other games' support; some things may also change), that the EDF system looks more machine-like than DECORATE, for now.


I don't think it has anything to do with age. Although DECORATE wasn't added to ZDoom before early 2004 its rules date 3 years further back to a time when I was doing most stuff in private without releasing it. But when I designed the state format it was with the explicit goal to automate any data generation that could be automated.

Admittedly, back then Dehacked considerations did not come into play at all because it was not needed. But since the generated data is 100% the same as the one internally defined by ZDoom was then, when the time came to externalize all actors to DECORATE no additional work was needed. The state map in DEHSUPP can perfectly take care of it.

printz said:

Regarding adding monsters without DECORATE, I noticed that in Doom 1, if you define with Dehacked a new monster with an ID # of a Doom 2 monster, no it won't appear in the game if you place it.



The same logic works both ways: If you give a Doom 2 monster another ID # in Dehacked it can be spawned in Doom 1. The only things that won't ever work are the SSG and the Megasphere.

Share this post


Link to post
StupidBunny said:

It's quite possible to replace animation frames for existing monsters, and speed and HP (as well as a lot of other aspects) can be altered with DeHacked or something similar. But if you put in a revamped version of a monster, will you want to keep the original version of the monster as well? Because if so, you won't be able to; the new monster will entirely replace the old one. If that's what you want then DECORATE won't be necessary. Otherwise, what is the error you're getting when you try running the WAD with DECORATE?


That is actually what I am trying to do right now, simply replace the monsters, weapons, & HUD with my own sprites, replacing some of the sounds as well.

I've been playing around with slumped & XWE for a few months now and I can't seem to get anywhere, despite all the tutorials and everything I read through.

For the record, I have very little experience with any sort of coding. I spent about half a year trying to learn C & C++ and then school started and I didn't have time to do any of that, forgetting a lot.

In slumped I figured you can't use BMPs or you'll have that annoying white box around your monster. In XWE I can't figure out how to even replace a sprite-which is really frustrating because I did it once a while ago and then I didn't have time to use XWE for too long can't figure out how I did it again.

THEN, in slumped whenever I replace sprites and try to save that into the WAD, it tells me I have to save as, so I try that and it says "saving is disallowed."

I wonder if anyone could help me with either of these programs. For instance, I'm trying to replace "SPOSA1" with my own zombie, so I find that sprite, and then try a gazillion different things, and I cannot figure out how in XWE to import the image. I don't want to mess with all that dehacked decorate stuff, just replace the images in XWE or some other WAD editor.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×