4 Commits

Author SHA1 Message Date
ZioPao
839ce002a3 More tests 2025-10-04 15:05:33 +02:00
ZioPao
49eee7ce84 fix: 42.12 new bodyloc 2025-10-04 04:23:12 +02:00
ZioPao
1c72647d40 fix: fix for cheat prevention with both hands feasibility to false 2025-10-04 04:22:26 +02:00
ZioPao
a9a7063287 fix: override for both hands interaction for b42 and cheat prevention 2025-10-04 04:22:04 +02:00
87 changed files with 262 additions and 285 deletions

View File

@@ -25,16 +25,16 @@ local og_ISUnequipAction_complete = ISUnequipAction.complete
function ISUnequipAction:complete()
-- Horrendous workaround. For B42, as of now, it will basically happen two times, once with :perform and once with :complete. Shouldn't
-- matter for performance but it's really ugly.
-- local isProst = ProsthesisHandler.SearchAndSetupProsthesis(self.item, false)
-- local group
-- if isProst then
-- group = BodyLocations.getGroup("Human")
-- group:setMultiItem("TOC_ArmProst", false)
-- end
local isProst = ProsthesisHandler.SearchAndSetupProsthesis(self.item, false)
local group
if isProst then
group = BodyLocations.getGroup("Human")
group:setMultiItem("TOC_ArmProst", false)
end
og_ISUnequipAction_complete(self)
-- if isProst then
-- group:setMultiItem("TOC_ArmProst", true)
-- end
if isProst then
group:setMultiItem("TOC_ArmProst", true)
end
end

View File

@@ -1,53 +0,0 @@
module TOC
{
imports
{
Base
}
/*************Craft Prosthetics*******************/
craftRecipe Craft Prosthetic Arm
{
timedAction = BuildMetalStructureSmall,
Time = 150,
Tags = InHandCraft,
category = Welding,
NeedToBeLearn = false,
SkillRequired = MetalWelding:4,
xpAward = MetalWelding:50,
inputs
{
item 4 [MetalPipe],
item 2 [Plank],
item 4 [Base.BlowTorch] flags[DontRecordInput],
item 4 [Base.WeldingRods] flags[DontRecordInput],
}
outputs
{
item 1 TOC.Prost_NormalArm_L,
}
}
craftRecipe Craft Prosthetic Hook
{
timedAction = BuildMetalStructureSmall,
Time = 100,
Tags = InHandCraft,
category = Welding,
NeedToBeLearn = false,
SkillRequired = MetalWelding:2,
xpAward = MetalWelding:30,
inputs
{
item 2 [MetalPipe],
item 1 [Plank],
item 4 [Base.BlowTorch] flags[DontRecordInput],
item 2 [Base.WeldingRods] flags[DontRecordInput],
}
outputs
{
item 1 TOC.Prost_HookArm_L,
}
}
}

View File

@@ -4,7 +4,7 @@ description=You've been bitten. You have only two choices.
id=TheOnlyCure
icon=icon.png
url=https://github.com/ZioPao/The-Only-Cure
modversion=2.2.2
modversion=2.2
versionMin=42.6
loadModAfter=\FancyHandwork,\BrutalHandwork,\TwoWeaponsOnBackRework

View File

