Strictify special node type enum

This commit is contained in:
2014-12-06 22:28:09 -05:00
parent e3af2cce16
commit bfdcfeab58
7 changed files with 480 additions and 430 deletions

View File

@@ -541,154 +541,179 @@ enum eSpecContext {
SPEC_SEE_MONST = 18,
};
enum eSpecNodeType {
SPEC_NULL = 0,
SPEC_SET_SDF = 1,
SPEC_INC_SDF = 2,
SPEC_DISPLAY_MSG = 3,
SPEC_SECRET_PASSAGE = 4,
SPEC_DISPLAY_SM_MSG = 5,
SPEC_FLIP_SDF = 6,
SPEC_OUT_BLOCK = 7,
SPEC_TOWN_BLOCK = 8,
SPEC_FIGHT_BLOCK = 9,
SPEC_LOOK_BLOCK = 10,
SPEC_CANT_ENTER = 11,
SPEC_CHANGE_TIME = 12,
SPEC_SCEN_TIMER_START = 13,
SPEC_PLAY_SOUND = 14,
SPEC_CHANGE_HORSE_OWNER = 15,
SPEC_CHANGE_BOAT_OWNER = 16,
SPEC_SET_TOWN_VISIBILITY = 17,
SPEC_MAJOR_EVENT_OCCURRED = 18,
SPEC_FORCED_GIVE = 19,
SPEC_BUY_ITEMS_OF_TYPE = 20,
SPEC_CALL_GLOBAL = 21,
SPEC_SET_SDF_ROW = 22,
SPEC_COPY_SDF = 23,
SPEC_SANCTIFY = 24,
SPEC_REST = 25,
SPEC_WANDERING_WILL_FIGHT = 26,
SPEC_END_SCENARIO = 27,
SPEC_ONCE_GIVE_ITEM = 50,
SPEC_ONCE_GIVE_SPEC_ITEM = 51,
SPEC_ONCE_NULL = 52,
SPEC_ONCE_SET_SDF = 53,
SPEC_ONCE_DISPLAY_MSG = 54,
SPEC_ONCE_DIALOG = 55,
SPEC_ONCE_DIALOG_TERRAIN = 56,
SPEC_ONCE_DIALOG_MONSTER = 57,
SPEC_ONCE_GIVE_ITEM_DIALOG = 58,
SPEC_ONCE_GIVE_ITEM_TERRAIN = 59,
SPEC_ONCE_GIVE_ITEM_MONSTER = 60,
SPEC_ONCE_OUT_ENCOUNTER = 61,
SPEC_ONCE_TOWN_ENCOUNTER = 62,
SPEC_ONCE_TRAP = 63,
SPEC_SELECT_PC = 80,
SPEC_DAMAGE = 81,
SPEC_AFFECT_HP = 82,
SPEC_AFFECT_SP = 83,
SPEC_AFFECT_XP = 84,
SPEC_AFFECT_SKILL_PTS = 85,
SPEC_AFFECT_DEADNESS = 86,
SPEC_AFFECT_POISON = 87,
SPEC_AFFECT_SPEED = 88,
SPEC_AFFECT_INVULN = 89,
SPEC_AFFECT_MAGIC_RES = 90,
SPEC_AFFECT_WEBS = 91,
SPEC_AFFECT_DISEASE = 92,
SPEC_AFFECT_SANCTUARY = 93,
SPEC_AFFECT_CURSE_BLESS = 94,
SPEC_AFFECT_DUMBFOUND = 95,
SPEC_AFFECT_SLEEP = 96,
SPEC_AFFECT_PARALYSIS = 97,
SPEC_AFFECT_STAT = 98,
SPEC_AFFECT_MAGE_SPELL = 99,
SPEC_AFFECT_PRIEST_SPELL = 100,
SPEC_AFFECT_GOLD = 101,
SPEC_AFFECT_FOOD = 102,
SPEC_AFFECT_ALCHEMY = 103,
SPEC_AFFECT_STEALTH = 104,
SPEC_AFFECT_FIREWALK = 105,
SPEC_AFFECT_FLIGHT = 106,
SPEC_IF_SDF = 130,
SPEC_IF_TOWN_NUM = 131,
SPEC_IF_RANDOM = 132,
SPEC_IF_HAVE_SPECIAL_ITEM = 133,
SPEC_IF_SDF_COMPARE = 134,
SPEC_IF_TOWN_TER_TYPE = 135,
SPEC_IF_OUT_TER_TYPE = 136,
SPEC_IF_HAS_GOLD = 137,
SPEC_IF_HAS_FOOD = 138,
SPEC_IF_ITEM_CLASS_ON_SPACE = 139,
SPEC_IF_HAVE_ITEM_CLASS = 140,
SPEC_IF_EQUIP_ITEM_CLASS = 141,
SPEC_IF_HAS_GOLD_AND_TAKE = 142,
SPEC_IF_HAS_FOOD_AND_TAKE = 143,
SPEC_IF_ITEM_CLASS_ON_SPACE_AND_TAKE = 144,
SPEC_IF_HAVE_ITEM_CLASS_AND_TAKE = 145,
SPEC_IF_EQUIP_ITEM_CLASS_AND_TAKE = 146,
SPEC_IF_DAY_REACHED = 147,
SPEC_IF_BARRELS = 148,
SPEC_IF_CRATES = 149,
SPEC_IF_EVENT_OCCURRED = 150,
SPEC_IF_HAS_CAVE_LORE = 151,
SPEC_IF_HAS_WOODSMAN = 152,
SPEC_IF_ENOUGH_MAGE_LORE = 153,
SPEC_IF_TEXT_RESPONSE = 154,
SPEC_IF_SDF_EQ = 155,
SPEC_MAKE_TOWN_HOSTILE = 170,
SPEC_TOWN_CHANGE_TER = 171,
SPEC_TOWN_SWAP_TER = 172,
SPEC_TOWN_TRANS_TER = 173,
SPEC_TOWN_MOVE_PARTY = 174,
SPEC_TOWN_HIT_SPACE = 175,
SPEC_TOWN_EXPLODE_SPACE = 176,
SPEC_TOWN_LOCK_SPACE = 177,
SPEC_TOWN_UNLOCK_SPACE = 178,
SPEC_TOWN_SFX_BURST = 179,
SPEC_TOWN_CREATE_WANDERING = 180,
SPEC_TOWN_PLACE_MONST = 181,
SPEC_TOWN_DESTROY_MONST = 182,
SPEC_TOWN_NUKE_MONSTS = 183,
SPEC_TOWN_GENERIC_LEVER = 184,
SPEC_TOWN_GENERIC_PORTAL = 185,
SPEC_TOWN_GENERIC_BUTTON = 186,
SPEC_TOWN_GENERIC_STAIR = 187,
SPEC_TOWN_LEVER = 188,
SPEC_TOWN_PORTAL = 189,
SPEC_TOWN_STAIR = 190,
SPEC_TOWN_RELOCATE = 191, // Relocate outdoors
SPEC_TOWN_PLACE_ITEM = 192,
SPEC_TOWN_SPLIT_PARTY = 193,
SPEC_TOWN_REUNITE_PARTY = 194,
SPEC_TOWN_TIMER_START = 195,
SPEC_RECT_PLACE_FIRE = 200,
SPEC_RECT_PLACE_FORCE = 201,
SPEC_RECT_PLACE_ICE = 202,
SPEC_RECT_PLACE_BLADE = 203,
SPEC_RECT_PLACE_SCLOUD = 204,
SPEC_RECT_PLACE_SLEEP = 205,
SPEC_RECT_PLACE_QUICKFIRE = 206,
SPEC_RECT_PLACE_FIRE_BARR = 207,
SPEC_RECT_PLACE_FORCE_BARR = 208,
SPEC_RECT_CLEANSE = 209,
SPEC_RECT_PLACE_SFX = 210,
SPEC_RECT_PLACE_OBJECT = 211, // place barrels, etc
SPEC_RECT_MOVE_ITEMS = 212,
SPEC_RECT_DESTROY_ITEMS = 213,
SPEC_RECT_CHANGE_TER = 214,
SPEC_RECT_SWAP_TER = 215,
SPEC_RECT_TRANS_TER = 216,
SPEC_RECT_LOCK = 217,
SPEC_RECT_UNLOCK = 218,
SPEC_OUT_MAKE_WANDER = 225,
SPEC_OUT_CHANGE_TER = 226,
SPEC_OUT_PLACE_ENCOUNTER = 227,
SPEC_OUT_MOVE_PARTY = 228,
SPEC_OUT_STORE = 229,
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,
OUT_BLOCK = 7,
TOWN_BLOCK = 8,
FIGHT_BLOCK = 9,
LOOK_BLOCK = 10,
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,
SANCTIFY = 24,
REST = 25,
WANDERING_WILL_FIGHT = 26,
END_SCENARIO = 27,
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_BARRELS = 148,
IF_CRATES = 149,
IF_EVENT_OCCURRED = 150,
IF_HAS_CAVE_LORE = 151,
IF_HAS_WOODSMAN = 152,
IF_ENOUGH_MAGE_LORE = 153,
IF_TEXT_RESPONSE = 154,
IF_SDF_EQ = 155,
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,
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 <= 27)
return eSpecCat::GENERAL;
if(code >= 50 && code <= 63)
return eSpecCat::ONCE;
if(code >= 80 && code <= 106)
return eSpecCat::AFFECT;
if(code >= 130 && code <= 155)
return eSpecCat::IF_THEN;
if(code >= 170 && code <= 195)
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,

