diff --git a/media/lua/client/TOC/TimedActions/CauterizeAction.lua b/media/lua/client/TOC/TimedActions/CauterizeAction.lua new file mode 100644 index 0000000..506c7bc --- /dev/null +++ b/media/lua/client/TOC/TimedActions/CauterizeAction.lua @@ -0,0 +1,85 @@ +require "TimedActions/ISBaseTimedAction" +local DataController = require("TOC/Controllers/DataController") +--------------- + +---@class CauterizeAction : ISBaseTimedAction +---@field character IsoPlayer +---@field ovenObj IsoObject +---@field limbName string +local CauterizeAction = ISBaseTimedAction:derive("CauterizeAction") + +---@param character IsoPlayer +---@param stoveObj IsoObject +---@param limbName string +---@return CauterizeAction +function CauterizeAction:new(character, limbName, stoveObj) + local o = {} + setmetatable(o, self) + self.__index = self + + -- We need to follow ISBaseTimedAction. self.character is gonna be the surgeon + o.character = character + o.ovenObj = stoveObj + o.limbName = limbName + + o.stopOnWalk = true + o.stopOnRun = true + + -- Max time depends on the strength + o.maxTime = 100 + if o.character:isTimedActionInstant() then o.maxTime = 1 end + + return o +end + +function CauterizeAction:isValid() + return not ISHealthPanel.DidPatientMove(self.character, self.character, self.character:getX(), self.character:getY()) +end + +function CauterizeAction:waitToStart() + self.character:faceThisObject(self.ovenObj) + return self.character:shouldBeTurning() +end + +function CauterizeAction:start() + self:setActionAnim("Loot") -- TODO Better anim pls + + -- Setup audio + self.sound = self.character:getEmitter():playSound("Cauterization") + local radius = 5 + addSound(self.character, self.character:getX(), self.character:getY(), self.character:getZ(), radius, radius) +end + +function CauterizeAction:update() + self.character:setMetabolicTarget(Metabolics.HeavyWork) +end + +function CauterizeAction:stopSound() + if self.sound then + self.character:getEmitter():stopSound(self.sound) + self.sound = nil + end +end + +function CauterizeAction:stop() + self:stopSound() + ISBaseTimedAction.stop(self) +end + +function CauterizeAction:perform() + -- Stop the sound + self:stopSound() + + local dcInst = DataController.GetInstance() + dcInst:setCicatrizationTime(self.limbName, 0) + dcInst:setIsCicatrized(self.limbName, true) + dcInst:setIsCauterized(self.limbName, true) + + -- we don't care about the depended limbs, since they're alread "cicatrized" + + dcInst:apply() + + ISBaseTimedAction.perform(self) +end + +return CauterizeAction \ No newline at end of file diff --git a/media/lua/client/TOC/TimedActions/CutLimbAction.lua b/media/lua/client/TOC/TimedActions/CutLimbAction.lua index d9f41b0..4cdcb8b 100644 --- a/media/lua/client/TOC/TimedActions/CutLimbAction.lua +++ b/media/lua/client/TOC/TimedActions/CutLimbAction.lua @@ -78,7 +78,7 @@ function CutLimbAction:start() self:setOverrideHandModels(self.item:getStaticModel()) -- Setup audio - self.sound = self.character:getEmitter():playSound("Amputation_Sound") + self.sound = self.character:getEmitter():playSound("Amputation") local radius = 5 addSound(self.character, self.character:getX(), self.character:getY(), self.character:getZ(), radius, radius) @@ -94,13 +94,9 @@ end function CutLimbAction:update() self.character:setMetabolicTarget(Metabolics.HeavyWork) - - -- TODO Apply it too on the patient! check if it works online - -- TODO Add sound if self.character ~= self.patient then self.patient:setMetabolicTarget(Metabolics.HeavyWork) end - end function CutLimbAction:stopSound() @@ -116,7 +112,6 @@ function CutLimbAction:stop() end function CutLimbAction:perform() - -- Stop the sound self:stopSound() @@ -132,7 +127,6 @@ function CutLimbAction:perform() sendClientCommand(CommandsData.modules.TOC_RELAY, CommandsData.server.Relay.RelayExecuteAmputationAction, params ) end - ISBaseTimedAction.perform(self) end diff --git a/media/lua/client/TOC/TimedActions/SurgeryAction.lua b/media/lua/client/TOC/TimedActions/SurgeryAction.lua deleted file mode 100644 index 893272c..0000000 --- a/media/lua/client/TOC/TimedActions/SurgeryAction.lua +++ /dev/null @@ -1 +0,0 @@ --- temp \ No newline at end of file diff --git a/media/lua/client/TOC/UI/SurgeryInteractions.lua b/media/lua/client/TOC/UI/SurgeryInteractions.lua index 7fc183f..9a8dd77 100644 --- a/media/lua/client/TOC/UI/SurgeryInteractions.lua +++ b/media/lua/client/TOC/UI/SurgeryInteractions.lua @@ -1,37 +1,26 @@ local CachedDataHandler = require("TOC/Handlers/CachedDataHandler") local DataController = require("TOC/Controllers/DataController") +local CauterizeAction = require("TOC/TimedActions/CauterizeAction") --------------- - --- TODO Surgery Kits - -local function AddInventorySurgeryMenu(playerNum, context, items) - -end - -Events.OnFillInventoryObjectContextMenu.Add(AddInventorySurgeryMenu) - - --- TODO Oven - --- TODO We need a class to handle operations, this is just a placeholder -local function Cauterize(limbName) - local dcInst = DataController.GetInstance() - dcInst:setCicatrizationTime(limbName, 0) - dcInst:setIsCicatrized(limbName, true) - dcInst:setIsCauterized(limbName, true) - - -- we don't care bout the depended limbs, since they're alread "cicatrized" - - dcInst:apply() +---@param tooltip ISToolTip +---@param desc string +local function AppendToDescription(tooltip, desc) + if tooltip.description == "" then + desc = string.upper(string.sub(desc, 1, 1)) .. string.sub(desc, 2) + tooltip.description = desc + else + desc = string.lower(string.sub(desc, 1, 1)) .. string.sub(desc, 2) + tooltip.description = tooltip.description .. getText("Tooltip_Surgery_And") .. desc + end end ---@param playerNum number ---@param context ISContextMenu ---@param worldObjects any ---@param test any -local function AddOvenContextMenu(playerNum, context, worldObjects, test) +local function AddStoveContextMenu(playerNum, context, worldObjects, test) if test then return true end local pl = getSpecificPlayer(playerNum) @@ -40,6 +29,7 @@ local function AddOvenContextMenu(playerNum, context, worldObjects, test) if not dcInst:getIsAnyLimbCut() then return end local amputatedLimbs = CachedDataHandler.GetAmputatedLimbs(pl:getUsername()) + ---@type IsoStove? local stoveObj = nil for _, obj in pairs(worldObjects) do if instanceof(obj, "IsoStove") then @@ -48,43 +38,61 @@ local function AddOvenContextMenu(playerNum, context, worldObjects, test) end end if stoveObj == nil then return end - if pl:HasTrait("Brave") or pl:getPerkLevel(Perks.Strength) > 5 then - local isTempLow = stoveObj:getCurrentTemperature() < 250 - local tempTooltip = ISToolTip:new() - tempTooltip:initialise() - tempTooltip:setName(getText("ContextMenu_Cauterize_TempTooLow_tooltip")) - tempTooltip.description = getText("Tooltip_Surgery_TempTooLow") - tempTooltip:setVisible(false) + local tempTooltip = ISToolTip:new() + tempTooltip:initialise() + tempTooltip.description = "" + tempTooltip:setVisible(false) - local addMainOption = false - local subMenu + local addMainOption = false + local subMenu - for k, _ in pairs(amputatedLimbs) do + for k, _ in pairs(amputatedLimbs) do - -- We need to let the player cauterize ONLY the visible one! - local limbName = k - if dcInst:getIsVisible(limbName) and not dcInst:getIsCicatrized(limbName) then - if addMainOption == false then - -- Adds the cauterize option ONLY when it's needed - local optionMain = context:addOption(getText("ContextMenu_Cauterize"), nil) - subMenu = context:getNew(context) - context:addSubMenu(optionMain, subMenu) - addMainOption = true - end - - local option = subMenu:addOption(getText("ContextMenu_Limb_" .. limbName), limbName, Cauterize) - option.notAvailable = isTempLow - if isTempLow then - option.toolTip = tempTooltip - end + -- We need to let the player cauterize ONLY the visible one! + ---@type string + local limbName = k + if dcInst:getIsVisible(limbName) and not dcInst:getIsCicatrized(limbName) then + if addMainOption == false then + -- Adds the cauterize option ONLY when it's needed + local optionMain = context:addOption(getText("ContextMenu_Cauterize"), nil) + subMenu = context:getNew(context) + context:addSubMenu(optionMain, subMenu) + addMainOption = true end + local option = subMenu:addOption(getText("ContextMenu_Limb_" .. limbName), nil, function() + local adjacent = AdjacentFreeTileFinder.Find(stoveObj:getSquare(), pl) + ISTimedActionQueue.add(ISWalkToTimedAction:new(pl, adjacent)) + ISTimedActionQueue.add(CauterizeAction:new(pl, limbName, stoveObj)) + end) + + + -- Notifications, in case the player can't do the action + local isPlayerCourageous = pl:HasTrait("Brave") or pl:getPerkLevel(Perks.Strength) > 5 + local isTempHighEnough = stoveObj:getCurrentTemperature() >= 250 + local isLimbFree = not dcInst:getIsProstEquipped(limbName) + + option.notAvailable = not(isPlayerCourageous and isTempHighEnough and isLimbFree) + if not isTempHighEnough then + AppendToDescription(tempTooltip, getText("Tooltip_Surgery_TempTooLow")) + end + + if not isPlayerCourageous then + AppendToDescription(tempTooltip, getText("Tooltip_Surgery_Coward")) + end + + if not isLimbFree then + AppendToDescription(tempTooltip, getText("Tooltip_Surgery_LimbNotFree")) + end + + if option.notAvailable then + tempTooltip:setName(getText("Tooltip_Surgery_CantCauterize")) + option.toolTip = tempTooltip + end end + end end -Events.OnFillWorldObjectContextMenu.Add(AddOvenContextMenu) - - --- TODO Other stuff? \ No newline at end of file +Events.OnFillWorldObjectContextMenu.Add(AddStoveContextMenu) diff --git a/media/lua/shared/Translate/EN/ContextMenu_EN.txt b/media/lua/shared/Translate/EN/ContextMenu_EN.txt index f7acdc1..299fc54 100644 --- a/media/lua/shared/Translate/EN/ContextMenu_EN.txt +++ b/media/lua/shared/Translate/EN/ContextMenu_EN.txt @@ -5,7 +5,6 @@ ContextMenu_EN = { ContextMenu_Amputate_Stitch_Bandage = "Amputate, stitches and bandage", ContextMenu_Cauterize = "Cauterize", - ContextMenu_Cauterize_TempTooLow_tooltip = "Temperature too low", ContextMenu_Limb_Hand_L = "Left Hand", ContextMenu_Limb_ForeArm_L = "Left Forearm", diff --git a/media/lua/shared/Translate/EN/Tooltip_EN.txt b/media/lua/shared/Translate/EN/Tooltip_EN.txt index 7fa281a..ae4f57b 100644 --- a/media/lua/shared/Translate/EN/Tooltip_EN.txt +++ b/media/lua/shared/Translate/EN/Tooltip_EN.txt @@ -1,3 +1,10 @@ Tooltip_EN = { - Tooltip_Surgery_TempTooLow = "Turn on the oven and wait for it to heat up before cauterizing your wound.", + + Tooltip_Surgery_CantCauterize = "You can't cauterize the wound", + + Tooltip_Surgery_And = " and " + Tooltip_Surgery_TempTooLow = "The temperature is still too low", + Tooltip_Surgery_Coward = "You don't have the guts to do it", + Tooltip_Surgery_LimbNotFree = "You need to remove the prosthesis first", + } \ No newline at end of file diff --git a/media/scripts/TOC_sounds.txt b/media/scripts/TOC_sounds.txt index 48da882..ce7df97 100644 --- a/media/scripts/TOC_sounds.txt +++ b/media/scripts/TOC_sounds.txt @@ -1,11 +1,22 @@ module base { - sound Amputation_Sound { + sound Amputation { category = Player, loop = true, is3D = true, clip { - file = media/sound/Cut_sound.ogg, + file = media/sound/Amputation.ogg, + distanceMax = 3, + volume = 1.0, + } + } + + sound Cauterization { + category = Player, + loop = false, + is3D = true, + clip { + file = media/sound/Cauterization.ogg, distanceMax = 3, volume = 1.0, } diff --git a/media/sound/Cut_sound.ogg b/media/sound/Amputation.ogg similarity index 100% rename from media/sound/Cut_sound.ogg rename to media/sound/Amputation.ogg diff --git a/media/sound/Cauterization.ogg b/media/sound/Cauterization.ogg new file mode 100644 index 0000000..6514e69 Binary files /dev/null and b/media/sound/Cauterization.ogg differ