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


  • Content count

  • Joined

  • Last visited

About MTrop

  • Rank

Recent Profile Visitors

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

  1. MTrop

    let's stop calling them "things"

    Actors imply those all "act," which they don't. "Entity" would probably be better. Postcount++
  2. MTrop

    let's stop calling them "things"

    I'd bet, though, on a forum of makers and modders, that people knew what you were talking about before they clicked on the topic (I did), so it's still not that bad of a term. A Thing is an informational spot that can either spawn an actor or be the spot of a special action (player starts, teleporter destination, map spot, polyobject anchor, etc.). It doesn't necessarily mean a 1-to-1 Actor, Object, Decoration, or Item. It may even be "the spot that objects are created and respawned at." It's kind of a catch-all term. What are they? I dunno. Things! "Map Object" is better, but "Things" are what they're called in Doom and every editor that edits it, and "Things" they'll unfortunately remain.
  3. MTrop

    SIGIL James Paddock MIDI Remasters WADS

    Remaster? More like "re-novice"! Har har har Yeah, dude. This is kind of a bad move. There's nothing here that would warrant even a vague allusion to somebody maybe giving you money for it. However, if people want to throw money somewhere, it should probably be here: https://jamespaddock.bandcamp.com/album/sigil-the-midi-soundtrack
  4. MTrop

    Best INDIVIDUAL levels (max one per wad/author)

    I'd like to point out that Wild Bleu Yonder was more @Xaser than me.
  5. MTrop

    Level 1 or MAP01?

    Most patches I've seen that replace the names just turn the automap title to "[NUMBER]: NAME" a la "1: Entryway" to save space.
  6. MTrop

    Brutal Square Version 1.0(crap mod, be aware)

    Also, having two copies of the main Square PK3 in there is probably not helping things.
  7. MTrop


    Piggybacking off of this: I'd like to point out to other people that are thinking about posting "work in progress" projects that you can only get away with being this vague about a new project if you are "known" and have an excellent track record.
  8. MTrop


  9. https://github.com/MTrop/DoomStruct Releases: https://github.com/MTrop/DoomStruct/releases Javadoc: https://mtrop.github.io/DoomStruct/javadoc/ What up, y'all? I made a Java library for reading/editing Doom stuff (again, again, again). What the heck is this? After quite a few false starts over the years at making this thing, my Java Library for parsing Doom Engine related stuff is finally at a place I don't hate. Here it is, ready to use for all 3 of the people out there in the Doom Community that write stuff in Java: https://github.com/MTrop/DoomStruct Why? There are several libraries out there for reading data from Doom in many different programming languages, but there isn't a decent one for Java. And by decent, I mean: Useful Documented Performant Efficient The goal with this library is to get end-users up-and-running quickly with little boilerplate code, and to ensure clarity within documentation and with written code, and future-proofing to a reasonable extent. What kind of features are there? You want features? I got ya features: Reads/edits WAD files. Reads PK3 files (zips). Full UDMF parsing/writing support. Reads/edits all Doom data structures in Doom, Hexen/ZDoom, or Strife formats. This includes textures, patches, lines, vertices, things, sectors, nodes, palettes, colormaps, text, PNG data, music data, sound data, flats, blockmaps, reject, and even ENDOOM-type VGA lumps. Supports PNGs with offset data (grAb). Reads/edits Boom-engine data lumps like ANIMATED and SWITCHES. Contains a utility class for converting Doom graphics to standard Java graphics structures, and vice-versa. Contains a utility class for converting Doom DMX sound data to other formats via the Java SPI, and vice-versa. Contains a utility class for managing texture sets without needing to care too much about Doom's nightmarish texture data setup. You Got Examples? Of course I do! Look at how easy this shit is! Open a WAD file (and close it): WadFile wad = new WadFile("doom2.wad"); wad.close(); Open DOOM2.WAD and read MAP01 into a Doom Map. WadFile wad = new WadFile("doom2.wad"); DoomMap map = MapUtils.createDoomMap(wad, "map01"); wad.close(); Open DOOM2.WAD and fetch all sectors in MAP29 with the BLOOD1 floor texture. WadFile wad = new WadFile("doom2.wad"); Set<DoomSector> set = wad.getDataAsList("sectors", "map29", DoomSector.class, DoomSector.LENGTH).stream() .filter((sector) -> sector.getFloorTexture().equals("BLOOD1")) .collect(Collectors.toSet()); wad.close(); Open DOOM.WAD and fetch all things in E1M1 that appear in multiplayer. WadFile wad = new WadFile("doom.wad"); Set<DoomThing> set = wad.getDataAsList("things", "e1m1", DoomThing.class, DoomThing.LENGTH).stream() .filter((thing) -> thing.isFlagSet(DoomThingFlags.NOT_SINGLEPLAYER)) .collect(Collectors.toSet()); wad.close(); Open HEXEN.WAD and fetch all things in MAP01 that have a special. WadFile wad = new WadFile("hexen.wad"); Set<HexenThing> set = wad.getDataAsList("things", "map01", HexenThing.class, HexenThing.LENGTH).stream() .filter((thing) -> thing.getSpecial() > 0) .collect(Collectors.toSet()); wad.close(); Open DOOM.WAD and fetch all maps that have less than 1000 linedefs. final WadFile wad = new WadFile("doom.wad"); Set<String> set = Arrays.asList(MapUtils.getAllMapHeaders(wad)).stream() .filter((header) -> wad.getEntry("linedefs", header).getSize() / DoomLinedef.LENGTH < 1000) .collect(Collectors.toSet()); wad.close(); Open SQUARE1.PK3, fetch maps/E1A1.WAD and read it into a UDMF Map. DoomPK3 pk3 = new DoomPK3("square1.pk3"); WadBuffer wad = pk3.getDataAsWadBuffer("maps/e1a1.wad"); UDMFMap map = wad.getTextDataAs("textmap", Charset.forName("UTF-8"), UDMFMap.class); pk3.close(); Open DOOM2.WAD, read DEMO2 and figure out how many tics that player 1 was pushing "fire". WadFile wad = new WadFile("doom2.wad"); Demo demo = wad.getDataAs("demo2", Demo.class); int tics = 0; for (int i = 0; i < demo.getTicCount(); i++) { tics += (demo.getTic(i).getAction() & Demo.Tic.ACTION_FIRE) != 0 ? 1 : 0; } wad.close(); Open DOOM.WAD and get MD5 hashes of each entry. WadFile wad = new WadFile("doom.wad"); byte[][] hashes = new byte[wad.getEntryCount()][]; int i = 0; for (WadEntry entry : wad) hashes[i++] = MessageDigest.getInstance("MD5").digest(wad.getData(entry)); wad.close(); Open DOOM2.WAD, fetch all TROO* (graphic) entries and export them as PNGs. WadFile wad = new WadFile("doom2.wad"); final Palette pal = wad.getDataAs("playpal", Palette.class); for (WadEntry entry : wad) { if (entry.getName().startsWith("TROO")) { Picture p = wad.getDataAs(entry, Picture.class); ImageIO.write(GraphicUtils.createImage(p, pal), "PNG", new File(entry.getName()+".png")); } } wad.close(); Open `DOOM.WAD`, fetch all `DS*` (audio) entries, upsample them to 22kHz (cosine interpolation), and export them as WAVs. WadFile wad = new WadFile("doom.wad"); for (WadEntry entry : wad) { if (entry.getName().startsWith("DS")) { DMXSound sound = wad.getDataAs(entry, DMXSound.class) .resample(InterpolationType.COSINE, DMXSound.SAMPLERATE_22KHZ); SoundUtils.writeSoundToFile(sound, AudioFileFormat.Type.WAVE, new File(entry.getName() + ".wav")); } } wad.close(); Open DOOM2.WAD, assemble a TextureSet, remove every texture that begins with R, and write it to a new WAD. WadFile wad = new WadFile("doom2.wad"); TextureSet textureSet = new TextureSet( wad.getDataAs("pnames", PatchNames.class), wad.getDataAs("texture1", DoomTextureList.class) ); wad.close(); Iterator<TextureSet.Texture> it = textureSet.iterator(); while (it.hasNext()) { TextureSet.Texture t = it.next(); if (t.getName().startsWith("R")) it.remove(); } PatchNames pout = new PatchNames(); DoomTextureList tout = new DoomTextureList(); textureSet.export(pout, tout); WadFile newwad = WadFile.createWadFile("new.wad"); newwad.addData("PNAMES", pout.toBytes()); newwad.addData("TEXTURE1", tout.toBytes()); newwad.close(); All that and more! LGPL licensed! No dependencies! Everything documented! Have fun! Eat your heart out, OMGIFOL!
  10. MTrop

    What makes a map good?

    If the map's presentation and design convey information to the player clearly without obfuscation, and the player feels like the time spent in it is worthwhile, it is a good map.
  11. MTrop

    Faithless - a Heretic hub [FINAL]

    Still on the fence? Have a Twitch stream where I play through 2-ish hours of it with Jimmy and Tarnsman!
  12. Unfortunately, no. But the main fixes are the multiplayer desync bug, the crate crash, shortening E2A3 a tiny bit, and managing ambiance and effect spawners better for performance reasons.
  13. A fix is coming, but also with a whole slew of other tweaks and fixes. Sit tight, everybody.
  14. I dunno dude I got buttons mapped to strafe left and right so it's not that big a deal for me
  15. MTrop

    How should I contribute to the Doom community?

    The technical details aren't really important. Those just hollowly impress. Like @Linguica said, take what you like to do, and apply it to Doom. Don't worry at all about looking back at your old stuff and being like, "Ugh, what was I thinking," because that just means you've improved since then, and recognize that you have. I wish I had a nickel for every time I caught myself doing that, and I've been doing this for well over 22 years! And if you do release crap, who cares? Everything starts off crappy, from maps to mods. Be comfortable with the fact that you're gonna make crap. But it is through the magic of the Internet and the sheer number of people that will see your works in progress and comment on them that your work will be critiqued into being good eventually. Not everybody's opinions are valid, but as long as you know what you want to do with whatever you make, you'll quickly figure what feedback is valuable, and what is not. But you still have to make things. You can always post a thread requesting feedback on something unfinished. Like Jake the Dog from Adventure Time says, "Sucking at something is the first step to being sorta good at something."