From ad049a15b43b7ddba3fe7d0a898652fc8022629d Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Tue, 22 Apr 2014 11:46:23 -0700 Subject: Use strict ID types Possibly some missing for the far side of the network. AccountId and BlockId are still terribly entangled. --- src/mmo/extract.cpp | 25 ++++++++++- src/mmo/extract.hpp | 45 ++++++++++--------- src/mmo/extract_test.cpp | 2 + src/mmo/fwd.hpp | 37 ++++++++++++++++ src/mmo/ids.cpp | 21 +++++++++ src/mmo/ids.hpp | 109 +++++++++++++++++++++++++++++++++++++++++++++++ src/mmo/mmo.hpp | 32 +++++++------- src/mmo/socket.cpp | 3 ++ src/mmo/socket.hpp | 3 +- src/mmo/utils.hpp | 2 +- src/mmo/version.hpp | 2 +- 11 files changed, 241 insertions(+), 40 deletions(-) create mode 100644 src/mmo/fwd.hpp create mode 100644 src/mmo/ids.cpp create mode 100644 src/mmo/ids.hpp (limited to 'src/mmo') diff --git a/src/mmo/extract.cpp b/src/mmo/extract.cpp index 378986d..f25126f 100644 --- a/src/mmo/extract.cpp +++ b/src/mmo/extract.cpp @@ -22,6 +22,8 @@ #include "../strings/xstring.hpp" #include "../strings/vstring.hpp" +#include "mmo.hpp" + #include "../poison.hpp" bool extract(XString str, XString *rv) @@ -47,7 +49,7 @@ bool extract(XString str, struct item *it) XString ignored; return extract(str, record<',', 11>( - &it->id, + &ignored, &it->nameid, &it->amount, &it->equip, @@ -60,3 +62,24 @@ bool extract(XString str, struct item *it) &ignored, &ignored)); } + +bool extract(XString str, MapName *m) +{ + XString::iterator it = std::find(str.begin(), str.end(), '.'); + str = str.xislice_h(it); + VString<15> tmp; + bool rv = extract(str, &tmp); + *m = tmp; + return rv; +} + +bool extract(XString str, CharName *out) +{ + VString<23> tmp; + if (extract(str, &tmp)) + { + *out = CharName(tmp); + return true; + } + return false; +} diff --git a/src/mmo/extract.hpp b/src/mmo/extract.hpp index f3df0f3..ab65661 100644 --- a/src/mmo/extract.hpp +++ b/src/mmo/extract.hpp @@ -19,7 +19,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -# include "../sanity.hpp" +# include "fwd.hpp" # include # include @@ -27,11 +27,17 @@ # include # include +# include "../ints/wrap.hpp" + # include "../strings/xstring.hpp" -# include "mmo.hpp" +# include "../generic/enum.hpp" + # include "utils.hpp" +template +bool do_extract(XString str, T t); + template::value && !std::is_same::value && !std::is_same::value>::type> bool extract(XString str, T *iv) { @@ -98,6 +104,12 @@ bool extract(XString str, VString *out) return true; } +inline +bool extract(XString str, LString exact) +{ + return str == exact; +} + template class LStripper { @@ -200,27 +212,20 @@ bool extract(XString str, struct global_reg *var); bool extract(XString str, struct item *it); -inline -bool extract(XString str, MapName *m) -{ - XString::iterator it = std::find(str.begin(), str.end(), '.'); - str = str.xislice_h(it); - VString<15> tmp; - bool rv = extract(str, &tmp); - *m = tmp; - return rv; +bool extract(XString str, MapName *m); + +bool extract(XString str, CharName *out); + +template +bool do_extract(XString str, T t) +{ + return extract(str, t); } -inline -bool extract(XString str, CharName *out) +template +bool extract(XString str, Wrapped *w) { - VString<23> tmp; - if (extract(str, &tmp)) - { - *out = CharName(tmp); - return true; - } - return false; + return extract(str, &w->_value); } #endif // TMWA_MMO_EXTRACT_HPP diff --git a/src/mmo/extract_test.cpp b/src/mmo/extract_test.cpp index c405de1..126cb14 100644 --- a/src/mmo/extract_test.cpp +++ b/src/mmo/extract_test.cpp @@ -22,6 +22,8 @@ #include "../strings/xstring.hpp" +#include "mmo.hpp" + #include "../poison.hpp" TEST(extract, record_int) diff --git a/src/mmo/fwd.hpp b/src/mmo/fwd.hpp new file mode 100644 index 0000000..f9c176c --- /dev/null +++ b/src/mmo/fwd.hpp @@ -0,0 +1,37 @@ +#ifndef TMWA_MMO_FWD_HPP +#define TMWA_MMO_FWD_HPP +// mmo/fwd.hpp - list of type names for mmo lib +// +// Copyright © 2014 Ben Longbons +// +// 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 . + +# include "../sanity.hpp" + +// meh, add more when I feel like it +class MapName; +class CharName; + +class Session; + +class AccountId; +class CharId; +class PartyId; +class ItemUnkId; +class ItemNameId; +class GmLevel; + +#endif // TMWA_MMO_FWD_HPP diff --git a/src/mmo/ids.cpp b/src/mmo/ids.cpp new file mode 100644 index 0000000..971013b --- /dev/null +++ b/src/mmo/ids.cpp @@ -0,0 +1,21 @@ +#include "ids.hpp" +// ids.cpp - special integer classes for various object IDs +// +// Copyright © 2014 Ben Longbons +// +// 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 . + +#include "../poison.hpp" diff --git a/src/mmo/ids.hpp b/src/mmo/ids.hpp new file mode 100644 index 0000000..71164ff --- /dev/null +++ b/src/mmo/ids.hpp @@ -0,0 +1,109 @@ +#ifndef TMWA_MMO_IDS_HPP +#define TMWA_MMO_IDS_HPP +// ids.hpp - special integer classes for various object IDs +// +// Copyright © 2014 Ben Longbons +// +// 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 . + +# include "fwd.hpp" + +# include "../ints/wrap.hpp" + +# include "extract.hpp" + +class Species : public Wrapped { public: explicit operator bool() const = delete; bool operator !() const = delete; Species() : Wrapped() {} protected: template constexpr explicit Species(A... a) : Wrapped(a...) {} }; + +class AccountId : public Wrapped { public: AccountId() : Wrapped() {} protected: template constexpr explicit AccountId(A... a) : Wrapped(a...) {} }; +class CharId : public Wrapped { public: CharId() : Wrapped() {} protected: template constexpr explicit CharId(A... a) : Wrapped(a...) {} }; +// important note: slave mobs synthesize PartyId as -BlockId of master +class PartyId : public Wrapped { public: PartyId() : Wrapped() {} protected: template constexpr explicit PartyId(A... a) : Wrapped(a...) {} }; +class ItemNameId : public Wrapped { public: ItemNameId() : Wrapped() {} protected: template constexpr explicit ItemNameId(A... a) : Wrapped(a...) {} }; + +class GmLevel +{ + uint32_t bits; + + friend bool extract(XString str, GmLevel *lvl) { return extract(str, &lvl->bits); } + constexpr explicit + GmLevel(uint32_t b) : bits(b) {} + constexpr explicit + operator uint32_t() { return bits; } + + template + explicit + GmLevel(T) = delete; + template::value && !std::is_same::value>::type> + explicit + operator T() = delete; +public: + constexpr + GmLevel() : bits() {} + constexpr static + GmLevel from(uint32_t bits) { return GmLevel(bits); } + template + constexpr static + GmLevel from(T) = delete; + + constexpr explicit + operator bool() const { return bits; } + constexpr + bool operator !() const { return !bits; } + + // the argument is the level of a command + constexpr + bool satisfies(GmLevel perm) { return bits >= perm.bits; } + // the argument is another player's gm level, for info commands + constexpr + bool detects(GmLevel other) { return bits >= other.bits; } + // the argument is another player's gm level, for aggressive commands + constexpr + bool overwhelms(GmLevel other) { return bits >= other.bits; } + // the argument is another potential permission level + constexpr + bool obsoletes(GmLevel plvl) { return bits >= plvl.bits; } + + constexpr + uint16_t get_public_word() const + { + return (bits == 60 || bits == 99) ? 0x0080 : 0; + } + + constexpr + uint32_t get_all_bits() const + { + return bits; + } + + friend constexpr + bool operator == (GmLevel l, GmLevel r) + { + return l.bits == r.bits; + } + friend constexpr + bool operator != (GmLevel l, GmLevel r) + { + return l.bits != r.bits; + } +}; + +inline +uint32_t convert_for_printf(GmLevel g) +{ + return g.get_all_bits(); +} + +#endif // TMWA_MMO_IDS_HPP diff --git a/src/mmo/mmo.hpp b/src/mmo/mmo.hpp index 3fba7e6..fdfc478 100644 --- a/src/mmo/mmo.hpp +++ b/src/mmo/mmo.hpp @@ -21,7 +21,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -# include "../sanity.hpp" +# include "fwd.hpp" # include "../compat/memory.hpp" @@ -29,6 +29,7 @@ # include "../generic/enum.hpp" +# include "ids.hpp" # include "timer.t.hpp" // affects CharName @@ -199,8 +200,7 @@ using e::EPOS; struct item { - int id; - short nameid; + ItemNameId nameid; short amount; EPOS equip; }; @@ -322,28 +322,28 @@ SEX sex_from_char(char c) struct CharKey { CharName name; - int account_id; - int char_id; + AccountId account_id; + CharId char_id; unsigned char char_num; }; struct CharData { - int partner_id; + CharId partner_id; int base_exp, job_exp, zeny; - short species; + Species species; short status_point, skill_point; int hp, max_hp, sp, max_sp; Option option; short karma, manner; short hair, hair_color, clothes_color; - int party_id; + PartyId party_id; ItemLook weapon; - short shield; - short head_top, head_mid, head_bottom; + ItemNameId shield; + ItemNameId head_top, head_mid, head_bottom; unsigned char base_level, job_level; earray attrs; @@ -375,8 +375,8 @@ struct CharPair struct storage { - int dirty; - int account_id; + bool dirty; + AccountId account_id; short storage_status; short storage_amount; Array storage_; @@ -384,13 +384,13 @@ struct storage struct GM_Account { - int account_id; - uint8_t level; + AccountId account_id; + GmLevel level; }; struct party_member { - int account_id; + AccountId account_id; CharName name; MapName map; int leader, online, lv; @@ -399,7 +399,7 @@ struct party_member struct party { - int party_id; + PartyId party_id; PartyName name; int exp; int item; diff --git a/src/mmo/socket.cpp b/src/mmo/socket.cpp index 2fec6c1..79857b1 100644 --- a/src/mmo/socket.cpp +++ b/src/mmo/socket.cpp @@ -33,7 +33,10 @@ #include #include +#include "../compat/memory.hpp" + #include "../io/cxxstdio.hpp" + #include "core.hpp" #include "timer.hpp" #include "utils.hpp" diff --git a/src/mmo/socket.hpp b/src/mmo/socket.hpp index c166794..f62ca7a 100644 --- a/src/mmo/socket.hpp +++ b/src/mmo/socket.hpp @@ -21,13 +21,14 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -# include "../sanity.hpp" +# include "fwd.hpp" # include # include # include +# include # include "../compat/rawmem.hpp" diff --git a/src/mmo/utils.hpp b/src/mmo/utils.hpp index 3002866..ed48ad0 100644 --- a/src/mmo/utils.hpp +++ b/src/mmo/utils.hpp @@ -21,7 +21,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -# include "../sanity.hpp" +# include "fwd.hpp" # include diff --git a/src/mmo/version.hpp b/src/mmo/version.hpp index 1cec0ba..9e20bf1 100644 --- a/src/mmo/version.hpp +++ b/src/mmo/version.hpp @@ -21,7 +21,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -# include "../sanity.hpp" +# include "fwd.hpp" # include -- cgit v1.2.3-70-g09d2