Commit 3aca33df authored by 未闻皂名's avatar 未闻皂名

2022/3/11 拆分Expand,方便后续维护

parent deee93e2
This diff is collapsed.
-- Rush Duel 赋予Buff
RushDuel = RushDuel or {}
RD = RushDuel
-- 赋予: 攻守升降
function RushDuel.AttachAtkDef(e, c, atk, def, reset)
if atk ~= nil and atk ~= 0 then
RushDuel.CreateSingleEffect(e, nil, c, EFFECT_UPDATE_ATTACK, atk, reset)
end
if def ~= nil and def ~= 0 and RushDuel.IsCanChangeDef(c) then
RushDuel.CreateSingleEffect(e, nil, c, EFFECT_UPDATE_DEFENSE, def, reset)
end
end
-- 赋予: 等级升降
function RushDuel.AttachLevel(e, c, lv, reset)
return RushDuel.CreateSingleEffect(e, nil, c, EFFECT_UPDATE_LEVEL, lv, reset)
end
-- 赋予: 直接攻击
function RushDuel.AttachDirectAttack(e, c, desc, reset)
return RushDuel.CreateSingleEffect(e, desc, c, EFFECT_DIRECT_ATTACK, nil, reset)
end
-- 赋予: 贯通
function RushDuel.AttachPierce(e, c, desc, reset)
return RushDuel.CreateSingleEffect(e, desc, c, EFFECT_PIERCE, nil, reset)
end
-- 赋予: 多次攻击
function RushDuel.AttachExtraAttack(e, c, value, desc, reset)
return RushDuel.CreateSingleEffect(e, desc, c, EFFECT_EXTRA_ATTACK, value, reset)
end
-- 赋予: 全体攻击
function RushDuel.AttachAttackAll(e, c, value, desc, reset)
return RushDuel.CreateSingleEffect(e, desc, c, EFFECT_ATTACK_ALL, value, reset)
end
-- 赋予: 双重解放
function RushDuel.AttachDoubleTribute(e, c, value, desc, reset)
return RushDuel.CreateSingleEffect(e, desc, c, EFFECT_DOUBLE_TRIBUTE, value, reset)
end
-- 赋予: 效果破坏抗性
function RushDuel.AttachEffectIndes(e, c, value, desc, reset)
return RushDuel.CreateSingleEffect(e, desc, c, EFFECT_INDESTRUCTABLE_EFFECT, value, reset)
end
-- 赋予: 攻击宣言特效
function RushDuel.AttachAttackAnnounce(e, c, operation, desc, reset)
local e1 = Effect.CreateEffect(e:GetHandler())
e1:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_CONTINUOUS)
e1:SetCode(EVENT_ATTACK_ANNOUNCE)
e1:SetOperation(operation)
if desc ~= nil then
e1:SetDescription(desc)
e1:SetProperty(EFFECT_FLAG_CLIENT_HINT)
end
e1:SetReset(reset)
c:RegisterEffect(e1)
end
-- 赋予: 不能直接攻击
function RD.AttachCannotDirectAttack(e, c, desc, reset)
return RushDuel.CreateSingleEffect(e, desc, c, EFFECT_CANNOT_DIRECT_ATTACK, nil, reset)
end
-- 赋予: 不能选择攻击目标
function RD.AttachCannotSelectBattleTarget(e, c, value, desc, reset)
return RushDuel.CreateSingleEffect(e, desc, c, EFFECT_CANNOT_SELECT_BATTLE_TARGET, value, reset)
end
-- 赋予: 变更原本攻守
function RushDuel.SetBaseAtkDef(e, c, atk, def, reset)
if atk ~= nil then
RushDuel.CreateSingleEffect(e, nil, c, EFFECT_SET_BASE_ATTACK, atk, reset)
end
if def ~= nil and RushDuel.IsCanChangeDef(c) then
RushDuel.CreateSingleEffect(e, nil, c, EFFECT_SET_BASE_DEFENSE, def, nil, reset)
end
end
-- 赋予: 交换原本攻守
function RushDuel.SwapBaseAtkDef(e, c, reset)
if RushDuel.IsCanChangeDef(c) then
RushDuel.CreateSingleEffect(e, nil, c, EFFECT_SWAP_BASE_AD, nil, reset)
end
end
-- 赋予: 交换当前攻守
function RushDuel.SwapAtkDef(e, c, reset)
if RushDuel.IsCanChangeDef(c) then
local atk = c:GetAttack()
local def = c:GetDefense()
RushDuel.CreateSingleEffect(e, nil, c, EFFECT_SET_ATTACK_FINAL, def, reset)
RushDuel.CreateSingleEffect(e, nil, c, EFFECT_SET_DEFENSE_FINAL, atk, reset)
end
end
-- 赋予: 改变属性
function RushDuel.ChangeAttribute(e, c, attribute, reset)
return RushDuel.CreateSingleEffect(e, nil, c, EFFECT_CHANGE_ATTRIBUTE, attribute, reset)
end
-- 赋予: 改变种族
function RushDuel.ChangeRace(e, c, race, reset)
return RushDuel.CreateSingleEffect(e, nil, c, EFFECT_CHANGE_RACE, race, reset)
end
-- New Races -- Rush Duel 基础
RACE_CYBORG = 0x2000000 RushDuel = RushDuel or {}
RACE_MAGICALKNIGHT = 0x4000000
RACE_HYDRAGON = 0x8000000
RACE_OMEGAPSYCHO = 0x10000000
RACE_CELESTIALKNIGHT = 0x20000000
-- Base
RushDuel = {}
RD = RushDuel RD = RushDuel
-- 新种族
RACE_CYBORG = 0x2000000 -- 电子人
RACE_MAGICALKNIGHT = 0x4000000 -- 魔导骑士
RACE_HYDRAGON = 0x8000000 -- 多头龙
RACE_OMEGAPSYCHO = 0x10000000 -- 欧米茄念动力
RACE_CELESTIALKNIGHT = 0x20000000 -- 天界骑士
RACE_GALAXY = 0x200000 -- 银河
-- 创建效果: 玩家对象的全局效果
function RushDuel.CreatePlayerTargetGlobalEffect(code, value) function RushDuel.CreatePlayerTargetGlobalEffect(code, value)
local e = Effect.GlobalEffect() local e1 = Effect.GlobalEffect()
e:SetType(EFFECT_TYPE_FIELD) e1:SetType(EFFECT_TYPE_FIELD)
e:SetCode(code) e1:SetCode(code)
e:SetProperty(EFFECT_FLAG_PLAYER_TARGET) e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
e:SetTargetRange(1, 1) e1:SetTargetRange(1, 1)
if value ~= nil then if value ~= nil then
e:SetValue(value) e1:SetValue(value)
end end
Duel.RegisterEffect(e, 0) Duel.RegisterEffect(e1, 0)
return e return e1
end end
function RushDuel.CreateFieldGlobalEffect(continuous, code, operation) -- 创建效果: 影响全场的全局效果
local e = Effect.GlobalEffect() function RushDuel.CreateFieldGlobalEffect(is_continuous, code, operation)
if continuous then local e1 = Effect.GlobalEffect()
e:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_CONTINUOUS) if is_continuous then
e1:SetType(EFFECT_TYPE_FIELD + EFFECT_TYPE_CONTINUOUS)
else else
e:SetType(EFFECT_TYPE_FIELD) e1:SetType(EFFECT_TYPE_FIELD)
end end
e:SetCode(code) e1:SetCode(code)
e:SetOperation(operation) e1:SetOperation(operation)
Duel.RegisterEffect(e, 0) Duel.RegisterEffect(e1, 0)
return e return e1
end end
-- 创建效果: 在LP槽显示提示信息
-- Initialize function RushDuel.CreateHintEffect(e, desc, player, s_range, o_range, reset)
function RushDuel.Init() local e1 = Effect.CreateEffect(e:GetHandler())
RushDuel.InitRule() e1:SetDescription(desc)
Duel.BreakEffect = function() e1:SetType(EFFECT_TYPE_FIELD)
-- Don't Break Effect e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET + EFFECT_FLAG_CLIENT_HINT)
end e1:SetTargetRange(s_range, o_range)
-- Duel Start e1:SetReset(reset)
RushDuel.CreateFieldGlobalEffect(true, EVENT_PHASE_START + PHASE_DRAW, function(e) Duel.RegisterEffect(e1, player)
-- Draw 1 For First Hand return e1
if not Auxiliary.Load2PickRule then
Duel.Draw(0, 1, REASON_RULE)
end
-- Legend Card
local g = Duel.GetMatchingGroup(Card.IsCode, 0, 0xff, 0xff, nil, 120000000)
local legend = g:GetFirst()
while legend do
RushDuel.InitLegend(legend)
legend = g:GetNext()
end
e:Reset()
end)
end end
function RushDuel.InitRule() -- 创建效果: 不能攻击 (自肃)
-- Lock Zone function RushDuel.CreateAttackLimitEffect(e, target, player, s_range, o_range, reset)
RushDuel.CreateFieldGlobalEffect(false, EFFECT_DISABLE_FIELD, function(e, tp) local e1 = Effect.CreateEffect(e:GetHandler())
return 0x11711171 e1:SetType(EFFECT_TYPE_FIELD)
end) e1:SetCode(EFFECT_CANNOT_ATTACK)
-- Draw Phase e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_DRAW_COUNT, function(e) e1:SetTargetRange(s_range, o_range)
return math.max(1, 5 - Duel.GetFieldGroupCount(Duel.GetTurnPlayer(), LOCATION_HAND, 0)) if target ~= nil then
end) e1:SetTarget(target)
-- Standby Phase
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_SKIP_SP)
-- Summon Unlimited
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_SET_SUMMON_COUNT_LIMIT, 100)
-- Once Per Turn
local function get_effect_owner_code(e)
if e:GetType() & EFFECT_TYPE_XMATERIAL == EFFECT_TYPE_XMATERIAL then
-- Maximum L/R Effect
return e:GetLabel()
else
return e:GetOwner():GetCode()
end
end end
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_CANNOT_ACTIVATE, function(e, re, tp) e1:SetReset(reset)
return re:GetHandler():GetFlagEffect(get_effect_owner_code(re)) ~= 0 Duel.RegisterEffect(e1, player)
end) return e1
RushDuel.CreateFieldGlobalEffect(true, EVENT_CHAIN_SOLVING, function(e, tp, eg, ep, ev, re, r, rp) end
local te = Duel.GetChainInfo(ev, CHAININFO_TRIGGERING_EFFECT) -- 创建效果: 不能直接攻击 (自肃)
local code = get_effect_owner_code(te) function RushDuel.CreateCannotDirectAttackEffect(e, target, player, s_range, o_range, reset)
te:GetHandler():RegisterFlagEffect(code, RESET_EVENT + RESETS_STANDARD + RESET_PHASE + PHASE_END, 0, 1) local e1 = Effect.CreateEffect(e:GetHandler())
end) e1:SetType(EFFECT_TYPE_FIELD)
-- Trap Activate Limit e1:SetCode(EFFECT_CANNOT_DIRECT_ATTACK)
local function is_trap(e) e1:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE)
return e:IsHasType(EFFECT_TYPE_ACTIVATE) and e:IsActiveType(TYPE_TRAP) e1:SetTargetRange(s_range, o_range)
if target ~= nil then
e1:SetTarget(target)
end end
local function tarp_limit(e, rp, tp) e1:SetReset(reset)
return not is_trap(e) Duel.RegisterEffect(e1, player)
return e1
end
-- 创建效果: 不能召唤怪兽 (自肃)
function RushDuel.CreateCannotSummonEffect(e, desc, target, player, s_range, o_range, reset)
local e1 = Effect.CreateEffect(e:GetHandler())
e1:SetDescription(desc)
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetCode(EFFECT_CANNOT_SUMMON)
e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET + EFFECT_FLAG_CLIENT_HINT)
e1:SetTargetRange(s_range, o_range)
if target ~= nil then
e1:SetTarget(target)
end end
RushDuel.CreateFieldGlobalEffect(true, EVENT_CHAINING, function(e, tp, eg, ep, ev, re, r, rp) e1:SetReset(reset)
if is_trap(re) then Duel.RegisterEffect(e1, player)
Duel.SetChainLimit(tarp_limit) return e1
end
end)
-- Main Phase 2
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_SKIP_M2)
-- Hand Unlimited
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_HAND_LIMIT, 100)
end end
-- 创建效果: 不能特殊召唤怪兽 (自肃)
-- Legend function RushDuel.CreateCannotSpecialSummonEffect(e, desc, target, player, s_range, o_range, reset)
function RushDuel.InitLegend(c) local e1 = Effect.CreateEffect(e:GetHandler())
local e = Effect.GlobalEffect() e1:SetDescription(desc)
e:SetType(EFFECT_TYPE_SINGLE) e1:SetType(EFFECT_TYPE_FIELD)
e:SetCode(EFFECT_ADD_CODE) e1:SetCode(EFFECT_CANNOT_SPECIAL_SUMMON)
e:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE + EFFECT_FLAG_CANNOT_DISABLE) e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET + EFFECT_FLAG_CLIENT_HINT)
e:SetRange(0xff) e1:SetTargetRange(s_range, o_range)
e:SetValue(c:GetOriginalCode()) if target ~= nil then
c:RegisterEffect(e) e1:SetTarget(target)
end
e1:SetReset(reset)
Duel.RegisterEffect(e1, player)
return e1
end end
function RushDuel.IsLegendCode(c, ...) -- 创建效果: Buff类效果
for _, code in ipairs {...} do function RushDuel.CreateSingleEffect(e, desc, card, code, value, reset)
if c:GetOriginalCode() == code and c:IsCode(120000000) then local e1 = Effect.CreateEffect(e:GetHandler())
return true e1:SetType(EFFECT_TYPE_SINGLE)
end e1:SetCode(code)
if value ~= nil then
e1:SetValue(value)
end
if desc ~= nil then
e1:SetDescription(desc)
e1:SetProperty(EFFECT_FLAG_CLIENT_HINT)
end
if reset ~= nil then
e1:SetReset(reset)
end end
return false card:RegisterEffect(e1)
return e1
end end
-- Select Effect -- Select Effect
......
-- Rush Duel 条件
RushDuel = RushDuel or {}
RD = RushDuel
-- 条件: 是否为传说卡
function RushDuel.IsLegendCode(card, ...)
for _, code in ipairs {...} do
if card:GetOriginalCode() == code and card:IsCode(120000000) then
return true
end
end
return false
end
-- 条件: 是否为同名卡
function RushDuel.IsSameCode(card1, card2)
if (card1:IsCode(120000000) or card2:IsCode(120000000)) then
return card1:GetOriginalCode() == card2:GetOriginalCode()
else
return card1:IsCode(card2:GetCode())
end
end
-- 条件: 卡片是否处于"极大模式"
function RushDuel.IsMaximumMode(card)
return card:IsSummonType(SUMMON_TYPE_MAXIMUM) and card:GetOverlayCount() > 0
end
-- 条件: 这张卡召唤的回合
function RushDuel.IsSummonTurn(card)
return card:IsReason(REASON_SUMMON) and card:IsStatus(STATUS_SUMMON_TURN)
end
-- 条件: 这张卡特殊召唤的回合
function RushDuel.IsSpecialSummonTurn(card)
return card:IsReason(REASON_SPSUMMON) and card:IsStatus(STATUS_SPSUMMON_TURN)
end
-- 条件: 玩家的LP在 lp 以上
function RushDuel.IsLPAbove(player, lp)
return Duel.GetLP(player) >= lp
end
-- 条件: 玩家的LP在 lp 以下
function RushDuel.IsLPBelow(player, lp)
return Duel.GetLP(player) <= lp
end
-- 条件: 玩家的LP比对方少 lp 以上
function RushDuel.IsLPBelowOpponent(player, lp)
return Duel.GetLP(player) <= Duel.GetLP(1 - player) - (lp or 0)
end
-- 条件: 守备力在 def 以上
function RushDuel.IsDefenseAbove(card, def)
return card:IsDefenseAbove(def) and not RushDuel.IsMaximumMode(card)
end
-- 条件: 守备力在 def 以下
function RushDuel.IsDefenseBelow(card, def)
return card:IsDefenseBelow(def) and not RushDuel.IsMaximumMode(card)
end
-- 条件: 可否改变守备力
function RushDuel.IsCanChangeDef(card)
return card:IsDefenseAbove(0) and not RushDuel.IsMaximumMode(card)
end
-- 条件: 可否改变表示形式
function RushDuel.IsCanChangePosition(card)
return card:IsCanChangePosition() and not RushDuel.IsMaximumMode(card)
end
-- 条件: 可否特殊召唤
function RushDuel.IsCanBeSpecialSummoned(card, effect, player, pos)
return card:IsCanBeSpecialSummoned(effect, 0, player, false, false, pos)
end
-- 条件: 可否赋予效果 - 直接攻击
function RushDuel.IsCanAttachDirectAttack(card)
return not card:IsHasEffect(EFFECT_DIRECT_ATTACK) and not card:IsHasEffect(EFFECT_CANNOT_ATTACK) and not card:IsHasEffect(EFFECT_CANNOT_DIRECT_ATTACK)
end
-- 条件: 可否赋予效果 - 贯通
function RushDuel.IsCanAttachPierce(card)
return not card:IsHasEffect(EFFECT_CANNOT_ATTACK)
end
-- 条件: 可否赋予效果 - 双重解放
function RushDuel.IsCanAttachDoubleTribute(card)
return not card:IsHasEffect(EFFECT_UNRELEASABLE_SUM)
end
-- 额外条件: 最后的操作是否包含某种卡
function RushDuel.IsOperatedGroupExists(filter, count, expect)
return filter == nil or Duel.GetOperatedGroup():IsExists(filter, count, expect)
end
-- Rush Duel 代价
RushDuel = RushDuel or {}
RD = RushDuel
-- 内部方法: 选择匹配卡片, 执行操作
function RushDuel._private_cost_select_match(hint, filter, s_range, o_range, min, max, except_self, action)
return function(e, tp, eg, ep, ev, re, r, rp, chk)
local expect = nil
if except_self then
expect = e:GetHandler()
end
if chk == 0 then
return Duel.IsExistingMatchingCard(filter, tp, s_range, o_range, min, expect, e, tp, eg, ep, ev, re, r, rp)
end
Duel.Hint(HINT_SELECTMSG, tp, hint)
local g = Duel.SelectMatchingCard(tp, filter, tp, s_range, o_range, min, max, expect, e, tp, eg, ep, ev, re, r, rp)
action(g, e, tp, eg, ep, ev, re, r, rp)
end
end
-- 内部方法: 选择子卡片组, 执行操作
function RushDuel._private_cost_select_group(hint, filter, check, s_range, o_range, min, max, except_self, action)
return function(e, tp, eg, ep, ev, re, r, rp, chk)
local expect = nil
if except_self then
expect = e:GetHandler()
end
local g = Duel.GetMatchingGroup(filter, tp, s_range, o_range, expect, e, tp, eg, ep, ev, re, r, rp)
if chk == 0 then
return g:CheckSubGroup(check, min, max, e, tp, eg, ep, ev, re, r, rp)
end
Duel.Hint(HINT_SELECTMSG, tp, hint)
local sg = g:SelectSubGroup(tp, check, false, min, max, e, tp, eg, ep, ev, re, r, rp)
action(sg, e, tp, eg, ep, ev, re, r, rp)
end
end
-- 内部方法: 送去墓地动作
function RushDuel._private_action_send_grave(reason, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
return function(g, e, tp, eg, ep, ev, re, r, rp)
RushDuel.HintOrConfirm(g, hint_selection, confirm, 1 - tp)
RushDuel.SetLabelAndObject(e, g, set_label_before, set_object_before)
if Duel.SendtoGrave(g, reason) ~= 0 and (set_label_after ~= nil or set_object_after ~= nil) then
local og = Duel.GetOperatedGroup()
RushDuel.SetLabelAndObject(e, g, set_label_after, set_object_after)
end
end
end
-- 内部方法: 返回卡组动作
function RushDuel._private_action_send_deck_sort(sequence, reason, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
return function(g, e, tp, eg, ep, ev, re, r, rp)
RushDuel.HintOrConfirm(g, hint_selection, confirm, 1 - tp)
RushDuel.SetLabelAndObject(e, g, set_label_before, set_object_before)
local og, ct = RushDuel.SendToDeckSort(g, sequence, reason, tp, tp)
RushDuel.SetLabelAndObject(e, g, set_label_after, set_object_after)
end
end
-- 代价: 选择匹配卡片, 送去墓地
function RushDuel.CostSendMatchToGrave(filter, field, min, max, except_self, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
local action = RushDuel._private_action_send_grave(REASON_COST, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel._private_cost_select_match(HINTMSG_TOGRAVE, filter, field, 0, min, max, except_self, action)
end
-- 代价: 选择子卡片组, 送去墓地
function RushDuel.CostSendGroupToGrave(filter, check, field, min, max, except_self, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
local action = RushDuel._private_action_send_grave(REASON_COST, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel._private_cost_select_group(HINTMSG_TOGRAVE, filter, check, field, 0, min, max, except_self, action)
end
-- 代价: 选择匹配卡片, 返回卡组 (排序)
function RushDuel.CostSendMatchToDeckSort(filter, field, min, max, except_self, sequence, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
local action = RushDuel._private_action_send_deck_sort(sequence, REASON_COST, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel._private_cost_select_match(HINTMSG_TODECK, filter, field, 0, min, max, except_self, action)
end
-- 代价: 选择子卡片组, 返回卡组 (排序)
function RushDuel.CostSendGroupToDeckSort(filter, check, field, min, max, except_self, sequence, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
local action = RushDuel._private_action_send_deck_sort(sequence, REASON_COST, hint_selection, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel._private_cost_select_group(HINTMSG_TOGRAVE, filter, check, field, 0, min, max, except_self, action)
end
-- 代价: 支付LP
function RushDuel.CostPayLP(lp)
return function(e, tp, eg, ep, ev, re, r, rp, chk)
if chk == 0 then
return Duel.CheckLPCost(tp, lp)
end
Duel.PayLPCost(tp, lp)
end
end
-- 代价: 把手卡给对方观看
function RushDuel.CostShowHand(filter, min, max, set_label, set_object)
return RushDuel._private_cost_select_match(HINTMSG_CONFIRM, filter, LOCATION_HAND, 0, min, max, true, function(g, e, tp, eg, ep, ev, re, r, rp)
RushDuel.SetLabelAndObject(e, g, set_label, set_object)
Duel.ConfirmCards(1 - tp, g)
Duel.ShuffleHand(tp)
end)
end
-- 代价: 从卡组上面把卡送去墓地
function RushDuel.CostSendDeckTopToGrave(count)
return function(e, tp, eg, ep, ev, re, r, rp, chk)
if chk == 0 then
return Duel.IsPlayerCanDiscardDeckAsCost(tp, count)
end
Duel.DiscardDeck(tp, count, REASON_COST)
end
end
-- 代价: 把自己场上表侧表示的这张卡送去墓地
function RushDuel.CostSendSelfToGrave()
return function(e, tp, eg, ep, ev, re, r, rp, chk)
if chk == 0 then
return e:GetHandler():IsAbleToGraveAsCost()
end
Duel.SendtoGrave(RushDuel.ToMaximunGroup(e:GetHandler()), REASON_COST)
end
end
-- 代价: 把手卡送去墓地
function RushDuel.CostSendHandToGrave(filter, min, max, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel.CostSendMatchToGrave(filter, LOCATION_HAND, min, max, true, false, false, set_label_before, set_object_before, set_label_after, set_object_after)
end
-- 代价: 把手卡送去墓地 (子卡片组)
function RushDuel.CostSendHandSubToGrave(filter, check, min, max, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel.CostSendGroupToGrave(filter, check, LOCATION_HAND, min, max, true, false, false, set_label_before, set_object_before, set_label_after, set_object_after)
end
-- 代价: 把怪兽送去墓地
function RushDuel.CostSendMZoneToGrave(filter, min, max, except_self, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel.CostSendMatchToGrave(filter, LOCATION_MZONE, min, max, except_self, true, false, set_label_before, set_object_before, set_label_after, set_object_after)
end
-- 代价: 把场上的卡送去墓地
function RushDuel.CostSendOnFieldToGrave(filter, min, max, except_self, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel.CostSendMatchToGrave(filter, LOCATION_ONFIELD, min, max, except_self, true, false, set_label_before, set_object_before, set_label_after, set_object_after)
end
-- 代价: 把手卡返回卡组下面
function RushDuel.CostSendHandToDeckBottom(filter, min, max, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel.CostSendMatchToDeckSort(filter, LOCATION_HAND, min, max, true, 1, false, confirm, set_label_before, set_object_before, set_label_after, set_object_after)
end
-- 代价: 让墓地的卡返回卡组
function RushDuel.CostSendGraveToDeck(filter, min, max, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel.CostSendMatchToDeckSort(filter, LOCATION_GRAVE, min, max, false, 2, false, true, set_label_before, set_object_before, set_label_after, set_object_after)
end
-- 代价: 让墓地的卡返回卡组下面
function RushDuel.CostSendGraveToDeckBottom(filter, min, max, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel.CostSendMatchToDeckSort(filter, LOCATION_GRAVE, min, max, false, 1, false, true, set_label_before, set_object_before, set_label_after, set_object_after)
end
-- 代价: 让墓地的卡返回卡组下面 (子卡片组)
function RushDuel.CostSendGraveSubToDeckBottom(filter, check, min, max, set_label_before, set_object_before, set_label_after, set_object_after)
return RushDuel.CostSendGroupToDeckSort(filter, check, LOCATION_GRAVE, min, max, false, 1, false, true, set_label_before, set_object_before, set_label_after, set_object_after)
end
This diff is collapsed.
-- Rush Duel 辅助函数
RushDuel = RushDuel or {}
RD = RushDuel
-- 为效果设置标签
function RushDuel.SetLabelAndObject(effect, target, set_label, set_object)
if effect ~= nil and target ~= nil then
if set_label ~= nil then
effect:SetLabel(set_label(target))
end
if set_object ~= nil then
effect:SetLabelObject(set_object(target))
end
end
end
-- 显示选择动画, 或者展示卡片组
function RushDuel.HintOrConfirm(group, hint_selection, confirm, target_player)
if hint_selection then
Duel.HintSelection(group)
elseif confirm then
Duel.ConfirmCards(target_player, group)
end
end
-- 将 卡片组/卡片/效果 转化为卡片组, 对于极大怪兽, 其素材也包含其中
function RushDuel.ToMaximunGroup(target)
local type = aux.GetValueType(target)
local g = Group.CreateGroup()
if type == "Group" then
g:Merge(target)
elseif type == "Card" then
g:AddCard(target)
elseif type == "Effect" then
g:AddCard(target:GetHandler())
end
local overlay = Group.CreateGroup()
g:ForEach(function(tc)
if RushDuel.IsMaximumMode(tc) then
overlay:Merge(tc:GetOverlayGroup())
end
end)
g:Merge(overlay)
return g
end
-- 获取可用的主要怪兽区域数量
function RushDuel.GetMZoneCount(player, max)
local ct = Duel.GetLocationCount(player, LOCATION_MZONE)
if Duel.IsPlayerAffectedByEffect(player, 59822133) then
ct = math.min(ct, 1)
end
return math.min(ct, max)
end
-- 获取可用的魔法与陷阱区域数量
function RushDuel.GetSZoneCount(player, max)
local ct = Duel.GetLocationCount(player, LOCATION_SZONE)
return math.min(ct, max)
end
-- 返回卡组并排序
function RushDuel.SendToDeckSort(target, sequence, reason, sort_player, target_player)
local g = RushDuel.ToMaximunGroup(target)
if sequence == 1 and g:GetCount() > 1 then
Duel.SendtoDeck(g, nil, 0, reason)
else
Duel.SendtoDeck(g, nil, sequence, reason)
end
local og = Duel.GetOperatedGroup()
local ct = og:FilterCount(Card.IsLocation, nil, LOCATION_DECK)
if sequence ~= 2 and ct > 1 then
Duel.SortDecktop(sort_player, target_player, ct)
if sequence == 1 then
for i = 1, ct do
local tc = Duel.GetDecktopGroup(target_player, 1):GetFirst()
Duel.MoveSequence(tc, 1)
end
end
end
return og, ct
end
-- Maximum -- Rush Duel 极大
TYPE_MAXIMUM = 0x400
SUMMON_TYPE_MAXIMUM = 0x45000000
RushDuel = RushDuel or {} RushDuel = RushDuel or {}
RD = RushDuel RD = RushDuel
TYPE_MAXIMUM = 0x400 -- 极大怪兽
SUMMON_TYPE_MAXIMUM = 0x45000000 -- 极大模式
-- 添加极大召唤手续
function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code) function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code)
-- Maximum Summon -- 极大召唤 手续
local e1 = Effect.CreateEffect(c) local e1 = Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(120000000, 0)) e1:SetDescription(aux.Stringid(120000000, 0))
e1:SetType(EFFECT_TYPE_FIELD) e1:SetType(EFFECT_TYPE_FIELD)
...@@ -37,15 +38,15 @@ function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code) ...@@ -37,15 +38,15 @@ function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code)
end) end)
e1:SetValue(SUMMON_TYPE_MAXIMUM) e1:SetValue(SUMMON_TYPE_MAXIMUM)
c:RegisterEffect(e1) c:RegisterEffect(e1)
-- Maximum Material -- 极大召唤 素材
local e2 = Effect.CreateEffect(c) local e2 = Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_CONTINUOUS) e2:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_CONTINUOUS)
e2:SetCode(EVENT_SPSUMMON_SUCCESS) e2:SetCode(EVENT_SPSUMMON_SUCCESS)
e2:SetProperty(EFFECT_FLAG_CANNOT_DISABLE + EFFECT_FLAG_UNCOPYABLE) e2:SetProperty(EFFECT_FLAG_CANNOT_DISABLE + EFFECT_FLAG_UNCOPYABLE)
e2:SetCondition(RushDuel.MaximumMode) e2:SetCondition(RushDuel.MaximumMaterialCondition)
e2:SetOperation(RushDuel.MaximumOverlay) e2:SetOperation(RushDuel.MaximumMaterialOperation)
c:RegisterEffect(e2) c:RegisterEffect(e2)
-- Maximun Atk -- 极大攻击力
local e3 = Effect.CreateEffect(c) local e3 = Effect.CreateEffect(c)
e3:SetType(EFFECT_TYPE_SINGLE) e3:SetType(EFFECT_TYPE_SINGLE)
e3:SetCode(EFFECT_SET_BASE_ATTACK) e3:SetCode(EFFECT_SET_BASE_ATTACK)
...@@ -54,7 +55,7 @@ function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code) ...@@ -54,7 +55,7 @@ function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code)
e3:SetCondition(RushDuel.MaximumMode) e3:SetCondition(RushDuel.MaximumMode)
e3:SetValue(max_atk) e3:SetValue(max_atk)
c:RegisterEffect(e3) c:RegisterEffect(e3)
-- Position -- 不可改变表示形式
local e4 = Effect.CreateEffect(c) local e4 = Effect.CreateEffect(c)
e4:SetType(EFFECT_TYPE_SINGLE) e4:SetType(EFFECT_TYPE_SINGLE)
e4:SetCode(EFFECT_SET_POSITION) e4:SetCode(EFFECT_SET_POSITION)
...@@ -81,7 +82,7 @@ function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code) ...@@ -81,7 +82,7 @@ function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code)
e7:SetRange(LOCATION_MZONE) e7:SetRange(LOCATION_MZONE)
e7:SetCondition(RushDuel.MaximumMode) e7:SetCondition(RushDuel.MaximumMode)
c:RegisterEffect(e7) c:RegisterEffect(e7)
-- Use 3 MZone -- 占用3个主要怪兽区域
local e8 = Effect.CreateEffect(c) local e8 = Effect.CreateEffect(c)
e8:SetType(EFFECT_TYPE_FIELD) e8:SetType(EFFECT_TYPE_FIELD)
e8:SetCode(EFFECT_MAX_MZONE) e8:SetCode(EFFECT_MAX_MZONE)
...@@ -91,7 +92,7 @@ function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code) ...@@ -91,7 +92,7 @@ function RushDuel.AddMaximumProcedure(c, max_atk, left_code, right_code)
e8:SetCondition(RushDuel.MaximumMode) e8:SetCondition(RushDuel.MaximumMode)
e8:SetValue(1) e8:SetValue(1)
c:RegisterEffect(e8) c:RegisterEffect(e8)
-- Leave Field -- 离开场上时, 所有部件一同离开
local e9 = Effect.CreateEffect(c) local e9 = Effect.CreateEffect(c)
e9:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_CONTINUOUS) e9:SetType(EFFECT_TYPE_SINGLE + EFFECT_TYPE_CONTINUOUS)
e9:SetCode(EVENT_LEAVE_FIELD_P) e9:SetCode(EVENT_LEAVE_FIELD_P)
...@@ -107,9 +108,13 @@ function RushDuel.MaximumSummonCheck(g) ...@@ -107,9 +108,13 @@ function RushDuel.MaximumSummonCheck(g)
return g:GetClassCount(Card.GetCode) == g:GetCount() return g:GetClassCount(Card.GetCode) == g:GetCount()
end end
function RushDuel.MaximumMode(e) function RushDuel.MaximumMode(e)
local c=e:GetHandler()
return c:IsSummonType(SUMMON_TYPE_MAXIMUM) and c:GetOverlayCount() > 0
end
function RushDuel.MaximumMaterialCondition(e)
return e:GetHandler():IsSummonType(SUMMON_TYPE_MAXIMUM) return e:GetHandler():IsSummonType(SUMMON_TYPE_MAXIMUM)
end end
function RushDuel.MaximumOverlay(e, tp, eg, ep, ev, re, r, rp) function RushDuel.MaximumMaterialOperation(e, tp, eg, ep, ev, re, r, rp)
local c = e:GetHandler() local c = e:GetHandler()
local mg = c:GetMaterial() local mg = c:GetMaterial()
Duel.Overlay(c, mg) Duel.Overlay(c, mg)
......
-- Rush Duel 规则
RushDuel = RushDuel or {}
RD = RushDuel
-- 初始化
function RushDuel.Init()
RushDuel.InitRule()
Duel.BreakEffect = function()
-- "那之后" 不打断时点
end
-- 决斗开始
RushDuel.CreateFieldGlobalEffect(true, EVENT_PHASE_START + PHASE_DRAW, function(e)
-- 先攻抽卡
if not Auxiliary.Load2PickRule then
Duel.Draw(0, 1, REASON_RULE)
end
-- 传说卡
local g = Duel.GetMatchingGroup(Card.IsCode, 0, 0xff, 0xff, nil, 120000000)
g:ForEach(RushDuel.InitLegend)
e:Reset()
end)
end
-- 初始化规则
function RushDuel.InitRule()
-- 禁用最左与最右列
RushDuel.CreateFieldGlobalEffect(false, EFFECT_DISABLE_FIELD, function(e, tp)
return 0x11711171
end)
-- 抽卡阶段, 抽卡至5张, 超过5张时改为抽1张
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_DRAW_COUNT, function(e)
return math.max(1, 5 - Duel.GetFieldGroupCount(Duel.GetTurnPlayer(), LOCATION_HAND, 0))
end)
-- 跳过准备阶段
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_SKIP_SP)
-- 召唤次数无限制
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_SET_SUMMON_COUNT_LIMIT, 100)
-- 场上的怪兽的效果强制1回合1次
local function get_effect_owner_code(e)
if e:GetType() & EFFECT_TYPE_XMATERIAL == EFFECT_TYPE_XMATERIAL then
-- 极大怪兽的L/R部分的效果分开计算
return e:GetLabel()
else
return e:GetOwner():GetCode()
end
end
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_CANNOT_ACTIVATE, function(e, re, tp)
return re:GetHandler():GetFlagEffect(get_effect_owner_code(re)) ~= 0
end)
RushDuel.CreateFieldGlobalEffect(true, EVENT_CHAIN_SOLVING, function(e, tp, eg, ep, ev, re, r, rp)
local te = Duel.GetChainInfo(ev, CHAININFO_TRIGGERING_EFFECT)
local code = get_effect_owner_code(te)
te:GetHandler():RegisterFlagEffect(code, RESET_EVENT + RESETS_STANDARD + RESET_PHASE + PHASE_END, 0, 1)
end)
-- 同一时点只能发动一张陷阱卡
local function is_trap(e)
return e:IsHasType(EFFECT_TYPE_ACTIVATE) and e:IsActiveType(TYPE_TRAP)
end
local function tarp_limit(e, rp, tp)
return not is_trap(e)
end
RushDuel.CreateFieldGlobalEffect(true, EVENT_CHAINING, function(e, tp, eg, ep, ev, re, r, rp)
if is_trap(re) then
Duel.SetChainLimit(tarp_limit)
end
end)
-- 跳过主要阶段2
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_SKIP_M2)
-- 手卡无限制
RushDuel.CreatePlayerTargetGlobalEffect(EFFECT_HAND_LIMIT, 100)
end
-- 初始化传说卡
function RushDuel.InitLegend(c)
local e = Effect.GlobalEffect()
e:SetType(EFFECT_TYPE_SINGLE)
e:SetCode(EFFECT_ADD_CODE)
e:SetProperty(EFFECT_FLAG_IGNORE_IMMUNE + EFFECT_FLAG_CANNOT_DISABLE)
e:SetRange(0xff)
e:SetValue(c:GetOriginalCode())
c:RegisterEffect(e)
end
-- Rush Duel 对象
RushDuel = RushDuel or {}
RD = RushDuel
-- 对玩家效果: 抽卡 - 对象
function RushDuel.TargetDraw(player, count)
Duel.SetTargetPlayer(player)
Duel.SetTargetParam(count)
Duel.SetOperationInfo(0, CATEGORY_DRAW, nil, 0, player, count)
end
-- 对玩家效果: 恢复 - 对象
function RushDuel.TargetRecover(player, recover)
Duel.SetTargetPlayer(player)
Duel.SetTargetParam(recover)
Duel.SetOperationInfo(0, CATEGORY_RECOVER, nil, 0, player, recover)
end
-- 对玩家效果: 伤害 - 对象
function RushDuel.TargetDamage(player, damage)
Duel.SetTargetPlayer(player)
Duel.SetTargetParam(damage)
Duel.SetOperationInfo(0, CATEGORY_DAMAGE, nil, 0, player, damage)
end
-- 对玩家效果: 抽卡 - 结算
function RushDuel.Draw(player, count)
local p, d = Duel.GetChainInfo(0, CHAININFO_TARGET_PLAYER, CHAININFO_TARGET_PARAM)
return Duel.Draw(player or p, count or d, REASON_EFFECT)
end
-- 对玩家效果: 恢复 - 结算
function RushDuel.Recover(player, recover)
local p, d = Duel.GetChainInfo(0, CHAININFO_TARGET_PLAYER, CHAININFO_TARGET_PARAM)
return Duel.Recover(player or p, recover or d, REASON_EFFECT)
end
-- 对玩家效果: 伤害 - 结算
function RushDuel.Damage(player, damage)
local p, d = Duel.GetChainInfo(0, CHAININFO_TARGET_PLAYER, CHAININFO_TARGET_PARAM)
return Duel.Damage(player or p, damage or d, REASON_EFFECT)
end
...@@ -19,14 +19,7 @@ end ...@@ -19,14 +19,7 @@ end
function cm.costfilter(c) function cm.costfilter(c)
return c:IsCode(list[1],list[2],list[3]) and c:IsAbleToDeckOrExtraAsCost() return c:IsCode(list[1],list[2],list[3]) and c:IsAbleToDeckOrExtraAsCost()
end end
function cm.cost(e,tp,eg,ep,ev,re,r,rp,chk) cm.cost=RD.CostSendGraveSubToDeckBottom(cm.costfilter,aux.dncheck,3,3)
local g=Duel.GetMatchingGroup(cm.costfilter,tp,LOCATION_GRAVE,0,nil)
if chk==0 then return g:CheckSubGroup(aux.dncheck,3,3) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_TODECK)
local sg=g:SelectSubGroup(tp,aux.dncheck,false,3,3)
Duel.ConfirmCards(1-tp,sg)
RD.SendToDeckBottom(sg,tp,tp,true)
end
function cm.target(e,tp,eg,ep,ev,re,r,rp,chk) function cm.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return e:GetHandler():IsAbleToGrave() and Duel.IsPlayerCanDraw(tp,3) end if chk==0 then return e:GetHandler():IsAbleToGrave() and Duel.IsPlayerCanDraw(tp,3) end
Duel.SetOperationInfo(0,CATEGORY_TOGRAVE,e:GetHandler(),1,0,0) Duel.SetOperationInfo(0,CATEGORY_TOGRAVE,e:GetHandler(),1,0,0)
......
...@@ -19,14 +19,9 @@ end ...@@ -19,14 +19,9 @@ end
function cm.costcheck(g) function cm.costcheck(g)
return g:GetClassCount(Card.GetLevel)==1 return g:GetClassCount(Card.GetLevel)==1
end end
function cm.cost(e,tp,eg,ep,ev,re,r,rp,chk) cm.cost=RD.CostSendHandSubToGrave(cm.costfilter,cm.costcheck,2,2,function(g)
local g=Duel.GetMatchingGroup(cm.costfilter,tp,LOCATION_HAND,0,nil) return g:GetFirst():GetLevel()
if chk==0 then return g:CheckSubGroup(cm.costcheck,2,2) end end)
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_TOGRAVE)
local sg=g:SelectSubGroup(tp,cm.costcheck,false,2,2)
e:SetLabel(sg:GetFirst():GetLevel())
Duel.SendtoGrave(sg,REASON_COST)
end
function cm.target(e,tp,eg,ep,ev,re,r,rp,chk) function cm.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsExistingMatchingCard(Card.IsFaceup,tp,LOCATION_MZONE,0,1,nil) end if chk==0 then return Duel.IsExistingMatchingCard(Card.IsFaceup,tp,LOCATION_MZONE,0,1,nil) end
end end
......
...@@ -17,14 +17,7 @@ end ...@@ -17,14 +17,7 @@ end
function cm.costfilter(c) function cm.costfilter(c)
return c:IsAttack(0) and c:IsAbleToDeckOrExtraAsCost() return c:IsAttack(0) and c:IsAbleToDeckOrExtraAsCost()
end end
function cm.cost(e,tp,eg,ep,ev,re,r,rp,chk) cm.cost=RD.CostSendGraveToDeck(cm.costfilter,1,99,nil,nil,Group.GetCount)
if chk==0 then return Duel.IsExistingMatchingCard(cm.costfilter,tp,LOCATION_GRAVE,0,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_TODECK)
local g=Duel.SelectMatchingCard(tp,cm.costfilter,tp,LOCATION_GRAVE,0,1,99,nil)
Duel.ConfirmCards(1-tp,g)
local ct=Duel.SendtoDeck(g,nil,2,REASON_COST)
e:SetLabel(ct)
end
function cm.target(e,tp,eg,ep,ev,re,r,rp,chk) function cm.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsExistingMatchingCard(Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,e:GetHandler()) end if chk==0 then return Duel.IsExistingMatchingCard(Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,e:GetHandler()) end
end end
...@@ -32,24 +25,10 @@ function cm.operation(e,tp,eg,ep,ev,re,r,rp) ...@@ -32,24 +25,10 @@ function cm.operation(e,tp,eg,ep,ev,re,r,rp)
local atk=e:GetLabel()*300 local atk=e:GetLabel()*300
if atk==0 then return end if atk==0 then return end
local c=e:GetHandler() local c=e:GetHandler()
Duel.Hint(HINT_SELECTMSG,tp,aux.Stringid(m,1)) RD.SelectAndDoAction(aux.Stringid(m,1),Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,1,c,function(g)
local g=Duel.SelectMatchingCard(tp,Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,1,c) RD.AttachAtkDef(e, g:GetFirst(),-atk,0,RESET_EVENT+RESETS_STANDARD+RESET_PHASE+PHASE_END)
if g:GetCount()>0 then
Duel.HintSelection(g)
local tc=g:GetFirst()
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_UPDATE_ATTACK)
e1:SetValue(-atk)
e1:SetReset(RESET_EVENT+RESETS_STANDARD+RESET_PHASE+PHASE_END)
tc:RegisterEffect(e1)
if c:IsFaceup() and c:IsRelateToEffect(e) then if c:IsFaceup() and c:IsRelateToEffect(e) then
local e2=Effect.CreateEffect(c) RD.AttachAtkDef(e, c,atk,0,RESET_EVENT+RESETS_STANDARD+RESET_DISABLE+RESET_PHASE+PHASE_END)
e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_UPDATE_ATTACK)
e2:SetValue(atk)
e2:SetReset(RESET_EVENT+RESETS_STANDARD+RESET_DISABLE+RESET_PHASE+PHASE_END)
c:RegisterEffect(e2)
end end
end end)
end end
\ No newline at end of file
...@@ -23,24 +23,17 @@ end ...@@ -23,24 +23,17 @@ end
function cm.thfilter(c) function cm.thfilter(c)
return c:IsLevelBelow(8) and c:IsAttribute(ATTRIBUTE_DARK) and c:IsAbleToHand() return c:IsLevelBelow(8) and c:IsAttribute(ATTRIBUTE_DARK) and c:IsAbleToHand()
end end
function cm.cost(e,tp,eg,ep,ev,re,r,rp,chk) cm.cost=RD.CostSendHandToGrave(cm.costfilter,1,1)
if chk==0 then return Duel.IsExistingMatchingCard(cm.costfilter,tp,LOCATION_HAND,0,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_TOGRAVE)
local g=Duel.SelectMatchingCard(tp,cm.costfilter,tp,LOCATION_HAND,0,1,1,nil)
Duel.SendtoGrave(g,REASON_COST)
end
function cm.target(e,tp,eg,ep,ev,re,r,rp,chk) function cm.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsPlayerCanDiscardDeck(tp,2) end if chk==0 then return Duel.IsPlayerCanDiscardDeck(tp,2) end
Duel.SetOperationInfo(0,CATEGORY_DECKDES,nil,0,tp,2) Duel.SetOperationInfo(0,CATEGORY_DECKDES,nil,0,tp,2)
end end
function cm.operation(e,tp,eg,ep,ev,re,r,rp) function cm.operation(e,tp,eg,ep,ev,re,r,rp)
if Duel.DiscardDeck(tp,2,REASON_EFFECT)==0 then return end if RD.SendDeckTopToGraveAndExists(tp,2,cm.exfilter,1,nil) then
local g=Duel.GetOperatedGroup() RD.SelectAndDoAction(HINTMSG_ATOHAND,aux.NecroValleyFilter(cm.thfilter),tp,LOCATION_GRAVE,0,1,1,nil,function(g)
if not g:IsExists(cm.exfilter,1,nil) then return end if RD.SendToHandAndExists(g,1-tp) then
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_ATOHAND) Duel.Recover(1-tp,g:GetFirst():GetAttack(),REASON_EFFECT)
local sg=Duel.SelectMatchingCard(tp,aux.NecroValleyFilter(cm.thfilter),tp,LOCATION_GRAVE,0,1,1,nil) end
if sg:GetCount()>0 and Duel.SendtoHand(sg,nil,REASON_EFFECT)~=0 then end)
Duel.ConfirmCards(1-tp,sg)
Duel.Recover(1-tp,sg:GetFirst():GetAttack(),REASON_EFFECT)
end end
end end
\ No newline at end of file
...@@ -19,7 +19,7 @@ function cm.costfilter(c) ...@@ -19,7 +19,7 @@ function cm.costfilter(c)
return c:IsAttack(0) and c:IsAbleToDeckOrExtraAsCost() return c:IsAttack(0) and c:IsAbleToDeckOrExtraAsCost()
end end
function cm.spfilter(c,e,tp) function cm.spfilter(c,e,tp)
return c:IsLevelAbove(5) and c:IsAttack(0) and c:IsCanBeSpecialSummoned(e,0,tp,false,false,POS_FACEUP_ATTACK) return c:IsLevelAbove(5) and c:IsAttack(0) and RD.IsCanBeSpecialSummoned(c,e,tp,POS_FACEUP_ATTACK)
end end
function cm.costcheck(g,e,tp) function cm.costcheck(g,e,tp)
return Duel.IsExistingMatchingCard(cm.spfilter,tp,LOCATION_GRAVE,0,1,g,e,tp) return Duel.IsExistingMatchingCard(cm.spfilter,tp,LOCATION_GRAVE,0,1,g,e,tp)
...@@ -27,30 +27,12 @@ end ...@@ -27,30 +27,12 @@ end
function cm.condition(e,tp,eg,ep,ev,re,r,rp) function cm.condition(e,tp,eg,ep,ev,re,r,rp)
return Duel.GetFieldGroupCount(tp,LOCATION_MZONE,0)<=1 return Duel.GetFieldGroupCount(tp,LOCATION_MZONE,0)<=1
end end
function cm.cost(e,tp,eg,ep,ev,re,r,rp,chk) cm.cost=RD.CostSendGraveSubToDeckBottom(cm.costfilter,cm.costcheck,2,2)
local g=Duel.GetMatchingGroup(cm.costfilter,tp,LOCATION_GRAVE,0,nil)
if chk==0 then return g:CheckSubGroup(cm.costcheck,2,2,e,tp) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_TODECK)
local sg=g:SelectSubGroup(tp,cm.costcheck,false,2,2,e,tp)
Duel.ConfirmCards(1-tp,sg)
Duel.SendtoDeck(sg,nil,0,REASON_COST)
local ct=Duel.GetOperatedGroup():FilterCount(Card.IsLocation,nil,LOCATION_DECK)
Duel.SortDecktop(tp,tp,ct)
for i=1,ct do
local tc=Duel.GetDecktopGroup(tp,1):GetFirst()
Duel.MoveSequence(tc,1)
end
end
function cm.target(e,tp,eg,ep,ev,re,r,rp,chk) function cm.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.GetMZoneCount(tp)>0 if chk==0 then return Duel.GetMZoneCount(tp)>0
and Duel.IsExistingMatchingCard(cm.spfilter,tp,LOCATION_GRAVE,0,1,nil,e,tp) end and Duel.IsExistingMatchingCard(cm.spfilter,tp,LOCATION_GRAVE,0,1,nil,e,tp) end
Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,nil,1,tp,LOCATION_GRAVE) Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,nil,1,tp,LOCATION_GRAVE)
end end
function cm.operation(e,tp,eg,ep,ev,re,r,rp) function cm.operation(e,tp,eg,ep,ev,re,r,rp)
if Duel.GetMZoneCount(tp)<1 then return end RD.SelectAndSpecialSummon(aux.NecroValleyFilter(cm.spfilter), e, tp, LOCATION_GRAVE,0,1,1,nil, POS_FACEUP_ATTACK)
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_SPSUMMON)
local g=Duel.SelectMatchingCard(tp,aux.NecroValleyFilter(cm.spfilter),tp,LOCATION_GRAVE,0,1,1,nil,e,tp)
if g:GetCount()>0 then
Duel.SpecialSummon(g,0,tp,tp,false,false,POS_FACEUP_ATTACK)
end
end end
\ No newline at end of file
-- Load Rush Duel -- Load Rush Duel
Duel.LoadScript("RDBase.lua") Duel.LoadScript("RDBase.lua")
Duel.LoadScript("RDRule.lua")
Duel.LoadScript("RDMaximum.lua") Duel.LoadScript("RDMaximum.lua")
Duel.LoadScript("RDExpand.lua") Duel.LoadScript("RDFunction.lua")
Duel.LoadScript("RDCondition.lua")
Duel.LoadScript("RDCost.lua")
Duel.LoadScript("RDTarget.lua")
Duel.LoadScript("RDAttach.lua")
Duel.LoadScript("RDAction.lua")
function Auxiliary.PreloadUds() function Auxiliary.PreloadUds()
RD.Init() RD.Init()
......
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