2025-07-18 23:13 CEST

View Issue Details Jump to Notes ]
IDProjectCategoryView StatusLast Update
0004675Spring engineGeneralpublic2015-02-22 07:03
Reporterlamer 
Assigned TojK 
PrioritynormalSeverityminorReproducibilityalways
StatusresolvedResolutionfixed 
Product Version98.0.1+git 
Target VersionFixed in Version 
Summary0004675: water.damage used without reverse scale
DescriptionNext code doesn't seem to be correct:
https://github.com/spring/spring/blob/36f68e956d0e6ca45b03d9dc27d717084c43503e/rts/Sim/MoveTypes/MoveDefHandler.cpp#L130-L132
Because water.damage is already scaled here:
https://github.com/spring/spring/blob/36f68e956d0e6ca45b03d9dc27d717084c43503e/rts/Map/MapInfo.cpp#L226
TagsNo tags attached.
Checked infolog.txt for Errors
Attached Files

-Relationships
+Relationships

-Notes

~0014043

jK (developer)

what?

~0014044

lamer (reporter)

Water damage apllied during SlowUpdate:
https://github.com/spring/spring/blob/36f68e956d0e6ca45b03d9dc27d717084c43503e/rts/Sim/Units/Unit.cpp#L921
So water.damage is scaled once on init:
https://github.com/spring/spring/blob/36f68e956d0e6ca45b03d9dc27d717084c43503e/rts/Map/MapInfo.cpp#L226
And then next code uses already scaled wate.damage to calc waterDamageCost & noHoverWaterMove (for pathing):
https://github.com/spring/spring/blob/36f68e956d0e6ca45b03d9dc27d717084c43503e/rts/Sim/MoveTypes/MoveDefHandler.cpp#L130-L132

Is that correct? Seems like MAX_ALLOWED_WATER_DAMAGE_HMM and MAX_ALLOWED_WATER_DAMAGE_GMM have no meaning in that context, and waterDamageCost calculation is also spoiled by scaled water.damage.

~0014045

jK (developer)

| Is that correct? Seems like MAX_ALLOWED_WATER_DAMAGE_HMM and MAX_ALLOWED_WATER_DAMAGE_GMM have no meaning in that context, and waterDamageCost calculation is also spoiled by scaled water.damage.

who says that?

~0014046

lamer (reporter)

Last edited: 2015-02-18 01:31

View 3 revisions

Code says that. And I'm just checking. There are concrete links to code.

Anyway, futher analysis:
Issue 1) water.damage = wt.GetFloat("damage", 0.0f) * (16.0f / GAME_SPEED);
What happens if UNIT_SLOWUPDATE_RATE will be changed (say from 16 to 8 or 32, doesn't matter)? Then water.damage applied will be incorrect and different in each case due to const 16.0f. But thats the easy fixable part:
water.damage = wt.GetFloat("damage", 0.0f) * ((float)UNIT_SLOWUPDATE_RATE / GAME_SPEED);

Issue 2)
CMoveMath::noHoverWaterMove = (mapInfo->water.damage >= MAX_ALLOWED_WATER_DAMAGE_HMM);
CMoveMath::waterDamageCost = (mapInfo->water.damage >= MAX_ALLOWED_WATER_DAMAGE_GMM)?
0.0f: (1.0f / (1.0f + mapInfo->water.damage * 0.1f));

water.damage here is WaterDamage * (16.0f / GAME_SPEED), and we have those round numbers that doesn't related to (16.0f / GAME_SPEED), why?
static const float MAX_ALLOWED_WATER_DAMAGE_GMM = 1e3f;
static const float MAX_ALLOWED_WATER_DAMAGE_HMM = 1e4f;
And why should waterDamageCost be based on UNIT_SLOWUPDATE_RATE (or 16.0f) for pathing? I believe it should be related to unspoiled WaterDamage, so the pathing won't change if UNIT_SLOWUPDATE_RATE changes.

More trivial question: in what range WaterDamage should be to make use of hover units but not ground units?

Check (like in "check and mate").

Issue 3) Did someone hijack jK's account? Please put it back.
P.S. I didn't do any fixes/testing, i was hoping that someone knows the engine code. Maybe pathing does reverse scaling? But unfortunatly i get only questions to my question (but thanks, atleast some attention/response).

+Notes

-Issue History
Date Modified Username Field Change
2015-02-13 19:43 lamer New Issue
2015-02-13 19:56 jK Note Added: 0014043
2015-02-13 20:16 lamer Note Added: 0014044
2015-02-15 03:03 jK Note Added: 0014045
2015-02-15 12:03 lamer Note Added: 0014046
2015-02-15 13:17 lamer Note Edited: 0014046 View Revisions
2015-02-18 01:31 lamer Note Edited: 0014046 View Revisions
2015-02-22 07:03 jK Status new => resolved
2015-02-22 07:03 jK Resolution open => fixed
2015-02-22 07:03 jK Assigned To => jK
+Issue History