diff --git a/image/generals/zhangxuan.jpg b/image/generals/zhangxuan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34a15f51e6f73c284ae4b49aa86c14c8a24db4bf Binary files /dev/null and b/image/generals/zhangxuan.jpg differ diff --git a/init.lua b/init.lua index fc1efa08350d35b534f4f5fe0d0d48aa3732b5c0..b821a6021bcda4983e299bd8657ac08de9144076 100644 --- a/init.lua +++ b/init.lua @@ -1152,7 +1152,17 @@ Fk:loadTranslationTable{ ---@return integer[] | nil function getCardByPattern(room, pattern, fromPiles) pattern = pattern or "." - fromPiles = room.draw_pile + fromPiles = fromPiles or room.draw_pile + + --THIS IS STUPID! + if pattern == "damage_card" then + pattern = "slash,duel,savage_assault,archery_attack,fire_attack,thunder" + elseif pattern == "nondamage_card" then + pattern = "jink,peach,dismantlement,snatch,collateral,nullification,indulgence,amazing_grace,god_salvation".. + "crossbow,double_swords,qinggang_sword,ice_sword,axe,spear,blade,halberd,kylin_bow,eight_diagram,nioh_shield,chitu,dayuan,dilu,jueying,zixing,zhuahuangfeidian".. + "analeptic,iron_chain,supply_shortage".. + "guding_blade,fan,silver_lion,vine,hualiu" + end --THIS IS STUPID! if pattern == "damage_card" then @@ -1376,17 +1386,17 @@ local yuqi = fk.CreateTriggerSkill{ player:drawCards(n2) end, - refresh_events = {fk.DrawInitialCards, fk.EventPhaseStart}, -- FIXME: can't trigger at fk.GameStart? + refresh_events = {fk.GameStart, fk.EventPhaseStart}, can_refresh = function(self, event, target, player, data) - if event == fk.DrawInitialCards then - return target == player and target:hasSkill(self.name) + if event == fk.GameStart then + return player:hasSkill(self.name) else - return target.phase == Player.NotActive + return player:hasSkill(self.name) and target.phase == Player.NotActive end end, on_refresh = function(self, event, target, player, data) local room = player.room - if event == fk.DrawInitialCards then + if event == fk.GameStart then room:setPlayerMark(player, "yuqi2", 3) room:setPlayerMark(player, "yuqi3", 1) room:setPlayerMark(player, "yuqi4", 1) @@ -1572,12 +1582,13 @@ local zhouxuan = General(extension, "zhouxuan", "wei", 3) local wumei = fk.CreateTriggerSkill{ name = "wumei", anim_type = "control", - events = {fk.EventPhaseStart}, + events = {fk.EventPhaseChanging}, can_trigger = function(self, event, target, player, data) - return target == player and player:hasSkill(self.name) and player.phase == Player.RoundStart and player:getMark("wumei") == 0 + return target == player and player:hasSkill(self.name) and data.to == Player.Start and player:getMark("wumei") == 0 end, on_cost = function(self, event, target, player, data) - local p = player.room:askForChoosePlayers(player, table.map(player.room:getAlivePlayers(), function(p) return p.id end), 1, 1, "#wumei-choose", self.name) + local room = player.room + local p = room:askForChoosePlayers(player, table.map(room:getAlivePlayers(), function(p) return p.id end), 1, 1, "#wumei-choose", self.name) if #p > 0 then self.cost_data = p[1] return true @@ -1594,17 +1605,17 @@ local wumei = fk.CreateTriggerSkill{ to:gainAnExtraTurn() end, - refresh_events = {fk.EventPhaseStart, fk.TurnStart}, + refresh_events = {fk.EventPhaseChanging, fk.EventPhaseStart}, can_refresh = function(self, event, target, player, data) - if event == fk.EventPhaseStart then - return player.phase == Player.NotActive and player:getMark("wumei_extra") > 0 + if event == fk.EventPhaseChanging then + return data.to == Player.NotActive and player:getMark("wumei_extra") > 0 else - return target.seat == 1 + return target == player and target.seat == 1 and player.phase == Player.RoundStart and player:getMark("wumei_extra") == 0 end end, on_refresh = function(self, event, target, player, data) local room = player.room - if event == fk.EventPhaseStart then + if event == fk.EventPhaseChanging then room:setPlayerMark(player, "wumei_extra", 0) for _, p in ipairs(room:getAlivePlayers()) do p.hp = p:getMark("wumei_hp") @@ -1778,11 +1789,118 @@ Fk:loadTranslationTable{ [":wumei"] = "每轮限一次,回合开始前,你可以令一名角色执行一个额外的回合:该回合结束时,将所有存活角色的体力值调整为此额外回合开始时的数值。", ["zhanmeng"] = "占梦", [":zhanmeng"] = "你使用牌时,可以执行以下一项(每回合每项各限一次):1.上一回合内,若没有同名牌被使用,你获得一张非伤害牌。2.下一回合内,当同名牌首次被使用后,你获得一张伤害牌。3.令一名其他角色弃置两张牌,若点数之和大于10,对其造成1点火焰伤害。", - ["#wumei-choose"] = "占梦: 你可以令一名角色执行一个额外的回合", + ["#wumei-choose"] = "寤寐: 你可以令一名角色执行一个额外的回合", ["zhanmeng1"] = "你获得一张非伤害牌", ["zhanmeng2"] = "下一回合内,当同名牌首次被使用后,你获得一张伤害牌", ["zhanmeng3"] = "令一名其他角色弃置两张牌,若点数之和大于10,对其造成1点火焰伤害", ["#zhanmeng-choose"] = "占梦: 令一名其他角色弃置两张牌,若点数之和大于10,对其造成1点火焰伤害", } +local zhangxuan = General(extension, "zhangxuan", "wu", 4, 4, General.Female) +local tongli = fk.CreateTriggerSkill{ + name = "tongli", + anim_type = "offensive", + events = {fk.TargetSpecified}, + can_trigger = function(self, event, target, player, data) + if target == player and player:hasSkill(self.name) and player.phase == Player.Play and player:getMark(self.name) == 0 then + local suits = {} + for _, id in ipairs(player.player_cards[Player.Hand]) do + table.insertIfNeed(suits, Fk:getCardById(id).suit) + end + return #suits == player:getMark("@tongli") + end + end, + on_use = function(self, event, target, player, data) + player.room:setPlayerMark(player, self.name, player:getMark("@tongli")) + end, + + refresh_events = {fk.PreCardUse, fk.PreCardRespond, fk.EventPhaseStart, fk.CardUseFinished}, + can_refresh = function(self, event, target, player, data) + if target == player and player:hasSkill(self.name) then + if event == fk.PreCardUse or event == fk.PreCardRespond then + return player.phase == Player.Play + elseif event == fk.EventPhaseStart then + return player.phase == Player.NotActive + else + return player:getMark(self.name) > 0 + end + end + end, + on_refresh = function(self, event, target, player, data) + local room = player.room + if event == fk.PreCardUse or event == fk.PreCardRespond then + room:addPlayerMark(player, "@tongli", 1) + elseif event == fk.EventPhaseStart then + room:setPlayerMark(player, "@tongli", 0) + else + local n = player:getMark(self.name) + local use = { + from = data.from, + card = Fk:cloneCard(data.card.name), + tos = data.tos, + nullifiedTargets = data.nullifiedTargets, + } + for i = 1, n, 1 do --TODO: modify this to tenyear's effect + if not player.dead then + room:doCardUseEffect(use) + end + end + room:setPlayerMark(player, self.name, 0) + end + end, +} +local shezang = fk.CreateTriggerSkill{ + name = "shezang", + anim_type = "drawcard", + events = {fk.Dying}, + frequency = Skill.Compulsory, + can_trigger = function(self, event, target, player, data) + return player:hasSkill(self.name) and (target == player or player.phase ~= Player.NotActive) and player:getMark(self.name) == 0 + end, + on_use = function(self, event, target, player, data) + local room = player.room + room:addPlayerMark(player, self.name, 1) + local suits = {"spade", "club", "heart", "diamond"} + local cards = {} + while #suits > 0 do + local pattern = suits[math.random(1, #suits)] + table.removeOne(suits, pattern) + table.insert(cards, getCardByPattern(room, ".|.|"..pattern)) + end + if #cards > 0 then + room:moveCards({ + ids = cards, + to = player.id, + toArea = Card.PlayerHand, + moveReason = fk.ReasonPrey, + proposer = player.id, + skillName = self.name, + }) + end + end, + + refresh_events = {fk.EventPhaseStart}, + can_refresh = function(self, event, target, player, data) + return target == player and target.seat == 1 and player.phase == Player.RoundStart-- and player:getMark("extra_trun") == 0 TODO: fangquan? + end, + on_refresh = function(self, event, target, player, data) + local room = player.room + for _, p in ipairs(room:getAlivePlayers()) do + if p:getMark(self.name) > 0 then + room:setPlayerMark(p, self.name, 0) + end + end +end, +} +zhangxuan:addSkill(tongli) +zhangxuan:addSkill(shezang) +Fk:loadTranslationTable{ + ["zhangxuan"] = "张嫙", + ["tongli"] = "同礼", + [":tongli"] = "出牌阶段,当你使用牌指定目标后,若你手牌中的花色数等于你此阶段已使用牌的张数,你可令此牌效果额外执行X次(X为你手牌中的花色数)。", + ["shezang"] = "奢葬", + [":shezang"] = "每轮限一次,当你或你回合内有角色进入濒死状态时,你可以从牌堆获得不同花色的牌各一张。", + ["@tongli"] = "同礼", +} + return {extension}