Files
oboe/osx/classes/simpletypes.h

792 lines
20 KiB
C

/*
* simpletypes.h
* BoE
*
* Created by Celtic Minstrel on 01/06/09.
*
*/
#ifndef BOE_DATA_SIMPLETYPES_H
#define BOE_DATA_SIMPLETYPES_H
typedef unsigned short m_num_t;
typedef unsigned short ter_num_t;
typedef signed short spec_num_t;
typedef signed short item_num_t;
typedef unsigned short str_num_t;
enum class eMainStatus {
ABSENT = 0, // absent, empty slot
ALIVE = 1,
DEAD = 2,
DUST = 3,
STONE = 4,
FLED = 5,
SURFACE = 6, // fled to surface?
WON = 7,
SPLIT = 10,
SPLIT_ABSENT = SPLIT + ABSENT,
SPLIT_ALIVE = SPLIT + ALIVE,
SPLIT_DEAD = SPLIT + DEAD,
SPLIT_DUST = SPLIT + DUST,
SPLIT_STONE = SPLIT + STONE,
SPLIT_FLED = SPLIT + FLED,
SPLIT_SURFACE = SPLIT + SURFACE,
SPLIT_WON = SPLIT + WON,
};
inline eMainStatus exceptSplit(eMainStatus stat) {
if(int(stat) >= 10)
return (eMainStatus) (-10 + (int)stat);
return stat;
}
inline bool isSplit(eMainStatus stat) {
return int(stat) >= 10;
}
inline bool isAbsent(eMainStatus stat) {
return stat == eMainStatus::ABSENT || int(stat) > 4;
}
inline bool isDead(eMainStatus stat) {
int code = (int) stat;
return code > 1 && code < 5;
}
/* adven[i].race */ //complete
enum class eRace {
UNKNOWN = -1, // for parameters to some functions; not valid in the class
HUMAN = 0,
NEPHIL = 1,
SLITH = 2,
VAHNATAI = 3, // Former value from eMonsterType
REPTILE = 4, // 1
BEAST = 5, // 2
IMPORTANT = 6, // 3
MAGE = 7, // 4
PRIEST = 8, // 5
HUMANOID = 9, // 6
DEMON = 10, // 7
UNDEAD = 11, // 8
GIANT = 12, // 9
SLIME = 13, // 10
STONE = 14, // 11
BUG = 15, // 12
DRAGON = 16, // 13
MAGICAL = 17, // 14
PLANT = 18,
BIRD = 19,
};
// Types IMPORTANT, MAGE, and PRIEST are implicitly human
// Types NEPHIL, SLITH, and VAHNATAI are implicitly humanoid
inline bool isHumanoid(eRace race) {
int code = (int) race;
return (code >= 0 && code <= 3) || (code >= 6 && code <= 9);
}
/* adven[i].status*/ //complete - assign a positive value for a help pc effect, a negative for harm pc
enum class eStatus {
MAIN = -1, // For saved games only
POISONED_WEAPON = 0,
BLESS_CURSE = 1,
POISON = 2,
HASTE_SLOW = 3,
INVULNERABLE = 4,
MAGIC_RESISTANCE = 5,
WEBS = 6,
DISEASE = 7,
INVISIBLE = 8, //sanctuary
DUMB = 9,
MARTYRS_SHIELD = 10,
ASLEEP = 11,
PARALYZED = 12,
ACID = 13,
FORCECAGE = 14, // This is new and currently unused, since forcecages aren't even really implemented yet.
// This one is new
// It's not quite a real status effect since it doesn't expire
// We use 15 because 14 was technically a "reserved/unused" status, though it was never used for anything
CHARM = 15,
};
/* Special Ability a.k.a spec_skill */
enum eMonstAbil {
MONST_NO_ABIL = 0,
// Missile abilities (extra1 = number of sided dice; extra2 = number of sides)
MONST_THROWS_DARTS = 10,
MONST_SHOOTS_ARROWS,
MONST_THROWS_SPEARS,
MONST_THROWS_ROCKS,
MONST_THROWS_RAZORDISKS,
MONST_GOOD_ARCHER,
MONST_SHOOTS_SPINES,
MONST_THROWS_KNIVES,
// Ray abilities (extra1 = type of damage / status where applicable)
MONST_DAMAGE_RAY = 20,
MONST_STATUS_RAY,
MONST_PETRIFY_RAY,
MONST_DRAIN_SP_RAY,
MONST_DRAIN_XP_RAY,
MONST_DRAIN_XP_DAMAGE_RAY,
MONST_KILL_RAY,
MONST_STEAL_FOOD_RAY,
MONST_STEAL_GOLD_RAY,
// Touch abilities (extra1 = type of damage / status where applicable)
MONST_DAMAGE_TOUCH = 30,
MONST_STATUS_TOUCH,
MONST_PETRIFY_TOUCH,
MONST_DRAIN_SP_TOUCH,
MONST_DRAIN_XP_TOUCH,
MONST_DRAIN_XP_DAMAGE_TOUCH,
MONST_KILL_TOUCH,
MONST_STEAL_FOOD_TOUCH,
MONST_STEAL_GOLD_TOUCH,
// Summon abilities (extra1 = which monster / type / species; extra2 = % chance)
MONST_SUMMON_ONE = 40,
MONST_SUMMON_TYPE,
MONST_SUMMON_SPECIES,
MONST_SUMMON_RANDOM,
MONST_MASS_SUMMON,
// Misc abilities (extra1 = field / special #; extra2 = % chance for radiate only)
MONST_SPLITS = 50,
MONST_FIELD_MISSILE,
MONST_MARTYRS_SHIELD,
MONST_ABSORB_SPELLS,
MONST_INVULNERABLE,
MONST_RADIATE,
MONST_CALL_LOCAL_SPECIAL,
MONST_CALL_GLOBAL_SPECIAL,
};
/* Terrains Special Properties : scenario.ter_types[i].special */ //complete
enum class eTerSpec {
NONE = 0,
CHANGE_WHEN_STEP_ON = 1,
DAMAGING = 2, // formerly "fire damage"
BRIDGE = 3, // new; formerly "cold damage"
BED = 4, // new; formerly "magic damage"
DANGEROUS = 5, // formerly "poison land"
UNUSED1 = 6, // formerly "disease land"
CRUMBLING = 7,
LOCKABLE = 8,
UNLOCKABLE = 9,
UNUSED2 = 10, // formerly "unlockable + bashable"
IS_A_SIGN = 11,
CALL_SPECIAL = 12, // formerly "call local special"
UNUSED3 = 13, // formerly "call scenario special"
IS_A_CONTAINER = 14,
WATERFALL = 15,
CONVEYOR = 16, // formerly "conveyor north"
UNUSED4 = 17, // formerly "conveyor east"
UNUSED5 = 18, // formerly "conveyor south"
UNUSED6 = 19, // formerly "conveyor west"
BLOCKED_TO_MONSTERS = 20,
TOWN_ENTRANCE = 21,
CHANGE_WHEN_USED = 22,
CALL_SPECIAL_WHEN_USED = 23,
// 1. Change when step on (What to change to, number of sound, Unused)
// 2. Damaging terrain; can't rest here (Amount of damage done, multiplier, damage type)
// 3. Bridge - if the party boats over it, they get the option to land. (Unused, Unused, Unused)
// 4. Bed - change party graphic when they stand on this space
// 5. Dangerous land; can't rest here; percentage chance may be 0 (Strength, Percentage chance, status type)
// 6. Reserved
// 7. Crumbling terrain (Terrain to change to, strength?, destroyed by what - quickfire, shatter/move mountains, or both)
// 8. Lockable terrain (Terrain to change to when locked, Unused, Unused)
// 9. Unlockable terrain (Terrain to change to when locked, Difficulty, can be bashed)
// 10. Reserved
// 11. Sign (Unused, Unused, Unused)
// 12. Call special (Special to call, local or scenario?, Unused)
// 13. Reserved
// 14. Container (Unused, Unused, Unused)
// 15. Waterfall (Direction, Unused, Unused)
// 16. Conveyor Belt (Direction, Unused, Unused)
// 17. Reserved
// 18. Reserved
// 19. Reserved
// 20. Blocked to Monsters (Unused, Unused, Unused)
// 21. Town entrance (Terrain type if hidden, Unused, Unused)
// 22. Change when Used (Terrain to change to when used, Number of sound, Unused)
// 23. Call special when used (Special to call, local or scenario?, Unused)
};
enum class eTrimType {
NONE = 0,
WALL = 1, // not a trim, but trims will conform to it as if it's the same ground type (eg stone wall)
S, SE, E, NE, N, NW, W, SW,
NE_INNER, SE_INNER, SW_INNER, NW_INNER,
FRILLS = 14, // like on lava and underground water; no trim_ter required
ROAD = 15, // the game will treat it like a road space and draw roads; no trim_ter required
WALKWAY = 16, // the game will draw walkway corners; trim_ter is base terrain to draw on
WATERFALL = 17, // special case for waterfalls
CITY = 18, // the game will join roads up to this space but not draw roads on the space
};
/* terrain type blockage */
enum class eTerObstruct {
CLEAR = 0,
BLOCK_SIGHT = 1,
BLOCK_MONSTERS = 2,
BLOCK_MOVE = 3,
BLOCK_MOVE_AND_SHOOT = 4,
BLOCK_MOVE_AND_SIGHT = 5,
};
inline bool blocksMove(eTerObstruct block) {
int code = (int) block;
return code > 2;
}
/* items[i].type a.k.a type of weapon */
enum class eWeapType {
NOT_MELEE = 0,
EDGED = 1,
BASHING = 2,
POLE = 3,
};
/* items[i].variety a.k.a item type (in editor) */
enum class eItemType {
NO_ITEM = 0,
ONE_HANDED = 1,
TWO_HANDED = 2,
GOLD = 3,
BOW = 4,
ARROW = 5,
THROWN_MISSILE = 6,
POTION = 7, // potion/magic item
SCROLL = 8, // scroll/magic item
WAND = 9,
TOOL = 10,
FOOD = 11,
SHIELD = 12,
ARMOR = 13,
HELM = 14,
GLOVES = 15,
SHIELD_2 = 16,
// don't know why a second type of shield is used ; it is actually checked
// in the armor code -- see below
// and you can't equip another (12) shield while wearing it ... I didn't
// find a single item with this property in the bladbase.exs ...
BOOTS = 17,
RING = 18,
NECKLACE = 19,
WEAPON_POISON = 20,
NON_USE_OBJECT = 21,
PANTS = 22,
CROSSBOW = 23,
BOLTS = 24,
MISSILE_NO_AMMO = 25, //e.g slings
UNUSED1 = 26, // these are here solely because they are options in the editor
UNUSED2 = 27,
};
inline bool isArmourType(eItemType type) {
int code = (int) type;
return code >= 12 && code <= 17;
}
inline bool isWeaponType(eItemType type) {
if(type == eItemType::CROSSBOW || type == eItemType::BOLTS)
return true;
int code = (int) type;
return code >= 1 && code <= 6 && code != 3;
}
/* items[i].ability */
enum eItemAbil {
// Weapon abilities
ITEM_NO_ABILITY = 0,
ITEM_FLAMING_WEAPON = 1,
ITEM_DEMON_SLAYER = 2,
ITEM_UNDEAD_SLAYER = 3,
ITEM_LIZARD_SLAYER = 4,
ITEM_GIANT_SLAYER = 5,
ITEM_MAGE_SLAYER = 6,
ITEM_PRIEST_SLAYER = 7,
ITEM_BUG_SLAYER = 8,
ITEM_ACIDIC_WEAPON = 9,
ITEM_SOULSUCKER = 10,
ITEM_DRAIN_MISSILES = 11,
ITEM_WEAK_WEAPON = 12,
ITEM_CAUSES_FEAR = 13,
ITEM_POISONED_WEAPON = 14,
// General abilities
ITEM_PROTECTION = 30,
ITEM_FULL_PROTECTION = 31,
ITEM_FIRE_PROTECTION = 32,
ITEM_COLD_PROTECTION = 33,
ITEM_POISON_PROTECTION = 34,
ITEM_MAGIC_PROTECTION = 35,
ITEM_ACID_PROTECTION = 36,
ITEM_SKILL = 37,
ITEM_STRENGTH = 38,
ITEM_DEXTERITY = 39,
ITEM_INTELLIGENCE = 40,
ITEM_ACCURACY = 41,
ITEM_THIEVING = 42,
ITEM_GIANT_STRENGTH = 43,
ITEM_LIGHTER_OBJECT = 44,
ITEM_HEAVIER_OBJECT = 45,
ITEM_OCCASIONAL_BLESS = 46,
ITEM_OCCASIONAL_HASTE = 47,
ITEM_LIFE_SAVING = 48,
ITEM_PROTECT_FROM_PETRIFY = 49,
ITEM_REGENERATE = 50,
ITEM_POISON_AUGMENT = 51,
ITEM_DISEASE_PARTY = 52,
ITEM_WILL = 53,
ITEM_FREE_ACTION = 54,
ITEM_SPEED = 55,
ITEM_SLOW_WEARER = 56,
ITEM_PROTECT_FROM_UNDEAD = 57,
ITEM_PROTECT_FROM_DEMONS = 58,
ITEM_PROTECT_FROM_HUMANOIDS = 59,
ITEM_PROTECT_FROM_REPTILES = 60,
ITEM_PROTECT_FROM_GIANTS = 61,
ITEM_PROTECT_FROM_DISEASE = 62,
// Nonspell Usable
ITEM_POISON_WEAPON = 70, //put poison on weapon
ITEM_BLESS_CURSE = 71,
ITEM_AFFECT_POISON = 72,
ITEM_HASTE_SLOW = 73,
ITEM_AFFECT_INVULN = 74,
ITEM_AFFECT_MAGIC_RES = 75,
ITEM_AFFECT_WEB = 76,
ITEM_AFFECT_DISEASE = 77,
ITEM_AFFECT_SANCTUARY = 78,
ITEM_AFFECT_DUMBFOUND = 79,
ITEM_AFFECT_MARTYRS_SHIELD = 80,
ITEM_AFFECT_SLEEP = 81,
ITEM_AFFECT_PARALYSIS = 82,
ITEM_AFFECT_ACID = 83,
ITEM_BLISS = 84,
ITEM_AFFECT_EXPERIENCE = 85,
ITEM_AFFECT_SKILL_POINTS = 86,
ITEM_AFFECT_HEALTH = 87,
ITEM_AFFECT_SPELL_POINTS = 88,
ITEM_DOOM = 89,
ITEM_LIGHT = 90,
ITEM_STEALTH = 91,
ITEM_FIREWALK = 92,
ITEM_FLYING = 93,
ITEM_MAJOR_HEALING = 94,
ITEM_CALL_SPECIAL = 95,
// Spell Usable
ITEM_SPELL_FLAME = 110,
ITEM_SPELL_FIREBALL = 111,
ITEM_SPELL_FIRESTORM = 112,
ITEM_SPELL_KILL = 113,
ITEM_SPELL_ICE_BOLT = 114,
ITEM_SPELL_SLOW = 115,
ITEM_SPELL_SHOCKWAVE = 116,
ITEM_SPELL_DISPEL_UNDEAD = 117,
ITEM_SPELL_DISPEL_SPIRIT = 118,
ITEM_SPELL_SUMMONING = 119,
ITEM_SPELL_MASS_SUMMONING = 120,
ITEM_SPELL_ACID_SPRAY = 121,
ITEM_SPELL_STINKING_CLOUD = 122,
ITEM_SPELL_SLEEP_FIELD = 123,
ITEM_SPELL_VENOM = 124,
ITEM_SPELL_SHOCKSTORM = 125,
ITEM_SPELL_PARALYSIS = 126,
ITEM_SPELL_WEB_SPELL = 127,
ITEM_SPELL_STRENGTHEN_TARGET = 128, //wand of carrunos effect
ITEM_SPELL_QUICKFIRE = 129,
ITEM_SPELL_MASS_CHARM = 130,
ITEM_SPELL_MAGIC_MAP = 131,
ITEM_SPELL_DISPEL_BARRIER = 132,
ITEM_SPELL_MAKE_ICE_WALL = 133,
ITEM_SPELL_CHARM_SPELL = 134,
ITEM_SPELL_ANTIMAGIC_CLOUD = 135,
// Reagents
ITEM_HOLLY = 150, // Holly/Toadstool
ITEM_COMFREY_ROOT = 151,
ITEM_GLOWING_NETTLE = 152,
ITEM_WORMGRASS = 153, // Crypt Shroom/Wormgr.
ITEM_ASPTONGUE_MOLD = 154,
ITEM_EMBER_FLOWERS = 155,
ITEM_GRAYMOLD = 156,
ITEM_MANDRAKE = 157,
ITEM_SAPPHIRE = 158,
ITEM_SMOKY_CRYSTAL = 159,
ITEM_RESSURECTION_BALM = 160,
ITEM_LOCKPICKS = 161,
// Missile Abilities
ITEM_MISSILE_RETURNING = 170,
ITEM_MISSILE_LIGHTNING = 171,
ITEM_MISSILE_EXPLODING = 172,
ITEM_MISSILE_ACID = 173,
ITEM_MISSILE_SLAY_UNDEAD = 174,
ITEM_MISSILE_SLAY_DEMON = 175,
ITEM_MISSILE_HEAL_TARGET = 176,
};
/* adven[i].skills */ //complete
enum eSkill {
SKILL_STRENGTH = 0,
SKILL_DEXTERITY = 1,
SKILL_INTELLIGENCE = 2,
SKILL_EDGED_WEAPONS = 3,
SKILL_BASHING_WEAPONS = 4,
SKILL_POLE_WEAPONS = 5,
SKILL_THROWN_MISSILES = 6,
SKILL_ARCHERY = 7,
SKILL_DEFENSE = 8,
SKILL_MAGE_SPELLS = 9,
SKILL_PRIEST_SPELLS = 10,
SKILL_MAGE_LORE = 11,
SKILL_ALCHEMY = 12,
SKILL_ITEM_LORE = 13,
SKILL_DISARM_TRAPS = 14,
SKILL_LOCKPICKING = 15,
SKILL_ASSASSINATION = 16,
SKILL_POISON = 17,
SKILL_LUCK = 18,
SKILL_MAX_HP = 19,
SKILL_MAX_SP = 20,
};
/* adven[i].traits */ //complete
enum eTrait {
TRAIT_TOUGHNESS = 0,
TRAIT_MAGICALLY_APT = 1,
TRAIT_AMBIDEXTROUS = 2,
TRAIT_NIMBLE = 3,
TRAIT_CAVE_LORE = 4,
TRAIT_WOODSMAN = 5,
TRAIT_GOOD_CONST = 6,
TRAIT_HIGHLY_ALERT = 7,
TRAIT_STRENGTH = 8,
TRAIT_RECUPERATION = 9,
TRAIT_SLUGGISH = 10,
TRAIT_MAGICALLY_INEPT = 11,
TRAIT_FRAIL = 12,
TRAIT_CHRONIC_DISEASE = 13,
TRAIT_BAD_BACK = 14,
TRAIT_PACIFIST = 15,
};
/* damage type*/
/* used as parameter to some functions */
enum eDamageType {
DAMAGE_WEAPON = 0,
DAMAGE_FIRE = 1,
DAMAGE_POISON = 2,
DAMAGE_MAGIC = 3,
DAMAGE_UNBLOCKABLE = 4, //from the source files - the display is the same as the magic one (damage_monst in SPECIALS.cpp)
DAMAGE_COLD = 5,
DAMAGE_UNDEAD = 6, //from the source files - the display is the same as the weapon one
DAMAGE_DEMON = 7, //from the source files - the display is the same as the weapon one
// 8 and 9 aren't defined : doesn't print any damage. According to the source files the 9 is DAMAGE_MARKED though. Wrong ?
DAMAGE_MARKED = 10, // usage: DAMAGE_MARKED + damage_type
DAMAGE_WEAPON_MARKED = 10,
DAMAGE_FIRE_MARKED = 11,
DAMAGE_POISON_MARKED = 12,
DAMAGE_MAGIC_MARKED = 13,
DAMAGE_UNBLOCKABLE_MARKED = 14,
DAMAGE_COLD_MARKED = 15,
DAMAGE_UNDEAD_MARKED = 16,
DAMAGE_DEMON_MARKED = 17,
DAMAGE_NO_PRINT = 30, // usage: DAMAGE_NO_PRINT + damage_type
DAMAGE_WEAPON_NO_PRINT = 30,
DAMAGE_FIRE_NO_PRINT = 31,
DAMAGE_POISON_NO_PRINT = 32,
DAMAGE_MAGIC_NO_PRINT = 33,
DAMAGE_UNBLOCKABLE_NO_PRINT = 34,
DAMAGE_COLD_NO_PRINT = 35,
DAMAGE_UNDEAD_NO_PRINT = 36,
DAMAGE_DEMON_NO_PRINT = 37,
// What about both NO_PRINT and MARKED?
};
inline void operator -= (eDamageType& cur, eDamageType othr){
if((othr == DAMAGE_MARKED && cur >= DAMAGE_MARKED && cur < DAMAGE_NO_PRINT) ||
(othr == DAMAGE_NO_PRINT && cur >= DAMAGE_NO_PRINT))
cur = (eDamageType) ((int)cur - (int)othr);
}
inline void operator += (eDamageType& cur, eDamageType othr){
if((othr == DAMAGE_MARKED || othr == DAMAGE_NO_PRINT) && cur < DAMAGE_MARKED)
cur = (eDamageType) ((int)cur + (int)othr);
}
//class sbyte {
// signed char c;
//public:
// operator int() {return c;}
// sbyte(signed char k) : c(k) {}
//}
enum class eSpecCtx {
OUT_MOVE = 0,
TOWN_MOVE = 1,
COMBAT_MOVE = 2,
OUT_LOOK = 3,
TOWN_LOOK = 4,
ENTER_TOWN = 5,
LEAVE_TOWN = 6,
TALK = 7,
USE_SPEC_ITEM = 8,
TOWN_TIMER = 9,
SCEN_TIMER = 10,
PARTY_TIMER = 11,
KILL_MONST = 12,
OUTDOOR_ENC = 13,
FLEE_ENCOUNTER = 14,
WIN_ENCOUNTER = 15,
TARGET = 16,
USE_SPACE = 17,
SEE_MONST = 18,
MONST_SPEC_ABIL = 19,
TOWN_HOSTILE = 20,
};
enum class eSpecType {
ERROR = -1, // A magic value used while processing nodes
NONE = 0,
SET_SDF = 1,
INC_SDF = 2,
DISPLAY_MSG = 3,
SECRET_PASSAGE = 4,
DISPLAY_SM_MSG = 5,
FLIP_SDF = 6,
SDF_RANDOM = 7, // formerly OUT_BLOCK
SDF_ADD = 8, // formerly TOWN_BLOCK
SDF_DIFF = 9, // formerly FIGHT_BLOCK
UNUSED1 = 10, // formerly LOOK_BLOCK
CANT_ENTER = 11,
CHANGE_TIME = 12,
SCEN_TIMER_START = 13,
PLAY_SOUND = 14,
CHANGE_HORSE_OWNER = 15,
CHANGE_BOAT_OWNER = 16,
SET_TOWN_VISIBILITY = 17,
MAJOR_EVENT_OCCURRED = 18,
FORCED_GIVE = 19,
BUY_ITEMS_OF_TYPE = 20,
CALL_GLOBAL = 21,
SET_SDF_ROW = 22,
COPY_SDF = 23,
DISPLAY_PICTURE = 24, // formerly SANCTIFY
REST = 25,
WANDERING_WILL_FIGHT = 26,
END_SCENARIO = 27,
SET_POINTER = 28,
SET_CAMP_FLAG = 29,
PRINT_NUMS = 30, // For debugging
SDF_TIMES = 31,
SDF_DIVIDE = 32, // Computes both quotient and remainder
SDF_POWER = 33,
ONCE_GIVE_ITEM = 50,
ONCE_GIVE_SPEC_ITEM = 51,
ONCE_NULL = 52,
ONCE_SET_SDF = 53,
ONCE_DISPLAY_MSG = 54,
ONCE_DIALOG = 55,
ONCE_DIALOG_TERRAIN = 56,
ONCE_DIALOG_MONSTER = 57,
ONCE_GIVE_ITEM_DIALOG = 58,
ONCE_GIVE_ITEM_TERRAIN = 59,
ONCE_GIVE_ITEM_MONSTER = 60,
ONCE_OUT_ENCOUNTER = 61,
ONCE_TOWN_ENCOUNTER = 62,
ONCE_TRAP = 63,
SELECT_PC = 80,
DAMAGE = 81,
AFFECT_HP = 82,
AFFECT_SP = 83,
AFFECT_XP = 84,
AFFECT_SKILL_PTS = 85,
AFFECT_DEADNESS = 86,
AFFECT_POISON = 87,
AFFECT_SPEED = 88,
AFFECT_INVULN = 89,
AFFECT_MAGIC_RES = 90,
AFFECT_WEBS = 91,
AFFECT_DISEASE = 92,
AFFECT_SANCTUARY = 93,
AFFECT_CURSE_BLESS = 94,
AFFECT_DUMBFOUND = 95,
AFFECT_SLEEP = 96,
AFFECT_PARALYSIS = 97,
AFFECT_STAT = 98,
AFFECT_MAGE_SPELL = 99,
AFFECT_PRIEST_SPELL = 100,
AFFECT_GOLD = 101,
AFFECT_FOOD = 102,
AFFECT_ALCHEMY = 103,
AFFECT_STEALTH = 104,
AFFECT_FIREWALK = 105,
AFFECT_FLIGHT = 106,
IF_SDF = 130,
IF_TOWN_NUM = 131,
IF_RANDOM = 132,
IF_HAVE_SPECIAL_ITEM = 133,
IF_SDF_COMPARE = 134,
IF_TOWN_TER_TYPE = 135,
IF_OUT_TER_TYPE = 136,
IF_HAS_GOLD = 137,
IF_HAS_FOOD = 138,
IF_ITEM_CLASS_ON_SPACE = 139,
IF_HAVE_ITEM_CLASS = 140,
IF_EQUIP_ITEM_CLASS = 141,
IF_HAS_GOLD_AND_TAKE = 142,
IF_HAS_FOOD_AND_TAKE = 143,
IF_ITEM_CLASS_ON_SPACE_AND_TAKE = 144,
IF_HAVE_ITEM_CLASS_AND_TAKE = 145,
IF_EQUIP_ITEM_CLASS_AND_TAKE = 146,
IF_DAY_REACHED = 147,
IF_OBJECTS = 148,
IF_PARTY_SIZE = 149,
IF_EVENT_OCCURRED = 150,
IF_SPECIES = 151,
IF_TRAIT = 152,
IF_STATISTIC = 153,
IF_TEXT_RESPONSE = 154,
IF_SDF_EQ = 155,
IF_CONTEXT = 156,
IF_NUM_RESPONSE = 157,
MAKE_TOWN_HOSTILE = 170,
TOWN_CHANGE_TER = 171,
TOWN_SWAP_TER = 172,
TOWN_TRANS_TER = 173,
TOWN_MOVE_PARTY = 174,
TOWN_HIT_SPACE = 175,
TOWN_EXPLODE_SPACE = 176,
TOWN_LOCK_SPACE = 177,
TOWN_UNLOCK_SPACE = 178,
TOWN_SFX_BURST = 179,
TOWN_CREATE_WANDERING = 180,
TOWN_PLACE_MONST = 181,
TOWN_DESTROY_MONST = 182,
TOWN_NUKE_MONSTS = 183,
TOWN_GENERIC_LEVER = 184,
TOWN_GENERIC_PORTAL = 185,
TOWN_GENERIC_BUTTON = 186,
TOWN_GENERIC_STAIR = 187,
TOWN_LEVER = 188,
TOWN_PORTAL = 189,
TOWN_STAIR = 190,
TOWN_RELOCATE = 191, // Relocate outdoors
TOWN_PLACE_ITEM = 192,
TOWN_SPLIT_PARTY = 193,
TOWN_REUNITE_PARTY = 194,
TOWN_TIMER_START = 195,
TOWN_CHANGE_LIGHTING = 196,
TOWN_SET_ATTITUDE = 197,
RECT_PLACE_FIRE = 200,
RECT_PLACE_FORCE = 201,
RECT_PLACE_ICE = 202,
RECT_PLACE_BLADE = 203,
RECT_PLACE_SCLOUD = 204,
RECT_PLACE_SLEEP = 205,
RECT_PLACE_QUICKFIRE = 206,
RECT_PLACE_FIRE_BARR = 207,
RECT_PLACE_FORCE_BARR = 208,
RECT_CLEANSE = 209,
RECT_PLACE_SFX = 210,
RECT_PLACE_OBJECT = 211, // place barrels, etc
RECT_MOVE_ITEMS = 212,
RECT_DESTROY_ITEMS = 213,
RECT_CHANGE_TER = 214,
RECT_SWAP_TER = 215,
RECT_TRANS_TER = 216,
RECT_LOCK = 217,
RECT_UNLOCK = 218,
OUT_MAKE_WANDER = 225,
OUT_CHANGE_TER = 226,
OUT_PLACE_ENCOUNTER = 227,
OUT_MOVE_PARTY = 228,
OUT_STORE = 229,
};
enum class eSpecCat {
INVALID = -1,
GENERAL, ONCE, AFFECT, IF_THEN, TOWN, RECT, OUTDOOR
};
inline eSpecCat getNodeCategory(eSpecType node) {
int code = (int) node;
if(code >= 0 && code <= 33)
return eSpecCat::GENERAL;
if(code >= 50 && code <= 63)
return eSpecCat::ONCE;
if(code >= 80 && code <= 106)
return eSpecCat::AFFECT;
if(code >= 130 && code <= 157)
return eSpecCat::IF_THEN;
if(code >= 170 && code <= 197)
return eSpecCat::TOWN;
if(code >= 200 && code <= 218)
return eSpecCat::RECT;
if(code >= 225 && code <= 229)
return eSpecCat::OUTDOOR;
return eSpecCat::INVALID;
}
enum eTalkNodeType {
TALK_REGULAR = 0,
TALK_DEP_ON_SDF = 1,
TALK_SET_SDF = 2,
TALK_INN = 3,
TALK_DEP_ON_TIME = 4,
TALK_DEP_ON_TIME_AND_EVENT = 5,
TALK_DEP_ON_TOWN = 6,
TALK_BUY_ITEMS = 7,
TALK_TRAINING = 8,
TALK_BUY_MAGE = 9,
TALK_BUY_PRIEST = 10,
TALK_BUY_ALCHEMY = 11,
TALK_BUY_HEALING = 12,
TALK_SELL_WEAPONS = 13,
TALK_SELL_ARMOR = 14,
TALK_SELL_ITEMS = 15,
TALK_IDENTIFY = 16,
TALK_ENCHANT = 17,
TALK_BUY_INFO = 18,
TALK_BUY_SDF = 19,
TALK_BUY_SHIP = 20,
TALK_BUY_HORSE = 21,
TALK_BUY_SPEC_ITEM = 22,
TALK_BUY_JUNK = 23,
TALK_BUY_TOWN_LOC = 24,
TALK_END_FORCE = 25,
TALK_END_FIGHT = 26,
TALK_END_ALARM = 27, // Town hostile
TALK_END_DIE = 28,
TALK_CALL_TOWN_SPEC = 29,
TALK_CALL_SCEN_SPEC = 30,
};
enum eEncNoteType {
NOTE_SCEN,
NOTE_OUT,
NOTE_TOWN,
NOTE_MONST,
};
enum eFieldType {
FIELD_NONE = 0,
FIELD_WEB = 1,
BARRIER_FIRE = 2,
BARRIER_FORCE = 3,
WALL_FORCE = 4,
WALL_FIRE = 5,
FIELD_ANTIMAGIC = 6,
CLOUD_STINK = 7,
WALL_ICE = 8,
WALL_BLADES = 9,
FIELD_QUICKFIRE = 10,
FIELD_DISPEL = 11,
CLOUD_SLEEP = 12,
// TODO: Sfx fields, objects
};
#endif