mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-18 06:13:55 -07:00
This was SVN commit r16634.
This commit is contained in:
parent
399daeddbf
commit
e4a5d5b4dd
11 changed files with 176 additions and 115 deletions
|
|
@ -1,18 +1,5 @@
|
|||
var vc = {};
|
||||
|
||||
vc.name = translate("Conquest");
|
||||
vc.description = translate("Defeat all opponents");
|
||||
|
||||
/*
|
||||
NOT SUPPORTED YET
|
||||
vc.requirementsCheck = function(mapSettings)
|
||||
{
|
||||
// nothing required
|
||||
return true;
|
||||
g_VictoryConditions.conquest = {
|
||||
"name" : translate("Conquest"),
|
||||
"description" : translate("Defeat all opponents"),
|
||||
"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js"]
|
||||
};
|
||||
*/
|
||||
|
||||
vc.scripts = ["scripts/Conquest.js"];
|
||||
|
||||
g_VictoryConditions.conquest = vc;
|
||||
vc = null;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
g_VictoryConditions.conquestStructure = {
|
||||
"name" : translate("Conquest Structure"),
|
||||
"description" : translate("Destroy all structures of enemies"),
|
||||
"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestStructures.js"]
|
||||
};
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
g_VictoryConditions.conquestUnits = {
|
||||
"name" : translate("Conquest Units"),
|
||||
"description" : translate("Destroy all units of enemies"),
|
||||
"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestUnits.js"]
|
||||
};
|
||||
|
|
@ -1,18 +1,5 @@
|
|||
var vc = {};
|
||||
|
||||
vc.name = translate("Wonder");
|
||||
vc.description = translate("Build a wonder to win");
|
||||
|
||||
/*
|
||||
NOT SUPPORTED YET
|
||||
vc.requirementsCheck = function(mapSettings)
|
||||
{
|
||||
// nothing required
|
||||
return true;
|
||||
g_VictoryConditions.wonder = {
|
||||
"name" : translate("Wonder"),
|
||||
"description" : translate("Build a wonder to win"),
|
||||
"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js", "scripts/WonderVictory.js"]
|
||||
};
|
||||
*/
|
||||
|
||||
vc.scripts = ["scripts/Conquest.js", "scripts/WonderVictory.js"];
|
||||
|
||||
g_VictoryConditions.wonder = vc;
|
||||
vc = null;
|
||||
|
|
|
|||
|
|
@ -1,70 +1,9 @@
|
|||
/*
|
||||
* Check players the next turn. Avoids problems in Atlas, with promoting entities etc
|
||||
*/
|
||||
Trigger.prototype.CheckConquestCriticalEntities = function()
|
||||
{
|
||||
if (this.checkingConquestCriticalEntities)
|
||||
return;
|
||||
// wait a turn for actually checking the players
|
||||
this.DoAfterDelay(0, "CheckConquestCriticalEntitiesNow", null);
|
||||
this.checkingConquestCriticalEntities = true;
|
||||
};
|
||||
|
||||
/*
|
||||
* Check players immediately. Might cause problems with converting/promoting entities.
|
||||
*/
|
||||
Trigger.prototype.CheckConquestCriticalEntitiesNow = function()
|
||||
{
|
||||
this.checkingConquestCriticalEntities = false;
|
||||
// for all other game types, defeat that player
|
||||
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
||||
var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);
|
||||
|
||||
// Ignore gaia
|
||||
var numPlayers = cmpPlayerManager.GetNumPlayers();
|
||||
var cmpPlayers = [];
|
||||
|
||||
var allies = [];
|
||||
var onlyAlliesLeft = true;
|
||||
// If the player is currently active but needs to be defeated,
|
||||
// mark that player as defeated
|
||||
// cache the cmpPlayer instances of the other players and search the allies
|
||||
for (var i = 1; i < numPlayers; i++)
|
||||
{
|
||||
// cmpPlayer should always exist for the player ids from 1 to numplayers
|
||||
// so no tests on the existance of cmpPlayer are needed
|
||||
var playerEntityId = cmpPlayerManager.GetPlayerByID(i);
|
||||
cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player);
|
||||
if (cmpPlayers[i].GetState() != "active")
|
||||
continue;
|
||||
if (cmpPlayers[i].GetConquestCriticalEntitiesCount() == 0)
|
||||
Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );
|
||||
else
|
||||
{
|
||||
if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
|
||||
allies.push(i);
|
||||
else
|
||||
onlyAlliesLeft = false;
|
||||
}
|
||||
}
|
||||
|
||||
// check if there are winners, or the game needs to continue
|
||||
if (!allies.length || !onlyAlliesLeft || !(cmpEndGameManager.alliedVictory || allies.length == 1))
|
||||
return;
|
||||
|
||||
for each (var p in allies)
|
||||
cmpPlayers[p].SetState("won");
|
||||
|
||||
// Reveal the map to all players
|
||||
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
|
||||
cmpRangeManager.SetLosRevealAll(-1, true);
|
||||
};
|
||||
|
||||
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
|
||||
cmpTrigger.conquestClassFilter = "ConquestCritical";
|
||||
|
||||
var data = {"enabled": true};
|
||||
cmpTrigger.RegisterTrigger("OnOwnershipChanged", "CheckConquestCriticalEntities", data);
|
||||
// also check at the start of the game
|
||||
cmpTrigger.DoAfterDelay(0, "CheckConquestCriticalEntitiesNow", null);
|
||||
cmpTrigger.checkingConquestCriticalEntities = false;
|
||||
cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
|
||||
cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data);
|
||||
cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data);
|
||||
|
||||
cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);
|
||||
|
|
|
|||
99
binaries/data/mods/public/maps/scripts/ConquestCommon.js
Normal file
99
binaries/data/mods/public/maps/scripts/ConquestCommon.js
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
Trigger.prototype.ConquestHandlerOwnerShipChanged = function(msg)
|
||||
{
|
||||
if (!this.conquestDataInit || !this.conquestClassFilter)
|
||||
return;
|
||||
|
||||
if (!TriggerHelper.EntityHasClass(msg.entity, this.conquestClassFilter))
|
||||
return;
|
||||
|
||||
if (msg.from == -1)
|
||||
return;
|
||||
|
||||
if (msg.to > 0 && this.conquestEntitiesByPlayer[msg.to])
|
||||
this.conquestEntitiesByPlayer[msg.to].entities.push(msg.entity);
|
||||
|
||||
if (!this.conquestEntitiesByPlayer[msg.from])
|
||||
{
|
||||
if (msg.from)
|
||||
warn("ConquestHandlerOwnerShipChanged: Unknow player " + msg.from);
|
||||
return;
|
||||
}
|
||||
|
||||
let entities = this.conquestEntitiesByPlayer[msg.from].entities;
|
||||
let index = entities.indexOf(msg.entity);
|
||||
|
||||
if (index >= 0)
|
||||
{
|
||||
entities.splice(index, 1);
|
||||
if (!entities.length)
|
||||
Engine.PostMessage(this.conquestEntitiesByPlayer[msg.from].player, MT_PlayerDefeated, { "playerId": msg.from } );
|
||||
}
|
||||
}
|
||||
|
||||
Trigger.prototype.ConquestAddStructure = function(msg)
|
||||
{
|
||||
if (!this.conquestClassFilter || !TriggerHelper.EntityHasClass(msg.building, this.conquestClassFilter))
|
||||
return;
|
||||
|
||||
let cmpOwnership = Engine.QueryInterface(msg.building, IID_Ownership);
|
||||
if (!cmpOwnership)
|
||||
{
|
||||
warn("ConquestAddStructure: Structure without Owner");
|
||||
return;
|
||||
}
|
||||
|
||||
let player = cmpOwnership.GetOwner();
|
||||
if (!this.conquestEntitiesByPlayer[player])
|
||||
{
|
||||
warn("ConquestAddStructure: Unknown player " + player);
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.conquestEntitiesByPlayer[player].entities.indexOf(msg.building) >= 0)
|
||||
return;
|
||||
|
||||
this.conquestEntitiesByPlayer[player].entities.push(msg.building);
|
||||
}
|
||||
|
||||
Trigger.prototype.ConquestTrainingFinished = function(msg)
|
||||
{
|
||||
if (msg.owner == 0 || !this.conquestClassFilter || !msg.entities.length || !msg.entities.every(elem => TriggerHelper.EntityHasClass(elem, this.conquestClassFilter)))
|
||||
return;
|
||||
|
||||
let player = msg.owner;
|
||||
if (!this.conquestEntitiesByPlayer[player])
|
||||
{
|
||||
warn("ConquestTrainingFinished: Unknown player " + player);
|
||||
return;
|
||||
}
|
||||
this.conquestEntitiesByPlayer[player].entities.push(...msg.entities);
|
||||
}
|
||||
|
||||
Trigger.prototype.ConquestStartGameCount = function()
|
||||
{
|
||||
if (!this.conquestClassFilter)
|
||||
{
|
||||
warn("ConquestStartGameCount: conquestClassFilter undefined");
|
||||
return;
|
||||
}
|
||||
|
||||
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
|
||||
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
||||
|
||||
cmpPlayerManager.GetAllPlayerEntities().forEach((elem, i) => {
|
||||
if (i == 0)
|
||||
return;
|
||||
|
||||
let filterEntity = ent => TriggerHelper.EntityHasClass(ent, this.conquestClassFilter)
|
||||
&& !Engine.QueryInterface(ent, IID_Foundation);
|
||||
this.conquestEntitiesByPlayer[i] = {"player" : elem, "entities" : [...cmpRangeManager.GetEntitiesByPlayer(i).filter(filterEntity)]};
|
||||
});
|
||||
|
||||
this.conquestDataInit = true;
|
||||
}
|
||||
|
||||
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
|
||||
|
||||
cmpTrigger.conquestEntitiesByPlayer = {};
|
||||
cmpTrigger.conquestDataInit = false;
|
||||
cmpTrigger.conquestClassFilter = "";
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
|
||||
cmpTrigger.conquestClassFilter = "Structure";
|
||||
|
||||
var data = {"enabled": true};
|
||||
cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
|
||||
cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data);
|
||||
|
||||
cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);
|
||||
8
binaries/data/mods/public/maps/scripts/ConquestUnits.js
Normal file
8
binaries/data/mods/public/maps/scripts/ConquestUnits.js
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
|
||||
cmpTrigger.conquestClassFilter = "Unit";
|
||||
|
||||
var data = {"enabled": true};
|
||||
cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
|
||||
cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data);
|
||||
|
||||
cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);
|
||||
|
|
@ -50,7 +50,7 @@ EndGameManager.prototype.MarkPlayerAsWon = function(playerID)
|
|||
if (playerID == cmpPlayer.GetPlayerID() || this.alliedVictory && cmpPlayer.IsMutualAlly(playerID))
|
||||
cmpPlayer.SetState("won")
|
||||
else
|
||||
Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );
|
||||
Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i, "skip": true } );
|
||||
}
|
||||
|
||||
// Reveal the map to all players
|
||||
|
|
@ -63,4 +63,41 @@ EndGameManager.prototype.SetAlliedVictory = function(flag)
|
|||
this.alliedVictory = flag;
|
||||
};
|
||||
|
||||
EndGameManager.prototype.OnGlobalPlayerDefeated = function(msg)
|
||||
{
|
||||
if (msg.skip)
|
||||
return;
|
||||
|
||||
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
|
||||
var cmpPlayers = [];
|
||||
|
||||
var allies = [];
|
||||
var onlyAlliesLeft = true;
|
||||
|
||||
var numPlayers = cmpPlayerManager.GetNumPlayers();
|
||||
|
||||
for (var i = 1; i < numPlayers; ++i)
|
||||
{
|
||||
cmpPlayers[i] = QueryPlayerIDInterface(i);
|
||||
if (cmpPlayers[i].GetState() != "active" || i == msg.playerId)
|
||||
return;
|
||||
|
||||
if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
|
||||
allies.push(i);
|
||||
else
|
||||
onlyAlliesLeft = false;
|
||||
}
|
||||
|
||||
// check if there are winners, or the game needs to continue
|
||||
if (!allies.length || !onlyAlliesLeft || !(this.alliedVictory || allies.length == 1))
|
||||
return;
|
||||
|
||||
for each (var p in allies)
|
||||
cmpPlayers[p].SetState("won");
|
||||
|
||||
// Reveal the map to all players
|
||||
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
|
||||
cmpRangeManager.SetLosRevealAll(-1, true);
|
||||
}
|
||||
|
||||
Engine.RegisterSystemComponentType(IID_EndGameManager, "EndGameManager", EndGameManager);
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ Player.prototype.Init = function()
|
|||
this.teamsLocked = false;
|
||||
this.state = "active"; // game state - one of "active", "defeated", "won"
|
||||
this.diplomacy = []; // array of diplomatic stances for this player with respect to other players (including gaia and self)
|
||||
this.conquestCriticalEntitiesCount = 0; // number of owned units with ConquestCritical class
|
||||
this.formations = [];
|
||||
this.startCam = undefined;
|
||||
this.controlAllUnits = false;
|
||||
|
|
@ -337,11 +336,6 @@ Player.prototype.SetState = function(newState)
|
|||
this.state = newState;
|
||||
};
|
||||
|
||||
Player.prototype.GetConquestCriticalEntitiesCount = function()
|
||||
{
|
||||
return this.conquestCriticalEntitiesCount;
|
||||
};
|
||||
|
||||
Player.prototype.GetTeam = function()
|
||||
{
|
||||
return this.team;
|
||||
|
|
@ -609,9 +603,6 @@ Player.prototype.OnGlobalOwnershipChanged = function(msg)
|
|||
|
||||
if (msg.from == this.playerID)
|
||||
{
|
||||
if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))
|
||||
this.conquestCriticalEntitiesCount--;
|
||||
|
||||
if (cmpCost)
|
||||
this.popUsed -= cmpCost.GetPopCost();
|
||||
|
||||
|
|
@ -625,9 +616,6 @@ Player.prototype.OnGlobalOwnershipChanged = function(msg)
|
|||
}
|
||||
if (msg.to == this.playerID)
|
||||
{
|
||||
if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))
|
||||
this.conquestCriticalEntitiesCount++;
|
||||
|
||||
if (cmpCost)
|
||||
this.popUsed += cmpCost.GetPopCost();
|
||||
|
||||
|
|
|
|||
|
|
@ -78,7 +78,6 @@ AddMock(100, IID_Player, {
|
|||
GetLockTeams: function() { return false; },
|
||||
GetCheatsEnabled: function() { return false; },
|
||||
GetDiplomacy: function() { return [-1, 1]; },
|
||||
GetConquestCriticalEntitiesCount: function() { return 1; },
|
||||
IsAlly: function() { return false; },
|
||||
IsMutualAlly: function() { return false; },
|
||||
IsNeutral: function() { return false; },
|
||||
|
|
@ -154,7 +153,6 @@ AddMock(101, IID_Player, {
|
|||
GetLockTeams: function() {return false; },
|
||||
GetCheatsEnabled: function() { return false; },
|
||||
GetDiplomacy: function() { return [-1, 1]; },
|
||||
GetConquestCriticalEntitiesCount: function() { return 1; },
|
||||
IsAlly: function() { return true; },
|
||||
IsMutualAlly: function() {return false; },
|
||||
IsNeutral: function() { return false; },
|
||||
|
|
|
|||
Loading…
Reference in a new issue