2025-07-16 09:21 CEST

View Issue Details Jump to Notes ]
IDProjectCategoryView StatusLast Update
0000528Spring engineGeneralpublic2007-07-11 00:13
Reporterrattle 
Assigned Totvo 
PrioritynormalSeverityminorReproducibilityN/A
StatusresolvedResolutionfixed 
Product Version 
Target VersionFixed in Version 
Summary0000528: [patch] Dynamic Damage Patch
Descriptionhttp://spring.clan-sy.com/phpbb/viewtopic.php?t=9887

Adds the following FBI tags:
dynDamageExp
dynDamageMin
dynDamageInverted
dynDamageRange

dynDamageExp
Exponent of the function.
1 = linear

dynDamageMin
Minimum damage for the first damage type. The others will use a modifier (firstDamageType/dynDamageMin) instead.

dynDamageInverted
Reverses the curve/line.

dynDamageRange
Overrides the range tag and will be used instead if it is set.

Calculation is done on collision only.
Works with LOS, ballistic, beamlaser, flamer and lightning weapons.
TagsNo tags attached.
Checked infolog.txt for Errors
Attached Files
  • patch file icon DynamicDamagePatch.patch (7,781 bytes) 2007-04-19 23:17 -
    Index: Projectiles/WeaponProjectile.cpp
    ===================================================================
    --- Projectiles/WeaponProjectile.cpp	(revision 3496)
    +++ Projectiles/WeaponProjectile.cpp	(working copy)
    @@ -99,7 +99,13 @@
     	{
     		float3 impactDir = speed;
     		impactDir.Normalize();
    -		helper->Explosion(pos,weaponDef->damages,weaponDef->areaOfEffect,weaponDef->edgeEffectiveness,weaponDef->explosionSpeed,owner,true,weaponDef->noExplode? 0.3f:1,weaponDef->noExplode || weaponDef->noSelfDamage, weaponDef->explosionGenerator,0,impactDir, weaponDef->id);
    +
    +		// Dynamic Damage
    +		DamageArray dynDamages;
    +		if (weaponDef->dynDamageExp > 0)
    +			dynDamages = weaponDefHandler->DynamicDamages(weaponDef->damages, startpos, pos, weaponDef->dynDamageRange>0?weaponDef->dynDamageRange:weaponDef->range, weaponDef->dynDamageExp, weaponDef->dynDamageMin, weaponDef->dynDamageInverted);
    +		
    +		helper->Explosion(pos,weaponDef->dynDamageExp>0?dynDamages:weaponDef->damages,weaponDef->areaOfEffect,weaponDef->edgeEffectiveness,weaponDef->explosionSpeed,owner,true,weaponDef->noExplode? 0.3f:1,weaponDef->noExplode || weaponDef->noSelfDamage, weaponDef->explosionGenerator,0,impactDir, weaponDef->id);
     	}
     		
     	if(weaponDef->soundhit.id)
    @@ -129,7 +135,13 @@
     	{
     		float3 impactDir = speed;
     		impactDir.Normalize();
    -		helper->Explosion(pos,weaponDef->damages,weaponDef->areaOfEffect,weaponDef->edgeEffectiveness,weaponDef->explosionSpeed,owner,true,weaponDef->noExplode? 0.3f:1,weaponDef->noExplode,weaponDef->explosionGenerator,unit,impactDir, weaponDef->id);
    +
    +		// Dynamic Damage
    +		DamageArray dynDamages;
    +		if (weaponDef->dynDamageExp > 0)
    +			dynDamages = weaponDefHandler->DynamicDamages(weaponDef->damages, startpos, pos, weaponDef->dynDamageRange>0?weaponDef->dynDamageRange:weaponDef->range, weaponDef->dynDamageExp, weaponDef->dynDamageMin, weaponDef->dynDamageInverted);
    +			
    +		helper->Explosion(pos,weaponDef->dynDamageExp>0?dynDamages:weaponDef->damages,weaponDef->areaOfEffect,weaponDef->edgeEffectiveness,weaponDef->explosionSpeed,owner,true,weaponDef->noExplode? 0.3f:1,weaponDef->noExplode,weaponDef->explosionGenerator,unit,impactDir, weaponDef->id);
     	}
     
     	if(weaponDef->soundhit.id)
    Index: Weapons/BeamLaser.cpp
    ===================================================================
    --- Weapons/BeamLaser.cpp	(revision 3497)
    +++ Weapons/BeamLaser.cpp	(working copy)
    @@ -188,8 +188,13 @@
     		dir=newDir;
     	}
     	float	intensity=1-(curLength)/(range*2);
    -	if(curLength<maxLength)
    -		helper->Explosion(hitPos, weaponDef->damages*(intensity*damageMul), areaOfEffect, weaponDef->edgeEffectiveness, weaponDef->explosionSpeed,owner, true, 1.0f, false, weaponDef->explosionGenerator, hit, dir, weaponDef->id);
    +	if(curLength<maxLength) {
    +		// Dynamic Damage
    +		DamageArray dynDamages;
    +		if (weaponDef->dynDamageExp > 0)
    +			dynDamages = weaponDefHandler->DynamicDamages(weaponDef->damages, weaponPos, curPos, weaponDef->dynDamageRange>0?weaponDef->dynDamageRange:weaponDef->range, weaponDef->dynDamageExp, weaponDef->dynDamageMin, weaponDef->dynDamageInverted);
    +		helper->Explosion(hitPos, weaponDef->dynDamageExp>0?dynDamages*(intensity*damageMul):weaponDef->damages*(intensity*damageMul), areaOfEffect, weaponDef->edgeEffectiveness, weaponDef->explosionSpeed,owner, true, 1.0f, false, weaponDef->explosionGenerator, hit, dir, weaponDef->id);
    +	}
     
     	if(targetUnit)
     		lastFireFrame = gs->frameNum;
    Index: Weapons/LightingCannon.cpp
    ===================================================================
    --- Weapons/LightingCannon.cpp	(revision 3497)
    +++ Weapons/LightingCannon.cpp	(working copy)
    @@ -90,8 +90,14 @@
     
     //	if(u)
     //		u->DoDamage(damages,owner,ZeroVector);
    -	helper->Explosion(weaponPos+dir*r,damages,areaOfEffect,weaponDef->edgeEffectiveness,weaponDef->explosionSpeed,owner,false,0.5f,true,weaponDef->explosionGenerator, u,dir, weaponDef->id);
     
    +	// Dynamic Damage
    +	DamageArray dynDamages;
    +	if (weaponDef->dynDamageExp > 0)
    +		dynDamages = weaponDefHandler->DynamicDamages(weaponDef->damages, weaponPos, targetPos, weaponDef->dynDamageRange>0?weaponDef->dynDamageRange:weaponDef->range, weaponDef->dynDamageExp, weaponDef->dynDamageMin, weaponDef->dynDamageInverted);
    +
    +	helper->Explosion(weaponPos+dir*r,weaponDef->dynDamageExp>0?dynDamages:weaponDef->damages,areaOfEffect,weaponDef->edgeEffectiveness,weaponDef->explosionSpeed,owner,false,0.5f,true,weaponDef->explosionGenerator, u,dir, weaponDef->id);
    +
     	SAFE_NEW CLightingProjectile(weaponPos,weaponPos+dir*(r+10),owner,color,weaponDef,10,this);
     	if(fireSoundId && (!weaponDef->soundTrigger || salvoLeft==salvoSize-1))
     		sound->PlaySample(fireSoundId,owner,fireSoundVolume);
    Index: Weapons/WeaponDefHandler.cpp
    ===================================================================
    --- Weapons/WeaponDefHandler.cpp	(revision 3497)
    +++ Weapons/WeaponDefHandler.cpp	(working copy)
    @@ -462,6 +462,12 @@
     
     	weaponDefs[id].id = id;
     	weaponID[weaponname] = id;
    +
    +	// Dynamic Damage
    +	sunparser->GetDef(weaponDefs[id].dynDamageInverted, "0", weaponname + "\\dynDamageInverted");
    +	weaponDefs[id].dynDamageExp = atof(sunparser->SGetValueDef("0", weaponname + "\\dynDamageExp").c_str());
    +	weaponDefs[id].dynDamageMin = atof(sunparser->SGetValueDef("0", weaponname + "\\dynDamageMin").c_str());
    +	weaponDefs[id].dynDamageRange = atof(sunparser->SGetValueDef("0", weaponname + "\\dynDamageRange").c_str());
     }
     
     void CWeaponDefHandler::LoadSound(GuiSound &gsound)
    @@ -538,5 +544,47 @@
     	return col;
     }
     
    +DamageArray CWeaponDefHandler::DynamicDamages(DamageArray damages, float3 startPos, float3 curPos, float range, float exp, float damageMin, bool inverted)
    +{
    +	DamageArray dynDamages;
    +
    +	curPos.y = 0;
    +	startPos.y = 0;
    +
    +	float travDist = (curPos-startPos).Length()>range?range:(curPos-startPos).Length();
    +	float ddmod = dynDamages[0]/damageMin; // get damage mod from first damage type
    +
    +	if (inverted == true) {
    +		for(int i=0; i < damageArrayHandler->numTypes; ++i) {
    +			
    +			dynDamages[i] = damages[i] - (1 - pow(1 / range * travDist, exp)) * damages[i];
    +
    +			if (damageMin > 0) {
    +				dynDamages[i] = max(damages[i] * ddmod, dynDamages[i]);
    +			}
    +
    +			// div by 0
    +			dynDamages[i] = max(0.0001f, dynDamages[i]);
    +//			logOutput.Print("%s D%i: %f (%f)", weaponDefs->name.c_str(), i, dynDamages[i]);
    +//			logOutput.Print("%s F%i: %f - (1 - (1/%f * %f) ^ %f * %f", weaponDefs->name.c_str(), i, dynDamages[i], range, travDist, exp, damages[i]);
    +		}
    +	}
    +	else {
    +		for(int i=0; i < damageArrayHandler->numTypes; ++i) {
    +			
    +			dynDamages[i] = (1 - pow(1 / range * travDist, exp)) * damages[i];
    +
    +			if (damageMin > 0) {
    +				dynDamages[i] = max(damages[i] * ddmod, dynDamages[i]);
    +			}
    +
    +			// div by 0
    +			dynDamages[i] = max(0.0001f, dynDamages[i]);
    +//			logOutput.Print("%s D%i: %f (%f)", weaponDefs->name.c_str(), i, dynDamages[i]);
    +//			logOutput.Print("%s F%i: (1 - (1/%f * %f) ^ %f * %f", weaponDefs->name.c_str(), i, range, travDist, exp, damages[i]);
    +		}
    +	}
    +	return dynDamages;
    +}
     WeaponDef::~WeaponDef() {
     }
    Index: Weapons/WeaponDefHandler.h
    ===================================================================
    --- Weapons/WeaponDefHandler.h	(revision 3497)
    +++ Weapons/WeaponDefHandler.h	(working copy)
    @@ -178,6 +178,11 @@
     	bool sweepFire;
     
     	bool canAttackGround;
    +
    +	float dynDamageExp;
    +	float dynDamageMin;
    +	float dynDamageRange;
    +	bool dynDamageInverted;
     };
     
     class CExplosionGeneratorHandler;
    @@ -196,6 +201,8 @@
     
     	static void LoadSound(GuiSound &gsound);
     
    +	DamageArray DynamicDamages(DamageArray damages, float3 startPos, float3 curPos, float range, float exp, float damageMin, bool inverted);
    +
     protected:
     	void ParseTAWeapon(TdfParser *sunparser, std::string weaponname, int id);
     	float3 hs2rgb(float h, float s);
    
    patch file icon DynamicDamagePatch.patch (7,781 bytes) 2007-04-19 23:17 +
  • patch file icon ImpulseFix.patch (2,344 bytes) 2007-05-27 20:36 -
    Index: WeaponDefHandler.cpp
    ===================================================================
    --- WeaponDefHandler.cpp	(revision 3791)
    +++ WeaponDefHandler.cpp	(working copy)
    @@ -554,42 +554,41 @@
     
     DamageArray CWeaponDefHandler::DynamicDamages(DamageArray damages, float3 startPos, float3 curPos, float range, float exp, float damageMin, bool inverted)
     {
    -	DamageArray dynDamages;
    +	DamageArray dynDamages(damages);
     
     	curPos.y = 0;
     	startPos.y = 0;
     
     	float travDist = (curPos-startPos).Length()>range?range:(curPos-startPos).Length();
    -	float ddmod = dynDamages[0]/damageMin; // get damage mod from first damage type
    +	float ddmod;
     
    +	if (damageMin > 0)
    +		ddmod = damageMin/damages[0]; // get damage mod from first damage type
    +
     	if (inverted == true) {
     		for(int i=0; i < damageArrayHandler->numTypes; ++i) {
    -			
     			dynDamages[i] = damages[i] - (1 - pow(1 / range * travDist, exp)) * damages[i];
     
    -			if (damageMin > 0) {
    +			if (damageMin > 0)
     				dynDamages[i] = max(damages[i] * ddmod, dynDamages[i]);
    -			}
     
     			// div by 0
     			dynDamages[i] = max(0.0001f, dynDamages[i]);
    -//			logOutput.Print("%s D%i: %f (%f)", weaponDefs->name.c_str(), i, dynDamages[i]);
    -//			logOutput.Print("%s F%i: %f - (1 - (1/%f * %f) ^ %f * %f", weaponDefs->name.c_str(), i, dynDamages[i], range, travDist, exp, damages[i]);
    +//			logOutput.Print("D%i: %f (%f) - mod %f", i, dynDamages[i], damages[i], ddmod);
    +//			logOutput.Print("F%i: %f - (1 - (1/%f * %f) ^ %f) * %f", i, damages[i], range, travDist, exp, damages[i]);
     		}
     	}
     	else {
    -		for(int i=0; i < damageArrayHandler->numTypes; ++i) {
    -			
    +		for(int i=0; i < damageArrayHandler->numTypes; ++i) {	
     			dynDamages[i] = (1 - pow(1 / range * travDist, exp)) * damages[i];
     
    -			if (damageMin > 0) {
    +			if (damageMin > 0)
     				dynDamages[i] = max(damages[i] * ddmod, dynDamages[i]);
    -			}
     
     			// div by 0
     			dynDamages[i] = max(0.0001f, dynDamages[i]);
    -//			logOutput.Print("%s D%i: %f (%f)", weaponDefs->name.c_str(), i, dynDamages[i]);
    -//			logOutput.Print("%s F%i: (1 - (1/%f * %f) ^ %f * %f", weaponDefs->name.c_str(), i, range, travDist, exp, damages[i]);
    +//			logOutput.Print("D%i: %f (%f) - mod %f", i, dynDamages[i], damages[i], ddmod);
    +//			logOutput.Print("F%i: (1 - (1/%f * %f) ^ %f) * %f", i, range, travDist, exp, damages[i]);
     		}
     	}
     	return dynDamages;
    
    patch file icon ImpulseFix.patch (2,344 bytes) 2007-05-27 20:36 +

-Relationships
+Relationships

-Notes

~0000899

trepan (reporter)

I'll commit this one, once I've integrated it
into the DamageArray changes that I've already
started.

~0000900

rattle (reporter)

Cool :)

~0000914

KDR_11k (reporter)

Using these tags makes the weapon have impulse even if impulse was disabled (impulsefactor=0). That's a serious issue, it makes my units go flying left and right.

~0000915

trepan (reporter)

I didn't commit this one... ILM snuck it in
with his range visuals commit (which should
be looked at before 0.75b1 is released).

~0000916

rattle (reporter)

I was rather surprised when I checked out the trunk earlier cause I knew you had something else in mind...

Anyway, I've fixed the impulse issues none the less, forgot to make a full copy of the array which is why the impulse information were ignored.

Also fixed a typo or two.

~0000993

tvo (reporter)

So apart from looking at the range visuals commit, why is this still open?

~0000994

tvo (reporter)

According to rattle second one hasn't been committed yet.

~0000996

tvo (reporter)

Committed second patch, just need to review rev 3741..
+Notes

-Issue History
Date Modified Username Field Change
2007-04-19 23:17 rattle New Issue
2007-04-19 23:17 rattle File Added: DynamicDamagePatch.patch
2007-04-22 07:28 ILMTitan Status new => assigned
2007-04-22 07:28 ILMTitan Assigned To => ILMTitan
2007-04-23 00:32 trepan Note Added: 0000899
2007-04-23 00:32 trepan Assigned To ILMTitan => trepan
2007-04-25 20:45 rattle Note Added: 0000900
2007-05-27 16:55 KDR_11k Note Added: 0000914
2007-05-27 19:19 trepan Note Added: 0000915
2007-05-27 19:19 trepan Assigned To trepan => ILMTitan
2007-05-27 20:35 rattle Note Added: 0000916
2007-05-27 20:36 rattle File Added: ImpulseFix.patch
2007-07-10 22:35 tvo Note Added: 0000993
2007-07-10 22:35 tvo Status assigned => feedback
2007-07-10 22:58 tvo Note Added: 0000994
2007-07-10 22:58 tvo Status feedback => assigned
2007-07-10 22:58 tvo Assigned To ILMTitan => tvo
2007-07-11 00:13 tvo Status assigned => resolved
2007-07-11 00:13 tvo Resolution open => fixed
2007-07-11 00:13 tvo Note Added: 0000996
+Issue History