Attached Files |
-
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);
-
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;
|
---|