From a51806f90295862167e4574b6c5af055c9168c66 Mon Sep 17 00:00:00 2001 From: notify Date: Sat, 8 Apr 2023 20:45:55 +0800 Subject: [PATCH] Fixbug2 (#107) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修了窃听移走装备不失去装备技能 询问无懈时减少CPU使用 将skill.interaction的数据传到服务器 自动清除诸如-round结尾的标记 增加了和 轮次流程 相关的游戏流程与时机 --- docs/dev/compile.rst | 2 +- lua/core/util.lua | 8 ++++++ lua/server/event.lua | 4 +-- lua/server/events/gameflow.lua | 17 ++++++++++++ lua/server/events/init.lua | 5 ++-- lua/server/events/movecard.lua | 9 ++++++- lua/server/gamelogic.lua | 3 +-- lua/server/room.lua | 3 +++ packages/standard/game_rule.lua | 46 +++++++++++++++++++++------------ packages/test/init.lua | 27 +++++++++++++++++++ qml/Pages/Room.qml | 1 + qml/Pages/RoomLogic.js | 1 + 12 files changed, 102 insertions(+), 24 deletions(-) diff --git a/docs/dev/compile.rst b/docs/dev/compile.rst index db60d92d..2cd9ec10 100644 --- a/docs/dev/compile.rst +++ b/docs/dev/compile.rst @@ -74,7 +74,7 @@ Arch Linux: 如果你使用 Nix/NixOs 的话,可以在clone repo后直接使用 nix flake 构建: .. code:: sh - + $ git clone https://github.com/Notify-ctrl/FreeKill $ nix build '.?submodules=1' diff --git a/lua/core/util.lua b/lua/core/util.lua index 2b9e9855..b658767d 100644 --- a/lua/core/util.lua +++ b/lua/core/util.lua @@ -207,6 +207,14 @@ function string:split(delimiter) return result end +function string:startsWith(start) + return self:sub(1, #start) == start +end + +function string:endsWith(e) + return e == "" or self:sub(-#e) == e +end + ---@class Sql Sql = { ---@param filename string diff --git a/lua/server/event.lua b/lua/server/event.lua index c6946d08..d6fc45d2 100644 --- a/lua/server/event.lua +++ b/lua/server/event.lua @@ -33,8 +33,8 @@ fk.AskForRetrial = 25 fk.FinishRetrial = 26 fk.FinishJudge = 27 -fk.Empty28 = 28 -fk.Empty29 = 29 +fk.RoundStart = 28 +fk.RoundEnd = 29 fk.TurnedOver = 30 fk.ChainStateChanged = 31 diff --git a/lua/server/events/gameflow.lua b/lua/server/events/gameflow.lua index 0129568c..927ca2c7 100644 --- a/lua/server/events/gameflow.lua +++ b/lua/server/events/gameflow.lua @@ -5,6 +5,23 @@ GameEvent.functions[GameEvent.DrawInitial] = function(self) end end +GameEvent.functions[GameEvent.Round] = function(self) + local room = self.room + local logic = room.logic + local p + + logic:trigger(fk.RoundStart, room.current) + + repeat + p = room.current + GameEvent(GameEvent.Turn):exec() + if room.game_finished then break end + room.current = room.current:getNextAlive() + until p.seat > p:getNextAlive().seat + + logic:trigger(fk.RoundEnd, p) +end + GameEvent.functions[GameEvent.Turn] = function(self) local room = self.room room.logic:trigger(fk.TurnStart, room.current) diff --git a/lua/server/events/init.lua b/lua/server/events/init.lua index bb41ac1a..44a486cb 100644 --- a/lua/server/events/init.lua +++ b/lua/server/events/init.lua @@ -27,10 +27,11 @@ GameEvent.Judge = 14 dofile "lua/server/events/judge.lua" GameEvent.DrawInitial = 15 -GameEvent.Turn = 16 +GameEvent.Round = 16 +GameEvent.Turn = 17 dofile "lua/server/events/gameflow.lua" -GameEvent.Pindian = 17 +GameEvent.Pindian = 18 dofile "lua/server/events/pindian.lua" -- TODO: fix this diff --git a/lua/server/events/movecard.lua b/lua/server/events/movecard.lua index d2579b41..346cadae 100644 --- a/lua/server/events/movecard.lua +++ b/lua/server/events/movecard.lua @@ -105,7 +105,14 @@ GameEvent.functions[GameEvent.MoveCards] = function(self) currentCard.equip_skill then currentCard:onInstall(self, self:getPlayerById(data.to)) - elseif realFromArea == Player.Equip and currentCard.type == Card.TypeEquip and data.from ~= nil and currentCard.equip_skill then + end + + if + realFromArea == Player.Equip and + currentCard.type == Card.TypeEquip and + data.from ~= nil and + currentCard.equip_skill + then currentCard:onUninstall(self, self:getPlayerById(data.from)) end end diff --git a/lua/server/gamelogic.lua b/lua/server/gamelogic.lua index 598b9838..b6eadd77 100644 --- a/lua/server/gamelogic.lua +++ b/lua/server/gamelogic.lua @@ -166,9 +166,8 @@ function GameLogic:action() execGameEvent(GameEvent.DrawInitial) while true do - execGameEvent(GameEvent.Turn) + execGameEvent(GameEvent.Round) if room.game_finished then break end - room.current = room.current:getNextAlive() end end diff --git a/lua/server/room.lua b/lua/server/room.lua index 3c44527b..9381696e 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -509,6 +509,8 @@ function Room:doRaceRequest(command, players, jsonData) if #players == #canceled_players then return nil end + + fk.QThread_msleep(10) end end @@ -1212,6 +1214,7 @@ function Room:handleUseCardReply(player, data) local card_data = json.decode(card) local skill = Fk.skills[card_data.skill] local selected_cards = card_data.subcards + if skill.interaction then skill.interaction.data = data.interaction_data end if skill:isInstanceOf(ActiveSkill) then self:useSkill(player, skill, function() self:doIndicate(player.id, targets) diff --git a/packages/standard/game_rule.lua b/packages/standard/game_rule.lua index 9657e361..d7e323bc 100644 --- a/packages/standard/game_rule.lua +++ b/packages/standard/game_rule.lua @@ -41,6 +41,7 @@ GameRule = fk.CreateTriggerSkill{ refresh_events = { fk.GameStart, fk.DrawInitialCards, fk.TurnStart, fk.EventPhaseProceeding, fk.EventPhaseEnd, fk.EventPhaseChanging, + fk.RoundStart, fk.AskForPeaches, fk.AskForPeachesDone, fk.GameOverJudge, fk.BuryVictim, }, @@ -51,17 +52,18 @@ GameRule = fk.CreateTriggerSkill{ end, on_refresh = function(self, event, target, player, data) - if RoomInstance.tag["SkipGameRule"] then - RoomInstance.tag["SkipGameRule"] = false + local room = player.room + if room:getTag("SkipGameRule") then + room:setTag("SkipGameRule", false) return false end if event == fk.GameStart then - RoomInstance.tag["FirstRound"] = true + room:setTag("FirstRound", true) + room:setTag("RoundCount", 0) return false end - local room = player.room switch(event, { [fk.DrawInitialCards] = function() if data.num > 0 then @@ -89,25 +91,27 @@ GameRule = fk.CreateTriggerSkill{ room.logic:trigger(fk.AfterDrawInitialCards, player, data) end end, - [fk.TurnStart] = function() - player = room.current - if room.tag["FirstRound"] == true then - room.tag["FirstRound"] = false - player:setFlag("Global_FirstRound") + [fk.RoundStart] = function() + if room:getTag("FirstRound") then + room:setTag("FirstRound", false) end - if player.seat == 1 then - for _, p in ipairs(room.players) do - p:setCardUseHistory("", 0, Player.HistoryRound) - p:setSkillUseHistory("", 0, Player.HistoryRound) + room:setTag("RoundCount", room:getTag("RoundCount") + 1) + + for _, p in ipairs(room.players) do + p:setCardUseHistory("", 0, Player.HistoryRound) + p:setSkillUseHistory("", 0, Player.HistoryRound) + for name, _ in pairs(p.mark) do + if name:endsWith("-round") then + room:setPlayerMark(p, name, 0) + end end end room:sendLog{ type = "$AppendSeparator" } - - player:addMark("Global_TurnCount") + end, + [fk.TurnStart] = function() if not player.faceup then - player:setFlag("-Global_FirstRound") player:turnOver() elseif not player.dead then player:play() @@ -185,6 +189,11 @@ GameRule = fk.CreateTriggerSkill{ for _, p in ipairs(room.players) do p:setCardUseHistory("", 0, Player.HistoryPhase) p:setSkillUseHistory("", 0, Player.HistoryPhase) + for name, _ in pairs(p.mark) do + if name:endsWith("-phase") then + room:setPlayerMark(p, name, 0) + end + end end end end, @@ -194,6 +203,11 @@ GameRule = fk.CreateTriggerSkill{ for _, p in ipairs(room.players) do p:setCardUseHistory("", 0, Player.HistoryTurn) p:setSkillUseHistory("", 0, Player.HistoryTurn) + for name, _ in pairs(p.mark) do + if name:endsWith("-turn") then + room:setPlayerMark(p, name, 0) + end + end end end end, diff --git a/packages/test/init.lua b/packages/test/init.lua index 804ee384..c49723be 100644 --- a/packages/test/init.lua +++ b/packages/test/init.lua @@ -91,10 +91,37 @@ local test_active = fk.CreateActiveSkill{ -- p(cards) end, } +local test_vs = fk.CreateViewAsSkill{ + name = "test_vs", + card_filter = function(self, to_select, selected) + return #selected == 0 + end, + interaction = UI.ComboBox { + choices = { + "ex_nihilo", + "duel", + "snatch", + "dismantlement", + "savage_assault", + "archery_attack", + } + }, + view_as = function(self, cards) + if #cards ~= 1 then + return nil + end + if not self.interaction.data then return end + local c = Fk:cloneCard(self.interaction.data) + c.skillName = self.name + c:addSubcard(cards[1]) + return c + end, +} local test2 = General(extension, "mouxusheng", "wu", 4, 4, General.Female) test2:addSkill("rende") test2:addSkill(cheat) test2:addSkill(test_active) +test2:addSkill(test_vs) Fk:loadTranslationTable{ ["test"] = "测试", diff --git a/qml/Pages/Room.qml b/qml/Pages/Room.qml index 51d491db..6d288b89 100644 --- a/qml/Pages/Room.qml +++ b/qml/Pages/Room.qml @@ -27,6 +27,7 @@ Item { property alias dynamicCardArea: dynamicCardArea property alias tableCards: tablePile.cards property alias dashboard: dashboard + property alias skillInteraction: skillInteraction property var selected_targets: [] property string responding_card diff --git a/qml/Pages/RoomLogic.js b/qml/Pages/RoomLogic.js index 69e6ac0e..44a05862 100644 --- a/qml/Pages/RoomLogic.js +++ b/qml/Pages/RoomLogic.js @@ -70,6 +70,7 @@ function doOkButton() { card: dashboard.getSelectedCard(), targets: selected_targets, special_skill: roomScene.getCurrentCardUseMethod(), + interaction_data: roomScene.skillInteraction.item ? roomScene.skillInteraction.item.answer : undefined, } )); return;