@@ -1,16 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<clothingItem>
<m_MaleModel>Amputation\Amputation_Left_LowerArm_Male</m_MaleModel>
<m_MaleModel>Amputation\Amputation_FA_LR</m_MaleModel>
<m_FemaleModel>Amputation\Amputation_Left_LowerArm_Female</m_FemaleModel>
<m_GUID>d3816fe0-48e1-4cf5-a8e4-48c72595edb4</m_GUID>
<m_Static>false</m_Static>
<m_AllowRandomHue>false</m_AllowRandomHue>
<m_AllowRandomTint>false</m_AllowRandomTint>
<m_Masks>4</m_Masks>
<m_Masks>3</m_Masks>
<m_UnderlayMasksFolder>media/textures/Amputations/Masks/TestDouble</m_UnderlayMasksFolder>
<m_Masks>4</m_Masks>
<m_Masks>6</m_Masks>
<!-- <m_UnderlayMasksFolder>media/textures/Amputations/Masks</m_UnderlayMasksFolder> -->
<!-- HUMAN -->

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<clothingItem>
<m_MaleModel>Amputation\Amputation_FA_LR</m_MaleModel>
<m_FemaleModel>Amputation\Amputation_FA_LR</m_FemaleModel>
<m_GUID>8e5bc1b4-d79b-4a17-b86b-71dab6ace816</m_GUID>
<m_Static>false</m_Static>
<m_AllowRandomHue>false</m_AllowRandomHue>
<m_AllowRandomTint>false</m_AllowRandomTint>
<m_Masks>4</m_Masks>
<m_Masks>6</m_Masks>
<!-- HUMAN -->
<textureChoices>Amputations\Human\Forearm\skin01_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin02_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin03_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin04_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin05_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin01_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin02_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin03_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin04_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin05_hairy_b</textureChoices>
<!-- HUMAN AFTER CICATRIZATION -->
<textureChoices>Body\MaleBody01</textureChoices>
<textureChoices>Body\MaleBody02</textureChoices>
<textureChoices>Body\MaleBody03</textureChoices>
<textureChoices>Body\MaleBody04</textureChoices>
<textureChoices>Body\MaleBody05</textureChoices>
<textureChoices>Body\MaleBody01a</textureChoices>
<textureChoices>Body\MaleBody02a</textureChoices>
<textureChoices>Body\MaleBody03a</textureChoices>
<textureChoices>Body\MaleBody04</textureChoices>
<textureChoices>Body\MaleBody05a</textureChoices>
<!-- ZOMBIE -->
<textureChoices>Amputations\Zombie\Forearm\z_skin01_l1</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin01_l2</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin01_l3</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin02_l1</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin02_l2</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin02_l3</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin03_l1</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin03_l2</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin03_l3</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin04_l1</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin04_l2</textureChoices>
<textureChoices>Amputations\Zombie\Forearm\z_skin04_l3</textureChoices>
</clothingItem>

View File

@@ -10,8 +10,6 @@
<m_Masks>5</m_Masks>
<m_Masks>6</m_Masks>
<!-- <m_UnderlayMasksFolder>media/textures/Amputations/Masks</m_UnderlayMasksFolder> -->
<!-- HUMAN -->
<textureChoices>Amputations\Human\Forearm\skin01_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin02_b</textureChoices>

View File

@@ -7,33 +7,18 @@
<m_AllowRandomHue>false</m_AllowRandomHue>
<m_AllowRandomTint>false</m_AllowRandomTint>
<m_Masks>4</m_Masks>
<!-- <m_MasksFolder>none</m_MasksFolder> -->
<m_MasksFolder>none</m_MasksFolder>
<!-- HUMAN -->
<textureChoices>Amputations\Human\Hand\skin01_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin02_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin03_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin04_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin05_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin01_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin02_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin03_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin04_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin05_hairy_b</textureChoices>
<!-- HUMAN AFTER CICATRIZATION -->
<textureChoices>Body\MaleBody01</textureChoices>
<textureChoices>Body\MaleBody02</textureChoices>
<textureChoices>Body\MaleBody03</textureChoices>
<textureChoices>Body\MaleBody04</textureChoices>
<textureChoices>Body\MaleBody05</textureChoices>
<textureChoices>Body\MaleBody01a</textureChoices>
<textureChoices>Body\MaleBody02a</textureChoices>
<textureChoices>Body\MaleBody03a</textureChoices>
<textureChoices>Body\MaleBody04</textureChoices>
<textureChoices>Body\MaleBody05a</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin01_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin02_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin03_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin04_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin05_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin01_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin02_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin03_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin04_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin05_hairy_b</textureChoices>
</clothingItem>

View File

