Commit 3781c056 authored by nanahira's avatar nanahira

merge upstream

parents 335f5728 9273069d
...@@ -283,7 +283,7 @@ jobs: ...@@ -283,7 +283,7 @@ jobs:
repo_token: "${{ secrets.GITHUB_TOKEN }}" repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "server-latest" automatic_release_tag: "server-latest"
prerelease: true prerelease: true
title: "Development Build" title: "Development Build (Server Mode)"
files: | files: |
x64/ygopro.exe x64/ygopro.exe
x64/AI.Server.exe x64/AI.Server.exe
\ No newline at end of file
...@@ -86,8 +86,9 @@ void DuelInfo::Clear() { ...@@ -86,8 +86,9 @@ void DuelInfo::Clear() {
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
unsigned short server_port; unsigned short server_port;
unsigned short replay_mode; unsigned short replay_mode;
unsigned int pre_seed[5]; uint32_t pre_seed[MAX_MATCH_COUNT][SEED_COUNT];
unsigned int duel_flags; uint8_t pre_seed_specified[MAX_MATCH_COUNT];
uint32_t duel_flags;
HostInfo game_info; HostInfo game_info;
void Game::MainServerLoop() { void Game::MainServerLoop() {
......
...@@ -717,11 +717,14 @@ public: ...@@ -717,11 +717,14 @@ public:
extern Game* mainGame; extern Game* mainGame;
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
#define MAX_MATCH_COUNT 3
extern unsigned short server_port; extern unsigned short server_port;
extern unsigned short replay_mode; extern unsigned short replay_mode;
extern HostInfo game_info; extern HostInfo game_info;
extern unsigned int pre_seed[5]; extern uint32_t pre_seed[MAX_MATCH_COUNT][SEED_COUNT];
extern unsigned int duel_flags; extern uint8_t pre_seed_specified[MAX_MATCH_COUNT];
extern uint32_t duel_flags;
#endif #endif
} }
......
...@@ -8,6 +8,9 @@ ...@@ -8,6 +8,9 @@
#ifdef __APPLE__ #ifdef __APPLE__
#import <CoreFoundation/CoreFoundation.h> #import <CoreFoundation/CoreFoundation.h>
#endif #endif
#ifdef YGOPRO_SERVER_MODE
#include "base64.h"
#endif
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
#include <sstream> #include <sstream>
...@@ -121,8 +124,8 @@ int main(int argc, char* argv[]) { ...@@ -121,8 +124,8 @@ int main(int argc, char* argv[]) {
ygo::game_info.no_shuffle_deck = false; ygo::game_info.no_shuffle_deck = false;
ygo::game_info.duel_rule = YGOPRO_DEFAULT_DUEL_RULE; ygo::game_info.duel_rule = YGOPRO_DEFAULT_DUEL_RULE;
ygo::game_info.time_limit = 180; ygo::game_info.time_limit = 180;
for (int i = 0; i < 5; ++i) std::memset(ygo::pre_seed, 0, sizeof(ygo::pre_seed));
ygo::pre_seed[i] = (unsigned int)0; std::memset(ygo::pre_seed_specified, 0, sizeof(ygo::pre_seed_specified));
if (argc == 2) { if (argc == 2) {
int code = atoi(argv[1]); int code = atoi(argv[1]);
ygo::mainGame = &_game; ygo::mainGame = &_game;
...@@ -165,9 +168,28 @@ int main(int argc, char* argv[]) { ...@@ -165,9 +168,28 @@ int main(int argc, char* argv[]) {
ygo::game_info.draw_count = atoi(argv[10]); ygo::game_info.draw_count = atoi(argv[10]);
ygo::game_info.time_limit = atoi(argv[11]); ygo::game_info.time_limit = atoi(argv[11]);
ygo::replay_mode = atoi(argv[12]); ygo::replay_mode = atoi(argv[12]);
for (int i = 13; (i < argc && i <= 17) ; ++i) for (int i = 13; (i < argc && i < (13 + MAX_MATCH_COUNT)) ; ++i)
{ {
ygo::pre_seed[i - 13] = (unsigned int)atol(argv[i]); auto ok = Base64::Decode(
reinterpret_cast<const unsigned char*>(argv[i]),
strlen(argv[i]),
reinterpret_cast<unsigned char*>(ygo::pre_seed[i - 13]),
SEED_COUNT * sizeof(uint32_t)
);
if(ok) {
// check if it isn't all zero
bool all_zero = true;
for (int j = 0; j < SEED_COUNT; ++j) {
if (ygo::pre_seed[i - 13][j] != 0) {
all_zero = false;
break;
}
}
if (!all_zero)
ygo::pre_seed_specified[i - 13] = 1;
}
else
std::fprintf(stderr, "Failed to decode seed %d: %s\n", i - 13, argv[i]);
} }
} }
ygo::mainGame = &_game; ygo::mainGame = &_game;
......
...@@ -561,6 +561,11 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -561,6 +561,11 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
rh.base.version = PRO_VERSION; rh.base.version = PRO_VERSION;
rh.base.flag = REPLAY_UNIFORM; rh.base.flag = REPLAY_UNIFORM;
rh.base.start_time = (uint32_t)std::time(nullptr); rh.base.start_time = (uint32_t)std::time(nullptr);
#ifdef YGOPRO_SERVER_MODE
if(pre_seed_specified[duel_count])
memcpy(rh.seed_sequence, pre_seed[duel_count], SEED_COUNT * sizeof(uint32_t));
else
#endif
for (auto& x : rh.seed_sequence) for (auto& x : rh.seed_sequence)
x = rd(); x = rd();
mtrandom rnd(rh.seed_sequence, SEED_COUNT); mtrandom rnd(rh.seed_sequence, SEED_COUNT);
...@@ -2352,14 +2357,13 @@ void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) { ...@@ -2352,14 +2357,13 @@ void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
void SingleDuel::TestCard(int code) { void SingleDuel::TestCard(int code) {
std::random_device rd; std::random_device rd;
unsigned int seed = rd(); uint32_t seed[SEED_COUNT];
mt19937 rnd(seed); for(int i = 0; i < SEED_COUNT; ++i)
unsigned int duel_seed = rnd.rand(); seed[i] = rd();
set_script_reader((script_reader)DataManager::ScriptReaderEx); set_script_reader((script_reader)DataManager::ScriptReaderEx);
set_card_reader((card_reader)DataManager::CardReader); set_card_reader((card_reader)DataManager::CardReader);
set_message_handler((message_handler)SingleDuel::MessageHandler); set_message_handler((message_handler)SingleDuel::MessageHandler);
rnd.reset(seed); unsigned long tduel = create_duel_v2(seed);
unsigned long tduel = create_duel(duel_seed);
preload_script(tduel, "./script/special.lua"); preload_script(tduel, "./script/special.lua");
preload_script(tduel, "./script/init.lua"); preload_script(tduel, "./script/init.lua");
set_player_info(tduel, 0, 8000, 5, 1); set_player_info(tduel, 0, 8000, 5, 1);
......
...@@ -538,6 +538,11 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -538,6 +538,11 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
rh.base.version = PRO_VERSION; rh.base.version = PRO_VERSION;
rh.base.flag = REPLAY_UNIFORM | REPLAY_TAG; rh.base.flag = REPLAY_UNIFORM | REPLAY_TAG;
rh.base.start_time = (uint32_t)std::time(nullptr); rh.base.start_time = (uint32_t)std::time(nullptr);
#ifdef YGOPRO_SERVER_MODE
if(pre_seed_specified[0])
memcpy(rh.seed_sequence, pre_seed[0], SEED_COUNT * sizeof(uint32_t));
else
#endif
for (auto& x : rh.seed_sequence) for (auto& x : rh.seed_sequence)
x = rd(); x = rd();
mtrandom rnd(rh.seed_sequence, SEED_COUNT); mtrandom rnd(rh.seed_sequence, SEED_COUNT);
......
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