diff --git a/image/photo/skill/limit-used.png b/image/photo/skill/limit-used.png new file mode 100644 index 00000000..b549697f Binary files /dev/null and b/image/photo/skill/limit-used.png differ diff --git a/image/photo/skill/limit.png b/image/photo/skill/limit.png new file mode 100644 index 00000000..26c0b0cf Binary files /dev/null and b/image/photo/skill/limit.png differ diff --git a/image/photo/skill/wake.png b/image/photo/skill/wake.png new file mode 100644 index 00000000..9b195d93 Binary files /dev/null and b/image/photo/skill/wake.png differ diff --git a/lua/client/client.lua b/lua/client/client.lua index 275e233a..ac33aec7 100644 --- a/lua/client/client.lua +++ b/lua/client/client.lua @@ -491,6 +491,16 @@ fk.client_callback["LoseSkill"] = function(jsonData) end end +-- 说是限定技,其实也适用于觉醒技、转换技、使命技 +---@param skill Skill +---@param times integer +local function updateLimitSkill(pid, skill, times) + if not skill.visible then return end + if skill.frequency == Skill.Limited or skill.frequency == Skill.Wake then + ClientInstance:notifyUI("UpdateLimitSkill", json.encode{ pid, skill.name, times }) + end +end + fk.client_callback["AddSkill"] = function(jsonData) -- jsonData: [ int player_id, string skill_name ] local data = json.decode(jsonData) @@ -501,6 +511,8 @@ fk.client_callback["AddSkill"] = function(jsonData) if skill.visible then ClientInstance:notifyUI("AddSkill", jsonData) end + + updateLimitSkill(id, skill, target:usedSkillTimes(skill_name, Player.HistoryGame)) end fk.client_callback["AskForUseActiveSkill"] = function(jsonData) @@ -574,12 +586,20 @@ end fk.client_callback["AddSkillUseHistory"] = function(jsonData) local data = json.decode(jsonData) - Self:addSkillUseHistory(data[1], data[2]) + local playerid, skill_name, time = data[1], data[2], data[3] + local player = ClientInstance:getPlayerById(playerid) + player:addSkillUseHistory(skill_name, time) + if not Fk.skills[skill_name] then return end + updateLimitSkill(playerid, Fk.skills[skill_name], player:usedSkillTimes(skill_name, Player.HistoryGame)) end fk.client_callback["SetSkillUseHistory"] = function(jsonData) local data = json.decode(jsonData) - Self:setSkillUseHistory(data[1], data[2], data[3]) + local id, skill_name, time, scope = data[1], data[2], data[3], data[4] + local player = ClientInstance:getPlayerById(id) + player:setSkillUseHistory(skill_name, time, scope) + if not Fk.skills[skill_name] then return end + updateLimitSkill(id, Fk.skills[skill_name], player:usedSkillTimes(skill_name, Player.HistoryGame)) end fk.client_callback["AddVirtualEquip"] = function(jsonData) diff --git a/lua/client/client_util.lua b/lua/client/client_util.lua index b095038e..613be5c2 100644 --- a/lua/client/client_util.lua +++ b/lua/client/client_util.lua @@ -231,11 +231,18 @@ function GetSkillData(skill_name) if skill:isInstanceOf(ActiveSkill) or skill:isInstanceOf(ViewAsSkill) then freq = "active" end + local frequency + if skill.frequency == Skill.Limited then + frequency = "limit" + elseif skill.frequency == Skill.Wake then + frequency = "wake" + end return json.encode{ skill = Fk:translate(skill_name), orig_skill = skill_name, extension = skill.package.extensionName, - freq = freq + freq = freq, + frequency = frequency, } end diff --git a/lua/core/skill_type/active.lua b/lua/core/skill_type/active.lua index b1a09ffc..4fa2df60 100644 --- a/lua/core/skill_type/active.lua +++ b/lua/core/skill_type/active.lua @@ -10,8 +10,8 @@ ---@field public interaction any local ActiveSkill = UsableSkill:subclass("ActiveSkill") -function ActiveSkill:initialize(name) - UsableSkill.initialize(self, name, Skill.NotFrequent) +function ActiveSkill:initialize(name, frequency) + UsableSkill.initialize(self, name, frequency) self.min_target_num = 0 self.max_target_num = 999 self.min_card_num = 0 diff --git a/lua/fk_ex.lua b/lua/fk_ex.lua index 0127d92a..d4883f4a 100644 --- a/lua/fk_ex.lua +++ b/lua/fk_ex.lua @@ -153,7 +153,7 @@ end ---@return ActiveSkill function fk.CreateActiveSkill(spec) assert(type(spec.name) == "string") - local skill = ActiveSkill:new(spec.name) + local skill = ActiveSkill:new(spec.name, spec.frequency or Skill.NotFrequent) readUsableSpecToSkill(skill, spec) if spec.can_use then skill.canUse = spec.can_use end diff --git a/lua/server/serverplayer.lua b/lua/server/serverplayer.lua index bad9e454..6a4e39a5 100644 --- a/lua/server/serverplayer.lua +++ b/lua/server/serverplayer.lua @@ -540,12 +540,12 @@ end function ServerPlayer:addSkillUseHistory(cardName, num) Player.addSkillUseHistory(self, cardName, num) - self:doNotify("AddSkillUseHistory", json.encode{cardName, num}) + self.room:doBroadcastNotify("AddSkillUseHistory", json.encode{self.id, cardName, num}) end function ServerPlayer:setSkillUseHistory(cardName, num, scope) Player.setSkillUseHistory(self, cardName, num, scope) - self:doNotify("SetSkillUseHistory", json.encode{cardName, num, scope}) + self.room:doBroadcastNotify("SetSkillUseHistory", json.encode{self.id, cardName, num, scope}) end ---@param chained boolean diff --git a/qml/Pages/RoomElement/Photo.qml b/qml/Pages/RoomElement/Photo.qml index 598a4d54..0dfa13bd 100644 --- a/qml/Pages/RoomElement/Photo.qml +++ b/qml/Pages/RoomElement/Photo.qml @@ -336,6 +336,14 @@ Item { anchors.rightMargin: -4 } + LimitSkillArea { + id: limitSkills + anchors.top: role.bottom + anchors.left: role.left + anchors.topMargin: 2 + anchors.leftMargin: -2 + } + GlowText { id: playerName anchors.horizontalCenter: parent.horizontalCenter @@ -526,4 +534,8 @@ Item { chat.visible = true; chatAnim.restart(); } + + function updateLimitSkill(skill, time) { + limitSkills.update(skill, time); + } } diff --git a/qml/Pages/RoomElement/PhotoElement/LimitSkillArea.qml b/qml/Pages/RoomElement/PhotoElement/LimitSkillArea.qml new file mode 100644 index 00000000..b776cd16 --- /dev/null +++ b/qml/Pages/RoomElement/PhotoElement/LimitSkillArea.qml @@ -0,0 +1,31 @@ +import QtQuick +import QtQuick.Layouts + +ColumnLayout { + id: root + + Repeater { + id: rep + model: ListModel { + id: skills + } + LimitSkillItem { + skillname: skillname_ + usedtimes: times + } + } + + function update(skill, times) { + for (let i = 0; i < rep.count; i++) { + let data = skills.get(i); + if (data.skillname_ === skill) { + data.times = times; + return; + } + } + skills.append({ + skillname_: skill, + times: times, + }); + } +} diff --git a/qml/Pages/RoomElement/PhotoElement/LimitSkillItem.qml b/qml/Pages/RoomElement/PhotoElement/LimitSkillItem.qml new file mode 100644 index 00000000..24465c57 --- /dev/null +++ b/qml/Pages/RoomElement/PhotoElement/LimitSkillItem.qml @@ -0,0 +1,62 @@ +import QtQuick +import "../../skin-bank.js" as SkinBank + +Item { + id: root + height: 20 + property string skillname: "zhiheng" + property string skilltype: "limit" // limit, wake, ... + property int usedtimes: -1 // -1 will not be shown + // visible: false + + Image { + id: bg + source: SkinBank.LIMIT_SKILL_DIR + skilltype + height: 47 * 0.6 + width: 87 * 0.6 + } + + Text { + anchors.centerIn: bg + color: "#F0E5DA" + font.pixelSize: 20 + font.family: fontLi2.name + style: Text.Outline + styleColor: "#3D2D1C" + text: Backend.translate(skillname); + } + + Text { + id: x + opacity: skilltype === "limit" ? 1 : 0 + text: "X" + font.family: fontLibian.name + font.pixelSize: 28 + color: "red" + x: 26 + } + + onSkillnameChanged: { + let data = Backend.callLuaFunction("GetSkillData", [skillname]); + data = JSON.parse(data); + if (data.frequency) { + skilltype = data.frequency; + visible = true; + } else { + visible = false; + } + } + + onUsedtimesChanged: { + x.visible = false; + if (skilltype === "wake") { + visible = (usedtimes < 1); + } else if (skilltype === "limit") { + visible = true; + if (usedtimes >= 1) { + x.visible = true; + bg.source = SkinBank.LIMIT_SKILL_DIR + "limit-used"; + } + } + } +} diff --git a/qml/Pages/RoomLogic.js b/qml/Pages/RoomLogic.js index 0905c888..69e6ac0e 100644 --- a/qml/Pages/RoomLogic.js +++ b/qml/Pages/RoomLogic.js @@ -996,3 +996,15 @@ callbacks["CustomDialog"] = (j) => { roomScene.popupBox.item.loadData(dat); } } + +callbacks["UpdateLimitSkill"] = (j) => { + let data = JSON.parse(j); + let id = data[0]; + let skill = data[1]; + let time = data[2]; + + let photo = getPhotoOrSelf(id); + if (photo) { + photo.updateLimitSkill(skill, time); + } +} diff --git a/qml/Pages/skin-bank.js b/qml/Pages/skin-bank.js index ecd03092..71c38db4 100644 --- a/qml/Pages/skin-bank.js +++ b/qml/Pages/skin-bank.js @@ -8,6 +8,7 @@ var STATUS_DIR = AppPath + "/image/photo/status/"; var ROLE_DIR = AppPath + "/image/photo/role/"; var DEATH_DIR = AppPath + "/image/photo/death/"; var MAGATAMA_DIR = AppPath + "/image/photo/magatama/"; +var LIMIT_SKILL_DIR = AppPath + "/image/photo/skill/"; var CARD_DIR = AppPath + "/image/card/"; var CARD_SUIT_DIR = AppPath + "/image/card/suit/"; var DELAYED_TRICK_DIR = AppPath + "/image/card/delayedTrick/";