// DisplayName = CombatCon

//--- GAME RULES BEGIN ---
// Make a base or use map bases.
// Defend your base.
// Destroy the enemy base.
// Team killing and suicide penalties.
//--- GAME RULES END ---

// CombatCon Game
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Notes are all done by Blnukem. These are to help you know what's what when
//  editing this gametype. (The notes are not completed, so don't edit anything)
//------------------------------------------------------------------------------
// NOTICE:
// This rather huge file will be cleaned and remade in a later version of ACCM.
// So for all you file moderators out there, have fun tweaking this gametype.
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Now to get rid of the overpowered weapons.
$InvBanList[CombatCon, "M4"] = 1;
$InvBanList[CombatCon, "RailGun"] = 1;
$InvBanList[CombatCon, "NapalmMortar"] = 1;
$InvBanList[CombatCon, "Flamer"] = 1;
$InvBanList[CombatCon, "FlamerAmmoPack"] = 1;
$InvBanList[CombatCon, "ELFBarrelPack"] = 1;
//------------------------------------------------------------------------------
// Easy huh? Also as another reminder, the weapons above were removed by popular
// demand of the ACCM users and the Devs. The weapons are just too ovepowered
// for PVP style gameplay.
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Lets begin the Gametype code... Shall we?
//------------------------------------------------------------------------------
// NOTICE:
// Any notes below this point were not done by Blnukem. So it's advised you
// don't try editing anything below this point. Or you'll mess the Gametype up.
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------

function CombatConGame::initGameVars(%game)
{

    if(isDemo())
    {
       %game.SCORE_PER_SUICIDE = -10;
       %game.SCORE_PER_TEAMKILL = -10;
       %game.SCORE_PER_DEATH = 0;

       %game.SCORE_PER_KILL = 10;
       %game.SCORE_PER_GEN_DESTROY = 8;

       %game.SCORE_PER_TURRET_KILL = 5;
       %game.SCORE_PER_GEN_DEFEND = 5;
       %game.SCORE_PER_GEN_REPAIR = 2;

       %game.RADIUS_GEN_DEFENSE = 20;  //meters


       %game.fadeTimeMS = 2000;

       %game.notifyMineDist = 7.5;


       %game.stalemate = false;
       %game.stalemateObjsVisible = false;
       %game.stalemateTimeMS = 60000;
       %game.stalemateFreqMS = 15000;
       %game.stalemateDurationMS = 6000;
    }
    if( !isDemo() )
    {
       %game.SCORE_PER_SUICIDE                  = -10;
       %game.SCORE_PER_TEAMKILL                 = -10;
       %game.SCORE_PER_DEATH                    = 0;

       %game.SCORE_PER_KILL                     = 10;
       %game.SCORE_PER_HEADSHOT                 = 2;

       %game.SCORE_PER_TURRET_KILL              = 10;
       %game.SCORE_PER_TURRET_KILL_AUTO         = 0;
       %game.SCORE_PER_GEN_DEFEND               = 5;

       %game.SCORE_PER_DESTROY_GEN              = 10;
       %game.SCORE_PER_DESTROY_SENSOR           = 4;
       %game.SCORE_PER_DESTROY_TURRET           = 5;
       %game.SCORE_PER_DESTROY_ISTATION         = 2;
       %game.SCORE_PER_DESTROY_VSTATION         = 5;
       %game.SCORE_PER_DESTROY_SOLAR            = 5;
       %game.SCORE_PER_DESTROY_SENTRY           = 4;
       %game.SCORE_PER_DESTROY_DEP_SENSOR       = 1;
       %game.SCORE_PER_DESTROY_DEP_INV          = 2;
       %game.SCORE_PER_DESTROY_DEP_TUR          = 3;

       %game.SCORE_PER_DESTROY_SHRIKE           = 5;
       %game.SCORE_PER_DESTROY_STRIKEFIGHTER    = 5;
       %game.SCORE_PER_DESTROY_HELICOPTER       = 5;
       %game.SCORE_PER_DESTROY_AWACS            = 7;
       %game.SCORE_PER_DESTROY_BOMBER           = 7;
       %game.SCORE_PER_DESTROY_GUNSHIP          = 10;
       %game.SCORE_PER_DESTROY_HEAVYHELICOPTER  = 10;
       %game.SCORE_PER_DESTROY_TRANSPORT        = 10;
       %game.SCORE_PER_DESTROY_WILDCAT          = 2;
       %game.SCORE_PER_DESTROY_TANK             = 5;
       %game.SCORE_PER_DESTROY_HEAVYTANK        = 5;
       %game.SCORE_PER_DESTROY_CGTANK           = 5;
       %game.SCORE_PER_DESTROY_FFTRANSPORT      = 5;
       %game.SCORE_PER_DESTROY_ARTILLERY        = 10;
       %game.SCORE_PER_DESTROY_MPB              = 10;
       %game.SCORE_PER_DESTROY_TRANSBOAT        = 4;
       %game.SCORE_PER_DESTROY_SUB              = 10;
       %game.SCORE_PER_DESTROY_BOAT             = 15;
       %game.SCORE_PER_PASSENGER                = 3;

       %game.SCORE_PER_REPAIR_GEN               = 8;
       %game.SCORE_PER_REPAIR_SENSOR            = 1;
       %game.SCORE_PER_REPAIR_TURRET            = 4;
       %game.SCORE_PER_REPAIR_ISTATION          = 2;
       %game.SCORE_PER_REPAIR_VSTATION          = 4;
       %game.SCORE_PER_REPAIR_SOLAR             = 4;
       %game.SCORE_PER_REPAIR_SENTRY            = 2;
       %game.SCORE_PER_REPAIR_DEP_TUR           = 3;
       %game.SCORE_PER_REPAIR_DEP_INV           = 2;

       %game.FLAG_RETURN_DELAY = 45 * 1000;

       %game.TIME_CONSIDERED_FLAGCARRIER_THREAT = 3 * 1000;
       %game.RADIUS_GEN_DEFENSE = 20;
       %game.RADIUS_FLAG_DEFENSE = 20;

	    %game.TOUCH_DELAY_MS = 20000;

       %game.fadeTimeMS = 2000;

       %game.notifyMineDist = 7.5;


       %game.stalemate = false;
       %game.stalemateObjsVisible = false;
       %game.stalemateTimeMS = 60000;
       %game.stalemateFreqMS = 15000;
       %game.stalemateDurationMS = 6000;
    }

}

