Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Graf Zahl

PrBoom+/UMAPINFO v 2.5.1.7

Recommended Posts

Posted (edited)

I'll be trying to help anotak out, or at least trying to support playback of anotak's PRB+ demo format in Eternity. Demos are extremely important to PRBoom+ and without it this fork is a dead duck in an additional way beyond the UMAPINFO implementation being C++, which even as a mostly-unrepentant C++ apologist I reject, as it leaves use with the port with the alleged "reference" implementation of the feature unable to have this implementation used by Crispy, or other similar C-only projects.

 

C++ will do as a stopgap in the meantime though, and your implementation works just fine so as it stands it works for a good proof of concept. As an aside, why does https://github.com/coelckers/prboom-plus/blob/master/prboom2/src/scanner.cpp#L422 make it lower rather than upper (given that WADs are all upper to begin with, which will be the more likely format used)? Could I request that upper be the default, just so that the data in the demo footer doesn't need any additional messing with in every port that would want to support this format?

Edited by Altazimuth

Share this post


Link to post
Posted (edited)

There is an end-of-file terminator byte written at the end of every demo. We could simply add key/value pairs after that. I am doing exactly this for Crispy's extended savegame format. 

The resulting savegames remain vanilla compatible and the extra information can be read out by ports that "know the trick".

 

Edit: I have seen that PrBoom+ already uses a similar trick. It stores an entire WAD structure beyond the end-of-demo byte which contains a lump that contains the mouse view angle for each tic. We could extend this approach and include the entire UMAPINFO lump in this WAD structure and parse that when the demo starts. Problem solved. ;-)

Edited by fabian

Share this post


Link to post
7 hours ago, Ribbiks said:

Possibly a stupid question: Would the support for udmf/acs negatively affect performance?

 

Out of curiosity, I converted Sunder's recent (and already rather infamous) Map 15 into UDMF to see if it had any impact on FPS compared to the vanilla Doom map format.  Granted this was only tested in GZDoom, but from what I could tell there was no noticeable difference in FPS between the two versions.

Share this post


Link to post

Oh, hot damn, an official release. I guess I should hurry up and post a demo of the WAD I was making for this feature so people have something to play with, then. Maybe I'll look into getting that out by next week? Art assets wouldn't be particularly ready and regrettably I'd be getting feedback from other players on map balancing for the first time, but it's something.

Share this post


Link to post
5 hours ago, Altazimuth said:

I'll be trying to help anotak out, or at least trying to support playback of anotak's PRB+ demo format in Eternity. Demos are extremely important to PRBoom+ and without it this fork is a dead duck in an additional way beyond the UMAPINFO implementation being C++, which even as a mostly-unrepentant C++ apologist I reject, as it leaves use with the port with the alleged "reference" implementation of the feature unable to have this implementation used by Crispy, or other similar C-only projects. 

 

 

What is it with this obsession to have all code in C? I find the language almost unworkable for projects this complex. Are there really systems these days that may need support and do not have a working C++ compiler? No, I'm not talking about 20 year old dinosaurs with some fringe interest group of a handful of people. Hell, I even developed software in C++ for the Playstation 1 over 20 years ago and that was the most limited thing I ever worked with!

 

The main problem I see here is that if we move forward with other features that could be taken from other sources, they nearly always come in the form of C++ code, not C, so there's no way borrowing code - only yesterday I had to amputate the xs_Float header to make it compile as plain C, to fix the OpenGL graphics glitch.

 

There's also the fact that PrBoom+ is a hideously ugly codebase, solely owed to the fact that the language provides nothing in form of encapsulating dirty code like the complevel stuff in a reusable and replaceable form - instead it's all spread out through the entire code base and makes large portions hard to read - it makes it even harder to streamline portions of the code where alternative implementations might be called through a polymorphic interface.

 

 

 

5 hours ago, Altazimuth said:

C++ will do as a stopgap in the meantime though, and your implementation works just fine so as it stands it works for a good proof of concept. As an aside, why does https://github.com/coelckers/prboom-plus/blob/master/prboom2/src/scanner.cpp#L422 make it lower rather than upper (given that WADs are all upper to begin with, which will be the more likely format used)? Could I request that upper be the default, just so that the data in the demo footer doesn't need any additional messing with in every port that would want to support this format?

 

Don't ask me, I took that code from another project because it suited my purpose here without having to rewrite a complete parser in naked C.

 

1 hour ago, Bauul said:

Out of curiosity, I converted Sunder's recent (and already rather infamous) Map 15 into UDMF to see if it had any impact on FPS compared to the vanilla Doom map format.  Granted this was only tested in GZDoom, but from what I could tell there was no noticeable difference in FPS between the two versions.

 

Hardly surprising, because internally both maps will end up nearly identically, except for some minor configuration settings like line trigger semantics.

 

20 minutes ago, Shadow Hog said:

Oh, hot damn, an official release.

 

I'll do another one this evening due to the OpenGL render bug, this should also change the issue pointed out by Altazimuth about lowercasing identifiers.

 

Share this post


Link to post
Posted (edited)
6 hours ago, Altazimuth said:

beyond the UMAPINFO implementation being C++, which even as a mostly-unrepentant C++ apologist I reject, as it leaves use with the port with the alleged "reference" implementation of the feature unable to have this implementation used by Crispy, or other similar C-only projects.

 

