Ticket #1910: Damage.diff

File Damage.diff, 5.4 KB (added by Josh, 11 years ago)

Diff of all changes including test functions

  • 0ad/binaries/data/mods/public/simulation/components/PlayerManager.js

     
    4545    }
    4646    this.playerEntities = [];
    4747};
    48 
     48PlayerManager.prototype.GetAllPlayers = function()
     49{
     50    return this.playerEntities;
     51};
    4952Engine.RegisterComponentType(IID_PlayerManager, "PlayerManager", PlayerManager);
  • 0ad/binaries/data/mods/public/simulation/components/GuiInterface.js

     
    17591759    "SetObstructionDebugOverlay": 1,
    17601760    "SetMotionDebugOverlay": 1,
    17611761    "SetRangeDebugOverlay": 1,
     1762    "TestSD": 1,
    17621763};
    17631764
     1765GuiInterface.prototype.TestSD = function(pl, d)
     1766{
     1767    var dm = Engine.QueryInterface(SYSTEM_ENTITY, IID_Damage);
     1768    if (!dm) warn("IID_Damage is returning " + dm);
     1769    else return dm.CauseSplashDamage({"origin":{"x":d.x, "z":d.z}, "shape":"circular", "radius":d.r, "playersToDamage":undefined, "direction":undefined, "strengths":{"hack":20.0, "pierce":20.0, "crush":20.0}});
     1770};
     1771
    17641772GuiInterface.prototype.ScriptCall = function(player, name, args)
    17651773{
    17661774    if (exposedFunctions[name])
  • 0ad/binaries/data/mods/public/simulation/components/Damage.js

     
     1function Damage() {}
     2
     3Damage.prototype.Schema = "<a:component type='system'/><empty/>";
     4
     5/* Damages units around a given origin.
     6 * The data parameter should contain {"origin":{'x':<int>, 'z':<int>}, 'shape':<'circular' or 'linear'>, 'radius':<int>, 'playersToDamage':<array>, 'direction':<x and z which form a vector from the origin>, 'strengths':{'hack':<float>, 'pierce':<float>, 'crush':<float>}}
     7 */
     8Damage.prototype.CauseSplashDamage = function(data)
     9{
     10    // Get nearby entities and define variables
     11    var nearEnts = this.EntitiesNearPoint(data.origin, data.radius, data.playersToDamage);
     12    var damageMultiplier = 1;
     13    // Cycle through all the nearby entities and damage it appropriatly based on its disance from the origin.
     14    for each (var entity in nearEnts)
     15    {
     16        var entityPosition = Engine.QueryInterface(entity, IID_Position).GetPosition();
     17        var squaredDistanceFromorigin = this.VectorDistanceSquared(data.origin, entityPosition);
     18        if(shape=='circular') // circular effect with quadratic falloff in every direction
     19        {
     20            damageMultiplier == 1 - ((squaredDistanceFromOrgin) / (data.radius * data.radius));
     21        }
     22        else if(shape=='linear') // linear effect with quadratic falloff in two directions (only used for certain missiles)
     23        {
     24            warn("Not Implemented");
     25        }
     26        else
     27        {
     28            warn("Not Implemented");
     29        }
     30        var cmpDamageReceiver = Engine.QueryInterface(entity, IID_DamageReceiver);
     31        if (cmpDamageReceiver)
     32            cmpDamageReceiver.TakeDamage(strengths.hack * damageMultiplier, strengths.pierce * damageMultiplier, strengths.crush * damageMultiplier);
     33    }
     34};
     35
     36/* Gets entities near a give point for given players.
     37 * origin = {'x':<int>, 'z':<int>}
     38 * radius = <int>
     39 * players = <array>
     40 * If players is not included, entities from all players are returned.
     41 */
     42Damage.prototype.EntitiesNearPoint = function(origin, radius, players)
     43{
     44    if(!origin || !radius) return [];
     45    // Make a dummy entity at origin then call range manager with dummy entity
     46    var dummyTargetEntity = Engine.AddEntity();
     47    var cmpDummyPosition = Engine.QueryInterface(dummyTargetEntity, IID_Position);
     48    cmpDummyPosition.moveTo(origin.x, origin.z);
     49    var rangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
     50    if(players)
     51    {
     52        var rangeQuery = rangeManager.ExecuteQuery(dummyTargetEntity, 0, radius, players, IID_DamageReceiver);
     53    }
     54    else
     55    {
     56        var allPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayers;
     57        var rangeQuery = rangeManager.ExecuteQuery(dummyTargetEntity, 0, radius, allPlayers, IID_DamageReceiver);
     58    }
     59    Engine.DestroyEntity(dummyTargetEntity);
     60    return rangeQuery;
     61};
     62
     63// Gets the straight line distance between p1 and p2
     64Damage.prototype.VectorDistanceSquared = function(p1, p2)
     65{
     66    return ((p1.x - p2.x)*(p1.x - p2.x) + (p1.z - p2.z)*(p1.z - p2.z));
     67};
     68
     69Engine.RegisterComponentType(IID_Damage, "Damage", Damage);
  • 0ad/binaries/data/mods/public/simulation/components/interfaces/Damage.js

     
     1Engine.RegisterInterface("Damage");
  • 0ad/source/simulation2/Simulation2.cpp

     
    127127            LOAD_SCRIPTED_COMPONENT("PlayerManager");
    128128            LOAD_SCRIPTED_COMPONENT("TechnologyTemplateManager");
    129129            LOAD_SCRIPTED_COMPONENT("Timer");
     130            LOAD_SCRIPTED_COMPONENT("Damage");
    130131
    131132#undef LOAD_SCRIPTED_COMPONENT
    132133