summaryrefslogtreecommitdiff
path: root/src/mmo
diff options
context:
space:
mode:
authorBen Longbons <b.r.longbons@gmail.com>2014-05-12 16:04:46 -0700
committerBen Longbons <b.r.longbons@gmail.com>2014-05-12 17:29:01 -0700
commit794c162c9e92cbcdad73cb82f545876a47afae92 (patch)
tree3b663d40f96fc32d0848d0ae513185bdd4367a92 /src/mmo
parentc87b1dc338eadc68accac02563a487d7d8e1c9a0 (diff)
downloadtmwa-794c162c9e92cbcdad73cb82f545876a47afae92.tar.gz
tmwa-794c162c9e92cbcdad73cb82f545876a47afae92.tar.bz2
tmwa-794c162c9e92cbcdad73cb82f545876a47afae92.tar.xz
tmwa-794c162c9e92cbcdad73cb82f545876a47afae92.zip
Implement proto v2
Diffstat (limited to 'src/mmo')
-rw-r--r--src/mmo/enums.cpp21
-rw-r--r--src/mmo/enums.hpp148
-rw-r--r--src/mmo/ids.hpp27
-rw-r--r--src/mmo/mmo.hpp220
-rw-r--r--src/mmo/strs.cpp21
-rw-r--r--src/mmo/strs.hpp125
-rw-r--r--src/mmo/utils.hpp36
7 files changed, 380 insertions, 218 deletions
diff --git a/src/mmo/enums.cpp b/src/mmo/enums.cpp
new file mode 100644
index 0000000..fe01c5d
--- /dev/null
+++ b/src/mmo/enums.cpp
@@ -0,0 +1,21 @@
+#include "enums.hpp"
+// enums.cpp - Common enumerated types
+//
+// Copyright © 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 "../poison.hpp"
diff --git a/src/mmo/enums.hpp b/src/mmo/enums.hpp
new file mode 100644
index 0000000..a7dcc89
--- /dev/null
+++ b/src/mmo/enums.hpp
@@ -0,0 +1,148 @@
+#ifndef TMWA_MMO_ENUMS_HPP
+#define TMWA_MMO_ENUMS_HPP
+// enums.hpp - Common enumerated types
+//
+// 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 "../generic/enum.hpp"
+
+enum class SkillID : uint16_t;
+constexpr SkillID MAX_SKILL = SkillID(474); // not 450
+constexpr SkillID get_enum_min_value(SkillID) { return SkillID(); }
+constexpr SkillID get_enum_max_value(SkillID) { return MAX_SKILL; }
+
+namespace e
+{
+enum class EPOS : uint16_t
+{
+ ZERO = 0x0000,
+
+ LEGS = 0x0001,
+ WEAPON = 0x0002,
+ GLOVES = 0x0004,
+ CAPE = 0x0008,
+ MISC1 = 0x0010,
+ SHIELD = 0x0020,
+ SHOES = 0x0040,
+ MISC2 = 0x0080,
+ HAT = 0x0100,
+ TORSO = 0x0200,
+
+ ARROW = 0x8000,
+};
+ENUM_BITWISE_OPERATORS(EPOS)
+
+constexpr EPOS get_enum_min_value(EPOS) { return EPOS(0x0000); }
+constexpr EPOS get_enum_max_value(EPOS) { return EPOS(0xffff); }
+}
+using e::EPOS;
+
+namespace e
+{
+enum class SkillFlags : uint16_t;
+}
+using e::SkillFlags;
+
+// Option and Opt1..3 in map.hpp
+namespace e
+{
+enum class Option : uint16_t;
+constexpr Option get_enum_min_value(Option) { return Option(0x0000); }
+constexpr Option get_enum_max_value(Option) { return Option(0xffff); }
+}
+using e::Option;
+
+enum class ATTR
+{
+ STR = 0,
+ AGI = 1,
+ VIT = 2,
+ INT = 3,
+ DEX = 4,
+ LUK = 5,
+
+ COUNT = 6,
+};
+
+constexpr ATTR ATTRs[6] =
+{
+ ATTR::STR,
+ ATTR::AGI,
+ ATTR::VIT,
+ ATTR::INT,
+ ATTR::DEX,
+ ATTR::LUK,
+};
+
+enum class ItemLook : uint16_t
+{
+ NONE = 0,
+ BLADE = 1, // or some other common weapons
+ _2,
+ SETZER_AND_SCYTHE = 3,
+ _6,
+ STAFF = 10,
+ BOW = 11,
+ _13 = 13,
+ _14 = 14,
+ _16 = 16,
+ SINGLE_HANDED_COUNT = 17,
+
+ DUAL_BLADE = 0x11,
+ DUAL_2 = 0x12,
+ DUAL_6 = 0x13,
+ DUAL_12 = 0x14,
+ DUAL_16 = 0x15,
+ DUAL_26 = 0x16,
+};
+
+enum class SEX : uint8_t
+{
+ FEMALE = 0,
+ MALE = 1,
+ // For items. This is also used as error, sometime.
+ NEUTRAL = 2,
+};
+inline
+char sex_to_char(SEX sex)
+{
+ switch (sex)
+ {
+ case SEX::FEMALE: return 'F';
+ case SEX::MALE: return 'M';
+ default: return '\0';
+ }
+}
+inline
+SEX sex_from_char(char c)
+{
+ switch (c)
+ {
+ case 'F': return SEX::FEMALE;
+ case 'M': return SEX::MALE;
+ default: return SEX::NEUTRAL;
+ }
+}
+
+#endif // TMWA_MMO_ENUMS_HPP
diff --git a/src/mmo/ids.hpp b/src/mmo/ids.hpp
index 3c5b1ba..ed5ab58 100644
--- a/src/mmo/ids.hpp
+++ b/src/mmo/ids.hpp
@@ -21,6 +21,7 @@
# include "fwd.hpp"
+# include "../ints/little.hpp"
# include "../ints/wrap.hpp"
# include "extract.hpp"
@@ -33,6 +34,8 @@ class CharId : public Wrapped<uint32_t> { public: CharId() : Wrapped<uint32_t>()
class PartyId : public Wrapped<uint32_t> { public: PartyId() : Wrapped<uint32_t>() {} protected: constexpr explicit PartyId(uint32_t a) : Wrapped<uint32_t>(a) {} };
class ItemNameId : public Wrapped<uint16_t> { public: ItemNameId() : Wrapped<uint16_t>() {} protected: constexpr explicit ItemNameId(uint16_t a) : Wrapped<uint16_t>(a) {} };
+class BlockId : public Wrapped<uint32_t> { public: BlockId() : Wrapped<uint32_t>() {} protected: constexpr explicit BlockId(uint32_t a) : Wrapped<uint32_t>(a) {} };
+
class GmLevel
{
uint32_t bits;
@@ -98,6 +101,30 @@ public:
{
return l.bits != r.bits;
}
+
+ friend
+ bool native_to_network(Byte *network, GmLevel native)
+ {
+ network->value = native.bits;
+ return true; // LIES. But this code is going away soon anyway
+ }
+ friend
+ bool network_to_native(GmLevel *native, Byte network)
+ {
+ native->bits = network.value;
+ return true; // LIES. But this code is going away soon anyway
+ }
+
+ friend
+ bool native_to_network(Little32 *network, GmLevel native)
+ {
+ return native_to_network(network, native.bits);
+ }
+ friend
+ bool network_to_native(GmLevel *native, Little32 network)
+ {
+ return network_to_native(&native->bits, network);
+ }
};
inline
diff --git a/src/mmo/mmo.hpp b/src/mmo/mmo.hpp
index c72d815..a0cee57 100644
--- a/src/mmo/mmo.hpp
+++ b/src/mmo/mmo.hpp
@@ -27,17 +27,13 @@
# include "../compat/memory.hpp"
-# include "../strings/vstring.hpp"
-
# include "../generic/array.hpp"
-# include "../generic/enum.hpp"
# include "../net/timer.t.hpp"
+# include "enums.hpp"
# include "ids.hpp"
-
-// affects CharName
-# define NAME_IGNORING_CASE 1
+# include "strs.hpp"
constexpr int FIFOSIZE_SERVERLINK = 256 * 1024;
@@ -47,11 +43,6 @@ constexpr int MAX_AMOUNT = 30000;
constexpr int MAX_ZENY = 1000000000; // 1G zeny
constexpr int TRADE_MAX = 10;
-enum class SkillID : uint16_t;
-constexpr SkillID MAX_SKILL = SkillID(474); // not 450
-constexpr SkillID get_enum_min_value(SkillID) { return SkillID(); }
-constexpr SkillID get_enum_max_value(SkillID) { return MAX_SKILL; }
-
constexpr int GLOBAL_REG_NUM = 96;
constexpr int ACCOUNT_REG_NUM = 16;
constexpr int ACCOUNT_REG2_NUM = 16;
@@ -68,126 +59,6 @@ constexpr int MAX_PARTY = 12;
# define MIN_CLOTH_COLOR battle_config.min_cloth_color
# define MAX_CLOTH_COLOR battle_config.max_cloth_color
-struct AccountName : VString<23> {};
-struct AccountPass : VString<23> {};
-struct AccountCrypt : VString<39> {};
-struct AccountEmail : VString<39> {};
-struct ServerName : VString<19> {};
-struct PartyName : VString<23> {};
-struct VarName : VString<31> {};
-
-# define DEFAULT_EMAIL stringish<AccountEmail>("a@a.com"_s)
-
-// It is decreed: a mapname shall not contain an extension
-class MapName : public strings::_crtp_string<MapName, MapName, strings::ZPair>
-{
- VString<15> _impl;
-public:
- MapName() = default;
- MapName(VString<15> v) : _impl(v.xislice_h(std::find(v.begin(), v.end(), '.'))) {}
-
- iterator begin() const { return &*_impl.begin(); }
- iterator end() const { return &*_impl.end(); }
- const char *c_str() const { return _impl.c_str(); }
-
- operator RString() const { return _impl; }
- operator AString() const { return _impl; }
- operator TString() const { return _impl; }
- operator SString() const { return _impl; }
- operator ZString() const { return _impl; }
- operator XString() const { return _impl; }
-};
-template<>
-inline
-MapName stringish<MapName>(VString<15> iv)
-{
- return iv;
-}
-inline
-const char *decay_for_printf(const MapName& vs) { return vs.c_str(); }
-
-// It is decreed: a charname is sometimes case sensitive
-struct CharName
-{
-private:
- VString<23> _impl;
-public:
- CharName() = default;
- explicit CharName(VString<23> name)
- : _impl(name)
- {}
-
- VString<23> to__actual() const
- {
- return _impl;
- }
- VString<23> to__lower() const
- {
- return _impl.to_lower();
- }
- VString<23> to__upper() const
- {
- return _impl.to_upper();
- }
- VString<23> to__canonical() const
- {
-# if NAME_IGNORING_CASE == 0
- return to__actual();
-# endif
-# if NAME_IGNORING_CASE == 1
- return to__lower();
-# endif
- }
-
- friend bool operator == (const CharName& l, const CharName& r)
- { return l.to__canonical() == r.to__canonical(); }
- friend bool operator != (const CharName& l, const CharName& r)
- { return l.to__canonical() != r.to__canonical(); }
- friend bool operator < (const CharName& l, const CharName& r)
- { return l.to__canonical() < r.to__canonical(); }
- friend bool operator <= (const CharName& l, const CharName& r)
- { return l.to__canonical() <= r.to__canonical(); }
- friend bool operator > (const CharName& l, const CharName& r)
- { return l.to__canonical() > r.to__canonical(); }
- friend bool operator >= (const CharName& l, const CharName& r)
- { return l.to__canonical() >= r.to__canonical(); }
-
- friend
- VString<23> convert_for_printf(const CharName& vs) { return vs.to__actual(); }
-};
-template<>
-inline
-CharName stringish<CharName>(VString<23> iv)
-{
- return CharName(iv);
-}
-
-namespace e
-{
-enum class EPOS : uint16_t
-{
- ZERO = 0x0000,
-
- LEGS = 0x0001,
- WEAPON = 0x0002,
- GLOVES = 0x0004,
- CAPE = 0x0008,
- MISC1 = 0x0010,
- SHIELD = 0x0020,
- SHOES = 0x0040,
- MISC2 = 0x0080,
- HAT = 0x0100,
- TORSO = 0x0200,
-
- ARROW = 0x8000,
-};
-ENUM_BITWISE_OPERATORS(EPOS)
-
-constexpr EPOS get_enum_min_value(EPOS) { return EPOS(0x0000); }
-constexpr EPOS get_enum_max_value(EPOS) { return EPOS(0xffff); }
-}
-using e::EPOS;
-
struct item
{
ItemNameId nameid;
@@ -201,12 +72,6 @@ struct point
short x, y;
};
-namespace e
-{
-enum class SkillFlags : uint16_t;
-}
-using e::SkillFlags;
-
struct skill_value
{
unsigned short lv;
@@ -228,87 +93,6 @@ struct global_reg
int value;
};
-// Option and Opt1..3 in map.hpp
-namespace e
-{
-enum class Option : uint16_t;
-constexpr Option get_enum_min_value(Option) { return Option(0x0000); }
-constexpr Option get_enum_max_value(Option) { return Option(0xffff); }
-}
-using e::Option;
-
-enum class ATTR
-{
- STR = 0,
- AGI = 1,
- VIT = 2,
- INT = 3,
- DEX = 4,
- LUK = 5,
-
- COUNT = 6,
-};
-
-constexpr ATTR ATTRs[6] =
-{
- ATTR::STR,
- ATTR::AGI,
- ATTR::VIT,
- ATTR::INT,
- ATTR::DEX,
- ATTR::LUK,
-};
-
-enum class ItemLook : uint16_t
-{
- NONE = 0,
- BLADE = 1, // or some other common weapons
- _2,
- SETZER_AND_SCYTHE = 3,
- _6,
- STAFF = 10,
- BOW = 11,
- _13 = 13,
- _14 = 14,
- _16 = 16,
- SINGLE_HANDED_COUNT = 17,
-
- DUAL_BLADE = 0x11,
- DUAL_2 = 0x12,
- DUAL_6 = 0x13,
- DUAL_12 = 0x14,
- DUAL_16 = 0x15,
- DUAL_26 = 0x16,
-};
-
-enum class SEX : uint8_t
-{
- FEMALE = 0,
- MALE = 1,
- // For items. This is also used as error, sometime.
- NEUTRAL = 2,
-};
-inline
-char sex_to_char(SEX sex)
-{
- switch (sex)
- {
- case SEX::FEMALE: return 'F';
- case SEX::MALE: return 'M';
- default: return '\0';
- }
-}
-inline
-SEX sex_from_char(char c)
-{
- switch (c)
- {
- case 'F': return SEX::FEMALE;
- case 'M': return SEX::MALE;
- default: return SEX::NEUTRAL;
- }
-}
-
struct CharKey
{
CharName name;
diff --git a/src/mmo/strs.cpp b/src/mmo/strs.cpp
new file mode 100644
index 0000000..979d6ac
--- /dev/null
+++ b/src/mmo/strs.cpp
@@ -0,0 +1,21 @@
+#include "strs.hpp"
+// strs.cpp - common string types
+//
+// Copyright © 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 "../poison.hpp"
diff --git a/src/mmo/strs.hpp b/src/mmo/strs.hpp
new file mode 100644
index 0000000..ad2a1b5
--- /dev/null
+++ b/src/mmo/strs.hpp
@@ -0,0 +1,125 @@
+#ifndef TMWA_MMO_STRS_HPP
+#define TMWA_MMO_STRS_HPP
+// strs.hpp - common string types
+//
+// 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"
+
+// affects CharName
+# define NAME_IGNORING_CASE 1
+
+struct AccountName : VString<23> {};
+struct AccountPass : VString<23> {};
+struct AccountCrypt : VString<39> {};
+struct AccountEmail : VString<39> {};
+struct ServerName : VString<19> {};
+struct PartyName : VString<23> {};
+struct VarName : VString<31> {};
+
+# define DEFAULT_EMAIL stringish<AccountEmail>("a@a.com"_s)
+
+// It is decreed: a mapname shall not contain an extension
+class MapName : public strings::_crtp_string<MapName, MapName, strings::ZPair>
+{
+ VString<15> _impl;
+public:
+ MapName() = default;
+ MapName(VString<15> v) : _impl(v.xislice_h(std::find(v.begin(), v.end(), '.'))) {}
+
+ iterator begin() const { return &*_impl.begin(); }
+ iterator end() const { return &*_impl.end(); }
+ const char *c_str() const { return _impl.c_str(); }
+
+ operator RString() const { return _impl; }
+ operator AString() const { return _impl; }
+ operator TString() const { return _impl; }
+ operator SString() const { return _impl; }
+ operator ZString() const { return _impl; }
+ operator XString() const { return _impl; }
+};
+template<>
+inline
+MapName stringish<MapName>(VString<15> iv)
+{
+ return iv;
+}
+inline
+const char *decay_for_printf(const MapName& vs) { return vs.c_str(); }
+
+// It is decreed: a charname is sometimes case sensitive
+struct CharName
+{
+private:
+ VString<23> _impl;
+public:
+ CharName() = default;
+ explicit CharName(VString<23> name)
+ : _impl(name)
+ {}
+
+ VString<23> to__actual() const
+ {
+ return _impl;
+ }
+ VString<23> to__lower() const
+ {
+ return _impl.to_lower();
+ }
+ VString<23> to__upper() const
+ {
+ return _impl.to_upper();
+ }
+ VString<23> to__canonical() const
+ {
+# if NAME_IGNORING_CASE == 0
+ return to__actual();
+# endif
+# if NAME_IGNORING_CASE == 1
+ return to__lower();
+# endif
+ }
+
+ friend bool operator == (const CharName& l, const CharName& r)
+ { return l.to__canonical() == r.to__canonical(); }
+ friend bool operator != (const CharName& l, const CharName& r)
+ { return l.to__canonical() != r.to__canonical(); }
+ friend bool operator < (const CharName& l, const CharName& r)
+ { return l.to__canonical() < r.to__canonical(); }
+ friend bool operator <= (const CharName& l, const CharName& r)
+ { return l.to__canonical() <= r.to__canonical(); }
+ friend bool operator > (const CharName& l, const CharName& r)
+ { return l.to__canonical() > r.to__canonical(); }
+ friend bool operator >= (const CharName& l, const CharName& r)
+ { return l.to__canonical() >= r.to__canonical(); }
+
+ friend
+ VString<23> convert_for_printf(const CharName& vs) { return vs.to__actual(); }
+};
+template<>
+inline
+CharName stringish<CharName>(VString<23> iv)
+{
+ return CharName(iv);
+}
+
+#endif // TMWA_MMO_STRS_HPP
diff --git a/src/mmo/utils.hpp b/src/mmo/utils.hpp
index 9837358..ddfbca6 100644
--- a/src/mmo/utils.hpp
+++ b/src/mmo/utils.hpp
@@ -27,6 +27,8 @@
# include <type_traits>
+# include "../ints/little.hpp"
+
# include "../strings/fwd.hpp"
# include "../strings/vstring.hpp"
@@ -107,6 +109,40 @@ long long& convert_for_scanf(TimeT& t)
return t.value;
}
+// 2038 problem
+inline __attribute__((warn_unused_result))
+bool native_to_network(Little32 *net, TimeT nat)
+{
+ time_t tmp = nat;
+ return native_to_network(net, static_cast<uint32_t>(tmp));
+}
+
+inline __attribute__((warn_unused_result))
+bool network_to_native(TimeT *nat, Little32 net)
+{
+ uint32_t tmp;
+ bool rv = network_to_native(&tmp, net);
+ *nat = static_cast<time_t>(tmp);
+ return rv;
+}
+
+inline __attribute__((warn_unused_result))
+bool native_to_network(Little64 *net, TimeT nat)
+{
+ time_t tmp = nat;
+ return native_to_network(net, static_cast<uint64_t>(tmp));
+}
+
+inline __attribute__((warn_unused_result))
+bool network_to_native(TimeT *nat, Little64 net)
+{
+ uint64_t tmp;
+ bool rv = network_to_native(&tmp, net);
+ *nat = static_cast<time_t>(tmp);
+ return rv;
+}
+
+
struct timestamp_seconds_buffer : VString<19> {};
struct timestamp_milliseconds_buffer : VString<23> {};
void stamp_time(timestamp_seconds_buffer&, const TimeT *t=nullptr);