If it's useful, I have adapted it to C for the Libretro PrBoom Port, you can find it here: https://github.com/Ferk/libretro-prboom/tree/umapinfo/src (scanner.cpp is uf_scanner.c)

Edited by Ferk

Share this post


Link to post
6 hours ago, fabian said:

There is an end-of-file terminator byte written at the end of every demo. We could simply add key/value pairs after that. I am doing exactly this for Crispy's extended savegame format. 

The resulting savegames remain vanilla compatible and the extra information can be read out by ports that "know the trick".

 

Edit: I have seen that PrBoom+ already uses a similar trick. It stores an entire WAD structure beyond the end-of-demo byte which contains a lump that contains the mouse view angle for each tic. We could extend this approach and include the entire UMAPINFO lump in this WAD structure and parse that when the demo starts. Problem solved. ;-)

i believe you misunderstood the issue. the demo-recording folks (dew et al) specifically requested a change for the header and not the footer specifically in order to require the playback port to have the UMAPINFO support. while i didn't read most of the original umapinfo thread, i believe some discussion about this may have been had there. in any case, i was approached by people who actually use demos regularly / people who consider PR+ to be their primary port, and had the situation explained to me, and if they want to elaborate on it, i'd rather they do so than me.

Share this post


Link to post

If you use the 2 key SR50 option in versions of PrBoom+ have have it, can you still SR50 normally without the 2 key input?

Share this post


Link to post

I just made a change to the demo versioning so that UMAPINFO-based demos are made incompatible with other engines.

To avoid changing more of the demo detection logic this simply prepends a demo version value that does not exist and starts recording the demo as normal with the second byte, so that it can be combined with all existing formats.

 

A new version will be released later today.

 

Regarding further feature additions, there's one thing where I may need some help.

Since demo compatibility is important I'd like to set up some automatic testing where the engine can be run through a list of demos without any rendering and time delays and in the end output a checksum that then can be compared against a reference list. Has anybody done something like that before so I could borrow that code?

 

Also, does some list of good demos to test exist, preferably some that contain some edge cases?

 

Share this post


Link to post
3 hours ago, Graf Zahl said:

Since demo compatibility is important I'd like to set up some automatic testing where the engine can be run through a list of demos without any rendering and time delays and in the end output a checksum that then can be compared against a reference list. Has anybody done something like that before so I could borrow that code?

 

Unsure if it meets all those criteria, but Chocolate Doom's statcheck might be an ok place to start? this thread has a list of overflow-affected demos that would be good to include,  also the "odd demos" list. Based on the comments in this other thread it looks like wesleyjohnson and kb1 have put some work into desync-detection suites, but I'm unsure if that's publicly available anywhere.

Share this post


Link to post
Just now, Ribbiks said:

 

Unsure if it meets all those criteria, but Chocolate Doom's statcheck might be an ok place to start? this thread has a list of overflow-affected demos that would be good to include,  also the "odd demos" list. Based on the comments in this other thread it looks like wesleyjohnson and kb1 have put some work into desync-detection suites, but I'm unsure if that's publicly available anywhere. 

 

Thanks, that might help. The main reason I was asking is that just for fun I tried to compile the source as C++ to see how many errors I'd get, but that popped up a few places where proper demo compatibility might depend on how a compiler implements certain things - the lack of type checking in C has definitely led to a few hidden programming errors, e.g. some booleans can take values other than true or false, or the size of enums is implicitly assumed and things like that. I'm also not sure that compiling as 64 bit will properly preserve all overflow conditions, because struct alignment may differ. This all needs to be tested eventually.

 

Share this post


Link to post

Only if you load the UMAPINFO that has been posted above. GZDoom and EE load Sigil as-is because it contains MAPINFOs for both - but it doesn't contain any UMAPINFO.

 

Share this post


Link to post
Posted (edited)
30 minutes ago, Sector 147 said:

Does this new version of PrBoom+ support 5 episodes like GZDoom and EE?

 

Yes. For the lazy, here's a WAD file that just contains @Shadow Hog's Sigil UMAPINFO (load with the standard SIGIL and SIGIL_SHREDS, not the compat versions):

sigil_umapinfo.zip

Share this post


Link to post
Posted (edited)

The fluidsynth playback quality seems to have been degraded since 2.5.1.4. 2.5.1.7's seems muffled and crackly.
I attached an audio file comparing the two using the same soundfont, first 2.5.1.4 then 2.5.1.7.
(EDIT: Actually, I think all audio sounded cleaner before)

fluid.zip

Edited by DANZA

Share this post


Link to post
Posted (edited)

Having trouble getting this UMAPINFO for Eviternity to work. On the main menu, I go from new game to the skill select menu, no episode select, and choosing one of the skills only plays the pistol noise without actually starting the game.

 

Spoiler

//UMAPINFO for EVITERNITY

map MAP01 
{
	levelname = "Inauguration"
	levelpic = "CWILV00"
	next = "MAP02"
	nextsecret = "MAP02"
	skytexture = "OSKY28"
	partime = 35
	music = "D_RUNNIN"
	episode = clear
	episode = "M_EPI1", "Chapter I: Archaic", "R"
}

map MAP02
{
	levelname = "Subterranean" 
	levelpic = "CWILV01"
	next = "MAP03"
	nextsecret = "MAP03"
	skytexture = "OSKY28"
	partime = 80
	music = "D_STALKS"
}

