Commit 96299d3a authored by argon.sun's avatar argon.sun

strings

parent e7e54820
......@@ -325,7 +325,7 @@ void ClientField::ShowSelectCard(bool buttonok) {
mainGame->btnCardSelect[i]->setPressed(false);
mainGame->btnCardSelect[i]->setVisible(true);
if(mainGame->dInfo.curMsg != MSG_SORT_CHAIN && mainGame->dInfo.curMsg != MSG_SORT_CARD) {
myswprintf(formatBuffer, L"%ls[%d]", DataManager::FormatLocation(selectable_cards[i]->location), selectable_cards[i]->sequence + 1);
myswprintf(formatBuffer, L"%ls[%d]", mainGame->dataManager.FormatLocation(selectable_cards[i]->location), selectable_cards[i]->sequence + 1);
mainGame->stCardPos[i]->setText(formatBuffer);
mainGame->stCardPos[i]->setVisible(true);;
if(selectable_cards[i]->controler)
......@@ -356,7 +356,7 @@ void ClientField::ShowSelectCard(bool buttonok) {
mainGame->btnCardSelect[i]->setPressed(false);
mainGame->btnCardSelect[i]->setVisible(true);
if(mainGame->dInfo.curMsg != MSG_SORT_CHAIN && mainGame->dInfo.curMsg != MSG_SORT_CARD) {
myswprintf(formatBuffer, L"%ls[%d]", DataManager::FormatLocation(selectable_cards[i]->location), selectable_cards[i]->sequence + 1);
myswprintf(formatBuffer, L"%ls[%d]", mainGame->dataManager.FormatLocation(selectable_cards[i]->location), selectable_cards[i]->sequence + 1);
mainGame->stCardPos[i]->setText(formatBuffer);
mainGame->stCardPos[i]->setVisible(true);
if(selectable_cards[i]->controler)
......
#include "data_manager.h"
#include <stdio.h>
namespace ygo {
const wchar_t* DataManager::unknown_string = L"???";
const wchar_t* DataManager::effect_strings[] = {
L"魔陷破坏", L"怪兽破坏", L"卡片除外", L"送去墓地", L"返回手牌", L"返回卡组", L"手牌破坏", L"卡组破坏",
......@@ -11,9 +9,6 @@ const wchar_t* DataManager::effect_strings[] = {
L"破坏耐性", L"效果耐性", L"指示物 ", L"幸运 ", L"融合相关", L"同调相关", L"超量相关", L"效果无效"
};
wchar_t DataManager::strBuffer[2048];
wchar_t DataManager::attBuffer[128];
wchar_t DataManager::racBuffer[128];
wchar_t DataManager::tpBuffer[128];
bool DataManager::LoadDates(const char* file) {
sqlite3* pDB;
......@@ -237,247 +232,67 @@ int DataManager::GetVal(const wchar_t* pstr) {
}
return ret;
}
int DataManager::CopyStr(const wchar_t* src, wchar_t*& pstr, int maxlen) {
int l = 0;
while(src[l] && l < maxlen) {
pstr[l] = src[l];
l++;
}
pstr += l;
*pstr = 0;
return l;
}
const wchar_t* DataManager::FormatLocation(int location) {
switch(location) {
case LOCATION_DECK:
return L"卡组";
case LOCATION_HAND:
return L"手牌";
case LOCATION_MZONE:
return L"怪兽区";
case LOCATION_SZONE:
return L"魔法陷阱区";
case LOCATION_GRAVE:
return L"墓地";
case LOCATION_REMOVED:
return L"除外";
case LOCATION_EXTRA:
return L"额外";
case LOCATION_OVERLAY:
return L"叠放";
}
return unknown_string;
int filter = 1, i = 1000;
while(filter != location) {
filter <<= 1;
i++;
}
if(filter == location)
return GetSysString(i);
else
return unknown_string;
}
const wchar_t* DataManager::FormatAttribute(int attribute) {
wchar_t* p = attBuffer;
if(attribute & ATTRIBUTE_EARTH) {
wcscpy(p, L"地|");
p += 2;
}
if(attribute & ATTRIBUTE_WATER) {
wcscpy(p, L"水|");
p += 2;
}
if(attribute & ATTRIBUTE_FIRE) {
wcscpy(p, L"炎|");
p += 2;
}
if(attribute & ATTRIBUTE_WIND) {
wcscpy(p, L"风|");
p += 2;
}
if(attribute & ATTRIBUTE_LIGHT) {
wcscpy(p, L"光|");
p += 2;
}
if(attribute & ATTRIBUTE_DARK) {
wcscpy(p, L"暗|");
p += 2;
}
if(attribute & ATTRIBUTE_DEVINE) {
wcscpy(p, L"神|");
p += 2;
int filter = 1, i = 1010;
for(; filter != 0x80; filter <<= 1, ++i) {
if(attribute & filter) {
CopyStr(GetSysString(i), p, 16);
*p = L'|';
*++p = 0;
}
}
if(p != attBuffer)
*(p - 1) = 0;
else *p = 0;
return attBuffer;
}
const wchar_t* DataManager::FormatRace(int race) {
wchar_t* p = racBuffer;
if(race & RACE_WARRIOR) {
wcscpy(p, L"战士族|");
p += 4;
}
if(race & RACE_SPELLCASTER) {
wcscpy(p, L"魔法使族|");
p += 5;
}
if(race & RACE_FAIRY) {
wcscpy(p, L"天使族|");
p += 4;
}
if(race & RACE_FIEND) {
wcscpy(p, L"恶魔族|");
p += 4;
}
if(race & RACE_ZOMBIE) {
wcscpy(p, L"不死族|");
p += 4;
}
if(race & RACE_MACHINE) {
wcscpy(p, L"机械族|");
p += 4;
}
if(race & RACE_AQUA) {
wcscpy(p, L"水族|");
p += 3;
}
if(race & RACE_PYRO) {
wcscpy(p, L"炎族|");
p += 3;
}
if(race & RACE_ROCK) {
wcscpy(p, L"岩石族|");
p += 4;
}
if(race & RACE_WINDBEAST) {
wcscpy(p, L"鸟兽族|");
p += 4;
}
if(race & RACE_PLANT) {
wcscpy(p, L"植物族|");
p += 4;
}
if(race & RACE_INSECT) {
wcscpy(p, L"昆虫族|");
p += 4;
}
if(race & RACE_THUNDER) {
wcscpy(p, L"雷族|");
p += 3;
}
if(race & RACE_DRAGON) {
wcscpy(p, L"龙族|");
p += 3;
}
if(race & RACE_BEAST) {
wcscpy(p, L"兽族|");
p += 3;
}
if(race & RACE_BEASTWARRIOR) {
wcscpy(p, L"兽战士族|");
p += 5;
}
if(race & RACE_DINOSAUR) {
wcscpy(p, L"恐龙族|");
p += 4;
}
if(race & RACE_FISH) {
wcscpy(p, L"鱼族|");
p += 3;
}
if(race & RACE_SEASERPENT) {
wcscpy(p, L"海龙族|");
p += 4;
}
if(race & RACE_REPTILE) {
wcscpy(p, L"爬虫族|");
p += 4;
}
if(race & RACE_PSYCHO) {
wcscpy(p, L"念动力族|");
p += 5;
}
if(race & RACE_DEVINE) {
wcscpy(p, L"幻神兽族|");
p += 5;
int filter = 1, i = 1020;
for(; filter != 0x800000; filter <<= 1, ++i) {
if(race & filter) {
CopyStr(GetSysString(i), p, 16);
*p = L'|';
*++p = 0;
}
}
if(p != racBuffer)
*(p - 1) = 0;
else *p = 0;
return racBuffer;
}
const wchar_t* DataManager::FormatType(int type) {
wchar_t* p = tpBuffer;
if(type & TYPE_MONSTER) {
wcscpy(p, L"怪兽|");
p += 3;
}
if(type & TYPE_SPELL) {
wcscpy(p, L"魔法|");
p += 3;
}
if(type & TYPE_TRAP) {
wcscpy(p, L"陷阱|");
p += 3;
}
if(type & TYPE_NORMAL) {
wcscpy(p, L"通常|");
p += 3;
}
if(type & TYPE_EFFECT) {
wcscpy(p, L"效果|");
p += 3;
}
if(type & TYPE_FUSION) {
wcscpy(p, L"融合|");
p += 3;
}
if(type & TYPE_RITUAL) {
wcscpy(p, L"仪式|");
p += 3;
}
if(type & TYPE_SPIRIT) {
wcscpy(p, L"灵魂|");
p += 3;
}
if(type & TYPE_UNION) {
wcscpy(p, L"同盟|");
p += 3;
}
if(type & TYPE_DUAL) {
wcscpy(p, L"二重|");
p += 3;
}
if(type & TYPE_TUNER) {
wcscpy(p, L"调整|");
p += 3;
}
if(type & TYPE_SYNCHRO) {
wcscpy(p, L"同调|");
p += 3;
}
if(type & TYPE_TOKEN) {
wcscpy(p, L"衍生物|");
p += 4;
}
if(type & TYPE_QUICKPLAY) {
wcscpy(p, L"速攻|");
p += 3;
}
if(type & TYPE_CONTINUOUS) {
wcscpy(p, L"永续|");
p += 3;
}
if(type & TYPE_EQUIP) {
wcscpy(p, L"装备|");
p += 3;
}
if(type & TYPE_FIELD) {
wcscpy(p, L"场地|");
p += 3;
}
if(type & TYPE_COUNTER) {
wcscpy(p, L"反击|");
p += 3;
}
if(type & TYPE_FLIP) {
wcscpy(p, L"反转|");
p += 3;
}
if(type & TYPE_TOON) {
wcscpy(p, L"卡通|");
p += 3;
}
if(type & TYPE_XYZ) {
wcscpy(p, L"超量|");
p += 3;
int filter = 1, i = 1050;
for(; filter != 0x1000000; filter <<= 1, ++i) {
if(type & filter) {
CopyStr(GetSysString(i), p, 16);
*p = L'|';
*++p = 0;
}
}
if(p != tpBuffer)
*(p - 1) = 0;
else *p = 0;
return tpBuffer;
}
}
......@@ -26,9 +26,14 @@ public:
const wchar_t* GetVictoryString(int code);
const wchar_t* GetCounterName(int code);
const wchar_t* GetNumString(int num);
const wchar_t* FormatLocation(int location);
const wchar_t* FormatAttribute(int attribute);
const wchar_t* FormatRace(int race);
const wchar_t* FormatType(int type);
static int EncodeUTF8(const wchar_t * wsrc, char * str);
static int DecodeUTF8(const char * src, wchar_t * wstr);
static int GetVal(const wchar_t* pstr);
static int CopyStr(const wchar_t* src, wchar_t*& pstr, int maxlen);
std::unordered_map<unsigned int, CardDataC> _datas;
std::unordered_map<unsigned int, CardString> _strings;
......@@ -36,17 +41,13 @@ public:
std::unordered_map<unsigned int, wchar_t*> _counterStrings;
std::unordered_map<unsigned int, wchar_t*> _victoryStrings;
wchar_t numStrings[256][4];
wchar_t attBuffer[128];
wchar_t racBuffer[128];
wchar_t tpBuffer[128];
static wchar_t strBuffer[2048];
static wchar_t attBuffer[128];
static wchar_t racBuffer[128];
static wchar_t tpBuffer[128];
static const wchar_t* unknown_string;
static const wchar_t* effect_strings[];
static const wchar_t* FormatLocation(int location);
static const wchar_t* FormatAttribute(int attribute);
static const wchar_t* FormatRace(int race);
static const wchar_t* FormatType(int type);
};
}
......
......@@ -676,8 +676,8 @@ void Game::DrawDeckBd() {
myswprintf(textBuffer, L"%ls", dataManager.GetName(ptr->first));
textFont->draw(textBuffer, recti(859, 164 + i * 66, 955, 185 + i * 66), 0xff000000, false, false);
textFont->draw(textBuffer, recti(860, 165 + i * 66, 955, 185 + i * 66), 0xffffffff, false, false);
myswprintf(textBuffer, L"%ls/%ls ★%d", DataManager::FormatAttribute(ptr->second.attribute),
DataManager::FormatRace(ptr->second.race), ptr->second.level);
myswprintf(textBuffer, L"%ls/%ls ★%d", dataManager.FormatAttribute(ptr->second.attribute),
dataManager.FormatRace(ptr->second.race), ptr->second.level);
textFont->draw(textBuffer, recti(859, 186 + i * 66, 955, 207 + i * 66), 0xff000000, false, false);
textFont->draw(textBuffer, recti(860, 187 + i * 66, 955, 207 + i * 66), 0xffffffff, false, false);
if(ptr->second.attack < 0 && ptr->second.defence < 0)
......@@ -693,7 +693,7 @@ void Game::DrawDeckBd() {
myswprintf(textBuffer, L"%ls", dataManager.GetName(ptr->first));
textFont->draw(textBuffer, recti(859, 164 + i * 66, 955, 185 + i * 66), 0xff000000, false, false);
textFont->draw(textBuffer, recti(860, 165 + i * 66, 955, 185 + i * 66), 0xffffffff, false, false);
const wchar_t* ptype = DataManager::FormatType(ptr->second.type);
const wchar_t* ptype = dataManager.FormatType(ptr->second.type);
textFont->draw(ptype, recti(859, 186 + i * 66, 955, 207 + i * 66), 0xff000000, false, false);
textFont->draw(ptype, recti(860, 187 + i * 66, 955, 207 + i * 66), 0xffffffff, false, false);
}
......
......@@ -793,7 +793,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
else
mainGame->btnCardSelect[i]->setImage(mainGame->imageManager.tCover);
mainGame->btnCardSelect[i]->setRelativePosition(rect<s32>(30 + i * 125, 55, 30 + 120 + i * 125, 225));
myswprintf(formatBuffer, L"%ls[%d]", DataManager::FormatLocation(selectable_cards[i + pos]->location),
myswprintf(formatBuffer, L"%ls[%d]", mainGame->dataManager.FormatLocation(selectable_cards[i + pos]->location),
selectable_cards[i + pos]->sequence + 1);
mainGame->stCardPos[i]->setText(formatBuffer);
if(selectable_cards[i + pos]->is_selected)
......@@ -895,7 +895,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
myswprintf(formatBuffer, L"%ls[%d]", mainGame->dataManager.GetName(mcard->code), mcard->code);
mainGame->stName->setText(formatBuffer);
if(cd.type & TYPE_MONSTER) {
myswprintf(formatBuffer, L"[%ls] %ls/%ls", DataManager::FormatType(cd.type), DataManager::FormatRace(cd.race), DataManager::FormatAttribute(cd.attribute));
myswprintf(formatBuffer, L"[%ls] %ls/%ls", mainGame->dataManager.FormatType(cd.type), mainGame->dataManager.FormatRace(cd.race), mainGame->dataManager.FormatAttribute(cd.attribute));
mainGame->stInfo->setText(formatBuffer);
formatBuffer[0] = L'[';
for(int i = 1; i <= cd.level; ++i)
......@@ -913,7 +913,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->stDataInfo->setText(formatBuffer);
mainGame->stText->setRelativePosition(irr::core::position2di(15, 83));
} else {
myswprintf(formatBuffer, L"[%ls]", DataManager::FormatType(cd.type));
myswprintf(formatBuffer, L"[%ls]", mainGame->dataManager.FormatType(cd.type));
mainGame->stInfo->setText(formatBuffer);
mainGame->stDataInfo->setText(L"");
mainGame->stText->setRelativePosition(irr::core::position2di(15, 60));
......@@ -1376,7 +1376,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
myswprintf(formatBuffer, L"\n%ls/%ls", mcard->atkstring, mcard->defstring);
str.append(formatBuffer);
myswprintf(formatBuffer, L"\n★%d %ls/%ls", (mcard->level ? mcard->level : mcard->rank), DataManager::FormatRace(mcard->race), DataManager::FormatAttribute(mcard->attribute));
myswprintf(formatBuffer, L"\n★%d %ls/%ls", (mcard->level ? mcard->level : mcard->rank), mainGame->dataManager.FormatRace(mcard->race), mainGame->dataManager.FormatAttribute(mcard->attribute));
str.append(formatBuffer);
if(mcard->counters.size()) {
for(std::map<int, int>::iterator ctit = mcard->counters.begin(); ctit != mcard->counters.end(); ++ctit) {
......
......@@ -271,14 +271,14 @@ bool Game::Initialize() {
wANAttribute->setVisible(false);
for(int filter = 0x1, i = 0; i < 7; filter <<= 1, ++i)
chkAttribute[i] = env->addCheckBox(false, rect<s32>(10 + (i % 4) * 80, 25 + (i / 4) * 25, 90 + (i % 4) * 80, 50 + (i / 4) * 25),
wANAttribute, CHECK_ATTRIBUTE, DataManager::FormatAttribute(filter));
wANAttribute, CHECK_ATTRIBUTE, dataManager.FormatAttribute(filter));
//announce attribute
wANRace = env->addWindow(rect<s32>(480, 200, 850, 385), false, L"请选择要宣言的种族:");
wANRace->getCloseButton()->setVisible(false);
wANRace->setVisible(false);
for(int filter = 0x1, i = 0; i < 22; filter <<= 1, ++i)
chkRace[i] = env->addCheckBox(false, rect<s32>(10 + (i % 4) * 90, 25 + (i / 4) * 25, 100 + (i % 4) * 90, 50 + (i / 4) * 25),
wANRace, CHECK_RACE, DataManager::FormatRace(filter));
wANRace, CHECK_RACE, dataManager.FormatRace(filter));
//selection hint
stHintMsg = env->addStaticText(L"", rect<s32>(500, 60, 820, 90), true, false, 0, -1, false);
stHintMsg->setBackgroundColor(0xc0ffffff);
......@@ -340,12 +340,12 @@ bool Game::Initialize() {
cbAttribute = env->addComboBox(rect<s32>(60, 26, 190, 46), wFilter, -1);
cbAttribute->addItem(L"(无)", 0);
for(int filter = 0x1; filter != 0x80; filter <<= 1)
cbAttribute->addItem(DataManager::FormatAttribute(filter), filter);
cbAttribute->addItem(dataManager.FormatAttribute(filter), filter);
env->addStaticText(L"种族:", rect<s32>(10, 51, 70, 71), false, false, wFilter);
cbRace = env->addComboBox(rect<s32>(60, 49, 190, 69), wFilter, -1);
cbRace->addItem(L"(无)", 0);
for(int filter = 0x1; filter != 0x400000; filter <<= 1)
cbRace->addItem(DataManager::FormatRace(filter), filter);
cbRace->addItem(dataManager.FormatRace(filter), filter);
env->addStaticText(L"攻击:", rect<s32>(205, 28, 280, 48), false, false, wFilter);
ebAttack = env->addEditBox(L"", rect<s32>(260, 26, 340, 46), true, wFilter);
ebAttack->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
......@@ -617,7 +617,7 @@ void Game::ShowCardInfo(int code) {
myswprintf(formatBuffer, L"%ls", dataManager.GetName(code));
stName->setText(formatBuffer);
if(cd.type & TYPE_MONSTER) {
myswprintf(formatBuffer, L"[%ls] %ls/%ls", DataManager::FormatType(cd.type), DataManager::FormatRace(cd.race), DataManager::FormatAttribute(cd.attribute));
myswprintf(formatBuffer, L"[%ls] %ls/%ls", dataManager.FormatType(cd.type), dataManager.FormatRace(cd.race), dataManager.FormatAttribute(cd.attribute));
stInfo->setText(formatBuffer);
formatBuffer[0] = L'[';
for(int i = 1; i <= cd.level; ++i)
......@@ -635,7 +635,7 @@ void Game::ShowCardInfo(int code) {
stDataInfo->setText(formatBuffer);
stText->setRelativePosition(irr::core::position2di(15, 83));
} else {
myswprintf(formatBuffer, L"[%ls]", DataManager::FormatType(cd.type));
myswprintf(formatBuffer, L"[%ls]", dataManager.FormatType(cd.type));
stInfo->setText(formatBuffer);
stDataInfo->setText(L"");
stText->setRelativePosition(irr::core::position2di(15, 60));
......
......@@ -1160,7 +1160,7 @@ bool Game::SolveMessage(void* pd, char* msg, int len) {
break;
}
case HINT_RACE: {
myswprintf(textBuffer, L"对方宣言了:[%ls]", DataManager::FormatRace(data));
myswprintf(textBuffer, L"对方宣言了:[%ls]", mainGame->dataManager.FormatRace(data));
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(0);
mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->textFont, textBuffer);
......@@ -1169,7 +1169,7 @@ bool Game::SolveMessage(void* pd, char* msg, int len) {
break;
}
case HINT_ATTRIB: {
myswprintf(textBuffer, L"对方宣言了:[%ls]", DataManager::FormatAttribute(data));
myswprintf(textBuffer, L"对方宣言了:[%ls]", mainGame->dataManager.FormatAttribute(data));
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(0);
mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->textFont, textBuffer);
......@@ -1477,7 +1477,7 @@ bool Game::SolveMessage(void* pd, char* msg, int len) {
if (pcard->code != code)
pcard->SetCode(code);
NetManager::ReadInt8(pbuf);
myswprintf(textBuffer, L"是否在[%ls]发动[%ls]的效果?", DataManager::FormatLocation(l), mainGame->dataManager.GetName(code));
myswprintf(textBuffer, L"是否在[%ls]发动[%ls]的效果?", mainGame->dataManager.FormatLocation(l), mainGame->dataManager.GetName(code));
mainGame->gMutex.Lock();
mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, textBuffer);
mainGame->PopupElement(mainGame->wQuery);
......@@ -2551,7 +2551,7 @@ bool Game::SolveMessage(void* pd, char* msg, int len) {
}
} else
mainGame->WaitFrameSignal(30);
myswprintf(textBuffer, L"[%ls](%ls,%d)成为对象", mainGame->dataManager.GetName(pcard->code), DataManager::FormatLocation(l), s);
myswprintf(textBuffer, L"[%ls](%ls,%d)成为对象", mainGame->dataManager.GetName(pcard->code), mainGame->dataManager.FormatLocation(l), s);
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(pcard->code);
pcard->is_highlighting = false;
......
......@@ -302,6 +302,7 @@ public:
#define RACE_REPTILE 0x80000 //
#define RACE_PSYCHO 0x100000 //
#define RACE_DEVINE 0x200000 //
#define RACE_RESERVE 0x400000 //
//Reason
#define REASON_DESTROY 0x1 //
#define REASON_RELEASE 0x2 //
......
......@@ -71,6 +71,67 @@
!system 552 请选择硬币的正反面
!system 553 请选择骰子的结果
!system 554 请选择一个种类
!system 1000 卡组
!system 1001 手牌
!system 1002 怪兽区
!system 1003 魔法陷阱区
!system 1004 墓地
!system 1005 除外
!system 1006 额外
!system 1010
!system 1011
!system 1012
!system 1013
!system 1014
!system 1015
!system 1016
!system 1020 战士
!system 1021 魔法使
!system 1022 天使
!system 1023 恶魔
!system 1024 不死
!system 1025 机械
!system 1026
!system 1027
!system 1028 岩石
!system 1029 鸟兽
!system 1030 植物
!system 1031 昆虫
!system 1032
!system 1033
!system 1034
!system 1035 兽战士
!system 1036 恐龙
!system 1037
!system 1038 海龙
!system 1039 爬虫
!system 1040 念动力
!system 1041 幻神兽
!system 1042 创世神
!system 1050 怪兽
!system 1051 魔法
!system 1052 陷阱
!system 1053 ???
!system 1054 通常
!system 1055 效果
!system 1056 融合
!system 1057 仪式
!system 1058 陷阱怪兽
!system 1059 灵魂
!system 1060 同盟
!system 1061 二重
!system 1062 调整
!system 1063 同调
!system 1064 衍生物
!system 1065 ???
!system 1066 速攻
!system 1067 永续
!system 1068 装备
!system 1069 场地
!system 1070 反击
!system 1071 反转
!system 1072 卡通
!system 1073 超量
#vistory reason
!victory 0x1 LP变成0
!victory 0x2 没有卡可抽
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment