Commit 3df667a9 authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:Fluorohydride/ygopro-core into develop

parents 15b26798 2c754979
...@@ -16,19 +16,25 @@ ...@@ -16,19 +16,25 @@
#include "interpreter.h" #include "interpreter.h"
#include "buffer.h" #include "buffer.h"
static uint32_t default_card_reader(uint32_t code, card_data* data) {
return 0;
}
static uint32_t default_message_handler(intptr_t pduel, uint32_t message_type) {
return 0;
}
static script_reader sreader = default_script_reader; static script_reader sreader = default_script_reader;
static card_reader creader = default_card_reader; static card_reader creader = default_card_reader;
static message_handler mhandler = default_message_handler; static message_handler mhandler = default_message_handler;
static byte buffer[0x20000]; static byte buffer[0x100000];
static std::set<duel*> duel_set; static std::set<duel*> duel_set;
extern "C" DECL_DLLEXPORT void set_script_reader(script_reader f) { OCGCORE_API void set_script_reader(script_reader f) {
sreader = f; sreader = f;
} }
extern "C" DECL_DLLEXPORT void set_card_reader(card_reader f) { OCGCORE_API void set_card_reader(card_reader f) {
creader = f; creader = f;
} }
extern "C" DECL_DLLEXPORT void set_message_handler(message_handler f) { OCGCORE_API void set_message_handler(message_handler f) {
mhandler = f; mhandler = f;
} }
byte* read_script(const char* script_name, int* len) { byte* read_script(const char* script_name, int* len) {
...@@ -44,7 +50,7 @@ uint32_t read_card(uint32_t code, card_data* data) { ...@@ -44,7 +50,7 @@ uint32_t read_card(uint32_t code, card_data* data) {
uint32_t handle_message(void* pduel, uint32_t message_type) { uint32_t handle_message(void* pduel, uint32_t message_type) {
return mhandler((intptr_t)pduel, message_type); return mhandler((intptr_t)pduel, message_type);
} }
byte* default_script_reader(const char* script_name, int* slen) { OCGCORE_API byte* default_script_reader(const char* script_name, int* slen) {
FILE *fp; FILE *fp;
fp = std::fopen(script_name, "rb"); fp = std::fopen(script_name, "rb");
if (!fp) if (!fp)
...@@ -56,20 +62,14 @@ byte* default_script_reader(const char* script_name, int* slen) { ...@@ -56,20 +62,14 @@ byte* default_script_reader(const char* script_name, int* slen) {
*slen = (int)len; *slen = (int)len;
return buffer; return buffer;
} }
uint32_t default_card_reader(uint32_t code, card_data* data) { OCGCORE_API intptr_t create_duel(uint_fast32_t seed) {
return 0;
}
uint32_t default_message_handler(intptr_t pduel, uint32_t message_type) {
return 0;
}
extern "C" DECL_DLLEXPORT intptr_t create_duel(uint_fast32_t seed) {
duel* pduel = new duel(); duel* pduel = new duel();
duel_set.insert(pduel); duel_set.insert(pduel);
pduel->random.reset(seed); pduel->random.reset(seed);
pduel->lua->preloaded = FALSE; pduel->lua->preloaded = FALSE;
return (intptr_t)pduel; return (intptr_t)pduel;
} }
extern "C" DECL_DLLEXPORT void start_duel(intptr_t pduel, uint32_t options) { OCGCORE_API void start_duel(intptr_t pduel, uint32_t options) {
duel* pd = (duel*)pduel; duel* pd = (duel*)pduel;
if(!pd->lua->preloaded) { if(!pd->lua->preloaded) {
pd->lua->preloaded = TRUE; pd->lua->preloaded = TRUE;
...@@ -118,14 +118,14 @@ extern "C" DECL_DLLEXPORT void start_duel(intptr_t pduel, uint32_t options) { ...@@ -118,14 +118,14 @@ extern "C" DECL_DLLEXPORT void start_duel(intptr_t pduel, uint32_t options) {
} }
pd->game_field->add_process(PROCESSOR_TURN, 0, 0, 0, 0, 0); pd->game_field->add_process(PROCESSOR_TURN, 0, 0, 0, 0, 0);
} }
extern "C" DECL_DLLEXPORT void end_duel(intptr_t pduel) { OCGCORE_API void end_duel(intptr_t pduel) {
duel* pd = (duel*)pduel; duel* pd = (duel*)pduel;
if(duel_set.count(pd)) { if(duel_set.count(pd)) {
duel_set.erase(pd); duel_set.erase(pd);
delete pd; delete pd;
} }
} }
extern "C" DECL_DLLEXPORT void set_player_info(intptr_t pduel, int32_t playerid, int32_t lp, int32_t startcount, int32_t drawcount) { OCGCORE_API void set_player_info(intptr_t pduel, int32_t playerid, int32_t lp, int32_t startcount, int32_t drawcount) {
if (!check_playerid(playerid)) if (!check_playerid(playerid))
return; return;
duel* pd = (duel*)pduel; duel* pd = (duel*)pduel;
...@@ -136,17 +136,17 @@ extern "C" DECL_DLLEXPORT void set_player_info(intptr_t pduel, int32_t playerid, ...@@ -136,17 +136,17 @@ extern "C" DECL_DLLEXPORT void set_player_info(intptr_t pduel, int32_t playerid,
if(drawcount >= 0) if(drawcount >= 0)
pd->game_field->player[playerid].draw_count = drawcount; pd->game_field->player[playerid].draw_count = drawcount;
} }
extern "C" DECL_DLLEXPORT void get_log_message(intptr_t pduel, char* buf) { OCGCORE_API void get_log_message(intptr_t pduel, char* buf) {
duel* pd = (duel*)pduel; duel* pd = (duel*)pduel;
buf[0] = '\0'; buf[0] = '\0';
std::strncat(buf, pd->strbuffer, sizeof pd->strbuffer - 1); std::strncat(buf, pd->strbuffer, sizeof pd->strbuffer - 1);
} }
extern "C" DECL_DLLEXPORT int32_t get_message(intptr_t pduel, byte* buf) { OCGCORE_API int32_t get_message(intptr_t pduel, byte* buf) {
int32_t len = ((duel*)pduel)->read_buffer(buf); int32_t len = ((duel*)pduel)->read_buffer(buf);
((duel*)pduel)->clear_buffer(); ((duel*)pduel)->clear_buffer();
return len; return len;
} }
extern "C" DECL_DLLEXPORT uint32_t process(intptr_t pduel) { OCGCORE_API uint32_t process(intptr_t pduel) {
duel* pd = (duel*)pduel; duel* pd = (duel*)pduel;
uint32_t result = 0; uint32_t result = 0;
do { do {
...@@ -154,7 +154,7 @@ extern "C" DECL_DLLEXPORT uint32_t process(intptr_t pduel) { ...@@ -154,7 +154,7 @@ extern "C" DECL_DLLEXPORT uint32_t process(intptr_t pduel) {
} while ((result & PROCESSOR_BUFFER_LEN) == 0 && (result & PROCESSOR_FLAG) == 0); } while ((result & PROCESSOR_BUFFER_LEN) == 0 && (result & PROCESSOR_FLAG) == 0);
return result; return result;
} }
extern "C" DECL_DLLEXPORT void new_card(intptr_t pduel, uint32_t code, uint8_t owner, uint8_t playerid, uint8_t location, uint8_t sequence, uint8_t position) { OCGCORE_API void new_card(intptr_t pduel, uint32_t code, uint8_t owner, uint8_t playerid, uint8_t location, uint8_t sequence, uint8_t position) {
if (!check_playerid(owner) || !check_playerid(playerid)) if (!check_playerid(owner) || !check_playerid(playerid))
return; return;
duel* ptduel = (duel*)pduel; duel* ptduel = (duel*)pduel;
...@@ -176,7 +176,7 @@ extern "C" DECL_DLLEXPORT void new_card(intptr_t pduel, uint32_t code, uint8_t o ...@@ -176,7 +176,7 @@ extern "C" DECL_DLLEXPORT void new_card(intptr_t pduel, uint32_t code, uint8_t o
} }
} }
} }
extern "C" DECL_DLLEXPORT void new_tag_card(intptr_t pduel, uint32_t code, uint8_t owner, uint8_t location) { OCGCORE_API void new_tag_card(intptr_t pduel, uint32_t code, uint8_t owner, uint8_t location) {
duel* ptduel = (duel*)pduel; duel* ptduel = (duel*)pduel;
if(owner > 1 || !(location & (LOCATION_DECK | LOCATION_EXTRA))) if(owner > 1 || !(location & (LOCATION_DECK | LOCATION_EXTRA)))
return; return;
...@@ -205,7 +205,7 @@ extern "C" DECL_DLLEXPORT void new_tag_card(intptr_t pduel, uint32_t code, uint8 ...@@ -205,7 +205,7 @@ extern "C" DECL_DLLEXPORT void new_tag_card(intptr_t pduel, uint32_t code, uint8
* @param buf int32_t array * @param buf int32_t array
* @return buffer length in bytes * @return buffer length in bytes
*/ */
extern "C" DECL_DLLEXPORT int32_t query_card(intptr_t pduel, uint8_t playerid, uint8_t location, uint8_t sequence, int32_t query_flag, byte* buf, int32_t use_cache) { OCGCORE_API int32_t query_card(intptr_t pduel, uint8_t playerid, uint8_t location, uint8_t sequence, int32_t query_flag, byte* buf, int32_t use_cache) {
if (!check_playerid(playerid)) if (!check_playerid(playerid))
return LEN_FAIL; return LEN_FAIL;
duel* ptduel = (duel*)pduel; duel* ptduel = (duel*)pduel;
...@@ -239,7 +239,7 @@ extern "C" DECL_DLLEXPORT int32_t query_card(intptr_t pduel, uint8_t playerid, u ...@@ -239,7 +239,7 @@ extern "C" DECL_DLLEXPORT int32_t query_card(intptr_t pduel, uint8_t playerid, u
return LEN_EMPTY; return LEN_EMPTY;
} }
} }
extern "C" DECL_DLLEXPORT int32_t query_field_count(intptr_t pduel, uint8_t playerid, uint8_t location) { OCGCORE_API int32_t query_field_count(intptr_t pduel, uint8_t playerid, uint8_t location) {
duel* ptduel = (duel*)pduel; duel* ptduel = (duel*)pduel;
if (!check_playerid(playerid)) if (!check_playerid(playerid))
return 0; return 0;
...@@ -270,7 +270,7 @@ extern "C" DECL_DLLEXPORT int32_t query_field_count(intptr_t pduel, uint8_t play ...@@ -270,7 +270,7 @@ extern "C" DECL_DLLEXPORT int32_t query_field_count(intptr_t pduel, uint8_t play
} }
return 0; return 0;
} }
extern "C" DECL_DLLEXPORT int32_t query_field_card(intptr_t pduel, uint8_t playerid, uint8_t location, uint32_t query_flag, byte* buf, int32_t use_cache) { OCGCORE_API int32_t query_field_card(intptr_t pduel, uint8_t playerid, uint8_t location, uint32_t query_flag, byte* buf, int32_t use_cache) {
if (!check_playerid(playerid)) if (!check_playerid(playerid))
return LEN_FAIL; return LEN_FAIL;
duel* ptduel = (duel*)pduel; duel* ptduel = (duel*)pduel;
...@@ -317,7 +317,7 @@ extern "C" DECL_DLLEXPORT int32_t query_field_card(intptr_t pduel, uint8_t playe ...@@ -317,7 +317,7 @@ extern "C" DECL_DLLEXPORT int32_t query_field_card(intptr_t pduel, uint8_t playe
} }
return (int32_t)(p - buf); return (int32_t)(p - buf);
} }
extern "C" DECL_DLLEXPORT int32_t query_field_info(intptr_t pduel, byte* buf) { OCGCORE_API int32_t query_field_info(intptr_t pduel, byte* buf) {
duel* ptduel = (duel*)pduel; duel* ptduel = (duel*)pduel;
byte* p = buf; byte* p = buf;
*p++ = MSG_RELOAD_FIELD; *p++ = MSG_RELOAD_FIELD;
...@@ -361,12 +361,12 @@ extern "C" DECL_DLLEXPORT int32_t query_field_info(intptr_t pduel, byte* buf) { ...@@ -361,12 +361,12 @@ extern "C" DECL_DLLEXPORT int32_t query_field_info(intptr_t pduel, byte* buf) {
} }
return (int32_t)(p - buf); return (int32_t)(p - buf);
} }
extern "C" DECL_DLLEXPORT void set_responsei(intptr_t pduel, int32_t value) { OCGCORE_API void set_responsei(intptr_t pduel, int32_t value) {
((duel*)pduel)->set_responsei(value); ((duel*)pduel)->set_responsei(value);
} }
extern "C" DECL_DLLEXPORT void set_responseb(intptr_t pduel, byte* buf) { OCGCORE_API void set_responseb(intptr_t pduel, byte* buf) {
((duel*)pduel)->set_responseb(buf); ((duel*)pduel)->set_responseb(buf);
} }
extern "C" DECL_DLLEXPORT int32_t preload_script(intptr_t pduel, const char* script_name) { OCGCORE_API int32_t preload_script(intptr_t pduel, const char* script_name) {
return ((duel*)pduel)->lua->load_script(script_name); return ((duel*)pduel)->lua->load_script(script_name);
} }
...@@ -10,10 +10,16 @@ ...@@ -10,10 +10,16 @@
#include "common.h" #include "common.h"
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif
#ifdef _WIN32 #ifdef _WIN32
#define DECL_DLLEXPORT __declspec(dllexport) #define OCGCORE_API EXTERN_C __declspec(dllexport)
#else #else
#define DECL_DLLEXPORT #define OCGCORE_API EXTERN_C __attribute__ ((visibility ("default")))
#endif #endif
#define LEN_FAIL 0 #define LEN_FAIL 0
...@@ -21,42 +27,36 @@ ...@@ -21,42 +27,36 @@
#define LEN_HEADER 8 #define LEN_HEADER 8
#define TEMP_CARD_ID 0 #define TEMP_CARD_ID 0
class card;
struct card_data; struct card_data;
class group;
class effect;
class interpreter;
typedef byte* (*script_reader)(const char*, int*); typedef byte* (*script_reader)(const char* script_name, int* len);
typedef uint32_t (*card_reader)(uint32_t, card_data*); typedef uint32_t (*card_reader)(uint32_t code, card_data* data);
typedef uint32_t (*message_handler)(intptr_t, uint32_t); typedef uint32_t (*message_handler)(intptr_t pduel, uint32_t msg_type);
extern "C" DECL_DLLEXPORT void set_script_reader(script_reader f); OCGCORE_API void set_script_reader(script_reader f);
extern "C" DECL_DLLEXPORT void set_card_reader(card_reader f); OCGCORE_API void set_card_reader(card_reader f);
extern "C" DECL_DLLEXPORT void set_message_handler(message_handler f); OCGCORE_API void set_message_handler(message_handler f);
byte* read_script(const char* script_name, int* len); byte* read_script(const char* script_name, int* len);
uint32_t read_card(uint32_t code, card_data* data); uint32_t read_card(uint32_t code, card_data* data);
uint32_t handle_message(void* pduel, uint32_t message_type); uint32_t handle_message(void* pduel, uint32_t message_type);
extern "C" DECL_DLLEXPORT intptr_t create_duel(uint_fast32_t seed); OCGCORE_API intptr_t create_duel(uint_fast32_t seed);
extern "C" DECL_DLLEXPORT void start_duel(intptr_t pduel, uint32_t options); OCGCORE_API void start_duel(intptr_t pduel, uint32_t options);
extern "C" DECL_DLLEXPORT void end_duel(intptr_t pduel); OCGCORE_API void end_duel(intptr_t pduel);
extern "C" DECL_DLLEXPORT void set_player_info(intptr_t pduel, int32_t playerid, int32_t lp, int32_t startcount, int32_t drawcount); OCGCORE_API void set_player_info(intptr_t pduel, int32_t playerid, int32_t lp, int32_t startcount, int32_t drawcount);
extern "C" DECL_DLLEXPORT void get_log_message(intptr_t pduel, char* buf); OCGCORE_API void get_log_message(intptr_t pduel, char* buf);
extern "C" DECL_DLLEXPORT int32_t get_message(intptr_t pduel, byte* buf); OCGCORE_API int32_t get_message(intptr_t pduel, byte* buf);
extern "C" DECL_DLLEXPORT uint32_t process(intptr_t pduel); OCGCORE_API uint32_t process(intptr_t pduel);
extern "C" DECL_DLLEXPORT void new_card(intptr_t pduel, uint32_t code, uint8_t owner, uint8_t playerid, uint8_t location, uint8_t sequence, uint8_t position); OCGCORE_API void new_card(intptr_t pduel, uint32_t code, uint8_t owner, uint8_t playerid, uint8_t location, uint8_t sequence, uint8_t position);
extern "C" DECL_DLLEXPORT void new_tag_card(intptr_t pduel, uint32_t code, uint8_t owner, uint8_t location); OCGCORE_API void new_tag_card(intptr_t pduel, uint32_t code, uint8_t owner, uint8_t location);
extern "C" DECL_DLLEXPORT int32_t query_card(intptr_t pduel, uint8_t playerid, uint8_t location, uint8_t sequence, int32_t query_flag, byte* buf, int32_t use_cache); OCGCORE_API int32_t query_card(intptr_t pduel, uint8_t playerid, uint8_t location, uint8_t sequence, int32_t query_flag, byte* buf, int32_t use_cache);
extern "C" DECL_DLLEXPORT int32_t query_field_count(intptr_t pduel, uint8_t playerid, uint8_t location); OCGCORE_API int32_t query_field_count(intptr_t pduel, uint8_t playerid, uint8_t location);
extern "C" DECL_DLLEXPORT int32_t query_field_card(intptr_t pduel, uint8_t playerid, uint8_t location, uint32_t query_flag, byte* buf, int32_t use_cache); OCGCORE_API int32_t query_field_card(intptr_t pduel, uint8_t playerid, uint8_t location, uint32_t query_flag, byte* buf, int32_t use_cache);
extern "C" DECL_DLLEXPORT int32_t query_field_info(intptr_t pduel, byte* buf); OCGCORE_API int32_t query_field_info(intptr_t pduel, byte* buf);
extern "C" DECL_DLLEXPORT void set_responsei(intptr_t pduel, int32_t value); OCGCORE_API void set_responsei(intptr_t pduel, int32_t value);
extern "C" DECL_DLLEXPORT void set_responseb(intptr_t pduel, byte* buf); OCGCORE_API void set_responseb(intptr_t pduel, byte* buf);
extern "C" DECL_DLLEXPORT int32_t preload_script(intptr_t pduel, const char* script_name); OCGCORE_API int32_t preload_script(intptr_t pduel, const char* script_name);
byte* default_script_reader(const char* script_name, int* len); OCGCORE_API byte* default_script_reader(const char* script_name, int* len);
uint32_t default_card_reader(uint32_t code, card_data* data);
uint32_t default_message_handler(intptr_t pduel, uint32_t msg_type);
#endif /* OCGAPI_H_ */ #endif /* OCGAPI_H_ */
...@@ -3,13 +3,11 @@ project "ocgcore" ...@@ -3,13 +3,11 @@ project "ocgcore"
cppdialect "C++14" cppdialect "C++14"
files { "*.cpp", "*.h" } files { "*.cpp", "*.h" }
links { LUA_LIB_NAME }
if BUILD_LUA then if BUILD_LUA then
includedirs { "../lua/src" } includedirs { "../lua/src" }
else else
includedirs { LUA_INCLUDE_DIR } includedirs { LUA_INCLUDE_DIR }
libdirs { LUA_LIB_DIR }
end end
filter "system:bsd" filter "system:bsd"
......
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