FreeKill/lua/server/events/misc.lua

150 lines
4.8 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- SPDX-License-Identifier: GPL-3.0-or-later
GameEvent.functions[GameEvent.Game] = function(self)
self.room.logic:run()
end
GameEvent.functions[GameEvent.ChangeProperty] = function(self)
local data = table.unpack(self.data)
local room = self.room
local player = data.from
local logic = room.logic
logic:trigger(fk.BeforePropertyChange, player, data)
data.sendLog = data.sendLog or false
local skills = {}
if logic:trigger(fk.PropertyChange, player, data) then
logic:breakEvent()
end
if data.general and data.general ~= "" and data.general ~= player.general then
local originalGeneral = Fk.generals[player.general] or Fk.generals["blank_shibing"]
local originalSkills = originalGeneral and originalGeneral:getSkillNameList(true) or Util.DummyTable
table.insertTableIfNeed(skills, table.map(originalSkills, function(e)
return "-" .. e
end))
local newGeneral = Fk.generals[data.general] or Fk.generals["blank_shibing"]
for _, name in ipairs(newGeneral:getSkillNameList(data.isLord)) do
local s = Fk.skills[name]
if not s.relate_to_place or s.relate_to_place == "m" then
table.insertIfNeed(skills, name)
end
end
if data.sendLog then
room:sendLog{
type = "#ChangeHero",
from = player.id,
arg = player.general,
arg2 = data.general,
arg3 = "mainGeneral",
}
end
data.results["generalChange"] = {player.general, data.general}
room:setPlayerProperty(player, "general", data.general)
end
if data.deputyGeneral and data.deputyGeneral ~= player.deputyGeneral then
local originalDeputy = Fk.generals[player.deputyGeneral] or Fk.generals["blank_shibing"]
local originalSkills = originalDeputy and originalDeputy:getSkillNameList(true) or Util.DummyTable
table.insertTableIfNeed(skills, table.map(originalSkills, function(e)
return "-" .. e
end))
if data.deputyGeneral ~= "" then
local newDeputy = Fk.generals[data.deputyGeneral] or Fk.generals["blank_shibing"]
for _, name in ipairs(newDeputy:getSkillNameList(data.isLord)) do
local s = Fk.skills[name]
if not s.relate_to_place or s.relate_to_place == "d" then
table.insertIfNeed(skills, name)
end
end
if data.sendLog then
room:sendLog{
type = "#ChangeHero",
from = player.id,
arg = player.deputyGeneral,
arg2 = data.deputyGeneral,
arg3 = "deputyGeneral",
}
end
end
data.results["deputyChange"] = {player.deputyGeneral, data.deputyGeneral}
room:setPlayerProperty(player, "deputyGeneral", data.deputyGeneral)
end
if data.gender and data.gender ~= player.gender then
data.results["genderChange"] = {player.gender, data.gender}
room:setPlayerProperty(player, "gender", data.gender)
end
if data.kingdom and data.kingdom ~= "" and data.kingdom ~= player.kingdom then
if data.sendLog then
room:sendLog{
type = "#ChangeKingdom",
from = player.id,
arg = player.kingdom,
arg2 = data.kingdom,
}
end
data.results["kingdomChange"] = {player.kingdom, data.kingdom}
room:setPlayerProperty(player, "kingdom", data.kingdom)
end
for _, s in ipairs(Fk.generals[player.general].skills) do
if #s.attachedKingdom > 0 then
if table.contains(s.attachedKingdom, player.kingdom) then
table.insertIfNeed(skills, s.name)
else
if table.contains(skills, s.name) then
table.removeOne(skills, s.name)
else
table.insertIfNeed(skills, "-"..s.name)
end
end
end
end
if player.deputyGeneral ~= "" then
for _, s in ipairs(Fk.generals[player.deputyGeneral].skills) do
if #s.attachedKingdom > 0 then
if table.contains(s.attachedKingdom, player.kingdom) then
table.insertIfNeed(skills, s.name)
else
if table.contains(skills, s.name) then
table.removeOne(skills, s.name)
else
table.insertIfNeed(skills, "-"..s.name)
end
end
end
end
end
room:handleAddLoseSkills(player, table.concat(skills, "|"), nil, false, false)
logic:trigger(fk.AfterPropertyChange, player, data)
end
GameEvent.functions[GameEvent.ClearEvent] = function(self)
local event = self.data[1]
local logic = self.room.logic
-- 不可中断
Pcall(event.clear_func, event)
for _, f in ipairs(event.extra_clear_funcs) do
if type(f) == "function" then Pcall(f, event) end
end
-- cleaner顺利执行完了出栈吧
local end_id = logic.current_event_id + 1
if event.id ~= end_id - 1 then
logic.all_game_events[end_id] = event.event
logic.current_event_id = end_id
event.end_id = end_id
else
event.end_id = event.id
end
logic.game_event_stack:pop()
logic.cleaner_stack:pop()
end