TribesReplay/base/scripts/DnDGame.cs
Robert MacGregor 116be1648d v22460 (04/13/01):
**Tweak, Spider Clamp turrets need more Surface area for legal deploy space now**:

*Minor tweak to improve long-term server stability.
*A new voice Codec, 'GSM' was added to allow voice communication between Linux and Windows users.
*Minor Sound system tweaks and fixes.
*Minor BOT navigation and seeking improvements.
*Fix removing BOTs counting toward the Vote Meter representation.
*Improvement for Vehicle Physics, particularly instances when Vehicles would get stuck on their edge.
*Fix for BOT's skins not dynamically updating to correct team skin, when Admin team changed them.
*Fixed bug where certain cases would cause Cursor to vanish when it should not.
*Minor Server query improvements.
*Fix Players can be added to the 'Admin List'.
*No more voting to BAN, only Super ADMIN may now BAN.
*Various GUI improvements, notably the Voice Com. elements in the Lobby, and some minor pointer Icon improvements for certain cases.
*Linux 'Penguin' Symbol added for Server List Screen when joining, so users may identify Windows and Linux servers at a glance.
2017-07-17 23:10:36 -04:00

273 lines
8.1 KiB
C#

// DisplayName = Defend and Destroy
//--- GAME RULES BEGIN ---
//Whoever blows up the other team's crap first wins!
//W00T!
//--- GAME RULES END ---
// Defend and Destroy type script for TRIBES 2
//
// You should know how this works by now, boys and girls -- it's "classic"
// TRIBES-style D&D! Whoever blows up the other team's crap first wins!
// W00T!
//
// Objects will be identified as "Objectives" by a property called scoreValue
// being non-zero.
//
// Like Siege, this mission type doesn't have a scoreLimit because it doesn't need one.
package DnDGame {
function StaticShapeData::onDisabled(%data, %obj, %prevstate)
{
Parent::onDisabled(%data, %obj, %prevState);
%team = %obj.team;
if(%obj.scoreValue && !%obj.objectiveCompleted)
{
%obj.objectiveCompleted = true;
$objDestroyed[%team]++;
%game.scoreObjective(%obj, %obj.lastDamagedBy);
%game.updateObjectives();
%game.checkObjectives();
//echo("Objective #" @ %obj @ "(" @ %obj.getClassName() @ ") was disabled by " @ %obj.lastDamagedBy);
}
}
function StaticShapeData::objectiveInit(%data, %object)
{
if(%object.scoreValue) {
%team = %object.team;
//error(%team @ " : Found objective #" @ %object @ " (" @ %object.getClassName() @ ") worth " @ %object.scoreValue @ " points");
%object.objectiveCompleted = false;
$numObjectives[%team]++;
%objSet = nameToID("MissionCleanup/Objectives" @ %team);
if(%objSet <= 0) {
%objSet = new SimSet("Objectives" @ %team);
MissionCleanup.add(%objSet);
}
%objSet.add(%object);
}
}
function FlipFlop::objectiveInit(%data, %flipflop)
{
// add this flipflop to missioncleanup (for HUD reasons)
%team = %flipflop.team;
$numObjectives[%team]++;
%flipflopSet = nameToID("MissionCleanup/Objectives" @ %team);
if(%flipflopSet <= 0) {
%flipflopSet = new SimSet("Objectives" @ %team);
MissionCleanup.add(%flipflopSet);
}
%flipflopSet.add(%flipflop);
$flipflopStatus[%flipflop] = "<unclaimed>";
%flipFlop.objectiveCompleted = false;
}
function FlipFlop::playerTouch(%data, %flipflop, %player)
{
//echo("function DnDGame::playerTouchFlipFlop(Game "@Game@",%player "@%player@",%this "@%this@")");
%client = %player.client;
%claimName = %client.name;
%flipName = %flipflop.Name;
%flipTeam = %flipflop.team;
if(%flipTeam $= %player.team)
return;
%flipflop.team = %player.team;
%flipflop.objectiveCompleted = !(%flipflop.objectiveCompleted);
$flipflopStatus[%flipflop] = $teamName[%client.team];
messageAll('MsgDnDClaimFlipFlop', '%1 claimed %2 for %3.~wfx/misc/switch_taken.wav', %claimName, %flipName, $teamName[%client.team], %flipflop.number);
// change the skin on the switch to claiming team's
setTargetSkin(%flipflop.getTarget(), $teamSkin[%player.team]);
%client.touches++;
Game.computeScore(%client);
Game.computeTeamScore(%client.team);
%flipflop.lastClaimedBy = %client; //Do I care?
Game.updateObjectives();
Game.checkObjectives();
}
};
function DnDGame::missionLoadDone(%game)
{
//default version sets up teams - must be called first...
DefaultGame::missionLoadDone(%game);
for(%i = 1; %i <= %game.numTeams; %i++)
$objDisabled[%i] = 0;
}
function DnDGame::setUpTeams(%game)
{
DefaultGame::setupTeams(%game);
for(%i = 1; %i <= %game.numTeams; %i++) {
// $numObjectives[N] is the number of objectives that team N possesses
// (and must defend). $objDestroyed[N] is how many of team N's objectives
// have been destroyed.
$numObjectives[%i] = 0;
$objDestroyed[%i] = 0;
}
}
function DnDGame::startMatch(%game)
{
DefaultGame::startMatch(%game);
// jff: team change
//for(%i = 1; %i < %game.numTeams; %i++)
// error("Number of team #" @ %i @ " 's objectives: " @ $numObjectives[%i]);
}
function DnDGame::scoreObjective(%game, %object, %client)
{
//echo("scoreObjective: object " @ %object @ ", client " @ %client);
if(%object.team != %client.team) {
messageAll('MsgDnDObjDisabled', '%1 disabled an enemy objective worth %2 points!', %client.name, %object.scoreValue, 0, %object.number);
// if objective doesn't belong to the destroyer's team, positive points
%client.objScore += %object.scoreValue;
$objDisabled[%client.team]++;
}
else {
if(%client.sex $= "Male")
%tempGen = 'his';
else
%tempGen = 'her';
messageAll('MsgDnDObjDisabled', '%1 disabled %2 own team\'s objective worth %3 points!', %client.name, %tempGen, %object.scoreValue, %object.number);
// otherwise, score negative points
%client.objScore -= %object.scoreValue;
}
%game.computeScore(%client);
%game.computeTeamScore(%client.team);
}
function DnDGame::checkObjectives(%game)
{
%teamDone = 0;
// check all the objectives for both teams
for(%i = 1; %i <= %game.numTeams; %i++) {
%objSet = nameToID("MissionCleanup/Objectives" @ %i);
%numObjectives = %objSet.getCount();
%numObjsCompleted = 0;
for(%j = 0; %j < %numObjectives; %j++) {
%curObj = %objSet.getObject(%j);
if(%curObj.objectiveCompleted)
%numObjsCompleted++;
}
// if all objectives have been destroyed, set flag
// otherwise, just update the objective screen
if(%numObjsCompleted == %numObjectives)
%teamDone++;
messageAll('MsgDnDTeamObjLeft', "", %i, (%numObjectives - %numObjsCompleted));
}
// if at least one team is done, go to allObjectivesDestroyed
if(%teamDone)
%game.allObjectivesDestroyed();
}
function DnDGame::allObjectivesDestroyed(%game)
{
messageAll('MsgDnDAllObjDestr', 'All objectives have been disabled!');
%game.gameOver();
cycleMissions();
}
function DnDGame::timeLimitReached(%game)
{
//messageAll('MsgDnDTimeLimitReached', 'Time is up!');
%game.gameOver();
cycleMissions();
}
//function DnDGame::scoreLimitReached(%game)
//{
// %game.gameOver();
//}
function DnDGame::gameOver(%game)
{
//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" );
AIMissionEnd();
messageAll('MsgClearObjHud', "");
for(%i = 0; %i = %group.getCount(); %i ++) {
%client = %group.getObject(%i);
%game.resetScore(%client);
}
for ( %team = 1; %team <= %game.numTeams; %team++ )
$TeamScore[%team] = 0;
}
function DnDGame::computeScore(%game, %client)
{
%client.score = %client.scoreKills - %client.scoreSelfKills - %client.teamKills
+ %client.objScore;
%game.recalcTeamRanks(%client);
}
function DnDGame::computeTeamScore(%game, %team)
{
$teamScore[%team] = $objDisabled[%team];
}
function DnDGame::updateObjectives(%game)
{
//echo("Updating objectives...");
}
function DnDGame::clientMissionDropReady(%game, %client)
{
messageClient(%client, 'MsgClientReady', "", %game.class);
for(%i = 1; %i <= %game.numTeams; %i++)
messageClient(%client, 'MsgDnDAddTeam', "", %i, $teamName[%i], $teamScore[%i]);
%game.populateTeamRankArray(%client);
messageClient(%client, 'MsgYourRankIs', "", -1);
%numFlips = 0;
for(%i = 1; %i <= %game.numTeams; %i++) {
%numObj[%i] = 0;
%objSet = nameToId("MissionCleanup/Objectives" @ %i);
for(%j = 0; %j < %objSet.getCount(); %j++) {
%curObj = %objSet.getObject(%j);
}
messageAll('MsgDnDTeamObjLeft', "", %i, %numObj[%i]);
}
messageClient(%client, 'MsgMissionDropInfo', '\c0You are in mission %1 (%2).', $MissionDisplayName, $MissionTypeDisplayName, $ServerName );
DefaultGame::clientMissionDropReady(%game, %client);
}
function DnDGame::resetScore(%game, %client)
{
%client.score = 0;
%client.scoreKills = 0;
%client.scoreSelfKills = 0;
%client.teamKills = 0;
%client.objScore = 0;
%client.kills = 0;
%client.deaths = 0;
%client.suicides = 0;
}