Commit 5807ac79 authored by nanahira's avatar nanahira

merge

parents 69cbfa06 acaf4937
This diff is collapsed.
......@@ -100,11 +100,12 @@ public:
typedef std::unordered_map<effect*, effect_container::iterator> effect_indexer;
typedef std::unordered_set<std::pair<effect*, uint16>, effect_relation_hash> effect_relation;
typedef std::unordered_map<card*, uint32> relation_map;
typedef std::map<uint16, std::array<uint16, 2> > counter_map;
typedef std::map<uint16, std::array<uint16, 2>> counter_map;
typedef std::map<uint32, int32> effect_count;
class attacker_map : public std::unordered_map<uint16, std::pair<card*, uint32> > {
class attacker_map : public std::unordered_map<uint16, std::pair<card*, uint32>> {
public:
void addcard(card* pcard);
uint32 findcard(card* pcard);
};
//millux
......@@ -148,6 +149,7 @@ public:
uint32 position_param;
uint32 spsummon_param;
uint32 to_field_param;
uint8 attack_announce_count;
uint8 direct_attackable;
uint8 announce_count;
uint8 attacked_count;
......
......@@ -12,7 +12,6 @@
#include "effect.h"
#include "group.h"
#include "ocgapi.h"
#include <memory.h>
duel::duel() {
lua = new interpreter(this);
......@@ -23,22 +22,22 @@ duel::duel() {
clear_buffer();
}
duel::~duel() {
for(auto cit = cards.begin(); cit != cards.end(); ++cit)
delete *cit;
for(auto git = groups.begin(); git != groups.end(); ++git)
delete *git;
for(auto eit = effects.begin(); eit != effects.end(); ++eit)
delete *eit;
for(auto& pcard : cards)
delete pcard;
for(auto& pgroup : groups)
delete pgroup;
for(auto& peffect : effects)
delete peffect;
delete lua;
delete game_field;
}
void duel::clear() {
for(auto cit = cards.begin(); cit != cards.end(); ++cit)
delete *cit;
for(auto git = groups.begin(); git != groups.end(); ++git)
delete *git;
for(auto eit = effects.begin(); eit != effects.end(); ++eit)
delete *eit;
for(auto& pcard : cards)
delete pcard;
for(auto& pgroup : groups)
delete pgroup;
for(auto& peffect : effects)
delete peffect;
delete game_field;
cards.clear();
groups.clear();
......@@ -100,12 +99,11 @@ void duel::delete_effect(effect* peffect) {
delete peffect;
}
int32 duel::read_buffer(byte* buf) {
memcpy(buf, buffer, bufferlen);
std::memcpy(buf, buffer, bufferlen);
return bufferlen;
}
void duel::release_script_group() {
for(auto sit = sgroups.begin(); sit != sgroups.end(); ++sit) {
group* pgroup = *sit;
for(auto& pgroup : sgroups) {
if(pgroup->is_readonly == 0) {
lua->unregister_group(pgroup);
groups.erase(pgroup);
......@@ -115,8 +113,8 @@ void duel::release_script_group() {
sgroups.clear();
}
void duel::restore_assumes() {
for(auto sit = assumes.begin(); sit != assumes.end(); ++sit)
(*sit)->assume_type = 0;
for(auto& pcard : assumes)
pcard->assume_type = 0;
assumes.clear();
}
void duel::write_buffer32(uint32 value) {
......@@ -142,7 +140,7 @@ void duel::set_responsei(uint32 resp) {
game_field->returns.ivalue[0] = resp;
}
void duel::set_responseb(byte* resp) {
memcpy(game_field->returns.bvalue, resp, 64);
std::memcpy(game_field->returns.bvalue, resp, 64);
}
int32 duel::get_next_integer(int32 l, int32 h) {
return (int32) (random.real() * (h - l + 1)) + l;
......
......@@ -191,18 +191,7 @@ int32 effect::is_activateable(uint8 playerid, const tevent& e, int32 neglect_con
&& !pduel->game_field->get_cteffect(this, playerid, FALSE))
return FALSE;
}
// additional check for each location
if(handler->current.location == LOCATION_HAND) {
if(handler->data.type & TYPE_MONSTER) {
if(!(handler->data.type & TYPE_PENDULUM))
return FALSE;
if(!pduel->game_field->is_location_useable(playerid, LOCATION_PZONE, 0)
&& !pduel->game_field->is_location_useable(playerid, LOCATION_PZONE, 1))
return FALSE;
} else if(!(handler->data.type & TYPE_FIELD)
&& pduel->game_field->get_useable_count(handler, playerid, LOCATION_SZONE, playerid, LOCATION_REASON_TOFIELD) <= 0)
return FALSE;
} else if(handler->current.location == LOCATION_SZONE) {
if(handler->current.location == LOCATION_SZONE) {
if(handler->is_position(POS_FACEUP))
return FALSE;
if(handler->equiping_target)
......@@ -211,6 +200,16 @@ int32 effect::is_activateable(uint8 playerid, const tevent& e, int32 neglect_con
if((handler->data.type & TYPE_SPELL) && (handler->data.type & TYPE_QUICKPLAY))
return FALSE;
}
} else {
if(handler->data.type & TYPE_MONSTER) {
if(!(handler->data.type & TYPE_PENDULUM))
return FALSE;
if(!pduel->game_field->is_location_useable(playerid, LOCATION_PZONE, 0)
&& !pduel->game_field->is_location_useable(playerid, LOCATION_PZONE, 1))
return FALSE;
} else if(!(handler->data.type & TYPE_FIELD)
&& pduel->game_field->get_useable_count(handler, playerid, LOCATION_SZONE, playerid, LOCATION_REASON_TOFIELD) <= 0)
return FALSE;
}
// check activate in hand/in set turn
int32 ecode = 0;
......@@ -498,9 +497,8 @@ int32 effect::is_player_effect_target(card* pcard) {
}
int32 effect::is_immuned(card* pcard) {
effect_set_v effects = pcard->immune_effect;
effect* peffect;
for (int32 i = 0; i < effects.size(); ++i) {
peffect = effects.at(i);
effect* peffect = effects.at(i);
if(peffect->value) {
pduel->lua->add_param(this, PARAM_TYPE_EFFECT);
pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
......@@ -525,18 +523,18 @@ int32 effect::is_chainable(uint8 tp) {
} else if(sp < pduel->game_field->core.current_chain.rbegin()->triggering_effect->get_speed())
return FALSE;
}
for(auto it = pduel->game_field->core.chain_limit.begin(); it != pduel->game_field->core.chain_limit.end(); ++it) {
for(const auto& ch_lim : pduel->game_field->core.chain_limit) {
pduel->lua->add_param(this, PARAM_TYPE_EFFECT);
pduel->lua->add_param(it->player, PARAM_TYPE_INT);
pduel->lua->add_param(ch_lim.player, PARAM_TYPE_INT);
pduel->lua->add_param(tp, PARAM_TYPE_INT);
if(!pduel->lua->check_condition(it->function, 3))
if(!pduel->lua->check_condition(ch_lim.function, 3))
return FALSE;
}
for(auto it = pduel->game_field->core.chain_limit_p.begin(); it != pduel->game_field->core.chain_limit_p.end(); ++it) {
for(const auto& ch_lim_p : pduel->game_field->core.chain_limit_p) {
pduel->lua->add_param(this, PARAM_TYPE_EFFECT);
pduel->lua->add_param(it->player, PARAM_TYPE_INT);
pduel->lua->add_param(ch_lim_p.player, PARAM_TYPE_INT);
pduel->lua->add_param(tp, PARAM_TYPE_INT);
if(!pduel->lua->check_condition(it->function, 3))
if(!pduel->lua->check_condition(ch_lim_p.function, 3))
return FALSE;
}
return TRUE;
......
......@@ -366,7 +366,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_FIRST_ATTACK 192
#define EFFECT_ATTACK_ALL 193
#define EFFECT_EXTRA_ATTACK 194
#define EFFECT_MUST_BE_ATTACKED 195
//#define EFFECT_MUST_BE_ATTACKED 195
#define EFFECT_ONLY_BE_ATTACKED 196
#define EFFECT_ATTACK_DISABLED 197
#define EFFECT_NO_BATTLE_DAMAGE 200
......@@ -433,12 +433,10 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_ADD_SETCODE 334
#define EFFECT_NO_EFFECT_DAMAGE 335
#define EFFECT_UNSUMMONABLE_CARD 336
//#define EFFECT_DISABLE_CHAIN_FIELD 337
#define EFFECT_DISCARD_COST_CHANGE 338
#define EFFECT_HAND_SYNCHRO 339
#define EFFECT_ADD_FUSION_CODE 340
#define EFFECT_ADD_FUSION_SETCODE 341
#define EFFECT_RISE_TO_FULL_HEIGHT 342
#define EFFECT_ONLY_ATTACK_MONSTER 343
#define EFFECT_MUST_ATTACK_MONSTER 344
#define EFFECT_PATRICIAN_OF_DARKNESS 345
......@@ -501,7 +499,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EVENT_BATTLE_START 1132
#define EVENT_BATTLE_CONFIRM 1133
#define EVENT_PRE_DAMAGE_CALCULATE 1134
#define EVENT_DAMAGE_CALCULATING 1135
//#define EVENT_DAMAGE_CALCULATING 1135
#define EVENT_PRE_BATTLE_DAMAGE 1136
//#define EVENT_BATTLE_END 1137
#define EVENT_BATTLED 1138
......
This diff is collapsed.
......@@ -8,7 +8,6 @@
#ifndef FIELD_H_
#define FIELD_H_
#include "memory.h"
#include "common.h"
#include "effectset.h"
#include <vector>
......@@ -19,7 +18,6 @@
#include <functional>
#include <unordered_map>
#include <unordered_set>
#include <cmath>
class card;
struct card_data;
......@@ -161,7 +159,7 @@ struct processor {
typedef std::vector<chain> chain_array;
typedef std::list<processor_unit> processor_list;
typedef std::set<card*, card_sort> card_set;
typedef std::set<std::pair<effect*, tevent> > delayed_effect_collection;
typedef std::set<std::pair<effect*, tevent>> delayed_effect_collection;
struct chain_limit_t {
chain_limit_t(int32 f, int32 p): function(f), player(p) {}
int32 function;
......@@ -194,6 +192,10 @@ struct processor {
chain_array select_chains;
chain_array current_chain;
chain_list continuous_chain;
chain_list solving_continuous;
chain_list sub_solving_continuous;
chain_list delayed_continuous_tp;
chain_list delayed_continuous_ntp;
chain_list desrep_chain;
chain_list new_fchain;
chain_list new_fchain_s;
......@@ -203,7 +205,6 @@ struct processor {
chain_list new_ochain_b;
chain_list new_ochain_h;
chain_list new_chains;
chain_list tmp_chain;
delayed_effect_collection delayed_quick_tmp;
delayed_effect_collection delayed_quick_break;
delayed_effect_collection delayed_quick;
......@@ -232,17 +233,13 @@ struct processor {
effect_set_v extram_effects;
effect_set_v extras_effects;
std::set<effect*> reseted_effects;
std::list<effect*> delayed_tp;
std::list<effect*> delayed_ntp;
event_list delayed_tev;
event_list delayed_ntev;
std::unordered_map<card*, uint32> readjust_map;
std::unordered_set<card*> unique_cards[2];
std::unordered_map<uint32, uint32> effect_count_code;
std::unordered_map<uint32, uint32> effect_count_code_duel;
std::unordered_map<uint32, uint32> spsummon_once_map[2];
std::unordered_map<uint32, uint32> spsummon_once_map_rst[2];
std::multimap<int32, card*, std::greater<int32> > xmaterial_lst;
std::multimap<int32, card*, std::greater<int32>> xmaterial_lst;
ptr temp_var[4];
uint32 global_flag;
uint16 pre_field[2];
......@@ -315,12 +312,12 @@ struct processor {
uint32 hint_timing[2];
uint8 current_player;
uint8 conti_player;
std::unordered_map<uint32, std::pair<uint32, uint32> > summon_counter;
std::unordered_map<uint32, std::pair<uint32, uint32> > normalsummon_counter;
std::unordered_map<uint32, std::pair<uint32, uint32> > spsummon_counter;
std::unordered_map<uint32, std::pair<uint32, uint32> > flipsummon_counter;
std::unordered_map<uint32, std::pair<uint32, uint32> > attack_counter;
std::unordered_map<uint32, std::pair<uint32, uint32> > chain_counter;
std::unordered_map<uint32, std::pair<uint32, uint32>> summon_counter;
std::unordered_map<uint32, std::pair<uint32, uint32>> normalsummon_counter;
std::unordered_map<uint32, std::pair<uint32, uint32>> spsummon_counter;
std::unordered_map<uint32, std::pair<uint32, uint32>> flipsummon_counter;
std::unordered_map<uint32, std::pair<uint32, uint32>> attack_counter;
std::unordered_map<uint32, std::pair<uint32, uint32>> chain_counter;
processor_list recover_damage_reserve;
effect_vector dec_count_reserve;
};
......@@ -432,7 +429,7 @@ public:
uint32 get_field_counter(uint8 self, uint8 s, uint8 o, uint16 countertype);
int32 effect_replace_check(uint32 code, const tevent& e);
int32 get_attack_target(card* pcard, card_vector* v, uint8 chain_attack = FALSE);
int32 get_attack_target(card* pcard, card_vector* v, uint8 chain_attack = FALSE, bool select_target = true);
bool confirm_attack_target();
void attack_all_target_check();
int32 check_synchro_material(card* pcard, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg);
......@@ -450,8 +447,8 @@ public:
int32 is_player_can_discard_deck_as_cost(uint8 playerid, int32 count);
int32 is_player_can_discard_hand(uint8 playerid, card* pcard, effect* peffect, uint32 reason);
int32 is_player_can_summon(uint8 playerid);
int32 is_player_can_summon(uint32 sumtype, uint8 playerid, card* pcard);
int32 is_player_can_mset(uint32 sumtype, uint8 playerid, card* pcard);
int32 is_player_can_summon(uint32 sumtype, uint8 playerid, card* pcard, uint8 toplayer);
int32 is_player_can_mset(uint32 sumtype, uint8 playerid, card* pcard, uint8 toplayer);
int32 is_player_can_sset(uint8 playerid, card* pcard);
int32 is_player_can_spsummon(uint8 playerid);
int32 is_player_can_spsummon(effect* peffect, uint32 sumtype, uint8 sumpos, uint8 playerid, uint8 toplayer, card* pcard);
......@@ -491,7 +488,7 @@ public:
int32 process_quick_effect(int16 step, int32 skip_freechain, uint8 priority);
int32 process_instant_event();
int32 process_single_event();
int32 process_single_event(effect* peffect, const tevent& e, effect_vector& tp, effect_vector& ntp, event_list& tev, event_list& ntev);
int32 process_single_event(effect* peffect, const tevent& e, chain_list& tp, chain_list& ntp);
int32 process_idle_command(uint16 step);
int32 process_battle_command(uint16 step);
int32 process_damage_step(uint16 step, uint32 new_attack);
......@@ -499,7 +496,8 @@ public:
int32 process_turn(uint16 step, uint8 turn_player);
int32 add_chain(uint16 step);
int32 solve_continuous(uint16 step, effect* peffect, uint8 triggering_player);
void solve_continuous(uint8 playerid, effect* peffect, const tevent& e);
int32 solve_continuous(uint16 step);
int32 solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2);
int32 break_effect();
void adjust_instant();
......
This diff is collapsed.
......@@ -24,6 +24,7 @@ extern "C" {
#include <list>
#include <vector>
#include <cstring>
#include <cmath>
class card;
class effect;
......@@ -33,7 +34,7 @@ class duel;
class interpreter {
public:
typedef std::unordered_map<int32, lua_State*> coroutine_map;
typedef std::list<std::pair<void*, uint32> > param_list;
typedef std::list<std::pair<void*, uint32>> param_list;
duel* pduel;
char msgbuf[64];
......@@ -49,20 +50,20 @@ public:
explicit interpreter(duel* pd);
~interpreter();
int32 register_card(card *pcard);
int32 register_card(card* pcard);
void register_effect(effect* peffect);
void unregister_effect(effect* peffect);
void register_group(group* pgroup);
void unregister_group(group* pgroup);
int32 load_script(char* buffer);
int32 load_script(const char* script_name);
int32 load_card_script(uint32 code);
void add_param(void* param, int32 type, bool front = false);
void add_param(ptr param, int32 type, bool front = false);
void push_param(lua_State* L, bool is_coroutine = false);
int32 call_function(int32 f, uint32 param_count, int32 ret_count);
int32 call_card_function(card *pcard, char *f, uint32 param_count, int32 ret_count);
int32 call_code_function(uint32 code, char *f, uint32 param_count, int32 ret_count);
int32 call_card_function(card* pcard, const char* f, uint32 param_count, int32 ret_count);
int32 call_code_function(uint32 code, const char* f, uint32 param_count, int32 ret_count);
int32 check_condition(int32 f, uint32 param_count);
int32 check_matching(card* pcard, int32 findex, int32 extraargs);
int32 get_operation_value(card* pcard, int32 findex, int32 extraargs);
......
......@@ -11,7 +11,6 @@
#include "card.h"
#include "effect.h"
#include "group.h"
#include <iostream>
int32 scriptlib::card_is_ritual_type(lua_State *L) {
check_param_count(L, 2);
......@@ -1397,9 +1396,9 @@ int32 scriptlib::card_get_attacked_group(lua_State *L) {
check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1);
group* pgroup = pcard->pduel->new_group();
for(auto cit = pcard->attacked_cards.begin(); cit != pcard->attacked_cards.end(); ++cit) {
if(cit->second.first)
pgroup->container.insert(cit->second.first);
for(auto& cit : pcard->attacked_cards) {
if(cit.second.first)
pgroup->container.insert(cit.second.first);
}
interpreter::group2value(L, pgroup);
return 1;
......@@ -1423,9 +1422,9 @@ int32 scriptlib::card_get_battled_group(lua_State *L) {
check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1);
group* pgroup = pcard->pduel->new_group();
for(auto cit = pcard->battled_cards.begin(); cit != pcard->battled_cards.end(); ++cit) {
if(cit->second.first)
pgroup->container.insert(cit->second.first);
for(auto& cit : pcard->battled_cards) {
if(cit.second.first)
pgroup->container.insert(cit.second.first);
}
interpreter::group2value(L, pgroup);
return 1;
......@@ -1441,17 +1440,17 @@ int32 scriptlib::card_get_attack_announced_count(lua_State *L) {
check_param_count(L, 1);
check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1);
lua_pushinteger(L, pcard->announce_count);
lua_pushinteger(L, pcard->attack_announce_count);
return 1;
}
int32 scriptlib::card_is_direct_attacked(lua_State *L) {
check_param_count(L, 1);
check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1);
bool ret = false;
if(pcard->attacked_cards.find(0) != pcard->attacked_cards.end())
ret = true;
lua_pushboolean(L, ret);
if(pcard->attacked_cards.findcard(0))
lua_pushboolean(L, 1);
else
lua_pushboolean(L, 0);
return 1;
}
int32 scriptlib::card_set_card_target(lua_State *L) {
......@@ -1525,9 +1524,9 @@ int32 scriptlib::card_get_activate_effect(lua_State *L) {
check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1);
int32 count = 0;
for(auto eit = pcard->field_effect.begin(); eit != pcard->field_effect.end(); ++eit) {
if(eit->second->type & EFFECT_TYPE_ACTIVATE) {
interpreter::effect2value(L, eit->second);
for(auto& eit : pcard->field_effect) {
if(eit.second->type & EFFECT_TYPE_ACTIVATE) {
interpreter::effect2value(L, eit.second);
count++;
}
}
......@@ -2623,13 +2622,13 @@ int32 scriptlib::card_remove_counter(lua_State *L) {
uint32 reason = lua_tointeger(L, 5);
if(countertype == 0) {
// c38834303: remove all counters
for(auto cmit = pcard->counters.begin(); cmit != pcard->counters.end(); ++cmit) {
for(const auto& cmit : pcard->counters) {
pcard->pduel->write_buffer8(MSG_REMOVE_COUNTER);
pcard->pduel->write_buffer16(cmit->first);
pcard->pduel->write_buffer16(cmit.first);
pcard->pduel->write_buffer8(pcard->current.controler);
pcard->pduel->write_buffer8(pcard->current.location);
pcard->pduel->write_buffer8(pcard->current.sequence);
pcard->pduel->write_buffer16(cmit->second[0] + cmit->second[1]);
pcard->pduel->write_buffer16(cmit.second[0] + cmit.second[1]);
}
pcard->counters.clear();
return 0;
......
......@@ -64,8 +64,8 @@ int32 scriptlib::debug_add_card(lua_State *L) {
pcard->current.controler = PLAYER_NONE;
pcard->current.location = LOCATION_OVERLAY;
pcard->current.sequence = fcard->xyz_materials.size() - 1;
for(auto eit = pcard->xmaterial_effect.begin(); eit != pcard->xmaterial_effect.end(); ++eit) {
effect* peffect = eit->second;
for(auto& eit : pcard->xmaterial_effect) {
effect* peffect = eit.second;
if(peffect->type & EFFECT_TYPE_FIELD)
pduel->game_field->add_effect(peffect);
}
......
This diff is collapsed.
......@@ -298,7 +298,7 @@ int32 scriptlib::effect_set_value(lua_State *L) {
if(lua_isboolean(L, 2))
peffect->value = lua_toboolean(L, 2);
else
peffect->value = round(lua_tonumber(L, 2));
peffect->value = std::round(lua_tonumber(L, 2));
}
return 0;
}
......
This diff is collapsed.
......@@ -234,14 +234,14 @@ extern "C" DECL_DLLEXPORT int32 query_field_count(ptr pduel, uint8 playerid, uin
return player.list_main.size();
if(location == LOCATION_MZONE) {
uint32 count = 0;
for(auto cit = player.list_mzone.begin(); cit != player.list_mzone.end(); ++cit)
if(*cit) count++;
for(auto& pcard : player.list_mzone)
if(pcard) count++;
return count;
}
if(location == LOCATION_SZONE) {
uint32 count = 0;
for(auto cit = player.list_szone.begin(); cit != player.list_szone.end(); ++cit)
if(*cit) count++;
for(auto& pcard : player.list_szone)
if(pcard) count++;
return count;
}
return 0;
......@@ -251,29 +251,24 @@ extern "C" DECL_DLLEXPORT int32 query_field_card(ptr pduel, uint8 playerid, uint
return 0;
duel* ptduel = (duel*)pduel;
auto& player = ptduel->game_field->player[playerid];
uint32 ct = 0, clen;
byte* p = buf;
if(location == LOCATION_MZONE) {
for(auto cit = player.list_mzone.begin(); cit != player.list_mzone.end(); ++cit) {
card* pcard = *cit;
for(auto& pcard : player.list_mzone) {
if(pcard) {
ct += clen = pcard->get_infos(p, query_flag, use_cache);
uint32 clen = pcard->get_infos(p, query_flag, use_cache);
p += clen;
} else {
*((int32*)p) = 4;
ct += 4;
p += 4;
}
}
} else if(location == LOCATION_SZONE) {
for(auto cit = player.list_szone.begin(); cit != player.list_szone.end(); ++cit) {
card* pcard = *cit;
for(auto& pcard : player.list_szone) {
if(pcard) {
ct += clen = pcard->get_infos(p, query_flag, use_cache);
uint32 clen = pcard->get_infos(p, query_flag, use_cache);
p += clen;
} else {
*((int32*)p) = 4;
ct += 4;
p += 4;
}
}
......@@ -289,70 +284,60 @@ extern "C" DECL_DLLEXPORT int32 query_field_card(ptr pduel, uint8 playerid, uint
lst = &player.list_extra;
else if(location == LOCATION_DECK)
lst = &player.list_main;
for(auto cit = lst->begin(); cit != lst->end(); ++cit) {
ct += clen = (*cit)->get_infos(p, query_flag, use_cache);
for(auto& pcard : *lst) {
uint32 clen = pcard->get_infos(p, query_flag, use_cache);
p += clen;
}
}
return ct;
return (int32)(p - buf);
}
extern "C" DECL_DLLEXPORT int32 query_field_info(ptr pduel, byte* buf) {
duel* ptduel = (duel*)pduel;
*buf++ = MSG_RELOAD_FIELD;
*buf++ = ptduel->game_field->core.duel_rule;
int32 ct = 2;
byte* p = buf;
*p++ = MSG_RELOAD_FIELD;
*p++ = ptduel->game_field->core.duel_rule;
for(int playerid = 0; playerid < 2; ++playerid) {
auto& player = ptduel->game_field->player[playerid];
*((int*)(buf)) = player.lp;
buf += 4;
ct += 4;
for(auto cit = player.list_mzone.begin(); cit != player.list_mzone.end(); ++cit) {
card* pcard = *cit;
*((int*)p) = player.lp;
p += 4;
for(auto& pcard : player.list_mzone) {
if(pcard) {
*buf++ = 1;
*buf++ = pcard->current.position;
*buf++ = pcard->xyz_materials.size();
ct += 3;
*p++ = 1;
*p++ = pcard->current.position;
*p++ = pcard->xyz_materials.size();
} else {
*buf++ = 0;
ct++;
*p++ = 0;
}
}
for(auto cit = player.list_szone.begin(); cit != player.list_szone.end(); ++cit) {
card* pcard = *cit;
for(auto& pcard : player.list_szone) {
if(pcard) {
*buf++ = 1;
*buf++ = pcard->current.position;
ct += 2;
*p++ = 1;
*p++ = pcard->current.position;
} else {
*buf++ = 0;
ct++;
*p++ = 0;
}
}
*buf++ = player.list_main.size();
*buf++ = player.list_hand.size();
*buf++ = player.list_grave.size();
*buf++ = player.list_remove.size();
*buf++ = player.list_extra.size();
*buf++ = player.extra_p_count;
ct += 6;
*p++ = player.list_main.size();
*p++ = player.list_hand.size();
*p++ = player.list_grave.size();
*p++ = player.list_remove.size();
*p++ = player.list_extra.size();
*p++ = player.extra_p_count;
}
*buf++ = ptduel->game_field->core.current_chain.size();
ct++;
for(auto chit = ptduel->game_field->core.current_chain.begin(); chit != ptduel->game_field->core.current_chain.end(); ++chit) {
effect* peffect = chit->triggering_effect;
*((int*)(buf)) = peffect->get_handler()->data.code;
buf += 4;
*((int*)(buf)) = peffect->get_handler()->get_info_location();
buf += 4;
*buf++ = chit->triggering_controler;
*buf++ = (uint8)chit->triggering_location;
*buf++ = chit->triggering_sequence;
*((int*)(buf)) = peffect->description;
buf += 4;
ct += 15;
*p++ = ptduel->game_field->core.current_chain.size();
for(const auto& ch : ptduel->game_field->core.current_chain) {
effect* peffect = ch.triggering_effect;
*((int*)p) = peffect->get_handler()->data.code;
p += 4;
*((int*)p) = peffect->get_handler()->get_info_location();
p += 4;
*p++ = ch.triggering_controler;
*p++ = (uint8)ch.triggering_location;
*p++ = ch.triggering_sequence;
*((int*)p) = peffect->description;
p += 4;
}
return ct;
return (int32)(p - buf);
}
extern "C" DECL_DLLEXPORT void set_responsei(ptr pduel, int32 value) {
((duel*)pduel)->set_responsei(value);
......@@ -360,6 +345,6 @@ extern "C" DECL_DLLEXPORT void set_responsei(ptr pduel, int32 value) {
extern "C" DECL_DLLEXPORT void set_responseb(ptr pduel, byte* buf) {
((duel*)pduel)->set_responseb(buf);
}
extern "C" DECL_DLLEXPORT int32 preload_script(ptr pduel, char* script, int32 len) {
extern "C" DECL_DLLEXPORT int32 preload_script(ptr pduel, const char* script, int32 len) {
return ((duel*)pduel)->lua->load_script(script);
}
......@@ -10,7 +10,6 @@
#include "common.h"
#ifdef WIN32
#include <windows.h>
#define DECL_DLLEXPORT __declspec(dllexport)
#else
#define DECL_DLLEXPORT
......@@ -50,7 +49,7 @@ extern "C" DECL_DLLEXPORT int32 query_field_card(ptr pduel, uint8 playerid, uint
extern "C" DECL_DLLEXPORT int32 query_field_info(ptr pduel, byte* buf);
extern "C" DECL_DLLEXPORT void set_responsei(ptr pduel, int32 value);
extern "C" DECL_DLLEXPORT void set_responseb(ptr pduel, byte* buf);
extern "C" DECL_DLLEXPORT int32 preload_script(ptr pduel, char* script, int32 len);
extern "C" DECL_DLLEXPORT int32 preload_script(ptr pduel, const char* script, int32 len);
byte* default_script_reader(const char* script_name, int* len);
uint32 default_card_reader(uint32 code, card_data* data);
uint32 default_message_handler(void* pduel, uint32 msg_type);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -545,6 +545,7 @@ public:
static int32 duel_get_overlay_count(lua_State *L);
static int32 duel_check_remove_overlay_card(lua_State *L);
static int32 duel_remove_overlay_card(lua_State *L);
static int32 duel_get_disable_field(lua_State *L);
static int32 duel_hint(lua_State *L);
static int32 duel_hint_selection(lua_State *L);
......
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