@@ -6,32 +6,18 @@
<m_AllowRandomHue>false</m_AllowRandomHue>
<m_AllowRandomTint>false</m_AllowRandomTint>
<m_Masks>6</m_Masks>
<!-- <m_MasksFolder>none</m_MasksFolder> -->
<m_MasksFolder>none</m_MasksFolder>
<!-- HUMAN -->
<textureChoices>Amputations\Human\Hand\skin01_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin02_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin03_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin04_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin05_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin01_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin02_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin03_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin04_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin05_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin01_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin02_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin03_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin04_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Hand\skin05_hairy_b</textureChoices>
<!-- HUMAN AFTER CICATRIZATION -->
<textureChoices>Body\MaleBody01</textureChoices>
<textureChoices>Body\MaleBody02</textureChoices>
<textureChoices>Body\MaleBody03</textureChoices>
<textureChoices>Body\MaleBody04</textureChoices>
<textureChoices>Body\MaleBody05</textureChoices>
<textureChoices>Body\MaleBody01a</textureChoices>
<textureChoices>Body\MaleBody02a</textureChoices>
<textureChoices>Body\MaleBody03a</textureChoices>
<textureChoices>Body\MaleBody04</textureChoices>
<textureChoices>Body\MaleBody05a</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin01_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin02_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin03_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin04_hairy_b</textureChoices>
<textureChoices>Amputations\Human\Forearm\skin05_hairy_b</textureChoices>
</clothingItem>

View File

@@ -9,8 +9,6 @@
<m_Masks>3</m_Masks>
<m_Masks>4</m_Masks>
<!-- <m_UnderlayMasksFolder>media/textures/Amputations/Masks</m_UnderlayMasksFolder> -->
<!-- HUMAN -->
<textureChoices>Amputations\Human\Upperarm\skin01_b</textureChoices>
<textureChoices>Amputations\Human\Upperarm\skin02_b</textureChoices>

View File

@@ -8,7 +8,6 @@
<m_AllowRandomTint>false</m_AllowRandomTint>
<m_Masks>5</m_Masks>
<m_Masks>6</m_Masks>
<!-- <m_UnderlayMasksFolder>media/textures/Amputations/Masks</m_UnderlayMasksFolder> -->
<!-- HUMAN -->
<textureChoices>Amputations\Human\Upperarm\skin01_b</textureChoices>

View File

@@ -57,5 +57,11 @@
<guid>9a5fe063-63c7-4e6f-81ca-ee77c6678e0d</guid>
</files>
<!-- TEST -->
<files>
<path>media/clothing/clothingItems/Amputation_ForeArm_LR.xml</path>
<guid>8e5bc1b4-d79b-4a17-b86b-71dab6ace816</guid>
</files>
</fileGuidTable>

View File

@@ -17,6 +17,7 @@ ItemsController.Player = {}
---@return number
---@private
function ItemsController.Player.GetAmputationTexturesIndex(playerObj, isCicatrized)
-- todo
local textureString = playerObj:getHumanVisual():getSkinTexture()
local isHairy = textureString:sub(-1) == "a"

View File

@@ -64,18 +64,18 @@ end
---@param obj any self
---@param wrappedFunc function
function TourniquetController.WrapClothingAction(obj, wrappedFunc)
-- local isTourniquet = TourniquetController.IsItemTourniquet(obj.item:getFullType())
-- local group
-- if isTourniquet then
-- group = BodyLocations.getGroup("Human")
-- group:setMultiItem(TourniquetController.bodyLoc, false)
-- end
local isTourniquet = TourniquetController.IsItemTourniquet(obj.item:getFullType())
local group
if isTourniquet then
group = BodyLocations.getGroup("Human")
group:setMultiItem(TourniquetController.bodyLoc, false)
end
local ogValue = wrappedFunc(obj)
-- if isTourniquet then
-- group:setMultiItem(TourniquetController.bodyLoc, true)
-- end
if isTourniquet then
group:setMultiItem(TourniquetController.bodyLoc, true)
end
return ogValue -- Needed for isValid
end

View File