map MAP03
{
	levelname = "Drain" 
	levelpic = "CWILV02"
	next = "MAP04"
	nextsecret = "MAP04"
	skytexture = "OSKY28"
	partime = 60
	music = "D_COUNTD"
}

map MAP04
{
	levelname = "Regicide" 
	levelpic = "CWILV03"
	next = "MAP05"
	nextsecret = "MAP05"
	skytexture = "OSKY28"
	partime = 330
	music = "D_BETWEE"
}

map MAP05
{
	levelname = "Demon" 
	levelpic = "CWILV04"
	next = "MAP06"
	nextsecret = "MAP06"
	skytexture = "OSKY28"
	partime = 100
	music = "D_DOOM"
}

map MAP06
{
	levelname = "Reconnect" 
	levelpic = "CWILV05"
	next = "MAP07"
	nextsecret = "MAP07"
	skytexture = "OSKY03"
	partime = 180
	music = "D_THE_DA"
	episode = "M_EPI2", "Chapter II: Automation", "A"
	interbackdrop = "OGRATB02"
	intermusic = "D_READ_M"
	intertext = 
	"In the farthest reaches, a Light",
	"awoke, and cast his luminous rays",
	"on all around him.",
	" ",
	"He fashioned a world unto his image,",
	"created beasts of his will, and declared",
	"himself eternal, ruler of his domain.",
	" ",
	"But his hubris cast a sickness, and",
	"from distant worlds called forth ",
	"the agent of retribution, drawn ",
	"through the cosmos by his pride.  ",
	" ",
	"It cast down his beasts, it rejected ",
	"his rule, and through lands eternal ",
	"it brought forth his doom."
}

map MAP07
{
	levelname = "Facilitate" 
	levelpic = "CWILV06"
	next = "MAP08"
	nextsecret = "MAP08"
	skytexture = "OSKY03"
	partime = 85
	music = "D_SHAWN"
}

map MAP08
{
	levelname = "Stench" 
	levelpic = "CWILV07"
	next = "MAP09"
	nextsecret = "MAP09"
	skytexture = "OSKY03"
	partime = 140
	music = "D_DDTBLU"
}

map MAP09
{
	levelname = "Decrepitude"
	levelpic = "CWILV08"
	next = "MAP10"
	nextsecret = "MAP10"
	skytexture = "OSKY03"
	partime = 105
	music = "D_IN_CIT"
}

map MAP10
{
	levelname = "Creation" 
	levelpic = "CWILV09"
	next = "MAP11"
	nextsecret = "MAP11"
	skytexture = "OSKY03"
	partime = 210
	music = "D_DEAD"
}

map MAP11
{
	levelname = "Wanderer" 
	levelpic = "CWILV10"
	next = "MAP12"
	nextsecret = "MAP12"
	skytexture = "OSKY43"
	partime = 180
	music = "D_STLKS2"
	episode = "M_EPI3", "Chapter III: Crystalline", "C"
	interflat = "OATRICEA"
	music = "D_READ_M"
	intertext = 
	"The shadow of destiny casts deep.",
	"But betrayed by his immodesty, the",
	"Light ignored his fate, and with",
	"insolence burned bright across his",
	"domain.",
	" ",
	"It was to be his undoing, as with",
	"undying vengeance, his boastful pride",
	"drew ever closer the jaws of his",
	"unmaking."
}

map MAP12
{
	levelname = "Brisk" 
	levelpic = "CWILV11"
	next = "MAP13"
	nextsecret = "MAP13"
	skytexture = "OSKY43"
	partime = 240
	music = "D_THEDA2"
}

map MAP13
{
	levelname = "Pathfinder" 
	levelpic = "CWILV12"
	next = "MAP14"
	nextsecret = "MAP14"
	skytexture = "OSKY43"
	partime = 330
	music = "D_DOOM2"
}

map MAP14
{
	levelname = "Frimaire" 
	levelpic = "CWILV13"
	next = "MAP15"
	nextsecret = "MAP15"
	skytexture = "OSKY43"
	partime = 270
	music = "D_DDTBL2"
}

map MAP15
{
	levelname = "Cryonology" 
	levelpic = "CWILV14"
	next = "MAP16"
	nextsecret = "MAP31"
	skytexture = "ODFSKY45"
	partime = 660
	music = "D_RUNNI2"
	interbackdrop = "OMRBLJ91"
	intermusic = "D_READ_M"
	intertextsecret = 
	"The sands of the cosmos shift, and a",
	"new path reveals.",
	" ",
	"What dwells in such brooding corners?",
	" ",
	"Go forth, for there are other worlds",
	"than these."
}

map MAP16
{
	levelname = "Neutralize" 
	levelpic = "CWILV15"
	next = "MAP17"
	nextsecret = "MAP17"
	skytexture = "OSKY01"
	partime = 195
	music = "D_DEAD2"
	episode = "M_EPI4", "Chapter IV: Brutality", "B"
}

map MAP17
{
	levelname = "Segregation" 
	levelpic = "CWILV16"
	next = "MAP18"
	nextsecret = "MAP18"
	skytexture = "OSKY01"
	partime = 270
	music = "D_STLKS3"
}

map MAP18
{
	levelname = "Subterfuge" 
	levelpic = "CWILV17"
	next = "MAP19"
	nextsecret = "MAP19"
	skytexture = "OSKY01"
	partime = 180
	music = "D_ROMERO"
}

map MAP19
{
	levelname = "Dehydration" 
	levelpic = "CWILV18"
	next = "MAP20"
	nextsecret = "MAP20"
	skytexture = "OSKY01"
	partime = 2340
	music = "D_SHAWN2"
}

map MAP20
{
	levelname = "Convolute" 
	levelpic = "CWILV19"
	next = "MAP21"
	nextsecret = "MAP21"
	skytexture = "OSKY01"
	partime = 405
	music = "D_MESSAG"
	interflat = "OMRBLD91"
	intermusic = "D_READ_M"
	intertext = 
	"Rejecting his fate, the Light fled,",
	"retreating ever deeper into his pride.",
	"But unwilling to repent, his retribution",
	"followed swiftly behind.",
	" ",
	"Through frozen wilderness, distant stars",
	"and blasted heat it strode, casting aside",
	"all who stood before it.  Unstoppable, ",
	"unbendable, it pursued the Light, marching",
	"ever forward with the unbreakable will",
	"of inevitability."
}

map MAP21
{
	levelname = "Imperishable" 
	levelpic = "CWILV20"
	next = "MAP22"
	nextsecret = "MAP22"
	skytexture = "OSKY25"
	partime = 90
	music = "D_COUNT2"
	episode = "M_EPI5", "Chapter V: Descension", "D"
}

map MAP22
{
	levelname = "Viscera" 
	levelpic = "CWILV21"
	next = "MAP23"
	nextsecret = "MAP23"
	skytexture = "OSKY25"
	partime = 240
	music = "D_DDTBL3"
}

map MAP23
{
	levelname = "Tribulation" 
	levelpic = "CWILV22"
	next = "MAP24"
	nextsecret = "MAP24"
	skytexture = "OSKY25"
	partime = 210
	music = "D_AMPIE"
}

map MAP24
{
	levelname = "Gossamer" 
	levelpic = "CWILV23"
	next = "MAP25"
	nextsecret = "MAP25"
	skytexture = "OSKY25"
	partime = 540
	music = "D_THEDA3"
}

map MAP25
{
	levelname = "Slave" 
	levelpic = "CWILV24"
	next = "MAP26"
	nextsecret = "MAP26"
	skytexture = "OSKY25"
	partime = 165
	music = "D_ADRIAN"
}

map MAP26
{
	levelname = "Transcendence" 
	levelpic = "CWILV25"
	next = "MAP27"
	nextsecret = "MAP27"
	skytexture = "OSKY42"
	partime = 150
	music = "D_MESSG2"
	episode = "M_EPI6", "Chapter VI: Hallowed", "H"
	
}

map MAP27
{
	levelname = "Heliopolis" 
	levelpic = "CWILV26"
	next = "MAP28"
	nextsecret = "MAP28"
	skytexture = "OSKY47"
	partime = 240
	music = "D_ROMER2"
}

map MAP28
{
	levelname = "Judgement" 
	levelpic = "CWILV27"
	next = "MAP29"
	nextsecret = "MAP29"
	skytexture = "OSKY47"
	partime = 225
	music = "D_TENSE"
}

map MAP29
{
	levelname = "Elysium" 
	levelpic = "CWILV28"
	next = "MAP30"
	nextsecret = "MAP30"
	skytexture = "OSKY47"
	partime = 330
	music = "D_SHAWN3"
}

map MAP30
{
	levelname = "Eternity" 
	levelpic = "CWILV29"
	skytexture = "OSKY38"
	partime = 180
	music = "D_OPENIN"
	endcast = true
	interflat = "OMRBLL01"
	intermusic = "D_READ_M"
	intertext = 
	"Undone by his conceit, retribution",
	"came swift and absolute. The Light ",
	"was extinguished, and his pride ",
	"vanquished to the abominable void.",
	" ",
	"Amid the smoking ruins of his vanity,",
	"the agent of Retribution stood unbowed",
	"and unyielding.",
	" ",
	"Towards the churning horizon its gaze",
	"fell, and onwards it marched, forever",
	"vigilant on its eternal pilgrimage."
}

map MAP31
{
	levelname = "Imperator" 
	levelpic = "CWILV30"
	next = "MAP32"
	nextsecret = "MAP32"
	skytexture = "OSKY01"
	partime = 900
	music = "D_EVIL"
	interflat = "ONMLMD05"
	intermusic = "D_READ_M"
	intertextsecret = 
	"A vast edifice, shrouded by ",
	"indecision, looms ahead. It",
	"beckons, daunts and entices.",
	" ",
	"Through fire above and fire",
	"below, toward a startling discovery.",
	" ",
	"The path lies unkempt."
}

map MAP32
{
	levelname = "Anagnorisis" 
	levelpic = "CWILV31"
	next = "MAP16"
	nextsecret = "MAP16"
	skytexture = "OSKY37"
	partime = 1800
	music = "D_ULTIMA"
}

 

 

Share this post


Link to post
Posted (edited)

Since performance was brought up recently, how does this little bad boy perform compared to 2.5.1.5? I'm kinda waiting for one or two more versions before I try it out (no idea how (un)polished it is at the moment... ).

 

