Commit 45f65abc authored by nanahira's avatar nanahira

Merge branch 'develop' into another-develop

parents 8d8e9860 c67eae02
No preview for this file type
#ifndef BUFFERIO_H #ifndef BUFFERIO_H
#define BUFFERIO_H #define BUFFERIO_H
#include <cstdint>
#include "../ocgcore/buffer.h"
class BufferIO { class BufferIO {
public: public:
inline static int ReadInt32(unsigned char*& p) { inline static int ReadInt32(unsigned char*& p) {
int ret = *(int*)p; return buffer_read<int32_t>(p);
p += 4;
return ret;
} }
inline static unsigned int ReadUInt32(unsigned char*& p) { inline static unsigned int ReadUInt32(unsigned char*& p) {
unsigned int ret = *(unsigned int*)p; unsigned int ret = *(unsigned int*)p;
...@@ -15,9 +15,7 @@ public: ...@@ -15,9 +15,7 @@ public:
return ret; return ret;
} }
inline static short ReadInt16(unsigned char*& p) { inline static short ReadInt16(unsigned char*& p) {
short ret = *(short*)p; return buffer_read<int16_t>(p);
p += 2;
return ret;
} }
inline static unsigned short ReadUInt16(unsigned char*& p) { inline static unsigned short ReadUInt16(unsigned char*& p) {
unsigned short ret = *(unsigned short*)p; unsigned short ret = *(unsigned short*)p;
...@@ -25,26 +23,19 @@ public: ...@@ -25,26 +23,19 @@ public:
return ret; return ret;
} }
inline static char ReadInt8(unsigned char*& p) { inline static char ReadInt8(unsigned char*& p) {
char ret = *(char*)p; return buffer_read<char>(p);
p++;
return ret;
} }
inline static unsigned char ReadUInt8(unsigned char*& p) { inline static unsigned char ReadUInt8(unsigned char*& p) {
unsigned char ret = *(unsigned char*)p; return buffer_read<unsigned char>(p);
p++;
return ret;
} }
inline static void WriteInt32(unsigned char*& p, int val) { inline static void WriteInt32(unsigned char*& p, int val) {
(*(int*)p) = val; buffer_write<int32_t>(p, val);
p += 4;
} }
inline static void WriteInt16(unsigned char*& p, short val) { inline static void WriteInt16(unsigned char*& p, short val) {
(*(short*)p) = val; buffer_write<int16_t>(p, val);
p += 2;
} }
inline static void WriteInt8(unsigned char*& p, char val) { inline static void WriteInt8(unsigned char*& p, char val) {
*p = val; buffer_write<char>(p, val);
p++;
} }
template<typename T1, typename T2> template<typename T1, typename T2>
inline static int CopyWStr(T1* src, T2* pstr, int bufsize) { inline static int CopyWStr(T1* src, T2* pstr, int bufsize) {
......
...@@ -120,6 +120,8 @@ void ClientField::Clear() { ...@@ -120,6 +120,8 @@ void ClientField::Clear() {
conti_act = false; conti_act = false;
deck_reversed = false; deck_reversed = false;
cant_check_grave = false; cant_check_grave = false;
tag_surrender = false;
tag_teammate_surrender = false;
RefreshCardCountDisplay(); RefreshCardCountDisplay();
} }
void ClientField::Initial(int player, int deckc, int extrac) { void ClientField::Initial(int player, int deckc, int extrac) {
......
...@@ -87,6 +87,8 @@ public: ...@@ -87,6 +87,8 @@ public:
bool deck_reversed{ false }; bool deck_reversed{ false };
bool conti_selecting{ false }; bool conti_selecting{ false };
bool cant_check_grave{ false }; bool cant_check_grave{ false };
bool tag_surrender{ false };
bool tag_teammate_surrender{ false };
mt19937 rnd; mt19937 rnd;
ClientField(); ClientField();
......
...@@ -559,6 +559,8 @@ void Game::DrawMisc() { ...@@ -559,6 +559,8 @@ void Game::DrawMisc() {
//finish button //finish button
if(btnCancelOrFinish->isVisible() && dField.select_ready) if(btnCancelOrFinish->isVisible() && dField.select_ready)
DrawSelectionLine(btnCancelOrFinish, 2, 0xffffff00); DrawSelectionLine(btnCancelOrFinish, 2, 0xffffff00);
if(btnLeaveGame->isVisible() && dField.tag_teammate_surrender)
DrawSelectionLine(btnLeaveGame, 2, 0xffffff00);
//lp bar //lp bar
if((dInfo.turn % 2 && dInfo.isFirst && !dInfo.is_swapped) || (!(dInfo.turn % 2) && !dInfo.isFirst && !dInfo.is_swapped) || (!(dInfo.turn % 2) && dInfo.isFirst && dInfo.is_swapped) || (dInfo.turn % 2 && !dInfo.isFirst && dInfo.is_swapped)) { if((dInfo.turn % 2 && dInfo.isFirst && !dInfo.is_swapped) || (!(dInfo.turn % 2) && !dInfo.isFirst && !dInfo.is_swapped) || (!(dInfo.turn % 2) && dInfo.isFirst && dInfo.is_swapped) || (dInfo.turn % 2 && !dInfo.isFirst && dInfo.is_swapped)) {
driver->draw2DRectangle(0xa0000000, Resize(327, 8, 630, 51)); driver->draw2DRectangle(0xa0000000, Resize(327, 8, 630, 51));
......
...@@ -747,7 +747,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -747,7 +747,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
} }
} else { } else {
if(selftype > 3) { if(selftype > 3) {
mainGame->dInfo.player_type = 7; mainGame->dInfo.player_type = NETPLAYER_TYPE_OBSERVER;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350)); mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350));
mainGame->btnLeaveGame->setVisible(true); mainGame->btnLeaveGame->setVisible(true);
mainGame->btnSpectatorSwap->setVisible(true); mainGame->btnSpectatorSwap->setVisible(true);
...@@ -927,23 +927,6 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -927,23 +927,6 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
play_sound = true; play_sound = true;
if(play_sound && mainGame->chkIgnore1->isChecked()) if(play_sound && mainGame->chkIgnore1->isChecked())
break; break;
if(!mainGame->dInfo.isTag) {
if(mainGame->dInfo.isStarted)
player = mainGame->LocalPlayer(player);
} else {
if(mainGame->dInfo.isStarted && !mainGame->dInfo.isFirst)
player ^= 2;
if(player == 0)
player = 0;
else if(player == 1)
player = 2;
else if(player == 2)
player = 1;
else if(player == 3)
player = 3;
else
player = 10;
}
} else { } else {
if(player == 8) { //system custom message. if(player == 8) { //system custom message.
play_sound = true; play_sound = true;
...@@ -1064,6 +1047,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -1064,6 +1047,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
break; break;
} }
case STOC_TEAMMATE_SURRENDER: {
if(!mainGame->dField.tag_surrender)
mainGame->dField.tag_teammate_surrender = true;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1355));
}
} }
} }
// Analyze STOC_GAME_MSG packet // Analyze STOC_GAME_MSG packet
...@@ -2737,6 +2725,12 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) { ...@@ -2737,6 +2725,12 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) {
mainGame->dInfo.is_swapped = !mainGame->dInfo.is_swapped; mainGame->dInfo.is_swapped = !mainGame->dInfo.is_swapped;
return true; return true;
} }
if(!mainGame->dInfo.isReplay && mainGame->dInfo.player_type < 7) {
mainGame->dField.tag_surrender = false;
mainGame->dField.tag_teammate_surrender = false;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1351));
mainGame->btnLeaveGame->setVisible(true);
}
mainGame->HideElement(mainGame->wSurrender); mainGame->HideElement(mainGame->wSurrender);
if(!mainGame->dInfo.isReplay && mainGame->dInfo.player_type < 7) { if(!mainGame->dInfo.isReplay && mainGame->dInfo.player_type < 7) {
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1351)); mainGame->btnLeaveGame->setText(dataManager.GetSysString(1351));
......
...@@ -143,7 +143,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -143,7 +143,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(exit_on_return) if(exit_on_return)
mainGame->device->closeDevice(); mainGame->device->closeDevice();
} else { } else {
mainGame->PopupElement(mainGame->wSurrender); if(!(mainGame->dInfo.isTag && mainGame->dField.tag_surrender))
mainGame->PopupElement(mainGame->wSurrender);
} }
break; break;
} }
...@@ -151,10 +152,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -151,10 +152,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
soundManager.PlaySoundEffect(SOUND_BUTTON); soundManager.PlaySoundEffect(SOUND_BUTTON);
DuelClient::SendPacketToServer(CTOS_SURRENDER); DuelClient::SendPacketToServer(CTOS_SURRENDER);
mainGame->HideElement(mainGame->wSurrender); mainGame->HideElement(mainGame->wSurrender);
mainGame->dField.tag_surrender = true;
break; break;
} }
case BUTTON_SURRENDER_NO: { case BUTTON_SURRENDER_NO: {
soundManager.PlaySoundEffect(SOUND_BUTTON); soundManager.PlaySoundEffect(SOUND_BUTTON);
mainGame->dField.tag_teammate_surrender = false;
mainGame->HideElement(mainGame->wSurrender); mainGame->HideElement(mainGame->wSurrender);
break; break;
} }
...@@ -523,7 +526,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -523,7 +526,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
current_mset_param = (i << 16) + 3; current_mset_param = (i << 16) + 3;
if(mainGame->gameConf.ask_mset) { if(mainGame->gameConf.ask_mset) {
wchar_t wbuf[256]; wchar_t wbuf[256];
myswprintf(wbuf, dataManager.GetSysString(1355), dataManager.GetName(clicked_card->code)); myswprintf(wbuf, dataManager.GetSysString(1368), dataManager.GetName(clicked_card->code));
mainGame->stQMessage->setText(wbuf); mainGame->stQMessage->setText(wbuf);
mainGame->PopupElement(mainGame->wQuery); mainGame->PopupElement(mainGame->wQuery);
} else { } else {
......
...@@ -194,6 +194,7 @@ public: ...@@ -194,6 +194,7 @@ public:
#define STOC_HS_PLAYER_ENTER 0x20 #define STOC_HS_PLAYER_ENTER 0x20
#define STOC_HS_PLAYER_CHANGE 0x21 #define STOC_HS_PLAYER_CHANGE 0x21
#define STOC_HS_WATCH_CHANGE 0x22 #define STOC_HS_WATCH_CHANGE 0x22
#define STOC_TEAMMATE_SURRENDER 0x23
#define STOC_SRVPRO_ROOMLIST 0x31 #define STOC_SRVPRO_ROOMLIST 0x31
#define PLAYERCHANGE_OBSERVE 0x8 #define PLAYERCHANGE_OBSERVE 0x8
......
#include "replay.h" #include "replay.h"
#include "../ocgcore/ocgapi.h"
#include "../ocgcore/common.h"
#include "lzma/LzmaLib.h" #include "lzma/LzmaLib.h"
#include "base64.h" #include "base64.h"
...@@ -55,7 +53,7 @@ void Replay::WriteData(const void* data, int length, bool flush) { ...@@ -55,7 +53,7 @@ void Replay::WriteData(const void* data, int length, bool flush) {
return; return;
if (length < 0 || (pdata - replay_data) + length > MAX_REPLAY_SIZE) if (length < 0 || (pdata - replay_data) + length > MAX_REPLAY_SIZE)
return; return;
memcpy(pdata, data, length); std::memcpy(pdata, data, length);
pdata += length; pdata += length;
#ifdef _WIN32 #ifdef _WIN32
DWORD size; DWORD size;
...@@ -71,8 +69,7 @@ void Replay::WriteInt32(int data, bool flush) { ...@@ -71,8 +69,7 @@ void Replay::WriteInt32(int data, bool flush) {
return; return;
if ((pdata - replay_data) + 4 > MAX_REPLAY_SIZE) if ((pdata - replay_data) + 4 > MAX_REPLAY_SIZE)
return; return;
*((int*)(pdata)) = data; BufferIO::WriteInt32(pdata, data);
pdata += 4;
#ifdef _WIN32 #ifdef _WIN32
DWORD size; DWORD size;
WriteFile(recording_fp, &data, sizeof(int), &size, NULL); WriteFile(recording_fp, &data, sizeof(int), &size, NULL);
...@@ -87,8 +84,7 @@ void Replay::WriteInt16(short data, bool flush) { ...@@ -87,8 +84,7 @@ void Replay::WriteInt16(short data, bool flush) {
return; return;
if ((pdata - replay_data) + 2 > MAX_REPLAY_SIZE) if ((pdata - replay_data) + 2 > MAX_REPLAY_SIZE)
return; return;
*((short*)(pdata)) = data; BufferIO::WriteInt16(pdata, data);
pdata += 2;
#ifdef _WIN32 #ifdef _WIN32
DWORD size; DWORD size;
WriteFile(recording_fp, &data, sizeof(short), &size, NULL); WriteFile(recording_fp, &data, sizeof(short), &size, NULL);
...@@ -103,8 +99,7 @@ void Replay::WriteInt8(char data, bool flush) { ...@@ -103,8 +99,7 @@ void Replay::WriteInt8(char data, bool flush) {
return; return;
if ((pdata - replay_data) + 1 > MAX_REPLAY_SIZE) if ((pdata - replay_data) + 1 > MAX_REPLAY_SIZE)
return; return;
*pdata = data; BufferIO::WriteInt8(pdata, data);
pdata++;
#ifdef _WIN32 #ifdef _WIN32
DWORD size; DWORD size;
WriteFile(recording_fp, &data, sizeof(char), &size, NULL); WriteFile(recording_fp, &data, sizeof(char), &size, NULL);
...@@ -302,7 +297,7 @@ bool Replay::ReadNextResponse(unsigned char resp[]) { ...@@ -302,7 +297,7 @@ bool Replay::ReadNextResponse(unsigned char resp[]) {
int len = *pdata++; int len = *pdata++;
if(len > SIZE_RETURN_VALUE) if(len > SIZE_RETURN_VALUE)
return false; return false;
memcpy(resp, pdata, len); std::memcpy(resp, pdata, len);
pdata += len; pdata += len;
return true; return true;
} }
...@@ -316,27 +311,26 @@ void Replay::ReadName(wchar_t* data) { ...@@ -316,27 +311,26 @@ void Replay::ReadName(wchar_t* data) {
void Replay::ReadData(void* data, int length) { void Replay::ReadData(void* data, int length) {
if(!is_replaying) if(!is_replaying)
return; return;
memcpy(data, pdata, length); std::memcpy(data, pdata, length);
pdata += length; pdata += length;
} }
int Replay::ReadInt32() { int Replay::ReadInt32() {
if(!is_replaying) if(!is_replaying)
return -1; return -1;
int ret = *((int*)pdata); int ret = BufferIO::ReadInt32(pdata);
pdata += 4;
return ret; return ret;
} }
short Replay::ReadInt16() { short Replay::ReadInt16() {
if(!is_replaying) if(!is_replaying)
return -1; return -1;
short ret = *((short*)pdata); short ret = BufferIO::ReadInt16(pdata);
pdata += 2;
return ret; return ret;
} }
char Replay::ReadInt8() { char Replay::ReadInt8() {
if(!is_replaying) if(!is_replaying)
return -1; return -1;
return *pdata++; char ret= BufferIO::ReadInt8(pdata);
return ret;
} }
void Replay::Rewind() { void Replay::Rewind() {
pdata = replay_data; pdata = replay_data;
......
...@@ -11,6 +11,7 @@ TagDuel::TagDuel() { ...@@ -11,6 +11,7 @@ TagDuel::TagDuel() {
for(int i = 0; i < 4; ++i) { for(int i = 0; i < 4; ++i) {
players[i] = 0; players[i] = 0;
ready[i] = false; ready[i] = false;
surrender[i] = false;
} }
} }
TagDuel::~TagDuel() { TagDuel::~TagDuel() {
...@@ -526,10 +527,21 @@ void TagDuel::DuelEndProc() { ...@@ -526,10 +527,21 @@ void TagDuel::DuelEndProc() {
void TagDuel::Surrender(DuelPlayer* dp) { void TagDuel::Surrender(DuelPlayer* dp) {
if(dp->type > 3 || !pduel) if(dp->type > 3 || !pduel)
return; return;
uint32 player = dp->type;
if(surrender[player])
return;
static const uint32 teammatemap[] = { 1, 0, 3, 2 };
uint32 teammate = teammatemap[player];
if(!surrender[teammate]) {
surrender[player] = true;
NetServer::SendPacketToPlayer(players[player], STOC_TEAMMATE_SURRENDER);
NetServer::SendPacketToPlayer(players[teammate], STOC_TEAMMATE_SURRENDER);
return;
}
static const uint32 winplayermap[] = { 1, 1, 0, 0 };
unsigned char wbuf[3]; unsigned char wbuf[3];
uint32 player = (dp->type < 2) ? 0 : 1;
wbuf[0] = MSG_WIN; wbuf[0] = MSG_WIN;
wbuf[1] = 1 - player; wbuf[1] = winplayermap[player];
wbuf[2] = 0; wbuf[2] = 0;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, wbuf, 3); NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, wbuf, 3);
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
...@@ -939,6 +951,9 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) { ...@@ -939,6 +951,9 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
} }
} }
turn_count++; turn_count++;
for(int i = 0; i < 4; ++i) {
surrender[i] = false;
}
} }
break; break;
} }
......
...@@ -50,6 +50,7 @@ protected: ...@@ -50,6 +50,7 @@ protected:
DuelPlayer* cur_player[2]; DuelPlayer* cur_player[2];
std::set<DuelPlayer*> observers; std::set<DuelPlayer*> observers;
bool ready[4]; bool ready[4];
bool surrender[4];
Deck pdeck[4]; Deck pdeck[4];
int deck_error[4]; int deck_error[4];
unsigned char hand_result[2]; unsigned char hand_result[2];
......
This diff is collapsed.
Subproject commit 5fe666ffe616a46010059560997f9525732c5457 Subproject commit 7b4f8ec113d598de98598f651f3b542931f50d27
...@@ -16,8 +16,8 @@ VALUE "InternalName", "KoishiPro" ...@@ -16,8 +16,8 @@ VALUE "InternalName", "KoishiPro"
VALUE "LegalCopyright", "Copyright (C) 2023 Nanahira" VALUE "LegalCopyright", "Copyright (C) 2023 Nanahira"
VALUE "OriginalFilename", "ygopro.exe" VALUE "OriginalFilename", "ygopro.exe"
VALUE "ProductName", "KoishiPro" VALUE "ProductName", "KoishiPro"
VALUE "FileVersion", "Snowdream" VALUE "FileVersion", "Natsukoi"
VALUE "ProductVersion", "Snowdream" VALUE "ProductVersion", "Natsukoi"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"
......
Subproject commit 59e5af144e6e35f842b1abb62bede801d5f5f005 Subproject commit bd4b306d4594b5884a1f4b4f653526484c0ae4c4
...@@ -407,7 +407,7 @@ ...@@ -407,7 +407,7 @@
!system 1352 主要信息: !system 1352 主要信息:
!system 1353 播放起始于回合: !system 1353 播放起始于回合:
!system 1354 开局默认显示所有时点 !system 1354 开局默认显示所有时点
!system 1355 是否确定盖放[%ls]? !system 1355 投降(1/2)
!system 1356 此操作将放弃对当前卡组的修改,是否继续? !system 1356 此操作将放弃对当前卡组的修改,是否继续?
!system 1357 不提示保留对卡组的修改 !system 1357 不提示保留对卡组的修改
!system 1358 键入关键字后自动进行搜索 !system 1358 键入关键字后自动进行搜索
...@@ -420,6 +420,7 @@ ...@@ -420,6 +420,7 @@
!system 1365 重命名失败,可能存在同名文件 !system 1365 重命名失败,可能存在同名文件
!system 1366 自动保存录像 !system 1366 自动保存录像
!system 1367 录像已自动保存为%ls.yrp !system 1367 录像已自动保存为%ls.yrp
!system 1368 是否确定盖放[%ls]?
!system 1369 提取卡组 !system 1369 提取卡组
!system 1370 星数↑ !system 1370 星数↑
!system 1371 攻击↑ !system 1371 攻击↑
...@@ -672,7 +673,7 @@ ...@@ -672,7 +673,7 @@
!setname 0x2 次世代 ジェネクス !setname 0x2 次世代 ジェネクス
!setname 0x1002 真次世代 レアル·ジェネクス !setname 0x1002 真次世代 レアル·ジェネクス
#!setname 0x2002 盟军·次世代 A・ジェネクス #!setname 0x2002 盟军·次世代 A・ジェネクス
#setname 0x3 N/A !setname 0x3 魅惑的女王 魅惑の女王
!setname 0x4 亚马逊 アマゾネス !setname 0x4 亚马逊 アマゾネス
!setname 0x5 秘仪之力 アルカナフォース !setname 0x5 秘仪之力 アルカナフォース
!setname 0x6 暗黑界 暗黒界 !setname 0x6 暗黑界 暗黒界
......
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