summaryrefslogblamecommitdiff
path: root/src/map/map.t.hpp
blob: 10aeb759a736cfcd71cb64f428ce1fdbc3068b92 (plain) (tree)
1
2

                          




















                                                                           
                   
 

                   
                                  
 

                               
                          
                          
 

           





                                                                                 

                                         

                                                    

        
                           





















                             








                               



                             




                              








                       
       
        
        
         
          



                               
         
           
            

          




                   
           
        
        
        
        
        
        

                           
         

                   
        
         
          


                                                      
         




                       
         
           
         






              
         
        



                        
                     
                                    



                             
                     
                                    
                     
                                    
      
                                    
       
 
                     
                                    
                     
                                    
                     
                                    
                     
                                    
                     
                                    
 
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                                     
                     
                                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
 
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
 
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
                     
                                     
 
                     
                                     
 
      
                                     
                                     
                                     
                                     
       
 
                                     
 
                     
                                      
 
                     
                                       
      
                                       

       
                                       

       
                                       
       
                                       
      
                                       

       
                                       
       
 
      
                                       

       
                                       
       
                                       
                                       
                                       
      
                                       

       
                                       
       
                                       
      
                                       

       
                                       

       
                                       
       
                                       
      
                                       

       
                                       

       
                                       

       
                                       

       
                                       
       
                                       
      
                                       

       
                                       

       
                                       

       
                                       

       
                                       
       
 
      
                                       

       
                                       

       
                                       

       
                                       

       
                                       
       
 
      
                                       

       
                                       

       
                                       

       
                                       

       
                                       

       
                                       

       
                                       
       
                                       
                                       
      
                                       

       
                                       

       
                                       

       
                                       
       
 
                                       
      
                                       

       
                                       

       
                                       
       
 
      
                                       
       
                                       
                                       
                                       
                                       
      
                                       
       




                        
                                                                                         




                      
                                                                                         




                         
                                                                                          




                       
                                                                                          





                                       
 




                                       
 




                         
                        
                        
                        
                        
                        
                        
                        
                        
                        
                         
                         
                         
                         
 














                                             
                

















































                                                          
 






















                                                                     
                                         


                                                   





                               














                                




                                    
                                                                                                                                                                    




                                                                                     
                            
#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 <cstdint>

# include "../strings/vstring.hpp"

# include "../generic/enum.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