From 706d01b627d4a52972feceb6dec8ffca60fa0d5d Mon Sep 17 00:00:00 2001 From: seven <786852516@qq.com> Date: Sat, 20 Apr 2024 18:49:06 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9A=90=E5=8C=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/core/game_mode.lua | 12 +++++++++ lua/fk_ex.lua | 4 +++ lua/server/gamelogic.lua | 54 +++++++++++++++++++++------------------- lua/server/room.lua | 35 ++++++++++++++++++++++++++ standard/init.lua | 34 ++++++++----------------- 5 files changed, 91 insertions(+), 48 deletions(-) diff --git a/lua/core/game_mode.lua b/lua/core/game_mode.lua index 2062a1f..b74cf40 100644 --- a/lua/core/game_mode.lua +++ b/lua/core/game_mode.lua @@ -71,4 +71,16 @@ function GameMode:countInFunc(room) return true end +-- 修改角色的属性 +---@param player ServerPlayer +---@return table @ 返回表,键为调整的角色属性,值为调整后的属性 +function GameMode:getAdjustedProperty (player) + local list = {} + if player.role == "lord" and player.role_shown and #player.room.players > 4 then + list.hp = player.hp + 1 + list.maxHp = player.maxHp + 1 + end + return list +end + return GameMode diff --git a/lua/fk_ex.lua b/lua/fk_ex.lua index 12dc2d1..9c0f31c 100644 --- a/lua/fk_ex.lua +++ b/lua/fk_ex.lua @@ -610,6 +610,10 @@ function fk.CreateGameMode(spec) assert(type(spec.is_counted) == "function") ret.countInFunc = spec.is_counted end + if spec.get_adjusted then + assert(type(spec.get_adjusted) == "function") + ret.getAdjustedProperty = spec.get_adjusted + end return ret end diff --git a/lua/server/gamelogic.lua b/lua/server/gamelogic.lua index d2afa29..b04c699 100644 --- a/lua/server/gamelogic.lua +++ b/lua/server/gamelogic.lua @@ -113,17 +113,13 @@ function GameLogic:chooseGenerals() generals = table.filter(generals, function(g) return not table.contains(lord_generals, g) end) room:returnToGeneralPile(generals) - room:setPlayerGeneral(lord, lord_general, true) + room:prepareGeneral(lord, lord_general, deputy, true) + room:askForChooseKingdom({lord}) - room:broadcastProperty(lord, "general") - room:broadcastProperty(lord, "kingdom") - room:setDeputyGeneral(lord, deputy) - room:broadcastProperty(lord, "deputyGeneral") end local nonlord = room:getOtherPlayers(lord, true) - local generals = room:getNGenerals(#nonlord * generalNum) - table.shuffle(generals) + local generals = table.random(room.general_pile, #nonlord * generalNum) for i, p in ipairs(nonlord) do local arg = table.slice(generals, (i - 1) * generalNum + 1, i * generalNum + 1) p.request_data = json.encode{ arg, n } @@ -133,25 +129,22 @@ function GameLogic:chooseGenerals() room:notifyMoveFocus(nonlord, "AskForGeneral") room:doBroadcastRequest("AskForGeneral", nonlord) - local selected = {} for _, p in ipairs(nonlord) do + local general, deputy if p.general == "" and p.reply_ready then local general_ret = json.decode(p.client_reply) - local general = general_ret[1] - local deputy = general_ret[2] - table.insertTableIfNeed(selected, general_ret) - room:setPlayerGeneral(p, general, true, true) - room:setDeputyGeneral(p, deputy) + general = general_ret[1] + deputy = general_ret[2] else - room:setPlayerGeneral(p, p.default_reply[1], true, true) - room:setDeputyGeneral(p, p.default_reply[2]) + general = p.default_reply[1] + deputy = p.default_reply[2] end + room:findGeneral(general) + room:findGeneral(deputy) + room:prepareGeneral(p, general, deputy) p.default_reply = "" end - generals = table.filter(generals, function(g) return not table.contains(selected, g) end) - room:returnToGeneralPile(generals) - room:askForChooseKingdom(nonlord) end @@ -178,14 +171,25 @@ function GameLogic:broadcastGeneral() p.shield = math.min(general.shield + (deputy and deputy.shield or 0), 5) -- TODO: setup AI here - if p.role ~= "lord" then - room:broadcastProperty(p, "general") - room:broadcastProperty(p, "kingdom") - room:broadcastProperty(p, "deputyGeneral") - elseif #players >= 5 then - p.maxHp = p.maxHp + 1 - p.hp = p.hp + 1 + local changer = Fk.game_modes[room.settings.gameMode]:getAdjustedProperty(p) + if changer then + for key, value in pairs(changer) do + p[key] = value + end end + local fixMaxHp = Fk.generals[p.general].fixMaxHp + local deputyFix = Fk.generals[p.deputyGeneral] and Fk.generals[p.deputyGeneral].fixMaxHp + if deputyFix then + fixMaxHp = fixMaxHp and math.min(fixMaxHp, deputyFix) or deputyFix + end + if fixMaxHp then + p.maxHp = fixMaxHp + end + p.hp = math.min(p.maxHp, p.hp) + + room:broadcastProperty(p, "general") + room:broadcastProperty(p, "deputyGeneral") + room:broadcastProperty(p, "kingdom") room:broadcastProperty(p, "maxHp") room:broadcastProperty(p, "hp") room:broadcastProperty(p, "shield") diff --git a/lua/server/room.lua b/lua/server/room.lua index ff8140f..92f2fbf 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -600,6 +600,41 @@ function Room:setDeputyGeneral(player, general) self:notifyProperty(player, player, "deputyGeneral") end +---@param player ServerPlayer +---@param general string +---@param deputy string +---@param broadcast boolean|nil +function Room:prepareGeneral(player, general, deputy, broadcast) + self:findGeneral(general) + self:findGeneral(deputy) + local skills = Fk.generals[general]:getSkillNameList() + if Fk.generals[deputy] then + table.insertTable(skills, Fk.generals[deputy]:getSkillNameList()) + end + if table.find(skills, function (s) return Fk.skills[s].isHiddenSkill end) then + self:setPlayerMark(player, "__hidden_general", general) + if Fk.generals[deputy] then + self:setPlayerMark(player, "__hidden_deputy", deputy) + deputy = "" + end + general = "hiddenone" + end + player.general = general + player.gender = Fk.generals[general].gender + self:broadcastProperty(player, "gender") + if Fk.generals[deputy] then + player.deputyGeneral = deputy + end + player.kingdom = Fk.generals[general].kingdom + for _, property in ipairs({"general","deputyGeneral","kingdom"}) do + if broadcast then + self:broadcastProperty(player, property) + else + self:notifyProperty(player, player, property) + end + end +end + ---@param player ServerPlayer @ 要换将的玩家 ---@param new_general string @ 要变更的武将,若不存在则变身为孙策,孙策不存在变身为士兵 ---@param full? boolean @ 是否血量满状态变身 diff --git a/standard/init.lua b/standard/init.lua index cc20fca..fb4856c 100644 --- a/standard/init.lua +++ b/standard/init.lua @@ -1151,12 +1151,9 @@ local role_getlogic = function() end) room:returnToGeneralPile(generals) - room:setPlayerGeneral(lord, lord_general, true) + room:prepareGeneral(lord, lord_general, deputy, true) + room:askForChooseKingdom({lord}) - room:broadcastProperty(lord, "general") - room:broadcastProperty(lord, "kingdom") - room:setDeputyGeneral(lord, deputy) - room:broadcastProperty(lord, "deputyGeneral") -- 显示技能 local canAttachSkill = function(player, skillName) @@ -1210,8 +1207,7 @@ local role_getlogic = function() end local nonlord = room:getOtherPlayers(lord, true) - local generals = room:getNGenerals(#nonlord * generalNum) - table.shuffle(generals) + local generals = table.random(room.general_pile, #nonlord * generalNum) for i, p in ipairs(nonlord) do local arg = table.slice(generals, (i - 1) * generalNum + 1, i * generalNum + 1) p.request_data = json.encode{ arg, n } @@ -1221,30 +1217,22 @@ local role_getlogic = function() room:notifyMoveFocus(nonlord, "AskForGeneral") room:doBroadcastRequest("AskForGeneral", nonlord) - local selected = {} for _, p in ipairs(nonlord) do + local general, deputy if p.general == "" and p.reply_ready then local general_ret = json.decode(p.client_reply) - local general = general_ret[1] - local deputy = general_ret[2] - table.insertTableIfNeed(selected, general_ret) - room:setPlayerGeneral(p, general, true, true) - room:setDeputyGeneral(p, deputy) + general = general_ret[1] + deputy = general_ret[2] else - table.insertTableIfNeed(selected, p.default_reply) - room:setPlayerGeneral(p, p.default_reply[1], true, true) - room:setDeputyGeneral(p, p.default_reply[2]) + general = p.default_reply[1] + deputy = p.default_reply[2] end + room:findGeneral(general) + room:findGeneral(deputy) + room:prepareGeneral(p, general, deputy) p.default_reply = "" end - generals = table.filter(generals, function(g) - return not table.find(selected, function(lg) - return Fk.generals[lg].trueName == Fk.generals[g].trueName - end) - end) - room:returnToGeneralPile(generals) - room:askForChooseKingdom(nonlord) end -- Gitee