Yes. Yes. Rooms are tested at random, but obviously smaller rooms have a better chance of being placed in the map because they're less likely to trigger a collision with another room when we test it. It's possible that there is a better heuristic to control how we place things; I may revisit this later. If you want a floor to spawn with a certain room on it, as a set piece, you can set it using the appropriate flag. The game will always choose a seed room from the list of potential seed rooms from the level, and will write that room first to ensure it spawns without collisions. Yes. Yes. It starts with the seed room. Yes. That said, rooms with special=1 spawning twice should never happen. I thought I dealt with it already. Nope. It just spawns less rooms in a smaller area.
Thanks for the confirmation! Really!? That would be really darned useful! **Spends 20 minutes hunting through rooms.xml and comes up with nothing.** And what flag would that be, exactly? The word "seed" doesn't appear in rooms.xml at all. A search for "start" only turns up the starting room, a couple commented-out starting rooms, and one room that uses the word in a custom blocker description. Here's the flags that the starting room of the dungeon has: Code: <flags special="1" nomonsters="1" notraps="1" noblockers="1" notreasure="1" minLevel="2000" maxLevel="2000"/> I can't see anything that strikes me as doing what you're proposing. Unless it's an undocumented part of 'special="1"'. I'd assumed that special merely restricted how often the room spawned.... I guess I could believe that every floor starts with a "special" room, but I'm surprised I'd never noticed it before, if that is the case. Does special do anything else? There's not like a hard-coded max number of total rooms with "special" that can appear on any one floor, or anything like that, is there? That would explain just how rare some rooms seem to be. If special does do various other special things I wasn't expecting it to, I may need to revise most of Interior Dredmorating. Don't suppose you could shed a light on what special is supposed to do? Well, then something's (infrequently) broken, because I've had one or two freakishly small levels, where the rooms are only in the middle of the map, occupying about half the space that even NTTG floors do. Not talking about mysterious portal levels, either. I do a lot of modding that involves combing through rooms.xml, so I'm pretty confident I know all the hidden rooms and such. It was nothing like that. First time it happened, I back-tracked all over the place to make sure I hadn't missed a door, then made sure I stepped on every satanic displacement glyph, even went back up a floor and down every staircase, no dice. Second time I wasn't quite as comprehensive, but I did check every room bordering the part of the map that had all the blank space to make sure there wasn't an unopened door hidden behind a symbol on the minimap. Sadly, permadeath has claimed both those characters so I can't share the files with you now to prove it. Next time it happens, I'll send you a screen shot, save game and bug report.
I thought special=1 basically ensured the room would spawn on that floor? Or are you asking something else?
@rb_bergstrom. Seed isn't in the roomdb because it isn't relevant there. It's in the branchDB's floor definitions.
Assuming that I'm playing in debug mode, yes. However, I turn it off when actually playing the game as opposed to playtesting something specific, because I don't like the notion that if I bump the keyboard I'll suddenly gain 15 levels. And when I'm playtesting in debug mode, I'm usually looking to maximize the chance of a set of rooms spawning, so I'm rarely in NTTG. Special="1" definitely does _not_ ensure a room spawns. There are plenty of rooms in the main game that have special="1" yet are rarely seen. Same for the very many rooms with that tag that I've added to Interior Dredmorating. In general, any room without special="1" will show up a lot more often than any room with it. The main function of special="1" that I've seen is that it keeps a room from spawning more than once on a floor. I can be 100% certain that it does this, but it's not infallible in 1.0.9 rev B. Every once in a while the game glitches and goofs it up, but not very often. I've seen a room with special="1" spawn twice on the same floor maybe 2 or 3 times in the past 150 to 200 hours of play. In every case they were modded rooms. What I was asking, I guess, is whether or not the observed behavior is the totality of the behavior. Since I hadn't looked in branchDB, I didn't realize there was a "seed" command there. I thought Nicholas was saying there was a flag in rooms.xml that determined which rooms were valid seeds. Since the only flag whose name isn't crystal-clear on what it does is special="1", it seemed to be the only candidate. But that didn't jive with my anecdotal observations about how special="1" affected room spawning. Wow. Thank you Null, I had ever noticed that. So there's only three seeds in the main game, and those across just two floors? Weird. Well, I guess that opens up some design space for the next iteration of ID. Anyone happen to know whether or not the BranchDB is accessible via normal modding? As in: does it load up in the mod loader, without having to back up and replace main game files?
Yeah, it really should be in the room definitions and not the branch definitions, shouldn't it? As it stands - I think you could mod branchDB, but that might be icky. Hmm. Incidentally, if you want to test your room designs, there are some flags that are useful that you can pass to Dredmor on the command line: Code: if (!_strnicmp(argv[i], "-docs", strlen("-docs"))) { void WriteDocs(FILE* fp); // roomrw.cpp WriteDocs(stdout); exit(0); } if (!_strnicmp(argv[i], "-debug-flag", strlen("-debug-flag"))) { debugFlag |= DEBUG_FLAG_ANY; CreateDebugConsole(); } if (!_strnicmp(argv[i], "-testroom", strlen("-testroom"))) { i++; playerRoomTestName = argv[i]; playerRoomTest = TRUE; } if (!_strnicmp(argv[i], "-x", strlen("-x"))) { i++; playerRoomTestStartX = atoi(argv[i]); } if (!_strnicmp(argv[i], "-y", strlen("-y"))) { i++; playerRoomTestStartY = atoi(argv[i]); } if (!_strnicmp(argv[i], "-debug-flag-loads", strlen("-debug-flag-loads"))) { debugFlag |= DEBUG_FLAG_LOADS; } if (!_strnicmp(argv[i], "-debug-flag-key-bindings", strlen("-debug-flag-key-bindings"))) { debugFlag |= DEBUG_FLAG_KEY_BINDINGS; } if (!_strnicmp(argv[i], "-debug-flag-room-scripts", strlen("-debug-flag-room-scripts"))) { debugFlag |= DEBUG_FLAG_ROOM_SCRIPTS; } if (!_strnicmp(argv[i], "-debug-flag-audio", strlen("-debug-flag-audio"))) { debugFlag |= DEBUG_FLAG_AUDIO; } if (!_strnicmp(argv[i], "-w", 2)) { extern BOOL useFullscreen; useFullscreen = FALSE; } else if (!_strnicmp(argv[i], "-res-1024", strlen("-res-1024"))) { resX = 1024; resY = 768; } else if (!_strnicmp(argv[i], "-no-initial-config", strlen("-no-initial-config"))) { enableInitialConfig = FALSE; // don't show initial config dialog extern bool firstTimeRun; firstTimeRun = TRUE; // don't wait to show menu } else if (!_strnicmp(argv[i], "-startuptime", strlen("-startuptime"))) { logLoadProgress = true; // show startuptime information } else if (!_strnicmp(argv[i], "-nomusic", strlen("-nomusic"))) { enableMusic = FALSE; } else if (!_strnicmp(argv[i], "-nosound", strlen("-nosound"))) { enableSound = FALSE; }