#ifndef TMWA_PROTO2_TYPES_HPP #define TMWA_PROTO2_TYPES_HPP // proto2/types.hpp - Forward declarations of packet component types // // 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 Affero 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . # include "fwd.hpp" //TODO split the includes # include # include "../ints/little.hpp" # include "../strings/vstring.hpp" # include "../net/ip.hpp" # include "../net/timer.t.hpp" # include "../mmo/enums.hpp" # include "../mmo/human_time_diff.hpp" # include "../mmo/ids.hpp" # include "../mmo/mmo.hpp" # include "../mmo/strs.hpp" # include "../mmo/utils.hpp" # include "../mmo/version.hpp" # include "../login/login.t.hpp" # include "../map/clif.t.hpp" # include "../map/skill.t.hpp" template bool native_to_network(T *network, T native) { *network = native; return true; } template bool network_to_native(T *native, T network) { *native = network; return true; } template struct NetString { char data[N]; }; template bool native_to_network(NetString *network, VString native) { // basically WBUF_STRING char *const begin = network->data; char *const end = begin + N; char *const mid = std::copy(native.begin(), native.end(), begin); std::fill(mid, end, '\0'); return true; } template bool network_to_native(VString *native, NetString network) { // basically RBUF_STRING const char *const begin = network.data; const char *const end = begin + N; const char *const mid = std::find(begin, end, '\0'); *native = XString(begin, mid, nullptr); return true; } inline bool native_to_network(NetString<24> *network, CharName native) { VString<23> tmp = native.to__actual(); bool rv = native_to_network(network, tmp); return rv; } inline bool network_to_native(CharName *native, NetString<24> network) { VString<23> tmp; bool rv = network_to_native(&tmp, network); *native = stringish(tmp); return rv; } inline bool native_to_network(NetString<16> *network, MapName native) { XString tmp = native; bool rv = native_to_network(network, VString<15>(tmp)); return rv; } inline bool network_to_native(MapName *native, NetString<16> network) { VString<15> tmp; bool rv = network_to_native(&tmp, network); *native = stringish(tmp); return rv; } template struct SkewedLength { T data; }; template bool native_to_network(SkewedLength *network, U native) { native -= N; return native_to_network(&network->data, native); } template bool network_to_native(U *native, SkewedLength network) { bool rv = network_to_native(native, network.data); *native += N; return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Byte *network, DIR native) { bool rv = true; uint8_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(DIR *native, Byte network) { bool rv = true; uint8_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Byte *network, BeingRemoveWhy native) { bool rv = true; uint8_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(BeingRemoveWhy *native, Byte network) { bool rv = true; uint8_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Little16 *network, Opt1 native) { bool rv = true; uint16_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(Opt1 *native, Little16 network) { bool rv = true; uint16_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Little16 *network, Opt2 native) { bool rv = true; uint16_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(Opt2 *native, Little16 network) { bool rv = true; uint16_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Little16 *network, Opt3 native) { bool rv = true; uint16_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(Opt3 *native, Little16 network) { bool rv = true; uint16_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Byte *network, ItemType native) { bool rv = true; uint8_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(ItemType *native, Byte network) { bool rv = true; uint8_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Byte *network, PickupFail native) { bool rv = true; uint8_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(PickupFail *native, Byte network) { bool rv = true; uint8_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Byte *network, DamageType native) { bool rv = true; uint8_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(DamageType *native, Byte network) { bool rv = true; uint8_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Little16 *network, SP native) { bool rv = true; uint16_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(SP *native, Little16 network) { bool rv = true; uint16_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Byte *network, LOOK native) { bool rv = true; uint8_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(LOOK *native, Byte network) { bool rv = true; uint8_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Little16 *network, SkillID native) { bool rv = true; uint16_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(SkillID *native, Little16 network) { bool rv = true; uint16_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Little16 *network, StatusChange native) { bool rv = true; uint16_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(StatusChange *native, Little16 network) { bool rv = true; uint16_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Little16 *network, SkillFlags native) { bool rv = true; uint16_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(SkillFlags *native, Little16 network) { bool rv = true; uint16_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Byte *network, SEX native) { bool rv = true; uint8_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(SEX *native, Byte network) { bool rv = true; uint8_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast(tmp); // TODO this is what really should be doing a checked cast return rv; } inline __attribute__((warn_unused_result)) bool native_to_network(Little16 *network, Option native) { bool rv = true; uint16_t tmp = static_cast(native); rv &= native_to_network(network, tmp); return rv; } inline __attribute__((warn_unused_result)) bool network_to_native(Option *native, Little16 network) { bool rv = true; uint16_t tmp; rv &= network_to_native(&tmp, network); *native = static_cast