diff --git a/lua/core/card.lua b/lua/core/card.lua index 9d6a026be98df9d56ff3ca14726bc8e898438ce4..020a1c52d3d922d240972f68aefe8cfa553473c2 100644 --- a/lua/core/card.lua +++ b/lua/core/card.lua @@ -90,6 +90,8 @@ function Card:initialize(name, suit, number, color) self.color = Card.Red elseif color ~= nil then self.color = color + elseif suit == Card.Unknown then + self.color = Card.Unknown else self.color = Card.NoColor end @@ -242,7 +244,7 @@ end ---@return string @ 描述花色的字符串 function Card:getSuitString(symbol) local suit = self.suit - local ret + local ret = "unknown" if suit == Card.Spade then ret = "spade" elseif suit == Card.Heart then @@ -251,7 +253,7 @@ function Card:getSuitString(symbol) ret = "club" elseif suit == Card.Diamond then ret = "diamond" - else + elseif suit == Card.NoSuit then ret = "nosuit" end return symbol and "log_" .. ret or ret @@ -265,8 +267,10 @@ function Card:getColorString() return "black" elseif color == Card.Red then return "red" + elseif color == Card.NoColor then + return "nocolor" end - return "nocolor" + return "unknown" end --- 获取卡牌类型并返回类型描述(例如基本牌/锦囊牌/装备牌)。 @@ -426,8 +430,11 @@ end --- 比较两张卡牌的花色是否相同 ---@param anotherCard Card @ 另一张卡牌 ---@param diff? boolean @ 比较二者不同 ----@return boolean 返回比较结果 +---@return boolean @ 返回比较结果 function Card:compareSuitWith(anotherCard, diff) + if table.contains({ self.suit, anotherCard.suit }, Card.Unknown) then + return true + end if self ~= anotherCard and table.contains({ self.suit, anotherCard.suit }, Card.NoSuit) then return false end @@ -444,6 +451,9 @@ end ---@param diff? boolean @ 比较二者不同 ---@return boolean @ 返回比较结果 function Card:compareColorWith(anotherCard, diff) + if table.contains({ self.color, anotherCard.color }, Card.Unknown) then + return true + end if self ~= anotherCard and table.contains({ self.color, anotherCard.color }, Card.NoColor) then return false end diff --git a/lua/core/exppattern.lua b/lua/core/exppattern.lua index 1e73c3f6a8bb1c0ca80035038b26be71acd5f232..f9c53486f83a61091e9ff02fbfc7afb57ab05373 100644 --- a/lua/core/exppattern.lua +++ b/lua/core/exppattern.lua @@ -33,6 +33,7 @@ ---@field public id? integer[] -- v0.2.6改动: cardType会被解析为trueName数组和name数组,而不是自己单独成立 +-- core改动: name数组为空时,将根据trueName数组生成对应的name数组 local numbertable = { ["A"] = 1, @@ -48,6 +49,8 @@ local placetable = { local card_type_table = {} +local card_truename_table = {} + local function fillCardTypeTable() local tmp = {} for _, cd in ipairs(Fk.cards) do @@ -66,6 +69,20 @@ local function fillCardTypeTable() end end +local function fillCardTrueNameTable() + local tmp = {} + for _, cd in ipairs(Fk.cards) do + local tn = cd.trueName + local n = cd.name + + if not tmp[n] then + card_truename_table[tn] = card_truename_table[tn] or {} + table.insertIfNeed(card_truename_table[tn], n) + tmp[n] = true + end + end +end + local function matchSingleKey(matcher, card, key) local match = matcher[key] if not match then return true end @@ -302,7 +319,9 @@ local function parseMatcher(str) ret.suit = not table.contains(t[3], ".") and t[3] or nil ret.place = not table.contains(t[4], ".") and t[4] or nil - ret.name = not table.contains(t[5], ".") and t[5] or nil + if table.empty(card_truename_table) then + fillCardTrueNameTable() + end -- ret.cardType = not table.contains(t[6], ".") and t[6] or nil if table.empty(card_type_table) then fillCardTypeTable() @@ -325,6 +344,29 @@ local function parseMatcher(str) table.insert(ret.trueName.neg, temp) end + if table.contains(t[5], ".") then + if ret.trueName then + ret.name = {} + for _, tn in ipairs(ret.trueName) do + table.insertTableIfNeed(ret.name, card_truename_table[tn] or Util.DummyTable) + end + for _, neg in ipairs(ret.trueName.neg or Util.DummyTable) do + if type(neg) ~= "table" then neg = { neg } end + if not ret.name.neg then ret.name.neg = {} end + + local temp = {} + for _, tn in ipairs(neg) do + table.insertTableIfNeed(temp, card_truename_table[tn] or Util.DummyTable) + end + table.insert(ret.name.neg, temp) + end + else + ret.name = nil + end + else + ret.name = t[5] + end + if not table.contains(t[7], ".") then ret.id = parseRawNumTable(t[7]) end diff --git a/lua/core/game_mode.lua b/lua/core/game_mode.lua index 55c3ea794816efd9e2a8ac3aa8679a346e18a0b1..8229cf659b89e66416d134b1977dfa9c8e2325f1 100644 --- a/lua/core/game_mode.lua +++ b/lua/core/game_mode.lua @@ -100,4 +100,14 @@ function GameMode:getAdjustedProperty (player) return list end +--- 向游戏模式中添加拓展包过滤。 +---@param whitelist string[] @ 白名单 +---@param blacklist string[] @ 黑名单 +function GameMode:addPackageFilter(whitelist, blacklist) + assert(type(whitelist) == "table") + assert(type(blacklist) == "table") + table.insertTable(self.whitelist, whitelist) + table.insertTable(self.blacklist, blacklist) +end + return GameMode diff --git a/lua/server/room.lua b/lua/server/room.lua index 02b51c02e7df5c81a8a9326ad9b6222a3823c27c..6d1bb0bb78e3ce6fb98c2306d27cc85cbda90824 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -1312,7 +1312,7 @@ end ---@param expand_pile? string @ 可选私人牌堆名称,如要分配你武将牌上的牌请填写 ---@param skipMove? boolean @ 是否跳过移动。默认不跳过 ---@param single_max? integer|table @ 限制每人能获得的最大牌数。输入整数或(以角色id为键以整数为值)的表 ----@return table @ 返回一个表,键为角色id,值为分配给其的牌id数组 +---@return table @ 返回一个表,键为角色id转字符串,值为分配给其的牌id数组 function Room:askForYiji(player, cards, targets, skillName, minNum, maxNum, prompt, expand_pile, skipMove, single_max) targets = targets or self.alive_players cards = cards or player:getCardIds("he") @@ -1347,7 +1347,7 @@ function Room:askForYiji(player, cards, targets, skillName, minNum, maxNum, prom residued_list = residueMap, expand_pile = expand_pile } - p(json.encode(residueMap)) + -- p(json.encode(residueMap)) while maxNum > 0 and #_cards > 0 do data.max_num = maxNum @@ -1384,7 +1384,7 @@ function Room:askForYiji(player, cards, targets, skillName, minNum, maxNum, prom end end if not skipMove then - self:doYiji(self, list, player.id, skillName) + self:doYiji(list, player.id, skillName) end return list @@ -2019,18 +2019,20 @@ end --- 询问玩家任意交换几堆牌堆。 --- ---@param player ServerPlayer @ 要询问的玩家 ----@param piles table @ 卡牌id列表的列表,也就是……几堆牌堆的集合 ----@param piles_name string[] @ 牌堆名,必须一一对应,否则统一替换为“牌堆X” +---@param piles (integer[])[] @ 卡牌id列表的列表,也就是……几堆牌堆的集合 +---@param piles_name string[] @ 牌堆名,不足部分替换为“牌堆1、牌堆2...” ---@param customNotify? string @ 自定义读条操作提示 ----@return table +---@return (integer[])[] function Room:askForExchange(player, piles, piles_name, customNotify) local command = "AskForExchange" piles_name = piles_name or Util.DummyTable - if #piles_name ~= #piles then - piles_name = {} - for i, _ in ipairs(piles) do + local x = #piles - #piles_name + if x > 0 then + for i = 1, x, 1 do table.insert(piles_name, Fk:translate("Pile") .. i) end + elseif x < 0 then + piles_name = table.slice(piles_name, 1, #piles + 1) end self:notifyMoveFocus(player, customNotify or command) local data = { diff --git a/standard/game_rule.lua b/standard/game_rule.lua index b5ba5a8e34a5c424b4114c875fe20998e6699ac0..6e8c57fd6d3649c2e5697afbb7f894b2ca031065 100644 --- a/standard/game_rule.lua +++ b/standard/game_rule.lua @@ -48,6 +48,7 @@ GameRule = fk.CreateTriggerSkill{ end cardNames = table.filter(cardNames, function (cardName) + -- FIXME: 应该印一个“任何情况都适合”的牌,或者说根本不该有这个过滤 local cardCloned = Fk:cloneCard(cardName) return not (player:prohibitUse(cardCloned) or player:isProhibited(dyingPlayer, cardCloned)) end) diff --git a/standard_cards/i18n/en_US.lua b/standard_cards/i18n/en_US.lua index 4a353c525a7773e0123e944a249aeb5e886658f3..4ea3df5f7bf32d7aa3c7918e6d720cfa9bc23223 100644 --- a/standard_cards/i18n/en_US.lua +++ b/standard_cards/i18n/en_US.lua @@ -8,7 +8,8 @@ Fk:loadTranslationTable({ ["log_heart"] = '', ["log_club"] = '♣', ["log_diamond"] = '', - ["log_nosuit"] = "No suit", + ["log_nosuit"] = "X", + ["log_unknown"] = "?", -- ["spade"] = "Spade", -- ["heart"] = "Heart", -- ["club"] = "Club", diff --git a/standard_cards/i18n/zh_CN.lua b/standard_cards/i18n/zh_CN.lua index f5a6afa26eb87b159df93b8a22e73c6c4e9acd2c..39d90453e35d63d3ce3d025a5f44759c31866e9a 100644 --- a/standard_cards/i18n/zh_CN.lua +++ b/standard_cards/i18n/zh_CN.lua @@ -8,7 +8,9 @@ Fk:loadTranslationTable{ ["log_heart"] = '', ["log_club"] = '♣', ["log_diamond"] = '', - ["log_nosuit"] = "无花色", + ["log_nosuit"] = "X", + ["log_unknown"] = "?", + ["unknown"] = "未知", ["spade"] = "黑桃", ["heart"] = "红桃", ["club"] = "梅花",