mirror of
https://github.com/PhantomGamesDevelopment/TWM2.git
synced 2026-01-19 19:44:47 +00:00
435 lines
15 KiB
C#
435 lines
15 KiB
C#
// DisplayName = Domination
|
|
|
|
//--- GAME RULES BEGIN ---
|
|
// Three Points are on the map
|
|
// Secure a point to gain score
|
|
// The more points secured, the faster the point gain
|
|
//--- GAME RULES END ---
|
|
|
|
$InvBanList[Domination, "RPG"] = 1;
|
|
|
|
$DominGame::Rounds = 5;
|
|
$DominGame::MaxScore = 350;
|
|
|
|
datablock StaticShapeData(DominationObjective) {
|
|
className = "StaticShape";
|
|
shapeFile = "flag.dts";
|
|
|
|
maxDamage = 0.5;
|
|
destroyedLevel = 0.5;
|
|
disabledLevel = 0.3;
|
|
|
|
explosion = HandGrenadeExplosion;
|
|
expDmgRadius = 1.0;
|
|
expDamage = 0.05;
|
|
expImpulse = 200;
|
|
|
|
dynamicType = $TypeMasks::StaticShapeObjectType;
|
|
deployedObject = true;
|
|
cmdCategory = "DSupport";
|
|
cmdIcon = CMDSensorIcon;
|
|
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
|
|
targetNameTag = 'Control Point';
|
|
deployAmbientThread = true;
|
|
debrisShapeName = "debris_generic_small.dts";
|
|
debris = DeployableDebris;
|
|
heatSignature = 0;
|
|
needsPower = true;
|
|
|
|
collidable = false;
|
|
};
|
|
|
|
function DominationGame::AIInit(%game) {
|
|
//call the default AIInit() function
|
|
AIInit();
|
|
}
|
|
|
|
function DominationGame::allowsProtectedStatics(%game) {
|
|
return true;
|
|
}
|
|
|
|
function DominationGame::clientMissionDropReady(%game, %client) {
|
|
messageClient(%client, 'MsgMissionDropInfo', '\c0You are in mission %1 (%2).', $MissionDisplayName, $MissionTypeDisplayName, $ServerName );
|
|
messageClient(%client, 'MsgClientReady',"", "SinglePlayerGame");
|
|
DefaultGame::clientMissionDropReady(%game, %client);
|
|
}
|
|
|
|
function DominationGame::onAIRespawn(%game, %client) {
|
|
//add the default task
|
|
if (!%client.defaultTasksAdded) {
|
|
%client.defaultTasksAdded = true;
|
|
%client.addTask(AIPickupItemTask);
|
|
%client.addTask(AIUseInventoryTask);
|
|
%client.addTask(AITauntCorpseTask);
|
|
%client.addTask(AIEngageTurretTask);
|
|
%client.addTask(AIDetectMineTask);
|
|
%client.addTask(AIBountyPatrolTask);
|
|
%client.bountyTask = %client.addTask(AIBountyEngageTask);
|
|
}
|
|
|
|
//set the inv flag
|
|
%client.spawnUseInv = true;
|
|
}
|
|
|
|
function DominationGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %implement) {
|
|
if (%game.testKill(%clVictim, %clKiller)) { //verify victim was an enemy
|
|
%game.awardScoreKill(%clKiller);
|
|
%game.awardScoreDeath(%clVictim);
|
|
}
|
|
else if (%game.testSuicide(%clVictim, %clKiller, %damageType)) //otherwise test for suicide
|
|
%game.awardScoreSuicide(%clVictim);
|
|
}
|
|
|
|
function DominationGame::timeLimitReached(%game) {
|
|
logEcho("game over (timelimit)");
|
|
%game.Intermit();
|
|
}
|
|
|
|
function DominationGame::scoreLimitReached(%game) {
|
|
logEcho("game over (scorelimit)");
|
|
%game.gameOver();
|
|
cycleMissions();
|
|
}
|
|
|
|
function DominationGame::gameOver(%game) {
|
|
//call the default
|
|
DefaultGame::gameOver(%game);
|
|
$TWM2::PlayingDomin = 0;
|
|
$FissionEndsGame = 0;
|
|
|
|
$Ion::StopIon = 0;
|
|
|
|
$TeamWins[1] = 0;
|
|
$TeamWins[2] = 0;
|
|
|
|
//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 DominationGame::vehicleDestroyed(%game, %vehicle, %destroyer) {
|
|
|
|
}
|
|
|
|
function DominationGame::startMatch(%game) {
|
|
DefaultGame::StartMatch(%game);
|
|
$Domination::TeamScore[1] = 0;
|
|
$Domination::TeamScore[2] = 0;
|
|
|
|
$TeamWins[1] = 0;
|
|
$TeamWins[2] = 0;
|
|
|
|
$Ion::StopIon = 1;
|
|
|
|
$TWM2::PlayingDomin = 1;
|
|
$DominGame::RoundNumber = 1;
|
|
$FissionEndsGame = 1;
|
|
Game.NumTeams = 2;
|
|
for(%i = 0; %i < ClientGroup.getCount(); %i++) {
|
|
%cl = ClientGroup.getObject(%i);
|
|
CenterPrint(%cl, "<Font:Arial Bold:18><just:center>DOMINATION", 5, 2);
|
|
if(isObject(%cl.player)) {
|
|
%cl.player.setMoveState(true);
|
|
%cl.player.schedule(5000, "setMoveState", false);
|
|
}
|
|
}
|
|
%game.InitialSetup($CurrentMission);
|
|
%game.AddTeamScore();
|
|
|
|
setSensorGroupCount(7);
|
|
}
|
|
|
|
function DominationGame::Intermit(%game) {
|
|
$DominGame::RoundNumber++;
|
|
$Domination::TeamScore[1] = 0;
|
|
$Domination::TeamScore[2] = 0;
|
|
|
|
%game.flag1.Controller = 0;
|
|
%game.flag2.Controller = 0;
|
|
%game.flag3.Controller = 0;
|
|
|
|
%game.flag1.CapCount = 0;
|
|
%game.flag2.CapCount = 0;
|
|
%game.flag3.CapCount = 0;
|
|
|
|
if($DominGame::RoundNumber > $DominGame::Rounds) {
|
|
%game.schedule(10000, "GameOver");
|
|
CycleMissions();
|
|
}
|
|
else {
|
|
MessageAll('msgInter', "\c5Domination: INTERMISSION, ROUND "@$DominGame::RoundNumber@" BEGINNING");
|
|
for(%i = 0; %i < ClientGroup.getCount(); %i++) {
|
|
%cl = ClientGroup.getObject(%i);
|
|
CenterPrint(%cl, "<Font:Arial Bold:18><just:center>DOMINATION \n Round "@$DominGame::RoundNumber@"", 5, 2);
|
|
if(isObject(%cl.player) && %cl.player.getState() !$= "dead") {
|
|
%cl.player.setMoveState(true);
|
|
%cl.player.schedule(5000, "setMoveState", false);
|
|
%goto = %game.pickTeamSpawn(%cl.team);
|
|
%cl.player.setPosition(%goto);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function DominationGame::InitialSetup(%game, %map) {
|
|
%game.flag1 = new StaticShape() {
|
|
dataBlock = DominationObjective;
|
|
position = $DominationGame::ObjectiveLocation1[%map];
|
|
};
|
|
%game.flag2 = new StaticShape() {
|
|
dataBlock = DominationObjective;
|
|
position = $DominationGame::ObjectiveLocation2[%map];
|
|
};
|
|
%game.flag3 = new StaticShape() {
|
|
dataBlock = DominationObjective;
|
|
position = $DominationGame::ObjectiveLocation3[%map];
|
|
};
|
|
MissionCleanup.add(%game.flag1);
|
|
MissionCleanup.add(%game.flag2);
|
|
MissionCleanup.add(%game.flag3);
|
|
|
|
%name[1] = $dFlag[1];
|
|
%name[2] = $dFlag[2];
|
|
%name[3] = $dFlag[3];
|
|
for(%i = 1; %i < 4; %i++) {
|
|
if($Domination::Flag[%i, $CurrentMission] !$= "") {
|
|
%name[%i] = $Domination::Flag[%i, $CurrentMission];
|
|
}
|
|
}
|
|
|
|
%game.flag1.Name = %name[1];
|
|
%game.flag2.Name = %name[2];
|
|
%game.flag3.Name = %name[3];
|
|
|
|
%game.flag1.Controller = 0;
|
|
%game.flag2.Controller = 0;
|
|
%game.flag3.Controller = 0;
|
|
|
|
%game.flag1.CapCount = 0;
|
|
%game.flag2.CapCount = 0;
|
|
%game.flag3.CapCount = 0;
|
|
|
|
%game.ScanFlagArea(%game.flag1);
|
|
%game.ScanFlagArea(%game.flag2);
|
|
%game.ScanFlagArea(%game.flag3);
|
|
|
|
%game.WPLoop(%game.flag1);
|
|
%game.WPLoop(%game.flag2);
|
|
%game.WPLoop(%game.flag3);
|
|
}
|
|
|
|
function DominationGame::ScanFlagArea(%game, %area) {
|
|
InitContainerRadiusSearch(%area.getPosition(), 25, $TypeMasks::PlayerObjectType);
|
|
while ((%potentialTarget = ContainerSearchNext()) != 0) {
|
|
if(%potentialTarget.team != %area.Controller) {
|
|
%enemyPlayers++;
|
|
}
|
|
else {
|
|
%friendlyPlayers++;
|
|
}
|
|
//
|
|
%cl = %potentialTarget.client;
|
|
if(%friendlyPlayers >= 1 && %enemyPlayers >= 1) {
|
|
bottomPrint(%potentialTarget.client, "AREA CONTESTED", 1, 2);
|
|
}
|
|
else if(%friendlyPlayers == 0 && %enemyPlayers >= 1) {
|
|
bottomPrint(%potentialTarget.client, "CAPTURING AREA ("@%area.CapCount@" / 30)", 1, 2);
|
|
%game.CaptureArea(%area, %potentialTarget, %potentialTarget.team);
|
|
}
|
|
}
|
|
%game.schedule(500, "ScanFlagArea", %area);
|
|
}
|
|
|
|
function DominationGame::CaptureArea(%game, %area, %player, %team) {
|
|
%area.CapCount++;
|
|
if(%area.CapCount > 30) {
|
|
%area.Controller = %team;
|
|
MessageAll("\c5DOMINATON: Point "@%area.name@" captured by team "@%team@".");
|
|
bottomPrint(%player.client, "Area "@%area.name@" captured, +20 XP", 3, 2);
|
|
GainExperience(%player.client, 20, "Domination Territory Captured ");
|
|
CompleteNWChallenge(%player.client, "ZoneCapture");
|
|
recordAction(%player.client, "AREACAP");
|
|
%area.CapCount = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
function DominationGame::BuildFlagControlString(%game, %team) {
|
|
%string = "";
|
|
if(%game.flag1.Controller == %team) {
|
|
%string = ""@%string@"[Alpha]";
|
|
}
|
|
if(%game.flag2.Controller == %team) {
|
|
%string = ""@%string@" [Bravo]";
|
|
}
|
|
if(%game.flag3.Controller == %team) {
|
|
%string = ""@%string@" [Charlie]";
|
|
}
|
|
//
|
|
//they have all 3!
|
|
if(%string $= "[Alpha] [Bravo] [Charlie]") {
|
|
for(%i = 0; %i < ClientGroup.getCount(); %i++) {
|
|
%cl = ClientGroup.getObject(%i);
|
|
if(%cl.team == %team) {
|
|
messageClient(%cl, 'msgDominated', "\c5TEAM: All Positions Locked Down, Hold Those Positions!!!");
|
|
CompleteNWChallenge(%cl, "ABC");
|
|
}
|
|
else {
|
|
messageClient(%cl, 'msgDominated', "\c5TEAM: We Are Being DOMINATED, Take Those Positions!!!");
|
|
}
|
|
}
|
|
}
|
|
return %string;
|
|
}
|
|
|
|
function DominationGame::AddTeamScore(%game) {
|
|
if(%game.flag1.Controller != 0)
|
|
$Domination::TeamScore[%game.flag1.Controller]++;
|
|
if(%game.flag2.Controller != 0)
|
|
$Domination::TeamScore[%game.flag2.Controller]++;
|
|
if(%game.flag3.Controller != 0)
|
|
$Domination::TeamScore[%game.flag3.Controller]++;
|
|
|
|
MessageAll('MsgSPCurrentObjective1', "", "TEAM 1 ["@$TeamWins[1]@"/5]: ("@%game.BuildFlagControlString(1)@"), "@$Domination::TeamScore[1]@" / "@$DominGame::MaxScore@"");
|
|
MessageAll('MsgSPCurrentObjective2', "", "TEAM 2 ["@$TeamWins[2]@"/5]: ("@%game.BuildFlagControlString(2)@"), "@$Domination::TeamScore[2]@" / "@$DominGame::MaxScore@"");
|
|
|
|
%game.schedule(3000, "AddTeamScore");
|
|
%game.CheckIntermit();
|
|
}
|
|
|
|
function DominationGame::CheckIntermit(%game) {
|
|
if($Domination::TeamScore[1] >= $DominGame::MaxScore) {
|
|
MessageTeam(1, 'MsgWin', "DOMINATION: Excellent Work, We Have Dominated!!!");
|
|
MessageTeam(2, 'MsgWin', "DOMINATION: We have been Dominated, Try Harder Next Time");
|
|
$teamScore[1] += 10000;
|
|
$TeamWins[1]++;
|
|
for(%i = 0; %i < ClientGroup.getCount(); %i++) {
|
|
%cl = ClientGroup.getObject(%i);
|
|
if(%cl.team == 1) {
|
|
recordAction(%cl, "DOMWIN");
|
|
switch($TeamWins[1]) {
|
|
case 1:
|
|
CompleteNWChallenge(%cl, "MatchSet");
|
|
case 3:
|
|
CompleteNWChallenge(%cl, "3For5");
|
|
case 5:
|
|
CompleteNWChallenge(%cl, "Undefeatable");
|
|
}
|
|
}
|
|
}
|
|
%game.Intermit();
|
|
}
|
|
else if($Domination::TeamScore[2] >= $DominGame::MaxScore) {
|
|
MessageTeam(1, 'MsgWin', "DOMINATION: We have been Dominated, Try Harder Next Time");
|
|
MessageTeam(2, 'MsgWin', "DOMINATION: Excellent Work, We Have Dominated!!!");
|
|
$teamScore[2] += 10000;
|
|
$TeamWins[2]++;
|
|
for(%i = 0; %i < ClientGroup.getCount(); %i++) {
|
|
%cl = ClientGroup.getObject(%i);
|
|
if(%cl.team == 2) {
|
|
recordAction(%cl, "DOMWIN");
|
|
switch($TeamWins[2]) {
|
|
case 1:
|
|
CompleteNWChallenge(%cl, "MatchSet");
|
|
case 3:
|
|
CompleteNWChallenge(%cl, "3For5");
|
|
case 5:
|
|
CompleteNWChallenge(%cl, "Undefeatable");
|
|
}
|
|
}
|
|
}
|
|
%game.Intermit();
|
|
}
|
|
else if($Domination::TeamScore[1] == $DominGame::MaxScore && $Domination::TeamScore[2] == $DominGame::MaxScore) {
|
|
MessageTeam(1, 'MsgWin', "DOMINATION: It's a DRAW!!!");
|
|
MessageTeam(2, 'MsgWin', "DOMINATION: It's a DRAW!!!");
|
|
%game.Intermit();
|
|
}
|
|
}
|
|
|
|
function DominationGame::pickTeamSpawn(%game, %team) {
|
|
if(%team == 1) {
|
|
%pos = vectorAdd($DominationGame::SpawnLocation1[$CurrentMission], TWM2Lib_MainControl("getRandomPosition", 5 TAB 1));
|
|
%pos = vectorAdd(%pos,"0 0 5");
|
|
return %pos;
|
|
}
|
|
else if(%team == 2) {
|
|
%pos = vectorAdd($DominationGame::SpawnLocation2[$CurrentMission], TWM2Lib_MainControl("getRandomPosition", 5 TAB 1));
|
|
%pos = vectorAdd(%pos,"0 0 5");
|
|
return %pos;
|
|
}
|
|
}
|
|
|
|
function DominationGame::WPLoop(%game, %area) {
|
|
if(!isObject(%area)) {
|
|
return; //no console spamz 4 you
|
|
}
|
|
if(isObject(%area.wp)) {
|
|
%area.wp.delete();
|
|
}
|
|
%area.wp = new WayPoint() {
|
|
position = %area.getPosition();
|
|
dataBlock = "WayPointMarker";
|
|
team = %area.Controller;
|
|
name = ""@%area.name@"";
|
|
};
|
|
MissionCleanup.add(%area.wp);
|
|
%game.schedule(500, "WPLoop", %area);
|
|
}
|
|
|
|
//MissionLists
|
|
$DominationGame::SpawnLocation1["EngelamHimmel"] = "126.7 14.7 181";
|
|
$DominationGame::SpawnLocation2["EngelamHimmel"] = "-282 16 181";
|
|
$DominationGame::ObjectiveLocation1["EngelamHimmel"] = "-176.82 32.36 180.016";
|
|
$DominationGame::ObjectiveLocation2["EngelamHimmel"] = "-100 0 251";
|
|
$DominationGame::ObjectiveLocation3["EngelamHimmel"] = "-22.25 32 180.016";
|
|
|
|
$DominationGame::SpawnLocation1["SideSwipe"] = "-83 -270 354";
|
|
$DominationGame::SpawnLocation2["SideSwipe"] = "-82.3 -114 354";
|
|
$DominationGame::ObjectiveLocation1["SideSwipe"] = "-72 -216.75 354";
|
|
$DominationGame::ObjectiveLocation2["SideSwipe"] = "-83.6 -196.2 397";
|
|
$DominationGame::ObjectiveLocation3["SideSwipe"] = "-92.2 -163.13 354";
|
|
|
|
$DominationGame::SpawnLocation1["HarbingerTower"] = "810.5 -401.1 102";
|
|
$DominationGame::SpawnLocation2["HarbingerTower"] = "814.2 -428.7 198";
|
|
$DominationGame::ObjectiveLocation1["HarbingerTower"] = "799.4 -402.1 113";
|
|
$DominationGame::ObjectiveLocation2["HarbingerTower"] = "820.7 -413.5 155";
|
|
$DominationGame::ObjectiveLocation3["HarbingerTower"] = "815 -401.7 180";
|
|
|
|
$DominationGame::SpawnLocation1["Skyline"] = "-59.0467 -419.333 791.448";
|
|
$DominationGame::SpawnLocation2["Skyline"] = "-60.0561 -256.818 814.83";
|
|
$DominationGame::ObjectiveLocation1["Skyline"] = "-59.73 -280.06 773.08";
|
|
$DominationGame::ObjectiveLocation2["Skyline"] = "-61.15 -366.13 740.925";
|
|
$DominationGame::ObjectiveLocation3["Skyline"] = "-59.26 -394.66 773.08";
|
|
|
|
$DominationGame::SpawnLocation1["GeometricOrder"] = "-172.325 -396.557 159.9";
|
|
$DominationGame::SpawnLocation2["GeometricOrder"] = "-10.7 -573.29 159.9";
|
|
$DominationGame::ObjectiveLocation1["GeometricOrder"] = "4.23 -600.6 159.9";
|
|
$DominationGame::ObjectiveLocation2["GeometricOrder"] = "-79.9 -487.06 159.9";
|
|
$DominationGame::ObjectiveLocation3["GeometricOrder"] = "-185.68 -559.78 160.45"; |