diff --git a/media/lua/client/TOC/Handlers/AmputationHandler.lua b/media/lua/client/TOC/Handlers/AmputationHandler.lua index 44486d9..8b5ea96 100644 --- a/media/lua/client/TOC/Handlers/AmputationHandler.lua +++ b/media/lua/client/TOC/Handlers/AmputationHandler.lua @@ -76,7 +76,7 @@ function AmputationHandler:damageAfterAmputation(surgeonFactor) local patientStats = self.patientPl:getStats() local bd = self.patientPl:getBodyDamage() local bodyPart = bd:getBodyPart(self.bodyPartType) - local baseDamage = StaticData.LIMBS_BASE_DAMAGE[self.limbName] + local baseDamage = StaticData.LIMBS_BASE_DAMAGE_IND_NUM[self.limbName] bodyPart:AddDamage(baseDamage - surgeonFactor) bodyPart:setAdditionalPain(baseDamage - surgeonFactor) diff --git a/media/lua/client/TOC/Handlers/CachedDataHandler.lua b/media/lua/client/TOC/Handlers/CachedDataHandler.lua index c5b8c40..95c37b1 100644 --- a/media/lua/client/TOC/Handlers/CachedDataHandler.lua +++ b/media/lua/client/TOC/Handlers/CachedDataHandler.lua @@ -22,8 +22,8 @@ CachedDataHandler.amputatedLimbs = {} function CachedDataHandler.CalculateAmputatedLimbs(username) CachedDataHandler.amputatedLimbs[username] = {} local modDataHandler = ModDataHandler.GetInstance(username) - for i=1, #StaticData.LIMBS_STRINGS do - local limbName = StaticData.LIMBS_STRINGS[i] + for i=1, #StaticData.LIMBS_STR do + local limbName = StaticData.LIMBS_STR[i] if modDataHandler:getIsCut(limbName) then CachedDataHandler.AddAmputatedLimb(username, limbName) end diff --git a/media/lua/client/TOC/Handlers/ItemsHandler.lua b/media/lua/client/TOC/Handlers/ItemsHandler.lua index 0139deb..2f09174 100644 --- a/media/lua/client/TOC/Handlers/ItemsHandler.lua +++ b/media/lua/client/TOC/Handlers/ItemsHandler.lua @@ -58,7 +58,7 @@ end ---@param limbName string function ItemsHandler.DeleteOldAmputationItem(playerObj, limbName) local side = CommonMethods.GetSide(limbName) - for partName, _ in pairs(StaticData.PARTS_STRINGS) do + for partName, _ in pairs(StaticData.PARTS_IND_STR) do local othLimbName = partName .. "_" .. side local othClothingItemName = StaticData.AMPUTATION_CLOTHING_ITEM_BASE .. othLimbName @@ -76,8 +76,8 @@ end ---@param playerObj IsoPlayer function ItemsHandler.DeleteAllOldAmputationItems(playerObj) - for i=1, #StaticData.LIMBS_STRINGS do - local limbName = StaticData.LIMBS_STRINGS[i] + for i=1, #StaticData.LIMBS_STR do + local limbName = StaticData.LIMBS_STR[i] local clothItemName = StaticData.AMPUTATION_CLOTHING_ITEM_BASE .. limbName local clothItem = playerObj:getInventory():FindAndReturn(clothItemName) ---@cast clothItem InventoryItem diff --git a/media/lua/client/TOC/Handlers/ModDataHandler.lua b/media/lua/client/TOC/Handlers/ModDataHandler.lua index 3432769..2f3f248 100644 --- a/media/lua/client/TOC/Handlers/ModDataHandler.lua +++ b/media/lua/client/TOC/Handlers/ModDataHandler.lua @@ -61,15 +61,15 @@ function ModDataHandler:setup(key) -- Initialize limbs - for i=1, #StaticData.LIMBS_STRINGS do - local limbName = StaticData.LIMBS_STRINGS[i] + for i=1, #StaticData.LIMBS_STR do + local limbName = StaticData.LIMBS_STR[i] self.tocData.limbs[limbName] = {} - self:setLimbParams(StaticData.LIMBS_STRINGS[i], defaultParams, 0) + self:setLimbParams(StaticData.LIMBS_STR[i], defaultParams, 0) end - local prosthesesGroups = {"top", "bottom"} - for i=1, #prosthesesGroups do - local group = prosthesesGroups[i] + -- Initialize prostheses stuff + for i=1, #StaticData.PROSTHESES_GROUPS do + local group = StaticData.PROSTHESES_GROUPS[i] self.tocData.prostheses[group] = { isEquipped = false, prostFactor = 0 @@ -181,15 +181,15 @@ end function ModDataHandler:setCutLimb(limbName, isOperated, isCicatrized, isCauterized, surgeonFactor) local cicatrizationTime = 0 if isCicatrized == false or isCauterized == false then - cicatrizationTime = StaticData.LIMBS_CICATRIZATION_TIME[limbName] - surgeonFactor + cicatrizationTime = StaticData.LIMBS_CICATRIZATION_TIME_IND_NUM[limbName] - surgeonFactor end ---@type partData local params = {isCut = true, isInfected = false, isOperated = isOperated, isCicatrized = isCicatrized, isCauterized = isCauterized, isVisible = true} self:setLimbParams(limbName, params, cicatrizationTime) - for i=1, #StaticData.LIMBS_DEPENDENCIES[limbName] do - local dependedLimbName = StaticData.LIMBS_DEPENDENCIES[limbName][i] + for i=1, #StaticData.LIMBS_DEPENDENCIES_IND_STR[limbName] do + local dependedLimbName = StaticData.LIMBS_DEPENDENCIES_IND_STR[limbName][i] -- We don't care about isOperated, isCicatrized, isCauterized since this is depending on another limb -- Same story for cicatrizationTime, which will be 0 @@ -213,8 +213,6 @@ function ModDataHandler:setLimbParams(limbName, ampStatus, cicatrizationTime) if ampStatus.isCicatrized ~= nil then limbData.isCicatrized = ampStatus.isCicatrized end if ampStatus.isCauterized ~= nil then limbData.isCauterized = ampStatus.isCauterized end if ampStatus.isVisible ~= nil then limbData.isVisible = ampStatus.isVisible end - if ampStatus.isProstEquipped ~= nil then limbData.isProstEquipped = ampStatus.isProstEquipped end - if ampStatus.prostFactor ~= nil then limbData.prostFactor = ampStatus.prostFactor end if cicatrizationTime ~= nil then limbData.cicatrizationTime = cicatrizationTime end end diff --git a/media/lua/client/TOC/Handlers/PlayerHandler.lua b/media/lua/client/TOC/Handlers/PlayerHandler.lua index 6c7a437..8662303 100644 --- a/media/lua/client/TOC/Handlers/PlayerHandler.lua +++ b/media/lua/client/TOC/Handlers/PlayerHandler.lua @@ -64,9 +64,9 @@ function PlayerHandler.CheckInfection(character) local bd = character:getBodyDamage() local modDataHandler = ModDataHandler.GetInstance() - for i=1, #StaticData.LIMBS_STRINGS do - local limbName = StaticData.LIMBS_STRINGS[i] - local bptEnum = StaticData.BODYPARTSTYPES_ENUM[limbName] + for i=1, #StaticData.LIMBS_STR do + local limbName = StaticData.LIMBS_STR[i] + local bptEnum = StaticData.BODYLOCS_IND_BPT[limbName] local bodyPart = bd:getBodyPart(bptEnum) if bodyPart:bitten() or bodyPart:IsInfected() then @@ -82,8 +82,8 @@ function PlayerHandler.CheckInfection(character) -- We can skip this loop if the player has been infected. The one before we kinda need it to handle correctly the bites in case the player wanna cut stuff off anyway if ModDataHandler.GetInstance():getIsIgnoredPartInfected() then return end - for i=1, #StaticData.IGNORED_PARTS_STRINGS do - local bodyPartType = BodyPartType[StaticData.IGNORED_PARTS_STRINGS[i]] + for i=1, #StaticData.IGNORED_BODYLOCS_IND_BPT do + local bodyPartType = StaticData.IGNORED_BODYLOCS_IND_BPT[i] local bodyPart = bd:getBodyPart(bodyPartType) if bodyPart and (bodyPart:bitten() or bodyPart:IsInfected()) then ModDataHandler.GetInstance():setIsIgnoredPartInfected(true) @@ -124,7 +124,7 @@ function ISBaseTimedAction:adjustMaxTime(maxTime) local perkLevel = pl:getPerkLevel(perk) local perkLevelScaled if perkLevel ~= 0 then perkLevelScaled = perkLevel / 10 else perkLevelScaled = 0 end - time = time * (StaticData.LIMBS_TIME_MULTIPLIER[limbName] - perkLevelScaled) + time = time * (StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM[limbName] - perkLevelScaled) end end end @@ -138,7 +138,7 @@ function ISBaseTimedAction:perform() og_ISBaseTimedAction_perform(self) if ModDataHandler.GetInstance():getIsAnyLimbCut() then - for side, _ in pairs(StaticData.SIDES_STRINGS) do + for side, _ in pairs(StaticData.SIDES_IND_STR) do local limbName = "Hand_" .. side if ModDataHandler.GetInstance():getIsCut(limbName) then PlayerHandler.playerObj:getXp():AddXP(Perks["Side_" .. side], 2) -- TODO Make it dynamic diff --git a/media/lua/client/TOC/Handlers/ProsthesisHandler.lua b/media/lua/client/TOC/Handlers/ProsthesisHandler.lua index 49db2c7..2947e3e 100644 --- a/media/lua/client/TOC/Handlers/ProsthesisHandler.lua +++ b/media/lua/client/TOC/Handlers/ProsthesisHandler.lua @@ -7,7 +7,7 @@ local CachedDataHandler = require("TOC/Handlers/CachedDataHandler") ---@class ProsthesisHandler local ProsthesisHandler = {} -local bodyLocArmProst = StaticData.BODYLOCATIONS_BASE_STRINGS.TOC_ArmProst +local bodyLocArmProst = StaticData.MOD_BODYLOCS_BASE_IND_STR.TOC_ArmProst ---comment ---@param item InventoryItem diff --git a/media/lua/client/TOC/UI/CutLimbInteractions.lua b/media/lua/client/TOC/UI/CutLimbInteractions.lua index 187e5c6..4b601db 100644 --- a/media/lua/client/TOC/UI/CutLimbInteractions.lua +++ b/media/lua/client/TOC/UI/CutLimbInteractions.lua @@ -28,8 +28,8 @@ local function AddInventoryAmputationOptions(surgeonNum, context, item) local option = context:addOption(getText("ContextMenu_Amputate"), nil) local subMenu = context:getNew(context) context:addSubMenu(option, subMenu) - for i = 1, #StaticData.LIMBS_STRINGS do - local limbName = StaticData.LIMBS_STRINGS[i] + for i = 1, #StaticData.LIMBS_STR do + local limbName = StaticData.LIMBS_STR[i] if not ModDataHandler.GetInstance():getIsCut(limbName) then local limbTranslatedName = getText("ContextMenu_Limb_" .. limbName) subMenu:addOption(limbTranslatedName, surgeonObj, PerformAction, surgeonObj, limbName, item) -- TODO Should be patient, not surgeon @@ -82,7 +82,7 @@ end ---@param context ISContextMenu function CutLimbHandler:addToMenu(context) local types = self:getAllItemTypes(self.items.ITEMS) - if #types > 0 and StaticData.BODYPARTSTYPES_ENUM[self.limbName] then + if #types > 0 and StaticData.BODYLOCS_IND_BPT[self.limbName] then TOC_DEBUG.print("addToMenu, types > 0") if not ModDataHandler.GetInstance():getIsCut(self.limbName) then context:addOption(getText("ContextMenu_Amputate"), self, self.onMenuOptionSelected) @@ -92,7 +92,7 @@ end function CutLimbHandler:dropItems(items) local types = self:getAllItemTypes(items) - if #self.items.ITEMS > 0 and #types == 1 and StaticData.BODYPARTSTYPES_ENUM[self.limbName] then + if #self.items.ITEMS > 0 and #types == 1 and StaticData.BODYLOCS_IND_BPT[self.limbName] then self:onMenuOptionSelected(types[1]) return true end diff --git a/media/lua/shared/TOC/StaticData.lua b/media/lua/shared/TOC/StaticData.lua index 98b4d42..f24dc63 100644 --- a/media/lua/shared/TOC/StaticData.lua +++ b/media/lua/shared/TOC/StaticData.lua @@ -1,43 +1,112 @@ ----@alias partData { isCut : boolean?, isInfected : boolean?, isOperated : boolean?, isCicatrized : boolean?, isCauterized : boolean?, isVisible : boolean?, cicatrizationTime : number, isProstEquipped : boolean, prostFactor : number} ----@alias limbsTable {Hand_L : partData, ForeArm_L : partData, UpperArm_L : partData, Hand_R : partData, ForeArm_R : partData, UpperArm_R : partData,} ----@alias prosthesisData {isEquipped : boolean, prostFactor : number} ----@alias prosthesesTable {top : table, bottom : table} ----@alias tocModData { limbs : limbsTable, prostheses : prosthesesTable, isIgnoredPartInfected : boolean, isAnyLimbCut : boolean} +---@alias partData { isCut : boolean?, isInfected : boolean?, isOperated : boolean?, isCicatrized : boolean?, isCauterized : boolean?, isVisible : boolean?, cicatrizationTime : number } +---@alias limbsTable {Hand_L : partData, ForeArm_L : partData, UpperArm_L : partData, Hand_R : partData, ForeArm_R : partData, UpperArm_R : partData } +---@alias prosthesisData {isEquipped : boolean, prostFactor : number } +---@alias prosthesesTable {top : table, bottom : table } +---@alias tocModData { limbs : limbsTable, prostheses : prosthesesTable, isIgnoredPartInfected : boolean, isAnyLimbCut : boolean } --------------------------- + +-- _STR = Only strings, no index +-- _IND_STR = indexed Strings +-- _IND_BPT = Indexed BodyPartType + +-- PART = Single part, could be hand, forearm, etc +-- LIMB = Part + side +-- BODYLOCS = Body Locations + + + local StaticData = {} +---Mod name, used to setup Global Mod Data and various stuff StaticData.MOD_NAME = "TOC" +------------------------- +--* Base -StaticData.PARTS_STRINGS = { +StaticData.SIDES_IND_STR = { + R = "R", + L = "L" +} +StaticData.PARTS_IND_STR = { Hand = "Hand", ForeArm = "ForeArm", UpperArm = "UpperArm" } - -StaticData.BODYLOCATIONS_BASE_STRINGS = { +StaticData.MOD_BODYLOCS_BASE_IND_STR = { TOC_ArmProst = "TOC_ArmProst", TOC_Arm = "TOC_Arm", } -- No "MAX" here. -StaticData.IGNORED_PARTS_STRINGS = { "Foot_L", "Foot_R", "Groin", "Head", "LowerLeg_L", "LowerLeg_R", "Neck", "Torso_Lower", "Torso_Upper", "UpperLeg_L", "UpperLeg_R" } - -StaticData.SIDES_STRINGS = { - R = "R", - L = "L" +StaticData.IGNORED_BODYLOCS_IND_BPT = { + BodyPartType.Foot_L, BodyPartType.Foot_R, BodyPartType.Groin, BodyPartType.Head, + BodyPartType.LowerLeg_L, BodyPartType.LowerLeg_R, BodyPartType.Neck, BodyPartType.Torso_Lower, + BodyPartType.Torso_Upper, BodyPartType.UpperLeg_L, BodyPartType.UpperLeg_R } --- Assembled BodyParts string ----@enum -StaticData.LIMBS_STRINGS = {} -StaticData.BODYPARTSTYPES_ENUM = {} -StaticData.LIMBS_DEPENDENCIES = {} -StaticData.LIMBS_CICATRIZATION_TIME = {} -StaticData.LIMBS_BASE_DAMAGE = {} -StaticData.LIMBS_TIME_MULTIPLIER = {} +-- Assembled BodyParts string +StaticData.LIMBS_STR = {} +StaticData.LIMBS_DEPENDENCIES_IND_STR = {} +StaticData.LIMBS_CICATRIZATION_TIME_IND_NUM = {} +StaticData.LIMBS_BASE_DAMAGE_IND_NUM = {} +StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM = {} +StaticData.BODYLOCS_IND_BPT = {} + +local function AssembleHandData(assembledName) + StaticData.LIMBS_BASE_DAMAGE_IND_NUM[assembledName] = 60 + StaticData.LIMBS_CICATRIZATION_TIME_IND_NUM[assembledName] = 1700 + StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM[assembledName] = 2 + StaticData.LIMBS_DEPENDENCIES_IND_STR[assembledName] = {} +end + +local function AssembleForearmData(assembledName, side) + StaticData.LIMBS_BASE_DAMAGE_IND_NUM[assembledName] = 80 + StaticData.LIMBS_CICATRIZATION_TIME_IND_NUM[assembledName] = 1800 + StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM[assembledName] = 3 + StaticData.LIMBS_DEPENDENCIES_IND_STR[assembledName] = { StaticData.PARTS_IND_STR.Hand .. "_" .. side } +end + +local function AssembleUpperarmData(assembledName, side) + StaticData.LIMBS_BASE_DAMAGE_IND_NUM[assembledName] = 100 + StaticData.LIMBS_CICATRIZATION_TIME_IND_NUM[assembledName] = 2000 + StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM[assembledName] = 4 + StaticData.LIMBS_DEPENDENCIES_IND_STR[assembledName] = { StaticData.PARTS_IND_STR.Hand .. "_" .. side, + StaticData.PARTS_IND_STR.ForeArm .. "_" .. side } +end + +for side, _ in pairs(StaticData.SIDES_IND_STR) do + for part, _ in pairs(StaticData.PARTS_IND_STR) do + local assembledName = part .. "_" .. side + + -- Assembled strings + table.insert(StaticData.LIMBS_STR, assembledName) -- We need a table like this to cycle through it easily + StaticData.BODYLOCS_IND_BPT[assembledName] = BodyPartType[assembledName] + + -- Dependencies and cicatrization time + if part == StaticData.PARTS_IND_STR.Hand then + AssembleHandData(assembledName) + elseif part == StaticData.PARTS_IND_STR.ForeArm then + AssembleForearmData(assembledName, side) + elseif part == StaticData.PARTS_IND_STR.UpperArm then + AssembleUpperarmData(assembledName, side) + end + end +end + +----------------- +--* Prostheses + +StaticData.PROSTHESES_GROUPS = { + top = "top", + bottom = "bottom" +} + + +----------------- +--* Traits + -- Link a trait to a specific body part StaticData.TRAITS_BP = { AmputeeHand = "Hand_L", @@ -45,50 +114,8 @@ StaticData.TRAITS_BP = { AmputeeUpeerArm = "UpperArm_L" } - -local function AssembleHandData(assembledName) - StaticData.LIMBS_BASE_DAMAGE[assembledName] = 60 - StaticData.LIMBS_CICATRIZATION_TIME[assembledName] = 1700 - StaticData.LIMBS_TIME_MULTIPLIER[assembledName] = 2 - StaticData.LIMBS_DEPENDENCIES[assembledName] = {} -end - -local function AssembleForearmData(assembledName, side) - StaticData.LIMBS_BASE_DAMAGE[assembledName] = 80 - StaticData.LIMBS_CICATRIZATION_TIME[assembledName] = 1800 - StaticData.LIMBS_TIME_MULTIPLIER[assembledName] = 3 - StaticData.LIMBS_DEPENDENCIES[assembledName] = { StaticData.PARTS_STRINGS.Hand .. "_" .. side } -end - -local function AssembleUpperarmData(assembledName, side) - StaticData.LIMBS_BASE_DAMAGE[assembledName] = 100 - StaticData.LIMBS_CICATRIZATION_TIME[assembledName] = 2000 - StaticData.LIMBS_TIME_MULTIPLIER[assembledName] = 4 - StaticData.LIMBS_DEPENDENCIES[assembledName] = { StaticData.PARTS_STRINGS.Hand .. "_" .. side, - StaticData.PARTS_STRINGS.ForeArm .. "_" .. side } -end - -for side, _ in pairs(StaticData.SIDES_STRINGS) do - for part, _ in pairs(StaticData.PARTS_STRINGS) do - local assembledName = part .. "_" .. side - - -- Assembled strings - table.insert(StaticData.LIMBS_STRINGS, assembledName) -- We need a table like this to cycle through it easily - StaticData.BODYPARTSTYPES_ENUM[assembledName] = BodyPartType[assembledName] - - -- Dependencies and cicatrization time - if part == StaticData.PARTS_STRINGS.Hand then - AssembleHandData(assembledName) - elseif part == StaticData.PARTS_STRINGS.ForeArm then - AssembleForearmData(assembledName, side) - elseif part == StaticData.PARTS_STRINGS.UpperArm then - AssembleUpperarmData(assembledName, side) - end - end -end - ----------------- --- Visuals and clothing +--* Visuals and clothing --- Textures -- TODO We need male variations