Quasar
Moderator

Posts: 2203
Registered: 08-00 |
DaniJ said:
I personally don't hold out much hope for something like this. No matter how I look at it, I keep coming back to the same conclusion; it will turn into an arms race whereby the port that requires feature X first gets to dictate its high level logic and users will begin to demand exacting compatibility when functionality is similar (again resulting in more racing). Non-democratic? Count me out in that case.
Furthermore, what about engines that are trying to diversify themselves from just DOOM/Heretic/Hexen/Strife?
Including BLOCKMAP, BSP and REJECT data in this seems wrong to me. They do not add additional data that is not implied by the core map data lumps (Doomsday for example would ignore all of them anyway). Is this supposed to be a new map format or just a replacement for the existing lumps using a textual representation?
I don't expect I'll be rushing to support this in Doomsday to be honest as it doesn't mesh with our goals imo.
This was designed with the idea of preventing an "arms race" by providing each developer with their own private namespace. This makes you free to do whatever you want within that space. As for "high level logic," there simply isn't any. There are not plans to add scripting or EDF-style data specification in the future. It's strictly a map format to which arbitrary fields can be added. As for what fields become part of the map standard, that is something that does have to be debated and decided upon. But I see no reason for anything that anyone needs to not be implemented. Ports will ignore fields they do not understand, and this does not add any significant overhead even if there are a million such keywords with respect to one port or another, because ignoring them all is done with the same bit of code.
The "non-democratic" part is meant to pertain to debates about the basic syntax and the wad lump organization. Suggesting that this should be stored in a container other than a wad (or anything else that Doom Builder supports) is self-defeating and would make this entire thing pointless. The last time we tried this, it died because of stuff like that, and I'm simply not going to entertain it this time around. Some things must be fixed in stone.
And most importantly, it has to become something that CodeImp will implement, and will be ABLE to implement with minimum trouble. This means, among other things:
1) No alternate file formats. The file format to be used isn't actually part of this specification anyway. It only assumes that the archive being used has a well-ordered directory, which unfortunately excludes straight zip files (but not wads inside zip files). Basically, if you can do a "GetNextLump" operation on the archive, it is supported by this specification.
2) No elaborate lump naming schemes. You should be able to name a map whatever you want. Doom Builder should not have to worry about breaking a map by renaming it, or having to respect some kind of correspondence between map lumps and their names.
3) Absolutely no external index lumps. CodeImp will absolutely not refer to any other lump in the wad to find or interpret any part of a map. He has made this perfectly clear. This is part of the problem with Eternity's ExtraData (although I have offered a solution to that issue already, one that may yet appear in the next release of EE).
4) No new entities. It will be restricted to defining the types of entities already used in Doom maps. There will not be blocks for scripts, thing types, etc., even though if this were a from-scratch format for a new game engine, such things would be logical and extremely useful to be able to include. They're outside the scope of this project, however.
I explicitly asked for the input of port authors and I intend to consider all of what is being said here. Expect the specification to see some major revisions. Particularly if/when we get any feedback from CodeImp, as he's the most important factor here.
Graf Zahl: Actually you do have a point as far as the thing names go... the problem is that it doesn't end up achieving the level of interoperability that I want. Example: EE and ZDoom call their particle fountains different things, even though they have the same doomednums and more or less identical behavior. Under the current scheme, we would end up with two identifiers, one in EE's namespace and one in ZDoom's namespace. Now, it would certainly be possible for implementing ports to cross-hash such names, but this requires a separate entry in some kind of lookup array for every such thing you want to remap. In time that would grow to be very large and convoluted. I fear the same thing may actually end up applying to all such names... and so I may need to go back to the drawing board on the entire names thing :/
One advantage of having names as at least an option however is the instant ability for Doom Builder to support custom-defined things by name. For example, if a User namespace were defined, and Eternity were to see User:MyNewBaron, it would interpret "MyNewBaron" as an EDF-defined thingtype name and would spawn an object of that mobjtype. This would work similarly for ZDoom's DECORATE.
The same thing cannot be said for doomednums because of the overlap they suffer between source ports. For example, Eternity's EDF reserves the doomednum range from 20000 to 32767 for user-defined thingtypes, whereas DECORATE seems to not define any such reserved range. So if a DECORATE thing in a ZDoom-oriented map in this format were to use the doomednum 7022, for example, it would in Eternity spawn a thingtype from Heretic (7xxx is the range EE uses for things translated from other games). Whereas User:DecorateThing would mean nothing to EE unless it were defined in a corresponding EDF, and it could spawn an "Unknown" object to denote that something unsupported is in that location.
The only real alternative to names is to create the disambiguated set of numbers I previously mentioned, and hash them to the "real" numbers when loading the map in a source port. This would require a giant and ever-expanding lookup table, however, and wouldn't have the benefit of supporting user-defined thing types since there is no way to account for them in the standard.
EDIT: Actually there's still a third alternative, and one I don't love. The third alternative is to go back to numbers, and to indicate in the map (using a global assignment statement) what source port the map is intended for. Then, an implementing port could:
1) Reject the map entirely when it sees that the intended port does not match. Seems kinda rude to me.
2) Process the map to remap any things/lines/sectors that don't match its own implementation -- ie, translating the map into a format it understands. This may result in an unplayable map, but it will contain the minimum number of glitches possible. This requires a lookup table for translating the numbers for each port you want to support.
3) Load the map naively and let everything malfunction (because after all, it's not designed for this port). This is what all ports currently do.
As for "non-Win32" reference tools, any code I write to deal with this map format will be 1) either public domain, BSD, or LGPL in license, and 2) completely portable with no system-specific code and no dependence on code from any particular Doom engine or editor. So I don't really see the point of asking for non-Windows-specific stuff when nothing being discussed here is Windows-specific in the first place :)
Last edited by Quasar on 01-15-08 at 16:35
|