flankingbonus.diff (18,298 bytes)
2007-11-13 21:10
Index: rts/Lua/LuaUnitDefs.cpp
===================================================================
--- rts/Lua/LuaUnitDefs.cpp (revision 4784)
+++ rts/Lua/LuaUnitDefs.cpp (working copy)
@@ -773,11 +773,18 @@
ADD_FLOAT("waterline", ud.waterline);
ADD_FLOAT("maxWaterDepth", ud.maxWaterDepth);
+ ADD_FLOAT("flankingBonusMode", ud.flankingBonusMode);
+ ADD_FLOAT("flankingBonusMax", ud.flankingBonusMax);
+ ADD_FLOAT("flankingBonusMin", ud.flankingBonusMin);
+ ADD_FLOAT("flankingBonusMode", ud.flankingBonusMax);
+ ADD_FLOAT("flankingBonusDirX", ud.flankingBonusDir.x);
+ ADD_FLOAT("flankingBonusDirY", ud.flankingBonusDir.y);
+ ADD_FLOAT("flankingBonusDirZ", ud.flankingBonusDir.z);
+ ADD_FLOAT("flankingBonusMobilityAdd", ud.flankingBonusMobilityAdd);
+
ADD_INT("armorType", ud.armorType);
ADD_FLOAT("armoredMultiple", ud.armoredMultiple);
- ADD_BOOL("bonusShieldEnabled", ud.bonusShieldEnabled);
-
ADD_FLOAT("hitSphereScale", ud.collisionSphereScale);
ADD_FLOAT("hitSphereOffsetX", ud.collisionSphereOffset.x);
ADD_FLOAT("hitSphereOffsetY", ud.collisionSphereOffset.y);
Index: rts/Sim/ModInfo.cpp
===================================================================
--- rts/Sim/ModInfo.cpp (revision 4784)
+++ rts/Sim/ModInfo.cpp (working copy)
@@ -116,6 +116,30 @@
// We already set the defaults so we should be able to ignore this
// Other optional mod rules MUST set their defaults...
}
+
+
+ //Get the flanking bonus default option
+ flankingBonusModeDefault = 1;
+ try
+ {
+ TdfParser flankingBonusOptions("gamedata/modrules.tdf");
+ flankingBonusModeDefault = atoi(flankingBonusOptions.SGetValueDef("1", "FLANKINGBONUS\\FlankingBonusModeDefault").c_str());
+ } catch(content_error) // If the modrules.tdf isnt found
+ {
+ // We already set the defaults so we should be able to ignore this
+ // Other optional mod rules MUST set their defaults...
+ }
+ //Get the mod's experience multiplier
+ experienceMult = 1.0f;
+ try
+ {
+ TdfParser experienceOptions("gamedata/modrules.tdf");
+ experienceMult = atof(experienceOptions.SGetValueDef("1.0", "EXPERIENCE\\ExperienceMult").c_str());
+ } catch(content_error) // If the modrules.tdf isnt found
+ {
+ // We already set the defaults so we should be able to ignore this
+ // Other optional mod rules MUST set their defaults...
+ }
}
CModInfo::~CModInfo() {}
Index: rts/Sim/ModInfo.h
===================================================================
--- rts/Sim/ModInfo.h (revision 4784)
+++ rts/Sim/ModInfo.h (working copy)
@@ -32,6 +32,9 @@
int fireAtKilled; //1 = units fire at enemies running Killed() script, 0 = units ignore such enemies
int fireAtCrashing; //1 = units fire at crashing aircrafts, 0 = units ignore crashing aircrafts
+ int flankingBonusModeDefault; //0=no flanking bonus; 1=global coords, mobile; 2=unit coords, mobile; 3=unit coords, locked
+ float experienceMult; //normally 1.0, 0.0 disables units getting automatice experience from attacks
+
};
extern CModInfo *modInfo;
Index: rts/Sim/Units/COB/CobInstance.cpp
===================================================================
--- rts/Sim/Units/COB/CobInstance.cpp (revision 4784)
+++ rts/Sim/Units/COB/CobInstance.cpp (working copy)
@@ -105,6 +105,11 @@
#define ALPHA_THRESHOLD 103 // set or get
#define SET_WEAPON_UNIT_TARGET 106 // get (fake set)
#define SET_WEAPON_GROUND_TARGET 107 // get (fake set)
+#define FLANK_B_MODE 120 // set or get
+#define FLANK_B_DIR 121 // set or get, set is through get for multiple args
+#define FLANK_B_MOBILITY_ADD 122 // set or get
+#define FLANK_B_MAX_DAMAGE 123 // set or get
+#define FLANK_B_MIN_DAMAGE 124 // set or get
// NOTE: [LUA0 - LUA9] are defined in CobThread.cpp as [110 - 119]
@@ -1180,6 +1185,25 @@
return weapon->AttackGround(pos, userTarget) ? 1 : 0;
}
+ case FLANK_B_MODE:
+ return unit->flankingBonusMode;
+ case FLANK_B_DIR:
+ switch(p1){
+ case 1: return int(unit->flankingBonusDir.x * COBSCALE);
+ case 2: return int(unit->flankingBonusDir.y * COBSCALE);
+ case 3: return int(unit->flankingBonusDir.z * COBSCALE);
+ case 4: unit->flankingBonusDir.x = (p2/(float)COBSCALE); return 0;
+ case 5: unit->flankingBonusDir.y = (p2/(float)COBSCALE); return 0;
+ case 6: unit->flankingBonusDir.z = (p2/(float)COBSCALE); return 0;
+ case 7: unit->flankingBonusDir = float3(p2/(float)COBSCALE, p3/(float)COBSCALE, p4/(float)COBSCALE).Normalize(); return 0;
+ default: return(-1);
+ }
+ case FLANK_B_MOBILITY_ADD:
+ return int(unit->flankingBonusMobilityAdd * COBSCALE);
+ case FLANK_B_MAX_DAMAGE:
+ return int((unit->flankingBonusAvgDamage + unit->flankingBonusDifDamage) * COBSCALE);
+ case FLANK_B_MIN_DAMAGE:
+ return int((unit->flankingBonusAvgDamage - unit->flankingBonusDifDamage) * COBSCALE);
default:
if ((val >= GLOBAL_VAR_START) && (val <= GLOBAL_VAR_END)) {
return globalVars[val - GLOBAL_VAR_START];
@@ -1435,6 +1459,24 @@
unit->alphaThreshold = float(param) / 255.0f;
break;
}
+ case FLANK_B_MODE:
+ unit->flankingBonusMode = param;
+ break;
+ case FLANK_B_MOBILITY_ADD:
+ unit->flankingBonusMobilityAdd = (param / (float)COBSCALE);
+ break;
+ case FLANK_B_MAX_DAMAGE: {
+ float mindamage = unit->flankingBonusAvgDamage - unit->flankingBonusDifDamage;
+ unit->flankingBonusAvgDamage = (param / (float)COBSCALE + mindamage)*0.5f;
+ unit->flankingBonusDifDamage = (param / (float)COBSCALE - mindamage)*0.5f;
+ break;
+ }
+ case FLANK_B_MIN_DAMAGE: {
+ float maxdamage = unit->flankingBonusAvgDamage + unit->flankingBonusDifDamage;
+ unit->flankingBonusAvgDamage = (maxdamage + param / (float)COBSCALE)*0.5f;
+ unit->flankingBonusDifDamage = (maxdamage - param / (float)COBSCALE)*0.5f;
+ break;
+ }
default: {
if ((val >= GLOBAL_VAR_START) && (val <= GLOBAL_VAR_END)) {
globalVars[val - GLOBAL_VAR_START] = param;
Index: rts/Sim/Units/Unit.cpp
===================================================================
--- rts/Sim/Units/Unit.cpp (revision 4784)
+++ rts/Sim/Units/Unit.cpp (working copy)
@@ -37,6 +37,7 @@
#include "Sim/Misc/QuadField.h"
#include "Sim/Misc/RadarHandler.h"
#include "Sim/Misc/Wind.h"
+#include "Sim/ModInfo.h"
#include "Sim/MoveTypes/AirMoveType.h"
#include "Sim/MoveTypes/MoveType.h"
#include "Sim/MoveTypes/ScriptMoveType.h"
@@ -129,9 +130,12 @@
userAttackPos(0,0,0),
crashing(false),
cob(0),
- bonusShieldEnabled(true),
- bonusShieldSaved(10),
- bonusShieldDir(1,0,0),
+ flankingBonusMode(0),
+ flankingBonusDir(1,0,0),
+ flankingBonusAvgDamage(1.4f),
+ flankingBonusDifDamage(.5f),
+ flankingBonusMobility(10),
+ flankingBonusMobilityAdd(.01),
group(0),
lastDamage(-100),
lastFireWeapon(0),
@@ -440,7 +444,7 @@
}
recentDamage*=0.9f;
- bonusShieldSaved+=0.005f;
+ flankingBonusMobility+=flankingBonusMobilityAdd;
if(stunned)
return;
@@ -648,7 +652,6 @@
}
}
- bonusShieldSaved += 0.05f;
residualImpulse *= 0.6f;
const bool oldCloak = isCloaked;
@@ -772,19 +775,30 @@
float damage=damages[armorType];
- if(damage<0){
-// logOutput.Print("Negative damage");
- return;
- }
-
- if (attacker) {
- SetLastAttacker(attacker);
- if (bonusShieldEnabled) {
- const float3 adir = (attacker->pos - pos).Normalize();
- bonusShieldDir += (adir * bonusShieldSaved); //not the best way to do it(but fast)
- bonusShieldDir.Normalize();
- bonusShieldSaved = 0.0f;
- damage *= (1.4f - (0.5f * adir.dot(bonusShieldDir)));
+ if(damage>0){
+ if(attacker){
+ SetLastAttacker(attacker);
+ if (flankingBonusMode) {
+ float3 adir=attacker->pos-pos;
+ adir.Normalize();
+ if (flankingBonusMode == 1) { //mode 1 = global coordinates, mobile
+ flankingBonusDir+=adir*flankingBonusMobility;
+ flankingBonusDir.Normalize();
+ flankingBonusMobility=0;
+ damage*=flankingBonusAvgDamage-adir.dot(flankingBonusDir)*flankingBonusDifDamage;
+ }else{
+ float3 adirRelative;
+ adirRelative.x = adir.dot(rightdir);
+ adirRelative.y = adir.dot(updir);
+ adirRelative.z = adir.dot(frontdir);
+ if (flankingBonusMode == 2) { //mode 2 = unit coordinates, mobile
+ flankingBonusDir += adirRelative * flankingBonusMobility;
+ flankingBonusDir.Normalize();
+ flankingBonusMobility=0;
+ } //modes 2 and 3 both use this; 3 is unit coordinates, immobile
+ damage*=flankingBonusAvgDamage-adirRelative.dot(flankingBonusDir)*flankingBonusDifDamage;
+ }
+ }
}
}
@@ -817,56 +831,73 @@
restTime=0;
- float experienceMod=1;
+ float experienceMod;
+ experienceMod = modInfo->experienceMult;
- if(damages.paralyzeDamageTime){
- paralyzeDamage+=damage;
- experienceMod=0.1f; //reduce experience for paralyzers
- if(health-paralyzeDamage<0){
- if(stunned)
- experienceMod=0; //dont get any experience for paralyzing paralyzed enemy
- stunned=true;
- if(paralyzeDamage>health+(maxHealth*0.025f*damages.paralyzeDamageTime)){
- paralyzeDamage=health+(maxHealth*0.025f*damages.paralyzeDamageTime);
+ if(damages.paralyzeDamageTime) {
+ if (damages.paralyzeDamageTime > 0) {
+ if (paralyzeDamage > health) {
+ if(paralyzeDamage < health + (maxHealth*0.025f*damages.paralyzeDamageTime)) {
+ //make sure the weapon can do any paralysis damage before adding it; can't just do the min or a weak paralysis weapon could undo a strong one
+ paralyzeDamage = min((paralyzeDamage + damage), (health + (maxHealth*0.025f*damages.paralyzeDamageTime)));
+ experienceMod *= 0.0f; //no experience for extra paralysis
+ }
+ }else{
+ paralyzeDamage+=damage;
+ experienceMod *= 0.1f; //reduce experience for paralyzers
+ if (paralyzeDamage < health) {
+ stunned = false;
+ }
}
+ }else{
+ if (paralyzeDamage == 0) {
+ experienceMod *= 0.0f; //no experience when not healing
+ }else{
+ paralyzeDamage = max(0.0f, paralyzeDamage + damage);
+ experienceMod *= 0.1f;
+ }
}
} else {
- // Dont log overkill damage (so dguns/nukes etc dont inflate values)
- float statsdamage = std::min(health, damage);
- if (attacker)
- gs->Team(attacker->team)->currentStats.damageDealt += statsdamage;
- gs->Team(team)->currentStats.damageReceived += statsdamage;
+ if (damage > 0) {
+ // Dont log overkill damage (so dguns/nukes etc dont inflate values)
+ float statsdamage = std::min(health, damage);
+ if (attacker)
+ gs->Team(attacker->team)->currentStats.damageDealt += statsdamage;
+ gs->Team(team)->currentStats.damageReceived += statsdamage;
+ }
health-=damage;
}
- recentDamage+=damage;
- if (attacker != 0 && !gs->Ally(allyteam, attacker->allyteam)) {
- attacker->AddExperience(0.1f * experienceMod
- * (power / attacker->power)
- * (damage + min(0.0f, health)) / maxHealth);
- ENTER_UNSYNCED;
- if (((!unitDef->isCommander && uh->lastDamageWarning+100<gs->frameNum) ||
- (unitDef->isCommander && uh->lastCmdDamageWarning+100<gs->frameNum))
- && (team == gu->myTeam) && !camera->InView(midPos,radius+50) && !gu->spectatingFullView) {
- logOutput.Print("%s is being attacked",unitDef->humanName.c_str());
- logOutput.SetLastMsgPos(pos);
+ if (damage > 0) {
+ recentDamage+=damage;
+ if(attacker!=0 && !gs->Ally(allyteam,attacker->allyteam)){
+ attacker->AddExperience(0.1f * experienceMod
+ * (power / attacker->power)
+ * (damage + min(0.0f, health)) / maxHealth);
+ ENTER_UNSYNCED;
+ if (((!unitDef->isCommander && uh->lastDamageWarning+100<gs->frameNum) ||
+ (unitDef->isCommander && uh->lastCmdDamageWarning+100<gs->frameNum))
+ && (team == gu->myTeam) && !camera->InView(midPos,radius+50) && !gu->spectatingFullView) {
+ logOutput.Print("%s is being attacked",unitDef->humanName.c_str());
+ logOutput.SetLastMsgPos(pos);
- if (unitDef->isCommander || uh->lastDamageWarning + 150 < gs->frameNum) {
- int soundIdx = unitDef->sounds.underattack.getRandomIdx();
- if (soundIdx >= 0) {
- sound->PlaySample(
- unitDef->sounds.underattack.getID(soundIdx),
- unitDef->isCommander? 4 : 2);
+ if (unitDef->isCommander || uh->lastDamageWarning + 150 < gs->frameNum) {
+ int soundIdx = unitDef->sounds.underattack.getRandomIdx();
+ if (soundIdx >= 0) {
+ sound->PlaySample(
+ unitDef->sounds.underattack.getID(soundIdx),
+ unitDef->isCommander? 4: 2);
+ }
}
- }
- minimap->AddNotification(pos,float3(1,0.3f,0.3f),unitDef->isCommander? 1: 0.5f); //todo: make compatible with new gui
+ minimap->AddNotification(pos,float3(1,0.3f,0.3f),unitDef->isCommander? 1: 0.5f); //todo: make compatible with new gui
- uh->lastDamageWarning=gs->frameNum;
- if(unitDef->isCommander)
- uh->lastCmdDamageWarning=gs->frameNum;
+ uh->lastDamageWarning=gs->frameNum;
+ if(unitDef->isCommander)
+ uh->lastCmdDamageWarning=gs->frameNum;
+ }
+ ENTER_SYNCED;
}
- ENTER_SYNCED;
}
luaCallIns.UnitDamaged(this, attacker, damage, weaponId, !!damages.paralyzeDamageTime);
@@ -2351,9 +2382,12 @@
CR_MEMBER(falling),
CR_MEMBER(fallSpeed),
- CR_MEMBER(bonusShieldEnabled),
- CR_MEMBER(bonusShieldSaved),
- CR_MEMBER(bonusShieldDir),
+ CR_MEMBER(flankingBonusMode),
+ CR_MEMBER(flankingBonusDir),
+ CR_MEMBER(flankingBonusAvgDamage),
+ CR_MEMBER(flankingBonusDifDamage),
+ CR_MEMBER(flankingBonusMobility),
+ CR_MEMBER(flankingBonusMobilityAdd),
CR_MEMBER(armoredState),
CR_MEMBER(armoredMultiple),
Index: rts/Sim/Units/Unit.h
===================================================================
--- rts/Sim/Units/Unit.h (revision 4784)
+++ rts/Sim/Units/Unit.h (working copy)
@@ -297,9 +297,12 @@
bool falling; //for units being dropped from transports (parachute drops)
float fallSpeed;
- float bonusShieldEnabled; //defaults to true in UnitDefHandler
- float bonusShieldSaved; //how much the bonus shield can turn upon an attack(zeroed when attacked, slowly increase)
- float3 bonusShieldDir; //units takes less damage when attacked from this dir (encourage flanking fire)
+ int flankingBonusMode; //0=no flanking bonus; 1=global coords, mobile; 2=unit coords, mobile; 3=unit coords, locked
+ float3 flankingBonusDir; //units takes less damage when attacked from this dir (encourage flanking fire)
+ float flankingBonusMobility; //how much the lowest damage direction of the flanking bonus can turn upon an attack (zeroed when attacked, slowly increases)
+ float flankingBonusMobilityAdd; //how much ability of the flanking bonus direction to move builds up each frame
+ float flankingBonusAvgDamage; //average factor to multiply damage by
+ float flankingBonusDifDamage; //(max damage - min damage)/2
bool armoredState;
float armoredMultiple;
Index: rts/Sim/Units/UnitDef.h
===================================================================
--- rts/Sim/Units/UnitDef.h (revision 4784)
+++ rts/Sim/Units/UnitDef.h (working copy)
@@ -172,7 +172,11 @@
float armoredMultiple;
int armorType;
- bool bonusShieldEnabled; // FIXME: remove this if the improved shield patch by ??? is committed
+ int flankingBonusMode; //0=no flanking bonus; 1=global coords, mobile; 2=unit coords, mobile; 3=unit coords, locked
+ float3 flankingBonusDir; //units takes less damage when attacked from this dir (encourage flanking fire)
+ float flankingBonusMax; //damage factor for the least protected direction
+ float flankingBonusMin; //damage factor for the most protected direction
+ float flankingBonusMobilityAdd; //how much the ability of the flanking bonus direction to move builds up each frame
UnitModelDef model;
float collisionSphereScale;
Index: rts/Sim/Units/UnitDefHandler.cpp
===================================================================
--- rts/Sim/Units/UnitDefHandler.cpp (revision 4784)
+++ rts/Sim/Units/UnitDefHandler.cpp (working copy)
@@ -20,6 +20,7 @@
#include "Sim/Misc/CategoryHandler.h"
#include "Sim/Misc/DamageArrayHandler.h"
#include "Sim/Misc/SensorHandler.h"
+#include "Sim/ModInfo.h"
#include "Sim/Projectiles/ExplosionGenerator.h"
#include "Sim/Weapons/WeaponDefHandler.h"
#include "System/LogOutput.h"
@@ -305,12 +306,18 @@
ud.captureSpeed = udTable.GetFloat("captureSpeed", ud.buildSpeed);
ud.terraformSpeed = udTable.GetFloat("terraformSpeed", ud.buildSpeed);
+ ud.flankingBonusMode = udTable.GetFloat("flankingBonusMode", modInfo->flankingBonusModeDefault);
+ ud.flankingBonusMax = udTable.GetFloat("flankingBonusMax", 1.9);
+ ud.flankingBonusMin = udTable.GetFloat("flankingBonusMin", .9);
+ ud.flankingBonusDir = udTable.GetFloat3("flankingBonusDir", float3(0.0f, 0.0f, 1.0f));
+ ud.flankingBonusMobilityAdd = udTable.GetFloat("flankingBonusMobilityAdd", 0.01f);
+
ud.armoredMultiple = udTable.GetFloat("damageModifier", 1.0f);
ud.armorType=damageArrayHandler->GetTypeFromName(ud.name);
// logOutput.Print("unit %s has armor %i",ud.name.c_str(),ud.armorType);
- ud.bonusShieldEnabled = udTable.GetBool("bonusShieldEnabled", true);
+
ud.radarRadius = udTable.GetInt("radarDistance", 0);
ud.sonarRadius = udTable.GetInt("sonarDistance", 0);
ud.jammerRadius = udTable.GetInt("radarDistanceJam", 0);
Index: rts/Sim/Units/UnitLoader.cpp
===================================================================
--- rts/Sim/Units/UnitLoader.cpp (revision 4784)
+++ rts/Sim/Units/UnitLoader.cpp (working copy)
@@ -151,7 +151,12 @@
unit->armorType=ud->armorType;
unit->floatOnWater = ud->floater || (ud->movedata && ((ud->movedata->moveType == MoveData::Hover_Move) || (ud->movedata->moveType == MoveData::Ship_Move)));
unit->maxSpeed = ud->speed/30.0;
- unit->bonusShieldEnabled = ud->bonusShieldEnabled;
+ unit->flankingBonusMode = ud->flankingBonusMode;
+ unit->flankingBonusDir = ud->flankingBonusDir;
+ unit->flankingBonusMobility = ud->flankingBonusMobilityAdd * 1000;
+ unit->flankingBonusMobilityAdd = ud->flankingBonusMobilityAdd;
+ unit->flankingBonusAvgDamage = (ud->flankingBonusMax + ud->flankingBonusMin) * 0.5f;
+ unit->flankingBonusDifDamage = (ud->flankingBonusMax - ud->flankingBonusMin) * 0.5f;
unit->decloakDistance = ud->decloakDistance;
if(ud->highTrajectoryType==1)