Commit 6a11f801 authored by JoyJ's avatar JoyJ

Merge branch 'server' of https://github.com/purerosefallen/ygopro into fh-special

parents 971b02f2 4a82ecae
# data files
/beta
/expansions
/specials
# build files
/bin
build
/obj
# dependencies
/event
/freetype
/sqlite3
/irrklang
/irrlicht*
# gframe additionals
/gframe/ygopro.ico
/gframe/ygopro.rc
/gframe/ygopro.aps
/gframe/ygopro.icns
/gframe/dirent.h
# git repos
/CustomTools
/DataEditorX
/Magic*
/pics
/Printer
/ygopro-*
/*-Cards
# libs
/*.dll
/*.so
/*.dylib
# windbot related files
/[Bb]ot
/[Bb]ot.conf
/[Bb]ot.exe
/[Bb]ot.sh
/[Ww]ind[Bb]ot
# ygopro config file
/system_user.conf
# ygopro folders
/deck
/pack
/fonts
/replay
/single
/screenshots
/sound/*.wav
/sound/custom
/sound/BGM
/sound/README.md
/sound/LICENSE
/sound/,*
/update
/update*
/locales
# ygopro main program
/ygopro
/ygopro_*
/ygopro.exe
/ygopro_*.exe
/ygopro.app
/ygopro_*.app
/premake4
/premake4.exe
/premake5
/premake5.exe
# others
*.log
.vscode
core*
/bak/
/.vs
/bug.txt
/output
/temp
[Tt]humbs.cdb
/PrinterData.txt
/*.bat
/*.sh
/*.sql
/patch.exe.manifest
/patch.exe
/diff.exe
Dockerfile
.dockerignore
/ocgcore
/script
/skin
/sound
/textures
/premake
/ikpmp3
/cards.cdb
/LICENSE
/README.md
/.gitignore
/strings.conf
/system.conf
FROM debian:buster-slim as git-checkout
RUN apt update && \
env DEBIAN_FRONTEND=noninteractive apt install -y git wget tar && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /usr/src/app
COPY .git ./.git
RUN git checkout -f && \
git submodule update --init && \
git submodule foreach git checkout master && \
wget -O - https://github.com/premake/premake-core/releases/download/v5.0.0-alpha14/premake-5.0.0-alpha14-linux.tar.gz | tar zfx - && \
./premake5 gmake
FROM debian:buster-slim as builder
# apt
RUN apt update && \
env DEBIAN_FRONTEND=noninteractive apt install -y build-essential libsqlite3-dev libevent-dev liblua5.3-dev && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /usr/src/app
COPY --from=git-checkout /usr/src/app/ ./
RUN cd build && \
make -j$(nproc) && \
cd .. && \
cp -rf bin/release/ygopro . && \
strip ygopro
FROM debian:buster-slim
# apt
RUN apt update && \
env DEBIAN_FRONTEND=noninteractive apt install -y libsqlite3-dev libevent-dev liblua5.3-dev && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/ygopro .
COPY --from=git-checkout /usr/src/app/script ./script
COPY ./lflist.conf .
ENTRYPOINT [ "./ygopro" ]
......@@ -38,19 +38,15 @@ build:
after_build:
- ps: move bin\release\ygopro.exe .
# redis
- bash -c "curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/MicrosoftArchive/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.zip ; exit 0"
- 7z x -y -oredis Redis-x64-3.2.100.zip
# nodejs
- bash -c "curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://nodejs.org/dist/v12.14.0/node-v12.14.0-win-x64.zip ; exit 0"
- 7z x -y node-v12.14.0-win-x64.zip
- mv node-v12.14.0-win-x64 node
- bash -c "curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://nodejs.org/dist/v14.15.0/node-v14.15.0-win-x64.7z ; exit 0"
- 7z x -y node-v14.15.0-win-x64.7z
- mv node-v14.15.0-win-x64 node
# srvpro
- git clone https://github.com/purerosefallen/ygopro-server
- cd ygopro-server
- ../node/npm install
- ../node/npm ci
- bash -c "curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/purerosefallen/windbot/releases/download/latest/WindBot.7z ; exit 0"
- 7z x -y WindBot.7z
- rm -rf Bot.exe bot.conf
......@@ -70,8 +66,8 @@ after_build:
- cd ../..
# start script
- bash -c "echo '@echo off' >> run.bat ; echo 'start redis/redis-server.exe' >> run.bat ; echo 'cd ygopro-server/windbot' >> run.bat ; echo 'start WindBot.exe servermode=true serverport=2399' >> run.bat ; echo 'cd ..' >> run.bat ; echo 'start ../node/node.exe ygopro-server.js' >> run.bat"
- 7z a -mx9 -xr!.git* ygopro-server-win.zip node redis ygopro-server run.bat
- bash -c "echo '@echo off' >> run.bat ; echo 'cd ygopro-server/windbot' >> run.bat ; echo 'start WindBot.exe servermode=true serverport=2399' >> run.bat ; echo 'cd ..' >> run.bat ; echo 'start ../node/node.exe ygopro-server.js' >> run.bat"
- 7z a -mx9 -xr!.git* ygopro-server-win.zip node ygopro-server run.bat
test: off
......
No preview for this file type
......@@ -18,6 +18,7 @@ ClientField::ClientField() {
hovered_card = 0;
clicked_card = 0;
highlighting_card = 0;
menu_card = 0;
hovered_controler = 0;
hovered_location = 0;
hovered_sequence = 0;
......@@ -89,6 +90,7 @@ void ClientField::Clear() {
hovered_card = 0;
clicked_card = 0;
highlighting_card = 0;
menu_card = 0;
hovered_controler = 0;
hovered_location = 0;
hovered_sequence = 0;
......@@ -459,7 +461,8 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
mainGame->stCardPos[i]->setOverrideColor(0xff0000ff);
if(selectable_cards[i]->overlayTarget->controler)
mainGame->stCardPos[i]->setBackgroundColor(0xffd0d0d0);
else mainGame->stCardPos[i]->setBackgroundColor(0xffffffff);
else
mainGame->stCardPos[i]->setBackgroundColor(0xffffffff);
} else if(selectable_cards[i]->location == LOCATION_DECK || selectable_cards[i]->location == LOCATION_EXTRA || selectable_cards[i]->location == LOCATION_REMOVED) {
if(selectable_cards[i]->position & POS_FACEDOWN)
mainGame->stCardPos[i]->setOverrideColor(0xff0000ff);
......@@ -479,7 +482,8 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
wchar_t formatBuffer[2048];
myswprintf(formatBuffer, L"%d", sort_list[i]);
mainGame->stCardPos[i]->setText(formatBuffer);
} else mainGame->stCardPos[i]->setText(L"");
} else
mainGame->stCardPos[i]->setText(L"");
mainGame->stCardPos[i]->setBackgroundColor(0xffffffff);
}
mainGame->stCardPos[i]->setVisible(true);
......@@ -1585,10 +1589,10 @@ void ClientField::RefreshCardCountDisplay() {
for(auto it = mzone[p].begin(); it != mzone[p].end(); ++it) {
pcard = *it;
if(pcard) {
if(pcard->type & TYPE_LINK && pcard->link)
mainGame->dInfo.card_count[p] += pcard->link;
else
mainGame->dInfo.card_count[p]++;
//if(pcard->type & TYPE_LINK && pcard->link)
// mainGame->dInfo.card_count[p] += pcard->link;
//else
mainGame->dInfo.card_count[p]++;
if(pcard->position == POS_FACEUP_ATTACK && pcard->attack > 0 && (p == 1 || mainGame->dInfo.curMsg != MSG_SELECT_BATTLECMD || pcard->cmdFlag & COMMAND_ATTACK))
mainGame->dInfo.total_attack[p] += pcard->attack;
}
......
......@@ -43,6 +43,7 @@ public:
std::vector<ClientCard*> conti_cards;
std::vector<std::pair<int,int>> activatable_descs;
std::vector<int> select_options;
std::vector<int> select_options_index;
std::vector<ChainInfo> chains;
int extra_p_count[2];
......@@ -138,6 +139,7 @@ public:
ClientCard* clicked_card;
ClientCard* command_card;
ClientCard* highlighting_card;
ClientCard* menu_card;
int list_command;
virtual bool OnEvent(const irr::SEvent& event);
......
......@@ -5,7 +5,6 @@
namespace ygo {
const wchar_t* DataManager::unknown_string = L"???";
wchar_t DataManager::strBuffer[4096];
byte DataManager::scriptBuffer[0x20000];
#ifndef YGOPRO_SERVER_MODE
IFileSystem* DataManager::FileSystem;
......@@ -14,6 +13,7 @@ DataManager dataManager;
bool DataManager::LoadDB(const wchar_t* wfile) {
char file[256];
wchar_t strBuffer[4096];
BufferIO::EncodeUTF8(wfile, file);
#ifdef YGOPRO_SERVER_MODE
sqlite3* pDB;
......@@ -146,6 +146,7 @@ void DataManager::ReadStringConfLine(const char* linebuf) {
return;
char strbuf[256];
int value;
wchar_t strBuffer[4096];
sscanf(linebuf, "!%s", strbuf);
if(!strcmp(strbuf, "system")) {
sscanf(&linebuf[7], "%d %240[^\n]", &value, strbuf);
......@@ -167,6 +168,7 @@ void DataManager::ReadStringConfLine(const char* linebuf) {
}
#ifdef YGOPRO_SERVER_MODE
bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
wchar_t strBuffer[4096];
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB), strBuffer);
if(pStmt)
sqlite3_finalize(pStmt);
......@@ -175,6 +177,7 @@ bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
}
#else
bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) {
wchar_t strBuffer[4096];
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB->handle), strBuffer);
if(pStmt)
sqlite3_finalize(pStmt);
......
......@@ -58,7 +58,6 @@ public:
wchar_t scBuffer[128];
wchar_t lmBuffer[32];
static wchar_t strBuffer[4096];
static byte scriptBuffer[0x20000];
static const wchar_t* unknown_string;
static int CardReader(int, void*);
......
This diff is collapsed.
......@@ -21,6 +21,14 @@ public:
void ClearSearch();
void SortList();
void RefreshDeckList();
void RefreshReadonly(int catesel);
void ChangeCategory(int catesel);
void ShowDeckManage();
void ShowBigCard(int code, float zoom);
void ZoomBigCard(s32 centerx = -1, s32 centery = -1);
void CloseBigCard();
bool CardNameContains(const wchar_t *haystack, const wchar_t *needle);
bool push_main(code_pointer pointer, int seq = -1);
......
......@@ -153,7 +153,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
cscg.info.start_lp = _wtoi(mainGame->ebStartLP->getText());
cscg.info.draw_count = _wtoi(mainGame->ebDrawCount->getText());
cscg.info.time_limit = _wtoi(mainGame->ebTimeLimit->getText());
cscg.info.lflist = mainGame->cbLFlist->getItemData(mainGame->cbLFlist->getSelected());
cscg.info.lflist = mainGame->cbHostLFlist->getItemData(mainGame->cbHostLFlist->getSelected());
cscg.info.duel_rule = mainGame->cbDuelRule->getSelected() + 1;
cscg.info.no_check_deck = mainGame->chkNoCheckDeck->isChecked();
cscg.info.no_shuffle_deck = mainGame->chkNoShuffleDeck->isChecked();
......
This diff is collapsed.
This diff is collapsed.
......@@ -42,6 +42,8 @@ struct Config {
int chkWaitChain;
int chkIgnore1;
int chkIgnore2;
int use_lflist;
int default_lflist;
int default_rule;
int hide_setname;
int hide_hint_button;
......@@ -116,6 +118,7 @@ struct BotInfo {
bool support_master_rule_3;
bool support_new_master_rule;
bool support_master_rule_2020;
bool select_deckfile;
};
struct FadingUnit {
......@@ -146,7 +149,7 @@ public:
void RefreshTimeDisplay();
void BuildProjectionMatrix(irr::core::matrix4& mProjection, f32 left, f32 right, f32 bottom, f32 top, f32 znear, f32 zfar);
void InitStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, u32 cHeight, irr::gui::CGUITTFont* font, const wchar_t* text);
void SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gui::CGUITTFont* font, const wchar_t* text, u32 pos = 0);
std::wstring SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gui::CGUITTFont* font, const wchar_t* text, u32 pos = 0);
void LoadExpansions();
void RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck, bool selectlastused = true);
void RefreshDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
......@@ -342,6 +345,8 @@ public:
irr::gui::IGUICheckBox* chkMultiKeywords;
irr::gui::IGUICheckBox* chkPreferExpansionScript;
irr::gui::IGUICheckBox* chkRegex;
irr::gui::IGUICheckBox* chkLFlist;
irr::gui::IGUIComboBox* cbLFlist;
irr::gui::IGUICheckBox* chkEnableSound;
irr::gui::IGUICheckBox* chkEnableMusic;
irr::gui::IGUIScrollBar* scrSoundVolume;
......@@ -374,7 +379,7 @@ public:
irr::gui::IGUIButton* btnCreateHost;
//create host
irr::gui::IGUIWindow* wCreateHost;
irr::gui::IGUIComboBox* cbLFlist;
irr::gui::IGUIComboBox* cbHostLFlist;
irr::gui::IGUIComboBox* cbMatchMode;
irr::gui::IGUIComboBox* cbRule;
irr::gui::IGUIEditBox* ebTimeLimit;
......@@ -419,6 +424,8 @@ public:
irr::gui::IGUIStaticText* stBotInfo;
irr::gui::IGUIButton* btnStartBot;
irr::gui::IGUIButton* btnBotCancel;
irr::gui::IGUIComboBox* cbBotDeckCategory;
irr::gui::IGUIComboBox* cbBotDeck;
irr::gui::IGUIComboBox* cbBotRule;
irr::gui::IGUICheckBox* chkBotHand;
irr::gui::IGUICheckBox* chkBotNoCheckDeck;
......@@ -576,7 +583,6 @@ public:
irr::gui::IGUIComboBox* cbDMCategory;
irr::gui::IGUIButton* btnDMOK;
irr::gui::IGUIButton* btnDMCancel;
irr::gui::IGUIComboBox* cbLFList;
//filter
irr::gui::IGUIStaticText* wFilter;
irr::gui::IGUIScrollBar* scrFilter;
......@@ -708,6 +714,7 @@ extern time_t pre_seed[3];
#define LISTBOX_BOT_LIST 153
#define BUTTON_BOT_START 154
#define COMBOBOX_BOT_RULE 155
#define COMBOBOX_BOT_DECKCATEGORY 156
#define EDITBOX_CHAT 199
#define BUTTON_MSG_OK 200
......@@ -846,9 +853,10 @@ extern time_t pre_seed[3];
#define CHECKBOX_MULTI_KEYWORDS 372
#define CHECKBOX_PREFER_EXPANSION 373
#define CHECKBOX_DRAW_SINGLE_CHAIN 374
#define CHECKBOX_REGEX 375
#define COMBOBOX_LOCALE 376
#define CHECKBOX_ASK_MSET 377
#define CHECKBOX_LFLIST 375
#define CHECKBOX_REGEX 376
#define COMBOBOX_LOCALE 377
#define CHECKBOX_ASK_MSET 378
#define BUTTON_BIG_CARD_CLOSE 380
#define BUTTON_BIG_CARD_ZOOM_IN 381
......
......@@ -182,8 +182,8 @@ int main(int argc, char* argv[]) {
auto_watch_mode = true;
} else if(!wcscmp(wargv[i], L"-d")) { // Deck
++i;
ygo::mainGame->gameConf.lastcategory[0] = 0;
if(i + 1 < wargc) { // select deck
ygo::mainGame->gameConf.lastcategory[0] = 0;
wcscpy(ygo::mainGame->gameConf.lastdeck, wargv[i]);
continue;
} else { // open deck
......
......@@ -338,9 +338,17 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
wchar_t cmd[MAX_PATH];
wchar_t arg1[512];
if(mainGame->botInfo[sel].select_deckfile) {
wchar_t botdeck[256];
deckManager.GetDeckFile(botdeck, mainGame->cbBotDeckCategory, mainGame->cbBotDeck);
myswprintf(arg1, L"%ls DeckFile='%ls'", mainGame->botInfo[sel].command, botdeck);
}
else
myswprintf(arg1, L"%ls", mainGame->botInfo[sel].command);
int flag = 0;
flag += (mainGame->chkBotHand->isChecked() ? 0x1 : 0);
myswprintf(cmd, L"Bot.exe \"%ls\" %d %d", mainGame->botInfo[sel].command, flag, mainGame->gameConf.serverport);
myswprintf(cmd, L"Bot.exe \"%ls\" %d %d", arg1, flag, mainGame->gameConf.serverport);
if(!CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
NetServer::StopServer();
......@@ -349,8 +357,16 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
#else
if(fork() == 0) {
usleep(100000);
wchar_t warg1[512];
if(mainGame->botInfo[sel].select_deckfile) {
wchar_t botdeck[256];
deckManager.GetDeckFile(botdeck, mainGame->cbBotDeckCategory, mainGame->cbBotDeck);
myswprintf(warg1, L"%ls DeckFile='%ls'", mainGame->botInfo[sel].command, botdeck);
}
else
myswprintf(warg1, L"%ls", mainGame->botInfo[sel].command);
char arg1[512];
BufferIO::EncodeUTF8(mainGame->botInfo[sel].command, arg1);
BufferIO::EncodeUTF8(warg1, arg1);
int flag = 0;
flag += (mainGame->chkBotHand->isChecked() ? 0x1 : 0);
char arg2[8];
......@@ -398,10 +414,15 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
wcsncpy(deck_name, dash + 1, dot - dash - 1);
deck_name[dot - dash - 1] = L'\0';
mainGame->ebDeckname->setText(deck_name);
mainGame->cbDBCategory->setSelected(-1);
mainGame->cbDBDecks->setSelected(-1);
mainGame->btnManageDeck->setEnabled(false);
mainGame->cbDBCategory->setEnabled(false);
mainGame->cbDBDecks->setEnabled(false);
} else {
for(size_t i = 0; i < mainGame->cbDBDecks->getItemCount(); ++i) {
if(!wcscmp(mainGame->cbDBDecks->getItem(i), open_file_name)) {
wcscpy(mainGame->gameConf.lastdeck, open_file_name);
mainGame->cbDBDecks->setSelected(i);
break;
}
......@@ -563,6 +584,8 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
if(sel == -1)
break;
mainGame->SetStaticText(mainGame->stBotInfo, 200, mainGame->guiFont, mainGame->botInfo[sel].desc);
mainGame->cbBotDeckCategory->setVisible(mainGame->botInfo[sel].select_deckfile);
mainGame->cbBotDeck->setVisible(mainGame->botInfo[sel].select_deckfile);
break;
}
}
......@@ -612,6 +635,18 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
}
break;
}
case COMBOBOX_BOT_DECKCATEGORY: {
int catesel = mainGame->cbBotDeckCategory->getSelected();
if(catesel == 3) {
catesel = 2;
mainGame->cbBotDeckCategory->setSelected(2);
}
if(catesel >= 0) {
mainGame->RefreshDeck(mainGame->cbBotDeckCategory, mainGame->cbBotDeck);
mainGame->cbBotDeck->setSelected(0);
}
break;
}
}
break;
}
......
......@@ -400,7 +400,8 @@ void SingleDuel::UpdateDeck(DuelPlayer* dp, void* pdata, unsigned int len) {
int mainc = BufferIO::ReadInt32(deckbuf);
int sidec = BufferIO::ReadInt32(deckbuf);
// verify data
if((unsigned)mainc + (unsigned)sidec > (len - 8) / 4) {
const unsigned int possibleMaxLength = (len - 8) / 4;
if((unsigned)mainc > possibleMaxLength || (unsigned)sidec > possibleMaxLength || (unsigned)mainc + (unsigned)sidec > possibleMaxLength) {
STOC_ErrorMsg scem;
scem.msg = ERRMSG_DECKERROR;
scem.code = 0;
......
......@@ -40,16 +40,16 @@ public:
#ifdef YGOPRO_SERVER_MODE
void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshSzone(int player, int flag = 0xe81fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshHand(int player, int flag = 0x781fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshHand(int player, int flag = 0x681fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshGrave(int player, int flag = 0x81fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshExtra(int player, int flag = 0x81fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshExtra(int player, int flag = 0xe81fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshRemoved(int player, int flag = 0x81fff, int use_cache = 1, DuelPlayer* dp = 0);
#else
void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1);
void RefreshSzone(int player, int flag = 0xe81fff, int use_cache = 1);
void RefreshHand(int player, int flag = 0x781fff, int use_cache = 1);
void RefreshHand(int player, int flag = 0x681fff, int use_cache = 1);
void RefreshGrave(int player, int flag = 0x81fff, int use_cache = 1);
void RefreshExtra(int player, int flag = 0x81fff, int use_cache = 1);
void RefreshExtra(int player, int flag = 0xe81fff, int use_cache = 1);
#endif
void RefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
......
......@@ -378,7 +378,8 @@ void TagDuel::UpdateDeck(DuelPlayer* dp, void* pdata, unsigned int len) {
int mainc = BufferIO::ReadInt32(deckbuf);
int sidec = BufferIO::ReadInt32(deckbuf);
// verify data
if((unsigned)mainc + (unsigned)sidec > (len - 8) / 4) {
const unsigned int possibleMaxLength = (len - 8) / 4;
if((unsigned)mainc > possibleMaxLength || (unsigned)sidec > possibleMaxLength || (unsigned)mainc + (unsigned)sidec > possibleMaxLength) {
STOC_ErrorMsg scem;
scem.msg = ERRMSG_DECKERROR;
scem.code = 0;
......
......@@ -37,16 +37,16 @@ public:
#ifdef YGOPRO_SERVER_MODE
void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshSzone(int player, int flag = 0xe81fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshHand(int player, int flag = 0x781fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshHand(int player, int flag = 0x681fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshGrave(int player, int flag = 0x81fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshExtra(int player, int flag = 0x81fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshExtra(int player, int flag = 0xe81fff, int use_cache = 1, DuelPlayer* dp = 0);
void RefreshRemoved(int player, int flag = 0x81fff, int use_cache = 1, DuelPlayer* dp = 0);
#else
void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1);
void RefreshSzone(int player, int flag = 0xe81fff, int use_cache = 1);
void RefreshHand(int player, int flag = 0x781fff, int use_cache = 1);
void RefreshHand(int player, int flag = 0x681fff, int use_cache = 1);
void RefreshGrave(int player, int flag = 0x81fff, int use_cache = 1);
void RefreshExtra(int player, int flag = 0x81fff, int use_cache = 1);
void RefreshExtra(int player, int flag = 0xe81fff, int use_cache = 1);
#endif
void RefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
......
This diff is collapsed.
Subproject commit c74b1cf03f536b951ba8cdedf4a5e0f8ab4f37d2
Subproject commit 1cfec8c52c9f2f531b1f0cc373620728dba3c0ee
......@@ -13,7 +13,7 @@ BLOCK "080404b0"
BEGIN
VALUE "FileDescription", "YGOPRO Server Mode ver.Koishi"
VALUE "InternalName", "YGOPRO Server Mode"
VALUE "LegalCopyright", "Copyright (C) 2019 Nanahira"
VALUE "LegalCopyright", "Copyright (C) 2021 Nanahira"
VALUE "OriginalFilename", "ygopro.exe"
VALUE "ProductName", "YGOPRO Server Mode"
VALUE "FileVersion", "Server"
......
Subproject commit b6819fc3480b886fd6f1a840297e8df2367e0c43
Subproject commit cf96f6036abe927a23ac0bb2b7d4cc46ce41ff9f
......@@ -17,7 +17,7 @@
!system 22 主要阶段中
!system 23 即将结束主要阶段
!system 24 战斗阶段中
!system 25 战斗结束阶段中
!system 25 战斗阶段结束时
!system 26 结束阶段中
!system 27 抽卡前
!system 28 战斗阶段开始
......@@ -338,8 +338,8 @@
!system 1285
!system 1286 特大
!system 1287 只有连锁1也显示连锁动画
!system 1288 语言(重启后生效)
!system 1289 默认
!system 1288 禁限卡表
!system 1289 语言(重启后生效)
!system 1290 忽略对方发言
!system 1291 忽略观战者发言
!system 1292 忽略时点
......@@ -404,7 +404,7 @@
!system 1352 主要信息:
!system 1353 播放起始于回合:
!system 1355 是否确定盖放[%ls]?
!system 1356 是否要放弃对卡组的修改
!system 1356 此操作将放弃对当前卡组的修改,是否继续
!system 1357 不提示保留对卡组的修改
!system 1358 键入关键字后自动进行搜索
!system 1359 是否确定投降?
......@@ -496,9 +496,9 @@
!system 1500 决斗结束。
!system 1501 录像结束。
!system 1502 连接已断开。
!system 1510 对方选择了:[%ls]
!system 1511 对方宣言了:[%ls]
!system 1512 对方选择了:[%d]
!system 1510 玩家选择了:[%ls]
!system 1511 玩家宣言了:[%ls]
!system 1512 玩家选择了:[%d]
!system 1600 卡片改变了表示形式
!system 1601 盖放了卡片
!system 1602 卡的控制权改变了
......@@ -509,7 +509,7 @@
!system 1607 [%ls]反转召唤中
!system 1608 怪兽反转召唤成功
!system 1609 [%ls]的效果发动
!system 1610 [%ls](%ls,%d)成为对象
!system 1610 [%ls](%ls,%d)成为对象或目标
!system 1611 我方抽了%d张卡
!system 1612 对方抽了%d张卡
!system 1613 我方受到%d伤害
......@@ -532,24 +532,24 @@
!victory 0x2 没有卡可抽
!victory 0x3 超时
!victory 0x4 失去连接
!victory 0x10 「被封印的艾克佐迪亚」效果胜利
!victory 0x11 「终焉的倒计时」效果胜利
!victory 0x12 「毒蛇神 维诺米纳迦」效果胜利
!victory 0x13 「光之创造神 哈拉克提」效果胜利
!victory 0x14 「究极封印神 艾克佐迪奥斯」效果胜利
!victory 0x15 「通灵盘」效果胜利
!victory 0x16 「最终一战!」效果胜利
!victory 0x17No.88 机关傀儡-命运狮子」效果胜利
!victory 0x18 「混沌No.88 机关傀儡-灾厄狮子」效果胜利
!victory 0x19 「头奖壶7效果胜利
!victory 0x1a 「魂之接力」效果胜利
!victory 0x1b 「鬼计惰天使」效果胜利
!victory 0x1c 「幻煌龙的天涡」效果胜利
!victory 0x1d 「方程式运动员胜利团队」效果胜利
!victory 0x1e 「飞行象」效果胜利
!victory 0x1f 「守护神 艾克佐迪亚」效果胜利
!victory 0x20 「真艾克佐迪亚」效果胜利
!victory 0xffff 由于「%ls的效果获得比赛胜利
!victory 0x10 「被封印的艾克佐迪亚」特殊胜利
!victory 0x11 「终焉的倒计时」特殊胜利
!victory 0x12 「毒蛇神 维诺米纳迦」特殊胜利
!victory 0x13 「光之创造神 哈拉克提」特殊胜利
!victory 0x14 「究极封印神 艾克佐迪奥斯」特殊胜利
!victory 0x15 「通灵盘」特殊胜利
!victory 0x16 「最终一战!」特殊胜利
!victory 0x17No.88 机关傀儡-命运狮子」特殊胜利
!victory 0x18 「混沌No.88 机关傀儡-灾厄狮子」特殊胜利
!victory 0x19 「头奖壶7特殊胜利
!victory 0x1a 「魂之接力」特殊胜利
!victory 0x1b 「鬼计惰天使」特殊胜利
!victory 0x1c 「幻煌龙的天涡」特殊胜利
!victory 0x1d 「方程式运动员胜利团队」特殊胜利
!victory 0x1e 「飞行象」特殊胜利
!victory 0x1f 「守护神 艾克佐迪亚」特殊胜利
!victory 0x20 「真艾克佐迪亚」特殊胜利
!victory 0xffff 由于「%ls」获得比赛胜利
#counters
!counter 0x1 魔力指示物
!counter 0x1002 楔指示物
......@@ -633,6 +633,11 @@
!counter 0x56 炎星指示物
!counter 0x57 幻魔指示物
!counter 0x58 指示物(祢须三破鸣比)
!counter 0x59 落魂指示物
!counter 0x5a 指示物(岩战之试炼)
!counter 0x5b 指示物(北极天熊北斗星)
!counter 0x105c 燃烧指示物
!counter 0x5d 指示物(机巧传-神使记纪图)
#setnames, using tab for comment
!setname 0x1 正义盟军 AOJ
!setname 0x2 次世代 ジェネクス
......@@ -680,7 +685,7 @@
!setname 0x1a 黑蝎 黒蠍
!setname 0x1b 幻兽 幻獣
!setname 0x101b 幻兽机 幻獣機
#setname 0x1c N/A
!setname 0x1c 死之信息 死のメッセージ
!setname 0x1d 核成 コアキメイル
!setname 0x1e 茧状体 C(コクーン)
!setname 0x1f 新空间侠 N(ネオスペーシアン)
......@@ -808,7 +813,9 @@
!setname 0x7c 炎舞
!setname 0x7d 阳炎 ヘイズ
!setname 0x107d 阳炎兽 陽炎獣
!setname 0x7e 异热同心武器 ZW(ゼアル・ウェポン)
!setname 0x7e 异热同心 ゼアル
!setname 0x107e 异热同心武器 ZW(ゼアル・ウェポン)
!setname 0x207e 异热同心从者 ZS(ゼアル・サーバス)
!setname 0x7f 霍普 ホープ
!setname 0x107f 希望皇 霍普 希望皇ホープ
!setname 0x207f 未来皇 霍普 未来皇ホープ
......@@ -825,7 +832,7 @@
!setname 0x89 洞 ホール
#setname 0x8a 虫惑 蟲惑
!setname 0x108a 虫惑魔 蟲惑魔
!setname 0x8b 恶餐 マリスボラス
!setname 0x8b 食恶 マリスボラス
#setname 0x8c 德鲁伊 ドルイド
!setname 0x8d 鬼计 ゴーストリック
!setname 0x8e 吸血鬼 ヴァンパイア
......@@ -939,6 +946,7 @@
!setname 0xe3 方界
!setname 0xe4 精灵剑士 エルフの剣士
!setname 0xe5 光波 サイファー
!setname 0x10e5 光波龙 サイファー・ドラゴン
!setname 0xe6 花札卫 花札衛
!setname 0xe7 沉默剑士 サイレント・ソードマン
!setname 0xe8 沉默魔术师 サイレント・マジシャン
......@@ -991,7 +999,8 @@
!setname 0x10d 魔导兽|非「魔导」 魔導獣
!setname 0x10e 进化药 進化薬
!setname 0x10f 枪管 ヴァレル
!setname 0x110 眼纳祭神 アイズ・サクリファイス
!setname 0x110 纳祭 サクリファイス
!setname 0x1110 眼纳祭神 アイズ・サクリファイス
!setname 0x111 武装龙 アームド・ドラゴン
!setname 0x112 幻崩 トロイメア
!setname 0x113 灵神 霊神
......@@ -1010,7 +1019,7 @@
!setname 0x11f 奈芙提斯 ネフティス
!setname 0x120 调皮宝贝 プランキッズ
!setname 0x121 魔妖
!setname 0x122 女武神 ワルキューレ
!setname 0x122 女武神|非「武神」 ワルキューレ
!setname 0x123 蔷薇 ローズ
!setname 0x1123 蔷薇龙 ローズ・ドラゴン
!setname 0x124 机械天使 機械天使
......@@ -1027,7 +1036,7 @@
!setname 0x12f 蜂军 BF(ビー・フォース)
!setname 0x130 破械
!setname 0x1130 破械神
!setname 0x131Dream Mirror
!setname 0x131魔镜 夢魔鏡
!setname 0x132 斩机 斬機
!setname 0x133 半龙女仆 ドラゴンメイド
!setname 0x134 王战 ジェネレイド
......@@ -1041,7 +1050,7 @@
!setname 0x13c 代码破坏者 コードブレイカー
!setname 0x13d 星义 ネメシス
!setname 0x13e 巴巴罗斯 バルバロス
!setname 0x13f 巡掠海魔 Plunder Patroll
!setname 0x13f 海造贼 海造賊
!setname 0x140 魔救 アダマシア
!setname 0x141 六花
#setname 0x142 黄金国 エルド
......@@ -1075,3 +1084,25 @@
!setname 0x152 姬丝基勒 キスキル
!setname 0x153 璃拉 リィラ
!setname 0x154 龙辉巧 ドライトロン
!setname 0x155 护宝炮妖 スプリガンズ
!setname 0x156 治安战警队 SForce
!setname 0x157 突变体 Myutant
#setname 0x158 圣 サン
!setname 0x1158 圣蔓 サンヴァイン
!setname 0x2158 圣天树 サンアバロン
!setname 0x159 圣夜骑士 ホーリーナイツ
!setname 0x15a 人偶怪兽 ドール・モンスター
!setname 0x15b 惊乐 アメイズメント
!setname 0x15c 游乐设施 アトラクション
!setname 0x15d 烙印
!setname 0x15e 降阶魔法 RDM
!setname 0x15f 岩战 War Rock
!setname 0x160 源质兽 Materiactor
!setname 0x161 溟界
!setname 0x162 七音服 ドレミコード
!setname 0x163 北极天熊 ベアルクティ
!setname 0x164 死狱乡 デスピア
!setname 0x165 魔键 魔鍵
!setname 0x166 军贯 軍貫
!setname 0x1167 森之圣兽 森の聖獣
!setname 0x2167 森之圣灵 森の聖霊
......@@ -7,6 +7,7 @@ antialias = 2
errorlog = 3
nickname = Komeiji Koishi
gamename = Game
lastcategory = 未分类卡组
lastdeck = new
textfont = ./fonts/simhei.ttf 14
numfont = ./fonts/arial.ttf
......@@ -20,6 +21,8 @@ autochain = 0
waitchain = 0
mute_opponent = 0
mute_spectators = 0
use_lflist = 1
default_lflist = 0
default_rule = 0
hide_setname = 0
hide_hint_button = 0
......@@ -36,8 +39,7 @@ ignore_deck_changes = 0
default_ot = 1
enable_bot_mode = 1
bot_deck_path = ./windbot/Decks
quick_animation = 1
auto_save_replay = 1
quick_animation = 0
draw_single_chain = 0
prefer_expansion_script = 1
ask_mset = 0
......
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