I expect the performance to be overall inferior to the other since that was compiled with some Intel tool that gives a boost in performance, as far as various comments I've read claim anyway. It would definitely suck if the difference is pretty noticeable as it would kill one of PrBoom's advantages vs the rest of the available ports.

Share this post


Link to post
1 hour ago, TheMightyHeracross said:

Having trouble getting this UMAPINFO for Eviternity to work. On the main menu, I go from new game to the skill select menu, no episode select, and choosing one of the skills only plays the pistol noise without actually starting the game.

 

  Reveal hidden contents


//UMAPINFO for EVITERNITY

map MAP01 
{
	levelname = "Inauguration"
	levelpic = "CWILV00"
	next = "MAP02"
	nextsecret = "MAP02"
	skytexture = "OSKY28"
	partime = 35
	music = "D_RUNNIN"
	episode = clear
	episode = "M_EPI1", "Chapter I: Archaic", "R"
}

map MAP02
{
	levelname = "Subterranean" 
	levelpic = "CWILV01"
	next = "MAP03"
	nextsecret = "MAP03"
	skytexture = "OSKY28"
	partime = 80
	music = "D_STALKS"
}

map MAP03
{
	levelname = "Drain" 
	levelpic = "CWILV02"
	next = "MAP04"
	nextsecret = "MAP04"
	skytexture = "OSKY28"
	partime = 60
	music = "D_COUNTD"
}

map MAP04
{
	levelname = "Regicide" 
	levelpic = "CWILV03"
	next = "MAP05"
	nextsecret = "MAP05"
	skytexture = "OSKY28"
	partime = 330
	music = "D_BETWEE"
}

map MAP05
{
	levelname = "Demon" 
	levelpic = "CWILV04"
	next = "MAP06"
	nextsecret = "MAP06"
	skytexture = "OSKY28"
	partime = 100
	music = "D_DOOM"
}

map MAP06
{
	levelname = "Reconnect" 
	levelpic = "CWILV05"
	next = "MAP07"
	nextsecret = "MAP07"
	skytexture = "OSKY03"
	partime = 180
	music = "D_THE_DA"
	episode = "M_EPI2", "Chapter II: Automation", "A"
	interbackdrop = "OGRATB02"
	intermusic = "D_READ_M"
	intertext = 
	"In the farthest reaches, a Light",
	"awoke, and cast his luminous rays",
	"on all around him.",
	" ",
	"He fashioned a world unto his image,",
	"created beasts of his will, and declared",
	"himself eternal, ruler of his domain.",
	" ",
	"But his hubris cast a sickness, and",
	"from distant worlds called forth ",
	"the agent of retribution, drawn ",
	"through the cosmos by his pride.  ",
	" ",
	"It cast down his beasts, it rejected ",
	"his rule, and through lands eternal ",
	"it brought forth his doom."
}

map MAP07
{
	levelname = "Facilitate" 
	levelpic = "CWILV06"
	next = "MAP08"
	nextsecret = "MAP08"
	skytexture = "OSKY03"
	partime = 85
	music = "D_SHAWN"
}

map MAP08
{
	levelname = "Stench" 
	levelpic = "CWILV07"
	next = "MAP09"
	nextsecret = "MAP09"
	skytexture = "OSKY03"
	partime = 140
	music = "D_DDTBLU"
}

map MAP09
{
	levelname = "Decrepitude"
	levelpic = "CWILV08"
	next = "MAP10"
	nextsecret = "MAP10"
	skytexture = "OSKY03"
	partime = 105
	music = "D_IN_CIT"
}

map MAP10
{
	levelname = "Creation" 
	levelpic = "CWILV09"
	next = "MAP11"
	nextsecret = "MAP11"
	skytexture = "OSKY03"
	partime = 210
	music = "D_DEAD"
}

map MAP11
{
	levelname = "Wanderer" 
	levelpic = "CWILV10"
	next = "MAP12"
	nextsecret = "MAP12"
	skytexture = "OSKY43"
	partime = 180
	music = "D_STLKS2"
	episode = "M_EPI3", "Chapter III: Crystalline", "C"
	interflat = "OATRICEA"
	music = "D_READ_M"
	intertext = 
	"The shadow of destiny casts deep.",
	"But betrayed by his immodesty, the",
	"Light ignored his fate, and with",
	"insolence burned bright across his",
	"domain.",
	" ",
	"It was to be his undoing, as with",
	"undying vengeance, his boastful pride",
	"drew ever closer the jaws of his",
	"unmaking."
}

map MAP12
{
	levelname = "Brisk" 
	levelpic = "CWILV11"
	next = "MAP13"
	nextsecret = "MAP13"
	skytexture = "OSKY43"
	partime = 240
	music = "D_THEDA2"
}

map MAP13
{
	levelname = "Pathfinder" 
	levelpic = "CWILV12"
	next = "MAP14"
	nextsecret = "MAP14"
	skytexture = "OSKY43"
	partime = 330
	music = "D_DOOM2"
}

map MAP14
{
	levelname = "Frimaire" 
	levelpic = "CWILV13"
	next = "MAP15"
	nextsecret = "MAP15"
	skytexture = "OSKY43"
	partime = 270
	music = "D_DDTBL2"
}

