t2-mapper/docs/base/@vl2/z_DMP2-V0.6.vl2/scripts/TDMGame.cs
2025-11-26 00:00:11 -08:00

1293 lines
46 KiB
C#

// DisplayName = Team Deathmatch
//--- GAME RULES BEGIN ---
//Kills = points
//Killing marked targets can help close the point gap
//Any capturable objectives is bonus points for each kill
//--- GAME RULES END ---
//exec the AI scripts
exec("scripts/aiTDM.cs");
$TDMGame::wpMessage = "";
$TDMGame::enableMarkPlayers = true;
datablock StaticShapeData(TDMBonus)
{
catagory = "Objectives";
shapefile = "switch.dts";
isInvincible = true;
cmdCategory = "Objectives";
cmdIcon = "CMDSwitchIcon";
cmdMiniIconName = "commander/MiniIcons/com_switch_grey";
targetTypeTag = 'Switch';
alwaysAmbient = true;
needsNoPower = true;
emap = true;
};
function TDMBonus::onAdd(%this, %obj){
Parent::onAdd(%this, %obj);
}
package TDMGame {
function ShapeBaseData::onDestroyed(%data, %obj, %prevstate)
{
// z0dd - ZOD, 5/27/03. Total re-write
%scorer = %obj.lastDamagedBy;
if(!isObject(%scorer))
return;
if((%scorer.getType() & $TypeMasks::GameBaseObjectType) && %scorer.getDataBlock().catagory $= "Vehicles")
{
%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
%scorer = %scorer.owner; // unmanned turret
}
if(!%damagingTeam)
%damagingTeam = %scorer.team;
if(%damagingTeam != %obj.team)
{
if(!%obj.soiledByEnemyRepair)
Game.awardScoreStaticShapeDestroy(%scorer, %obj);
}
else
{
if(!%obj.getDataBlock().deployedObject)
Game.awardScoreTkDestroy(%scorer, %obj);
return;
}
}
function FlipFlop::playerTouch(%data, %flipflop, %player)
{
if(!%player.rk && !%player.client.isAIControlled()){
messageClient(%player.client, 'MsgClient', '\c0You need at least one kill this life to claim a point!.~wfx/powered/station_denied.wav');
bottomPrint(%player.client, "\nYou need at least one kill this life to claim a point!", 5, 3 );
return;
}
%client = %player.client;
%flipTeam = %flipflop.team;
if(%flipTeam == %client.team)
return false;
%teamName = game.getTeamName(%client.team);
// Let the observers know:
messageTeam( 0, 'MsgClaimFlipFlop', '\c2%1 claimed a point for %3.~wNflipflop_taken.wav', %client.name, Game.cleanWord( %flipflop.namePoint ), %teamName );
// Let the teammates know:
messageTeam( %client.team, 'MsgClaimFlipFlop', '\c2%1 claimed a point for %3.~wNflipflop_taken.wav', %client.name, Game.cleanWord( %flipflop.namePoint ), %teamName );
// Let the other team know:
%losers = %client.team == 1 ? 2 : 1;
messageTeam( %losers, 'MsgClaimFlipFlop', '\c2%1 claimed a point for %3.~wNflipflop_lost.wav', %client.name, Game.cleanWord( %flipflop.namePoint ), %teamName ); // z0dd - ZOD, 10/30/02. Change flipflop lost sound
//change the skin on the switch to claiming team's logo
setTargetSkin(%flipflop.getTarget(), game.getTeamSkin(%player.team));
setTargetSensorGroup(%flipflop.getTarget(), %player.team);
// if there is a "projector" associated with this flipflop, put the claiming team's logo there
if(%flipflop.projector > 0)
{
%projector = %flipflop.projector;
// axe the old projected holo, if one exists
if(%projector.holo > 0)
%projector.holo.delete();
%newHolo = getTaggedString(game.getTeamSkin(%client.team)) @ "Logo";
%projTransform = %projector.getTransform();
// below two functions are from deployables.cs
%projRot = rotFromTransform(%projTransform);
%projPos = posFromTransform(%projTransform);
// place the holo above the projector (default 10 meters)
%hHeight = %projector.holoHeight;
if(%hHeight $= "")
%hHeight = 10;
%holoZ = getWord(%projPos, 2) + %hHeight;
%holoPos = firstWord(%projPos) SPC getWord(%projPos,1) SPC %holoZ;
%holo = new StaticShape()
{
rotation = %projRot;
position = %holoPos;
dataBlock = %newHolo;
};
// dump the hologram into MissionCleanup
MissionCleanup.add(%holo);
// associate the holo with the projector
%projector.holo = %holo;
}
// convert the resources associated with the flipflop
Game.claimFlipflopResources(%flipflop, %client.team);
Game.awardScorePlayerFFCap(%client, %flipFlop);
if(Game.countFlips())
for(%i = 1; %i <= Game.numTeams; %i++)
{
%teamHeld = Game.countFlipsHeld(%i);
messageAll('MsgFlipFlopsHeld', "", %i, %teamHeld);
}
//call the ai function
if(%player.client.isAIControlled()) // z0dd - ZOD, 5/19/03. check to see if the player is a bot, duh.
Game.AIplayerCaptureFlipFlop(%player, %flipflop);
Game.updateObjHudAll();
return true;
}
function FlipFlop::objectiveInit(%data, %flipflop)
{
// add this flipflop to missioncleanup
%flipflopSet = nameToID("MissionCleanup/FlipFlops");
if(%flipflopSet <= 0) {
%flipflopSet = new SimSet("FlipFlops");
MissionCleanup.add(%flipflopSet);
}
%flipflopSet.add(%flipflop);
// see if there's a holo projector associated with this flipflop
// search the flipflop's folder for a holo projector
// if one exists, associate it with the flipflop
%flipflop.projector = 0;
%folder = %flipflop.getGroup();
for(%i = 0; %i < %folder.getCount(); %i++)
{
%proj = %folder.getObject(%i);
// weird, but line below prevents console error
//if(%proj.getClassName() !$= "SimGroup" && %proj.getClassName() !$= "InteriorInstance")
// z0dd - ZOD, 5/19/03. Added TSStatic for spam fix
if(%proj.getClassName() !$= "SimGroup" && %proj.getClassName() !$= "InteriorInstance" && %proj.getClassName() !$= "TSStatic")
{
if(%proj.getDatablock().getName() $= "LogoProjector")
{
%flipflop.projector = %proj;
%flipflop.projector.holo = 0;
break;
}
}
}
// may have been hidden
%target = %flipFlop.getTarget();
if(%target != -1)
{
// set flipflop to base skin
if(%flipflop.team != 0){
setTargetSkin(%target, $teamSkin[%flipflop.team]);
}
else{
setTargetSkin(%target, $teamSkin[0]);
}
// make this always visible in the commander map
setTargetAlwaysVisMask(%target, 0xffffffff);
// make this always visible in the commander list
setTargetRenderMask(%target, getTargetRenderMask(%target) | $TargetInfo::CommanderListRender);
}
}
};
function TDMGame::awardScoreTkDestroy(%game, %cl, %obj)
{
%cl.tkDestroys++;
messageTeamExcept(%cl, 'msgTkDes', '\c5Teammate %1 destroyed your team\'s %3 objective!', %cl.name, %game.cleanWord(%obj.getDataBlock().targetTypeTag));
messageClient(%cl, 'msgTkDes', '\c0You have been penalized %1 points for destroying your teams equiptment.', %game.SCORE_PER_TK_DESTROY);
%game.recalcScore(%cl);
%game.shareScore(%cl, %game.SCORE_PER_TK_DESTROY);
}
function TDMGame::vehicleDestroyed(%game, %vehicle, %destroyer)
{
//vehicle name
%data = %vehicle.getDataBlock();
//%vehicleType = getTaggedString(%data.targetNameTag) SPC getTaggedString(%data.targetTypeTag);
%vehicleType = getTaggedString(%data.targetTypeTag);
if(%vehicleType !$= "MPB")
%vehicleType = strlwr(%vehicleType);
%enemyTeam = ( %destroyer.team == 1 ) ? 2 : 1;
%scorer = 0;
%multiplier = 1;
%passengers = 0;
for(%i = 0; %i < %data.numMountPoints; %i++)
if(%vehicle.getMountNodeObject(%i))
%passengers++;
//what destroyed this vehicle
if(%destroyer.client)
{
//it was a player, or his mine, satchel, whatever...
%destroyer = %destroyer.client;
%scorer = %destroyer;
// determine if the object used was a mine
if(%vehicle.lastDamageType == $DamageType::Mine)
%multiplier = 2;
}
else if(%destroyer.getClassName() $= "Turret")
{
if(%destroyer.getControllingClient())
{
//manned turret
%destroyer = %destroyer.getControllingClient();
%scorer = %destroyer;
}
else
{
%destroyerName = "A turret";
%multiplier = 0;
}
}
else if(%destroyer.getDataBlock().catagory $= "Vehicles")
{
// Vehicle vs vehicle kill!
if(%name $= "BomberFlyer" || %name $= "AssaultVehicle")
%gunnerNode = 1;
else
%gunnerNode = 0;
if(%destroyer.getMountNodeObject(%gunnerNode))
{
%destroyer = %destroyer.getMountNodeObject(%gunnerNode).client;
%scorer = %destroyer;
}
%multiplier = 3;
}
else // Is there anything else we care about?
return;
if(%destroyerName $= "")
%destroyerName = %destroyer.name;
if(%vehicle.team == %destroyer.team) // team kill
{
%pref = (%vehicleType $= "Assault Tank") ? "an" : "a";
messageAll( 'msgVehicleTeamDestroy', '\c0%1 TEAMKILLED %3 %2!', %destroyerName, %vehicleType, %pref);
}
else // legit kill
{
//messageTeamExcept(%destroyer, 'msgVehicleDestroy', '\c0%1 destroyed an enemy %2.', %destroyerName, %vehicleType); // z0dd - ZOD, 8/20/02. not needed with new messenger on line below
teamDestroyMessage(%destroyer, 'msgVehDestroyed', '\c5%1 destroyed an enemy %2!', %destroyerName, %vehicleType); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
messageTeam(%enemyTeam, 'msgVehicleDestroy', '\c0%1 destroyed your team\'s %2.', %destroyerName, %vehicleType);
//messageClient(%destroyer, 'msgVehicleDestroy', '\c0You destroyed an enemy %1.', %vehicleType);
if(%scorer)
{
%value = %game.awardScoreVehicleDestroyed(%scorer, %vehicleType, %multiplier, %passengers);
%game.shareScore(%value);
}
}
}
function TDMGame::awardScoreVehicleDestroyed(%game, %client, %vehicleType, %mult, %passengers)
{
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
if(%vehicleType $= "Grav Cycle")
%base = %game.SCORE_PER_DESTROY_WILDCAT;
else if(%vehicleType $= "Assault Tank")
%base = %game.SCORE_PER_DESTROY_TANK;
else if(%vehicleType $= "MPB")
%base = %game.SCORE_PER_DESTROY_MPB;
else if(%vehicleType $= "Turbograv")
%base = %game.SCORE_PER_DESTROY_SHRIKE;
else if(%vehicleType $= "Bomber")
%base = %game.SCORE_PER_DESTROY_BOMBER;
else if(%vehicleType $= "Heavy Transport")
%base = %game.SCORE_PER_DESTROY_TRANSPORT;
%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 TDMGame::awardScoreStaticShapeDestroy(%game, %cl, %obj)
{
%dataName = %obj.getDataBlock().getName();
switch$ ( %dataName )
{
case "GeneratorLarge":
%cl.genDestroys++;
%value = %game.SCORE_PER_DESTROY_GEN;
%msgType = 'msgGenDes';
%tMsg = '\c5%1 destroyed an enemy %2 Generator!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy generator.';
case "SolarPanel":
%cl.solarDestroys++;
%value = %game.SCORE_PER_DESTROY_SOLAR;
%msgType = 'msgSolarDes';
%tMsg = '\c5%1 destroyed an enemy %2 Solar Panel!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy solar panel.';
case "SensorLargePulse" or "SensorMediumPulse":
%cl.sensorDestroys++;
%value = %game.SCORE_PER_DESTROY_SENSOR;
%msgType = 'msgSensorDes';
%tMsg = '\c5%1 destroyed an enemy %2 Sensor!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy pulse sensor.';
case "TurretBaseLarge":
%cl.turretDestroys++;
%value = %game.SCORE_PER_DESTROY_TURRET;
%msgType = 'msgTurretDes';
%tMsg = '\c5%1 destroyed an enemy %2 Turret!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy base turret.';
case "StationInventory":
%cl.IStationDestroys++;
%value = %game.SCORE_PER_DESTROY_ISTATION;
%msgType = 'msgInvDes';
%tMsg = '\c5%1 destroyed an enemy %2 Inventory Station!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy inventory station.';
case "StationAmmo":
%cl.aStationDestroys++;
%value = %game.SCORE_PER_DESTROY_ASTATION;
%msgType = 'msgAmmoDes';
%tMsg = '\c5%1 destroyed an enemy %2 Ammo Station!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy ammo station.';
case "StationVehicle":
%cl.VStationDestroys++;
%value = %game.SCORE_PER_DESTROY_VSTATION;
%msgType = 'msgVSDes';
%tMsg = '\c5%1 destroyed an enemy Vehicle Station!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy vehicle station.';
case "SentryTurret":
%cl.sentryDestroys++;
%value = %game.SCORE_PER_DESTROY_SENTRY;
%msgType = 'msgSentryDes';
%tMsg = '\c5%1 destroyed an enemy %2 Sentry Turret!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy sentry turret.';
case "DeployedMotionSensor" or "DeployedPulseSensor":
%cl.depSensorDestroys++;
%value = %game.SCORE_PER_DESTROY_DEP_SENSOR;
%msgType = 'msgDepSensorDes';
%tMsg = '\c5%1 destroyed an enemy Deployed Sensor!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy deployed sensor.';
case "TurretDeployedWallIndoor" or "TurretDeployedFloorIndoor" or "TurretDeployedCeilingIndoor":
%cl.depTurretDestroys++;
%value = %game.SCORE_PER_DESTROY_DEP_TUR;
%msgType = 'msgDepTurDes';
%tMsg = '\c5%1 destroyed an enemy Deployed Spider Clamp Turret!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy deployed spider clamp turret.';
case "TurretDeployedOutdoor":
%cl.depTurretDestroys++;
%value = %game.SCORE_PER_DESTROY_DEP_TUR;
%msgType = 'msgDepTurDes';
%tMsg = '\c5%1 destroyed an enemy Deployed Landspike Turret!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy deployed landspike turret.';
case "DeployedStationInventory":
%cl.depStationDestroys++;
%value = %game.SCORE_PER_DESTROY_DEP_INV;
%msgType = 'msgDepInvDes';
%tMsg = '\c5%1 destroyed an enemy Deployed Station!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy deployed station.';
case "MPBTeleporter":
%cl.mpbtstationDestroys++;
%value = %game.SCORE_PER_DESTROY_MPBTSTATION;
%msgType = 'msgMPBTeleDes';
%tMsg = '\c5%1 destroyed an enemy MPB Teleport Station!';
%clMsg = '\c0You received a %1 point bonus for destroying an enemy MPB teleport station.';
default:
return;
}
teamDestroyMessage(%cl, 'MsgDestroyed', %tMsg, %cl.name, %obj.nameTag);
messageClient(%cl, %msgType, %clMsg, %value, %dataName);
%game.recalcScore(%cl);
%game.shareScore(%scorer, %value);
}
function TDMGame::shareScore(%game, %client, %amount)
{
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
//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 TDMGame::objectRepaired(%game, %obj, %objName)
{
%game.staticShapeOnRepaired(%obj, %objName);
%obj.wasDisabled = false;
}
function TDMGame::staticShapeOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
%dataName = %obj.getDataBlock().getName();
switch$ (%dataName)
{
case "GeneratorLarge":
%repairman.genRepairs++;
%score = %game.SCORE_PER_REPAIR_GEN;
%tMsgType = 'msgGenRepaired';
%msgType = 'msgGenRep';
%tMsg = '\c0%1 repaired the %2 Generator!';
%clMsg = '\c0You received a %1 point bonus for repairing a generator.';
case "SolarPanel":
%repairman.solarRepairs++;
%score = %game.SCORE_PER_REPAIR_SOLAR;
%tMsgType = 'msgsolarRepaired';
%msgType = 'msgsolarRep';
%tMsg = '\c0%1 repaired the %2 Solar Panel!';
%clMsg = '\c0You received a %1 point bonus for repairing a solar panel.';
case "SensorLargePulse" or "SensorMediumPulse":
%repairman.sensorRepairs++;
%score = %game.SCORE_PER_REPAIR_SENSOR;
%tMsgType = 'msgSensorRepaired';
%msgType = 'msgSensorRep';
%tMsg = '\c0%1 repaired the %2 Pulse Sensor!';
%clMsg = '\c0You received a %1 point bonus for repairing a pulse sensor.';
case "StationInventory" or "StationAmmo":
%repairman.stationRepairs++;
%score = %game.SCORE_PER_REPAIR_ISTATION;
%tMsgType = 'msgStationRepaired';
%msgType = 'msgIStationRep';
%tMsg = '\c0%1 repaired the %2 Station!';
%clMsg = '\c0You received a %1 point bonus for repairing a station.';
case "StationVehicle":
%repairman.VStationRepairs++;
%score = %game.SCORE_PER_REPAIR_VSTATION;
%tMsgType = 'msgvstationRepaired';
%msgType = 'msgVStationRep';
%tMsg = '\c0%1 repaired the Vehicle Station!';
%clMsg = '\c0You received a %1 point bonus for repairing a vehicle station.';
case "TurretBaseLarge":
%repairman.TurretRepairs++;
%score = %game.SCORE_PER_REPAIR_TURRET;
%tMsgType = 'msgTurretRepaired';
%msgType = 'msgTurretRep';
%tMsg = '\c0%1 repaired the %2 Turret!';
%clMsg = '\c0You received a %1 point bonus for repairing a base turret.';
case "SentryTurret":
%repairman.sentryRepairs++;
%score = %game.SCORE_PER_REPAIR_SENTRY;
%tMsgType = 'msgsentryTurretRepaired';
%msgType = 'msgSentryRep';
%tMsg = '\c0%1 repaired the %2 Sentry Turret!';
%clMsg = '\c0You received a %1 point bonus for repairing a sentry turret.';
case "DeployedMotionSensor" or "DeployedPulseSensor":
%repairman.depSensorRepairs++;
%tMsgType = 'msgDepSensorRepaired';
%msgType = 'msgDepSensorRep';
%score = %game.SCORE_PER_REPAIR_DEP_SENSOR;
%tMsg = '\c0%1 repaired a Deployed Sensor!';
%clMsg = '\c0You received a %1 point bonus for repairing a deployed sensor.';
case "TurretDeployedWallIndoor" or "TurretDeployedFloorIndoor" or "TurretDeployedCeilingIndoor":
%repairman.depTurretRepairs++;
%score = %game.SCORE_PER_REPAIR_DEP_TUR;
%tMsgType = 'msgDepTurretRepaired';
%msgType = 'msgDepTurretRep';
%tMsg = '\c0%1 repaired a Spider Clamp Turret!';
%clMsg = '\c0You received a %1 point bonus for repairing a deployable spider clamp turret.';
case "TurretDeployedOutdoor":
%repairman.depTurretRepairs++;
%score = %game.SCORE_PER_REPAIR_DEP_TUR;
%tMsgType = 'msgDepTurretRepaired';
%msgType = 'msgDepTurretRep';
%tMsg = '\c0%1 repaired a Landspike Turret!';
%clMsg = '\c0You received a %1 point bonus for repairing a deployable landspike turret.';
case "DeployedStationInventory":
%repairman.depInvRepairs++;
%score = %game.SCORE_PER_REPAIR_DEP_INV;
%tMsgType = 'msgDepInvRepaired';
%msgType = 'msgDepInvRep';
%tMsg = '\c0%1 repaired a Deployable Station!';
%clMsg = '\c0You received a %1 point bonus for repairing a deployed station.';
case "MPBTeleporter":
%repairman.mpbtstationRepairs++;
%score = %game.SCORE_PER_REPAIR_MPBTSTATION;
%tMsgType = 'msgMPBTeleRepaired';
%msgType = 'msgMPBTeleRep';
%tMsg = '\c0%1 repaired the MPB Teleporter Station!';
%clMsg = '\c0You received a %1 point bonus for repairing a mpb teleporter station.';
default:
return;
}
teamRepairMessage(%repairman, %tMsgType, %tMsg, %repairman.name, %obj.nameTag);
messageClient(%repairman, %msgType, %clMsg, %score, %dataName);
%game.recalcScore(%repairman);
}
}
function markTargetTDM(%client,%clTarget) // out of bountygame
{
if(isObject(%clTarget) && isObject(%client) && !%client.isAIControlled())
{
%visMask = getSensorGroupAlwaysVisMask(%clTarget.getSensorGroup());
%visMask |= (1 << %client.getSensorGroup());
setSensorGroupAlwaysVisMask(%clTarget.getSensorGroup(), %visMask);
%clTarget.player.scopeToClient(%client);
%client.setTargetId(%clTarget.target);
commandToClient(%client, 'TaskInfo', %client, -1, false, $TDMGame::wpMessage);
%client.sendTargetTo(%client, true);
}
}
function hideTargetTDM(%client,%clTarget)
{
if(isObject(%clTarget) && isObject(%client) && !%client.isAIControlled())
{
%visMask = getSensorGroupAlwaysVisMask(%clTarget.getSensorGroup());
%visMask &= ~(1 << %client.getSensorGroup());
setSensorGroupAlwaysVisMask(%clTarget.getSensorGroup(), %visMask);
removeClientTargetType(%client, "AssignedTask");
}
}
function TDMGame::missionLoadDone(%game){
parent::missionLoadDone(%game);
for(%i = 1; %i < (%game.numTeams + 1); %i++){
$teamScore[%i] = 0;
}
}
//--------- TDM SCORING INIT ------------------
function TDMGame::initGameVars(%game){
%game.SCORE_PER_SUICIDE = 0;
%game.SCORE_PER_TEAMKILL = -2;
%game.SCORE_PER_DEATH = 0;
%game.SCORE_PER_KILL = 1;
%game.SCORE_PER_PLYR_FLIPFLOP_CAP = 10;
%game.SCORE_PER_TURRET_KILL = 1;
%game.SCORE_PER_FLIPFLOP_DEFEND = 1;
%game.RADIUS_FLIPFLOP_DEFENSE = 20; //meters
%game.TIME_BONUS_FACTOR = 0.1; // secs times factor = bonus poitns to the mark player
%game.MIN_BONUS_POINTS = 10;
%game.DEFEND_TARGET_BONUS = 2;
%game.DEFEND_TARGET_RADIUS = 40;
%game.KILL_TARGET_BONUS = 5;
%game.CATCHUP_FACTOR = 0.75; // catchup factor how much the loosing team can catch up by
%game.CATCHUP_DIFFERENCE = 25;// at what point do we trigger a way for the other team to catch up
%game.MARK_TARGET_TIME = 60000 * 2;// how long between targets;
%game.markedClient = 0;
%game.markedTeam = 0;
%game.markSimTime = getSimTime();
%game.SCORE_PER_TK_DESTROY = -10;
%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_MPBTSTATION = 3; // z0dd - ZOD, 4/24/02. MPB Teleporter
%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_BOMBER = 8;
%game.SCORE_PER_DESTROY_TRANSPORT = 5;
%game.SCORE_PER_DESTROY_WILDCAT = 5;
%game.SCORE_PER_DESTROY_TANK = 8;
%game.SCORE_PER_DESTROY_MPB = 12;
%game.SCORE_PER_PASSENGER = 2;
%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_MPBTSTATION = 3; // z0dd - ZOD, 4/24/02. MPB Teleporter
%game.SCORE_PER_REPAIR_SOLAR = 4;
%game.SCORE_PER_REPAIR_SENTRY = 2;
%game.SCORE_PER_REPAIR_DEP_SEN = 1; // z0dd - ZOD, 4/24/02. Deployed sensors
%game.SCORE_PER_REPAIR_DEP_TUR = 3;
%game.SCORE_PER_REPAIR_DEP_INV = 2;
%game.RADIUS_GEN_DEFENSE = 20; //meters
}
function TDMGame::setUpTeams(%game)
{
DefaultGame::setUpTeams(%game);
// reset the visibility of team 0 (team is still defaulted as friendly)
setSensorGroupAlwaysVisMask(0, 0);
}
function TDMGame::startMatch(%game)
{
%game.updateObjHudAll();
DefaultGame::startMatch(%game);
}
function TDMGame::checkScoreLimit(%game)
{
%game.updateObjHudAll();
%scoreLimit = %game.getScoreLimit();
if($teamScore[1] >= %scoreLimit || $teamScore[2] >= %scoreLimit)
%game.scoreLimitReached();
}
function TDMGame::getScoreLimit(%game)
{
%scoreLimit = MissionGroup.TDM_scoreLimit;
if(%scoreLimit $= "")
%scoreLimit = 300;
return %scoreLimit;
}
function TDMGame::scoreLimitReached(%game)
{
%game.gameOver();
cycleMissions();
}
function TDMGame::timeLimitReached(%game)
{
%game.gameOver();
cycleMissions();
}
function TDMGame::gameOver(%game)
{
if(isObject(%game.markedClient)){
%time = getSimTime() - %game.markSimTime;
%timebonus = (%time/1000) * %game.TIME_BONUS_FACTOR;
%game.awardScoreBonus(%game.markedClient, %time, %timebonus);
%game.recalcScore(%game.markedClient);
%game.markedClient = 0;
}
//call the default
DefaultGame::gameOver(%game);
//send the winner message
%winner = "";
if ($teamScore[1] > $teamScore[2])
%winner = $teamName[1];
else if ($teamScore[2] > $teamScore[1])
%winner = $teamName[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
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);
}
messageAll('MsgSPCurrentObjective1', "", "");
messageAll('MsgSPCurrentObjective2', "", "");
}
function TDMGame::updateObjHud(%game, %client){
messageClient(%client, 'MsgSPCurrentObjective1', "", '%1 %2/%3 Bonus %4x',$TeamName[1], $teamScore[1], game.getScoreLimit(), %game.countFlipsHeld(1)+1);
messageClient(%client, 'MsgSPCurrentObjective2', "", '%1 %2/%3 Bonus %4x',$TeamName[2], $teamScore[2], game.getScoreLimit(), %game.countFlipsHeld(2)+1);
}
function TDMGame::updateObjHudAll(%game){
messageAll('MsgSPCurrentObjective1', "", '%1 %2 / %3 Bonus %4x',$TeamName[1], $teamScore[1], game.getScoreLimit(), %game.countFlipsHeld(1)+1);
messageAll('MsgSPCurrentObjective2', "", '%1 %2 / %3 Bonus %4x',$TeamName[2], $teamScore[2], game.getScoreLimit(), %game.countFlipsHeld(2)+1);
}
function TDMGame::clientMissionDropReady(%game, %client){
messageClient(%client, 'MsgClientReady',"", "SinglePlayerGame");
%game.updateObjHud(%client);
//%game.populateTeamRankArray(%client);
//messageClient(%client, 'MsgYourRankIs', "", -1);
messageClient(%client, 'MsgMissionDropInfo', '\c0You are in mission %1 (%2).', $MissionDisplayName, $MissionTypeDisplayName, $ServerName );
DefaultGame::clientMissionDropReady(%game, %client);
}
function TDMGame::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 TDMGame::clientChangeTeam(%game, %client, %team, %fromObs, %respawned){ // z0dd - ZOD, 6/06/02. Don't send a message if player used respawn feature. Added %respawned
parent::clientChangeTeam(%game, %client, %team, %fromObs, %respawned);
if(isObject(%game.markedClient)){
markTargetTDM(%client, %game.markedClient);
}
}
function TDMGame::getNumFlipFlops(){
%ffGroup = nameToID("MissionCleanup/FlipFlops");
return %ffGroup.getCount();
}
function TDMGame::countFlipsHeld(%game, %team)
{
%teamHeld = 0;
if(isObject(FlipFlops))
{
%numFF = FlipFlops.getCount();
for(%j = 0; %j < %numFF; %j++)
{
%curFF = FlipFlops.getObject(%j);
if(%curFF.team == %team)
%teamHeld++;
}
}
return %teamHeld;
}
function TDMGame::countFlips(%game)
{
return true;
}
function TDMGame::equip(%game, %player)
{
for(%i =0; %i<$InventoryHudCount; %i++)
%player.client.setInventoryHudItem($InventoryHudData[%i, itemDataName], 0, 1);
%player.client.clearBackpackIcon();
//%player.setArmor("Light");
%player.setInventory(Blaster,1);
%player.setInventory(Chaingun, 1);
%player.setInventory(ChaingunAmmo, 100);
%player.setInventory(Disc,1);
%player.setInventory(DiscAmmo, 20);
%player.setInventory(TargetingLaser, 1);
%player.setInventory(Grenade,6);
%player.setInventory(Beacon, 3);
%player.setInventory(RepairKit,1);
%player.setInventory(EnergyPack,1);
%player.weaponCount = 3;
%player.use("Blaster");
}
//--------------- Scoring functions -----------------
function TDMGame::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);
%cl.offenseScore = %killPoints +
%cl.killTarget * %game.KILL_TARGET_BONUS +
%cl.flipFlopsCapped * %game.SCORE_PER_PLYR_FLIPFLOP_CAP +
%cl.suicides * %game.SCORE_PER_SUICIDE +
%cl.teamKills * %game.SCORE_PER_TEAMKILL +
%cl.tkDestroys * %game.SCORE_PER_TK_DESTROY +
%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.mpbtstationDestroys * %game.SCORE_PER_DESTROY_MPBTSTATION +
%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.flipFlopDefends * %game.SCORE_PER_FLIPFLOP_DEFEND +
%cl.defendTarget * %game.DEFEND_TARGET_BONUS +
%cl.turretKills * %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.mpbtstationRepairs * %game.SCORE_PER_REPAIR_MPBTSTATION + // z0dd - ZOD 4/10/04. MPB Teleporter
%cl.depSensorRepairs * %game.SCORE_PER_REPAIR_DEP_SEN + // z0dd - ZOD 5/27/03. Deployed sensors %cl.mpbtstationRepairs * %game.SCORE_PER_REPAIR_MPBTSTATION + // z0dd - ZOD 3/30/02. MPB Teleporter
%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.score = mFloor(%cl.offenseScore + %cl.defenseScore + %cl.surviveBonus);
//track switches held (not touched), switches defended, kills, deaths, suicides, tks
%game.recalcTeamRanks(%cl);
}
function TDMGame::awardScoreBonus(%game, %client, %time, %bonus){
if(%bonus $= ""){
%bonus = 1;
}
%client.surviveBonus += %bonus;
messageClient(%client, 'msgClient', 'You stayed alive for %1 - %2 Bonus Points', %game.formatTime(%time), %bonus);
%game.recalcScore(%killerID);
}
function TDMGame::awardDefTarget(%game, %client){
%client.defendTarget++;
messageClient(%client, 'msgClient', '\c0You received a %1 point bonus for defending %2.', %game.DEFEND_TARGET_BONUS, %game.markedClient.name);
%game.recalcScore(%killerID);
}
function TDMGame::awardKillTarget(%game, %client){
%client.killTarget++;
messageClient(%client, 'msgClient', '\c0You received a %1 point bonus for killing %2.', %game.KILL_TARGET_BONUS, %game.markedClient.name);
%game.recalcScore(%killerID);
}
function TDMGame::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLoc){
cancel(%clVictim.player.alertThread);
if(%game.markedClient > 0 && !isObject(%game.markedClient)){
messageAll('MsgClient','\c1Target has been lost.~wNflag_lost.wav');
}
if(isObject(%game.markedClient) && %game.markedClient == %clVictim){
%clVictim.player.unMountImage($FlagSlot);
%time = getSimTime() - %game.markSimTime;
%timebonus = (%time/1000) * %game.TIME_BONUS_FACTOR;
%game.awardScoreBonus(%clVictim, %time, %timebonus);
}
parent::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLoc);
if(!isObject(%game.markedClient) && %game.markedClient > 0){// target loss
%game.markedClient = 0;
%game.markedTeam = 0;
messageAll('msgClient', '\c1Target has been lost.~wNflag_lost.wav');
}
if(isObject(%game.markedClient) && %game.markedClient == %clVictim){
%otherTeam = %clVictim.team == 1 ? 2 : 1;
%teamBonus = mFloor(($teamScore[%clVictim.team] - $teamScore[%otherTeam]) * %game.CATCHUP_FACTOR);
if(%teamBonus <= %game.MIN_BONUS_POINTS){
%teamBonus = %game.MIN_BONUS_POINTS;
}
$teamScore[%otherTeam] += %teamBonus;
messageTeam(%clVictim.team, 'MsgClient', '\c1Target has been killed %2 awarded %1 bonus points. ~wbassHit.wav',%teamBonus, $TeamName[%otherteam]);
messageTeam(%otherTeam, 'MsgClient', '\c1Target has been killed %2 awarded %1 bonus points.~wNhunters_horde.wav', %teamBonus, $TeamName[%otherteam]);
%game.checkScoreLimit();
if(%clVictim.team != %clKiller.team){
%game.awardKillTarget(%clKiller);
}
%game.markedClient = 0;
%game.markedTeam = 0;
for(%i = 0; %i < ClientGroup.getCount(); %i ++){
%client = ClientGroup.getObject(%i);
if(%client != %clVictim){
hideTargetTDM(%client, %clVictim);
}
}
}
else if(isObject(%game.markedClient) && %game.markedClient.team == %clKiller.team){
%mask = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType;
%cpos = %clKiller.player.getWorldBoxCenter();
%tgPos = %game.markedClient.player.getWorldBoxCenter();
%dist = vectorDist(%cpos, %tgPos);
if(%dist < %game.DEFEND_TARGET_RADIUS){
%losResult = containerRayCast(%cpos, %tgPos, %mask, %clKiller.player);
%losObject = getWord(%losResult, 0);
if (!isObject(%losObject)){// can we see the target
%game.awardDefTarget(%clKiller);
}
}
}
if($TDMGame::enableMarkPlayers){
%tc = 0;
%winningTeam = ($teamScore[1] > $teamScore[2]) ? 1 : 2;
%losingTeam = (%winningTeam == 1) ? 2 : 1;
%pointDif = $teamScore[%winningTeam] - $teamScore[%losingTeam];
%time = getSimTime() - %game.markSimTime;
//error(%pointDif SPC %time SPC %game.MARK_TARGET_TIME);
if(!isObject(%game.markedClient) && ClientGroup.getCount() >= 4 && %pointDif > %game.CATCHUP_DIFFERENCE && %time > %game.MARK_TARGET_TIME){
for(%i = 0; %i < ClientGroup.getCount(); %i ++){
%client = ClientGroup.getObject(%i);
%player = %client.player;
if(isObject(%player) && %player.getState() !$= "Dead" && %client.team == %winningTeam){
%teamList[%tc] = %client;
%tc++;
}
}
%randomClient = %teamList[getRandom(0,%teamCount[%winningTeam])];
%game.markedClient = %randomClient;
%game.markedTeam = %winningTeam;
%game.markSimTime = getSimTime();
%randomClient.player.mountImage(FlagImage, $FlagSlot, true, %game.getTeamSkin(%randomClient.team));
for(%i = 0; %i < ClientGroup.getCount(); %i ++){
%client = ClientGroup.getObject(%i);
if(%client == %randomClient){
messageClient( %randomClient, 'MsgLeaveMissionArea', '\c1You have been marked stay alive to gain bonus points.~wNflag_snatch.wav' );
bottomPrint( %randomClient, "\nYou have been marked, stay alive to gain bonus points.", 5, 3 );
}
else{
markTargetTDM(%client, %randomClient);
if(%client.team == %randomClient.team){
messageClient( %client, 'MsgLeaveMissionArea', '\c1Defend the target to prevent bonus points.~wNflag_snatch.wav' );
}
else{
messageClient( %client, 'MsgLeaveMissionArea', '\c1Attack the target for team bonus.~wNflag_snatch.wav' );
}
}
}
}
}
}
function TDMGame::awardTeamScoreKill(%game, %clVictim, %clKiller, %damageType, %implement){
if(isObject(%implement) && %implement.getClassName() $= "Turret"){
//error("damagetype" SPC %damageType SPC %implement);
$teamScore[%implement.team]++;
%game.checkScoreLimit();
}
else if(%clVictim.team != %clKiller.team){
%teamHeld = %game.countFlipsHeld(%clKiller.team);
$teamScore[%clKiller.team] += 1 + %teamHeld;
%game.checkScoreLimit();
}
}
function TDMGame::awardScoreGenDefend(%game, %clKiller){
%clKiller.genDefends++;
if (%game.SCORE_PER_GEN_DEFEND != 0){
messageClient(%clKiller, 'msgGenDef', '\c0You received a %1 point bonus for defending a generator.', %game.SCORE_PER_GEN_DEFEND);
messageTeamExcept(%clKiller, 'msgGenDef', '\c2%1 defended our generator from an attack.', %clKiller.name); // z0dd - ZOD, 8/15/02. Tell team
}
%game.recalcScore(%cl);
return %game.SCORE_PER_GEN_DEFEND;
}
function TDMGame::testGenDefend(%game, %clVictim, %clKiller)
{
InitContainerRadiusSearch(%clVictim.plyrPointOfDeath, %game.RADIUS_GEN_DEFENSE, $TypeMasks::StaticShapeObjectType);
%objID = containerSearchNext();
while(%objID != 0)
{
%objType = %objID.getDataBlock().ClassName;
if ((%objType $= "generator") && (%objID.team == %clKiller.team)){
%game.awardScoreGenDefend(%clKiller);
return true;
}
else{
%objID = containerSearchNext();
}
}
return false; //didn't find a qualifying gen within required radius of victim's point of death
}
function TDMGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %implement)
{
%game.awardTeamScoreKill(%clVictim, %clKiller, %damageType, %implement);
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
{
%game.awardScoreKill(%clKiller);
%game.awardScoreDeath(%clVictim);
%game.testGenDefend(%clVictim, %clKiller);
%clKiller.player.rk++;
//see if we were defending a flip flop
%flipflop = %game.testPlayerFFDefend(%clVictim, %clKiller);
if (isObject(%flipflop))
%game.awardScorePlayerFFDefend(%clKiller, %flipflop);
}
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 TDMGame::testPlayerFFDefend(%game, %victimID, %killerID)
{
if (!isObject(%victimId) || !isObject(%killerId) || %killerId.team <= 0)
return -1;
//loop through the flipflops looking for one within range that belongs to the killer...
for (%i = 0; %i < FlipFlops.getCount(); %i++)
{
%ffObj = FlipFlops.getObject(%i);
if (VectorDist(%ffObj.position, %victimID.plyrPointOfDeath) < %game.RADIUS_FLIPFLOP_DEFENSE)
{
if (%ffObj.team == %killerID.team)
return %ffObj;
}
}
//none were found
return -1;
}
function TDMGame::awardScorePlayerFFCap(%game, %cl, %this)
{
if(!($missionRunning))
return;
%cl.flipFlopsCapped++;
if (%game.SCORE_PER_PLYR_FLIPFLOP_CAP != 0)
{
messageClient(%cl, 'msgFFDef', '\c0You received a %1 point bonus for capping the point.', %game.SCORE_PER_PLYR_FLIPFLOP_CAP, %game.cleanWord(%this.namePoint));
// messageTeamExcept(%cl, 'msgFFDef', '\c0Teammate %1 received a %2 point bonus for holding the %3', %cl.name, %game.SCORE_PER_PLYR_FLIPFLOP_CAP, %game.cleanWord(%this.name));
}
%game.recalcScore(%cl);
}
function TDMGame::awardScorePlayerFFDefend(%game, %cl, %flipflop)
{
%cl.flipFlopDefends++;
if (%game.SCORE_PER_FLIPFLOP_DEFEND != 0){
messageClient(%cl, 'msgFFDef', '\c0You received a %1 point bonus for defending the point.', %game.SCORE_PER_FLIPFLOP_DEFEND, %game.cleanWord(%flipflop.name));
}
%game.recalcScore(%cl);
}
function TDMGame::testValidRepair(%game, %obj)
{
return ((%obj.lastDamagedByTeam != %obj.team) && (%obj.repairedBy.team == %obj.team));
}
function TDMGame::genOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgGenRepaired', '\c0%1 repaired the %2 Generator!', %repairman.name, %obj.nameTag);
}
}
function TDMGame::stationOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgStationRepaired', '\c0%1 repaired the %2 Inventory Station!', %repairman.name, %obj.nameTag);
}
}
function TDMGame::sensorOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgSensorRepaired', '\c0%1 repaired the %2 Pulse Sensor!', %repairman.name, %obj.nameTag);
}
}
function TDMGame::turretOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 Turret!', %repairman.name, %obj.nameTag);
}
}
function TDMGame::vStationOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
messageTeam(%repairman.team, 'msgTurretRepaired', '\c0%1 repaired the %2 Vehicle Station!', %repairman.name, %obj.nameTag);
}
}
//------------------------------------------------------------------------
function TDMGame::resetScore(%game, %client)
{
%client.offenseScore = 0;
%client.kills = 0;
%client.deaths = 0;
%client.suicides = 0;
%client.teamKills = 0;
%client.flipFlopsCapped = 0;
%client.surviveBonus = 0;
%client.defenseScore = 0;
%client.turretKills = 0;
%client.flipFlopDefends = 0;
%client.defendTarget = 0;
%client.killTarget = 0;
%client.score = 0;
%client.genDestroys = 0;
%client.sensorDestroys = 0;
%client.turretDestroys = 0;
%client.iStationDestroys = 0;
%client.vstationDestroys = 0;
%client.mpbtstationDestroys = 0; // z0dd - ZOD 3/30/02. MPB Teleporter
%client.solarDestroys = 0;
%client.sentryDestroys = 0;
%client.depSensorDestroys = 0;
%client.depTurretDestroys = 0;
%client.depStationDestroys = 0;
%client.vehicleScore = 0;
%client.vehicleBonus = 0;
%client.genDefends = 0;
%client.genRepairs = 0;
%client.SensorRepairs = 0;
%client.TurretRepairs = 0;
%client.StationRepairs = 0;
%client.VStationRepairs = 0;
%client.mpbtstationRepairs = 0; // z0dd - ZOD 3/30/02. MPB Teleporter
%client.solarRepairs = 0;
%client.sentryRepairs = 0;
%client.depSensorRepairs = 0; // z0dd - ZOD 5/27/03. Deployed sensors
%client.depInvRepairs = 0;
%client.depTurretRepairs = 0;
}
function TDMGame::applyConcussion(%game, %player)
{
}
function TDMGame::enterMissionArea( %game, %playerData, %player )
{
if( %player.getState() $= "Dead" )
return;
%player.client.outOfBounds = false;
messageClient( %player.client, 'EnterMissionArea', '\c1You have returned to the mission area.' );
logEcho( %player.client.nameBase@" (pl "@%player@"/cl "@%player.client@") entered mission area" );
// Disable out of bounds kill
cancel( %player.alertThread );
}
function TDMGame::leaveMissionArea( %game, %playerData, %player )
{
if( %player.getState() $= "Dead" )
return;
%player.client.outOfBounds = true;
messageClient( %player.client, 'MsgLeaveMissionArea', '\c1You have left the mission area. Return or take damage.~wfx/misc/warning_beep.wav' );
logEcho( %player.client.nameBase@" (pl "@%player@"/cl "@%player.client@") left mission area" );
// Schedule out of bounds kill
%player.alertThread = %game.schedule( 7500, "MissionAreaDamage", %player );
}
function TDMGame::MissionAreaDamage( %game, %player )
{
if( %player.getState() !$= "Dead" )
{
%player.setDamageFlash( 0.1 );
%prevHurt = %player.getDamageLevel();
%player.setDamageLevel( %prevHurt + 0.09 );
%player.alertThread = %game.schedule( 1000, "MissionAreaDamage", %player );
}
else
%game.onClientKilled( %player.client, 0, $DamageType::OutOfBounds );
}