Jump to content

Warbot missiles consider WX-78 with as endothermic when ambient temperature is above 0


hoxi
  • Fixed

This happens when they have no cold/heat modules, or have an equal amount to cancel each other out, and it causes them to be ignored, as entities considered endothermic by missiles are skipped entirely for missile targeting.

 

Part of the issue comes from here, in wx78.lua

local function GetThermicTemperatureFn(inst, observer)
    return inst._temperature_modulelean * TUNING.WX78_HEATERTEMPPERMODULE
end

This is returning 0 when WX-78's temperature module lean is 0, and 0 is a valid value. Ideally, this should be returning nil instead when the module lean value is 0, even if both exo and endo thermics are disabled, for the sake of consistency.

 

The same should apply to the thermal stones (and dumbbells, which I should remind that they don't return equipped heat, just have it be the same as the GetHeat function for them), and probably other things. One case that does affect gameplay more is Hot Springs, as I reported here a while back (they heat up things that are below 0, thermics could be disabled on them too on their glassed state for further consistency, besides returning nil heat).

 

Anyhow, ideally: heat, carried heat, and equipped heat functions should never return 0 as default unless that's a default endothermic value.

 

All that said, part of the issue also lies here:

--NOTE: GetHeat() can be nil!
if heater:IsExothermic() then
	temperature = math.max(temperature, heater:GetHeat(v) or temperature)
elseif heater:IsEndothermic() then
	endo = true
	temperature = math.min(temperature, heater:GetHeat(v) or temperature)
elseif v.currentTempRange then
	--heatrock special case because thermics setup isn't reliable
	endo = v.currentTempRange < 3
	if v.currentTempRange ~= 3 and v.components.temperature then
		temperature = v.components.temperature:GetCurrent()
	end
else -- HERE
	--for other things that don't setup thermics
	temperature = heater:GetHeat(v) or temperature
	endo = temperature < ambient_temp
end

That last bit there is where it happens.

I feel like you could just ditch that else case entirely (and probably continue with the rest of the checks), kinda like this:

-- ._lightinst ==> winona_spotlight
-- .currentTempRange ==> heatrock
local heater = v._lightinst and v._lightinst.components.heater or v.components.heater
if heater then
	--NOTE: GetHeat() can be nil!
	if heater:IsExothermic() then
		temperature = math.max(temperature, heater:GetHeat(v) or temperature)
	elseif heater:IsEndothermic() then
		endo = true
		temperature = math.min(temperature, heater:GetHeat(v) or temperature)
	elseif v.currentTempRange then
		--heatrock special case because thermics setup isn't reliable
		endo = v.currentTempRange < 3
		if v.currentTempRange ~= 3 and v.components.temperature then
			temperature = v.components.temperature:GetCurrent()
		end
	else
		heater = nil
	--	--for other things that don't setup thermics
	--	temperature = heater:GetHeat(v) or temperature
	--	endo = temperature < ambient_temp
	end
end

if not heater then
	if v.components.temperature then
		temperature = v.components.temperature:GetCurrent()
	elseif v.components.fueled and not v.components.fueled:IsEmpty() and v:HasTag("engineeringbattery") then
		temperature = temperature + 10
	elseif v.components.burnable and v.components.burnable:IsSmoldering() then
		--only add smoldering bonus if we don't have an actual temperature
		temperature = temperature + 5
	end
end

This would instead make it so WX-78's actual character temperature is used when they have no cold/heat modules, like any other character.

 

Something to keep in mind is that while WX-78 with a cold module will consistently get ignored, I think that's a neat little touch and it does make sense, as they basically become a walking endothermic source similar to a small endothermic fire.

If anything, that could be expanded when using the Chill Amulet. Maybe not just by wearing it but by requiring something from the player, like wearing it for a certain amount of time for an effect to activate (could be really neat if doing this caused the player to emit cold just like WX-78, or even share some of the behaviors of the Refrigerant Circuits).

 

Honestly? You could make it so that, aside from Refrigerant WX-78, if players are below 0 body temperature (or below whatever value world temperature is if it's below 0), they are also skipped. The thing about this is that being below 0 means you're taking freezing damage over time and you have to stay that way with no nearby heat sources, as they'll easily warm you up quickly. The Chill Amulet would make this simple but you'd have no body armor, and durability goes down kinda fast. A Mooncaller staff could be used but that's not gonna be anywhere as consistent with a single one because of thermic falloff.

 

Anyhow, that's all. Just in case, I'll link another report I made about Warbot's missiles temperature calculations here.


Steps to Reproduce
  • Fight Warbot as WX-78 with no heat or cold modules while world temperature is above 0.
  • Notice how the missile attack will never go off if there's no nearby exothermic entities. And how if there is, the missiles will ignore WX-78.



User Feedback


A developer has marked this issue as fixed. This means that the issue has been addressed in the current development build and will likely be in the next update.


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
  • Create New...