Commit 74092e49 authored by nanahira's avatar nanahira

Merge branch 'server' into fh-special

parents 126a562d fe81ee4c
Pipeline #3655 passed with stages
in 3 minutes and 7 seconds
#!/bin/bash
set -x
set -o errexit
# ygopro-database
apt update && apt -y install wget git p7zip-full
git clone --depth=1 https://code.mycard.moe/nanahira/ygopro-database
cp -rf ./ygopro-database/locales/$TARGET_LOCALE/* .
# ygopro-images
wget -O ygopro-images.zip https://cdn01.moecube.com/images/ygopro-images-${TARGET_LOCALE}.zip
7z x -y -opics ygopro-images.zip
#!/bin/bash
set -x
set -o errexit
# TARGET_LOCALE
apt update && apt -y install tar git
git submodule update --init
mkdir dist replay
tar -zcf dist/KoishiPro-$CI_COMMIT_REF_NAME-linux-$TARGET_LOCALE.tar.gz --exclude='.git*' ygopro LICENSE README.md libIrrKlang.so lflist.conf strings.conf system.conf cards.cdb script textures deck single pics replay sound windbot bot bot.conf locales fonts
#!/bin/bash
set -x
set -o errexit
# TARGET_LOCALE
apt update && apt -y install tar git
git submodule update --init
mkdir dist replay
tar -zcf dist/KoishiPro-$CI_COMMIT_REF_NAME-osx-$TARGET_LOCALE.tar.gz --exclude='.git*' ygopro.app LICENSE README.md lflist.conf strings.conf system.conf cards.cdb script textures deck single pics replay sound windbot bot bot.conf locales fonts
#!/bin/bash
set -x
set -o errexit
# TARGET_LOCALE
apt update && apt -y install p7zip-full git
git submodule update --init
mkdir dist replay
ARCHIVE_FILES=(ygopro.exe LICENSE README.md lflist.conf strings.conf system.conf cards.cdb script textures deck single pics replay sound bot.conf Bot.exe WindBot locales fonts)
if [[ "$TARGET_LOCALE" == "zh-CN" ]]; then
ARCHIVE_FILES=("${ARCHIVE_FILES[@]}" update-koishipro)
fi
7z a -mx9 -xr!.git* dist/KoishiPro-$CI_COMMIT_REF_NAME-win32-$TARGET_LOCALE.7z "${ARCHIVE_FILES[@]}"
#!/bin/bash
set -x
set -o errexit
echo "$MACOS_CERTIFICATE" | base64 --decode --output cert.p12
security create-keychain -p "$MACOS_KEYCHAIN_PASSWORD" "$MACOS_KEYCHAIN_NAME" || true
security list-keychains -s login.keychain "$MACOS_KEYCHAIN_NAME"
security default-keychain -s "$MACOS_KEYCHAIN_NAME"
security unlock-keychain -p "$MACOS_KEYCHAIN_PASSWORD" "$MACOS_KEYCHAIN_NAME"
security import cert.p12 -P "$MACOS_CERTIFICATE_PASSWORD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple: -s -k "$MACOS_KEYCHAIN_PASSWORD" "$MACOS_KEYCHAIN_NAME";
CERT_IDENTITY_NAME=$(security find-identity -v -p codesigning $MACOS_KEYCHAIN_NAME | head -1 | grep -o '".*"' | tr -d '"')
/usr/bin/codesign --deep --sign "$CERT_IDENTITY_NAME" ygopro.app
security lock-keychain "$MACOS_KEYCHAIN_NAME"
......@@ -13,6 +13,7 @@ build
/sqlite3
/irrklang
/irrlicht*
/lua
# gframe additionals
/gframe/ygopro.ico
......
stages:
- prepare
- build
- sign
- pack
- deploy
variables:
GIT_DEPTH: "1"
#USE_IRRKLANG: "1"
mat_lua:
stage: prepare
tags:
- linux
script:
- apt update; apt -y install wget tar
- wget -O - https://cdn01.moecube.com/ygopro-build-materials/lua-5.3.5.tar.gz | tar zfx -
- mv lua-5.3.5/src lua
- cp premake/lua/premake4.lua lua/;
artifacts:
paths:
- lua
mat_linux:
stage: prepare
tags:
- linux
script:
- apt update; apt -y install git wget tar
#- git clone --depth=1 https://code.mycard.moe/mycard/irrlicht irrlicht_linux
- wget -O - https://cdn01.moecube.com/ygopro-build-materials/premake-5.0.0-alpha14-linux.tar.gz | tar zfx -
artifacts:
paths:
- premake5
#- irrlicht_linux
mat_windows:
stage: prepare
tags:
- linux
script:
- apt update; apt -y install wget tar patch p7zip-full
# premake5.exe
- wget https://cdn01.moecube.com/ygopro-build-materials/premake-5.0.0-alpha14-windows.zip
- 7z x -y premake-5.0.0-alpha14-windows.zip
# event
- wget -O - https://cdn01.moecube.com/ygopro-build-materials/libevent-2.0.22-stable.tar.gz | tar zfx -
- mv libevent-2.0.22-stable event ; cp -rf event/WIN32-Code/* event/include
# sqlite3
- wget https://cdn01.moecube.com/ygopro-build-materials/sqlite-amalgamation-3310100.zip
- 7z x -y sqlite-amalgamation-3310100.zip
- mv sqlite-amalgamation-3310100 sqlite3
artifacts:
paths:
- premake5.exe
- event
- sqlite3
exec_windows:
stage: build
tags:
- vs
dependencies:
- mat_lua
- mat_windows
#variables:
# irrklang_pro: '1'
cache:
paths:
- bin/
- obj/
script:
- git submodule update --init
- bash -c 'cp -rf premake/* .'
#- cmd /C "patch -p0 < irrlicht\irrlicht.patch"
- '.\premake5.exe vs2019'
- cmd /c '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\msbuild.exe" build\ygo.sln /m /p:Configuration=Release'
- copy bin\release\ygopro.exe .
artifacts:
paths:
- ygopro.exe
exec_linux:
stage: build
tags:
- linux
dependencies:
#- mat_irrklang
- mat_linux
cache:
paths:
- bin/
- obj/
script:
- apt update; apt -y install git build-essential libevent-dev libsqlite3-dev liblua5.3-dev
- git submodule update --init
- ./premake5 gmake
- cd build
- make config=release -j$(nproc)
- cd ..
- mv bin/release/ygopro .
- strip ygopro
artifacts:
paths:
- ygopro
#win_server_pack:
# stage: pack
# dependencies:
# - exec_windows
# tags:
# - linux
# script:
# - apt update; apt -y install p7zip-full wget
# - wget https://nodejs.org/dist/v14.17.0/node-v14.17.0-win-x64.7z
upload_to_minio:
stage: deploy
dependencies:
- exec_windows
tags:
- linux
image: python
script:
- pip install -U -i https://mirrors.aliyun.com/pypi/simple/ awscli
- aws s3 --endpoint=https://minio.mycard.moe:9000 cp ygopro.exe s3://mycard/koishipro/server/ygopro.exe
only:
- server
No preview for this file type
......@@ -383,6 +383,18 @@ void ClientField::ClearSelect() {
(*cit)->is_selectable = false;
(*cit)->is_selected = false;
}
for(auto cit = selected_cards.begin(); cit != selected_cards.end(); ++cit) {
(*cit)->is_selectable = false;
(*cit)->is_selected = false;
}
for(auto cit = selectsum_all.begin(); cit != selectsum_all.end(); ++cit) {
(*cit)->is_selectable = false;
(*cit)->is_selected = false;
}
for(auto cit = selectsum_cards.begin(); cit != selectsum_cards.end(); ++cit) {
(*cit)->is_selectable = false;
(*cit)->is_selected = false;
}
}
void ClientField::ClearChainSelect() {
for(auto cit = activatable_cards.begin(); cit != activatable_cards.end(); ++cit) {
......
......@@ -998,8 +998,11 @@ void Game::DrawSpec() {
} else if(showcardp < showcarddif) {
DrawShadowText(lpcFont, lstr, ResizePhaseHint(660, 290, 960, 370, pos.Width), Resize(-1, -1, 0, 0), 0xffffffff);
if(dInfo.vic_string && (showcardcode == 1 || showcardcode == 2)) {
driver->draw2DRectangle(0xa0000000, Resize(540, 320, 790, 340));
DrawShadowText(guiFont, dInfo.vic_string, Resize(490, 320, 840, 340), Resize(-2, -1, 0, 0), 0xffffffff, 0xff000000, true, true, 0);
int w = guiFont->getDimension(dInfo.vic_string).Width;
if(w < 200)
w = 200;
driver->draw2DRectangle(0xa0000000, ResizeWin(640 - w / 2, 320, 690 + w / 2, 340));
DrawShadowText(guiFont, dInfo.vic_string, ResizeWin(640 - w / 2, 320, 690 + w / 2, 340), Resize(-2, -1, 0, 0), 0xffffffff, 0xff000000, true, true, 0);
}
} else if(showcardp < showcarddif + 10) {
int alpha = ((showcarddif + 10 - showcardp) * 25) << 24;
......
......@@ -2804,6 +2804,12 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
pcard->SetCode(code);
pcard->counters.clear();
pcard->ClearTarget();
if(pcard->equipTarget) {
pcard->equipTarget->is_showequip = false;
pcard->equipTarget->equipped.erase(pcard);
pcard->equipTarget = 0;
}
pcard->is_showequip = false;
pcard->is_showtarget = false;
pcard->is_showchaintarget = false;
ClientCard* olcard = mainGame->dField.GetCard(cc, cl & 0x7f, cs);
......@@ -4091,47 +4097,45 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame->dField.extra_p_count[p] = val;
}
mainGame->dField.RefreshAllCards();
val = BufferIO::ReadInt8(pbuf); //chains, always 0 in single mode
if(!mainGame->dInfo.isSingleMode) {
for(int i = 0; i < val; ++i) {
unsigned int code = (unsigned int)BufferIO::ReadInt32(pbuf);
int pcc = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
int pcl = BufferIO::ReadInt8(pbuf);
int pcs = BufferIO::ReadInt8(pbuf);
int subs = BufferIO::ReadInt8(pbuf);
int cc = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
int cl = BufferIO::ReadInt8(pbuf);
int cs = BufferIO::ReadInt8(pbuf);
int desc = BufferIO::ReadInt32(pbuf);
ClientCard* pcard = mainGame->dField.GetCard(pcc, pcl, pcs, subs);
mainGame->dField.current_chain.chain_card = pcard;
mainGame->dField.current_chain.code = code;
mainGame->dField.current_chain.desc = desc;
mainGame->dField.current_chain.controler = cc;
mainGame->dField.current_chain.location = cl;
mainGame->dField.current_chain.sequence = cs;
mainGame->dField.GetChainLocation(cc, cl, cs, &mainGame->dField.current_chain.chain_pos);
mainGame->dField.current_chain.solved = false;
int chc = 0;
for(auto chit = mainGame->dField.chains.begin(); chit != mainGame->dField.chains.end(); ++chit) {
if(cl == 0x10 || cl == 0x20) {
if(chit->controler == cc && chit->location == cl)
chc++;
} else {
if(chit->controler == cc && chit->location == cl && chit->sequence == cs)
chc++;
}
val = BufferIO::ReadInt8(pbuf); //chains
for(int i = 0; i < val; ++i) {
unsigned int code = (unsigned int)BufferIO::ReadInt32(pbuf);
int pcc = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
int pcl = BufferIO::ReadInt8(pbuf);
int pcs = BufferIO::ReadInt8(pbuf);
int subs = BufferIO::ReadInt8(pbuf);
int cc = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
int cl = BufferIO::ReadInt8(pbuf);
int cs = BufferIO::ReadInt8(pbuf);
int desc = BufferIO::ReadInt32(pbuf);
ClientCard* pcard = mainGame->dField.GetCard(pcc, pcl, pcs, subs);
mainGame->dField.current_chain.chain_card = pcard;
mainGame->dField.current_chain.code = code;
mainGame->dField.current_chain.desc = desc;
mainGame->dField.current_chain.controler = cc;
mainGame->dField.current_chain.location = cl;
mainGame->dField.current_chain.sequence = cs;
mainGame->dField.GetChainLocation(cc, cl, cs, &mainGame->dField.current_chain.chain_pos);
mainGame->dField.current_chain.solved = false;
int chc = 0;
for(auto chit = mainGame->dField.chains.begin(); chit != mainGame->dField.chains.end(); ++chit) {
if(cl == 0x10 || cl == 0x20) {
if(chit->controler == cc && chit->location == cl)
chc++;
} else {
if(chit->controler == cc && chit->location == cl && chit->sequence == cs)
chc++;
}
if(cl == LOCATION_HAND)
mainGame->dField.current_chain.chain_pos.X += 0.35f;
else
mainGame->dField.current_chain.chain_pos.Y += chc * 0.25f;
mainGame->dField.chains.push_back(mainGame->dField.current_chain);
}
if(val) {
myswprintf(event_string, dataManager.GetSysString(1609), dataManager.GetName(mainGame->dField.current_chain.code));
mainGame->dField.last_chain = true;
}
if(cl == LOCATION_HAND)
mainGame->dField.current_chain.chain_pos.X += 0.35f;
else
mainGame->dField.current_chain.chain_pos.Y += chc * 0.25f;
mainGame->dField.chains.push_back(mainGame->dField.current_chain);
}
if(val) {
myswprintf(event_string, dataManager.GetSysString(1609), dataManager.GetName(mainGame->dField.current_chain.code));
mainGame->dField.last_chain = true;
}
mainGame->gMutex.unlock();
break;
......@@ -4166,7 +4170,10 @@ void DuelClient::SendResponse() {
break;
}
case MSG_SELECT_CARD:
case MSG_SELECT_UNSELECT_CARD: {
case MSG_SELECT_UNSELECT_CARD:
case MSG_SELECT_TRIBUTE:
case MSG_SELECT_SUM:
case MSG_SELECT_COUNTER: {
mainGame->dField.ClearSelect();
for (auto cit = mainGame->dField.limbo_temp.begin(); cit != mainGame->dField.limbo_temp.end(); ++cit)
delete *cit;
......@@ -4177,24 +4184,6 @@ void DuelClient::SendResponse() {
mainGame->dField.ClearChainSelect();
break;
}
case MSG_SELECT_TRIBUTE: {
mainGame->dField.ClearSelect();
break;
}
case MSG_SELECT_COUNTER: {
mainGame->dField.ClearSelect();
break;
}
case MSG_SELECT_SUM: {
for(int i = 0; i < mainGame->dField.must_select_count; ++i) {
mainGame->dField.selected_cards[i]->is_selected = false;
}
for(size_t i = 0; i < mainGame->dField.selectsum_all.size(); ++i) {
mainGame->dField.selectsum_all[i]->is_selectable = false;
mainGame->dField.selectsum_all[i]->is_selected = false;
}
break;
}
case MSG_CONFIRM_CARDS: {
for (auto cit = mainGame->dField.limbo_temp.begin(); cit != mainGame->dField.limbo_temp.end(); ++cit)
delete *cit;
......
......@@ -134,6 +134,7 @@ bool Game::Initialize() {
L"/usr/share/fonts/truetype/DroidSansFallbackFull.ttf",
L"/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc",
L"/usr/share/fonts/google-noto-cjk/NotoSansCJK-Bold.ttc",
L"/usr/share/fonts/noto-cjk/NotoSansCJK-Bold.ttc",
L"/System/Library/Fonts/SFNSTextCondensed-Bold.otf",
L"/System/Library/Fonts/SFNS.ttf",
L"./fonts/numFont.ttf",
......@@ -156,6 +157,7 @@ bool Game::Initialize() {
L"/usr/share/fonts/truetype/DroidSansFallbackFull.ttf",
L"/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
L"/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc",
L"/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc",
L"/System/Library/Fonts/PingFang.ttc",
L"./fonts/textFont.ttf",
L"./fonts/textFont.ttc",
......@@ -207,7 +209,7 @@ bool Game::Initialize() {
SetWindowsIcon();
//main menu
wchar_t strbuf[256];
myswprintf(strbuf, L"KoishiPro %X.0%X.%X Trackmaker", PRO_VERSION >> 12, (PRO_VERSION >> 4) & 0xff, PRO_VERSION & 0xf);
myswprintf(strbuf, L"KoishiPro %X.0%X.%X Desire", PRO_VERSION >> 12, (PRO_VERSION >> 4) & 0xff, PRO_VERSION & 0xf);
wMainMenu = env->addWindow(rect<s32>(370, 200, 650, 415), false, strbuf);
wMainMenu->getCloseButton()->setVisible(false);
btnLanMode = env->addButton(rect<s32>(10, 30, 270, 60), wMainMenu, BUTTON_LAN_MODE, dataManager.GetSysString(1200));
......@@ -1615,7 +1617,7 @@ void Game::LoadConfig() {
*/
#endif
#ifndef YGOPRO_COMPAT_MYCARD
SaveConfig();
//SaveConfig();
#endif
}
}
......
......@@ -35,4 +35,9 @@ project "ygopro"
configuration "not vs*"
buildoptions { "-std=c++14", "-fno-rtti" }
configuration "not windows"
links { "lua5.3-c++", "event_pthreads", "dl", "pthread" }
links { "event_pthreads", "dl", "pthread" }
if BUILD_LUA then
links { "lua" }
else
links { "lua5.3-c++" }
end
......@@ -736,7 +736,8 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
}
pbuf += 6;
}
pbuf++;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 15;
DuelClient::ClientAnalyze(offset, pbuf - offset);
SinglePlayReload();
mainGame->gMutex.lock();
......
Subproject commit 1cfec8c52c9f2f531b1f0cc373620728dba3c0ee
Subproject commit 53052e1e1e2bfcc77146dc451da24ad585e24baf
......@@ -2,6 +2,9 @@ solution "ygo"
location "build"
language "C++"
objdir "obj"
if os.ishost("linux") and os.getenv("YGOPRO_BUILD_LUA") then
BUILD_LUA=true
end
configurations { "Release", "Debug" }
if os.getenv("YGOPRO_NO_LUA_SAFE") then
......@@ -30,9 +33,9 @@ end
libdirs { "/usr/local/lib" }
configuration "macosx"
defines { "LUA_USE_MACOSX", "DBL_MAX_10_EXP=+308", "DBL_MANT_DIG=53" }
includedirs { "/usr/local/include", "/usr/local/include/*" }
libdirs { "/usr/local/lib", "/usr/X11/lib" }
defines { "LUA_USE_MACOSX", "DBL_MAX_10_EXP=+308", "DBL_MANT_DIG=53", "GL_SILENCE_DEPRECATION" }
includedirs { "/usr/local/include/event2", "/usr/local/include/freetype2", "/usr/local/opt/sqlite3/include" }
libdirs { "/usr/local/lib", "/usr/local/opt/sqlite3/lib" }
buildoptions { "-stdlib=libc++" }
links { "OpenGL.framework", "Cocoa.framework", "IOKit.framework" }
......@@ -51,9 +54,7 @@ end
configuration { "Release", "vs*" }
optimize "Speed"
flags { "LinkTimeOptimization" }
if not os.ishost("macosx") then
staticruntime "On"
end
disablewarnings { "4244", "4267", "4838", "4577", "4819", "4018", "4996", "4477", "4091", "4828", "4800" }
configuration { "Release", "not vs*" }
......@@ -85,3 +86,7 @@ end
include "event"
include "sqlite3"
end
if os.ishost("macosx") or BUILD_LUA then
include "lua"
end
Subproject commit cf96f6036abe927a23ac0bb2b7d4cc46ce41ff9f
Subproject commit 7b721c6472ec5adfbfb3ef14c952bf02a1cd5f35
......@@ -534,13 +534,13 @@
!victory 0x4 失去连接
!victory 0x10 「被封印的艾克佐迪亚」特殊胜利
!victory 0x11 「终焉的倒计时」特殊胜利
!victory 0x12 「毒蛇神 维诺米纳迦」特殊胜利
!victory 0x13 「光之创造神 哈拉克提」特殊胜利
!victory 0x14 「究极封印神 艾克佐迪奥斯」特殊胜利
!victory 0x12 「毒蛇神 维诺米纳迦」特殊胜利
!victory 0x13 「光之创造神 哈拉克提」特殊胜利
!victory 0x14 「究极封印神 艾克佐迪奥斯」特殊胜利
!victory 0x15 「通灵盘」特殊胜利
!victory 0x16 「最终一战!」特殊胜利
!victory 0x17No.88 机关傀儡-命运狮子」特殊胜利
!victory 0x18 「混沌No.88 机关傀儡-灾厄狮子」特殊胜利
!victory 0x17No.88 机关傀儡-命运狮子」特殊胜利
!victory 0x18 「混沌No.88 机关傀儡-灾厄狮子」特殊胜利
!victory 0x19 「头奖壶7」特殊胜利
!victory 0x1a 「魂之接力」特殊胜利
!victory 0x1b 「鬼计惰天使」特殊胜利
......@@ -549,6 +549,7 @@
!victory 0x1e 「飞行象」特殊胜利
!victory 0x1f 「守护神 艾克佐迪亚」特殊胜利
!victory 0x20 「真艾克佐迪亚」特殊胜利
!victory 0x21 「混沌虚数No.1000 梦幻虚光神 原数天灵·原数天地」特殊胜利
!victory 0xffff 由于「%ls」获得比赛胜利
#counters
!counter 0x1 魔力指示物
......@@ -602,7 +603,7 @@
!counter 0x31 希望剑指示物
!counter 0x32 气球指示物
!counter 0x33 妖仙指示物
!counter 0x34 指示物(BOX
!counter 0x34 指示物(纸箱拳击手
!counter 0x35 音响指示物
!counter 0x36 娱乐法师指示物
!counter 0x37 坏兽指示物
......
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