From 9c3a7a11c6dae9133979be661def2707f4fb60d1 Mon Sep 17 00:00:00 2001 From: Strider Jones Date: Mon, 10 Feb 2025 01:38:38 -0800 Subject: [PATCH 1/3] Update convertion scripts. --- scripts/.venv/lib64 | 1 - scripts/.venv/pyvenv.cfg | 5 -- scripts/README.md | 19 +++++ scripts/mud/base.py | 32 +++++++- scripts/mud/bitflags.py | 3 +- scripts/mud/flags.py | 79 +++++++++++++++--- scripts/mud/mob.py | 22 ++--- scripts/mud/obj.py | 153 ++++++++++++++++++----------------- scripts/mud/shop.py | 86 +++++++++++++++++++- scripts/mud/world.py | 41 +++++++++- scripts/mud/zone.py | 168 ++++++++++++++++++++++++++++++++++++++- scripts/pyproject.toml | 16 ++++ 12 files changed, 517 insertions(+), 108 deletions(-) delete mode 120000 scripts/.venv/lib64 delete mode 100644 scripts/.venv/pyvenv.cfg create mode 100644 scripts/README.md create mode 100644 scripts/pyproject.toml diff --git a/scripts/.venv/lib64 b/scripts/.venv/lib64 deleted file mode 120000 index 7951405f..00000000 --- a/scripts/.venv/lib64 +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file diff --git a/scripts/.venv/pyvenv.cfg b/scripts/.venv/pyvenv.cfg deleted file mode 100644 index a782da1c..00000000 --- a/scripts/.venv/pyvenv.cfg +++ /dev/null @@ -1,5 +0,0 @@ -home = /usr/bin -include-system-site-packages = false -version = 3.11.0 -executable = /usr/bin/python3.11 -command = /usr/bin/python3 -m venv /home/strider/fierymud/scripts/.venv diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 00000000..cdf26404 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,19 @@ +# Python Scripts +These scripts are used to convert Fierymud mud files to json files. + +## Setup +```bash +cd scripts +poetry + +## Examples +Single File: +```bash +poetry run python mudfile_to_json.py ../lib/world/wld/30.wld +``` + +Run against the whole codebase +```bash +for f in $(find ../lib -name index); do echo $f; poetry run python mudfile_to_json.py $f; done``` + +Note: You can change the `../lib` to any directory if you want to only run it against one folder (like mob or zon for example.) \ No newline at end of file diff --git a/scripts/mud/base.py b/scripts/mud/base.py index cda10b1e..7129a4c8 100644 --- a/scripts/mud/base.py +++ b/scripts/mud/base.py @@ -1,4 +1,5 @@ """Mud Objects""" + from abc import ABC, abstractmethod from enum import Enum, auto from typing import List @@ -16,7 +17,7 @@ class MudTypes(Enum): """ MOB = auto() - Obj = auto() + OBJ = auto() SHOP = auto() TRIGGER = auto() WORLD = auto() @@ -78,10 +79,16 @@ def from_mudfile(cls, mudfile: MudFile): for line in mudfile: if line.startswith("#"): if data: - objects.append(cls.from_data(data)) + obj = cls.from_data(data) + if obj: + objects.append(obj) data = [line] else: data.append(line) + if data: + obj = cls.from_data(data) + if obj: + objects.append(obj) return objects except Exception as e: print(f"\nError parsing {cls.__name__} file: {e}") @@ -98,7 +105,23 @@ def from_data(cls, data: List[str]): :param data: The data to read from :return: The object """ - vnum = int(data.pop(0)[1:]) + line = data.pop(0) + if line.startswith("$"): + # Empty file. + return None + elif line.startswith("CircleMUD v3.0 Shop File~"): + # Skip the shop file header + return None + + if not line.startswith("#"): + print(f"Invalid data: {line}") + return None + + if line.endswith("~"): + # Shop files have a ~ at the end of the shop vnum + line = line[:-1] + + vnum = int(line[1:]) obj = cls(vnum) try: obj.parse(data) @@ -164,7 +187,8 @@ def build_flags(flag, flaglist, offset=0): flag = int(flag) if flag.bit_length() > len(flaglist): raise ValueError( - f"Flag out of range! {flag}({bin(flag)}:{flag.bit_length()} bits = {len(flaglist)} ({flaglist})") + f"Flag out of range! {flag}({bin(flag)}:{flag.bit_length()} bits = {len(flaglist)} ({flaglist})" + ) for i in range(len(flaglist)): if flag & (1 << i + offset): active.append(flaglist[i]) diff --git a/scripts/mud/bitflags.py b/scripts/mud/bitflags.py index d2d3af61..a9e6b888 100644 --- a/scripts/mud/bitflags.py +++ b/scripts/mud/bitflags.py @@ -69,7 +69,8 @@ def __repr__(self): """ return self.__str__() - def to_json(self): + + def json_repr(self): return str(self) diff --git a/scripts/mud/flags.py b/scripts/mud/flags.py index 3ceda8af..d0061b63 100644 --- a/scripts/mud/flags.py +++ b/scripts/mud/flags.py @@ -262,9 +262,9 @@ "MONK_ACID", # 260 "MONK_SHOCK", # 261 "STATUE", # 262 - "WATER_BLAST", # 263 - "DISPLACEMENT", # 264 - "GREATER DISPLACEMENT", #265 + "WATER_BLAST", # 263 + "DISPLACEMENT", # 264 + "GREATER DISPLACEMENT", # 265 ] OBJECT_TYPES = [ @@ -298,7 +298,7 @@ "WALL", # 27, # /* Blocks passage in one direction */ "TOUCHSTONE", # 28, # /* Item sets homeroom when touched */ "BOARD", # 29, # Bullitin board - "INSTRUMENT", # 30, # /* Item is a musical instrument */ + "INSTRUMENT", # 30, # /* Item is a musical instrument */ ] WEAR_FLAGS = [ @@ -497,7 +497,7 @@ "VAMP_TOUCH", # 67 "RAY_OF_ENFEEB", # 68 "ANIMATED", # 69 - "EXPOSED", # 70 + "EXPOSED", # 70 "SHADOWING", # 71 "CAMOUFLAGED", # 72 "SPIRIT_WOLF", # 73 @@ -580,7 +580,6 @@ "LIQ_TYPES", # 42 ] - # Mobile flags: used by char_data.char_specials.act MOB_FLAGS = [ "MOB_SPEC", # 0 /* Mob has a callable spec-proc */ @@ -660,7 +659,7 @@ "EFF_MESMERIZED", # 30 /* Super fasciated by something */ "EFF_IMMOBILIZED", # 31 /* Char cannot move */ "EFF_LIGHT", # 32 - "EFF_NIMBLE", # 33 + "EFF_NIMBLE", # 33 "EFF_MINOR_PARALYSIS", # 34 "EFF_HURT_THROAT", # 35 "EFF_FEATHER_FALL", # 36 @@ -697,7 +696,7 @@ "EFF_VAMP_TOUCH", # 67 "EFF_RAY_OF_ENFEEB", # 68 "EFF_ANIMATED", # 69 - "EFF_EXPOSED", # 70 + "EFF_EXPOSED", # 70 "EFF_SHADOWING", # 71 "EFF_CAMOUFLAGED", # 72 "EFF_SPIRIT_WOLF", # 73 @@ -709,6 +708,66 @@ "EFF_HEX", # 79 /* The evil side of blessing, to hurt ether chars */ "EFF_DETECT_POISON", # 80 /* Char is sensitive to poison */ "EFF_SONG_OF_REST", # 81 - "EFF_DISPLACEMENT", # 82 - "EFF_GREATER_DISPLACEMENT", # 83 + "EFF_DISPLACEMENT", # 82 + "EFF_GREATER_DISPLACEMENT", # 83 +] + +ROOM_FLAGS = [ + "ROOM_DARK", # 0 /* Dark */ + "ROOM_DEATH", # 1 /* Death trap */ + "ROOM_NOMOB", # 2 /* MOBs not allowed */ + "ROOM_INDOORS", # 3 /* Indoors */ + "ROOM_PEACEFUL", # 4 /* Violence not allowed */ + "ROOM_SOUNDPROOF", # 5 /* Shouts, gossip blocked */ + "ROOM_NOTRACK", # 6 /* Track won't go through */ + "ROOM_NOMAGIC", # 7 /* Magic not allowed */ + "ROOM_TUNNEL", # 8 /* room for only 2 pers */ + "ROOM_PRIVATE", # 9 /* Can't teleport in */ + "ROOM_GODROOM", # 10 /* LVL_GOD+ only allowed */ + "ROOM_HOUSE", # 11 /* (R) Room is a house */ + "ROOM_HOUSE_CRASH", # 12 /* (R) House needs saving */ + "ROOM_ATRIUM", # 13 /* (R) The door to a house */ + "ROOM_OLC", # 14 /* (R) Modifyable/!compress */ + "ROOM_BFS_MARK", # 15 /* (R) breadth-first srch mrk */ + "ROOM_NOWELL", # 16 /* No spell portals like moonwell */ + "ROOM_NORECALL", # 17 /* No recalling */ + "ROOM_UNDERDARK", # 18 /* (not used) */ + "ROOM_NOSUMMON", # 19 /* Can't summon to or from. Can't banish here. */ + "ROOM_NOSHIFT", # 20 /* no plane shift (not used) */ + "ROOM_GUILDHALL", # 21 /* (not used) */ + "ROOM_NOSCAN", # 22 /* Unable to scan to/from rooms */ + "ROOM_ALT_EXIT", # 23 /* Room's exits are altered */ + "ROOM_MAP", # 24 /* Room on surface map (unused) */ + "ROOM_ALWAYSLIT", # 25 /* Makes the room lit */ + "ROOM_ARENA", # 26 /* (safe) PK allowed in room */ + "ROOM_OBSERVATORY", # 27 /* see into adjacent ARENA rooms */ +] + +DIRECTIONS = ["NORTH", "EAST", "SOUTH", "WEST", "UP", "DOWN"] + + +EXIT_FLAGS = [ + "", + "EX_ISDOOR", # 0 /* Exit is a door */ + "EX_CLOSED", # 1 /* The door is closed */ + "EX_LOCKED", # 2 /* The door is locked */ + "EX_PICKPROOF", # 3 /* Lock can't be picked */ + "EX_HIDDEN", # 4 /* exit is hidden */ + "EX_DESCRIPT", # 5 /* Just an extra description */ +] + +# Shop Related +SHOP_FLAGS = [ + "WILL_START_FIGHT", # 1 + "WILL_BANK_MONEY", # 2 +] + +SHOP_TRADES_WITH = [ + "TRADE_NOGOOD", # 1 + "TRADE_NOEVIL", # 2 + "TRADE_NONEUTRAL", # 3 + "TRADE_NOMAGIC_USER", # 4 + "TRADE_NOCLERIC", # 5 + "TRADE_NOTHIEF", # 6 + "TRADE_NOWARRIOR", # 7 ] diff --git a/scripts/mud/mob.py b/scripts/mud/mob.py index 3e19cb47..0c47eafe 100644 --- a/scripts/mud/mob.py +++ b/scripts/mud/mob.py @@ -20,8 +20,9 @@ def parse(self, data): self.stats["effect_flags"] = self.read_flags(effect_flags, EFFECTS) self.stats["alignment"] = int(align) - (level, hitroll, ac, hp_num_dice, hp_size_dice, move, dam_num_dice, - dam_size_dice, dam_roll_bonus) = re.split(r"[ d+]", data.pop(0)) + (level, hitroll, ac, hp_num_dice, hp_size_dice, move, dam_num_dice, dam_size_dice, dam_roll_bonus) = re.split( + r"[ d+]", data.pop(0) + ) self.stats["level"] = int(level) self.stats["hitroll"] = int(hitroll) self.stats["ac"] = int(ac) @@ -29,11 +30,15 @@ def parse(self, data): self.stats["move"] = int(move) self.stats["dam_dice"] = Dice(int(dam_num_dice), int(dam_size_dice), int(dam_roll_bonus)) - gold, plat, exp, zone = data.pop(0).split() - self.stats["gold"] = int(gold) - self.stats["plat"] = int(plat) - self.stats["exp"] = int(exp) - self.stats["zone"] = int(zone) + fields = data.pop(0).split() + if len(fields) == 6: + self.stats["copper"] = int(fields[0]) + self.stats["silver"] = int(fields[1]) + self.stats["gold"] = int(fields[2]) + self.stats["platinum"] = int(fields[3]) + if len(fields) == 4: + self.stats["gold"] = int(fields[0]) + self.stats["platinum"] = int(fields[1]) (position, default_position, gender, class_num, race, race_align, size) = data.pop(0).split() @@ -53,9 +58,8 @@ def parse(self, data): self.stats["effect_flags"].set_flags(line.split()[1], 64) elif line.startswith("MOB2"): self.stats["mob_flags"].set_flags(line.split()[1], 32) - elif line.startswith("E"): break else: key, value = line.split() - self.stats[key[:-1]] = value + self.stats[key[:-1]] = int(value) diff --git a/scripts/mud/obj.py b/scripts/mud/obj.py index 8fb88e14..fd4ac4f5 100644 --- a/scripts/mud/obj.py +++ b/scripts/mud/obj.py @@ -7,14 +7,14 @@ class Obj(Base): def __init__(self, vnum): super().__init__(vnum) - self.type = MudTypes.Obj + self.type = MudTypes.OBJ def parse(self, data): self.stats = {} - self.stats['namelist'] = self.read_string(data) - self.stats['short_descr'] = self.read_string(data) - self.stats['long_descr'] = self.read_string(data) - self.stats['action_descr'] = self.read_string(data) + self.stats["namelist"] = self.read_string(data) + self.stats["short_descr"] = self.read_string(data) + self.stats["long_descr"] = self.read_string(data) + self.stats["action_descr"] = self.read_string(data) type_flag, extra_flags, wear_flags, level = data.pop(0).split() f1, f2, f3, f4, f5, f6, f7 = data.pop(0).split() @@ -26,41 +26,41 @@ def parse(self, data): affects = (int(aff3) << 26) | (int(aff2) << int(13)) | int(aff1) obj_effects = self.build_flags(affects, EFFECTS) - self.stats['type'] = item_types - self.stats['wear_flags'] = wear_flags_text - self.stats['object_flags'] = extra_flags_text - self.stats['level'] = level - self.stats['weight'] = weight - self.stats['cost'] = cost - self.stats['timer'] = timer - self.stats['effects'] = obj_effects - self.stats['stats'] = extra_stats + self.stats["type"] = item_types + self.stats["wear_flags"] = wear_flags_text + self.stats["object_flags"] = extra_flags_text + self.stats["level"] = level + self.stats["weight"] = weight + self.stats["cost"] = cost + self.stats["timer"] = timer + self.stats["effects"] = obj_effects + self.stats["stats"] = extra_stats while data: line = data.pop(0) - if line.startswith('E'): + if line.startswith("E"): keyword = self.read_string(data) extra_desc = self.read_string(data) if "extra_desc" not in self.stats: self.stats["extra_desc"] = [] - self.stats["extra_desc"].append({'keyword': keyword, 'desc': extra_desc}) - elif line.startswith('A'): - location, modifier = data.pop(0).strip().split(' ') + self.stats["extra_desc"].append({"keyword": keyword, "desc": extra_desc}) + elif line.startswith("A"): + location, modifier = data.pop(0).strip().split(" ") if "affects" not in self.stats: self.stats["affects"] = [] - self.stats["affects"].append({'location': self.get_flag(location, AFFECTS), 'modifier': int(modifier)}) - elif line.startswith('H'): + self.stats["affects"].append({"location": self.get_flag(location, AFFECTS), "modifier": int(modifier)}) + elif line.startswith("H"): hiddenness = data.pop(0).strip() - self.stats['hiddenness'] = hiddenness - elif line.startswith('T'): + self.stats["hiddenness"] = hiddenness + elif line.startswith("T"): if "triggers" not in self.stats: self.stats["triggers"] = [] self.stats["triggers"].append(int(line[2:])) - elif line.startswith('X'): + elif line.startswith("X"): if "object_flags" not in self.stats: self.stats["object_flags"] = "" self.stats["object_flags"] += self.build_flags(data.pop(0).strip(), EXTRA_OBJ_FLAGS, 32) - elif line.startswith(('#', '$')): + elif line.startswith(("#", "$")): break else: raise Exception(f"Unknown Extra Flags: {line}") @@ -71,99 +71,110 @@ def obj_val(itype: str, *args): results = {} match itype: case "ARMOR" | "TREASURE": - results = { - 'AC': args[0] - } + results = {"AC": args[0]} case "LIGHT": results = { - 'Is_Lit:': args[0], - 'Capacity': args[1], - 'Remaining': "PERMANENT" if int(args[2]) == -1 else args[2] + "Is_Lit:": args[0], + "Capacity": args[1], + "Remaining": "PERMANENT" if int(args[2]) == -1 else args[2], } case "CONTAINER": results = { - 'Capacity': args[0], - 'flags': Obj.build_flags(args[1], ['Closeable', 'Pickproof', 'Closed', 'Locked']), - 'Key': args[2], - 'IsCorpse': args[3], - 'Weight Reduction': args[4], + "Capacity": args[0], + "flags": Obj.build_flags(args[1], ["Closeable", "Pickproof", "Closed", "Locked"]), + "Key": args[2], + "IsCorpse": args[3], + "Weight Reduction": args[4], } case "DRINKCON" | "FOUNTAIN": results = { - 'Capacity': args[0], - 'Remaining': args[1], - 'Liquid': Obj.get_flag(args[2], LIQUIDS), - 'Poisoned': args[3], + "Capacity": args[0], + "Remaining": args[1], + "Liquid": Obj.get_flag(args[2], LIQUIDS), + "Poisoned": args[3], } case "FOOD": results = { - 'Fillingness': args[0], - 'Poisoned': args[1], + "Fillingness": args[0], + "Poisoned": args[1], } case "SPELLBOOK": results = { - 'Pages': args[0], + "Pages": args[0], } case "SCROLL" | "POTION": results = { - 'Level': args[0], - 'Spell 1': Obj.get_flag(args[1], SPELLS), - 'Spell 2': Obj.get_flag(args[2], SPELLS), - 'Spell 3': Obj.get_flag(args[3], SPELLS), + "Level": args[0], + "Spell 1": Obj.get_flag(args[1], SPELLS), + "Spell 2": Obj.get_flag(args[2], SPELLS), + "Spell 3": Obj.get_flag(args[3], SPELLS), } case "WAND" | "STAFF" | "INSTRUMENT": results = { - 'Level': args[0], - 'Max_Charges': args[1], - 'Charges_Left': args[2], - 'Spell': Obj.get_flag(args[3], SPELLS), + "Level": args[0], + "Max_Charges": args[1], + "Charges_Left": args[2], + "Spell": Obj.get_flag(args[3], SPELLS), } case "MONEY": results = { - 'Platinum': args[0], - 'Gold': args[1], - 'Silver': args[2], - 'Copper': args[3], + "Platinum": args[0], + "Gold": args[1], + "Silver": args[2], + "Copper": args[3], } case "PORTAL": results = { - 'Destination': args[0], - 'Entry_Message': args[1], - 'Character_Message': args[2], - 'Exit_Message': args[3], + "Destination": args[0], + "Entry_Message": args[1], + "Character_Message": args[2], + "Exit_Message": args[3], } case "WALL": results = { - 'Direction': args[0], - 'Dispelable': args[1], - 'Hitpoints': args[2], - 'Spell': args[3], + "Direction": args[0], + "Dispelable": args[1], + "Hitpoints": args[2], + "Spell": args[3], } case "BOARD": results = { - 'Pages': args[0], + "Pages": args[0], } case "WEAPON": dice = int(args[1]) dice_size = int(args[2]) average = (float(dice + 1) / 2.0) * float(dice_size) results = { - 'Hitroll': args[0], - 'Hit Dice': Dice(args[1], args[2], 0), - 'Average': average, - 'Damage Type': Obj.get_flag(args[3], DAMAGE_TYPES) + "Hitroll": args[0], + "Hit Dice": Dice(args[1], args[2], 0), + "Average": average, + "Damage Type": Obj.get_flag(args[3], DAMAGE_TYPES), } case "TRAP": results = { - 'Spell': Obj.get_flag(args[0], SPELLS), - 'Trap Hitpoints': args[1], + "Spell": Obj.get_flag(args[0], SPELLS), + "Trap Hitpoints": args[1], } case "NOTE": results = { - 'Tongue': args[0], + "Tongue": args[0], } - case "WORN" | "TRASH" | "NOTE" | "OTHER" | "KEY" | "NOTHING" | "PEN" | "BOAT" | "ROPE" | "TOUCHSTONE" | "MISSILE" | "FIREWEAPON": + case ( + "WORN" + | "TRASH" + | "NOTE" + | "OTHER" + | "KEY" + | "NOTHING" + | "PEN" + | "BOAT" + | "ROPE" + | "TOUCHSTONE" + | "MISSILE" + | "FIREWEAPON" + ): pass case _: raise ValueError(f"Unknown type {itype} Flags: {args}") diff --git a/scripts/mud/shop.py b/scripts/mud/shop.py index 7ec1f774..82dbbef8 100644 --- a/scripts/mud/shop.py +++ b/scripts/mud/shop.py @@ -1,13 +1,93 @@ -from .base import Base, Dice, MudTypes +from .base import Base, MudTypes from .flags import * +import re class Shop(Base): """Construct an Item""" + ITEM_TYPES = [ + "UNDEFINED", + "LIGHT", + "SCROLL", + "WAND", + "STAFF", + "WEAPON", + "FIREWEAPON", + "MISSILE", + "TREASURE", + "ARMOR", + "POTION", + "WORN", + "OTHER", + "TRASH", + "TRAP", + "CONTAINER", + "NOTE", + "LIQCONTAINER", + "KEY", + "FOOD", + "MONEY", + "PEN", + "BOAT", + "FOUNTAIN", + "PORTAL", + "ROPE", + "SPELLBOOK", + "WALL", + "TOUCHSTONE", + "BOARD", + "INSTRUMENT", + ] + def __init__(self, vnum): super().__init__(vnum) - self.type = MudTypes.Shop + self.type = MudTypes.SHOP def parse(self, data): - raise NotImplementedError + self.stats = {} + self.stats["selling"] = [] + while data: + item = data.pop(0).split() + if item[0] == "-1": + break + else: + amount = int(item[1]) if len(item) > 1 else 0 + self.stats["selling"].append({"item": int(item[0]), "amount": amount}) + + self.stats["buy_profit"] = float(data.pop(0)) + self.stats["sell_profit"] = float(data.pop(0)) + + self.stats["accepts"] = [] + while data: + line = data.pop(0) + if line == "-1": + break + + groups = re.findall(r"(\d+|\D+)", line) + item_type = self.ITEM_TYPES[int(groups[0])] + self.stats["accepts"].append({"type": item_type, "keywords": groups[1] if len(groups) > 1 else ""}) + + self.stats["no_such_item1"] = self.read_string(data) + self.stats["no_such_item2"] = self.read_string(data) + self.stats["do_not_buy"] = self.read_string(data) + self.stats["missing_cash1"] = self.read_string(data) + self.stats["missing_cash2"] = self.read_string(data) + self.stats["message_buy"] = self.read_string(data) + self.stats["message_sell"] = self.read_string(data) + self.stats["temper1"] = int(data.pop(0)) + self.stats["flags"] = self.read_flags(data.pop(0), SHOP_FLAGS) + self.stats["keeper"] = int(data.pop(0)) + self.stats["trades_with"] = self.read_flags(data.pop(0), SHOP_TRADES_WITH) + self.stats["rooms"] = [] + while line := data.pop(0): + if line == "-1": + break + else: + self.stats["rooms"].append(int(line)) + self.stats["hours"] = [] + self.stats["hours"].append({"open": int(data.pop(0)), "close": int(data.pop(0))}) + opens = int(data.pop(0)) + closes = int(data.pop(0)) + if any([opens, closes]): + self.stats["hours"].append({"open": opens, "close": closes}) diff --git a/scripts/mud/world.py b/scripts/mud/world.py index e1bd6463..c7e3152d 100644 --- a/scripts/mud/world.py +++ b/scripts/mud/world.py @@ -7,7 +7,44 @@ class World(Base): def __init__(self, vnum): super().__init__(vnum) - self.type = MudTypes.World + self.type = MudTypes.WORLD def parse(self, data): - raise NotImplementedError + self.stats = {} + self.stats["name"] = self.read_string(data) + self.stats["description"] = self.read_string(data) + (_zone, flags, sector) = data.pop(0).split() + self.stats["flags"] = self.read_flags(flags, ROOM_FLAGS) + self.stats["sector"] = sector + while data: + line = data.pop(0) + if line.startswith("S"): + break + elif line.startswith("D"): + if "exits" not in self.stats: + self.stats["exits"] = {} + exit = {} + direction = DIRECTIONS[int(line[1:])] + exit["description"] = self.read_string(data) + exit["keyword"] = self.read_string(data) + exit_type, key, destination = data.pop(0).split() + if exit_type == "1": + exit["type"] = "Door" + elif exit_type == "2": + exit["type"] = "Pickproof Door" + elif exit_type == "3": + exit["type"] = "Description only" + exit["key"] = key + exit["destination"] = destination + if direction in self.stats["exits"]: + print(f"Duplicate exit for direction {direction} in room {self.vnum}") + self.stats["exits"][direction] = exit + elif line.startswith("E"): + if "extra_descriptions" not in self.stats: + self.stats["extra_descriptions"] = {} + keyword = self.read_string(data) + description = self.read_string(data) + self.stats["extra_descriptions"][keyword] = description + + else: + break diff --git a/scripts/mud/zone.py b/scripts/mud/zone.py index 8482adc4..fc369e18 100644 --- a/scripts/mud/zone.py +++ b/scripts/mud/zone.py @@ -1,13 +1,177 @@ +from typing import DefaultDict from .base import Base, Dice, MudTypes from .flags import * +from dataclasses import dataclass class Zone(Base): """Construct an Item""" + RESET_MODES = ["NEVER", "EMPTY", "NORMAL"] + CLIMATES = [ + "CLIMATE_NONE", # 0 /* do not report weather */ + "CLIMATE_SEMIARID", # 1 /* plains */ + "CLIMATE_ARID", # 2 /* deserts */ + "CLIMATE_OCEANIC", # 3 /* ocean */ + "CLIMATE_TEMPERATE", # 4 /* mediterranean climate */ + "CLIMATE_SUBTROPICAL", # 5 /* florida */ + "CLIMATE_TROPICAL", # 6 /* equatorial / jungle */ + "CLIMATE_SUBARCTIC", # 7 /* high elevation */ + "CLIMATE_ARCTIC", # 8 /* extreme polar */ + "CLIMATE_ALPINE", # 9 /* mountain */ + ] + + @dataclass + class Command: + cmd: str + cont: bool + arg1: int + arg2: int + arg3: int + sarg: str + def __init__(self, vnum): super().__init__(vnum) - self.type = MudTypes.Zone + self.type = MudTypes.ZONE + + def parse_commands(self, data): + commands = [] + while line := data.pop(0): + if line == "S": + break + (cmd, cont, arg1, arg2, arg3, sarg) = line.split(" ", 5) + # cont = rest.pop(0) if rest else None + # arg1 = rest.pop(0) if rest else None + # arg2 = rest.pop(0) if rest else None + # arg3 = rest.pop(0) if rest else None + # sarg = rest + + command = self.Command(cmd, int(cont) == 1, int(arg1), int(arg2), int(arg3), sarg.strip()) + commands.append(command) + + return commands + + def parse_door_state(self, state): + return [ + ["OPEN"], # Door open + ["CLOSED"], # Door closed + ["LOCKED"], # Door locked + ["HIDDEN"], # Exit hidden + ["HIDDEN", "CLOSED", "LOCKED"], # Door hidden closed and locked + ["HIDDEN", "CLOSED"], # Door hidden and closed + ][state] def parse(self, data): - raise NotImplementedError + self.stats = {} + self.stats["name"] = data.pop(0).rstrip("~") + args = data.pop(0).split() + self.stats["top"] = int(args[0]) + self.stats["lifespan"] = int(args[1]) + self.stats["reset_mode"] = self.RESET_MODES[int(args[2])] + self.stats["zone_factor"] = int(args[3]) if len(args) > 3 else 100 + self.stats["hemisphere"] = int(args[4]) if len(args) > 4 else 0 + self.stats["climate"] = self.CLIMATES[int(args[5]) if len(args) > 5 else 0] + + """ + M: Load Mobile to room mob_vnum, max_exist, room_vnum, (monster name) + - E: Equip mobile with object obj_vnum, max_exist, equip_location, (object name) + - G: Give an object to a mobile obj_vnum, max_exist, unused, (object name) + O: Load Object to room obj_vnum, max_exist, room_vnum, (object name) + - P: Put object in another object obj_vnum, max_exist, obj_vnum, (object name) + R: Remove an object from the room room_vnum, obj_vnum, (object name) + F: Force a mobile to do... mob_vnum, unused, unused, (command) + D: Open/Close/Lock a Door room_vnum, door_direction, state, (door name) + """ + commands = DefaultDict(list) + steps = self.parse_commands(data) + while steps: + step = steps.pop(0) + if step.cont: + print(f"Warning, invalid continuation for step: {step}") + + match step.cmd: + case "M": + mob = {"vnum": step.arg1, "max": step.arg2, "room": step.arg3, "name": step.sarg} + while steps and steps[0].cont and steps[0].cmd in ["G", "E"]: + step = steps.pop(0) + if step.cmd == "G": + if "carrying" not in mob: + mob["carrying"] = [] + object = {"vnum": step.arg1, "max": step.arg2, "name": step.sarg} + if step.arg3 != -1: + print(f"Error, weird arg3 for giving an object. {step}") + while steps and steps[0].cmd == "P" and steps[0].cont: + step = steps.pop(0) + if "contains" not in object: + object["contains"] = [] + if object["vnum"] != step.arg3: + print(f"Error, attempting to put object in object with different parent: {step}") + object["contains"].append( + {"vnum": step.arg1, "max": step.arg2, "container": step.arg3, "name": step.sarg} + ) + mob["carrying"].append(object) + elif step.cmd == "E": + if "equipped" not in mob: + mob["equipped"] = [] + object = {"vnum": step.arg1, "max": step.arg2, "location": step.arg3, "name": step.sarg} + while steps and steps[0].cmd == "P" and steps[0].cont: + step = steps.pop(0) + if "contains" not in object: + object["contains"] = [] + if object["vnum"] != step.arg3: + print(f"Error, attempting to put object in object with different parent: {step}") + object["contains"].append( + {"vnum": step.arg1, "max": step.arg2, "container": step.arg3, "name": step.sarg} + ) + mob["equipped"].append(object) + commands["mob"].append(mob) + case "E" | "G": + print(f"Error, attempting to equip or give item w/o a mob: {step}") + case "O": + object = {"vnum": step.arg1, "max": step.arg2, "room": step.arg3, "name": step.sarg} + while steps and steps[0].cont and steps[0].cmd == "P": + step = steps.pop(0) + if "create_objects" not in object: + object["create_objects"] = [] + inside = {"vnum": step.arg1, "max": step.arg2, "container": step.arg3, "name": step.sarg} + if object["vnum"] != inside["container"]: + print(f"Error, attempting to put object in object with different parent: {step}") + if steps and steps[0].cmd == "P" and steps[0].cont: + while steps and steps[0].cmd == "P" and steps[0].cont and steps[0].arg3 == inside["vnum"]: + inside["contains"] = [] + step = steps.pop(0) + inside_inside = { + "vnum": step.arg1, + "max": step.arg2, + "container": step.arg3, + "name": step.sarg, + } + if inside["vnum"] != inside_inside["container"]: + print(f"Error, attempting to put object in object with different parent: {step}") + inside["contains"].append(inside_inside) + object["create_objects"].append(inside) + commands["object"].append(object) + case "P": + print(f"Error, attempting to put object in object with no parent: {step}") + case "R": + object = {"room": step.arg1, "vnum": step.arg2, "name": step.sarg} + commands["remove"].append(object) + case "F": + print("Forcing a mobile to do something.") + case "D": + room = step.arg1 + door_direction = step.arg2 + state = self.parse_door_state(step.arg3) + while steps and steps[0].cont and steps[0].cmd == "D": + step = steps.pop(0) + if room != step.arg1: + print(f"Error, attempting to open/close/lock door in a different room: {step}") + if door_direction != step.arg2: + print(f"Error, attempting to open/close/lock a different door: {step}") + state.append(self.parse_door_state(step.arg3)) + door = {"room": room, "direction": DIRECTIONS[door_direction], "state": state} + commands["door"].append(door) + case _: + print(f"Error, unknown command: {step}") + + self.stats["commands"] = commands diff --git a/scripts/pyproject.toml b/scripts/pyproject.toml new file mode 100644 index 00000000..f78da90c --- /dev/null +++ b/scripts/pyproject.toml @@ -0,0 +1,16 @@ +[project] +name = "fierymud-scripts" +version = "0.1.0" +description = "Scripts to update a and convert files." +authors = [ + {name = "Strider Jones",email = "stridera@gmail.com"} +] +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ +] + + +[build-system] +requires = ["poetry-core>=2.0.0,<3.0.0"] +build-backend = "poetry.core.masonry.api" From 9703ba1a8346b9ff7edf2e41a93fb28bfd91ff36 Mon Sep 17 00:00:00 2001 From: Strider Jones Date: Mon, 10 Feb 2025 05:42:42 -0800 Subject: [PATCH 2/3] Update player generation code --- scripts/README.md | 30 ++- scripts/mud/__init__.py | 6 +- scripts/mud/base.py | 10 +- scripts/mud/flags.py | 193 ++++++++++++++++++ scripts/mud/mudfile.py | 30 ++- scripts/mud/obj.py | 6 +- scripts/mud/player.py | 109 ++++++++++ scripts/mud/player_notes.py | 13 ++ .../mud/{plr_objs.py => player_objects.py} | 53 +++-- scripts/mud/player_pets.py | 13 ++ scripts/mud/player_quests.py | 13 ++ scripts/mud/zone.py | 2 +- scripts/mudfile_to_json.py | 6 +- scripts/player_objects.py | 15 +- scripts/player_to_json.py | 65 ++++++ 15 files changed, 513 insertions(+), 51 deletions(-) create mode 100644 scripts/mud/player.py create mode 100644 scripts/mud/player_notes.py rename scripts/mud/{plr_objs.py => player_objects.py} (71%) create mode 100644 scripts/mud/player_pets.py create mode 100644 scripts/mud/player_quests.py create mode 100644 scripts/player_to_json.py diff --git a/scripts/README.md b/scripts/README.md index cdf26404..4e6f61fd 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -1,12 +1,26 @@ # Python Scripts These scripts are used to convert Fierymud mud files to json files. +## Scripts + +### mudfile_to_json +This script processes the world files (lib/world/*) and converts them to a json file in the same folder as the source file. + +Commandline Parameters +file: Required positional. Must be a mud file (.mob, .zon, etc) or an index. +--type - Force the file type. Can be used if you're parsing a file without a proper file extension. Should be automatically guessed. Must be one of: mob, obj, zon, shp, wld. +--output - Specify the file output location. Defaults to same directory as source file. + + + + ## Setup ```bash cd scripts poetry ## Examples +### Update World Files (/lib/) Single File: ```bash poetry run python mudfile_to_json.py ../lib/world/wld/30.wld @@ -14,6 +28,18 @@ poetry run python mudfile_to_json.py ../lib/world/wld/30.wld Run against the whole codebase ```bash -for f in $(find ../lib -name index); do echo $f; poetry run python mudfile_to_json.py $f; done``` +for f in $(find ../lib/world -name index); do echo $f; poetry run python mudfile_to_json.py $f; done``` + +Note: You can change the `../lib` to any directory if you want to only run it against one folder (like mob or zon for example.) -Note: You can change the `../lib` to any directory if you want to only run it against one folder (like mob or zon for example.) \ No newline at end of file + +### Player Files +View Players objects: +```bash +poetry run python player_objects.py --player strider --list +``` + +Create player json files for all players +```bash +poetry run python player_objects.py +``` diff --git a/scripts/mud/__init__.py b/scripts/mud/__init__.py index 4daea3d6..7aadbbf1 100644 --- a/scripts/mud/__init__.py +++ b/scripts/mud/__init__.py @@ -6,4 +6,8 @@ from .shop import Shop from .world import World -from .plr_objs import PlayerObj +from .player import Player +from .player_objects import PlayerObj +from .player_notes import PlayerNotes +from .player_pets import PlayerPets +from .player_quests import PlayerQuests diff --git a/scripts/mud/base.py b/scripts/mud/base.py index 7129a4c8..83504c77 100644 --- a/scripts/mud/base.py +++ b/scripts/mud/base.py @@ -3,7 +3,6 @@ from abc import ABC, abstractmethod from enum import Enum, auto from typing import List -import json from json import JSONEncoder import re @@ -22,8 +21,12 @@ class MudTypes(Enum): TRIGGER = auto() WORLD = auto() ZONE = auto() + PLAYER = auto() PLAYER_OBJECTS = auto() + PLAYER_QUESTS = auto() + PLAYER_PETS = auto() + PLAYER_NOTES = auto() class Dice: @@ -93,7 +96,6 @@ def from_mudfile(cls, mudfile: MudFile): except Exception as e: print(f"\nError parsing {cls.__name__} file: {e}") raise e - return [] def json_repr(self): return {"vnum": self.vnum, "stats": self.stats} @@ -133,7 +135,7 @@ def from_data(cls, data: List[str]): @abstractmethod def parse(self, data): """ - Parses the data into the object + Parses the data into the object. Used for World Mud Objects. :param data: The data to parse :return: None """ @@ -168,7 +170,7 @@ def read_flag_list(data: str, flags: List[str]) -> BitFlags: bitflags = BitFlags(flags) for i, flag in enumerate(data_lst): - bitflags.set_flags(flag, 32 * (i + 1)) + bitflags.set_flags(flag, 32 * i) return bitflags @staticmethod diff --git a/scripts/mud/flags.py b/scripts/mud/flags.py index d0061b63..c6c97eab 100644 --- a/scripts/mud/flags.py +++ b/scripts/mud/flags.py @@ -771,3 +771,196 @@ "TRADE_NOTHIEF", # 6 "TRADE_NOWARRIOR", # 7 ] + +SEXES = [ + "NEUTRAL", # 0 + "MALE", # 1 + "FEMALE", # 2 + "NONBINARY", # 3 +] + +CLASSES = [ + "SORCERER", # 0 + "CLERIC", # 1 + "THIEF", # 2 + "WARRIOR", # 3 + "PALADIN", # 4 + "ANTI_PALADIN", # 5 + "RANGER", # 6 + "DRUID", # 7 + "SHAMAN", # 8 + "ASSASSIN", # 9 + "MERCENARY", # 10 + "NECROMANCER", # 11 + "CONJURER", # 12 + "MONK", # 13 + "BERSERKER", # 14 + "PRIEST", # 15 + "DIABOLIST", # 16 + "MYSTIC", # 17 + "ROGUE", # 18 + "BARD", # 19 + "PYROMANCER", # 20 + "CRYOMANCER", # 21 + "ILLUSIONIST", # 22 + "HUNTER", # 23 + "LAYMAN", # 24 +] + +RACES = [ + "HUMAN", # 0 + "ELF", # 1 + "GNOME", # 2 + "DWARF", # 3 + "TROLL", # 4 + "DROW", # 5 + "DUERGAR", # 6 + "OGRE", # 7 + "ORC", # 8 + "HALF_ELF", # 9 + "BARBARIAN", # 10 + "HALFLING", # 11 + "PLANT", # 12 + "HUMANOID", # 13 + "ANIMAL", # 14 + "DRAGON_GENERAL", # 15 + "GIANT", # 16 + "OTHER", # 17 + "GOBLIN", # 18 + "DEMON", # 19 + "BROWNIE", # 20 + "DRAGON_FIRE", # 21 + "DRAGON_FROST", # 22 + "DRAGON_ACID", # 23 + "DRAGON_LIGHTNING", # 24 + "DRAGON_GAS", # 25 + "DRAGONBORN_FIRE", # 26 + "DRAGONBORN_FROST", # 27 + "DRAGONBORN_ACID", # 28 + "DRAGONBORN_LIGHTNING", # 29 + "DRAGONBORN_GAS", # 30 + "SVERFNEBLIN", # 31 + "FAERIE_SEELIE", # 32 + "FAERIE_UNSEELIE", # 33 + "NYMPH", # 34 + "ARBOREAN", # 35 +] + +LIFEFORCES = [ + "LIFE_LIFE", # 0 /* normal folks */ + "LIFE_UNDEAD", # 1 + "LIFE_MAGIC", # 2 /* golems */ + "LIFE_CELESTIAL", # 3 /* angels */ + "LIFE_DEMONIC", # 4 + "LIFE_ELEMENTAL", # 5 +] + +COMPOSITIONS = [ + "COMP_FLESH", # 0 + "COMP_EARTH", # 1 + "COMP_AIR", # 2 + "COMP_FIRE", # 3 + "COMP_WATER", # 4 + "COMP_ICE", # 5 + "COMP_MIST", # 6 + "COMP_ETHER", # 7 /* Having no physical incorporation */ + "COMP_METAL", # 8 + "COMP_STONE", # 9 /* Like earth, but tougher */ + "COMP_BONE", # 10 /* Like flesh, but... */ + "COMP_LAVA", # 11 + "COMP_PLANT", # 12 + "NUM_COMPOSITIONS", # 13 /* keep updated */ +] + +PLAYER_FLAGS = [ + "PLR_KILLER", # 0 /* a player-killer */ + "PLR_THIEF", # 1 /* a player-thief */ + "PLR_FROZEN", # 2 /* is frozen */ + "PLR_DONTSET", # 3 /* Don't EVER set (ISNPC bit) */ + "PLR_WRITING", # 4 /* writing (board/mail/olc) */ + "PLR_MAILING", # 5 /* is writing mail */ + "PLR_AUTOSAVE", # 6 /* needs to be autosaved */ + "PLR_SITEOK", # 7 /* has been site-cleared */ + "PLR_NOSHOUT", # 8 /* not allowed to shout/goss */ + "PLR_NOTITLE", # 9 /* not allowed to set title (not used) */ + "PLR_DELETED", # 10 /* deleted - space reusable (not used) */ + "PLR_LOADROOM", # 11 /* uses nonstandard loadroom (not used) */ + "PLR_NOWIZLIST", # 12 /* shouldn't be on wizlist (not used) */ + "PLR_NODELETE", # 13 /* shouldn't be deleted (may be used outside the server) */ + "PLR_INVSTART", # 14 /* should enter game wizinvis (not used) */ + "PLR_CRYO", # 15 /* is cryo-saved (purge prog) (not used) */ + "PLR_MEDITATE", # 16 /* meditating - improves spell memorization */ + "PLR_CASTING", # 17 /* currently casting a spell (not used) */ + "PLR_BOUND", # 18 /* tied up (not used) */ + "PLR_SCRIBE", # 19 /* scribing (not used) */ + "PLR_TEACHING", # 20 /* teaching a skill/spell (not used) */ + "PLR_NAPPROVE", # 21 /* name not approved yet */ + "PLR_NEWNAME", # 22 /* needs to choose a new name */ + "PLR_REMOVING", # 23 /* player is being removed and doesn't need emergency save */ + "PLR_SAVING", # 24 /* player is being saved to file and effect changes are not relevant */ + "PLR_GOTSTARS", # 25 /* player has achieved ** already */ + "NUM_PLR_FLAGS", # 26 +] + +PREF_FLAGS = [ + "PRF_BRIEF", # 0 /* Room descs won't normally be shown */ + "PRF_COMPACT", # 1 /* No extra CRLF pair before prompts */ + "PRF_DEAF", # 2 /* Can't hear shouts */ + "PRF_NOTELL", # 3 /* Can't receive tells */ + "PRF_OLCCOMM", # 4 /* Can hear communication in OLC */ + "PRF_LINENUMS", # 5 /* Autodisplay linenums in stringedit */ + "PRF_AUTOLOOT", # 6 /* Auto loot corpses when you kill */ + "PRF_AUTOEXIT", # 7 /* Display exits in a room */ + "PRF_NOHASSLE", # 8 /* Aggr mobs won't attack */ + "PRF_QUEST", # 9 /* On quest */ + "PRF_SUMMONABLE", # 10 /* Can be summoned */ + "PRF_NOREPEAT", # 11 /* No repetition of comm commands */ + "PRF_HOLYLIGHT", # 12 /* Can see in dark */ + "PRF_COLOR_1", # 13 /* Color (low bit) */ + "PRF_COLOR_2", # 14 /* Color (high bit) */ + "PRF_NOWIZ", # 15 /* Can't hear wizline */ + "PRF_LOG1", # 16 /* On-line System Log (low bit) */ + "PRF_LOG2", # 17 /* On-line System Log (high bit) */ + "PRF_AFK", # 18 /* away from keyboard */ + "PRF_NOGOSS", # 19 /* Can't hear gossip channel */ + "PRF_NOHINTS", # 20 /* No hints when mistyping commands */ + "PRF_ROOMFLAGS", # 21 /* Can see room flags (ROOM_x) */ + "PRF_NOPETI", # 22 /* Can't hear petitions */ + "PRF_AUTOSPLIT", # 23 /* Auto split coins from corpses */ + "PRF_NOCLANCOMM", # 24 /* Can't hear clan communication */ + "PRF_ANON", # 25 /* Anon flag */ + "PRF_SHOWVNUMS", # 26 /* Show Virtual Numbers */ + "PRF_NICEAREA", # 27 + "PRF_VICIOUS", # 28 + "PRF_PASSIVE", # 29 /* char will not engage upon being cast on */ + "PRF_ROOMVIS", # 30 + "PRF_NOFOLLOW", # 31 /* Cannot follow / well to this player*/ + "PRF_AUTOTREAS", # 32 /* Automatically loots treasure from corpses */ + "PRF_EXPAND_OBJS", # 33 + "PRF_EXPAND_MOBS", # 34 + "PRF_SACRIFICIAL", # 35 /* Sacrificial spells autotarget self */ + "PRF_PETASSIST", # 36 /* Should your pet assist you as you fight */ + "NUM_PRF_FLAGS", # 37 +] + +PRIV_FLAGS = [ + "PRV_CLAN_ADMIN", # 0 /* clan administrator */ + "PRV_TITLE", # 1 /* can change own title */ + "PRV_ANON_TOGGLE", # 2 /* can toggle anon */ + "PRV_AUTO_GAIN", # 3 /* don't need to level gain */ +] + +QUIT_REASONS = [ + "QUIT_UNDEF", + "QUIT_RENT", + "QUIT_CRYO", + "QUIT_TIMEOUT", + "QUIT_HOTBOOT", + "QUIT_QUITMORT", + "QUIT_QUITIMM", + "QUIT_CAMP", + "QUIT_WRENT", + "QUIT_PURGE", + "QUIT_AUTOSAVE", + "NUM_QUITTYPES", +] diff --git a/scripts/mud/mudfile.py b/scripts/mud/mudfile.py index b7fbe2c7..7c118032 100644 --- a/scripts/mud/mudfile.py +++ b/scripts/mud/mudfile.py @@ -2,10 +2,8 @@ class MudFile: - @classmethod def from_filename(cls, filename: str): - current = None index = filename.endswith("index") path = filename[:-5] if index else filename @@ -27,25 +25,23 @@ def from_filename(cls, filename: str): def _player_files(cls, path: str, player: str): player_name = player[0].upper() + player[1:].lower() root = f"{path}/{player[0].upper()}/{player_name}" - results = {'name': player_name} - if os.path.exists(root): - results['plr_bin'] = root - if os.path.exists(root + '.plr'): - results['plr'] = root + '.plr' - if os.path.exists(root + '.objs'): - results['objs'] = root + '.objs' - if os.path.exists(root + '.pets'): - results['pets'] = root + '.pets' - if os.path.exists(root + '.quests'): - results['quests'] = root + '.quests' - if os.path.exists(root + '.notes'): - results['notes'] = root + '.notes' - return results + files = [] + if os.path.exists(root + ".plr"): + files.append({"class": "Player", "filename": root + ".plr"}) + if os.path.exists(root + ".objs"): + files.append({"class": "Objects", "filename": root + ".objs"}) + if os.path.exists(root + ".pets"): + files.append({"class": "Pets", "filename": root + ".pets"}) + if os.path.exists(root + ".quests"): + files.append({"class": "Quests", "filename": root + ".quests"}) + if os.path.exists(root + ".notes"): + files.append({"class": "Notes", "filename": root + ".notes"}) + return {"name": player_name, "root": root, "files": files} @classmethod def player_files(cls, path: str, player: str): if player is None: - for root, dirs, files in os.walk(path): + for _root, _dirs, files in os.walk(path): for file in files: if file.endswith(".plr"): yield cls._player_files(path, file[:-4]) diff --git a/scripts/mud/obj.py b/scripts/mud/obj.py index fd4ac4f5..33261b99 100644 --- a/scripts/mud/obj.py +++ b/scripts/mud/obj.py @@ -18,13 +18,13 @@ def parse(self, data): type_flag, extra_flags, wear_flags, level = data.pop(0).split() f1, f2, f3, f4, f5, f6, f7 = data.pop(0).split() - weight, cost, timer, aff1, _, _, aff2, aff3 = data.pop(0).split() + weight, cost, timer, eff1, _, _, eff2, eff3 = data.pop(0).split() item_types = self.get_flag(type_flag, OBJECT_TYPES) extra_flags_text = self.build_flags(extra_flags, EXTRA_OBJ_FLAGS) wear_flags_text = self.build_flags(wear_flags, WEAR_FLAGS) extra_stats = self.obj_val(item_types, f1, f2, f3, f4, f5, f6, f7) - affects = (int(aff3) << 26) | (int(aff2) << int(13)) | int(aff1) - obj_effects = self.build_flags(affects, EFFECTS) + effects = (int(eff3) << 26) | (int(eff2) << int(13)) | int(eff1) + obj_effects = self.build_flags(effects, EFFECTS) self.stats["type"] = item_types self.stats["wear_flags"] = wear_flags_text diff --git a/scripts/mud/player.py b/scripts/mud/player.py new file mode 100644 index 00000000..092cff7d --- /dev/null +++ b/scripts/mud/player.py @@ -0,0 +1,109 @@ +from .base import Base, MudTypes +from .flags import * +from .mudfile import MudFile + + +class Player(Base): + """Construct an Item""" + + KILL_TYPE_FLAGS = ["None", "Mob", "Player"] + + def __init__(self, vnum): + super().__init__(vnum) + self.type = MudTypes.PLAYER + + @classmethod + def from_mudfile(cls, mudfile: MudFile): + """ + Convert the Player file to a json object + :param mudfile: The file to read from + :return: The object + """ + data = [] + try: + for line in mudfile: + data.append(line) + return cls.parse(data) + except Exception as e: + print(f"\nError parsing {cls.__name__} file: {e}") + raise e + + @classmethod + def parse(cls, data): + """ + Parse the data from the file + :param data: The data to read from + """ + player = {} + while data: + line = data.pop(0) + if line.startswith("description"): + player["description"] = cls.read_string(data) + elif line.startswith("sex"): + value = line.split(":")[1].strip() + player["sex"] = SEXES[int(value)] + elif line.startswith("class"): + value = line.split(":")[1].strip() + player["class"] = CLASSES[int(value)] + elif line.startswith("race"): + value = line.split(":")[1].strip() + player["races"] = RACES[int(value)] + elif line.startswith("lifeforce"): + value = line.split(":")[1].strip() + player["lifeforce"] = LIFEFORCES[int(value)] + elif line.startswith("composition"): + value = line.split(":")[1].strip() + player["composition"] = COMPOSITIONS[int(value)] + elif line.startswith("playerflags"): + value = line.split(":")[1].strip() + player["playerflags"] = cls.read_flags(value, PLAYER_FLAGS) + elif line.startswith("effectflags"): + flags = line.split(":")[1].strip() + player["effectflags"] = cls.read_flag_list(flags, EFFECTS) + elif line.startswith("prefflags"): + flags = line.split(":")[1].strip() + player["prefflags"] = cls.read_flag_list(flags, PREF_FLAGS) + elif line.startswith("privflags"): + flags = line.split(":")[1].strip() + player["privflags"] = cls.read_flags(flags, PRIV_FLAGS) + elif line.startswith("quit_reason"): + value = line.split(":")[1].strip() + player["quit_reason"] = QUIT_REASONS[int(value)] + elif line.startswith("trophy"): + player["trophy"] = [] + while line := data.pop(0): + if line == "0 0 0": + break + kill_type, id, count = line.split() + player["trophy"].append( + {"type": cls.KILL_TYPE_FLAGS[int(kill_type)], "id": int(id), "count": float(count)} + ) + elif line.startswith("tells"): + player["tells"] = [] + while line := data.pop(0): + if line == "$": + break + player["tells"].append(line) + elif line.startswith("gossips"): + player["gossips"] = [] + while line := data.pop(0): + if line == "$": + break + player["gossips"].append(line) + elif line.startswith("aliases"): + player["aliases"] = {} + while line := data.pop(0): + if line == "0": + break + alias, command = line.split(" ", 1) + player["aliases"][alias] = command.strip() + elif line.startswith("cash"): + plat, gold, silver, copper = line[5:].split() + player["money"] = {"plat": int(plat), "gold": int(gold), "silver": int(silver), "copper": int(copper)} + else: + if ":" in line: + key, value = line.split(":", 1) + player[key] = value.strip() + else: + raise ValueError(f"Invalid data: {line}") + return player diff --git a/scripts/mud/player_notes.py b/scripts/mud/player_notes.py new file mode 100644 index 00000000..2853dcef --- /dev/null +++ b/scripts/mud/player_notes.py @@ -0,0 +1,13 @@ +from .base import Base, MudTypes +from .flags import * + + +class PlayerNotes(Base): + """Construct an Item""" + + def __init__(self, vnum): + super().__init__(vnum) + self.type = MudTypes.PLAYER_NOTES + + def parse(self, data): + pass diff --git a/scripts/mud/plr_objs.py b/scripts/mud/player_objects.py similarity index 71% rename from scripts/mud/plr_objs.py rename to scripts/mud/player_objects.py index 256fcce5..2c983622 100644 --- a/scripts/mud/plr_objs.py +++ b/scripts/mud/player_objects.py @@ -1,4 +1,4 @@ -from .base import Base, Dice, MudTypes +from .base import Base, MudTypes from .flags import * from .mudfile import MudFile @@ -28,14 +28,14 @@ def from_mudfile(cls, mudfile: MudFile): if not got_version: got_version = True if line != "1": - raise Exception(f"Unsupported version: {version}") + raise Exception(f"Unsupported version: {line}") continue if line.startswith("~~"): if data: obj = cls.from_data(data) if obj and obj.location and obj.location < 0: - depth = - obj.location + depth = -obj.location parent = objects[-1] for i in range(1, depth): parent = parent.contents[-1] @@ -48,7 +48,6 @@ def from_mudfile(cls, mudfile: MudFile): except Exception as e: print(f"\nError parsing {cls.__name__} file: {e}") raise e - return [] @classmethod def from_data(cls, data: list[str]): @@ -57,12 +56,12 @@ def from_data(cls, data: list[str]): :param data: The data to read from :return: The object """ - vnum = int(data.pop(0).split(':')[1].strip()) + vnum = int(data.pop(0).split(":")[1].strip()) obj = cls(vnum) try: obj.parse(data) except Exception as e: - print(f"\nError parsing {obj.type} vnum: {vnum}: {e}") + print(f"\nError parsing {obj.type} vnum: {vnum}: {e}.") raise e return obj @@ -72,9 +71,9 @@ def parse(self, data): line = data.pop(0) if line.startswith("location:"): - self.location = int(line.split(':')[1].strip()) + self.location = int(line.split(":")[1].strip()) if self.location == 127: - self.stats['location'] = "INVENTORY" + self.stats["location"] = "INVENTORY" elif self.location > 0: self.stats["location"] = self.get_flag(self.location, WEAR_LOCATIONS) else: @@ -87,28 +86,28 @@ def parse(self, data): self.stats["values"] = values data.pop(0) elif line.startswith("name:"): - self.stats["namelist"] = line.split(':')[1].strip() + self.stats["namelist"] = line.split(":")[1].strip() elif line.startswith("shortdesc:"): - self.stats["short_desc"] = line.split(':')[1].strip() + self.stats["short_desc"] = line.split(":")[1].strip() elif line.startswith("desc:"): - self.stats["long_descr"] = line.split(':')[1].strip() + self.stats["long_descr"] = line.split(":")[1].strip() elif line.startswith("extradesc:"): if "extra_desc" not in self.stats: self.stats["extra_desc"] = [] - extradesc = {"namelist": line.split(':')[1].strip(), "description": self.read_string(data)} + extradesc = {"namelist": line.split(":")[1].strip(), "description": self.read_string(data)} self.stats["extra_desc"].append(extradesc) elif line.startswith("flags:"): - self.stats["flags"] = self.read_flag_list(line.split(':')[1].strip(), EXTRA_OBJ_FLAGS) + self.stats["flags"] = self.read_flag_list(line.split(":")[1].strip(), EXTRA_OBJ_FLAGS) elif line.startswith("wear:"): - self.stats["wear"] = self.read_flags(line.split(':')[1].strip(), WEAR_FLAGS) + self.stats["wear"] = self.read_flags(line.split(":")[1].strip(), WEAR_FLAGS) elif line.startswith("effects:"): - effects = line.split(':')[1].strip() + effects = line.split(":")[1].strip() self.stats["effect"] = self.read_flag_list(effects, EFFECTS) elif line.startswith("applies:"): applies = {} line = data.pop(0).strip() while line != "~": - apply, value = line.split(' ') + apply, value = line.split(" ") affect = self.get_flag(apply, AFFECTS) applies[affect] = value line = data.pop(0).strip() @@ -122,6 +121,24 @@ def parse(self, data): self.stats["triggers"] = triggers elif line.startswith("adesc:"): self.stats["adesc"] = self.read_string(data) + elif line.startswith("variables"): + self.stats["variables"] = {} + line = data.pop(0).strip() + while line != "~": + k, v = line.split() + self.stats["variables"][k] = v.strip() + line = data.pop(0).strip() + elif line.startswith("spells:"): + self.stats["spells"] = [] + line = data.pop(0).strip() + while line != "~": + spell_num, length = line.split() + spell = SPELLS[int(spell_num)] + self.stats["spells"].append({"spell": spell, "length": length}) + line = data.pop(0).strip() else: - k, v = line.split(':') - self.stats[k] = v.strip() + if ":" in line: + k, v = line.split(":") + self.stats[k] = v.strip() + else: + raise Exception(f"Unknown line: {line}") diff --git a/scripts/mud/player_pets.py b/scripts/mud/player_pets.py new file mode 100644 index 00000000..971331bd --- /dev/null +++ b/scripts/mud/player_pets.py @@ -0,0 +1,13 @@ +from .base import Base, MudTypes +from .flags import * + + +class PlayerPets(Base): + """Construct an Item""" + + def __init__(self, vnum): + super().__init__(vnum) + self.type = MudTypes.PLAYER_PETS + + def parse(self, data): + pass diff --git a/scripts/mud/player_quests.py b/scripts/mud/player_quests.py new file mode 100644 index 00000000..e642724d --- /dev/null +++ b/scripts/mud/player_quests.py @@ -0,0 +1,13 @@ +from .base import Base, MudTypes +from .flags import * + + +class PlayerQuests(Base): + """Construct an Item""" + + def __init__(self, vnum): + super().__init__(vnum) + self.type = MudTypes.PLAYER_QUESTS + + def parse(self, data): + pass diff --git a/scripts/mud/zone.py b/scripts/mud/zone.py index fc369e18..298cbead 100644 --- a/scripts/mud/zone.py +++ b/scripts/mud/zone.py @@ -1,5 +1,5 @@ from typing import DefaultDict -from .base import Base, Dice, MudTypes +from .base import Base, MudTypes from .flags import * from dataclasses import dataclass diff --git a/scripts/mudfile_to_json.py b/scripts/mudfile_to_json.py index 8c98bdaf..ccc1f99c 100644 --- a/scripts/mudfile_to_json.py +++ b/scripts/mudfile_to_json.py @@ -9,8 +9,8 @@ def main(filename: str, type: str, output: str = None): cls = None if type is None: # Try to guess the type from the filename - if filename.split('/')[-2] in ['mob', 'obj', 'zon', 'shp', 'wld']: - type = filename.split('/')[-2] + if filename.split("/")[-2] in ["mob", "obj", "zon", "shp", "wld"]: + type = filename.split("/")[-2] print(f"Guessing type: {type}") if type == "mob": @@ -63,7 +63,7 @@ def main(filename: str, type: str, output: str = None): ) parser.add_argument( "--type", - help="The type of file to convert. Example: mob, obj, zone, shp, wld, zon", + help="The type of file to convert. Example: mob, obj, zon, shp, wld, zon", type=str, ) parser.add_argument( diff --git a/scripts/player_objects.py b/scripts/player_objects.py index 86480b05..a7d63da7 100644 --- a/scripts/player_objects.py +++ b/scripts/player_objects.py @@ -1,6 +1,8 @@ import argparse import os +import json +from mud import Encoder from mud import MudFile from mud import PlayerObj @@ -19,20 +21,29 @@ def main(args): return for plrfiles in MudFile.player_files(args.path, args.player): - print(f"Processing {plrfiles['name']}...", end=" ") + print(f"Processing {plrfiles['name']}.", end=" ") if "objs" not in plrfiles: print("No objects file found.") continue mudfile = MudFile(plrfiles["objs"]) + print(f" Processing {mudfile.filename}", end=" ") items = PlayerObj.from_mudfile(mudfile) if args.list: list_items(items) + if args.output is None: + output_file = os.path.splitext(mudfile.filename)[0] + ".json" + else: + output_file = args.output + with open(output_file, "w", encoding="ascii") as f: + f.write(json.dumps(items, cls=Encoder, indent=4)) + print(f"--- Writing {output_file}") + if __name__ == "__main__": # Parse command line arguments and get the filename to process parser = argparse.ArgumentParser( - description="Convert a mudfile file to JSON.", + description="Process player object files.", epilog="If the file is an index file, all files in the index will be converted.", ) parser.add_argument( diff --git a/scripts/player_to_json.py b/scripts/player_to_json.py new file mode 100644 index 00000000..1f1813bc --- /dev/null +++ b/scripts/player_to_json.py @@ -0,0 +1,65 @@ +import argparse +import os +import json +from mud import Encoder, MudFile +from mud import Player, PlayerObj, PlayerPets, PlayerQuests, PlayerNotes + + +def main(path: str, player: str, output: str = None): + for player_file in MudFile.player_files(path, player): + print(f"Processing {player_file['name']}.") + player = {} + for file in player_file["files"]: + print(f"-- Processing {file['class']} - {file['filename']}") + cls = None + match file["class"]: + case "Player": + cls = Player + case "Objects": + cls = PlayerObj + case "Pets": + cls = PlayerPets + case "Quests": + cls = PlayerQuests + case "Notes": + cls = PlayerNotes + case _: + print(f"Unknown class: {file['class']}") + continue + mudfile = MudFile(file["filename"]) + player[file["class"]] = cls.from_mudfile(mudfile) + + if args.output is None: + output_file = os.path.splitext(mudfile.filename)[0] + ".json" + else: + output_file = args.output + with open(output_file, "w", encoding="ascii") as f: + f.write(json.dumps(player, cls=Encoder, indent=4)) + print(f"---- Writing {output_file}") + + print("Done") + + +if __name__ == "__main__": + # Parse command line arguments and get the filename to process + parser = argparse.ArgumentParser( + description="Convert player files to JSON.", + ) + parser.add_argument( + "--path", + help="The path to the player files. If not specified, the default is ../lib/players", + type=str, + default="../lib/players", + ) + parser.add_argument( + "--player", + help="The player. If not specified, all players will be selected.", + type=str, + ) + parser.add_argument( + "--output", + help="The output file to write to. If not specified, the output file will be the same as the input file with the extension changed to .json", + type=str, + ) + args = parser.parse_args() + main(args.path, args.player, args.output) From 358fa8d087ada31624602cffd8c1df1f187a6b49 Mon Sep 17 00:00:00 2001 From: Strider Jones Date: Mon, 10 Feb 2025 05:45:27 -0800 Subject: [PATCH 3/3] Primary update switching flags to use std::bitset --- .gitignore | 1 + CMakeLists.txt | 4 +- include/casting.hpp | 3 +- include/clan.hpp | 5 +- include/class.hpp | 6 +- include/db.hpp | 2 +- include/defines.hpp | 62 +- include/events.hpp | 33 - include/exits.hpp | 24 +- include/handler.hpp | 2 +- include/objects.hpp | 16 +- include/players.hpp | 34 +- include/races.hpp | 2 +- include/rooms.hpp | 8 +- include/string_utils.hpp | 40 +- include/structs.hpp | 54 +- include/text.hpp | 3 +- include/utils.hpp | 47 +- include/zone.hpp | 14 +- src/act.informative.cpp | 18 +- src/act.item.cpp | 6 +- src/act.movement.cpp | 22 +- src/act.offensive.cpp | 34 +- src/act.other.cpp | 58 +- src/act.wizard.cpp | 61 +- src/act.wizinfo.cpp | 34 +- src/ai_utils.cpp | 4 +- src/casting.cpp | 9 +- src/clan.cpp | 22 +- src/clansys.cpp | 4 +- src/class.cpp | 30 +- src/comm.cpp | 17 +- src/commands.cpp | 8 +- src/cooldowns.cpp | 7 +- src/corpse_save.cpp | 2 +- src/db.cpp | 22 +- src/dg_mobcmd.cpp | 12 +- src/dg_scripts.cpp | 26 +- src/dg_wldcmd.cpp | 2 +- src/events.cpp | 4 +- src/exits.cpp | 5 +- src/fight.cpp | 32 +- src/graph.cpp | 12 +- src/handler.cpp | 30 +- src/house.cpp | 20 +- src/interpreter.cpp | 47 +- src/limits.cpp | 7 +- src/magic.cpp | 392 +++--- src/mail.cpp | 4 +- src/medit.cpp | 24 +- src/mobact.cpp | 15 +- src/modify.cpp | 12 +- src/movement.cpp | 32 +- src/oedit.cpp | 26 +- src/olc.cpp | 4 +- src/pfiles.cpp | 24 +- src/players.cpp | 83 +- src/prefs.cpp | 7 +- src/privileges.cpp | 33 +- src/races.cpp | 2589 +++++++++++++++++++------------------- src/redit.cpp | 20 +- src/regen.cpp | 39 +- src/rooms.cpp | 2 +- src/rules.old | 409 ------ src/rulesys.old | 106 -- src/shop.cpp | 17 +- src/spec_procs.cpp | 8 +- src/spell_mem.cpp | 8 +- src/spell_parser.cpp | 19 +- src/spells.cpp | 68 +- src/string_utils.cpp | 41 - src/text.cpp | 16 +- src/textfiles.cpp | 12 +- src/utils.cpp | 62 +- src/vsearch.cpp | 75 +- 75 files changed, 2235 insertions(+), 2827 deletions(-) delete mode 100644 src/rules.old delete mode 100644 src/rulesys.old diff --git a/.gitignore b/.gitignore index ff9cbdb2..bb2d7d8e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ cmake-build-debug/* build/ .build __pycache__ +.venv diff --git a/CMakeLists.txt b/CMakeLists.txt index e0dcaa1a..53467f75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,8 @@ add_compile_options(-Werror -Wno-format-overflow -Wno-format-truncation -Wno-wri # Load Third Party libraries. include(cmake/CPM.cmake) -CPMAddPackage("gh:fmtlib/fmt#9.1.0") -CPMAddPackage("gh:nlohmann/json@3.11.2") +CPMAddPackage("gh:fmtlib/fmt#11.1.3") +CPMAddPackage("gh:nlohmann/json@3.11.3") # CPMAddPackage("gh:catchorg/Catch2@3.2.1") # CPMAddPackage("gh:OlivierLDff/asio.cmake#asio-1-24-0") diff --git a/include/casting.hpp b/include/casting.hpp index 49a0745e..00affedd 100644 --- a/include/casting.hpp +++ b/include/casting.hpp @@ -48,6 +48,7 @@ #define MAG_BULK_OBJS (1 << 12) #define MAG_REPEAT (1 << 13) #define NUM_ROUTINE_TYPES 13 +typedef std::bitset RoutineFlags; #define TYPE_UNDEFINED -1 @@ -145,7 +146,7 @@ void char_forget_casters(CharData *ch); #define CASTING(ch) (EVENT_FLAGGED(ch, EVENT_CASTING)) #define STOP_CASTING(ch) \ - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_CASTING); \ + GET_EVENT_FLAGS(ch).reset(EVENT_CASTING); \ if ((ch)->casting.obj) \ obj_forget_caster((ch)->casting.obj, ch); \ if ((ch)->casting.tch) \ diff --git a/include/clan.hpp b/include/clan.hpp index d2376bee..17fe913d 100644 --- a/include/clan.hpp +++ b/include/clan.hpp @@ -37,6 +37,7 @@ #define CPRIV_ALTS 13 #define CPRIV_CHAT 14 #define NUM_CLAN_PRIVS 15 /* Number of clan privileges */ +typedef std::bitset ClanPrivilegeSet; #define MIN_CLAN_RANKS 2 #define MAX_CLAN_RANKS 100 @@ -77,7 +78,7 @@ struct ClanMembership; struct ClanRank { char *title; - flagvector privileges[FLAGVECTOR_SIZE(NUM_CLAN_PRIVS)]; + ClanPrivilegeSet privileges; }; struct Clan { @@ -163,7 +164,7 @@ const struct { #define GET_CLAN_RANK(ch) (GET_CLAN_MEMBERSHIP(ch) ? GET_CLAN_MEMBERSHIP(ch)->rank : RANK_NONE) #define GET_CLAN_TITLE(ch) (IS_CLAN_MEMBER(ch) ? GET_CLAN(ch)->ranks[GET_CLAN_RANK(ch) - 1].title : NULL) #define MEMBER_CAN(member, priv) \ - (IS_MEMBER_RANK(member->rank) && IS_FLAGGED(member->clan->ranks[member->rank - 1].privileges, (priv))) + (IS_MEMBER_RANK(member->rank) && member->clan->ranks[member->rank - 1].privileges.test((priv))) #define HAS_CLAN_PRIV(ch, priv) (GET_CLAN_MEMBERSHIP(ch) ? MEMBER_CAN(GET_CLAN_MEMBERSHIP(ch), (priv)) : false) #define CAN_DO_PRIV(ch, priv) (IS_CLAN_ADMIN(ch) || IS_CLAN_SUPERADMIN(ch) || HAS_CLAN_PRIV((ch), (priv))) #define GET_CLAN_SNOOP(ch) ((ch)->player_specials->clan_snoop) diff --git a/include/class.hpp b/include/class.hpp index cea13cb4..10975805 100644 --- a/include/class.hpp +++ b/include/class.hpp @@ -18,6 +18,8 @@ #include "structs.hpp" #include "sysdep.hpp" +#include + #define CLASS_UNDEFINED -1 #define CLASS_SORCERER 0 #define CLASS_CLERIC 1 @@ -98,8 +100,9 @@ struct ClassDef { */ /* List of permanent effect flags */ - flagvector effect_flags[FLAGVECTOR_SIZE(NUM_EFF_FLAGS)]; + EffectFlags effect_flags; }; +; extern ClassDef classes[NUM_CLASSES]; #define VALID_CLASSNUM(num) (num < NUM_CLASSES) @@ -145,7 +148,6 @@ extern ClassDef classes[NUM_CLASSES]; ? classes[(int)GET_CLASS(ch)].nowear_flag && OBJ_FLAGGED(obj, classes[(int)GET_CLASS(ch)].nowear_flag) \ : 0) - enum level_action { LEVEL_GAIN, LEVEL_LOSE }; void init_classes(void); diff --git a/include/db.hpp b/include/db.hpp index ff171163..445d33a6 100644 --- a/include/db.hpp +++ b/include/db.hpp @@ -114,7 +114,7 @@ struct PlayerIndexElement { char *name; long id; int level; - int flags; + std::bitset<64> flags; time_t last; }; diff --git a/include/defines.hpp b/include/defines.hpp index a5569fb5..a18a7614 100644 --- a/include/defines.hpp +++ b/include/defines.hpp @@ -1,5 +1,8 @@ #pragma once +#include +#include + // Do not include files here, this is a header file for the defines only. #define NOWHERE -1 /* nil reference for room-database */ @@ -73,6 +76,7 @@ #define PRV_ANON_TOGGLE 2 /* can toggle anon */ #define PRV_AUTO_GAIN 3 /* don't need to level gain */ #define NUM_PRV_FLAGS 4 +typedef std::bitset PrivilegeFlags; /* Mobile flags: used by CharData.char_specials.act */ #define MOB_SPEC 0 /* Mob has a callable spec-proc */ @@ -118,6 +122,13 @@ #define MOB_MEDITATE 40 #define NUM_MOB_FLAGS 41 /* Update this when you add a flag! */ +#if NUM_MOB_FLAGS > NUM_PLR_FLAGS +#define MAX_MOB_PLR_FLAGS NUM_MOB_FLAGS +#else +#define MAX_MOB_PLR_FLAGS NUM_PLR_FLAGS +#endif +typedef std::bitset PlayerOrMobFlags; + /* Some mount stuff */ #define MAX_MOUNT_LEVEL 27 /* The maximum level of mountable mobs */ @@ -496,6 +507,7 @@ #define EFF_SHOCK_WEAPON 88 #define EFF_RADIANT_WEAPON 89 #define NUM_EFF_FLAGS 90 /* Keep me updated */ +typedef std::bitset EffectFlags; /* Preference flags: used by CharData.player_specials.pref */ #define PRF_BRIEF 0 /* Room descs won't normally be shown */ @@ -536,6 +548,7 @@ #define PRF_SACRIFICIAL 35 /* Sacrificial spells autotarget self */ #define PRF_PETASSIST 36 /* Should your pet assist you as you fight */ #define NUM_PRF_FLAGS 37 +typedef std::bitset PreferenceFlags; #define CIRCLE_1 1 #define CIRCLE_2 9 @@ -1156,8 +1169,9 @@ #define ITEM_ANTI_COLOSSAL 49 #define ITEM_ANTI_TITANIC 50 #define ITEM_ANTI_MOUNTAINOUS 51 -#define ITEM_ANTI_ARBOREAN 52 /* Not usable by Arboreans */ +#define ITEM_ANTI_ARBOREAN 52 /* Not usable by Arboreans */ #define NUM_ITEM_FLAGS 53 +typedef std::bitset ExtraObjectFlags; /* Modifier constants used with obj effects ('A' fields) */ #define APPLY_NONE 0 /* No effect */ @@ -1333,3 +1347,49 @@ #define MAX_OBJ_APPLIES 6 #define MEDITATE_BONUS 10 + +#define EVENT_AUTODOUSE 1 +#define EVENT_CAMP 2 +#define EVENT_HURT 3 +#define EVENT_MOB_QUIT 4 +#define EVENT_NAME_TIMEOUT 5 +#define EVENT_RECALL 6 +#define EVENT_ROOM_UNDO 7 +#define EVENT_SPELL 8 +#define EVENT_TRACK 9 +#define EVENT_TRIGGER_WAIT 10 +#define EVENT_SINK_AND_LOSE 11 +#define EVENT_BATTLE_PARALYSIS 12 +#define EVENT_CASTING 13 +#define EVENT_REGEN_HP 14 +#define EVENT_REGEN_SPELLSLOT 15 +#define EVENT_REGEN_MOVE 16 +// #define EVENT_REGEN_MANA 17 +#define EVENT_SCRIBE 18 +#define EVENT_QUICK_AGGRO 19 +#define EVENT_DIE 20 +#define EVENT_RAGE 21 +#define EVENT_EXTRACT 22 /* To extract a char, for whatever reason */ +#define EVENT_GRAVITY 23 +#define EVENT_COOLDOWN 24 +#define EVENT_FULLPURGE 25 +#define EVENT_OVERWEIGHT 26 +#define EVENT_FALLTOGROUND 27 +#define EVENT_COMMAND 28 +#define EVENT_EDITOR_START 29 +#define EVENT_GET_MONEY 30 +/* Update MAX_EVENT to be last event value + 1, please */ +#define MAX_EVENT 31 +typedef std::bitset EventFlags; + +typedef std::unordered_map CommandCache; + +/* The EX_xxxx constants are used in exit_info. */ +#define EX_ISDOOR 0 /* Exit is a door */ +#define EX_CLOSED 1 /* The door is closed */ +#define EX_LOCKED 2 /* The door is locked */ +#define EX_PICKPROOF 3 /* Lock can't be picked */ +#define EX_HIDDEN 4 /* exit is hidden */ +#define EX_DESCRIPT 5 /* Just an extra description */ +#define MAX_EXIT_INFO_FLAGS 6 +typedef std::bitset ExitInfoFlags; \ No newline at end of file diff --git a/include/events.hpp b/include/events.hpp index c5148bd4..f6d9b9ea 100644 --- a/include/events.hpp +++ b/include/events.hpp @@ -55,39 +55,6 @@ void cancel_event_list(Event **list); GenericEventData *mkgenericevent(CharData *ch, CharData *vict, ObjData *obj); void delayed_command(CharData *ch, char *command, int delay, bool repeatable); -#define EVENT_AUTODOUSE 1 -#define EVENT_CAMP 2 -#define EVENT_HURT 3 -#define EVENT_MOB_QUIT 4 -#define EVENT_NAME_TIMEOUT 5 -#define EVENT_RECALL 6 -#define EVENT_ROOM_UNDO 7 -#define EVENT_SPELL 8 -#define EVENT_TRACK 9 -#define EVENT_TRIGGER_WAIT 10 -#define EVENT_SINK_AND_LOSE 11 -#define EVENT_BATTLE_PARALYSIS 12 -#define EVENT_CASTING 13 -#define EVENT_REGEN_HP 14 -#define EVENT_REGEN_SPELLSLOT 15 -#define EVENT_REGEN_MOVE 16 -// #define EVENT_REGEN_MANA 17 -#define EVENT_SCRIBE 18 -#define EVENT_QUICK_AGGRO 19 -#define EVENT_DIE 20 -#define EVENT_RAGE 21 -#define EVENT_EXTRACT 22 /* To extract a char, for whatever reason */ -#define EVENT_GRAVITY 23 -#define EVENT_COOLDOWN 24 -#define EVENT_FULLPURGE 25 -#define EVENT_OVERWEIGHT 26 -#define EVENT_FALLTOGROUND 27 -#define EVENT_COMMAND 28 -#define EVENT_EDITOR_START 29 -#define EVENT_GET_MONEY 30 -/* Update MAX_EVENT to be last event value + 1, please */ -#define MAX_EVENT 31 - EVENTFUNC(extract_event); EVENTFUNC(hurt_event); EVENTFUNC(fullpurge_event); diff --git a/include/exits.hpp b/include/exits.hpp index b31d3407..1bc5e8b9 100644 --- a/include/exits.hpp +++ b/include/exits.hpp @@ -15,32 +15,24 @@ #include "structs.hpp" #include "sysdep.hpp" -/* The EX_xxxx constants are used in exit_info. */ -#define EX_ISDOOR (1 << 0) /* Exit is a door */ -#define EX_CLOSED (1 << 1) /* The door is closed */ -#define EX_LOCKED (1 << 2) /* The door is locked */ -#define EX_PICKPROOF (1 << 3) /* Lock can't be picked */ -#define EX_HIDDEN (1 << 4) /* exit is hidden */ -#define EX_DESCRIPT (1 << 5) /* Just an extra description */ - struct Exit { char *general_description; /* When look DIR. */ char *keyword; /* for open/close */ - int exit_info; /* Exit info */ + ExitInfoFlags exit_info; /* Exit info */ obj_num key; /* Key's vnum (-1 for no key) */ room_num to_room; /* Where it leads (real number) */ }; extern const char *cmd_door[]; -#define EXIT_IS_DOOR(e) ((e)->exit_info & EX_ISDOOR) -#define EXIT_IS_CLOSED(e) ((e)->exit_info & EX_CLOSED) -#define EXIT_IS_OPEN(e) (!EXIT_IS_DOOR(e) || !((e)->exit_info & EX_CLOSED)) -#define EXIT_IS_LOCKED(e) ((e)->exit_info & EX_LOCKED) +#define EXIT_IS_DOOR(e) ((e)->exit_info.test(EX_ISDOOR)) +#define EXIT_IS_CLOSED(e) ((e)->exit_info.test(EX_CLOSED)) +#define EXIT_IS_OPEN(e) (!EXIT_IS_DOOR(e) || !((e)->exit_info.test(EX_CLOSED))) +#define EXIT_IS_LOCKED(e) ((e)->exit_info.test(EX_LOCKED)) #define EXIT_DOES_LOCK(e) ((e)->key != -1) -#define EXIT_IS_PICKPROOF(e) ((e)->exit_info & EX_PICKPROOF) -#define EXIT_IS_HIDDEN(e) ((e)->exit_info & EX_HIDDEN) -#define EXIT_IS_DESCRIPTION(e) ((e)->exit_info & EX_DESCRIPT) +#define EXIT_IS_PICKPROOF(e) ((e)->exit_info.test(EX_PICKPROOF)) +#define EXIT_IS_HIDDEN(e) ((e)->exit_info.test(EX_HIDDEN)) +#define EXIT_IS_DESCRIPTION(e) ((e)->exit_info.test(EX_DESCRIPT)) #define EXIT_NDEST(e) ((e)->to_room) #define EXIT_DEST(e) (EXIT_NDEST(e) == NOWHERE ? NULL : &world[EXIT_NDEST(e)]) diff --git a/include/handler.hpp b/include/handler.hpp index 69e2ee8d..245ee86a 100644 --- a/include/handler.hpp +++ b/include/handler.hpp @@ -20,7 +20,7 @@ /* handling the affected-structures */ void effect_total(CharData *ch); void do_campout(CharData *ch); -void effect_modify(CharData *ch, byte loc, sh_int mod, flagvector bitv[], bool add); +void effect_modify(CharData *ch, byte loc, sh_int mod, EffectFlags flags, bool add); void effect_to_char(CharData *ch, effect *eff); void effect_remove(CharData *ch, effect *eff); void active_effect_remove(CharData *ch, effect *effect); diff --git a/include/objects.hpp b/include/objects.hpp index 9f594635..7b012346 100644 --- a/include/objects.hpp +++ b/include/objects.hpp @@ -13,6 +13,7 @@ #pragma once #include "effects.hpp" +#include "events.hpp" #include "structs.hpp" #include "sysdep.hpp" @@ -44,7 +45,7 @@ struct ObjectFlagData { byte type_flag; /* Type of item */ long int wear_flags; /* Where you can wear it */ /* If it hums, glows, etc. */ - flagvector extra_flags[FLAGVECTOR_SIZE(NUM_ITEM_FLAGS)]; + ExtraObjectFlags extra_flags; float weight; /* Weight what else */ float effective_weight; /* Weight of contents + weight */ int cost; /* Value when sold (gp.) */ @@ -52,7 +53,7 @@ struct ObjectFlagData { int timer; /* Timer for object */ int decomp; /* Decomposition timer */ /* Object Spell effects */ - flagvector effect_flags[FLAGVECTOR_SIZE(NUM_EFF_FLAGS)]; + EffectFlags effect_flags; long hiddenness; /* How difficult it is to see obj */ }; @@ -92,10 +93,9 @@ struct ObjData { SpellBookList *spell_book; /* list of all spells in book if obj is spellbook */ - CharData *casters; /* Characters who are casting spells at this */ - Event *events; /* List of events related to this object */ - int event_flags[EVENT_FLAG_FIELDS]; - /* Bitfield of events active on this object */ + CharData *casters; /* Characters who are casting spells at this */ + Event *events; /* List of events related to this object */ + EventFlags event_flags; /* Bitfield of events active on this object */ }; /* @@ -560,8 +560,8 @@ const struct LiquidDef liquid_types[NUM_LIQ_TYPES] = { #define GET_OBJ_RNUM(obj) ((obj)->item_number) #define GET_OBJ_VNUM(obj) (GET_OBJ_RNUM(obj) >= 0 ? obj_index[GET_OBJ_RNUM(obj)].vnum : -1) #define GET_OBJ_EFF_FLAGS(obj) ((obj)->obj_flags.effect_flags) -#define OBJ_FLAGGED(obj, flag) (IS_FLAGGED(GET_OBJ_FLAGS(obj), (flag))) -#define OBJ_EFF_FLAGGED(obj, f) (IS_FLAGGED(GET_OBJ_EFF_FLAGS(obj), (f))) +#define OBJ_FLAGGED(obj, flag) (GET_OBJ_FLAGS(obj).test((flag))) +#define OBJ_EFF_FLAGGED(obj, f) (GET_OBJ_EFF_FLAGS(obj).test((f))) #define GET_OBJ_SPEC(obj) ((obj)->item_number >= 0 ? (obj_index[(obj)->item_number].func) : NULL) #define CAN_WEAR(obj, part) (IS_SET(GET_OBJ_WEAR(obj), (part))) diff --git a/include/players.hpp b/include/players.hpp index eb8da399..77c7f4d3 100644 --- a/include/players.hpp +++ b/include/players.hpp @@ -12,6 +12,10 @@ #pragma once +#include "db.hpp" +#include "interpreter.hpp" +#include "logging.hpp" +#include "string_utils.hpp" #include "structs.hpp" #include "sysdep.hpp" @@ -51,9 +55,35 @@ void start_player(CharData *ch); void add_perm_title(CharData *ch, char *line); -void load_ascii_flags(flagvector flags[], int num_flags, char *line); -void write_ascii_flags(FILE *fl, flagvector flags[], int num_flags); +template void load_ascii_flags(std::bitset &flags, char *line) { + int i = 0; + skip_spaces(&line); + + line = strtok(line, " "); + + while (line && *line) { + if (flags.size() <= i) { + if (*line != '0') { + log("SYSERR: load_ascii_flags: attempting to read in flags for block {:d}, but only {} blocks allowed " + "for std::bitset type", + i, flags.size()); + } + } else + flags[i] = asciiflag_conv(line); + line = strtok(nullptr, " "); + ++i; + } +} + +template void write_ascii_flags(FILE *fl, const std::bitset &flags) { + char flagbuf[flags.size() + 1]; + + for (int i = 0; i < flags.size(); ++i) { + sprintascii(flagbuf, flags); + fprintf(fl, "%s%s", i ? " " : "", flagbuf); + } +} void remove_player_from_game(CharData *ch, int removal_mode); void send_save_description(CharData *ch, CharData *dest, bool entering); diff --git a/include/races.hpp b/include/races.hpp index 88de41e3..e49570aa 100644 --- a/include/races.hpp +++ b/include/races.hpp @@ -143,7 +143,7 @@ struct RaceDef { */ /* List of permanent effect flags */ - flagvector effect_flags[FLAGVECTOR_SIZE(NUM_EFF_FLAGS)]; + EffectFlags effect_flags; struct { int skill; /* Skill number */ int proficiency; /* Default proficiency (can be ROLL_SKILL_PROF) */ diff --git a/include/rooms.hpp b/include/rooms.hpp index ad04296f..f725d68b 100644 --- a/include/rooms.hpp +++ b/include/rooms.hpp @@ -19,6 +19,8 @@ #include "sysdep.hpp" #include "weather.hpp" +#include + /* WARNING: In the world files, NEVER set the bits marked "R" ("Reserved") */ #define ROOM_DARK 0 /* Dark */ #define ROOM_DEATH 1 /* Death trap */ @@ -49,6 +51,7 @@ #define ROOM_ARENA 26 /* (safe) PK allowed in room */ #define ROOM_OBSERVATORY 27 /* see into adjacent ARENA rooms */ #define NUM_ROOM_FLAGS 28 /* Keep me updated! */ +typedef std::bitset RoomFlags; #define ROOM_EFF_FOG 0 /* Tough to see anything */ #define ROOM_EFF_DARKNESS 1 /* Magically made dark */ @@ -57,6 +60,7 @@ #define ROOM_EFF_CIRCLE_FIRE 4 /* This spell hurts people */ #define ROOM_EFF_ISOLATION 5 /* Exits aren't visible */ #define NUM_ROOM_EFF_FLAGS 6 /* Keep me updated! */ +typedef std::bitset RoomEffectFlags; #define ROOM_RNUM_TO_VNUM(rnum) (rnum >= 0 && rnum < top_of_world ? world[rnum].vnum : NOWHERE) @@ -111,10 +115,10 @@ struct RoomData { Exit *exits[NUM_OF_DIRS]; /* DEATH,DARK ... etc */ - flagvector room_flags[FLAGVECTOR_SIZE(NUM_ROOM_FLAGS)]; + RoomFlags room_flags; /* bitvector for spells/skills */ - flagvector room_effects[FLAGVECTOR_SIZE(NUM_ROOM_EFF_FLAGS)]; + RoomEffectFlags room_effects; int light; /* Number of light sources in room */ SPECIAL(*func); diff --git a/include/string_utils.hpp b/include/string_utils.hpp index 33c59977..90181f35 100644 --- a/include/string_utils.hpp +++ b/include/string_utils.hpp @@ -9,8 +9,44 @@ void sprintbit(long vektor, const char *names[], char *result); void sprinttype(int type, const char *names[], char *result); -void sprintflag(char *result, flagvector flags[], int num_flags, const char *names[]); -int sprintascii(char *out, flagvector bits); + +template void sprintflag(char *result, const std::bitset &flags, const char *names[]) { + char *orig_pos = result; + + for (std::size_t i = 0; i < N; ++i) { + if (flags.test(i)) { + if (*names[i] != '\n') + strcpy(result, names[i]); + else + strcpy(result, "UNDEFINED"); + result += strlen(result); + *(result++) = ' '; + } + } + + if (orig_pos == result) + strcpy(result, "NO FLAGS"); + else + *(result - 1) = '\0'; /* Nul terminate */ +} + +template int sprintascii(char *out, const std::bitset &bits) { + int j = 0; + /* 32 bits, don't just add letters to try to get more unless std::bitset is also as large. */ + const char *flags = "abcdefghijklmnopqrstuvwxyzABCDEF"; + + for (std::size_t i = 0; flags[i]; ++i) + if (bits.test(i)) + out[j++] = flags[i]; + + if (j == 0) /* Didn't write anything. */ + out[j++] = '0'; + + /* Nul terminate the output string. */ + out[j++] = '\0'; + return j; +} + bool is_equals(const std::string_view &lhs, const std::string_view &rhs); // Similar to matches() but checks if rhs starts with lhs, case insensitively. diff --git a/include/structs.hpp b/include/structs.hpp index 6cf2e82e..f4f8be91 100644 --- a/include/structs.hpp +++ b/include/structs.hpp @@ -39,15 +39,6 @@ typedef unsigned char ubyte; typedef signed short int sh_int; typedef unsigned short int ush_int; -/** Bitvector type for 32 bit unsigned long bitvectors. 'unsigned long long' - * will give you at least 64 bits if you have GCC. You'll have to search - * throughout the code for "bitvector_t" and change them yourself if you'd - * like this extra flexibility. */ -typedef unsigned long int flagvector; -#define FLAGBLOCK_SIZE (flagvector)32 -//((flagvector)8 * sizeof(flagvector)) /* 8 bits = 1 byte */ -#define FLAGVECTOR_SIZE(flags) (((flags)-1) / FLAGBLOCK_SIZE + 1) - /* Extra description: used in objects, mobiles, and rooms */ struct ExtraDescriptionData { char *keyword; /* Keyword in look/examine */ @@ -207,13 +198,13 @@ struct CharSpecialData { int alignment; /* +/- 1000 for alignment */ long idnum; /* player's idnum; -1 for mobiles */ /* act flag for NPC; player flag for PC */ - flagvector act[FLAGVECTOR_SIZE(NUM_MOB_FLAGS > NUM_PLR_FLAGS ? NUM_MOB_FLAGS : NUM_PLR_FLAGS)]; + PlayerOrMobFlags act; long perception; long hiddenness; /* Bitvectors for spells/skills effects */ - flagvector effects[FLAGVECTOR_SIZE(NUM_EFF_FLAGS)]; + EffectFlags effects; sh_int apply_saving_throw[5]; /* Saving throw (Bonuses) */ sh_int skills[TOP_SKILL + 1]; /* array of skills plus skill 0 */ @@ -259,19 +250,19 @@ struct PlayerSpecialData { room_num load_room; /* Which room to place char in */ room_num save_room; /* Where the player was when saved */ /* preference flags for PC's. */ - flagvector pref[FLAGVECTOR_SIZE(NUM_PRF_FLAGS)]; + PreferenceFlags pref; /* privilege flags for PC's */ - flagvector privileges[FLAGVECTOR_SIZE(NUM_PRV_FLAGS)]; + PrivilegeFlags privileges; ubyte bad_pws; /* number of bad password attempts */ sbyte conditions[3]; /* Drunk, full, thirsty */ TrophyNode *trophy; AliasData *aliases; - flagvector *grant_cache; /* cache of granted commands */ - flagvector *revoke_cache; /* cache of revoked commands */ - GrantType *grants; /* Commands granted to this player */ - GrantType *revokes; /* Commands revoked from this player */ - /* Groups of commands granted to this player */ + CommandCache grant_cache; /* cache of granted commands */ + CommandCache revoke_cache; /* cache of revoked commands */ + GrantType *grants; /* Commands granted to this player */ + GrantType *revokes; /* Commands revoked from this player */ + /* Groups of commands granted to this player */ GrantType *grant_groups; /* Groups of commands revoked from this player */ GrantType *revoke_groups; @@ -333,7 +324,7 @@ struct effect { int modifier; /* This is added to apropriate ability */ byte location; /* Tells which ability to change(APPLY_XXX) */ /* Tells which flags to set (EFF_XXX) */ - flagvector flags[FLAGVECTOR_SIZE(NUM_EFF_FLAGS)]; + EffectFlags flags; effect *next; }; @@ -414,7 +405,8 @@ struct CharData { /* Events */ Casting casting; /* note this is NOT a pointer */ Event *events; /* List of events related to this character */ - int event_flags[EVENT_FLAG_FIELDS]; /* Bitfield of events active on this character */ + + EventFlags event_flags; /* Bitfield of events active on this character */ }; /* ====================================================================== */ @@ -510,17 +502,17 @@ struct message_list { }; struct stat_bonus_type { - sh_int tohit; /* To Hit (THAC0) Bonus/Penalty */ - sh_int todam; /* Damage Bonus/Penalty */ - sh_int defense; /* Armor Class Bonus/Penalty */ - sh_int carry; /* Maximum weight that can be carrried */ - sh_int wield; /* Maximum weight that can be wielded */ - sh_int magic; /* Stat bonus to spells */ - sh_int hpgain; /* Bonus to HP gained at level */ - sh_int skill_small; /* Range -7 to 5 bonus to skills */ - sh_int skill_medium; /* Range -7 to 10 bonus to skills */ - sh_int skill_large; /* Range -7 to 15 bonus to skills */ - sh_int rogue_skills; /* Bonus range for rogue-type skills */ + sh_int tohit; /* To Hit (THAC0) Bonus/Penalty */ + sh_int todam; /* Damage Bonus/Penalty */ + sh_int defense; /* Armor Class Bonus/Penalty */ + sh_int carry; /* Maximum weight that can be carrried */ + sh_int wield; /* Maximum weight that can be wielded */ + sh_int magic; /* Stat bonus to spells */ + sh_int hpgain; /* Bonus to HP gained at level */ + sh_int skill_small; /* Range -7 to 5 bonus to skills */ + sh_int skill_medium; /* Range -7 to 10 bonus to skills */ + sh_int skill_large; /* Range -7 to 15 bonus to skills */ + sh_int rogue_skills; /* Bonus range for rogue-type skills */ }; struct weather_data { diff --git a/include/text.hpp b/include/text.hpp index 2f4d7fdd..902383c8 100644 --- a/include/text.hpp +++ b/include/text.hpp @@ -46,6 +46,7 @@ char *filter_chars(char *buf, const char *src, const char *chars); #define SB_EXTERNAL 0 #define SB_USE_CAPS 1 #define NUM_SB_FLAGS 2 +typedef std::bitset ScreenBufFlags; #define SB_INITIAL_BUF_CAP 1000 #define SB_INITIAL_LINES_CAP 10 @@ -54,7 +55,7 @@ struct ScreenBuf { char *buf; size_t capacity; size_t length; - flagvector flags[FLAGVECTOR_SIZE(NUM_SB_FLAGS)]; + ScreenBufFlags flags; char **lines; size_t line_capacity; diff --git a/include/utils.hpp b/include/utils.hpp index f4385f37..044b3105 100644 --- a/include/utils.hpp +++ b/include/utils.hpp @@ -161,27 +161,24 @@ void drop_core(CharData *ch, const char *desc); #define TOGGLE_BIT(var, bit) ((var) = (var) ^ (bit)) /* extended bitvector utils */ -#define FIELD(x) ((long)(x) / FLAGBLOCK_SIZE) -#define FLAG(x) ((flagvector)1 << ((x) % FLAGBLOCK_SIZE)) #define IS_FLAGGED(field, flag) (((field)[FIELD(flag)] & FLAG(flag)) ? 1 : 0) #define SET_FLAG(field, flag) ((field)[FIELD(flag)] |= FLAG(flag)) #define REMOVE_FLAG(field, flag) ((field)[FIELD(flag)] &= ~FLAG(flag)) -#define TOGGLE_FLAG(field, flag) ((field)[FIELD(flag)] ^= FLAG(flag)) -bool ALL_FLAGGED(const flagvector field[], const flagvector flags[], const int num_flags); -bool ANY_FLAGGED(const flagvector field[], const flagvector flags[], const int num_flags); -void SET_FLAGS(flagvector field[], const flagvector flags[], const int num_flags); -void REMOVE_FLAGS(flagvector field[], const flagvector flags[], const int num_flags); -void TOGGLE_FLAGS(flagvector field[], const flagvector flags[], const int num_flags); -void COPY_FLAGS(flagvector field[], const flagvector flags[], const int num_flags); - -extern flagvector *ALL_FLAGS; -#define HAS_FLAGS(field, num_flags) (ANY_FLAGGED((field), ALL_FLAGS, (num_flags))) -#define CLEAR_FLAGS(field, num_flags) (REMOVE_FLAGS((field), ALL_FLAGS, (num_flags))) +template inline bool ALL_FLAGGED(const std::bitset &field, const std::bitset &flags) { + return (field & flags) == flags; +} +template inline bool ANY_FLAGGED(const std::bitset &field, const std::bitset &flags) { + return (field & flags).any(); +} +template inline void SET_FLAGS(std::bitset &field, const std::bitset &flags) { field |= flags; } +template inline void REMOVE_FLAGS(std::bitset &field, const std::bitset &flags) { field &= ~flags; } +template inline void TOGGLE_FLAGS(std::bitset &field, const std::bitset &flags) { field ^= flags; } +template inline void COPY_FLAGS(std::bitset &field, const std::bitset &flags) { field = flags; } /* Event flags */ #define GET_EVENTS(o) ((o)->events) #define GET_EVENT_FLAGS(o) ((o)->event_flags) -#define EVENT_FLAGGED(o, flag) IS_FLAGGED(GET_EVENT_FLAGS(o), (flag)) +#define EVENT_FLAGGED(o, flag) GET_EVENT_FLAGS(o).test(flag) #define MOB_FLAGS(ch) ((ch)->char_specials.act) #define PLR_FLAGS(ch) ((ch)->char_specials.act) @@ -191,7 +188,7 @@ extern flagvector *ALL_FLAGS; #define ROOM_FLAGS(loc) (world[(loc)].room_flags) #define ROOM_EFFECTS(loc) (world[(loc)].room_effects) -#define IS_NPC(ch) IS_FLAGGED(MOB_FLAGS(ch), MOB_ISNPC) +#define IS_NPC(ch) MOB_FLAGS(ch).test(MOB_ISNPC) #define IS_MOB(ch) (IS_NPC(ch) && ((ch)->mob_specials.nr > -1)) #define POSSESSED(ch) ((ch)->desc && (ch)->desc->original) #define POSSESSOR(ch) ((ch)->desc && (ch)->desc->original ? (ch)->desc->original : NULL) @@ -202,27 +199,23 @@ extern flagvector *ALL_FLAGS; #define PLAYERALLY(ch) (IS_PC(ch) || (EFF_FLAGGED(ch, EFF_CHARM) && (ch)->master && IS_PC((ch)->master))) #define IS_PET(ch) (PLAYERALLY(ch) && MOB_FLAGGED(ch, MOB_PET)) /* True if player bought/tamed mob only */ -/* MORTALALLY - same as PLAYERALLY except that the involved player - * must be mortal for it to return true */ +/* MORTALALLY - same as PLAYERALLY except that the involved player must be mortal for it to return true */ #define MORTALALLY(ch) \ ((!IS_NPC(REAL_CHAR(ch)) && GET_LEVEL(REAL_CHAR(ch)) < LVL_IMMORT) || \ (EFF_FLAGGED(ch, EFF_CHARM) && (ch)->master && \ (!IS_NPC(REAL_CHAR(ch)) && GET_LEVEL(REAL_CHAR(ch)) < LVL_IMMORT))) -#define MOB_FLAGGED(ch, flag) (IS_NPC(ch) && IS_FLAGGED(MOB_FLAGS(ch), (flag))) -#define PLR_FLAGGED(ch, flag) (!IS_NPC(ch) && IS_FLAGGED(PLR_FLAGS(ch), (flag))) -#define PRF_FLAGGED(ch, flag) IS_FLAGGED(PRF_FLAGS(REAL_CHAR(ch)), (flag)) -#define PRV_FLAGGED(ch, flag) IS_FLAGGED(PRV_FLAGS(REAL_CHAR(ch)), (flag)) -#define EFF_FLAGGED(ch, flag) IS_FLAGGED(EFF_FLAGS(ch), (flag)) -#define ROOM_FLAGGED(loc, flag) IS_FLAGGED(ROOM_FLAGS(loc), (flag)) -#define ROOM_EFF_FLAGGED(loc, eff) IS_FLAGGED(ROOM_EFFECTS(loc), (eff)) +#define MOB_FLAGGED(ch, flag) (IS_NPC(ch) && MOB_FLAGS(ch).test((flag))) +#define PLR_FLAGGED(ch, flag) (!IS_NPC(ch) && PLR_FLAGS(ch).test((flag))) +#define PRF_FLAGGED(ch, flag) PRF_FLAGS(REAL_CHAR(ch)).test((flag)) +#define PRV_FLAGGED(ch, flag) PRV_FLAGS(REAL_CHAR(ch)).test((flag)) +#define EFF_FLAGGED(ch, flag) EFF_FLAGS(ch).test((flag)) +#define ROOM_FLAGGED(loc, flag) ROOM_FLAGS(loc).test((flag)) +#define ROOM_EFF_FLAGGED(loc, eff) ROOM_EFFECTS(loc).test((eff)) #define AGGR_TO_PLAYERS(ch) \ (MOB_FLAGGED((ch), MOB_AGGR_EVIL) || MOB_FLAGGED((ch), MOB_AGGR_GOOD) || MOB_FLAGGED((ch), MOB_AGGR_NEUTRAL) || \ MOB_FLAGGED((ch), MOB_AGGR_EVIL_RACE) || MOB_FLAGGED((ch), MOB_AGGR_GOOD_RACE)) -#define PLR_TOG_CHK(ch, flag) (TOGGLE_FLAG(PLR_FLAGS(ch), (flag)) & FLAG(flag)) -#define PRF_TOG_CHK(ch, flag) (TOGGLE_FLAG(PRF_FLAGS(ch), (flag)) & FLAG(flag)) -#define PRV_TOG_CHK(ch, flag) (TOGGLE_FLAG(PRV_FLAGS(ch), (flag)) & FLAG(flag)) #define CONFUSED(ch) EFF_FLAGGED(ch, EFF_CONFUSION) /* Mob performs scripts? (specprocs and triggers) diff --git a/include/zone.hpp b/include/zone.hpp index b8591ee0..c4ce2cad 100644 --- a/include/zone.hpp +++ b/include/zone.hpp @@ -26,13 +26,13 @@ struct ResetCommand { /* zone definition structure. for the 'zone-table' */ struct ZoneData { - char *name; /* name of this zone */ - int lifespan; /* how long between resets (minutes) */ - int age; /* current age of this zone (minutes) */ - int top; /* upper limit for rooms in this zone */ - int zone_factor; - int reset_mode; /* conditions for reset (see below) */ - int number; /* vnum of this zone */ + char *name; /* name of this zone */ + int lifespan; /* how long between resets (minutes) */ + int age; /* current age of this zone (minutes) */ + int top; /* upper limit for rooms in this zone */ + int zone_factor; /* Unused. */ + int reset_mode; /* conditions for reset (see below) */ + int number; /* vnum of this zone */ /* weather information */ int hemisphere; diff --git a/src/act.informative.cpp b/src/act.informative.cpp index 8a750a36..ace9e130 100644 --- a/src/act.informative.cpp +++ b/src/act.informative.cpp @@ -25,6 +25,7 @@ #include "db.hpp" #include "dg_scripts.hpp" #include "directions.hpp" +#include "effects.hpp" #include "events.hpp" #include "exits.hpp" #include "handler.hpp" @@ -934,7 +935,7 @@ static int search_for_doors(CharData *ch, char *arg) { int door; for (door = 0; door < NUM_OF_DIRS; ++door) if (CH_EXIT(ch, door) && CH_EXIT(ch, door)->to_room != NOWHERE && - IS_SET(CH_EXIT(ch, door)->exit_info, EX_HIDDEN)) { + CH_EXIT(ch, door)->exit_info.test(EX_HIDDEN)) { if (GET_LEVEL(ch) >= LVL_IMMORT || (CH_EXIT(ch, door)->keyword && arg && isname(arg, CH_EXIT(ch, door)->keyword)) || GET_INT(ch) > random_number(0, 200)) { @@ -1095,7 +1096,7 @@ void print_room_to_char(room_num room_nr, CharData *ch, bool ignore_brief) { /* The lighted version */ if (PRF_FLAGGED(ch, PRF_ROOMFLAGS)) { - sprintflag(buf, ROOM_FLAGS(room_nr), NUM_ROOM_FLAGS, room_bits); + sprintflag(buf, ROOM_FLAGS(room_nr), room_bits); sprintf(buf1, "%s%s", sectors[SECT(room_nr)].color, sectors[SECT(room_nr)].name); char_printf(ch, "@L[@0{:5}@L]@W {} @L[@0{}@0: {}@L]@0\n", world[room_nr].vnum, world[room_nr].name, buf1, buf); } else @@ -1518,12 +1519,12 @@ void identify_obj(ObjData *obj, CharData *ch, int location) { } /* Describe extra flags (hum, !drop, class/align restrictions, etc.) */ - sprintflag(buf, GET_OBJ_FLAGS(obj), NUM_ITEM_FLAGS, extra_bits); + sprintflag(buf, GET_OBJ_FLAGS(obj), extra_bits); char_printf(ch, "Item is: {}\n", buf); /* Tell about spell effects here */ - if (HAS_FLAGS(GET_OBJ_EFF_FLAGS(obj), NUM_EFF_FLAGS)) { - sprintflag(buf, GET_OBJ_EFF_FLAGS(obj), NUM_EFF_FLAGS, effect_flags); + if (GET_OBJ_EFF_FLAGS(obj).any()) { + sprintflag(buf, GET_OBJ_EFF_FLAGS(obj), effect_flags); char_printf(ch, "Item provides: {}\n", buf); } @@ -2687,12 +2688,11 @@ ACMD(do_color) { char_printf(ch, "Usage: color { Off | Sparse | Normal | Complete }\n"); return; } - REMOVE_FLAG(PRF_FLAGS(ch), PRF_COLOR_1); - REMOVE_FLAG(PRF_FLAGS(ch), PRF_COLOR_2); + PRF_FLAGS(ch).reset(PRF_COLOR_1 | PRF_COLOR_2); if (IS_SET(tp, 1)) - SET_FLAG(PRF_FLAGS(ch), PRF_COLOR_1); + PRF_FLAGS(ch).set(PRF_COLOR_1); if (IS_SET(tp, 2)) - SET_FLAG(PRF_FLAGS(ch), PRF_COLOR_2); + PRF_FLAGS(ch).set(PRF_COLOR_2); char_printf(ch, "Your {}color{} is now {}.\n", CLRLV(ch, FRED, C_SPR), CLRLV(ch, ANRM, C_SPR), ctypes[tp]); } diff --git a/src/act.item.cpp b/src/act.item.cpp index b41c47e7..df6df25e 100644 --- a/src/act.item.cpp +++ b/src/act.item.cpp @@ -868,7 +868,7 @@ ACMD(do_drink) { eff.duration = amount * 3; eff.modifier = 0; eff.location = APPLY_NONE; - SET_FLAG(eff.flags, EFF_POISON); + eff.flags.set(EFF_POISON); effect_join(ch, &eff, false, false, false, false, true); } @@ -939,7 +939,7 @@ ACMD(do_eat) { eff.duration = amount * 2; eff.modifier = 0; eff.location = APPLY_NONE; - SET_FLAG(eff.flags, EFF_POISON); + eff.flags.set(EFF_POISON); effect_join(ch, &eff, false, false, false, false, true); } /* This will restore hit points, such that a meal of size 24 @@ -1625,7 +1625,7 @@ bool check_get_disarmed_obj(CharData *ch, CharData *last_to_hold, ObjData *obj) } if (!retval) - REMOVE_FLAG(GET_OBJ_FLAGS(obj), ITEM_WAS_DISARMED); + GET_OBJ_FLAGS(obj).reset(ITEM_WAS_DISARMED); return retval; } diff --git a/src/act.movement.cpp b/src/act.movement.cpp index 449ad0f1..617c4cbe 100644 --- a/src/act.movement.cpp +++ b/src/act.movement.cpp @@ -715,14 +715,14 @@ ACMD(do_move) { if (misdir > -1) perform_move(ch, misdir, 0, true); - SET_FLAG(EFF_FLAGS(ch), EFF_MISDIRECTING); + EFF_FLAGS(ch).set(EFF_MISDIRECTING); /* Send confused people off in a random direction. */ if (CONFUSED(ch) && random_number(0, 1) == 0) { char_printf(ch, "&5You are confused!&0\n"); subcmd = SCMD_STAY + random_number(1, 6); } perform_move(ch, subcmd - 1, 0, false); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_MISDIRECTING); + EFF_FLAGS(ch).reset(EFF_MISDIRECTING); return; } @@ -1238,7 +1238,7 @@ ACMD(do_enter) { "tunnel, &1&bon fire!&0", false, ch, obj, 0, TO_ROOM); damage(ch, ch, abs(GET_ALIGNMENT(ch)) / 10, TYPE_SUFFERING); - SET_FLAG(EFF_FLAGS(ch), EFF_ON_FIRE); + EFF_FLAGS(ch).set(EFF_ON_FIRE); return; } } else if (GET_OBJ_VNUM(obj) == OBJ_VNUM_HELLGATE) { @@ -1334,7 +1334,7 @@ ACMD(do_leave) { ACMD(do_doorbash) #define EXITK(room, dir) (world[room].exits[dir]) -#define OPEN_DOORK(room, door) (TOGGLE_BIT(EXITK(room, door)->exit_info, EX_CLOSED)) +#define OPEN_DOORK(room, door) (EXITK(room, door)->exit_info.flip(EX_CLOSED)) { char arg[MAX_INPUT_LENGTH]; int dir = 0, chance, probability, dam; @@ -1733,9 +1733,9 @@ ACMD(do_drag) { act("&3$n&3 stops meditating.&0", true, ch, 0, 0, TO_ROOM); act("&3Your meditation is interrupted as %N grabs you.&0", false, ch, 0, 0, TO_CHAR); if (IS_NPC(ch)) - REMOVE_FLAG(MOB_FLAGS(ch), MOB_MEDITATE); - else - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + MOB_FLAGS(ch).reset(MOB_MEDITATE); + else + PLR_FLAGS(ch).reset(PLR_MEDITATE); } /* now display act() messages to the target room */ @@ -2271,7 +2271,7 @@ ACMD(do_follow) { stop_follower(ch, 0); if (subcmd == SCMD_SHADOW) - SET_FLAG(EFF_FLAGS(ch), EFF_SHADOWING); + EFF_FLAGS(ch).set(EFF_SHADOWING); add_follower(ch, leader); @@ -2280,7 +2280,7 @@ ACMD(do_follow) { chance += stat_bonus[GET_DEX(ch)].rogue_skills; if (chance < random_number(1, 101)) { - REMOVE_FLAG(EFF_FLAGS(ch), EFF_SHADOWING); + EFF_FLAGS(ch).reset(EFF_SHADOWING); act("You are noticed as you attempt to secretly follow $N.", false, ch, 0, leader, TO_CHAR); act("$n attempts to secretly follow you, but you spot $m.", true, ch, 0, leader, TO_VICT); act("$n attempts to follow $N secretly, but you notice $m.", true, ch, 0, leader, TO_NOTVICT); @@ -2746,10 +2746,10 @@ ACMD(do_tame) { eff.duration = tame_duration; eff.modifier = 0; eff.location = APPLY_NONE; - SET_FLAG(eff.flags, EFF_TAMED); + eff.flags.set(EFF_TAMED); effect_to_char(vict, &eff); - SET_FLAG(MOB_FLAGS(vict), MOB_PET); + MOB_FLAGS(vict).set(MOB_PET); act("You tame $N.", false, ch, 0, vict, TO_CHAR); act("$n tames you.", false, ch, 0, vict, TO_VICT); diff --git a/src/act.offensive.cpp b/src/act.offensive.cpp index b95d1aba..c7f7e838 100644 --- a/src/act.offensive.cpp +++ b/src/act.offensive.cpp @@ -47,8 +47,8 @@ void aggro_lose_spells(CharData *ch) { if (!EFF_FLAGGED(ch, EFF_REMOTE_AGGR)) { if (affected_by_spell(ch, SPELL_INVISIBLE) || affected_by_spell(ch, SPELL_NATURES_EMBRACE)) appear(ch); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_INVISIBLE); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_CAMOUFLAGED); + EFF_FLAGS(ch).reset(EFF_INVISIBLE); + EFF_FLAGS(ch).reset(EFF_CAMOUFLAGED); if (EFF_FLAGGED(ch, EFF_GLORY)) effect_from_char(ch, SPELL_GLORY); GET_HIDDENNESS(ch) = 0; @@ -709,7 +709,7 @@ ACMD(do_backstab) { eff.duration = 2; eff.modifier = 0; eff.location = APPLY_NONE; - SET_FLAG(eff.flags, EFF_AWARE); + eff.flags.set(EFF_AWARE); effect_to_char(vict, &eff); } return; @@ -770,7 +770,7 @@ ACMD(do_backstab) { eff.duration = 2; eff.modifier = 0; eff.location = APPLY_NONE; - SET_FLAG(eff.flags, EFF_AWARE); + eff.flags.set(EFF_AWARE); effect_to_char(vict, &eff); } @@ -1345,7 +1345,7 @@ ACMD(do_kick) { /* Need to see whether this player is fighting already. Kick should not allow for the player to switch without a switch probability being calculated into the mix. (DEMOLITUM) */ - + WAIT_STATE(ch, PULSE_VIOLENCE); if (FIGHTING(ch) && FIGHTING(ch) != vict && !switch_ok(ch)) return; @@ -1437,7 +1437,7 @@ ACMD(do_eye_gouge) { eff.duration = 1; eff.modifier = -2 - GET_SKILL(ch, SKILL_EYE_GOUGE) / 10; eff.location = APPLY_HITROLL; - SET_FLAG(eff.flags, EFF_BLIND); + eff.flags.set(EFF_BLIND); effect_to_char(vict, &eff); } damage(ch, vict, dam_suscept_adjust(ch, vict, 0, (GET_SKILL(ch, SKILL_EYE_GOUGE) + percent) / 4, DAM_PIERCE), @@ -1516,12 +1516,12 @@ ACMD(do_springleap) { GET_STANCE(ch) = STANCE_ALERT; } } else if (damage_evasion(vict, ch, 0, DAM_CRUSH)) { - act(EVASIONCLR "You hurtle right through $N" EVASIONCLR " and land in a heap on the other side!&0", false, ch, 0, - vict, TO_CHAR); + act(EVASIONCLR "You hurtle right through $N" EVASIONCLR " and land in a heap on the other side!&0", false, ch, + 0, vict, TO_CHAR); act(EVASIONCLR "$n" EVASIONCLR " leaps at $N" EVASIONCLR " but flies right on through!&0", false, ch, 0, vict, TO_NOTVICT); - act(EVASIONCLR "$n" EVASIONCLR " comes flying at you, but just passes through and hits the ground.&0", false, ch, - 0, vict, TO_VICT); + act(EVASIONCLR "$n" EVASIONCLR " comes flying at you, but just passes through and hits the ground.&0", false, + ch, 0, vict, TO_VICT); /* You fall */ WAIT_STATE(ch, (PULSE_VIOLENCE * 3) / 2); GET_POS(ch) = POS_SITTING; @@ -1754,7 +1754,7 @@ ACMD(do_throatcut) { eff.duration = 5; eff.modifier = 0; eff.location = APPLY_NONE; - SET_FLAG(eff.flags, EFF_AWARE); + eff.flags.set(EFF_AWARE); effect_to_char(vict, &eff); if (chance > 95) { @@ -1866,7 +1866,7 @@ ACMD(do_throatcut) { eff.duration = 2; eff.modifier = 0; eff.location = APPLY_NONE; - SET_FLAG(eff.flags, EFF_HURT_THROAT); + eff.flags.set(EFF_HURT_THROAT); effect_to_char(vict, &eff); } @@ -2091,7 +2091,7 @@ ACMD(do_disarm) { /* items ONLY have this set when a MOB is successfuly disarmed */ /* the item lies on the ground with this bit set, so when someone */ /* attempts to get it, do_get() can handle it appropriately */ - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_WAS_DISARMED); + GET_OBJ_FLAGS(obj).set(ITEM_WAS_DISARMED); /* we must remember who last held this item, so the MOB scanning for its */ /* disarmed item knows THAT is it. */ @@ -2404,7 +2404,7 @@ void start_berserking(CharData *ch) { eff.duration = 1000; /* arbitrarily long time */ eff.modifier = 0; eff.location = APPLY_NONE; - SET_FLAG(eff.flags, EFF_BERSERK); + eff.flags.set(EFF_BERSERK); GET_STANCE(ch) = STANCE_ALERT; GET_POS(ch) = POS_STANDING; effect_to_char(ch, &eff); @@ -2878,7 +2878,8 @@ ACMD(do_rend) { return; percent = ((10 - ((GET_AC(vict) + (monk_weight_penalty(vict) * 5)) / 10)) << 1) + random_number(1, 101); - prob = (GET_SKILL(ch, SKILL_REND) + (stat_bonus[GET_DEX(ch)].skill_large / 2) + (stat_bonus[GET_INT(ch)].skill_large / 2)); + prob = (GET_SKILL(ch, SKILL_REND) + (stat_bonus[GET_DEX(ch)].skill_large / 2) + + (stat_bonus[GET_INT(ch)].skill_large / 2)); if (percent > prob) { WAIT_STATE(ch, (PULSE_VIOLENCE * 3) / 2); @@ -2910,7 +2911,7 @@ ACMD(do_rend) { eff.modifier = -1 - (GET_SKILL(ch, SKILL_REND) / 4) - (stat_bonus[GET_DEX(ch)].skill_large / 2) - (stat_bonus[GET_INT(ch)].skill_large / 2); eff.location = APPLY_AC; - SET_FLAG(eff.flags, EFF_EXPOSED); + eff.flags.set(EFF_EXPOSED); effect_to_char(vict, &eff); } } @@ -3149,4 +3150,3 @@ ACMD(do_roundhouse) { if (realvictims) improve_skill(ch, SKILL_ROUNDHOUSE); } - diff --git a/src/act.other.cpp b/src/act.other.cpp index 756d51db..34a869d2 100644 --- a/src/act.other.cpp +++ b/src/act.other.cpp @@ -70,8 +70,8 @@ void appear(CharData *ch) { was_hidden = IS_HIDDEN(ch); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_INVISIBLE); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_CAMOUFLAGED); + EFF_FLAGS(ch).reset(EFF_INVISIBLE); + EFF_FLAGS(ch).reset(EFF_CAMOUFLAGED); GET_HIDDENNESS(ch) = 0; if (GET_LEVEL(ch) < LVL_IMMORT) { @@ -646,8 +646,7 @@ ACMD(do_shapechange) { char_to_room(mob, ch->in_room); /* Transfer hover slot items to new mob */ - if GET_EQ(ch, WEAR_HOVER) { - + if (GET_EQ(ch, WEAR_HOVER)) { obj = GET_EQ(ch, WEAR_HOVER); unequip_char(ch, WEAR_HOVER); equip_char(mob, obj, WEAR_HOVER); @@ -857,7 +856,7 @@ ACMD(do_camp) { ce->ch = ch; ce->was_in = ch->in_room; event_create(EVENT_CAMP, camp_event, ce, true, &(ch->events), GET_LEVEL(ch) >= LVL_IMMORT ? 5 : 350); - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_CAMP); + GET_EVENT_FLAGS(ch).set(EVENT_CAMP); act("You start setting up camp.", false, ch, nullptr, nullptr, TO_CHAR); act("$n starts setting up camp.", true, ch, 0, 0, TO_ROOM); } @@ -904,25 +903,25 @@ EVENTFUNC(camp_event) { now_in = ch->in_room; if (IS_NPC(ch) || !ch->desc) { - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_CAMP); + GET_EVENT_FLAGS(ch).reset(EVENT_CAMP); return EVENT_FINISHED; } if (RIDING(ch)) { - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_CAMP); + GET_EVENT_FLAGS(ch).reset(EVENT_CAMP); char_printf(ch, "You can't camp while mounted!\n"); return EVENT_FINISHED; } if (FIGHTING(ch)) { act("You decide now is not the best time for camping.", false, ch, nullptr, nullptr, TO_CHAR); - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_CAMP); + GET_EVENT_FLAGS(ch).reset(EVENT_CAMP); return EVENT_FINISHED; } if (now_in != was_in) { act("You are no longer near where you began the campsite.", false, ch, nullptr, nullptr, TO_CHAR); - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_CAMP); + GET_EVENT_FLAGS(ch).reset(EVENT_CAMP); return EVENT_FINISHED; } @@ -931,7 +930,7 @@ EVENTFUNC(camp_event) { if (PLR_FLAGGED(ch, PLR_MEDITATE)) { act("$N ceases $s meditative trance.", true, ch, 0, 0, TO_ROOM); char_printf(ch, "You stop meditating.\n&0"); - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_MEDITATE); } act("You complete your campsite, and leave this world for a while.", false, ch, nullptr, nullptr, TO_CHAR); @@ -941,7 +940,7 @@ EVENTFUNC(camp_event) { log(LogSeverity::Stat, std::max(LVL_IMMORT, GET_INVIS_LEV(ch)), "{} has camped in {} ({:d}).", GET_NAME(ch), world[ch->in_room].name, world[ch->in_room].vnum); - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_CAMP); + GET_EVENT_FLAGS(ch).reset(EVENT_CAMP); remove_player_from_game(ch, QUIT_CAMP); return EVENT_FINISHED; } @@ -963,7 +962,7 @@ ACMD(do_unbind) { if (prob > percent) { char_printf(ch, "You break free from your binds!\n"); act("$n breaks free from his binds", false, ch, 0, 0, TO_ROOM); - REMOVE_FLAG(PLR_FLAGS(ch), PLR_BOUND); + PLR_FLAGS(ch).reset(PLR_BOUND); WAIT_STATE(ch, PULSE_VIOLENCE); return; } else @@ -980,14 +979,14 @@ ACMD(do_unbind) { if (prob > percent) { char_printf(ch, "You break free from your binds!\n"); act("$n breaks free from his binds", false, ch, 0, 0, TO_ROOM); - REMOVE_FLAG(PLR_FLAGS(ch), PLR_BOUND); + PLR_FLAGS(ch).reset(PLR_BOUND); WAIT_STATE(ch, PULSE_VIOLENCE); return; } else WAIT_STATE(ch, PULSE_VIOLENCE * 3); return; } - REMOVE_FLAG(PLR_FLAGS(vict), PLR_BOUND); + PLR_FLAGS(vict).reset(PLR_BOUND); WAIT_STATE(ch, PULSE_VIOLENCE); char_printf(vict, "You are free of your binds.\n"); } @@ -1042,7 +1041,7 @@ ACMD(do_bind) { act("You tie $N up.... What next?", false, ch, 0, vict, TO_CHAR); act("$n ties you up.... Hope he isnt the kinky type", false, ch, 0, vict, TO_VICT); act("$n ties up $N.", false, ch, 0, vict, TO_NOTVICT); - SET_FLAG(PLR_FLAGS(vict), PLR_BOUND); + PLR_FLAGS(vict).set(PLR_BOUND); extract_obj(held); WAIT_STATE(ch, PULSE_VIOLENCE * 2); return; @@ -1062,7 +1061,7 @@ ACMD(do_bind) { act("You tie $N up.... What next?", false, ch, 0, vict, TO_CHAR); act("$n ties you up.... Hope he isnt the kinky type", false, ch, 0, vict, TO_VICT); act("$n ties up $N.", false, ch, 0, vict, TO_NOTVICT); - SET_FLAG(PLR_FLAGS(vict), PLR_BOUND); + PLR_FLAGS(vict).set(PLR_BOUND); extract_obj(held); improve_skill(ch, SKILL_BIND); WAIT_STATE(ch, PULSE_VIOLENCE * 3); @@ -1116,8 +1115,8 @@ ACMD(do_hide) { upper_bound = skill * (3 * GET_DEX(ch) + GET_INT(ch)) / 40; if (group_size(ch, true) > 1 && GET_RACE(ch) == RACE_HALFLING) - GET_HIDDENNESS(ch) = - random_number(lower_bound, upper_bound) + (stat_bonus[GET_DEX(ch)].rogue_skills * ((GET_LEVEL(ch) / 30) + 1)); + GET_HIDDENNESS(ch) = random_number(lower_bound, upper_bound) + + (stat_bonus[GET_DEX(ch)].rogue_skills * ((GET_LEVEL(ch) / 30) + 1)); else GET_HIDDENNESS(ch) = random_number(lower_bound, upper_bound) + stat_bonus[GET_DEX(ch)].rogue_skills; @@ -1131,10 +1130,10 @@ ACMD(do_hide) { improve_skill(ch, SKILL_HIDE); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_STEALTH); + EFF_FLAGS(ch).reset(EFF_STEALTH); if (GET_SKILL(ch, SKILL_STEALTH)) { if (GET_HIDDENNESS(ch) && GET_SKILL(ch, SKILL_STEALTH) > random_number(0, 101)) - SET_FLAG(EFF_FLAGS(ch), EFF_STEALTH); + EFF_FLAGS(ch).set(EFF_STEALTH); improve_skill(ch, SKILL_STEALTH); } } @@ -1516,7 +1515,7 @@ ACMD(do_douse) { } if (success) - REMOVE_FLAG(EFF_FLAGS(vict), EFF_ON_FIRE); + EFF_FLAGS(vict).reset(EFF_ON_FIRE); improve_skill(ch, SKILL_DOUSE); WAIT_STATE(ch, PULSE_VIOLENCE); } @@ -2183,13 +2182,13 @@ ACMD(do_peace) { if (FIGHTING(vict)) stop_fighting(vict); } - SET_FLAG(ROOM_FLAGS(ch->in_room), ROOM_PEACEFUL); + ROOM_FLAGS(ch->in_room).set(ROOM_PEACEFUL); } else { act("&7$n &4&bglows&0&7 with a &1&bbright red aura&0&7 as $e waves $s mighty hand!&0", false, ch, 0, 0, TO_ROOM); room_printf(ch->in_room, "&1&bThe peaceful feeling in the room subsides... You don't feel quite as safe anymore.&0\n"); - REMOVE_FLAG(ROOM_FLAGS(ch->in_room), ROOM_PEACEFUL); + ROOM_FLAGS(ch->in_room).reset(ROOM_PEACEFUL); } } @@ -2326,9 +2325,8 @@ void summon_mount(CharData *ch, int mob_vnum, int base_hp, int base_mv) { act("$N answers your summons!", true, ch, 0, mount, TO_CHAR); act("$N walks in, seemingly from nowhere, and nuzzles $n's face.", true, ch, 0, mount, TO_ROOM); - SET_FLAG(EFF_FLAGS(mount), EFF_CHARM); - SET_FLAG(EFF_FLAGS(mount), EFF_TAMED); - SET_FLAG(MOB_FLAGS(mount), MOB_SUMMONED_MOUNT); + EFF_FLAGS(mount).set(EFF_CHARM | EFF_TAMED); + MOB_FLAGS(mount).set(MOB_SUMMONED_MOUNT); add_follower(mount, ch); GET_LEVEL(mount) = 5; @@ -2519,7 +2517,7 @@ TO_CHAR); act(to_char, false, ch, 0, vict, TO_CHAR); act(to_vict, false, ch, 0, vict, TO_VICT); act(to_room, true, ch, 0, vict, TO_NOTVICT); - SET_FLAG(MOB_FLAGS(vict), MOB_AGGRESSIVE); + (MOB_FLAGS(vict).set(MOB_AGGRESSIVE); attack(vict, ch); } else { to_char="$N starts to wither and falls under your control!"; @@ -2536,7 +2534,7 @@ TO_CHAR); af.modifier = 0; af.location = APPLY_NONE; affect_to_char(vict, &af); - SET_FLAG(MOB_FLAGS(vict), MOB_CONTROLLED); + (MOB_FLAGS(vict).set(MOB_CONTROLLED); af.type = SPELL_CHARM; af.duration = control_duration + 1; af.bitvector = EFF_CHARM; @@ -2546,8 +2544,8 @@ TO_CHAR); af.location = APPLY_NONE; affect_to_char(vict, &af); add_follower(vict, ch); - REMOVE_FLAG(MOB_FLAGS(vict), MOB_AGGRESSIVE); - REMOVE_FLAG(MOB_FLAGS(vict), MOB_SPEC); + MOB_FLAGS(vict).reset(MOB_AGGRESSIVE); + MOB_FLAGS(vict).reset(MOB_SPEC); } } } diff --git a/src/act.wizard.cpp b/src/act.wizard.cpp index 07b07b43..0d7a8eb2 100644 --- a/src/act.wizard.cpp +++ b/src/act.wizard.cpp @@ -54,6 +54,7 @@ #include #include +#include #include #include #include @@ -837,17 +838,17 @@ ACMD(do_advance) { if (oldlevel >= LVL_IMMORT && newlevel < LVL_IMMORT) { /* If they are no longer an immortal, remove the immortal only flags. */ - REMOVE_FLAG(PRF_FLAGS(victim), PRF_LOG1); - REMOVE_FLAG(PLR_FLAGS(victim), PRF_LOG2); - REMOVE_FLAG(PRF_FLAGS(victim), PRF_NOHASSLE); - REMOVE_FLAG(PLR_FLAGS(victim), PRF_HOLYLIGHT); - REMOVE_FLAG(PLR_FLAGS(victim), PRF_SHOWVNUMS); - REMOVE_FLAG(PLR_FLAGS(victim), PRF_ROOMVIS); - REMOVE_FLAG(PLR_FLAGS(victim), PRF_ROOMVIS); + PRF_FLAGS(victim).reset(PRF_LOG1); + PLR_FLAGS(victim).reset(PRF_LOG2); + PRF_FLAGS(victim).reset(PRF_NOHASSLE); + PLR_FLAGS(victim).reset(PRF_HOLYLIGHT); + PLR_FLAGS(victim).reset(PRF_SHOWVNUMS); + PLR_FLAGS(victim).reset(PRF_ROOMVIS); + PLR_FLAGS(victim).reset(PRF_ROOMVIS); } else if (oldlevel < LVL_IMMORT && newlevel >= LVL_IMMORT) { - SET_FLAG(PRF_FLAGS(victim), PRF_HOLYLIGHT); - SET_FLAG(PRF_FLAGS(victim), PRF_SHOWVNUMS); - SET_FLAG(PRF_FLAGS(victim), PRF_AUTOEXIT); + PRF_FLAGS(victim).set(PRF_HOLYLIGHT); + PRF_FLAGS(victim).set(PRF_SHOWVNUMS); + PRF_FLAGS(victim).set(PRF_AUTOEXIT); for (i = 1; i <= MAX_SKILLS; i++) SET_SKILL(victim, i, 100); /* Make sure they have an empty olc zone list */ @@ -1361,7 +1362,7 @@ ACMD(do_name) { log(LogSeverity::Stat, LVL_IMMORT, "{} [{}] new player.", GET_NAME(d->character), d->host); } /* accept the players name */ - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_NAPPROVE); + PLR_FLAGS(d->character).reset(PLR_NAPPROVE); save_player_char(d->character); /* log the acceptance of the name */ @@ -1370,7 +1371,7 @@ ACMD(do_name) { /* remove the choose new name flag */ if (PLR_FLAGGED(d->character, PLR_NEWNAME)) - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_NEWNAME); + PLR_FLAGS(d->character).reset(PLR_NEWNAME); /* check if the player is waiting approval or already auto approved */ if (STATE(d) == CON_NAME_WAIT_APPROVAL) { @@ -1417,7 +1418,7 @@ ACMD(do_name) { send_to_xnames(GET_NAME(d->character)); string_to_output(d, "That name has been rejected, because it breaks this rule:\n"); string_to_output(d, "{}\n", reasons[choice]); - SET_FLAG(PLR_FLAGS(d->character), PLR_NEWNAME); + PLR_FLAGS(d->character).set(PLR_NEWNAME); if (STATE(d) == CON_NAME_WAIT_APPROVAL) { string_to_output(d, "Please try another name.\n"); string_to_output(d, "Name: "); @@ -1462,7 +1463,7 @@ ACMD(do_name) { break; default: break; /* maybe send an error to log here? */ - } /* end switch */ + } /* end switch */ } ACMD(do_zreset) { @@ -1566,7 +1567,6 @@ void do_wiztitle(char *outbuf, CharData *vict, char *argument) { ACMD(do_wizutil) { CharData *vict; - long result; one_argument(argument, arg); @@ -1594,23 +1594,23 @@ ACMD(do_wizutil) { char_printf(ch, "Your victim is not flagged.\n"); return; } - REMOVE_FLAG(PLR_FLAGS(vict), PLR_THIEF); - REMOVE_FLAG(PLR_FLAGS(vict), PLR_KILLER); + PLR_FLAGS(vict).reset(PLR_THIEF); + PLR_FLAGS(vict).reset(PLR_KILLER); char_printf(ch, "Pardoned.\n"); char_printf(vict, "You have been pardoned by the Gods!\n"); log(LogSeverity::Warn, std::max(LVL_GOD, GET_INVIS_LEV(ch)), "(GC) {} pardoned by {}", GET_NAME(vict), GET_NAME(ch)); break; case SCMD_NOTITLE: - result = PLR_TOG_CHK(vict, PLR_NOTITLE); + PLR_FLAGS(vict).flip(PLR_NOTITLE); log(LogSeverity::Stat, std::max(LVL_GOD, GET_INVIS_LEV(ch)), "(GC) Notitle {} for {} by {}.", - ONOFF(result), GET_NAME(vict), GET_NAME(ch)); + ONOFF(PLR_FLAGS(vict).test(PLR_NOTITLE)), GET_NAME(vict), GET_NAME(ch)); char_printf(ch, "\n"); break; case SCMD_SQUELCH: - result = PLR_TOG_CHK(vict, PLR_NOSHOUT); + PLR_FLAGS(vict).flip(PLR_NOSHOUT); log(LogSeverity::Warn, std::max(LVL_GOD, GET_INVIS_LEV(ch)), "(GC) Squelch {} for {} by {}.", - ONOFF(result), GET_NAME(vict), GET_NAME(ch)); + ONOFF(PLR_FLAGS(vict).test(PLR_NOTITLE)), GET_NAME(vict), GET_NAME(ch)); char_printf(ch, "\n"); break; case SCMD_FREEZE: @@ -1622,7 +1622,7 @@ ACMD(do_wizutil) { char_printf(ch, "Your victim is already pretty cold.\n"); return; } - SET_FLAG(PLR_FLAGS(vict), PLR_FROZEN); + PLR_FLAGS(vict).set(PLR_FROZEN); GET_FREEZE_LEV(vict) = GET_LEVEL(ch); char_printf( vict, "A bitter wind suddenly rises and drains every erg of heat from your body!\nYou feel frozen!\n"); @@ -1643,7 +1643,7 @@ ACMD(do_wizutil) { } log(LogSeverity::Warn, std::max(LVL_GOD, GET_INVIS_LEV(ch)), "(GC) {} un-frozen by {}.", GET_NAME(vict), GET_NAME(ch)); - REMOVE_FLAG(PLR_FLAGS(vict), PLR_FROZEN); + PLR_FLAGS(vict).reset(PLR_FROZEN); char_printf(vict, "A fireball suddenly explodes in front of you, melting the ice!\nYou feel thawed.\n"); char_printf(ch, "Thawed.\n"); act("A sudden fireball conjured from nowhere thaws $n!", false, vict, 0, 0, TO_ROOM); @@ -1700,9 +1700,9 @@ ACMD(do_wizutil) { #define SET_OR_REMOVE(flagset, flags) \ do { \ if (on) \ - SET_FLAG(flagset, flags); \ + flagset.set(flags); \ else if (off) \ - REMOVE_FLAG(flagset, flags); \ + flagset.reset(flags); \ } while (0) ACMD(do_set) { @@ -2882,8 +2882,8 @@ ACMD(do_rclone) { dest->description = strdup(src->description); if (src->name) dest->name = strdup(src->name); - if (src->room_flags) - for (i = 0; i < FLAGVECTOR_SIZE(NUM_ROOM_FLAGS); ++i) + if (src->room_flags.any()) + for (i = 0; i < src->room_flags.size(); ++i) dest->room_flags[i] = src->room_flags[i]; if (src->sector_type) dest->sector_type = src->sector_type; @@ -2923,7 +2923,7 @@ ACMD(do_terminate) { /* delete and purge */ if (GET_CLAN_MEMBERSHIP(victim)) revoke_clan_membership(GET_CLAN_MEMBERSHIP(victim)); - SET_FLAG(PLR_FLAGS(victim), PLR_DELETED); + PLR_FLAGS(victim).set(PLR_DELETED); save_player_char(victim); delete_player_obj_file(victim); if (victim->desc) { @@ -2986,7 +2986,6 @@ ACMD(do_pfilemaint) { /* 4 weeks base plus 3 days per level */ allowed_time = 28 + (player_table[i].level - 1) * 3; - bitfield = player_table[i].flags; /* assume no delete at first */ reason = 0; @@ -3013,10 +3012,10 @@ ACMD(do_pfilemaint) { reason = 7; else { /* don't del frozen players */ - if (IS_SET(bitfield, PINDEX_FROZEN)) + if (player_table[i].flags.test(PINDEX_FROZEN)) reason = 0; /* don't del players pending new name */ - if (IS_SET(bitfield, PINDEX_NEWNAME)) + if (player_table[i].flags.test(PINDEX_NEWNAME)) reason = 0; } diff --git a/src/act.wizinfo.cpp b/src/act.wizinfo.cpp index b7740b7c..8d4f06a9 100644 --- a/src/act.wizinfo.cpp +++ b/src/act.wizinfo.cpp @@ -211,10 +211,10 @@ void do_stat_room(CharData *ch, int rrnum) { resp += fmt::format("Zone: [{}], VNum: [{}{}{}], RNum: [{}], Sector: {}\n", rm->zone, CLR(ch, FGRN), rm->vnum, CLR(ch, ANRM), rrnum, buf2); - sprintflag(buf2, rm->room_flags, NUM_ROOM_FLAGS, room_bits); + sprintflag(buf2, rm->room_flags, room_bits); resp += fmt::format("SpecProc: {}, Flags: {}\n", (rm->func == nullptr) ? "None" : "Exists", buf2); - sprintflag(buf2, rm->room_effects, NUM_ROOM_EFF_FLAGS, room_effects); + sprintflag(buf2, rm->room_effects, room_effects); resp += fmt::format("Room effects: {}\n", buf2); resp += fmt::format("Ambient Light : {}\n", rm->light); @@ -261,7 +261,7 @@ void do_stat_room(CharData *ch, int rrnum) { sprintf(buf1, " %sNONE%s", CLR(ch, FCYN), CLR(ch, ANRM)); else sprintf(buf1, "%s%5d%s", CLR(ch, FCYN), world[rm->exits[i]->to_room].vnum, CLR(ch, ANRM)); - sprintbit(rm->exits[i]->exit_info, exit_bits, buf2); + sprintbit(rm->exits[i]->exit_info.to_ulong(), exit_bits, buf2); resp += fmt::format("Exit {}{:5}{}: To: [{}], Key: [{:5}], Keywrd: {}, Type: {}\n", CLR(ch, FCYN), dirs[i], CLR(ch, ANRM), buf1, rm->exits[i]->key, rm->exits[i]->keyword ? rm->exits[i]->keyword : "None", buf2); @@ -353,11 +353,11 @@ void do_stat_object(CharData *ch, ObjData *j) { sprintbit(j->obj_flags.wear_flags, wear_bits, buf1); resp += fmt::format("Can be worn on: {}{}{}\n", CLR(ch, FCYN), buf1, CLR(ch, ANRM)); - sprintflag(buf1, GET_OBJ_FLAGS(j), NUM_ITEM_FLAGS, extra_bits); + sprintflag(buf1, GET_OBJ_FLAGS(j), extra_bits); resp += fmt::format("Extra flags : {}{}{}\n", CLR(ch, FGRN), buf1, CLR(ch, ANRM)); *buf1 = '\0'; - sprintflag(buf1, GET_OBJ_EFF_FLAGS(j), NUM_EFF_FLAGS, effect_flags); + sprintflag(buf1, GET_OBJ_EFF_FLAGS(j), effect_flags); resp += fmt::format("Spell Effects : {}{}{}\n", CLR(ch, FYEL), buf1, CLR(ch, ANRM)); resp += @@ -727,14 +727,14 @@ void do_stat_character(CharData *ch, CharData *k) { /* Character flags. */ if (IS_NPC(k)) { - sprintflag(buf1, MOB_FLAGS(k), NUM_MOB_FLAGS, action_bits); + sprintflag(buf1, MOB_FLAGS(k), action_bits); resp += fmt::format("NPC flags: {}{}{}\n", CLR(ch, FCYN), buf1, CLR(ch, ANRM)); } else { - sprintflag(buf2, PLR_FLAGS(k), NUM_PLR_FLAGS, player_bits); + sprintflag(buf2, PLR_FLAGS(k), player_bits); resp += fmt::format("PLR: {}{}{}\n", CLR(ch, FCYN), buf2, CLR(ch, ANRM)); - sprintflag(buf2, PRF_FLAGS(k), NUM_PRF_FLAGS, preference_bits); + sprintflag(buf2, PRF_FLAGS(k), preference_bits); resp += fmt::format("PRF: {}{}{}\n", CLR(ch, FGRN), buf2, CLR(ch, ANRM)); - sprintflag(buf2, PRV_FLAGS(k), NUM_PRV_FLAGS, privilege_bits); + sprintflag(buf2, PRV_FLAGS(k), privilege_bits); resp += fmt::format("PRV: {}{}{}\n", CLR(ch, FGRN), buf2, CLR(ch, ANRM)); } @@ -805,7 +805,7 @@ void do_stat_character(CharData *ch, CharData *k) { k->cornered_by ? GET_NAME(k->cornered_by) : ""); /* Effect bitvectors */ - sprintflag(buf1, EFF_FLAGS(k), NUM_EFF_FLAGS, effect_flags); + sprintflag(buf1, EFF_FLAGS(k), effect_flags); resp += fmt::format("EFF: {}{}{}\n", CLR(ch, FYEL), buf1, CLR(ch, ANRM)); /* NPC spell circle status */ @@ -834,8 +834,8 @@ void do_stat_character(CharData *ch, CharData *k) { CLR(ch, ANRM)); if (eff->modifier) resp += fmt::format("{:+d} to {}", eff->modifier, apply_types[(int)eff->location]); - if (HAS_FLAGS(eff->flags, NUM_EFF_FLAGS)) { - sprintflag(buf1, eff->flags, NUM_EFF_FLAGS, effect_flags); + if (eff->flags.any()) { + sprintflag(buf1, eff->flags, effect_flags); resp += fmt::format("{}sets {}", eff->modifier ? ", " : "", buf1); } resp += "\n"; @@ -1151,13 +1151,11 @@ ACMD(do_players) { break; } - bitfield = player_table[i].flags; - - if (IS_SET(bitfield, PINDEX_FROZEN)) + if (player_table[i].flags.test(PINDEX_FROZEN)) color = FCYN; - else if (IS_SET(bitfield, PINDEX_NEWNAME)) + else if (player_table[i].flags.test(PINDEX_NEWNAME)) color = FRED; - else if (IS_SET(bitfield, PINDEX_NAPPROVE)) + else if (player_table[i].flags.test(PINDEX_NAPPROVE)) color = FYEL; else color = FGRN; @@ -1521,7 +1519,7 @@ void do_show_races(CharData *ch, char *argument) { compositions[race->def_composition].name, race->bonus_damroll, race->bonus_hitroll, race->mweight_lo, race->mweight_hi, race->fweight_lo, race->fweight_hi, race->mheight_lo, race->mheight_hi, race->fheight_lo, race->fheight_hi); - sprintflag(buf2, race->effect_flags, NUM_EFF_FLAGS, effect_flags); + sprintflag(buf2, race->effect_flags, effect_flags); resp += fmt::format( "Attribute Scales : Str Dex Int Wis Con Cha\n" " : @c{:3}% {:3}% {:3}% {:3}% {:3}% {:3}%@0\n" diff --git a/src/ai_utils.cpp b/src/ai_utils.cpp index 1ec40b19..6f425c06 100644 --- a/src/ai_utils.cpp +++ b/src/ai_utils.cpp @@ -137,10 +137,10 @@ int value_spell_effect(int flag) { } } -int value_spell_effects(flagvector flags[]) { +int value_spell_effects(EffectFlags flags) { int i, value = 0; for (i = 0; i < NUM_EFF_FLAGS; ++i) - if (IS_FLAGGED(flags, i)) + if (flags.test(i)) value += value_spell_effect(i); return value; } diff --git a/src/casting.cpp b/src/casting.cpp index b998ca28..97d20887 100644 --- a/src/casting.cpp +++ b/src/casting.cpp @@ -58,7 +58,7 @@ EVENTFUNC(room_undo_event) { room_printf( room, "&2The forest seems to come alive... Trees and shrubs move about, finally resting in different locations.&0\n"); - REMOVE_FLAG(ROOM_FLAGS(room), ROOM_ALT_EXIT); + ROOM_FLAGS(room).reset(ROOM_ALT_EXIT); return EVENT_FINISHED; } @@ -124,7 +124,7 @@ EVENTFUNC(delayed_cast_event) { /* Set REMOTE_AGGR flag so that aggr_lose_spells() won't take * off invis, etc. */ - SET_FLAG(EFF_FLAGS(ch), EFF_REMOTE_AGGR); + EFF_FLAGS(ch).set(EFF_REMOTE_AGGR); if (IS_SET(routines, MAG_DAMAGE)) mag_damage(skill, ch, victim, spellnum, savetype); @@ -132,7 +132,6 @@ EVENTFUNC(delayed_cast_event) { if (victim && DECEASED(victim)) { wait = EVENT_FINISHED; } else { - if (IS_SET(routines, MAG_AFFECT)) mag_affect(skill, ch, victim, spellnum, savetype, CAST_SPELL); @@ -159,7 +158,7 @@ EVENTFUNC(delayed_cast_event) { if (IS_SET(SINFO.routines, MAG_MANUAL)) { if (spellnum == SPELL_PYRE && wait == EVENT_FINISHED) - SET_FLAG(EFF_FLAGS(ch), EFF_ON_FIRE); + EFF_FLAGS(ch).set(EFF_ON_FIRE); switch (spellnum) { case SPELL_PYRE: spell_pyre_recur(spellnum, skill, ch, victim, nullptr, savetype); @@ -176,7 +175,7 @@ EVENTFUNC(delayed_cast_event) { if (SINFO.violent && ch && victim && attack_ok(victim, ch, false)) set_fighting(victim, ch, false); } - REMOVE_FLAG(EFF_FLAGS(ch), EFF_REMOTE_AGGR); + EFF_FLAGS(ch).reset(EFF_REMOTE_AGGR); return wait; } diff --git a/src/clan.cpp b/src/clan.cpp index 7e03793c..610017aa 100644 --- a/src/clan.cpp +++ b/src/clan.cpp @@ -199,9 +199,9 @@ CLANCMD(clan_set) { clan->ranks[clan->rank_count - 1].title = strdup("Member"); for (i = 0; i < NUM_CLAN_PRIVS; ++i) if (clan_privileges[i].default_on) - SET_FLAG(clan->ranks[clan->rank_count - 1].privileges, i); + clan->ranks[clan->rank_count - 1].privileges.set(i); else - REMOVE_FLAG(clan->ranks[clan->rank_count - 1].privileges, i); + clan->ranks[clan->rank_count - 1].privileges.reset(i); char_printf(ch, "You add a new rank ({}) to {}.\n", clan->rank_count, clan->name); clan_notification(clan, ch, "%s adds a new rank to your clan.", GET_NAME(ch)); @@ -443,9 +443,9 @@ CLANCMD(clan_create) { clan->ranks[0].title = strdup("Leader"); clan->ranks[1].title = strdup("Member"); for (i = 0; i < NUM_CLAN_PRIVS; ++i) { - SET_FLAG(clan->ranks[0].privileges, i); + clan->ranks[0].privileges.set(i); if (clan_privileges[i].default_on) - SET_FLAG(clan->ranks[1].privileges, i); + clan->ranks[1].privileges.set(i); } clan->people_count = 0; @@ -617,15 +617,15 @@ CLANCMD(clan_priv) { } if (action == GRANT) { - if (IS_FLAGGED(clan->ranks[rank - 1].privileges, priv)) + if (clan->ranks[rank - 1].privileges.test(priv)) char_printf(ch, "Rank {} already has the {} privilege.\n", rank, clan_privileges[priv].desc); else { - SET_FLAG(clan->ranks[rank - 1].privileges, priv); + clan->ranks[rank - 1].privileges.set(priv); char_printf(ch, "Granted rank {} access to the {} privilege.\n", rank, clan_privileges[priv].desc); } } else if (action == REVOKE) { - if (IS_FLAGGED(clan->ranks[rank - 1].privileges, priv)) { - REMOVE_FLAG(clan->ranks[rank - 1].privileges, priv); + if (clan->ranks[rank - 1].privileges.test(priv)) { + clan->ranks[rank - 1].privileges.reset(priv); char_printf(ch, "Revoked rank {} access to the {} privilege.\n", rank, clan_privileges[priv].desc); } else char_printf(ch, "Rank {} doesn't have the {} privilege.\n", rank, clan_privileges[priv].desc); @@ -678,8 +678,8 @@ static void show_clan_info(CharData *ch, const Clan *clan) { for (i = 0; i < NUM_CLAN_PRIVS; ++i) { paging_printf(ch, "\n{:<9}", clan_privileges[i].abbr); for (j = 0; j < clan->rank_count; ++j) - paging_printf(ch, " {}{}" ANRM, IS_FLAGGED(clan->ranks[j].privileges, i) ? AFGRN : AFRED, - IS_FLAGGED(clan->ranks[j].privileges, i) ? 'Y' : 'N'); + paging_printf(ch, " {}{}" ANRM, clan->ranks[j].privileges.test(i) ? AFGRN : AFRED, + clan->ranks[j].privileges.test(i) ? 'Y' : 'N'); } paging_printf(ch, "\n"); } @@ -735,7 +735,7 @@ static void show_clan_member_status(CharData *ch, CharData *tch) { paging_printf(ch, " Rank: Applicant\n"); paging_printf(ch, " Member since: {}\n", buf); if (IS_CLAN_MEMBER(tch)) { - if (HAS_FLAGS(GET_CLAN(tch)->ranks[GET_CLAN_RANK(tch) - 1].privileges, NUM_CLAN_PRIVS)) { + if (GET_CLAN(tch)->ranks[GET_CLAN_RANK(tch) - 1].privileges.any()) { ScreenBuf *sb = new_screen_buf(); int i, seen = 0; const size_t len = strlen(" Privileges: "); diff --git a/src/clansys.cpp b/src/clansys.cpp index a8fbe363..16a6ed84 100644 --- a/src/clansys.cpp +++ b/src/clansys.cpp @@ -247,7 +247,7 @@ bool load_clan(const char *clan_num, Clan *clan) { for (i = 0; i < NUM_CLAN_PRIVS; ++i) if (!strcasecmp(clan_privileges[i].abbr, buf1)) { clan->rank_count = std::max(clan->rank_count, num); - SET_FLAG(clan->ranks[num - 1].privileges, i); + clan->ranks[num - 1].privileges.set(i); break; } if (i >= NUM_CLAN_PRIVS) @@ -410,7 +410,7 @@ static void perform_save_clan(const Clan *clan) { fprintf(fl, "title: %u %s\n", i + 1, clan->ranks[i].title); fprintf(fl, "privilege: %u", i + 1); for (j = 0; j < NUM_CLAN_PRIVS; ++j) - if (IS_FLAGGED(clan->ranks[i].privileges, j)) + if (clan->ranks[i].privileges.test(j)) fprintf(fl, " %s", clan_privileges[j].abbr); fprintf(fl, "\n"); } diff --git a/src/class.cpp b/src/class.cpp index 82eea775..0eb07d33 100644 --- a/src/class.cpp +++ b/src/class.cpp @@ -907,19 +907,15 @@ ClassDef classes[NUM_CLASSES] = { const int common_newbie_eq[] = {18, 19, 20, 23, 3090, 299, -1}; -static flagvector class_effects_mask[FLAGVECTOR_SIZE(NUM_EFF_FLAGS)]; void init_classes(void) { -#define PERM_EFF(c, f) SET_FLAG(classes[(c)].effect_flags, (f)) - - PERM_EFF(CLASS_PRIEST, EFF_DETECT_ALIGN); - PERM_EFF(CLASS_DIABOLIST, EFF_DETECT_ALIGN); - PERM_EFF(CLASS_PALADIN, EFF_DETECT_ALIGN); - PERM_EFF(CLASS_PALADIN, EFF_PROTECT_EVIL); - PERM_EFF(CLASS_ANTI_PALADIN, EFF_DETECT_ALIGN); - PERM_EFF(CLASS_ANTI_PALADIN, EFF_PROTECT_GOOD); - PERM_EFF(CLASS_RANGER, EFF_FARSEE); - -#undef PERM_EFF + // Add Permanent Effects to Classes + classes[CLASS_PRIEST].effect_flags.set(EFF_DETECT_ALIGN); + classes[CLASS_DIABOLIST].effect_flags.set(EFF_DETECT_ALIGN); + classes[CLASS_PALADIN].effect_flags.set(EFF_DETECT_ALIGN); + classes[CLASS_PALADIN].effect_flags.set(EFF_PROTECT_EVIL); + classes[CLASS_ANTI_PALADIN].effect_flags.set(EFF_DETECT_ALIGN); + classes[CLASS_ANTI_PALADIN].effect_flags.set(EFF_PROTECT_GOOD); + classes[CLASS_RANGER].effect_flags.set(EFF_FARSEE); } /* parse_class @@ -1298,8 +1294,7 @@ int level_max_skill(CharData *ch, int level, int skill) { int return_max_skill(CharData *ch, int skill) { return level_max_skill(ch, GET_LEVEL(ch), skill); } -void init_char_class(CharData *ch) { /* Nothing much to do here. */ -} +void init_char_class(CharData *ch) { /* Nothing much to do here. */ } void update_char_class(CharData *ch) { if (!VALID_CLASS(ch)) { @@ -1308,11 +1303,8 @@ void update_char_class(CharData *ch) { return; } - /* Any bits that might get set below should be cleared here first. */ - REMOVE_FLAGS(EFF_FLAGS(ch), class_effects_mask, NUM_EFF_FLAGS); - /* Reset effect flags for this race */ - SET_FLAGS(EFF_FLAGS(ch), classes[(int)GET_CLASS(ch)].effect_flags, NUM_EFF_FLAGS); + EFF_FLAGS(ch) = classes[(int)GET_CLASS(ch)].effect_flags; } /* @@ -1476,7 +1468,7 @@ void advance_level(CharData *ch, enum level_action action) { GET_COND(ch, FULL) = (char)-1; GET_COND(ch, THIRST) = (char)-1; GET_COND(ch, DRUNK) = (char)-1; - SET_FLAG(PRF_FLAGS(ch), PRF_HOLYLIGHT); + PRF_FLAGS(ch).set(PRF_HOLYLIGHT); } /* Modify clan power */ diff --git a/src/comm.cpp b/src/comm.cpp index 64991af0..53fd4ab7 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -138,7 +138,7 @@ void boot_world(void); void zone_update(void); void effect_update(void); /* In spells.c */ void point_update(void); /* In limits.c */ -void sick_update(void); /* In limits.c */ +void sick_update(void); /* In limits.c */ void mobile_activity(void); void mobile_spec_activity(void); void string_add(DescriptorData *d, char *str); @@ -248,7 +248,6 @@ int main(int argc, char **argv) { } log("Initializing runtime game constants."); - init_flagvectors(); // init_rules(); init_races(); init_classes(); @@ -337,8 +336,8 @@ void hotboot_recover() { if ((player_i = load_player(name, d->character)) >= 0) { if (!PLR_FLAGGED(d->character, PLR_DELETED)) { - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_WRITING); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_MAILING); + PLR_FLAGS(d->character).reset(PLR_WRITING); + PLR_FLAGS(d->character).reset(PLR_MAILING); } else fOld = false; } else @@ -1163,12 +1162,12 @@ void handle_telopt_request(DescriptorData *d, char *txt) { d->character->player_specials->client = txt; if (supports_ansi(txt)) { - SET_FLAG(PRF_FLAGS(d->character), PRF_COLOR_1); - SET_FLAG(PRF_FLAGS(d->character), PRF_COLOR_2); + PRF_FLAGS(d->character).set(PRF_COLOR_1); + PRF_FLAGS(d->character).set(PRF_COLOR_2); write_to_descriptor(d->descriptor, "Color is on.\r\n"); } else { - REMOVE_FLAG(PRF_FLAGS(d->character), PRF_COLOR_1); - REMOVE_FLAG(PRF_FLAGS(d->character), PRF_COLOR_2); + PRF_FLAGS(d->character).reset(PRF_COLOR_1); + PRF_FLAGS(d->character).reset(PRF_COLOR_2); write_to_descriptor(d->descriptor, "Color is off.\r\n"); } if ((get_build_number() >= 0)) { @@ -2303,7 +2302,7 @@ void close_socket(DescriptorData *d) { d->backstr = nullptr; d->str = nullptr; if (d->character) - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_WRITING); + PLR_FLAGS(d->character).reset(PLR_WRITING); d->connected = CON_PLAYING; break; default: diff --git a/src/commands.cpp b/src/commands.cpp index c7281f55..43277347 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -43,7 +43,7 @@ CommandGroupInfo *grp_info; * Private interface */ #define VALID_GROUP_NUM(gg) ((gg) >= cmd_groups && (gg) < top_of_cmd_groups) -#define GROUP_NUM(gg) ((gg)-cmd_groups) +#define GROUP_NUM(gg) ((gg) - cmd_groups) static void gedit_setup_existing(DescriptorData *d, int group); static void gedit_setup_new(DescriptorData *d); static void gedit_save_internally(DescriptorData *d); @@ -93,9 +93,9 @@ bool can_use_command(CharData *ch, int cmd) { return false; else if (IS_NPC(ch)) return CMD_USEABLE_FOR_LEVEL(ch, cmd); - else if (IS_FLAGGED(GET_GRANT_CACHE(ch), cmd)) + else if (GET_GRANT_CACHE(ch)[cmd]) return true; - else if (IS_FLAGGED(GET_REVOKE_CACHE(ch), cmd)) + else if (GET_REVOKE_CACHE(ch)[cmd]) return false; else return CMD_USEABLE_FOR_LEVEL(ch, cmd); @@ -148,7 +148,7 @@ ACMD(do_gedit) { STATE(d) = CON_GEDIT; act("$n starts using OLC.", true, d->character, 0, 0, TO_ROOM); - SET_FLAG(PLR_FLAGS(ch), PLR_WRITING); + PLR_FLAGS(ch).set(PLR_WRITING); } static void gedit_setup_existing(DescriptorData *d, int group) { diff --git a/src/cooldowns.cpp b/src/cooldowns.cpp index eba5c8cb..d6104f0b 100644 --- a/src/cooldowns.cpp +++ b/src/cooldowns.cpp @@ -15,12 +15,11 @@ #include "comm.hpp" #include "conf.hpp" #include "fight.hpp" +#include "logging.hpp" #include "skills.hpp" #include "structs.hpp" #include "sysdep.hpp" #include "utils.hpp" -#include "logging.hpp" - const char *cooldowns[NUM_COOLDOWNS + 1] = {"backstab", "bash", @@ -101,7 +100,7 @@ EVENTFUNC(cooldown_handler) { if (found) return PULSE_COOLDOWN; - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_COOLDOWN); + GET_EVENT_FLAGS(ch).reset(EVENT_COOLDOWN); return EVENT_FINISHED; } @@ -110,7 +109,7 @@ void SET_COOLDOWN(CharData *ch, int type, int amount) { GET_COOLDOWN_MAX(ch, type) = amount; if (amount && !EVENT_FLAGGED(ch, EVENT_COOLDOWN)) { - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_COOLDOWN); + GET_EVENT_FLAGS(ch).set(EVENT_COOLDOWN); event_create(EVENT_COOLDOWN, cooldown_handler, ch, false, &ch->events, PULSE_COOLDOWN); } } diff --git a/src/corpse_save.cpp b/src/corpse_save.cpp index 74d37b9a..ae14d818 100644 --- a/src/corpse_save.cpp +++ b/src/corpse_save.cpp @@ -175,7 +175,7 @@ static ObjData *load_corpse(int id) { /* Ensure that the items inside aren't marked for decomposition. */ stop_decomposing(containers[0]); /* And mark the corpse itself as decomposing. */ - SET_FLAG(GET_OBJ_FLAGS(containers[0]), ITEM_DECOMP); + GET_OBJ_FLAGS(containers[0]).set(ITEM_DECOMP); return containers[0]; } diff --git a/src/db.cpp b/src/db.cpp index fa20f6a7..3fa41256 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -416,7 +416,7 @@ int get_copper(int i) return 0; /*copper calculations */ - copper = (random_number(1, 150)) * mob_proto[i].player.level; + copper = random_number(1, 150) * mob_proto[i].player.level; sfactor = (int)((sfactor + cfactor + zfactor) / 3); copper = (int)((float)((sfactor / 100.0) * copper)); @@ -557,7 +557,7 @@ void boot_db(void) { log(" Skills."); init_skills(); - + log("Assigning skills and spells to classes."); assign_class_skills(); @@ -1134,8 +1134,7 @@ void parse_room(FILE *fl, int virtual_nr) { exit(1); } /* t[0] is the zone number; ignored with the zone-file system */ - /* room_flags is a flagvector array */ - world[room_nr].room_flags[0] = asciiflag_conv(flags); + world[room_nr].room_flags = RoomFlags(asciiflag_conv(flags)); world[room_nr].sector_type = t[2]; world[room_nr].func = nullptr; @@ -1260,7 +1259,7 @@ void renum_world(void) { #define ZCMD zone_table[zone].cmd[cmd_no] -/* resulve vnums into rnums in the zone reset tables */ +/* resolve vnums into rnums in the zone reset tables */ void renum_zone_table(void) { int zone, cmd_no, a, b; @@ -1614,7 +1613,7 @@ void parse_mobile(FILE *mob_f, int nr) { get_line(mob_f, line); sscanf(line, "%s %s %d %c", f1, f2, t + 2, &letter); MOB_FLAGS(mob_proto + i)[0] = asciiflag_conv(f1); - SET_FLAG(MOB_FLAGS(mob_proto + i), MOB_ISNPC); + MOB_FLAGS(mob_proto + i).set(MOB_ISNPC); EFF_FLAGS(mob_proto + i)[0] = asciiflag_conv(f2); GET_ALIGNMENT(mob_proto + i) = t[2]; @@ -1714,7 +1713,7 @@ void init_obj_proto(ObjData *obj) { break; case ITEM_KEY: /* Prevent keys from being rented. */ - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_NORENT); + GET_OBJ_FLAGS(obj).set(ITEM_NORENT); break; case ITEM_SCROLL: verify_obj_spell(obj, VAL_SCROLL_SPELL_1, false); @@ -1736,7 +1735,7 @@ void init_obj_proto(ObjData *obj) { } /* Remove flags we don't want on prototypes */ - REMOVE_FLAG(GET_OBJ_FLAGS(obj), ITEM_WAS_DISARMED); + GET_OBJ_FLAGS(obj).reset(ITEM_WAS_DISARMED); } /* read all objects from obj file; generate index and prototypes */ @@ -2650,11 +2649,6 @@ void free_char(CharData *ch) { if (GET_HOST(ch)) free(GET_HOST(ch)); - if (GET_GRANT_CACHE(ch)) - free(GET_GRANT_CACHE(ch)); - if (GET_REVOKE_CACHE(ch)) - free(GET_REVOKE_CACHE(ch)); - free(ch->player_specials); } @@ -2788,7 +2782,7 @@ void reset_char(CharData *ch) { for (i = 0; i < NUM_WEARS; i++) GET_EQ(ch, i) = nullptr; - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_MEDITATE); CONSENT(ch) = nullptr; ch->scribe_list = nullptr; ch->followers = nullptr; diff --git a/src/dg_mobcmd.cpp b/src/dg_mobcmd.cpp index 0a4a7d2f..3a331f95 100644 --- a/src/dg_mobcmd.cpp +++ b/src/dg_mobcmd.cpp @@ -1151,9 +1151,9 @@ ACMD(do_mroomflag) { return; } else { if (!strcasecmp(argument, "on")) - SET_FLAG(ROOM_FLAGS(target), flag); + ROOM_FLAGS(target).set(flag); else if (!strcasecmp(argument, "off")) - REMOVE_FLAG(ROOM_FLAGS(target), flag); + ROOM_FLAGS(target).reset(flag); } } @@ -1190,9 +1190,9 @@ ACMD(do_mobjflag) { return; } else { if (!strcasecmp(argument, "on")) - SET_FLAG(GET_OBJ_FLAGS(obj), flag); + GET_OBJ_FLAGS(obj).set(flag); else if (!strcasecmp(argument, "off")) - REMOVE_FLAG(GET_OBJ_FLAGS(obj), flag); + GET_OBJ_FLAGS(obj).reset(flag); } } @@ -1233,9 +1233,9 @@ ACMD(do_mmobflag) { return; } else { if (!strcasecmp(argument, "on")) - SET_FLAG(MOB_FLAGS(victim), flag); + MOB_FLAGS(victim).set(flag); else if (!strcasecmp(argument, "off")) - REMOVE_FLAG(MOB_FLAGS(victim), flag); + MOB_FLAGS(victim).reset(flag); } } } \ No newline at end of file diff --git a/src/dg_scripts.cpp b/src/dg_scripts.cpp index cbb47b0f..2cf614b9 100644 --- a/src/dg_scripts.cpp +++ b/src/dg_scripts.cpp @@ -1228,12 +1228,12 @@ void find_replacement(void *go, ScriptData *sc, TrigData *trig, int type, char * else if (!strcasecmp(field, "flags")) { *str = '\0'; if (IS_NPC(c)) /* ACT flags */ - sprintflag(str, MOB_FLAGS(c), NUM_MOB_FLAGS, action_bits); + sprintflag(str, MOB_FLAGS(c), action_bits); else { /* concatenation of PLR and PRF flags */ - if (HAS_FLAGS(PLR_FLAGS(c), NUM_PLR_FLAGS) || !HAS_FLAGS(PRF_FLAGS(c), NUM_PRF_FLAGS)) - sprintflag(str, PLR_FLAGS(c), NUM_PLR_FLAGS, player_bits); - if (HAS_FLAGS(PRF_FLAGS(c), NUM_PRF_FLAGS)) - sprintflag(str + strlen(str), PRF_FLAGS(c), NUM_PRF_FLAGS, preference_bits); + if (PLR_FLAGS(c).any() || !PRF_FLAGS(c).any()) + sprintflag(str, PLR_FLAGS(c), player_bits); + if (PRF_FLAGS(c).any()) + sprintflag(str + strlen(str), PRF_FLAGS(c), preference_bits); } } else if (!strcasecmp(field, "flagged")) { if (IS_NPC(c)) { @@ -1256,7 +1256,7 @@ void find_replacement(void *go, ScriptData *sc, TrigData *trig, int type, char * } } } else if (!strcasecmp(field, "aff_flags") || !strcasecmp(field, "eff_flags")) - sprintflag(str, EFF_FLAGS(c), NUM_EFF_FLAGS, effect_flags); + sprintflag(str, EFF_FLAGS(c), effect_flags); else if (!strcasecmp(field, "aff_flagged") || !strcasecmp(field, "eff_flagged")) { if ((num = search_block(value, effect_flags, false)) >= 0) @@ -1539,7 +1539,7 @@ void find_replacement(void *go, ScriptData *sc, TrigData *trig, int type, char * /* Flags */ else if (!strcasecmp(field, "flags")) - sprintflag(str, GET_OBJ_FLAGS(o), NUM_ITEM_FLAGS, extra_bits); + sprintflag(str, GET_OBJ_FLAGS(o), extra_bits); else if (!strcasecmp(field, "flagged")) { if ((num = search_block(value, extra_bits, false)) >= 0) strcpy(str, OBJ_FLAGGED(o, num) ? "1" : "0"); @@ -1549,7 +1549,7 @@ void find_replacement(void *go, ScriptData *sc, TrigData *trig, int type, char * script_log(trig, buf2); } } else if (!strcasecmp(field, "spells")) - sprintflag(str, GET_OBJ_EFF_FLAGS(o), NUM_EFF_FLAGS, effect_flags); + sprintflag(str, GET_OBJ_EFF_FLAGS(o), effect_flags); else if (!strcasecmp(field, "has_spell")) { if ((num = search_block(value, effect_flags, false)) >= 0) @@ -1619,20 +1619,20 @@ void find_replacement(void *go, ScriptData *sc, TrigData *trig, int type, char * strcpy(str, r->light > 0 ? "1" : "0"); else if (!strcasecmp(field, "flags")) - sprintflag(str, r->room_flags, NUM_ROOM_FLAGS, room_bits); + sprintflag(str, r->room_flags, room_bits); else if (!strcasecmp(field, "flagged")) { if ((num = search_block(value, room_bits, false)) >= 0) - strcpy(str, IS_FLAGGED(r->room_flags, num) ? "1" : "0"); + strcpy(str, r->room_flags.test(num) ? "1" : "0"); else { strcpy(str, "0"); sprintf(buf2, "unrecognized room flag '%s' to %%%s.flagged%%", value, var); script_log(trig, buf2); } } else if (!strcasecmp(field, "effects") || !strcasecmp(field, "affects")) - sprintflag(str, r->room_effects, NUM_ROOM_EFF_FLAGS, room_effects); + sprintflag(str, r->room_effects, room_effects); else if (!strcasecmp(field, "has_effect") || !strcasecmp(field, "has_affect")) { if ((num = search_block(value, room_effects, false)) >= 0) - strcpy(str, IS_FLAGGED(r->room_effects, num) ? "1" : "0"); + strcpy(str, r->room_effects.test(num) ? "1" : "0"); else { strcpy(str, "0"); sprintf(buf2, "unrecognized room effect flag '%s' to %%%s.has_effect%%", value, var); @@ -1696,7 +1696,7 @@ void find_replacement(void *go, ScriptData *sc, TrigData *trig, int type, char * } else if (!strcasecmp(value, "key")) /* %room.DIR[key]% */ sprintf(str, "%d", r->exits[num]->key); else if (!strcasecmp(value, "bits")) /* %room.DIR[bits]% */ - sprintbit(r->exits[num]->exit_info, exit_bits, str); + sprintbit(r->exits[num]->exit_info.to_ulong(), exit_bits, str); else *str = '\0'; } diff --git a/src/dg_wldcmd.cpp b/src/dg_wldcmd.cpp index 30bd6f4e..955fcd15 100644 --- a/src/dg_wldcmd.cpp +++ b/src/dg_wldcmd.cpp @@ -624,7 +624,7 @@ WCMD(do_wrent) { if (PLR_FLAGGED(ch, PLR_MEDITATE)) { act("$N ceases $s meditative trance.", true, ch, 0, 0, TO_ROOM); char_printf(ch, "You stop meditating.\n&0"); - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_MEDITATE); } log(LogSeverity::Stat, LVL_IMMORT, "{} rented by trigger {:d} in {} ({:d}).", GET_NAME(ch), GET_TRIG_VNUM(t), diff --git a/src/events.cpp b/src/events.cpp index 820d9f9e..bf486f34 100644 --- a/src/events.cpp +++ b/src/events.cpp @@ -114,7 +114,7 @@ EVENTFUNC(battle_paralysis_handler) { eff.modifier = 0; eff.location = 0; eff.duration = 2; - SET_FLAG(eff.flags, EFF_MINOR_PARALYSIS); + eff.flags.set(EFF_MINOR_PARALYSIS); effect_to_char(vict, &eff); return EVENT_FINISHED; @@ -341,7 +341,7 @@ EVENTFUNC(falltoground_event) { act("$n falls to the ground.", false, ch, 0, 0, TO_ROOM); } alter_pos(ch, POS_STANDING, GET_STANCE(ch)); - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_FALLTOGROUND); + GET_EVENT_FLAGS(ch).reset(EVENT_FALLTOGROUND); return EVENT_FINISHED; } diff --git a/src/exits.cpp b/src/exits.cpp index c4902017..d6c5e873 100644 --- a/src/exits.cpp +++ b/src/exits.cpp @@ -14,13 +14,12 @@ #include "db.hpp" #include "directions.hpp" #include "handler.hpp" +#include "logging.hpp" #include "math.hpp" #include "rooms.hpp" #include "structs.hpp" #include "sysdep.hpp" #include "utils.hpp" -#include "logging.hpp" - const char *cmd_door[] = {"open", "close", "unlock", "lock", "pick"}; @@ -67,7 +66,7 @@ const char *exit_dest_desc(Exit *e) { if (!e) return ""; - if (e->exit_info & EX_DESCRIPT) { + if (e->exit_info.test(EX_DESCRIPT)) { len = strlen(e->general_description); for (nlpos = 0; nlpos < len; nlpos++) if (e->general_description[nlpos] == '\r' || e->general_description[nlpos] == '\n') { diff --git a/src/fight.cpp b/src/fight.cpp index 2e360e26..05d5ad1a 100644 --- a/src/fight.cpp +++ b/src/fight.cpp @@ -530,7 +530,7 @@ void check_killer(CharData *ch, CharData *vict) { if (!PLR_FLAGGED(vict, PLR_KILLER) && !PLR_FLAGGED(vict, PLR_THIEF) && !PLR_FLAGGED(ch, PLR_KILLER) && !IS_NPC(ch) && !IS_NPC(vict) && (ch != vict)) { - SET_FLAG(PLR_FLAGS(ch), PLR_KILLER); + PLR_FLAGS(ch).set(PLR_KILLER); log(LogSeverity::Warn, LVL_IMMORT, "PC Killer bit set on {} for initiating attack on {} at {}.", GET_NAME(ch), GET_NAME(vict), world[vict->in_room].name); char_printf(ch, "If you want to be a PLAYER KILLER, so be it...\n"); @@ -653,7 +653,7 @@ ObjData *make_corpse(CharData *ch, CharData *killer) { corpse->short_description = strdup(buf2); GET_OBJ_TYPE(corpse) = ITEM_CONTAINER; - SET_FLAG(GET_OBJ_FLAGS(corpse), ITEM_FLOAT); + GET_OBJ_FLAGS(corpse).set(ITEM_FLOAT); /* You can't store stuff in a corpse */ GET_OBJ_VAL(corpse, VAL_CONTAINER_CAPACITY) = 0; @@ -718,7 +718,7 @@ ObjData *make_corpse(CharData *ch, CharData *killer) { /* Ensure that the items inside aren't marked for decomposition. */ stop_decomposing(corpse); /* And mark the corpse itself as decomposing. */ - SET_FLAG(GET_OBJ_FLAGS(corpse), ITEM_DECOMP); + GET_OBJ_FLAGS(corpse).set(ITEM_DECOMP); obj_to_room(corpse, ch->in_room); if (!IS_NPC(ch)) { @@ -958,11 +958,11 @@ void die(CharData *ch, CharData *killer) { } if (EFF_FLAGGED(ch, EFF_ON_FIRE)) - REMOVE_FLAG(EFF_FLAGS(ch), EFF_ON_FIRE); + EFF_FLAGS(ch).reset(EFF_ON_FIRE); if (!IS_NPC(ch)) { - REMOVE_FLAG(PLR_FLAGS(ch), PLR_KILLER); - REMOVE_FLAG(PLR_FLAGS(ch), PLR_THIEF); + PLR_FLAGS(ch).reset(PLR_KILLER); + PLR_FLAGS(ch).reset(PLR_THIEF); GET_COND(ch, THIRST) = 24; GET_COND(ch, FULL) = 24; GET_COND(ch, DRUNK) = 0; @@ -1653,7 +1653,7 @@ int damage(CharData *ch, CharData *victim, int dam, int attacktype) { act("Your blow disrupts the magic keeping $N frozen.", false, ch, 0, victim, TO_CHAR); effect_from_char(victim, SPELL_MINOR_PARALYSIS); effect_from_char(victim, SPELL_ENTANGLE); - REMOVE_FLAG(EFF_FLAGS(victim), EFF_MINOR_PARALYSIS); + EFF_FLAGS(victim).reset(EFF_MINOR_PARALYSIS); } if (EFF_FLAGGED(victim, EFF_MESMERIZED)) { @@ -1661,7 +1661,7 @@ int damage(CharData *ch, CharData *victim, int dam, int attacktype) { act("$n attacks, jolting you out of your reverie!", false, ch, 0, victim, TO_VICT); act("You drew $N's attention from whatever $E was pondering.", false, ch, 0, victim, TO_CHAR); effect_from_char(victim, SPELL_MESMERIZE); - REMOVE_FLAG(EFF_FLAGS(victim), EFF_MESMERIZED); + EFF_FLAGS(victim).reset(EFF_MESMERIZED); } if (!pk_allowed) @@ -2147,12 +2147,12 @@ void hit(CharData *ch, CharData *victim, int type) { if (type == SKILL_KICK) { act(EVASIONCLR "Your foot passes harmlessly through $N" EVASIONCLR "!&0", false, ch, 0, victim, TO_CHAR); act(EVASIONCLR "$n&7&b sends $s foot whistling right through $N" EVASIONCLR ".&0", false, ch, 0, victim, - TO_NOTVICT); + TO_NOTVICT); act(EVASIONCLR "$n" EVASIONCLR " tries to kick you, but $s foot passes through you harmlessly.&0", false, - ch, 0, victim, TO_VICT); + ch, 0, victim, TO_VICT); } else damage_evasion_message(ch, victim, weapon, dtype); - + set_fighting(victim, ch, true); /* Process Triggers - added here so they still process even if the attack is evaded */ @@ -2179,9 +2179,9 @@ void hit(CharData *ch, CharData *victim, int type) { * Some skills don't get a chance for riposte, parry, and dodge, * so short-circuit those function calls here. */ - else if (type == SKILL_BACKSTAB || type == SKILL_2BACK || type == SKILL_BAREHAND || type == SKILL_KICK || no_defense_check || - EFF_FLAGGED(ch, EFF_FIREHANDS) || EFF_FLAGGED(ch, EFF_ICEHANDS) || EFF_FLAGGED(ch, EFF_LIGHTNINGHANDS) || - EFF_FLAGGED(ch, EFF_ACIDHANDS) || + else if (type == SKILL_BACKSTAB || type == SKILL_2BACK || type == SKILL_BAREHAND || type == SKILL_KICK || + no_defense_check || EFF_FLAGGED(ch, EFF_FIREHANDS) || EFF_FLAGGED(ch, EFF_ICEHANDS) || + EFF_FLAGGED(ch, EFF_LIGHTNINGHANDS) || EFF_FLAGGED(ch, EFF_ACIDHANDS) || (!riposte(ch, victim) && !parry(ch, victim) && !dodge(ch, victim) && (!weapon || !weapon_special(weapon, ch)))) { /* @@ -2230,7 +2230,7 @@ void hit(CharData *ch, CharData *victim, int type) { } else if (type == SKILL_KICK) { dam += (GET_SKILL(ch, SKILL_KICK) / 2); dam += stat_bonus[GET_DEX(ch)].todam; - + } else if (type == SKILL_BAREHAND || EFF_FLAGGED(ch, EFF_FIREHANDS) || EFF_FLAGGED(ch, EFF_ICEHANDS) || EFF_FLAGGED(ch, EFF_LIGHTNINGHANDS) || EFF_FLAGGED(ch, EFF_ACIDHANDS)) dam += GET_SKILL(ch, SKILL_BAREHAND) / 4 + random_number(1, GET_LEVEL(ch) / 3) + (GET_LEVEL(ch) / 2); @@ -2462,7 +2462,7 @@ void pickup_dropped_weapon(CharData *ch) { else act("$n eagerly reaches for $p.", false, ch, obj, 0, TO_ROOM); - REMOVE_FLAG(GET_OBJ_FLAGS(obj), ITEM_WAS_DISARMED); + GET_OBJ_FLAGS(obj).reset(ITEM_WAS_DISARMED); strncpy(arg, obj->name, sizeof(arg) - 1); do_wield(ch, arg, 0, 0); diff --git a/src/graph.cpp b/src/graph.cpp index 157fa150..c49af2b8 100644 --- a/src/graph.cpp +++ b/src/graph.cpp @@ -265,12 +265,12 @@ EVENTFUNC(track_delayed_event) { track = track_event->track; if (!event_target_valid(ch) || !event_target_valid(victim)) { - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_TRACK); + GET_EVENT_FLAGS(ch).reset(EVENT_TRACK); return EVENT_FINISHED; } if (!cause_single_track(track, ch, victim, track_room)) { - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_TRACK); + GET_EVENT_FLAGS(ch).reset(EVENT_TRACK); return EVENT_FINISHED; } @@ -327,7 +327,7 @@ ACMD(do_track) { if (EVENT_FLAGGED(ch, EVENT_TRACK)) { char_printf(ch, "You stop tracking.\n"); cancel_event(GET_EVENTS(ch), EVENT_TRACK); - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_TRACK); + GET_EVENT_FLAGS(ch).reset(EVENT_TRACK); return; } @@ -421,7 +421,7 @@ ACMD(do_hunt) { if (EVENT_FLAGGED(ch, EVENT_TRACK)) { char_printf(ch, "You stop tracking.\n"); cancel_event(GET_EVENTS(ch), EVENT_TRACK); - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_TRACK); + GET_EVENT_FLAGS(ch).reset(EVENT_TRACK); return; } @@ -477,7 +477,7 @@ ACMD(do_hunt) { if (EVENT_FLAGGED(ch, EVENT_TRACK)) { char_printf(ch, "You stop hunting.\n"); cancel_event(GET_EVENTS(ch), EVENT_TRACK); - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_TRACK); + GET_EVENT_FLAGS(ch).reset(EVENT_TRACK); return; } @@ -591,7 +591,7 @@ bool call_track(bool hunt, TrackInfo track, CharData *ch, CharData *victim, bool track_event->track_room = victim->in_room; event_create(EVENT_TRACK, track_delayed_event, track_event, true, &(ch->events), track.speed); - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_TRACK); + GET_EVENT_FLAGS(ch).set(EVENT_TRACK); return true; } } diff --git a/src/handler.cpp b/src/handler.cpp index 93b1c098..58bbd22c 100644 --- a/src/handler.cpp +++ b/src/handler.cpp @@ -101,29 +101,29 @@ int isname(const char *str, const char *namelist) { } } -void effect_modify(CharData *ch, byte loc, sh_int mod, flagvector bitv[], bool add) { +void effect_modify(CharData *ch, byte loc, sh_int mod, EffectFlags flags, bool add) { int i; if (add) { /* Special behaviors for aff flags. */ - if (IS_FLAGGED(bitv, EFF_LIGHT) && ch->in_room != NOWHERE && !EFF_FLAGGED(ch, EFF_LIGHT)) + if (flags.test(EFF_LIGHT) && ch->in_room != NOWHERE && !EFF_FLAGGED(ch, EFF_LIGHT)) world[ch->in_room].light++; /* Add effect flags. */ for (i = 0; i < NUM_EFF_FLAGS; ++i) - if (IS_FLAGGED(bitv, i)) - SET_FLAG(EFF_FLAGS(ch), i); + if (flags.test(i)) + EFF_FLAGS(ch).set(i); } else { /* Special behaviors for aff flags. */ - if (IS_FLAGGED(bitv, EFF_LIGHT) && ch->in_room != NOWHERE && EFF_FLAGGED(ch, EFF_LIGHT)) + if (flags.test(EFF_LIGHT) && ch->in_room != NOWHERE && EFF_FLAGGED(ch, EFF_LIGHT)) world[ch->in_room].light--; - if (IS_FLAGGED(bitv, EFF_CAMOUFLAGED)) + if (flags.test(EFF_CAMOUFLAGED)) GET_HIDDENNESS(ch) = 0; /* Remove effect flags. */ for (i = 0; i < NUM_EFF_FLAGS; ++i) - if (IS_FLAGGED(bitv, i)) - REMOVE_FLAG(EFF_FLAGS(ch), i); + if (flags.test(i)) + EFF_FLAGS(ch).reset(i); /* Negative modifier for !add. */ mod = -mod; @@ -345,7 +345,7 @@ void effect_total(CharData *ch) { } else if (GET_POS(ch) == POS_FLYING) { if (!EFF_FLAGGED(ch, EFF_FLY)) { if (!EVENT_FLAGGED(ch, EVENT_FALLTOGROUND)) { - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_FALLTOGROUND); + GET_EVENT_FLAGS(ch).set(EVENT_FALLTOGROUND); event_create(EVENT_FALLTOGROUND, falltoground_event, ch, false, &(ch->events), 0); } } else { @@ -488,8 +488,8 @@ void effect_join(CharData *ch, effect *eff, bool add_dur, bool avg_dur, bool add /* copy effect flags from hjp to eff */ for (i = 0; i < NUM_EFF_FLAGS; ++i) - if (IS_FLAGGED(hjp->flags, i)) - SET_FLAG(eff->flags, i); + if (hjp->flags.test(i)) + eff->flags.set(i); effect_remove(ch, hjp); effect_to_char(ch, eff); @@ -620,7 +620,7 @@ void obj_to_char(ObjData *obj, CharData *ch) { IS_CARRYING_N(ch)++; if (!IS_NPC(ch)) - SET_FLAG(PLR_FLAGS(ch), PLR_AUTOSAVE); + PLR_FLAGS(ch).set(PLR_AUTOSAVE); if (PLAYERALLY(ch)) stop_decomposing(obj); overweight_check(ch); @@ -643,7 +643,7 @@ void obj_from_char(ObjData *obj) { REMOVE_FROM_LIST(obj, obj->carried_by->carrying, next_content); if (!IS_NPC(obj->carried_by)) - SET_FLAG(PLR_FLAGS(obj->carried_by), PLR_AUTOSAVE); + PLR_FLAGS(obj->carried_by).set(PLR_AUTOSAVE); if (MORTALALLY(obj->carried_by)) start_decomposing(obj); @@ -1014,7 +1014,7 @@ void obj_to_room(ObjData *obj, int room) { start_obj_falling(obj); if (ROOM_FLAGGED(room, ROOM_HOUSE)) - SET_FLAG(ROOM_FLAGS(room), ROOM_HOUSE_CRASH); + ROOM_FLAGS(room).set(ROOM_HOUSE_CRASH); /* if this is a player corpse, save the new room vnum to the corpse control record. This can later be optimized as a flag, much like houses - nechtrous */ @@ -1041,7 +1041,7 @@ void obj_from_room(ObjData *object) { REMOVE_FROM_LIST(object, world[object->in_room].contents, next_content); if (ROOM_FLAGGED(object->in_room, ROOM_HOUSE)) - SET_FLAG(ROOM_FLAGS(object->in_room), ROOM_HOUSE_CRASH); + ROOM_FLAGS(object->in_room).set(ROOM_HOUSE_CRASH); object->in_room = NOWHERE; object->next_content = nullptr; } diff --git a/src/house.cpp b/src/house.cpp index 4cd48c8c..3665b898 100644 --- a/src/house.cpp +++ b/src/house.cpp @@ -92,7 +92,7 @@ void House_crashsave(int vnum) { } write_objects(world[rnum].contents, fp, WEAR_INVENTORY); fclose(fp); - REMOVE_FLAG(ROOM_FLAGS(rnum), ROOM_HOUSE_CRASH); + ROOM_FLAGS(rnum).reset(ROOM_HOUSE_CRASH); } /* Delete a house save file */ @@ -207,9 +207,8 @@ void House_boot(void) { house_control[num_of_houses++] = temp_house; - SET_FLAG(ROOM_FLAGS(real_house), ROOM_HOUSE); - SET_FLAG(ROOM_FLAGS(real_house), ROOM_PRIVATE); - SET_FLAG(ROOM_FLAGS(real_atrium), ROOM_ATRIUM); + ROOM_FLAGS(real_house).set(ROOM_HOUSE | ROOM_PRIVATE); + ROOM_FLAGS(real_atrium).set(ROOM_ATRIUM); House_load(temp_house.vnum); } @@ -343,9 +342,8 @@ void hcontrol_build_house(CharData *ch, char *arg) { house_control[num_of_houses++] = temp_house; - SET_FLAG(ROOM_FLAGS(real_house), ROOM_HOUSE); - SET_FLAG(ROOM_FLAGS(real_house), ROOM_PRIVATE); - SET_FLAG(ROOM_FLAGS(real_atrium), ROOM_ATRIUM); + ROOM_FLAGS(real_house).set(ROOM_HOUSE | ROOM_PRIVATE); + ROOM_FLAGS(real_atrium).set(ROOM_ATRIUM); House_crashsave(virt_house); char_printf(ch, "House built. Mazel tov!\n"); @@ -367,14 +365,12 @@ void hcontrol_destroy_house(CharData *ch, char *arg) { if ((real_atrium = real_room(house_control[i].atrium)) < 0) log("SYSERR: House had invalid atrium!"); else - REMOVE_FLAG(ROOM_FLAGS(real_atrium), ROOM_ATRIUM); + ROOM_FLAGS(real_atrium).reset(ROOM_ATRIUM); if ((real_house = real_room(house_control[i].vnum)) < 0) log("SYSERR: House had invalid vnum!"); else { - REMOVE_FLAG(ROOM_FLAGS(real_house), ROOM_HOUSE); - REMOVE_FLAG(ROOM_FLAGS(real_house), ROOM_PRIVATE); - REMOVE_FLAG(ROOM_FLAGS(real_house), ROOM_HOUSE_CRASH); + ROOM_FLAGS(real_house).reset(ROOM_HOUSE | ROOM_PRIVATE | ROOM_HOUSE_CRASH); } House_delete_file(house_control[i].vnum); @@ -394,7 +390,7 @@ void hcontrol_destroy_house(CharData *ch, char *arg) { */ for (i = 0; i < num_of_houses; i++) if ((real_atrium = real_room(house_control[i].atrium)) >= 0) - SET_FLAG(ROOM_FLAGS(real_atrium), ROOM_ATRIUM); + ROOM_FLAGS(real_atrium).set(ROOM_ATRIUM); } void hcontrol_pay_house(CharData *ch, char *arg) { diff --git a/src/interpreter.cpp b/src/interpreter.cpp index 5d01e221..6248d737 100644 --- a/src/interpreter.cpp +++ b/src/interpreter.cpp @@ -993,7 +993,8 @@ const CommandInfo cmd_info[] = { {"qstat", POS_PRONE, STANCE_DEAD, do_qstat, LVL_ATTENDANT, 0, CMD_ANY}, {"objupdate", POS_PRONE, STANCE_DEAD, do_objupdate, LVL_HEAD_C, 0, CMD_ANY}, - {"\n", 0, 0, 0, 0, 0, CMD_HIDE}}; /* this must be last */ + {"\n", 0, 0, 0, 0, 0, CMD_HIDE} /* this must be last */ +}; const char *command_flags[] = {"MEDITATE", "MAJOR PARA", "MINOR PARA", "HIDE", "BOUND", "CAST", "OLC", "NOFIGHT", "\n"}; @@ -1071,7 +1072,7 @@ void command_interpreter(CharData *ch, char *argument) { } if (PLR_FLAGGED(ch, PLR_MEDITATE) && !IS_SET(cmd_info[cmd].flags, CMD_MEDITATE)) { - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_MEDITATE); act("$n ceases $s meditative trance.", true, ch, 0, 0, TO_ROOM); char_printf(ch, "You stop meditating.\n&0"); } @@ -1930,8 +1931,8 @@ int perform_dupe_check(DescriptorData *d) { d->original = nullptr; d->character->char_specials.timer = 0; d->character->forward = nullptr; - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_WRITING); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_MAILING); + PLR_FLAGS(d->character).reset(PLR_WRITING); + PLR_FLAGS(d->character).reset(PLR_MAILING); STATE(d) = CON_PLAYING; switch (mode) { @@ -2311,11 +2312,9 @@ void nanny(DescriptorData *d, char *arg) { GET_PFILEPOS(d->character) = player_i; if (color) { - SET_FLAG(PRF_FLAGS(d->character), PRF_COLOR_1); - SET_FLAG(PRF_FLAGS(d->character), PRF_COLOR_2); + PRF_FLAGS(d->character).set(PRF_COLOR_1 | PRF_COLOR_2); } else { - REMOVE_FLAG(PRF_FLAGS(d->character), PRF_COLOR_1); - REMOVE_FLAG(PRF_FLAGS(d->character), PRF_COLOR_2); + PRF_FLAGS(d->character).reset(PRF_COLOR_1 | PRF_COLOR_2); } sprintf(buf, "\nDo you want to make a new character called %s? ", tmp_name); string_to_output(d, buf); @@ -2328,16 +2327,12 @@ void nanny(DescriptorData *d, char *arg) { color = 1; /* undo it just in case they are set */ - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_WRITING); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_MAILING); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_CRYO); + PLR_FLAGS(d->character).reset(PLR_WRITING | PLR_MAILING | PLR_CRYO); if (color) { - SET_FLAG(PRF_FLAGS(d->character), PRF_COLOR_1); - SET_FLAG(PRF_FLAGS(d->character), PRF_COLOR_2); + PRF_FLAGS(d->character).set(PRF_COLOR_1 | PRF_COLOR_2); } else { - REMOVE_FLAG(PRF_FLAGS(d->character), PRF_COLOR_1); - REMOVE_FLAG(PRF_FLAGS(d->character), PRF_COLOR_2); + PRF_FLAGS(d->character).reset(PRF_COLOR_1 | PRF_COLOR_2); } string_to_output(d, "Password: "); @@ -2465,9 +2460,9 @@ void nanny(DescriptorData *d, char *arg) { string_to_output(d, "Now you must wait to be re-approved.\n"); if (!PLR_FLAGGED(d->character, PLR_NAPPROVE)) - SET_FLAG(PLR_FLAGS(d->character), PLR_NAPPROVE); + PLR_FLAGS(d->character).set(PLR_NAPPROVE); event_create(EVENT_NAME_TIMEOUT, name_timeout, d, false, nullptr, NAME_TIMEOUT); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_NEWNAME); + PLR_FLAGS(d->character).reset(PLR_NEWNAME); string_to_output(d, "Now you must wait for your name to be approved by an immortal.\n" "If no one is available, you will be granted entry in a VERY short " @@ -3144,10 +3139,10 @@ void nanny(DescriptorData *d, char *arg) { default: if (approve_names && (top_of_p_table + 1) && napprove_pause) { if (!PLR_FLAGGED(d->character, PLR_NAPPROVE)) { - SET_FLAG(PLR_FLAGS(d->character), PLR_NAPPROVE); + PLR_FLAGS(d->character).set(PLR_NAPPROVE); } event_create(EVENT_NAME_TIMEOUT, name_timeout, d, false, nullptr, NAME_TIMEOUT); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_NEWNAME); + PLR_FLAGS(d->character).reset(PLR_NEWNAME); string_to_output(d, "\nNow you must wait for your name to be approved by an immortal.\n" "If no one is available, you will be auto approved in a short time.\n"); @@ -3156,7 +3151,7 @@ void nanny(DescriptorData *d, char *arg) { break; } else { if (approve_names && !PLR_FLAGGED(d->character, PLR_NAPPROVE)) { - SET_FLAG(PLR_FLAGS(d->character), PLR_NAPPROVE); + PLR_FLAGS(d->character).set(PLR_NAPPROVE); } if (GET_PFILEPOS(d->character) < 0) { GET_PFILEPOS(d->character) = create_player_index_entry(GET_NAME(d->character)); @@ -3381,27 +3376,27 @@ EVENTFUNC(name_timeout) { save_player_char(d->character); if (!PLR_FLAGGED(d->character, PLR_NAPPROVE)) - SET_FLAG(PLR_FLAGS(d->character), PLR_NAPPROVE); + PLR_FLAGS(d->character).set(PLR_NAPPROVE); if (!PLR_FLAGGED(d->character, PLR_NEWNAME)) { /* This IF was placed here so players whose names had been - FREAKING DECLINED wouldn't sneak online anyway if they - sat at the prompt not choosing a new name. - RSD 11/11/2000 - */ + FREAKING DECLINED wouldn't sneak online anyway if they + sat at the prompt not choosing a new name. - RSD 11/11/2000 + */ string_to_output(d, "You have been auto-approved.\n"); string_to_output(d, get_text(TEXT_MOTD)); string_to_output(d, "\n\n*** PRESS RETURN: "); if (PLR_FLAGGED(d->character, PLR_NEWNAME)) { log(LogSeverity::Stat, LVL_IMMORT, "{} [{}] has connected with a new name.", GET_NAME(d->character), d->host); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_NEWNAME); + PLR_FLAGS(d->character).reset(PLR_NEWNAME); } else { log(LogSeverity::Stat, LVL_IMMORT, "{} [{}] new player.", GET_NAME(d->character), d->host); } STATE(d) = CON_RMOTD; } if (PLR_FLAGGED(d->character, PLR_NEWNAME)) - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_NEWNAME); + PLR_FLAGS(d->character).reset(PLR_NEWNAME); return EVENT_FINISHED; } diff --git a/src/limits.cpp b/src/limits.cpp index 2015e7dd..05da29ec 100644 --- a/src/limits.cpp +++ b/src/limits.cpp @@ -242,7 +242,7 @@ void gain_exp(CharData *ch, long gain, unsigned int mode) { char_printf(ch, AFMAG "You got your {} " AFMAG "back again!\n" ANRM, CLASS_STARS(ch)); all_except_printf(ch, "{} regained {} {}!\n", GET_NAME(ch), HSHR(ch), CLASS_STARS(ch)); } else { - SET_FLAG(PLR_FLAGS(ch), PLR_GOTSTARS); + PLR_FLAGS(ch).set(PLR_GOTSTARS); char_printf(ch, AFMAG "You have achieved {} " AFMAG "status in {}" AFMAG "!!\n" ANRM, CLASS_STARS(ch), CLASS_FULL(ch)); all_except_printf(ch, AFMAG "{} " AFMAG "has achieved {} " AFMAG "status in {}" AFMAG "!!\n" ANRM, @@ -561,7 +561,6 @@ void sick_update(void) { ObjData *j; int pc_dam; - /* characters */ for (i = character_list; i; i = next_char) { next_char = i->next; @@ -676,7 +675,7 @@ void start_decomposing(ObjData *obj) { * decomposition undesirably. */ if (GET_OBJ_DECOMP(obj) < ticks) GET_OBJ_DECOMP(obj) = ticks; - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_DECOMP); + GET_OBJ_FLAGS(obj).set(ITEM_DECOMP); } /* The contents of corpses don't decompose. */ @@ -688,7 +687,7 @@ void start_decomposing(ObjData *obj) { void stop_decomposing(ObjData *obj) { ObjData *o; - REMOVE_FLAG(GET_OBJ_FLAGS(obj), ITEM_DECOMP); + GET_OBJ_FLAGS(obj).reset(ITEM_DECOMP); for (o = obj->contains; o; o = o->next_content) stop_decomposing(o); } diff --git a/src/magic.cpp b/src/magic.cpp index 037c3c50..9513150f 100644 --- a/src/magic.cpp +++ b/src/magic.cpp @@ -317,7 +317,7 @@ void effect_update(void) { world[(int)reff->room].light++; if (ROOM_EFF_FLAGGED(reff->room, ROOM_EFF_ILLUMINATION)) world[(int)reff->room].light--; - REMOVE_FLAG(world[(int)reff->room].room_effects, reff->effect); + world[(int)reff->room].room_effects.reset(reff->effect); REMOVE_FROM_LIST(reff, room_effect_list, next); free(reff); } @@ -1050,7 +1050,7 @@ int mag_damage(int skill, CharData *ch, CharData *victim, int spellnum, int save !EFF_FLAGGED(victim, EFF_ON_FIRE)) { temp = std::clamp((3 + skill - GET_LEVEL(victim)) * susceptibility(victim, DAM_FIRE) / 100, 1, 90); if (temp > random_number(0, 100)) { - SET_FLAG(EFF_FLAGS(victim), EFF_ON_FIRE); + EFF_FLAGS(victim).test(EFF_ON_FIRE); switch (random_number(1, 3)) { case 1: act("&1$n bursts into flame!&0", false, victim, 0, 0, TO_ROOM); @@ -1252,7 +1252,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save to_room = "$N is inspired to do good by $n.\r\n$N is overcome with divine euphoria!"; } } - SET_FLAG(eff[2].flags, EFF_BLESS); + eff[2].flags.set(EFF_BLESS); eff[2].duration = eff[0].duration; break; @@ -1276,12 +1276,12 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_HITROLL; eff[0].modifier = -4; eff[0].duration = 2; - SET_FLAG(eff[0].flags, EFF_BLIND); + eff[0].flags.set(EFF_BLIND); eff[1].location = APPLY_AC; eff[1].modifier = -40; eff[1].duration = 2; - SET_FLAG(eff[1].flags, EFF_BLIND); + eff[1].flags.set(EFF_BLIND); to_char = "&9&b$N&9&b is blinded by you!&0"; to_room = "&9&b$N&9&b is blinded by $n!&0"; @@ -1290,7 +1290,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_BLUR: - SET_FLAG(eff[0].flags, EFF_BLUR); + eff[0].flags.set(EFF_BLUR); eff[0].duration = 2 + (skill / 21); /* max 6 */ to_vict = "&7The world seems to slow as you start moving with unnatural speed!&0"; to_room = "&7$N's image blurs in unnatural speed!&0"; @@ -1329,7 +1329,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save to_vict = "$n conjures four magical bones which bind your legs!"; to_room = "$n conjures four magical bones that lock around $N's legs!"; - SET_FLAG(eff[0].flags, EFF_IMMOBILIZED); + eff[0].flags.set(EFF_IMMOBILIZED); eff[0].location = APPLY_NONE; eff[0].modifier = 4; eff[0].duration = 1 + skill / 25; /* 1-5 hours */ @@ -1368,7 +1368,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_CIRCLE_OF_LIGHT: - SET_FLAG(eff[0].flags, EFF_LIGHT); + eff[0].flags.set(EFF_LIGHT); eff[0].duration = 5 + (skill / 2); /* max 55 */ to_vict = "&7&bA bright white circle of light begins hovering about your head.&0"; to_room = "&7&bA bright white circle of light appears over $N's&7&b head."; @@ -1382,7 +1382,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_COLDSHIELD); + eff[0].flags.set(EFF_COLDSHIELD); eff[0].duration = skill / 20; /* max 5 */ refresh = false; to_vict = "&4A jagged formation of i&bc&7e sh&4ard&0&4s forms around you.&0"; @@ -1401,7 +1401,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save char_printf(ch, "to bring them back under control.\n"); return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_CONFUSION); + eff[0].flags.set(EFF_CONFUSION); eff[0].duration = 2 + skill / 40; to_vict = "&5You suddenly find it difficult to focus upon your foes.&0"; to_room = "$N can't decide which way to cross $S eyes!"; @@ -1422,7 +1422,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_HITROLL; eff[0].duration = 5 + (skill / 14); /* max 12 */ eff[0].modifier = -1 - (skill / 50); /* max -3 */ - SET_FLAG(eff[0].flags, EFF_CURSE); + eff[0].flags.set(EFF_CURSE); eff[1].location = APPLY_DAMROLL; eff[1].duration = eff[0].duration; eff[1].modifier = eff[0].modifier; @@ -1490,7 +1490,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save to_room = "$n seizes up in pain!\n$n grabs $N, who is enraged by a dark presence."; } } - SET_FLAG(eff[2].flags, EFF_BLESS); + eff[2].flags.set(EFF_BLESS); eff[2].duration = eff[0].duration; break; @@ -1499,7 +1499,6 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if ((affected_by_spell(victim, SPELL_DEMONIC_ASPECT) && spellnum == SPELL_DEMONIC_MUTATION) || (affected_by_spell(victim, SPELL_DEMONIC_MUTATION) && spellnum == SPELL_DEMONIC_ASPECT)) { - char_printf(victim, "You're feeling pretty demonic already.\n"); return CAST_RESULT_CHARGE; } @@ -1553,12 +1552,12 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_AC; eff[0].modifier = 8; eff[0].duration = 5; - SET_FLAG(eff[0].flags, EFF_PROT_FIRE); + eff[0].flags.set(EFF_PROT_FIRE); } else { eff[0].location = APPLY_AC; eff[0].modifier = 10 + (skill / 20); eff[0].duration = 10 + (skill / 50); - SET_FLAG(eff[0].flags, EFF_PROT_FIRE); + eff[0].flags.set(EFF_PROT_FIRE); } to_vict = "&1Your skin toughens into a dark red hide.&0"; to_room = "&1$N's&1 skin toughens into a dark red hide.&0"; @@ -1566,7 +1565,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_DETECT_ALIGN: - SET_FLAG(eff[0].flags, EFF_DETECT_ALIGN); + eff[0].flags.set(EFF_DETECT_ALIGN); eff[0].duration = 5 + (skill / 10); /* max 15 */ to_char = "$N can determine alignment."; to_room = "&7&b$N&7&b glows briefly.&0"; @@ -1575,7 +1574,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_DETECT_INVIS: - SET_FLAG(eff[0].flags, EFF_DETECT_INVIS); + eff[0].flags.set(EFF_DETECT_INVIS); eff[0].location = APPLY_PERCEPTION; eff[0].modifier = 10; eff[0].duration = 5 + (skill / 10); /* max 15 */ @@ -1584,14 +1583,14 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_DETECT_MAGIC: - SET_FLAG(eff[0].flags, EFF_DETECT_MAGIC); + eff[0].flags.set(EFF_DETECT_MAGIC); eff[0].duration = 5 + (skill / 10); /* max 15 */ to_vict = "Your eyes tingle."; break; case SPELL_DETECT_POISON: - SET_FLAG(eff[0].flags, EFF_DETECT_POISON); + eff[0].flags.set(EFF_DETECT_POISON); eff[0].duration = 5 + (skill / 10); /* max 15 */ to_vict = "Your eyes tingle."; break; @@ -1610,7 +1609,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_CON; eff[0].modifier = -10 - (skill / 10); eff[0].duration = 5 + (skill / 10); - SET_FLAG(eff[0].flags, EFF_DISEASE); + eff[0].flags.set(EFF_DISEASE); eff[1].location = APPLY_STR; eff[1].modifier = eff[0].modifier; eff[1].duration = eff[0].duration; @@ -1633,11 +1632,12 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save } if (spellnum = SPELL_DISPLACEMENT) - SET_FLAG(eff[0].flags, EFF_DISPLACEMENT); + eff[0].flags.set(EFF_DISPLACEMENT); else if (spellnum = SPELL_GREATER_DISPLACEMENT) - SET_FLAG(eff[0].flags, EFF_GREATER_DISPLACEMENT); + eff[0].flags.set(EFF_GREATER_DISPLACEMENT); - eff[0].duration = (skill / 50) + ((stat_bonus[GET_INT(ch)].magic + stat_bonus[GET_WIS(ch)].magic) / 7); /* max 4 */ + eff[0].duration = + (skill / 50) + ((stat_bonus[GET_INT(ch)].magic + stat_bonus[GET_WIS(ch)].magic) / 7); /* max 4 */ refresh = false; to_char = "&9&b$N's image blurs into the shadows!&0"; @@ -1696,7 +1696,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save to_room = "$N is imbued with nature's glory by $n!\r\n$N is bolstered with supernatural might!"; } } - SET_FLAG(eff[2].flags, EFF_BLESS); + eff[2].flags.set(EFF_BLESS); eff[2].duration = eff[0].duration; break; @@ -1707,19 +1707,19 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save } if (is_abbrev(buf2, "fire")) { - SET_FLAG(eff[0].flags, EFF_PROT_FIRE); + eff[0].flags.set(EFF_PROT_FIRE); to_vict = "You are warded from &1fire&0."; to_char = "You protect $N from &1fire&0."; } else if (is_abbrev(buf2, "cold")) { - SET_FLAG(eff[0].flags, EFF_PROT_COLD); + eff[0].flags.set(EFF_PROT_COLD); to_vict = "You are warded from the &4cold&0."; to_char = "You protect $N from the &4cold&0."; } else if (is_abbrev(buf2, "air")) { - SET_FLAG(eff[0].flags, EFF_PROT_AIR); + eff[0].flags.set(EFF_PROT_AIR); to_vict = "You are warded from &6&bair&0."; to_char = "You protect $N from &6&bair&0."; } else if (is_abbrev(buf2, "earth")) { - SET_FLAG(eff[0].flags, EFF_PROT_EARTH); + eff[0].flags.set(EFF_PROT_EARTH); to_vict = "You are warded from &3earth&0."; to_char = "You protect $N from &3earth&0."; } else { @@ -1916,7 +1916,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_SIZE; eff[0].modifier = 1; - SET_FLAG(eff[0].flags, EFF_ENLARGE); + eff[0].flags.set(EFF_ENLARGE); eff[0].duration = 1 + (skill / 40); eff[1].location = APPLY_CON; @@ -1951,10 +1951,10 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save /* Chance for major para increases with higher skill. */ if (skill >= 40 && random_number(0, 100) < 2 + (skill / 14)) { - SET_FLAG(eff[0].flags, EFF_MAJOR_PARALYSIS); + eff[0].flags.set(EFF_MAJOR_PARALYSIS); eff[0].duration = 2 + (skill > 95); } else { - SET_FLAG(eff[0].flags, EFF_MINOR_PARALYSIS); + eff[0].flags.set(EFF_MINOR_PARALYSIS); eff[0].duration = 2 + (skill / 24); } to_char = @@ -1970,7 +1970,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save break; case SPELL_FAMILIARITY: - SET_FLAG(eff[0].flags, EFF_FAMILIARITY); + eff[0].flags.set(EFF_FAMILIARITY); eff[0].duration = skill / 5 + 4; to_vict = "&7&bAn aura of comfort and solidarity surrounds you.&0"; to_room = @@ -1980,7 +1980,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_FARSEE: - SET_FLAG(eff[0].flags, EFF_FARSEE); + eff[0].flags.set(EFF_FARSEE); eff[0].duration = 5 + (skill / 10); /* max 15 */ to_vict = "Your sight improves dramatically."; to_room = "$N's pupils dilate rapidly for a second."; @@ -1996,19 +1996,19 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save break; if (is_abbrev(buf2, "fire")) { - SET_FLAG(eff[0].flags, EFF_FIREHANDS); + eff[0].flags.set(EFF_FIREHANDS); to_vict = "&1Your fists burn with inner fire.&0"; to_room = "&1$N's fists burn with inner fire.&0"; } else if (is_abbrev(buf2, "ice")) { - SET_FLAG(eff[0].flags, EFF_ICEHANDS); + eff[0].flags.set(EFF_ICEHANDS); to_vict = "&4&bYou unleash the blizzard in your heart.&0"; to_room = "&4&b$N unleashes the blizzard in $S heart.&0"; } else if (is_abbrev(buf2, "lightning")) { - SET_FLAG(eff[0].flags, EFF_LIGHTNINGHANDS); + eff[0].flags.set(EFF_LIGHTNINGHANDS); to_vict = "&6&bYour knuckles crackle with lightning.&0"; to_room = "&6&b$N's knuckles crackle with lightning.&0"; } else if (is_abbrev(buf2, "acid")) { - SET_FLAG(eff[0].flags, EFF_ACIDHANDS); + eff[0].flags.set(EFF_ACIDHANDS); to_vict = "&3&bYou charge your hands with corrosive chi.&0"; to_room = "&3&b$N charges $S hands with corrosive chi.&0"; } else { @@ -2035,7 +2035,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_FIRESHIELD); + eff[0].flags.set(EFF_FIRESHIELD); eff[0].duration = skill / 20; /* max 5 */ refresh = false; to_vict = "&1A burning shield of f&bi&3r&7e&0&1 explodes from your body!&0"; @@ -2044,7 +2044,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_FLY: - SET_FLAG(eff[0].flags, EFF_FLY); + eff[0].flags.set(EFF_FLY); eff[0].duration = 5 + (skill / 10); /* max 15 */ if (too_heavy_to_fly(victim)) { to_vict = "You feel somewhat lighter."; @@ -2082,7 +2082,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save break; case SPELL_GLORY: - SET_FLAG(eff[0].flags, EFF_GLORY); + eff[0].flags.set(EFF_GLORY); eff[0].duration = 5 + skill / 20; eff[1].location = APPLY_CHA; eff[1].modifier = 50; @@ -2098,7 +2098,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_HARNESS); + eff[0].flags.set(EFF_HARNESS); eff[0].duration = (skill >= 20); /* max 1 */ refresh = false; to_vict = "&4&bYour veins begin to pulse with energy!&0"; @@ -2107,7 +2107,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_HASTE: - SET_FLAG(eff[0].flags, EFF_HASTE); + eff[0].flags.set(EFF_HASTE); eff[0].duration = 2 + (skill / 21); /* max 6 */ to_char = "&1$N starts to move with uncanny speed!&0"; to_vict = "&1You start to move with uncanny speed!&0"; @@ -2148,7 +2148,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_INFRAVISION); + eff[0].flags.set(EFF_INFRAVISION); eff[0].duration = 5 + (skill / 10); /* max 15 */ to_char = "$N's eyes glow red."; to_vict = "Your eyes glow red."; @@ -2168,7 +2168,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_INSANITY); + eff[0].flags.set(EFF_INSANITY); eff[0].location = APPLY_WIS; eff[0].modifier = -50; eff[0].duration = 5; @@ -2183,14 +2183,14 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].modifier = 40; eff[0].duration = 9 + (skill / 9); /* max 20 */ eff[0].location = APPLY_AC; - SET_FLAG(eff[0].flags, EFF_INVISIBLE); + eff[0].flags.set(EFF_INVISIBLE); to_vict = "You vanish."; to_room = "$N slowly fades out of existence."; break; case SPELL_FEATHER_FALL: - SET_FLAG(eff[0].flags, EFF_FEATHER_FALL); + eff[0].flags.set(EFF_FEATHER_FALL); eff[0].duration = 5 + (skill / 10); to_char = "&6$N&0&6 floats up into the air.&0"; to_vict = "&6You float up into the air.&0"; @@ -2199,7 +2199,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_MAGIC_TORCH: - SET_FLAG(eff[0].flags, EFF_LIGHT); + eff[0].flags.set(EFF_LIGHT); eff[0].duration = 5 + (skill / 2); /* max 55 */ to_vict = "&1A magical flame bursts into focus, lighting the area.&0"; to_room = "&1A magical flame bursts into focus, lighting the area.&0"; @@ -2214,7 +2214,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_MAJOR_GLOBE); + eff[0].flags.set(EFF_MAJOR_GLOBE); eff[0].duration = 4 + (skill / 20); /* max 9 */ refresh = false; to_char = "&1&bYour shimmering globe of force wraps around $N&1&b's body.&0"; @@ -2246,7 +2246,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save to_vict = "$n shows you a truly fascinating puzzle. You simply must work it out."; to_char = "You weave a mesmerizing pattern before $N, and $E seems to be utterly absorbed by it."; - SET_FLAG(eff[0].flags, EFF_MESMERIZED); + eff[0].flags.set(EFF_MESMERIZED); eff[0].duration = 2 + skill / 16; /* 2-8 hours */ if (!IS_NPC(victim)) eff[0].duration = 2; /* Players: just 2 hours. */ @@ -2262,7 +2262,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_MINOR_GLOBE); + eff[0].flags.set(EFF_MINOR_GLOBE); eff[0].duration = skill / 20; /* max 5 */ refresh = false; to_char = "&1Your shimmering globe wraps around $N&0&1's body.&0"; @@ -2276,7 +2276,6 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save /* Make success based on skill and saving throw -myc 17 Feb 2007 */ if (mag_savingthrow(victim, SAVING_PARA) || skill - GET_LEVEL(victim) > random_number(0, 70) || MOB_FLAGGED(victim, MOB_NOCHARM)) { - if (MOB_FLAGGED(victim, MOB_NOCHARM)) act("&7&b$N cannot be paralyzed!&0", false, ch, 0, victim, TO_CHAR); else @@ -2294,7 +2293,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; } - SET_FLAG(eff[0].flags, EFF_MINOR_PARALYSIS); + eff[0].flags.set(EFF_MINOR_PARALYSIS); eff[0].duration = 2 + (skill / 15); /* max 8 */ refresh = false; to_char = "You temporarily paralyze $N!"; @@ -2328,7 +2327,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save break; case SPELL_MISDIRECTION: - SET_FLAG(eff[0].flags, EFF_MISDIRECTION); + eff[0].flags.set(EFF_MISDIRECTION); eff[0].duration = 2 + skill / 4; to_vict = "You feel like a stack of little illusions all pointing in " @@ -2350,7 +2349,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_monk_hand_spells(ch, victim, spellnum)) return 0; - SET_FLAG(eff[0].flags, EFF_ACIDHANDS); + eff[0].flags.set(EFF_ACIDHANDS); to_vict = "&3&bYou charge your hands with corrosive chi.&0"; to_room = "&3&b$N charges $S hands with corrosive chi.&0"; if (spellnum == SPELL_TREMORS_OF_SAINT_AUGUSTINE) @@ -2373,7 +2372,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_monk_hand_spells(ch, victim, spellnum)) return 0; - SET_FLAG(eff[0].flags, EFF_ICEHANDS); + eff[0].flags.set(EFF_ICEHANDS); to_vict = "&4&bYou unleash the blizzard in your heart.&0"; to_room = "&4&b$N unleashes the blizzard in $S heart.&0"; if (spellnum == SPELL_BLIZZARDS_OF_SAINT_AUGUSTINE) @@ -2396,7 +2395,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_monk_hand_spells(ch, victim, spellnum)) return 0; - SET_FLAG(eff[0].flags, EFF_FIREHANDS); + eff[0].flags.set(EFF_FIREHANDS); to_vict = "&1Your fists burn with inner fire.&0"; to_room = "&1$N's fists burn with inner fire.&0"; if (spellnum == SPELL_FIRES_OF_SAINT_AUGUSTINE) @@ -2419,7 +2418,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_monk_hand_spells(ch, victim, spellnum)) return 0; - SET_FLAG(eff[0].flags, EFF_LIGHTNINGHANDS); + eff[0].flags.set(EFF_LIGHTNINGHANDS); to_vict = "&6&bYour knuckles crackle with lightning.&0"; to_room = "&6&b$N's knuckles crackle with lightning.&0"; if (spellnum == SPELL_TEMPEST_OF_SAINT_AUGUSTINE) @@ -2430,7 +2429,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_NEGATE_COLD: - SET_FLAG(eff[0].flags, EFF_NEGATE_COLD); + eff[0].flags.set(EFF_NEGATE_COLD); eff[0].duration = 2 + (skill / 20); /* max 7 */ to_vict = "&4&bYour body becomes impervious to the cold!&0"; to_room = "&4$n&4's is protected by a &3&bwarm&0&4-looking magical field.&0"; @@ -2438,14 +2437,14 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_NEGATE_HEAT: - SET_FLAG(eff[0].flags, EFF_NEGATE_HEAT); + eff[0].flags.set(EFF_NEGATE_HEAT); eff[0].duration = 2 + (skill / 20); /* max 7 */ to_vict = "&6Your body becomes impervious to all forms of heat!&0"; to_room = "&6$n&6 is surrounded by a frigid crystalline field.&0"; break; case SPELL_NATURES_EMBRACE: - SET_FLAG(eff[0].flags, EFF_CAMOUFLAGED); + eff[0].flags.set(EFF_CAMOUFLAGED); eff[0].duration = (skill / 3) + 1; /* range (1, 34) */ to_vict = "&9&bYou phase into the landscape.&0"; to_room = "&9&b$n&9&b phases into the landscape.&0"; @@ -2470,7 +2469,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_ULTRAVISION); + eff[0].flags.set(EFF_ULTRAVISION); eff[0].duration = (skill / 21); /* max 4 */ to_room = "$N's eyes glow a dim neon green."; to_vict = "&9&bYour vision sharpens a bit."; @@ -2478,7 +2477,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_NIMBLE: - SET_FLAG(eff[0].flags, EFF_NIMBLE); + eff[0].flags.set(EFF_NIMBLE); eff[0].duration = 2 + (skill / 21); /* max 6 */ to_char = "&1$N starts to move with uncanny grace!&0"; to_vict = "&1You start to move with uncanny grace!&0"; @@ -2507,7 +2506,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save } eff[0].location = APPLY_STR; eff[0].modifier = (-2 - (skill / 4) - (skill / 20)) * susceptibility(victim, DAM_POISON) / 100; /* max -32 */ - SET_FLAG(eff[0].flags, EFF_POISON); + eff[0].flags.set(EFF_POISON); eff[0].duration = 2 + (skill / 33) + (stat_bonus[GET_WIS(ch)].magic / 2); /* min 2, max 8 */ eff[0].type = SPELL_POISON; to_vict = "You feel very sick."; @@ -2543,7 +2542,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_PROTECT_EVIL); + eff[0].flags.set(EFF_PROTECT_EVIL); eff[0].duration = 9 + (skill / 9); /* max 20 */ to_vict = "You feel invulnerable!"; to_char = "You surround $N with glyphs of holy warding."; @@ -2559,7 +2558,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE; } - SET_FLAG(eff[0].flags, EFF_PROTECT_GOOD); + eff[0].flags.set(EFF_PROTECT_GOOD); eff[0].duration = 9 + (skill / 9); /* max 20 */ to_vict = "You feel invulnerable!"; to_char = "You surround $N with glyphs of unholy warding."; @@ -2572,7 +2571,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_elemental_warding_spells(ch, victim, spellnum)) return 0; - SET_FLAG(eff[0].flags, EFF_PROT_EARTH); + eff[0].flags.set(EFF_PROT_EARTH); to_vict = "You are warded from &3earth&0."; to_char = "You protect $N from &3earth&0."; eff[0].duration = 5 + (skill / 14); /* max 12 */ @@ -2586,7 +2585,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_elemental_warding_spells(ch, victim, spellnum)) return 0; - SET_FLAG(eff[0].flags, EFF_PROT_COLD); + eff[0].flags.set(EFF_PROT_COLD); to_vict = "You are warded from the &4cold&0."; to_char = "You protect $N from the &4cold&0."; eff[0].duration = 5 + (skill / 14); /* max 12 */ @@ -2600,7 +2599,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_elemental_warding_spells(ch, victim, spellnum)) return 0; - SET_FLAG(eff[0].flags, EFF_PROT_FIRE); + eff[0].flags.set(EFF_PROT_FIRE); to_vict = "You are warded from &1fire&0."; to_char = "You protect $N from &1fire&0."; eff[0].duration = 5 + (skill / 14); /* max 12 */ @@ -2614,7 +2613,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_elemental_warding_spells(ch, victim, spellnum)) return 0; - SET_FLAG(eff[0].flags, EFF_PROT_AIR); + eff[0].flags.set(EFF_PROT_AIR); to_vict = "You are warded from &6&bair&0."; to_char = "You protect $N from &6&bair&0."; eff[0].duration = 5 + (skill / 14); /* max 12 */ @@ -2640,7 +2639,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_STR; eff[0].duration = 8 + (skill / 20); /* max 13 */ eff[0].modifier = -15 - (skill / 10); /* max -25 */ - SET_FLAG(eff[0].flags, EFF_RAY_OF_ENFEEB); + eff[0].flags.set(EFF_RAY_OF_ENFEEB); to_vict = "You feel the strength flow out of your body."; to_room = "$N turns pale and starts to sag."; to_char = "$N turns pale and starts to sag."; @@ -2682,7 +2681,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_SIZE; eff[0].modifier = -1; - SET_FLAG(eff[0].flags, EFF_REDUCE); + eff[0].flags.set(EFF_REDUCE); eff[0].duration = 1 + (skill / 40); eff[1].location = APPLY_CON; @@ -2706,14 +2705,14 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save */ eff[0].duration = 4; - SET_FLAG(eff[0].flags, EFF_SANCTUARY); + eff[0].flags.set(EFF_SANCTUARY); to_vict = "This spell doesn't exist. Ask no questions."; to_room = "Absolutely nothing happens to $N."; break; case SPELL_SENSE_LIFE: - SET_FLAG(eff[0].flags, EFF_SENSE_LIFE); + eff[0].flags.set(EFF_SENSE_LIFE); eff[0].duration = 17 + (skill / 3); /* max 50 */ to_vict = "Your feel your awareness improve."; to_room = "$N seems more aware of $S surroundings."; @@ -2735,7 +2734,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; } - SET_FLAG(eff[0].flags, EFF_SILENCE); + eff[0].flags.set(EFF_SILENCE); eff[0].duration = 2 + (skill / 15); /* max 8 */ to_char = "You silence $N!"; to_vict = @@ -2768,7 +2767,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; } - SET_FLAG(eff[0].flags, EFF_SLEEP); + eff[0].flags.set(EFF_SLEEP); eff[0].duration = 9 + (skill / 9); /* max 20 */ refresh = false; @@ -2804,11 +2803,11 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_HITROLL; eff[0].modifier = -4; eff[0].duration = 2; - SET_FLAG(eff[0].flags, EFF_BLIND); + eff[0].flags.set(EFF_BLIND); eff[1].location = APPLY_AC; eff[1].modifier = -40; eff[1].duration = 2; - SET_FLAG(eff[1].flags, EFF_BLIND); + eff[1].flags.set(EFF_BLIND); to_room = "&9&b$N&9&b is blinded by $n's&9&b column of smoke!&0"; to_vict = "&9&bYou have been blinded by $n's&9&b column of smoke&0"; @@ -2818,7 +2817,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_SOULSHIELD: - SET_FLAG(eff[0].flags, EFF_SOULSHIELD); + eff[0].flags.set(EFF_SOULSHIELD); eff[0].duration = 2 + (skill / 10); /* max 12 */ refresh = false; @@ -2836,7 +2835,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save break; case SPELL_STATUE: - SET_FLAG(eff[0].flags, EFF_FAMILIARITY); + eff[0].flags.set(EFF_FAMILIARITY); eff[0].duration = (skill / 5) + (GET_INT(ch) / 4); to_vict = "&9&bYou disguise yourself as a little statue.&0"; to_room = "You realize $N has disappeared and been replaced by a statue!"; @@ -2852,7 +2851,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_NONE; eff[0].modifier = 7 + (skill / 16); /* max 13 */ eff[0].duration = 2; - SET_FLAG(eff[0].flags, EFF_STONE_SKIN); + eff[0].flags.set(EFF_STONE_SKIN); refresh = false; to_char = "&9&b$N's skin hardens and turns to stone!&0"; @@ -2878,12 +2877,12 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save eff[0].location = APPLY_HITROLL; eff[0].modifier = -4; eff[0].duration = 2; - SET_FLAG(eff[0].flags, EFF_BLIND); + eff[0].flags.set(EFF_BLIND); eff[1].location = APPLY_AC; eff[1].modifier = -40; eff[1].duration = 2; - SET_FLAG(eff[1].flags, EFF_BLIND); + eff[1].flags.set(EFF_BLIND); to_char = "&9&bYou have blinded $N with your sunray!&0"; to_room = "&9&b$N&9&b seems to be blinded!&0"; @@ -2926,7 +2925,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save case SPELL_WATERWALK: - SET_FLAG(eff[0].flags, EFF_WATERWALK); + eff[0].flags.set(EFF_WATERWALK); eff[0].duration = 35 + (skill / 4); /* max 60 */ to_room = "$N sprouts webbing between $S toes!"; to_vict = "You feel webbing between your toes."; @@ -2949,7 +2948,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; } - SET_FLAG(eff[0].flags, EFF_IMMOBILIZED); + eff[0].flags.set(EFF_IMMOBILIZED); eff[0].duration = 2 + (skill / 50); /* max 4 */ refresh = false; to_char = "&2&bYou tangle $N in a glowing &3&bweb&2&b!&0"; @@ -2962,7 +2961,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_bless_spells(ch, victim, spellnum)) return CAST_RESULT_CHARGE; - SET_FLAG(eff[0].flags, EFF_FLY); + eff[0].flags.set(EFF_FLY); eff[0].duration = 10 + (skill / 5); /* max 30 */ to_vict = "&7&bBeautiful bright white wings unfurl behind you as you lift into the air.&0"; @@ -2978,7 +2977,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save if (check_bless_spells(ch, victim, spellnum)) return CAST_RESULT_CHARGE; - SET_FLAG(eff[0].flags, EFF_FLY); + eff[0].flags.set(EFF_FLY); eff[0].duration = 10 + (skill / 5); to_vict = "&1&bHuge leathery &9bat-like&1 wings sprout from your back.&0"; @@ -3081,7 +3080,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save break; case CHANT_INTERMINABLE_WRATH: - SET_FLAG(eff[0].flags, EFF_WRATH); + eff[0].flags.set(EFF_WRATH); eff[0].duration = (skill / 20); /* max 5 */ to_vict = "A feeling of unforgiving wrath fills you."; to_room = "$n bristles with anger."; @@ -3096,7 +3095,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save * half their str and con based on the chanter's skill. */ - SET_FLAG(eff[0].flags, EFF_DISEASE); + eff[0].flags.set(EFF_DISEASE); eff[0].location = APPLY_CON; eff[0].modifier = -(skill * GET_VIEWED_CON(victim) / 2) / 100; eff[0].duration = (skill / 20); /* max 5 */ @@ -3180,7 +3179,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; } - SET_FLAG(eff[0].flags, EFF_MINOR_PARALYSIS); + eff[0].flags.set(EFF_MINOR_PARALYSIS); eff[0].duration = 2 + (skill / 15); /* max 8 */ refresh = false; to_char = "You grab $N and scramble $S nerves!"; @@ -3189,14 +3188,14 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save break; case CHANT_SPIRIT_BEAR: - SET_FLAG(eff[0].flags, EFF_SPIRIT_BEAR); + eff[0].flags.set(EFF_SPIRIT_BEAR); eff[0].duration = (skill / 20); /* max 5 */ to_vict = "The spirit of the bear consumes your body."; to_room = "$n shifts $s weight, seeming heavier and more dangerous."; break; case CHANT_SPIRIT_WOLF: - SET_FLAG(eff[0].flags, EFF_SPIRIT_WOLF); + eff[0].flags.set(EFF_SPIRIT_WOLF); eff[0].duration = (skill / 20); /* max 5 */ to_vict = "You feel a wolf-like fury come over you."; to_room = "$n seems to take on a fearsome, wolf-like demeanor."; @@ -3252,7 +3251,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save break; case SONG_SONG_OF_REST: /* increases HP and MV recovery while sleeping, see limits.c */ - SET_FLAG(eff[0].flags, EFF_SONG_OF_REST); + eff[0].flags.set(EFF_SONG_OF_REST); eff[0].duration = skill / (15 - (GET_CHA(ch) / 20)); /* max 10 */ if (ch != victim) { to_char = "You sing $N a gentle lullaby to help $M rest.\n"; @@ -3309,7 +3308,7 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save */ if (IS_NPC(victim) && !affected_by_spell(victim, spellnum)) for (i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (ANY_FLAGGED(EFF_FLAGS(victim), eff[i].flags, NUM_EFF_FLAGS)) { + if (EFF_FLAGS(victim).any() && EFF_FLAGS(victim) == eff[i].flags) { char_printf(ch, NOEFFECT); return CAST_RESULT_CHARGE; } @@ -3368,24 +3367,23 @@ int mag_affect(int skill, CharData *ch, CharData *victim, int spellnum, int save } for (i = 0; i < MAX_SPELL_EFFECTS; i++) - if (HAS_FLAGS(eff[i].flags, NUM_EFF_FLAGS) || eff[i].location != APPLY_NONE) { + if (eff[i].flags.any() || eff[i].location != APPLY_NONE) { effect_join(victim, eff + i, accum_duration, false, accum_effect, false, refresh); if (CASTING(victim)) { - if (IS_FLAGGED(eff[i].flags, EFF_SILENCE)) { + if (eff[i].flags.test(EFF_SILENCE)) { STOP_CASTING(victim); act("Your spell collapses.", false, victim, 0, 0, TO_CHAR); act("$n continues silently moving $s lips for a moment before giving " "up.", false, victim, 0, 0, TO_ROOM); - } else if (IS_FLAGGED(eff[i].flags, EFF_MINOR_PARALYSIS) || - IS_FLAGGED(eff[i].flags, EFF_MAJOR_PARALYSIS) || IS_FLAGGED(eff[i].flags, EFF_MESMERIZED)) { + } else if (eff[i].flags.test(EFF_MINOR_PARALYSIS) || eff[i].flags.test(EFF_MAJOR_PARALYSIS) || + eff[i].flags.test(EFF_MESMERIZED)) { /* Just silently stop the casting for paralysis */ STOP_CASTING(victim); } - } - if ((IS_FLAGGED(eff[i].flags, EFF_MINOR_PARALYSIS) || IS_FLAGGED(eff[i].flags, EFF_MAJOR_PARALYSIS) || - IS_FLAGGED(eff[i].flags, EFF_MESMERIZED))) { + if ((eff[i].flags.test(EFF_MINOR_PARALYSIS) || eff[i].flags.test(EFF_MAJOR_PARALYSIS) || + eff[i].flags.test(EFF_MESMERIZED))) { if (FIGHTING(victim)) stop_fighting(victim); stop_attackers(victim); @@ -3749,7 +3747,7 @@ int mag_area(int skill, CharData *ch, int spellnum, int savetype) { if (damage) { if (EFF_FLAGGED(ch, EFF_HARNESS)) { mag_damage(skill, ch, tch, spellnum, savetype); - SET_FLAG(EFF_FLAGS(ch), EFF_HARNESS); + EFF_FLAGS(ch).set(EFF_HARNESS); } else mag_damage(skill, ch, tch, spellnum, savetype); } else { @@ -3759,7 +3757,7 @@ int mag_area(int skill, CharData *ch, int spellnum, int savetype) { } } if (damage) - REMOVE_FLAG(EFF_FLAGS(ch), EFF_HARNESS); + EFF_FLAGS(ch).reset(EFF_HARNESS); /* No skill improvement if there weren't any valid targets. */ if (!found) @@ -3780,13 +3778,13 @@ void mod_for_undead_type(CharData *mob, enum undead_type type) { GET_LIFEFORCE(mob) = LIFE_UNDEAD; GET_ALIGNMENT(mob) = -1000; GET_RACE_ALIGN(mob) = RACE_ALIGN_EVIL; - REMOVE_FLAG(MOB_FLAGS(mob), MOB_AGGRESSIVE); - REMOVE_FLAG(MOB_FLAGS(mob), MOB_AGGR_EVIL); - REMOVE_FLAG(MOB_FLAGS(mob), MOB_AGGR_GOOD); - REMOVE_FLAG(MOB_FLAGS(mob), MOB_AGGR_NEUTRAL); - REMOVE_FLAG(MOB_FLAGS(mob), MOB_AGGR_EVIL_RACE); - REMOVE_FLAG(MOB_FLAGS(mob), MOB_AGGR_GOOD_RACE); - SET_FLAG(MOB_FLAGS(mob), MOB_ANIMATED); + MOB_FLAGS(mob).reset(MOB_AGGRESSIVE); + MOB_FLAGS(mob).reset(MOB_AGGR_EVIL); + MOB_FLAGS(mob).reset(MOB_AGGR_GOOD); + MOB_FLAGS(mob).reset(MOB_AGGR_NEUTRAL); + MOB_FLAGS(mob).reset(MOB_AGGR_EVIL_RACE); + MOB_FLAGS(mob).reset(MOB_AGGR_GOOD_RACE); + MOB_FLAGS(mob).set(MOB_ANIMATED); switch (type) { case MOB_ZOMBIE: @@ -4000,7 +3998,7 @@ CharData *create_undead(CharData *orig, CharData *caster, bool ISPC) { assign_triggers(new_mob, 0); /* no more exp for killing your raised dead */ GET_EXP(new_mob) = 0; - SET_FLAG(MOB_FLAGS(new_mob), MOB_NOSCRIPT); /* Prevent specprocs and triggers */ + MOB_FLAGS(new_mob).set(MOB_NOSCRIPT); /* Prevent specprocs and triggers */ return new_mob; } @@ -4060,11 +4058,11 @@ CharData *load_summoned_mob(int vnum, int destroom) { GET_SILVER(mob) = 0; GET_COPPER(mob) = 0; - REMOVE_FLAG(MOB_FLAGS(mob), MOB_HELPER); - REMOVE_FLAG(MOB_FLAGS(mob), MOB_NOSUMMON); - REMOVE_FLAG(MOB_FLAGS(mob), MOB_PEACEFUL); - REMOVE_FLAG(MOB_FLAGS(mob), MOB_PEACEKEEPER); - REMOVE_FLAG(MOB_FLAGS(mob), MOB_PROTECTOR); + MOB_FLAGS(mob).reset(MOB_HELPER); + MOB_FLAGS(mob).reset(MOB_NOSUMMON); + MOB_FLAGS(mob).reset(MOB_PEACEFUL); + MOB_FLAGS(mob).reset(MOB_PEACEKEEPER); + MOB_FLAGS(mob).reset(MOB_PROTECTOR); return mob; } @@ -4129,7 +4127,7 @@ CharData *duplicate_char(CharData *model, int destroom) { * will always be tacked on */ GET_DEFAULT_POS(new_mob) = -1; new_mob->char_specials.alignment = model->char_specials.alignment; - COPY_FLAGS(MOB_FLAGS(new_mob), MOB_FLAGS(model), NUM_MOB_FLAGS); + MOB_FLAGS(new_mob) = MOB_FLAGS(model); new_mob->char_specials.perception = model->char_specials.perception; new_mob->char_specials.hiddenness = model->char_specials.hiddenness; /* TODO: saving throw and skills */ @@ -4140,7 +4138,7 @@ CharData *duplicate_char(CharData *model, int destroom) { new_mob->mob_specials.memory = nullptr; /* END mob_special_data */ - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_SPEC); + MOB_FLAGS(new_mob).reset(MOB_SPEC); return new_mob; } @@ -4152,10 +4150,8 @@ CharData *copyplayer(CharData *ch, CharData *model) { if (!new_mob) return 0; - CLEAR_FLAGS(MOB_FLAGS(new_mob), NUM_MOB_FLAGS); - SET_FLAG(MOB_FLAGS(new_mob), MOB_ISNPC); - SET_FLAG(MOB_FLAGS(new_mob), MOB_SCAVENGER); - SET_FLAG(MOB_FLAGS(new_mob), MOB_MEMORY); + MOB_FLAGS(new_mob).reset(); + MOB_FLAGS(new_mob).set(MOB_ISNPC | MOB_SCAVENGER | MOB_MEMORY); return new_mob; } @@ -4170,14 +4166,14 @@ void phantasm_transform(CharData *ch, CharData *model, int life_hours) { char short_buf[160], long_buf[160], alias_buf[160]; effect effect; - SET_FLAG(MOB_FLAGS(ch), MOB_ILLUSORY); /* Make it an illusion */ + MOB_FLAGS(ch).set(MOB_ILLUSORY); /* Make it an illusion */ /* Make it expire */ if (life_hours > 0) { memset(&effect, 0, sizeof(effect)); effect.type = SPELL_PHANTASM; effect.duration = life_hours; - SET_FLAG(effect.flags, EFF_ANIMATED); + effect.flags.set(EFF_ANIMATED); effect_to_char(ch, &effect); } @@ -4225,7 +4221,7 @@ CharData *summon_phantasm(CharData *ch, int vnum, int life_hours) { return nullptr; phantasm_transform(new_mob, nullptr, life_hours); - SET_FLAG(MOB_FLAGS(new_mob), MOB_NOSCRIPT); /* Prevent specprocs and triggers */ + MOB_FLAGS(new_mob).set(MOB_NOSCRIPT); /* Prevent specprocs and triggers */ return new_mob; } @@ -4327,7 +4323,7 @@ int mag_summon(int skill, CharData *ch, CharData *vict, ObjData *obj, int spelln memset(&eff, 0, sizeof(eff)); eff.type = SPELL_ANIMATE_DEAD; eff.duration = (int)(base_duration * preserve_mult); - SET_FLAG(eff.flags, EFF_ANIMATED); + eff.flags.set(EFF_ANIMATED); eff.modifier = 0; eff.location = APPLY_NONE; effect_to_char(new_mob, &eff); @@ -4337,23 +4333,23 @@ int mag_summon(int skill, CharData *ch, CharData *vict, ObjData *obj, int spelln act("$n raises $N.", false, ch, 0, new_mob, TO_ROOM); eff.type = SPELL_CHARM; eff.duration = (int)(base_duration * preserve_mult) + 1; - SET_FLAG(eff.flags, EFF_CHARM); + eff.flags.set(EFF_CHARM); eff.modifier = 0; eff.location = APPLY_NONE; effect_to_char(new_mob, &eff); add_follower(new_mob, ch); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGRESSIVE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_SPEC); + MOB_FLAGS(new_mob).reset(MOB_AGGRESSIVE); + MOB_FLAGS(new_mob).reset(MOB_SPEC); } else { /* not able to control it */ act("You raise $N, and $E doesn't seem too happy about it.", false, ch, 0, new_mob, TO_CHAR); act("$n raises $N, and $E doesn't seem too happy about it.", false, ch, 0, new_mob, TO_ROOM); /* we want it aggressive, but not against anything in particular */ - SET_FLAG(MOB_FLAGS(new_mob), MOB_AGGRESSIVE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_EVIL); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_GOOD); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_NEUTRAL); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_EVIL_RACE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_GOOD_RACE); + MOB_FLAGS(new_mob).set(MOB_AGGRESSIVE); + MOB_FLAGS(new_mob).reset(MOB_AGGR_EVIL); + MOB_FLAGS(new_mob).reset(MOB_AGGR_GOOD); + MOB_FLAGS(new_mob).reset(MOB_AGGR_NEUTRAL); + MOB_FLAGS(new_mob).reset(MOB_AGGR_EVIL_RACE); + MOB_FLAGS(new_mob).reset(MOB_AGGR_GOOD_RACE); attack(new_mob, ch); } @@ -4398,26 +4394,26 @@ int mag_summon(int skill, CharData *ch, CharData *vict, ObjData *obj, int spelln memset(&eff, 0, sizeof(eff)); eff.type = SPELL_CHARM; eff.duration = 1000; - SET_FLAG(eff.flags, EFF_CHARM); + eff.flags.set(EFF_CHARM); eff.modifier = 0; eff.location = APPLY_NONE; effect_to_char(new_mob, &eff); add_follower(new_mob, ch); - SET_FLAG(MOB_FLAGS(new_mob), MOB_NO_CLASS_AI); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_EVIL); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_GOOD); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_NEUTRAL); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_EVIL_RACE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_GOOD_RACE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGRESSIVE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_STAY_ZONE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_PROTECTOR); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_PEACEKEEPER); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_HELPER); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_MEMORY); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_WIMPY); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_NOSUMMON); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_SPEC); + MOB_FLAGS(new_mob).set(MOB_NO_CLASS_AI); + MOB_FLAGS(new_mob).reset(MOB_AGGR_EVIL); + MOB_FLAGS(new_mob).reset(MOB_AGGR_GOOD); + MOB_FLAGS(new_mob).reset(MOB_AGGR_NEUTRAL); + MOB_FLAGS(new_mob).reset(MOB_AGGR_EVIL_RACE); + MOB_FLAGS(new_mob).reset(MOB_AGGR_GOOD_RACE); + MOB_FLAGS(new_mob).reset(MOB_AGGRESSIVE); + MOB_FLAGS(new_mob).reset(MOB_STAY_ZONE); + MOB_FLAGS(new_mob).reset(MOB_PROTECTOR); + MOB_FLAGS(new_mob).reset(MOB_PEACEKEEPER); + MOB_FLAGS(new_mob).reset(MOB_HELPER); + MOB_FLAGS(new_mob).reset(MOB_MEMORY); + MOB_FLAGS(new_mob).reset(MOB_WIMPY); + MOB_FLAGS(new_mob).reset(MOB_NOSUMMON); + MOB_FLAGS(new_mob).reset(MOB_SPEC); GET_LIFEFORCE(new_mob) = LIFE_MAGIC; /* Feedback */ @@ -4462,7 +4458,7 @@ int mag_summon(int skill, CharData *ch, CharData *vict, ObjData *obj, int spelln /* Set this so aggro mobs will still attack it, even though * it technically isn't a player. */ - SET_FLAG(MOB_FLAGS(new_mob), MOB_PLAYER_PHANTASM); + MOB_FLAGS(new_mob).set(MOB_PLAYER_PHANTASM); } else { /* Making an illusory copy of an NPC. */ new_mob = duplicate_char(vict, ch->in_room); @@ -4473,32 +4469,32 @@ int mag_summon(int skill, CharData *ch, CharData *vict, ObjData *obj, int spelln } phantasm_transform(new_mob, vict, duration); } - SET_FLAG(MOB_FLAGS(new_mob), MOB_NOSCRIPT); /* Prevent specprocs and triggers */ + MOB_FLAGS(new_mob).set(MOB_NOSCRIPT); /* Prevent specprocs and triggers */ /* need to add charm flag */ memset(&eff, 0, sizeof(eff)); eff.type = SPELL_CHARM; eff.duration = 1000; - SET_FLAG(eff.flags, EFF_CHARM); + eff.flags.set(EFF_CHARM); eff.modifier = 0; eff.location = APPLY_NONE; effect_to_char(new_mob, &eff); add_follower(new_mob, ch); - SET_FLAG(MOB_FLAGS(new_mob), MOB_NO_CLASS_AI); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_EVIL); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_GOOD); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_NEUTRAL); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_EVIL_RACE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGR_GOOD_RACE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_AGGRESSIVE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_STAY_ZONE); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_PROTECTOR); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_PEACEKEEPER); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_HELPER); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_WIMPY); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_MEMORY); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_NOSUMMON); - REMOVE_FLAG(MOB_FLAGS(new_mob), MOB_SPEC); + MOB_FLAGS(new_mob).set(MOB_NO_CLASS_AI); + MOB_FLAGS(new_mob).reset(MOB_AGGR_EVIL); + MOB_FLAGS(new_mob).reset(MOB_AGGR_GOOD); + MOB_FLAGS(new_mob).reset(MOB_AGGR_NEUTRAL); + MOB_FLAGS(new_mob).reset(MOB_AGGR_EVIL_RACE); + MOB_FLAGS(new_mob).reset(MOB_AGGR_GOOD_RACE); + MOB_FLAGS(new_mob).reset(MOB_AGGRESSIVE); + MOB_FLAGS(new_mob).reset(MOB_STAY_ZONE); + MOB_FLAGS(new_mob).reset(MOB_PROTECTOR); + MOB_FLAGS(new_mob).reset(MOB_PEACEKEEPER); + MOB_FLAGS(new_mob).reset(MOB_HELPER); + MOB_FLAGS(new_mob).reset(MOB_WIMPY); + MOB_FLAGS(new_mob).reset(MOB_MEMORY); + MOB_FLAGS(new_mob).reset(MOB_NOSUMMON); + MOB_FLAGS(new_mob).reset(MOB_SPEC); GET_LIFEFORCE(new_mob) = LIFE_MAGIC; /* Feedback */ @@ -4700,7 +4696,7 @@ int mag_unaffect(int skill, CharData *ch, CharData *victim, int spellnum, int ty to_vict = "You return to your normal size.&0"; break; case SPELL_EXTINGUISH: - REMOVE_FLAG(EFF_FLAGS(victim), EFF_ON_FIRE); + EFF_FLAGS(victim).reset(EFF_ON_FIRE); char_printf(victim, "You are doused with a magical liquid.\n"); return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; case SONG_JOYFUL_NOISE: @@ -4925,8 +4921,8 @@ int mag_alter_obj(int skill, CharData *ch, ObjData *obj, int spellnum, int savet if (OBJ_EFF_FLAGGED(obj, EFF_BLESS)) { to_char = "It's already blessed."; } else { - SET_FLAG(GET_OBJ_EFF_FLAGS(obj), EFF_BLESS); - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_ANTI_EVIL); + GET_OBJ_EFF_FLAGS(obj).set(EFF_BLESS); + GET_OBJ_FLAGS(obj).set(ITEM_ANTI_EVIL); to_char = "$p glows briefly."; } break; @@ -4960,19 +4956,18 @@ int mag_alter_obj(int skill, CharData *ch, ObjData *obj, int spellnum, int savet to_char = "$p doesn't seem receptive to the blessing."; /* Already has magical effects */ - else if (HAS_FLAGS(GET_OBJ_EFF_FLAGS(obj), NUM_EFF_FLAGS) || i < 0 /* see obj->affected check, above */ - ) + else if (GET_OBJ_EFF_FLAGS(obj).any() || i < 0) { /* see obj->affected check, above */ to_char = "The blessing is repelled from $p."; - else { - SET_FLAG(GET_OBJ_EFF_FLAGS(obj), EFF_BLESS); - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_ANTI_EVIL); + } else { + GET_OBJ_EFF_FLAGS(obj).set(EFF_BLESS); + GET_OBJ_FLAGS(obj).set(ITEM_ANTI_EVIL); to_char = "$p glows briefly."; result = CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; } break; case SPELL_CURSE: if (!OBJ_FLAGGED(obj, ITEM_NODROP)) { - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_NODROP); + GET_OBJ_FLAGS(obj).set(ITEM_NODROP); if (GET_OBJ_TYPE(obj) == ITEM_WEAPON) GET_OBJ_VAL(obj, VAL_WEAPON_DICE_SIZE)--; to_char = "$p briefly glows red."; @@ -4984,8 +4979,8 @@ int mag_alter_obj(int skill, CharData *ch, ObjData *obj, int spellnum, int savet if (OBJ_EFF_FLAGGED(obj, EFF_BLESS)) { to_char = "It's already hexed."; } else { - SET_FLAG(GET_OBJ_EFF_FLAGS(obj), EFF_BLESS); - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_ANTI_GOOD); + GET_OBJ_EFF_FLAGS(obj).set(EFF_BLESS); + GET_OBJ_FLAGS(obj).set(ITEM_ANTI_GOOD); to_char = "$p is imbued with a dark aura."; } break; @@ -5019,12 +5014,11 @@ int mag_alter_obj(int skill, CharData *ch, ObjData *obj, int spellnum, int savet to_char = "$p doesn't seem receptive to the malediction."; /* Already has magical effects */ - else if (HAS_FLAGS(GET_OBJ_EFF_FLAGS(obj), NUM_EFF_FLAGS) || i < 0 /* see obj->affected check, above */ - ) + else if (GET_OBJ_EFF_FLAGS(obj).any() || i < 0) { /* see obj->affected check, above */ to_char = "The hex is repelled from $p."; - else { - SET_FLAG(GET_OBJ_EFF_FLAGS(obj), EFF_BLESS); - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_ANTI_GOOD); + } else { + GET_OBJ_EFF_FLAGS(obj).set(EFF_BLESS); + GET_OBJ_FLAGS(obj).set(ITEM_ANTI_GOOD); to_char = "$p is imbued with a dark aura."; result = CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; } @@ -5046,7 +5040,7 @@ int mag_alter_obj(int skill, CharData *ch, ObjData *obj, int spellnum, int savet break; case SPELL_REMOVE_CURSE: if (OBJ_FLAGGED(obj, ITEM_NODROP)) { - REMOVE_FLAG(GET_OBJ_FLAGS(obj), ITEM_NODROP); + GET_OBJ_FLAGS(obj).reset(ITEM_NODROP); if (GET_OBJ_TYPE(obj) == ITEM_WEAPON) GET_OBJ_VAL(obj, VAL_WEAPON_DICE_SIZE)++; to_char = "$p briefly glows blue."; @@ -5076,7 +5070,7 @@ int mag_alter_obj(int skill, CharData *ch, ObjData *obj, int spellnum, int savet switch (spellnum) { case SPELL_INVISIBLE: case SPELL_MASS_INVIS: - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_INVISIBLE); + GET_OBJ_FLAGS(obj).set(ITEM_INVISIBLE); break; } @@ -5237,7 +5231,7 @@ int mag_room(int skill, CharData *ch, int spellnum) { /* set the affection */ if (eff != -1) - SET_FLAG(ROOM_EFFECTS(reff->room), eff); + ROOM_EFFECTS(reff->room).set(eff); if (to_char == nullptr) char_printf(ch, NOEFFECT); @@ -5369,8 +5363,8 @@ int get_vitality_hp_gain(CharData *ch, int spellnum) { * if it returns 1. */ bool affected_by_armor_spells(CharData *victim, int spellnum) { - /* If the target is already affected by the spell being cast, - * return false so mag_affect continues to cast the spell and + /* If the target is already affected by the spell being cast, + * return false so mag_affect continues to cast the spell and * refresh the spell duration. */ if (!IS_NPC(victim) && affected_by_spell(victim, spellnum)) { @@ -5378,15 +5372,15 @@ bool affected_by_armor_spells(CharData *victim, int spellnum) { } else if (affected_by_spell(victim, spellnum)) { return true; - - /* If the target is not already affected by the spell being cast, - * but is affected by another armor spell, return true so mag_affect - * bails out and the character doesn't end up with two armor effects. - */ + + /* If the target is not already affected by the spell being cast, + * but is affected by another armor spell, return true so mag_affect + * bails out and the character doesn't end up with two armor effects. + */ } else if (affected_by_spell(victim, SPELL_ARMOR) || affected_by_spell(victim, SPELL_BARKSKIN) || - affected_by_spell(victim, SPELL_BONE_ARMOR) || affected_by_spell(victim, SPELL_DEMONSKIN) || - affected_by_spell(victim, SPELL_GAIAS_CLOAK) || affected_by_spell(victim, SPELL_ICE_ARMOR) || - affected_by_spell(victim, SPELL_MIRAGE)) { + affected_by_spell(victim, SPELL_BONE_ARMOR) || affected_by_spell(victim, SPELL_DEMONSKIN) || + affected_by_spell(victim, SPELL_GAIAS_CLOAK) || affected_by_spell(victim, SPELL_ICE_ARMOR) || + affected_by_spell(victim, SPELL_MIRAGE)) { return true; } @@ -5675,7 +5669,7 @@ bool wall_block_check(CharData *actor, CharData *motivator, int dir) { act("You spread yourself out on $p&0 and your flames go out in a " "&bsizzle of steam&0.", false, motivator, wall, 0, TO_CHAR); - REMOVE_FLAG(EFF_FLAGS(motivator), EFF_ON_FIRE); + EFF_FLAGS(motivator).reset(EFF_ON_FIRE); } else if (GET_OBJ_VAL(wall, VAL_WALL_SPELL) == SPELL_WALL_OF_ICE && EFF_FLAGGED(actor, EFF_ON_FIRE)) { act("$n&0 spreads $mself out on $p&0 and with a &bsizzle&0, $s flames " "are put out.", @@ -5683,7 +5677,7 @@ bool wall_block_check(CharData *actor, CharData *motivator, int dir) { act("You spread yourself out on $p&0 and your flames go out in a " "&bsizzle of steam&0.", false, actor, wall, 0, TO_CHAR); - REMOVE_FLAG(EFF_FLAGS(actor), EFF_ON_FIRE); + EFF_FLAGS(actor).reset(EFF_ON_FIRE); /* No flames being put out. Is this a mounted situation? */ } else if (actor && motivator && actor != motivator && RIDING(actor) == motivator) { diff --git a/src/mail.cpp b/src/mail.cpp index a2087e07..6cf2e154 100644 --- a/src/mail.cpp +++ b/src/mail.cpp @@ -526,8 +526,8 @@ void postmaster_send_mail(CharData *ch, CharData *mailman, int cmd, char *arg) { act(buf, false, mailman, 0, ch, TO_VICT); money_convert(ch, price); GET_COPPER(ch) -= price; - SET_FLAG(PLR_FLAGS(ch), PLR_MAILING); - SET_FLAG(PLR_FLAGS(ch), PLR_WRITING); + PLR_FLAGS(ch).set(PLR_MAILING); + PLR_FLAGS(ch).set(PLR_WRITING); mail_write(ch->desc, nullptr, MAX_MAIL_SIZE, recipient); } diff --git a/src/medit.cpp b/src/medit.cpp index c675fe57..3626fc40 100644 --- a/src/medit.cpp +++ b/src/medit.cpp @@ -248,7 +248,7 @@ void init_mobile(CharData *mob) { mob->natural_abils.cha = 11; mob->affected_abils = mob->natural_abils; - SET_FLAG(MOB_FLAGS(mob), MOB_ISNPC); + MOB_FLAGS(mob).set(MOB_ISNPC); mob->player_specials = &dummy_mob; } @@ -552,8 +552,9 @@ void medit_save_to_disk(int zone_num) { "%d %d %d %d %ld %d\n" "%d %d %d %d %d %d %d\n", (GET_NAMELIST(mob) && *GET_NAMELIST(mob)) ? GET_NAMELIST(mob) : "undefined", - (GET_SDESC(mob) && *GET_SDESC(mob)) ? GET_SDESC(mob) : "undefined", buf1, buf2, MOB_FLAGS(mob)[0], - EFF_FLAGS(mob)[0], GET_ALIGNMENT(mob), GET_LEVEL(mob), 20 - mob->mob_specials.ex_hitroll, + (GET_SDESC(mob) && *GET_SDESC(mob)) ? GET_SDESC(mob) : "undefined", buf1, buf2, + MOB_FLAGS(mob).to_ulong(), EFF_FLAGS(mob).to_ulong(), GET_ALIGNMENT(mob), GET_LEVEL(mob), + 20 - mob->mob_specials.ex_hitroll, /* Hitroll -> THAC0 */ GET_EX_AC(mob) / 10, (mob)->mob_specials.ex_hpnumdice, (mob)->mob_specials.ex_hpsizedice, GET_MOVE(mob), (mob)->mob_specials.ex_damnodice, (mob)->mob_specials.ex_damsizedice, mob->mob_specials.ex_damroll, GET_EX_COPPER(mob), @@ -579,9 +580,6 @@ void medit_save_to_disk(int zone_num) { if (GET_CHA(mob) != 11) fprintf(mob_file, "Cha: %d\n", GET_CHA(mob)); - fprintf(mob_file, "AFF2: %ld\n", EFF_FLAGS(mob)[1]); - fprintf(mob_file, "AFF3: %ld\n", EFF_FLAGS(mob)[2]); - fprintf(mob_file, "MOB2: %ld\n", MOB_FLAGS(mob)[1]); fprintf(mob_file, "PERC: %ld\n", GET_PERCEPTION(mob)); fprintf(mob_file, "HIDE: %ld\n", GET_HIDDENNESS(mob)); fprintf(mob_file, "Lifeforce: %d\n", GET_LIFEFORCE(mob)); @@ -726,7 +724,7 @@ void medit_disp_mob_flags(DescriptorData *d) { char_printf(d->character, strcat(buf, "\n")); } - sprintflag(buf1, MOB_FLAGS(OLC_MOB(d)), NUM_MOB_FLAGS, action_bits); + sprintflag(buf1, MOB_FLAGS(OLC_MOB(d)), action_bits); sprintf(buf, "\nCurrent flags : %s%s%s\nEnter mob flags (0 to quit) : ", cyn, buf1, nrm); char_printf(d->character, buf); } @@ -782,7 +780,7 @@ void medit_disp_aff_flags(DescriptorData *d) { char_printf(d->character, strcat(buf, "\n")); } - sprintflag(buf1, EFF_FLAGS(OLC_MOB(d)), NUM_EFF_FLAGS, effect_flags); + sprintflag(buf1, EFF_FLAGS(OLC_MOB(d)), effect_flags); sprintf(buf, "\nCurrent flags : %s%s%s\nEnter aff flags (0 to quit):\n", cyn, buf1, nrm); char_printf(d->character, buf); } @@ -872,8 +870,8 @@ void medit_disp_menu(DescriptorData *d) { GET_PERCEPTION(mob), GET_HIDDENNESS(mob)); char_printf(d->character, menu.c_str()); - sprintflag(buf1, MOB_FLAGS(mob), NUM_MOB_FLAGS, action_bits); - sprintflag(buf2, EFF_FLAGS(mob), NUM_EFF_FLAGS, effect_flags); + sprintflag(buf1, MOB_FLAGS(mob), action_bits); + sprintflag(buf2, EFF_FLAGS(mob), effect_flags); menu = ""; menu += fmt::format("&2&bN&0) Life Force : {}{}&0\n", LIFEFORCE_COLOR(mob), capitalize(LIFEFORCE_NAME(mob))); @@ -908,7 +906,7 @@ void medit_parse(DescriptorData *d, char *arg) { /*-------------------------------------------------------------------*/ case MEDIT_CONFIRM_SAVESTRING: /*. Ensure mob has MOB_ISNPC set or things will go pair shaped . */ - SET_FLAG(MOB_FLAGS(OLC_MOB(d)), MOB_ISNPC); + MOB_FLAGS(OLC_MOB(d)).set(MOB_ISNPC); switch (*arg) { case 'y': case 'Y': @@ -1167,7 +1165,7 @@ void medit_parse(DescriptorData *d, char *arg) { if ((i = atoi(arg)) == 0) break; else if (i > 0 && i <= NUM_MOB_FLAGS) - TOGGLE_FLAG(MOB_FLAGS(OLC_MOB(d)), i - 1); + MOB_FLAGS(OLC_MOB(d)).flip(i - 1); medit_disp_mob_flags(d); return; /*-------------------------------------------------------------------*/ @@ -1175,7 +1173,7 @@ void medit_parse(DescriptorData *d, char *arg) { if ((i = atoi(arg)) == 0) break; else if (i > 0 && i <= NUM_EFF_FLAGS) - TOGGLE_FLAG(EFF_FLAGS(OLC_MOB(d)), i - 1); + EFF_FLAGS(OLC_MOB(d)).flip(i - 1); medit_disp_aff_flags(d); return; /*-------------------------------------------------------------------*/ diff --git a/src/mobact.cpp b/src/mobact.cpp index 24395852..a657a68a 100644 --- a/src/mobact.cpp +++ b/src/mobact.cpp @@ -87,11 +87,12 @@ void mobile_activity(void) { continue; /* Don't execute procs when someone is switched in. */ - if (POSSESSED (ch)) + if (POSSESSED(ch)) continue; - + /* If lower than default position, get up. */ - if ((GET_MOB_WAIT(ch) <= 0 && GET_DEFAULT_POS(ch) > GET_POS(ch) && GET_STANCE(ch) >= STANCE_RESTING) && !EVENT_FLAGGED(ch, EVENT_REGEN_SPELLSLOT)) { + if ((GET_MOB_WAIT(ch) <= 0 && GET_DEFAULT_POS(ch) > GET_POS(ch) && GET_STANCE(ch) >= STANCE_RESTING) && + !EVENT_FLAGGED(ch, EVENT_REGEN_SPELLSLOT)) { switch (GET_DEFAULT_POS(ch)) { case POS_PRONE: do_recline(ch, "", 0, 0); @@ -115,7 +116,7 @@ void mobile_activity(void) { if (MOB_PERFORMS_SCRIPTS(ch) && MOB_FLAGGED(ch, MOB_SPEC) && !no_specials) { if (mob_index[GET_MOB_RNUM(ch)].func == nullptr) { log("{} (#{:d}): Attempting to call non-existing mob func", GET_NAME(ch), GET_MOB_VNUM(ch)); - REMOVE_FLAG(MOB_FLAGS(ch), MOB_SPEC); + MOB_FLAGS(ch).reset(MOB_SPEC); } else if ((mob_index[GET_MOB_RNUM(ch)].func)(ch, ch, 0, "")) /* If it executes okay, go on to the next mob. */ continue; @@ -279,7 +280,7 @@ void mobile_spec_activity(void) { /* Look for people I'd like to attack */ if (!ROOM_FLAGGED(ch->in_room, ROOM_PEACEFUL) && !EFF_FLAGGED(ch, EFF_MESMERIZED) && - (!EFF_FLAGGED(ch, EFF_CHARM) || (ch->master && ch->master->in_room != ch->in_room))) { + (!EFF_FLAGGED(ch, EFF_CHARM) || (ch->master && ch->master->in_room != ch->in_room))) { if ((vict = find_aggr_target(ch))) { mob_attack(ch, vict); continue; @@ -377,9 +378,9 @@ bool mob_movement(CharData *ch) { } else { /* Decided to move */ perform_move(ch, random_number(0, NUM_OF_DIRS - 1), 1, true); - SET_FLAG(EFF_FLAGS(ch), EFF_MISDIRECTING); + EFF_FLAGS(ch).set(EFF_MISDIRECTING); perform_move(ch, door, 1, false); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_MISDIRECTING); + EFF_FLAGS(ch).reset(EFF_MISDIRECTING); } } else perform_move(ch, door, 1, false); diff --git a/src/modify.cpp b/src/modify.cpp index 0f1260d1..c16d3a48 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -61,7 +61,7 @@ void string_write_limit(DescriptorData *d, char **writeto, size_t len, int maxli return; if (d->character && !IS_NPC(d->character)) - SET_FLAG(PLR_FLAGS(d->character), PLR_WRITING); + PLR_FLAGS(d->character).set(PLR_WRITING); /* A pointer to the actual string you are editing. */ d->str = writeto; @@ -300,9 +300,9 @@ void parse_action(int command, char *string, DescriptorData *d) { *s = temp; } else strcat(buf, t); - /* - * This is kind of annoying...but some people like it. - */ + /* + * This is kind of annoying...but some people like it. + */ #if 0 sprintf(buf, "%s\n%d line%sshown.\n", buf, total_len, ((total_len != 1) ? "s " : " ")); #endif @@ -736,8 +736,8 @@ void string_add(DescriptorData *d, char *str) { } } if (d->character && !IS_NPC(d->character)) { - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_WRITING); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_MAILING); + PLR_FLAGS(d->character).reset(PLR_WRITING); + PLR_FLAGS(d->character).reset(PLR_MAILING); } if (d->backstr) free(d->backstr); diff --git a/src/movement.cpp b/src/movement.cpp index 9384a701..a2b31188 100644 --- a/src/movement.cpp +++ b/src/movement.cpp @@ -70,9 +70,9 @@ bool can_travel_on_water(CharData *ch) { #define CANCEL_GRAVITY \ { \ if (ch) \ - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_GRAVITY); \ + GET_EVENT_FLAGS(ch).reset(EVENT_GRAVITY); \ else \ - REMOVE_FLAG(GET_EVENT_FLAGS(obj), EVENT_GRAVITY); \ + GET_EVENT_FLAGS(obj).reset(EVENT_GRAVITY); \ return EVENT_FINISHED; \ } EVENTFUNC(gravity_event) { @@ -192,7 +192,7 @@ void start_char_falling(CharData *ch) { event_obj->ch = ch; event_obj->start_room = IN_ROOM(ch); event_create(EVENT_GRAVITY, gravity_event, event_obj, true, &(ch->events), 0); - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_GRAVITY); + GET_EVENT_FLAGS(ch).set(EVENT_GRAVITY); } } @@ -203,7 +203,7 @@ void start_obj_falling(ObjData *obj) { event_obj->obj = obj; event_obj->start_room = IN_ROOM(obj); event_create(EVENT_GRAVITY, gravity_event, event_obj, true, &(obj->events), 0); - SET_FLAG(GET_EVENT_FLAGS(obj), EVENT_GRAVITY); + GET_EVENT_FLAGS(obj).set(EVENT_GRAVITY); } } @@ -270,8 +270,9 @@ void falling_yell(CharData *ch) { dirstr = buf2; } - sprintf(buf, "You hear a %s %s from %s, which quickly fades.", random_number(0, 10) < 5 ? "surprised" : "sudden", - random_number(0, 10) < 6 ? "shriek" : "yelp", dirstr); + sprintf(buf, "You hear a %s %s from %s, which quickly fades.", + random_number(0, 10) < 5 ? "surprised" : "sudden", random_number(0, 10) < 6 ? "shriek" : "yelp", + dirstr); ch->in_room = EXIT_NDEST(world[was_in].exits[dir]); act(buf, false, ch, 0, 0, TO_ROOM); @@ -378,7 +379,7 @@ void stop_follower(CharData *ch, int violent) { } if (EFF_FLAGGED(ch, EFF_CHARM)) { - REMOVE_FLAG(EFF_FLAGS(ch), EFF_CHARM); + EFF_FLAGS(ch).reset(EFF_CHARM); /* The following is necessary to prevent the sharing of summoned mounts. * If the mob were not removed from the game at this point, a paladin @@ -393,7 +394,7 @@ void stop_follower(CharData *ch, int violent) { SET_COOLDOWN(ch->master, CD_SUMMON_MOUNT, 12 MUD_HR); } - REMOVE_FLAG(EFF_FLAGS(ch), EFF_SHADOWING); + EFF_FLAGS(ch).reset(EFF_SHADOWING); ch->master = nullptr; } @@ -467,8 +468,8 @@ void disband_group(CharData *master, bool verbose, bool forceful) { g->groupee->group_master = nullptr; master->groupees = g->next; if (verbose) - act(forceful ? "&2The group has been disbanded.&0" : "&2$n &2has disbanded the group.&0", false, - master, 0, g->groupee, TO_VICT); + act(forceful ? "&2The group has been disbanded.&0" : "&2$n &2has disbanded the group.&0", false, master, 0, + g->groupee, TO_VICT); free(g); } } @@ -534,8 +535,7 @@ void ungroup(CharData *ch, bool verbose, bool forceful) { continue; } if (verbose) - act(forceful ? "&2$n &2has been kicked out of your group!&0" - : "&2$n &2has left your group!&0", + act(forceful ? "&2$n &2has been kicked out of your group!&0" : "&2$n &2has left your group!&0", true, ch, 0, g->next->groupee, TO_VICT); g = g->next; } @@ -544,10 +544,10 @@ void ungroup(CharData *ch, bool verbose, bool forceful) { ch->group_master = nullptr; if (verbose) { - act(forceful ? "&2You have been kicked out of your group.&0" : "&2You have left your group!&0", - false, ch, 0, 0, TO_CHAR); - act(forceful ? "&2You have kicked $n &2out of your group.&0" : "&2$n &2has left your group!&0", - false, ch, 0, master, TO_VICT); + act(forceful ? "&2You have been kicked out of your group.&0" : "&2You have left your group!&0", false, + ch, 0, 0, TO_CHAR); + act(forceful ? "&2You have kicked $n &2out of your group.&0" : "&2$n &2has left your group!&0", false, + ch, 0, master, TO_VICT); } } } else diff --git a/src/oedit.cpp b/src/oedit.cpp index f794ce19..82d7a77e 100644 --- a/src/oedit.cpp +++ b/src/oedit.cpp @@ -429,11 +429,11 @@ void oedit_save_to_disk(int zone_num) { GET_OBJ_VNUM(obj), (obj->name && *obj->name) ? obj->name : "undefined", (obj->short_description && *obj->short_description) ? obj->short_description : "undefined", (obj->description && *obj->description) ? obj->description : "undefined", buf1, GET_OBJ_TYPE(obj), - GET_OBJ_FLAGS(obj)[0], GET_OBJ_WEAR(obj), GET_OBJ_LEVEL(obj), GET_OBJ_VAL(obj, 0), + GET_OBJ_FLAGS(obj).to_ulong(), GET_OBJ_WEAR(obj), GET_OBJ_LEVEL(obj), GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3), GET_OBJ_VAL(obj, 4), GET_OBJ_VAL(obj, 5), GET_OBJ_VAL(obj, 6), GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), - GET_OBJ_TIMER(obj), GET_OBJ_EFF_FLAGS(obj)[0], 0, 0, GET_OBJ_EFF_FLAGS(obj)[1], - GET_OBJ_EFF_FLAGS(obj)[2]); + GET_OBJ_TIMER(obj), GET_OBJ_EFF_FLAGS(obj).to_ulong(), 0, 0, GET_OBJ_EFF_FLAGS(obj).to_ulong(), + GET_OBJ_EFF_FLAGS(obj).to_ulong()); script_save_to_disk(fp, obj, OBJ_TRIGGER); @@ -471,7 +471,7 @@ void oedit_save_to_disk(int zone_num) { fprintf(fp, "H\n%ld\n", obj->obj_flags.hiddenness); if (GET_OBJ_FLAGS(obj)[1]) - fprintf(fp, "X\n%ld\n", GET_OBJ_FLAGS(obj)[1]); + fprintf(fp, "X\n%ld\n", GET_OBJ_FLAGS(obj).to_ulong()); } } @@ -645,7 +645,7 @@ void oedit_disp_aff_flags(DescriptorData *d) { } *buf1 = '\0'; - sprintflag(buf1, GET_OBJ_EFF_FLAGS(OLC_OBJ(d)), NUM_EFF_FLAGS, effect_flags); + sprintflag(buf1, GET_OBJ_EFF_FLAGS(OLC_OBJ(d)), effect_flags); sprintf(buf, "\nSpell flags: %s%s%s\n" "Enter spell flag, 0 to quit : ", @@ -1018,7 +1018,7 @@ void oedit_disp_extra_menu(DescriptorData *d) { char_printf(d->character, strcat(buf, "\n")); } - sprintflag(buf1, GET_OBJ_FLAGS(OLC_OBJ(d)), NUM_ITEM_FLAGS, extra_bits); + sprintflag(buf1, GET_OBJ_FLAGS(OLC_OBJ(d)), extra_bits); sprintf(buf, "\nObject flags: %s%s%s\n" "Enter object extra flag (0 to quit):\n", @@ -1180,7 +1180,7 @@ void oedit_disp_menu(DescriptorData *d) { get_char_cols(d->character); /*. Build buffers for first part of menu . */ - sprintflag(buf2, GET_OBJ_FLAGS(obj), NUM_ITEM_FLAGS, extra_bits); + sprintflag(buf2, GET_OBJ_FLAGS(obj), extra_bits); /* * Build first half of menu. @@ -1227,7 +1227,7 @@ void oedit_disp_menu(DescriptorData *d) { oedit_disp_obj_values(d); *buf1 = '\0'; - sprintflag(buf1, GET_OBJ_EFF_FLAGS(obj), NUM_EFF_FLAGS, effect_flags); + sprintflag(buf1, GET_OBJ_EFF_FLAGS(obj), effect_flags); sprintf(buf, "%sE%s) Applies menu\n" "%sF%s) Extra descriptions menu\n" @@ -1259,7 +1259,7 @@ void oedit_parse(DescriptorData *d, char *arg) { iedit_save_changes(d); log(LogSeverity::Debug, std::max(LVL_GOD, GET_INVIS_LEV(d->character)), "OLC: {} edits unique obj {}", GET_NAME(d->character), OLC_IOBJ(d)->short_description); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_WRITING); + PLR_FLAGS(d->character).reset(PLR_WRITING); STATE(d) = CON_PLAYING; } else { char_printf(d->character, "Saving object to memory.\n"); @@ -1444,9 +1444,9 @@ void oedit_parse(DescriptorData *d, char *arg) { } else if (number == 0) break; else { - TOGGLE_FLAG(GET_OBJ_FLAGS(OLC_OBJ(d)), number - 1); + GET_OBJ_FLAGS(OLC_OBJ(d)).flip(number - 1); /* This flag shouldn't be on object prototypes */ - REMOVE_FLAG(GET_OBJ_FLAGS(OLC_OBJ(d)), ITEM_WAS_DISARMED); + GET_OBJ_FLAGS(OLC_OBJ(d)).reset(ITEM_WAS_DISARMED); oedit_disp_extra_menu(d); return; } @@ -1616,7 +1616,7 @@ void oedit_parse(DescriptorData *d, char *arg) { if (number == 0) break; else if (number > 0 && number <= NUM_EFF_FLAGS) - TOGGLE_FLAG(GET_OBJ_EFF_FLAGS(OLC_OBJ(d)), number - 1); + GET_OBJ_EFF_FLAGS(OLC_OBJ(d)).flip(number - 1); else char_printf(d->character, "That's not a valid choice!\n"); oedit_disp_aff_flags(d); @@ -1783,7 +1783,7 @@ ACMD(do_iedit) { /* Setup OLC */ CREATE(ch->desc->olc, OLCData, 1); - SET_FLAG(PLR_FLAGS(ch), PLR_WRITING); + PLR_FLAGS(ch).set(PLR_WRITING); iedit_setup_existing(ch->desc, obj); act("$n starts using OLC.", true, ch, 0, 0, TO_ROOM); diff --git a/src/olc.cpp b/src/olc.cpp index e6b51349..f010673d 100644 --- a/src/olc.cpp +++ b/src/olc.cpp @@ -547,7 +547,7 @@ ACMD(do_olc) { } act("$n starts using OLC.", true, d->character, 0, 0, TO_ROOM); - SET_FLAG(PLR_FLAGS(ch), PLR_WRITING); + PLR_FLAGS(ch).set(PLR_WRITING); } /*------------------------------------------------------------*\ @@ -752,7 +752,7 @@ void cleanup_olc(DescriptorData *d, byte cleanup_type) { * Restore descriptor playing status. */ if (d->character) { - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_WRITING); + PLR_FLAGS(d->character).reset(PLR_WRITING); STATE(d) = CON_PLAYING; act("$n stops using OLC.", true, d->character, 0, 0, TO_ROOM); } diff --git a/src/pfiles.cpp b/src/pfiles.cpp index 602837d0..f2a863ba 100644 --- a/src/pfiles.cpp +++ b/src/pfiles.cpp @@ -185,7 +185,7 @@ static bool write_object_record(ObjData *obj, FILE *fl, int location) { fprintf(fl, "~\n"); fprintf(fl, "flags: "); - write_ascii_flags(fl, GET_OBJ_FLAGS(obj), NUM_ITEM_FLAGS); + write_ascii_flags(fl, GET_OBJ_FLAGS(obj)); fprintf(fl, "\n"); /* Strings */ @@ -206,7 +206,7 @@ static bool write_object_record(ObjData *obj, FILE *fl, int location) { fprintf(fl, "decomp: %d\n", GET_OBJ_DECOMP(obj)); fprintf(fl, "level: %d\n", GET_OBJ_LEVEL(obj)); fprintf(fl, "effects: "); - write_ascii_flags(fl, GET_OBJ_EFF_FLAGS(obj), NUM_EFF_FLAGS); + write_ascii_flags(fl, GET_OBJ_EFF_FLAGS(obj)); fprintf(fl, "\n"); fprintf(fl, "wear: %ld\n", GET_OBJ_WEAR(obj)); fprintf(fl, "hiddenness: %ld\n", GET_OBJ_HIDDENNESS(obj)); @@ -323,7 +323,7 @@ void show_rent(CharData *ch, char *argument) { extract_objects(tch); /* Set this so extract_char() doesn't try to do an emergency save */ - SET_FLAG(PLR_FLAGS(tch), PLR_REMOVING); + PLR_FLAGS(tch).set(PLR_REMOVING); extract_char(tch); } @@ -620,7 +620,7 @@ bool build_object(FILE *fl, ObjData **objp, int *location) { num = atoi(line); if (!strcasecmp(tag, "effects")) - load_ascii_flags(GET_OBJ_EFF_FLAGS(obj), NUM_EFF_FLAGS, line); + load_ascii_flags(GET_OBJ_EFF_FLAGS(obj), line); else if (!strcasecmp(tag, "location")) *location = atoi(line); else if (!strcasecmp(tag, "extradesc")) @@ -649,7 +649,7 @@ bool build_object(FILE *fl, ObjData **objp, int *location) { GET_OBJ_VAL(obj, num++) = atoi(line); limit_obj_values(obj); } else if (!strcasecmp(tag, "flags")) - load_ascii_flags(GET_OBJ_FLAGS(obj), NUM_ITEM_FLAGS, line); + load_ascii_flags(GET_OBJ_FLAGS(obj), line); } return true; } else { @@ -695,7 +695,7 @@ bool build_object(FILE *fl, ObjData **objp, int *location) { break; case 'E': if (!strcasecmp(tag, "effects")) - load_ascii_flags(GET_OBJ_EFF_FLAGS(obj), NUM_EFF_FLAGS, line); + load_ascii_flags(GET_OBJ_EFF_FLAGS(obj), line); else if (!strcasecmp(tag, "extradesc")) { CREATE(desc, ExtraDescriptionData, 1); desc->keyword = strdup(line); @@ -710,7 +710,7 @@ bool build_object(FILE *fl, ObjData **objp, int *location) { break; case 'F': if (!strcasecmp(tag, "flags")) - load_ascii_flags(GET_OBJ_FLAGS(obj), NUM_ITEM_FLAGS, line); + load_ascii_flags(GET_OBJ_FLAGS(obj), line); else goto bad_tag; break; @@ -1103,8 +1103,8 @@ void load_pets(CharData *ch) { GET_EXP(pet) = 0; GET_MAX_MOVE(pet) *= 15; GET_MOVE(pet) = GET_MAX_MOVE(pet); - SET_FLAG(EFF_FLAGS(pet), EFF_CHARM); - SET_FLAG(MOB_FLAGS(pet), MOB_PET); + EFF_FLAGS(pet).set(EFF_CHARM); + MOB_FLAGS(pet).set(MOB_PET); /* Over kill, but we might want to add more abilities soon. */ while (get_line(fl, line)) { @@ -1355,7 +1355,7 @@ void auto_save_all(void) { if (d->connected == CON_PLAYING && !IS_NPC(d->character) && PLR_FLAGGED(d->character, PLR_AUTOSAVE)) { GET_QUIT_REASON(d->character) = QUIT_AUTOSAVE; save_player(d->character); - REMOVE_FLAG(PLR_FLAGS(d->character), PLR_AUTOSAVE); + PLR_FLAGS(d->character).reset(PLR_AUTOSAVE); } } } @@ -1593,7 +1593,7 @@ void convert_single_player_obj_file(CharData *ch, char *name) { void save_player(CharData *ch) { int quit_mode; - REMOVE_FLAG(PLR_FLAGS(ch), PLR_AUTOSAVE); + PLR_FLAGS(ch).reset(PLR_AUTOSAVE); quit_mode = GET_QUIT_REASON(ch); switch (quit_mode) { @@ -1640,7 +1640,7 @@ void save_player(CharData *ch) { } if (quit_mode == QUIT_CRYO) { - SET_FLAG(PLR_FLAGS(ch), PLR_CRYO); + PLR_FLAGS(ch).set(PLR_CRYO); } GET_QUIT_REASON(ch) = quit_mode; diff --git a/src/players.cpp b/src/players.cpp index 9ca5b9f4..3fb5dc78 100644 --- a/src/players.cpp +++ b/src/players.cpp @@ -36,7 +36,6 @@ #include "retain_comms.hpp" #include "screen.hpp" #include "skills.hpp" -#include "string_utils.hpp" #include "structs.hpp" #include "sysdep.hpp" #include "trophy.hpp" @@ -438,7 +437,7 @@ int load_player(const char *name, CharData *ch) { if (!strcasecmp(tag, "experience")) GET_EXP(ch) = atol(line); else if (!strcasecmp(tag, "effectflags")) - load_ascii_flags(EFF_FLAGS(ch), NUM_EFF_FLAGS, line); + load_ascii_flags(EFF_FLAGS(ch), line); else if (!strcasecmp(tag, "effects")) load_effects(fl, ch); else @@ -554,15 +553,15 @@ int load_player(const char *name, CharData *ch) { else if (!strcasecmp(tag, "password")) strcpy(GET_PASSWD(ch), line); else if (!strcasecmp(tag, "playerflags")) - load_ascii_flags(PLR_FLAGS(ch), NUM_PLR_FLAGS, line); + load_ascii_flags(PLR_FLAGS(ch), line); else if (!strcasecmp(tag, "poofin")) GET_POOFIN(ch) = strdup(line); else if (!strcasecmp(tag, "poofout")) GET_POOFOUT(ch) = strdup(line); else if (!strcasecmp(tag, "prefflags")) - load_ascii_flags(PRF_FLAGS(ch), NUM_PRF_FLAGS, line); + load_ascii_flags(PRF_FLAGS(ch), line); else if (!strcasecmp(tag, "privflags")) - load_ascii_flags(PRV_FLAGS(ch), NUM_PRV_FLAGS, line); + load_ascii_flags(PRV_FLAGS(ch), line); else if (!strcasecmp(tag, "prompt")) GET_PROMPT(ch) = strdup(line); else @@ -656,11 +655,11 @@ int load_player(const char *name, CharData *ch) { } /* Remove some unwanted flags */ - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); - REMOVE_FLAG(PLR_FLAGS(ch), PLR_REMOVING); - REMOVE_FLAG(PLR_FLAGS(ch), PLR_SAVING); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_ANIMATED); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_SHADOWING); + PLR_FLAGS(ch).reset(PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_REMOVING); + PLR_FLAGS(ch).reset(PLR_SAVING); + EFF_FLAGS(ch).reset(EFF_ANIMATED); + EFF_FLAGS(ch).reset(EFF_SHADOWING); if (!GET_PAGE_LENGTH(ch)) GET_PAGE_LENGTH(ch) = DEFAULT_PAGE_LENGTH; @@ -786,7 +785,7 @@ void save_player_char(CharData *ch) { orig_pos = GET_POS(ch); /* Stop effect_total from making things happen in game due to effect changes */ - SET_FLAG(PLR_FLAGS(ch), PLR_SAVING); + PLR_FLAGS(ch).set(PLR_SAVING); /* Unaffect everything a character can be affected by. */ for (i = 0; i < NUM_WEARS; i++) { @@ -806,7 +805,7 @@ void save_player_char(CharData *ch) { tmp_eff[i].duration = 0; tmp_eff[i].modifier = 0; tmp_eff[i].location = 0; - CLEAR_FLAGS(tmp_eff[i].flags, NUM_EFF_FLAGS); + tmp_eff[i].flags.reset(); tmp_eff[i].next = 0; } } @@ -860,19 +859,19 @@ void save_player_char(CharData *ch) { fprintf(fl, "alignment: %d\n", GET_ALIGNMENT(ch)); fprintf(fl, "playerflags: "); - write_ascii_flags(fl, PLR_FLAGS(ch), NUM_PLR_FLAGS); + write_ascii_flags(fl, PLR_FLAGS(ch)); fprintf(fl, "\n"); fprintf(fl, "effectflags: "); - write_ascii_flags(fl, EFF_FLAGS(ch), NUM_EFF_FLAGS); + write_ascii_flags(fl, EFF_FLAGS(ch)); fprintf(fl, "\n"); fprintf(fl, "prefflags: "); - write_ascii_flags(fl, PRF_FLAGS(ch), NUM_PRF_FLAGS); + write_ascii_flags(fl, PRF_FLAGS(ch)); fprintf(fl, "\n"); fprintf(fl, "privflags: "); - write_ascii_flags(fl, PRV_FLAGS(ch), NUM_PRV_FLAGS); + write_ascii_flags(fl, PRV_FLAGS(ch)); fprintf(fl, "\n"); fprintf(fl, "savingthrows:"); @@ -1001,8 +1000,8 @@ void save_player_char(CharData *ch) { continue; if (eff->type == SKILL_BERSERK) continue; - fprintf(fl, "%d %d %d %d %ld %ld %ld\n", eff->type, eff->duration, eff->modifier, eff->location, - eff->flags[0], eff->flags[1], eff->flags[2]); + fprintf(fl, "%d %d %d %d %ld\n", eff->type, eff->duration, eff->modifier, eff->location, + eff->flags.to_ulong()); } fprintf(fl, "0 0 0 0 0\n"); } @@ -1033,7 +1032,7 @@ void save_player_char(CharData *ch) { GET_POS(ch) = orig_pos; effect_total(ch); - REMOVE_FLAG(PLR_FLAGS(ch), PLR_SAVING); + PLR_FLAGS(ch).reset(PLR_SAVING); /* end char_to_store code */ if ((id = get_ptable_by_name(GET_NAME(ch))) < 0) @@ -1048,7 +1047,7 @@ void save_player_char(CharData *ch) { save_index = true; player_table[id].last = ch->player.time.logon; } - i = player_table[id].flags; + auto old_flags = player_table[id].flags; if (PLR_FLAGGED(ch, PLR_DELETED)) SET_BIT(player_table[id].flags, PINDEX_DELETED); else @@ -1063,7 +1062,7 @@ void save_player_char(CharData *ch) { else REMOVE_BIT(player_table[id].flags, PINDEX_FROZEN); - if (player_table[id].flags != i || save_index) + if (player_table[id].flags != old_flags || save_index) save_player_index(); log("Saved player {}.", GET_NAME(ch)); @@ -1090,7 +1089,6 @@ void delete_player(int pfilepos) { void rename_player(CharData *victim, char *newname) { int pfilepos = get_ptable_by_name(GET_NAME(victim)); - int i; char fname1[40], fname2[40]; if (pfilepos < 0) @@ -1103,7 +1101,7 @@ void rename_player(CharData *victim, char *newname) { player_table[pfilepos].name = strdup(newname); /* Rename all player-owned files */ - for (i = 0; i < NUM_PLR_FILES; i++) { + for (int i = 0; i < NUM_PLR_FILES; i++) { if (get_pfilename(player_table[pfilepos].name, fname1, i)) if (get_pfilename(newname, fname2, i)) rename(fname1, fname2); @@ -1116,16 +1114,6 @@ void rename_player(CharData *victim, char *newname) { save_player(victim); } -void write_ascii_flags(FILE *fl, flagvector flags[], int num_flags) { - int i; - char flagbuf[FLAGBLOCK_SIZE + 1]; - - for (i = 0; i < FLAGVECTOR_SIZE(num_flags); ++i) { - sprintascii(flagbuf, flags[i]); - fprintf(fl, "%s%s", i ? " " : "", flagbuf); - } -} - static void load_effects(FILE *fl, CharData *ch) { int num = 0, num2 = 0, num3 = 0, num4 = 0, i; long num5 = 0, num6 = 0, num7 = 0; @@ -1251,27 +1239,6 @@ static void load_cooldowns(FILE *fl, CharData *ch) { } while (time != 0); } -void load_ascii_flags(flagvector flags[], int num_flags, char *line) { - int i = 0; - - skip_spaces(&line); - - line = strtok(line, " "); - - while (line && *line) { - if (FLAGVECTOR_SIZE(num_flags) <= i) { - if (*line != '0') { - log("SYSERR: load_ascii_flags: attempting to read in flags for block {:d}, but only {} blocks allowed " - "for flagvector type", - i, FLAGVECTOR_SIZE(num_flags)); - } - } else - flags[i] = asciiflag_conv(line); - line = strtok(nullptr, " "); - ++i; - } -} - static void load_clan(char *line, CharData *ch) { Clan *clan = find_clan(line); ch->player_specials->clan = find_clan_membership_in_clan(GET_NAME(ch), clan); @@ -1339,7 +1306,7 @@ void init_player(CharData *ch) { for (i = 1; i < TOP_SKILL; ++i) SET_SKILL(ch, i, GET_LEVEL(ch) == LVL_IMPL ? 1000 : 0); - CLEAR_FLAGS(EFF_FLAGS(ch), NUM_EFF_FLAGS); + EFF_FLAGS(ch).reset(); for (i = 0; i < NUM_SAVES; ++i) GET_SAVE(ch, i) = 0; @@ -1353,8 +1320,8 @@ void init_player(CharData *ch) { GET_ALIASES(ch) = nullptr; /* Set default preferences */ - SET_FLAG(PRF_FLAGS(ch), PRF_VICIOUS); /* Finish off opponents */ - SET_FLAG(PRF_FLAGS(ch), PRF_AUTOEXIT); /* Always show room exits */ + PRF_FLAGS(ch).set(PRF_VICIOUS); /* Finish off opponents */ + PRF_FLAGS(ch).set(PRF_AUTOEXIT); /* Always show room exits */ GET_PAGE_LENGTH(ch) = DEFAULT_PAGE_LENGTH; /* Set height, weight, size, lifeforce, composition to race defaults */ @@ -1405,7 +1372,7 @@ void remove_player_from_game(CharData *ch, int quit_mode) { extract_objects(ch); /* Set this so extract_char() doesn't try to do an emergency save */ - SET_FLAG(PLR_FLAGS(ch), PLR_REMOVING); + PLR_FLAGS(ch).set(PLR_REMOVING); extract_char(ch); } diff --git a/src/prefs.cpp b/src/prefs.cpp index afbfc71e..928544b7 100644 --- a/src/prefs.cpp +++ b/src/prefs.cpp @@ -34,7 +34,7 @@ ACMD(do_toggle) { struct set_struct { const char *cmd; int level; - int bitvector; + int flag; } /********************** These match SCMD defines in interpreter.h, to add or @@ -222,7 +222,7 @@ ACMD(do_toggle) { } break; default: - set = 1 && PRF_FLAGGED(tch, fields[i].bitvector); + set = 1 && PRF_FLAGGED(tch, fields[i].flag); strcpy(buf2, YESNO(set)); break; } @@ -338,7 +338,8 @@ ACMD(do_toggle) { } return; default: - result = PRF_TOG_CHK(tch, fields[i].bitvector); + PRF_FLAGS(ch).flip(fields[i].flag); + result = PRF_FLAGGED(ch, fields[i].flag); break; } diff --git a/src/privileges.cpp b/src/privileges.cpp index 0eaa73e1..1b411d05 100644 --- a/src/privileges.cpp +++ b/src/privileges.cpp @@ -90,18 +90,13 @@ static void add_grant(GrantType **list, int grant, const char *grantor, int gran void cache_grants(CharData *ch) { int cmd; - if (!GET_GRANT_CACHE(ch)) - CREATE(GET_GRANT_CACHE(ch), flagvector, FLAGVECTOR_SIZE(num_of_cmds)); - if (!GET_REVOKE_CACHE(ch)) - CREATE(GET_REVOKE_CACHE(ch), flagvector, FLAGVECTOR_SIZE(num_of_cmds)); - for (cmd = 1; cmd < num_of_cmds; ++cmd) { switch (command_grant_usability(ch, cmd)) { case CMD_GRANTED: - SET_FLAG(GET_GRANT_CACHE(ch), cmd); + GET_GRANT_CACHE(ch)[cmd] = true; break; case CMD_REVOKED: - SET_FLAG(GET_REVOKE_CACHE(ch), cmd); + GET_REVOKE_CACHE(ch)[cmd] = true; break; case CMD_NOT_GRANTED: /* do nothing */ @@ -148,7 +143,7 @@ static bool can_grant_group(CharData *ch, int group) { return (cmd_groups[group].minimum_level <= GET_LEVEL(ch)); } -static void cache_grant(flagvector *cache, int cmd, bool is_group, bool set) { +static void cache_grant(CommandCache &cache, int cmd, bool is_group, bool set) { if (is_group) { if (cmd < num_cmd_groups) { int group = cmd, grp; @@ -156,20 +151,14 @@ static void cache_grant(flagvector *cache, int cmd, bool is_group, bool set) { if (grp_info[cmd].groups) for (grp = 0; grp_info[cmd].groups[grp] >= 0; ++grp) if (grp_info[cmd].groups[grp] == group) { - if (set) - SET_FLAG(cache, cmd); - else - REMOVE_FLAG(cache, cmd); + cache[cmd] = set; break; } } } else if (cmd < num_of_cmds) { - if (set) - SET_FLAG(cache, cmd); - else - REMOVE_FLAG(cache, cmd); + cache[cmd] = set; } } @@ -249,7 +238,7 @@ static void send_grant_usage(CharData *ch) { static void do_command_grant_revoke(CharData *ch, CharData *vict, char *argument, int subcmd, int type) { GrantType **list, **unlist, **temp; GrantType *grant; - flagvector *cache, *uncache; + CommandCache cache, uncache; CommandGroup *group; int level, command = 0; const char *past_action, *preposition; @@ -373,9 +362,9 @@ static void do_clear_grants(CharData *ch, CharData *vict) { count += clear_grant_list(ch, &GET_REVOKES(vict)); count += clear_grant_list(ch, &GET_GRANT_GROUPS(vict)); count += clear_grant_list(ch, &GET_REVOKE_GROUPS(vict)); - CLEAR_FLAGS(GET_GRANT_CACHE(vict), num_of_cmds); - CLEAR_FLAGS(GET_REVOKE_CACHE(vict), num_of_cmds); - CLEAR_FLAGS(PRV_FLAGS(vict), NUM_PRV_FLAGS); + GET_GRANT_CACHE(vict).clear(); + GET_REVOKE_CACHE(vict).clear(); + PRV_FLAGS(vict).reset(); char_printf(ch, "{} grant{} cleared.\n", count, count == 1 ? "" : "s"); } @@ -394,12 +383,12 @@ static void do_flag_grant_revoke(CharData *ch, CharData *vict, char *argument, i } else if (prv_flags[flag].level > GET_LEVEL(ch)) char_printf(ch, "You don't have the ability to set that flag.\n"); else if (subcmd == SCMD_GRANT) { - SET_FLAG(PRV_FLAGS(vict), flag); + PRV_FLAGS(vict).set(flag); if (prv_flags[flag].update_func) (prv_flags[flag].update_func)(vict, flag); char_printf(ch, "Granted {} to {} at level {}.\n", prv_flags[flag].desc, GET_NAME(vict), prv_flags[flag].level); } else { - REMOVE_FLAG(PRV_FLAGS(vict), flag); + PRV_FLAGS(vict).reset(flag); if (prv_flags[flag].update_func) (prv_flags[flag].update_func)(vict, flag); char_printf(ch, "Ungranted {} from {} at level {}.\n", prv_flags[flag].desc, GET_NAME(vict), diff --git a/src/races.cpp b/src/races.cpp index 87aea336..0500d5aa 100644 --- a/src/races.cpp +++ b/src/races.cpp @@ -56,1308 +56,1326 @@ void set_init_height_weight(CharData *ch); RaceDef races[NUM_RACES] = { /* HUMAN */ - {"human", /* name as found by triggers */ - "human", /* all race keywords */ - "&6Human&0", /* name as displayed at character creation, on who, and score */ - "&6Human&0", /* name as displayed in show race command and when setting races */ - "Human", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 120, /* male weight low */ - 180, /* male weight high */ - 60, /* male height low */ - 76, /* male height high */ - 95, /* female weight low */ - 150, /* female weight high */ - 60, /* female height low */ - 70, /* female height high */ - {76, 76, 76, 76, 76, 76}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "human", /* name as found by triggers */ + "human", /* all race keywords */ + "&6Human&0", /* name as displayed at character creation, on who, and score */ + "&6Human&0", /* name as displayed in show race command and when setting races */ + "Human", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 120, /* male weight low */ + 180, /* male weight high */ + 60, /* male height low */ + 76, /* male height high */ + 95, /* female weight low */ + 150, /* female weight high */ + 60, /* female height low */ + 70, /* female height high */ + {76, 76, 76, 76, 76, 76}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* ELF */ - {"elf", /* name as found by triggers */ - "elf", /* all race keywords */ - "Elf&0", /* name as displayed at character creation, on who, and score */ - "Elf&0", /* name as displayed in show race command and when setting races */ - "Elf", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - true, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 1000, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 110, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 90, /* male weight low */ - 160, /* male weight high */ - 60, /* male height low */ - 70, /* male height high */ - 90, /* female weight low */ - 160, /* female weight high */ - 59, /* female height low */ - 68, /* female height high */ - {64, 80, 88, 86, 64, 78}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "elf", /* name as found by triggers */ + "elf", /* all race keywords */ + "Elf&0", /* name as displayed at character creation, on who, and score */ + "Elf&0", /* name as displayed in show race command and when setting races */ + "Elf", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + true, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 1000, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 110, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 90, /* male weight low */ + 160, /* male weight high */ + 60, /* male height low */ + 70, /* male height high */ + 90, /* female weight low */ + 160, /* female weight high */ + 59, /* female height low */ + 68, /* female height high */ + {64, 80, 88, 86, 64, 78}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* GNOME */ - {"gnome", /* name as found by triggers */ - "gnome", /* all race keywords */ - "&1&d&bGnome&0", /* name as displayed at character creation, on who, and score */ - "&1&d&bGnome&0", /* name as displayed in show race command and when setting races */ - "Gnome", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_SMALL, /* default size */ - 1000, /* default alignment */ - 2, /* damroll bonus */ - 4, /* hitroll bonus */ - 105, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 40, /* male weight low */ - 90, /* male weight high */ - 26, /* male height low */ - 38, /* male height high */ - 40, /* female weight low */ - 90, /* female weight high */ - 26, /* female height low */ - 38, /* female height high */ - {64, 76, 88, 84, 68, 80}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "gnome", /* name as found by triggers */ + "gnome", /* all race keywords */ + "&1&d&bGnome&0", /* name as displayed at character creation, on who, and score */ + "&1&d&bGnome&0", /* name as displayed in show race command and when setting races */ + "Gnome", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_SMALL, /* default size */ + 1000, /* default alignment */ + 2, /* damroll bonus */ + 4, /* hitroll bonus */ + 105, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 40, /* male weight low */ + 90, /* male weight high */ + 26, /* male height low */ + 38, /* male height high */ + 40, /* female weight low */ + 90, /* female weight high */ + 26, /* female height low */ + 38, /* female height high */ + {64, 76, 88, 84, 68, 80}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* DWARF */ - {"dwarf", /* name as found by triggers */ - "dwarf mountain", /* all race keywords */ - "&3Dwarf&0", /* name as displayed at character creation, on who, and score */ - "&3Dwarf&0", /* name as displayed in show race command and when setting races */ - "Dwarf", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 1000, /* default alignment */ - 4, /* damroll bonus */ - 5, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 170, /* male weight low */ - 200, /* male weight high */ - 38, /* female height low */ - 50, /* female height high */ - 150, /* female weight low */ - 190, /* female weight high */ - 38, /* female height low */ - 50, /* female height high */ - {84, 76, 64, 86, 84, 68}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "dwarf", /* name as found by triggers */ + "dwarf mountain", /* all race keywords */ + "&3Dwarf&0", /* name as displayed at character creation, on who, and score */ + "&3Dwarf&0", /* name as displayed in show race command and when setting races */ + "Dwarf", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 1000, /* default alignment */ + 4, /* damroll bonus */ + 5, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 170, /* male weight low */ + 200, /* male weight high */ + 38, /* female height low */ + 50, /* female height high */ + 150, /* female weight low */ + 190, /* female weight high */ + 38, /* female height low */ + 50, /* female height high */ + {84, 76, 64, 86, 84, 68}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* TROLL */ - {"troll", /* name as found by triggers */ - "swamp troll", /* all race keywords */ - "&2&dTroll&0", /* name as displayed at character creation, on who, and score */ - "&2&dTroll&0", /* name as displayed in show race command and when setting races */ - "Troll", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_EVIL, /* race alignment */ - SIZE_LARGE, /* default size */ - -1000, /* default alignment */ - 4, /* damroll bonus */ - 4, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 130, /* male weight low */ - 290, /* male weight high */ - 72, /* male height low */ - 90, /* male height high */ - 130, /* female weight low */ - 290, /* female weight high */ - 72, /* female height low */ - 90, /* female height high */ - {80, 72, 56, 56, 92, 64}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 130, /* hp factor for mobs */ - 110, /* hitroll/damroll factor for mobs */ - 110, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - "prowls in", /* verb for entering a room */ - "prowls", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "troll", /* name as found by triggers */ + "swamp troll", /* all race keywords */ + "&2&dTroll&0", /* name as displayed at character creation, on who, and score */ + "&2&dTroll&0", /* name as displayed in show race command and when setting races */ + "Troll", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_EVIL, /* race alignment */ + SIZE_LARGE, /* default size */ + -1000, /* default alignment */ + 4, /* damroll bonus */ + 4, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 130, /* male weight low */ + 290, /* male weight high */ + 72, /* male height low */ + 90, /* male height high */ + 130, /* female weight low */ + 290, /* female weight high */ + 72, /* female height low */ + 90, /* female height high */ + {80, 72, 56, 56, 92, 64}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 130, /* hp factor for mobs */ + 110, /* hitroll/damroll factor for mobs */ + 110, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + "prowls in", /* verb for entering a room */ + "prowls", /* verb for walking out of a room */ + }, /* DROW */ - {"drow", /* name as found by triggers */ - "drow", /* all race keywords */ - "&5Drow&0", /* name as displayed at character creation, on who, and score */ - "&5Drow&0", /* name as displayed in show race command and when setting races */ - "Drow", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_EVIL, /* race alignment */ - SIZE_MEDIUM, /* default size */ - -1000, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 110, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 90, /* male weight low */ - 160, /* male weight high */ - 60, /* male height low */ - 70, /* male height high */ - 90, /* female weight low */ - 160, /* female weight high */ - 60, /* female height low */ - 70, /* female height high */ - {64, 80, 88, 80, 64, 72}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "drow", /* name as found by triggers */ + "drow", /* all race keywords */ + "&5Drow&0", /* name as displayed at character creation, on who, and score */ + "&5Drow&0", /* name as displayed in show race command and when setting races */ + "Drow", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_EVIL, /* race alignment */ + SIZE_MEDIUM, /* default size */ + -1000, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 110, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 90, /* male weight low */ + 160, /* male weight high */ + 60, /* male height low */ + 70, /* male height high */ + 90, /* female weight low */ + 160, /* female weight high */ + 60, /* female height low */ + 70, /* female height high */ + {64, 80, 88, 80, 64, 72}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* DUERGAR */ - {"duergar", /* name as found by triggers */ - "duergar", /* all race keywords */ - "&1Duergar&0", /* name as displayed at character creation, on who, and score */ - "&1Duergar&0", /* name as displayed in show race command and when setting races */ - "Duergar", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_EVIL, /* race alignment */ - SIZE_MEDIUM, /* default size */ - -1000, /* default alignment */ - 4, /* damroll bonus */ - 5, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 170, /* male weight low */ - 200, /* male weight high */ - 38, /* female height low */ - 50, /* female height high */ - 150, /* female weight low */ - 190, /* female weight high */ - 38, /* female height low */ - 50, /* female height high */ - {84, 76, 68, 72, 84, 64}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - "skulks in", /* verb for entering a room */ - "skulks", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "duergar", /* name as found by triggers */ + "duergar", /* all race keywords */ + "&1Duergar&0", /* name as displayed at character creation, on who, and score */ + "&1Duergar&0", /* name as displayed in show race command and when setting races */ + "Duergar", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_EVIL, /* race alignment */ + SIZE_MEDIUM, /* default size */ + -1000, /* default alignment */ + 4, /* damroll bonus */ + 5, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 170, /* male weight low */ + 200, /* male weight high */ + 38, /* female height low */ + 50, /* female height high */ + 150, /* female weight low */ + 190, /* female weight high */ + 38, /* female height low */ + 50, /* female height high */ + {84, 76, 68, 72, 84, 64}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + "skulks in", /* verb for entering a room */ + "skulks", /* verb for walking out of a room */ + }, /* OGRE */ - {"ogre", /* name as found by triggers */ - "ogre", /* all race keywords */ - "&4Ogre&0", /* name as displayed at character creation, on who, and score */ - "&4Ogre&0", /* name as displayed in show race command and when setting races */ - "Ogre", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_EVIL, /* race alignment */ - SIZE_LARGE, /* default size */ - -1000, /* default alignment */ - 5, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 390, /* male weight low */ - 530, /* male weight high */ - 93, /* male height low */ - 119, /* male height high */ - 390, /* female weight low */ - 530, /* female weight high */ - 93, /* female height low */ - 119, /* female height high */ - {92, 64, 52, 60, 80, 60}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 110, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 120, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 85, /* AC factor for mobs */ - "lumbers in", /* verb for entering a room */ - "lumbers", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "ogre", /* name as found by triggers */ + "ogre", /* all race keywords */ + "&4Ogre&0", /* name as displayed at character creation, on who, and score */ + "&4Ogre&0", /* name as displayed in show race command and when setting races */ + "Ogre", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_EVIL, /* race alignment */ + SIZE_LARGE, /* default size */ + -1000, /* default alignment */ + 5, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 390, /* male weight low */ + 530, /* male weight high */ + 93, /* male height low */ + 119, /* male height high */ + 390, /* female weight low */ + 530, /* female weight high */ + 93, /* female height low */ + 119, /* female height high */ + {92, 64, 52, 60, 80, 60}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 110, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 120, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 85, /* AC factor for mobs */ + "lumbers in", /* verb for entering a room */ + "lumbers", /* verb for walking out of a room */ + }, /* ORC */ - {"orc", /* name as found by triggers */ - "orc", /* all race keywords */ - "&9&bOrc&0", /* name as displayed at character creation, on who, and score */ - "&9&bOrc&0", /* name as displayed in show race command and when setting races */ - "Orc", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_EVIL, /* race alignment */ - SIZE_MEDIUM, /* default size */ - -1000, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 90, /* male weight low */ - 150, /* male weight high */ - 58, /* male height low */ - 68, /* male height high */ - 90, /* female weight low */ - 150, /* female weight high */ - 58, /* female height low */ - 68, /* female height high */ - {80, 72, 72, 72, 76, 68}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "orc", /* name as found by triggers */ + "orc", /* all race keywords */ + "&9&bOrc&0", /* name as displayed at character creation, on who, and score */ + "&9&bOrc&0", /* name as displayed in show race command and when setting races */ + "Orc", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_EVIL, /* race alignment */ + SIZE_MEDIUM, /* default size */ + -1000, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 90, /* male weight low */ + 150, /* male weight high */ + 58, /* male height low */ + 68, /* male height high */ + 90, /* female weight low */ + 150, /* female weight high */ + 58, /* female height low */ + 68, /* female height high */ + {80, 72, 72, 72, 76, 68}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* HALF-ELF */ - {"halfelf", /* name as found by triggers */ - "half-elf half elf", /* all race keywords */ - "&6&bHalf-&0&6&dElf&0", /* name as displayed at character creation, on who, and score */ - "&6&bHalf-&0&6&dElf&0", /* name as displayed in show race command and when setting races */ - "Half-Elf", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 1000, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 105, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 100, /* male weight low */ - 170, /* male weight high */ - 60, /* male height low */ - 76, /* male height high */ - 94, /* female weight low */ - 155, /* female weight high */ - 60, /* female height low */ - 70, /* female height high */ - {68, 76, 76, 76, 68, 84}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "halfelf", /* name as found by triggers */ + "half-elf half elf", /* all race keywords */ + "&6&bHalf-&0&6&dElf&0", /* name as displayed at character creation, on who, and score */ + "&6&bHalf-&0&6&dElf&0", /* name as displayed in show race command and when setting races */ + "Half-Elf", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 1000, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 105, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 100, /* male weight low */ + 170, /* male weight high */ + 60, /* male height low */ + 76, /* male height high */ + 94, /* female weight low */ + 155, /* female weight high */ + 60, /* female height low */ + 70, /* female height high */ + {68, 76, 76, 76, 68, 84}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* BARBARIAN */ - {"barbarian", /* name as found by triggers */ - "barbarian", /* all race keywords */ - "&4Barbarian&0", /* name as displayed at character creation, on who, and score */ - "&4Barbarian&0", /* name as displayed in show race command and when setting races */ - "Barbarian", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_LARGE, /* default size */ - 0, /* default alignment */ - 5, /* damroll bonus */ - 4, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 170, /* male weight low */ - 260, /* male weight high */ - 69, /* male height low */ - 88, /* male height high */ - 130, /* female weight low */ - 210, /* female height low */ - 69, /* female height low */ - 80, /* female height high */ - {88, 68, 60, 60, 88, 64}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "barbarian", /* name as found by triggers */ + "barbarian", /* all race keywords */ + "&4Barbarian&0", /* name as displayed at character creation, on who, and score */ + "&4Barbarian&0", /* name as displayed in show race command and when setting races */ + "Barbarian", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_LARGE, /* default size */ + 0, /* default alignment */ + 5, /* damroll bonus */ + 4, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 170, /* male weight low */ + 260, /* male weight high */ + 69, /* male height low */ + 88, /* male height high */ + 130, /* female weight low */ + 210, /* female height low */ + 69, /* female height low */ + 80, /* female height high */ + {88, 68, 60, 60, 88, 64}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* HALFLING */ - {"halfling", /* name as found by triggers */ - "halfling", /* all race keywords */ - "&3&dHalfling&0", /* name as displayed at character creation, on who, and score */ - "&3&dHalfling&0", /* name as displayed in show race command and when setting races */ - "Halfling", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_SMALL, /* default size */ - 1000, /* default alignment */ - 3, /* damroll bonus */ - 6, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 90, /* male weight low */ - 160, /* male weight high */ - 35, /* male height low */ - 42, /* male height high */ - 90, /* female weight low */ - 160, /* female weight high */ - 35, /* female height low */ - 42, /* female height high */ - {68, 96, 80, 80, 64, 76}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "halfling", /* name as found by triggers */ + "halfling", /* all race keywords */ + "&3&dHalfling&0", /* name as displayed at character creation, on who, and score */ + "&3&dHalfling&0", /* name as displayed in show race command and when setting races */ + "Halfling", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_SMALL, /* default size */ + 1000, /* default alignment */ + 3, /* damroll bonus */ + 6, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 90, /* male weight low */ + 160, /* male weight high */ + 35, /* male height low */ + 42, /* male height high */ + 90, /* female weight low */ + 160, /* female weight high */ + 35, /* female height low */ + 42, /* female height high */ + {68, 96, 80, 80, 64, 76}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* PLANT */ - {"plant", /* name as found by triggers */ - "plant", /* all race keywords */ - "&2Plant&0", /* name as displayed at character creation, on who, and score */ - "&2Plant&0", /* name as displayed in show race command and when setting races */ - "Plant", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - false, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_PLANT, /* default composition */ - 80, /* male weight low */ - 180, /* male weight high */ - 40, /* male height low */ - 96, /* male height high */ - 80, /* female weight low */ - 180, /* female weight high */ - 40, /* female height low */ - 96, /* female height high */ - {72, 52, 32, 72, 100, 72}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 120, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "plant", /* name as found by triggers */ + "plant", /* all race keywords */ + "&2Plant&0", /* name as displayed at character creation, on who, and score */ + "&2Plant&0", /* name as displayed in show race command and when setting races */ + "Plant", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + false, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_PLANT, /* default composition */ + 80, /* male weight low */ + 180, /* male weight high */ + 40, /* male height low */ + 96, /* male height high */ + 80, /* female weight low */ + 180, /* female weight high */ + 40, /* female height low */ + 96, /* female height high */ + {72, 52, 32, 72, 100, 72}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 120, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* HUMANOID */ - {"humanoid", /* name as found by triggers */ - "humanoid", /* all race keywords */ - "&7Humanoid&0", /* name as displayed at character creation, on who, and score */ - "&7Humanoid&0", /* name as displayed in show race command and when setting races */ - "Humanoid", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 120, /* male weight low */ - 180, /* male weight high */ - 60, /* male height low */ - 76, /* male height high */ - 95, /* female weight low */ - 150, /* female weight high */ - 60, /* female height low */ - 70, /* female height high */ - {72, 72, 72, 72, 72, 72}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 100, /* money drop factor for mobs */ - 60, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "humanoid", /* name as found by triggers */ + "humanoid", /* all race keywords */ + "&7Humanoid&0", /* name as displayed at character creation, on who, and score */ + "&7Humanoid&0", /* name as displayed in show race command and when setting races */ + "Humanoid", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 120, /* male weight low */ + 180, /* male weight high */ + 60, /* male height low */ + 76, /* male height high */ + 95, /* female weight low */ + 150, /* female weight high */ + 60, /* female height low */ + 70, /* female height high */ + {72, 72, 72, 72, 72, 72}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 100, /* money drop factor for mobs */ + 60, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* ANIMAL */ - {"animal", /* name as found by triggers */ - "animal", /* all race keywords */ - "&2Animal&0", /* name as displayed at character creation, on who, and score */ - "&2Animal&0", /* name as displayed in show race command and when setting races */ - "Animal", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - false, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 120, /* male weight low */ - 180, /* male weight high */ - 60, /* male height low */ - 76, /* male height high */ - 95, /* female weight low */ - 150, /* female weight high */ - 60, /* female height low */ - 70, /* female height high */ - {72, 72, 72, 72, 72, 72}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 0, /* money drop factor for mobs */ - 65, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "animal", /* name as found by triggers */ + "animal", /* all race keywords */ + "&2Animal&0", /* name as displayed at character creation, on who, and score */ + "&2Animal&0", /* name as displayed in show race command and when setting races */ + "Animal", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + false, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 120, /* male weight low */ + 180, /* male weight high */ + 60, /* male height low */ + 76, /* male height high */ + 95, /* female weight low */ + 150, /* female weight high */ + 60, /* female height low */ + 70, /* female height high */ + {72, 72, 72, 72, 72, 72}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 0, /* money drop factor for mobs */ + 65, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* DRAGON - GENERAL */ - {"dragon_general", /* name as found by triggers */ - "dragon general", /* all race keywords */ - "&5&bDragon&0", /* name as displayed at character creation, on who, and score */ - "&5&bDragon&0", /* name as displayed in show race command and when setting races */ - "General Dragon", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - false, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_GARGANTUAN, /* default size */ - 0, /* default alignment */ - 10, /* damroll bonus */ - 4, /* hitroll bonus */ - 130, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 16000, /* male weight low */ - 64000, /* male weight high */ - 768, /* male height low */ - 1536, /* male height high */ - 16000, /* female weight low */ - 64000, /* female weight high */ - 768, /* female height low */ - 1536, /* female height high */ - {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ - 130, /* experience reward factor for mobs */ - 130, /* hp factor for mobs */ - 140, /* hitroll/damroll factor for mobs */ - 140, /* damage dice factor for mobs */ - 500, /* money drop factor for mobs */ - 140, /* AC factor for mobs */ - "stomps in", /* verb for entering a room */ - "stomps", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragon_general", /* name as found by triggers */ + "dragon general", /* all race keywords */ + "&5&bDragon&0", /* name as displayed at character creation, on who, and score */ + "&5&bDragon&0", /* name as displayed in show race command and when setting races */ + "General Dragon", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + false, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_GARGANTUAN, /* default size */ + 0, /* default alignment */ + 10, /* damroll bonus */ + 4, /* hitroll bonus */ + 130, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 16000, /* male weight low */ + 64000, /* male weight high */ + 768, /* male height low */ + 1536, /* male height high */ + 16000, /* female weight low */ + 64000, /* female weight high */ + 768, /* female height low */ + 1536, /* female height high */ + {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ + 130, /* experience reward factor for mobs */ + 130, /* hp factor for mobs */ + 140, /* hitroll/damroll factor for mobs */ + 140, /* damage dice factor for mobs */ + 500, /* money drop factor for mobs */ + 140, /* AC factor for mobs */ + "stomps in", /* verb for entering a room */ + "stomps", /* verb for walking out of a room */ + }, /* GIANT */ - {"giant", /* name as found by triggers */ - "giant", /* all race keywords */ - "&2&bGiant&0", /* name as displayed at character creation, on who, and score */ - "&2&bGiant&0", /* name as displayed in show race command and when setting races */ - "Giant", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_HUGE, /* default size */ - 0, /* default alignment */ - 7, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 1000, /* male weight low */ - 4000, /* male weight high */ - 196, /* male height low */ - 384, /* male height high */ - 1000, /* female weight low */ - 4000, /* female weight high */ - 196, /* female height low */ - 384, /* female height high */ - {100, 72, 44, 64, 80, 72}, /* max stat: str, dex, int, wis, con, cha */ - 110, /* experience reward factor for mobs */ - 120, /* hp factor for mobs */ - 120, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 125, /* money drop factor for mobs */ - 120, /* AC factor for mobs */ - "lumbers in", /* verb for entering a room */ - "lumbers", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "giant", /* name as found by triggers */ + "giant", /* all race keywords */ + "&2&bGiant&0", /* name as displayed at character creation, on who, and score */ + "&2&bGiant&0", /* name as displayed in show race command and when setting races */ + "Giant", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_HUGE, /* default size */ + 0, /* default alignment */ + 7, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 1000, /* male weight low */ + 4000, /* male weight high */ + 196, /* male height low */ + 384, /* male height high */ + 1000, /* female weight low */ + 4000, /* female weight high */ + 196, /* female height low */ + 384, /* female height high */ + {100, 72, 44, 64, 80, 72}, /* max stat: str, dex, int, wis, con, cha */ + 110, /* experience reward factor for mobs */ + 120, /* hp factor for mobs */ + 120, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 125, /* money drop factor for mobs */ + 120, /* AC factor for mobs */ + "lumbers in", /* verb for entering a room */ + "lumbers", /* verb for walking out of a room */ + }, /* OTHER */ - {"other", /* name as found by triggers */ - "other", /* all race keywords */ - "&4&bOther&0", /* name as displayed at character creation, on who, and score */ - "&4&bOther&0", /* name as displayed in show race command and when setting races */ - "Other", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - false, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 120, /* male weight low */ - 180, /* male weight high */ - 60, /* male height low */ - 76, /* male height high */ - 95, /* female weight low */ - 150, /* female weight high */ - 60, /* female height low */ - 70, /* female height high */ - {72, 72, 72, 72, 72, 72}, /* max stat: str, dex, int, wis, con, cha */ - 80, /* experience reward factor for mobs */ - 110, /* hp factor for mobs */ - 120, /* hitroll/damroll factor for mobs */ - 80, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 105, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "other", /* name as found by triggers */ + "other", /* all race keywords */ + "&4&bOther&0", /* name as displayed at character creation, on who, and score */ + "&4&bOther&0", /* name as displayed in show race command and when setting races */ + "Other", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + false, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 120, /* male weight low */ + 180, /* male weight high */ + 60, /* male height low */ + 76, /* male height high */ + 95, /* female weight low */ + 150, /* female weight high */ + 60, /* female height low */ + 70, /* female height high */ + {72, 72, 72, 72, 72, 72}, /* max stat: str, dex, int, wis, con, cha */ + 80, /* experience reward factor for mobs */ + 110, /* hp factor for mobs */ + 120, /* hitroll/damroll factor for mobs */ + 80, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 105, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* GOBLIN */ - {"goblin", /* name as found by triggers */ - "goblin", /* all race keywords */ - "&4&bGoblin&0", /* name as displayed at character creation, on who, and score */ - "&4&bGoblin&0", /* name as displayed in show race command and when setting races */ - "Goblin", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_EVIL, /* race alignment */ - SIZE_SMALL, /* default size */ - -500, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 60, /* male weight low */ - 90, /* male weight high */ - 30, /* male height low */ - 38, /* male height high */ - 55, /* female weight low */ - 80, /* female weight high */ - 30, /* female height low */ - 35, /* female height high */ - {76, 72, 64, 72, 84, 64}, /* max stat: str, dex, int, wis, con, cha */ - 60, /* experience reward factor for mobs */ - 60, /* hp factor for mobs */ - 60, /* hitroll/damroll factor for mobs */ - 60, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 90, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "goblin", /* name as found by triggers */ + "goblin", /* all race keywords */ + "&4&bGoblin&0", /* name as displayed at character creation, on who, and score */ + "&4&bGoblin&0", /* name as displayed in show race command and when setting races */ + "Goblin", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_EVIL, /* race alignment */ + SIZE_SMALL, /* default size */ + -500, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 60, /* male weight low */ + 90, /* male weight high */ + 30, /* male height low */ + 38, /* male height high */ + 55, /* female weight low */ + 80, /* female weight high */ + 30, /* female height low */ + 35, /* female height high */ + {76, 72, 64, 72, 84, 64}, /* max stat: str, dex, int, wis, con, cha */ + 60, /* experience reward factor for mobs */ + 60, /* hp factor for mobs */ + 60, /* hitroll/damroll factor for mobs */ + 60, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 90, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* DEMON */ - {"demon", /* name as found by triggers */ - "demon", /* all race keywords */ - "&1&bDemon&0", /* name as displayed at character creation, on who, and score */ - "&1&bDemon&0", /* name as displayed in show race command and when setting races */ - "Demon", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_EVIL, /* race alignment */ - SIZE_LARGE, /* default size */ - -1000, /* default alignment */ - 6, /* damroll bonus */ - 4, /* hitroll bonus */ - 120, /* focus bonus / 100 */ - LIFE_DEMONIC, /* default life force */ - COMP_FLESH, /* default composition */ - 130, /* male weight low */ - 290, /* male weight high */ - 72, /* male height low */ - 90, /* male height high */ - 130, /* female weight low */ - 290, /* female weight high */ - 72, /* female height low */ - 90, /* female height high */ - {80, 100, 68, 68, 58, 58}, /* max stat: str, dex, int, wis, con, cha */ - 120, /* experience reward factor for mobs */ - 120, /* hp factor for mobs */ - 120, /* hitroll/damroll factor for mobs */ - 120, /* damage dice factor for mobs */ - 150, /* money drop factor for mobs */ - 120, /* AC factor for mobs */ - "stalks in", /* verb for entering a room */ - "stalks", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "demon", /* name as found by triggers */ + "demon", /* all race keywords */ + "&1&bDemon&0", /* name as displayed at character creation, on who, and score */ + "&1&bDemon&0", /* name as displayed in show race command and when setting races */ + "Demon", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_EVIL, /* race alignment */ + SIZE_LARGE, /* default size */ + -1000, /* default alignment */ + 6, /* damroll bonus */ + 4, /* hitroll bonus */ + 120, /* focus bonus / 100 */ + LIFE_DEMONIC, /* default life force */ + COMP_FLESH, /* default composition */ + 130, /* male weight low */ + 290, /* male weight high */ + 72, /* male height low */ + 90, /* male height high */ + 130, /* female weight low */ + 290, /* female weight high */ + 72, /* female height low */ + 90, /* female height high */ + {80, 100, 68, 68, 58, 58}, /* max stat: str, dex, int, wis, con, cha */ + 120, /* experience reward factor for mobs */ + 120, /* hp factor for mobs */ + 120, /* hitroll/damroll factor for mobs */ + 120, /* damage dice factor for mobs */ + 150, /* money drop factor for mobs */ + 120, /* AC factor for mobs */ + "stalks in", /* verb for entering a room */ + "stalks", /* verb for walking out of a room */ + }, /* BROWNIE */ - {"brownie", /* name as found by triggers */ - "brownie", /* all race keywords */ - "&3Brownie&0", /* name as displayed at character creation, on who, and score */ - "&3Brownie&0", /* name as displayed in show race command and when setting races */ - "Brownie", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_SMALL, /* default size */ - 500, /* default alignment */ - 1, /* damroll bonus */ - 3, /* hitroll bonus */ - 105, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 20, /* male weight low */ - 30, /* male weight high */ - 20, /* male height low */ - 30, /* male height high */ - 20, /* female weight low */ - 30, /* female weight high */ - 20, /* female height low */ - 30, /* female height high */ - {60, 80, 60, 78, 70, 72}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "brownie", /* name as found by triggers */ + "brownie", /* all race keywords */ + "&3Brownie&0", /* name as displayed at character creation, on who, and score */ + "&3Brownie&0", /* name as displayed in show race command and when setting races */ + "Brownie", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_SMALL, /* default size */ + 500, /* default alignment */ + 1, /* damroll bonus */ + 3, /* hitroll bonus */ + 105, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 20, /* male weight low */ + 30, /* male weight high */ + 20, /* male height low */ + 30, /* male height high */ + 20, /* female weight low */ + 30, /* female weight high */ + 20, /* female height low */ + 30, /* female height high */ + {60, 80, 60, 78, 70, 72}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* DRAGON - FIRE */ - {"dragon_fire", /* name as found by triggers */ - "dragon fire", /* all race keywords */ - "&1&bDragon&0", /* name as displayed at character creation, on who, and score */ - "&1&bDragon&0", /* name as displayed in show race command and when setting races */ - "Fire Dragon", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - false, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_GARGANTUAN, /* default size */ - 0, /* default alignment */ - 10, /* damroll bonus */ - 4, /* hitroll bonus */ - 130, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 16000, /* male weight low */ - 64000, /* male weight high */ - 768, /* male height low */ - 1536, /* male height high */ - 16000, /* female weight low */ - 64000, /* female weight high */ - 768, /* female height low */ - 1536, /* female height high */ - {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ - 130, /* experience reward factor for mobs */ - 130, /* hp factor for mobs */ - 140, /* hitroll/damroll factor for mobs */ - 140, /* damage dice factor for mobs */ - 500, /* money drop factor for mobs */ - 140, /* AC factor for mobs */ - "stomps in", /* verb for entering a room */ - "stomps", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragon_fire", /* name as found by triggers */ + "dragon fire", /* all race keywords */ + "&1&bDragon&0", /* name as displayed at character creation, on who, and score */ + "&1&bDragon&0", /* name as displayed in show race command and when setting races */ + "Fire Dragon", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + false, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_GARGANTUAN, /* default size */ + 0, /* default alignment */ + 10, /* damroll bonus */ + 4, /* hitroll bonus */ + 130, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 16000, /* male weight low */ + 64000, /* male weight high */ + 768, /* male height low */ + 1536, /* male height high */ + 16000, /* female weight low */ + 64000, /* female weight high */ + 768, /* female height low */ + 1536, /* female height high */ + {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ + 130, /* experience reward factor for mobs */ + 130, /* hp factor for mobs */ + 140, /* hitroll/damroll factor for mobs */ + 140, /* damage dice factor for mobs */ + 500, /* money drop factor for mobs */ + 140, /* AC factor for mobs */ + "stomps in", /* verb for entering a room */ + "stomps", /* verb for walking out of a room */ + }, /* DRAGON - ICE */ - {"dragon_frost", /* name as found by triggers */ - "dragon frost", /* all race keywords */ - "&7&bDragon&0", /* name as displayed at character creation, on who, and score */ - "&7&bDragon&0", /* name as displayed in show race command and when setting races */ - "Frost Dragon", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - false, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_GARGANTUAN, /* default size */ - 0, /* default alignment */ - 10, /* damroll bonus */ - 4, /* hitroll bonus */ - 130, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 16000, /* male weight low */ - 64000, /* male weight high */ - 768, /* male height low */ - 1536, /* male height high */ - 16000, /* female weight low */ - 64000, /* female weight high */ - 768, /* female height low */ - 1536, /* female height high */ - {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ - 130, /* experience reward factor for mobs */ - 130, /* hp factor for mobs */ - 140, /* hitroll/damroll factor for mobs */ - 140, /* damage dice factor for mobs */ - 500, /* money drop factor for mobs */ - 140, /* AC factor for mobs */ - "stomps in", /* verb for entering a room */ - "stomps", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragon_frost", /* name as found by triggers */ + "dragon frost", /* all race keywords */ + "&7&bDragon&0", /* name as displayed at character creation, on who, and score */ + "&7&bDragon&0", /* name as displayed in show race command and when setting races */ + "Frost Dragon", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + false, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_GARGANTUAN, /* default size */ + 0, /* default alignment */ + 10, /* damroll bonus */ + 4, /* hitroll bonus */ + 130, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 16000, /* male weight low */ + 64000, /* male weight high */ + 768, /* male height low */ + 1536, /* male height high */ + 16000, /* female weight low */ + 64000, /* female weight high */ + 768, /* female height low */ + 1536, /* female height high */ + {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ + 130, /* experience reward factor for mobs */ + 130, /* hp factor for mobs */ + 140, /* hitroll/damroll factor for mobs */ + 140, /* damage dice factor for mobs */ + 500, /* money drop factor for mobs */ + 140, /* AC factor for mobs */ + "stomps in", /* verb for entering a room */ + "stomps", /* verb for walking out of a room */ + }, /* DRAGON - ACID */ - {"dragon_acid", /* name as found by triggers */ - "dragon acid", /* all race keywords */ - "&9&bDragon&0", /* name as displayed at character creation, on who, and score */ - "&9&bDragon&0", /* name as displayed in show race command and when setting races */ - "Acid Dragon", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - false, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_GARGANTUAN, /* default size */ - 0, /* default alignment */ - 10, /* damroll bonus */ - 4, /* hitroll bonus */ - 130, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 16000, /* male weight low */ - 64000, /* male weight high */ - 768, /* male height low */ - 1536, /* male height high */ - 16000, /* female weight low */ - 64000, /* female weight high */ - 768, /* female height low */ - 1536, /* female height high */ - {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ - 130, /* experience reward factor for mobs */ - 130, /* hp factor for mobs */ - 140, /* hitroll/damroll factor for mobs */ - 140, /* damage dice factor for mobs */ - 500, /* money drop factor for mobs */ - 140, /* AC factor for mobs */ - "stomps in", /* verb for entering a room */ - "stomps", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragon_acid", /* name as found by triggers */ + "dragon acid", /* all race keywords */ + "&9&bDragon&0", /* name as displayed at character creation, on who, and score */ + "&9&bDragon&0", /* name as displayed in show race command and when setting races */ + "Acid Dragon", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + false, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_GARGANTUAN, /* default size */ + 0, /* default alignment */ + 10, /* damroll bonus */ + 4, /* hitroll bonus */ + 130, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 16000, /* male weight low */ + 64000, /* male weight high */ + 768, /* male height low */ + 1536, /* male height high */ + 16000, /* female weight low */ + 64000, /* female weight high */ + 768, /* female height low */ + 1536, /* female height high */ + {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ + 130, /* experience reward factor for mobs */ + 130, /* hp factor for mobs */ + 140, /* hitroll/damroll factor for mobs */ + 140, /* damage dice factor for mobs */ + 500, /* money drop factor for mobs */ + 140, /* AC factor for mobs */ + "stomps in", /* verb for entering a room */ + "stomps", /* verb for walking out of a room */ + }, /* DRAGON - LIGHTNING */ - {"dragon_lightning", /* name as found by triggers */ - "dragon lightning", /* all race keywords */ - "&4&bDragon&0", /* name as displayed at character creation, on who, and score */ - "&4&bDragon&0", /* name as displayed in show race command and when setting races */ - "Lightning Dragon", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - false, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_GARGANTUAN, /* default size */ - 0, /* default alignment */ - 10, /* damroll bonus */ - 4, /* hitroll bonus */ - 130, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 16000, /* male weight low */ - 64000, /* male weight high */ - 768, /* male height low */ - 1536, /* male height high */ - 16000, /* female weight low */ - 64000, /* female weight high */ - 768, /* female height low */ - 1536, /* female height high */ - {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ - 130, /* experience reward factor for mobs */ - 130, /* hp factor for mobs */ - 140, /* hitroll/damroll factor for mobs */ - 140, /* damage dice factor for mobs */ - 500, /* money drop factor for mobs */ - 140, /* AC factor for mobs */ - "stomps in", /* verb for entering a room */ - "stomps", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragon_lightning", /* name as found by triggers */ + "dragon lightning", /* all race keywords */ + "&4&bDragon&0", /* name as displayed at character creation, on who, and score */ + "&4&bDragon&0", /* name as displayed in show race command and when setting races */ + "Lightning Dragon", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + false, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_GARGANTUAN, /* default size */ + 0, /* default alignment */ + 10, /* damroll bonus */ + 4, /* hitroll bonus */ + 130, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 16000, /* male weight low */ + 64000, /* male weight high */ + 768, /* male height low */ + 1536, /* male height high */ + 16000, /* female weight low */ + 64000, /* female weight high */ + 768, /* female height low */ + 1536, /* female height high */ + {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ + 130, /* experience reward factor for mobs */ + 130, /* hp factor for mobs */ + 140, /* hitroll/damroll factor for mobs */ + 140, /* damage dice factor for mobs */ + 500, /* money drop factor for mobs */ + 140, /* AC factor for mobs */ + "stomps in", /* verb for entering a room */ + "stomps", /* verb for walking out of a room */ + }, /* DRAGON - GAS */ - {"dragon_gas", /* name as found by triggers */ - "dragon gas", /* all race keywords */ - "&2&bDragon&0", /* name as displayed at character creation, on who, and score */ - "&2&bDragon&0", /* name as displayed in show race command and when setting races */ - "Gas Dragon", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - false, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_GARGANTUAN, /* default size */ - 0, /* default alignment */ - 10, /* damroll bonus */ - 4, /* hitroll bonus */ - 130, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 16000, /* male weight low */ - 64000, /* male weight high */ - 768, /* male height low */ - 1536, /* male height high */ - 16000, /* female weight low */ - 64000, /* female weight high */ - 768, /* female height low */ - 1536, /* female height high */ - {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ - 130, /* experience reward factor for mobs */ - 130, /* hp factor for mobs */ - 140, /* hitroll/damroll factor for mobs */ - 140, /* damage dice factor for mobs */ - 500, /* money drop factor for mobs */ - 140, /* AC factor for mobs */ - "stomps in", /* verb for entering a room */ - "stomps", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragon_gas", /* name as found by triggers */ + "dragon gas", /* all race keywords */ + "&2&bDragon&0", /* name as displayed at character creation, on who, and score */ + "&2&bDragon&0", /* name as displayed in show race command and when setting races */ + "Gas Dragon", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + false, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_GARGANTUAN, /* default size */ + 0, /* default alignment */ + 10, /* damroll bonus */ + 4, /* hitroll bonus */ + 130, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 16000, /* male weight low */ + 64000, /* male weight high */ + 768, /* male height low */ + 1536, /* male height high */ + 16000, /* female weight low */ + 64000, /* female weight high */ + 768, /* female height low */ + 1536, /* female height high */ + {100, 72, 100, 72, 72, 100}, /* max stat: str, dex, int, wis, con, cha */ + 130, /* experience reward factor for mobs */ + 130, /* hp factor for mobs */ + 140, /* hitroll/damroll factor for mobs */ + 140, /* damage dice factor for mobs */ + 500, /* money drop factor for mobs */ + 140, /* AC factor for mobs */ + "stomps in", /* verb for entering a room */ + "stomps", /* verb for walking out of a room */ + }, /* DRAGONBORN - FIRE */ - {"dragonborn_fire", /* name as found by triggers */ - "dragonborn fire", /* all race keywords */ - "&1Dr&ba&3g&1on&0&1b&1&bo&3r&1&bn&0", /* name as displayed at character creation, on who, and score */ - "&1Fire Dragonborn&0", /* name as displayed in show race command and when setting races */ - "Fire Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 180, /* male weight low */ - 370, /* male weight high */ - 70, /* male height low */ - 80, /* male height high */ - 180, /* female weight low */ - 370, /* female weight high */ - 70, /* female height low */ - 80, /* female height high */ - {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragonborn_fire", /* name as found by triggers */ + "dragonborn fire", /* all race keywords */ + "&1Dr&ba&3g&1on&0&1b&1&bo&3r&1&bn&0", /* name as displayed at character creation, on who, and score */ + "&1Fire Dragonborn&0", /* name as displayed in show race command and when setting races */ + "Fire Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 180, /* male weight low */ + 370, /* male weight high */ + 70, /* male height low */ + 80, /* male height high */ + 180, /* female weight low */ + 370, /* female weight high */ + 70, /* female height low */ + 80, /* female height high */ + {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* DRAGONBORN - FROST */ - {"dragonborn_frost", /* name as found by triggers */ - "dragonborn frost", /* all race keywords */ - "&7&bDr&b&4ag&7&bonb&b&4or&7&bn&0", /* name as displayed at character creation, on who, and score */ - "&7&bFrost Dragonborn&0", /* name as displayed in show race command and when setting races */ - "Frost Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 180, /* male weight low */ - 370, /* male weight high */ - 70, /* male height low */ - 80, /* male height high */ - 180, /* female weight low */ - 370, /* female weight high */ - 70, /* female height low */ - 80, /* female height high */ - {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragonborn_frost", /* name as found by triggers */ + "dragonborn frost", /* all race keywords */ + "&7&bDr&b&4ag&7&bonb&b&4or&7&bn&0", /* name as displayed at character creation, on who, and score */ + "&7&bFrost Dragonborn&0", /* name as displayed in show race command and when setting races */ + "Frost Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 180, /* male weight low */ + 370, /* male weight high */ + 70, /* male height low */ + 80, /* male height high */ + 180, /* female weight low */ + 370, /* female weight high */ + 70, /* female height low */ + 80, /* female height high */ + {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* DRAGONBORN - ACID */ - {"dragonborn_acid", /* name as found by triggers */ - "dragonborn acid", /* all race keywords */ - "&9&bDr&2a&0&2g&bo&9nb&2o&0&2r&b&9n&0", /* name as displayed at character creation, on who, and score */ - "&9&bAcid Dragonborn&0", /* name as displayed in show race command and when setting races */ - "Acid Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 180, /* male weight low */ - 370, /* male weight high */ - 70, /* male height low */ - 80, /* male height high */ - 180, /* female weight low */ - 370, /* female weight high */ - 70, /* female height low */ - 80, /* female height high */ - {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragonborn_acid", /* name as found by triggers */ + "dragonborn acid", /* all race keywords */ + "&9&bDr&2a&0&2g&bo&9nb&2o&0&2r&b&9n&0", /* name as displayed at character creation, on who, and score */ + "&9&bAcid Dragonborn&0", /* name as displayed in show race command and when setting races */ + "Acid Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 180, /* male weight low */ + 370, /* male weight high */ + 70, /* male height low */ + 80, /* male height high */ + 180, /* female weight low */ + 370, /* female weight high */ + 70, /* female height low */ + 80, /* female height high */ + {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* DRAGONBORN - LIGHTNING */ - {"dragonborn_lightning", /* name as found by triggers */ - "dragonborn lightning", /* all race keywords */ - "&b&4Dr&6a&4go&6n&4b&6or&4n&0", /* name as displayed at character creation, on who, and score */ - "&b&4Lightning Dragonborn&0", /* name as displayed in show race command and when setting races */ - "Lightning Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 180, /* male weight low */ - 370, /* male weight high */ - 70, /* male height low */ - 80, /* male height high */ - 180, /* female weight low */ - 370, /* female weight high */ - 70, /* female height low */ - 80, /* female height high */ - {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragonborn_lightning", /* name as found by triggers */ + "dragonborn lightning", /* all race keywords */ + "&b&4Dr&6a&4go&6n&4b&6or&4n&0", /* name as displayed at character creation, on who, and score */ + "&b&4Lightning Dragonborn&0", /* name as displayed in show race command and when setting races */ + "Lightning Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 180, /* male weight low */ + 370, /* male weight high */ + 70, /* male height low */ + 80, /* male height high */ + 180, /* female weight low */ + 370, /* female weight high */ + 70, /* female height low */ + 80, /* female height high */ + {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* DRAGONBORN - GAS */ - {"dragonborn_gas", /* name as found by triggers */ - "dragonborn gas", /* all race keywords */ - "&2&bDra&3g&2onb&3or&2n&0", /* name as displayed at character creation, on who, and score */ - "&2&bGas Dragonborn&0", /* name as displayed in show race command and when setting races */ - "Gas Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 180, /* male weight low */ - 370, /* male weight high */ - 70, /* male height low */ - 80, /* male height high */ - 180, /* female weight low */ - 370, /* female weight high */ - 70, /* female height low */ - 80, /* female height high */ - {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "dragonborn_gas", /* name as found by triggers */ + "dragonborn gas", /* all race keywords */ + "&2&bDra&3g&2onb&3or&2n&0", /* name as displayed at character creation, on who, and score */ + "&2&bGas Dragonborn&0", /* name as displayed in show race command and when setting races */ + "Gas Dragonborn", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 180, /* male weight low */ + 370, /* male weight high */ + 70, /* male height low */ + 80, /* male height high */ + 180, /* female weight low */ + 370, /* female weight high */ + 70, /* female height low */ + 80, /* female height high */ + {78, 64, 76, 72, 78, 76}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* SVERFNEBLIN */ - {"sverfneblin", /* name as found by triggers */ - "sverfneblin", /* all race keywords */ - "&9&d&bSverfneblin&0", /* name as displayed at character creation, on who, and score */ - "&9&d&bSverfneblin&0", /* name as displayed in show race command and when setting races */ - "Sverfneblin", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_EVIL, /* race alignment */ - SIZE_SMALL, /* default size */ - -1000, /* default alignment */ - 2, /* damroll bonus */ - 4, /* hitroll bonus */ - 105, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 40, /* male weight low */ - 90, /* male weight high */ - 26, /* male height low */ - 38, /* male height high */ - 40, /* female weight low */ - 90, /* female weight high */ - 26, /* female height low */ - 38, /* female height high */ - {64, 76, 88, 84, 68, 76}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "sverfneblin", /* name as found by triggers */ + "sverfneblin", /* all race keywords */ + "&9&d&bSverfneblin&0", /* name as displayed at character creation, on who, and score */ + "&9&d&bSverfneblin&0", /* name as displayed in show race command and when setting races */ + "Sverfneblin", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_EVIL, /* race alignment */ + SIZE_SMALL, /* default size */ + -1000, /* default alignment */ + 2, /* damroll bonus */ + 4, /* hitroll bonus */ + 105, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 40, /* male weight low */ + 90, /* male weight high */ + 26, /* male height low */ + 38, /* male height high */ + 40, /* female weight low */ + 90, /* female weight high */ + 26, /* female height low */ + 38, /* female height high */ + {64, 76, 88, 84, 68, 76}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* FAERIE - SEELIE */ - {"faerie_seelie", /* name as found by triggers */ - "faerie seelie", /* all race keywords */ - "&b&7F&3aeri&7e&0", /* name as displayed at character creation, on who, and score */ - "&b&7S&3eeli&7e F&3aeri&7e&0", /* name as displayed in show race command and when setting races */ - "Seelie Faerie", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_TINY, /* default size */ - 1000, /* default alignment */ - 0, /* damroll bonus */ - 6, /* hitroll bonus */ - 200, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 5, /* male weight low */ - 10, /* male weight high */ - 6, /* male height low */ - 10, /* male height high */ - 5, /* female weight low */ - 10, /* female weight high */ - 6, /* female height low */ - 10, /* female height high */ - {30, 95, 90, 90, 30, 95}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 80, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - "flutters in", /* verb for entering a room */ - "flutters", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "faerie_seelie", /* name as found by triggers */ + "faerie seelie", /* all race keywords */ + "&b&7F&3aeri&7e&0", /* name as displayed at character creation, on who, and score */ + "&b&7S&3eeli&7e F&3aeri&7e&0", /* name as displayed in show race command and when setting races */ + "Seelie Faerie", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_TINY, /* default size */ + 1000, /* default alignment */ + 0, /* damroll bonus */ + 6, /* hitroll bonus */ + 200, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 5, /* male weight low */ + 10, /* male weight high */ + 6, /* male height low */ + 10, /* male height high */ + 5, /* female weight low */ + 10, /* female weight high */ + 6, /* female height low */ + 10, /* female height high */ + {30, 95, 90, 90, 30, 95}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 80, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + "flutters in", /* verb for entering a room */ + "flutters", /* verb for walking out of a room */ + }, /* FAERIE - UNSEELIE */ - {"faerie_unseelie", /* name as found by triggers */ - "faerie unseelie", /* all race keywords */ - "&b&9F&0&5aeri&9&be&0", /* name as displayed at character creation, on who, and score */ - "&b&9U&0&5ns&b&9ee&0&5li&b&9e F&0&5aeri&9&be&0", /* name as displayed in show race command and when setting races - */ - "Unseelie Faerie", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_EVIL, /* race alignment */ - SIZE_TINY, /* default size */ - -1000, /* default alignment */ - 0, /* damroll bonus */ - 6, /* hitroll bonus */ - 200, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 5, /* male weight low */ - 10, /* male weight high */ - 6, /* male height low */ - 10, /* male height high */ - 5, /* female weight low */ - 10, /* female weight high */ - 6, /* female height low */ - 10, /* female height high */ - {30, 95, 90, 90, 30, 95}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 80, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - "flutters in", /* verb for entering a room */ - "flutters", /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ - + { + "faerie_unseelie", /* name as found by triggers */ + "faerie unseelie", /* all race keywords */ + "&b&9F&0&5aeri&9&be&0", /* name as displayed at character creation, on who, and score */ + "&b&9U&0&5ns&b&9ee&0&5li&b&9e F&0&5aeri&9&be&0", /* name as displayed in show race command and when setting + * races + */ + "Unseelie Faerie", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_EVIL, /* race alignment */ + SIZE_TINY, /* default size */ + -1000, /* default alignment */ + 0, /* damroll bonus */ + 6, /* hitroll bonus */ + 200, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 5, /* male weight low */ + 10, /* male weight high */ + 6, /* male height low */ + 10, /* male height high */ + 5, /* female weight low */ + 10, /* female weight high */ + 6, /* female height low */ + 10, /* female height high */ + {30, 95, 90, 90, 30, 95}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 80, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + "flutters in", /* verb for entering a room */ + "flutters", /* verb for walking out of a room */ + }, /* NYMPH */ - {"nymph", /* name as found by triggers */ - "nymph", /* all race keywords */ - "&3&bN&0&2ym&3&bph&0", /* name as displayed at character creation, on who, and score */ - "&3&bN&0&2ym&3&bph&0", /* name as displayed in show race command and when setting races */ - "Nymph", /* name as displayed in medit vsearch stat and enlightenment */ - true, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_MEDIUM, /* default size */ - 1000, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 105, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_FLESH, /* default composition */ - 90, /* male weight low */ - 160, /* male weight high */ - 59, /* male height low */ - 70, /* male height high */ - 68, /* female weight low */ - 160, /* female weight high */ - 59, /* female height low */ - 68, /* female height high */ - {65, 72, 80, 80, 65, 96}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}}, /* function numbers - always set as {0, 0}}, to close struct */ + { + "nymph", /* name as found by triggers */ + "nymph", /* all race keywords */ + "&3&bN&0&2ym&3&bph&0", /* name as displayed at character creation, on who, and score */ + "&3&bN&0&2ym&3&bph&0", /* name as displayed in show race command and when setting races */ + "Nymph", /* name as displayed in medit vsearch stat and enlightenment */ + true, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_MEDIUM, /* default size */ + 1000, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 105, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_FLESH, /* default composition */ + 90, /* male weight low */ + 160, /* male weight high */ + 59, /* male height low */ + 70, /* male height high */ + 68, /* female weight low */ + 160, /* female weight high */ + 59, /* female height low */ + 68, /* female height high */ + {65, 72, 80, 80, 65, 96}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }, /* ARBOREAN */ - {"arborean", /* name as found by triggers */ - "arborean", /* all race keywords */ - "&2Arborean&0", /* name as displayed at character creation, on who, and score */ - "&2Arborean&0", /* name as displayed in show race command and when setting races */ - "Arborean", /* name as displayed in medit vsearch stat and enlightenment */ - false, /* playable? */ - true, /* humanoid? */ - false, /* casts race spells? */ - RACE_ALIGN_GOOD, /* race alignment */ - SIZE_LARGE, /* default size */ - 0, /* default alignment */ - 3, /* damroll bonus */ - 3, /* hitroll bonus */ - 100, /* focus bonus / 100 */ - LIFE_LIFE, /* default life force */ - COMP_PLANT, /* default composition */ - 140, /* male weight low */ - 260, /* male weight high */ - 72, /* male height low */ - 106, /* male height high */ - 140, /* female weight low */ - 260, /* female weight high */ - 72, /* female height low */ - 106, /* female height high */ - {80, 62, 72, 80, 80, 72}, /* max stat: str, dex, int, wis, con, cha */ - 100, /* experience reward factor for mobs */ - 100, /* hp factor for mobs */ - 100, /* hitroll/damroll factor for mobs */ - 100, /* damage dice factor for mobs */ - 75, /* money drop factor for mobs */ - 100, /* AC factor for mobs */ - nullptr, /* verb for entering a room */ - nullptr, /* verb for walking out of a room */ - {0, 0}} /* function numbers - always set as {0, 0}}, to close struct */ - -}; + { + "arborean", /* name as found by triggers */ + "arborean", /* all race keywords */ + "&2Arborean&0", /* name as displayed at character creation, on who, and score */ + "&2Arborean&0", /* name as displayed in show race command and when setting races */ + "Arborean", /* name as displayed in medit vsearch stat and enlightenment */ + false, /* playable? */ + true, /* humanoid? */ + false, /* casts race spells? */ + RACE_ALIGN_GOOD, /* race alignment */ + SIZE_LARGE, /* default size */ + 0, /* default alignment */ + 3, /* damroll bonus */ + 3, /* hitroll bonus */ + 100, /* focus bonus / 100 */ + LIFE_LIFE, /* default life force */ + COMP_PLANT, /* default composition */ + 140, /* male weight low */ + 260, /* male weight high */ + 72, /* male height low */ + 106, /* male height high */ + 140, /* female weight low */ + 260, /* female weight high */ + 72, /* female height low */ + 106, /* female height high */ + {80, 62, 72, 80, 80, 72}, /* max stat: str, dex, int, wis, con, cha */ + 100, /* experience reward factor for mobs */ + 100, /* hp factor for mobs */ + 100, /* hitroll/damroll factor for mobs */ + 100, /* damage dice factor for mobs */ + 75, /* money drop factor for mobs */ + 100, /* AC factor for mobs */ + nullptr, /* verb for entering a room */ + nullptr, /* verb for walking out of a room */ + }}; const char *race_align_abbrevs[] = {"&0&3&bGOOD&0", "&0&1&bEVIL&0"}; void init_races(void) { -#define PERM_EFF(r, f) SET_FLAG(races[(r)].effect_flags, (f)) #define ADD_SKILL(s, p) \ do { \ races[race].skills[pos].skill = (s); \ @@ -1371,52 +1389,52 @@ void init_races(void) { * Add permanent effects to races here. */ - PERM_EFF(RACE_BROWNIE, EFF_INFRAVISION); + races[RACE_BROWNIE].effect_flags.set(EFF_INFRAVISION); - PERM_EFF(RACE_DRAGON_ACID, EFF_FLY); - PERM_EFF(RACE_DRAGON_FIRE, EFF_FLY); - PERM_EFF(RACE_DRAGON_FROST, EFF_FLY); - PERM_EFF(RACE_DRAGON_GAS, EFF_FLY); - PERM_EFF(RACE_DRAGON_LIGHTNING, EFF_FLY); - PERM_EFF(RACE_DRAGON_GENERAL, EFF_FLY); + races[RACE_DRAGON_ACID].effect_flags.set(EFF_FLY); + races[RACE_DRAGON_FIRE].effect_flags.set(EFF_FLY); + races[RACE_DRAGON_FROST].effect_flags.set(EFF_FLY); + races[RACE_DRAGON_GAS].effect_flags.set(EFF_FLY); + races[RACE_DRAGON_LIGHTNING].effect_flags.set(EFF_FLY); + races[RACE_DRAGON_GENERAL].effect_flags.set(EFF_FLY); - PERM_EFF(RACE_DRAGONBORN_FIRE, EFF_INFRAVISION); - PERM_EFF(RACE_DRAGONBORN_FROST, EFF_INFRAVISION); - PERM_EFF(RACE_DRAGONBORN_ACID, EFF_INFRAVISION); - PERM_EFF(RACE_DRAGONBORN_LIGHTNING, EFF_INFRAVISION); - PERM_EFF(RACE_DRAGONBORN_GAS, EFF_INFRAVISION); + races[RACE_DRAGONBORN_FIRE].effect_flags.set(EFF_INFRAVISION); + races[RACE_DRAGONBORN_FROST].effect_flags.set(EFF_INFRAVISION); + races[RACE_DRAGONBORN_ACID].effect_flags.set(EFF_INFRAVISION); + races[RACE_DRAGONBORN_LIGHTNING].effect_flags.set(EFF_INFRAVISION); + races[RACE_DRAGONBORN_GAS].effect_flags.set(EFF_INFRAVISION); - PERM_EFF(RACE_DROW, EFF_INFRAVISION); - PERM_EFF(RACE_DROW, EFF_ULTRAVISION); + races[RACE_DROW].effect_flags.set(EFF_INFRAVISION); + races[RACE_DROW].effect_flags.set(EFF_ULTRAVISION); - PERM_EFF(RACE_DUERGAR, EFF_INFRAVISION); - PERM_EFF(RACE_DUERGAR, EFF_ULTRAVISION); + races[RACE_DUERGAR].effect_flags.set(EFF_INFRAVISION); + races[RACE_DUERGAR].effect_flags.set(EFF_ULTRAVISION); - PERM_EFF(RACE_DWARF, EFF_DETECT_POISON); - PERM_EFF(RACE_DWARF, EFF_INFRAVISION); - PERM_EFF(RACE_DWARF, EFF_ULTRAVISION); + races[RACE_DWARF].effect_flags.set(EFF_DETECT_POISON); + races[RACE_DWARF].effect_flags.set(EFF_INFRAVISION); + races[RACE_DWARF].effect_flags.set(EFF_ULTRAVISION); - PERM_EFF(RACE_ELF, EFF_INFRAVISION); + races[RACE_ELF].effect_flags.set(EFF_INFRAVISION); - PERM_EFF(RACE_FAERIE_SEELIE, EFF_FLY); + races[RACE_FAERIE_SEELIE].effect_flags.set(EFF_FLY); - PERM_EFF(RACE_FAERIE_UNSEELIE, EFF_FLY); + races[RACE_FAERIE_UNSEELIE].effect_flags.set(EFF_FLY); - PERM_EFF(RACE_GNOME, EFF_INFRAVISION); + races[RACE_GNOME].effect_flags.set(EFF_INFRAVISION); - PERM_EFF(RACE_HALF_ELF, EFF_INFRAVISION); + races[RACE_HALF_ELF].effect_flags.set(EFF_INFRAVISION); - PERM_EFF(RACE_HALFLING, EFF_INFRAVISION); - PERM_EFF(RACE_HALFLING, EFF_SENSE_LIFE); + races[RACE_HALFLING].effect_flags.set(EFF_INFRAVISION); + races[RACE_HALFLING].effect_flags.set(EFF_SENSE_LIFE); - PERM_EFF(RACE_OGRE, EFF_INFRAVISION); - PERM_EFF(RACE_OGRE, EFF_ULTRAVISION); + races[RACE_OGRE].effect_flags.set(EFF_INFRAVISION); + races[RACE_OGRE].effect_flags.set(EFF_ULTRAVISION); - PERM_EFF(RACE_SVERFNEBLIN, EFF_INFRAVISION); - PERM_EFF(RACE_SVERFNEBLIN, EFF_ULTRAVISION); + races[RACE_SVERFNEBLIN].effect_flags.set(EFF_INFRAVISION); + races[RACE_SVERFNEBLIN].effect_flags.set(EFF_ULTRAVISION); - PERM_EFF(RACE_TROLL, EFF_INFRAVISION); - PERM_EFF(RACE_TROLL, EFF_ULTRAVISION); + races[RACE_TROLL].effect_flags.set(EFF_INFRAVISION); + races[RACE_TROLL].effect_flags.set(EFF_ULTRAVISION); /* * Add innate race skills to the switch below. @@ -1425,7 +1443,8 @@ void init_races(void) { * If a constant value is declared, the skill will always reset back to that value. * Use 'proficiency' or 'ROLL_SKILL_PROF' instead. * The only spells that should be assigned here are the breath weapon spells. - * Skills and spells intended to be unlocked beyond level 1 must be added in the assign_race_skills() function below. + * Skills and spells intended to be unlocked beyond level 1 must be added in the assign_race_skills() function + * below. */ for (race = 0; race < NUM_RACES; ++race) { memset(races[race].skills, 0, sizeof(races[race].skills)); @@ -1518,16 +1537,16 @@ void init_races(void) { } #undef ADD_SKILL -#undef PERM_EFF } -/* This is where to add race skills which unlock beyond level 1, or spells that should be castable through normal means. */ +/* This is where to add race skills which unlock beyond level 1, or spells that should be castable through normal means. + */ #define race_spell_assign(spellnum, race_num, level) race_skill_assign(spellnum, race_num, level) #define race_chant_assign(chantnum, race_num, level) race_skill_assign(chantnum, race_num, level) #define race_song_assign(songnum, race_num, level) race_skill_assign(songnum, race_num, level) - void assign_race_skills(void) { +void assign_race_skills(void) { /* From here on down, the races are listed in alphabetical order. * Within each race, skills should be sorted by level and spells @@ -1546,7 +1565,7 @@ void init_races(void) { /* DRAGON - ACID */ /* DRAGON - FIRE */ - + /* DRAGON - GAS */ /* DRAGON - GENERAL */ @@ -1563,7 +1582,7 @@ void init_races(void) { /* DRAGONBORN - FROST */ race_skill_assign(SKILL_BREATHE_FROST, RACE_DRAGONBORN_FROST, 1); - + /* DRAGONBORN - GAS */ race_skill_assign(SKILL_BREATHE_GAS, RACE_DRAGONBORN_GAS, 1); @@ -1613,9 +1632,7 @@ void init_races(void) { /* TROLL */ /* UNSEELIE FAERIE */ - - } - +} /* parse_race * @@ -1814,7 +1831,7 @@ void update_char_race(CharData *ch) { GET_RACE_ALIGN(ch) = races[(int)GET_RACE(ch)].racealign; /* Reset effect flags for this race */ - SET_FLAGS(EFF_FLAGS(ch), races[(int)GET_RACE(ch)].effect_flags, NUM_EFF_FLAGS); + EFF_FLAGS(ch) = races[(int)GET_RACE(ch)].effect_flags; } /* diff --git a/src/redit.cpp b/src/redit.cpp index 4e7dd6c2..1ecbe4f4 100644 --- a/src/redit.cpp +++ b/src/redit.cpp @@ -311,7 +311,7 @@ void redit_save_to_disk(int zone_num) { * Forget making a buffer, lets just write the thing now. */ fprintf(fp, "#%d\n%s~\n%s~\n%d %ld %d\n", counter, room->name ? room->name : "undefined", buf1, - zone_table[room->zone].number, room->room_flags[0], room->sector_type); + zone_table[room->zone].number, room->room_flags.to_ulong(), room->sector_type); /* * Handle exits. @@ -332,12 +332,12 @@ void redit_save_to_disk(int zone_num) { /* * Figure out door flag. */ - if (IS_SET(room->exits[counter2]->exit_info, EX_ISDOOR)) { - if (IS_SET(room->exits[counter2]->exit_info, EX_PICKPROOF)) + if (room->exits[counter2]->exit_info.test(EX_ISDOOR)) { + if (room->exits[counter2]->exit_info.test(EX_PICKPROOF)) temp_door_flag = 2; else temp_door_flag = 1; - } else if (IS_SET(room->exits[counter2]->exit_info, EX_DESCRIPT)) { + } else if (room->exits[counter2]->exit_info.test(EX_DESCRIPT)) { temp_door_flag = 3; room->exits[counter2]->to_room = -1; room->exits[counter2]->key = -1; @@ -463,10 +463,10 @@ void redit_disp_exit_menu(DescriptorData *d) { *buf2 = '\0'; /* weird door handling! */ - if (IS_SET(OLC_EXIT(d)->exit_info, EX_DESCRIPT)) + if (OLC_EXIT(d)->exit_info.test(EX_DESCRIPT)) strcat(buf2, "Description only "); - if (IS_SET(OLC_EXIT(d)->exit_info, EX_ISDOOR)) { - if (IS_SET(OLC_EXIT(d)->exit_info, EX_PICKPROOF)) + if (OLC_EXIT(d)->exit_info.test(EX_ISDOOR)) { + if (OLC_EXIT(d)->exit_info.test(EX_PICKPROOF)) strcat(buf2, "Pickproof"); else strcat(buf2, "Is a door"); @@ -530,7 +530,7 @@ void redit_disp_flag_menu(DescriptorData *d) { char_printf(d->character, strcat(buf, "\n")); } - sprintflag(buf1, OLC_ROOM(d)->room_flags, NUM_ROOM_FLAGS, room_bits); + sprintflag(buf1, OLC_ROOM(d)->room_flags, room_bits); sprintf(buf, "\nRoom flags: %s%s%s\n" "Enter room flags, 0 to quit : ", @@ -576,7 +576,7 @@ void redit_disp_menu(DescriptorData *d) { get_char_cols(d->character); room = OLC_ROOM(d); - sprintflag(buf1, room->room_flags, NUM_ROOM_FLAGS, room_bits); + sprintflag(buf1, room->room_flags, room_bits); sprintf(buf2, "%s", sectors[room->sector_type].name); sprintf(buf, #if defined(CLEAR_SCREEN) @@ -747,7 +747,7 @@ void redit_parse(DescriptorData *d, char *arg) { /* * Toggle the bit. */ - TOGGLE_FLAG(OLC_ROOM(d)->room_flags, number - 1); + OLC_ROOM(d)->room_flags.flip(number - 1); redit_disp_flag_menu(d); } return; diff --git a/src/regen.cpp b/src/regen.cpp index 21b993ff..421a1f39 100644 --- a/src/regen.cpp +++ b/src/regen.cpp @@ -62,7 +62,7 @@ EVENTFUNC(hp_regen_event) { } if (!delay) - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_REGEN_HP); + GET_EVENT_FLAGS(ch).reset(EVENT_REGEN_HP); return delay; } @@ -75,35 +75,36 @@ EVENTFUNC(spellslot_restore_event) { char_printf(ch, "Your mind is too crazed to meditate!\n"); act("$n ceases $s meditative trance.", true, ch, 0, 0, TO_ROOM); if (IS_NPC(ch)) - REMOVE_FLAG(MOB_FLAGS(ch), MOB_MEDITATE); - else REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + MOB_FLAGS(ch).reset(MOB_MEDITATE); + else + PLR_FLAGS(ch).reset(PLR_MEDITATE); } if (FIGHTING(ch)) { char_printf(ch, "Your meditation is rudely interrupted!\n"); act("$n ceases $s meditative trance.", true, ch, 0, 0, TO_ROOM); if (IS_NPC(ch)) - REMOVE_FLAG(MOB_FLAGS(ch), MOB_MEDITATE); + MOB_FLAGS(ch).reset(MOB_MEDITATE); else - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_MEDITATE); } if (IS_DRUNK(ch)) { char_printf(ch, "You cannot meditate while intoxicated.\n"); act("$n ceases $s meditative trance.", true, ch, 0, 0, TO_ROOM); if (IS_NPC(ch)) - REMOVE_FLAG(MOB_FLAGS(ch), MOB_MEDITATE); + MOB_FLAGS(ch).reset(MOB_MEDITATE); else - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_MEDITATE); } if (GET_POS(ch) != POS_SITTING || GET_STANCE(ch) < STANCE_RESTING || GET_STANCE(ch) > STANCE_ALERT) { char_printf(ch, "You stop meditating.\n"); act("$n ceases $s meditative trance.", true, ch, 0, 0, TO_ROOM); if (IS_NPC(ch)) - REMOVE_FLAG(MOB_FLAGS(ch), MOB_MEDITATE); + MOB_FLAGS(ch).reset(MOB_MEDITATE); else - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_MEDITATE); } } @@ -126,11 +127,11 @@ EVENTFUNC(spellslot_restore_event) { act("$n ceases $s meditative trance.", true, ch, 0, 0, TO_ROOM); if (!IS_NPC(ch)) { char_printf(ch, "You stop meditating.\n&0"); - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_MEDITATE); } else - REMOVE_FLAG(MOB_FLAGS(ch), MOB_MEDITATE); + MOB_FLAGS(ch).reset(MOB_MEDITATE); } - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_REGEN_SPELLSLOT); + GET_EVENT_FLAGS(ch).reset(EVENT_REGEN_SPELLSLOT); return 0; } } @@ -150,7 +151,7 @@ EVENTFUNC(move_regen_event) { } if (!delay) - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_REGEN_MOVE); + GET_EVENT_FLAGS(ch).reset(EVENT_REGEN_MOVE); return delay; } @@ -184,7 +185,7 @@ EVENTFUNC(rage_event) { /* When you reach crazed rage, you are forced to start berserking. */ if (GET_RAGE(ch) > RAGE_CRAZED && !EFF_FLAGGED(ch, EFF_BERSERK)) { if (PLR_FLAGGED(ch, PLR_MEDITATE)) { - REMOVE_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).reset(PLR_MEDITATE); GET_POS(ch) = POS_STANDING; } start_berserking(ch); @@ -198,7 +199,7 @@ EVENTFUNC(rage_event) { else { char_printf(ch, "Your rage recedes and you feel calmer.\n"); stop_berserking(ch); - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_RAGE); + GET_EVENT_FLAGS(ch).reset(EVENT_RAGE); return EVENT_FINISHED; } } @@ -214,23 +215,23 @@ void set_regen_event(CharData *ch, int eventtype) { gain = hit_gain(ch); time = PULSES_PER_MUD_HOUR / (gain ? gain : 1); event_create(EVENT_REGEN_HP, hp_regen_event, ch, false, &(ch->events), time); - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_REGEN_HP); + GET_EVENT_FLAGS(ch).set(EVENT_REGEN_HP); } if (eventtype == EVENT_REGEN_MOVE && !EVENT_FLAGGED(ch, EVENT_REGEN_MOVE) && GET_MOVE(ch) < GET_MAX_MOVE(ch)) { gain = move_gain(ch); time = PULSES_PER_MUD_HOUR / (gain ? gain : 1); event_create(EVENT_REGEN_MOVE, move_regen_event, ch, false, &(ch->events), time); - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_REGEN_MOVE); + GET_EVENT_FLAGS(ch).set(EVENT_REGEN_MOVE); } if (eventtype == EVENT_RAGE && !EVENT_FLAGGED(ch, EVENT_RAGE) && (GET_RAGE(ch) > 0 || (GET_SKILL(ch, SKILL_BERSERK) && PLR_FLAGGED(ch, PLR_MEDITATE)))) { event_create(EVENT_RAGE, rage_event, ch, false, &(ch->events), 0); - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_RAGE); + GET_EVENT_FLAGS(ch).set(EVENT_RAGE); } if (eventtype == EVENT_REGEN_SPELLSLOT && !EVENT_FLAGGED(ch, EVENT_REGEN_SPELLSLOT) && !ch->spellcasts.empty()) { event_create(EVENT_REGEN_SPELLSLOT, spellslot_restore_event, ch, false, &(ch->events), 1 RL_SEC); - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_REGEN_SPELLSLOT); + GET_EVENT_FLAGS(ch).set(EVENT_REGEN_SPELLSLOT); } } diff --git a/src/rooms.cpp b/src/rooms.cpp index 2b5744ee..8e2a73c1 100644 --- a/src/rooms.cpp +++ b/src/rooms.cpp @@ -728,7 +728,7 @@ void send_full_exits(CharData *ch, int roomnum) { else sprintf(buf1, "%s&2%s&0 (key %d): ", buf1, exit->keyword, exit->key); } - sprintbit(exit->exit_info, exit_bits, buf1 + strlen(buf1)); + sprintbit(exit->exit_info.to_ulong(), exit_bits, buf1 + strlen(buf1)); strcat(buf1, "&9&b]&0"); sprintf(buf2, "%-5s - [%5d] %s%s\n", dirs[dir], dest->vnum, dest->name, buf1); } else { diff --git a/src/rules.old b/src/rules.old deleted file mode 100644 index 00f91101..00000000 --- a/src/rules.old +++ /dev/null @@ -1,409 +0,0 @@ -/*************************************************************************** - * File: rules.c Part of FieryMUD * - * Usage: character rules * - * * - * All rights reserved. See license.doc for complete information. * - * * - * FieryMUD Copyright (C) 1998, 1999, 2000 by the Fiery Consortium * - * FieryMUD is based on CircleMUD Copyright (C) 1993, 94 by the Trustees * - * of the Johns Hopkins University * - * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * - ***************************************************************************/ - -#include "rules.hpp" - -#ifdef __OLD_CODE_DO_NOT_USE__ -#include "clan.hpp" -#include "conf.hpp" -#include "handler.hpp" -#include "interpreter.hpp" -#include "screen.hpp" -#include "structs.hpp" -#include "sysdep.hpp" -#include "utils.hpp" -#include "logging.hpp" - - -/* our own little private buffer, similar to what is declared in db.c */ -static char arg[MAX_STRING_LENGTH]; - -// DECLARE_RULE_VTABLE(Clan); -struct RuleVTable _clan_vtable; -struct RuleVTable _command_vtable; -struct RuleVTable _level_vtable; -struct RuleVTable _namelist_vtable; -struct RuleVTable _and_vtable; -struct RuleVTable _not_vtable; -struct RuleVTable _or_vtable; -/* DECLARE_RULE_VTABLE(command); */ -// DECLARE_RULE_VTABLE(level); -// DECLARE_RULE_VTABLE(namelist); -// DECLARE_RULE_VTABLE(and); -// DECLARE_RULE_VTABLE(not ); -// DECLARE_RULE_VTABLE(or); - -void init_rules() { - // RuleVTable *vtable_list[] = {&RULE_VTABLE(and), &RULE_VTABLE(clan), - // /* &RULE_VTABLE(command), */ - // &RULE_VTABLE(level), &RULE_VTABLE(namelist), &RULE_VTABLE(not ), &RULE_VTABLE(or), - // nullptr}; - RuleVTable *vtable_list[] = {&_and_vtable, &_clan_vtable, - /* &RULE_VTABLE(command), */ - &_level_vtable, &_namelist_vtable, &_not_vtable, &_or_vtable, nullptr}; - size_t pos; - - for (pos = 0; vtable_list[pos]; ++pos) - register_rule_vtable(vtable_list[pos]); -} - -/* - * CLAN RULE - */ - -/* rule data type */ -struct ClanRule { // BEGIN_RULE_DATATYPE; - RuleVTable *_vtable; - unsigned int number; - unsigned int rank; -}; // PUBLISH_RULE_DATATYPE(ClanRule); - -// RULE_CONSTRUCTOR(make_clan_rule) -Rule *make_clan_rule(unsigned int clan, unsigned int rank) { - // ClanRule *cr = (ClanRule *)rulealloc(sizeof(ClanRule), &_clan_vtable); // MAKE_RULE(clan, ClanRule); - ClanRule *cr; - cr = (ClanRule *)calloc(1, sizeof(ClanRule)); - cr->number = clan; - cr->rank = rank; - return (Rule *)cr; -} - -// RULE_SIG_MATCHER((_clan_matcher)) { -bool(_clan_matcher)(const Rule *_rule, CharData *ch) { - const ClanRule *rule = (ClanRule *)_rule; - return GET_CLAN(ch) && GET_CLAN(ch)->number == rule->number && !OUTRANKS(rule->rank, GET_CLAN_RANK(ch)); -} -// BEGIN_RULE_FUNC_MATCHER(clan, ClanRule) { -// return GET_CLAN(ch) && GET_CLAN(ch)->number == rule->number && !OUTRANKS(rule->rank, GET_CLAN_RANK(ch)); -// } - -END_RULE_FUNC BEGIN_RULE_FUNC_DESTRUCTOR(clan, ClanRule) { free(rule); } - -END_RULE_FUNC BEGIN_RULE_FUNC_PRINT(clan, ClanRule) { snprintf(buf, size, "%u %u", rule->number, rule->rank); } - -END_RULE_FUNC BEGIN_RULE_FUNC_ABBR(clan, ClanRule) { - snprintf(buf, size, "%u" FCYN "%u" ANRM, rule->number, rule->rank); -} - -END_RULE_FUNC - -void _clan_verbose(char *buf, size_t size, const Rule *_rule) { - const ClanRule *rule = (const ClanRule *)_rule; - - // BEGIN_RULE_FUNC_VERBOSE(clan, ClanRule) { - clan *clan = find_clan_by_number(rule->number); - if (clan) - snprintf(buf, size, "clan %s, rank %u", clan->abbreviation, rule->rank); - else - snprintf(buf, size, "unknown clan %u, rank %u", rule->number, rule->rank); -} - -END_RULE_FUNC - -// BEGIN_RULE_FUNC_PARSE(clan, ClanRule) { -// RULE_SIG_PARSE((_clan_parse)) { -Rule *(_clan_parse)(const char *buf) { - - clan *clan; - unsigned int number, rank; - if (sscanf(buf, "%u %u", &number, &rank) == 2) - return make_clan_rule(number, rank); - else { - buf = fetch_word(buf, arg, sizeof(arg)); - skip_over(buf, S_WHITESPACE); - if (!(clan = find_clan(arg))) - return nullptr; /* invalid clan */ - else if (!is_number(buf)) - return nullptr; /* invalid rank */ - else - return make_clan_rule(clan->number, atoi(buf)); - } -} - -END_RULE_FUNC PUBLISH_RULE_VTABLE(clan); - -/* - * LEVEL RANGE RULE - */ - -// BEGIN_RULE_DATATYPE; -struct { - RuleVTable *_vtable; - int min; - int max; - // PUBLISH_RULE_DATATYPE(range_rule); -} range_rule; - -RULE_CONSTRUCTOR(make_level_rule)(int min_level, int max_level) { - range_rule *rr = MAKE_RULE(level, range_rule); - rr->min = min_level; - rr->max = max_level; - return (Rule *)rr; -} - -BEGIN_RULE_FUNC_MATCHER(level, range_rule) { return GET_LEVEL(ch) >= rule->min && GET_LEVEL(ch) <= rule->max; } - -END_RULE_FUNC BEGIN_RULE_FUNC_DESTRUCTOR(level, range_rule) { free(rule); } - -END_RULE_FUNC BEGIN_RULE_FUNC_PRINT(level, range_rule) { snprintf(buf, size, "%d %d", rule->min, rule->max); } - -END_RULE_FUNC BEGIN_RULE_FUNC_ABBR(level, range_rule) { snprintf(buf, size, "%d", rule->min); } - -END_RULE_FUNC BEGIN_RULE_FUNC_VERBOSE(level, range_rule) { - snprintf(buf, size, "level%s %d - %d", rule->min == rule->max ? "" : "s", rule->min, rule->max); -} - -END_RULE_FUNC BEGIN_RULE_FUNC_PARSE(level, range_rule) { - int min, max; - if (sscanf(buf, "%d %d", &min, &max) == 2) - return make_level_rule(min, max); - else - return nullptr; -} - -END_RULE_FUNC PUBLISH_RULE_VTABLE(level); - -/* - * NAMELIST RULE - */ - -BEGIN_RULE_DATATYPE; -char *namelist; -PUBLISH_RULE_DATATYPE(namelist_rule); - -RULE_CONSTRUCTOR(make_namelist_rule)(const char *namelist) { - namelist_rule *nr = MAKE_RULE(namelist, namelist_rule); - nr->namelist = strdup(namelist); - return (Rule *)nr; -} - -BEGIN_RULE_FUNC_MATCHER(namelist, namelist_rule) { return isname(GET_NAME(ch), rule->namelist); } - -END_RULE_FUNC BEGIN_RULE_FUNC_DESTRUCTOR(namelist, namelist_rule) { - free(rule->namelist); - free(rule); -} - -END_RULE_FUNC BEGIN_RULE_FUNC_PRINT(namelist, namelist_rule) { snprintf(buf, size, "%s", rule->namelist); } - -END_RULE_FUNC BEGIN_RULE_FUNC_ABBR(namelist, namelist_rule) { snprintf(buf, size, "%s", rule->namelist); } - -END_RULE_FUNC BEGIN_RULE_FUNC_VERBOSE(namelist, namelist_rule) { snprintf(buf, size, "names: %s", rule->namelist); } - -END_RULE_FUNC BEGIN_RULE_FUNC_PARSE(namelist, namelist_rule) { return make_namelist_rule(buf); } - -END_RULE_FUNC PUBLISH_RULE_VTABLE(namelist); - -/* - * AND/OR RULES - */ - -BEGIN_RULE_DATATYPE; -Rule *left; -Rule *right; -PUBLISH_RULE_DATATYPE(binary_rule); - -#define BINARY_AND 0 -#define BINARY_OR 1 -#define BINARY_NAND 2 /* not implemented */ -#define BINARY_NOR 3 /* not implemented */ - -static RULE_CONSTRUCTOR(make_binary_rule)(Rule *left, Rule *right, int binary_type) { - binary_rule *br = nullptr; - switch (binary_type) { - case BINARY_AND: - br = MAKE_RULE(and, binary_rule); - break; - case BINARY_OR: - br = MAKE_RULE(or, binary_rule); - break; - default: - return nullptr; - } - br->left = left; - br->right = right; - return (Rule *)br; -} - -RULE_CONSTRUCTOR(make_and_rule)(Rule *left, Rule *right) { return make_binary_rule(left, right, 0); } - -RULE_CONSTRUCTOR(make_or_rule)(Rule *left, Rule *right) { return make_binary_rule(left, right, 1); } - -BEGIN_RULE_FUNC_MATCHER(and, binary_rule) { return rule_matches(rule->left, ch) && rule_matches(rule->right, ch); } - -END_RULE_FUNC BEGIN_RULE_FUNC_MATCHER(or, binary_rule) { - return rule_matches(rule->left, ch) || rule_matches(rule->right, ch); -} - -END_RULE_FUNC BEGIN_RULE_FUNC_DESTRUCTOR(binary, binary_rule) { - if (rule->left != rule->right) - free_rule(rule->left); - free_rule(rule->right); - free(rule); -} - -END_RULE_FUNC -/* Safe Unsigned Decrement */ -#define SUD(var, amt) ((var) -= (var) < (amt) ? (var) : (amt)) -void print_binary_rule(char *buf, size_t size, const char *insert, const binary_rule *rule, bool verbose) { - char *p = buf; - size_t diff; - - snprintf(p, size, "("); - - SUD(size, 1); - ++p; - if (verbose) - rule_verbose(p, size, rule->left); - else - sprint_rule(p, size, rule->left); - - diff = strlen(p); - SUD(size, diff); - p += diff; - snprintf(buf, size, ")%s(", insert); - - SUD(size, 3); - p += 3; - if (verbose) - rule_verbose(p, size, rule->right); - else - sprint_rule(p, size, rule->right); - - diff = strlen(p); - SUD(size, diff); - p += diff; - snprintf(buf, size, ")"); -} - -BEGIN_RULE_FUNC_PRINT(binary, binary_rule) { print_binary_rule(buf, size, " ", rule, false); } - -END_RULE_FUNC BEGIN_RULE_FUNC_ABBR(and, binary_rule) { - rule = rule; /* to avoid compiler warning */ - snprintf(buf, size, "AND"); -} - -END_RULE_FUNC BEGIN_RULE_FUNC_ABBR(or, binary_rule) { - rule = rule; /* to avoid compiler warning */ - snprintf(buf, size, "OR"); -} - -END_RULE_FUNC BEGIN_RULE_FUNC_VERBOSE(and, binary_rule) { print_binary_rule(buf, size, " and ", rule, true); } - -END_RULE_FUNC BEGIN_RULE_FUNC_VERBOSE(or, binary_rule) { print_binary_rule(buf, size, " or ", rule, true); } - -END_RULE_FUNC bool process_binary_rule(const char *buf, Rule **left, Rule **right) { - const char *start = buf, *end; - char *temp; - *left = nullptr; - *right = nullptr; - - if (*start != '(') - return false; - for (end = ++start; *end && *end != ')'; ++end) - ; - if (start == end || *end != ')') - return false; - CREATE(temp, char, end - start + 1); - strncpy(temp, start, end - start); - *left = parse_rule(temp); - free(temp); - if (!*left) - return false; - start = ++end; - if (*start != ' ' || *(start + 1) != '(' || *(start + 2) == '\0') { - free_rule(*left); - return false; - } - start += 2; - for (end = (start += 2); *end && *end != ')'; ++end) - ; - if (start == end || *end != ')') { - free_rule(*left); - return false; - } - CREATE(temp, char, end - start + 1); - strncpy(temp, start, end - start); - *right = parse_rule(temp); - free(temp); - if (!*right) { - free_rule(*left); - return false; - } - return true; -} - -BEGIN_RULE_FUNC_PARSE(and, binary_rule) { - Rule *left = nullptr, *right = nullptr; - if (!process_binary_rule(buf, &left, &right)) - return nullptr; - return make_binary_rule(left, right, true); -} - -END_RULE_FUNC BEGIN_RULE_FUNC_PARSE(or, binary_rule) { - Rule *left = nullptr, *right = nullptr; - if (!process_binary_rule(buf, &left, &right)) - return nullptr; - return make_binary_rule(left, right, false); -} - -END_RULE_FUNC PUBLISH_RULE_VTABLE_MANUAL(and, and, binary, binary, and, and, and); -PUBLISH_RULE_VTABLE_MANUAL(or, or, binary, binary, or, or, or); - -/* - * NOT RULE - */ -BEGIN_RULE_DATATYPE; -Rule *child; -PUBLISH_RULE_DATATYPE(unary_rule); - -RULE_CONSTRUCTOR(make_not_rule)(Rule *child) { - unary_rule *ur = MAKE_RULE(not, unary_rule); - ur->child = child; - return (Rule *)ur; -} - -BEGIN_RULE_FUNC_MATCHER(not, unary_rule) { return !rule_matches(rule->child, ch); } - -END_RULE_FUNC BEGIN_RULE_FUNC_DESTRUCTOR(unary, unary_rule) { - free_rule(rule->child); - free(rule); -} - -END_RULE_FUNC BEGIN_RULE_FUNC_PRINT(unary, unary_rule) { sprint_rule(buf, size, rule->child); } - -END_RULE_FUNC BEGIN_RULE_FUNC_ABBR(not, unary_rule) { - rule = rule; /* avoid compiler warning */ - snprintf(buf, size, "NOT"); -} - -END_RULE_FUNC BEGIN_RULE_FUNC_VERBOSE(not, unary_rule) { - size_t diff; - snprintf(buf, size, "not ("); - SUD(size, 3); - buf += 3; - rule_verbose(buf, size, rule->child); - diff = strlen(buf); - SUD(size, diff); - buf += diff; - snprintf(buf, size, ")"); -} -END_RULE_FUNC BEGIN_RULE_FUNC_PARSE(not, unary_rule) { - Rule *child = parse_rule(buf); - if (child) - return make_not_rule(child); - else - return nullptr; -} - -END_RULE_FUNC PUBLISH_RULE_VTABLE_MANUAL(not, not, unary, unary, not, not, not ); -#endif \ No newline at end of file diff --git a/src/rulesys.old b/src/rulesys.old deleted file mode 100644 index 61c98e0f..00000000 --- a/src/rulesys.old +++ /dev/null @@ -1,106 +0,0 @@ -/*************************************************************************** - * File: rulesys.c Part of FieryMUD * - * Usage: character rules infrastructure * - * * - * All rights reserved. See license.doc for complete information. * - * * - * FieryMUD Copyright (C) 1998, 1999, 2000 by the Fiery Consortium * - * FieryMUD is based on CircleMUD Copyright (C) 1993, 94 by the Trustees * - * of the Johns Hopkins University * - * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * - ***************************************************************************/ -#ifdef __OLD_CODE_DO_NOT_USE__ -#include "conf.hpp" -#include "rules.hpp" -#include "structs.hpp" -#include "sysdep.hpp" -#include "utils.hpp" -#include "logging.hpp" - - -static size_t vtable_count = 0; -static RuleVTable **vtables = nullptr; - -void register_rule_vtable(RuleVTable *vtable) { - size_t pos, i; - bool swap; - - if ((pos = vtable_count++)) /* post-increment! */ - RECREATE(vtables, RuleVTable *, vtable_count); - else - CREATE(vtables, RuleVTable *, vtable_count); - - vtables[pos] = vtable; - - /* sort */ - ++pos; - do { - swap = false; - --pos; - for (i = 0; i < pos; ++i) - if (strcasecmp(vtables[i]->name, vtables[i + 1]->name) > 0) { - vtable = vtables[i]; - vtables[i] = vtables[i + 1]; - vtables[i + 1] = vtable; - swap = true; - } - } while (swap); -} - -RuleVTable *find_rule_vtable(const char *type) { - size_t last = vtable_count - 1; - size_t first = 0, mid; - int comp; - - if (vtable_count == 0) - return nullptr; - - while (first <= last) { - mid = (first + last) / 2; - comp = strcasecmp(type, vtables[mid]->name); - if (comp > 0) - first = mid + 1; /* search top half */ - else if (comp < 0) { - if (mid == 0) - return nullptr; /* avoid last == -1 */ - last = mid - 1; /* search bottom half */ - } else - return vtables[mid]; - } - - return nullptr; -} - -Rule *rulealloc(size_t elsize, RuleVTable *vtable) { - Rule *rule = (Rule *)calloc(1, elsize); - rule->_vtable = vtable; - return *rule; -} - -Rule *parse_rule(const char *str) { - RuleVTable *vtable; - char type[MAX_INPUT_LENGTH]; - char *ptr = type; - - str = skip_over(str, S_WHITESPACE); - while (*str && !isspace(*str)) - *(ptr++) = *(str++); - *ptr = '\0'; - str = skip_over(str, S_WHITESPACE); - - if (!(vtable = find_rule_vtable(type))) - return nullptr; - - return vtable->parse(str); -} - -void sprint_rule(char *buf, size_t size, Rule *rule) { - if (rule) { - size_t len = snprintf(buf, size, "%s ", rule->_vtable->name); - if (len < size) - (rule->_vtable->print)(buf + len, size - len, rule); - } else - snprintf(buf, size, "NULL"); -} - -#endif \ No newline at end of file diff --git a/src/shop.cpp b/src/shop.cpp index 60e93db2..b7cad242 100644 --- a/src/shop.cpp +++ b/src/shop.cpp @@ -246,7 +246,8 @@ int trade_with(ObjData *item, int shop_nr) { for (counter = 0; SHOP_BUYTYPE(shop_nr, counter) != NOTHING; counter++) if (SHOP_BUYTYPE(shop_nr, counter) == GET_OBJ_TYPE(item)) { if ((GET_OBJ_VAL(item, VAL_WAND_CHARGES_LEFT) == 0) && - ((GET_OBJ_TYPE(item) == ITEM_WAND) || (GET_OBJ_TYPE(item) == ITEM_STAFF) || (GET_OBJ_TYPE(item) == ITEM_INSTRUMENT))) + ((GET_OBJ_TYPE(item) == ITEM_WAND) || (GET_OBJ_TYPE(item) == ITEM_STAFF) || + (GET_OBJ_TYPE(item) == ITEM_INSTRUMENT))) return OBJECT_DEAD; else if (evaluate_expression(item, SHOP_BUYWORD(shop_nr, counter))) return OBJECT_OK; @@ -266,7 +267,7 @@ int same_obj(ObjData *obj1, ObjData *obj2) { if (GET_OBJ_COST(obj1) != GET_OBJ_COST(obj2)) return (false); - if (!ALL_FLAGGED(GET_OBJ_FLAGS(obj1), GET_OBJ_FLAGS(obj2), NUM_ITEM_FLAGS)) + if (!(GET_OBJ_FLAGS(obj1).all() && GET_OBJ_FLAGS(obj2).all())) return (false); for (index = 0; index < MAX_OBJ_APPLIES; index++) @@ -453,7 +454,6 @@ int inspect_price(CharData *ch, CharData *keeper, ObjData *obj, int shop_nr) { return (price); } - void apply_getcash(CharData *ch, int cash) { GET_PLATINUM(ch) += PLATINUM_PART(cash); GET_GOLD(ch) += GOLD_PART(cash); @@ -473,7 +473,8 @@ void apply_cost(int cost, CharData *ch) { int haveP, haveG, haveS, haveC; if (cost > GET_CASH(ch)) { - log(LogSeverity::Warn, LVL_GOD, "ERR: {} being charged {} but doesn't have that much money", GET_NAME(ch), cost); + log(LogSeverity::Warn, LVL_GOD, "ERR: {} being charged {} but doesn't have that much money", GET_NAME(ch), + cost); return; } @@ -964,7 +965,7 @@ std::string list_object(CharData *keeper, ObjData *obj, CharData *ch, int cnt, i bp = ((int)(buy_price(ch, keeper, obj, shop_nr))); else if (service == SERVICE_PRICE) bp = ((int)(inspect_price(ch, keeper, obj, shop_nr))); - + return (fmt::format("{:<56} &0&b&6{:3d}&0p,&b&3{:d}&0g,&0{:d}s,&0&3{:d}&0c\n", strip_ansi(buf.c_str()), PLATINUM_PART(bp), GOLD_PART(bp), SILVER_PART(bp), COPPER_PART(bp))); } @@ -1020,7 +1021,8 @@ void shopping_list(char *arg, CharData *ch, CharData *keeper, int shop_nr) { void shopping_inspect(char *arg, CharData *ch, CharData *keeper, int shop_nr) { char tempstr[200], buf[MAX_STRING_LENGTH], name[MAX_INPUT_LENGTH]; ObjData *obj, *last_obj = 0; - int copperamt = 0, cnt = 0, index = 0;; + int copperamt = 0, cnt = 0, index = 0; + ; bool amount = 0, any = false; int counter; @@ -1038,7 +1040,8 @@ void shopping_inspect(char *arg, CharData *ch, CharData *keeper, int shop_nr) { if (!any) { any = true; paging_printf(ch, " ## Lvl Item Cost\n"); - paging_printf(ch, "--- --- ------------------------------------------------ -------------\n"); + paging_printf(ch, + "--- --- ------------------------------------------------ -------------\n"); } if (!last_obj) { last_obj = obj; diff --git a/src/spec_procs.cpp b/src/spec_procs.cpp index 463930ec..e3fece3d 100644 --- a/src/spec_procs.cpp +++ b/src/spec_procs.cpp @@ -386,8 +386,8 @@ SPECIAL(pet_shop) { GET_EXP(pet) = 0; GET_MAX_MOVE(pet) *= 15; GET_MOVE(pet) = GET_MAX_MOVE(pet); - SET_FLAG(EFF_FLAGS(pet), EFF_CHARM); - SET_FLAG(MOB_FLAGS(pet), MOB_PET); + EFF_FLAGS(pet).set(EFF_CHARM); + MOB_FLAGS(pet).set(MOB_PET); if (*pet_name) { sprintf(buf, "%s %s", GET_NAMELIST(pet), pet_name); @@ -447,8 +447,8 @@ SPECIAL(pet_shop) { GET_EXP(pet) = 0; GET_MAX_MOVE(pet) *= 15; GET_MOVE(pet) = GET_MAX_MOVE(pet); - SET_FLAG(EFF_FLAGS(pet), EFF_CHARM); - SET_FLAG(MOB_FLAGS(pet), MOB_PET); + EFF_FLAGS(pet).set(EFF_CHARM); + MOB_FLAGS(pet).set(MOB_PET); sprintf(buf, "Name: %s\n", GET_NAME(pet)); sprintf(buf, "%sLevel: %d, Hit Points: %d, Movement Points: %d\n", buf, GET_LEVEL(pet), GET_HIT(pet), diff --git a/src/spell_mem.cpp b/src/spell_mem.cpp index 1fd14c0b..7771616a 100644 --- a/src/spell_mem.cpp +++ b/src/spell_mem.cpp @@ -374,9 +374,9 @@ ACMD(do_meditate) { char_printf(ch, "You begin to meditate.\n"); } if (IS_NPC(ch)) - SET_FLAG(MOB_FLAGS(ch), MOB_MEDITATE); + MOB_FLAGS(ch).set(MOB_MEDITATE); else { - SET_FLAG(PLR_FLAGS(ch), PLR_MEDITATE); + PLR_FLAGS(ch).set(PLR_MEDITATE); improve_skill(ch, SKILL_MEDITATE); } } @@ -991,7 +991,7 @@ int start_scribing_spell(CharData *ch, ObjData *spellbook, Scribing *scr) { void clear_scribing(CharData *ch) { Scribing *scribe; - REMOVE_FLAG(GET_EVENT_FLAGS(ch), EVENT_SCRIBE); + GET_EVENT_FLAGS(ch).reset(EVENT_SCRIBE); scribe = ch->scribe_list; while (scribe) { @@ -1063,7 +1063,7 @@ int rem_spell_scribe(CharData *ch, int spell) { void start_scribing(CharData *ch) { if (!EVENT_FLAGGED(ch, EVENT_SCRIBE)) { - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_SCRIBE); + GET_EVENT_FLAGS(ch).set(EVENT_SCRIBE); event_create(EVENT_SCRIBE, scribe_event, ch, false, &(ch->events), SCRIBE_INTERVAL); } } diff --git a/src/spell_parser.cpp b/src/spell_parser.cpp index 2fd82677..9588a41c 100644 --- a/src/spell_parser.cpp +++ b/src/spell_parser.cpp @@ -1306,7 +1306,9 @@ ACMD(do_cast) { } /* Can the caster actually cast this spell? */ - if ((GET_LEVEL(ch) < SINFO.min_level[(int)GET_CLASS(ch)] && GET_LEVEL(ch) < SINFO.min_race_level[(int)GET_RACE(ch)]) || !GET_SKILL(ch, spellnum)) { + if ((GET_LEVEL(ch) < SINFO.min_level[(int)GET_CLASS(ch)] && + GET_LEVEL(ch) < SINFO.min_race_level[(int)GET_RACE(ch)]) || + !GET_SKILL(ch, spellnum)) { if (subcmd == SCMD_CHANT) char_printf(ch, "You do not know that chant!\n"); else if (subcmd == SCMD_PERFORM) @@ -1326,7 +1328,7 @@ ACMD(do_cast) { } else if (!SINFO.violent && GET_COOLDOWN(ch, CD_DEFENSE_CHANT)) { seconds = GET_COOLDOWN(ch, CD_DEFENSE_CHANT) / 10; } - + if (seconds) { char_printf(ch, "You're still out of breath from chanting recently!\n" @@ -1445,9 +1447,13 @@ ACMD(do_cast) { if (IS_SET(cresult, CAST_RESULT_CHARGE)) { /* Monks get a second chant for debuffing/offensive chants */ if (SINFO.violent && GET_CLASS(ch) == CLASS_MONK) { - SET_COOLDOWN(ch, CD_OFFENSE_CHANT, (7 - (((stat_bonus[GET_WIS(ch)].magic) * 3) / 4) + (((stat_bonus[GET_INT(ch)].magic) * 1) / 4)) MUD_HR); + SET_COOLDOWN(ch, CD_OFFENSE_CHANT, + (7 - (((stat_bonus[GET_WIS(ch)].magic) * 3) / 4) + + (((stat_bonus[GET_INT(ch)].magic) * 1) / 4)) MUD_HR); } else { - SET_COOLDOWN(ch, CD_DEFENSE_CHANT, (7 - (((stat_bonus[GET_WIS(ch)].magic) * 3) / 4) + (((stat_bonus[GET_INT(ch)].magic) * 1) / 4)) MUD_HR); + SET_COOLDOWN(ch, CD_DEFENSE_CHANT, + (7 - (((stat_bonus[GET_WIS(ch)].magic) * 3) / 4) + + (((stat_bonus[GET_INT(ch)].magic) * 1) / 4)) MUD_HR); } WAIT_STATE(ch, PULSE_VIOLENCE * 1.5); } @@ -1474,7 +1480,7 @@ ACMD(do_cast) { } } } else { - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_CASTING); + GET_EVENT_FLAGS(ch).set(EVENT_CASTING); /* Chance to quick chant. */ if (random_number(1, 110) < @@ -1810,12 +1816,11 @@ bool mob_cast(CharData *ch, CharData *tch, ObjData *tobj, int spellnum) { SPELL_CIRCLE(ch, spellnum), circle, CLRLV(ch, ANRM, C_SPR)); } - /* Reveal hidden/invis/concealed attackers. */ if (SINFO.violent) aggro_lose_spells(ch); - SET_FLAG(GET_EVENT_FLAGS(ch), EVENT_CASTING); + GET_EVENT_FLAGS(ch).set(EVENT_CASTING); ch->casting.spell = spellnum; ch->casting.circle = circle; ch->casting.tch = targ_ch; diff --git a/src/spells.cpp b/src/spells.cpp index aea5e2ac..240c1f26 100644 --- a/src/spells.cpp +++ b/src/spells.cpp @@ -180,8 +180,9 @@ ASPELL(spell_banish) { attack(victim, ch); } - /* min val -99, max val 207; at max skill and max roll and max charisma against a max level victim gives a value of 108 */ - roll = random_number(0, 100) + skill + stat_bonus[GET_CHA(ch)].magic - GET_LEVEL(victim); + /* min val -99, max val 207; at max skill and max roll and max charisma against a max level victim gives a value of + * 108 */ + roll = random_number(0, 100) + skill + stat_bonus[GET_CHA(ch)].magic - GET_LEVEL(victim); /* Failure */ if (roll < 50) { @@ -199,7 +200,7 @@ ASPELL(spell_banish) { /* Success */ if (roll > 100) { if (IS_NPC(victim)) { - roll = random_number (0, 100) + (stat_bonus[GET_WIS(ch)].magic * 2); /* min: 0, max: 114 */ + roll = random_number(0, 100) + (stat_bonus[GET_WIS(ch)].magic * 2); /* min: 0, max: 114 */ if (roll > 66) /* 66% chance to wipe victim eq, nears 50% at max wis */ extract_objects(victim); extract_char(victim); @@ -274,13 +275,13 @@ ASPELL(spell_charm) { eff.modifier = 0; eff.location = 0; - SET_FLAG(eff.flags, EFF_CHARM); + eff.flags.set(EFF_CHARM); effect_to_char(victim, &eff); act("Isn't $n just such a nice fellow?", false, ch, 0, victim, TO_VICT); if (IS_NPC(victim)) { - REMOVE_FLAG(MOB_FLAGS(victim), MOB_AGGRESSIVE); - REMOVE_FLAG(MOB_FLAGS(victim), MOB_SPEC); + MOB_FLAGS(victim).reset(MOB_AGGRESSIVE); + MOB_FLAGS(victim).reset(MOB_SPEC); } /* success! skip the mob attacking */ @@ -459,8 +460,8 @@ ASPELL(spell_create_water) { return 0; if (GET_OBJ_TYPE(obj) == ITEM_DRINKCON) { - amount = - std::min(GET_OBJ_VAL(obj, VAL_DRINKCON_CAPACITY) - GET_OBJ_VAL(obj, VAL_DRINKCON_REMAINING), 1 + 15 * skill / 2); + amount = std::min(GET_OBJ_VAL(obj, VAL_DRINKCON_CAPACITY) - GET_OBJ_VAL(obj, VAL_DRINKCON_REMAINING), + 1 + 15 * skill / 2); if (amount <= 0) { act("$o seems to be full already.", false, ch, obj, 0, TO_CHAR); } else { @@ -554,7 +555,7 @@ ASPELL(spell_darkness) { if (ROOM_EFF_FLAGGED(ch->in_room, ROOM_EFF_ILLUMINATION)) { act("You dispel the magical light.", true, ch, 0, 0, TO_CHAR); act("$n dispels the magical light.", true, ch, 0, 0, TO_ROOM); - REMOVE_FLAG(ROOM_EFFECTS(ch->in_room), ROOM_EFF_ILLUMINATION); + ROOM_EFFECTS(ch->in_room).reset(ROOM_EFF_ILLUMINATION); eff = 0; world[ch->in_room].light--; } else if (ROOM_EFF_FLAGGED(ch->in_room, ROOM_EFF_DARKNESS)) { @@ -578,7 +579,7 @@ ASPELL(spell_darkness) { /* set the affection */ if (eff != 0) - SET_FLAG(ROOM_EFFECTS(reff->room), eff); + ROOM_EFFECTS(reff->room).set(eff); } } return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; @@ -667,8 +668,8 @@ ASPELL(spell_enchant_weapon) { if (obj->applies[i].location != APPLY_NONE) return CAST_RESULT_CHARGE; - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_MAGIC); - SET_FLAG(GET_OBJ_EFF_FLAGS(obj), EFF_BLESS); + GET_OBJ_FLAGS(obj).set(ITEM_MAGIC); + GET_OBJ_EFF_FLAGS(obj).set(EFF_BLESS); obj->applies[0].location = APPLY_HITROLL; obj->applies[0].modifier = 1 + (skill >= 18); @@ -677,10 +678,10 @@ ASPELL(spell_enchant_weapon) { obj->applies[1].modifier = 1 + (skill >= 20); if (IS_GOOD(ch)) { - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_ANTI_EVIL); + GET_OBJ_FLAGS(obj).set(ITEM_ANTI_EVIL); act("$p glows blue.", false, ch, obj, 0, TO_CHAR); } else if (IS_EVIL(ch)) { - SET_FLAG(GET_OBJ_FLAGS(obj), ITEM_ANTI_GOOD); + GET_OBJ_FLAGS(obj).set(ITEM_ANTI_GOOD); act("$p glows red.", false, ch, obj, 0, TO_CHAR); } else { act("$p glows yellow.", false, ch, obj, 0, TO_CHAR); @@ -1111,7 +1112,7 @@ ASPELL(spell_illumination) { if (ROOM_EFF_FLAGGED(ch->in_room, ROOM_EFF_DARKNESS)) { act("Your magical light dispels the darkness.&0", false, ch, 0, 0, TO_CHAR); act("$n's magical light dispels the darkness.&0", false, ch, 0, 0, TO_ROOM); - REMOVE_FLAG(ROOM_EFFECTS(ch->in_room), ROOM_EFF_DARKNESS); + ROOM_EFFECTS(ch->in_room).reset(ROOM_EFF_DARKNESS); eff = 0; world[ch->in_room].light++; @@ -1144,7 +1145,7 @@ ASPELL(spell_illumination) { /* set the affection */ if (eff != 0) - SET_FLAG(ROOM_EFFECTS(reff->room), eff); + ROOM_EFFECTS(reff->room).set(eff); } } return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; @@ -1197,7 +1198,7 @@ ASPELL(spell_isolation) { room_effect_list = reff; - SET_FLAG(ROOM_EFFECTS(reff->room), ROOM_EFF_ISOLATION); + ROOM_EFFECTS(reff->room).set(ROOM_EFF_ISOLATION); } return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; } @@ -1434,7 +1435,8 @@ ASPELL(spell_major_paralysis) { return 0; if (!attack_ok(ch, victim, true)) return CAST_RESULT_CHARGE; - if (mag_savingthrow(victim, SAVING_PARA) || skill - GET_LEVEL(victim) > random_number(0, 70) || MOB_FLAGGED(victim, MOB_NOCHARM)) { + if (mag_savingthrow(victim, SAVING_PARA) || skill - GET_LEVEL(victim) > random_number(0, 70) || + MOB_FLAGGED(victim, MOB_NOCHARM)) { if (MOB_FLAGGED(victim, MOB_NOCHARM)) act("&7&b$N cannot be paralyzed!&0", false, ch, 0, victim, TO_CHAR); @@ -1456,7 +1458,7 @@ ASPELL(spell_major_paralysis) { memset(&eff, 0, sizeof(eff)); eff.type = SPELL_MAJOR_PARALYSIS; eff.duration = skill / 20; - SET_FLAG(eff.flags, EFF_MAJOR_PARALYSIS); + eff.flags.set(EFF_MAJOR_PARALYSIS); effect_to_char(victim, &eff); if (victim == ch) return CAST_RESULT_CHARGE; @@ -1754,14 +1756,14 @@ ASPELL(spell_rain) { /* Douse circle of fire in room */ if (ROOM_EFF_FLAGGED(ch->in_room, ROOM_EFF_CIRCLE_FIRE)) - REMOVE_FLAG(ROOM_EFFECTS(ch->in_room), ROOM_EFF_CIRCLE_FIRE); + ROOM_EFFECTS(ch->in_room).reset(ROOM_EFF_CIRCLE_FIRE); /* Douse all people in room */ for (vict = world[ch->in_room].people; vict; vict = next_vict) { next_vict = vict->next_in_room; if (GET_LEVEL(vict) >= LVL_IMMORT && !IS_NPC(vict)) continue; - REMOVE_FLAG(EFF_FLAGS(vict), EFF_ON_FIRE); + EFF_FLAGS(vict).reset(EFF_ON_FIRE); } return CAST_RESULT_CHARGE | CAST_RESULT_IMPROVE; } @@ -1834,7 +1836,7 @@ ASPELL(spell_remove_curse) { if (victim->carrying) for (object = victim->carrying; object; object = object->next_content) { if (!found && OBJ_FLAGGED(object, ITEM_NODROP)) { - REMOVE_FLAG(GET_OBJ_FLAGS(object), ITEM_NODROP); + GET_OBJ_FLAGS(object).reset(ITEM_NODROP); if (GET_OBJ_TYPE(object) == ITEM_WEAPON) GET_OBJ_VAL(object, VAL_WEAPON_DICE_SIZE)++; act("$p glows blue momentarily.", false, ch, object, victim, TO_ROOM); @@ -1854,7 +1856,7 @@ ASPELL(spell_remove_curse) { if (obj) { if (OBJ_FLAGGED(obj, ITEM_NODROP)) { - REMOVE_FLAG(GET_OBJ_FLAGS(obj), ITEM_NODROP); + GET_OBJ_FLAGS(obj).reset(ITEM_NODROP); if (GET_OBJ_TYPE(obj) == ITEM_WEAPON) { GET_OBJ_VAL(obj, VAL_WEAPON_DICE_SIZE)++; } @@ -1905,7 +1907,7 @@ int reveal_contents(ObjData *container, CharData *ch) { for (k = container; k; k = k->next_content) { if (OBJ_FLAGGED(k, ITEM_INVISIBLE) || GET_OBJ_HIDDENNESS(k) > 0) { - REMOVE_FLAG(GET_OBJ_FLAGS(k), ITEM_INVISIBLE); + GET_OBJ_FLAGS(k).reset(ITEM_INVISIBLE); GET_OBJ_HIDDENNESS(k) = 0; act("You reveal $p!", false, ch, k, 0, TO_CHAR); act("$n reveals $p!", true, ch, k, 0, TO_ROOM); @@ -1931,7 +1933,7 @@ static int search_for_doors(CharData *ch) { for (door = 0; door < NUM_OF_DIRS; ++door) if (CH_EXIT(ch, door) && CH_EXIT(ch, door)->to_room != NOWHERE && - IS_SET(CH_EXIT(ch, door)->exit_info, EX_HIDDEN)) { + CH_EXIT(ch, door)->exit_info.test(EX_HIDDEN)) { sprintf(buf, "You have found%s hidden %s %s.&0", CH_EXIT(ch, door)->keyword && isplural(CH_EXIT(ch, door)->keyword) ? "" : " a", CH_EXIT(ch, door)->keyword ? "$F" : "door", dirpreposition[door]); @@ -1960,7 +1962,7 @@ ASPELL(spell_reveal_hidden) { if (ROOM_EFF_FLAGGED(ch->in_room, ROOM_EFF_FOG)) { act("&3&bYou dispel the fog!&0", false, ch, 0, victim, TO_CHAR); act("&3&b$n dispels the fog!&0", false, ch, 0, victim, TO_NOTVICT); - REMOVE_FLAG(ROOM_EFFECTS(ch->in_room), ROOM_EFF_FOG); + ROOM_EFFECTS(ch->in_room).reset(ROOM_EFF_FOG); } } @@ -1973,7 +1975,7 @@ ASPELL(spell_reveal_hidden) { for (vict = world[ch->in_room].people; vict; vict = vict->next_in_room) if (EFF_FLAGGED(vict, EFF_INVISIBLE) || IS_HIDDEN(vict)) { if (IS_NPC(vict) && !IS_IN_GROUP(ch, vict)) { - REMOVE_FLAG(EFF_FLAGS(vict), EFF_INVISIBLE); + EFF_FLAGS(vict).reset(EFF_INVISIBLE); GET_HIDDENNESS(vict) = 0; act("You reavel $N lurking here!", false, ch, 0, vict, TO_CHAR); act("$n reveals $N lurking here!", true, ch, 0, vict, TO_NOTVICT); @@ -2142,7 +2144,7 @@ ASPELL(spell_wandering_woods) { world[next_room].exits[dir2]->to_room = next_room; } changed = true; - SET_FLAG(ROOM_FLAGS(next_room), ROOM_ALT_EXIT); + ROOM_FLAGS(next_room).set(ROOM_ALT_EXIT); room_printf(next_room, "&2The forest seems to come alive... Trees and shrubs move about, finally resting in different " "locations.&0\n"); @@ -2263,9 +2265,9 @@ void create_magical_wall(int room, int power, int dir, int spell, char *material wall->short_description = strdup(buf); GET_OBJ_TYPE(wall) = ITEM_WALL; - SET_FLAG(GET_OBJ_FLAGS(wall), ITEM_FLOAT); - SET_FLAG(GET_OBJ_FLAGS(wall), ITEM_DECOMP); - SET_FLAG(GET_OBJ_FLAGS(wall), ITEM_MAGIC); + GET_OBJ_FLAGS(wall).set(ITEM_FLOAT); + GET_OBJ_FLAGS(wall).set(ITEM_DECOMP); + GET_OBJ_FLAGS(wall).set(ITEM_MAGIC); GET_OBJ_VAL(wall, VAL_WALL_DIRECTION) = dir; GET_OBJ_VAL(wall, VAL_WALL_DISPELABLE) = 250 + (power * 1750) / 100; /* 250-2000 hit points */ GET_OBJ_VAL(wall, VAL_WALL_HITPOINTS) = GET_OBJ_VAL(wall, VAL_WALL_DISPELABLE); @@ -2487,7 +2489,7 @@ ASPELL(spell_dispel_magic) { default: if (OBJ_FLAGGED(obj, ITEM_INVISIBLE)) { if (random_number(1, 50) + skill > GET_OBJ_LEVEL(obj)) { - REMOVE_FLAG(GET_OBJ_FLAGS(obj), ITEM_INVISIBLE); + GET_OBJ_FLAGS(obj).reset(ITEM_INVISIBLE); act("$p&0 fades into existence.", false, ch, obj, 0, TO_CHAR); act("$p&0 fades into existence.", false, ch, obj, 0, TO_ROOM); } else @@ -3121,7 +3123,7 @@ int inflict_fear(CharData *ch, CharData *victim, int power, bool multi) { memset(&effect, 0, sizeof(effect)); effect.type = SPELL_FEAR; effect.duration = 2 + (power / 30); /* max 5 */ - SET_FLAG(effect.flags, EFF_MINOR_PARALYSIS); + effect.flags.set(EFF_MINOR_PARALYSIS); effect.modifier = 0; effect.location = APPLY_NONE; act("You frighten $N so bad that $E is frozen in terror!", false, ch, 0, victim, TO_CHAR); diff --git a/src/string_utils.cpp b/src/string_utils.cpp index 9b0f6f44..72704e50 100644 --- a/src/string_utils.cpp +++ b/src/string_utils.cpp @@ -110,47 +110,6 @@ void sprinttype(int type, const char *names[], char *result) { } } -void sprintflag(char *result, flagvector flags[], int num_flags, const char *names[]) { - int i, nr = 0; - char *orig_pos = result; - - for (i = 0; i < num_flags; ++i) { - if (IS_FLAGGED(flags, i)) { - if (*names[nr] != '\n') - strcpy(result, names[nr]); - else - strcpy(result, "UNDEFINED"); - result += strlen(result); - *(result++) = ' '; - } - if (*names[nr] != '\n') - ++nr; - } - - if (orig_pos == result) - strcpy(result, "NO FLAGS"); - else - *(result - 1) = '\0'; /* Nul terminate */ -} - -int sprintascii(char *out, flagvector bits) { - int i, j = 0; - /* 32 bits, don't just add letters to try to get more unless flagvector is - * also as large. */ - const char *flags = "abcdefghijklmnopqrstuvwxyzABCDEF"; - - for (i = 0; flags[i]; ++i) - if (bits & (1 << i)) - out[j++] = flags[i]; - - if (j == 0) /* Didn't write anything. */ - out[j++] = '0'; - - /* Nul terminate the output string. */ - out[j++] = '\0'; - return j; -} - bool is_equals(const std::string_view &lhs, const std::string_view &rhs) { auto to_lower{std::ranges::views::transform(::tolower)}; return std::ranges::equal(lhs | to_lower, rhs | to_lower); diff --git a/src/text.cpp b/src/text.cpp index 0a4108cf..2ca5713d 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -664,7 +664,7 @@ static void sb_compute_lines(ScreenBuf *sb) { * capacity afterwards. */ static void sb_increase_buffer(ScreenBuf *sb, size_t how_much) { - if (!IS_FLAGGED(sb->flags, SB_EXTERNAL)) { + if (!sb->flags.test(SB_EXTERNAL)) { if (sb->buf) { char *buf = sb->buf; RECREATE(sb->buf, char, sb->capacity + how_much); @@ -790,7 +790,7 @@ static void sb_compile_lines(ScreenBuf *sb, size_t start_line) { if (cap_next) { cap_next = false; - if (IS_FLAGGED(sb->flags, SB_USE_CAPS)) + if (sb->flags.test(SB_USE_CAPS)) *start = UPPER(*start); } /* Don't print a leading space if the last word printed was @@ -874,12 +874,12 @@ void sb_use_buf(ScreenBuf *sb, char *buf, size_t buf_capacity) { *buf = '\0'; if (sb->buf) { strncat(buf, sb->buf, buf_capacity); /* strncpy is stupid */ - if (IS_FLAGGED(sb->flags, SB_EXTERNAL)) + if (sb->flags.test(SB_EXTERNAL)) free(sb->buf); } sb->buf = buf; sb->capacity = buf_capacity; - SET_FLAG(sb->flags, SB_EXTERNAL); + sb->flags.set(SB_EXTERNAL); sb_compute_lines(sb); } @@ -921,11 +921,11 @@ void sb_set_other_indentation(ScreenBuf *sb, size_t indentation) { } void sb_use_capitalization(ScreenBuf *sb, bool use_caps) { - bool same = (IS_FLAGGED(sb->flags, SB_USE_CAPS) == use_caps); + bool same = (sb->flags.test(SB_USE_CAPS) == use_caps); if (use_caps) - SET_FLAG(sb->flags, SB_USE_CAPS); + sb->flags.set(SB_USE_CAPS); else - REMOVE_FLAG(sb->flags, SB_USE_CAPS); + sb->flags.reset(SB_USE_CAPS); if (!same && use_caps) sb_compile_lines(sb, 0); } @@ -963,7 +963,7 @@ void sb_append(ScreenBuf *sb, const char *msg, ...) { } void free_screen_buf(ScreenBuf *sb) { - if (!IS_FLAGGED(sb->flags, SB_EXTERNAL)) + if (!sb->flags.test(SB_EXTERNAL)) free(sb->buf); free(sb->lines); free(sb); diff --git a/src/textfiles.cpp b/src/textfiles.cpp index 3e726847..e1faf9f3 100644 --- a/src/textfiles.cpp +++ b/src/textfiles.cpp @@ -76,22 +76,22 @@ ACMD(do_textview) { ACMD(do_reload) { const int COLS = 7; - flagvector files[FLAGVECTOR_SIZE(NUM_TEXT_FILES)]; + std::bitset files; unsigned long i; bool found, reload_help = false; - for (i = 0; i < FLAGVECTOR_SIZE(NUM_TEXT_FILES); ++i) + for (i = 0; i < NUM_TEXT_FILES; ++i) files[i] = 0; any_one_arg(argument, arg); if (!strcasecmp(arg, "all")) - SET_FLAGS(files, ALL_FLAGS, NUM_TEXT_FILES); + files.set(); else for (argument = any_one_arg(argument, arg); *arg; argument = any_one_arg(argument, arg)) { found = false; for (i = 0; i < NUM_TEXT_FILES; ++i) if (!strcasecmp(text_files[i].name, arg)) { - SET_FLAG(files, i); + files.set(i); found = true; break; } @@ -106,7 +106,7 @@ ACMD(do_reload) { } } - if (!reload_help && !HAS_FLAGS(files, NUM_TEXT_FILES)) { + if (!reload_help && !files.any()) { char_printf(ch, "No known text files given. Text files available:\n"); for (i = 0; i < NUM_TEXT_FILES; ++i) char_printf(ch, "{:<11s}{}", text_files[i].name, !((i + COLS) % 7) ? "\n" : ""); @@ -118,7 +118,7 @@ ACMD(do_reload) { } for (i = 0; i < NUM_TEXT_FILES; ++i) - if (IS_FLAGGED(files, i)) { + if (files.test(i)) { file_to_string_alloc(text_files[i].path, &text_files[i].text); text_files[i].last_update = file_last_update(text_files[i].path); char_printf(ch, "Reloaded {} text from file.\n", text_files[i].name); diff --git a/src/utils.cpp b/src/utils.cpp index 6f099853..db9a0119 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -34,11 +34,10 @@ #include "sysdep.hpp" #include "weather.hpp" +#include #include #include /* For stat() */ -flagvector *ALL_FLAGS; - int monk_weight_penalty(CharData *ch) { if (!IS_NPC(ch) && GET_CLASS(ch) == CLASS_MONK && GET_LEVEL(ch) >= 20) { int limit = CAN_CARRY_W(ch) * (0.8 + (GET_STR(ch) / 1000.0)); @@ -144,63 +143,6 @@ int touch(const char *path) { } } -void init_flagvectors() { - const int num_flags[] = { - NUM_EFF_FLAGS, NUM_MOB_FLAGS, NUM_PLR_FLAGS, NUM_PRF_FLAGS, NUM_PRV_FLAGS, NUM_ITEM_FLAGS, - NUM_ITEM_WEAR_FLAGS, NUM_ROOM_FLAGS, NUM_ROOM_EFF_FLAGS, NUM_ITEM_FLAGS, MAX_EVENT, - }; - int i, max = 0; - - for (i = 0; i < sizeof(num_flags) / sizeof(int); ++i) - max = std::max(max, num_flags[i]); - - if (ALL_FLAGS) - free(ALL_FLAGS); - CREATE(ALL_FLAGS, flagvector, FLAGVECTOR_SIZE(max)); - for (i = 0; i < FLAGVECTOR_SIZE(max); ++i) - ALL_FLAGS[i] = ~0; -} - -bool ALL_FLAGGED(const flagvector field[], const flagvector flags[], const int num_flags) { - int i; - for (i = 0; i < FLAGVECTOR_SIZE(num_flags); ++i) - if (flags[i] && !IS_SET(field[i], flags[i])) - return false; - return true; -} - -bool ANY_FLAGGED(const flagvector field[], const flagvector flags[], const int num_flags) { - int i; - for (i = 0; i < FLAGVECTOR_SIZE(num_flags); ++i) - if (IS_SET(field[i], flags[i])) - return true; - return false; -} - -void SET_FLAGS(flagvector field[], const flagvector flags[], const int num_flags) { - int i; - for (i = 0; i < FLAGVECTOR_SIZE(num_flags); ++i) - SET_BIT(field[i], flags[i]); -} - -void REMOVE_FLAGS(flagvector field[], const flagvector flags[], const int num_flags) { - int i; - for (i = 0; i < FLAGVECTOR_SIZE(num_flags); ++i) - REMOVE_BIT(field[i], flags[i]); -} - -void TOGGLE_FLAGS(flagvector field[], const flagvector flags[], const int num_flags) { - int i; - for (i = 0; i < FLAGVECTOR_SIZE(num_flags); ++i) - TOGGLE_BIT(field[i], flags[i]); -} - -void COPY_FLAGS(flagvector field[], const flagvector flags[], const int num_flags) { - int i; - for (i = 0; i < FLAGVECTOR_SIZE(num_flags); ++i) - field[i] = flags[i]; -} - /* Calculate the REAL time passed over the last t2-t1 centuries (secs) */ TimeInfoData real_time_passed(time_t t2, time_t t1) { long secs; @@ -277,7 +219,7 @@ EVENTFUNC(autodouse_event) { if (EFF_FLAGGED(ch, EFF_ON_FIRE)) { act("$n's flames go out with a hiss as $e enters the water.", false, ch, 0, 0, TO_ROOM); act("Your flames quickly go out as you enter the water.", false, ch, 0, 0, TO_CHAR); - REMOVE_FLAG(EFF_FLAGS(ch), EFF_ON_FIRE); + EFF_FLAGS(ch).reset(EFF_ON_FIRE); } return EVENT_FINISHED; diff --git a/src/vsearch.cpp b/src/vsearch.cpp index 8b3b1943..23508198 100644 --- a/src/vsearch.cpp +++ b/src/vsearch.cpp @@ -332,8 +332,9 @@ bool parse_vlist_args(CharData *ch, char *argument, int *first, int *last) { * After the query, a vnum bound may be specified, which will be parsed * by parse_vlist_args. */ +template bool parse_vsearch_args(CharData *ch, char *argument, int subcmd, int *mode, const VSearchType *modes, int *value, - int *bound, char **string, int *compare, flagvector *flags, int *first, int *last) { + int *bound, char **string, int *compare, std::bitset *flags, int *first, int *last) { int type, temp; if (!mode || !modes || !value || !bound || !string || !compare || !flags || !first || !last) { @@ -349,10 +350,6 @@ bool parse_vsearch_args(CharData *ch, char *argument, int subcmd, int *mode, con *bound = 0; *string = nullptr; *compare = EQ; - *flags = 0; - *(flags + 1) = 0; - *(flags + 2) = 0; - *(flags + 3) = 0; *first = 0; *last = MAX_VNUM; @@ -467,7 +464,7 @@ bool parse_vsearch_args(CharData *ch, char *argument, int subcmd, int *mode, con if (modes[type].data == TYPE) break; else if (modes[type].data == APPLY) { - *flags = *value; + flags->set(*value); *value = 0; *compare = ANY; any_one_arg(argument, arg); @@ -656,7 +653,7 @@ bool parse_vsearch_args(CharData *ch, char *argument, int subcmd, int *mode, con } for (temp = 0; *arg; delimited_arg(argument, arg, '\'')) { if ((*value = search_block(arg, modes[type].lookup, false)) >= 0) - SET_FLAG(flags, *value); + flags->set(*value); else if (is_abbrev(arg, "from")) { if (!temp) { char_printf(ch, "No flags provided before vnum bound.\n"); @@ -699,11 +696,11 @@ bool parse_vsearch_args(CharData *ch, char *argument, int subcmd, int *mode, con } for (temp = 0; *arg; any_one_arg(argument, arg)) { if (*value == MOB_TRIGGER && (*bound = search_block(arg, trig_types, false)) >= 0) - *flags |= (1 << *bound); + flags->set(*bound); else if (*value == OBJ_TRIGGER && (*bound = search_block(arg, otrig_types, false)) >= 0) - *flags |= (1 << *bound); + flags->set(*bound); else if (*value == WLD_TRIGGER && (*bound = search_block(arg, wtrig_types, false)) >= 0) - *flags |= (1 << *bound); + flags->set(*bound); else if (is_abbrev(arg, "from")) { if (!temp) { char_printf(ch, "No types provided before vnum bound.\n"); @@ -917,7 +914,7 @@ const struct VSearchType vsearch_mobile_modes[] = { ACMD(do_msearch) { int mode, value, found = 0, compare, bound, nr, first, last, temp; char *string; - flagvector flags[4]; + PlayerOrMobFlags flags; bool match; CharData *mob; @@ -932,7 +929,7 @@ ACMD(do_msearch) { return; } if (!parse_vsearch_args(ch, argument, subcmd, &mode, vsearch_mobile_modes, &value, &bound, &string, &compare, - &flags[0], &first, &last)) + &flags, &first, &last)) return; /* Special handling for 18: attack type */ if (mode == 18) { @@ -1054,10 +1051,10 @@ ACMD(do_msearch) { match = check_trigger_vnums(mob->proto_script, value, bound, compare); break; case 29: - match = ALL_FLAGGED(MOB_FLAGS(mob), flags, NUM_MOB_FLAGS); + match = ALL_FLAGGED(MOB_FLAGS(mob), flags); break; case 30: - match = ALL_FLAGGED(EFF_FLAGS(mob), flags, NUM_EFF_FLAGS); + // match = ALL_FLAGGED(EFF_FLAGS(mob), flags); break; case 31: /* COMPOSITION */ match = GET_COMPOSITION(mob) == value; @@ -1177,7 +1174,7 @@ ACMD(do_osearch) { int mode, value, found, compare, bound, nr, first, last, temp, temp_found, type = -1; char *string; const char *header_type; - flagvector flags[4]; + ExtraObjectFlags flags; bool match; ObjData *obj; char header1[255], header2[255]; @@ -1193,7 +1190,7 @@ ACMD(do_osearch) { return; } if (!parse_vsearch_args(ch, argument, subcmd, &mode, vsearch_object_modes, &value, &bound, &string, &compare, - &flags[0], &first, &last)) + &flags, &first, &last)) return; /* Special handling for 25: attack type */ @@ -1317,7 +1314,7 @@ ACMD(do_osearch) { match = (GET_OBJ_TYPE(obj) == value); break; case 6: - match = ALL_FLAGGED(GET_OBJ_FLAGS(obj), flags, NUM_ITEM_FLAGS); + match = ALL_FLAGGED(GET_OBJ_FLAGS(obj), flags); break; case 7: match = (CAN_WEAR(obj, flags[0]) == flags[0]); @@ -1355,7 +1352,7 @@ ACMD(do_osearch) { break; /* case 16 is available */ case 17: - match = ALL_FLAGGED(GET_OBJ_EFF_FLAGS(obj), flags, NUM_EFF_FLAGS); + // match = ALL_FLAGGED(GET_OBJ_EFF_FLAGS(obj), flags); break; case 18: match = check_trigger_vnums(obj->proto_script, value, bound, compare); @@ -1594,7 +1591,7 @@ const struct VSearchType vsearch_room_modes[] = { ACMD(do_rsearch) { int mode, value, found = 0, compare, bound, nr, first, last; char *string; - flagvector flags[4]; + RoomFlags flags; bool match; if (subcmd == SCMD_VLIST) { @@ -1608,7 +1605,7 @@ ACMD(do_rsearch) { return; } if (!parse_vsearch_args(ch, argument, subcmd, &mode, vsearch_room_modes, &value, &bound, &string, &compare, - &flags[0], &first, &last)) + &flags, &first, &last)) return; } @@ -1637,7 +1634,7 @@ ACMD(do_rsearch) { match = check_extra_descs(world[nr].ex_description, string); break; case 5: - match = ALL_FLAGGED(ROOM_FLAGS(nr), flags, NUM_ROOM_FLAGS); + match = ALL_FLAGGED(ROOM_FLAGS(nr), flags); break; case 6: match = check_trigger_vnums(world[nr].proto_script, value, bound, compare); @@ -1682,7 +1679,7 @@ const struct VSearchType vsearch_exit_modes[] = { ACMD(do_esearch) { int mode, value, found = 0, compare, bound, nr, first, last, dir; char *string; - flagvector flags[4]; + ExitInfoFlags flags; bool match; Exit *exit; @@ -1697,7 +1694,7 @@ ACMD(do_esearch) { return; } if (!parse_vsearch_args(ch, argument, subcmd, &mode, vsearch_exit_modes, &value, &bound, &string, &compare, - &flags[0], &first, &last)) + &flags, &first, &last)) return; } @@ -1723,7 +1720,7 @@ ACMD(do_esearch) { match = (exit->general_description && string_find(string, exit->general_description, compare)); break; case 3: - match = (IS_SET(exit->exit_info, flags[0]) != 0); + match = ALL_FLAGGED(exit->exit_info, flags); break; case 4: match = numeric_compare(exit->key, value, bound, compare); @@ -1747,7 +1744,7 @@ ACMD(do_esearch) { sprintf(buf, "%s%s%s (key %d): ", grn, exit->keyword, nrm, exit->key); else sprintf(buf, "%s%s%s: ", grn, exit->keyword, nrm); - sprintbit(exit->exit_info, exit_bits, buf + strlen(buf)); + sprintbit(exit->exit_info.to_ulong(), exit_bits, buf + strlen(buf)); buf[strlen(buf) - 1] = '\0'; /* remove trailing space */ paging_printf(ch, "{:4d}. {}{:<4s}{} at [{}{:5d}{}] {:<20s} [{}]\n", ++found, yel, capitalize(dirs[dir]), nrm, grn, world[nr].vnum, nrm, world[nr].name, buf); @@ -1773,7 +1770,7 @@ const struct VSearchType vsearch_shop_modes[] = { ACMD(do_ssearch) { int mode, value, found = 0, compare, bound, nr, first, last, temp; char *string; - flagvector flags[4]; + std::bitset<4> flags; bool match; if (subcmd == SCMD_VLIST) { @@ -1788,7 +1785,7 @@ ACMD(do_ssearch) { return; } if (!parse_vsearch_args(ch, argument, subcmd, &mode, vsearch_shop_modes, &value, &bound, &string, &compare, - &flags[0], &first, &last)) + &flags, &first, &last)) return; } @@ -1915,7 +1912,7 @@ char *t_listdisplay(int nr, int index) { ACMD(do_tsearch) { int mode, value, found = 0, compare, bound, nr, first, last; char *string; - flagvector flags[4]; + std::bitset<64> flags; bool match; TrigData *trig; CmdlistElement *line; @@ -1931,7 +1928,7 @@ ACMD(do_tsearch) { return; } if (!parse_vsearch_args(ch, argument, subcmd, &mode, vsearch_trigger_modes, &value, &bound, &string, &compare, - &flags[0], &first, &last)) + &flags, &first, &last)) return; /* Special handling for 6: intention */ @@ -1965,7 +1962,7 @@ ACMD(do_tsearch) { match = string_find(string, GET_TRIG_NAME(trig), compare); break; case 2: - match = (trig->attach_type == value && (IS_SET(GET_TRIG_TYPE(trig), flags[0]) == flags[0])); + match = (trig->attach_type == value && (ALL_FLAGGED(std::bitset<64>(GET_TRIG_TYPE(trig)), flags))); break; case 3: match = string_find(string, GET_TRIG_ARG(trig), compare); @@ -2023,7 +2020,7 @@ const struct VSearchType vsearch_zone_modes[] = { ACMD(do_zsearch) { int mode, value, found = 0, compare, bound, nr, first, last; char *string; - flagvector flags[4]; + std::bitset<4> flags; bool match; ZoneData *zone; @@ -2067,7 +2064,7 @@ ACMD(do_zsearch) { return; } if (!parse_vsearch_args(ch, argument, subcmd, &mode, vsearch_zone_modes, &value, &bound, &string, &compare, - &flags[0], &first, &last)) + &flags, &first, &last)) return; } @@ -2164,7 +2161,7 @@ const struct VSearchType vsearch_zone_command_modes[] = {{1, "mobile", INTEGER}, ACMD(do_csearch) { int mode, value, found = 0, compare, bound, nr, first, last, vbuflen, cnr, cmd_room = NOWHERE, cmd_mob = NOBODY; char *string; - flagvector flags[4]; + std::bitset<4> flags; bool match; ResetCommand *com; @@ -2173,7 +2170,7 @@ ACMD(do_csearch) { return; mode = 0; } else if (!parse_vsearch_args(ch, argument, subcmd, &mode, vsearch_zone_command_modes, &value, &bound, &string, - &compare, &flags[0], &first, &last)) + &compare, &flags, &first, &last)) return; get_char_cols(ch); @@ -2256,7 +2253,7 @@ ACMD(do_csearch) { break; match = true; for (value = 0; value < 4; ++value) { - if (!IS_SET(flags[0], (1 << value))) + if (!flags.test(value)) continue; switch ((1 << value)) { case DOOR_RESET_OPEN: @@ -2390,7 +2387,7 @@ ACMD(do_ksearch) { int mode, value, found = 0, compare, bound, nr, first, last, temp; char *string; const char *color; - flagvector flags[4]; + RoutineFlags flags; bool match; SkillDef *skill; @@ -2398,7 +2395,7 @@ ACMD(do_ksearch) { char_printf(ch, HUH); return; } else if (!parse_vsearch_args(ch, argument, subcmd, &mode, vsearch_skill_modes, &value, &bound, &string, &compare, - flags, &first, &last)) + &flags, &first, &last)) return; /* See if the character is using color. */ @@ -2458,13 +2455,13 @@ ACMD(do_ksearch) { match = (skill->humanoid == value); break; case 12: - match = IS_SET(skill->routines, flags[0]); + match = IS_SET(skill->routines, flags.to_ulong()); break; case 13: match = (skill->violent == value); break; case 14: - match = IS_SET(skill->targets, flags[0]); + match = IS_SET(skill->targets, flags.to_ulong()); break; case 15: match = numeric_compare(skill->addl_mem_time, value, bound, compare);