Commit acc238b6 authored by VanillaSalt's avatar VanillaSalt

new

parent f7a3ec19
......@@ -1453,7 +1453,7 @@ int32 card::filter_summon_procedure(uint8 playerid, effect_set* peset, uint8 ign
min = -fcount + 1;
if(min == 0)
return TRUE;
int32 m = pduel->game_field->get_summon_release_list(this, 0, 0);
int32 m = pduel->game_field->get_summon_release_list(this, 0, 0, 0);
if(m >= min)
return TRUE;
return FALSE;
......@@ -1490,7 +1490,7 @@ int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore
min = -fcount + 1;
if(min == 0)
return TRUE;
int32 m = pduel->game_field->get_summon_release_list(this, 0, 0);
int32 m = pduel->game_field->get_summon_release_list(this, 0, 0, 0);
if(m >= min)
return TRUE;
return FALSE;
......
......@@ -289,6 +289,7 @@ public:
#define EFFECT_DECREASE_TRIBUTE_SET 152
#define EFFECT_EXTRA_RELEASE 153
#define EFFECT_TRIBUTE_LIMIT 154
#define EFFECT_EXTRA_RELEASE_SUM 155
#define EFFECT_PUBLIC 160
#define EFFECT_COUNTER_PERMIT 0x10000
#define EFFECT_COUNTER_LIMIT 0x20000
......
......@@ -1171,7 +1171,7 @@ int32 field::check_release_list(uint8 playerid, int32 count, int32 use_con, int3
}
return FALSE;
}
int32 field::get_summon_release_list(card* target, card_set* release_list, card_set* ex_list) {
int32 field::get_summon_release_list(card* target, card_set* release_list, card_set* ex_list, card_set* ex_list_sum) {
uint8 p = target->current.controler;
card* pcard;
uint32 rcount = 0;
......@@ -1187,9 +1187,12 @@ int32 field::get_summon_release_list(card* target, card_set* release_list, card_
rcount += pcard->operation_param;
}
}
int32 ex_count = 0;
for(int i = 0; i < 5; ++i) {
pcard = player[1 - p].list_mzone[i];
if(pcard && pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE) && pcard->is_releasable_by_summon(p, target)) {
if(!(pcard && pcard->is_releasable_by_summon(p, target)))
continue;
if(pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE)) {
if(ex_list)
ex_list->insert(pcard);
if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
......@@ -1197,8 +1200,21 @@ int32 field::get_summon_release_list(card* target, card_set* release_list, card_
else
pcard->operation_param = 1;
rcount += pcard->operation_param;
} else {
effect* peffect = pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE_SUM);
if(!peffect || ((peffect->flag & EFFECT_FLAG_COUNT_LIMIT) && (peffect->reset_count & 0xf00) == 0))
continue;
if(ex_list_sum)
ex_list_sum->insert(pcard);
if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
pcard->operation_param = 2;
else
pcard->operation_param = 1;
ex_count++;
}
}
if(ex_count)
rcount++;
return rcount;
}
int32 field::get_summon_count_limit(uint8 playerid) {
......
......@@ -189,6 +189,7 @@ struct processor {
card_set control_adjust_set[2];
card_set release_cards;
card_set release_cards_ex;
card_set release_cards_ex_sum;
card_set destroy_set;
card_set battle_destroy_rep;
card_set fusion_materials;
......@@ -332,7 +333,7 @@ public:
int32 get_release_list(uint8 playerid, card_set* release_list, card_set* ex_list, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exp);
int32 check_release_list(uint8 playerid, int32 count, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exp);
int32 get_summon_release_list(card* target, card_set* release_list, card_set* ex_list);
int32 get_summon_release_list(card* target, card_set* release_list, card_set* ex_list, card_set* ex_list_sum);
int32 get_summon_count_limit(uint8 playerid);
int32 get_draw_count(uint8 playerid);
void get_ritual_material(uint8 playerid, effect* peffect, card_set* material);
......
......@@ -561,7 +561,7 @@ int32 interpreter::register_card(card *pcard) {
lua_setmetatable(current_state, -2);
lua_pop(current_state, 1);
//Initial
if(pcard->data.code && (pcard->data.type != TYPE_NORMAL + TYPE_MONSTER)) {
if(pcard->data.code && (!(pcard->data.type & TYPE_NORMAL) || (pcard->data.type & TYPE_PENDULUM))) {
pcard->set_status(STATUS_INITIALIZING, TRUE);
add_param(pcard, PARAM_TYPE_CARD);
call_card_function(pcard, (char*) "initial_effect", 1, 0);
......
......@@ -1875,7 +1875,7 @@ int32 scriptlib::duel_get_tribute_group(lua_State *L) {
card* target = *(card**) lua_touserdata(L, 1);
duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group();
pduel->game_field->get_summon_release_list(target, &(pgroup->container), &(pgroup->container));
pduel->game_field->get_summon_release_list(target, &(pgroup->container), &(pgroup->container), 0);
interpreter::group2value(L, pgroup);
return 1;
}
......@@ -1889,7 +1889,7 @@ int32 scriptlib::duel_get_tribute_count(lua_State *L) {
check_param(L, PARAM_TYPE_CARD, 1);
card* target = *(card**) lua_touserdata(L, 1);
duel* pduel = interpreter::get_duel_info(L);
lua_pushinteger(L, pduel->game_field->get_summon_release_list(target, 0, 0));
lua_pushinteger(L, pduel->game_field->get_summon_release_list(target, 0, 0, 0));
return 1;
}
int32 scriptlib::duel_select_tribute(lua_State *L) {
......@@ -1905,7 +1905,8 @@ int32 scriptlib::duel_select_tribute(lua_State *L) {
duel* pduel = interpreter::get_duel_info(L);
pduel->game_field->core.release_cards.clear();
pduel->game_field->core.release_cards_ex.clear();
pduel->game_field->get_summon_release_list(target, &pduel->game_field->core.release_cards, &pduel->game_field->core.release_cards_ex);
pduel->game_field->core.release_cards_ex_sum.clear();
pduel->game_field->get_summon_release_list(target, &pduel->game_field->core.release_cards, &pduel->game_field->core.release_cards_ex, &pduel->game_field->core.release_cards_ex_sum);
pduel->game_field->add_process(PROCESSOR_SELECT_TRIBUTE_S, 0, 0, 0, playerid, (max << 16) + min);
return lua_yield(L, 0);
}
......
......@@ -1185,7 +1185,8 @@ int32 field::summon(uint16 step, uint8 sumplayer, card * target, effect * proc,
} else {
core.release_cards.clear();
core.release_cards_ex.clear();
int32 rcount = get_summon_release_list(target, &core.release_cards, &core.release_cards_ex);
core.release_cards_ex_sum.clear();
int32 rcount = get_summon_release_list(target, &core.release_cards, &core.release_cards_ex, &core.release_cards_ex_sum);
if(rcount == 0)
returns.bvalue[0] = 0;
else {
......@@ -1641,7 +1642,8 @@ int32 field::mset(uint16 step, uint8 setplayer, card * target, effect * proc, ui
else {
core.release_cards.clear();
core.release_cards_ex.clear();
int32 rcount = get_summon_release_list(target, &core.release_cards, &core.release_cards_ex);
core.release_cards_ex_sum.clear();
int32 rcount = get_summon_release_list(target, &core.release_cards, &core.release_cards_ex, &core.release_cards_ex_sum);
if(rcount == 0)
returns.bvalue[0] = 0;
else {
......@@ -3944,7 +3946,8 @@ int32 field::select_release_cards(int16 step, uint8 playerid, uint8 check_field,
int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable, int32 min, int32 max) {
switch(step) {
case 0: {
if(core.release_cards_ex.size() == 0 || (get_useable_count(playerid, LOCATION_MZONE, playerid, LOCATION_REASON_TOFIELD) <= 0 && min < 2)) {
if(core.release_cards_ex.size() + core.release_cards_ex_sum.size() == 0
|| (get_useable_count(playerid, LOCATION_MZONE, playerid, LOCATION_REASON_TOFIELD) <= 0 && min < 2)) {
core.select_cards.clear();
for(auto cit = core.release_cards.begin(); cit != core.release_cards.end(); ++cit)
core.select_cards.push_back(*cit);
......@@ -3968,26 +3971,66 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
}
core.operated_set.clear();
core.select_cards.clear();
int32 rmax = 0;
for(auto cit = core.release_cards.begin(); cit != core.release_cards.end(); ++cit)
rmax += (*cit)->operation_param;
for(auto cit = core.release_cards_ex.begin(); cit != core.release_cards_ex.end(); ++cit)
rmax += (*cit)->operation_param;
if(rmax < min)
returns.ivalue[0] = TRUE;
else if(!core.release_cards_ex_sum.empty())
add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, playerid, 92);
else
core.units.begin()->step = 2;
return FALSE;
}
case 1: {
if(!returns.ivalue[0]) {
core.units.begin()->step = 2;
return FALSE;
}
for(auto cit = core.release_cards_ex_sum.begin(); cit != core.release_cards_ex_sum.end(); ++cit)
core.select_cards.push_back(*cit);
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(playerid);
pduel->write_buffer32(500);
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (core.release_cards_ex.size() << 16) + core.release_cards_ex.size());
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, ((uint32)cancelable << 16) + playerid, 0x10001);
return FALSE;
}
case 1: {
uint32 rmin = returns.bvalue[0];
uint32 rmax = 0;
case 2: {
for(int32 i = 0; i < returns.bvalue[0]; ++i) {
core.operated_set.insert(core.select_cards[returns.bvalue[i + 1]]);
rmax += core.select_cards[returns.bvalue[i + 1]]->operation_param;
card* pcard = core.select_cards[returns.bvalue[i + 1]];
core.operated_set.insert(pcard);
effect* peffect = pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE_SUM);
if((peffect->flag & EFFECT_FLAG_COUNT_LIMIT) && (peffect->reset_count & 0xf00) > 0)
peffect->dec_count();
}
return FALSE;
}
case 3: {
for(auto cit = core.release_cards_ex.begin(); cit != core.release_cards_ex.end(); ++cit)
core.select_cards.push_back(*cit);
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(playerid);
pduel->write_buffer32(500);
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (core.release_cards_ex.size() << 16) + core.release_cards_ex.size());
return FALSE;
}
case 4: {
for(int32 i = 0; i < returns.bvalue[0]; ++i)
core.operated_set.insert(core.select_cards[returns.bvalue[i + 1]]);
uint32 rmin = core.operated_set.size();
uint32 rmax = 0;
for(auto cit = core.operated_set.begin(); cit != core.operated_set.end(); ++cit)
rmax += (*cit)->operation_param;
min -= rmax;
max -= rmin;
if(min <= 0)
return TRUE;
if(min <= 0) {
core.units.begin()->step = 5;
return FALSE;
}
core.units.begin()->arg2 = (max << 16) + min;
core.select_cards.clear();
for(auto cit = core.release_cards.begin(); cit != core.release_cards.end(); ++cit)
......@@ -3999,9 +4042,12 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
add_process(PROCESSOR_SELECT_TRIBUTE_P, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (max << 16) + min);
return FALSE;
}
case 2: {
case 5: {
for(int32 i = 0; i < returns.bvalue[0]; ++i)
core.operated_set.insert(core.select_cards[returns.bvalue[i + 1]]);
return FALSE;
}
case 6: {
core.select_cards.clear();
returns.bvalue[0] = core.operated_set.size();
int32 i = 0;
......
......@@ -3308,6 +3308,9 @@ int32 field::process_battle_command(uint16 step) {
card* reason_card = 0;
uint8 bd[2] = {FALSE};
core.attacker->set_status(STATUS_BATTLE_DESTROYED, FALSE);
effect* defattack = core.attacker->is_affected_by_effect(EFFECT_DEFENCE_ATTACK);
if(defattack->get_value(core.attacker) == 1)
a = ad;
if(core.attack_target) {
da = core.attack_target->get_attack();
dd = core.attack_target->get_defence();
......
--帝王の烈旋
function c79844764.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN)
e1:SetCountLimit(1,79844764+EFFECT_COUNT_CODE_OATH)
e1:SetCost(c79844764.cost)
e1:SetOperation(c79844764.activate)
c:RegisterEffect(e1)
if not c79844764.global_check then
c79844764.global_check=true
local ge1=Effect.CreateEffect(c)
ge1:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_CONTINUOUS)
ge1:SetCode(EVENT_SPSUMMON_SUCCESS)
ge1:SetOperation(c79844764.checkop)
Duel.RegisterEffect(ge1,0)
end
end
function c79844764.checkop(e,tp,eg,ep,ev,re,r,rp)
local tc=eg:GetFirst()
local p1=false
local p2=false
while tc do
if not tc:IsPreviousLocation(LOCATION_EXTRA) then
if tc:GetSummonPlayer()==0 then p1=true else p2=true end
end
tc=eg:GetNext()
end
if p1 then Duel.RegisterFlagEffect(0,79844764,RESET_PHASE+PHASE_END,0,1) end
if p2 then Duel.RegisterFlagEffect(1,79844764,RESET_PHASE+PHASE_END,0,1) end
end
function c79844764.cost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.GetFlagEffect(tp,79844764)==0 end
local e1=Effect.CreateEffect(e:GetHandler())
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET+EFFECT_FLAG_OATH)
e1:SetCode(EFFECT_CANNOT_SPECIAL_SUMMON)
e1:SetReset(RESET_PHASE+PHASE_END)
e1:SetTargetRange(1,0)
e1:SetTarget(c79844764.splimit)
Duel.RegisterEffect(e1,tp)
end
function c79844764.splimit(e,c,sump,sumtype,sumpos,targetp,se)
return not c:IsLocation(LOCATION_EXTRA)
end
function c79844764.activate(e,tp,eg,ep,ev,re,r,rp)
local e1=Effect.CreateEffect(e:GetHandler())
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetCode(EFFECT_EXTRA_RELEASE_SUM)
e1:SetTargetRange(0,LOCATION_MZONE)
e1:SetCountLimit(1)
e1:SetReset(RESET_PHASE+PHASE_END)
Duel.RegisterEffect(e1,tp)
end
......@@ -381,6 +381,7 @@ EFFECT_DECREASE_TRIBUTE =151
EFFECT_DECREASE_TRIBUTE_SET =152
EFFECT_EXTRA_RELEASE =153
EFFECT_TRIBUTE_LIMIT =154
EFFECT_EXTRA_RELEASE_SUM =155
EFFECT_PUBLIC =160
EFFECT_COUNTER_PERMIT =0x10000
EFFECT_COUNTER_LIMIT =0x20000
......
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