mirror of
https://github.com/PhantomGamesDevelopment/TWM2.git
synced 2026-01-19 19:44:47 +00:00
284 lines
7.9 KiB
C#
284 lines
7.9 KiB
C#
// --------------------------------------------------------
|
|
// Deathmatch mission type
|
|
// --------------------------------------------------------
|
|
|
|
// DisplayName = Wartower
|
|
|
|
//--- GAME RULES BEGIN ---
|
|
//It's quite easy...
|
|
//Ascend the tower, kill any in your way
|
|
//--- GAME RULES END ---
|
|
|
|
|
|
$InvBanList[Wartower, "GrappleHook"] = 1;
|
|
$InvBanList[Wartower, "IonLauncher"] = 1;
|
|
$InvBanList[Wartower, "IonRifle"] = 1;
|
|
$InvBanList[Wartower, "Flame"] = 1;
|
|
$InvBanList[Wartower, "Tech"] = 1;
|
|
$InvBanList[Wartower, "Mine"] = 1;
|
|
$InvBanList[Wartower, "ConcussionGrenade"] = 1;
|
|
|
|
function WartowerGame::setUpTeams(%game)
|
|
{
|
|
%group = nameToID("MissionGroup/Teams");
|
|
if(%group == -1)
|
|
return;
|
|
|
|
// create a team0 if it does not exist
|
|
%team = nameToID("MissionGroup/Teams/team0");
|
|
if(%team == -1)
|
|
{
|
|
%team = new SimGroup("team0");
|
|
%group.add(%team);
|
|
}
|
|
|
|
// 'team0' is not counted as a team here
|
|
%game.numTeams = 0;
|
|
while(%team != -1)
|
|
{
|
|
// create drop set and add all spawnsphere objects into it
|
|
%dropSet = new SimSet("TeamDrops" @ %game.numTeams);
|
|
MissionCleanup.add(%dropSet);
|
|
|
|
%spawns = nameToID("MissionGroup/Teams/team" @ %game.numTeams @ "/SpawnSpheres");
|
|
if(%spawns != -1)
|
|
{
|
|
%count = %spawns.getCount();
|
|
for(%i = 0; %i < %count; %i++)
|
|
%dropSet.add(%spawns.getObject(%i));
|
|
}
|
|
|
|
// set the 'team' field for all the objects in this team
|
|
%team.setTeam(0);
|
|
|
|
clearVehicleCount(%team+1);
|
|
// get next group
|
|
%team = nameToID("MissionGroup/Teams/team" @ %game.numTeams + 1);
|
|
if (%team != -1)
|
|
%game.numTeams++;
|
|
}
|
|
|
|
// set the number of sensor groups (including team0) that are processed
|
|
setSensorGroupCount(%game.numTeams + 1);
|
|
%game.numTeams = 1;
|
|
|
|
// allow teams 1->31 to listen to each other (team 0 can only listen to self)
|
|
for(%i = 1; %i < 32; %i++)
|
|
setSensorGroupListenMask(%i, 0xfffffffe);
|
|
}
|
|
|
|
function WartowerGame::initGameVars(%game)
|
|
{
|
|
%game.SCORE_PER_KILL = 1;
|
|
%game.SCORE_PER_DEATH = -1;
|
|
%game.SCORE_PER_SUICIDE = -1;
|
|
}
|
|
|
|
function WartowerGame::allowsProtectedStatics(%game)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
function WartowerGame::equip(%game, %player) {
|
|
buyFavorites(%player.client);
|
|
}
|
|
|
|
function WartowerGame::pickPlayerSpawn(%game, %client, %respawn) {
|
|
%start = $WarTower::SpawnZone[$CurrentMission];
|
|
%pos = vectorAdd(%start, getRandomPosition(4, 1));
|
|
return %pos;
|
|
}
|
|
|
|
function WartowerGame::clientJoinTeam( %game, %client, %team, %respawn )
|
|
{
|
|
%game.assignClientTeam( %client );
|
|
|
|
// Spawn the player:
|
|
%game.spawnPlayer( %client, %respawn );
|
|
}
|
|
|
|
function WartowerGame::assignClientTeam(%game, %client)
|
|
{
|
|
for(%i = 1; %i < 32; %i++)
|
|
$WartowerTeamArray[%i] = false;
|
|
|
|
%maxSensorGroup = 0;
|
|
%count = ClientGroup.getCount();
|
|
for(%i = 0; %i < %count; %i++)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
if(%cl != %client)
|
|
{
|
|
$WartowerTeamArray[%cl.team] = true;
|
|
if (%cl.team > %maxSensorGroup)
|
|
%maxSensorGroup = %cl.team;
|
|
}
|
|
}
|
|
|
|
//now loop through the team array, looking for an empty team
|
|
for(%i = 1; %i < 32; %i++)
|
|
{
|
|
if (! $WartowerTeamArray[%i])
|
|
{
|
|
%client.team = %i;
|
|
if (%client.team > %maxSensorGroup)
|
|
%maxSensorGroup = %client.team;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// set player's skin pref here
|
|
setTargetSkin(%client.target, %client.skin);
|
|
|
|
// Let everybody know you are no longer an observer:
|
|
messageAll( 'MsgClientJoinTeam', '\c1%1 has joined the fray.', %client.name, "", %client, 1 );
|
|
updateCanListenState( %client );
|
|
|
|
//now set the max number of sensor groups...
|
|
setSensorGroupCount(%maxSensorGroup + 1);
|
|
}
|
|
|
|
function WartowerGame::clientMissionDropReady(%game, %client)
|
|
{
|
|
messageClient(%client, 'MsgClientReady',"", %game.class);
|
|
messageClient(%client, 'MsgYourScoreIs', "", 0);
|
|
messageClient(%client, 'MsgWartowerPlayerDies', "", 0);
|
|
messageClient(%client, 'MsgWartowerKill', "", 0);
|
|
%game.resetScore(%client);
|
|
|
|
messageClient(%client, 'MsgMissionDropInfo', '\c0You are in mission %1 (%2).', $MissionDisplayName, $MissionTypeDisplayName, $ServerName );
|
|
|
|
DefaultGame::clientMissionDropReady(%game, %client);
|
|
}
|
|
|
|
function WartowerGame::AIHasJoined(%game, %client)
|
|
{
|
|
//let everyone know the player has joined the game
|
|
//messageAllExcept(%client, -1, 'MsgClientJoinTeam', '%1 has joined the fray.', %client.name, "", %client, 1 );
|
|
}
|
|
|
|
function WartowerGame::checkScoreLimit(%game, %client)
|
|
{
|
|
//there's no score limit in Wartower
|
|
}
|
|
|
|
function WartowerGame::createPlayer(%game, %client, %spawnLoc, %respawn)
|
|
{
|
|
DefaultGame::createPlayer(%game, %client, %spawnLoc, %respawn);
|
|
%client.setSensorGroup(%client.team);
|
|
//give invincibility flag
|
|
%client.player.setInvinc(true);
|
|
}
|
|
|
|
function WartowerGame::resetScore(%game, %client)
|
|
{
|
|
%client.deaths = 0;
|
|
%client.kills = 0;
|
|
%client.score = 0;
|
|
%client.efficiency = 0.0;
|
|
%client.suicides = 0;
|
|
}
|
|
|
|
function WartowerGame::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLoc)
|
|
{
|
|
cancel(%clVictim.player.alertThread);
|
|
DefaultGame::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLoc);
|
|
}
|
|
|
|
function WartowerGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %implement)
|
|
{
|
|
if (%game.testKill(%clVictim, %clKiller)) //verify victim was an enemy
|
|
{
|
|
%game.awardScoreKill(%clKiller);
|
|
messageClient(%clKiller, 'MsgWartowerKill', "", %clKiller.kills);
|
|
%game.awardScoreDeath(%clVictim);
|
|
}
|
|
else if (%game.testSuicide(%clVictim, %clKiller, %damageType)) //otherwise test for suicide
|
|
%game.awardScoreSuicide(%clVictim);
|
|
|
|
messageClient(%clVictim, 'MsgWartowerPlayerDies', "", %clVictim.deaths + %clVictim.suicides);
|
|
}
|
|
|
|
function WartowerGame::recalcScore(%game, %client)
|
|
{
|
|
%killValue = %client.kills * %game.SCORE_PER_KILL;
|
|
%deathValue = %client.deaths * %game.SCORE_PER_DEATH;
|
|
%suicideValue = %client.suicides * %game.SCORE_PER_SUICIDE;
|
|
|
|
if (%killValue - %deathValue == 0)
|
|
%client.efficiency = %suicideValue;
|
|
else
|
|
%client.efficiency = ((%killValue * %killValue) / (%killValue - %deathValue)) + %suicideValue;
|
|
|
|
%client.score = mFloatLength(%client.efficiency, 1);
|
|
messageClient(%client, 'MsgYourScoreIs', "", %client.score);
|
|
%game.recalcTeamRanks(%client);
|
|
%game.checkScoreLimit(%client);
|
|
}
|
|
|
|
function WartowerGame::timeLimitReached(%game)
|
|
{
|
|
logEcho("game over (timelimit)");
|
|
%game.gameOver();
|
|
cycleMissions();
|
|
}
|
|
|
|
function WartowerGame::scoreLimitReached(%game)
|
|
{
|
|
logEcho("game over (scorelimit)");
|
|
%game.gameOver();
|
|
cycleMissions();
|
|
}
|
|
|
|
function WartowerGame::startMatch(%game) {
|
|
DefaultGame::startMatch(%game);
|
|
|
|
$Ion::StopIon = 1;
|
|
|
|
$TWM::PlayingWarTower = 1;
|
|
$FissionEndsGame = 1;
|
|
}
|
|
|
|
function WartowerGame::gameOver(%game)
|
|
{
|
|
$TWM::PlayingWarTower = 0;
|
|
$FissionEndsGame = 0;
|
|
//call the default
|
|
DefaultGame::gameOver(%game);
|
|
|
|
$Ion::StopIon = 0;
|
|
|
|
messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.gameover.wav" );
|
|
|
|
cancel(%game.timeThread);
|
|
messageAll('MsgClearObjHud', "");
|
|
for(%i = 0; %i < ClientGroup.getCount(); %i ++) {
|
|
%client = ClientGroup.getObject(%i);
|
|
%game.resetScore(%client);
|
|
}
|
|
}
|
|
|
|
function WartowerGame::enterMissionArea(%game, %playerData, %player)
|
|
{
|
|
%player.client.outOfBounds = false;
|
|
messageClient(%player.client, 'EnterMissionArea', '\c1You are back in the mission area.');
|
|
}
|
|
|
|
function WartowerGame::leaveMissionArea(%game, %playerData, %player)
|
|
{
|
|
if(%player.getState() $= "Dead")
|
|
return;
|
|
|
|
%player.client.outOfBounds = true;
|
|
messageClient(%player.client, 'LeaveMissionArea', '\c1You have left the mission area.~wfx/misc/warning_beep.wav');
|
|
}
|
|
|
|
function WartowerGame::updateScoreHud(%game, %client, %tag)
|
|
{
|
|
ConstructionGame::updateScoreHud(%game, %client, %tag);
|
|
}
|
|
|
|
function WartowerGame::applyConcussion(%game, %player)
|
|
{
|
|
}
|