Commit 1cd30737 authored by mercury233's avatar mercury233 Committed by GitHub

add more triggering states (#210)

parent 36c3813e
......@@ -17,7 +17,7 @@ int32 field::field_used_count[32] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3
bool chain::chain_operation_sort(const chain& c1, const chain& c2) {
return c1.triggering_effect->id < c2.triggering_effect->id;
}
void chain::set_triggering_place(card* pcard) {
void chain::set_triggering_state(card* pcard) {
triggering_controler = pcard->current.controler;
if(pcard->current.is_location(LOCATION_FZONE))
triggering_location = LOCATION_SZONE | LOCATION_FZONE;
......@@ -27,6 +27,14 @@ void chain::set_triggering_place(card* pcard) {
triggering_location = pcard->current.location;
triggering_sequence = pcard->current.sequence;
triggering_position = pcard->current.position;
triggering_state.code = pcard->get_code();
triggering_state.code2 = pcard->get_another_code();
triggering_state.level = pcard->get_level();
triggering_state.rank = pcard->get_rank();
triggering_state.attribute = pcard->get_attribute();
triggering_state.race = pcard->get_race();
triggering_state.attack = pcard->get_attack();
triggering_state.defense = pcard->get_defense();
}
bool tevent::operator< (const tevent& v) const {
return std::memcmp(this, &v, sizeof(tevent)) < 0;
......
......@@ -9,6 +9,7 @@
#define FIELD_H_
#include "common.h"
#include "card.h"
#include "effectset.h"
#include <vector>
#include <set>
......@@ -51,6 +52,7 @@ struct chain {
uint16 triggering_location;
uint8 triggering_sequence;
uint8 triggering_position;
card_state triggering_state;
effect* triggering_effect;
group* target_cards;
int32 replace_op;
......@@ -62,7 +64,7 @@ struct chain {
opmap opinfos;
uint32 flag;
static bool chain_operation_sort(const chain& c1, const chain& c2);
void set_triggering_place(card* pcard);
void set_triggering_state(card* pcard);
};
struct player_info {
......@@ -628,6 +630,15 @@ public:
#define CHAININFO_TYPE 0x1000
#define CHAININFO_EXTTYPE 0x2000
#define CHAININFO_TRIGGERING_POSITION 0x4000
#define CHAININFO_TRIGGERING_CODE 0x8000
#define CHAININFO_TRIGGERING_CODE2 0x10000
//#define CHAININFO_TRIGGERING_TYPE 0x20000
#define CHAININFO_TRIGGERING_LEVEL 0x40000
#define CHAININFO_TRIGGERING_RANK 0x80000
#define CHAININFO_TRIGGERING_ATTRIBUTE 0x100000
#define CHAININFO_TRIGGERING_RACE 0x200000
#define CHAININFO_TRIGGERING_ATTACK 0x400000
#define CHAININFO_TRIGGERING_DEFENSE 0x800000
//Timing
#define TIMING_DRAW_PHASE 0x1
#define TIMING_STANDBY_PHASE 0x2
......
......@@ -1921,6 +1921,30 @@ int32 scriptlib::duel_get_chain_info(lua_State *L) {
case CHAININFO_TRIGGERING_POSITION:
lua_pushinteger(L, ch->triggering_position);
break;
case CHAININFO_TRIGGERING_CODE:
lua_pushinteger(L, ch->triggering_state.code);
break;
case CHAININFO_TRIGGERING_CODE2:
lua_pushinteger(L, ch->triggering_state.code2);
break;
case CHAININFO_TRIGGERING_LEVEL:
lua_pushinteger(L, ch->triggering_state.level);
break;
case CHAININFO_TRIGGERING_RANK:
lua_pushinteger(L, ch->triggering_state.rank);
break;
case CHAININFO_TRIGGERING_ATTRIBUTE:
lua_pushinteger(L, ch->triggering_state.attribute);
break;
case CHAININFO_TRIGGERING_RACE:
lua_pushinteger(L, ch->triggering_state.race);
break;
case CHAININFO_TRIGGERING_ATTACK:
lua_pushinteger(L, ch->triggering_state.attack);
break;
case CHAININFO_TRIGGERING_DEFENSE:
lua_pushinteger(L, ch->triggering_state.defense);
break;
case CHAININFO_TARGET_CARDS:
interpreter::group2value(L, ch->target_cards);
break;
......
......@@ -4828,7 +4828,7 @@ int32 field::activate_effect(uint16 step, effect* peffect) {
newchain.evt.reason_effect = 0;
newchain.evt.reason_player = PLAYER_NONE;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = playerid;
core.new_chains.push_back(newchain);
phandler->set_status(STATUS_CHAINING, TRUE);
......
......@@ -1557,7 +1557,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = nil_event;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = check_player;
core.new_chains.push_back(newchain);
phandler->set_status(STATUS_CHAINING, TRUE);
......@@ -1672,7 +1672,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
effect* peffect = clit->triggering_effect;
card* phandler = peffect->get_handler();
if(phandler->is_has_relation(*clit)) //work around: position and control should be refreshed before raising event
clit->set_triggering_place(phandler);
clit->set_triggering_state(phandler);
uint8 tp = clit->triggering_player;
if(check_deck_effect(*clit) && check_trigger_effect(*clit)
&& peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE)) {
......@@ -1722,14 +1722,14 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
effect* peffect = clit->triggering_effect;
card* phandler = peffect->get_handler();
if(phandler->is_has_relation(*clit)) //work around: position and control should be refreshed before raising event
clit->set_triggering_place(phandler);
clit->set_triggering_state(phandler);
if(!peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) && (peffect->type & EFFECT_TYPE_FIELD)
&& (peffect->range & LOCATION_HAND) && phandler->current.location == LOCATION_HAND) {
if(!phandler->is_has_relation(*clit) && peffect->is_condition_check(phandler->current.controler, clit->evt))
phandler->create_relation(*clit);
peffect->set_activate_location();
clit->triggering_player = phandler->current.controler;
clit->set_triggering_place(phandler);
clit->set_triggering_state(phandler);
}
uint8 tp = clit->triggering_player;
if(check_hand_trigger(*clit) && check_deck_effect(*clit) && check_trigger_effect(*clit)
......@@ -1820,7 +1820,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
newchain.chain_id = infos.field_id++;
newchain.evt = e;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = infos.turn_player;
core.tmp_chains.push_back(newchain);
}
......@@ -1997,7 +1997,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.chain_id = infos.field_id++;
newchain.evt = *evit;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
}
......@@ -2013,7 +2013,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.chain_id = infos.field_id++;
newchain.evt = *evit;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
core.delayed_quick_tmp.erase(std::make_pair(peffect, *evit));
......@@ -2030,7 +2030,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
phandler->create_relation(ch);
peffect->set_activate_location();
ch.triggering_player = phandler->current.controler;
ch.set_triggering_place(phandler);
ch.set_triggering_state(phandler);
}
if(ch.triggering_player == priority && ch.triggering_location == LOCATION_HAND
&& phandler->is_position(POS_FACEDOWN) && !phandler->is_status(STATUS_CHAINING) && phandler->is_has_relation(ch)
......@@ -2051,7 +2051,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.chain_id = infos.field_id++;
newchain.evt = ev;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
}
......@@ -2069,7 +2069,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.chain_id = infos.field_id++;
newchain.evt = evt;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
}
......@@ -2088,7 +2088,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.chain_id = infos.field_id++;
newchain.evt = nil_event;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
if(check_hint_timing(peffect) || check_cteffect_hint(peffect, priority))
......@@ -2106,7 +2106,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.chain_id = infos.field_id++;
newchain.evt = nil_event;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
if(check_hint_timing(peffect))
......@@ -2200,7 +2200,7 @@ int32 field::process_instant_event() {
newchain.chain_id = infos.field_id++;
newchain.evt = ev;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
if(peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER) && (ev.event_player == 0 || ev.event_player == 1))
newchain.triggering_player = ev.event_player;
else
......@@ -2221,7 +2221,7 @@ int32 field::process_instant_event() {
newchain.chain_id = infos.field_id++;
newchain.evt = ev;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
if(peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER) && (ev.event_player == 0 || ev.event_player == 1))
newchain.triggering_player = ev.event_player;
else
......@@ -2244,7 +2244,7 @@ int32 field::process_instant_event() {
newchain.chain_id = infos.field_id++;
newchain.evt = ev;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
if(peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER) && (ev.event_player == 0 || ev.event_player == 1))
newchain.triggering_player = ev.event_player;
else
......@@ -2353,7 +2353,7 @@ int32 field::process_single_event(effect* peffect, const tevent& e, chain_list&
newchain.chain_id = infos.field_id++;
newchain.evt = e;
newchain.triggering_effect = peffect;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
if(peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER) && (e.event_player == 0 || e.event_player == 1))
newchain.triggering_player = e.event_player;
else {
......@@ -2548,7 +2548,7 @@ int32 field::process_idle_command(uint16 step) {
newchain.evt.reason = 0;
newchain.evt.reason_effect = 0;
newchain.evt.reason_player = PLAYER_NONE;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = infos.turn_player;
core.new_chains.push_back(newchain);
phandler->set_status(STATUS_CHAINING, TRUE);
......@@ -2824,7 +2824,7 @@ int32 field::process_battle_command(uint16 step) {
newchain.evt.reason = 0;
newchain.evt.reason_effect = 0;
newchain.evt.reason_player = PLAYER_NONE;
newchain.set_triggering_place(phandler);
newchain.set_triggering_state(phandler);
newchain.triggering_player = infos.turn_player;
core.new_chains.push_back(newchain);
phandler->set_status(STATUS_CHAINING, TRUE);
......@@ -4197,7 +4197,7 @@ int32 field::add_chain(uint16 step) {
effect* peffect = clit.triggering_effect;
card* phandler = peffect->get_handler();
if(peffect->type & EFFECT_TYPE_ACTIVATE) {
clit.set_triggering_place(phandler);
clit.set_triggering_state(phandler);
}
pduel->write_buffer8(MSG_CHAINING);
pduel->write_buffer32(phandler->data.code);
......
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