anotak Posted June 13, 2019 after correspondence with some people who were asking for proper demo support, i have a patch that requires further testing before i post it up. I have come up with a format that identifies features in a list-of-strings format, for future extensibility. I have it saving/loading demos using UMAPINFO with the map lump name, without interfering with the other settings. While the capability isn't fully there in my patch, the format is designed so that later extensions can just be added as strings to this list. you can see the bytes "01" (list length), "08" (the string's length), and "UMAPINFO" appear. you can still set any arbitrary demo version you wish (the byte appears after, as you can see in the screenshot, the 0xD6). this does not interfere with compatibility levels otherwise. this matches the requirements that have been given. 9 Quote Share this post Link to post
Altazimuth Posted June 13, 2019 (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 June 13, 2019 by Altazimuth 3 Quote Share this post Link to post
fabian Posted June 13, 2019 (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 June 13, 2019 by fabian 0 Quote Share this post Link to post
Bauul Posted June 13, 2019 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. 0 Quote Share this post Link to post
Shadow Hog Posted June 13, 2019 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. 0 Quote Share this post Link to post
Graf Zahl Posted June 13, 2019 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. 0 Quote Share this post Link to post
Ferk Posted June 13, 2019 (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 June 13, 2019 by Ferk 2 Quote Share this post Link to post
anotak Posted June 13, 2019 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. 3 Quote Share this post Link to post
DoomedDude Posted June 15, 2019 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? 0 Quote Share this post Link to post
Graf Zahl Posted June 16, 2019 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? 5 Quote Share this post Link to post
Ribbiks Posted June 16, 2019 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. 1 Quote Share this post Link to post
Graf Zahl Posted June 16, 2019 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. 0 Quote Share this post Link to post
DoomedDude Posted June 16, 2019 Does this new version of PrBoom+ support 5 episodes like GZDoom and EE? 0 Quote Share this post Link to post
Graf Zahl Posted June 16, 2019 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. 0 Quote Share this post Link to post
DoomedDude Posted June 16, 2019 Is the UMAPINFO just version 2.5.1.7 or something more specific? 0 Quote Share this post Link to post
Graf Zahl Posted June 16, 2019 2.5.1.7 is the latest release - there were two before. 0 Quote Share this post Link to post
TheMightyHeracross Posted June 16, 2019 (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 Edited June 16, 2019 by TheMightyHeracross 3 Quote Share this post Link to post
DANZA Posted June 16, 2019 (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 June 16, 2019 by DANZA 0 Quote Share this post Link to post
TheMightyHeracross Posted June 16, 2019 (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" } Edited June 16, 2019 by TheMightyHeracross 1 Quote Share this post Link to post
seed Posted June 16, 2019 (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. Edited June 16, 2019 by seed 0 Quote Share this post Link to post
Shadow Hog Posted June 16, 2019 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. 1 Quote Share this post Link to post
Graf Zahl Posted June 16, 2019 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. 0 Quote Share this post Link to post
seed Posted June 16, 2019 (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? Edited June 16, 2019 by seed 0 Quote Share this post Link to post
TheMightyHeracross Posted June 16, 2019 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. 0 Quote Share this post Link to post
Altazimuth Posted June 16, 2019 (edited) Not UMAPINFO, all the other fucktillion random ramblings. We need to keep FOCUSED. Edited June 16, 2019 by Altazimuth 0 Quote Share this post Link to post
dew Posted June 16, 2019 (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. Edited June 17, 2019 by dew 7 Quote Share this post Link to post
anotak Posted June 17, 2019 hey, been kinda sick the past few days, still sick, so this wasn't really my focus. 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. 4 Quote Share this post Link to post
Shadow Hog Posted June 17, 2019 (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. Edited June 17, 2019 by Shadow Hog 0 Quote Share this post Link to post
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.