/* $Id: eodata.hpp 181 2009-12-31 04:24:55Z sausage $
* EOSERV is released under the zlib license.
* See LICENSE.txt for more info.
*/
#ifndef EODATA_HPP_INCLUDED
#define EODATA_HPP_INCLUDED
#include "stdafx.h"
/**
* Loads and stores information on all items from an EIF file
*/
class EIF : public Shared
{
public:
enum Type
{
Static,
UnknownType1,
Money,
Heal,
Teleport,
Spell,
EXPReward,
StatReward,
SkillReward,
Key,
Weapon,
Shield,
Armor,
Hat,
Boots,
Gloves,
Accessory,
Belt,
Necklace,
Ring,
Armlet,
Bracer,
Beer,
EffectPotion,
HairDye,
CureCurse
};
enum SubType
{
None,
Ranged,
Arrows,
Wings
};
enum Special
{
Normal,
Rare, // ?
UnknownSpecial2,
Unique, // ?
Lore,
Cursed
};
enum Size
{
Size1x1,
Size1x2,
Size1x3,
Size1x4,
Size2x1,
Size2x2,
Size2x3,
Size2x4,
};
static int SizeTiles(Size size)
{
switch (size)
{
case Size1x1: return 1;
case Size1x2: return 2;
case Size1x3: return 3;
case Size1x4: return 4;
case Size2x1: return 2;
case Size2x2: return 4;
case Size2x3: return 6;
case Size2x4: return 8;
default: return 0;
}
}
static const int DATA_SIZE = 58;
unsigned char rid[4];
unsigned char len[2];
PtrVector<EIF_Data> data;
EIF(std::string filename) { Read(filename); }
void Read(std::string filename);
EIF_Data *Get(unsigned int id);
unsigned int GetKey(int keynum);
static EIF *ScriptFactory(std::string filename) { return new EIF(filename); }
SCRIPT_REGISTER_REF(EIF)
SCRIPT_REGISTER_ENUM("EIF_Type")
SCRIPT_REGISTER_ENUM_VALUE(Static);
SCRIPT_REGISTER_ENUM_VALUE(UnknownType1);
SCRIPT_REGISTER_ENUM_VALUE(Money);
SCRIPT_REGISTER_ENUM_VALUE(Heal);
SCRIPT_REGISTER_ENUM_VALUE(Teleport);
SCRIPT_REGISTER_ENUM_VALUE(Spell);
SCRIPT_REGISTER_ENUM_VALUE(EXPReward);
SCRIPT_REGISTER_ENUM_VALUE(StatReward);
SCRIPT_REGISTER_ENUM_VALUE(SkillReward);
SCRIPT_REGISTER_ENUM_VALUE(Key);
SCRIPT_REGISTER_ENUM_VALUE(Weapon);
SCRIPT_REGISTER_ENUM_VALUE(Shield);
SCRIPT_REGISTER_ENUM_VALUE(Armor);
SCRIPT_REGISTER_ENUM_VALUE(Hat);
SCRIPT_REGISTER_ENUM_VALUE(Boots);
SCRIPT_REGISTER_ENUM_VALUE(Gloves);
SCRIPT_REGISTER_ENUM_VALUE(Accessory);
SCRIPT_REGISTER_ENUM_VALUE(Belt);
SCRIPT_REGISTER_ENUM_VALUE(Necklace);
SCRIPT_REGISTER_ENUM_VALUE(Ring);
SCRIPT_REGISTER_ENUM_VALUE(Armlet);
SCRIPT_REGISTER_ENUM_VALUE(Bracer);
SCRIPT_REGISTER_ENUM_VALUE(Beer);
SCRIPT_REGISTER_ENUM_VALUE(EffectPotion);
SCRIPT_REGISTER_ENUM_VALUE(HairDye);
SCRIPT_REGISTER_ENUM_VALUE(CureCurse);
SCRIPT_REGISTER_ENUM_END()
SCRIPT_REGISTER_ENUM("EIF_SubType")
SCRIPT_REGISTER_ENUM_VALUE(None);
SCRIPT_REGISTER_ENUM_VALUE(Ranged);
SCRIPT_REGISTER_ENUM_VALUE(Arrows);
SCRIPT_REGISTER_ENUM_VALUE(Wings);
SCRIPT_REGISTER_ENUM_END()
SCRIPT_REGISTER_ENUM("EIF_Special")
SCRIPT_REGISTER_ENUM_VALUE(Normal);
SCRIPT_REGISTER_ENUM_VALUE(Rare);
SCRIPT_REGISTER_ENUM_VALUE(UnknownSpecial2);
SCRIPT_REGISTER_ENUM_VALUE(Unique);
SCRIPT_REGISTER_ENUM_VALUE(Lore);
SCRIPT_REGISTER_ENUM_VALUE(Cursed);
SCRIPT_REGISTER_ENUM_END()
SCRIPT_REGISTER_ENUM("EIF_Size")
SCRIPT_REGISTER_ENUM_VALUE(Size1x1);
SCRIPT_REGISTER_ENUM_VALUE(Size1x2);
SCRIPT_REGISTER_ENUM_VALUE(Size1x3);
SCRIPT_REGISTER_ENUM_VALUE(Size1x4);
SCRIPT_REGISTER_ENUM_VALUE(Size2x1);
SCRIPT_REGISTER_ENUM_VALUE(Size2x2);
SCRIPT_REGISTER_ENUM_VALUE(Size2x3);
SCRIPT_REGISTER_ENUM_VALUE(Size2x4);
SCRIPT_REGISTER_ENUM_END()
SCRIPT_REGISTER_FACTORY("EIF @f(string filename)", ScriptFactory);
SCRIPT_REGISTER_VARIABLE("PtrVector<EIF_Data>", data);
SCRIPT_REGISTER_FUNCTION("void Read(string filename)", Read);
SCRIPT_REGISTER_FUNCTION("EIF_Data @Get(uint)", Get);
SCRIPT_REGISTER_FUNCTION("uint GetKey(int)", GetKey);
SCRIPT_REGISTER_END()
};
/**
* One item record in an EIF object
*/
struct EIF_Data : public Shared
{
int id;
std::string name;
short graphic;
EIF::Type type;
EIF::SubType subtype;
EIF::Special special;
short hp;
short tp;
short mindam;
short maxdam;
short accuracy;
short evade;
short armor;
unsigned char str;
unsigned char intl;
unsigned char wis;
unsigned char agi;
unsigned char con;
unsigned char cha;
unsigned char light;
unsigned char dark;
unsigned char earth;
unsigned char air;
unsigned char water;
unsigned char fire;
union
{
int scrollmap;
int dollgraphic;
int expreward;
int haircolor;
int effect;
int key;
};
union
{
unsigned char gender;
unsigned char scrollx;
};
union
{
unsigned char scrolly;
};
short levelreq;
short classreq;
short strreq;
short intreq;
short wisreq;
short agireq;
short conreq;
short chareq;
unsigned char aoe;
unsigned char weight;
EIF::Size size;
EIF_Data() : id(0), graphic(0), type(EIF::Static), subtype(EIF::None), special(EIF::Normal),
hp(0), tp(0), mindam(0), maxdam(0), accuracy(0), evade(0), armor(0), str(0), intl(0), wis(0),
agi(0), con(0), cha(0), light(0), dark(0), earth(0), air(0), water(0), fire(0), scrollmap(0),
gender(0), scrolly(0), levelreq(0), classreq(0), strreq(0), intreq(0), wisreq(0), agireq(0),
conreq(0), chareq(0), aoe(0), weight(0), size(EIF::Size1x1) { }
SCRIPT_REGISTER_REF_DF(EIF_Data)
SCRIPT_REGISTER_VARIABLE("int", id);
SCRIPT_REGISTER_VARIABLE("string", name);
SCRIPT_REGISTER_VARIABLE("int", graphic);
SCRIPT_REGISTER_VARIABLE("EIF_Type", type);
SCRIPT_REGISTER_VARIABLE("EIF_SubType", subtype);
SCRIPT_REGISTER_VARIABLE("EIF_Special", special);
SCRIPT_REGISTER_VARIABLE("int16", hp);
SCRIPT_REGISTER_VARIABLE("int16", tp);
SCRIPT_REGISTER_VARIABLE("int16", mindam);
SCRIPT_REGISTER_VARIABLE("int16", maxdam);
SCRIPT_REGISTER_VARIABLE("int16", accuracy);
SCRIPT_REGISTER_VARIABLE("int16", evade);
SCRIPT_REGISTER_VARIABLE("int16", armor);
SCRIPT_REGISTER_VARIABLE("uint8", str);
SCRIPT_REGISTER_VARIABLE("uint8", intl);
SCRIPT_REGISTER_VARIABLE("uint8", wis);
SCRIPT_REGISTER_VARIABLE("uint8", agi);
SCRIPT_REGISTER_VARIABLE("uint8", con);
SCRIPT_REGISTER_VARIABLE("uint8", cha);
SCRIPT_REGISTER_VARIABLE("uint8", light);
SCRIPT_REGISTER_VARIABLE("uint8", dark);
SCRIPT_REGISTER_VARIABLE("uint8", earth);
SCRIPT_REGISTER_VARIABLE("uint8", air);
SCRIPT_REGISTER_VARIABLE("uint8", water);
SCRIPT_REGISTER_VARIABLE("uint8", fire);
SCRIPT_REGISTER_VARIABLE("int", scrollmap);
SCRIPT_REGISTER_VARIABLE("int", dollgraphic);
SCRIPT_REGISTER_VARIABLE("int", expreward);
SCRIPT_REGISTER_VARIABLE("int", haircolor);
SCRIPT_REGISTER_VARIABLE("int", effect);
SCRIPT_REGISTER_VARIABLE("int", key);
SCRIPT_REGISTER_VARIABLE("uint8", gender);
SCRIPT_REGISTER_VARIABLE("uint8", scrollx);
SCRIPT_REGISTER_VARIABLE("uint8", scrolly);
SCRIPT_REGISTER_VARIABLE("int16", levelreq);
SCRIPT_REGISTER_VARIABLE("int16", classreq);
SCRIPT_REGISTER_VARIABLE("int16", strreq);
SCRIPT_REGISTER_VARIABLE("int16", intreq);
SCRIPT_REGISTER_VARIABLE("int16", wisreq);
SCRIPT_REGISTER_VARIABLE("int16", agireq);
SCRIPT_REGISTER_VARIABLE("int16", conreq);
SCRIPT_REGISTER_VARIABLE("int16", chareq);
SCRIPT_REGISTER_VARIABLE("uint8", weight);
SCRIPT_REGISTER_VARIABLE("EIF_Size", size);
SCRIPT_REGISTER_END()
};
/**
* Loads and stores information on all NPCs from an ENF file
*/
class ENF : public Shared
{
public:
enum Type
{
NPC,
Passive,
Aggressive,
Pet, //Unknown1!
Rider,
Unknown3,
Shop,
Inn,
Unknown4,
Bank,
Barber,
Guild,
Priest,
Law,
Skills,
Quest
};
static const int DATA_SIZE = 39;
unsigned char rid[4];
unsigned char len[2];
PtrVector<ENF_Data> data;
ENF(std::string filename) { Read(filename); }
void Read(std::string filename);
ENF_Data *Get(unsigned int id);
static ENF *ScriptFactory(std::string filename) { return new ENF(filename); }
SCRIPT_REGISTER_REF(ENF)
SCRIPT_REGISTER_ENUM("ENF_Type")
SCRIPT_REGISTER_ENUM_VALUE(NPC);
SCRIPT_REGISTER_ENUM_VALUE(Passive);
SCRIPT_REGISTER_ENUM_VALUE(Aggressive);
SCRIPT_REGISTER_ENUM_VALUE(Pet);
SCRIPT_REGISTER_ENUM_VALUE(Rider);
SCRIPT_REGISTER_ENUM_VALUE(Unknown3);
SCRIPT_REGISTER_ENUM_VALUE(Shop);
SCRIPT_REGISTER_ENUM_VALUE(Inn);
SCRIPT_REGISTER_ENUM_VALUE(Unknown4);
SCRIPT_REGISTER_ENUM_VALUE(Bank);
SCRIPT_REGISTER_ENUM_VALUE(Barber);
SCRIPT_REGISTER_ENUM_VALUE(Guild);
SCRIPT_REGISTER_ENUM_VALUE(Priest);
SCRIPT_REGISTER_ENUM_VALUE(Law);
SCRIPT_REGISTER_ENUM_VALUE(Skills);
SCRIPT_REGISTER_ENUM_VALUE(Quest);
SCRIPT_REGISTER_ENUM_END()
SCRIPT_REGISTER_FACTORY("ENF @f(string filename)", ScriptFactory);
SCRIPT_REGISTER_VARIABLE("PtrVector<ENF_Data>", data);
SCRIPT_REGISTER_FUNCTION("void Read(string filename)", Read);
SCRIPT_REGISTER_FUNCTION("ENF_Data @Get(uint)", Get);
SCRIPT_REGISTER_END()
};
/**
* One NPC record in an ENF object
*/
struct ENF_Data : public Shared
{
int id;
std::string name;
int graphic;
short boss;
short child;
ENF::Type type;
short type_index;
int hp;
unsigned short exp;
short mindam;
short maxdam;
short accuracy;
short evade;
short armor;
ENF_Data() : id(0), graphic(0), boss(0), child(0), type(ENF::NPC), hp(0), exp(0), mindam(0), maxdam(0), accuracy(0), evade(0), armor(0) { }
SCRIPT_REGISTER_REF_DF(ENF_Data)
SCRIPT_REGISTER_VARIABLE("int", id);
SCRIPT_REGISTER_VARIABLE("string", name);
SCRIPT_REGISTER_VARIABLE("int", graphic);
SCRIPT_REGISTER_VARIABLE("int16", boss);
SCRIPT_REGISTER_VARIABLE("int16", child);
SCRIPT_REGISTER_VARIABLE("ENF_Type", type);
SCRIPT_REGISTER_VARIABLE("uint16", type_index);
SCRIPT_REGISTER_VARIABLE("int", hp);
SCRIPT_REGISTER_VARIABLE("uint16", exp);
SCRIPT_REGISTER_VARIABLE("int16", mindam);
SCRIPT_REGISTER_VARIABLE("int16", maxdam);
SCRIPT_REGISTER_VARIABLE("int16", accuracy);
SCRIPT_REGISTER_VARIABLE("int16", evade);
SCRIPT_REGISTER_VARIABLE("int16", armor);
SCRIPT_REGISTER_END()
};
/**
* Loads and stores information on all spells from an ESF file
*/
class ESF : public Shared
{
public:
enum Spell_Effect
{
Heal,
Damage,
Bard
};
enum Target
{
None,
Ally,
Enemy
};
enum Type
{
Normal,
Self,
Unknown,
Group
};
static const int DATA_SIZE = 51;
unsigned char rid[4];
unsigned char len[2];
PtrVector<ESF_Data> data;
ESF(std::string filename) { Read(filename); }
void Read(std::string filename);
ESF_Data *Get(unsigned int id);
static ESF *ScriptFactory(std::string filename) { return new ESF(filename); }
SCRIPT_REGISTER_REF(ESF)
SCRIPT_REGISTER_ENUM("ESF_Spell_Effect")
SCRIPT_REGISTER_ENUM_VALUE(Heal);
SCRIPT_REGISTER_ENUM_VALUE(Damage);
SCRIPT_REGISTER_ENUM_VALUE(Bard);
SCRIPT_REGISTER_ENUM_END()
SCRIPT_REGISTER_ENUM("ESF_Target")
SCRIPT_REGISTER_ENUM_VALUE(None);
SCRIPT_REGISTER_ENUM_VALUE(Ally);
SCRIPT_REGISTER_ENUM_VALUE(Enemy);
SCRIPT_REGISTER_ENUM_END()
SCRIPT_REGISTER_ENUM("ESF_Type")
SCRIPT_REGISTER_ENUM_VALUE(Normal);
SCRIPT_REGISTER_ENUM_VALUE(Self);
SCRIPT_REGISTER_ENUM_VALUE(Unknown);
SCRIPT_REGISTER_ENUM_VALUE(Group);
SCRIPT_REGISTER_ENUM_END()
SCRIPT_REGISTER_FACTORY("ESF @f(string filename)", ScriptFactory);
SCRIPT_REGISTER_VARIABLE("PtrVector<ESF_Data>", data);
SCRIPT_REGISTER_FUNCTION("void Read(string filename)", Read);
SCRIPT_REGISTER_END()
};
/**
* One spell record in an ESF object
*/
struct ESF_Data : public Shared
{
int id;
std::string name;
std::string shout;
short icon;
short graphic;
short tp;
short sp;
unsigned char cast_time;
ESF::Spell_Effect spell_effect;
ESF::Target target;
ESF::Type type;
short mindam;
short maxdam;
short accuracy;
short hp;
ESF_Data() : id(0), icon(0), graphic(0), tp(0), sp(0), cast_time(0), spell_effect(ESF::Heal),
target(ESF::None), type(ESF::Normal), mindam(0), maxdam(0), accuracy(0), hp(0) { }
SCRIPT_REGISTER_REF_DF(ESF_Data)
SCRIPT_REGISTER_VARIABLE("int", id);
SCRIPT_REGISTER_VARIABLE("string", name);
SCRIPT_REGISTER_VARIABLE("string", shout);
SCRIPT_REGISTER_VARIABLE("int16", icon);
SCRIPT_REGISTER_VARIABLE("int16", graphic);
SCRIPT_REGISTER_VARIABLE("int16", tp);
SCRIPT_REGISTER_VARIABLE("int16", sp);
SCRIPT_REGISTER_VARIABLE("uint8", cast_time);
SCRIPT_REGISTER_VARIABLE("ESF_Spell_Effect", spell_effect);
SCRIPT_REGISTER_VARIABLE("ESF_Target", target);
SCRIPT_REGISTER_VARIABLE("ESF_Type", type);
SCRIPT_REGISTER_VARIABLE("int16", mindam);
SCRIPT_REGISTER_VARIABLE("int16", maxdam);
SCRIPT_REGISTER_VARIABLE("int16", accuracy);
SCRIPT_REGISTER_VARIABLE("int16", hp);
SCRIPT_REGISTER_END()
};
/**
* Loads and stores information on all classes from an ECF file
*/
class ECF : public Shared
{
public:
static const int DATA_SIZE = 14;
unsigned char rid[4];
unsigned char len[2];
PtrVector<ECF_Data> data;
ECF(std::string filename) { Read(filename); }
void Read(std::string filename);
static ECF *ScriptFactory(std::string filename) { return new ECF(filename); }
SCRIPT_REGISTER_REF(ECF)
SCRIPT_REGISTER_FACTORY("ECF @f(string filename)", ScriptFactory);
SCRIPT_REGISTER_VARIABLE("PtrVector<ECF_Data>", data);
SCRIPT_REGISTER_FUNCTION("void Read(string filename)", Read);
SCRIPT_REGISTER_END()
};
/**
* One class record in an ECF object
*/
struct ECF_Data : public Shared
{
int id;
std::string name;
unsigned char base;
unsigned char type;
short str;
short intl;
short wis;
short agi;
short con;
short cha;
ECF_Data() : id(0), base(0), type(0), str(0), intl(0), wis(0), agi(0), con(0), cha(9) { }
SCRIPT_REGISTER_REF_DF(ECF_Data)
SCRIPT_REGISTER_VARIABLE("int", id);
SCRIPT_REGISTER_VARIABLE("string", name);
SCRIPT_REGISTER_END()
};
#endif // EODATA_HPP_INCLUDED