diff --git a/lua/client/i18n/zh_CN.lua b/lua/client/i18n/zh_CN.lua index 4465fc90c6d576f924729a17478b987f6bbda55a..801646e7518ffff61b21da50407dc74f23ff9445 100644 --- a/lua/client/i18n/zh_CN.lua +++ b/lua/client/i18n/zh_CN.lua @@ -360,12 +360,15 @@ Fk:loadTranslationTable{ ["hp_lost"] = "失去体力", ["lose_hp"] = "失去体力", + ["phase_roundstart"] = "回合开始", ["phase_start"] = "准备阶段", ["phase_judge"] = "判定阶段", ["phase_draw"] = "摸牌阶段", ["phase_play"] = "出牌阶段", ["phase_discard"] = "弃牌阶段", ["phase_finish"] = "结束阶段", + ["phase_notactive"] = "回合外", + ["phase_phasenone"] = "临时阶段", ["chained"] = "横置", ["un-chained"] = "重置", @@ -495,6 +498,7 @@ Fk:loadTranslationTable{ ["#TurnOver"] = "%from 将武将牌翻面,现在是 %arg", ["face_up"] = "正面朝上", ["face_down"] = "背面朝上", + ["turnOver"] = "翻面", -- damage, heal and lose HP ["#Damage"] = "%to 对 %from 造成了 %arg 点 %arg2 伤害", diff --git a/lua/core/card.lua b/lua/core/card.lua index 9b86283c485c994b06bffcf9a4f4662d914bcf66..9d6a026be98df9d56ff3ca14726bc8e898438ce4 100644 --- a/lua/core/card.lua +++ b/lua/core/card.lua @@ -20,7 +20,7 @@ ---@field public skillName string @ 虚拟牌的技能名 for virtual cards ---@field private _skillName string ---@field public skillNames string[] @ 虚拟牌的技能名们(一张虚拟牌可能有多个技能名,如芳魂、龙胆、朱雀羽扇) ----@field public skill Skill @ 技能(用于实现卡牌效果) +---@field public skill ActiveSkill @ 技能(用于实现卡牌效果) ---@field public special_skills? string[] @ 衍生技能,如重铸 ---@field public is_damage_card boolean @ 是否为会造成伤害的牌 ---@field public multiple_targets boolean @ 是否为指定多个目标的牌 diff --git a/lua/core/util.lua b/lua/core/util.lua index 3d2f223453aafa3d83e73fc272ff6e5399295e8c..eb2066536955509e323d608b354d626133e93596 100644 --- a/lua/core/util.lua +++ b/lua/core/util.lua @@ -133,6 +133,23 @@ Util.Name2SkillMapper = function(e) return Fk.skills[e] end --- 返回译文 Util.TranslateMapper = function(str) return Fk:translate(str) end +-- 阶段int型和string型互换 +---@return string|integer +Util.PhaseStrMapper = function(phase) + local phase_table = { + [Player.RoundStart] = "phase_roundstart", + [Player.Start] = "phase_start", + [Player.Judge] = "phase_judge", + [Player.Draw] = "phase_draw", + [Player.Play] = "phase_play", + [Player.Discard] = "phase_discard", + [Player.Finish] = "phase_finish", + [Player.NotActive] = "phase_notactive", + [Player.PhaseNone] = "phase_phasenone", + } + return type(phase) == "string" and table.indexOf(phase_table, phase) or phase_table[phase] +end + -- for card preset --- 全局卡牌(包括自己)的canUse diff --git a/lua/server/room.lua b/lua/server/room.lua index 809066ca7d589248ad1be873f4d9a4c554c1f37f..8aac9d39468284c3beceb1d525bb03a1c235101b 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -1388,6 +1388,11 @@ function Room:askForCard(player, minNum, maxNum, includeEquip, skillName, cancel else if cancelable then return {} end local cards = player:getCardIds("he&") + if type(expand_pile) == "string" then + table.insertTable(cards, player:getPile(expand_pile)) + elseif type(expand_pile) == "table" then + table.insertTable(cards, expand_pile) + end local exp = Exppattern:Parse(pattern) cards = table.filter(cards, function(cid) return exp:match(Fk:getCardById(cid)) @@ -2537,13 +2542,36 @@ function Room:askForAG(player, id_list, cancelable, reason) end --- 给player发一条消息,在他的窗口中用一系列卡牌填充一个AG。 ----@param player ServerPlayer @ 要通知的玩家 +---@param players ServerPlayer|ServerPlayer[] @ 要通知的玩家 ---@param id_list integer[] | Card[] @ 要填充的卡牌 ----@param disable_ids? integer[] | Card[] @ 未使用 -function Room:fillAG(player, id_list, disable_ids) +---@param disable_ids? integer[] | Card[] @ 未使用 不能选择的牌 +function Room:fillAG(players, id_list, disable_ids) + local record = self:getTag("AGrecord") or {} + local new = true + if players.id ~= nil then + --- FIXEME: 很危险的判断,AG以后肯定要大改了,先这样算了 + if #record > 0 and record[#record][2][1] == id_list[1] then + new = false + table.insert(record[#record][1], players.id) + end + players = { players } + end id_list = Card:getIdList(id_list) -- disable_ids = Card:getIdList(disable_ids) - player:doNotify("FillAG", json.encode{ id_list, disable_ids }) + if new then + --[[ 不用关闭AG,开新AG会覆盖 + if #record > 0 then + for _, pid in ipairs(record[#record][1]) do + self:getPlayerById(pid):doNotify("CloseAG", "") + end + end + --]] + table.insert(record, {table.map(players, Util.IdMapper), id_list, disable_ids, {}}) + end + self:setTag("AGrecord", record) + for _, player in ipairs(players) do + player:doNotify("FillAG", json.encode{ id_list, disable_ids }) + end end --- 告诉一些玩家,AG中的牌被taker取走了。 @@ -2552,6 +2580,12 @@ end ---@param notify_list? ServerPlayer[] @ 要告知的玩家,默认为全员 function Room:takeAG(taker, id, notify_list) self:doBroadcastNotify("TakeAG", json.encode{ taker.id, id }, notify_list) + local record = self:getTag("AGrecord") or {} + if #record > 0 then + local currentRecord = record[#record] + currentRecord[4][tostring(id)] = taker.id + self:setTag("AGrecord", record) + end end --- 关闭player那侧显示的AG。 @@ -2559,8 +2593,31 @@ end --- 若不传参(即player为nil),那么关闭所有玩家的AG。 ---@param player? ServerPlayer @ 要关闭AG的玩家 function Room:closeAG(player) + local record = self:getTag("AGrecord") or {} if player then player:doNotify("CloseAG", "") - else self:doBroadcastNotify("CloseAG", "") end + else + self:doBroadcastNotify("CloseAG", "") + end + if #record > 0 then + local currentRecord = record[#record] + if player then + table.removeOne(currentRecord[1], player.id) + self:setTag("AGrecord", record) + if #currentRecord[1] > 0 then return end + end + table.remove(record, #record) + self:setTag("AGrecord", record) + if #record > 0 then + local newRecord = record[#record] + local players = table.map(newRecord[1], Util.Id2PlayerMapper) + for _, p in ipairs(players) do + p:doNotify("FillAG", json.encode{ newRecord[2], newRecord[3] }) + end + for cid, pid in pairs(newRecord[4]) do + self:doBroadcastNotify("TakeAG", json.encode{ pid, tonumber(cid) }, players) + end + end + end end -- TODO: 重构request机制,不然这个还得手动拿client_reply diff --git a/lua/server/serverplayer.lua b/lua/server/serverplayer.lua index c47aa21ba3565d6a18690312c7f621ac5c580014..f3548bf57f816b9cd590f38ce81e24d9cde50984 100644 --- a/lua/server/serverplayer.lua +++ b/lua/server/serverplayer.lua @@ -356,12 +356,7 @@ function ServerPlayer:showCards(cards) room.logic:trigger(fk.CardShown, self, { cardIds = cards }) end -local phase_name_table = { - [Player.Judge] = "phase_judge", - [Player.Draw] = "phase_draw", - [Player.Play] = "phase_play", - [Player.Discard] = "phase_discard", -} + ---@param from_phase Phase ---@param to_phase Phase @@ -428,7 +423,7 @@ function ServerPlayer:gainAnExtraPhase(phase, delay) room:sendLog{ type = "#GainAnExtraPhase", from = self.id, - arg = phase_name_table[phase], + arg = Util.PhaseStrMapper(phase), } GameEvent.Phase:create(self, self.phase):exec() @@ -442,7 +437,7 @@ function ServerPlayer:gainAnExtraPhase(phase, delay) room:sendLog{ type = "#PhaseSkipped", from = self.id, - arg = phase_name_table[phase], + arg = Util.PhaseStrMapper(phase), } end @@ -515,7 +510,7 @@ function ServerPlayer:play(phase_table) room:sendLog{ type = "#PhaseSkipped", from = self.id, - arg = phase_name_table[self.phase], + arg = Util.PhaseStrMapper(self.phase), } end end