summaryrefslogtreecommitdiff
path: root/src/char/int_party.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/char/int_party.cpp')
-rw-r--r--src/char/int_party.cpp159
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 = &pm;
+ 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