@@ -9,8 +9,8 @@ local OverridenMethodsArchive = require("TOC/OverridenMethodsArchive")
---@class ProsthesisHandler
local ProsthesisHandler = {}
local bodylocArmProstBaseline = "TOC_ArmProst"
--local bodyLocLegProst = "TOC_LegProst"
local bodyLocArmProst = StaticData.MOD_BODYLOCS_BASE_IND_STR.TOC_ArmProst
local bodyLocLegProst = StaticData.MOD_BODYLOCS_BASE_IND_STR.TOC_LegProst
---Check if the following item is a prosthesis or not
---@param item InventoryItem?
@@ -23,7 +23,7 @@ function ProsthesisHandler.CheckIfProst(item)
return false
end
return item:getBodyLocation():contains(bodylocArmProstBaseline)
return item:getBodyLocation():contains(bodyLocArmProst)
end
---Get the grouping for the prosthesis
@@ -33,10 +33,13 @@ function ProsthesisHandler.GetGroup(item)
local fullType = item:getFullType()
local side = CommonMethods.GetSide(fullType)
local bodyLocation = item:getBodyLocation()
local position
if bodyLocation:contains(bodylocArmProstBaseline) then
if bodyLocation == bodyLocArmProst then
position = "Top_"
elseif bodyLocation == bodyLocLegProst then
position = "Bottom_"
else
TOC_DEBUG.print("Something is wrong, no position in this item")
position = nil
@@ -164,15 +167,15 @@ function ISUnequipAction:perform()
]]
local isProst = ProsthesisHandler.SearchAndSetupProsthesis(self.item, false)
-- local group
-- if isProst then
-- group = BodyLocations.getGroup("Human")
-- group:setMultiItem("TOC_ArmProst", false)
-- end
local group
if isProst then
group = BodyLocations.getGroup("Human")
group:setMultiItem("TOC_ArmProst", false)
end
og_ISUnequipAction_perform(self)
if isProst then
-- group:setMultiItem("TOC_ArmProst", true)
group:setMultiItem("TOC_ArmProst", true)
-- we need to fetch the limbname associated to the prosthesis
local side = CommonMethods.GetSide(self.item:getFullType())

View File

@@ -6,7 +6,7 @@ require("TOC/Events")
---@class Main
local Main = {
_version = "2.2.2"
_version = "2.1.6"
}
function Main.Start()

View File

@@ -143,6 +143,26 @@ function ISHealthPanel:render()
end
-- local og_ISHealthPanel_update = ISHealthPanel.update
-- function ISHealthPanel:update()
-- og_ISHealthPanel_update(self)
-- -- TODO Listen for changes on other player side instead of looping this
-- -- FIX Re-enable it, just for test
-- if self.character then
-- local locPlUsername = getPlayer():getUsername()
-- local remPlUsername = self.character:getUsername()
-- if locPlUsername ~= remPlUsername and self:isReallyVisible() then
-- -- Request update for TOC DATA
-- local key = CommandsData.GetKey(remPlUsername)
-- --ModData.request(key)
-- end
-- end
-- end
-- We need to override this to force the alpha to 1
local og_ISCharacterInfoWindow_render = ISCharacterInfoWindow.prerender
function ISCharacterInfoWindow:prerender()

View File

@@ -33,17 +33,15 @@ function BaseHandler:checkItems()
local containers = ISInventoryPaneContextMenu.getContainers(self:getDoctor())
local done = {}
local childContainers = {}
if containers ~= nil then
for i=1, containers:size() do
local container = containers:get(i-1)
done[container] = true
table.wipe(childContainers)
self:checkContainerItems(container, childContainers)
for _,container2 in ipairs(childContainers) do
if not done[container2] then
done[container2] = true
self:checkContainerItems(container2, nil)
end
for i=1,containers:size() do
local container = containers:get(i-1)
done[container] = true
table.wipe(childContainers)
self:checkContainerItems(container, childContainers)
for _,container2 in ipairs(childContainers) do
if not done[container2] then
done[container2] = true
self:checkContainerItems(container2, nil)
end
end
end
@@ -103,7 +101,7 @@ function BaseHandler:getItemOfTag(items, type)
end
function BaseHandler:getAllItemsOfType(items, type)
items = {}
local items = {}
for _,item in ipairs(items) do
if item:getFullType() == type then
table.insert(items, item)

View File