map MAP15
{
	levelname = "Cryonology" 
	levelpic = "CWILV14"
	next = "MAP16"
	nextsecret = "MAP31"
	skytexture = "ODFSKY45"
	partime = 660
	music = "D_RUNNI2"
	interbackdrop = "OMRBLJ91"
	intermusic = "D_READ_M"
	intertextsecret = 
	"The sands of the cosmos shift, and a",
	"new path reveals.",
	" ",
	"What dwells in such brooding corners?",
	" ",
	"Go forth, for there are other worlds",
	"than these."
}

map MAP16
{
	levelname = "Neutralize" 
	levelpic = "CWILV15"
	next = "MAP17"
	nextsecret = "MAP17"
	skytexture = "OSKY01"
	partime = 195
	music = "D_DEAD2"
	episode = "M_EPI4", "Chapter IV: Brutality", "B"
}

map MAP17
{
	levelname = "Segregation" 
	levelpic = "CWILV16"
	next = "MAP18"
	nextsecret = "MAP18"
	skytexture = "OSKY01"
	partime = 270
	music = "D_STLKS3"
}

map MAP18
{
	levelname = "Subterfuge" 
	levelpic = "CWILV17"
	next = "MAP19"
	nextsecret = "MAP19"
	skytexture = "OSKY01"
	partime = 180
	music = "D_ROMERO"
}

map MAP19
{
	levelname = "Dehydration" 
	levelpic = "CWILV18"
	next = "MAP20"
	nextsecret = "MAP20"
	skytexture = "OSKY01"
	partime = 2340
	music = "D_SHAWN2"
}

map MAP20
{
	levelname = "Convolute" 
	levelpic = "CWILV19"
	next = "MAP21"
	nextsecret = "MAP21"
	skytexture = "OSKY01"
	partime = 405
	music = "D_MESSAG"
	interflat = "OMRBLD91"
	intermusic = "D_READ_M"
	intertext = 
	"Rejecting his fate, the Light fled,",
	"retreating ever deeper into his pride.",
	"But unwilling to repent, his retribution",
	"followed swiftly behind.",
	" ",
	"Through frozen wilderness, distant stars",
	"and blasted heat it strode, casting aside",
	"all who stood before it.  Unstoppable, ",
	"unbendable, it pursued the Light, marching",
	"ever forward with the unbreakable will",
	"of inevitability."
}

map MAP21
{
	levelname = "Imperishable" 
	levelpic = "CWILV20"
	next = "MAP22"
	nextsecret = "MAP22"
	skytexture = "OSKY25"
	partime = 90
	music = "D_COUNT2"
	episode = "M_EPI5", "Chapter V: Descension", "D"
}

map MAP22
{
	levelname = "Viscera" 
	levelpic = "CWILV21"
	next = "MAP23"
	nextsecret = "MAP23"
	skytexture = "OSKY25"
	partime = 240
	music = "D_DDTBL3"
}

map MAP23
{
	levelname = "Tribulation" 
	levelpic = "CWILV22"
	next = "MAP24"
	nextsecret = "MAP24"
	skytexture = "OSKY25"
	partime = 210
	music = "D_AMPIE"
}

map MAP24
{
	levelname = "Gossamer" 
	levelpic = "CWILV23"
	next = "MAP25"
	nextsecret = "MAP25"
	skytexture = "OSKY25"
	partime = 540
	music = "D_THEDA3"
}

map MAP25
{
	levelname = "Slave" 
	levelpic = "CWILV24"
	next = "MAP26"
	nextsecret = "MAP26"
	skytexture = "OSKY25"
	partime = 165
	music = "D_ADRIAN"
}

map MAP26
{
	levelname = "Transcendence" 
	levelpic = "CWILV25"
	next = "MAP27"
	nextsecret = "MAP27"
	skytexture = "OSKY42"
	partime = 150
	music = "D_MESSG2"
	episode = "M_EPI6", "Chapter VI: Hallowed", "H"
	
}

map MAP27
{
	levelname = "Heliopolis" 
	levelpic = "CWILV26"
	next = "MAP28"
	nextsecret = "MAP28"
	skytexture = "OSKY47"
	partime = 240
	music = "D_ROMER2"
}

map MAP28
{
	levelname = "Judgement" 
	levelpic = "CWILV27"
	next = "MAP29"
	nextsecret = "MAP29"
	skytexture = "OSKY47"
	partime = 225
	music = "D_TENSE"
}

map MAP29
{
	levelname = "Elysium" 
	levelpic = "CWILV28"
	next = "MAP30"
	nextsecret = "MAP30"
	skytexture = "OSKY47"
	partime = 330
	music = "D_SHAWN3"
}

map MAP30
{
	levelname = "Eternity" 
	levelpic = "CWILV29"
	skytexture = "OSKY38"
	partime = 180
	music = "D_OPENIN"
	endcast = true
	interflat = "OMRBLL01"
	intermusic = "D_READ_M"
	intertext = 
	"Undone by his conceit, retribution",
	"came swift and absolute. The Light ",
	"was extinguished, and his pride ",
	"vanquished to the abominable void.",
	" ",
	"Amid the smoking ruins of his vanity,",
	"the agent of Retribution stood unbowed",
	"and unyielding.",
	" ",
	"Towards the churning horizon its gaze",
	"fell, and onwards it marched, forever",
	"vigilant on its eternal pilgrimage."
}