package CombatConGame {

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Now Seriously... STOP EDITING!!!
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------

function ShapeBaseData::onDestroyed(%data, %obj)
{
    %scorer = %obj.lastDamagedBy;
    if(!isObject(%scorer))
       return;

    if( (%scorer.getType() & $TypeMasks::GameBaseObjectType) &&
       %scorer.getDataBlock().catagory $= "Vehicles" )
    {
        // ---------------------------------------------
        // z0dd - ZOD, 6/18/02. %name was never defined.
        %name = %scorer.getDatablock().getName();
        if(%name $= "BomberFlyer" || %name $= "AssaultVehicle")
            %gunnerNode = 1;
        else
            %gunnerNode = 0;

        if(%scorer.getMountNodeObject(%gunnerNode))
        {
            %destroyer = %scorer.getMountNodeObject(%gunnerNode).client;
            %scorer = %destroyer;
            %damagingTeam = %scorer.team;
        }
    }
    else if(%scorer.getClassName() $= "Turret")
    {
        if(%scorer.getControllingClient())
        {
            //manned turret
            %destroyer = %scorer.getControllingClient();
            %scorer = %destroyer;
            %damagingTeam = %scorer.team;
        }
        else return;  //unmanned turret
    }

    if(!%damagingTeam)
        %damagingTeam = %scorer.team;

    if(%damagingTeam == %obj.team)
    {
        //error("team objects dont score");
        return;
    }

    if(%obj.soiledByEnemyRepair)
    {
        //error(%obj SPC "was once repiared by an enemy.  No destruction points.");
        return;
    }

    %objType = %obj.getDataBlock().getName();
    if(%objType $= "GeneratorLarge")
    {
        %score = game.awardScoreGenDestroy(%scorer);
        game.shareScore(%scorer, %score);
    }
    else if(%objType $= "SensorLargePulse" || %objType $= "SensorMediumPulse")
    {
        %score = game.awardScoreSensorDestroy(%scorer);
        game.shareScore(%scorer, %score);
    }
    else if(%objType $= "TurretBaseLarge")
    {
        %score = game.awardScoreTurretDestroy(%scorer);
        game.shareScore(%scorer, %score);
    }
    else if(%objType $= "StationInventory")
    {
        %score = game.awardScoreInvDestroy(%scorer);
        game.shareScore(%scorer, %score);
    }
    else if(%objType $= "StationVehicle")
    {
        %score = game.awardScoreVehicleStationDestroy(%scorer);
        game.shareScore(%scorer, %score);
    }
    else if(%objType $= "SolarPanel")
    {
        %score = game.awardScoreSolarDestroy(%scorer);
        game.shareScore(%score, %score);
    }
    else if(%objType $= "SentryTurret")
    {
        %score = game.awardScoreSentryDestroy(%scorer);
        game.shareScore(%scorer, %score);
    }
    else if(%objType $= "DeployedMotionSensor" || %objType $= "DeployedPulseSensor")
    {
        %score = game.awardScoreDepSensorDestroy(%scorer);
        game.shareScore(%scorer, %score);
    }
    else if(%objType $= "TurretDeployedWallIndoor" || %objType $= "TurretDeployedFloorIndoor" ||
        %objType $= "TurretDeployedCeilingIndoor" || %objType $= "TurretDeployedOutdoor")
    {
        %score = game.awardScoreDepTurretDestroy(%scorer);
        game.shareScore(%scorer, %score);
    }
    else if(%objType $= "DeployedStationInventory")
    {
        %score = game.awardScoreDepStationDestroy(%scorer);
        game.shareScore(%scorer, %score);
    }

}

function ShapeBaseData::onDisabled(%data, %obj)
{
    %obj.wasDisabled = true;
    Parent::onDisabled(%data, %obj);
}

function RepairGunImage::onRepair(%this, %obj, %slot)
{
    Parent::onRepair(%this, %obj, %slot);
    %target = %obj.repairing;
    if(%target && %target.team != %obj.team)
    {
        //error("Enemy stuff("@%obj@") is being repaired (by "@%target@")");
        %target.soiledByEnemyRepair = true;
    }
}

function CombatConGame::timeLimitReached(%game)
{
   logEcho("game over (timelimit)");
   %game.gameOver();
   cycleMissions();
}

function CombatConGame::scoreLimitReached(%game)
{
   logEcho("game over (scorelimit)");
   %game.gameOver();
   cycleMissions();
}

function CombatConGame::gameOver(%game)
{
   //call the default
   DefaultGame::gameOver(%game);

   //send the winner message
   %winner = "";
   if ($teamScore[1] > $teamScore[2])
      %winner = %game.getTeamName(1);
   else if ($teamScore[2] > $teamScore[1])
      %winner = %game.getTeamName(2);

   if (%winner $= 'Storm')
      messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.stowins.wav" );
   else if (%winner $= 'Inferno')
      messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.infwins.wav" );
   else if (%winner $= 'Starwolf')
      messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.swwin.wav" );
   else if (%winner $= 'Blood Eagle')
      messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.bewin.wav" );
   else if (%winner $= 'Diamond Sword')
      messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.dswin.wav" );
   else if (%winner $= 'Phoenix')
      messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.pxwin.wav" );
   else
      messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.gameover.wav" );

   messageAll('MsgClearObjHud', "");
   for(%i = 0; %i < ClientGroup.getCount(); %i ++)
   {
      %client = ClientGroup.getObject(%i);
      %game.resetScore(%client);
   }
   for(%j = 1; %j <= %game.numTeams; %j++)
      $TeamScore[%j] = 0;
}

function CombatConGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc)
{
   if(%clVictim.headshot && %damageType == $DamageType::Laser && %clVictim.team != %clAttacker.team)
   {
        %clAttacker.scoreHeadshot++;
       if (%game.SCORE_PER_HEADSHOT != 0)
      {
         messageClient(%clAttacker, 'msgHeadshot', '\c0You received a %1 point bonus for a successful headshot.', %game.SCORE_PER_HEADSHOT);
      }
      %game.recalcScore(%clAttacker);
   }

   //the DefaultGame will set some vars
   DefaultGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc);


   //if victim is carrying a flag and is not on the attackers team, mark the attacker as a threat for x seconds(for scoring purposes)
   if ((%clVictim.holdingFlag !$= "") && (%clVictim.team != %clAttacker.team))
   {
      %clAttacker.dmgdFlagCarrier = true;
      cancel(%clAttacker.threatTimer);  //restart timer
      %clAttacker.threatTimer = schedule(%game.TIME_CONSIDERED_FLAGCARRIER_THREAT, %clAttacker.dmgdFlagCarrier = false);
   }


}

