Ticket #3606: IdleRegenRate3.patch
File IdleRegenRate3.patch, 6.6 KB (added by , 8 years ago) |
---|
-
simulation/ai/petra/researchManager.js
156 156 return tech[0]; 157 157 else if (template.modifications[i].value === "Health/RegenRate") 158 158 return tech[0]; 159 else if (template.modifications[i].value === "Health/IdleRegenRate") 160 return tech[0]; 159 161 } 160 162 } 161 163 return false; -
simulation/components/Health.js
5 5 "<a:example>" + 6 6 "<Max>100</Max>" + 7 7 "<RegenRate>1.0</RegenRate>" + 8 "<IdleRegenRate>0</IdleRegenRate>" + 8 9 "<DeathType>corpse</DeathType>" + 9 10 "</a:example>" + 10 11 "<element name='Max' a:help='Maximum hitpoints'>" + … … 23 24 "<element name='RegenRate' a:help='Hitpoint regeneration rate per second.'>" + 24 25 "<data type='decimal'/>" + 25 26 "</element>" + 27 "<element name='IdleRegenRate' a:help='Hitpoint regeneration rate per second when idle or garrisoned.'>" + 28 "<data type='decimal'/>" + 29 "</element>" + 26 30 "<element name='DeathType' a:help='Behaviour when the unit dies'>" + 27 31 "<choice>" + 28 32 "<value a:help='Disappear instantly'>vanish</value>" + … … 45 49 // (Allowing 0 initial HP would break our death detection code) 46 50 this.hitpoints = +(this.template.Initial || this.GetMaxHitpoints()); 47 51 this.regenRate = ApplyValueModificationsToEntity("Health/RegenRate", +this.template.RegenRate, this.entity); 52 if(this.template.IdleRegenRate == undefined) 53 { 54 this.idleRegenRate = 0; 55 } 56 else 57 { 58 this.idleRegenRate = ApplyValueModificationsToEntity("Health/IdleRegenRate", +this.template.IdleRegenRate, this.entity); 59 } 48 60 this.CheckRegenTimer(); 49 61 }; 50 62 … … 107 119 return this.template.Undeletable == "true"; 108 120 }; 109 121 122 Health.prototype.GetIdleRegenRate = function() 123 { 124 return this.idleRegenRate; 125 }; 126 110 127 Health.prototype.GetRegenRate = function() 111 128 { 112 129 return this.regenRate; … … 114 131 115 132 Health.prototype.ExecuteRegeneration = function() 116 133 { 117 varregen = this.GetRegenRate();134 let regen = this.GetRegenRate(); 118 135 if (regen > 0) 119 136 this.Increase(regen); 120 137 else 121 138 this.Reduce(-regen); 139 if(this.GetIdleRegenRate() != 0) 140 { 141 let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI); 142 if(cmpUnitAI && cmpUnitAI.IsResting()) 143 { 144 let idleRegen = this.GetIdleRegenRate(); 145 if (idleRegen > 0) 146 this.Increase(idleRegen); 147 else 148 this.Reduce(-idleRegen); 149 } 150 } 122 151 }; 123 152 124 153 /* … … 127 156 Health.prototype.CheckRegenTimer = function() 128 157 { 129 158 // check if we need a timer 130 if ( this.GetRegenRate() == 0||131 this.GetHitpoints() == this.GetMaxHitpoints() && this.GetRegenRate() > 0||132 this.GetHitpoints() == 0)159 if ((this.GetRegenRate() == 0 && this.GetIdleRegenRate() == 0) || 160 (this.GetHitpoints() == this.GetMaxHitpoints() && this.GetRegenRate() >= 0 && this.GetIdleRegenRate() >= 0) || 161 this.GetHitpoints() == 0) 133 162 { 134 163 // we don't need a timer, disable if one exists 135 164 if (this.regenTimer) … … 325 354 if (msg.component != "Health") 326 355 return; 327 356 328 varoldMaxHitpoints = this.GetMaxHitpoints();329 varnewMaxHitpoints = Math.round(ApplyValueModificationsToEntity("Health/Max", +this.template.Max, this.entity));357 let oldMaxHitpoints = this.GetMaxHitpoints(); 358 let newMaxHitpoints = Math.round(ApplyValueModificationsToEntity("Health/Max", +this.template.Max, this.entity)); 330 359 if (oldMaxHitpoints != newMaxHitpoints) 331 360 { 332 varnewHitpoints = Math.round(this.GetHitpoints() * newMaxHitpoints/oldMaxHitpoints);361 let newHitpoints = Math.round(this.GetHitpoints() * newMaxHitpoints/oldMaxHitpoints); 333 362 this.maxHitpoints = newMaxHitpoints; 334 363 this.SetHitpoints(newHitpoints); 335 364 } 336 365 337 varoldRegenRate = this.regenRate;366 let oldRegenRate = this.regenRate; 338 367 this.regenRate = ApplyValueModificationsToEntity("Health/RegenRate", +this.template.RegenRate, this.entity); 339 368 340 369 if (this.regenRate != oldRegenRate) 341 370 this.CheckRegenTimer(); 371 372 if(this.template.IdleRegenRate != undefined) 373 { 374 let oldIdleRegenRate = this.idleRegenRate; 375 this.idleRegenRate = ApplyValueModificationsToEntity("Health/IdleRegenRate", +this.template.IdleRegenRate, this.entity); 376 377 if (this.idleRegenRate != oldIdleRegenRate) 378 this.CheckRegenTimer(); 379 } 342 380 }; 343 381 344 382 Health.prototype.OnHealthChanged = function() -
simulation/components/UnitAI.js
3298 3298 return this.isGarrisoned; 3299 3299 }; 3300 3300 3301 /** 3302 * Returns true if the unit is idle a turret and idle 3303 * or a non-turret garrisoned unit 3304 */ 3305 UnitAI.prototype.IsResting = function() 3306 { 3307 if(this.IsIdle()) 3308 return true; 3309 if(this.IsGarrisoned() && !this.IsTurret()) 3310 return true; 3311 return false; 3312 }; 3313 3301 3314 UnitAI.prototype.SetGarrisoned = function() 3302 3315 { 3303 3316 this.isGarrisoned = true; -
simulation/data/technologies/health_regen_units.json
7 7 "icon": "bandage.png", 8 8 "researchTime": 40, 9 9 "tooltip": "Organic units will slowly regenerate health over time when idle.", 10 "modifications": [{"value": "Health/ RegenRate", "add": 0.5}],10 "modifications": [{"value": "Health/IdleRegenRate", "add": 0.5}], 11 11 "affects": ["Unit Organic"], 12 12 "soundComplete": "interface/alarm/alarm_upgradearmory.xml" 13 13 } -
simulation/templates/template_structure.xml
47 47 <Health> 48 48 <DeathType>corpse</DeathType> 49 49 <RegenRate>0</RegenRate> 50 <IdleRegenRate>0</IdleRegenRate> 50 51 <Undeletable>false</Undeletable> 51 52 <Unhealable>true</Unhealable> 52 53 </Health> -
simulation/templates/template_unit.xml
31 31 <DeathType>corpse</DeathType> 32 32 <Max>100</Max> 33 33 <RegenRate>0</RegenRate> 34 <IdleRegenRate>0</IdleRegenRate> 34 35 <Undeletable>false</Undeletable> 35 36 <Unhealable>false</Unhealable> 36 37 </Health>