View File

@@ -15,7 +15,7 @@
#include "oldstructs.h"
cSpecial::cSpecial(){
type = 0;
type = eSpecType::NONE;
sd1 = -1;
sd2 = -1;
pic = -1;
@@ -30,13 +30,15 @@ cSpecial::cSpecial(){
}
cSpecial& cSpecial::operator = (legacy::special_node_type& old){
type = old.type;
type = (eSpecType)old.type;
sd1 = old.sd1;
sd2 = old.sd2;
pic = old.pic;
if(type == 55 || type == 58 || type == 189)
// Large dialogs with 36x36 dialog graphics
if(old.type == 55 || old.type == 58 || old.type == 189)
pic -= 700;
else if(type == 57 || type == 60)
// Large dialogs with monster graphics
else if(old.type == 57 || old.type == 60)
pic -= 400;
m1 = old.m1;
m2 = old.m2;
@@ -47,3 +49,17 @@ cSpecial& cSpecial::operator = (legacy::special_node_type& old){
jumpto = old.jumpto;
return *this;
}
std::ostream& operator << (std::ostream& out, eSpecType& e) {
return out << (int) e;
}
// TODO: This should probably understand symbolic names as well?
std::istream& operator >> (std::istream& in, eSpecType& e) {
int i;
in >> i;
e = (eSpecType) i;
if(getNodeCategory(e) == eSpecCat::INVALID)
e = eSpecType::ERROR;
return in;
}

View File

@@ -17,7 +17,7 @@ namespace legacy { struct special_node_type; };
class cSpecial {
public:
short type;
eSpecType type;
short sd1;
short sd2;
short pic;
@@ -46,4 +46,7 @@ struct pending_special_type {
long long trigger_time;
};
std::ostream& operator << (std::ostream& out, eSpecType& e);
std::istream& operator >> (std::istream& in, eSpecType& e);
#endif