////////////////////////////////////////////////////////////////////////////////////////
function CombatConGame::clientMissionDropReady(%game, %client)
{
   messageClient(%client, 'MsgClientReady',"", %game.class);
   %game.resetScore(%client);
   for(%i = 1; %i <= %game.numTeams; %i++)
   {
      $Teams[%i].score = 0;
      messageClient(%client, 'MsgCombatConAddTeam', "", %i, %game.getTeamName(%i), $flagStatus[%i], $TeamScore[%i]);
   }
   //%game.populateTeamRankArray(%client);

   //messageClient(%client, 'MsgYourRankIs', "", -1);

   messageClient(%client, 'MsgMissionDropInfo', '\c0You are in mission %1 (%2).', $MissionDisplayName, $MissionTypeDisplayName, $ServerName );

   DefaultGame::clientMissionDropReady(%game, %client);
}

function CombatConGame::assignClientTeam(%game, %client, %respawn)
{
   DefaultGame::assignClientTeam(%game, %client, %respawn);
   // if player's team is not on top of objective hud, switch lines
   messageClient(%client, 'MsgCheckTeamLines', "", %client.team);
}

function CombatConGame::recalcScore(%game, %cl)
{
   %killValue = %cl.kills * %game.SCORE_PER_KILL;
   %deathValue = %cl.deaths * %game.SCORE_PER_DEATH;

   if (%killValue - %deathValue == 0)
      %killPoints = 0;
   else
      %killPoints = (%killValue * %killValue) / (%killValue - %deathValue);

   if(!isDemo())
   {
        %cl.offenseScore = %killPoints +
                        %cl.suicides            * %game.SCORE_PER_SUICIDE +
                        %cl.escortAssists       * %game.SCORE_PER_ESCORT_ASSIST +
                        %cl.teamKills           * %game.SCORE_PER_TEAMKILL +
                        %cl.scoreHeadshot           * %game.SCORE_PER_HEADSHOT +
                        %cl.flagCaps            * %game.SCORE_PER_PLYR_FLAG_CAP       +
                        %cl.flagGrabs           * %game.SCORE_PER_PLYR_FLAG_TOUCH       +
                        %cl.genDestroys         * %game.SCORE_PER_DESTROY_GEN         +
                        %cl.sensorDestroys     * %game.SCORE_PER_DESTROY_SENSOR      +
                        %cl.turretDestroys     * %game.SCORE_PER_DESTROY_TURRET      +
                        %cl.iStationDestroys   * %game.SCORE_PER_DESTROY_ISTATION    +
                        %cl.vstationDestroys   * %game.SCORE_PER_DESTROY_VSTATION    +
                        %cl.solarDestroys      * %game.SCORE_PER_DESTROY_SOLAR       +
                        %cl.sentryDestroys     * %game.SCORE_PER_DESTROY_SENTRY      +
                        %cl.depSensorDestroys  * %game.SCORE_PER_DESTROY_DEP_SENSOR  +
                        %cl.depTurretDestroys  * %game.SCORE_PER_DESTROY_DEP_TUR     +
                        %cl.depStationDestroys * %game.SCORE_PER_DESTROY_DEP_INV     +
                        %cl.vehicleScore + %cl.vehicleBonus;

        %cl.defenseScore =   %cl.genDefends          * %game.SCORE_PER_GEN_DEFEND +
                        %cl.flagDefends         * %game.SCORE_PER_FLAG_DEFEND +
                        %cl.carrierKills        * %game.SCORE_PER_CARRIER_KILL +
                        %cl.escortAssists       * %game.SCORE_PER_ESCORT_ASSIST +
                        %cl.turretKills         * %game.SCORE_PER_TURRET_KILL_AUTO +
                        %cl.mannedturretKills   * %game.SCORE_PER_TURRET_KILL +
                        %cl.genRepairs          * %game.SCORE_PER_REPAIR_GEN             +
                        %cl.SensorRepairs       * %game.SCORE_PER_REPAIR_SENSOR          +
                        %cl.TurretRepairs       * %game.SCORE_PER_REPAIR_TURRET          +
                        %cl.StationRepairs      * %game.SCORE_PER_REPAIR_ISTATION        +
                        %cl.VStationRepairs     * %game.SCORE_PER_REPAIR_VSTATION        +
                        %cl.solarRepairs        * %game.SCORE_PER_REPAIR_SOLAR           +
                        %cl.sentryRepairs       * %game.SCORE_PER_REPAIR_SENTRY          +
                        %cl.depInvRepairs       * %game.SCORE_PER_REPAIR_DEP_INV         +
                        %cl.depTurretRepairs    * %game.SCORE_PER_REPAIR_DEP_TUR  +
                        %cl.returnPts;
        }

    if( isDemo() )
    {
        %cl.offenseScore = %killPoints +
                            %cl.flagDefends         * %game.SCORE_PER_FLAG_DEFEND +
                            %cl.suicides * %game.SCORE_PER_SUICIDE + //-1
                            %cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST + // 1
                            %cl.teamKills * %game.SCORE_PER_TEAMKILL + // -1
                            %cl.flagCaps * %game.SCORE_PER_PLYR_FLAG_CAP + // 3
                            %cl.genDestroys * %game.SCORE_PER_GEN_DESTROY; // 2

        %cl.defenseScore =   %cl.genDefends * %game.SCORE_PER_GEN_DEFEND +   // 1
                            %cl.carrierKills * %game.SCORE_PER_CARRIER_KILL +  // 1
                            %cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST + // 1
                            %cl.turretKills * %game.SCORE_PER_TURRET_KILL +  // 1
                            %cl.flagReturns * %game.SCORE_PER_FLAG_RETURN +  // 1
                            %cl.genRepairs * %game.SCORE_PER_GEN_REPAIR;  // 1
    }

   %cl.score = mFloor(%cl.offenseScore + %cl.defenseScore + (%cl.zkills * $zombie::killpoints));

   %game.recalcTeamRanks(%cl);
}

function CombatConGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %implement)
{
// is this a vehicle kill rather than a player kill

   // console error message suppression
   if( isObject( %implement ) )
   {
      if( %implement.getDataBlock().getName() $= "AssaultPlasmaTurret" ||  %implement.getDataBlock().getName() $= "BomberTurret" ) // gunner
           %clKiller = %implement.vehicleMounted.getMountNodeObject(1).client;
      else if(%implement.getDataBlock().catagory $= "Vehicles") // pilot
           %clKiller = %implement.getMountNodeObject(0).client;
   }

   if(%game.testTurretKill(%implement))   //check for turretkill before awarded a non client points for a kill
      %game.awardScoreTurretKill(%clVictim, %implement);
   else if (%game.testKill(%clVictim, %clKiller)) //verify victim was an enemy
   {
      %value = %game.awardScoreKill(%clKiller);
      %game.shareScore(%clKiller, %value);
      %game.awardScoreDeath(%clVictim);

      if (%game.testGenDefend(%clVictim, %clKiller))
         %game.awardScoreGenDefend(%clKiller);

      if(%game.testCarrierKill(%clVictim, %clKiller))
         %game.awardScoreCarrierKill(%clKiller);
      else
      {
         if (%game.testFlagDefend(%clVictim, %clKiller))
            %game.awardScoreFlagDefend(%clKiller);
      }
      if (%game.testEscortAssist(%clVictim, %clKiller))
         %game.awardScoreEscortAssist(%clKiller);
   }
   else
   {
      if (%game.testSuicide(%clVictim, %clKiller, %damageType))  //otherwise test for suicide
      {
         %game.awardScoreSuicide(%clVictim);
      }
      else
      {
         if (%game.testTeamKill(%clVictim, %clKiller)) //otherwise test for a teamkill
            %game.awardScoreTeamKill(%clVictim, %clKiller);
      }
   }
}

function CombatConGame::testGenDefend(%game, %victimID, %killerID)
{
   InitContainerRadiusSearch(%victimID.plyrPointOfDeath, %game.RADIUS_GEN_DEFENSE, $TypeMasks::StaticShapeObjectType);
   %objID = containerSearchNext();
   while(%objID != 0)
   {
      %objType = %objID.getDataBlock().ClassName;
     if ((%objType $= "generator") && (%objID.team == %killerID.team))
        return true;  //found a killer's generator within required radius of victim's death
     else
        %objID = containerSearchNext();
   }
   return false;  //didn't find a qualifying gen within required radius of victim's point of death
}

function CombatConGame::testCarrierKill(%game, %victimID, %killerID)
{
   %flag = %victimID.plyrDiedHoldingFlag;
   return ((%flag !$= "") && (%flag.team == %killerID.team));
}

function CombatConGame::testEscortAssist(%game, %victimID, %killerID)
{
   return (%victimID.dmgdFlagCarrier);
}

function CombatConGame::testValidRepair(%game, %obj)
{
    if(!%obj.wasDisabled)
    {
        //error(%obj SPC "was never disabled");
        return false;
    }
    else if(%obj.lastDamagedByTeam == %obj.team)
    {
        //error(%obj SPC "was last damaged by a friendly");
        return false;
    }
    else if(%obj.team != %obj.repairedBy.team)
    {
        //error(%obj SPC "was repaired by an enemy");
        return false;
    }
    else
    {
        if(%obj.soiledByEnemyRepair)
            %obj.soiledByEnemyRepair = false;
        return true;
    }
}

function CombatConGame::resetDontScoreTimer(%game, %team)
{
   $dontScoreTimer[%team] = false;
}

