#ifndef TMWA_MAP_MAP_T_HPP
#define TMWA_MAP_MAP_T_HPP
// map.t.hpp - Core of the map server.
//
// Copyright © ????-2004 Athena Dev Teams
// Copyright © 2004-2011 The Mana World Development Team
// Copyright © 2011-2014 Ben Longbons <b.r.longbons@gmail.com>
//
// This file is part of The Mana World (Athena server)
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "fwd.hpp"
# include "../strings/vstring.hpp"
# include "../mmo/ids.hpp"
# include "../mmo/mmo.hpp"
namespace e
{
// [Fate] status.option properties. These are persistent status changes.
// IDs that are not listed are not used in the code (to the best of my knowledge)
enum class Option : uint16_t
{
ZERO = 0x0000,
// [Fate] This is the GM `@hide' flag
HIDE = 0x0040,
// [Fate] Complete invisibility to other clients
INVISIBILITY = 0x1000,
// ?
REAL_ANY_HIDE = HIDE,
};
enum class Opt1 : uint16_t
{
ZERO = 0,
_stone1 = 1,
_freeze = 2,
_stan = 3,
_sleep = 4,
_stone6 = 6,
};
enum class Opt2 : uint16_t
{
ZERO = 0x0000,
_poison = 0x0001,
_curse = 0x0002,
_silence = 0x0004,
BLIND = 0x0010,
_speedpotion0 = 0x0020,
_signumcrucis = 0x0040,
_atkpot = 0x0080,
_heal = 0x0100,
_slowpoison = 0x0200,
};
enum class Opt3 : uint16_t
{
ZERO = 0x0000,
_concentration = 0x0001,
_overthrust = 0x0002,
_energycoat = 0x0004,
_explosionspirits = 0x0008,
_steelbody = 0x0010,
_berserk = 0x0080,
_marionette = 0x0400,
_assumptio = 0x0800,
};
ENUM_BITWISE_OPERATORS(Option)
ENUM_BITWISE_OPERATORS(Opt2)
ENUM_BITWISE_OPERATORS(Opt3)
}
using e::Option;
using e::Opt1;
using e::Opt2;
using e::Opt3;
enum class BL : uint8_t
{
NUL,
PC,
NPC,
MOB,
ITEM,
SPELL,
};
enum class NpcSubtype : uint8_t
{
WARP,
SHOP,
SCRIPT,
MESSAGE,
COUNT,
};
enum class mob_stat
{
LV,
MAX_HP,
STR,
AGI,
VIT,
INT,
DEX,
LUK,
// low and high attacks
ATK1,
ATK2,
// attack delay
ADELAY,
DEF,
MDEF,
SPEED,
// These must come last:
// [Fate] Encoded as base to 1024: 1024 means 100%
XP_BONUS,
LAST,
};
enum class MS : uint8_t
{
IDLE,
WALK,
ATTACK,
DEAD,
};
enum class ATK
{
ZERO = 0,
LUCKY,
FLEE,
DEF,
};
enum class SP : uint16_t
{
// sent to client
SPEED = 0,
// when used as "no stat"
ZERO = 0,
// sent to client
BASEEXP = 1,
// sent to client
JOBEXP = 2,
# if 0
KARMA = 3,
# endif
// sent to client
HP = 5,
// sent to client
MAXHP = 6,
// sent to client
SP = 7,
// sent to client
MAXSP = 8,
// sent to client
STATUSPOINT = 9,
// sent to client
BASELEVEL = 11,
// sent to client
SKILLPOINT = 12,
// sent to client
STR = 13,
// sent to client
AGI = 14,
// sent to client
VIT = 15,
// sent to client
INT = 16,
// sent to client
DEX = 17,
// sent to client
LUK = 18,
CLASS = 19,
// sent to client
ZENY = 20,
SEX = 21,
// sent to client
NEXTBASEEXP = 22,
// sent to client
NEXTJOBEXP = 23,
// sent to client
WEIGHT = 24,
// sent to client
MAXWEIGHT = 25,
// sent to client
USTR = 32,
// sent to client
UAGI = 33,
// sent to client
UVIT = 34,
// sent to client
UINT = 35,
// sent to client
UDEX = 36,
// sent to client
ULUK = 37,
// sent to client
ATK1 = 41,
// sent to client
ATK2 = 42,
// sent to client
MATK1 = 43,
// sent to client
MATK2 = 44,
// sent to client
DEF1 = 45,
// sent to client
DEF2 = 46,
// sent to client
MDEF1 = 47,
// sent to client
MDEF2 = 48,
// sent to client
HIT = 49,
// sent to client
FLEE1 = 50,
// sent to client
FLEE2 = 51,
// sent to client
CRITICAL = 52,
// sent to client
ASPD = 53,
// sent to client
JOBLEVEL = 55,
# if 0
PARTNER = 57,
CART = 58,
FAME = 59,
UNBREAKABLE = 60,
# endif
DEAF = 70,
// sent to client
GM = 500,
// sent to client
ATTACKRANGE = 1000,
# if 0
ATKELE = 1001,
# endif
# if 0
DEFELE = 1002,
# endif
# if 0
CASTRATE = 1003,
# endif
MAXHPRATE = 1004,
# if 0
MAXSPRATE = 1005,
# endif
# if 0
SPRATE = 1006,
# endif
# if 0
ADDEFF = 1012,
# endif
# if 0
RESEFF = 1013,
# endif
BASE_ATK = 1014,
ASPD_RATE = 1015,
HP_RECOV_RATE = 1016,
# if 0
SP_RECOV_RATE = 1017,
# endif
# if 0
SPEED_RATE = 1018,
# endif
CRITICAL_DEF = 1019,
# if 0
NEAR_ATK_DEF = 1020,
# endif
# if 0
LONG_ATK_DEF = 1021,
# endif
# if 0
DOUBLE_RATE = 1022,
# endif
DOUBLE_ADD_RATE = 1023,
# if 0
MATK = 1024,
# endif
# if 0
MATK_RATE = 1025,
# endif
# if 0
IGNORE_DEF_ELE = 1026,
# endif
# if 0
IGNORE_DEF_RACE = 1027,
# endif
# if 0
ATK_RATE = 1028,
# endif
SPEED_ADDRATE = 1029,
# if 0
ASPD_ADDRATE = 1030,
# endif
# if 0
MAGIC_ATK_DEF = 1031,
# endif
# if 0
MISC_ATK_DEF = 1032,
# endif
# if 0
IGNORE_MDEF_ELE = 1033,
# endif
# if 0
IGNORE_MDEF_RACE = 1034,
# endif
# if 0
PERFECT_HIT_RATE = 1038,
# endif
# if 0
PERFECT_HIT_ADD_RATE = 1039,
# endif
# if 0
CRITICAL_RATE = 1040,
# endif
# if 0
GET_ZENY_NUM = 1041,
# endif
# if 0
ADD_GET_ZENY_NUM = 1042,
# endif
# if 0
ADD_MONSTER_DROP_ITEM = 1047,
# endif
# if 0
DEF_RATIO_ATK_ELE = 1048,
# endif
# if 0
DEF_RATIO_ATK_RACE = 1049,
# endif
# if 0
ADD_SPEED = 1050,
# endif
# if 0
HIT_RATE = 1051,
# endif
# if 0
FLEE_RATE = 1052,
# endif
# if 0
FLEE2_RATE = 1053,
# endif
DEF_RATE = 1054,
DEF2_RATE = 1055,
# if 0
MDEF_RATE = 1056,
# endif
# if 0
MDEF2_RATE = 1057,
# endif
# if 0
SPLASH_RANGE = 1058,
# endif
# if 0
SPLASH_ADD_RANGE = 1059,
# endif
HP_DRAIN_RATE = 1061,
# if 0
SP_DRAIN_RATE = 1062,
# endif
# if 0
SHORT_WEAPON_DAMAGE_RETURN = 1063,
# endif
# if 0
LONG_WEAPON_DAMAGE_RETURN = 1064,
# endif
# if 0
ADDEFF2 = 1067,
# endif
BREAK_WEAPON_RATE = 1068,
BREAK_ARMOR_RATE = 1069,
ADD_STEAL_RATE = 1070,
MAGIC_DAMAGE_RETURN = 1071,
# if 0
RANDOM_ATTACK_INCREASE = 1072,
# endif
};
constexpr
SP attr_to_sp(ATTR attr)
{
return static_cast<SP>(static_cast<uint16_t>(attr) + static_cast<uint16_t>(SP::STR));
}
constexpr
ATTR sp_to_attr(SP sp)
{
return static_cast<ATTR>(static_cast<uint16_t>(sp) - static_cast<uint16_t>(SP::STR));
}
constexpr
SP attr_to_usp(ATTR attr)
{
return static_cast<SP>(static_cast<uint16_t>(attr) + static_cast<uint16_t>(SP::USTR));
}
constexpr
ATTR usp_to_attr(SP sp)
{
return static_cast<ATTR>(static_cast<uint16_t>(sp) - static_cast<uint16_t>(SP::USTR));
}
constexpr
SP sp_to_usp(SP sp)
{
return attr_to_usp(sp_to_attr(sp));
}
constexpr
SP usp_to_sp(SP sp)
{
return attr_to_sp(usp_to_attr(sp));
}
enum class LOOK : uint8_t
{
BASE = 0,
HAIR = 1,
WEAPON = 2,
HEAD_BOTTOM = 3,
HEAD_TOP = 4,
HEAD_MID = 5,
HAIR_COLOR = 6,
CLOTHES_COLOR = 7,
SHIELD = 8,
SHOES = 9,
GLOVES = 10,
CAPE = 11,
MISC1 = 12,
MISC2 = 13,
COUNT,
};
enum class EQUIP
{
NONE = -1,
MISC2 = 0,
CAPE = 1,
SHOES = 2,
GLOVES = 3,
LEGS = 4, // also called "head bottom"
TORSO = 5, // also called "head middle"
HAT = 6, // also called "head top"
MISC1 = 7,
SHIELD = 8,
WEAPON = 9,
ARROW = 10,
COUNT = 11,
};
constexpr
EQUIP EQUIPs[] =
{
EQUIP::MISC2,
EQUIP::CAPE,
EQUIP::SHOES,
EQUIP::GLOVES,
EQUIP::LEGS,
EQUIP::TORSO,
EQUIP::HAT,
EQUIP::MISC1,
EQUIP::SHIELD,
EQUIP::WEAPON,
EQUIP::ARROW,
};
constexpr
EQUIP EQUIPs_noarrow[] =
{
EQUIP::MISC2,
EQUIP::CAPE,
EQUIP::SHOES,
EQUIP::GLOVES,
EQUIP::LEGS,
EQUIP::TORSO,
EQUIP::HAT,
EQUIP::MISC1,
EQUIP::SHIELD,
EQUIP::WEAPON,
};
enum class ItemType : uint8_t
{
USE = 0, // in eA, healing only
_1 = 1, // unused
_2 = 2, // in eA, other usable items
JUNK = 3, // "useless" items (e.g. quests)
WEAPON = 4, // all weapons
ARMOR = 5, // all other equipment
_6 = 6, // in eA, card
_7 = 7, // in eA, pet egg
_8 = 8, // in eA, pet equipment
_9 = 9, // unused
ARROW = 10, // ammo
_11 = 11, // in eA, delayed use (special script)
};
namespace e
{
enum class MobMode : uint16_t
{
ZERO = 0x0000,
CAN_MOVE = 0x0001,
LOOTER = 0x0002,
AGGRESSIVE = 0x0004,
ASSIST = 0x0008,
CAST_SENSOR = 0x0010,
BOSS = 0x0020,
// sometimes also called "robust"
PLANT = 0x0040,
CAN_ATTACK = 0x0080,
DETECTOR = 0x0100,
CHANGE_TARGET = 0x0200,
war = CAN_MOVE | AGGRESSIVE | CAN_ATTACK,
SUMMONED = 0x1000,
TURNS_AGAINST_BAD_MASTER = 0x2000,
// mob mode flags that Fate actually understood
SENSIBLE_MASK = 0xf000,
};
ENUM_BITWISE_OPERATORS(MobMode)
}
using e::MobMode;
namespace e
{
enum class MapCell : uint8_t
{
// the usual thing
UNWALKABLE = 0x01,
// not in tmwa data
_range = 0x04,
// set in code, not imported
NPC_NEAR = 0x80,
};
ENUM_BITWISE_OPERATORS(MapCell)
}
using e::MapCell;
struct MobName : VString<23> {};
struct NpcName : VString<23> {};
struct ScriptLabel : VString<23> {};
struct ItemName : VString<23> {};
class BlockId : public Wrapped<uint32_t> { public: BlockId() : Wrapped<uint32_t>() {} protected: constexpr explicit BlockId(uint32_t a) : Wrapped<uint32_t>(a) {} };
inline
BlockId account_to_block(AccountId a) { return wrap<BlockId>(unwrap<AccountId>(a)); }
inline
AccountId block_to_account(BlockId b) { return wrap<AccountId>(unwrap<BlockId>(b)); }
#endif // TMWA_MAP_MAP_T_HPP