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


  • Content count

  • Joined

  • Last visited


About Caffeine

  • Rank
    It's whiskey o'clock somewhere

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Caffeine

    What do you guys use for custom MIDIs?

    I have not used custom MIDIs yet, but I was thinking about using some of FreeDoom's MIDIs for some levels I am working on. They are pretty good from what I remember and the license is permissive. Lol I completely misread the question. Fail.
  2. Caffeine

    do you use cheats in doom?

    Sometimes I think "it has been a while since I inflicted emotional pain on myself" and I will pick a random 1990s WAD and play through it. Some of those require cheating to finish due to the outstanding mapping skill and quality standards exhibited in WADs from that era.
  3. Caffeine

    How To "Fix" The Spider Mastermind?

    Sure, the spider mastermind is a bit rough around the edges, but it is not exactly a bad monster when used correctly. They do well in big open areas with lots of other monsters because they infight easily and are not too much of an ammo sponge in that situation. They can also do well as an occasional sniper in an arena. In the original id maps they are barely used at all and are not a problem. In modern maps I think we understand the roles of various monsters better than in the 1990s and do a much better job choosing the right tool (monster) for the job at hand. Overall I think it would have been nicer if the spider mastermind were around 25% smaller and had another thousand health, but I also do not believe it matters enough to do the work to make that happen.
  4. Caffeine

    GZDoom compat issues

    Requiring a custom executable is a non-starter for most people. You might not think it is a big deal, but 99.9999% of your target audience will simply not bother with your custom wad if they also need a custom executable. This is especially true if it is for demo compatibility, which is probably the least important feature of any wad, especially one that targets GZDoom. As others have pointed out, GZDoom is literally the worst option if demo compatibility is important. The source port literally doesn't support demos in any meaningful way. As far as I know, it will not even play them when idling in the menu. Demos are simply not a priority for that project, like it or not. In general, if your wad requires a change to a source port, you are much better off submitting a pull request to the source port's project. Then, once the patch is accepted, tested, and released, require that specific version for your wad. Personally, I am much more likely to update a source port through the official channel if required, than to install some sketchy third-party executable from a source I have zero familiarity with.
  5. Caffeine

    Keep dynamic lights immovable

    I'm not sure about gravity, but what about making the Z height absolute instead of relative? There's a checkbox in the Thing editor window to toggle this.
  6. I understand you are going for a specific style of font that matches GTAV, but that font is definitely not built for Doom's texture resolution. It would be so pixelated as to be illegible, as you found out. You would need a source port that supports high-resolution and truecolor textures to make that image work.
  7. Caffeine

    DOOM 2016 textures?

    I don't think most people here are interested in helping with copyright infringement, which is illegal.
  8. Caffeine

    Custom monster logic question

    No. ACS is really good for dynamically updating a level while playing it. You get access to all of the action specials and can even update textures, sector heights, linedef properties, et al along with variables and C-style control structures such as loops and conditionals. You can write some pretty sophisticated level alternation logic using ACS. ACS Thing logic can spawn them, delete them, alter their hate target, and other high-level functions that are designed more about what a Thing is and whether it exists, rather than how its monster AI operates. If you want to add a new monster or edit how they work, you need to use DECORATE (deprecated) or ZScript. The example you cited definitely requires ZScript.
  9. Caffeine

    All classic Doom weapons held by female hands?

    One option is to go Doom 2016's route and add armor. Then gender appearance is irrelevant. I also wonder if this really matters. First time I played through Portal I did not realize Chell is female for a while because I did not notice her reflection in the first room. And it does not impact the story of that game: both men and women can be equally disappointed by the lack of cake.
  10. Caffeine

    Confused about Complevel for my wad

    There is also a good video by decino that covers complevels:
  11. Caffeine

    Opening Alpha 0.3 maps in Yadex

    Is there documentation on the differences in the WAD format? I didn't find anything on the Doom Wiki. It may be possible to edit the WAD so it can load in Yadex or UDB or to write a conversion program, but I cannot say for sure without some technical details.
  12. Caffeine

    Dynamic string building using ACS+ZScript

    Thanks to you both. You were correct. I was close, but was too busy looking at the forest that I missed the trees. String concatenation is a bit cumbersome in ZScript but I figured it out. Turns out I needed to do it there and not in ACS, because that was the easier way to make a reusable function. I went with chopping up strings and piecing them together along with some LANGUAGE strings for ordinals and pluralizing nouns. At some point I will have a working example to show - I do want to release this PK3 and it will obviously include source code. First I need to clean up the code a bit and see what else I end up needing once I test it a bit and reuse it more than twice. Forget YAGNI, I fully intend on reusing this code in another map in the map set.
  13. I have two closely related questions where the answer to one affects the other. First, what is my end goal? Let's say I have a super secret and the player needs to activate several hidden switches around the level to reveal it. However, I want to be nice and print a message saying they have N more switches to flip. I have this working, using GZDoom, UDMF, and ACS. However, it is a bit verbose. As a software engineer, I feel like the game should know how many switches there are and be able to construct these strings for me. Currently, I have some strings defined in LANGUAGE. There is a global variable initialized to the number of switches. An ACS function decrements the switch count. I have tried two ways of building the string and they both work, but I hate them both. Option 1: LANGUAGE: PART1 = "Trigger "; PART2 = " more switches to reveal the secret"; ACS: int counter = 3; script 1 (void) { --counter; Print(l:"PART1", s:counter, l:"PART2"); if (counter == 0) { Door_Open(tag, speed, 0); } } This is a scaled-down example: it also needs to handle the case of "one more" which has a different plural form: switch v. switches. It also may not translate correctly if I ever use the LANGUAGE lump for more than English. Option 2 is to have a string for each value of "counter" in the code above, and store the LANGUAGE keys in an array. Then I use counter as an index into the array, which references a LANGUAGE entry. That is more verbose in the LANGUAGE lump but makes the ACS code a bit cleaner. It also makes potential translations a bit cleaner. Another thing I tried that did not work is related to option 2. Instead of an array, I tried constructing the LANGUAGE key in code and passing that to the Print function. However, it did not work: nothing printed. I tried two ways: // Does not work. Print(l:"MY_STRING_" + counter); // Also does not work. str key = "MY_STRING_" + counter; Print(l:key); Neither works. I am using the LANGUAGES lump here, and do not want to embed user-facing strings in ACS. The other issue here is I need to know how many switches there are and initialize that variable. If this were a one-off issue I might not care much: I understand that ACS is not nearly as full-featured as general-purpose languages such as Java and C#. But I have run into this exact same issue several times, even if the end result of what those line triggers do is different. I feel like there should be a way to generalize this, drop down to ZScript, and write something ugly but functional that I can reference in ACS across multiple maps. I envision something like the following. ZScript: class Foo { static int GetScriptReferences(int scriptNumber) { int references = 0; // Get a LineIterator across all lines, check if their action invokes the given script number. // If true, increment references counter. return references; } } ACS: int counter = 0; script 1 OPEN { counter = ScriptCall("Foo", "GetScriptReferences", 2); } script 2 (void) { // This is the script the linedefs reference which decrements the counter. } Consulting Professor Google, it seems like searching through the lines in a Level looking for ones that have a special of 80 and a specific script number is not really a supported function in ZScript, according to Graf Zahl in this thread: https://forum.zdoom.org/viewtopic.php?p=1051431. It seems like the supported way is to use a line iterator for a given tag, and count how many lines it references. However, this is another value I need to remember to set. My goal here is to reduce redundancy and not have to set more variables. If I add another switch, I don't want to have to increment a global variable or set another redundant tag by hand. That is more opportunity for human error, in an age of automated testing and deployment pipelines. I think more than anything I am looking for ideas about how I can automate or generalize as much of the problem of "I want to count switches and construct strings" as possible.
  14. Caffeine

    How to use mapspots for room clearance script?

    I labeled each variable in my example with what you should replace it with. Tag each Map Spot thing with 1: that replaces "spot_tag" in my example. To specify Barons, replace "Type" with T_BARON. That is a built-in string that represents "type is Baron." A quick search didn't reveal a wiki page with the constants that you should use instead of literal strings, but here's a list of class names for Doom: https://zdoom.org/wiki/Classes:Doom . You can probably find the constants in zcommon.acs in the GZDoom source code. Come up with a new, unused value for "monster_tag" and replace both instances. It can be anything not assigned to any other things either in the UDMF or dynamically assigned via ACS. That is the TID people talk about. Type is the class of item (e.g. imp, shotgun) while tag or tid is how you can reference that specific thing in UDMF and ACS. N.B. technically TID is the unique ID of a thing, such as the "Thing 12" you see when hovering over a Thing in UDB. But the ZDoom documentation tends to use tag and TID interchangeably. As far as I know, the built-in ACS functions never refer to a thing by its ID, only its tag, which it refers to as TID. I never use the Thing ID, only tags, and so far everything works as expected. Replace "door_tag" with the integer 2. Replace "speed" with the integer speed for the door: 16 is slow, 64 is fast, and you can use other values. Then in your map, give a linedef an action special of 80 for "script execute" and give it the number of the script. That is "1" in my example, but could be different if you have other scripts.
  15. Caffeine

    How to use mapspots for room clearance script?

    I would try executing the "wait until monsters killed" part of the script after spawning in the enemies. Something like this: #include "zcommon.acs" script 1 (void) { SpawnSpotFacing("Type", spot_tag, monster_tag); while (ThingCount(0, monster_tag) > 0) { delay(35); } Door_Open(door_tag, speed, 0); } The wait script will malfunction if it executes before the monsters are created.