@@ -9,19 +9,8 @@ local group = BodyLocations.getGroup("Human")
---@type ArrayList
local list = customGetVal(group, 1)
---@param bodyLoc string
function BodyLocationsAPI.New(bodyLoc)
local curItem
if StaticData.COMPAT_42 then
curItem = BodyLocation.new(group, bodyLoc) -- create new item
group:getAllLocations():add(curItem) -- add to the list
else
curItem = group:getOrCreateLocation(bodyLoc) -- get current item - or create
end
return curItem
end
-- TODO Not sure if this method actually works as intende with b42, but for our use case it's fine...
---@param toRelocateOrCreate string
---@param locationElement string
---@param afterBoolean boolean
@@ -34,7 +23,14 @@ function BodyLocationsAPI.MoveOrCreateBeforeOrAfter(toRelocateOrCreate, location
-- Check type of arg 1 == string - if not, error out.
if type(toRelocateOrCreate) ~= "string" then error("Argument 1 is not of type string. Please re-check!", 2) end
local curItem = BodyLocationsAPI.New(toRelocateOrCreate)
local curItem
if StaticData.COMPAT_42 then
curItem = BodyLocation.new(group, toRelocateOrCreate) -- create new item
group:getAllLocations():add(curItem) -- add to the list
else
curItem = group:getOrCreateLocation(toRelocateOrCreate) -- get current item - or create
end
list:remove(curItem) -- remove from the list
local index = group:indexOf(locationElement) -- get current index after removal of the location to move to
if afterBoolean then index = index + 1 end -- if we want it after it, we increase the index to move to by one
@@ -47,33 +43,29 @@ function BodyLocationsAPI.MoveOrCreateBeforeOrAfter(toRelocateOrCreate, location
end
end
function TestBodyLocations()
local group = BodyLocations.getGroup("Human")
local x = group:getAllLocations()
for i=0, x:size() -1 do
-- function TestBodyLocations()
-- local group = BodyLocations.getGroup("Human")
-- local x = group:getAllLocations()
---@type BodyLocation
local bl = x:get(i)
-- for i=0, x:size() -1 do
-- ---@type BodyLocation
-- local bl = x:get(i)
-- print(bl:getId())
-- end
-- end
print(bl:getId())
end
end
-- MultiItem causes a ton of issues... fucking hell
-- local curItem = BodyLocation.new(group, "TOC_Arm_L")
-- group:getAllLocations():add(curItem)
-- BodyLocationsAPI.MoveOrCreateBeforeOrAfter("TOC_Arm", "Shirt", true)
-- group:setMultiItem("TOC_Arm", true)
-- local curItem = BodyLocation.new(group, "TOC_Arm_R")
-- group:getAllLocations():add(curItem)
local curItem = BodyLocation.new(group, "TOC_Arm") -- create new item
group:getAllLocations():add(curItem) -- add to the list
BodyLocationsAPI.MoveOrCreateBeforeOrAfter("TOC_ArmProst", "TOC_Arm", true)
group:setMultiItem("TOC_ArmProst", true)
BodyLocationsAPI.New("TOC_Arm_L")
BodyLocationsAPI.New("TOC_Arm_R")
BodyLocationsAPI.New("TOC_ArmProst_L")
BodyLocationsAPI.New("TOC_ArmProst_R")
BodyLocationsAPI.New("TOC_ArmAccessory_L")
BodyLocationsAPI.New("TOC_ArmAccessory_R")
BodyLocationsAPI.MoveOrCreateBeforeOrAfter("TOC_ArmAccessory", "TOC_ArmProst", true)
group:setMultiItem("TOC_ArmAccessory", true)

View File

@@ -13,12 +13,10 @@ end
---Print debug
---@param string string
function TOC_DEBUG.print(string)
if isDebugEnabled() then
local runningFile = TOC_DEBUG.getRunningFile()
print("[TOC]" .. "[" .. runningFile .. "] " .. tostring(string))
else
print(string)
end
--if isDebugEnabled() then
local runningFile = TOC_DEBUG.getRunningFile()
print("[TOC]" .. "[" .. runningFile .. "] " .. tostring(string))
--end
end
---Horrendous but I don't really care about performance for this

View File

@@ -49,14 +49,11 @@ StaticData.PARTS_STR = {
"UpperArm"
}
-- TODO make it a bit more elegant
StaticData.MOD_BODYLOCS_BASE_IND_STR = {
TOC_ArmProst_L = "TOC_ArmProst_L",
TOC_ArmProst_R = "TOC_ArmProst_R",
TOC_Arm_L = "TOC_Arm_L",
TOC_Arm_R = "TOC_Arm_R",
--TOC_LegProst = "TOC_LegProst",
StaticData.MOD_BODYLOCS_BASE_IND_STR = {
TOC_ArmProst = "TOC_ArmProst",
TOC_LegProst = "TOC_LegProst",
TOC_Arm = "TOC_Arm",
}
-- No "MAX" here.
@@ -152,7 +149,6 @@ StaticData.AMP_GROUPS_BASE_IND_STR = {
Bottom = "Bottom"
}
-- FIX This should be aligned with the body locs, no reason anymore to keep it separated
StaticData.AMP_GROUPS_IND_STR = {}
StaticData.AMP_GROUPS_STR = {}

Binary file not shown.

View File

@@ -9,10 +9,9 @@ module TOC
{
Type = Clothing,
DisplayCategory = Amputation,
hidden = true,
ClothingItem = Amputation_Hand_R,
BodyLocation = TOC_Arm_R,
BodyLocation = TOC_Arm,
Weight = 0,
CombatSpeedModifier = 0.9,
@@ -28,10 +27,9 @@ module TOC
{
Type = Clothing,
DisplayCategory = Amputation,
hidden = true,
ClothingItem = Amputation_ForeArm_R,
BodyLocation = TOC_Arm_R,
BodyLocation = TOC_Arm,
Weight = 0,
CombatSpeedModifier = 0.8,
@@ -46,10 +44,9 @@ module TOC
{
Type = Clothing,
DisplayCategory = Amputation,
hidden = true,
ClothingItem = Amputation_UpperArm_R,
BodyLocation = TOC_Arm_R,
BodyLocation = TOC_Arm,
BloodLocation = UpperArms;UpperBody,
Weight = 0,
CombatSpeedModifier = 0.7,
@@ -63,10 +60,9 @@ module TOC
{
Type = Clothing,
DisplayCategory = Amputation,
hidden = true,
ClothingItem = Amputation_Hand_L,
BodyLocation = TOC_Arm_L,
BodyLocation = TOC_Arm,
Weight = 0,
CombatSpeedModifier = 0.9,
@@ -82,10 +78,9 @@ module TOC
{
Type = Clothing,
DisplayCategory = Amputation,
hidden = true,
ClothingItem = Amputation_ForeArm_L,
BodyLocation = TOC_Arm_L,
BodyLocation = TOC_Arm,
Weight = 0,
CombatSpeedModifier = 0.8,
@@ -101,10 +96,9 @@ module TOC
{
Type = Clothing,
DisplayCategory = Amputation,
hidden = true,
ClothingItem = Amputation_UpperArm_L,
BodyLocation = TOC_Arm_L,
BodyLocation = TOC_Arm,
Weight = 0,
CombatSpeedModifier = 0.7,
@@ -115,4 +109,24 @@ module TOC
CanHaveHoles = false,
}
item Amputation_FA_LR
{
Type = Clothing,
DisplayCategory = Amputation,
ClothingItem = Amputation_ForeArm_LR,
BodyLocation = TOC_Arm,
Weight = 0,
CombatSpeedModifier = 0.7,
BloodLocation = UpperArms;UpperBody,
Insulation = 1.0,
WindResistance = 1.0,
WaterResistance = 1.0,
CanHaveHoles = false,
}
}

View File

@@ -16,7 +16,7 @@ module TOC
ClothingItemExtra = Prost_HookArm_R,
ClothingItemExtraOption = InstallProstRight,
clothingExtraSubmenu = InstallProstLeft,
BodyLocation = TOC_ArmProst_L,
BodyLocation = TOC_ArmProst,
Weight = 1.5,
CombatSpeedModifier = 1.05,
BloodLocation = UpperArms;UpperBody,
@@ -38,7 +38,7 @@ module TOC
ClothingItemExtra = Prost_HookArm_L,
ClothingItemExtraOption = InstallProstLeft,
clothingExtraSubmenu = InstallProstRight,
BodyLocation = TOC_ArmProst_R,
BodyLocation = TOC_ArmProst,
Weight = 1.5,
CombatSpeedModifier = 1.05,
BloodLocation = UpperArms;UpperBody,
@@ -60,7 +60,7 @@ module TOC
ClothingItemExtra = Prost_NormalArm_R,
ClothingItemExtraOption = InstallProstRight,
clothingExtraSubmenu = InstallProstLeft,
BodyLocation = TOC_ArmProst_L,
BodyLocation = TOC_ArmProst,
Weight = 2,
CombatSpeedModifier = 1.1,
BloodLocation = UpperArms;UpperBody,
@@ -82,7 +82,7 @@ module TOC
ClothingItemExtra = Prost_NormalArm_L,
ClothingItemExtraOption = InstallProstLeft,
clothingExtraSubmenu = InstallProstRight,
BodyLocation = TOC_ArmProst_R,
BodyLocation = TOC_ArmProst,
Weight = 2,
CombatSpeedModifier = 1.1,
BloodLocation = UpperArms;UpperBody,

View File

@@ -15,7 +15,7 @@ module TOC
ClothingItemExtra = Surg_Arm_Tourniquet_R,
ClothingItemExtraOption = PutTourniquetArmRight,
clothingExtraSubmenu = PutTourniquetArmLeft,
BodyLocation = TOC_ArmAccessory_L,
BodyLocation = TOC_ArmAccessory,
BloodLocation = UpperArms;UpperBody,
Weight = 0.25,
@@ -35,7 +35,7 @@ module TOC
ClothingItemExtra = Surg_Arm_Tourniquet_L,
ClothingItemExtraOption = PutTourniquetArmLeft,
clothingExtraSubmenu = PutTourniquetArmRight,
BodyLocation = TOC_ArmAccessory_R,
BodyLocation = TOC_ArmAccessory,
BloodLocation = UpperArms;UpperBody,
Weight = 0.25,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 B

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 844 B

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -1,65 +1,46 @@
from pathlib import Path
from PIL import Image
import os
input_bodies_path = Path('input/body')
input_wound_texture = Path('input/wound.png')
# 45, 33 TEXTURE
# 48, 33 TEXTURE
# 256,256
IMG_WIDTH = 256
COORDS_L = {
"H": (2, 100),
"F": (2, 59),
"U": (2,21),
#"H": (0, 115),
"F": (0, 59),
"U": (0,21),
}
COORDS_R = {
"H": (IMG_WIDTH - 43- COORDS_L['H'][0], COORDS_L['H'][1]),
"F": (IMG_WIDTH - 43 - COORDS_L['F'][0], COORDS_L['F'][1]),
"U": (IMG_WIDTH - 43 - COORDS_L['U'][0], COORDS_L['U'][1]),
#"H": (IMG_WIDTH - 50- COORDS_L['H'][0], COORDS_L['H'][1]),
"F": (IMG_WIDTH - 48 - COORDS_L['F'][0], COORDS_L['F'][1]),
"U": (IMG_WIDTH - 48 - COORDS_L['U'][0], COORDS_L['U'][1]),
}
FULL_COORDS = {key: (COORDS_L[key], COORDS_R[key]) for key in COORDS_L}
STATES = ["BOTH"]
print(FULL_COORDS)
overlay = Image.open(input_wound_texture)
for filepath in input_bodies_path.glob('*.png'): # Only PNG files
print(f'Processing {filepath.name}...')
base = Image.open(filepath)
body_name = filepath.stem
body_name = filepath.stem.replace('MaleBody', 'skin')
if body_name.endswith('a'):
body_name = body_name[:-1] + '_hairy_b'
else:
body_name = body_name + '_b'
for key, (value_L, value_R) in FULL_COORDS.items():
print(key)
result = base.copy()
result.paste(overlay, value_L, mask=overlay)
result.paste(overlay, value_R, mask=overlay)
output_path = 'output/'
if key == "H":
os.makedirs('output/Hand', exist_ok=True)
output_path = 'output/Hand'
if key == "F":
os.makedirs('output/Forearm', exist_ok=True)
output_path = 'output/Forearm'
if key == "U":
os.makedirs('output/UpperArm', exist_ok=True)
output_path = 'output/UpperArm'
result.save(f'{output_path}/{body_name}.png')
for key_L, value_L in COORDS_L.items():
for key_R, value_R in COORDS_R.items():
for state in STATES:
result = base.copy()
if state == "BOTH" or state == "ONLY_LEFT":
result.paste(overlay, value_L, mask=overlay)
if state == "BOTH" or state == "ONLY_RIGHT":
result.paste(overlay, value_R, mask=overlay)
result.save(f'output/{body_name}_{key_L}_{key_R}_{state}.png')

View File

@@ -1,3 +0,0 @@
16:46:38:807 [CRITICAL] SharedConnection - Failed to open WinHTTP Session. The parameter is incorrect.
, last error code = 87

View File

@@ -4,21 +4,26 @@
[h1]You're bitten. You have two choices.[/h1]
Wait until you succumb to the virus or take matters into your hands. Cut off that infected part and live to die another day.
This version of [b]The Only Cure[/b] has been rebuilt from scratch to support future additions and to feel as close as possible as a vanilla mechanic.
[b]If you're using an older version of The Only Cure and want to switch with this, you're gonna need to create a new character\save to prevent issues.[/b]
[b]The older version will be delisted shortly and it will not be supported anymore.[/b]
[h1]Supports [b]Single Player[/b] and [b]Multiplayer[/b]. Host Mode is currently [b]UNSUPPORTED![/b][/h1]
[h1]Setup[/h1]
[strike]Use it with the following mods for the intended experience:
Use it with the following mods for the intended experience:
[list]
[*] [url=https://steamcommunity.com/sharedfiles/filedetails/?id=2904920097]Fancy Handwork[/url]
[*] [url=https://steamcommunity.com/sharedfiles/filedetails/?id=2934621024]Brutal Handwork[/url]
[/list]
Place them [b]BEFORE[/b] The Only Cure in your mod list![/strike]
[b]At the moment, the mods listed here aren't compatible with B42.[/b]
Place them [b]BEFORE[/b] The Only Cure in your mod list!
[hr][/hr]
[h1]Quick guide[/h1]
[h2]Amputation[/h2]
Get a [i]Saw[/i]/[i]Garden Saw[/i], right click on it, and choose which limb to amputate. You can also drag n' drop your Saw item directly into the afflicted area to start cutting it off.
Get a [i]Saw[/i] or a [i]Garden Saw[/i], right click on it, and choose which limb to amputate. You can also drag n' drop your Saw item directly into the afflicted area to start cutting it off.
If you have some [i]bandages[/i] and\or [i]stitches[/i] in your inventory you will automatically use them, multiplying the chances of your survival.
If you have a [i]tourniquet[/i], place it on the correct side to dampen the amount of damage you will take after you're done amputating the limb.
@@ -72,8 +77,8 @@ Got any issues or found some pesky bugs? Report them on GitHub!
[th]Compatibility API[/th]
[/tr]
[tr]
[th]JCloudJalix, Rinary1, pllq, ttaeo, pgmbru[/th]
[th]Translation[/th]
[th]JCloudJalix[/th]
[th]German translation[/th]
[/tr]
[/table]

View File

@@ -1,7 +0,0 @@
name=The Only Cure
poster=poster.png
description=You've been bitten. You have only two choices.
id=TheOnlyCure
icon=icon.png
url=https://github.com/ZioPao/The-Only-Cure
modversion=2.2.1

View File

@@ -4,4 +4,4 @@ description=You've been bitten. You have only two choices.
id=TheOnlyCure
icon=icon.png
url=https://github.com/ZioPao/The-Only-Cure
modversion=2.2.1
modversion=2.1.7

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -1,6 +1,6 @@
version=1
id=3580276809
title=[B42] The Only Cure
id=3236152598
title=The Only Cure - Rebuilt
description=[img]https://raw.githubusercontent.com/ZioPao/The-Only-Cure/551125bb50cb65608ad89ca81ef0daccb3b02c4c/dev_stuff/logos/title.png[/img]
description=
@@ -27,7 +27,7 @@ description=
description=[h1]Setup[/h1]
description=[strike]Use it with the following mods for the intended experience:
description=Use it with the following mods for the intended experience:
description=[list]
@@ -39,12 +39,10 @@ description=[/list]
description=
description=Place them [b]BEFORE[/b] The Only Cure in your mod list![/strike]
description=Place them [b]BEFORE[/b] The Only Cure in your mod list!
description=
description=[b]At the moment, the mods listed here aren't compatible with B42.
description=[hr][/hr]
description=
@@ -183,5 +181,5 @@ description=
description=[hr][/hr]
tags=Build 42;Balance;Interface;Items;Misc;Multiplayer;Realistic;Textures
tags=Build 41;Balance;Interface;Items;Misc;Multiplayer;Realistic;Textures
visibility=public