diff options
Diffstat (limited to 'src/char/int_party.cpp')
-rw-r--r-- | src/char/int_party.cpp | 159 |
1 files changed, 80 insertions, 79 deletions
diff --git a/src/char/int_party.cpp b/src/char/int_party.cpp index c9ab5a4..5ee65ad 100644 --- a/src/char/int_party.cpp +++ b/src/char/int_party.cpp @@ -29,33 +29,32 @@ #include "../generic/db.hpp" #include "../io/cxxstdio.hpp" +#include "../io/extract.hpp" #include "../io/lock.hpp" #include "../io/read.hpp" #include "../io/write.hpp" -#include "../net/packets.hpp" - #include "../proto2/char-map.hpp" -#include "../mmo/extract.hpp" #include "../mmo/ids.hpp" -#include "../mmo/mmo.hpp" + +#include "../high/extract_mmo.hpp" +#include "../high/mmo.hpp" + +#include "../wire/packets.hpp" #include "char.hpp" +#include "globals.hpp" #include "inter.hpp" +#include "inter_conf.hpp" #include "../poison.hpp" namespace tmwa { -AString party_txt = "save/party.txt"_s; - -static -Map<PartyId, PartyMost> party_db; -static -PartyId party_newid = wrap<PartyId>(100_u32); - +namespace char_ +{ static void mapif_party_broken(PartyId party_id, int flag); static @@ -89,9 +88,10 @@ AString inter_party_tostr(PartyPair p) return AString(str); } +} // namespace char_ static -bool extract(XString str, PartyPair *pp) +bool impl_extract(XString str, PartyPair *pp) { PartyPair& p = *pp; @@ -129,6 +129,8 @@ bool extract(XString str, PartyPair *pp) return true; } +namespace char_ +{ static void party_check_deleted_init(PartyPair p) { @@ -153,7 +155,7 @@ void party_check_deleted_init(PartyPair p) // パーティデータのロード void inter_party_init(void) { - io::ReadFile in(party_txt); + io::ReadFile in(inter_conf.party_txt); if (!in.is_open()) return; @@ -171,19 +173,20 @@ void inter_party_init(void) } PartyMost pm; - PartyPair pp; - pp.party_most = ± + PartyPair pp{PartyId(), borrow(pm)}; if (extract(line, &pp) && pp.party_id) { if (party_newid < next(pp.party_id)) party_newid = next(pp.party_id); party_check_deleted_init(pp); party_db.insert(pp.party_id, pm); + // note: this is still referring to the noncanonical copy of + // the PartyMost pointer. This is okay, though. party_check_empty(pp); } else { - PRINTF("int_party: broken data [%s] line %d\n"_fmt, party_txt, + PRINTF("int_party: broken data [%s] line %d\n"_fmt, inter_conf.party_txt, c + 1); } c++; @@ -201,18 +204,16 @@ void inter_party_save_sub(PartyPair data, io::WriteFile& fp) // パーティーデータのセーブ int inter_party_save(void) { - io::WriteLock fp(party_txt); + io::WriteLock fp(inter_conf.party_txt); if (!fp.is_open()) { PRINTF("int_party: cant write [%s] !!! data is lost !!!\n"_fmt, - party_txt); + inter_conf.party_txt); return 1; } for (auto& pair : party_db) { - PartyPair tmp; - tmp.party_id = pair.first; - tmp.party_most = &pair.second; + PartyPair tmp{pair.first, borrow(pair.second)}; inter_party_save_sub(tmp, fp); } @@ -221,23 +222,21 @@ int inter_party_save(void) // パーティ名検索用 static -void search_partyname_sub(PartyPair p, PartyName str, PartyPair *dst) +void search_partyname_sub(PartyPair p, PartyName str, Borrowed<Option<PartyPair>> dst) { if (p->name == str) - *dst = p; + *dst = Some(p); } // パーティ名検索 static -PartyPair search_partyname(PartyName str) +Option<PartyPair> search_partyname(PartyName str) { - PartyPair p; + Option<PartyPair> p = None; for (auto& pair : party_db) { - PartyPair tmp; - tmp.party_id = pair.first; - tmp.party_most = &pair.second; - search_partyname_sub(tmp, str, &p); + PartyPair tmp{pair.first, borrow(pair.second)}; + search_partyname_sub(tmp, str, borrow(p)); } return p; @@ -262,11 +261,11 @@ int party_check_exp_share(PartyPair p) } } - return (maxlv == 0 || maxlv - minlv <= party_share_level); + return (maxlv == 0 || maxlv - minlv <= inter_conf.party_share_level); } // パーティが空かどうかチェック -int party_check_empty(PartyPair p) +int party_check_empty(const PartyPair p) { int i; @@ -313,9 +312,7 @@ void party_check_conflict(PartyId party_id, AccountId account_id, CharName nick) { for (auto& pair : party_db) { - PartyPair tmp; - tmp.party_id = pair.first; - tmp.party_most = &pair.second; + PartyPair tmp{pair.first, borrow(pair.second)}; party_check_conflict_sub(tmp, party_id, account_id, nick); } @@ -326,23 +323,27 @@ void party_check_conflict(PartyId party_id, AccountId account_id, CharName nick) // パーティ作成可否 static -void mapif_party_created(Session *s, AccountId account_id, PartyPair p) +void mapif_party_created(Session *s, AccountId account_id, Option<PartyPair> p_) { Packet_Fixed<0x3820> fixed_20; fixed_20.account_id = account_id; - if (p) - { - fixed_20.error = 0; - fixed_20.party_id = p.party_id; - fixed_20.party_name = p->name; - PRINTF("int_party: created! %d %s\n"_fmt, p.party_id, p->name); - } - else + OMATCH_BEGIN (p_) { - fixed_20.error = 1; - fixed_20.party_id = PartyId(); - fixed_20.party_name = stringish<PartyName>("error"_s); + OMATCH_CASE_SOME (p) + { + fixed_20.error = 0; + fixed_20.party_id = p.party_id; + fixed_20.party_name = p->name; + PRINTF("int_party: created! %d %s\n"_fmt, p.party_id, p->name); + } + OMATCH_CASE_NONE () + { + fixed_20.error = 1; + fixed_20.party_id = PartyId(); + fixed_20.party_name = stringish<PartyName>("error"_s); + } } + OMATCH_END (); send_fpacket<0x3820, 35>(s, fixed_20); } @@ -359,7 +360,7 @@ void mapif_party_noinfo(Session *s, PartyId party_id) // パーティ情報まとめ送り static -void mapif_party_info(Session *s, PartyPair p) +void mapif_party_info(Session *s, const PartyPair p) { Packet_Head<0x3821> head_21; head_21.party_id = p.party_id; @@ -490,22 +491,21 @@ void mapif_parse_CreateParty(Session *s, AccountId account_id, PartyName name, C if (!name.is_print()) { PRINTF("int_party: illegal party name [%s]\n"_fmt, name); - mapif_party_created(s, account_id, PartyPair()); + mapif_party_created(s, account_id, None); return; } } - if (search_partyname(name)) + if (search_partyname(name).is_some()) { PRINTF("int_party: same name party exists [%s]\n"_fmt, name); - mapif_party_created(s, account_id, PartyPair()); + mapif_party_created(s, account_id, None); return; } + PartyMost p {}; - PartyPair pp; - pp.party_most = &p; party_newid = next(party_newid); - pp.party_id = party_newid; + PartyPair pp{party_newid, borrow(p)}; p.name = name; p.exp = 0; p.item = 0; @@ -518,7 +518,8 @@ void mapif_parse_CreateParty(Session *s, AccountId account_id, PartyName name, C party_db.insert(pp.party_id, p); - mapif_party_created(s, account_id, pp); + // pointer to noncanonical version + mapif_party_created(s, account_id, Some(pp)); mapif_party_info(s, pp); } @@ -526,12 +527,19 @@ void mapif_parse_CreateParty(Session *s, AccountId account_id, PartyName name, C static void mapif_parse_PartyInfo(Session *s, PartyId party_id) { - PartyPair p; - p.party_most = party_db.search(party_id); - if (p) - mapif_party_info(s, p); - else - mapif_party_noinfo(s, party_id); + Option<P<PartyMost>> maybe_party_most = party_db.search(party_id); + OMATCH_BEGIN (maybe_party_most) + { + OMATCH_CASE_SOME (party_most) + { + mapif_party_info(s, PartyPair{party_id, party_most}); + } + OMATCH_CASE_NONE () + { + mapif_party_noinfo(s, party_id); + } + } + OMATCH_END (); } // パーティ追加要求 @@ -539,13 +547,13 @@ static void mapif_parse_PartyAddMember(Session *s, PartyId party_id, AccountId account_id, CharName nick, MapName map, int lv) { - PartyPair p; - p.party_most = party_db.search(party_id); - if (!p) - { - mapif_party_memberadded(s, party_id, account_id, 1); - return; - } + Option<P<PartyMost>> maybe_party_most = party_db.search(party_id); + P<PartyMost> party_most = TRY_UNWRAP(maybe_party_most, + { + mapif_party_memberadded(s, party_id, account_id, 1); + return; + }); + PartyPair p{party_id, party_most}; for (int i = 0; i < MAX_PARTY; i++) { @@ -580,10 +588,7 @@ static void mapif_parse_PartyChangeOption(Session *s, PartyId party_id, AccountId account_id, int exp, int item) { - PartyPair p; - p.party_most = party_db.search(party_id); - if (!p) - return; + PartyPair p{party_id, TRY_UNWRAP(party_db.search(party_id), return)}; p->exp = exp; int flag = 0; @@ -601,10 +606,8 @@ void mapif_parse_PartyChangeOption(Session *s, PartyId party_id, AccountId accou // パーティ脱退要求 void mapif_parse_PartyLeave(Session *, PartyId party_id, AccountId account_id) { - PartyPair p; - p.party_most = party_db.search(party_id); - if (!p) - return; + PartyPair p{party_id, TRY_UNWRAP(party_db.search(party_id), return)}; + for (int i = 0; i < MAX_PARTY; i++) { if (p->member[i].account_id != account_id) @@ -623,10 +626,7 @@ static void mapif_parse_PartyChangeMap(Session *s, PartyId party_id, AccountId account_id, MapName map, int online, int lv) { - PartyPair p; - p.party_most = party_db.search(party_id); - if (!p) - return; + PartyPair p{party_id, TRY_UNWRAP(party_db.search(party_id), return)}; for (int i = 0; i < MAX_PARTY; i++) { @@ -822,4 +822,5 @@ void inter_party_leave(PartyId party_id, AccountId account_id) { mapif_parse_PartyLeave(nullptr, party_id, account_id); } +} // namespace char_ } // namespace tmwa |