// Asset Destruction scoring
function CombatConGame::awardScoreGenDestroy(%game,%cl)
{
   %cl.genDestroys++;
   if (%game.SCORE_PER_DESTROY_GEN != 0)
      {
         messageClient(%cl, 'msgGenDes', '\c0You received a %1 point bonus for destroying an enemy generator.', %game.SCORE_PER_DESTROY_GEN);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_GEN;
}

function CombatConGame::awardScoreSensorDestroy(%game,%cl)
{
   %cl.sensorDestroys++;
   if (%game.SCORE_PER_DESTROY_SENSOR != 0)
      {
         messageClient(%cl, 'msgSensorDes', '\c0You received a %1 point bonus for destroying an enemy sensor.', %game.SCORE_PER_DESTROY_SENSOR);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_SENSOR;
}

function CombatConGame::awardScoreTurretDestroy(%game,%cl)
{
   %cl.turretDestroys++;
   if (%game.SCORE_PER_DESTROY_TURRET != 0)
      {
         messageClient(%cl, 'msgTurretDes', '\c0You received a %1 point bonus for destroying an enemy turret.', %game.SCORE_PER_DESTROY_TURRET);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_TURRET;
}

function CombatConGame::awardScoreInvDestroy(%game,%cl)
{
   %cl.IStationDestroys++;
   if (%game.SCORE_PER_DESTROY_ISTATION != 0)
      {
         messageClient(%cl, 'msgInvDes', '\c0You received a %1 point bonus for destroying an enemy inventory station.', %game.SCORE_PER_DESTROY_ISTATION);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_ISTATION;
}

function CombatConGame::awardScoreVehicleStationDestroy(%game,%cl)
{
   %cl.VStationDestroys++;
   if (%game.SCORE_PER_DESTROY_VSTATION != 0)
      {
         messageClient(%cl, 'msgVSDes', '\c0You received a %1 point bonus for destroying an enemy vehicle station.', %game.SCORE_PER_DESTROY_VSTATION);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_VSTATION;
}

function CombatConGame::awardScoreSolarDestroy(%game,%cl)
{
   %cl.SolarDestroys++;
   if (%game.SCORE_PER_DESTROY_SOLAR != 0)
      {
         messageClient(%cl, 'msgSolarDes', '\c0You received a %1 point bonus for destroying an enemy solar panel.', %game.SCORE_PER_DESTROY_SOLAR);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_SOLAR;
}

function CombatConGame::awardScoreSentryDestroy(%game,%cl)
{
   %cl.sentryDestroys++;
   if (%game.SCORE_PER_DESTROY_SENTRY != 0)
      {
         messageClient(%cl, 'msgSentryDes', '\c0You received a %1 point bonus for destroying an enemy sentry turret.', %game.SCORE_PER_DESTROY_SENTRY);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_SENTRY;
}

function CombatConGame::awardScoreDepSensorDestroy(%game,%cl)
{
   %cl.depSensorDestroys++;
   if (%game.SCORE_PER_DESTROY_DEP_SENSOR != 0)
      {
         messageClient(%cl, 'msgDepSensorDes', '\c0You received a %1 point bonus for destroying an enemy deployable.', %game.SCORE_PER_DESTROY_DEP_SENSOR);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_DEP_SENSOR;
}

function CombatConGame::awardScoreDepTurretDestroy(%game,%cl)
{
   %cl.depTurretDestroys++;
   if (%game.SCORE_PER_DESTROY_DEP_TUR != 0)
      {
         messageClient(%cl, 'msgDepTurDes', '\c0You received a %1 point bonus for destroying an enemy deployed turret.', %game.SCORE_PER_DESTROY_DEP_TUR);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_DEP_TUR;
}

function CombatConGame::awardScoreDepStationDestroy(%game,%cl)
{
   %cl.depStationDestroys++;
   if (%game.SCORE_PER_DESTROY_DEP_INV != 0)
      {
         messageClient(%cl, 'msgDepInvDes', '\c0You received a %1 point bonus for destroying an enemy deployed station.', %game.SCORE_PER_DESTROY_DEP_INV);
         //messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
      }
      %game.recalcScore(%cl);
    return %game.SCORE_PER_DESTROY_DEP_INV;
}

function CombatConGame::awardScoreGenDefend(%game, %killerID)
{
   %killerID.genDefends++;
   if (%game.SCORE_PER_GEN_DEFEND != 0)
   {
      messageClient(%killerID, 'msgGenDef', '\c0You received a %1 point bonus for defending a generator.', %game.SCORE_PER_GEN_DEFEND);
      //messageTeamExcept(%killerID, 'msgGenDef', '\c0Teammate %1 received a %2 point bonus for defending a generator.', %killerID.name, %game.SCORE_PER_GEN_DEFEND);
   }
   %game.recalcScore(%cl);
    return %game.SCORE_PER_GEN_DEFEND;
}

function CombatConGame::awardScoreCarrierKill(%game, %killerID)
{
   %killerID.carrierKills++;
   if (%game.SCORE_PER_CARRIER_KILL != 0)
   {
      messageClient(%killerID, 'msgCarKill', '\c0You received a %1 point bonus for stopping the enemy flag carrier!', %game.SCORE_PER_CARRIER_KILL);
      //messageTeamExcept(%killerID, 'msgCarKill', '\c0Teammate %1 received a %2 point bonus for stopping the enemy flag carrier!', %killerID.name, %game.SCORE_PER_CARRIER_KILL);
   }
   %game.recalcScore(%killerID);
    return %game.SCORE_PER_CARRIER_KILL;
}

function CombatConGame::awardScoreFlagDefend(%game, %killerID)
{
   %killerID.flagDefends++;
   if (%game.SCORE_PER_FLAG_DEFEND != 0)
   {
      messageClient(%killerID, 'msgFlagDef', '\c0You received a %1 point bonus for defending your flag!', %game.SCORE_PER_FLAG_DEFEND);
      //messageTeamExcept(%killerID, 'msgFlagDef', '\c0Teammate %1 received a %2 point bonus for defending your flag!', %killerID.name, %game.SCORE_PER_FLAG_DEFEND);
   }
   %game.recalcScore(%killerID);
    return %game.SCORE_PER_FLAG_DEFEND;
}

function CombatConGame::awardScoreEscortAssist(%game, %killerID)
{
   %killerID.escortAssists++;
   if (%game.SCORE_PER_ESCORT_ASSIST != 0)
   {
      messageClient(%killerID, 'msgEscAsst', '\c0You received a %1 point bonus for protecting the flag carrier!', %game.SCORE_PER_ESCORT_ASSIST);
      //messageTeamExcept(%killerID, 'msgEscAsst', '\c0Teammate %1 received a %2 point bonus for protecting the flag carrier!', %killerID.name, %game.SCORE_PER_ESCORT_ASSIST);
   }
   %game.recalcScore(%killerID);
    return %game.SCORE_PER_ESCORT_ASSIST;
}

function CombatConGame::resetScore(%game, %client)
{
   %client.offenseScore = 0;
   %client.kills = 0;
   %client.deaths = 0;
   %client.suicides = 0;
   %client.escortAssists = 0;
   %client.teamKills = 0;
   %client.flagCaps = 0;
   %client.flagGrabs = 0;
   %client.genDestroys = 0;
   %client.sensorDestroys = 0;
   %client.turretDestroys = 0;
   %client.iStationDestroys = 0;
   %client.vstationDestroys = 0;
   %client.solarDestroys = 0;
   %client.sentryDestroys = 0;
   %client.depSensorDestroys = 0;
   %client.depTurretDestroys = 0;
   %client.depStationDestroys = 0;
   %client.vehicleScore = 0;
   %client.vehicleBonus = 0;

    %client.flagDefends = 0;
   %client.defenseScore = 0;
   %client.genDefends = 0;
   %client.carrierKills = 0;
   %client.escortAssists = 0;
   %client.turretKills = 0;
   %client.mannedTurretKills = 0;
   %client.flagReturns = 0;
   %client.genRepairs = 0;
    %client.SensorRepairs   =0;
    %client.TurretRepairs   =0;
    %client.StationRepairs  =0;
    %client.VStationRepairs =0;
    %client.solarRepairs    =0;
    %client.sentryRepairs   =0;
    %client.depInvRepairs   =0;
    %client.depTurretRepairs=0;
    %client.returnPts = 0;
   %client.score = 0;
}

function CombatConGame::objectRepaired(%game, %obj, %objName)
{
   %item = %obj.getDataBlock().getName();
   switch$ (%item)
   {
      case generatorLarge :
         %game.genOnRepaired(%obj, %objName);
      case sensorMediumPulse :
         %game.sensorOnRepaired(%obj, %objName);
      case sensorLargePulse :
         %game.sensorOnRepaired(%obj, %objName);
      case stationInventory :
         %game.stationOnRepaired(%obj, %objName);
      case turretBaseLarge :
         %game.turretOnRepaired(%obj, %objName);
      case stationVehicle :
        %game.vStationOnRepaired(%obj, %objName);
      case solarPanel :
        %game.solarPanelOnRepaired(%obj, %objName);
      case sentryTurret :
        %game.sentryTurretOnRepaired(%obj, %objName);
      case TurretDeployedWallIndoor:
        %game.depTurretOnRepaired(%obj, %objName);
      case TurretDeployedFloorIndoor:
        %game.depTurretOnRepaired(%obj, %objName);
      case TurretDeployedCeilingIndoor:
        %game.depTurretOnRepaired(%obj, %objName);
      case TurretDeployedOutdoor:
        %game.depTurretOnRepaired(%obj, %objName);
   }
   %obj.wasDisabled = false;
}

function CombatConGame::genOnRepaired(%game, %obj, %objName)
{

   if (%game.testValidRepair(%obj))
   {
      %repairman = %obj.repairedBy;
      teamRepairMessage(%repairman, 'msgGenRepaired', '\c0%1 repaired the %2 Generator!', %repairman.name, %obj.nameTag);
      %game.awardScoreGenRepair(%obj.repairedBy);
   }
}

function CombatConGame::stationOnRepaired(%game, %obj, %objName)
{
   if (%game.testValidRepair(%obj))
   {
      %repairman = %obj.repairedBy;
      teamRepairMessage(%repairman, 'msgStationRepaired', '\c0%1 repaired the %2 Inventory Station!', %repairman.name, %obj.nameTag);
      %game.awardScoreStationRepair(%obj.repairedBy);
   }
}

function CombatConGame::sensorOnRepaired(%game, %obj, %objName)
{
   if (%game.testValidRepair(%obj))
   {
      %repairman = %obj.repairedBy;
      teamRepairMessage(%repairman, 'msgSensorRepaired', '\c0%1 repaired the %2 Pulse Sensor!', %repairman.name, %obj.nameTag);
      %game.awardScoreSensorRepair(%obj.repairedBy);
   }
}

function CombatConGame::turretOnRepaired(%game, %obj, %objName)
{
   if (%game.testValidRepair(%obj))
   {
      %repairman = %obj.repairedBy;
      teamRepairMessage(%repairman, 'msgTurretRepaired', '\c0%1 repaired the %2 Turret!', %repairman.name, %obj.nameTag);
      %game.awardScoreTurretRepair(%obj.repairedBy);
   }
}

function CombatConGame::vStationOnRepaired(%game, %obj, %objName)
{
   if (%game.testValidRepair(%obj))
   {
      %repairman = %obj.repairedBy;
      teamRepairMessage(%repairman, 'msgvstationRepaired', '\c0%1 repaired the Vehicle Station!', %repairman.name);
      %game.awardScoreVStationRepair(%obj.repairedBy);
   }
}

function CombatConGame::solarPanelOnRepaired(%game, %obj, %objName)
{
   if (%game.testValidRepair(%obj))
   {
      %repairman = %obj.repairedBy;
      teamRepairMessage(%repairman, 'msgsolarRepaired', '\c0%1 repaired the %2 Solar Panel!', %repairman.name, %obj.nameTag);
      %game.awardScoreSolarRepair(%obj.repairedBy);
   }
}

function CombatConGame::sentryTurretOnRepaired(%game, %obj, %objName)
{
   if (%game.testValidRepair(%obj))
   {
      %repairman = %obj.repairedBy;
      teamRepairMessage(%repairman, 'msgsentryTurretRepaired', '\c0%1 repaired the %2 Sentry Turret!', %repairman.name, %obj.nameTag);
      %game.awardScoreSentryRepair(%obj.repairedBy);
   }
}

function CombatConGame::depTurretOnRepaired(%game, %obj, %objName)
{
   if (%game.testValidRepair(%obj))
   {
      %repairman = %obj.repairedBy;
      %game.awardScoreDepTurretRepair(%obj.repairedBy);
   }
}

function CombatConGame::depInvOnRepaired(%game, %obj, %objName)
{
   if (%game.testValidRepair(%obj))
   {
      %repairman = %obj.repairedBy;
      %game.awardScoreDepInvRepair(%obj.repairedBy);
   }
}

function CombatConGame::awardScoreGenRepair(%game, %cl)
{
   %cl.genRepairs++;
   if (%game.SCORE_PER_REPAIR_GEN != 0)
   {
      messageClient(%cl, 'msgGenRep', '\c0You received a %1 point bonus for repairing a generator.', %game.SCORE_PER_REPAIR_GEN);
   }
   %game.recalcScore(%cl);
}

function CombatConGame::awardScoreStationRepair(%game, %cl)
{
   %cl.stationRepairs++;
   if (%game.SCORE_PER_REPAIR_ISTATION != 0)
   {
      messageClient(%cl, 'msgIStationRep', '\c0You received a %1 point bonus for repairing a inventory station.', %game.SCORE_PER_REPAIR_ISTATION);
   }
   %game.recalcScore(%cl);
}

function CombatConGame::awardScoreSensorRepair(%game, %cl)
{
   %cl.sensorRepairs++;
   if (%game.SCORE_PER_REPAIR_SENSOR != 0)
   {
      messageClient(%cl, 'msgSensorRep', '\c0You received a %1 point bonus for repairing a sensor.', %game.SCORE_PER_REPAIR_SENSOR);
   }
   %game.recalcScore(%cl);
}

function CombatConGame::awardScoreTurretRepair(%game, %cl)
{
   %cl.TurretRepairs++;
   if (%game.SCORE_PER_REPAIR_TURRET != 0)
   {
      messageClient(%cl, 'msgTurretRep', '\c0You received a %1 point bonus for repairing a base turret.', %game.SCORE_PER_REPAIR_TURRET);
   }
   %game.recalcScore(%cl);
}

function CombatConGame::awardScoreVStationRepair(%game, %cl)
{
   %cl.VStationRepairs++;
   if (%game.SCORE_PER_REPAIR_VSTATION != 0)
   {
      messageClient(%cl, 'msgVStationRep', '\c0You received a %1 point bonus for repairing a vehicle station.', %game.SCORE_PER_REPAIR_VSTATION);
   }
   %game.recalcScore(%cl);
}

function CombatConGame::awardScoreSolarRepair(%game, %cl)
{
   %cl.solarRepairs++;
   if (%game.SCORE_PER_REPAIR_SOLAR != 0)
   {
      messageClient(%cl, 'msgsolarRep', '\c0You received a %1 point bonus for repairing a solar panel.', %game.SCORE_PER_REPAIR_SOLAR);
   }
   %game.recalcScore(%cl);
}

function CombatConGame::awardScoreSentryRepair(%game, %cl)
{
   %cl.sentryRepairs++;
   if (%game.SCORE_PER_REPAIR_SENTRY != 0)
   {
      messageClient(%cl, 'msgSentryRep', '\c0You received a %1 point bonus for repairing a sentry turret.', %game.SCORE_PER_REPAIR_SENTRY);
   }
   %game.recalcScore(%cl);
}

function CombatConGame::awardScoreDepTurretRepair(%game, %cl)
{
   %cl.depTurretRepairs++;
   if (%game.SCORE_PER_REPAIR_DEP_TUR != 0)
   {
      messageClient(%cl, 'msgDepTurretRep', '\c0You received a %1 point bonus for repairing a deployed turret.', %game.SCORE_PER_REPAIR_DEP_TUR);
   }
   %game.recalcScore(%cl);
}

function CombatConGame::awardScoreDepInvRepair(%game, %cl)
{
   %cl.depInvRepairs++;
   if (%game.SCORE_PER_REPAIR_DEP_INV != 0)
   {
      messageClient(%cl, 'msgDepInvRep', '\c0You received a %1 point bonus for repairing a deployed station.', %game.SCORE_PER_REPAIR_DEP_INV);
   }
   %game.recalcScore(%cl);
}

function CombatConGame::enterMissionArea(%game, %playerData, %player)
{
   %player.client.outOfBounds = false;
   messageClient(%player.client, 'EnterMissionArea', '\c1You are back in the mission area. ~wvoice/Announcer/ANN.ib.wav');
   cancel(%player.alertThread);
}

function CombatConGame::leaveMissionArea(%game, %playerData, %player)
{
   if(%player.getState() $= "Dead")
      return;

   %player.client.outOfBounds = true;
   messageClient(%player.client, 'LeaveMissionArea', '\c1You have left the mission area. Return or be killed. ~wvoice/Announcer/ANN.oob.wav');
   %player.alertThread = %game.schedule(10, "DMAlertPlayer", 3, %player);
}

function CombatConGame::DMAlertPlayer(%game, %count, %player)
{
   if(%count > 1)
      %player.alertThread = %game.schedule(1000, "DMAlertPlayer", %count - 1, %player);
   else
      %player.alertThread = %game.schedule(5000, "MissionAreaDamage", %player);
}

function CombatConGame::MissionAreaDamage(%game, %player)
{
   if(%player.getState() !$= "Dead") {
      %player.setDamageFlash(1.5);
      %prevHurt = %player.getDamageLevel();
      %player.scriptkill($DamageType::OutOfBounds);
      %player.alertThread = %game.schedule(1000, "MissionAreaDamage", %player);
   }
}

function CombatConGame::vehicleDestroyed(%game, %vehicle, %destroyer){
    %data = %vehicle.getDataBlock();
    %vehicleType = getTaggedString(%data.targetTypeTag);
    if(%vehicleType !$= "MPB")
        %vehicleType = strlwr(%vehicleType);

    %enemyTeam = ( %destroyer.team == 1 ) ? 2 : 1;

    %scorer = 0;
    %multiplier = 3;
    %shouldshare = 0;

    %passengers = 0;
    for(%i = 0; %i < %data.numMountPoints; %i++)
        if(%vehicle.getMountNodeObject(%i))
            %passengers++;

    if(%destroyer.client){
        %destroyer = %destroyer.client;
        %scorer = %destroyer;

        if(%vehicle.lastDamageType == $DamageType::Mine)
            %multiplier = 1;
    }
    else if(%destroyer.getClassName() $= "Turret"){
        if(%destroyer.getControllingClient()){
            %destroyer = %destroyer.getControllingClient();
            %scorer = %destroyer;
		if(%destroyer.vehicleMounted){
		   if(%destroyer.vehicleMounted.getMountNodeObject(0)){
			%driver = %destroyer.vehicleMounted.getMountNodeObject(0);
			%sharer = %driver.client;
			%shouldshare = 1;
		   }
		   %multiplier = 2;
		}
        }
        else{
            %destroyerName = "A turret";
            %multiplier = 0;
        }
    }
    else if(%destroyer.getDataBlock().catagory $= "Vehicles"){
        if(%destroyer.getMountNodeObject(0)){
            %destroyer = %destroyer.getMountNodeObject(0).client;
            %scorer = %destroyer;
        }
        %multiplier = 2;
    }
    else
        return;


    if(%destroyerName $= "")
        %destroyerName = %destroyer.name;

    if(%vehicle.team == %destroyer.team){
        %pref = (%vehicleType $= "Assault Tank") ? "an" : "a";
        messageAll( 'msgVehicleTeamDestroy', '\c0%1 TEAMKILLED %3 %2!', %destroyerName, %vehicleType, %pref);
    }
    else{
        messageTeamExcept(%destroyer, 'msgVehicleDestroy', '\c0%1 destroyed an enemy %2.', %destroyerName, %vehicleType);
        messageTeam(%enemyTeam, 'msgVehicleDestroy', '\c0%1 destroyed your team\'s %2.', %destroyerName, %vehicleType);

        if(%scorer){
            %value = %game.awardScoreVehicleDestroyed(%scorer, %vehicleType, %multiplier, %passengers);
		if(%shouldshare == 1)
		   %game.awardScoreVehicleDestroyed(%sharer, %vehicleType, (%multiplier / 2), %passengers);
            %game.shareScore(%value);
        }
    }
}

function CombatConGame::awardScoreVehicleDestroyed(%game, %client, %vehicleType, %mult, %passengers)
{
    if(isDemo())
        return 0;

    if(%vehicleType $= "Interceptor")
        %base = %game.SCORE_PER_DESTROY_SHRIKE;

    else if(%vehicleType $= "Fighter")
        %base = %game.SCORE_PER_DESTROY_STRIKEFIGHTER;

    else if(%vehicleType $= "Assault Chopper")
        %base = %game.SCORE_PER_DESTROY_HELICOPTER;

    else if(%vehicleType $= "AWACS")
        %base = %game.SCORE_PER_DESTROY_AWACS;

    else if(%vehicleType $= "Bomber")
        %base = %game.SCORE_PER_DESTROY_BOMBER;

    else if(%vehicleType $= "Gunship")
        %base = %game.SCORE_PER_DESTROY_GUNSHIP;

    else if(%vehicleType $= "Transport Chopper")
        %base = %game.SCORE_PER_DESTROY_HEAVYHELICOPTER;

    else if(%vehicleType $= "Heavy Transport")
        %base = %game.SCORE_PER_DESTROY_TRANSPORT;

    else if(%vehicleType $= "Grav Cycle")
        %base = %game.SCORE_PER_DESTROY_WILDCAT;

    else if(%vehicleType $= "Light Tank")
        %base = %game.SCORE_PER_DESTROY_TANK;

    else if(%vehicleType $= "Assault Tank")
        %base = %game.SCORE_PER_DESTROY_HEAVYTANK;

    else if(%vehicleType $= "chaingun tank")
        %base = %game.SCORE_PER_DESTROY_CGTANK;

    else if(%vehicleType $= "APC")
        %base = %game.SCORE_PER_DESTROY_FFTRANSPORT;

    else if(%vehicleType $= "Heavy Artillery")
        %base = %game.SCORE_PER_DESTROY_ARTILLERY;

    else if(%vehicleType $= "MPB")
        %base = %game.SCORE_PER_DESTROY_MPB;

    else if(%vehicleType $= "Boat")
        %base = %game.SCORE_PER_DESTROY_TRANSBOAT;

    else if(%vehicleType $= "Submarine")
        %base = %game.SCORE_PER_DESTROY_SUB;

    else if(%vehicleType $= "GunBoat")
        %base = %game.SCORE_PER_DESTROY_BOAT;


    %total = ( %base * %mult ) + ( %passengers * %game.SCORE_PER_PASSENGER );

    %client.vehicleScore += %total;

     messageClient(%client, 'msgVehicleScore', '\c0You received a %1 point bonus for destroying an enemy %2.', %total, %vehicleType);
   %game.recalcScore(%client);
    return %total;
}

function CombatConGame::shareScore(%game, %client, %amount)
{
    if(isDemo())
        return 0;

    //error("share score of"SPC %amount SPC "from client:" SPC %client);
    // all of the player in the bomber and tank share the points
    // gained from any of the others
    %vehicle = %client.vehicleMounted;
    if(!%vehicle)
        return 0;
    %vehicleType = getTaggedString(%vehicle.getDataBlock().targetTypeTag);
    if(%vehicleType $= "Bomber" || %vehicleType $= "Assault Tank")
    {
        for(%i = 0; %i < %vehicle.getDataBlock().numMountPoints; %i++)
        {
            %occupant = %vehicle.getMountNodeObject(%i);
            if(%occupant)
            {
                %occCl = %occupant.client;
                if(%occCl != %client && %occCl.team == %client.team)
                {
                    // the vehicle has a valid teammate at this node
                    // share the score with them
                    %occCl.vehicleBonus += %amount;
                    %game.recalcScore(%occCl);
                }
            }
        }

    }
}

function CombatConGame::awardScoreTurretKill(%game, %victimID, %implement)
{
    if ((%killer = %implement.getControllingClient()) != 0) //award whoever might be controlling the turret
    {
        if (%killer == %victimID)
            %game.awardScoreSuicide(%victimID);
        else if (%killer.team == %victimID.team) //player controlling a turret killed a teammate
        {
            %killer.teamKills++;
            %game.awardScoreTurretTeamKill(%victimID, %killer);
            %game.awardScoreDeath(%victimID);
        }
        else
        {
            %killer.mannedturretKills++;
            %game.recalcScore(%killer);
            %game.awardScoreDeath(%victimID);
        }
    }
    else if ((%killer = %implement.owner) != 0) //if it isn't controlled, award score to whoever deployed it
    {
        if (%killer.team == %victimID.team)
        {
            %game.awardScoreDeath(%victimID);
        }
        else
        {
            %killer.turretKills++;
            %game.recalcScore(%killer);
            %game.awardScoreDeath(%victimID);
        }
    }
    //default is, no one was controlling it, no one owned it.  No score given.
}

function CombatConGame::testKill(%game, %victimID, %killerID)
{
   return ((%killerID !=0) && (%victimID.team != %killerID.team));
}

function CombatConGame::awardScoreKill(%game, %killerID)
{
   %killerID.kills++;
   %game.recalcScore(%killerID);
    return %game.SCORE_PER_KILL;
}
};
