├── .idea ├── .gitignore ├── misc.xml ├── vcs.xml ├── modules.xml └── three-kingdoms-kill.iml ├── hero ├── lv_bu.lua ├── zhang_fei.lua ├── huang_yue_ying.lua ├── lv_meng.lua ├── huang_gai.lua ├── jia_xv.lua ├── lu_xvn.lua ├── xv_chu.lua ├── cao_cao.lua ├── zhu_ge_liang.lua ├── wo_long_zhu_ge.lua ├── guo_jia.lua ├── ma_chao.lua ├── zhen_ji.lua ├── sun_jian.lua ├── liu_bei.lua ├── tai_shi_ci.lua ├── zhu_rong.lua ├── meng_huo.lua ├── xia_hou_dun.lua ├── pang_de.lua ├── pang_tong.lua ├── zhang_liao.lua ├── sun_quan.lua ├── si_ma_yi.lua ├── zhao_yun.lua ├── zhou_tai.lua ├── sun_shang_xiang.lua ├── hua_tuo.lua ├── cao_pi.lua ├── wei_yan.lua ├── gan_ning.lua ├── zhou_yu.lua ├── zhang_zhao_zhang_hong.lua ├── xia_hou_yuan.lua ├── dian_wei.lua ├── liu_shan.lua ├── zhang_jiao.lua ├── xiao_qiao.lua ├── diao_chan.lua ├── cai_wen_ji.lua ├── yuan_shao.lua ├── guan_yu.lua ├── yan_liang_wen_chou.lua ├── huang_zhong.lua ├── xvn_yu.lua ├── da_qiao.lua ├── deng_ai.lua ├── jiang_wei.lua ├── sun_ce.lua ├── lu_su.lua ├── cao_ren.lua └── zhang_he.lua ├── main.lua ├── macro.lua ├── README.md ├── deck.lua ├── class.lua ├── helper.lua ├── query.lua ├── game.lua ├── opt.lua ├── resmng.lua └── test.lua /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /workspace.xml -------------------------------------------------------------------------------- /hero/lv_bu.lua: -------------------------------------------------------------------------------- 1 | LvBu = class(Player) 2 | 3 | return LvBu -------------------------------------------------------------------------------- /hero/zhang_fei.lua: -------------------------------------------------------------------------------- 1 | ZhangFei = class(Player) 2 | 3 | return ZhangFei -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /hero/huang_yue_ying.lua: -------------------------------------------------------------------------------- 1 | HuangYueYing = class(Player) 2 | 3 | HuangYueYing.skill["集智"] = function (self) 4 | if not query["询问发动技能"]("集智") then 5 | return 6 | end 7 | helper.insert(self.hand_cards, deck:draw(1)) 8 | end 9 | 10 | return HuangYueYing -------------------------------------------------------------------------------- /hero/lv_meng.lua: -------------------------------------------------------------------------------- 1 | LvMeng = class(Player) 2 | 3 | LvMeng.skill["弃牌阶段开始前"] = function (self) 4 | if not self:has_skill("克己") then 5 | return 6 | end 7 | if not self.flags["使用或打出过杀"] then 8 | self.flags["跳过弃牌"] = true 9 | end 10 | end 11 | 12 | return LvMeng -------------------------------------------------------------------------------- /main.lua: -------------------------------------------------------------------------------- 1 | require("class") 2 | require("helper") 3 | require("deck") 4 | require("game") 5 | require("macro") 6 | require("opt") 7 | require("player") 8 | require("query") 9 | require("resmng") 10 | 11 | deck = Deck:new() 12 | game = Game:new() 13 | 14 | deck:init() 15 | game:init() 16 | 17 | game:main() -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/three-kingdoms-kill.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /macro.lua: -------------------------------------------------------------------------------- 1 | macro = {} 2 | 3 | macro.suit = { 4 | spade = 0, 5 | heart = 1, 6 | club = 2, 7 | diamond = 3 8 | } 9 | 10 | macro.color = { 11 | black = 0, 12 | red = 1 13 | } 14 | 15 | macro.sub_life_type = { 16 | life_loss = 0, 17 | damage = 1 18 | } 19 | 20 | macro.toward = { 21 | up = 0, 22 | down = 1 23 | } 24 | 25 | -------------------------------------------------------------------------------- /hero/huang_gai.lua: -------------------------------------------------------------------------------- 1 | HuangGai = class(Player) 2 | 3 | HuangGai.check_skill["苦肉"] = function (self) 4 | return true 5 | end 6 | 7 | HuangGai.skill["苦肉"] = function (self) 8 | self:sub_life({causer = nil, type = macro.sub_life_type.life_loss, name = "苦肉", card_id = nil, n = 1}) 9 | if self:check_alive() then 10 | helper.insert(self.hand_cards, deck:draw(2)) 11 | end 12 | end 13 | 14 | return HuangGai -------------------------------------------------------------------------------- /hero/jia_xv.lua: -------------------------------------------------------------------------------- 1 | JiaXv = class(Player) 2 | 3 | function JiaXv:ctor() 4 | self["已使用乱武"] = false 5 | end 6 | 7 | JiaXv.check_skill["乱武"] = function (self) 8 | return not self["已使用乱武"] 9 | end 10 | 11 | JiaXv.skill["乱武"] = function (self) 12 | self["已使用乱武"] = true 13 | local settle_players = game:get_settle_players_except_self(self) 14 | for _, responder in ipairs(settle_players) do 15 | if responder:check_alive() then 16 | responder.respond["乱武"](responder) 17 | end 18 | end 19 | end 20 | 21 | return JiaXv -------------------------------------------------------------------------------- /hero/lu_xvn.lua: -------------------------------------------------------------------------------- 1 | LuXvn = class(Player) 2 | 3 | LuXvn.skill["失去手牌"] = function (self, causer, responder, reason) 4 | if self:has_skill("连营") then 5 | self.skill["连营"](self, causer, responder, reason) 6 | end 7 | end 8 | 9 | LuXvn.skill["连营"] = function (self, causer, responder, reason) 10 | if self ~= responder then 11 | return 12 | end 13 | if #self.hand_cards ~= 0 then 14 | return 15 | end 16 | if not query["询问发动技能"]("连营") then 17 | return 18 | end 19 | helper.insert(self.hand_cards, deck:draw(1)) 20 | end 21 | 22 | return LuXvn -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 用lua语言基于面向对象思想实现的一款文字版三国杀,5000余行代码实现了三国杀标准版108张卡牌的效果以及标准包、风、林、火、山包中除神将和左慈外53位武将的技能效果,并通过严谨测试。输入lua main.lua即可试玩,需安装好lua,建议在ubutnu系统下运行,否则会出现中文乱码。 2 | 项目亮点: 3 | 1、lua面向对象的实现基于云风大佬的代码,但原版代码不支持在声明类时对table赋值,即可以执行classA.t = {},但无法执行classA.t[1] = 1,本项目对云风大佬的代码进行改进,使得这一操作可以完成; 4 | 2、代码封装性好,可读性强。本项目对游戏过程中经常出现的操作(比如许多武将发动技能都需要的“弃置一张牌”的操作)进行了封装,大大缩减了代码行数,也使得技能实现的代码更容易看懂; 5 | 3、进行了逻辑层和IO层的分离。本项目将接收玩家输入的IO层单独用query模块实现,不与游戏逻辑层写在一起,避免了在编写具体卡牌或技能逻辑时出现大段的读取玩家输入的代码导致整体代码冗长混乱; 6 | 4、在深入了解游戏玩法的基础上,对游戏逻辑进行了较好的拆解和划分,整体代码实现逻辑清晰,扩展性强。例如,对玩家一个回合的行动流程进行了清晰划分,每个流程都由一个对应的函数完成;将每个卡的结算逻辑分为use(使用)和respond(响应),然后根据具体武将技能的不同,编写不同的use和respond方法;被动技能基于时机触发,在一个时机内处理相关技能,就算涉及到的技能多但结算链清晰有序。 7 | -------------------------------------------------------------------------------- /hero/xv_chu.lua: -------------------------------------------------------------------------------- 1 | XvChu = class(Player) 2 | 3 | function XvChu:draw() 4 | text("现在是%s的摸牌阶段", self.name) 5 | self.skill["摸牌阶段开始前"](self) 6 | if self:has_flag("跳过摸牌") then 7 | return 8 | end 9 | if self:has_skill("裸衣") then 10 | self.skill["裸衣"](self) 11 | else 12 | helper.insert(self.hand_cards, deck:draw(2)) 13 | end 14 | end 15 | 16 | XvChu.skill["裸衣"] = function (self) 17 | if self:has_flag("跳过摸牌") then 18 | return 19 | end 20 | if not query["询问发动技能"]("裸衣") then 21 | return 22 | end 23 | helper.insert(self.hand_cards, deck:draw(1)) 24 | self.flags["裸衣"] = true 25 | end 26 | 27 | return XvChu -------------------------------------------------------------------------------- /hero/cao_cao.lua: -------------------------------------------------------------------------------- 1 | CaoCao = class(Player) 2 | 3 | CaoCao.skill["受到伤害后"] = function (self, causer, responder, t) 4 | if self:has_skill("奸雄") then 5 | self.skill["奸雄"](self, responder, t) 6 | end 7 | end 8 | 9 | CaoCao.skill["奸雄"] = function (self, responder, t) 10 | if responder ~= self then 11 | return 12 | end 13 | if not t.card_id then 14 | return 15 | end 16 | if not helper.equal(game.settling_card[#game.settling_card], t.card_id) then 17 | return 18 | end 19 | if not query["询问发动技能"]("奸雄") then 20 | return 21 | end 22 | helper.pop(game.settling_card) 23 | helper.insert(self.hand_cards, t.card_id) 24 | end 25 | 26 | return CaoCao -------------------------------------------------------------------------------- /hero/zhu_ge_liang.lua: -------------------------------------------------------------------------------- 1 | ZhuGeLiang = class(Player) 2 | 3 | ZhuGeLiang.skill["回合开始阶段"] = function (self) 4 | self.skill["观星"]() 5 | end 6 | 7 | ZhuGeLiang.skill["观星"] = function () 8 | if not query["询问发动技能"]("观星") then 9 | return 10 | end 11 | local n = #game.players > 5 and 5 or #game.players 12 | local cards = deck:draw(n) 13 | cards = type(cards) == "number" and {cards} or cards 14 | local cards1 = query["观星-调整牌序"](cards) 15 | if query["二选一"]("观星") then 16 | for i, v in ipairs(cards1) do 17 | table.insert(deck.card_pile, i, v) 18 | end 19 | else 20 | helper.insert(deck.card_pile, cards1) 21 | end 22 | end 23 | 24 | return ZhuGeLiang -------------------------------------------------------------------------------- /hero/wo_long_zhu_ge.lua: -------------------------------------------------------------------------------- 1 | WoLongZhuGe = class(Player) 2 | 3 | WoLongZhuGe.skill["看破"] = function (self) 4 | local func = function (id) return self:get_color(id) == macro.color.black end 5 | local cards = self:get_cards(func, true) 6 | local id = query["选择一张牌"](cards, "看破") 7 | helper.remove(self.hand_cards, id) 8 | self:before_settle(id) 9 | self:after_settle(id) 10 | end 11 | 12 | WoLongZhuGe.skill["八阵"] = function (self) 13 | if self.armor then 14 | return false 15 | end 16 | if not query["询问发动技能"]("八阵") then 17 | return false 18 | end 19 | local id = game:judge(self, "八阵") 20 | helper.insert(deck.discard_pile, id) 21 | return self:get_color(id) == macro.color.red and true or false 22 | end 23 | 24 | return WoLongZhuGe -------------------------------------------------------------------------------- /hero/guo_jia.lua: -------------------------------------------------------------------------------- 1 | GuoJia = class(Player) 2 | 3 | GuoJia.skill["天妒"] = function (self, id) 4 | if not query["询问发动技能"]("天妒") then 5 | return false 6 | end 7 | helper.insert(self.hand_cards, id) 8 | return true 9 | end 10 | 11 | GuoJia.skill["受到伤害后"] = function (self, causer, responder, t) 12 | if self:has_skill("遗计") then 13 | self.skill["遗计"](self, responder) 14 | end 15 | end 16 | 17 | GuoJia.skill["遗计"] = function (self, responder) 18 | if responder ~= self then 19 | return 20 | end 21 | if not query["询问发动技能"]("遗计") then 22 | return 23 | end 24 | for _ = 1, 2, 1 do 25 | local target = query["选择一名玩家"](game.players, "遗计") 26 | helper.insert(target.hand_cards, deck:draw(1)) 27 | end 28 | end 29 | 30 | return GuoJia -------------------------------------------------------------------------------- /hero/ma_chao.lua: -------------------------------------------------------------------------------- 1 | MaChao = class(Player) 2 | 3 | function MaChao:get_distance(another) 4 | local dis = Player.get_distance(self, another) 5 | if self:has_skill("马术") then 6 | dis = dis - 1 7 | end 8 | return dis > 0 and dis or 0 9 | end 10 | 11 | MaChao.skill["杀-指定目标后"] = function (self, target, t) 12 | self.skill["铁骑"](self, target, t) 13 | if self:has_skill("雌雄双股剑") then 14 | self.skill["雌雄双股剑"](self, target) 15 | end 16 | end 17 | 18 | MaChao.skill["铁骑"] = function (self, target, t) 19 | if not query["询问发动技能"]("铁骑") then 20 | return 21 | end 22 | local id = game:judge(self, "铁骑") 23 | if self:get_color(id) == macro.color.red then 24 | t.can_dodge[target] = false 25 | end 26 | helper.insert(deck.discard_pile, id) 27 | end 28 | 29 | return MaChao -------------------------------------------------------------------------------- /hero/zhen_ji.lua: -------------------------------------------------------------------------------- 1 | ZhenJi = class(Player) 2 | 3 | ZhenJi.skill["回合开始阶段"] = function (self) 4 | if self:has_skill("洛神") then 5 | self.skill["洛神"](self) 6 | end 7 | end 8 | 9 | ZhenJi.skill["洛神"] = function (self) 10 | if not query["询问发动技能"]("洛神") then 11 | return 12 | end 13 | local id = game:judge(self, "洛神") 14 | if self:get_color(id) == macro.color.black then 15 | helper.insert(self.hand_cards, id) 16 | self.skill["洛神"](self) 17 | else 18 | helper.insert(deck.discard_pile, id) 19 | end 20 | end 21 | 22 | ZhenJi.skill["倾国"] = function (self) 23 | local func = function (id) return self:get_color(id) == macro.color.black end 24 | local cards = self:get_cards(func, true) 25 | local id = query["选择一张牌"](cards, "倾国") 26 | helper.remove(self.hand_cards, id) 27 | helper.insert(deck.discard_pile, id) 28 | end 29 | 30 | return ZhenJi -------------------------------------------------------------------------------- /hero/sun_jian.lua: -------------------------------------------------------------------------------- 1 | SunJian = class(Player) 2 | 3 | SunJian.skill["回合开始阶段"] = function (self) 4 | if self:has_skill("英魂") then 5 | self.skill["英魂"](self) 6 | end 7 | end 8 | 9 | SunJian.skill["英魂"] = function (self) 10 | local n = self.life_limit - self.life 11 | if n == 0 then 12 | return 13 | end 14 | if not query["询问发动技能"]("英魂") then 15 | return 16 | end 17 | local target = query["选择一名玩家"](game:get_other_players(self), "英魂") 18 | if query["二选一"]("英魂") then 19 | helper.insert(target.hand_cards, deck:draw(n)) 20 | opt["弃置一张牌"](target, target, "英魂", true, true) 21 | else 22 | helper.insert(target.hand_cards, deck:draw(1)) 23 | local card_n = #target:get_cards(nil, true, true) 24 | n = n > card_n and card_n or n 25 | opt["弃置n张牌"](target, target, "英魂", true, true, n) 26 | end 27 | end 28 | 29 | return SunJian -------------------------------------------------------------------------------- /hero/liu_bei.lua: -------------------------------------------------------------------------------- 1 | LiuBei = class(Player) 2 | 3 | LiuBei.check_skill["仁德"] = function (self) 4 | if not next(self.hand_cards) then 5 | return false 6 | end 7 | return true 8 | end 9 | 10 | local function give_card(player, targets) 11 | local id = query["选择一张牌"](player.hand_cards, "仁德") 12 | local target = query["选择一名玩家"](targets, "仁德") 13 | helper.remove(player.hand_cards, id) 14 | helper.insert(target.hand_cards, id) 15 | player.flags["仁德"] = player.flags["仁德"] or 0 16 | player.flags["仁德"] = player.flags["仁德"] + 1 17 | if player.flags["仁德"] == 2 then 18 | player:add_life(1) 19 | end 20 | end 21 | 22 | LiuBei.skill["仁德"] = function (self) 23 | local targets = game:get_other_players(self) 24 | give_card(self, targets) 25 | while next(self.hand_cards) do 26 | if not query["二选一"]("仁德") then 27 | break 28 | end 29 | give_card(self, targets) 30 | end 31 | end 32 | 33 | return LiuBei -------------------------------------------------------------------------------- /hero/tai_shi_ci.lua: -------------------------------------------------------------------------------- 1 | TaiShiCi = class(Player) 2 | 3 | TaiShiCi.get_targets["天义"] = function (self) 4 | local targets = {} 5 | for _, target in ipairs(game:get_other_players(self)) do 6 | if next(target.hand_cards) then 7 | helper.insert(targets, target) 8 | end 9 | end 10 | return targets 11 | end 12 | 13 | TaiShiCi.check_skill["天义"] = function (self) 14 | if self:has_flag("使用过天义") then 15 | return false 16 | end 17 | if not next(self.get_targets["天义"](self)) then 18 | return false 19 | end 20 | return true 21 | end 22 | 23 | TaiShiCi.skill["天义"] = function (self) 24 | self.flags["使用过天义"] = true 25 | local targets = self.get_targets["天义"](self) 26 | local target = query["选择一名玩家"](targets, "天义") 27 | if game:compare_points(self, target) then 28 | self.flags["天义-赢"] = true 29 | self.flags["杀-剩余次数"] = self.flags["杀-剩余次数"] + 1 30 | else 31 | self.flags["天义-输"] = true 32 | end 33 | end 34 | 35 | return TaiShiCi -------------------------------------------------------------------------------- /hero/zhu_rong.lua: -------------------------------------------------------------------------------- 1 | ZhuRong = class(Player) 2 | 3 | ZhuRong.skill["巨象"] = function (self, id) 4 | if not query["询问发动技能"]("巨象") then 5 | return false 6 | end 7 | helper.insert(self.hand_cards, id) 8 | return true 9 | end 10 | 11 | ZhuRong.skill["造成伤害后"] = function (self, causer, responder, t) 12 | if self:has_skill("烈刃") then 13 | self.skill["烈刃"](self, causer, responder, t) 14 | end 15 | end 16 | 17 | ZhuRong.skill["烈刃"] = function (self, causer, responder, t) 18 | if self ~= causer then 19 | return 20 | end 21 | if not responder:check_alive() then 22 | return 23 | end 24 | if t.name ~= "杀" then 25 | return 26 | end 27 | if not next(self.hand_cards) or not next(responder.hand_cards) then 28 | return 29 | end 30 | if not query["询问发动技能"]("烈刃") then 31 | return 32 | end 33 | if game:compare_points(self, responder) then 34 | opt["获得一张牌"](self, responder, "烈刃", true, true) 35 | end 36 | end 37 | 38 | return ZhuRong -------------------------------------------------------------------------------- /hero/meng_huo.lua: -------------------------------------------------------------------------------- 1 | MengHuo = class(Player) 2 | 3 | function MengHuo:draw() 4 | text("现在是%s的摸牌阶段", self.name) 5 | self.skill["摸牌阶段开始前"](self) 6 | if self:has_flag("跳过摸牌") then 7 | return 8 | end 9 | if self:has_skill("再起") then 10 | self.skill["再起"](self) 11 | else 12 | helper.insert(self.hand_cards, deck:draw(2)) 13 | end 14 | end 15 | 16 | MengHuo.skill["再起"] = function (self) 17 | local n = self.life_limit - self.life 18 | if n == 0 then 19 | return 20 | end 21 | if not query["询问发动技能"]("再起") then 22 | return false 23 | end 24 | local cards = deck:draw(n + 1) 25 | local n1 = 0 26 | local cards1 = {} 27 | for _, id in pairs(cards) do 28 | if resmng[id].suit == macro.suit.heart then 29 | n1 = n1 + 1 30 | helper.insert(cards1, id) 31 | end 32 | end 33 | self:add_life(n1) 34 | helper.remove(cards, cards1) 35 | helper.insert(self.hand_cards, cards) 36 | helper.insert(deck.discard_pile, cards1) 37 | end 38 | 39 | return MengHuo -------------------------------------------------------------------------------- /deck.lua: -------------------------------------------------------------------------------- 1 | Deck = class() 2 | 3 | function Deck:ctor() 4 | self.card_pile = {} 5 | self.discard_pile = {} 6 | end 7 | 8 | local function shuffle(card_pile) 9 | local len = #card_pile 10 | while len > 0 do 11 | local i = math.random(len) 12 | local id = card_pile[i] 13 | card_pile[i] = card_pile[len] 14 | card_pile[len] = id 15 | len = len - 1 16 | end 17 | end 18 | 19 | function Deck:init() 20 | for i = 1, resmng.card_finish_id - resmng.card_start_id + 1, 1 do 21 | helper.insert(self.card_pile, i) 22 | end 23 | shuffle(self.card_pile) 24 | end 25 | 26 | function Deck:draw(n) 27 | if #self.card_pile < n then 28 | shuffle(self.discard_pile) 29 | helper.insert(self.card_pile, self.discard_pile) 30 | helper.clear(self.discard_pile) 31 | end 32 | local cards = {} 33 | for _ = 1, n, 1 do 34 | helper.insert(cards, self.card_pile[1]) 35 | table.remove(self.card_pile, 1) 36 | end 37 | return n == 1 and cards[1] or cards 38 | end 39 | 40 | return Deck -------------------------------------------------------------------------------- /hero/xia_hou_dun.lua: -------------------------------------------------------------------------------- 1 | XiaHouDun = class(Player) 2 | 3 | XiaHouDun.skill["受到伤害后"] = function (self, causer, responder, t) 4 | if self:has_skill("刚烈") then 5 | self.skill["刚烈"](self, causer, responder) 6 | end 7 | end 8 | 9 | XiaHouDun.skill["刚烈"] = function (self, causer, responder) 10 | if responder ~= self then 11 | return 12 | end 13 | if not causer:check_alive() then 14 | return 15 | end 16 | if not query["询问发动技能"]("刚烈") then 17 | return 18 | end 19 | local id = game:judge(self, "刚烈") 20 | if self:get_suit(id) == macro.suit.heart then 21 | return 22 | end 23 | if #causer:get_cards(nil, true) < 2 then 24 | causer:sub_life({causer = self, type = macro.sub_life_type.damage, name = "刚烈", id = nil, n = 1}) 25 | return 26 | end 27 | if query["二选一"]("刚烈") then 28 | opt["弃置n张牌"](causer, causer, "刚烈", true, false, 2) 29 | else 30 | causer:sub_life({causer = self, type = macro.sub_life_type.damage, name = "刚烈", id = nil, n = 1}) 31 | end 32 | end 33 | 34 | return XiaHouDun -------------------------------------------------------------------------------- /hero/pang_de.lua: -------------------------------------------------------------------------------- 1 | PangDe = class(Player) 2 | 3 | function PangDe:get_distance(another) 4 | local dis = Player.get_distance(self, another) 5 | if self:has_skill("马术") then 6 | dis = dis - 1 7 | end 8 | return dis > 0 and dis or 0 9 | end 10 | 11 | PangDe.skill["杀-指定目标后"] = function (self, target, t) 12 | self.skill["鞬出"](self, target, t) 13 | if self:has_skill("雌雄双股剑") then 14 | self.skill["雌雄双股剑"](self, target) 15 | end 16 | end 17 | 18 | PangDe.skill["鞬出"] = function (self, target, t) 19 | if not next(target:get_cards(nil, true ,true)) then 20 | return 21 | end 22 | if not query["询问发动技能"]("鞬出") then 23 | return 24 | end 25 | local id = opt["弃置一张牌"](self, target, "鞬出", true, true) 26 | if resmng[id].type ~= "basic" and resmng[id].type ~= "tactic" then 27 | t.can_dodge[target] = false 28 | else 29 | if helper.equal(game.settling_card[#game.settling_card], t.id) then 30 | helper.pop(game.settling_card) 31 | helper.insert(target.hand_cards, t.id) 32 | end 33 | end 34 | end 35 | 36 | return PangDe -------------------------------------------------------------------------------- /hero/pang_tong.lua: -------------------------------------------------------------------------------- 1 | PangTong = class(Player) 2 | 3 | function PangTong:ctor() 4 | self["已使用涅槃"] = false 5 | end 6 | 7 | PangTong.skill["涅槃"] = function (self) 8 | self["已使用涅槃"] = true 9 | local cards = {} 10 | if next(self.hand_cards) then 11 | helper.insert(cards, self.hand_cards) 12 | helper.clear(self.hand_cards) 13 | end 14 | if self.arm then 15 | helper.insert(cards, self.arm) 16 | self.arm = nil 17 | end 18 | if self.armor then 19 | helper.insert(cards, self.armor) 20 | self.armor = nil 21 | end 22 | if self.add_horse then 23 | helper.insert(cards, self.add_horse) 24 | self.add_horse = nil 25 | end 26 | if self.sub_horse then 27 | helper.insert(cards, self.sub_horse) 28 | self.sub_horse = nil 29 | end 30 | if next(self.judge_cards) then 31 | helper.insert(cards, self.judge_cards) 32 | helper.clear(self.judge_cards) 33 | end 34 | helper.insert(deck.discard_pile, cards) 35 | helper.insert(self.hand_cards, deck:draw(3)) 36 | self:add_life(3 - self.life) 37 | end 38 | 39 | return PangTong -------------------------------------------------------------------------------- /hero/zhang_liao.lua: -------------------------------------------------------------------------------- 1 | ZhangLiao = class(Player) 2 | 3 | function ZhangLiao:draw() 4 | text("现在是%s的摸牌阶段", self.name) 5 | self.skill["摸牌阶段开始前"](self) 6 | if self:has_flag("跳过摸牌") then 7 | return 8 | end 9 | if self:has_skill("突袭") then 10 | self.skill["突袭"](self) 11 | else 12 | helper.insert(self.hand_cards, deck:draw(2)) 13 | end 14 | end 15 | 16 | ZhangLiao.skill["突袭"] = function (self) 17 | local targets = {} 18 | for _, player in ipairs (game:get_other_players(self)) do 19 | if #player.hand_cards > 0 then 20 | helper.insert(targets, player) 21 | end 22 | end 23 | if not next(targets) then 24 | return 25 | end 26 | if not query["询问发动技能"]("突袭") then 27 | return 28 | end 29 | local target = query["选择一名玩家"](targets, "突袭") 30 | opt["获得一张牌"](self, target, "突袭", true) 31 | helper.remove(targets, target) 32 | if next(targets) then 33 | if not query["二选一"]("是否继续指定抽牌的目标") then 34 | return 35 | end 36 | local target1 = query["选择一名玩家"](targets, "突袭") 37 | opt["获得一张牌"](self, target1, "突袭", true) 38 | end 39 | end 40 | 41 | return ZhangLiao -------------------------------------------------------------------------------- /hero/sun_quan.lua: -------------------------------------------------------------------------------- 1 | SunQuan = class(Player) 2 | 3 | SunQuan.check_skill["制衡"] = function (self) 4 | if self:has_flag("使用过制衡") then 5 | return false 6 | end 7 | if not next(self:get_cards(nil, true, true)) then 8 | return false 9 | end 10 | return true 11 | end 12 | 13 | SunQuan.skill["制衡"] = function (self) 14 | self.flags["使用过制衡"] = true 15 | local cards = self:get_cards(nil, true, true) 16 | local zhiheng_cards = {} 17 | local id = query["选择一张牌"](cards, "制衡") 18 | helper.remove(cards, id) 19 | helper.insert(zhiheng_cards, id) 20 | while next(cards) do 21 | if not query["二选一"]("制衡") then 22 | break 23 | end 24 | id = query["选择一张牌"](cards, "制衡") 25 | helper.remove(cards, id) 26 | helper.insert(zhiheng_cards, id) 27 | end 28 | for _, id in ipairs(zhiheng_cards) do 29 | if helper.element(self.hand_cards, id) then 30 | helper.remove(self.hand_cards, id) 31 | else 32 | self:take_off_equip(id) 33 | end 34 | end 35 | helper.insert(deck.discard_pile, zhiheng_cards) 36 | helper.insert(self.hand_cards, deck:draw(#zhiheng_cards)) 37 | end 38 | 39 | return SunQuan -------------------------------------------------------------------------------- /hero/si_ma_yi.lua: -------------------------------------------------------------------------------- 1 | SiMaYi = class(Player) 2 | 3 | SiMaYi.skill["改判"] = function(self, id, judge_player, reason) 4 | if self:has_skill("鬼才") then 5 | return self.skill["鬼才"](self, id) 6 | end 7 | end 8 | 9 | SiMaYi.skill["鬼才"] = function (self, id) 10 | local cards = self:get_cards(nil, true) 11 | if #cards == 0 then 12 | return 13 | end 14 | if not query["询问发动技能"]("鬼才") then 15 | return 16 | end 17 | local id1 = query["选择一张牌"](cards, "鬼才") 18 | helper.remove(self.hand_cards, id1) 19 | helper.insert(deck.discard_pile, id) 20 | return id1 21 | end 22 | 23 | SiMaYi.skill["受到伤害后"] = function (self, causer, responder, t) 24 | if self:has_skill("反馈") then 25 | self.skill["反馈"](self, causer, responder) 26 | end 27 | end 28 | 29 | SiMaYi.skill["反馈"] = function (self, causer, responder) 30 | if responder ~= self then 31 | return 32 | end 33 | if not causer:check_alive() then 34 | return 35 | end 36 | if not next(causer:get_cards(nil, true, true)) then 37 | return 38 | end 39 | if not query["询问发动技能"]("反馈") then 40 | return 41 | end 42 | opt["获得一张牌"](self, causer, "反馈", true, true) 43 | end 44 | 45 | return SiMaYi -------------------------------------------------------------------------------- /class.lua: -------------------------------------------------------------------------------- 1 | local _class={} 2 | 3 | function class(super) 4 | local class_type={} 5 | class_type.ctor=false 6 | class_type.super=super 7 | class_type.new=function(...) 8 | local obj={} 9 | do 10 | local create 11 | create = function(c,...) 12 | if c.super then 13 | create(c.super,...) 14 | end 15 | if c.ctor then 16 | c.ctor(obj,...) 17 | end 18 | end 19 | 20 | create(class_type,...) 21 | end 22 | setmetatable(obj,{ __index=_class[class_type] }) 23 | return obj 24 | end 25 | local vtbl={} 26 | _class[class_type]=vtbl 27 | 28 | setmetatable(class_type,{ 29 | __newindex= function(t,k,v) vtbl[k]=v end, 30 | __index= function(t,k) return vtbl[k] end 31 | }) 32 | 33 | if super then 34 | setmetatable(vtbl,{__index= 35 | function(t,k) 36 | local ret=_class[super][k] 37 | if type(ret) == "table" then 38 | vtbl[k]=deep_copy(ret) 39 | return vtbl[k] 40 | else 41 | vtbl[k]=ret 42 | return ret -- 这里不能写成return vtbl[k],否则ret为空时会死循环 43 | end 44 | end 45 | }) 46 | end 47 | 48 | return class_type 49 | end 50 | 51 | function deep_copy(t) 52 | local t1 = {} 53 | for k, v in pairs(t) do 54 | if type(v) == "table" then 55 | t[k] = deep_copy(v) 56 | else 57 | t1[k] = v 58 | end 59 | end 60 | return t1 61 | end -------------------------------------------------------------------------------- /hero/zhao_yun.lua: -------------------------------------------------------------------------------- 1 | ZhaoYun = class(Player) 2 | 3 | ZhaoYun.check_skill["龙胆"] = function (self) 4 | if not self:check_can_kill() then 5 | return false 6 | end 7 | local func = function (id) return resmng[id].name == "闪" end 8 | local cards = {} 9 | if self:check_can_kill() and next(self:get_players_in_attack_range()) then 10 | helper.insert(cards, self:get_cards(func, true)) 11 | end 12 | if not next(cards) then 13 | return false 14 | end 15 | return true 16 | end 17 | 18 | ZhaoYun.skill["龙胆"] = function (self, reason, ...) 19 | if reason == "被杀" or reason == "万箭齐发" then 20 | local func = function (id) return resmng[id].name == "杀" end 21 | local cards = self:get_cards(func, true) 22 | local id = query["选择一张牌"](cards, "龙胆") 23 | helper.remove(self.hand_cards, id) 24 | helper.insert(deck.discard_pile, id) 25 | else 26 | local func = function (id) return resmng[id].name == "闪" end 27 | local cards = self:get_cards(func, true) 28 | local id = query["选择一张牌"](cards, "龙胆") 29 | helper.remove(self.hand_cards, id) 30 | self:before_settle(id) 31 | self.use["杀"](self, {is_transfer = true, transfer_type = "龙胆", id = id}, reason, ...) 32 | self:after_settle(id) 33 | end 34 | end 35 | 36 | return ZhaoYun -------------------------------------------------------------------------------- /hero/zhou_tai.lua: -------------------------------------------------------------------------------- 1 | ZhouTai = class(Player) 2 | 3 | function ZhouTai:ctor() 4 | self["创"] = {} 5 | end 6 | 7 | function ZhouTai:get_hand_cards_limit() 8 | return next(self["创"]) and #self["创"] or self.life 9 | end 10 | 11 | ZhouTai.skill["失去手牌"] = function (self, causer, responder, reason) 12 | if self:has_skill("奋激") then 13 | self.skill["奋激"](self, causer, responder, reason) 14 | end 15 | end 16 | 17 | ZhouTai.skill["奋激"] = function (self, causer, responder, reason) 18 | if causer == responder then 19 | return 20 | end 21 | if reason ~= "弃置" and reason ~= "获得" then 22 | return 23 | end 24 | if not query["询问发动技能"]("奋激") then 25 | return 26 | end 27 | self:sub_life({casuer = self, type = macro.sub_life_type.life_loss, name = "奋激", card_id = nil, n = 1}) 28 | helper.insert(responder.hand_cards, deck:draw(2)) 29 | end 30 | 31 | ZhouTai.skill["不屈"] = function (self) 32 | local id = deck:draw(1) 33 | local flag = true 34 | for _, id1 in ipairs(self["创"]) do 35 | if resmng[id].points == resmng[id1].points then 36 | flag = false 37 | break 38 | end 39 | end 40 | if flag then 41 | self:add_life(1 - self.life) 42 | helper.insert(self["创"], id) 43 | else 44 | helper.insert(deck.discard_pile, id) 45 | end 46 | end 47 | 48 | return ZhouTai -------------------------------------------------------------------------------- /hero/sun_shang_xiang.lua: -------------------------------------------------------------------------------- 1 | SunShangXiang = class(Player) 2 | 3 | SunShangXiang.skill["失去装备"] = function (self) 4 | if self:has_skill("枭姬") then 5 | self.skill["枭姬"](self) 6 | end 7 | end 8 | 9 | SunShangXiang.skill["枭姬"] = function (self) 10 | if not query["询问发动技能"]("枭姬") then 11 | return 12 | end 13 | helper.insert(self.hand_cards, deck:draw(2)) 14 | end 15 | 16 | SunShangXiang.get_targets["结姻"] = function (self) 17 | local targets = {} 18 | for _, target in ipairs(game:get_other_players(self)) do 19 | if target.sex == "man" and target.life < target.life_limit then 20 | helper.insert(targets, target) 21 | end 22 | end 23 | return targets 24 | end 25 | 26 | SunShangXiang.check_skill["结姻"] = function (self) 27 | if self:has_flag("使用过结姻") then 28 | return false 29 | end 30 | if #self.hand_cards < 2 then 31 | return false 32 | end 33 | if not next(self.get_targets["结姻"](self)) then 34 | return false 35 | end 36 | return true 37 | end 38 | 39 | SunShangXiang.skill["结姻"] = function (self) 40 | self.flags["使用过结姻"] = true 41 | opt["弃置n张牌"](self, self, "结姻", true, false, 2) 42 | local targets = self.get_targets["结姻"](self) 43 | local target = query["选择一名玩家"](targets, "结姻") 44 | self:add_life(1) 45 | target:add_life(1) 46 | end 47 | 48 | return SunShangXiang -------------------------------------------------------------------------------- /hero/hua_tuo.lua: -------------------------------------------------------------------------------- 1 | HuaTuo = class(Player) 2 | 3 | HuaTuo.get_targets["青囊"] = function (self) 4 | local targets = {} 5 | for _, target in ipairs(game.players) do 6 | if target.life < target.life_limit then 7 | helper.insert(targets, target) 8 | end 9 | end 10 | return targets 11 | end 12 | 13 | HuaTuo.check_skill["青囊"] = function (self) 14 | if self:has_flag("使用过青囊") then 15 | return false 16 | end 17 | if not next(self.hand_cards) then 18 | return false 19 | end 20 | if not next(self.get_targets["青囊"](self)) then 21 | return false 22 | end 23 | return true 24 | end 25 | 26 | HuaTuo.skill["青囊"] = function (self) 27 | self.flags["使用过青囊"] = true 28 | local targets = self.get_targets["青囊"](self) 29 | local target = query["选择一名玩家"](targets, "青囊") 30 | opt["弃置一张牌"](self, self, "青囊", true) 31 | target:add_life(1) 32 | end 33 | 34 | HuaTuo.skill["急救"] = function (self, target) 35 | local func = function (id) return self:get_color(id) == macro.color.red end 36 | local cards = self:get_cards(func, true, true) 37 | local id = query["选择一张牌"](cards, "急救") 38 | if helper.element(self.hand_cards, id) then 39 | helper.remove(self.hand_cards, id) 40 | elseif helper.element(self:get_equip_cards(), id) then 41 | self:take_off_equip(id) 42 | end 43 | helper.insert(deck.discard_pile, id) 44 | target:add_life(1) 45 | end 46 | 47 | return HuaTuo -------------------------------------------------------------------------------- /hero/cao_pi.lua: -------------------------------------------------------------------------------- 1 | CaoPi = class(Player) 2 | 3 | CaoPi.skill["行殇"] = function (self, target) 4 | if not query["询问发动技能"]("行殇") then 5 | return 6 | end 7 | local cards = {} 8 | if next(target.hand_cards) then 9 | helper.insert(cards, target.hand_cards) 10 | helper.clear(target.hand_cards) 11 | end 12 | if target.arm then 13 | helper.insert(cards, target.arm) 14 | target.arm = nil 15 | end 16 | if target.armor then 17 | helper.insert(cards, target.armor) 18 | target.armor = nil 19 | end 20 | if target.add_horse then 21 | helper.insert(cards, target.add_horse) 22 | target.add_horse = nil 23 | end 24 | if target.sub_horse then 25 | helper.insert(cards, target.sub_horse) 26 | target.sub_horse = nil 27 | end 28 | helper.insert(self.hand_cards, cards) 29 | end 30 | 31 | CaoPi.skill["受到伤害后"] = function (self, causer, responder, t) 32 | if self:has_skill("放逐") then 33 | self.skill["放逐"](self, responder) 34 | end 35 | end 36 | 37 | CaoPi.skill["放逐"] = function (self, responder) 38 | if responder ~= self then 39 | return 40 | end 41 | if not query["询问发动技能"]("放逐") then 42 | return 43 | end 44 | local targets = game:get_other_players(self) 45 | local target = query["选择一名玩家"](targets, "放逐") 46 | target:flip() 47 | local n = self.life_limit - self.life 48 | helper.insert(target.hand_cards, deck:draw(n)) 49 | end 50 | 51 | return CaoPi -------------------------------------------------------------------------------- /hero/wei_yan.lua: -------------------------------------------------------------------------------- 1 | WeiYan = class(Player) 2 | 3 | function WeiYan:ctor() 4 | self["已使用奇谋"] = false 5 | end 6 | 7 | function WeiYan:get_distance(another) 8 | local dis = Player.get_distance(self, another) 9 | if self.flags["奇谋"] then 10 | dis = dis - self.flags["奇谋"] 11 | end 12 | return dis > 0 and dis or 0 13 | end 14 | 15 | WeiYan.skill["造成伤害后"] = function (self, causer, responder, t) 16 | if self:has_skill("狂骨") then 17 | self.skill["狂骨"](self, causer, t) 18 | end 19 | end 20 | 21 | WeiYan.skill["狂骨"] = function (self, causer, t) 22 | if self ~= causer then 23 | return 24 | end 25 | if not self["狂骨"] then 26 | return 27 | end 28 | if not query["询问发动技能"]("狂骨") then 29 | return 30 | end 31 | self["狂骨"] = nil 32 | for _ = 1, t.n, 1 do 33 | if query["二选一"]("狂骨") then 34 | self:add_life(1) 35 | else 36 | helper.insert(self.hand_cards, deck:draw(1)) 37 | end 38 | end 39 | end 40 | 41 | WeiYan.check_skill["奇谋"] = function (self) 42 | return not self["已使用奇谋"] 43 | end 44 | 45 | WeiYan.skill["奇谋"] = function (self) 46 | self["已使用奇谋"] = true 47 | local loss_life_n = query["奇谋"](self.life) 48 | self:sub_life({causer = self, type = macro.sub_life_type.life_loss, name = "奇谋", card_id = nil, n = loss_life_n}) 49 | if self:check_alive() then 50 | self.flags["奇谋"] = loss_life_n 51 | self.flags["杀-剩余次数"] = self.flags["杀-剩余次数"] + loss_life_n 52 | end 53 | end 54 | 55 | return WeiYan -------------------------------------------------------------------------------- /hero/gan_ning.lua: -------------------------------------------------------------------------------- 1 | GanNing = class(Player) 2 | 3 | GanNing.get_t["奇袭"] = function (self) 4 | local t = {} 5 | local func = function (v) return resmng[v].suit == macro.suit.spade or resmng[v].suit == macro.suit.club end 6 | for _, id in ipairs(self:get_cards(func, true, true)) do 7 | local targets = {} 8 | for _, player in ipairs(game:get_other_players(self)) do 9 | if player:has_skill("帷幕") and self:get_color(id) == macro.color.black then 10 | goto continue 11 | end 12 | if #player:get_cards(nil, true, true, true) == 0 then 13 | goto continue 14 | end 15 | helper.insert(targets, player) 16 | ::continue:: 17 | end 18 | if #targets > 0 then 19 | t[id] = targets 20 | end 21 | end 22 | return t 23 | end 24 | 25 | GanNing.check_skill["奇袭"] = function (self) 26 | if not next(self.get_t["奇袭"](self)) then 27 | return false 28 | end 29 | return true 30 | end 31 | 32 | GanNing.skill["奇袭"] = function (self) 33 | local t = self.get_t["奇袭"](self) 34 | local cards = helper.get_keys(t) 35 | local id = query["选择一张牌"](cards, "奇袭") 36 | if helper.element(self:get_equip_cards(), id) then 37 | self:take_off_equip(id) 38 | elseif helper.element(self.hand_cards, id) then 39 | helper.remove(self.hand_cards, id) 40 | end 41 | self:before_settle(id) 42 | local target = query["选择一名玩家"](t[id], "奇袭") 43 | target.respond["过河拆桥"](target, self) 44 | self:after_settle(id) 45 | end 46 | 47 | return GanNing -------------------------------------------------------------------------------- /hero/zhou_yu.lua: -------------------------------------------------------------------------------- 1 | ZhouYu = class(Player) 2 | 3 | function ZhouYu:draw() 4 | text("现在是%s的摸牌阶段", self.name) 5 | self.skill["摸牌阶段开始前"](self) 6 | if self:has_flag("跳过摸牌") then 7 | return 8 | end 9 | if self:has_skill("英姿") then 10 | self.skill["英姿"](self) 11 | else 12 | helper.insert(self.hand_cards, deck:draw(2)) 13 | end 14 | end 15 | 16 | ZhouYu.skill["英姿"] = function (self) 17 | if not query["询问发动技能"]("英姿") then 18 | helper.insert(self.hand_cards, deck:draw(2)) 19 | else 20 | helper.insert(self.hand_cards, deck:draw(3)) 21 | end 22 | end 23 | 24 | ZhouYu.check_skill["反间"] = function (self) 25 | if self:has_flag("使用过反间") then 26 | return false 27 | end 28 | if not next(self.hand_cards) then 29 | return false 30 | end 31 | return true 32 | end 33 | 34 | ZhouYu.skill["反间"] = function (self) 35 | self.flags["使用过反间"] = true 36 | local targets = game:get_other_players(self) 37 | local target = query["选择一名玩家"](targets, "反间") 38 | local suit = query["选择花色"]({macro.suit.spade, macro.suit.heart, macro.suit.club, macro.suit.diamond}) 39 | local n = math.random(#self.hand_cards) 40 | local id = self.hand_cards[n] 41 | helper.remove(self.hand_cards, id) 42 | if resmng[id].suit ~= suit then 43 | target:sub_life({causer = self, type = macro.sub_life_type.damage, name = "反间", card_id = nil, n = 1}) 44 | end 45 | if target:check_alive() then 46 | helper.insert(target.hand_cards, id) 47 | else 48 | helper.insert(deck.discard_pile, id) 49 | end 50 | end 51 | 52 | return ZhouYu -------------------------------------------------------------------------------- /hero/zhang_zhao_zhang_hong.lua: -------------------------------------------------------------------------------- 1 | ZhangZhaoZhangHong = class(Player) 2 | 3 | ZhangZhaoZhangHong.skill["固政"] = function (self, discard_player, cards) 4 | if not query["询问发动技能"]("固政") then 5 | return 6 | end 7 | local id = query["选择一张牌"](cards, "固政") 8 | helper.remove(deck.discard_pile, cards) 9 | helper.insert(discard_player.hand_cards, id) 10 | helper.remove(cards, id) 11 | helper.insert(self.hand_cards, cards) 12 | end 13 | 14 | ZhangZhaoZhangHong.get_t["直谏"] = function (self) 15 | local t = {} 16 | local func = function (id) return resmng[id].type ~= "basic" and resmng[id].type ~= "tactic" end 17 | local cards = self:get_cards(func, true) 18 | for _, id in ipairs(cards) do 19 | local targets = {} 20 | for _, target in ipairs(game:get_other_players(self)) do 21 | if not target:has_equip(resmng[id].type) then 22 | helper.insert(targets, target) 23 | end 24 | end 25 | if next(targets) then 26 | t[id] = targets 27 | end 28 | end 29 | return t 30 | end 31 | 32 | ZhangZhaoZhangHong.check_skill["直谏"] = function (self) 33 | if not next(self.get_t["直谏"](self)) then 34 | return false 35 | end 36 | return true 37 | end 38 | 39 | ZhangZhaoZhangHong.skill["直谏"] = function (self) 40 | local t = self.get_t["直谏"](self) 41 | local cards = helper.get_keys(t) 42 | local id = query["选择一张牌"](cards, "直谏") 43 | local target = query["选择一名玩家"](t[id], "直谏") 44 | helper.remove(self.hand_cards, id) 45 | target:put_on_equip(id) 46 | helper.insert(self.hand_cards, deck:draw(1)) 47 | end 48 | 49 | return ZhangZhaoZhangHong -------------------------------------------------------------------------------- /hero/xia_hou_yuan.lua: -------------------------------------------------------------------------------- 1 | XiaHouYuan = class(Player) 2 | 3 | XiaHouYuan.skill["判定阶段开始前"] = function (self) 4 | if self:has_skill("神速") then 5 | self.skill["神速-判定阶段开始前"](self) 6 | end 7 | end 8 | 9 | XiaHouYuan.skill["神速-判定阶段开始前"] = function (self) 10 | if not query["询问发动技能"]("神速") then 11 | return 12 | end 13 | self.flags["跳过判定"] = true 14 | self.flags["跳过摸牌"] = true 15 | self.use["杀"](self, {is_transfer = true, transfer_type = "神速", id = nil}, "神速") 16 | end 17 | 18 | XiaHouYuan.skill["出牌阶段开始前"] = function (self) 19 | if self:has_skill("神速") then 20 | self.skill["神速-出牌阶段开始前"](self) 21 | end 22 | end 23 | 24 | XiaHouYuan.skill["神速-出牌阶段开始前"] = function (self) 25 | if self.has_flag(self, "跳过出牌") then 26 | return 27 | end 28 | local func = function (id) return resmng[id].type ~= "basic" and resmng[id].type ~= "tactic" end 29 | if not next(self.get_cards(self, func, true, true)) then 30 | return 31 | end 32 | if not query["询问发动技能"]("神速") then 33 | return 34 | end 35 | opt["弃置一张牌"](self, self, "神速", true, true, false, func) 36 | self.flags["跳过出牌"] = true 37 | self.use["杀"](self, {is_transfer = true, transfer_type = "神速", id = nil}, "神速") 38 | end 39 | 40 | XiaHouYuan.skill["弃牌阶段开始前"] = function (self) 41 | if self:has_skill("神速") then 42 | self.skill["神速-弃牌阶段开始前"](self) 43 | end 44 | end 45 | 46 | XiaHouYuan.skill["神速-弃牌阶段开始前"] = function (self) 47 | if not query["询问发动技能"]("神速") then 48 | return 49 | end 50 | self.flags["跳过弃牌"] = true 51 | self:flip() 52 | self.use["杀"](self, {is_transfer = true, transfer_type = "神速", id = nil}, "神速") 53 | end 54 | 55 | return XiaHouYuan -------------------------------------------------------------------------------- /hero/dian_wei.lua: -------------------------------------------------------------------------------- 1 | DianWei = class(Player) 2 | 3 | DianWei.check_skill["强袭"] = function (self) 4 | if not self:has_flag("使用过强袭") then 5 | return true 6 | end 7 | if #self.flags["使用过强袭"] == 2 then 8 | return false 9 | end 10 | local targets = game:get_other_players(self) 11 | helper.remove(targets, self.flags["使用过强袭"]) 12 | if not next(targets) then 13 | return false 14 | end 15 | return true 16 | end 17 | 18 | DianWei.skill["强袭"] = function (self) 19 | self.flags["使用过强袭"] = self.flags["使用过强袭"] or {} 20 | local targets = game:get_other_players(self) 21 | helper.remove(targets, self.flags["使用过强袭"]) 22 | local target = query["选择一名玩家"](targets, "强袭") 23 | local func = function (id) return resmng[id].type ~= "basic" and resmng[id].type ~= "tactic" end 24 | local cards = self:get_cards(func, true, true) 25 | if next(cards) then 26 | if query["二选一"]("强袭") then 27 | self:sub_life({causer = nil, type = macro.sub_life_type.life_loss, name = "强袭", card_id = nil, n = 1}) 28 | target:sub_life({causer = self, type = macro.sub_life_type.damage, name = "强袭", card_id = nil, n = 1}) 29 | else 30 | opt["弃置一张牌"](self, self, "强袭", true, true, false, func) 31 | target:sub_life({causer = self, type = macro.sub_life_type.damage, name = "强袭", card_id = nil, n = 1}) 32 | end 33 | else 34 | self:sub_life({causer = nil, type = macro.sub_life_type.life_loss, name = "强袭", card_id = nil, n = 1}) 35 | target:sub_life({causer = self, type = macro.sub_life_type.damage, name = "强袭", card_id = nil, n = 1}) 36 | end 37 | helper.insert(self.flags["使用过强袭"], target) 38 | end 39 | 40 | return DianWei -------------------------------------------------------------------------------- /hero/liu_shan.lua: -------------------------------------------------------------------------------- 1 | LiuShan = class(Player) 2 | 3 | LiuShan.skill["出牌阶段开始前"] = function (self) 4 | if self:has_skill("放权") then 5 | self.skill["放权-出牌阶段开始前"](self) 6 | end 7 | end 8 | 9 | LiuShan.skill["放权-出牌阶段开始前"] = function (self) 10 | if self:has_flag("跳过出牌") then 11 | return 12 | end 13 | if not query["询问发动技能"]("放权") then 14 | return 15 | end 16 | self.flags["跳过出牌"] = true 17 | self.flags["放权"] = true 18 | end 19 | 20 | LiuShan.skill["回合结束阶段"] = function (self) 21 | if self:has_skill("放权") then 22 | self.skill["放权-回合结束阶段"](self) 23 | end 24 | end 25 | 26 | LiuShan.skill["放权-回合结束阶段"] = function (self) 27 | if not self:has_flag("放权") then 28 | return 29 | end 30 | if #self.hand_cards == 0 then 31 | return 32 | end 33 | opt["弃置一张牌"](self, self, "放权", true) 34 | local targets = game:get_other_players(self) 35 | local target = query["选择一名玩家"](targets, "放权") 36 | table.insert(game.settle_players, self.order + 1, target) 37 | end 38 | 39 | LiuShan.skill["杀-成为目标后"] = function (self, causer, t) 40 | if self:has_skill("享乐") then 41 | self.skill["享乐"](self, causer, t) 42 | end 43 | end 44 | 45 | LiuShan.skill["享乐"] = function (self, causer, t) 46 | if not query["询问发动技能"]("享乐") then 47 | return 48 | end 49 | local func = function (id) return resmng[id].type == "basic" end 50 | if not next(causer:get_cards(func, true ,true)) then 51 | t.invalid[self] = true 52 | return 53 | end 54 | if query["二选一"]("享乐") then 55 | opt["弃置一张牌"](causer, causer, "享乐", true, true, nil, func) 56 | else 57 | t.invalid[self] = true 58 | end 59 | end 60 | 61 | return LiuShan -------------------------------------------------------------------------------- /hero/zhang_jiao.lua: -------------------------------------------------------------------------------- 1 | ZhangJiao = class(Player) 2 | 3 | ZhangJiao.skill["改判"] = function(self, id, judge_player, reason) 4 | if self:has_skill("鬼道") then 5 | return self.skill["鬼道"](self, id, judge_player, reason) 6 | end 7 | end 8 | 9 | ZhangJiao.skill["鬼道"] = function(self, id, judge_player, reason) 10 | local func = function (id) return resmng[id].suit == macro.suit.spade or resmng[id].suit == macro.suit.club end 11 | local cards = self:get_cards(func, true, true) 12 | if judge_player == self and reason == "八卦阵" then 13 | helper.remove(cards, self.armor) 14 | end 15 | if #cards == 0 then 16 | return 17 | end 18 | if not query["询问发动技能"]("鬼道") then 19 | return 20 | end 21 | local id1 = query["选择一张牌"](cards, "鬼道") 22 | if helper.element(self.hand_cards, id1) then 23 | helper.remove(self.hand_cards, id1) 24 | else 25 | self:take_off_equip(id1) 26 | end 27 | helper.insert(self.hand_cards, id) 28 | return id1 29 | end 30 | 31 | ZhangJiao.skill["雷击"] = function (self) 32 | if not query["询问发动技能"]("雷击") then 33 | return 34 | end 35 | local target = query["选择一名玩家"](game:get_other_players(self), "雷击") 36 | local id = game:judge(target, "雷击") 37 | if not (target:has_skill("天妒") and target.skill["天妒"](target, id)) then 38 | helper.insert(deck.discard_pile, id) 39 | end 40 | if target:get_suit(id) == macro.suit.spade then 41 | target:sub_life({causer = self, type = macro.sub_life_type.damage, name = "雷击", card_id = nil, n = 2}) 42 | elseif target:get_suit(id) == macro.suit.club then 43 | self:add_life(1) 44 | target:sub_life({causer = self, type = macro.sub_life_type.damage, name = "雷击", card_id = nil, n = 1}) 45 | end 46 | end 47 | 48 | return ZhangJiao -------------------------------------------------------------------------------- /hero/xiao_qiao.lua: -------------------------------------------------------------------------------- 1 | XiaoQiao = class(Player) 2 | 3 | function XiaoQiao:get_suit(id) 4 | if self:has_skill("红颜") then 5 | if resmng[id].suit == macro.suit.spade and not helper.element(self.judge_cards, id) then 6 | return macro.suit.heart 7 | end 8 | end 9 | return resmng[id].suit 10 | end 11 | 12 | XiaoQiao.skill["受到伤害时"] = function (self, causer, responder, t) 13 | if self:has_skill("天香") then 14 | self.skill["天香"](self, responder, t) 15 | end 16 | end 17 | 18 | XiaoQiao.skill["天香"] = function (self, responder, t) 19 | if self ~= responder then 20 | return 21 | end 22 | local func = function (id) return self:get_suit(id) == macro.suit.heart end 23 | if not next(self:get_cards(func, true)) then 24 | return 25 | end 26 | if not query["询问发动技能"]("天香") then 27 | return 28 | end 29 | t.settle_finish = true 30 | local targets = game:get_other_players(self) 31 | local target = query["选择一名玩家"](targets, "天香") 32 | local id = opt["弃置一张牌"](self, self, "天香", true, false, false, func) 33 | if query["二选一"]("天香") then 34 | target:sub_life({causer = target, type = macro.sub_life_type.damage, name = "天香", card_id = nil, n = 1}) 35 | if target:check_alive() then 36 | local n = target.life_limit - target.life 37 | if n > 5 then 38 | n = 5 39 | end 40 | helper.insert(target.hand_cards, deck:draw(n)) 41 | end 42 | else 43 | target:sub_life({causer = nil, type = macro.sub_life_type.life_loss, name = "天香", card_id = nil, n = 1}) 44 | if target:check_alive() then 45 | helper.remove(deck.discard_pile, id) 46 | helper.insert(target.hand_cards, id) 47 | end 48 | end 49 | end 50 | 51 | return XiaoQiao -------------------------------------------------------------------------------- /hero/diao_chan.lua: -------------------------------------------------------------------------------- 1 | DiaoChan = class(Player) 2 | 3 | DiaoChan.skill["回合结束阶段"] = function (self) 4 | if self:has_skill("闭月") then 5 | self.skill["闭月"](self) 6 | end 7 | end 8 | 9 | DiaoChan.skill["闭月"] = function (self) 10 | if not query["询问发动技能"]("闭月") then 11 | return 12 | end 13 | helper.insert(self.hand_cards, deck:draw(1)) 14 | end 15 | 16 | DiaoChan.get_t["离间"] = function (self) 17 | local t = {} 18 | for _, player in ipairs(game:get_other_players(self)) do 19 | if player.sex == "man" then 20 | local targets = {} 21 | for _, player1 in ipairs(game:get_other_players(player)) do 22 | if player1.sex == "woman" then 23 | goto continue 24 | end 25 | if player1:has_skill("空城") and #player1.hand_cards == 0 then 26 | goto continue 27 | end 28 | helper.insert(targets, player1) 29 | ::continue:: 30 | end 31 | if #targets > 0 then 32 | t[player] = targets 33 | end 34 | end 35 | end 36 | return t 37 | end 38 | 39 | DiaoChan.check_skill["离间"] = function (self) 40 | if self:has_flag("使用过离间") then 41 | return false 42 | end 43 | if self:get_cards(nil, true, true) == 0 then 44 | return false 45 | end 46 | if not next(self.get_t["离间"](self)) then 47 | return false 48 | end 49 | return true 50 | end 51 | 52 | DiaoChan.skill["离间"] = function (self) 53 | self.flags["使用过离间"] = true 54 | opt["弃置一张牌"](self, self, "离间", true, true) 55 | local t = self.get_t["离间"](self) 56 | local targets = helper.get_keys(t) 57 | local target1 = query["选择一名玩家"](targets, "离间") 58 | local target2 = query["选择一名玩家"](t[target1], "离间") 59 | target2.respond["决斗"](target2, target1, nil) 60 | end 61 | 62 | return DiaoChan -------------------------------------------------------------------------------- /hero/cai_wen_ji.lua: -------------------------------------------------------------------------------- 1 | CaiWenJi = class(Player) 2 | 3 | CaiWenJi.skill["受到伤害后"] = function (self, causer, responder, t) 4 | if self:has_skill("悲歌") then 5 | self.skill["悲歌"](self, causer, responder, t) 6 | end 7 | end 8 | 9 | CaiWenJi.skill["悲歌"] = function (self, causer, responder, t) 10 | if t.name ~= "杀" then 11 | return 12 | end 13 | if not next(self:get_cards(nil, true, true)) then 14 | return 15 | end 16 | if not query["询问发动技能"]("悲歌") then 17 | return 18 | end 19 | opt["弃置一张牌"](self, self, "悲歌", true, true) 20 | local id = game:judge(responder, "悲歌") 21 | if not (responder:has_skill(responder, "天妒") and responder.skill["天妒"](responder, id)) then 22 | helper.insert(deck.discard_pile, id) 23 | end 24 | local suit = responder:get_suit(id) 25 | if suit == macro.suit.heart then 26 | responder:add_life(1) 27 | elseif suit == macro.suit.diamond then 28 | helper.insert(responder.hand_cards, deck:draw(2)) 29 | elseif suit == macro.suit.club and causer:check_alive() then 30 | if #causer:get_cards(nil, true, true) >= 2 then 31 | opt["弃置n张牌"](causer, causer, "悲歌", true, true, 2) 32 | elseif #causer:get_cards(nil, true, true) == 1 then 33 | opt["弃置一张牌"](causer, causer, "悲歌", true, true) 34 | end 35 | elseif suit == macro.suit.spade and causer:check_alive() then 36 | causer:flip() 37 | end 38 | end 39 | 40 | CaiWenJi.skill["断肠"] = function (self, causer) 41 | if not query["询问发动技能"]("断肠") then 42 | return 43 | end 44 | helper.clear(causer.skills) 45 | if causer["田"] and next(causer["田"]) then 46 | helper.insert(deck.discard_pile, causer["田"]) 47 | helper.clear(causer["田"]) 48 | elseif causer["创"] and next(causer["创"]) then 49 | helper.insert(deck.discard_pile, causer["创"]) 50 | helper.clear(causer["创"]) 51 | end 52 | end 53 | 54 | return CaiWenJi -------------------------------------------------------------------------------- /hero/yuan_shao.lua: -------------------------------------------------------------------------------- 1 | YuanShao = class(Player) 2 | 3 | YuanShao.get_t["乱击"] = function (self) 4 | local t = {} 5 | local suits = {macro.suit.spade, macro.suit.heart, macro.suit.club, macro.suit.diamond} 6 | for _, suit in ipairs(suits) do 7 | local cards = {} 8 | for _, id in ipairs(self.hand_cards) do 9 | if resmng[id].suit == suit then 10 | helper.insert(cards, id) 11 | end 12 | end 13 | if #cards < 2 then 14 | goto continue 15 | end 16 | local has_targets = false 17 | for _, target in ipairs(game:get_other_players(self)) do 18 | if not (target:has_skill("帷幕") and (suit == macro.suit.spade or suit == macro.suit.club)) then 19 | has_targets = true 20 | break 21 | end 22 | end 23 | if not has_targets then 24 | goto continue 25 | end 26 | t[suit] = cards 27 | ::continue:: 28 | end 29 | return t 30 | end 31 | 32 | YuanShao.check_skill["乱击"] = function (self) 33 | if not next(self.get_t["急袭"](self)) then 34 | return false 35 | end 36 | return true 37 | end 38 | 39 | YuanShao.skill["乱击"] = function (self) 40 | local t = self.get_t["乱击"](self) 41 | local suits = helper.get_keys(t) 42 | local suit = query["乱击-选择花色"](suits) 43 | local id1 = query["选择一张牌"](t[suit], "乱击") 44 | helper.remove(t[suit], id1) 45 | local id2 = query["选择一张牌"](t[suit], "乱击") 46 | local ids = {id1, id2} 47 | helper.remove(self.hand_cards, ids) 48 | self:before_settle(ids) 49 | local settle_players = game:get_settle_players_except_self(self) 50 | for _, player in ipairs(settle_players) do 51 | if player:check_alive() then 52 | if not (player:has_skill("帷幕") and self:get_color(id1) == macro.color.black) then 53 | player.respond["万箭齐发"](player, self, ids) 54 | end 55 | end 56 | end 57 | self:after_settle(ids) 58 | end 59 | 60 | return YuanShao -------------------------------------------------------------------------------- /hero/guan_yu.lua: -------------------------------------------------------------------------------- 1 | GuanYu = class(Player) 2 | 3 | GuanYu.check_skill["武圣"] = function (self) 4 | local cards = {} 5 | local func = function(id) return self:get_color(id) == macro.color.red end 6 | if self:check_can_kill() and next(self:get_players_in_attack_range()) then 7 | helper.insert(cards, self:get_cards(func, true, true)) 8 | end 9 | if self.arm and self:get_color(self.arm) == macro.color.red then 10 | local arm_id = self.arm 11 | self:take_off_equip(arm_id) 12 | if not (self:check_can_kill() and next(self:get_players_in_attack_range())) then 13 | helper.remove(cards, arm_id) 14 | end 15 | self:put_on_equip(arm_id) 16 | end 17 | if not next(cards) then 18 | return false 19 | end 20 | return true 21 | end 22 | 23 | GuanYu.skill["武圣"] = function (self, reason, ...) 24 | local func = function(id) return self:get_color(id) == macro.color.red end 25 | if reason == "南蛮入侵" or reason == "决斗" then 26 | opt["弃置一张牌"](self, self, "武圣", true, true, false, func) 27 | else 28 | local cards = self:get_cards(func, true, true) 29 | if reason == "正常出杀" then 30 | if self.arm and self:get_color(self.arm) == macro.color.red then 31 | local arm_id = self.arm 32 | self:take_off_equip(arm_id) 33 | if not (self:check_can_kill() and next(self:get_players_in_attack_range())) then 34 | helper.remove(cards, arm_id) 35 | end 36 | self:put_on_equip(arm_id) 37 | end 38 | end 39 | local id = query["选择一张牌"](cards, "武圣") 40 | if helper.element(self:get_equip_cards(), id) then 41 | self:take_off_equip(id) 42 | elseif helper.element(self.hand_cards, id) then 43 | helper.remove(self.hand_cards, id) 44 | end 45 | self:before_settle(id) 46 | self.use["杀"](self, {is_transfer = true, transfer_type = "武圣", id = id}, reason, ...) 47 | self:after_settle(id) 48 | end 49 | end 50 | 51 | return GuanYu -------------------------------------------------------------------------------- /hero/yan_liang_wen_chou.lua: -------------------------------------------------------------------------------- 1 | YanLiangWenChou = class(Player) 2 | 3 | function YanLiangWenChou:draw() 4 | text("现在是%s的摸牌阶段", self.name) 5 | self.skill["摸牌阶段开始前"](self) 6 | if self:has_flag("跳过摸牌") then 7 | return 8 | end 9 | if self:has_skill("双雄") then 10 | self.skill["双雄-摸牌阶段"](self) 11 | else 12 | helper.insert(self.hand_cards, deck:draw(2)) 13 | end 14 | end 15 | 16 | YanLiangWenChou.skill["双雄-摸牌阶段"] = function (self) 17 | if not query["询问发动技能"]("双雄") then 18 | return false 19 | end 20 | local id = game:judge(self, "双雄") 21 | helper.insert(self.hand_cards, id) 22 | self.flags["双雄"] = self:get_color(id) 23 | end 24 | 25 | YanLiangWenChou.get_t["双雄"] = function (self) 26 | local t = {} 27 | local cards = {} 28 | for _, id in ipairs(self.hand_cards) do 29 | if self:get_color(id) ~= self.flags["双雄"] then 30 | helper.insert(cards, id) 31 | end 32 | end 33 | for _, id in ipairs(cards) do 34 | local targets = {} 35 | for _, target in ipairs(game:get_other_players(self)) do 36 | if target:has_skill("帷幕") and self:get_color(id) == macro.color.black then 37 | goto continue 38 | end 39 | if target:has_skill("空城") and #target.hand_cards == 0 then 40 | goto continue 41 | end 42 | helper.insert(targets, target) 43 | ::continue:: 44 | end 45 | if next(targets) then 46 | t[id] = targets 47 | end 48 | end 49 | return t 50 | end 51 | 52 | YanLiangWenChou.check_skill["双雄"] = function (self) 53 | if not self:has_flag("双雄") then 54 | return false 55 | end 56 | if not next(self.get_t["双雄"](self)) then 57 | return false 58 | end 59 | return true 60 | end 61 | 62 | YanLiangWenChou.skill["双雄"] = function (self) 63 | local t = self.get_t["双雄"](self) 64 | local cards = helper.get_keys(t) 65 | local id = query["选择一张牌"](cards, "双雄") 66 | helper.remove(self.hand_cards, id) 67 | local target = query["选择一名玩家"](t[id], "双雄") 68 | target.skill["决斗-成为目标后"](target, self, id) 69 | self:before_settle(id) 70 | target.respond["决斗"](target, self, id) 71 | self:after_settle(id) 72 | end 73 | 74 | return YanLiangWenChou -------------------------------------------------------------------------------- /hero/huang_zhong.lua: -------------------------------------------------------------------------------- 1 | HuangZhong = class(Player) 2 | 3 | function HuangZhong:get_min_dis_targets() 4 | local targets = {} 5 | local min_dis 6 | for _, target in ipairs(game:get_other_players(self)) do 7 | local dis = self:get_distance(target) 8 | if next(targets) then 9 | if dis < min_dis then 10 | min_dis = dis 11 | targets = {target} 12 | elseif dis == min_dis then 13 | helper.insert(targets, target) 14 | end 15 | else 16 | min_dis = dis 17 | targets = {target} 18 | end 19 | end 20 | for _, target in ipairs(targets) do 21 | if target:has_skill("空城") and #target.hand_cards == 0 then 22 | helper.remove(targets, target) 23 | end 24 | end 25 | return targets 26 | end 27 | 28 | HuangZhong.respond["乱武"] = function (self) 29 | local targets = self:get_min_dis_targets() 30 | local func = function (id) return resmng[id].name == "杀" end 31 | local cards = self:get_cards(func, true) 32 | local t = {} 33 | for _, id in ipairs(cards) do 34 | local targets1 = {} 35 | for _, target in ipairs(targets) do 36 | if resmng[id].points > self:get_distance(target) then 37 | helper.insert(targets1, target) 38 | elseif helper.element(self:get_players_in_attack_range(), target) then 39 | helper.insert(targets1, target) 40 | end 41 | end 42 | if next(targets1) then 43 | t[id] = targets1 44 | end 45 | end 46 | if next(t) then 47 | local cards1 = helper.get_keys(t) 48 | local id = query["询问出牌"](cards1, {}, "杀") 49 | if resmng.check_card(id) then 50 | helper.remove(self.hand_cards, id) 51 | self:before_settle(id) 52 | self.use["杀"](self, {id = id}, "乱武", t[id]) 53 | self:after_settle(id) 54 | elseif resmng.check_skill(id) then 55 | self.skill["杀"](self, id, "乱武", t[id]) 56 | else 57 | self:sub_life({causer = self, type = macro.sub_life_type.life_loss, name = "乱武", card_id = nil, n = 1}) 58 | end 59 | else 60 | self:sub_life({causer = self, type = macro.sub_life_type.life_loss, name = "乱武", card_id = nil, n = 1}) 61 | end 62 | end 63 | 64 | return HuangZhong -------------------------------------------------------------------------------- /hero/xvn_yu.lua: -------------------------------------------------------------------------------- 1 | XvnYu = class(Player) 2 | 3 | XvnYu.get_t["驱虎"] = function (self) 4 | local t = {} 5 | for _, target in ipairs(game:get_other_players(self)) do 6 | if next(target.hand_cards) and target.life > self.life then 7 | local targets = target:get_players_in_attack_range() 8 | if next(targets) then 9 | t[target] = targets 10 | end 11 | end 12 | end 13 | return t 14 | end 15 | 16 | XvnYu.check_skill["驱虎"] = function (self) 17 | if self:has_flag("使用过驱虎") then 18 | return false 19 | end 20 | if not next(self.get_t["驱虎"](self)) then 21 | return false 22 | end 23 | return true 24 | end 25 | 26 | XvnYu.skill["驱虎"] = function (self) 27 | self.flags["使用过驱虎"] = true 28 | local t = self.get_t["驱虎"](self) 29 | local targets = helper.get_keys(t) 30 | local target = query["选择一名玩家"](targets, "驱虎") 31 | if game:compare_points(self, target) then 32 | local target1 = query["选择一名玩家"](t[target], "驱虎") 33 | target1:sub_life({causer = target, type = macro.sub_life_type.damage, name = "驱虎", card_id = nil, n = 1}) 34 | else 35 | self:sub_life({causer = target, type = macro.sub_life_type.damage, name = "驱虎", card_id = nil, n = 1}) 36 | end 37 | end 38 | 39 | XvnYu.skill["受到伤害后"] = function (self, causer, responder, t) 40 | if self:has_skill("节命") then 41 | self.skill["节命"](self, responder, t) 42 | end 43 | end 44 | 45 | XvnYu.get_targets["节命"] = function() 46 | local targets = {} 47 | for _, target in ipairs(game.players) do 48 | if #target.hand_cards < target.life_limit and #target.hand_cards < 5 then 49 | helper.insert(targets, target) 50 | end 51 | end 52 | return targets 53 | end 54 | 55 | XvnYu.skill["节命"] = function (self, responder, t) 56 | if responder ~= self then 57 | return 58 | end 59 | local targets = self.get_targets["节命"]() 60 | if not next(targets) then 61 | return 62 | end 63 | if not query["询问发动技能"]("节命") then 64 | return 65 | end 66 | for _ = 1, t.n, 1 do 67 | local target = query["选择一名玩家"](targets, "节命") 68 | local limit = target.life_limit <= 5 and target.life_limit or 5 69 | helper.insert(target.hand_cards, deck:draw(limit - #target.hand_cards)) 70 | targets = self.get_targets["节命"]() 71 | if not next(targets) then 72 | return 73 | end 74 | end 75 | end 76 | 77 | return XvnYu -------------------------------------------------------------------------------- /hero/da_qiao.lua: -------------------------------------------------------------------------------- 1 | DaQiao = class(Player) 2 | 3 | DaQiao.get_t["国色"] = function (self) 4 | local t = {} 5 | local func = function (v) return resmng[v].suit == macro.suit.diamond end 6 | local cards = self:get_cards(func, true, true) 7 | for _, id in ipairs(cards) do 8 | local targets = {} 9 | for _, player in ipairs(game:get_other_players(self)) do 10 | local name = game:get_judge_card_name(id) 11 | -- 被转移目标判定区内不能有同名判定牌 12 | for _, id1 in ipairs(player.judge_cards) do 13 | if name == game:get_judge_card_name(id1) then 14 | goto continue 15 | end 16 | end 17 | -- 不能把乐不思蜀转给陆逊 18 | if name == "乐不思蜀" and player:has_skill("谦逊") then 19 | goto continue 20 | end 21 | -- 不能把黑色牌转给贾诩 22 | if player:has_skill("帷幕") and self:get_color(id) == macro.color.black then 23 | goto continue 24 | end 25 | helper.insert(targets, player) 26 | ::continue:: 27 | end 28 | if #targets > 0 then 29 | t[id] = targets 30 | end 31 | end 32 | return t 33 | end 34 | 35 | DaQiao.check_skill["国色"] = function (self) 36 | if not next(self.get_t["国色"](self)) then 37 | return false 38 | end 39 | return true 40 | end 41 | 42 | DaQiao.skill["国色"] = function (self) 43 | local t = self.get_t["国色"](self) 44 | local cards = helper.get_keys(t) 45 | local id = query["选择一张牌"](cards, "国色") 46 | if helper.element(self.hand_cards, id) then 47 | helper.remove(self.hand_cards, id) 48 | elseif helper.element(self:get_equip_cards(), id) then 49 | self:take_off_equip(id) 50 | end 51 | local target = query["选择一名玩家"](t[id], "国色") 52 | helper.put(target.judge_cards, id) 53 | game.transfer_delay_tactics[id] = "乐不思蜀" 54 | end 55 | 56 | DaQiao.skill["流离"] = function (self, causer) 57 | local targets = self:get_players_in_attack_range() 58 | -- 不能转移给杀的使用者 59 | helper.remove(targets, causer) 60 | -- 不能转移给空城的诸葛亮 61 | for _, target in ipairs(targets) do 62 | if target:has_skill("空城") and #target.hand_cards == 0 then 63 | helper.remove(targets, target) 64 | break 65 | end 66 | end 67 | if not next(targets) then 68 | return 69 | end 70 | if not next(self:get_cards(nil, true, true)) then 71 | return 72 | end 73 | if not query["询问发动技能"]("流离") then 74 | return 75 | end 76 | opt["弃置一张牌"](self, self, "流离", true, true) 77 | local target = query["选择一名玩家"](targets, "流离") 78 | return target 79 | end 80 | 81 | return DaQiao -------------------------------------------------------------------------------- /hero/deng_ai.lua: -------------------------------------------------------------------------------- 1 | DengAi = class(Player) 2 | 3 | function DengAi:ctor() 4 | self["田"] = {} 5 | end 6 | 7 | function DengAi:get_distance(another) 8 | local dis = Player.get_distance(self, another) 9 | if self:has_skill("屯田") then 10 | dis = dis - #self["田"] 11 | end 12 | return dis > 0 and dis or 0 13 | end 14 | 15 | DengAi.skill["回合开始阶段"] = function (self) 16 | if self:has_skill("凿险") then 17 | self.skill["凿险"](self) 18 | end 19 | end 20 | 21 | DengAi.skill["凿险"] = function (self) 22 | if #self["田"] < 3 then 23 | return 24 | end 25 | if not query["询问发动技能"]("凿险") then 26 | return 27 | end 28 | self.life_limit = self.life_limit - 1 29 | self.life = self.life > self.life_limit and self.life_limit or self.life 30 | helper.remove(self.skills, resmng.get_skill_id("凿险")) 31 | helper.insert(self.skills, resmng.get_skill_id("急袭")) 32 | end 33 | 34 | DengAi.skill["失去手牌"] = function (self, causer, responder, reason) 35 | if self:has_skill("屯田") then 36 | self.skill["屯田"](self, responder) 37 | end 38 | end 39 | 40 | DengAi.skill["失去装备"] = function (self) 41 | if self:has_skill("屯田") then 42 | self.skill["屯田"](self, self) 43 | end 44 | end 45 | 46 | DengAi.skill["屯田"] = function (self, responder) 47 | if self ~= responder then 48 | return 49 | end 50 | if game.whose_turn == self then 51 | return 52 | end 53 | if not query["询问发动技能"]("屯田") then 54 | return 55 | end 56 | local id = game:judge(self, "屯田") 57 | if resmng[id].suit ~= macro.suit.heart then 58 | helper.insert(self["田"], id) 59 | else 60 | helper.insert(deck.discard_pile, id) 61 | end 62 | end 63 | 64 | DengAi.get_t["急袭"] = function (self) 65 | local t = {} 66 | for _, id in ipairs(self["田"]) do 67 | local targets = {} 68 | for _, player in ipairs(game:get_other_players(self)) do 69 | if player:has_skill("帷幕") and self:get_color(id) == macro.color.black then 70 | goto continue 71 | end 72 | if #player:get_cards(nil, true, true, true) == 0 then 73 | goto continue 74 | end 75 | if player:has_skill("谦逊") then 76 | goto continue 77 | end 78 | if self:get_distance(player) > 0 then 79 | goto continue 80 | end 81 | helper.insert(targets, player) 82 | ::continue:: 83 | end 84 | if #targets > 0 then 85 | t[id] = targets 86 | end 87 | end 88 | return t 89 | end 90 | 91 | DengAi.check_skill["急袭"] = function (self) 92 | if not next(self.get_t["急袭"](self)) then 93 | return false 94 | end 95 | return true 96 | end 97 | 98 | DengAi.skill["急袭"] = function (self) 99 | local t = self.get_t["急袭"](self) 100 | local cards = helper.get_keys(t) 101 | local id = query["选择一张牌"](cards, "急袭") 102 | helper.remove(self["田"], id) 103 | self:before_settle(id) 104 | local target = query["选择一名玩家"](t[id], "急袭") 105 | target.respond["顺手牵羊"](target, self) 106 | self:after_settle(id) 107 | end 108 | 109 | return DengAi -------------------------------------------------------------------------------- /hero/jiang_wei.lua: -------------------------------------------------------------------------------- 1 | JiangWei = class(Player) 2 | 3 | JiangWei.skill["回合开始阶段"] = function (self) 4 | if self:has_skill("志继") then 5 | self.skill["志继"](self) 6 | end 7 | if self:has_skill("观星") then 8 | self.skill["观星"](self) 9 | end 10 | end 11 | 12 | JiangWei.skill["志继"] = function (self) 13 | if #self.hand_cards > 0 then 14 | return 15 | end 16 | if not query["询问发动技能"]("志继") then 17 | return 18 | end 19 | if self.life < self.life_limit then 20 | if not query["二选一"]("志继") then 21 | helper.insert(self.hand_cards, deck:draw(2)) 22 | else 23 | self:add_life(1) 24 | end 25 | else 26 | helper.insert(self.hand_cards, deck:draw(2)) 27 | end 28 | self.life_limit = self.life_limit - 1 29 | self.life = self.life > self.life_limit and self.life_limit or self.life 30 | helper.remove(self.skills, resmng.get_skill_id("志继")) 31 | helper.insert(self.skills, resmng.get_skill_id("观星")) 32 | end 33 | 34 | JiangWei.skill["观星"] = function () 35 | if not query["询问发动技能"]("观星") then 36 | return 37 | end 38 | local n = #game.players > 5 and 5 or #game.players 39 | local cards = deck:draw(n) 40 | cards = type(cards) == "number" and {cards} or cards 41 | local cards1 = query["观星-调整牌序"](cards) 42 | if query["二选一"]("观星") then 43 | for i, v in ipairs(cards1) do 44 | table.insert(deck.card_pile, i, v) 45 | end 46 | else 47 | helper.insert(deck.card_pile, cards1) 48 | end 49 | end 50 | 51 | JiangWei.get_targets["挑衅"] = function (self) 52 | local targets = {} 53 | for _, target in ipairs(game:get_other_players(self)) do 54 | if helper.element(target:get_players_in_attack_range(), self) then 55 | helper.insert(targets, target) 56 | end 57 | end 58 | return targets 59 | end 60 | 61 | JiangWei.check_skill["挑衅"] = function (self) 62 | if self:has_flag("使用过挑衅") then 63 | return false 64 | end 65 | if not next(self.get_targets["挑衅"](self)) then 66 | return false 67 | end 68 | return true 69 | end 70 | 71 | JiangWei.skill["挑衅"] = function (self) 72 | self.flags["使用过挑衅"] = true 73 | local targets = self.get_targets["挑衅"](self) 74 | local target = query["选择一名玩家"](targets, "挑衅") 75 | local func = function (id) return resmng[id].name == "杀" end 76 | local kills = target:get_cards(func, true, true) 77 | local skills = target:get_skills_can_be_card("杀") 78 | if next(kills) or next(skills) then 79 | if query["二选一"]("挑衅") then 80 | local id = query["询问出牌"](kills, skills, "杀", true) 81 | if resmng.check_card(id) then 82 | helper.remove(target.hand_cards, id) 83 | game.skill["失去手牌"](game, target, target, "使用") 84 | self:before_settle(id) 85 | target.use["杀"](target, {id = id}, "挑衅", self) 86 | self:after_settle(id) 87 | elseif resmng.check_skill(id) then 88 | self.skill["杀"](target, id, "挑衅", self) 89 | end 90 | else 91 | opt["弃置一张牌"](self, target, "挑衅", true, true) 92 | end 93 | else 94 | opt["弃置一张牌"](self, target, "挑衅", true, true) 95 | end 96 | end 97 | 98 | return JiangWei -------------------------------------------------------------------------------- /hero/sun_ce.lua: -------------------------------------------------------------------------------- 1 | SunCe = class(Player) 2 | 3 | SunCe.skill["回合开始阶段"] = function (self) 4 | if self:has_skill("魂姿") then 5 | self.skill["魂姿"](self) 6 | end 7 | if self:has_skill("英魂") then 8 | self.skill["英魂"](self) 9 | end 10 | end 11 | 12 | SunCe.skill["魂姿"] = function (self) 13 | if self.life > 1 then 14 | return 15 | end 16 | if not query["询问发动技能"]("魂姿") then 17 | return 18 | end 19 | self.life_limit = self.life_limit - 1 20 | self.life = self.life > self.life_limit and self.life_limit or self.life 21 | helper.remove(self.skills, resmng.get_skill_id("魂姿")) 22 | helper.insert(self.skills, resmng.get_skill_id("英姿")) 23 | helper.insert(self.skills, resmng.get_skill_id("英魂")) 24 | end 25 | 26 | function SunCe:draw() 27 | text("现在是%s的摸牌阶段", self.name) 28 | self.skill["摸牌阶段开始前"](self) 29 | if self:has_flag("跳过摸牌") then 30 | return 31 | end 32 | if self:has_skill("英姿") then 33 | self.skill["英姿"](self) 34 | else 35 | helper.insert(self.hand_cards, deck:draw(2)) 36 | end 37 | end 38 | 39 | SunCe.skill["英姿"] = function (self) 40 | if not query["询问发动技能"]("英姿") then 41 | helper.insert(self.hand_cards, deck:draw(2)) 42 | else 43 | helper.insert(self.hand_cards, deck:draw(3)) 44 | end 45 | end 46 | 47 | SunCe.skill["英魂"] = function (self) 48 | local n = self.life_limit - self.life 49 | if n == 0 then 50 | return 51 | end 52 | if not query["询问发动技能"]("英魂") then 53 | return 54 | end 55 | local target = query["选择一名玩家"](game:get_other_players(self), "英魂") 56 | if query["二选一"]("英魂") then 57 | helper.insert(target.hand_cards, deck:draw(n)) 58 | opt["弃置一张牌"](target, target, "英魂", true, true) 59 | else 60 | helper.insert(target.hand_cards, deck:draw(1)) 61 | local card_n = #target:get_cards(nil, true, true) 62 | n = n > card_n and card_n or n 63 | opt["弃置n张牌"](target, target, "英魂", true, true, n) 64 | end 65 | end 66 | 67 | SunCe.skill["杀-指定目标后"] = function (self, target, t) 68 | if self:has_skill("雌雄双股剑") then 69 | self.skill["雌雄双股剑"](self, target) 70 | end 71 | if self:has_skill("激昂") then 72 | self.skill["激昂"](self, self, "杀", t) 73 | end 74 | end 75 | 76 | SunCe.skill["杀-成为目标后"] = function (self, causer, t) 77 | if self:has_skill("激昂") then 78 | self.skill["激昂"](self, causer, "杀", t) 79 | end 80 | end 81 | 82 | SunCe.skill["决斗-指定目标后"] = function (self, id) 83 | if self:has_skill("激昂") then 84 | self.skill["激昂"](self, self, "决斗", id) 85 | end 86 | end 87 | 88 | SunCe.skill["决斗-成为目标后"] = function (self, causer, id) 89 | if self:has_skill("激昂") then 90 | self.skill["激昂"](self, causer, "决斗", id) 91 | end 92 | end 93 | 94 | SunCe.skill["激昂"] = function (self, causer, reason, args) 95 | local color 96 | if reason == "杀" then 97 | color = causer:get_kill_color(args) 98 | elseif reason == "决斗" then 99 | color = causer:get_color(args) 100 | end 101 | if color ~= macro.color.red then 102 | return 103 | end 104 | if not query["询问发动技能"]("激昂") then 105 | return 106 | end 107 | helper.insert(self.hand_cards, deck:draw(1)) 108 | end 109 | 110 | return SunCe -------------------------------------------------------------------------------- /hero/lu_su.lua: -------------------------------------------------------------------------------- 1 | LuSu = class(Player) 2 | 3 | function LuSu:draw() 4 | text("现在是%s的摸牌阶段", self.name) 5 | self.skill["摸牌阶段开始前"](self) 6 | if self:has_flag("跳过摸牌") then 7 | return 8 | end 9 | if self:has_skill("好施") then 10 | self.skill["好施"](self) 11 | else 12 | helper.insert(self.hand_cards, deck:draw(2)) 13 | end 14 | end 15 | 16 | LuSu.skill["好施"] = function (self) 17 | if not query["询问发动技能"]("好施") then 18 | return 19 | end 20 | helper.insert(self.hand_cards, deck:draw(4)) 21 | if #self.hand_cards > 5 then 22 | local n = math.floor(#self.hand_cards / 2) 23 | local cards = {} 24 | for _ = 1, n, 1 do 25 | local id = query["选择一张牌"](self.hand_cards, "好施") 26 | helper.remove(self.hand_cards, id) 27 | helper.insert(cards, id) 28 | end 29 | local other_players = game:get_other_players(self) 30 | local min_n = #other_players[1].hand_cards 31 | local targets = {other_players[1]} 32 | for i = 2, #other_players, 1 do 33 | if #other_players[i].hand_cards == min_n then 34 | helper.insert(targets, other_players[i]) 35 | elseif #other_players[i].hand_cards < min_n then 36 | min_n = #other_players[i].hand_cards 37 | helper.clear(targets) 38 | helper.insert(targets, other_players) 39 | end 40 | end 41 | local target = query["选择一名玩家"](targets, "好施") 42 | helper.remove(self.hand_cards, cards) 43 | helper.insert(target.hand_cards, cards) 44 | end 45 | end 46 | 47 | LuSu.get_t["缔盟"] = function (self) 48 | local others1 = game:get_other_players(self) 49 | if #others1 < 2 then 50 | return {} 51 | end 52 | local t = {} 53 | for _, target in ipairs(others1) do 54 | local targets = {} 55 | local others2 = game:get_other_players(target) 56 | helper.remove(others2, self) 57 | for _, target1 in ipairs(others2) do 58 | local n = math.abs(#target.hand_cards - #target1.hand_cards) 59 | local cards = self:get_cards(nil, true, true) 60 | if #cards >= n then 61 | helper.insert(targets, target1) 62 | end 63 | end 64 | if next(targets) then 65 | t[target] = targets 66 | end 67 | end 68 | return t 69 | end 70 | 71 | LuSu.check_skill["缔盟"] = function (self) 72 | if self:has_flag("使用过缔盟") then 73 | return false 74 | end 75 | if not next(self.get_t["缔盟"](self)) then 76 | return false 77 | end 78 | return true 79 | end 80 | 81 | LuSu.skill["缔盟"] = function (self) 82 | self.flags["使用过缔盟"] = true 83 | local t = self.get_t["缔盟"](self) 84 | local targets = helper.get_keys(t) 85 | local target1 = query["选择一名玩家"](targets, "缔盟") 86 | local target2 = query["选择一名玩家"](t[target1], "缔盟") 87 | local n = math.abs(#target1.hand_cards - #target2.hand_cards) 88 | opt["弃置n张牌"](self, self, "缔盟", true, true, n) 89 | local tmp_hand_cards1 = target1.hand_cards 90 | target1.hand_cards = {} 91 | local tmp_hand_cards2 = target2.hand_cards 92 | target2.hand_cards = {} 93 | game.skill["失去手牌"](game, target1, target1, "交换") 94 | game.skill["失去手牌"](game, target2, target2, "交换") 95 | helper.insert(target1.hand_cards, tmp_hand_cards2) 96 | helper.insert(target2.hand_cards, tmp_hand_cards1) 97 | end 98 | 99 | return LuSu -------------------------------------------------------------------------------- /hero/cao_ren.lua: -------------------------------------------------------------------------------- 1 | CaoRen = class(Player) 2 | 3 | function CaoRen:flip() 4 | if self.toward == macro.toward.up then 5 | self.toward = macro.toward.down 6 | helper.remove(self.skills, resmng[self.hero_id].skills) 7 | -- false表示背面翻回正面,获得武将技能, 8 | else 9 | self.toward = macro.toward.up 10 | helper.insert(self.skills, resmng[self.hero_id].skills) 11 | if self:has_skill("解围") then 12 | self.skill["解围-翻面"](self) 13 | end 14 | end 15 | end 16 | 17 | CaoRen.skill["无懈可击"] = function (self) 18 | self.skill["解围-无懈可击"](self) 19 | end 20 | 21 | CaoRen.skill["解围-无懈可击"] = function (self) 22 | local cards = self:get_equip_cards() 23 | local id = query["选择一张牌"](cards, "解围") 24 | self:take_off_equip(id) 25 | self:before_settle(id) 26 | self:after_settle(id) 27 | end 28 | 29 | local function get_cards_and_targets2(player) 30 | local t = {} 31 | local equip_cards = player:get_equip_cards() 32 | local judge_cards = player.judge_cards 33 | for _, id in ipairs(equip_cards) do 34 | local targets = {} 35 | for _, target in ipairs(game:get_other_players(player)) do 36 | if not target:has_equip(resmng[id].type) then 37 | helper.insert(targets, target) 38 | end 39 | end 40 | if #targets > 0 then 41 | t[id] = targets 42 | end 43 | end 44 | for _, id in ipairs(judge_cards) do 45 | local targets = {} 46 | for _, target in ipairs(game:get_other_players(player)) do 47 | local name = game:get_judge_card_name(id) 48 | -- 被转移目标判定区内不能有同名判定牌 49 | for _, id1 in ipairs(target.judge_cards) do 50 | if name == game:get_judge_card_name(id1) then 51 | goto continue 52 | end 53 | end 54 | -- 不能把乐不思蜀转给陆逊 55 | if name == "乐不思蜀" and target:has_skill("谦逊") then 56 | goto continue 57 | end 58 | -- 不能把黑色牌转给贾诩 59 | if target:has_skill("帷幕") and player:get_color(id) == macro.color.black then 60 | goto continue 61 | end 62 | helper.insert(targets, target) 63 | ::continue:: 64 | end 65 | if #targets > 0 then 66 | t[id] = targets 67 | end 68 | end 69 | return t 70 | end 71 | 72 | local function get_targets1_and_cards_and_targets2() 73 | local t = {} 74 | for _, player in ipairs(game.players) do 75 | local t1 = get_cards_and_targets2(player) 76 | if next(t1) then 77 | t[player] = t1 78 | end 79 | end 80 | return t 81 | end 82 | 83 | CaoRen.get_t["解围-翻面"] = function (self) 84 | local t = {} 85 | for _, id in ipairs(self.hand_cards) do 86 | local t1 = get_targets1_and_cards_and_targets2() 87 | if next(t1) then 88 | t[id] = t1 89 | end 90 | end 91 | for _, id in ipairs(self:get_equip_cards()) do 92 | self:take_off_equip(id) 93 | local t1 = get_targets1_and_cards_and_targets2() 94 | if next(t1) then 95 | t[id] = t1 96 | end 97 | self:put_on_equip(id) 98 | end 99 | return t 100 | end 101 | 102 | CaoRen.skill["解围-翻面"] = function (self) 103 | local t = self.get_t["解围-翻面"](self) 104 | if not next(t) then 105 | return 106 | end 107 | if not query["询问发动技能"]("解围") then 108 | return 109 | end 110 | local can_discard_cards = helper.get_keys(t) 111 | local func = function (id) return helper.element(can_discard_cards, id) end 112 | local discard_id = opt["弃置一张牌"](self, self, "解围", true, true, false, func) 113 | local targets = helper.get_keys(t[discard_id]) 114 | local target = query["选择一名玩家"](targets, "解围") 115 | local can_move_cards = helper.get_keys(t[discard_id][target]) 116 | local move_card_id = query["选择一张牌"](can_move_cards, "解围") 117 | local target1 = query["选择一名玩家"](t[discard_id][target][move_card_id], "解围") 118 | if helper.element(target:get_equip_cards(), move_card_id) then 119 | target:take_off_equip(move_card_id) 120 | target.skill["失去装备"](target) 121 | target1:put_on_equip(move_card_id) 122 | else 123 | helper.remove(target.judge_cards, move_card_id) 124 | helper.put(target1.judge_cards, move_card_id) 125 | end 126 | end 127 | 128 | CaoRen.skill["回合结束阶段"] = function (self) 129 | if self:has_skill("据守") then 130 | self.skill["据守"](self) 131 | end 132 | end 133 | 134 | CaoRen.skill["据守"] = function (self) 135 | if not query["询问发动技能"]("据守") then 136 | return 137 | end 138 | helper.insert(self.hand_cards, deck:draw(4)) 139 | self:flip() 140 | local id = query["选择一张牌"](self.hand_cards, "据守") 141 | helper.remove(self.hand_cards, id) 142 | if resmng[id].type ~= "basic" and resmng[id].type ~= "tactic" then 143 | self:put_on_equip(id) 144 | else 145 | helper.insert(deck.discard_pile, id) 146 | end 147 | end 148 | 149 | return CaoRen -------------------------------------------------------------------------------- /hero/zhang_he.lua: -------------------------------------------------------------------------------- 1 | ZhangHe = class(Player) 2 | 3 | ZhangHe.skill["判定阶段开始前"] = function (self) 4 | if self:has_skill("巧变") then 5 | self.skill["巧变-判定阶段开始前"](self) 6 | end 7 | end 8 | 9 | ZhangHe.skill["巧变-判定阶段开始前"] = function (self) 10 | if not next(self.hand_cards) then 11 | return 12 | end 13 | if not query["询问发动技能"]("巧变") then 14 | return 15 | end 16 | opt["弃置一张牌"](self, self, "巧变", true) 17 | self.flags["跳过判定"] = true 18 | end 19 | 20 | ZhangHe.skill["摸牌阶段开始前"] = function (self) 21 | if self:has_skill("巧变") then 22 | self.skill["巧变-摸牌阶段开始前"](self) 23 | end 24 | end 25 | 26 | ZhangHe.skill["巧变-摸牌阶段开始前"] = function (self) 27 | if not next(self.hand_cards) then 28 | return 29 | end 30 | local targets = {} 31 | for _, player in ipairs(game:get_other_players(self)) do 32 | if #player.hand_cards > 0 then 33 | helper.insert(targets, player) 34 | end 35 | end 36 | if not next(targets) then 37 | return 38 | end 39 | if not query["询问发动技能"]("巧变") then 40 | return 41 | end 42 | opt["弃置一张牌"](self, self, "巧变", true) 43 | self.flags["跳过摸牌"] = true 44 | local target = query["选择一名玩家"](targets, "巧变") 45 | opt["获得一张牌"](self, target, "巧变", true) 46 | helper.remove(targets, target) 47 | if next(targets) then 48 | if not query["二选一"]("是否继续指定抽牌的目标") then 49 | return true 50 | end 51 | local target1 = query["选择一名玩家"](targets, "巧变") 52 | opt["获得一张牌"](self, target1, "巧变", true) 53 | end 54 | end 55 | 56 | ZhangHe.skill["出牌阶段开始前"] = function (self) 57 | if self:has_skill("巧变") then 58 | self.skill["巧变-出牌阶段开始前"](self) 59 | end 60 | end 61 | 62 | local function get_cards_and_targets(player) 63 | local t = {} 64 | local equip_cards = player:get_equip_cards() 65 | local judge_cards = player.judge_cards 66 | for _, id in ipairs(equip_cards) do 67 | local targets = {} 68 | for _, target in ipairs(game:get_other_players(player)) do 69 | if not target:has_equip(resmng[id].type) then 70 | helper.insert(targets, target) 71 | end 72 | end 73 | if #targets > 0 then 74 | t[id] = targets 75 | end 76 | end 77 | for _, id in ipairs(judge_cards) do 78 | local targets = {} 79 | for _, target in ipairs(game:get_other_players(player)) do 80 | local name = game:get_judge_card_name(id) 81 | -- 被转移目标判定区内不能有同名判定牌 82 | for _, id1 in ipairs(target.judge_cards) do 83 | if name == game:get_judge_card_name(id1) then 84 | goto continue 85 | end 86 | end 87 | -- 不能把乐不思蜀转给陆逊 88 | if name == "乐不思蜀" and target:has_skill("谦逊") then 89 | goto continue 90 | end 91 | -- 不能把黑色牌转给贾诩 92 | if target:has_skill("帷幕") and player:get_color(id) == macro.color.black then 93 | goto continue 94 | end 95 | helper.insert(targets, target) 96 | ::continue:: 97 | end 98 | if #targets > 0 then 99 | t[id] = targets 100 | end 101 | end 102 | return t 103 | end 104 | 105 | ZhangHe.get_t["巧变-出牌阶段开始前"] = function () 106 | local t = {} 107 | for _, player in ipairs(game.players) do 108 | local t1 = get_cards_and_targets(player) 109 | if next(t1) then 110 | t[player] = t1 111 | end 112 | end 113 | return t 114 | end 115 | 116 | ZhangHe.skill["巧变-出牌阶段开始前"] = function (self) 117 | if self:has_flag("跳过出牌") then 118 | return 119 | end 120 | if not next(self.hand_cards) then 121 | return 122 | end 123 | local t = self.get_t["巧变-出牌阶段开始前"](self) 124 | if not next(t) then 125 | return 126 | end 127 | if not query["询问发动技能"]("巧变") then 128 | return 129 | end 130 | opt["弃置一张牌"](self, self, "巧变", true) 131 | self.flags["跳过出牌"] = true 132 | local targets = helper.get_keys(t) 133 | local target = query["选择一名玩家"](targets, "巧变") 134 | local id = query["选择一张牌"](helper.get_keys(t[target]), "巧变") 135 | local target1 = query["选择一名玩家"](t[target][id], "巧变") 136 | if helper.element(target:get_equip_cards(), id) then 137 | target:take_off_equip(id) 138 | target.skill["失去装备"](target) 139 | target1:put_on_equip(id) 140 | else 141 | helper.remove(target.judge_cards, id) 142 | helper.put(target1.judge_cards, id) 143 | end 144 | end 145 | 146 | ZhangHe.skill["弃牌阶段开始前"] = function (self) 147 | if self:has_skill("巧变") then 148 | self.skill["巧变-弃牌阶段开始前"](self) 149 | end 150 | end 151 | 152 | ZhangHe.skill["巧变-弃牌阶段开始前"] = function (self) 153 | if not next(self.hand_cards) then 154 | return 155 | end 156 | if not query["询问发动技能"]("巧变") then 157 | return 158 | end 159 | opt["弃置一张牌"](self, self, "巧变", true) 160 | self.flags["跳过弃牌"] = true 161 | end 162 | 163 | return ZhangHe -------------------------------------------------------------------------------- /helper.lua: -------------------------------------------------------------------------------- 1 | helper = {} 2 | 3 | -- 通用插入函数 4 | function helper.insert(t, v) 5 | if type(v) == "table" then 6 | if v.id then -- v是玩家table,直接插入 7 | table.insert(t, v) 8 | else -- v是其它table,向t中插入v包含的所有元素 9 | for _, v1 in ipairs(v) do 10 | table.insert(t, v1) 11 | end 12 | end 13 | -- v为其它,直接插入 14 | else 15 | table.insert(t, v) 16 | end 17 | end 18 | 19 | -- 通用移除函数 20 | function helper.remove(t, v) 21 | -- v为table,从t中移除v包含的所有元素 22 | if type(v) == "table" then 23 | if v.id then 24 | for i, v1 in ipairs(t) do 25 | if v == v1 then 26 | table.remove(t, i) 27 | return 28 | end 29 | end 30 | else 31 | for _, v1 in ipairs(v) do 32 | for i, v2 in ipairs(t) do 33 | if v2 == v1 then 34 | table.remove(t, i) 35 | break 36 | end 37 | end 38 | end 39 | end 40 | -- v为其它,直接移除 41 | else 42 | for i, v1 in ipairs(t) do 43 | if v == v1 then 44 | table.remove(t, i) 45 | return 46 | end 47 | end 48 | end 49 | end 50 | 51 | -- table t是否包含元素v 52 | function helper.element(t, v) 53 | for _, v1 in ipairs(t) do 54 | if v1 == v then 55 | return true 56 | end 57 | end 58 | end 59 | 60 | -- 清空table,用于清除玩家flags,因为flags中可能有键值对,所以不能用table.remove函数 61 | function helper.clear(t) 62 | for k, _ in pairs(t) do 63 | t[k] = nil 64 | end 65 | end 66 | 67 | -- 获取table中的所有key 68 | function helper.get_keys(t) 69 | local t1 = {} 70 | for k, _ in pairs(t) do 71 | table.insert(t1, k) 72 | end 73 | return t1 74 | end 75 | 76 | -- 进栈 77 | function helper.put(t, v) 78 | table.insert(t, v) 79 | end 80 | 81 | -- 出栈 82 | function helper.pop(t) 83 | table.remove(t) 84 | end 85 | 86 | -- 比较 87 | function helper.equal(a, b) 88 | if type(a) ~= type(b) then 89 | return false 90 | end 91 | if type(a) == "table" then 92 | if #a ~= #b then 93 | return false 94 | end 95 | for i = 1, #a, 1 do 96 | if a[i] ~= b[i] then 97 | return false 98 | end 99 | end 100 | else 101 | return a == b 102 | end 103 | return true 104 | end 105 | 106 | function get_suit_str(suit) 107 | if suit == macro.suit.spade then 108 | return "黑桃" 109 | elseif suit == macro.suit.heart then 110 | return "红桃" 111 | elseif suit == macro.suit.club then 112 | return "梅花" 113 | elseif suit == macro.suit.diamond then 114 | return "方块" 115 | end 116 | end 117 | 118 | -- 通用打印函数 119 | function text(str, ...) 120 | if str then 121 | print(string.format(str, ...)) 122 | else 123 | print() 124 | end 125 | end 126 | 127 | function t2s(t) 128 | if not t then 129 | return "" 130 | end 131 | if type(t) == "number" then 132 | t = {t} 133 | end 134 | local s = "" 135 | for _, v in ipairs(t) do 136 | if s ~= "" then 137 | s = s .. " " 138 | end 139 | -- number表示牌或技能 140 | if resmng.check_card(v) then 141 | s = s .. resmng[v].id .. "-" .. resmng[v].name 142 | elseif resmng.check_skill(v) then 143 | s = s .. v .. "-" .. resmng[v] 144 | -- table表示玩家 145 | elseif type(v) == "table" then 146 | s = s .. tostring(v.id) .. "-" .. v.name 147 | end 148 | end 149 | return s 150 | end 151 | 152 | -- 打印对局信息 153 | function print_game_info() 154 | for _, player in ipairs(game.players) do 155 | print_player_info(player) 156 | end 157 | end 158 | 159 | -- 打印玩家信息 160 | function print_player_info(player) 161 | text() 162 | text("ID:%s", player.id) 163 | text("名字:%s", player.name) 164 | text("生命:%d", player.life) 165 | -- text("生命上限:%d", player.life_limit) 166 | -- text("技能:%s", t2s(player.skills)) 167 | -- text("手牌:%s", t2s(player.hand_cards)) 168 | -- text("武器:%s", t2s(player.arm)) 169 | -- text("防具:%s", t2s(player.armor)) 170 | -- text("+1马:%s", t2s(player.add_horse)) 171 | -- text("-1马:%s", t2s(player.sub_horse)) 172 | -- text("判定区:%s", t2s(player.judge_cards)) 173 | 174 | if player.life == player.life_limit then 175 | text("生命上限:%d", player.life_limit) 176 | end 177 | if next(player.skills) then 178 | text("技能:%s", t2s(player.skills)) 179 | end 180 | if next(player.hand_cards) then 181 | text("手牌:%s", t2s(player.hand_cards)) 182 | end 183 | if player.arm then 184 | text("武器:%s", t2s(player.arm)) 185 | end 186 | if player.armor then 187 | text("防具:%s", t2s(player.armor)) 188 | end 189 | if player.add_horse then 190 | text("+1马:%s", t2s(player.add_horse)) 191 | end 192 | if player.sub_horse then 193 | text("-1马:%s", t2s(player.sub_horse)) 194 | end 195 | if next(player.judge_cards) then 196 | text("判定区:%s", t2s(player.judge_cards)) 197 | end 198 | end 199 | 200 | return helper -------------------------------------------------------------------------------- /query.lua: -------------------------------------------------------------------------------- 1 | query = {} 2 | 3 | -- query模块用于获取玩家输入返回给调用者,实现I/O层与逻辑层的分离。 4 | 5 | local str = {} 6 | 7 | query["出牌阶段"] = function (player) 8 | text("你的手牌为:%s", t2s(player.hand_cards)) 9 | local can_use_cards = player:get_can_use_cards() 10 | text("你可用的手牌为:%s", t2s(can_use_cards)) 11 | local can_use_skills = player:get_can_use_skills() 12 | text("你可用的技能为:%s", t2s(can_use_skills)) 13 | while true do 14 | text("请输入您想使用的手牌id或想发动的技能id,输入0结束出牌阶段") 15 | local id = io.read("n") 16 | if helper.element(can_use_cards, id) or helper.element(can_use_skills, id) or id == 0 then 17 | return id 18 | else 19 | text("错误输入,请重新输入") 20 | end 21 | end 22 | end 23 | 24 | query["询问出牌"] = function (cards, skills, card_name, must_use) 25 | while true do 26 | if next(cards) then 27 | text("你可以打出的%s为:%s,请输入你想打出的%sid", card_name, t2s(cards), card_name) 28 | end 29 | if next(skills) then 30 | text("你此时可以发动的技能为:%s,请输入你想发动的技能id", t2s(skills)) 31 | end 32 | if not must_use then 33 | text("输入0不出%s也不发动技能", card_name) 34 | end 35 | local id = io.read("n") 36 | if not must_use and id == 0 or helper.element(cards, id) or helper.element(skills, id) then 37 | return id 38 | else 39 | text("错误输入,请重新输入") 40 | end 41 | end 42 | end 43 | 44 | query["选择一张牌"] = function (cards, reason) 45 | while true do 46 | text("正在结算%s,", reason) 47 | text("你可以选择的牌为%s:", t2s(cards)) 48 | local id = io.read("n") 49 | if helper.element(cards, id) then 50 | return id 51 | else 52 | text("错误输入,请重新输入") 53 | end 54 | end 55 | end 56 | 57 | query["选一张明牌或抽一张暗牌"] = function (hand_cards, other_cards, reason) 58 | while true do 59 | text("正在结算%s,", reason) 60 | if next(other_cards) then 61 | text("你可以选的牌为%s, 请输入你想选的牌id", t2s(other_cards)) 62 | end 63 | if next(hand_cards) then 64 | text("输入0随机选一张手牌") 65 | end 66 | local id = io.read("n") 67 | if helper.element(other_cards, id) or next(hand_cards) and id == 0 then 68 | return id 69 | else 70 | text("错误输入,请重新输入") 71 | end 72 | end 73 | end 74 | 75 | query["选择一名玩家"] = function (targets, reason) 76 | while true do 77 | text("正在结算%s", reason) 78 | text("你可以选的目标有%s, 请输入你想选的目标id", t2s(targets)) 79 | local target_ids = {} 80 | for _, target in ipairs(targets) do 81 | helper.insert(target_ids, target.id) 82 | end 83 | local id = io.read("n") 84 | if helper.element(target_ids, id) then 85 | return game:get_player(id) 86 | else 87 | text("错误输入,请重新输入") 88 | end 89 | end 90 | end 91 | 92 | query["询问发动技能"] = function (skill_name) 93 | while true do 94 | text("是否发动技能:%s,输入1发动,输入0不发动", skill_name) 95 | local id = io.read("n") 96 | if id == 1 then 97 | return true 98 | elseif id == 0 then 99 | return false 100 | else 101 | text("错误输入,请重新输入") 102 | end 103 | end 104 | end 105 | 106 | str["二选一"] = {} 107 | str["二选一"]["是否继续指定杀的目标"] = "你的杀还可以指定目标,输入1继续指定,输入0不指定" 108 | str["二选一"]["是否继续指定抽牌的目标"] = "你还可以抽其他玩家的手牌,输入1继续,输入0退出" 109 | str["二选一"]["雌雄双股剑"] = "输入1弃一张手牌,输入0让对手摸一张牌" 110 | str["二选一"]["享乐"] = "输入1弃置一张基本牌,输入0该杀无效" 111 | str["二选一"]["刚烈"] = "输入1弃置两张手牌,输入0受到一点伤害" 112 | str["二选一"]["狂骨"] = "输入1回复一点体力,输入0摸一张牌" 113 | str["二选一"]["制衡"] = "输入1继续选择制衡的牌,输入0不选择" 114 | str["二选一"]["天香"] = "输入1让目标受到一点伤害,摸损失的体力值的牌,输入0让目标失去一点体力,获得你弃置的牌" 115 | str["二选一"]["英魂"] = "输入1让目标摸n张弃1张,输入0让目标摸1张弃n张,n为你已损失的体力值" 116 | str["二选一"]["观星"] = "输入1把牌放回牌堆顶,输入0把牌放回牌堆底" 117 | str["二选一"]["志继"] = "输入1摸两张牌,输入0回复1点体力" 118 | str["二选一"]["强袭"] = "输入1失去1点体力,输入0弃置1张装备牌" 119 | str["二选一"]["挑衅"] = "输入1对姜维出杀,输入0被姜维弃置1张牌" 120 | str["二选一"]["仁德"] = "输入1继续发动仁德,输入0不发动" 121 | 122 | query["二选一"] = function (reason) 123 | while true do 124 | text(str["二选一"][reason]) 125 | local id = io.read("n") 126 | if id == 1 then 127 | return true 128 | elseif id == 0 then 129 | return false 130 | else 131 | text("错误输入,请重新输入") 132 | end 133 | end 134 | end 135 | 136 | query["选择花色"] = function (suits) 137 | while true do 138 | text("你可以选择的花色为:") 139 | for i, suit in ipairs(suits) do 140 | text("%d-%s", i, get_suit_str(suit)) 141 | end 142 | text("请输入你想选的花色id") 143 | local id = io.read("n") 144 | if id >= 1 and id <= #suits then 145 | return suits[id] 146 | else 147 | text("错误输入,请重新输入") 148 | end 149 | end 150 | end 151 | 152 | query["观星-调整牌序"] = function (cards) 153 | local cards1 = {} 154 | while next(cards) do 155 | text("你可以调整顺序的牌有:%s,输入你想放在第%d位的牌的id", t2s(cards), #cards1 + 1) 156 | local id = io.read("n") 157 | if helper.element(cards, id) then 158 | helper.remove(cards ,id) 159 | helper.insert(cards1 ,id) 160 | else 161 | text("错误输入,请重新输入") 162 | end 163 | text("已调整的牌按顺序排列为:%s", t2s(cards1)) 164 | end 165 | return cards1 166 | end 167 | 168 | query["奇谋"] = function (life) 169 | text("请输入你想失去的体力点数,当前体力为:%d", life) 170 | return io.read("n") 171 | end 172 | 173 | return query -------------------------------------------------------------------------------- /game.lua: -------------------------------------------------------------------------------- 1 | Game = class() 2 | 3 | Game.skill = {} 4 | 5 | function Game:init() 6 | self.players = {} 7 | self.whose_turn = nil -- 当前是谁的回合 8 | self.transfer_delay_tactics = {} -- 记录大乔-国色转化的乐不思蜀 9 | self.settling_card = {} 10 | self.finish = false 11 | self.settle_players = {} -- 回合顺序 12 | 13 | local hero_ids = {} 14 | for i = 1, 4, 1 do 15 | local hero_id = math.random(resmng.hero_finish_id - resmng.hero_start_id + 2 - i) 16 | for _, hero_id1 in ipairs(hero_ids) do 17 | if hero_id >= hero_id1 then 18 | hero_id = hero_id + 1 19 | end 20 | end 21 | helper.insert(hero_ids, hero_id) 22 | table.sort(hero_ids) 23 | hero_id = hero_id + resmng.hero_start_id - 1 24 | local hero_class = require("hero." .. resmng[hero_id].module_name) 25 | local player = hero_class.new(i, hero_id, i) 26 | helper.insert(self.players, player) 27 | helper.insert(player.hand_cards, deck:draw(4)) 28 | end 29 | end 30 | 31 | function Game:get_player(id) 32 | for _, player in ipairs(self.players) do 33 | if player.id == id then 34 | return player 35 | end 36 | end 37 | end 38 | 39 | function Game:get_other_players(player) 40 | local players = {} 41 | for _, player1 in ipairs(self.players) do 42 | if player1 ~= player then 43 | helper.insert(players, player1) 44 | end 45 | end 46 | return players 47 | end 48 | 49 | function Game:compare_points(player1, player2) 50 | local id1 = query["选择一张牌"](player1.hand_cards, "拼点") 51 | helper.remove(player1.hand_cards, id1) 52 | self.skill["失去手牌"](self, player1, player1, "拼点") 53 | local id2 = query["选择一张牌"](player2.hand_cards, "拼点") 54 | helper.remove(player2.hand_cards, id2) 55 | self.skill["失去手牌"](self, player2, player2, "拼点") 56 | text("%s的点数为:%d", player1.name, resmng[id1].points) 57 | text("%s的点数为:%d", player2.name, resmng[id2].points) 58 | helper.insert(deck.discard_pile, {id1, id2}) 59 | return resmng[id1].points > resmng[id2].points 60 | end 61 | 62 | function Game:judge(player, reason) 63 | local id = deck:draw(1) 64 | text("判定牌为%d-%s, 花色为%s, 点数为%d", id, resmng[id].name, get_suit_str(player:get_suit(id)), resmng[id].points) 65 | id = self.skill["改判"](self, player, id, player, reason) 66 | return id 67 | end 68 | 69 | Game.skill["改判"] = function (self, first_settle_player, id, judge_player, reason) 70 | local settle_players = self:get_settle_players(first_settle_player) 71 | for _, settle_player in ipairs(settle_players) do 72 | local id1 = settle_player.skill["改判"](settle_player, id, judge_player, reason) 73 | if id1 then 74 | return self.skill["改判"](self, settle_player, id1, judge_player, reason) 75 | end 76 | end 77 | return id 78 | end 79 | 80 | Game.skill["失去手牌"] = function (self, causer, responder, reason) 81 | local settle_players = self:get_settle_players(self.whose_turn) 82 | for _, player in ipairs(settle_players) do 83 | player.skill["失去手牌"](player, causer, responder, reason) 84 | end 85 | end 86 | 87 | Game.skill["造成伤害时"] = function (self, causer, responder, t) 88 | local settle_players = self:get_settle_players(self.whose_turn) 89 | for _, player in ipairs(settle_players) do 90 | player.skill["造成伤害时"](player, causer, responder, t) 91 | end 92 | end 93 | 94 | Game.skill["受到伤害时"] = function (self, causer, responder, t) 95 | local settle_players = self:get_settle_players(self.whose_turn) 96 | for _, player in ipairs(settle_players) do 97 | player.skill["受到伤害时"](player, causer, responder, t) 98 | end 99 | end 100 | 101 | Game.skill["造成伤害后"] = function (self, causer, responder, t) 102 | local settle_players = self:get_settle_players(self.whose_turn) 103 | for _, player in ipairs(settle_players) do 104 | player.skill["造成伤害后"](player, causer, responder, t) 105 | end 106 | end 107 | 108 | Game.skill["受到伤害后"] = function (self, causer, responder, t) 109 | local settle_players = self:get_settle_players(self.whose_turn) 110 | for _, player in ipairs(settle_players) do 111 | player.skill["受到伤害后"](player, causer, responder, t) 112 | end 113 | end 114 | 115 | function Game:main() 116 | while true do 117 | self.settle_players = self:get_settle_players(self.players[1]) 118 | for _, player in ipairs(self.settle_players) do 119 | if not player:check_alive() then 120 | goto continue 121 | end 122 | if player:check_jump_turn() then 123 | goto continue 124 | end 125 | player:before_turn() 126 | player:turn() 127 | if self.finish then 128 | text("恭喜%s杀死所有敌人,赢得最终胜利!", self.players[1].name) 129 | return 130 | end 131 | player:after_turn() 132 | ::continue:: 133 | end 134 | end 135 | end 136 | 137 | -- 判定牌可能由大乔-国色转换而来,所以要判断下 138 | function Game:get_judge_card_name(id) 139 | if self.transfer_delay_tactics[id] then 140 | return self.transfer_delay_tactics[id] 141 | else 142 | return resmng[id].name 143 | end 144 | end 145 | 146 | -- 获取一个将玩家按照结算顺序依次排列的列表, 147 | -- 比如有玩家1、2、3、4,输入的player参数为玩家3, 148 | -- 则结算列表为{玩家3,玩家4,玩家1,玩家2} 149 | function Game:get_settle_players(player) 150 | local settle_players = {} 151 | for i = player.order, #self.players, 1 do 152 | helper.insert(settle_players, self.players[i]) 153 | end 154 | for i = 1, player.order - 1, 1 do 155 | helper.insert(settle_players, self.players[i]) 156 | end 157 | return settle_players 158 | end 159 | 160 | -- 获取一个将玩家按照结算顺序依次排列的列表, 161 | -- 但列表中不包含player代表的玩家 162 | function Game:get_settle_players_except_self(player) 163 | local settle_players = {} 164 | for i = player.order + 1, #self.players, 1 do 165 | helper.insert(settle_players, self.players[i]) 166 | end 167 | for i = 1, player.order - 1, 1 do 168 | helper.insert(settle_players, self.players[i]) 169 | end 170 | return settle_players 171 | end 172 | 173 | return Game -------------------------------------------------------------------------------- /opt.lua: -------------------------------------------------------------------------------- 1 | opt = {} 2 | 3 | opt["弃置一张牌"] = function (causer, responder, reason, use_hand_cards, use_equip_cards, use_judge_cards, func) 4 | local cards = {} 5 | local hand_cards = {} 6 | local equip_cards = responder:get_equip_cards() 7 | local judge_cards = responder.judge_cards 8 | if use_hand_cards then 9 | hand_cards = responder.hand_cards 10 | end 11 | if causer == responder then 12 | helper.insert(cards, hand_cards) 13 | end 14 | if use_equip_cards then 15 | helper.insert(cards, equip_cards) 16 | end 17 | if use_judge_cards then 18 | helper.insert(cards, judge_cards) 19 | end 20 | if func then 21 | local cards1 = {} 22 | for _, id in ipairs(cards) do 23 | if func(id) then 24 | helper.insert(cards1, id) 25 | end 26 | end 27 | cards = cards1 28 | end 29 | local id 30 | -- 可选的牌包括别人手牌 31 | if causer ~= responder and use_hand_cards then 32 | id = query["选一张明牌或抽一张暗牌"](hand_cards, cards, reason) 33 | -- 所有可选的牌为明牌,即不包括别人手牌 34 | else 35 | id = query["选择一张牌"](cards, reason) 36 | end 37 | -- 弃装备 38 | if helper.element(equip_cards, id) then 39 | responder:take_off_equip(id) 40 | responder.skill["失去装备"](responder) 41 | -- 弃自己手牌 42 | elseif causer == responder and helper.element(hand_cards, id) then 43 | helper.remove(hand_cards, id) 44 | game.skill["失去手牌"](game, causer, responder, "弃置") 45 | -- 弃别人手牌 46 | elseif causer ~= responder and id== 0 then 47 | local n = math.random(#hand_cards) 48 | id = hand_cards[n] 49 | helper.remove(hand_cards, id) 50 | game.skill["失去手牌"](game, causer, responder, "弃置") 51 | -- 弃判定区的牌 52 | elseif helper.element(judge_cards, id) then 53 | helper.remove(judge_cards, id) 54 | end 55 | helper.insert(deck.discard_pile, id) 56 | return id 57 | end 58 | 59 | opt["获得一张牌"] = function (causer, responder, reason, use_hand_cards, use_equip_cards, use_judge_cards) 60 | local cards = {} 61 | local hand_cards = {} 62 | local equip_cards = responder:get_equip_cards() 63 | local judge_cards = responder.judge_cards 64 | if use_hand_cards then 65 | hand_cards = responder.hand_cards 66 | end 67 | if use_equip_cards then 68 | helper.insert(cards, equip_cards) 69 | end 70 | if use_judge_cards then 71 | helper.insert(cards, judge_cards) 72 | end 73 | local id 74 | -- 可选的牌包括别人手牌 75 | if causer ~= responder and use_hand_cards then 76 | id = query["选一张明牌或抽一张暗牌"](hand_cards, cards, reason) 77 | -- 所有可选的牌为明牌,即不包括别人手牌 78 | else 79 | id = query["选择一张牌"](cards, reason) 80 | end 81 | -- 拿装备 82 | if helper.element(equip_cards, id) then 83 | responder:take_off_equip(id) 84 | responder.skill["失去装备"](responder) 85 | -- 拿别人手牌 86 | elseif id == 0 then 87 | local n = math.random(#hand_cards) 88 | id = hand_cards[n] 89 | helper.remove(hand_cards, id) 90 | game.skill["失去手牌"](game, causer, responder, "获得") 91 | -- 拿判定区的牌 92 | elseif helper.element(judge_cards, id) then 93 | helper.remove(judge_cards, id) 94 | end 95 | helper.insert(causer.hand_cards, id) 96 | end 97 | 98 | opt["弃置n张牌"] = function(causer, responder, reason, use_hand_cards, use_equip_cards, n, func) 99 | local ids = {} 100 | local discard_hand = nil 101 | if causer == responder then 102 | local cards = {} 103 | local equip_cards = responder:get_equip_cards() 104 | if use_hand_cards then 105 | helper.insert(cards, responder.hand_cards) 106 | end 107 | if use_equip_cards then 108 | helper.insert(cards, equip_cards) 109 | end 110 | if func then 111 | local cards1 = {} 112 | for _, id in ipairs(cards) do 113 | if func(id) then 114 | helper.insert(cards1, id) 115 | end 116 | end 117 | cards = cards1 118 | end 119 | for _ = 1, n, 1 do 120 | local id = query["选择一张牌"](cards, reason) 121 | helper.remove(cards, id) 122 | if helper.element(equip_cards, id) then 123 | responder:take_off_equip(id) 124 | else 125 | helper.remove(responder.hand_cards, id) 126 | discard_hand = true 127 | end 128 | helper.insert(ids, id) 129 | end 130 | if discard_hand then 131 | game.skill["失去手牌"](game, causer, responder, "弃置") 132 | end 133 | for _, id in ipairs(ids) do 134 | if helper.element(equip_cards, id) then 135 | responder.skill["失去装备"](responder) 136 | end 137 | end 138 | else 139 | local cards 140 | local hand_cards = {} 141 | local equip_cards = responder:get_equip_cards() 142 | if use_hand_cards then 143 | helper.insert(hand_cards, responder.hand_cards) 144 | end 145 | if use_equip_cards then 146 | helper.insert(cards, equip_cards) 147 | end 148 | if func then 149 | local hand_cards1 = {} 150 | for _, id in ipairs(hand_cards) do 151 | if func(id) then 152 | helper.insert(hand_cards1, id) 153 | end 154 | end 155 | hand_cards = hand_cards1 156 | local cards1 = {} 157 | for _, id in ipairs(cards) do 158 | if func(id) then 159 | helper.insert(cards1, id) 160 | end 161 | end 162 | cards = cards1 163 | end 164 | for _ = 1, n, 1 do 165 | local id = query["选一张明牌或抽一张暗牌"](hand_cards, cards, reason) 166 | if helper.element(cards, id) then 167 | responder:take_off_equip(id) 168 | helper.remove(cards, id) 169 | else 170 | local n1 = math.random(#hand_cards) 171 | id = hand_cards[n1] 172 | helper.remove(responder.hand_cards, id) 173 | helper.remove(hand_cards, id) 174 | discard_hand = true 175 | end 176 | helper.insert(ids, id) 177 | end 178 | if discard_hand then 179 | game.skill["失去手牌"](game, causer, responder, "弃置") 180 | end 181 | for _, id in ipairs(ids) do 182 | if helper.element(equip_cards, id) then 183 | responder.skill["失去装备"](responder) 184 | end 185 | end 186 | end 187 | helper.insert(deck.discard_pile, ids) 188 | return ids 189 | end 190 | -------------------------------------------------------------------------------- /resmng.lua: -------------------------------------------------------------------------------- 1 | -- 配置文件 2 | resmng = {} 3 | 4 | resmng.card_start_id = 1 5 | resmng.card_finish_id= 108 6 | resmng.hero_start_id = 201 7 | resmng.hero_finish_id= 253 8 | resmng.skill_start_id = 301 9 | resmng.skill_finish_id= 396 10 | 11 | -- 牌的配置 12 | resmng[1] = {name = "杀", type = "basic", suit = 0, points = 7, id = 1} 13 | resmng[2] = {name = "杀", type = "basic", suit = 0, points = 8, id = 2} 14 | resmng[3] = {name = "杀", type = "basic", suit = 0, points = 8, id = 3} 15 | resmng[4] = {name = "杀", type = "basic", suit = 0, points = 9, id = 4} 16 | resmng[5] = {name = "杀", type = "basic", suit = 0, points = 9, id = 5} 17 | resmng[6] = {name = "杀", type = "basic", suit = 0, points = 10, id = 6} 18 | resmng[7] = {name = "杀", type = "basic", suit = 0, points = 10, id = 7} 19 | resmng[8] = {name = "杀", type = "basic", suit = 2, points = 2, id = 8} 20 | resmng[9] = {name = "杀", type = "basic", suit = 2, points = 3, id = 9} 21 | resmng[10] = {name = "杀", type = "basic", suit = 2, points = 4, id = 10} 22 | resmng[11] = {name = "杀", type = "basic", suit = 2, points = 5, id = 11} 23 | resmng[12] = {name = "杀", type = "basic", suit = 2, points = 6, id = 12} 24 | resmng[13] = {name = "杀", type = "basic", suit = 2, points = 7, id = 13} 25 | resmng[14] = {name = "杀", type = "basic", suit = 2, points = 8, id = 14} 26 | resmng[15] = {name = "杀", type = "basic", suit = 2, points = 8, id = 15} 27 | resmng[16] = {name = "杀", type = "basic", suit = 2, points = 9, id = 16} 28 | resmng[17] = {name = "杀", type = "basic", suit = 2, points = 9, id = 17} 29 | resmng[18] = {name = "杀", type = "basic", suit = 2, points = 10, id = 18} 30 | resmng[19] = {name = "杀", type = "basic", suit = 2, points = 10, id = 19} 31 | resmng[20] = {name = "杀", type = "basic", suit = 2, points = 11, id = 20} 32 | resmng[21] = {name = "杀", type = "basic", suit = 2, points = 11, id = 21} 33 | resmng[22] = {name = "杀", type = "basic", suit = 1, points = 10, id = 22} 34 | resmng[23] = {name = "杀", type = "basic", suit = 1, points = 10, id = 23} 35 | resmng[24] = {name = "杀", type = "basic", suit = 1, points = 11, id = 24} 36 | resmng[25] = {name = "杀", type = "basic", suit = 3, points = 6, id = 25} 37 | resmng[26] = {name = "杀", type = "basic", suit = 3, points = 7, id = 26} 38 | resmng[27] = {name = "杀", type = "basic", suit = 3, points = 8, id = 27} 39 | resmng[28] = {name = "杀", type = "basic", suit = 3, points = 9, id = 28} 40 | resmng[29] = {name = "杀", type = "basic", suit = 3, points = 10, id = 29} 41 | resmng[30] = {name = "杀", type = "basic", suit = 3, points = 13, id = 30} 42 | resmng[31] = {name = "闪", type = "basic", suit = 1, points = 2, id = 31} 43 | resmng[32] = {name = "闪", type = "basic", suit = 1, points = 2, id = 32} 44 | resmng[33] = {name = "闪", type = "basic", suit = 1, points = 13, id = 33} 45 | resmng[34] = {name = "闪", type = "basic", suit = 3, points = 2, id = 34} 46 | resmng[35] = {name = "闪", type = "basic", suit = 3, points = 2, id = 35} 47 | resmng[36] = {name = "闪", type = "basic", suit = 3, points = 3, id = 36} 48 | resmng[37] = {name = "闪", type = "basic", suit = 3, points = 4, id = 37} 49 | resmng[38] = {name = "闪", type = "basic", suit = 3, points = 5, id = 38} 50 | resmng[39] = {name = "闪", type = "basic", suit = 3, points = 6, id = 39} 51 | resmng[40] = {name = "闪", type = "basic", suit = 3, points = 7, id = 40} 52 | resmng[41] = {name = "闪", type = "basic", suit = 3, points = 8, id = 41} 53 | resmng[42] = {name = "闪", type = "basic", suit = 3, points = 9, id = 42} 54 | resmng[43] = {name = "闪", type = "basic", suit = 3, points = 10, id = 43} 55 | resmng[44] = {name = "闪", type = "basic", suit = 3, points = 11, id = 44} 56 | resmng[45] = {name = "闪", type = "basic", suit = 3, points = 11, id = 45} 57 | resmng[46] = {name = "桃", type = "basic", suit = 1, points = 3, id = 46} 58 | resmng[47] = {name = "桃", type = "basic", suit = 1, points = 4, id = 47} 59 | resmng[48] = {name = "桃", type = "basic", suit = 1, points = 6, id = 48} 60 | resmng[49] = {name = "桃", type = "basic", suit = 1, points = 7, id = 49} 61 | resmng[50] = {name = "桃", type = "basic", suit = 1, points = 8, id = 50} 62 | resmng[51] = {name = "桃", type = "basic", suit = 1, points = 9, id = 51} 63 | resmng[52] = {name = "桃", type = "basic", suit = 1, points = 12, id = 52} 64 | resmng[53] = {name = "桃", type = "basic", suit = 3, points = 12, id = 53} 65 | resmng[54] = {name = "南蛮入侵", type = "tactic", suit = 0, points = 7, id = 54} 66 | resmng[55] = {name = "南蛮入侵", type = "tactic", suit = 0, points = 13, id = 55} 67 | resmng[56] = {name = "南蛮入侵", type = "tactic", suit = 2, points = 7, id = 56} 68 | resmng[57] = {name = "万箭齐发", type = "tactic", suit = 1, points = 1, id = 57} 69 | resmng[58] = {name = "桃园结义", type = "tactic", suit = 1, points = 1, id = 58} 70 | resmng[59] = {name = "五谷丰登", type = "tactic", suit = 1, points = 3, id = 59} 71 | resmng[60] = {name = "五谷丰登", type = "tactic", suit = 1, points = 4, id = 60} 72 | resmng[61] = {name = "闪电", type = "tactic", suit = 0, points = 1, id = 61} 73 | resmng[62] = {name = "闪电", type = "tactic", suit = 1, points = 12, id = 62} 74 | resmng[63] = {name = "乐不思蜀", type = "tactic", suit = 0, points = 6, id = 63} 75 | resmng[64] = {name = "乐不思蜀", type = "tactic", suit = 1, points = 6, id = 64} 76 | resmng[65] = {name = "乐不思蜀", type = "tactic", suit = 2, points = 6, id = 65} 77 | resmng[66] = {name = "无懈可击", type = "tactic", suit = 0, points = 11, id = 66} 78 | resmng[67] = {name = "无懈可击", type = "tactic", suit = 2, points = 12, id = 67} 79 | resmng[68] = {name = "无懈可击", type = "tactic", suit = 2, points = 13, id = 68} 80 | resmng[69] = {name = "无懈可击", type = "tactic", suit = 3, points = 12, id = 69} 81 | resmng[70] = {name = "顺手牵羊", type = "tactic", suit = 0, points = 3, id = 70} 82 | resmng[71] = {name = "顺手牵羊", type = "tactic", suit = 0, points = 4, id = 71} 83 | resmng[72] = {name = "顺手牵羊", type = "tactic", suit = 0, points = 11, id = 72} 84 | resmng[73] = {name = "顺手牵羊", type = "tactic", suit = 3, points = 3, id = 73} 85 | resmng[74] = {name = "顺手牵羊", type = "tactic", suit = 3, points = 4, id = 74} 86 | resmng[75] = {name = "过河拆桥", type = "tactic", suit = 0, points = 3, id = 75} 87 | resmng[76] = {name = "过河拆桥", type = "tactic", suit = 0, points = 4, id = 76} 88 | resmng[77] = {name = "过河拆桥", type = "tactic", suit = 0, points = 12, id = 77} 89 | resmng[78] = {name = "过河拆桥", type = "tactic", suit = 1, points = 12, id = 78} 90 | resmng[79] = {name = "过河拆桥", type = "tactic", suit = 2, points = 3, id = 79} 91 | resmng[80] = {name = "过河拆桥", type = "tactic", suit = 2, points = 4, id = 80} 92 | resmng[81] = {name = "决斗", type = "tactic", suit = 0, points = 1, id = 81} 93 | resmng[82] = {name = "决斗", type = "tactic", suit = 2, points = 1, id = 82} 94 | resmng[83] = {name = "决斗", type = "tactic", suit = 3, points = 1, id = 83} 95 | resmng[84] = {name = "无中生有", type = "tactic", suit = 1, points = 7, id = 84} 96 | resmng[85] = {name = "无中生有", type = "tactic", suit = 1, points = 8, id = 85} 97 | resmng[86] = {name = "无中生有", type = "tactic", suit = 1, points = 9, id = 86} 98 | resmng[87] = {name = "无中生有", type = "tactic", suit = 1, points = 11, id = 87} 99 | resmng[88] = {name = "借刀杀人", type = "tactic", suit = 2, points = 12, id = 88} 100 | resmng[89] = {name = "借刀杀人", type = "tactic", suit = 2, points = 13, id = 89} 101 | resmng[90] = {name = "诸葛连弩", type = "arm", range = 1, skill = 386, suit = 2, points = 1, id = 90} 102 | resmng[91] = {name = "诸葛连弩", type = "arm", range = 1, skill = 386, suit = 3, points = 1, id = 91} 103 | resmng[92] = {name = "寒冰剑", type = "arm", range = 2, skill = 387, suit = 0, points = 2, id = 92} 104 | resmng[93] = {name = "青釭剑", type = "arm", range = 2, skill = 388, suit = 0, points = 6, id = 93} 105 | resmng[94] = {name = "雌雄双股剑", type = "arm", range = 2, skill = 389, suit = 0, points = 2, id = 94} 106 | resmng[95] = {name = "贯石斧", type = "arm", range = 3, skill = 390, suit = 3, points = 5, id = 95} 107 | resmng[96] = {name = "青龙偃月刀", type = "arm", range = 3, skill = 391, suit = 0, points = 5, id = 96} 108 | resmng[97] = {name = "丈八蛇矛", type = "arm", range = 3, skill = 392, suit = 0, points = 12, id = 97} 109 | resmng[98] = {name = "方天画戟", type = "arm", range = 4, skill = 393, suit = 3, points = 12, id = 98} 110 | resmng[99] = {name = "麒麟弓", type = "arm", range = 5, skill = 394, suit = 1, points = 5, id = 99} 111 | resmng[100] = {name = "八卦阵", type = "armor", skill = 395, suit = 0, points = 2, id = 100} 112 | resmng[101] = {name = "八卦阵", type = "armor", skill = 395, suit = 2, points = 2, id = 101} 113 | resmng[102] = {name = "仁王盾", type = "armor", skill = 396, suit = 2, points = 2, id = 102} 114 | resmng[103] = {name = "的卢", type = "add_horse", suit = 2, points = 5, id = 103} 115 | resmng[104] = {name = "绝影", type = "add_horse", suit = 0, points = 5, id = 104} 116 | resmng[105] = {name = "爪黄飞电", type = "add_horse", suit = 1, points = 13, id = 105} 117 | resmng[106] = {name = "赤兔", type = "sub_horse", suit = 1, points = 5, id = 106} 118 | resmng[107] = {name = "紫骍", type = "sub_horse", suit = 3, points = 13, id = 107} 119 | resmng[108] = {name = "大宛", type = "sub_horse", suit = 0, points = 13, id = 108} 120 | 121 | -- 武将配置 122 | resmng[201] = {name = "黄月英", module_name = "huang_yue_ying", life = 3, sex = "woman", skills = {301, 302}} 123 | resmng[202] = {name = "关羽", module_name = "guan_yu", life = 4, sex = "man", skills = {303}} 124 | resmng[203] = {name = "刘备", module_name = "liu_bei", life = 4, sex = "man", skills = {304}} 125 | resmng[204] = {name = "张飞", module_name = "zhang_fei", life = 4, sex = "man", skills = {305}} 126 | resmng[205] = {name = "诸葛亮", module_name = "zhu_ge_liang", life = 3, sex = "man", skills = {306, 307}} 127 | resmng[206] = {name = "赵云", module_name = "zhao_yun", life = 4, sex = "man", skills = {308}} 128 | resmng[207] = {name = "马超", module_name = "ma_chao", life = 4, sex = "man", skills = {309, 310}} 129 | resmng[208] = {name = "甄姬", module_name = "zhen_ji", life = 3, sex = "woman", skills = {311, 312}} 130 | resmng[209] = {name = "司马懿", module_name = "si_ma_yi", life = 3, sex = "man", skills = {313, 314}} 131 | resmng[210] = {name = "夏侯惇", module_name = "xia_hou_dun", life = 4, sex = "man", skills = {315}} 132 | resmng[211] = {name = "张辽", module_name = "zhang_liao", life = 4, sex = "man", skills = {316}} 133 | resmng[212] = {name = "曹操", module_name = "cao_cao", life = 4, sex = "man", skills = {317}} 134 | resmng[213] = {name = "许褚", module_name = "xv_chu", life = 4, sex = "man", skills = {318}} 135 | resmng[214] = {name = "郭嘉", module_name = "guo_jia", life = 3, sex = "man", skills = {319, 320}} 136 | resmng[215] = {name = "大乔", module_name = "da_qiao", life = 3, sex = "woman", skills = {321, 322}} 137 | resmng[216] = {name = "孙尚香", module_name = "sun_shang_xiang", life = 3, sex = "woman", skills = {323, 324}} 138 | resmng[217] = {name = "吕蒙", module_name = "lv_meng", life = 4, sex = "man", skills = {325}} 139 | resmng[218] = {name = "周瑜", module_name = "zhou_yu", life = 3, sex = "man", skills = {326, 327}} 140 | resmng[219] = {name = "孙权", module_name = "sun_quan", life = 4, sex = "man", skills = {328}} 141 | resmng[220] = {name = "甘宁", module_name = "gan_ning", life = 4, sex = "man", skills = {329}} 142 | resmng[221] = {name = "陆逊", module_name = "lu_xvn", life = 3, sex = "man", skills = {330, 331}} 143 | resmng[222] = {name = "黄盖", module_name = "huang_gai", life = 4, sex = "man", skills = {332}} 144 | resmng[223] = {name = "貂蝉", module_name = "diao_chan", life = 3, sex = "woman", skills = {333, 334}} 145 | resmng[224] = {name = "华佗", module_name = "hua_tuo", life = 3, sex = "man", skills = {335, 336}} 146 | resmng[225] = {name = "吕布", module_name = "lv_bu", life = 4, sex = "man", skills = {337}} 147 | resmng[226] = {name = "魏延", module_name = "wei_yan", life = 4, sex = "man", skills = {338, 339}} 148 | resmng[227] = {name = "黄忠", module_name = "huang_zhong", life = 4, sex = "man", skills = {340}} 149 | resmng[228] = {name = "夏侯渊", module_name = "xia_hou_yuan", life = 4, sex = "man", skills = {341}} 150 | resmng[229] = {name = "曹仁", module_name = "cao_ren", life = 4, sex = "man", skills = {342, 343}} 151 | resmng[230] = {name = "小乔", module_name = "xiao_qiao", life = 3, sex = "woman", skills = {344, 345}} 152 | resmng[231] = {name = "周泰", module_name = "zhou_tai", life = 4, sex = "man", skills = {346, 347}} 153 | resmng[232] = {name = "张角", module_name = "zhang_jiao", life = 3, sex = "man", skills = {348, 349}} 154 | resmng[233] = {name = "卧龙诸葛", module_name = "wo_long_zhu_ge", life = 3, sex = "man", skills = {350, 351}} 155 | resmng[234] = {name = "庞统", module_name = "pang_tong", life = 3, sex = "man", skills = {352}} 156 | resmng[235] = {name = "典韦", module_name = "dian_wei", life = 4, sex = "man", skills = {353}} 157 | resmng[236] = {name = "荀彧", module_name = "xvn_yu", life = 3, sex = "man", skills = {354, 355}} 158 | resmng[237] = {name = "太史慈", module_name = "tai_shi_ci", life = 4, sex = "man", skills = {356}} 159 | resmng[238] = {name = "庞德", module_name = "pang_de", life = 4, sex = "man", skills = {309, 357}} 160 | resmng[239] = {name = "袁绍", module_name = "yuan_shao", life = 4, sex = "man", skills = {358}} 161 | resmng[240] = {name = "颜良文丑", module_name = "yan_liang_wen_chou", life = 4, sex = "man", skills = {359}} 162 | resmng[241] = {name = "祝融", module_name = "zhu_rong", life = 4, sex = "woman", skills = {360, 361}} 163 | resmng[242] = {name = "孟获", module_name = "meng_huo", life = 4, sex = "man", skills = {362, 363}} 164 | resmng[243] = {name = "曹丕", module_name = "cao_pi", life = 3, sex = "man", skills = {364, 365}} 165 | resmng[244] = {name = "孙坚", module_name = "sun_jian", life = 4, sex = "man", skills = {366}} 166 | resmng[245] = {name = "鲁肃", module_name = "lu_su", life = 3, sex = "man", skills = {367, 368}} 167 | resmng[246] = {name = "贾诩", module_name = "jia_xv", life = 3, sex = "man", skills = {369, 370, 371}} 168 | resmng[247] = {name = "刘禅", module_name = "liu_shan", life = 3, sex = "man", skills = {372, 373}} 169 | resmng[248] = {name = "姜维", module_name = "jiang_wei", life = 4, sex = "man", skills = {374, 375}} 170 | resmng[249] = {name = "张郃", module_name = "zhang_he", life = 4, sex = "man", skills = {376}} 171 | resmng[250] = {name = "邓艾", module_name = "deng_ai", life = 4, sex = "man", skills = {377, 378}} 172 | resmng[251] = {name = "孙策", module_name = "sun_ce", life = 4, sex = "man", skills = {380, 381}} 173 | resmng[252] = {name = "张昭张纮", module_name = "zhang_zhao_zhang_hong", life = 3, sex = "man", skills = {382, 383}} 174 | resmng[253] = {name = "蔡文姬", module_name = "cai_wen_ji", life = 3, sex = "woman", skills = {384, 385}} 175 | 176 | -- 技能配置 177 | resmng[301] = "集智" 178 | resmng[302] = "奇才" 179 | resmng[303] = "武圣" 180 | resmng[304] = "仁德" 181 | resmng[305] = "咆哮" 182 | resmng[306] = "观星" 183 | resmng[307] = "空城" 184 | resmng[308] = "龙胆" 185 | resmng[309] = "马术" 186 | resmng[310] = "铁骑" 187 | resmng[311] = "倾国" 188 | resmng[312] = "洛神" 189 | resmng[313] = "反馈" 190 | resmng[314] = "鬼才" 191 | resmng[315] = "刚烈" 192 | resmng[316] = "突袭" 193 | resmng[317] = "奸雄" 194 | resmng[318] = "裸衣" 195 | resmng[319] = "天妒" 196 | resmng[320] = "遗计" 197 | resmng[321] = "国色" 198 | resmng[322] = "流离" 199 | resmng[323] = "结姻" 200 | resmng[324] = "枭姬" 201 | resmng[325] = "克己" 202 | resmng[326] = "英姿" 203 | resmng[327] = "反间" 204 | resmng[328] = "制衡" 205 | resmng[329] = "奇袭" 206 | resmng[330] = "谦逊" 207 | resmng[331] = "连营" 208 | resmng[332] = "苦肉" 209 | resmng[333] = "离间" 210 | resmng[334] = "闭月" 211 | resmng[335] = "急救" 212 | resmng[336] = "青囊" 213 | resmng[337] = "无双" 214 | resmng[338] = "狂骨" 215 | resmng[339] = "奇谋" 216 | resmng[340] = "烈弓" 217 | resmng[341] = "神速" 218 | resmng[342] = "据守" 219 | resmng[343] = "解围" 220 | resmng[344] = "天香" 221 | resmng[345] = "红颜" 222 | resmng[346] = "不屈" 223 | resmng[347] = "奋激" 224 | resmng[348] = "雷击" 225 | resmng[349] = "鬼道" 226 | resmng[350] = "八阵" 227 | resmng[351] = "看破" 228 | resmng[352] = "涅槃" 229 | resmng[353] = "强袭" 230 | resmng[354] = "驱虎" 231 | resmng[355] = "节命" 232 | resmng[356] = "天义" 233 | resmng[357] = "鞬出" 234 | resmng[358] = "乱击" 235 | resmng[359] = "双雄" 236 | resmng[360] = "巨象" 237 | resmng[361] = "烈刃" 238 | resmng[362] = "祸首" 239 | resmng[363] = "再起" 240 | resmng[364] = "行殇" 241 | resmng[365] = "放逐" 242 | resmng[366] = "英魂" 243 | resmng[367] = "好施" 244 | resmng[368] = "缔盟" 245 | resmng[369] = "完杀" 246 | resmng[370] = "乱武" 247 | resmng[371] = "帷幕" 248 | resmng[372] = "享乐" 249 | resmng[373] = "放权" 250 | resmng[374] = "挑衅" 251 | resmng[375] = "志继" 252 | resmng[376] = "巧变" 253 | resmng[377] = "屯田" 254 | resmng[378] = "凿险" 255 | resmng[379] = "急袭" 256 | resmng[380] = "激昂" 257 | resmng[381] = "魂姿" 258 | resmng[382] = "直谏" 259 | resmng[383] = "固政" 260 | resmng[384] = "悲歌" 261 | resmng[385] = "断肠" 262 | resmng[386] = "诸葛连弩" 263 | resmng[387] = "寒冰剑" 264 | resmng[388] = "青釭剑" 265 | resmng[389] = "雌雄双股剑" 266 | resmng[390] = "贯石斧" 267 | resmng[391] = "青龙偃月刀" 268 | resmng[392] = "丈八蛇矛" 269 | resmng[393] = "方天画戟" 270 | resmng[394] = "麒麟弓" 271 | resmng[395] = "八卦阵" 272 | resmng[396] = "仁王盾" 273 | 274 | function resmng.check_card(id) 275 | if resmng[id] and id >= resmng.card_start_id and id <= resmng.card_finish_id then 276 | return true 277 | end 278 | end 279 | 280 | function resmng.check_skill(id) 281 | if resmng[id] and id >= resmng.skill_start_id and id <= resmng.skill_finish_id then 282 | return true 283 | end 284 | end 285 | 286 | function resmng.get_skill_id(skill_name) 287 | for id = resmng.skill_start_id, resmng.skill_finish_id, 1 do 288 | if resmng[id] == skill_name then 289 | return id 290 | end 291 | end 292 | end -------------------------------------------------------------------------------- /test.lua: -------------------------------------------------------------------------------- 1 | require("class") 2 | require("deck") 3 | require("game") 4 | require("helper") 5 | require("macro") 6 | require("opt") 7 | require("player") 8 | require("query") 9 | require("resmng") 10 | 11 | function new_test_hero(hero_id) 12 | local hero_class = require("hero." .. resmng[hero_id].module_name) 13 | local player = hero_class.new(#game.players + 1, hero_id, #game.players + 1) 14 | helper.insert(game.players, player) 15 | return player 16 | end 17 | 18 | function new_player_no_skill() 19 | local player = Player.new(#game.players + 1, 220, #game.players + 1) 20 | helper.clear(player.skills) 21 | helper.insert(game.players, player) 22 | helper.insert(player.hand_cards, deck:draw(4)) 23 | return player 24 | end 25 | 26 | deck = Deck:new() 27 | game = Game:new() 28 | 29 | deck:init() 30 | game:init() 31 | 32 | -- game模块测试 33 | -- game.whose_turn = game.players[2] 34 | -- local player2 = game:get_player(2) 35 | -- print(player2.id, player2.name) 36 | -- local other_players = game:get_other_players(player2) 37 | -- for _, player in ipairs(other_players) do 38 | -- print(player.id, player.name) 39 | -- end 40 | -- local player1 = game:get_player(1) 41 | -- helper.insert(player1.hand_cards, 13) 42 | -- helper.insert(player2.hand_cards, 13) 43 | -- for _ = 1, 3, 1 do 44 | -- print_player_info(player1) 45 | -- print_player_info(player2) 46 | -- print(game:compare_points(player1, player2)) 47 | -- print(deck.discard_pile[#deck.discard_pile], deck.discard_pile[#deck.discard_pile - 1]) 48 | -- print_player_info(player1) 49 | -- print_player_info(player2) 50 | -- end 51 | -- print(game:get_judge_card_name(1)) 52 | -- game.transfer_delay_tactics[1] = "乐不思蜀" 53 | -- print(game:get_judge_card_name(1)) 54 | -- local settle_players = game:get_settle_players(player2) 55 | -- for _, player in ipairs(settle_players) do 56 | -- print(player.id, player.name) 57 | -- end 58 | -- local settle_players = game:get_settle_players_except_self(player2) 59 | -- for _, player in ipairs(settle_players) do 60 | -- print(player.id, player.name) 61 | -- end 62 | 63 | -- player模块测试 64 | -- local player1 = game.players[1] 65 | -- local player2 = game.players[2] 66 | -- local player3 = game.players[3] 67 | -- local player4 = game.players[4] 68 | -- helper.clear(player1.hand_cards) 69 | -- helper.clear(player2.hand_cards) 70 | -- helper.clear(player3.hand_cards) 71 | -- helper.clear(player4.hand_cards) 72 | -- game.whose_turn = player1 73 | -- player1.life = -11 74 | -- helper.insert(player1.judge_cards, 61) 75 | -- table.insert(deck.card_pile, 1, 1) 76 | -- helper.insert(player1.hand_cards, {75}) 77 | -- helper.insert(player2.hand_cards, {46}) 78 | -- helper.insert(player3.hand_cards, {66, 66, 66}) 79 | -- helper.insert(player4.hand_cards, {66, 66}) 80 | -- player1:play() 81 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 82 | 83 | -- -- 黄月英测试 84 | -- local player1 = new_test_hero(201) 85 | -- game.whose_turn = player1 86 | -- helper.insert(player1.hand_cards, {70, 63, 66}) 87 | -- local player2 = new_player_no_skill() 88 | -- helper.insert(player2, 57) 89 | -- -- player1.flags["跳过判定"] = true 90 | -- -- player1.flags["跳过摸牌"] = true 91 | -- -- player1.flags["跳过弃牌"] = true 92 | -- -- player1:before_turn() 93 | -- -- player1:turn() 94 | -- -- player1:after_turn() 95 | -- player2.flags["跳过判定"] = true 96 | -- player2.flags["跳过摸牌"] = true 97 | -- player2.flags["跳过弃牌"] = true 98 | -- player2:before_turn() 99 | -- player2:turn() 100 | -- player2:after_turn() 101 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 102 | 103 | -- 关羽测试 104 | -- local player1 = new_test_hero(202) 105 | -- game.whose_turn = player1 106 | -- helper.insert(player1.hand_cards, {1, 45, 45, 45, 45, 45, 91}) 107 | -- local player2 = new_player_no_skill() 108 | -- helper.insert(player2.hand_cards, {54, 81, 1, 1}) 109 | -- player2.life = 10 110 | -- player1.flags["跳过判定"] = true 111 | -- player1.flags["跳过摸牌"] = true 112 | -- player1.flags["跳过弃牌"] = true 113 | -- player1:before_turn() 114 | -- player1:turn() 115 | -- player1:after_turn() 116 | -- player2:before_turn() 117 | -- player2:turn() 118 | -- player2:after_turn() 119 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 120 | 121 | -- 刘备测试 122 | -- local player1 = new_test_hero(203) 123 | -- player1.life = 3 124 | -- game.whose_turn = player1 125 | -- helper.insert(player1.hand_cards, {1, 45, 45, 45, 45, 45, 91, 23}) 126 | -- local player2 = new_player_no_skill() 127 | -- player1.flags["跳过判定"] = true 128 | -- player1.flags["跳过摸牌"] = true 129 | -- player1.flags["跳过弃牌"] = true 130 | -- player1:before_turn() 131 | -- player1:turn() 132 | -- player1:after_turn() 133 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 134 | 135 | -- 张飞测试 136 | -- local player1 = new_test_hero(204) 137 | -- game.whose_turn = player1 138 | -- helper.insert(player1.hand_cards, {1, 1, 1, 1}) 139 | -- local player2 = new_player_no_skill() 140 | -- player1.flags["跳过判定"] = true 141 | -- player1.flags["跳过摸牌"] = true 142 | -- player1.flags["跳过弃牌"] = true 143 | -- player1:before_turn() 144 | -- player1:turn() 145 | -- player1:after_turn() 146 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 147 | 148 | -- 诸葛亮测试 149 | -- local player1 = new_test_hero(205) 150 | -- player1.life = 3 151 | -- game.whose_turn = player1 152 | -- local player2 = new_player_no_skill() 153 | -- helper.insert(player2.hand_cards, {1, 81}) 154 | -- local player3 = new_player_no_skill() 155 | -- local player4 = new_player_no_skill() 156 | -- -- player2.flags["跳过判定"] = true 157 | -- -- player2.flags["跳过摸牌"] = true 158 | -- -- player2.flags["跳过弃牌"] = true 159 | -- -- player2:before_turn() 160 | -- -- player2:turn() 161 | -- -- player2:after_turn() 162 | -- -- helper.insert(player1.hand_cards, 3) 163 | -- -- player2.flags["跳过判定"] = true 164 | -- -- player2.flags["跳过摸牌"] = true 165 | -- -- player2.flags["跳过弃牌"] = true 166 | -- -- player2:before_turn() 167 | -- -- player2:turn() 168 | -- -- player2:after_turn() 169 | -- player1.flags["跳过判定"] = true 170 | -- player1.flags["跳过弃牌"] = true 171 | -- player1:before_turn() 172 | -- player1:turn() 173 | -- player1:after_turn() 174 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 175 | -- text("牌堆底:%s", t2s({ deck.card_pile[#deck.card_pile - 3], deck.card_pile[#deck.card_pile - 2], deck.card_pile[#deck.card_pile - 1], deck.card_pile[#deck.card_pile]})) 176 | 177 | -- 赵云测试 178 | -- local player1 = new_test_hero(206) 179 | -- game.whose_turn = player1 180 | -- helper.insert(player1.hand_cards, {1, 45, 45, 45, 45, 45}) 181 | -- local player2 = new_player_no_skill() 182 | -- helper.insert(player2.hand_cards, {54, 81, 1, 57}) 183 | -- player1.flags["跳过判定"] = true 184 | -- player1.flags["跳过摸牌"] = true 185 | -- player1.flags["跳过弃牌"] = true 186 | -- player1:before_turn() 187 | -- player1:turn() 188 | -- player1:after_turn() 189 | -- player2:before_turn() 190 | -- player2:turn() 191 | -- player2:after_turn() 192 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 193 | 194 | -- -- 马超测试 195 | -- local player1 = new_test_hero(207) 196 | -- game.whose_turn = player1 197 | -- helper.insert(player1.hand_cards, {1, 1, 91, 70}) 198 | -- local player2 = new_player_no_skill() 199 | -- helper.insert(player2.hand_cards, {45, 45}) 200 | -- player2:put_on_equip(105) 201 | -- table.insert(deck.card_pile, 1, 47) 202 | -- table.insert(deck.card_pile, 2, 54) 203 | -- player1.flags["跳过判定"] = true 204 | -- player1.flags["跳过摸牌"] = true 205 | -- player1.flags["跳过弃牌"] = true 206 | -- player1:before_turn() 207 | -- player1:turn() 208 | -- player1:after_turn() 209 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 210 | 211 | -- -- 甄姬测试 212 | -- local player1 = new_test_hero(208) 213 | -- helper.insert(player1.hand_cards, {}) 214 | -- local player2 = new_player_no_skill() 215 | -- helper.insert(player2.hand_cards, {1, 57}) 216 | -- table.insert(deck.card_pile, 1, 1) 217 | -- table.insert(deck.card_pile, 2, 1) 218 | -- table.insert(deck.card_pile, 3, 56) 219 | -- table.insert(deck.card_pile, 4, 48) 220 | -- player1.flags["跳过判定"] = true 221 | -- player1.flags["跳过摸牌"] = true 222 | -- player1.flags["跳过弃牌"] = true 223 | -- player1:before_turn() 224 | -- player1:turn() 225 | -- player1:after_turn() 226 | -- player2.flags["跳过判定"] = true 227 | -- player2.flags["跳过摸牌"] = true 228 | -- player2.flags["跳过弃牌"] = true 229 | -- player2:before_turn() 230 | -- player2:turn() 231 | -- player2:after_turn() 232 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 233 | 234 | -- -- 司马懿测试 235 | -- local player1 = new_test_hero(209) 236 | -- -- helper.insert(player1.hand_cards, {1, 57, 43, 88}) 237 | -- local player2 = new_player_no_skill() 238 | -- helper.insert(player2.hand_cards, {1, 57}) 239 | -- player2:put_on_equip(108) 240 | -- helper.put(player2.judge_cards, 61) 241 | -- table.insert(deck.card_pile, 1, 77) 242 | -- player2.flags["跳过弃牌"] = true 243 | -- player2:before_turn() 244 | -- player2:turn() 245 | -- player2:after_turn() 246 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 247 | 248 | -- 夏侯惇测试 249 | -- local player1 = new_test_hero(210) 250 | -- local player2 = new_player_no_skill() 251 | -- helper.insert(player2.hand_cards, {57, 57, 57}) 252 | -- table.insert(deck.card_pile, 1, 1) 253 | -- table.insert(deck.card_pile, 2, 1) 254 | -- table.insert(deck.card_pile, 3, 1) 255 | -- player2.flags["跳过判定"] = true 256 | -- player2.flags["跳过摸牌"] = true 257 | -- player2.flags["跳过弃牌"] = true 258 | -- player2:before_turn() 259 | -- player2:turn() 260 | -- player2:after_turn() 261 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 262 | 263 | -- 张辽测试 264 | -- local player1 = new_test_hero(211) 265 | -- local player2 = new_player_no_skill() 266 | -- local player3 = new_player_no_skill() 267 | -- player1.flags["跳过判定"] = true 268 | -- player1.flags["跳过弃牌"] = true 269 | -- player1:before_turn() 270 | -- player1:turn() 271 | -- player1:after_turn() 272 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 273 | 274 | -- -- 曹操测试 275 | -- local player1 = new_test_hero(212) 276 | -- local player2 = new_test_hero(212) 277 | -- local player3 = new_player_no_skill() 278 | -- helper.insert(player3.hand_cards, {57, 57, 57}) 279 | -- player3.flags["跳过判定"] = true 280 | -- player3.flags["跳过弃牌"] = true 281 | -- player3:before_turn() 282 | -- player3:turn() 283 | -- player3:after_turn() 284 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 285 | 286 | -- -- 许褚测试 287 | -- local player1 = new_test_hero(213) 288 | -- local player2 = new_player_no_skill() 289 | -- helper.insert(player1.hand_cards, {1, 81, 81}) 290 | -- player1.flags["跳过判定"] = true 291 | -- player1.flags["跳过弃牌"] = true 292 | -- player1:before_turn() 293 | -- player1:turn() 294 | -- player1:after_turn() 295 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 296 | 297 | -- -- 郭嘉测试 298 | -- local player1 = new_test_hero(214) 299 | -- helper.put(player1.judge_cards, 63) 300 | -- local player2 = new_player_no_skill() 301 | -- helper.insert(player2.hand_cards, {1, 81, 81}) 302 | -- player1:judge() 303 | -- player2.flags["跳过判定"] = true 304 | -- player2.flags["跳过摸牌"] = true 305 | -- player2.flags["跳过弃牌"] = true 306 | -- player2:before_turn() 307 | -- player2:turn() 308 | -- player2:after_turn() 309 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 310 | 311 | -- -- 大乔测试 312 | -- local player1 = new_test_hero(215) 313 | -- helper.insert(player1.hand_cards, {107, 102, 2}) 314 | -- local player2 = new_player_no_skill() 315 | -- local player3 = new_player_no_skill() 316 | -- helper.insert(player2.hand_cards, {1, 81, 81}) 317 | -- table.insert(deck.card_pile, 1, 105) 318 | -- player1.flags["跳过判定"] = true 319 | -- player1.flags["跳过摸牌"] = true 320 | -- player1.flags["跳过弃牌"] = true 321 | -- player1:before_turn() 322 | -- player1:turn() 323 | -- player1:after_turn() 324 | -- -- player2.flags["跳过判定"] = true 325 | -- player2.flags["跳过摸牌"] = true 326 | -- player2.flags["跳过弃牌"] = true 327 | -- player2:before_turn() 328 | -- player2:turn() 329 | -- player2:after_turn() 330 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 331 | 332 | -- -- 孙尚香测试 333 | -- local player1 = new_test_hero(216) 334 | -- helper.insert(player1.hand_cards, {95, 100, 105, 106, 1}) 335 | -- local player2 = new_player_no_skill() 336 | -- player2.life = 2 337 | -- helper.insert(player2.hand_cards, {73, 73, 79}) 338 | -- table.insert(deck.card_pile, 1, 105) 339 | -- player1.flags["跳过判定"] = true 340 | -- player1.flags["跳过摸牌"] = true 341 | -- player1.flags["跳过弃牌"] = true 342 | -- player1:before_turn() 343 | -- player1:turn() 344 | -- player1:after_turn() 345 | -- player2.flags["跳过判定"] = true 346 | -- player2.flags["跳过摸牌"] = true 347 | -- player2.flags["跳过弃牌"] = true 348 | -- player2:before_turn() 349 | -- player2:turn() 350 | -- player2:after_turn() 351 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 352 | 353 | -- -- 吕蒙测试 354 | -- local player1 = new_test_hero(217) 355 | -- helper.insert(player1.hand_cards, {95, 100, 100, 81, 100, 105, 106, 1, 1, 1}) 356 | -- local player2 = new_player_no_skill() 357 | -- helper.insert(player2.hand_cards, {81, 1}) 358 | -- player2.flags["跳过判定"] = true 359 | -- player2.flags["跳过摸牌"] = true 360 | -- player2.flags["跳过弃牌"] = true 361 | -- player2:before_turn() 362 | -- player2:turn() 363 | -- player2:after_turn() 364 | -- player1:before_turn() 365 | -- player1:turn() 366 | -- player1:after_turn() 367 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 368 | 369 | -- -- 周瑜测试 370 | -- local player1 = new_test_hero(218) 371 | -- helper.insert(player1.hand_cards, {1, 1, 1, 1, 1, 1}) 372 | -- local player2 = new_player_no_skill() 373 | -- player1.flags["跳过判定"] = true 374 | -- player1.flags["跳过弃牌"] = true 375 | -- player1:before_turn() 376 | -- player1:turn() 377 | -- player1:after_turn() 378 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 379 | 380 | -- -- 孙权测试 381 | -- local player1 = new_test_hero(219) 382 | -- local player2 = new_player_no_skill() 383 | -- player1.flags["跳过判定"] = true 384 | -- player1.flags["跳过摸牌"] = true 385 | -- player1.flags["跳过弃牌"] = true 386 | -- player1:before_turn() 387 | -- player1:turn() 388 | -- player1:after_turn() 389 | -- player1.armor = 100 390 | -- player1.flags["跳过判定"] = true 391 | -- player1.flags["跳过弃牌"] = true 392 | -- player1:before_turn() 393 | -- player1:turn() 394 | -- player1:after_turn() 395 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 396 | 397 | -- -- 甘宁、陆逊测试 398 | -- local player1 = new_test_hero(220) 399 | -- local player2 = new_test_hero(221) 400 | -- local player3 = new_player_no_skill() 401 | -- helper.clear(player2.hand_cards) 402 | -- helper.insert(player2.hand_cards, 17) 403 | -- helper.insert(player1.hand_cards, {1, 1, 1, 1, 98, 99, 74}) 404 | -- player1.flags["跳过判定"] = true 405 | -- player1.flags["跳过弃牌"] = true 406 | -- player1:before_turn() 407 | -- player1:turn() 408 | -- player1:after_turn() 409 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 410 | 411 | -- -- 黄盖、华佗测试 412 | -- local player1 = new_test_hero(222) 413 | -- player1.life = 1 414 | -- local player2 = new_test_hero(224) 415 | -- helper.insert(player2.hand_cards, {88, 105}) 416 | -- print(game.finish) 417 | -- player1.flags["跳过判定"] = true 418 | -- player1.flags["跳过摸牌"] = true 419 | -- player1.flags["跳过弃牌"] = true 420 | -- player1:before_turn() 421 | -- player1:turn() 422 | -- player1:after_turn() 423 | -- print(game.finish) 424 | -- player2.flags["跳过判定"] = true 425 | -- player2.flags["跳过摸牌"] = true 426 | -- player2.flags["跳过弃牌"] = true 427 | -- player2:before_turn() 428 | -- player2:turn() 429 | -- player2:after_turn() 430 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 431 | 432 | -- -- 吕布、貂蝉测试 433 | -- local player1 = new_test_hero(223) 434 | -- local player2 = new_test_hero(225) 435 | -- local player3 = new_player_no_skill() 436 | -- local player4 = new_player_no_skill() 437 | -- helper.insert(player1.hand_cards, {99, 45, 74}) 438 | -- player1:put_on_equip(91) 439 | -- helper.insert(player2.hand_cards, {1, 1, 69, 1, 81}) 440 | -- helper.insert(player3.hand_cards, {1, 1, 1, 1, 1, 1}) 441 | -- helper.insert(player4.hand_cards, {1, 1, 1, 1, 1, 1, 31, 31, 31}) 442 | -- -- player2.flags["跳过判定"] = true 443 | -- -- player2.flags["跳过摸牌"] = true 444 | -- -- player2.flags["跳过弃牌"] = true 445 | -- -- player2:before_turn() 446 | -- -- player2:turn() 447 | -- -- player2:after_turn() 448 | -- player1.flags["跳过判定"] = true 449 | -- player1.flags["跳过摸牌"] = true 450 | -- player1.flags["跳过弃牌"] = true 451 | -- player1:before_turn() 452 | -- player1:turn() 453 | -- player1:after_turn() 454 | -- player1.flags["跳过判定"] = true 455 | -- player1.flags["跳过摸牌"] = true 456 | -- player1.flags["跳过弃牌"] = true 457 | -- player1:before_turn() 458 | -- player1:turn() 459 | -- player1:after_turn() 460 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 461 | 462 | -- -- 魏延测试 463 | -- local player1 = new_tsest_hero(226) 464 | -- player1.life = 1 465 | -- player1:put_on_equip(98) 466 | -- helper.insert(player1.hand_cards, {1, 1, 1, 1, 1, 1, 46, 46, 46}) 467 | -- local player2 = new_player_no_skill() 468 | -- helper.clear(player2.hand_cards) 469 | -- player2:put_on_equip(105) 470 | -- local player3 = new_player_no_skill() 471 | -- helper.clear(player3.hand_cards) 472 | -- player3:put_on_equip(105) 473 | -- local player4 = new_player_no_skill() 474 | -- helper.clear(player4.hand_cards) 475 | -- player4:put_on_equip(105) 476 | -- local player5 = new_player_no_skill() 477 | -- helper.clear(player5.hand_cards) 478 | -- player5:put_on_equip(105) 479 | -- player1.flags["跳过判定"] = true 480 | -- player1.flags["跳过摸牌"] = true 481 | -- player1.flags["跳过弃牌"] = true 482 | -- player1:before_turn() 483 | -- player1:turn() 484 | -- player1:after_turn() 485 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 486 | 487 | -- -- 黄忠测试 488 | -- local player1 = new_test_hero(227) 489 | -- player1.life = 3 490 | -- player1:put_on_equip(90) 491 | -- helper.insert(player1.hand_cards, {1, 1, 8, 8, 8, 8, 8, 9, 8}) 492 | -- local player2 = new_player_no_skill() 493 | -- helper.insert(player2.hand_cards, 33) 494 | -- player2:put_on_equip(105) 495 | -- local player3 = new_player_no_skill() 496 | -- helper.insert(player3.hand_cards, 33) 497 | -- player3:put_on_equip(105) 498 | -- local player4 = new_player_no_skill() 499 | -- helper.insert(player4.hand_cards, 33) 500 | -- player4:put_on_equip(105) 501 | -- local player5 = new_player_no_skill() 502 | -- helper.insert(player5.hand_cards, 33) 503 | -- player5:put_on_equip(105) 504 | -- player1.flags["跳过判定"] = true 505 | -- player1.flags["跳过摸牌"] = true 506 | -- player1.flags["跳过弃牌"] = true 507 | -- player1:before_turn() 508 | -- player1:turn() 509 | -- player1:after_turn() 510 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 511 | 512 | -- -- 贾诩测试 513 | -- local player1 = new_test_hero(246) 514 | -- helper.insert(player1.hand_cards, {61, 62, 1}) 515 | -- local player3 = new_player_no_skill() 516 | -- helper.insert(player3.hand_cards, 46) 517 | -- helper.put(player3.judge_cards, 62) 518 | -- table.insert(deck.card_pile, 1, 46) 519 | -- player1.flags["跳过判定"] = true 520 | -- player1.flags["跳过摸牌"] = true 521 | -- player1.flags["跳过弃牌"] = true 522 | -- player1:before_turn() 523 | -- player1:turn() 524 | -- player1:after_turn() 525 | -- player3.flags["跳过摸牌"] = true 526 | -- player3.flags["跳过弃牌"] = true 527 | -- player3:before_turn() 528 | -- player3:turn() 529 | -- player3:after_turn() 530 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 531 | 532 | -- -- 贾诩乱武测试 533 | -- local player1 = new_test_hero(246) 534 | -- player1:put_on_equip(105) 535 | -- local player2 = new_test_hero(227) 536 | -- helper.insert(player2.hand_cards, {30}) 537 | -- local player3 = new_player_no_skill() 538 | -- helper.clear(player3.hand_cards) 539 | -- player3:put_on_equip(105) 540 | -- local player4 = new_test_hero(205) 541 | -- helper.clear(player4.hand_cards) 542 | -- local player5 = new_test_hero(215) 543 | -- helper.insert(player5.hand_cards, {1}) 544 | -- player5:put_on_equip(105) 545 | -- local player6 = new_player_no_skill() 546 | -- helper.insert(player6.hand_cards, {1}) 547 | -- player6:put_on_equip(105) 548 | -- player6:put_on_equip(96) 549 | -- player1.flags["跳过判定"] = true 550 | -- player1.flags["跳过摸牌"] = true 551 | -- player1.flags["跳过弃牌"] = true 552 | -- player1:before_turn() 553 | -- player1:turn() 554 | -- player1:after_turn() 555 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 556 | 557 | -- -- 夏侯渊测试 558 | -- local player1 = new_test_hero(228) 559 | -- helper.insert(player1.hand_cards, {1, 1, 1, 1, 1, 1, 1, 1}) 560 | -- player1:put_on_equip(105) 561 | -- helper.put(player1.hand_cards, 61) 562 | -- local player2 = new_player_no_skill() 563 | -- player2.life = 6 564 | -- helper.insert(player2.hand_cards, {1}) 565 | -- player2:put_on_equip(105) 566 | -- player1:before_turn() 567 | -- player1:turn() 568 | -- player1:check_jump_turn() 569 | -- player1:after_turn() 570 | -- player1:before_turn() 571 | -- player1:turn() 572 | -- player1:after_turn() 573 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 574 | 575 | -- -- 曹仁测试 576 | -- local player1 = new_test_hero(229) 577 | -- helper.insert(player1.hand_cards, {105}) 578 | -- player1:put_on_equip(106) 579 | -- player1:put_on_equip(95) 580 | -- helper.put(player1.judge_cards, 63) 581 | -- local player2 = new_player_no_skill() 582 | -- helper.insert(player2.hand_cards, {75}) 583 | -- player2:put_on_equip(107) 584 | -- player1.flags["跳过判定"] = true 585 | -- player1.flags["跳过摸牌"] = true 586 | -- player1.flags["跳过弃牌"] = true 587 | -- player1:before_turn() 588 | -- player1:turn() 589 | -- player1:after_turn() 590 | -- player2.flags["跳过判定"] = true 591 | -- player2.flags["跳过摸牌"] = true 592 | -- player2.flags["跳过弃牌"] = true 593 | -- player2:before_turn() 594 | -- player2:turn() 595 | -- player2:after_turn() 596 | -- player1:check_jump_turn() 597 | -- player2.flags["跳过判定"] = true 598 | -- player2.flags["跳过摸牌"] = true 599 | -- player2.flags["跳过弃牌"] = true 600 | -- player2:before_turn() 601 | -- player2:turn() 602 | -- player2:after_turn() 603 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 604 | 605 | -- -- 张郃测试 606 | -- local player1 = new_test_hero(249) 607 | -- helper.insert(player1.hand_cards, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}) 608 | -- player1:put_on_equip(106) 609 | -- player1:put_on_equip(95) 610 | -- helper.put(player1.judge_cards, 63) 611 | -- local player2 = new_player_no_skill() 612 | -- helper.insert(player2.hand_cards, {1}) 613 | -- player2:put_on_equip(105) 614 | -- local player3 = new_player_no_skill() 615 | -- player1:before_turn() 616 | -- player1:turn() 617 | -- player1:after_turn() 618 | -- player1:before_turn() 619 | -- player1:turn() 620 | -- player1:after_turn() 621 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 622 | 623 | -- -- 小乔测试 624 | -- local player1 = new_test_hero(230) 625 | -- helper.insert(player1.hand_cards, {1, 1, 22}) 626 | -- helper.put(player1.judge_cards, 63) 627 | -- local player2 = new_player_no_skill() 628 | -- player2:put_on_equip(102) 629 | -- local player3 = new_player_no_skill() 630 | -- table.insert(deck.card_pile, 1, 1) 631 | -- -- player1:before_turn() 632 | -- -- player1:turn() 633 | -- -- player1:after_turn() 634 | -- player2:before_turn() 635 | -- player2:turn() 636 | -- player2:after_turn() 637 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 638 | 639 | -- -- 周泰测试 640 | -- local player1 = new_test_hero(231) 641 | -- player1.life = 4 642 | -- helper.insert(player1.hand_cards, {1, 2, 3, 4, 5, 6, 7, 8, 9, 48, 70}) 643 | -- local player2 = new_player_no_skill() 644 | -- player2:put_on_equip(90) 645 | -- helper.insert(player2.hand_cards, {1, 1, 1, 1, 1, 1, 1, 1, 48, 70, 75}) 646 | -- table.insert(deck.card_pile, 1, 97) 647 | -- table.insert(deck.card_pile, 2, 99) 648 | -- table.insert(deck.card_pile, 3, 97) 649 | -- player2.flags["跳过判定"] = true 650 | -- player2.flags["跳过摸牌"] = true 651 | -- player2.flags["跳过弃牌"] = true 652 | -- player2:before_turn() 653 | -- player2:turn() 654 | -- player2:after_turn() 655 | -- player1:before_turn() 656 | -- player1:turn() 657 | -- player1:after_turn() 658 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 659 | 660 | -- -- 卧龙诸葛测试 661 | -- local player1 = new_test_hero(233) 662 | -- -- player1:put_on_equip(102) 663 | -- helper.insert(player1.hand_cards, {1, 22}) 664 | -- local player2 = new_player_no_skill() 665 | -- player2:put_on_equip(90) 666 | -- helper.insert(player2.hand_cards, {1, 1, 22, 22, 54}) 667 | -- table.insert(deck.card_pile, 1, 1) 668 | -- player2.flags["跳过判定"] = true 669 | -- player2.flags["跳过摸牌"] = true 670 | -- player2.flags["跳过弃牌"] = true 671 | -- player2:before_turn() 672 | -- player2:turn() 673 | -- player2:after_turn() 674 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 675 | 676 | -- -- 庞统测试 677 | -- local player1 = new_test_hero(234) 678 | -- player1.life = -2 679 | -- player1:put_on_equip(90) 680 | -- helper.put(player1.judge_cards, 61) 681 | -- helper.insert(player1.hand_cards, {1, 50}) 682 | -- local player2 = new_player_no_skill() 683 | -- player2:put_on_equip(90) 684 | -- helper.insert(player2.hand_cards, {1, 1, 22, 22, 54}) 685 | -- player2.flags["跳过判定"] = true 686 | -- player2.flags["跳过摸牌"] = true 687 | -- player2.flags["跳过弃牌"] = true 688 | -- player2:before_turn() 689 | -- player2:turn() 690 | -- player2:after_turn() 691 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 692 | 693 | -- -- 典韦测试 694 | -- local player1 = new_test_hero(235) 695 | -- player1.life = 2 696 | -- player1:put_on_equip(90) 697 | -- helper.insert(player1.hand_cards, {1, 90}) 698 | -- local player2 = new_player_no_skill() 699 | -- player2.life = 3 700 | -- local player3 = new_player_no_skill() 701 | -- player3.life = 1 702 | -- player1.flags["跳过判定"] = true 703 | -- player1.flags["跳过摸牌"] = true 704 | -- player1.flags["跳过弃牌"] = true 705 | -- player1:before_turn() 706 | -- player1:turn() 707 | -- player1:after_turn() 708 | -- player1.flags["跳过判定"] = true 709 | -- player1.flags["跳过摸牌"] = true 710 | -- player1.flags["跳过弃牌"] = true 711 | -- player1:before_turn() 712 | -- player1:turn() 713 | -- player1:after_turn() 714 | -- player2:before_turn() 715 | -- player2:turn() 716 | -- player2:after_turn() 717 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 718 | 719 | -- -- 荀彧测试 720 | -- local player1 = new_test_hero(236) 721 | -- helper.insert(player1.hand_cards, {68, 72}) 722 | -- player1:put_on_equip(105) 723 | -- local player2 = new_player_no_skill() 724 | -- helper.clear(player2.hand_cards) 725 | -- helper.insert(player2.hand_cards, {66}) 726 | -- -- player2:put_on_equip(105) 727 | -- local player3 = new_player_no_skill() 728 | -- -- helper.clear(player3.hand_cards) 729 | -- -- helper.insert(player3.hand_cards, {1, 108}) 730 | -- player3:put_on_equip(105) 731 | -- player1.flags["跳过判定"] = true 732 | -- player1.flags["跳过摸牌"] = true 733 | -- player1.flags["跳过弃牌"] = true 734 | -- player1:before_turn() 735 | -- player1:turn() 736 | -- player1:after_turn() 737 | -- player1:take_off_equip(105) 738 | -- player2:take_off_equip(105) 739 | -- player3:take_off_equip(105) 740 | -- player1.flags["跳过判定"] = true 741 | -- player1.flags["跳过摸牌"] = true 742 | -- player1.flags["跳过弃牌"] = true 743 | -- player1:before_turn() 744 | -- player1:turn() 745 | -- player1:after_turn() 746 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 747 | 748 | -- -- 太史慈测试 749 | -- local player1 = new_test_hero(237) 750 | -- helper.insert(player1.hand_cards, {1, 1, 98, 108}) 751 | -- player1:put_on_equip(90) 752 | -- local player2 = new_player_no_skill() 753 | -- local player3 = new_player_no_skill() 754 | -- local player4 = new_test_hero(215) 755 | -- helper.insert(player4.hand_cards, {1, 1, 1}) 756 | -- player1.flags["跳过判定"] = true 757 | -- player1.flags["跳过摸牌"] = true 758 | -- player1.flags["跳过弃牌"] = true 759 | -- player1:before_turn() 760 | -- player1:turn() 761 | -- player1:after_turn() 762 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 763 | 764 | -- -- 庞德测试 765 | -- local player1 = new_test_hero(238) 766 | -- helper.insert(player1.hand_cards, {1}) 767 | -- -- player1:put_on_equip(98) 768 | -- local player2 = new_player_no_skill() 769 | -- player2:put_on_equip(105) 770 | -- helper.insert(player2.hand_cards, 32) 771 | -- local player3 = new_player_no_skill() 772 | -- helper.clear(player3.hand_cards) 773 | -- helper.insert(player3.hand_cards, 2) 774 | -- local player4 = new_test_hero(212) 775 | -- helper.insert(player4.hand_cards, {32, 32}) 776 | -- player4:put_on_equip(105) 777 | -- player1.flags["跳过判定"] = true 778 | -- player1.flags["跳过摸牌"] = true 779 | -- player1.flags["跳过弃牌"] = true 780 | -- player1:before_turn() 781 | -- player1:turn() 782 | -- player1:after_turn() 783 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 784 | 785 | -- -- 袁绍测试 786 | -- local player1 = new_test_hero(239) 787 | -- helper.insert(player1.hand_cards, {1, 61, 1, 1, 49, 50, 65, 73, 73, 82, 82}) 788 | -- local player2 = new_player_no_skill() 789 | -- helper.insert(player2.hand_cards, 69) 790 | -- local player3 = new_player_no_skill() 791 | -- player1.flags["跳过判定"] = true 792 | -- player1.flags["跳过摸牌"] = true 793 | -- player1.flags["跳过弃牌"] = true 794 | -- player1:before_turn() 795 | -- player1:turn() 796 | -- player1:after_turn() 797 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 798 | 799 | -- -- 颜良文丑测试 800 | -- local player1 = new_test_hero(240) 801 | -- helper.insert(player1.hand_cards, {1, 8, 35, 46, 1, 1, 1, 1}) 802 | -- local player2 = new_test_hero(209) 803 | -- helper.insert(player2.hand_cards, {69, 1}) 804 | -- local player3 = new_test_hero(225) 805 | -- helper.insert(player3.hand_cards, {1, 1}) 806 | -- local player4 = new_player_no_skill() 807 | -- table.insert(deck.card_pile, 1, 97) 808 | -- player1.flags["跳过弃牌"] = true 809 | -- player1:before_turn() 810 | -- player1:turn() 811 | -- player1:after_turn() 812 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 813 | 814 | -- -- 祝融测试 815 | -- local player1 = new_player_no_skill() 816 | -- player1.life = 2 817 | -- player1:put_on_equip(90) 818 | -- helper.insert(player1.hand_cards, {54, 54}) 819 | -- local player2 = new_test_hero(212) 820 | -- helper.insert(player2.hand_cards, {1}) 821 | -- local player3 = new_test_hero(241) 822 | -- helper.insert(player3.hand_cards, {1, 1, 1, 1, 1, 1, 105, 90}) 823 | -- -- player1.flags["跳过判定"] = true 824 | -- -- player1.flags["跳过弃牌"] = true 825 | -- -- player1:before_turn() 826 | -- -- player1:turn() 827 | -- -- player1:after_turn() 828 | -- -- player2.flags["跳过判定"] = true 829 | -- -- player2.flags["跳过摸牌"] = true 830 | -- -- player2.flags["跳过弃牌"] = true 831 | -- -- player2:before_turn() 832 | -- -- player2:turn() 833 | -- -- player2:after_turn() 834 | -- player3.flags["跳过判定"] = true 835 | -- player3.flags["跳过摸牌"] = true 836 | -- player3.flags["跳过弃牌"] = true 837 | -- player3:before_turn() 838 | -- player3:turn() 839 | -- player3:after_turn() 840 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 841 | 842 | -- -- 孟获测试 843 | -- local player1 = new_test_hero(242) 844 | -- player1:put_on_equip(90) 845 | -- local player2 = new_player_no_skill() 846 | -- helper.insert(player2.hand_cards, {54, 1, 83}) 847 | -- local player3 = new_test_hero(210) 848 | -- table.insert(deck.card_pile, 1, 1) 849 | -- player2.flags["跳过判定"] = true 850 | -- player2.flags["跳过摸牌"] = true 851 | -- player2.flags["跳过弃牌"] = true 852 | -- player2:before_turn() 853 | -- player2:turn() 854 | -- player2:after_turn() 855 | -- table.insert(deck.card_pile, 1, 97) 856 | -- table.insert(deck.card_pile, 2, 57) 857 | -- table.insert(deck.card_pile, 3, 17) 858 | -- table.insert(deck.card_pile, 4, 17) 859 | -- player1.flags["跳过判定"] = true 860 | -- player1.flags["跳过弃牌"] = true 861 | -- player1:before_turn() 862 | -- player1:turn() 863 | -- player1:after_turn() 864 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 865 | 866 | -- -- 曹丕、蔡文姬测试 867 | -- local player1 = new_test_hero(243) 868 | -- helper.insert(player1.hand_cards, 75) 869 | -- local player2 = new_test_hero(253) 870 | -- helper.insert(player2.hand_cards, {1, 1, 1, 1}) 871 | -- local player3 = new_test_hero(221) 872 | -- helper.insert(player3.hand_cards, {1}) 873 | -- player3:put_on_equip(90) 874 | -- -- table.insert(deck.card_pile, 1, 1) 875 | -- -- table.insert(deck.card_pile, 1, 22) 876 | -- -- table.insert(deck.card_pile, 1, 8) 877 | -- table.insert(deck.card_pile, 1, 34) 878 | -- player3.flags["跳过判定"] = true 879 | -- player3.flags["跳过摸牌"] = true 880 | -- player3.flags["跳过弃牌"] = true 881 | -- player3:before_turn() 882 | -- player3:turn() 883 | -- player3:after_turn() 884 | -- player1.flags["跳过判定"] = true 885 | -- player1.flags["跳过摸牌"] = true 886 | -- player1.flags["跳过弃牌"] = true 887 | -- player1:before_turn() 888 | -- player1:turn() 889 | -- player1:after_turn() 890 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 891 | 892 | -- -- 孙坚测试 893 | -- local player1 = new_test_hero(244) 894 | -- player1.life = 1 895 | -- local player2 = new_player_no_skill() 896 | -- local player3 = new_player_no_skill() 897 | -- helper.clear(player3.hand_cards) 898 | -- player1.flags["跳过判定"] = true 899 | -- player1.flags["跳过摸牌"] = true 900 | -- player1.flags["跳过弃牌"] = true 901 | -- player1:before_turn() 902 | -- player1:turn() 903 | -- player1:after_turn() 904 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 905 | 906 | -- -- 鲁肃测试 907 | -- local player1 = new_test_hero(245) 908 | -- helper.insert(player1.hand_cards, {1, 2, 11}) 909 | -- player1:put_on_equip(90) 910 | -- local player2 = new_player_no_skill() 911 | -- helper.clear(player2.hand_cards) 912 | -- helper.insert(player2.hand_cards, {3, 4}) 913 | -- local player3 = new_player_no_skill() 914 | -- helper.clear(player3.hand_cards) 915 | -- helper.insert(player3.hand_cards, {5, 6, 7, 8}) 916 | -- local player4 = new_test_hero(221) 917 | -- helper.clear(player4.hand_cards) 918 | -- helper.insert(player4.hand_cards, {9, 10}) 919 | -- player1.flags["跳过判定"] = true 920 | -- player1.flags["跳过弃牌"] = true 921 | -- player1:before_turn() 922 | -- player1:turn() 923 | -- player1:after_turn() 924 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 925 | 926 | -- -- 刘禅测试 927 | -- local player1 = new_test_hero(247) 928 | -- helper.insert(player1.hand_cards, {2}) 929 | -- player1:put_on_equip(90) 930 | -- local player2 = new_player_no_skill() 931 | -- helper.clear(player2.hand_cards) 932 | -- helper.insert(player2.hand_cards, {1, 2}) 933 | -- local player3 = new_player_no_skill() 934 | -- helper.clear(player3.hand_cards) 935 | -- helper.insert(player3.hand_cards, {5, 6, 7, 8}) 936 | -- local player4 = new_test_hero(221) 937 | -- helper.clear(player4.hand_cards) 938 | -- helper.insert(player4.hand_cards, {9, 10}) 939 | -- -- player2.flags["跳过判定"] = true 940 | -- -- player2.flags["跳过摸牌"] = true 941 | -- -- player2.flags["跳过弃牌"] = true 942 | -- -- player2:before_turn() 943 | -- -- player2:turn() 944 | -- -- player2:after_turn() 945 | -- game:main() 946 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 947 | 948 | -- -- 姜维测试 949 | -- local player1 = new_test_hero(248) 950 | -- player1:put_on_equip(105) 951 | -- local player2 = new_player_no_skill() 952 | -- helper.insert(player2.hand_cards, 32) 953 | -- player2:put_on_equip(108) 954 | -- local player3 = new_player_no_skill() 955 | -- player3:put_on_equip(96) 956 | -- local player4 = new_player_no_skill() 957 | -- helper.insert(player4.hand_cards, {32, 32}) 958 | -- player4:put_on_equip(105) 959 | -- player1.flags["跳过判定"] = true 960 | -- -- player1.flags["跳过摸牌"] = true 961 | -- player1.flags["跳过弃牌"] = true 962 | -- player1:before_turn() 963 | -- player1:turn() 964 | -- player1:after_turn() 965 | -- player1.flags["跳过判定"] = true 966 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 967 | 968 | -- -- 邓艾测试 969 | -- local player1 = new_test_hero(250) 970 | -- player1:put_on_equip(105) 971 | -- helper.insert(player1.hand_cards, {1, 1, 69}) 972 | -- local player2 = new_player_no_skill() 973 | -- helper.insert(player2.hand_cards, {75, 75, 75, 1, 1}) 974 | -- player2:put_on_equip(105) 975 | -- local player3 = new_player_no_skill() 976 | -- player3:put_on_equip(105) 977 | -- local player4 = new_player_no_skill() 978 | -- helper.insert(player4.hand_cards, {32, 32}) 979 | -- player4:put_on_equip(105) 980 | -- player2.flags["跳过判定"] = true 981 | -- player2.flags["跳过摸牌"] = true 982 | -- player2.flags["跳过弃牌"] = true 983 | -- player2:before_turn() 984 | -- player2:turn() 985 | -- player2:after_turn() 986 | -- player1.flags["跳过判定"] = true 987 | -- player1.flags["跳过摸牌"] = true 988 | -- player1.flags["跳过弃牌"] = true 989 | -- player1:before_turn() 990 | -- player1:turn() 991 | -- player1:after_turn() 992 | -- player1.flags["跳过判定"] = true 993 | -- player1.flags["跳过摸牌"] = true 994 | -- player1.flags["跳过弃牌"] = true 995 | -- player1:before_turn() 996 | -- player1:turn() 997 | -- player1:after_turn() 998 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 999 | 1000 | -- -- 孙策测试 1001 | -- local player1 = new_test_hero(251) 1002 | -- player1.life = 1 1003 | -- helper.insert(player1.hand_cards, {1, 1, 1, 1, 22, 82, 83}) 1004 | -- player1:put_on_equip(90) 1005 | -- local player2 = new_player_no_skill() 1006 | -- player2:put_on_equip(90) 1007 | -- helper.clear(player2.hand_cards) 1008 | -- helper.insert(player2.hand_cards, {1, 1, 1, 1, 22, 82, 83}) 1009 | -- local player3 = new_player_no_skill() 1010 | -- helper.clear(player3.hand_cards) 1011 | -- local player4 = new_test_hero(221) 1012 | -- helper.clear(player4.hand_cards) 1013 | -- player1.flags["跳过判定"] = true 1014 | -- -- player1.flags["跳过摸牌"] = true 1015 | -- player1.flags["跳过弃牌"] = true 1016 | -- player1:before_turn() 1017 | -- player1:turn() 1018 | -- player1:after_turn() 1019 | -- player2.flags["跳过判定"] = true 1020 | -- player2.flags["跳过摸牌"] = true 1021 | -- player2.flags["跳过弃牌"] = true 1022 | -- player2:before_turn() 1023 | -- player2:turn() 1024 | -- player2:after_turn() 1025 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1026 | 1027 | -- -- 张昭张纮测试 1028 | -- local player1 = new_test_hero(252) 1029 | -- helper.insert(player1.hand_cards, {100, 103, 104}) 1030 | -- local player2 = new_player_no_skill() 1031 | -- player2.life = 1 1032 | -- player2:put_on_equip(90) 1033 | -- helper.clear(player2.hand_cards) 1034 | -- helper.insert(player2.hand_cards, {1, 1, 1, 1, 96}) 1035 | -- local player3 = new_player_no_skill() 1036 | -- player3:put_on_equip(105) 1037 | -- helper.clear(player3.hand_cards) 1038 | -- player2.flags["跳过判定"] = true 1039 | -- player2.flags["跳过摸牌"] = true 1040 | -- -- player2.flags["跳过弃牌"] = true 1041 | -- player2:before_turn() 1042 | -- player2:turn() 1043 | -- player2:after_turn() 1044 | -- player1.flags["跳过判定"] = true 1045 | -- player1.flags["跳过摸牌"] = true 1046 | -- player1.flags["跳过弃牌"] = true 1047 | -- player1:before_turn() 1048 | -- player1:turn() 1049 | -- player1:after_turn() 1050 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1051 | 1052 | -- -- 张角雷击测试 1053 | -- local player1 = new_test_hero(232) 1054 | -- helper.insert(player1.hand_cards, {31, 31, 31, 31, 1, 1, 1, 1}) 1055 | -- player1:put_on_equip(100) 1056 | -- local player2 = new_player_no_skill() 1057 | -- player2.life = 1 1058 | -- helper.insert(player2.hand_cards, 1) 1059 | -- local player3 = new_player_no_skill() 1060 | -- player3.life = 1 1061 | -- helper.insert(player3.hand_cards, 57) 1062 | -- player1.flags["跳过判定"] = true 1063 | -- player1.flags["跳过摸牌"] = true 1064 | -- player1.flags["跳过弃牌"] = true 1065 | -- player2.flags["跳过判定"] = true 1066 | -- player2.flags["跳过摸牌"] = true 1067 | -- player2.flags["跳过弃牌"] = true 1068 | -- player3.flags["跳过判定"] = true 1069 | -- player3.flags["跳过摸牌"] = true 1070 | -- player3.flags["跳过弃牌"] = true 1071 | -- for i = 1, 100, 1 do 1072 | -- table.insert(deck.card_pile, 1, 31) 1073 | -- end 1074 | -- game:main() 1075 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1076 | 1077 | -- -- 大乔流离测试 1078 | -- local player1 = new_test_hero(215) 1079 | -- helper.insert(player1.hand_cards, {1, 1, 1, 1}) 1080 | -- local player2 = new_test_hero(207) 1081 | -- helper.clear(player2.hand_cards) 1082 | -- player2:put_on_equip(98) 1083 | -- helper.insert(player2.hand_cards, 1) 1084 | -- local player3 = new_player_no_skill() 1085 | -- helper.clear(player3.hand_cards) 1086 | -- player3:put_on_equip(98) 1087 | -- helper.insert(player3.hand_cards, 1) 1088 | -- local player4 = new_player_no_skill() 1089 | -- helper.clear(player4.hand_cards) 1090 | -- player2.flags["跳过判定"] = true 1091 | -- player2.flags["跳过摸牌"] = true 1092 | -- player2.flags["跳过弃牌"] = true 1093 | -- player2:before_turn() 1094 | -- player2:turn() 1095 | -- player2:after_turn() 1096 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1097 | 1098 | -- -- 寒冰剑测试 1099 | -- local player1 = new_test_hero(215) 1100 | -- helper.insert(player1.hand_cards, 1) 1101 | -- player1:put_on_equip(92) 1102 | -- -- local player2 = new_player_no_skill() 1103 | -- local player2 = new_test_hero(221) 1104 | -- helper.clear(player2.hand_cards) 1105 | -- helper.insert(player2.hand_cards, {1}) 1106 | -- -- player2:put_on_equip(90) 1107 | -- player1.flags["跳过判定"] = true 1108 | -- player1.flags["跳过摸牌"] = true 1109 | -- player1.flags["跳过弃牌"] = true 1110 | -- player1:before_turn() 1111 | -- player1:turn() 1112 | -- player1:after_turn() 1113 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1114 | 1115 | -- -- 青釭剑、仁王盾、八卦阵测试 1116 | -- local player1 = new_player_no_skill() 1117 | -- helper.clear(player1.hand_cards) 1118 | -- helper.insert(player1.hand_cards, {1, 8, 22, 25}) 1119 | -- player1:put_on_equip(93) 1120 | -- -- player1:put_on_equip(90) 1121 | -- local player2 = new_test_hero(233) 1122 | -- helper.insert(player2.hand_cards, 34) 1123 | -- -- player2:put_on_equip(100) 1124 | -- -- player2:put_on_equip(102) 1125 | -- -- local player3 = new_player_no_skill() 1126 | -- -- helper.clear(player3.hand_cards) 1127 | -- -- helper.insert(player3.hand_cards, 34) 1128 | -- -- -- player3:put_on_equip(100) 1129 | -- -- player3:put_on_equip(102) 1130 | -- player1.flags["跳过判定"] = true 1131 | -- player1.flags["跳过摸牌"] = true 1132 | -- player1.flags["跳过弃牌"] = true 1133 | -- player1:before_turn() 1134 | -- player1:turn() 1135 | -- player1:after_turn() 1136 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1137 | 1138 | -- -- 雌雄双股剑测试 1139 | -- local player1 = new_player_no_skill() 1140 | -- helper.clear(player1.hand_cards) 1141 | -- helper.insert(player1.hand_cards, 1) 1142 | -- player1:put_on_equip(94) 1143 | -- local player2 = new_test_hero(208) 1144 | -- helper.clear(player2.hand_cards) 1145 | -- helper.insert(player2.hand_cards, {1}) 1146 | -- player2:put_on_equip(94) 1147 | -- local player3 = new_player_no_skill() 1148 | -- helper.clear(player3.hand_cards) 1149 | -- local player4 = new_test_hero(223) 1150 | -- helper.clear(player4.hand_cards) 1151 | -- player1.flags["跳过判定"] = true 1152 | -- player1.flags["跳过摸牌"] = true 1153 | -- player1.flags["跳过弃牌"] = true 1154 | -- player1:before_turn() 1155 | -- player1:turn() 1156 | -- player1:after_turn() 1157 | -- player2.flags["跳过判定"] = true 1158 | -- player2.flags["跳过摸牌"] = true 1159 | -- player2.flags["跳过弃牌"] = true 1160 | -- player2:before_turn() 1161 | -- player2:turn() 1162 | -- player2:after_turn() 1163 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1164 | 1165 | -- -- 贯石斧测试 1166 | -- local player1 = new_test_hero(216) 1167 | -- helper.clear(player1.hand_cards) 1168 | -- helper.insert(player1.hand_cards, {1, 1, 2}) 1169 | -- player1:put_on_equip(95) 1170 | -- player1:put_on_equip(105) 1171 | -- local player2 = new_player_no_skill() 1172 | -- helper.clear(player2.hand_cards) 1173 | -- helper.insert(player2.hand_cards, 34) 1174 | -- -- player2:put_on_equip(94) 1175 | -- -- local player3 = new_player_no_skill() 1176 | -- -- helper.clear(player3.hand_cards) 1177 | -- -- local player4 = new_test_hero(223) 1178 | -- -- helper.clear(player4.hand_cards) 1179 | -- player1.flags["跳过判定"] = true 1180 | -- player1.flags["跳过摸牌"] = true 1181 | -- player1.flags["跳过弃牌"] = true 1182 | -- player1:before_turn() 1183 | -- player1:turn() 1184 | -- player1:after_turn() 1185 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1186 | 1187 | -- -- 青龙偃月刀测试 1188 | -- local player1 = new_test_hero(237) 1189 | -- helper.clear(player1.hand_cards) 1190 | -- helper.insert(player1.hand_cards, {1, 1, 1, 1, 89}) 1191 | -- player1:put_on_equip(96) 1192 | -- local player2 = new_player_no_skill() 1193 | -- helper.clear(player2.hand_cards) 1194 | -- helper.insert(player2.hand_cards, {34, 1}) 1195 | -- player2:put_on_equip(94) 1196 | -- local player3 = new_player_no_skill() 1197 | -- helper.clear(player3.hand_cards) 1198 | -- helper.insert(player3.hand_cards, {34}) 1199 | -- local player4 = new_test_hero(215) 1200 | -- helper.clear(player4.hand_cards) 1201 | -- helper.insert(player4.hand_cards, {2}) 1202 | -- player1.flags["跳过判定"] = true 1203 | -- player1.flags["跳过摸牌"] = true 1204 | -- player1.flags["跳过弃牌"] = true 1205 | -- player1:before_turn() 1206 | -- player1:turn() 1207 | -- player1:after_turn() 1208 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1209 | 1210 | -- -- 丈八蛇矛测试 1211 | -- local player1 = new_test_hero(221) 1212 | -- helper.clear(player1.hand_cards) 1213 | -- helper.insert(player1.hand_cards, {34, 89}) 1214 | -- player1:put_on_equip(97) 1215 | -- local player2 = new_player_no_skill() 1216 | -- helper.clear(player2.hand_cards) 1217 | -- helper.insert(player2.hand_cards, {34}) 1218 | -- player2:put_on_equip(102) 1219 | -- player1.flags["跳过判定"] = true 1220 | -- player1.flags["跳过摸牌"] = true 1221 | -- player1.flags["跳过弃牌"] = true 1222 | -- player1:before_turn() 1223 | -- player1:turn() 1224 | -- player1:after_turn() 1225 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1226 | 1227 | -- -- 麒麟弓测试 1228 | -- local player1 = new_player_no_skill() 1229 | -- helper.clear(player1.hand_cards) 1230 | -- helper.insert(player1.hand_cards, {1, 1, 2}) 1231 | -- player1:put_on_equip(99) 1232 | -- local player2 = new_player_no_skill() 1233 | -- helper.clear(player2.hand_cards) 1234 | -- -- helper.insert(player2.hand_cards, 34) 1235 | -- player2:put_on_equip(105) 1236 | -- player2:put_on_equip(108) 1237 | -- -- player2:put_on_equip(94) 1238 | -- -- local player3 = new_player_no_skill() 1239 | -- -- helper.clear(player3.hand_cards) 1240 | -- -- local player4 = new_test_hero(223) 1241 | -- -- helper.clear(player4.hand_cards) 1242 | -- player1.flags["跳过判定"] = true 1243 | -- player1.flags["跳过摸牌"] = true 1244 | -- player1.flags["跳过弃牌"] = true 1245 | -- player1:before_turn() 1246 | -- player1:turn() 1247 | -- player1:after_turn() 1248 | -- text("弃牌堆:%s", t2s(deck.discard_pile)) 1249 | --------------------------------------------------------------------------------