Overview
Use this page as the current builder quick reference. It keeps live command behavior, flag names, object value slots, and common review rules in one place.
Trust levels and command availability come from the command table and handlers in interp.c, population.c, generate.c, flag.c, and act_wiz.c. Flag and type listings mirror tables.c. Longer legacy builder prose remains in madrom-area-building-guide.html; this compendium is the shorter operational version.
Access levels & trust
The MadROM trust macros map to numeric levels derived from MAX_LEVEL = 100 and the immortal/hero thresholds. These macros are referenced throughout the command table to gate builder tools.
| Macro | Level | Description |
|---|---|---|
ML | 100 | Implementor |
L1 | 99 | Creator |
L2 | 98 | Supreme Being |
L3 | 97 | Deity |
L4 | 96 | God |
L5 | 95 | Immortal |
L6 | 94 | Demigod |
L7 | 93 | Angel |
L8 | 92 | Avatar |
IM | 93 | LEVEL_IMMORTAL (Angel) |
HE | 91 | LEVEL_HERO (Hero) |
The macros above are defined alongside MAX_LEVEL, LEVEL_IMMORTAL, and LEVEL_HERO in merc.h and documented in interp.h.
Area file contract
New-format area files load in a fixed header order. Keep this exact shape unless you are intentionally converting a legacy single-line header.
#AREA
example.are~
Example Area~
{30 60} Builder Name Example Area~
ResetMessage: A short reset message players can see.~
30000 30099
The reset message line is optional. If it is present, use ResetMessage: or ResetMsg:; the engine also accepts older untagged reset-message lines for compatibility. If it is omitted, the vnum range line must come directly after the credits line.
- The filename metadata must end in
.areand match the file being reviewed. - The display name and credit/title line must be non-empty.
- The level range belongs inside braces, for example
{30 60},{All}, or{None}. - Add the file to
area/area.lstand runpython3 tools/area_tools.py validate-area area/example.arebefore merge.
Builder command reference
The table below lists the most frequently used building tools, their minimum trust requirements, and a short description taken directly from the handler source. Levels are shown using the same macros that the command table uses.
| Command | Required level | What it does | Implementation |
|---|---|---|---|
madmode event |
ML (100) |
Front door for temporary event population. Syntax is madmode event themes or madmode event <count 1-200> [theme] [here|area]; the backend spawns themed event mobs without making permanent area content. |
act_wiz.c / population.c |
generatearea |
L4 (96) |
Builds a deterministic 100-room generated-area slot in the reserved 40000-49999 block from a theme and seed, then auto-spawns themed mobs and prints a quick goto/rstat/map test runbook. |
generate.c |
flag |
L2 (98) |
Toggles mob, char, object, and room flags with +, -, or =. Use flag ? for supported fields; common builder fields include object wear/extra/restriction, room flags, and mob/char act, aff, offense, immunity, resist, vuln, aggression, form, parts, and comm. |
flag.c |
vnum |
L4 (96) |
Searches loaded indices with vnum mob <name>, vnum obj <name>, or vnum skill <name>. With no type, it searches mobs and objects by name. |
act_wiz.c |
olist |
L5 (95) |
Lists objects in the current area. Filters are weapons, armor, food, keys, wands, potions, pills, and furniture; output includes vnum, level, count, weight, cost, and type-specific values. |
act_wiz.c |
mlist |
L5 (95) |
Lists mobiles in the current area. Filters are all, mages, clerics, mobprogs, or a name match; output includes vnum, alignment, gold, level, count, kill count, and armor values. |
act_wiz.c |
rlist |
L5 (95) |
Displays rooms in the current area with heal and mana rates. Use rlist swim or rlist noswim for water-sector checks. |
act_wiz.c |
alist |
L5 (95) |
Prints every loaded area with its area number, display name, vnum range, and filename. | act_wiz.c |
load |
L4 (96) |
Loads mobs with load mob <vnum> or objects with load obj <vnum> [level]. Object level defaults to your trust, cannot exceed your trust, and takeable objects go to your inventory while non-takeable objects load into the room. |
act_wiz.c |
clone |
L5 (95) |
Duplicates an object or NPC in the room, including contents and worn equipment. It refuses money objects and non-NPC characters. | act_wiz.c |
string |
L5 (95) |
Edits live mob/char strings with string char <target> <field> <text> and object strings with string obj <target> <field> <text>. Char fields are name, short, long, desc, title, and spec; object fields include name, short, long, extended, and the custom action fields get, drop, wear, remove, sac, pent, and pexit plus their room-message variants. |
act_wiz.c |
route |
ML (100) |
Finds a walkable route between two rooms or named endpoints. It tries in-area, unlocked, non-hazardous paths first, then reports when it had to expand through connected areas, locked exits, water/air transitions, or tribal-room detours. | act_wiz.c |
qtemplate |
HE + 1 (92) |
Configures the rotating rescue-quest template used by quest masters: enabled state, level band, area range, captor sex, schedule, reward payout, and victim/captor briefing text. | quest.c |
Flag reference
Each table below mirrors the live flag definitions in tables.c. The “Builder Settable” column reports the boolean stored in the table (for commands such as flag) so you can see which bits are protected in-game.
Legacy guide discrepancies: docs/madozy.txt stops before newer bits that appear in tables.c. Notable gaps include smart/prestige/nowander in the act flags, the gore offense flag, and the wood/silver/iron immunity/resistance/vulnerability bits. Keep these differences in mind when reconciling builds against the classic guide.
Mob act flags
| Name | Bit / Constant | Builder Settable |
|---|---|---|
| npc | A | No |
| sentinel | B | Yes |
| scavenger | C | Yes |
| smart | D | Yes |
| unused | ACT_UNUSED | Yes |
| aggressive | F | Yes |
| stay_area | G | Yes |
| wimpy | H | Yes |
| pet | I | Yes |
| train | J | Yes |
| practice | K | Yes |
| holylight | N | No |
| undead | O | Yes |
| cleric | Q | Yes |
| mage | R | Yes |
| thief | S | Yes |
| warrior | T | Yes |
| noalign | U | Yes |
| nopurge | V | Yes |
| healer | aa | Yes |
| gain | bb | Yes |
| update_always | cc | Yes |
| nowander | dd | Yes |
Source: tables.c act_flags array.
Player flags
| Name | Bit / Constant | Builder Settable |
|---|---|---|
| plr | 0 | No |
| autoassist | C | No |
| autoexit | D | No |
| autoloot | E | No |
| autosac | F | No |
| autogold | G | No |
| autosplit | H | No |
| autohappy | I | No |
| autogrumpy | J | No |
| showdefense | K | No |
| exact | M | No |
| holylight | N | No |
| wizinvis | O | No |
| can_loot | P | No |
| nosummon | Q | No |
| nofollow | R | No |
| color | S | No |
| wiznet | T | No |
| afk | U | Yes |
| tribe | V | No |
| log | W | No |
| deny | X | No |
| freeze | Y | No |
| thief | Z | Yes |
| killer | aa | Yes |
| arena | bb | Yes |
| spectate | cc | Yes |
| autotitle | dd | No |
| test | ee | Yes |
Source: tables.c plr_flags array.
Affect & combat flags
| Name | Bit / Constant | Builder Settable |
|---|---|---|
| blind | A | Yes |
| invisible | B | Yes |
| detect_evil | C | Yes |
| detect_invis | D | Yes |
| detect_magic | E | Yes |
| detect_hidden | F | Yes |
| talon | G | Yes |
| sanctuary | H | Yes |
| faerie_fire | I | Yes |
| infrared | J | Yes |
| curse | K | Yes |
| protect_good | L | Yes |
| poison | M | Yes |
| protect | N | Yes |
| paralysis | O | Yes |
| sneak | P | Yes |
| hide | Q | Yes |
| sleep | R | Yes |
| charm | S | Yes |
| flying | T | Yes |
| pass_door | U | Yes |
| haste | V | Yes |
| calm | W | Yes |
| plague | X | Yes |
| weaken | Y | Yes |
| dark_vision | Z | Yes |
| berserk | aa | Yes |
| swim | bb | Yes |
| regeneration | cc | Yes |
| lethargy | dd | Yes |
See also affect2_flags, off_flags, and imm_flags in the same section of tables.c for extended effects, attack assists, and damage immunities.
Additional combat, aggression, and form flags
The following tables list auxiliary combat toggles that builders can apply to mobiles.
| Table | Highlights |
|---|---|
off_flags | Offensive moves such as backstab, trip, and assist behaviours. |
imm_flags | Damage and effect immunities including fire, poison, silver, and iron. |
aggr_flags | Aggression selectors by class, race, or temperament (e.g., mage, good, psycho). |
form_flags & part_flags | Creature body types and anatomy for dismemberment and behaviour logic. |
Communication, room, exit, and object flags
| Table | Purpose |
|---|---|
comm_flags | Player channel and messaging toggles (quiet, noargue, notecho, etc.). |
room_flags | Environmental properties such as dark, private, and arena flag markers. |
room_aff_flags | Ambient room effects like smoke and bloody. |
exit_flags | Door state bits (door, closed, locked, pickproof, etc.). |
extra_flags | Object properties such as glow, nodrop, ancient, and elite. |
wear_flags | Wear locations including offhand, twohands, and belt slots. |
weapon_flags | Weapon specializations such as flaming, vampiric, and twohands. |
rest_flags | Race/class alignment restrictions for resting objects. |
food_flags, portal_flags | Food side-effects and portal behaviours (e.g., randomarea, nocurse). |
Item and sector types
| Name | Bit / Constant | Builder Settable |
|---|---|---|
| light | ITEM_LIGHT | Yes |
| scroll | ITEM_SCROLL | Yes |
| wand | ITEM_WAND | Yes |
| staff | ITEM_STAFF | Yes |
| weapon | ITEM_WEAPON | Yes |
| treasure | ITEM_TREASURE | Yes |
| armor | ITEM_ARMOR | Yes |
| potion | ITEM_POTION | Yes |
| clothing | ITEM_CLOTHING | Yes |
| furniture | ITEM_FURNITURE | Yes |
| trash | ITEM_TRASH | Yes |
| container | ITEM_CONTAINER | Yes |
| drink | ITEM_DRINK_CON | Yes |
| key | ITEM_KEY | Yes |
| food | ITEM_FOOD | Yes |
| money | ITEM_MONEY | Yes |
| boat | ITEM_BOAT | Yes |
| npccorpse | ITEM_CORPSE_NPC | Yes |
| pccorpse | ITEM_CORPSE_PC | No |
| fountain | ITEM_FOUNTAIN | Yes |
| pill | ITEM_PILL | Yes |
| protect | ITEM_PROTECT | No |
| map | ITEM_MAP | Yes |
| jukebox | ITEM_JUKEBOX | Yes |
| portal | ITEM_PORTAL | Yes |
| explosive | ITEM_EXPLOSIVE | Yes |
| liquid | ITEM_LIQUID | Yes |
| match_wand | ITEM_MATCH_WAND | No |
| match_bomb | ITEM_MATCH_BOMB | No |
| match_gauntlets | ITEM_MATCH_GAUNTLETS | No |
| match_powerup | ITEM_MATCH_POWERUP | No |
| match_portal | ITEM_MATCH_PORTAL | No |
| match_red_flag | ITEM_MATCH_RED_FLAG | No |
| match_blue_flag | ITEM_MATCH_BLUE_FLAG | No |
| match_mine | ITEM_MATCH_MINE | No |
| red_mine | ITEM_RED_MINE | No |
| blue_mine | ITEM_BLUE_MINE | No |
| charm | ITEM_CHARM | Yes |
| jewelery | ITEM_JEWELRY | Yes |
| reagent | ITEM_REAGENT | Yes |
| trophy | ITEM_TROPHY | Yes |
| travel | ITEM_TRAVEL | No |
The same source block contains sector_types, sex_types, size_types, and qs_table, which are reproduced for convenience below.
| Sector / demographic | Constant | Settable |
|---|---|---|
| inside | SECT_INSIDE | Yes |
| city | SECT_CITY | Yes |
| field | SECT_FIELD | Yes |
| forest | SECT_FOREST | Yes |
| hills | SECT_HILLS | Yes |
| mountain | SECT_MOUNTAIN | Yes |
| water_swim | SECT_WATER_SWIM | Yes |
| water_noswim | SECT_WATER_NOSWIM | Yes |
| air | SECT_AIR | Yes |
| desert | SECT_DESERT | Yes |
| water_flooded | SECT_WATER_FLOODED | Yes |
| fire | SECT_FIRE | Yes |
| lava | SECT_LAVA | Yes |
| void | SECT_VOID | Yes |
| eunuch | SEX_NEUTRAL | Yes |
| male | SEX_MALE | Yes |
| female | SEX_FEMALE | Yes |
| random | SEX_RANDOM | Yes |
| tiny | SIZE_TINY | Yes |
| small | SIZE_SMALL | Yes |
| medium | SIZE_MEDIUM | Yes |
| large | SIZE_LARGE | Yes |
| huge | SIZE_HUGE | Yes |
| giant | SIZE_GIANT | Yes |
| hit | PC_QS_HIT | Yes |
| mana | PC_QS_MANA | Yes |
| moves | PC_QS_MOVES | Yes |
| hunger | PC_QS_HUNGER | Yes |
| thirst | PC_QS_THIRST | Yes |
| exp | PC_QS_EXP | Yes |
Source: tables.c item, sector, sex, size, and quick-stat tables.
ROM object value reference
Use this table to decode the five Value slots found on every object in the ROM engine. Match the object’s type to learn what each field controls when you audit resets or review builder submissions.
| Item type | Value1 | Value2 | Value3 | Value4 | Value5 |
|---|---|---|---|---|---|
| LIGHT | Unused slot (always 0). | Unused slot (always 0). | Hours of light remaining (0 = dead, 999 = infinite). | Unused slot. | Unused slot. |
| SCROLL | Spell level the scroll casts at. | Spell slot #1 (spell number). | Spell slot #2 (spell number or 0). | Spell slot #3 (spell number or 0). | Unused slot. |
| WAND | Spell level the wand casts at. | Maximum charges the wand can hold. | Current charges remaining. | Spell number cast by the wand. | Unused slot. |
| STAFF | Spell level the staff casts at. | Maximum charges the staff can hold. | Current charges remaining. | Spell number triggered by the staff. | Unused slot. |
| WEAPON | Weapon class (sword, axe, etc.). | Number of damage dice. | Size of each damage die. | Damage type / attack verb. | Weapon flags (flaming, frost, two-handed, etc.). |
| TREASURE | Unused slot. | Unused slot. | Unused slot. | Unused slot. | Unused slot. |
| ARMOR | Armor vs. pierce. | Armor vs. bash. | Armor vs. slash. | Armor vs. magic. | Unused slot. |
| POTION | Spell level the potion casts at. | Spell slot #1 (spell number). | Spell slot #2 (spell number or 0). | Spell slot #3 (spell number or 0). | Unused slot. |
| CLOTHING | Unused slot (cosmetic clothing uses affects instead). | Unused slot. | Unused slot. | Unused slot. | Unused slot. |
| FURNITURE | Maximum occupants. | Maximum weight it can support. | Furniture flags (sit, rest, sleep, stand, etc.). | Healing bonus (hp gained per tick). | Mana bonus (mana gained per tick). |
| TRASH | Unused slot. | Unused slot. | Unused slot. | Unused slot. | Unused slot. |
| CONTAINER | Capacity (total weight it can hold). | Container flags (closeable, pickproof, etc.). | Key vnum (0 if none). | Weight multiplier for carried contents. | Unused slot. |
| DRINK-CON | Liquid capacity (maximum units). | Current quantity of liquid. | Liquid type number. | Food/liquid flags such as poison or chaos. | Special liquid spell/effect hook for blood and essence cases. |
| KEY | Unused slot. | Unused slot. | Unused slot. | Unused slot. | Unused slot. |
| FOOD | Fullness/nourishment amount. | Unused slot. | Unused slot. | Food flags such as poison, chaos, or pipeweed. | Unused slot. |
| MONEY | Gold value (coins in the pile). | Unused slot. | Unused slot. | Unused slot. | Unused slot. |
| BOAT | Unused slot. | Unused slot. | Unused slot. | Unused slot. | Unused slot. |
| CORPSE_NPC | Decay timer (minutes before the corpse crumbles). | Reserved for corpse metadata. | Reserved for corpse metadata. | Reserved for corpse metadata. | Killer level (used for random drops). |
| FOUNTAIN | Unused by normal drink logic. | Unused by normal drink logic. | Liquid type dispensed. | Food/liquid flags such as poison or chaos. | Special liquid spell/effect hook for blood and essence cases. |
| PILL | Spell level the pill casts at. | Spell slot #1 (spell number). | Spell slot #2 (spell number or 0). | Spell slot #3 (spell number or 0). | Unused slot. |
| PROTECT | Reserved for protection logic. | Reserved for protection logic. | Reserved for protection logic. | Reserved for protection logic. | Reserved for protection logic. |
| MAP | Map visibility flag (1 = usable map). | Unused slot. | Unused slot. | Unused slot. | Unused slot. |
| JUKEBOX | Current lyric line index (-1 means idle). | Current song number. | Queued song #1. | Queued song #2. | Queued song #3. |
| PORTAL | Destination room vnum. | Gate flags (closed, pass proof, random, etc.). | Exit flags applied when stepping through. | Charges remaining before the portal collapses. | Key vnum required if locked (0 if none). |
| EXPLOSIVE | Spell level the explosive triggers at. | Spell slot #1 (spell number). | Spell slot #2 (spell number or 0). | Spell slot #3 (spell number or 0). | Unused slot. |
| LIQUID | Unused by normal drink logic. | Current quantity remaining; 0 means dried up. | Liquid type number. | Food/liquid flags such as poison or chaos. | Special liquid spell/effect hook for blood and essence cases. |
| MATCH_* / RED_MINE / BLUE_MINE | Retired or internal match-system slots. | Do not use for new area content. | Do not use for new area content. | Do not use for new area content. | Do not use for new area content. |
| CHARM / REAGENT / TROPHY / TRAVEL | Feature-specific object types. | No general builder value contract. | No general builder value contract. | No general builder value contract. | No general builder value contract. |
Source: current object type constants in merc.h, the live item type table in tables.c, and the command handlers that consume these value slots. Treat feature-specific rows as "inspect source before authoring" unless a builder playbook gives a narrower contract.
Builder playbooks
Practical guardrails for reviewing new areas, gear, scripts, and generated content without digging through the full source every time.
Item balance limits
Use these caps when reviewing gear for parity with the modern combat math. They combine the preserved builder guidance with current Ancient tier behaviour.
Level caps & principles
- Player-usable items top out at level 91 and should stay within five levels of the resetting mob unless a story exception applies.
- Reserve maximum values for lore-heavy rares and ensure extended descriptions and materials match the theme so destruction logic stays believable.
Weapons
- Average damage should roughly follow
5 + floor(level / 10) * 5. Trim dice when stacking hit/dam or other affects and mark glow/hum at the +6 ceiling. - Keep weights near 3–20 lbs. and prices below 1,000 gold under level 50 or 2,000 overall.
Armor
- No bonus: physical AC ≤
level / 3, magic AC ≤level / 8. - With bonuses: physical AC ≤
level / 4, magic AC ≤level / 10. Enforce glow/hum on max hit/dam sets.
Containers, lights & food
- Perpetual lights begin at level 20; endless drink containers wait until level 65.
- Container capacity scales 100 lbs (levels 1–10) → 150 (11–15) → 200 (16–25) → 500 (26+).
- Food values stay between 10 and 50.
Scrolls, potions & pills
- Item level ≥ spell base class level. Spell level ≤
min(item level + 10, item level × 1.4). - Shop costs for spells above level 50 run at least 1.25× homemade scroll/potion prices.
Wands & staves
- Share the same level constraints as consumables.
- Charge caps: 1 (levels 1–15), 2 (16–25), 3 (26–40), 4 (41–60), 6 (61–91). Limit marquee spells accordingly.
Bonus ceilings
- HP/Mana/Move: choose mana or hit points per item; bracket caps: 0 (1–10), +15 (11–25), +20 (26–40), +35 (41–60), +40 (61–84), +50 (85–91). Subtract five when stacking extra affects.
- Hitroll or damroll: maxes from +0 (levels 1–9) through +6 (90–91); reduce other bonuses by one per +2 stacked and enforce glow/hum on +6 armor.
- Attributes: total stat boosts peak at +2 (1–10), +4 (11–25), +5 (26–50), +6 (51+); lower ceilings when mixing with hp/mana or hit/dam bonuses.
- Saves: best-in-slot stays at -5 for level 71+ pieces and scales down one step per bracket.
Ancient tier rolls
- Eligible gear between levels 30–91 can auto-upgrade: Elite (30–59, 10%), Runic (60–89, 5%), Ancient (90–91, 1%).
- Use
ancients <tier> <vnum>to force a tier; the game validates eligibility before cloning. - Armor/lights gain +20–120 split bonuses by tier; weapons receive flat dice bumps (+5/+5 to +25/+25).
Enchanting reference
- Failure chance starts at 25% (clamped 5–95). Caster level removes up to 50 (armor) or 75 (weapon) points; glow adds 4, hum adds 3, extra affects add 20/25.
- Catastrophic failure steps bonuses down instead of vaporising items, but +5 or higher bonuses spike failure quickly because of quadratic penalties.
Sources: rebuilt object-stat guidance plus the current enchant and Ancient tier logic in docs/gameplay_systems.html.
Area file string hygiene
Keep an eye on tilde terminators whenever you hand-edit #OBJECTS or #ROOMS blocks. The loader stops reading each keyword, long description, or extra description the moment it hits a bare ~ on its own line, then expects the very next character to belong to the following field.
- Never leave a trailing
~or extra punctuation on the same line as the sentinel. Doing so makes the parser treat the stray character as the start of the next record, which desynchronises the area stream and corrupts everything that follows. - If you need a literal tilde in description text, replace it with another character. The raw delimiter is not safe inside area strings.
- When you clean up errant sentinels, follow the object layout used in
area/voxmad.are: description lines flow normally, then a blank line, then a single~line before the next field begins.
Reference: the shared fread_string helper stops at the first ~ it encounters while loading area strings, so any stray delimiter halts the read early and shifts the file pointer into the wrong place.
Achievement configuration
Each achievement lives on a single pipe-delimited line inside config/achievements.txt:
<id>|<name>|<description>|<criteria>|<threshold>|<points>
id- Lowercase identifier used internally; keep stable.
name- Player-facing title shown in help and UI.
description- Short summary surfaced in achievement listings.
criteria- One of
kill_count,death_count,level,exploration_completions,all_stats_maxed,language_skill:<language>,prestige_kill:<mob>, orprestige:<identifier>. threshold- Numeric requirement for the tracked stat (often 1 for prestige kills and boolean checks).
points- Score granted when unlocked.
Exploration milestones
Use exploration_completions to reward fully explored areas. Set the threshold to the number of distinct 100% completions required.
Physical perfection
all_stats_maxed ignores the threshold beyond confirming it is at least one. Leave the value at 1 for boolean checks.
Language mastery
Configure language_skill:<language> with the keyword accepted by the language command (for example jedi or msl). Characters unlock the achievement once the tracked proficiency reaches the threshold.
Prestige encounters
prestige_kill:<mob> normalises the supplied mob name (lowercase, punctuation removed, prefixed with prestige_) so it matches the stored counter. For non-kill counters, fall back to prestige:<identifier> and supply the exact key.
Reload the definitions with a reboot or copyover after editing. Characters keep retired achievements flagged as legacy.
Quest master loops
The modern quest system is live and starts at the player command quest. A quest giver is any NPC with the questmaster act flag; the command looks for that NPC in the player's current room.
Player flow
quest requeststarts a task from the quest master in the room.quest inforepeats the current target and rough location.quest talkcompletes briefing/check-in objectives when the player reaches the target NPC.quest completepays out after a kill, recovery, rescue, or talk objective is finished.quest buy listshows the quest-point shop.
Current task types
- Kill: selects a live non-service NPC near the player's level and marks completion when that vnum dies.
- Recover: selects a takeable non-money object not already carried by the player and marks completion when the player gets it.
- Talk: used by the LotR story quest masters; sends the player to a specific local contact and completes with
quest talk. - Rescue: uses the staff-managed template from
qtemplatewhen enabled and due.
Builder notes
- Use the
questmasteract flag on a stable NPC if you want a room to offer quests. - Do not put quest masters in safe/private/solitary setups that make selected targets unreachable or confusing.
- The LotR quest masters are special-cased by vnum for story talk targets; ordinary quest masters use the general kill/recover/rescue flow.
qtemplate showis the staff starting point for the rotating rescue template. Useqtemplate area current,level,reward,schedule,victimmsg, andcaptormsgto tune it.
Good next use: pair a themed quest master with mudscript flavor. Let quest handle objective state/rewards, and let the NPC's .ms script make the room feel alive when players ask about local trouble.
Critter invasion sizing
Two numbers control an invasion’s cadence: the route array length and the wave_count. Each route entry spawns one mob per wave, and the wave count dictates how many full cycles fire before shutdown.
Want ten waves of thirty NPCs? Create thirty route entries (duplicates allowed when sharing paths), point the group at that array, and set wave_count to 10. The scheduler respawns the next wave after the configured delay until the count reaches zero.
static const CRITTER_ROUTE thirty_raider_routes[] = {
{"b0", "Follow path B", 9615, 9616, 9620},
{"b1", "Follow path B", 9615, 9616, 9620},
/* add twenty-eight more entries */
};
static const CRITTER_GROUP critter_groups[] = {
{"thirty_raiders", "Thirty Raiders", "Recommended levels 30-40", 35,
thirty_raider_routes,
sizeof thirty_raider_routes / sizeof thirty_raider_routes[0],
10},
/* existing groups follow */
};
Result: each wave spawns thirty mobs, waits for the respawn delay, and repeats ten times before the system shuts down.
Skill & spell availability
Use the interactive matrix to cross-check class access, earliest levels, and race-only perks without diving into tables.c. Filter by class or ability type, and expand the race primer for innate bonuses.
Data generated from the live skill table; the embedded view shows the refresh timestamp.
Bit constant quick reference
The single-letter (and double-letter) bit macros are defined in the builder section of merc.h. Use this chart when you need the numeric value for manual flag editing or when checking masks in logs.
| Macro | Value |
|---|---|
A | 1 |
B | 2 |
C | 4 |
D | 8 |
E | 16 |
F | 32 |
G | 64 |
H | 128 |
I | 256 |
J | 512 |
K | 1024 |
L | 2048 |
M | 4096 |
N | 8192 |
O | 16384 |
P | 32768 |
Q | 65536 |
R | 131072 |
S | 262144 |
T | 524288 |
U | 1048576 |
V | 2097152 |
W | 4194304 |
X | 8388608 |
Y | 16777216 |
Z | 33554432 |
aa | 67108864 |
bb | 134217728 |
cc | 268435456 |
dd | 536870912 |
ee | 1073741824 |
Source: merc.h “values of interest to area builders” section.
Wiznet channels
These toggles help builders subscribe to the appropriate server events. Each entry shows the Wiznet flag and the minimum level macro allowed to enable it.
| Toggle | Flag | Minimum Level Macro |
|---|---|---|
| on | WIZ_ON | IM |
| bugs | WIZ_BUGS | L3 |
| ticks | WIZ_TICKS | IM |
| logins | WIZ_LOGINS | IM |
| sites | WIZ_SITES | L4 |
| links | WIZ_LINKS | L7 |
| newbies | WIZ_NEWBIE | IM |
| spam | WIZ_SPAM | L5 |
| deaths | WIZ_DEATHS | IM |
| resets | WIZ_RESETS | L4 |
| mobdeaths | WIZ_MOBDEATHS | L4 |
| flags | WIZ_FLAGS | L2 |
| penalties | WIZ_PENALTIES | L5 |
| saccing | WIZ_SACCING | L5 |
| levels | WIZ_LEVELS | IM |
| load | WIZ_LOAD | L4 |
| restore | WIZ_RESTORE | L4 |
| snoops | WIZ_SNOOPS | L5 |
| switches | WIZ_SWITCHES | L5 |
| secure | WIZ_SECURE | L7 |
| illegal | WIZ_ILLEGAL | L5 |
| debug | WIZ_DEBUG | L1 |
| spells | WIZ_SPELLS | L5 |
| arena | WIZ_ARENA | L3 |
| clone | WIZ_CLONE | L5 |
Source: wiznet_table in const.c.