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/ids.hpp | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/mmo/ids.hpp (limited to 'src/mmo/ids.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 -- cgit v1.2.3-70-g09d2