Commit 16c4d4b2 authored by salix5's avatar salix5

update class duel, API process()

parent 8799b7a1
......@@ -29,6 +29,15 @@ typedef signed char int8;
#define OPERATION_CANCELED -1
#define TRUE 1
#define FALSE 0
#define MESSAGE_BUFFER_SIZE 0x2000
#define QUERY_BUFFER_SIZE 0x4000
#define PROCESSOR_BUFFER_LEN 0x0fffffff
#define PROCESSOR_FLAG 0xf0000000
#define PROCESSOR_NONE 0
#define PROCESSOR_WAITING 0x10000000
#define PROCESSOR_END 0x20000000
#ifndef NULL
#define NULL 0
#endif
......
......@@ -17,7 +17,7 @@ duel::duel() {
lua = new interpreter(this);
game_field = new field(this);
game_field->temp_card = new_card(0);
clear_buffer();
message_buffer.reserve(MESSAGE_BUFFER_SIZE);
}
duel::~duel() {
for(auto& pcard : cards)
......@@ -95,8 +95,9 @@ void duel::delete_effect(effect* peffect) {
delete peffect;
}
int32 duel::read_buffer(byte* buf) {
std::memcpy(buf, message_buffer, bufferlen);
return bufferlen;
if(message_buffer.size())
std::memcpy(buf, message_buffer.data(), message_buffer.size());
return (int32)message_buffer.size();
}
void duel::release_script_group() {
for(auto& pgroup : sgroups) {
......@@ -113,24 +114,20 @@ void duel::restore_assumes() {
pcard->assume_type = 0;
assumes.clear();
}
void duel::write_buffer(const void* data, int size) {
write_buffer_vector(message_buffer, data, size);
}
void duel::write_buffer32(uint32 value) {
std::memcpy(bufferp, &value, sizeof(value));
bufferp += 4;
bufferlen += 4;
write_buffer(&value, sizeof(value));
}
void duel::write_buffer16(uint16 value) {
std::memcpy(bufferp, &value, sizeof(value));
bufferp += 2;
bufferlen += 2;
write_buffer(&value, sizeof(value));
}
void duel::write_buffer8(uint8 value) {
std::memcpy(bufferp, &value, sizeof(value));
bufferp += 1;
bufferlen += 1;
write_buffer(&value, sizeof(value));
}
void duel::clear_buffer() {
bufferlen = 0;
bufferp = message_buffer;
message_buffer.clear();
}
void duel::set_responsei(uint32 resp) {
game_field->returns.ivalue[0] = resp;
......
......@@ -13,21 +13,25 @@
#include <set>
#include <unordered_set>
#define BUFFER_SIZE 4096
class card;
class group;
class effect;
class field;
class interpreter;
inline void write_buffer_vector(std::vector<byte>& buffer, const void* data, int size) {
if (size > 0) {
const auto len = buffer.size();
buffer.resize(len + size);
std::memcpy(&buffer[len], data, size);
}
}
class duel {
public:
using card_set = std::set<card*, card_sort>;
char strbuffer[256];
byte message_buffer[BUFFER_SIZE];
int32 bufferlen;
byte* bufferp;
std::vector<byte> message_buffer;
interpreter* lua;
field* game_field;
mt19937 random;
......@@ -53,6 +57,7 @@ public:
void release_script_group();
void restore_assumes();
int32 read_buffer(byte* buf);
void write_buffer(const void* data, int size);
void write_buffer32(uint32 value);
void write_buffer16(uint16 value);
void write_buffer8(uint8 value);
......
......@@ -501,7 +501,7 @@ public:
int32 is_able_to_enter_bp();
void add_process(uint16 type, uint16 step, effect* peffect, group* target, int32 arg1, int32 arg2, int32 arg3 = 0, int32 arg4 = 0, void* ptr1 = nullptr, void* ptr2 = nullptr);
int32 process();
uint32 process();
int32 execute_cost(uint16 step, effect* peffect, uint8 triggering_player);
int32 execute_operation(uint16 step, effect* peffect, uint8 triggering_player);
int32 execute_target(uint16 step, effect* peffect, uint8 triggering_player);
......@@ -704,9 +704,6 @@ public:
#define GLOBALFLAG_TUNE_MAGICIAN 0x400
#define GLOBALFLAG_ACTIVATION_COUNT 0x800
//
#define PROCESSOR_NONE 0
#define PROCESSOR_WAITING 0x10000
#define PROCESSOR_END 0x20000
#define PROCESSOR_ADJUST 1
#define PROCESSOR_HINT 2
......
......@@ -174,9 +174,7 @@ int32 scriptlib::debug_set_ai_name(lua_State *L) {
if(len > 100)
len = 100;
pduel->write_buffer16(len);
for (int i = 0; i < len; ++i) {
pduel->write_buffer8(pstr[i]);
}
pduel->write_buffer(pstr, len);
pduel->write_buffer8(0);
return 0;
}
......@@ -190,9 +188,7 @@ int32 scriptlib::debug_show_hint(lua_State *L) {
if(len > 1024)
len = 1024;
pduel->write_buffer16(len);
for (int i = 0; i < len; ++i) {
pduel->write_buffer8(pstr[i]);
}
pduel->write_buffer(pstr, len);
pduel->write_buffer8(0);
return 0;
}
......
......@@ -127,11 +127,12 @@ extern "C" DECL_DLLEXPORT int32 get_message(intptr_t pduel, byte* buf) {
((duel*)pduel)->clear_buffer();
return len;
}
extern "C" DECL_DLLEXPORT int32 process(intptr_t pduel) {
extern "C" DECL_DLLEXPORT uint32 process(intptr_t pduel) {
duel* pd = (duel*)pduel;
int result = pd->game_field->process();
while((result & 0xffff) == 0 && (result & 0xf0000) == 0)
uint32 result = 0;
do {
result = pd->game_field->process();
} while ((result & PROCESSOR_BUFFER_LEN) == 0 && (result & PROCESSOR_FLAG) == 0);
return result;
}
extern "C" DECL_DLLEXPORT void new_card(intptr_t pduel, uint32 code, uint8 owner, uint8 playerid, uint8 location, uint8 sequence, uint8 position) {
......
......@@ -41,7 +41,7 @@ extern "C" DECL_DLLEXPORT void end_duel(intptr_t pduel);
extern "C" DECL_DLLEXPORT void set_player_info(intptr_t pduel, int32 playerid, int32 lp, int32 startcount, int32 drawcount);
extern "C" DECL_DLLEXPORT void get_log_message(intptr_t pduel, byte* buf);
extern "C" DECL_DLLEXPORT int32 get_message(intptr_t pduel, byte* buf);
extern "C" DECL_DLLEXPORT int32 process(intptr_t pduel);
extern "C" DECL_DLLEXPORT uint32 process(intptr_t pduel);
extern "C" DECL_DLLEXPORT void new_card(intptr_t pduel, uint32 code, uint8 owner, uint8 playerid, uint8 location, uint8 sequence, uint8 position);
extern "C" DECL_DLLEXPORT void new_tag_card(intptr_t pduel, uint32 code, uint8 owner, uint8 location);
extern "C" DECL_DLLEXPORT int32 query_card(intptr_t pduel, uint8 playerid, uint8 location, uint8 sequence, int32 query_flag, byte* buf, int32 use_cache);
......
This diff is collapsed.
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