map MAP31
{
	levelname = "Imperator" 
	levelpic = "CWILV30"
	next = "MAP32"
	nextsecret = "MAP32"
	skytexture = "OSKY01"
	partime = 900
	music = "D_EVIL"
	interflat = "ONMLMD05"
	intermusic = "D_READ_M"
	intertextsecret = 
	"A vast edifice, shrouded by ",
	"indecision, looms ahead. It",
	"beckons, daunts and entices.",
	" ",
	"Through fire above and fire",
	"below, toward a startling discovery.",
	" ",
	"The path lies unkempt."
}

map MAP32
{
	levelname = "Anagnorisis" 
	levelpic = "CWILV31"
	next = "MAP16"
	nextsecret = "MAP16"
	skytexture = "OSKY37"
	partime = 1800
	music = "D_ULTIMA"
}

 

 

Ah, yes, you're encountering the same roadblock I am. I was gonna post an example WAD when I was at home and thus in a position to do so, but due to Father's Day I am presently not. My own observations:

 

  • Episode selection appears to work correctly for Ultimate Doom, so SIGIL should work correctly.
  • Episode selection does not work for Doom 2 (and presumably Final Doom as such but I didn't try those). If you define new episodes, the episode selection screen will not appear at all, only the skill selection screen. It does, however, load MAP01 just fine at the selected skill.
  • The above is true if you do not use "episode = clear". If you do use "episode = clear", you still won't get the episode selection screen in Doom 2, but now the issue TheMightyHeracross encounters appears: the skill selections do not work at all, except for Nightmare!, which will progress into MAP01 as expected.

 

I'll see if I can't still get my example WAD uploaded later today, because I have some bug reports with GZDoom's implementation as well so it'll cover those as well as this.

Share this post


Link to post
49 minutes ago, seed said:

Since performance was brought up recently, how does this little bad boy perform compared to 2.5.1.5? I'm kinda waiting for one or two more versions before I try it out (no idea how (un)polished it is at the moment... ).

 

I expect the performance to be overall inferior to the other since that was compiled with some Intel tool that gives a boost in performance, as far as various comments I've read claim anyway. It would definitely suck if the difference is pretty noticeable as it would kill one of PrBoom's advantages vs the rest of the available ports.

 

The software renderer performs worse, but that's hardly surprising because the drawer code has been heavily tuned for the Intel compiler, to the point that it's barely understandable anymore.

 

While testing drawer performance with MSVC on GZDoom one thing we found was that the less the code is tuned, the better it performs and as a result all the hand tuned code was thrown out. 64 bit also made a huge difference, but PrBoom+ isn't set up for that yet - I don't even know if the code is compatible.

 

For the hardware renderer, MSVC 2019 has better performance.

 

Share this post


Link to post
Posted (edited)
23 minutes ago, Graf Zahl said:

The software renderer performs worse, but that's hardly surprising because the drawer code has been heavily tuned for the Intel compiler, to the point that it's barely understandable anymore.

 

While testing drawer performance with MSVC on GZDoom one thing we found was that the less the code is tuned, the better it performs and as a result all the hand tuned code was thrown out. 64 bit also made a huge difference, but PrBoom+ isn't set up for that yet - I don't even know if the code is compatible.

 

For the hardware renderer, MSVC 2019 has better performance.

 

Hm, so the SW rendered is pretty much bonked for the time being. Eh, not a big deal as it performs worse in large/complex maps with lots of enemies anyway. OpenGL would have definitely been though, but if it still performs well that's good.

 

Do you plan on updating the MIDI players? I've noticed a while ago than Fluidsynth is definitely worse in PrBoom+ than in GZDoom, and according to a topic on github, OPL2 is also worse than it is in other ports (+ worse performance and less accurate). Not going to ask about Portmidi as I have never used it in other ports apart from PrBoom.

 

Has the SDL in this version been updated since 2.5.1.5?

Share this post


Link to post
3 minutes ago, Altazimuth said:

Scope creep.

 

Not really, all this means is that you won't have to follow the strict 32-map / 4 9-map episode formats for Doom 2 or Ultimate Doom wads. 

Share this post


Link to post
Posted (edited)

Not UMAPINFO, all the other fucktillion random ramblings. We need to keep FOCUSED.

Share this post


Link to post
Posted (edited)

Absolutely fucking scope creep. Keep it in your pants, people.

 

First of all, I would like to thank Graf for his work. He pulled through and did a minimal demo header implementation for the umapinfo branch, so we have something that does implement what I was crying about. I'm honestly thankful! However the implementation is rudimentary and anotak is already working on a more nuanced solution that would 1) by what seems like a lucky accident act like an extension of Graf's implementation, 2) would copy Eternity's approach to header extension.

 

Basically, yeah. 0xff as the first byte is the way to go. But Eternity already does this, so it's not an "invalid" value. But Eternity then adds its own identifier string to the header, and anotak proposes that pr+ would do the same with its own string. Eternity also follows up with a field for its full version. prboom+ stuffed a lot of this info in the footer historically, but since this is a compat-breaking implementation altogether, we could discuss what's appropriate for the header and for the footer. I'm sure anotak will talk about the details soon enough, but for now... good job, but let's try to make it even better!

 

As for the rest, I'm 100% opposed against this thread becoming a vessel to implement anything but UMAPINFO and the demo implications. This is not the thread where you ask devs to implement washing your dishes during nodebuilding. Also the new name of prboom-plus shoud be prboom-plus, have a nice day.

Share this post


Link to post

