Commit 70884f34 authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:Fluorohydride/ygopro

parents f6ee80a9 1c36764c
No preview for this file type
...@@ -122,6 +122,52 @@ inline void showDeckManage() { ...@@ -122,6 +122,52 @@ inline void showDeckManage() {
mainGame->PopupElement(mainGame->wDeckManage); mainGame->PopupElement(mainGame->wDeckManage);
} }
inline void ShowBigCard(int code, float zoom) {
mainGame->deckBuilder.bigcard_code = code;
mainGame->deckBuilder.bigcard_zoom = zoom;
ITexture* img = imageManager.GetBigPicture(code, zoom);
mainGame->imgBigCard->setImage(img);
auto size = img->getSize();
s32 left = mainGame->window_size.Width / 2 - size.Width / 2;
s32 top = mainGame->window_size.Height / 2 - size.Height / 2;
mainGame->imgBigCard->setRelativePosition(recti(0, 0, size.Width, size.Height));
mainGame->wBigCard->setRelativePosition(recti(left, top, left + size.Width, top + size.Height));
mainGame->gMutex.lock();
mainGame->btnBigCardOriginalSize->setVisible(true);
mainGame->btnBigCardZoomIn->setVisible(true);
mainGame->btnBigCardZoomOut->setVisible(true);
mainGame->btnBigCardClose->setVisible(true);
mainGame->ShowElement(mainGame->wBigCard);
mainGame->env->getRootGUIElement()->bringToFront(mainGame->wBigCard);
mainGame->gMutex.unlock();
}
inline void ZoomBigCard(s32 centerx = -1, s32 centery = -1) {
if(mainGame->deckBuilder.bigcard_zoom >= 4)
mainGame->deckBuilder.bigcard_zoom = 4;
if(mainGame->deckBuilder.bigcard_zoom <= 0.2)
mainGame->deckBuilder.bigcard_zoom = 0.2;
ITexture* img = imageManager.GetBigPicture(mainGame->deckBuilder.bigcard_code, mainGame->deckBuilder.bigcard_zoom);
mainGame->imgBigCard->setImage(img);
auto size = img->getSize();
auto pos = mainGame->wBigCard->getRelativePosition();
if(centerx == -1) {
centerx = pos.UpperLeftCorner.X + pos.getWidth() / 2;
centery = pos.UpperLeftCorner.Y + pos.getHeight() * 0.444f;
}
float posx = (float)(centerx - pos.UpperLeftCorner.X) / pos.getWidth();
float posy = (float)(centery - pos.UpperLeftCorner.Y) / pos.getHeight();
s32 left = centerx - size.Width * posx;
s32 top = centery - size.Height * posy;
mainGame->imgBigCard->setRelativePosition(recti(0, 0, size.Width, size.Height));
mainGame->wBigCard->setRelativePosition(recti(left, top, left + size.Width, top + size.Height));
}
inline void CloseBigCard() {
mainGame->HideElement(mainGame->wBigCard);
mainGame->btnBigCardOriginalSize->setVisible(false);
mainGame->btnBigCardZoomIn->setVisible(false);
mainGame->btnBigCardZoomOut->setVisible(false);
mainGame->btnBigCardClose->setVisible(false);
}
void DeckBuilder::Initialize() { void DeckBuilder::Initialize() {
mainGame->is_building = true; mainGame->is_building = true;
mainGame->is_siding = false; mainGame->is_siding = false;
...@@ -167,6 +213,11 @@ void DeckBuilder::Terminate() { ...@@ -167,6 +213,11 @@ void DeckBuilder::Terminate() {
mainGame->wCardImg->setVisible(false); mainGame->wCardImg->setVisible(false);
mainGame->wInfos->setVisible(false); mainGame->wInfos->setVisible(false);
mainGame->btnLeaveGame->setVisible(false); mainGame->btnLeaveGame->setVisible(false);
mainGame->wBigCard->setVisible(false);
mainGame->btnBigCardOriginalSize->setVisible(false);
mainGame->btnBigCardZoomIn->setVisible(false);
mainGame->btnBigCardZoomOut->setVisible(false);
mainGame->btnBigCardClose->setVisible(false);
mainGame->PopupElement(mainGame->wMainMenu); mainGame->PopupElement(mainGame->wMainMenu);
mainGame->device->setEventReceiver(&mainGame->menuHandler); mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->wACMessage->setVisible(false); mainGame->wACMessage->setVisible(false);
...@@ -754,6 +805,24 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -754,6 +805,24 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect); deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect);
break; break;
} }
case BUTTON_BIG_CARD_ORIG_SIZE: {
ShowBigCard(bigcard_code, 1);
break;
}
case BUTTON_BIG_CARD_ZOOM_IN: {
bigcard_zoom += 0.2;
ZoomBigCard();
break;
}
case BUTTON_BIG_CARD_ZOOM_OUT: {
bigcard_zoom -= 0.2;
ZoomBigCard();
break;
}
case BUTTON_BIG_CARD_CLOSE: {
CloseBigCard();
break;
}
case BUTTON_MSG_OK: { case BUTTON_MSG_OK: {
mainGame->HideElement(mainGame->wMessage); mainGame->HideElement(mainGame->wMessage);
mainGame->actionSignal.Set(); mainGame->actionSignal.Set();
...@@ -1110,6 +1179,11 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1110,6 +1179,11 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
case irr::EMIE_LMOUSE_LEFT_UP: { case irr::EMIE_LMOUSE_LEFT_UP: {
is_starting_dragging = false; is_starting_dragging = false;
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
if(!is_draging && !mainGame->is_siding && root->getElementFromPoint(mouse_pos) == mainGame->imgCard) {
ShowBigCard(mainGame->showingcode, 1);
break;
}
if(!is_draging) if(!is_draging)
break; break;
soundManager.PlaySoundEffect(SOUND_CARD_DROP); soundManager.PlaySoundEffect(SOUND_CARD_DROP);
...@@ -1133,6 +1207,14 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1133,6 +1207,14 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
is_draging = false; is_draging = false;
break; break;
} }
case irr::EMIE_LMOUSE_DOUBLE_CLICK: {
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
if(!is_draging && !mainGame->is_siding && root->getElementFromPoint(mouse_pos) == root && hovered_code) {
ShowBigCard(hovered_code, 1);
break;
}
break;
}
case irr::EMIE_RMOUSE_LEFT_UP: { case irr::EMIE_RMOUSE_LEFT_UP: {
if(mainGame->is_siding) { if(mainGame->is_siding) {
if(is_draging) if(is_draging)
...@@ -1155,6 +1237,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1155,6 +1237,10 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
break; break;
} }
if(mainGame->wBigCard->isVisible()) {
CloseBigCard();
break;
}
if(havePopupWindow()) if(havePopupWindow())
break; break;
if(!is_draging) { if(!is_draging) {
...@@ -1237,11 +1323,16 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1237,11 +1323,16 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
} }
case irr::EMIE_MOUSE_WHEEL: { case irr::EMIE_MOUSE_WHEEL: {
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
if(root->getElementFromPoint(mouse_pos) == mainGame->imgBigCard) {
bigcard_zoom += 0.1f * event.MouseInput.Wheel;
ZoomBigCard(mouse_pos.X, mouse_pos.Y);
break;
}
if(!mainGame->scrFilter->isVisible()) if(!mainGame->scrFilter->isVisible())
break; break;
if(mainGame->env->hasFocus(mainGame->scrFilter)) if(mainGame->env->hasFocus(mainGame->scrFilter))
break; break;
irr::gui::IGUIElement* root = mainGame->env->getRootGUIElement();
if(root->getElementFromPoint(mouse_pos) != root) if(root->getElementFromPoint(mouse_pos) != root)
break; break;
if(event.MouseInput.Wheel < 0) { if(event.MouseInput.Wheel < 0) {
......
...@@ -56,6 +56,8 @@ public: ...@@ -56,6 +56,8 @@ public:
bool is_starting_dragging; bool is_starting_dragging;
int dragx; int dragx;
int dragy; int dragy;
int bigcard_code;
float bigcard_zoom;
size_t pre_mainc; size_t pre_mainc;
size_t pre_extrac; size_t pre_extrac;
size_t pre_sidec; size_t pre_sidec;
......
...@@ -491,9 +491,21 @@ void Game::DrawMisc() { ...@@ -491,9 +491,21 @@ void Game::DrawMisc() {
driver->drawVertexPrimitiveList(matManager.vActivate, 4, matManager.iRectangle, 2); driver->drawVertexPrimitiveList(matManager.vActivate, 4, matManager.iRectangle, 2);
} }
if(dField.conti_act) { if(dField.conti_act) {
im.setTranslation(vector3df((matManager.vFieldContiAct[0].X + matManager.vFieldContiAct[1].X) / 2, irr::core::vector3df pos = vector3df((matManager.vFieldContiAct[0].X + matManager.vFieldContiAct[1].X) / 2,
(matManager.vFieldContiAct[0].Y + matManager.vFieldContiAct[2].Y) / 2, 0.03f)); (matManager.vFieldContiAct[0].Y + matManager.vFieldContiAct[2].Y) / 2, 0);
im.setRotationRadians(irr::core::vector3df(0, 0, 0));
for(auto cit = dField.conti_cards.begin(); cit != dField.conti_cards.end(); ++cit) {
im.setTranslation(pos);
driver->setTransform(irr::video::ETS_WORLD, im);
matManager.mCard.setTexture(0, imageManager.GetTexture((*cit)->code));
driver->setMaterial(matManager.mCard);
driver->drawVertexPrimitiveList(matManager.vCardFront, 4, matManager.iRectangle, 2);
pos.Z += 0.03f;
}
im.setTranslation(pos);
im.setRotationRadians(act_rot);
driver->setTransform(irr::video::ETS_WORLD, im); driver->setTransform(irr::video::ETS_WORLD, im);
driver->setMaterial(matManager.mTexture);
driver->drawVertexPrimitiveList(matManager.vActivate, 4, matManager.iRectangle, 2); driver->drawVertexPrimitiveList(matManager.vActivate, 4, matManager.iRectangle, 2);
} }
if(dField.chains.size() > 1 || mainGame->gameConf.draw_single_chain) { if(dField.chains.size() > 1 || mainGame->gameConf.draw_single_chain) {
......
...@@ -1808,10 +1808,14 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) { ...@@ -1808,10 +1808,14 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
mainGame->SetCursor(event.GUIEvent.Caller->isEnabled() ? ECI_IBEAM : ECI_NORMAL); mainGame->SetCursor(event.GUIEvent.Caller->isEnabled() ? ECI_IBEAM : ECI_NORMAL);
return true; return true;
} }
if(event.GUIEvent.Caller == mainGame->imgCard && mainGame->is_building && !mainGame->is_siding) {
mainGame->SetCursor(ECI_HAND);
return true;
}
break; break;
} }
case irr::gui::EGET_ELEMENT_LEFT: { case irr::gui::EGET_ELEMENT_LEFT: {
if(event.GUIEvent.Caller->getType() == EGUIET_EDIT_BOX) { if(event.GUIEvent.Caller->getType() == EGUIET_EDIT_BOX || event.GUIEvent.Caller == mainGame->imgCard) {
mainGame->SetCursor(ECI_NORMAL); mainGame->SetCursor(ECI_NORMAL);
return true; return true;
} }
......
...@@ -819,6 +819,23 @@ bool Game::Initialize() { ...@@ -819,6 +819,23 @@ bool Game::Initialize() {
//cancel or finish //cancel or finish
btnCancelOrFinish = env->addButton(rect<s32>(205, 230, 295, 265), 0, BUTTON_CANCEL_OR_FINISH, dataManager.GetSysString(1295)); btnCancelOrFinish = env->addButton(rect<s32>(205, 230, 295, 265), 0, BUTTON_CANCEL_OR_FINISH, dataManager.GetSysString(1295));
btnCancelOrFinish->setVisible(false); btnCancelOrFinish->setVisible(false);
//big picture
wBigCard = env->addWindow(rect<s32>(0, 0, 0, 0), false, L"");
wBigCard->getCloseButton()->setVisible(false);
wBigCard->setDrawTitlebar(false);
wBigCard->setDrawBackground(false);
wBigCard->setVisible(false);
imgBigCard = env->addImage(rect<s32>(0, 0, 0, 0), wBigCard);
imgBigCard->setScaleImage(false);
imgBigCard->setUseAlphaChannel(true);
btnBigCardOriginalSize = env->addButton(rect<s32>(205, 100, 295, 135), 0, BUTTON_BIG_CARD_ORIG_SIZE, dataManager.GetSysString(1443));
btnBigCardZoomIn = env->addButton(rect<s32>(205, 140, 295, 175), 0, BUTTON_BIG_CARD_ZOOM_IN, dataManager.GetSysString(1441));
btnBigCardZoomOut = env->addButton(rect<s32>(205, 180, 295, 215), 0, BUTTON_BIG_CARD_ZOOM_OUT, dataManager.GetSysString(1442));
btnBigCardClose = env->addButton(rect<s32>(205, 230, 295, 265), 0, BUTTON_BIG_CARD_CLOSE, dataManager.GetSysString(1440));
btnBigCardOriginalSize->setVisible(false);
btnBigCardZoomIn->setVisible(false);
btnBigCardZoomOut->setVisible(false);
btnBigCardClose->setVisible(false);
//leave/surrender/exit //leave/surrender/exit
btnLeaveGame = env->addButton(rect<s32>(205, 5, 295, 80), 0, BUTTON_LEAVE_GAME, L""); btnLeaveGame = env->addButton(rect<s32>(205, 5, 295, 80), 0, BUTTON_LEAVE_GAME, L"");
btnLeaveGame->setVisible(false); btnLeaveGame->setVisible(false);
...@@ -2034,6 +2051,11 @@ void Game::OnResize() { ...@@ -2034,6 +2051,11 @@ void Game::OnResize() {
btnChainWhenAvail->setRelativePosition(Resize(205, 180, 295, 215)); btnChainWhenAvail->setRelativePosition(Resize(205, 180, 295, 215));
btnShuffle->setRelativePosition(Resize(205, 230, 295, 265)); btnShuffle->setRelativePosition(Resize(205, 230, 295, 265));
btnCancelOrFinish->setRelativePosition(Resize(205, 230, 295, 265)); btnCancelOrFinish->setRelativePosition(Resize(205, 230, 295, 265));
btnBigCardOriginalSize->setRelativePosition(Resize(205, 100, 295, 135));
btnBigCardZoomIn->setRelativePosition(Resize(205, 140, 295, 175));
btnBigCardZoomOut->setRelativePosition(Resize(205, 180, 295, 215));
btnBigCardClose->setRelativePosition(Resize(205, 230, 295, 265));
} }
recti Game::Resize(s32 x, s32 y, s32 x2, s32 y2) { recti Game::Resize(s32 x, s32 y, s32 x2, s32 y2) {
x = x * xScale; x = x * xScale;
......
...@@ -612,6 +612,13 @@ public: ...@@ -612,6 +612,13 @@ public:
irr::gui::IGUIButton* btnChainWhenAvail; irr::gui::IGUIButton* btnChainWhenAvail;
//cancel or finish //cancel or finish
irr::gui::IGUIButton* btnCancelOrFinish; irr::gui::IGUIButton* btnCancelOrFinish;
//big picture
irr::gui::IGUIWindow* wBigCard;
irr::gui::IGUIImage* imgBigCard;
irr::gui::IGUIButton* btnBigCardOriginalSize;
irr::gui::IGUIButton* btnBigCardZoomIn;
irr::gui::IGUIButton* btnBigCardZoomOut;
irr::gui::IGUIButton* btnBigCardClose;
}; };
extern Game* mainGame; extern Game* mainGame;
...@@ -822,6 +829,11 @@ extern Game* mainGame; ...@@ -822,6 +829,11 @@ extern Game* mainGame;
#define CHECKBOX_REGEX 375 #define CHECKBOX_REGEX 375
#define COMBOBOX_LOCALE 376 #define COMBOBOX_LOCALE 376
#define BUTTON_BIG_CARD_CLOSE 380
#define BUTTON_BIG_CARD_ZOOM_IN 381
#define BUTTON_BIG_CARD_ZOOM_OUT 382
#define BUTTON_BIG_CARD_ORIG_SIZE 383
#define BUTTON_DECK_CODE 389 #define BUTTON_DECK_CODE 389
#define BUTTON_DECK_CODE_SAVE 390 #define BUTTON_DECK_CODE_SAVE 390
#define BUTTON_DECK_CODE_CANCEL 391 #define BUTTON_DECK_CODE_CANCEL 391
......
...@@ -21,6 +21,7 @@ bool ImageManager::Initial() { ...@@ -21,6 +21,7 @@ bool ImageManager::Initial() {
tUnknown = NULL; tUnknown = NULL;
tUnknownFit = NULL; tUnknownFit = NULL;
tUnknownThumb = NULL; tUnknownThumb = NULL;
tBigPicture = NULL;
tLoading = NULL; tLoading = NULL;
tThumbLoadingThreadRunning = false; tThumbLoadingThreadRunning = false;
tAct = GetRandomImage(TEXTURE_ACTIVATE); tAct = GetRandomImage(TEXTURE_ACTIVATE);
...@@ -132,6 +133,10 @@ void ImageManager::ClearTexture() { ...@@ -132,6 +133,10 @@ void ImageManager::ClearTexture() {
if(tit->second && tit->second != tLoading) if(tit->second && tit->second != tLoading)
driver->removeTexture(tit->second); driver->removeTexture(tit->second);
} }
if(tBigPicture != NULL) {
driver->removeTexture(tBigPicture);
tBigPicture = NULL;
}
tMap[0].clear(); tMap[0].clear();
tMap[1].clear(); tMap[1].clear();
tThumb.clear(); tThumb.clear();
...@@ -352,6 +357,37 @@ irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) { ...@@ -352,6 +357,37 @@ irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) {
else else
return mainGame->gameConf.use_image_scale ? (fit ? tUnknownFit : tUnknown) : GetTextureThumb(code); return mainGame->gameConf.use_image_scale ? (fit ? tUnknownFit : tUnknown) : GetTextureThumb(code);
} }
irr::video::ITexture* ImageManager::GetBigPicture(int code, float zoom) {
if(code == 0)
return tUnknown;
if(tBigPicture != NULL) {
driver->removeTexture(tBigPicture);
tBigPicture = NULL;
}
irr::video::ITexture* texture;
char file[256];
sprintf(file, "expansions/pics/%d.jpg", code);
irr::video::IImage* srcimg = driver->createImageFromFile(file);
if(srcimg == NULL) {
sprintf(file, "pics/%d.jpg", code);
srcimg = driver->createImageFromFile(file);
}
if(srcimg == NULL) {
return tUnknown;
}
if(zoom == 1) {
texture = driver->addTexture(file, srcimg);
} else {
auto origsize = srcimg->getDimension();
video::IImage* destimg = driver->createImage(srcimg->getColorFormat(), irr::core::dimension2d<u32>(origsize.Width * zoom, origsize.Height * zoom));
imageScaleNNAA(srcimg, destimg);
texture = driver->addTexture(file, destimg);
destimg->drop();
}
srcimg->drop();
tBigPicture = texture;
return texture;
}
int ImageManager::LoadThumbThread() { int ImageManager::LoadThumbThread() {
while(true) { while(true) {
imageManager.tThumbLoadingMutex.lock(); imageManager.tThumbLoadingMutex.lock();
......
...@@ -24,6 +24,7 @@ public: ...@@ -24,6 +24,7 @@ public:
void ResizeTexture(); void ResizeTexture();
irr::video::ITexture* GetTextureFromFile(const char* file, s32 width, s32 height); irr::video::ITexture* GetTextureFromFile(const char* file, s32 width, s32 height);
irr::video::ITexture* GetTexture(int code, bool fit = false); irr::video::ITexture* GetTexture(int code, bool fit = false);
irr::video::ITexture* GetBigPicture(int code, float zoom);
irr::video::ITexture* GetTextureThumb(int code); irr::video::ITexture* GetTextureThumb(int code);
irr::video::ITexture* GetTextureField(int code); irr::video::ITexture* GetTextureField(int code);
static int LoadThumbThread(); static int LoadThumbThread();
...@@ -41,6 +42,7 @@ public: ...@@ -41,6 +42,7 @@ public:
irr::video::ITexture* tUnknown; irr::video::ITexture* tUnknown;
irr::video::ITexture* tUnknownFit; irr::video::ITexture* tUnknownFit;
irr::video::ITexture* tUnknownThumb; irr::video::ITexture* tUnknownThumb;
irr::video::ITexture* tBigPicture;
irr::video::ITexture* tLoading; irr::video::ITexture* tLoading;
irr::video::ITexture* tAct; irr::video::ITexture* tAct;
irr::video::ITexture* tAttack; irr::video::ITexture* tAttack;
......
Subproject commit 4125653617d74159f6f93888b41d73efbfdc10b3 Subproject commit fcce7dc6e1551daef6352bdc2db192924dda412a
Subproject commit 2a7871a29313e8dfe7f350c47e7366f0bb7e59b6 Subproject commit 4a7eeb6c90210ae3ee6b1a69baff91c4a40efcd5
...@@ -465,6 +465,10 @@ ...@@ -465,6 +465,10 @@
!system 1429 选择的位置不符合条件。 !system 1429 选择的位置不符合条件。
!system 1430 选择的表示形式不符合条件。 !system 1430 选择的表示形式不符合条件。
!system 1431 选择的指示物不符合条件。 !system 1431 选择的指示物不符合条件。
!system 1440 关闭大图
!system 1441 放大
!system 1442 缩小
!system 1443 原始尺寸
!system 1450 卡包展示 !system 1450 卡包展示
!system 1451 人机卡组 !system 1451 人机卡组
!system 1452 未分类卡组 !system 1452 未分类卡组
...@@ -886,7 +890,8 @@ ...@@ -886,7 +890,8 @@
!setname 0xbd 暗黑骑士 盖亚 暗黒騎士ガイア !setname 0xbd 暗黑骑士 盖亚 暗黒騎士ガイア
!setname 0xbe 帝王 帝王 !setname 0xbe 帝王 帝王
!setname 0xbf 灵使 霊使い !setname 0xbf 灵使 霊使い
!setname 0xc0 凭依装着 憑依装着 !setname 0xc0 凭依 憑依
!setname 0x10c0 凭依装着 憑依装着
!setname 0xc1 PSY骨架 PSYフレーム !setname 0xc1 PSY骨架 PSYフレーム
!setname 0x10c1 PSY骨架装备 PSYフレームギア !setname 0x10c1 PSY骨架装备 PSYフレームギア
!setname 0xc2 动力工具 パワー・ツール !setname 0xc2 动力工具 パワー・ツール
...@@ -1048,3 +1053,10 @@ ...@@ -1048,3 +1053,10 @@
!setname 0x14a 源数 ヌメロン !setname 0x14a 源数 ヌメロン
!setname 0x114a 源数之门 ゲート・オブ・ヌメロン !setname 0x114a 源数之门 ゲート・オブ・ヌメロン
!setname 0x14b 机块 機塊 !setname 0x14b 机块 機塊
#setname 0x14c 灵术 霊術
!setname 0x314c 地灵术 地霊術
#setname 0x514c 水灵术 水霊術
!setname 0x614c 火灵术 火霊術
#setname 0x914c 风灵术 風霊術
#setname 0xa14c 光灵术 光霊術
#setname 0xc14c 暗灵术 闇霊術
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