Skip to content

Commit

Permalink
refactor: Player CardList
Browse files Browse the repository at this point in the history
调整PL角色卡索引的形式
  • Loading branch information
mystringEmpty committed Mar 18, 2024
1 parent 314c015 commit 4ab3650
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 75 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ jobs:
- name: Package Clear
uses: actions/delete-package-versions@v4
with:
package-name: aws-c-cal_${{ matrix.triplet }}
package-name: aws-checksums_${{ matrix.triplet }}
package-type: nuget
min-versions-to-keep: 1
token: ${{ secrets.GITHUB_TOKEN }}
Expand Down Expand Up @@ -148,7 +148,7 @@ jobs:
- name: Package Clear
uses: actions/delete-package-versions@v4
with:
package-name: aws-c-cal_${{ matrix.triplet }}
package-name: aws-checksums_${{ matrix.triplet }}
package-type: nuget
min-versions-to-keep: 0
token: ${{ secrets.GITHUB_TOKEN }}
Expand Down Expand Up @@ -261,7 +261,7 @@ jobs:
- name: Package Clear
uses: actions/delete-package-versions@v4
with:
package-name: aws-c-cal_${{ matrix.triplet }}
package-name: aws-checksums_${{ matrix.triplet }}
package-type: nuget
min-versions-to-keep: 0
token: ${{ secrets.GITHUB_TOKEN }}
Expand Down
99 changes: 59 additions & 40 deletions Dice/CharacterCard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -506,75 +506,86 @@ Player& getPlayer(long long uid)
//if (!PList.count(uid))PList[uid] = {};
return PList[uid];
}
int Player::changeCard(const string& name, long long group)
{
if (name.empty())
{
mGroupCard.erase(group);
return 1;
}
if (!NameList.count(name))return -5;
mGroupCard[group] = NameList[name];
return 0;
}
int Player::removeCard(const string& name){
std::lock_guard<std::mutex> lock_queue(cardMutex);
if (!mNameIndex.count(name))return -5;
const auto id = mNameIndex[name];
if (!NameList.count(name))return -5;
const auto id = NameList[name]->getID();
if (!id)return -7;
if (auto pc = mCardList[id]; pc->locked("q")) return -21;
auto it = mGroupIndex.cbegin();
while (it != mGroupIndex.cend())
auto it = mGroupCard.cbegin();
while (it != mGroupCard.cend())
{
if (it->second == id)
if (it->second->getID() == id)
{
it = mGroupIndex.erase(it);
it = mGroupCard.erase(it);
}
else
{
++it;
}
}
mCardList.erase(mNameIndex[name]);
mCardList.erase(id);
while (!mCardList.count(indexMax))indexMax--;
mNameIndex.erase(name);
NameList.erase(name);
return 0;
}
int Player::renameCard(const string& name, const string& name_new) {
std::lock_guard<std::mutex> lock_queue(cardMutex);
if (name_new.empty())return -3;
if (mNameIndex.count(name_new))return -4;
if (NameList.count(name_new))return -4;
if (name_new.find(":") != string::npos)return -6;
const int i = mNameIndex[name];
const auto i = NameList[name]->getID();
if (mCardList[i]->locked("n"))return -22;
mNameIndex[name_new] = mNameIndex[name];
mNameIndex.erase(name);
NameList[name_new] = NameList[name];
NameList.erase(name);
mCardList[i]->setName(name_new);
return 0;
}
int Player::copyCard(const string& name1, const string& name2, long long group)
{
if (name1.empty() || name2.empty())return -3;
//不存在则新建人物卡
if (!mNameIndex.count(name2)){
if (!NameList.count(name2)){
return -5;
}
else if (!mNameIndex.count(name1)){
else if (!NameList.count(name1)){
std::lock_guard<std::mutex> lock_queue(cardMutex);
//人物卡数量上限
if (mCardList.size() > 32)return -1;
if (name1.find(":") != string::npos)return -6;
mCardList.emplace(++indexMax, std::make_shared<CharaCard>(name1));
mNameIndex[name1] = indexMax;
mCardList.emplace(++indexMax, std::make_shared<CharaCard>(name1, indexMax));
NameList[name1] = mCardList[indexMax];
}
*getCard(name1) << *getCard(name2);
return 0;
}
PC Player::getCard(const string& name, long long group)
{
if (!name.empty() && mNameIndex.count(name))return mCardList[mNameIndex[name]];
if (mGroupIndex.count(group))return mCardList[mGroupIndex[group]];
if (mGroupIndex.count(0))return mCardList[mGroupIndex[0]];
if (!name.empty() && NameList.count(name))return NameList[name];
if (mGroupCard.count(group))return mGroupCard[group];
if (mGroupCard.count(0))return mGroupCard[0];
return mCardList.begin()->second;
}
PC Player::getCardByID(long long id)const {
if (mGroupIndex.count(id))return mCardList.at(mGroupIndex.at(id));
if (mGroupCard.count(id))return mGroupCard.at(id);
if (mCardList.count(id))return mCardList.at(id);
if (mGroupIndex.count(0))return mCardList.at(mGroupIndex.at(0));
if (mGroupCard.count(0))return mGroupCard.at(0);
return mCardList.begin()->second;
}
PC Player::operator[](const string& name)const {
if (mNameIndex.count(name))return mCardList.at(mNameIndex.at(name));
if (mGroupIndex.count(0))return mCardList.at(mGroupIndex.at(0));
if (NameList.count(name))return NameList.at(name);
if (mGroupCard.count(0))return mGroupCard.at(0);
return mCardList.begin()->second;
}
int Player::emptyCard(const string& s, long long group, const string& type)
Expand All @@ -583,11 +594,11 @@ int Player::emptyCard(const string& s, long long group, const string& type)
//人物卡数量上限
if (mCardList.size() > 16)return -1;
//无效模板不再报错
if (mNameIndex.count(s))return -4;
if (NameList.count(s))return -4;
if (s.find("=") != string::npos)return -6;
mCardList.emplace(++indexMax, std::make_shared<CharaCard>(s, type));
PC card{ mCardList[indexMax] };
mNameIndex[s] = indexMax;
PC card{ std::make_shared<CharaCard>(s, ++indexMax, type) };
mCardList.emplace(indexMax, card);
NameList[s] = card;
return 0;
}
int Player::newCard(string& s, long long group, string type)
Expand Down Expand Up @@ -615,29 +626,28 @@ int Player::newCard(string& s, long long group, string type)
}
//无效模板不再报错
//if (!getCardModels().count(type))return -2;
if (mNameIndex.count(s))return -4;
if (NameList.count(s))return -4;
if (s.find("=") != string::npos)return -6;
mCardList.emplace(++indexMax, std::make_shared<CharaCard>(s, type));
PC card{ mCardList[indexMax] };
PC card{ std::make_shared<CharaCard>(s, ++indexMax, type) };
mCardList.emplace(indexMax, card);
auto temp{ card->getTemplet()};
while (!vOption.empty())
{
string para = vOption.top();
vOption.pop();
card->build(para);
if (card->getName().empty() && temp->presets.count(para) && temp->presets[para].shapes.count("__Name")) {
if (!mNameIndex.count(s = temp->presets[para].shapes["__Name"].init(temp, card.get())))card->setName(s);
if (!NameList.count(s = temp->presets[para].shapes["__Name"].init(temp, card.get())))card->setName(s);
}
}
if (card->getName().empty()){
if (temp->presets.count("pc") && temp->presets["pc"].shapes.count("__Name")) {
if (!mNameIndex.count(s = temp->presets["pc"].shapes["__Name"].init(temp, card.get())))card->setName(s);
if (!NameList.count(s = temp->presets["pc"].shapes["__Name"].init(temp, card.get())))card->setName(s);
}
if (card->getName().empty())card->setName(to_string(indexMax + 1));
}
s = card->getName();
mNameIndex[s] = indexMax;
mGroupIndex[group] = indexMax;
mGroupCard[group] = NameList[s] = card;
return 0;
}
int Player::buildCard(string& name, bool isClear, long long group)
Expand All @@ -650,7 +660,7 @@ int Player::buildCard(string& name, bool isClear, long long group)
strType = name.substr(0, name.rfind(":"));
}
//不存在则新建人物卡
if (!strName.empty() && !mNameIndex.count(strName))
if (!strName.empty() && !NameList.count(strName))
{
if (const int res = newCard(name, group))return res;
//PC pc{ getCard(strName, group) };
Expand All @@ -661,7 +671,7 @@ int Player::buildCard(string& name, bool isClear, long long group)
name = pc->getName();
if (isClear)pc->clear();
pc->buildv(strType);
if (const auto idx = mNameIndex[name]; idx != mGroupIndex[group])mGroupIndex[group] = idx;
if (NameList[name] != mGroupCard[group])mGroupCard[group] = pc;
}
return 0;
}
Expand All @@ -678,21 +688,30 @@ void Player::writeb(std::ofstream& fout) const
{
fwrite(fout, indexMax);
fwrite(fout, mCardList);
fwrite(fout, mGroupIndex);
const auto len = static_cast<short>(mGroupCard.size());
fwrite(fout, len);
for (const auto& [gid,pc] : mGroupCard)
{
fwrite(fout, gid);
fwrite(fout, pc->getID());
}
}
void Player::readb(std::ifstream& fin)
{
indexMax = fread<short>(fin);
if (short len = fread<short>(fin); len > 0) while (len--) {
auto idx = fread<unsigned short>(fin);
PC card = std::make_shared<CharaCard>();
PC card = std::make_shared<CharaCard>(idx);
card->readb(fin);
if (auto name{ card->getName() }; !name.empty()) {
mCardList[idx] = card;
mNameIndex[name] = idx;
NameList[name] = card;
}
}
fread<unsigned long long, unsigned short>(fin, mGroupIndex);
if (short len = fread<short>(fin); len > 0) while (len--) {
unsigned long long gid = fread<unsigned long long>(fin);
mGroupCard[gid] = mCardList[fread<unsigned short>(fin)];
}
}

AttrVar idx_pc(const AttrObject& eve){
Expand Down
48 changes: 22 additions & 26 deletions Dice/CharacterCard.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,12 @@ struct lua_State;
class CharaCard: public AnysTable
{
private:
size_t id = 0;
string Name = "角色卡";
unordered_set<string> locks;
std::mutex cardMutex;
public:
size_t getID()const { return id; }
MetaType getType()const override{ return MetaType::Actor; }
ptr<CardTemp> getTemplet()const;
bool locked(const string& key)const { return locks.count(key); }
Expand All @@ -188,16 +190,17 @@ class CharaCard: public AnysTable
void setName(const string&);
void setType(const string&);
void update();
CharaCard(){
CharaCard(size_t i) :id(i) {
setType("COC7");
dict["__Update"] = (long long)time(nullptr);
}
CharaCard(const CharaCard& pc){
id = pc.id;
Name = pc.Name;
dict = pc.dict;
}

CharaCard(const string& name, const string& type = "COC7") : Name(name)
CharaCard(const string& name, size_t i, const string& type = "COC7") : Name(name), id(i)
{
dict["__Name"] = name;
setType(type);
Expand Down Expand Up @@ -280,28 +283,31 @@ class Player
private:
short indexMax = 0;
map<unsigned short, PC> mCardList;
dict_ci<unsigned short> mNameIndex;
unordered_map<unsigned long long, unsigned short> mGroupIndex{{0, 0}};
dict_ci<PC> NameList;
unordered_map<unsigned long long, PC> mGroupCard;
// 人物卡互斥
std::mutex cardMutex;
public:
Player() {
mCardList[0] = std::make_shared<CharaCard>( "角色卡" );
mCardList[0] = std::make_shared<CharaCard>("角色卡", 0);
}

Player(const Player& pl)
{
*this = pl;
indexMax = pl.indexMax;
mCardList = pl.mCardList;
NameList = pl.NameList;
mGroupCard = pl.mGroupCard;
}

Player& operator=(const Player& pl)
/*Player& operator=(const Player& pl)
{
indexMax = pl.indexMax;
mCardList = pl.mCardList;
mNameIndex = pl.mNameIndex;
mGroupIndex = pl.mGroupIndex;
NameList = pl.NameList;
mGroupCard = pl.mGroupCard;
return *this;
}
}*/

[[nodiscard]] size_t size() const
{
Expand All @@ -310,30 +316,20 @@ class Player

[[nodiscard]] bool count(long long group) const
{
return mGroupIndex.count(group);
return mGroupCard.count(group);
}

[[nodiscard]] bool count(const string& name) const
{
return mNameIndex.count(name);
return NameList.count(name);
}

int emptyCard(const string& s, long long group, const string& type);
int newCard(string& s, long long group = 0, string type = "COC7");

int buildCard(string& name, bool isClear, long long group = 0);

int changeCard(const string& name, long long group)
{
if (name.empty())
{
mGroupIndex.erase(group);
return 1;
}
if (!mNameIndex.count(name))return -5;
mGroupIndex[group] = mNameIndex[name];
return 0;
}
int changeCard(const string& name, long long group);

int removeCard(const string& name);

Expand All @@ -346,10 +342,10 @@ class Player
string listMap()
{
ResList Res;
for (const auto& it : mGroupIndex)
for (const auto& [gid,pc] : mGroupCard)
{
if (!it.first)Res << "default:" + mCardList[it.second]->getName();
else Res << "(" + to_string(it.first) + ")" + mCardList[it.second]->getName();
if (!gid)Res << "default:" + pc->getName();
else Res << "(" + to_string(gid) + ")" + pc->getName();
}
return Res.show();
}
Expand Down
6 changes: 3 additions & 3 deletions Dice/DiceEvent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3093,7 +3093,7 @@ int DiceEvent::InnerOrder() {
}
string& strAttr{ (at("attr") = readAttrName()).text};
string strCurrentValue{ readDigit(false) };
PC pc{ PList.count(fromChat.uid) ? getPlayer(fromChat.uid)[fromChat.gid] : std::make_shared<CharaCard>()};
PC pc{ PList.count(fromChat.uid) ? getPlayer(fromChat.uid)[fromChat.gid] : std::make_shared<CharaCard>(0)};
int intVal{ 0 };
//获取技能原值
if (strCurrentValue.empty()) {
Expand Down Expand Up @@ -3562,7 +3562,7 @@ int DiceEvent::InnerOrder() {
bool isStatic = PList.count(fromChat.uid);
auto game{ thisGame() };
bool isRoulette = game && game->is_part(fromChat.uid) && game->roulette.count(100);
PC pc{ isStatic ? PList[fromChat.uid][fromChat.gid] : std::make_shared<CharaCard>()};
PC pc{ isStatic ? PList[fromChat.uid][fromChat.gid] : std::make_shared<CharaCard>(0)};
if ((strLowerMessage[intMsgCnt] == 'p' || strLowerMessage[intMsgCnt] == 'b') && strLowerMessage[intMsgCnt - 1] != ' ') {
isStatic = false;
strMainDice = strLowerMessage[intMsgCnt];
Expand Down Expand Up @@ -4196,7 +4196,7 @@ int DiceEvent::InnerOrder() {
return 1;
}
if (!fromChat.gid)isHidden = false;
PC pc{ PList.count(fromChat.uid) ? getPlayer(fromChat.uid)[fromChat.gid] : std::make_shared<CharaCard>()};
PC pc{ PList.count(fromChat.uid) ? getPlayer(fromChat.uid)[fromChat.gid] : std::make_shared<CharaCard>(0)};
string strMainDice;
string& strReason{ (at("reason") = "").text};
string strAttr;
Expand Down
Loading

0 comments on commit 4ab3650

Please sign in to comment.