hey, been kinda sick the past few days, still sick, so this wasn't really my focus.

demo-extension.png

 

i'm gonna break down what's going on here with this header. like Dew mentioned, 0xFF is already used by EE which uses the "ETRN" string after. considering EE is the other port that really cares about demo support, I feel like we shouldn't mess with that precedent without using an ID string. EE devs are planning to eventually add support for reading PRBoom's demos, so I especially felt it was relevant.

 

So I wanted a format that is more future-safe in terms of adding features for this, so I went with a list of strings. The idea is that if an unidentified string is encountered, the port can either just stop, or warn the user, or something else. Part of the reason for this is that if other ports like EE want to support PRB+ demos, this may allow them to do so in a piece-by-piece fashion.

 

0xFF, "PRB+", identifies this as this prboom+ format demo lump

0x01 is a version number (although I'm not sure why this would be needed)

 

and then we have a list of N strings with M length each, so in this case

N = 0x01, so 1 string

M[0] = 0x08, so the string is 8 long,

the string itself is "UMAPINFO"

 

now, since there was only 1 string, the list is over.

An important detail here is that because UMAPINFO may eventually support arbitrary lump names, I have it parsing the level name from a string. This only happens if the "UMAPINFO" string is encountered in the list, the 0xFF "PRB+" doesnt affect that. so as in the screenshot, you see "MAP01" followed by the null bytes. while right now the UMAPINFO implementation doesn't support arbitrary lump name loading as far as I can tell, there's no reason to not be future-proof about this. When this happens, the map / episode bytes from the demo are ignored.

 

anyway, i did these changes before your commit obviously, and i haven't had a chance to fully test them:

https://github.com/anotak/prboom-plus/commit/eff0f9fc282489a5794733b2204a565df9a28042

 

they load correctly and play back correctly on the few things that i tested, I just wanted something more thorough and I also wanted some feedback from the prb+ demo users? I sent a build out on discord.

 

unfortunately this leaves the umapinfo_loaded variable graf added unused, but that can be fixed. just, like i said, i've been sick, so i'm mainly posting this to get this out there.

 

Share this post


Link to post
Posted (edited)

Plopping this back in the thread it belongs in after it got moved to a thread about naming: as far as wide-eyed dreams for this port go, I really don't have any features to suggest that aren't directly related to UMAPINFO itself (and at the moment that'd just be stuff like NoJump and NoCrouch, stuff that this particular port would ignore but jump-and-crouch-implementing ports would use as they would in their own MAPINFO implementations; maybe intermission definitions a la Doom [1] as well, though that's super low-priority for me). Anything else would be more in the purview of kb1's proposed enhanced-port standard, and the place to discuss that is over here.

Share this post


Link to post
8 hours ago, seed said:

 

Hm, so the SW rendered is pretty much bonked for the time being. Eh, not a big deal as it performs worse in large/complex maps with lots of enemies anyway. OpenGL would have definitely been though, but if it still performs well that's good.

 

I wouldn't call it "bonked". It's roughly 20% slower when I tested Frozen Time, i.e. 27 fps vs. 34 fps in 1920x1080. And that map's probably the worst case scenario out there. For comparison, ZDoom's software renderer manages less than 10 fps on the same map.

 

8 hours ago, seed said:

 

Do you plan on updating the MIDI players? I've noticed a while ago than Fluidsynth is definitely worse in PrBoom+ than in GZDoom, and according to a topic on github, OPL2 is also worse than it is in other ports (+ worse performance and less accurate). Not going to ask about Portmidi as I have never used it in other ports apart from PrBoom.

 

The main problem here is not the MIDI players but the cheap-ass sound interface SDL provides. GZDoom uses OpenAL as its backend which isn't a primitive raw stereo buffer but an actual 3D sound API with good support for modern standards and a professional quality mixer.

 

TBH, the only way I see to 'fix' the sound would be to rip out the current sound system and put in GZDoom's, but that's not only a huge undertaking but also would require quite a bit of work on the resource management and introduce a large amount of C++ code into the project (don't even think about backporting that code to plain C, that's simply not possible - it makes full use of polymorphism and abstraction.) and that seems to be sacrilege if some people were to be believed.

 

 

8 hours ago, seed said:

 

Has the SDL in this version been updated since 2.5.1.5?

 

I actually haven't checked, it may even use an older version from 2.5.1.4.

 

 

6 hours ago, dew said:

Basically, yeah. 0xff as the first byte is the way to go. But Eternity already does this, so it's not an "invalid" value. But Eternity then adds its own identifier string to the header, and anotak proposes that pr+ would do the same with its own string.

 

I didn't know that Eternity already used it. No problem putting a bit more info into the header or use 0xfe, for example.

A real identifier would be best, of course.

 

7 hours ago, Altazimuth said:

Not UMAPINFO, all the other fucktillion random ramblings. We need to keep FOCUSED.

 

Agreed here. I don't mind discussing the potential implications of certain features, but for now the focus is UMAPINFO and after that most likely the map format itself, i.e. whether to support Hexen and/or UDMF, and add the needed features to support them.

If someone really wants to try to graft GZDoom's sound system on this code, for example, be my guest. It's going to be a lot of work and IMO would definitely be worth it from a technical perspective - having true 3D sound makes a massive difference, but it goes far beyond my current plans.

 

Share this post


Link to post

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×