Commit 6a61bc16 authored by nanahira's avatar nanahira

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

parents c5d72671 476c8892
#ifndef BUFFER_H
#define BUFFER_H
#include <cstring>
#include <vector>
inline void buffer_read_block(unsigned char*& p, void* dest, size_t size) {
std::memcpy(dest, p, size);
p += size;
}
template<typename T>
inline T buffer_read(unsigned char*& p) {
T ret{};
buffer_read_block(p, &ret, sizeof(T));
return ret;
}
inline void buffer_write_block(unsigned char*& p, const void* src, size_t size) {
std::memcpy(p, src, size);
p += size;
}
template<typename T>
inline void buffer_write(unsigned char*& p, T value) {
buffer_write_block(p, &value,sizeof(T));
}
inline void vector_write_block(std::vector<unsigned char>& buffer, const void* src, size_t size) {
const auto len = buffer.size();
buffer.resize(len + size);
std::memcpy(&buffer[len], src, size);
}
template<typename T>
inline void vector_write(std::vector<unsigned char>& buffer, T value) {
vector_write_block(buffer, &value, sizeof(T));
}
#endif //BUFFER_H
This diff is collapsed.
...@@ -13,14 +13,7 @@ ...@@ -13,14 +13,7 @@
#include "effect.h" #include "effect.h"
#include "group.h" #include "group.h"
#include "ocgapi.h" #include "ocgapi.h"
#include "buffer.h"
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);
}
}
duel::duel() { duel::duel() {
lua = new interpreter(this); lua = new interpreter(this);
...@@ -125,16 +118,16 @@ void duel::restore_assumes() { ...@@ -125,16 +118,16 @@ void duel::restore_assumes() {
assumes.clear(); assumes.clear();
} }
void duel::write_buffer(const void* data, int size) { void duel::write_buffer(const void* data, int size) {
write_buffer_vector(message_buffer, data, size); vector_write_block(message_buffer, data, size);
} }
void duel::write_buffer32(uint32 value) { void duel::write_buffer32(uint32 value) {
write_buffer(&value, sizeof(value)); vector_write<uint32_t>(message_buffer, value);
} }
void duel::write_buffer16(uint16 value) { void duel::write_buffer16(uint16 value) {
write_buffer(&value, sizeof(value)); vector_write<uint16_t>(message_buffer, value);
} }
void duel::write_buffer8(uint8 value) { void duel::write_buffer8(uint8 value) {
write_buffer(&value, sizeof(value)); vector_write<unsigned char>(message_buffer, value);
} }
void duel::clear_buffer() { void duel::clear_buffer() {
message_buffer.clear(); message_buffer.clear();
......
...@@ -206,9 +206,16 @@ int32 effect::get_required_handorset_effects(effect_set* eset, uint8 playerid, c ...@@ -206,9 +206,16 @@ int32 effect::get_required_handorset_effects(effect_set* eset, uint8 playerid, c
int32 available = 0; int32 available = 0;
effect_set tmp_eset; effect_set tmp_eset;
handler->filter_effect(ecode, &tmp_eset); handler->filter_effect(ecode, &tmp_eset);
if(!tmp_eset.size())
return available;
effect* oreason = pduel->game_field->core.reason_effect;
uint8 op = pduel->game_field->core.reason_player;
pduel->game_field->core.reason_player = playerid;
pduel->game_field->save_lp_cost();
for(int32 i = 0; i < tmp_eset.size(); ++i) { for(int32 i = 0; i < tmp_eset.size(); ++i) {
auto peffect = tmp_eset[i]; auto peffect = tmp_eset[i];
if(peffect->check_count_limit(playerid)) { if(peffect->check_count_limit(playerid)) {
pduel->game_field->core.reason_effect = peffect;
pduel->lua->add_param(peffect, PARAM_TYPE_EFFECT); pduel->lua->add_param(peffect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(playerid, PARAM_TYPE_INT); pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(e.event_cards , PARAM_TYPE_GROUP); pduel->lua->add_param(e.event_cards , PARAM_TYPE_GROUP);
...@@ -225,6 +232,9 @@ int32 effect::get_required_handorset_effects(effect_set* eset, uint8 playerid, c ...@@ -225,6 +232,9 @@ int32 effect::get_required_handorset_effects(effect_set* eset, uint8 playerid, c
} }
} }
} }
pduel->game_field->core.reason_effect = oreason;
pduel->game_field->core.reason_player = op;
pduel->game_field->restore_lp_cost();
return available; return available;
} }
// check if an EFFECT_TYPE_ACTIONS effect can be activated // check if an EFFECT_TYPE_ACTIONS effect can be activated
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "effect.h" #include "effect.h"
#include "field.h" #include "field.h"
#include "interpreter.h" #include "interpreter.h"
#include "buffer.h"
#include <set> #include <set>
static script_reader sreader = default_script_reader; static script_reader sreader = default_script_reader;
...@@ -206,7 +207,7 @@ extern "C" DECL_DLLEXPORT int32 query_card(intptr_t pduel, uint8 playerid, uint8 ...@@ -206,7 +207,7 @@ extern "C" DECL_DLLEXPORT int32 query_card(intptr_t pduel, uint8 playerid, uint8
return pcard->get_infos(buf, query_flag, use_cache); return pcard->get_infos(buf, query_flag, use_cache);
} }
else { else {
*((int32*)buf) = LEN_EMPTY; buffer_write<int32_t>(buf, LEN_EMPTY);
return LEN_EMPTY; return LEN_EMPTY;
} }
} }
...@@ -253,8 +254,7 @@ extern "C" DECL_DLLEXPORT int32 query_field_card(intptr_t pduel, uint8 playerid, ...@@ -253,8 +254,7 @@ extern "C" DECL_DLLEXPORT int32 query_field_card(intptr_t pduel, uint8 playerid,
int32 clen = pcard->get_infos(p, query_flag, use_cache); int32 clen = pcard->get_infos(p, query_flag, use_cache);
p += clen; p += clen;
} else { } else {
*((int32*)p) = LEN_EMPTY; buffer_write<int32_t>(p, LEN_EMPTY);
p += LEN_EMPTY;
} }
} }
} }
...@@ -264,8 +264,7 @@ extern "C" DECL_DLLEXPORT int32 query_field_card(intptr_t pduel, uint8 playerid, ...@@ -264,8 +264,7 @@ extern "C" DECL_DLLEXPORT int32 query_field_card(intptr_t pduel, uint8 playerid,
int32 clen = pcard->get_infos(p, query_flag, use_cache); int32 clen = pcard->get_infos(p, query_flag, use_cache);
p += clen; p += clen;
} else { } else {
*((int32*)p) = LEN_EMPTY; buffer_write<int32_t>(p, LEN_EMPTY);
p += LEN_EMPTY;
} }
} }
} }
...@@ -297,8 +296,7 @@ extern "C" DECL_DLLEXPORT int32 query_field_info(intptr_t pduel, byte* buf) { ...@@ -297,8 +296,7 @@ extern "C" DECL_DLLEXPORT int32 query_field_info(intptr_t pduel, byte* buf) {
*p++ = ptduel->game_field->core.duel_rule; *p++ = ptduel->game_field->core.duel_rule;
for(int playerid = 0; playerid < 2; ++playerid) { for(int playerid = 0; playerid < 2; ++playerid) {
auto& player = ptduel->game_field->player[playerid]; auto& player = ptduel->game_field->player[playerid];
*((int*)p) = player.lp; buffer_write<int32_t>(p, player.lp);
p += 4;
for(auto& pcard : player.list_mzone) { for(auto& pcard : player.list_mzone) {
if(pcard) { if(pcard) {
*p++ = 1; *p++ = 1;
...@@ -326,15 +324,12 @@ extern "C" DECL_DLLEXPORT int32 query_field_info(intptr_t pduel, byte* buf) { ...@@ -326,15 +324,12 @@ extern "C" DECL_DLLEXPORT int32 query_field_info(intptr_t pduel, byte* buf) {
*p++ = (uint8)ptduel->game_field->core.current_chain.size(); *p++ = (uint8)ptduel->game_field->core.current_chain.size();
for(const auto& ch : ptduel->game_field->core.current_chain) { for(const auto& ch : ptduel->game_field->core.current_chain) {
effect* peffect = ch.triggering_effect; effect* peffect = ch.triggering_effect;
*((int*)p) = peffect->get_handler()->data.code; buffer_write<uint32_t>(p, peffect->get_handler()->data.code);
p += 4; buffer_write<uint32_t>(p, peffect->get_handler()->get_info_location());
*((int*)p) = peffect->get_handler()->get_info_location();
p += 4;
*p++ = ch.triggering_controler; *p++ = ch.triggering_controler;
*p++ = (uint8)ch.triggering_location; *p++ = (uint8)ch.triggering_location;
*p++ = ch.triggering_sequence; *p++ = ch.triggering_sequence;
*((int*)p) = peffect->description; buffer_write<uint32_t>(p, peffect->description);
p += 4;
} }
return (int32)(p - buf); return (int32)(p - buf);
} }
......
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