Fix a few scenario load/save issues

- More uninitialized data issues
- Some values incorrectly loaded (monster radiate chance, terrain horse blockage, town lighting type)
- Some values incorrectly saved (item magic-use flag)
This commit is contained in:
2015-06-04 01:14:57 -04:00
parent ae0e3cfd0d
commit 49ec6278d3
10 changed files with 47 additions and 38 deletions

View File

@@ -186,7 +186,7 @@ X coordinate of space to place
Y coordinate of space to place
Unused
Number of creature to place
Unused
1 - force placement
Unused
Special to Jump To
--------------------

View File

@@ -1444,6 +1444,7 @@ void cast_town_spell(location where) {
}
}
// TODO: Currently, the node is called before any spell-specific behaviour (eg missiles) occurs.
bool cast_spell_on_space(location where, eSpell spell) {
short s1 = 0,s2 = 0,s3 = 0;

View File

@@ -87,6 +87,7 @@ cItem::cItem(){
ability = eItemAbil::NONE;
abil_data[0] = 0;
abil_data[1] = 0;
missile = 0;
type_flag = 0;
is_special = 0;
value = 0;
@@ -1378,8 +1379,8 @@ std::ostream& operator << (std::ostream& out, eItemType e){
std::ostream& operator << (std::ostream& out, eItemUse e){
switch(e) {
case eItemUse::HELP_ONE: out << "help-one"; break;
case eItemUse::HELP_ALL: out << "harm-one"; break;
case eItemUse::HARM_ONE: out << "help-all"; break;
case eItemUse::HELP_ALL: out << "help-all"; break;
case eItemUse::HARM_ONE: out << "harm-one"; break;
case eItemUse::HARM_ALL: out << "harm-all"; break;
}
return out;

View File

@@ -43,14 +43,7 @@ public:
std::string full_name;
std::string name;
unsigned int treas_class;
bool ident : 1;
bool property : 1;
bool magic : 1;
bool contained : 1;
bool cursed : 1;
bool concealed : 1;
bool enchanted : 1;
bool unsellable : 1;
bool ident, property, magic, contained, cursed, concealed, enchanted, unsellable;
std::string desc;
unsigned char rec_treas_class() const;
short item_weight() const;

View File

@@ -380,10 +380,17 @@ std::map<eMonstAbil,uAbility>::iterator cMonster::addAbil(eMonstAbilTemplate wha
cMonster::cMonster(){
magic_res = poison_res = fire_res = cold_res = 100;
// TODO: Fill in
mindless = invuln = guard = invisible = false;
level = m_health = armor = skill = speed = 0;
default_facial_pic = default_attitude = 0;
ambient_sound = 0;
corpse_item = corpse_item_chance = treasure = 0;
mu = cl = 0;
summon_type = 0;
picture_num = 0;
x_width = y_width = 1;
see_spec = -1;
m_type = eRace::UNKNOWN;
}
cTownperson::cTownperson() {

View File

@@ -334,6 +334,10 @@ inline bool isWeaponType(eItemType type) {
return (code >= 1 && code <= 6 && code != 3) || (code >= 23 && code <= 25);
}
inline bool isMissileType(eItemType type) {
return type == eItemType::ARROW || type == eItemType::BOLTS || type == eItemType::THROWN_MISSILE || type == eItemType::MISSILE_NO_AMMO;
}
/* items[i].ability */
enum class eItemAbil {
// Weapon abilities

View File

@@ -24,25 +24,25 @@ enum class eStepSnd {STEP, SQUISH, CRUNCH, NONE, SPLASH};
class cTerrain {
public:
std::string name;
pic_num_t picture;
eTerObstruct blockage;
int flag1, flag2, flag3;
eTerSpec special;
ter_num_t trans_to_what;
bool fly_over;
bool boat_over;
bool block_horse;
unsigned int light_radius;
eStepSnd step_sound;
unsigned char shortcut_key; // for editor use only
unsigned int obj_num = 0; // ditto (formerly res1)
unsigned int ground_type; // ditto (formerly res2)
eTrimType trim_type; // ditto, mostly (formerly res3)
long trim_ter; // ditto
unsigned short combat_arena;
pic_num_t picture = 0;
eTerObstruct blockage = eTerObstruct::CLEAR;
int flag1 = 0, flag2 = 0, flag3 = 0;
eTerSpec special = eTerSpec::NONE;
ter_num_t trans_to_what = 0;
bool fly_over = false;
bool boat_over = false;
bool block_horse = false;
unsigned int light_radius = 0;
eStepSnd step_sound = eStepSnd::STEP;
unsigned char shortcut_key = 0; // for editor use only
unsigned int obj_num = 0; // ditto
unsigned int ground_type = 0; // ditto
eTrimType trim_type = eTrimType::NONE; // ditto, mostly
long trim_ter = 0; // ditto
unsigned short combat_arena = 0;
location obj_pos; // editor use only
location obj_size; // editor use only
pic_num_t map_pic;
pic_num_t map_pic = -1;
unsigned short i; // for temporary use in porting
void append(legacy::terrain_type_type& old);

View File

@@ -278,6 +278,7 @@ std::ostream& operator<< (std::ostream& out, eLighting light) {
std::istream& operator>> (std::istream& in, eLighting& light) {
std::string key;
in >> key;
if(key == "lit") light = LIGHT_NORMAL;
else if(key == "dark") light = LIGHT_DARK;
else if(key == "drains") light = LIGHT_DRAINS;

View File

@@ -403,7 +403,8 @@ static void writeItemsToXml(ticpp::Printer&& data) {
data.PushElement("charges", item.charges);
if(isWeaponType(item.variety) && item.variety != eItemType::ARROW && item.variety != eItemType::BOLTS)
data.PushElement("weapon-type", item.weap_type);
data.PushElement("missile-type", item.missile);
if(item.missile > 0 || isMissileType(item.variety))
data.PushElement("missile-type", item.missile);
data.PushElement("pic", item.graphic_num);
if(item.type_flag > 0)
data.PushElement("flag", item.type_flag);
@@ -447,7 +448,7 @@ static void writeMonstersToXml(ticpp::Printer&& data) {
data.PushAttribute("id", i);
cMonster& monst = scenario.scen_monsters[i];
data.PushElement("name", monst.m_name);
if(monst.default_facial_pic >= 0)
if(monst.default_facial_pic > 0)
data.PushElement("default-face", monst.default_facial_pic);
data.OpenElement("pic");
@@ -486,11 +487,11 @@ static void writeMonstersToXml(ticpp::Printer&& data) {
if(monst.magic_res != 100)
data.PushElement("magic", monst.magic_res);
if(monst.fire_res != 100)
data.PushElement("fire", monst.magic_res);
data.PushElement("fire", monst.fire_res);
if(monst.cold_res != 100)
data.PushElement("cold", monst.magic_res);
data.PushElement("cold", monst.cold_res);
if(monst.poison_res != 100)
data.PushElement("poison", monst.magic_res);
data.PushElement("poison", monst.poison_res);
if(monst.mindless) data.PushElement("fear", true);
if(monst.invuln) data.PushElement("all", true);
data.CloseElement("immunity");

View File

@@ -836,6 +836,7 @@ static void readTerrainFromXml(ticpp::Document&& data, cScenario& scenario) {
int which_ter;
elem->GetAttribute("id", &which_ter);
cTerrain& the_ter = scenario.ter_types[which_ter];
the_ter = cTerrain();
Iterator<Element> ter;
for(ter = ter.begin(elem.Get()); ter != ter.end(); ter++) {
ter->GetValue(&type);
@@ -878,7 +879,7 @@ static void readTerrainFromXml(ticpp::Document&& data, cScenario& scenario) {
} else if(type == "ride") {
ter->GetText(&val);
if(val != "true")
the_ter.block_horse = true;
the_ter.block_horse = false;
} else if(type == "light") {
ter->GetText(&the_ter.light_radius);
} else if(type == "step-sound") {
@@ -932,6 +933,7 @@ static void readItemsFromXml(ticpp::Document&& data, cScenario& scenario) {
int which_item;
elem->GetAttribute("id", &which_item);
cItem& the_item = scenario.scen_items[which_item];
the_item = cItem();
Iterator<Element> item;
for(item = item.begin(elem.Get()); item != item.end(); item++) {
item->GetValue(&type);
@@ -1120,9 +1122,7 @@ static void readMonstAbilFromXml(ticpp::Element& data, cMonster& monst) {
if(type == "type") {
elem->GetText(&radiate.type);
} else if(type == "chance") {
long double percent;
elem->GetText(&percent);
radiate.chance = percent * 10;
elem->GetText(&radiate.chance);
} else throw xBadNode(type, elem->Row(), elem->Column(), fname);
}
} else if(type == "special") {
@@ -1160,6 +1160,7 @@ static void readMonstersFromXml(ticpp::Document&& data, cScenario& scenario) {
if(which_monst == 0)
throw xBadVal(type, "id", "0", elem->Row(), elem->Column(), fname);
cMonster& the_mon = scenario.scen_monsters[which_monst];
the_mon = cMonster();
Iterator<Attribute> attr;
Iterator<Element> monst;
for(monst = monst.begin(elem.Get()); monst != monst.end(); monst++) {