Files
oboe/osx/classes/item.cpp
Niemand f198b4899d Added include guards to all class headers.
Removed unnecessary or potentially harmful compiler flags. 
Added alignment attribute to all old struct members. 
Removed some unused variables. 
Made some switch statements handle all or more cases. 
Removed using declarations in favor of fully qualified names. 
Fixed a couple of assignments in conditionals that should have been comparisons. 
Eliminated linker warnings by restoring default linking of standard libraries. 
Fixed some comparisons between signed and unsigned integers. 

Note: No testing has been done, in particular of old file I/O. This should be checked for regression caused by alteration of old struct definitions. 


git-svn-id: http://openexile.googlecode.com/svn/trunk@63 4ebdad44-0ea0-11de-aab3-ff745001d230
2009-05-22 03:01:05 +00:00

433 lines
10 KiB
C++

/*
* item.cpp
* BoE
*
* Created by Celtic Minstrel on 20/04/09.
*
*/
#include <string>
#include <vector>
#include <map>
#include <sstream>
#include "classes.h"
#include "boe.consts.h"
#include "oldstructs.h"
cItemRec k;
unsigned char cItemRec::rec_treas_class() const {
short tmp = value;
if(charges > 0) tmp *= charges;
if(tmp >= 15) return 1;
if(tmp >= 100) return 2;
if(tmp >= 900) return 3;
if(tmp >= 2400) return 4;
return 0;
}
bool cItemRec::is_ident() const {
return item_properties & 1;
}
bool cItemRec::is_property() const {
return item_properties & 2;
}
bool cItemRec::is_magic() const {
return item_properties & 4;
}
bool cItemRec::is_contained() const {
return item_properties & 8;
}
bool cItemRec::is_cursed() const {
return item_properties & 16;
}
bool cItemRec::is_concealed() const {
return item_properties & 32;
}
bool cItemRec::is_enchanted() const {
return item_properties & 64;
}
// Set bit to 1: a |= b
// Set bit to 0: a &= ~b
// Toggle bit: a ^= b
void cItemRec::set_ident(bool b) {
if(b) item_properties |= 1;
else item_properties &= ~1;
}
void cItemRec::set_property(bool b) {
if(b) item_properties |= 2;
else item_properties &= ~2;
}
void cItemRec::set_magic(bool b) {
if(b) item_properties |= 4;
else item_properties &= ~4;
}
void cItemRec::set_contained(bool b) {
if(b) item_properties |= 8;
else item_properties &= ~8;
}
void cItemRec::set_cursed(bool b) {
if(b) item_properties |= 16;
else item_properties &= ~16;
}
void cItemRec::set_concealed(bool b) {
if(b) item_properties |= 32;
else item_properties &= ~32;
}
void cItemRec::set_enchanted(bool b) {
if(b) item_properties |= 64;
else item_properties &= ~64;
}
short cItemRec::item_weight() const {
short n = charges, w = weight;
if (variety == 0)
return 0;
if(charges > 0){
if((variety == 5) || (variety == 6) || (variety == 7) || (variety == 24))
return n * w;
}
return w;
}
cItemRec::cItemRec(){
variety = ITEM_TYPE_NO_ITEM;
item_level = 0;
awkward = 0;
bonus = 0;
protection = 0;
charges = 0;
type = ITEM_NOT_MELEE;
magic_use_type = 0;
graphic_num = 0;
ability = ITEM_NO_ABILITY;
ability_strength = 0;
type_flag = 0;
is_special = 0;
value = 0;
weight = 0;
special_class = 0;
item_loc.x = 0;
item_loc.y = 0;
full_name = "";
name = "";
treas_class = 0;
item_properties = 0;
reserved1 = 0;
reserved2 = 0;
}
cItemRec::cItemRec(long preset){
ability = ITEM_NO_ABILITY;
ability_strength = 0;
type_flag = 0;
is_special = 0;
special_class = 0;
item_loc.x = 0;
item_loc.y = 0;
treas_class = 0;
reserved1 = 0;
reserved2 = 0;
switch(preset){
case 'nife':
variety = ITEM_TYPE_ONE_HANDED;
item_level = 4;
awkward = 0;
bonus = 1;
protection = 0;
charges = 0;
type = ITEM_EDGED;
magic_use_type = 0;
graphic_num = 45;
value = 2;
weight = 7;
full_name = "Bronze Knife";
name = "Knife";
set_ident(true);
break;
case 'buck':
variety = ITEM_TYPE_SHIELD;
item_level = 1;
awkward = 1;
bonus = 0;
protection = 0;
charges = 0;
type = ITEM_NOT_MELEE;
magic_use_type = 0;
graphic_num = 65;
value = 2;
weight = 20;
full_name = "Crude Buckler";
name = "Buckler";
set_ident(true);
break;
case 'bow ':
variety = ITEM_TYPE_BOW;
item_level = 0;
awkward = 0;
bonus = 0;
protection = 0;
charges = 0;
type = ITEM_NOT_MELEE;
magic_use_type = 0;
graphic_num = 10;
value = 15;
weight = 20;
full_name = "Cavewood Bow";
name = "Bow";
set_ident(true);
break;
case 'arrw':
variety = ITEM_TYPE_ARROW;
item_level = 12;
awkward = 0;
bonus = 0;
protection = 0;
charges = 12;
type = ITEM_NOT_MELEE;
magic_use_type = 0;
graphic_num = 47;
value = 1;
weight = 1;
full_name = "Arrows";
name = "Arrows";
set_ident(true);
break;
case 'pole':
variety = ITEM_TYPE_TWO_HANDED;
item_level = 9;
awkward = 0;
bonus = 0;
protection = 0;
charges = 0;
type = ITEM_POLE;
magic_use_type = 0;
graphic_num = 4;
value = 10;
weight = 20;
full_name = "Stone Spear";
name = "Spear";
set_ident(true);
break;
case 'helm':
variety = ITEM_TYPE_HELM;
item_level = 1;
awkward = 0;
bonus = 0;
protection = 0;
charges = 0;
type = ITEM_NOT_MELEE;
magic_use_type = 0;
graphic_num = 66;
value = 6;
weight = 15;
full_name = "Leather Helm";
name = "Helm";
set_ident(true);
break;
case 'food':
variety = ITEM_TYPE_FOOD;
item_level = 0;
awkward = 0;
bonus = 0;
protection = 0;
charges = 0;
type = ITEM_NOT_MELEE;
magic_use_type = 0;
graphic_num = 62;
value = 0;
weight = 0;
full_name = "Food";
name = "Food";
set_ident(false);
break;
case 'spel':
variety = ITEM_TYPE_NON_USE_OBJECT;
item_level = 0;
awkward = 0;
bonus = 0;
protection = 0;
charges = 0;
type = ITEM_NOT_MELEE;
magic_use_type = 0;
graphic_num = 53;
value = 0;
weight = 0;
full_name = "";
name = "";
set_ident(false);
break;
case 'alch':
variety = ITEM_TYPE_POTION;
item_level = 0;
awkward = 0;
bonus = 0;
protection = 0;
charges = 1;
type = ITEM_NOT_MELEE;
magic_use_type = 0;
graphic_num = 50;
value = 0;
weight = 8;
full_name = "Potion";
name = "Potion";
set_ident(false);
set_magic(true);
break;
}
}
__attribute__((deprecated))
cItemRec& cItemRec::operator = (legacy::item_record_type& old){
variety = (eItemType) old.variety;
item_level = old.item_level;
awkward = old.awkward;
bonus = old.bonus;
protection = old.protection;
charges = old.charges;
type = (eWeapType) old.type;
magic_use_type = old.magic_use_type;
graphic_num = old.graphic_num;
if(graphic_num >= 150) // custom item graphic
graphic_num += 850;
else if(graphic_num == 59) // duplicate mushroom graphic
graphic_num = 64;
ability = (eItemAbil) old.ability;
ability_strength = old.ability_strength;
type_flag = old.type_flag;
is_special = old.is_special;
value = old.value;
weight = old.weight;
special_class = old.special_class;
item_loc.x = old.item_loc.x;
item_loc.y = old.item_loc.y;
full_name = std::string(old.full_name);
name = old.name;
treas_class = old.treas_class;
item_properties = old.item_properties;
reserved1 = old.reserved1;
reserved2 = old.reserved2;
return *this;
}
void cItemRec::writeTo(std::ostream& file, std::string prefix){
file << prefix << "VARIETY " << variety << std::endl;
file << prefix << "LEVEL " << item_level << std::endl;
file << prefix << "AWKWARD " << awkward << std::endl;
file << prefix << "BONUS " << bonus << std::endl;
file << prefix << "PROT " << protection << std::endl;
file << prefix << "CHARGES " << charges << std::endl;
file << prefix << "WEAPON " << type << std::endl;
file << prefix << "USE " << magic_use_type << std::endl;
file << prefix << "ICON " << graphic_num << std::endl;
file << prefix << "ABILITY " << ability << std::endl;
file << prefix << "ABILSTR " << ability_strength << std::endl;
file << prefix << "TYPE " << type_flag << std::endl;
file << prefix << "ISSPEC " << is_special << std::endl;
file << prefix << "VALUE " << value << std::endl;
file << prefix << "WEIGHT " << weight << std::endl;
file << prefix << "SPEC " << special_class << std::endl;
file << prefix << "AT " << item_loc.x << ' ' << item_loc.y << std::endl;
file << prefix << "FULLNAME " << full_name << std::endl;
file << prefix << "NAME " << name << std::endl;
file << prefix << "TREASURE " << treas_class << std::endl;
if(is_ident()) file << prefix << "IDENTIFIED" << std::endl;
if(is_property()) file << prefix << "PROPERTY" << std::endl;
if(is_magic()) file << prefix << "MAGIC" << std::endl;
if(is_contained()) file << prefix << "CONTAINED" << std::endl;
if(is_cursed()) file << prefix << "CURSED" << std::endl;
if(is_concealed()) file << prefix << "CONCEALED" << std::endl;
if(is_enchanted()) file << prefix << "ENCHANTED" << std::endl;
}
void cItemRec::readAttrFrom(std::string cur, std::istream& sin){
if(cur == "VARIETY") sin >> variety;
else if(cur == "LEVEL") sin >> item_level;
else if(cur == "AWKWARD") sin >> awkward;
else if(cur == "BONUS") sin >> bonus;
else if(cur == "PROT") sin >> protection;
else if(cur == "CHARGES") sin >> charges;
else if(cur == "WEAPON") sin >> type;
else if(cur == "USE") sin >> magic_use_type;
else if(cur == "ICON") sin >> graphic_num;
else if(cur == "ABILITY") sin >> ability;
else if(cur == "ABILSTR") sin >> ability_strength;
else if(cur == "TYPE") sin >> type_flag;
else if(cur == "ISSPEC") sin >> is_special;
else if(cur == "VALUE") sin >> value;
else if(cur == "WEIGHT") sin >> weight;
else if(cur == "SPEC") sin >> special_class;
else if(cur == "AT") sin >> item_loc.x >> item_loc.y;
else if(cur == "FULLNAME"){
getline(sin,cur);
full_name = cur;
}else if(cur == "NAME"){
getline(sin,cur);
name = cur;
}
else if(cur == "TREASURE") sin >> treas_class;
else if(cur == "IDENTIFIED") set_ident(true);
else if(cur == "PROPERTY") set_property(true);
else if(cur == "MAGIC") set_magic(true);
else if(cur == "CONTAINED") set_contained(true);
else if(cur == "CURSED") set_cursed(true);
else if(cur == "CONCEALED") set_concealed(true);
else if(cur == "ENCHANTED") set_enchanted(true);
}
std::ostream& operator << (std::ostream& out, eWeapType& e){
return out << (int) e;
}
std::ostream& operator << (std::ostream& out, eItemType& e){
return out << (int) e;
}
std::ostream& operator << (std::ostream& out, eItemAbil& e){
return out << (int) e;
}
std::istream& operator >> (std::istream& in, eWeapType& e){
int i;
in >> i;
if(i > 0 && i < 4)
e = (eWeapType) i;
else e = ITEM_NOT_MELEE;
return in;
}
std::istream& operator >> (std::istream& in, eItemType& e){
int i;
in >> i;
if(i > 0 && i < 28)
e = (eItemType) i;
else e = ITEM_TYPE_NO_ITEM;
return in;
}
std::istream& operator >> (std::istream& in, eItemAbil& e){
int i;
in >> i;
if((i > 0 && i < 15) || (i > 29 && i < 63) ||
(i > 69 && i < 95) || (i > 109 && i < 136) ||
(i > 149 && i < 162) || (i > 169 && i < 177))
e = (eItemAbil) i;
else e = ITEM_NO_ABILITY;
return in;
}