Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
import saving;
|
||||
from empire import majorEmpireCount;
|
||||
import bool getCheatsEverOn() from "cheats";
|
||||
import systems;
|
||||
|
||||
bool hasGameEnded = false;
|
||||
|
||||
void save(SaveFile& file) {
|
||||
file << hasGameEnded;
|
||||
}
|
||||
|
||||
void load(SaveFile& file) {
|
||||
if(file >= SV_0078)
|
||||
file >> hasGameEnded;
|
||||
}
|
||||
|
||||
bool hasGameEnded_client() {
|
||||
return hasGameEnded;
|
||||
}
|
||||
|
||||
void declareVictor(Empire@ emp) {
|
||||
hasGameEnded = true;
|
||||
gameSpeed = 0.0;
|
||||
serverEndGame(ALL_PLAYERS);
|
||||
|
||||
if(emp !is null) {
|
||||
emp.Victory = 1;
|
||||
|
||||
int maxDiff = -1;
|
||||
int maxCheats = 0;
|
||||
bool achieve = systemCount >= 10 && !getCheatsEverOn() && config::GAME_TIME_LIMIT <= 0.01;
|
||||
for(uint i = 0, cnt = getEmpireCount(); i < cnt; ++i) {
|
||||
Empire@ other = getEmpire(i);
|
||||
if(other.major && (emp.team < 0 || emp.team != other.team)) {
|
||||
if(other.difficulty >= maxDiff) {
|
||||
if(other.difficulty != maxDiff)
|
||||
maxCheats = 0;
|
||||
maxDiff = other.difficulty;
|
||||
if(other.cheatLevel > maxCheats)
|
||||
maxCheats = other.cheatLevel;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(emp is playerEmpire) {
|
||||
if(achieve) {
|
||||
if(maxDiff >= 0)
|
||||
unlockAchievement("ACH_WIN_EASY");
|
||||
if(maxDiff >= 1)
|
||||
unlockAchievement("ACH_WIN_MEDIUM");
|
||||
if(maxDiff >= 2)
|
||||
unlockAchievement("ACH_WIN_HARD");
|
||||
if(maxDiff >= 2 && maxCheats >= 1)
|
||||
unlockAchievement("ACH_WIN_SAVAGE");
|
||||
if(maxDiff >= 2 && maxCheats >= 4)
|
||||
unlockAchievement("ACH_WIN_INSANE");
|
||||
}
|
||||
}
|
||||
else if(emp.player !is null) {
|
||||
if(achieve) {
|
||||
if(maxDiff >= 0)
|
||||
clientAchievement(emp.player, "ACH_WIN_EASY");
|
||||
if(maxDiff >= 1)
|
||||
clientAchievement(emp.player, "ACH_WIN_MEDIUM");
|
||||
if(maxDiff >= 2)
|
||||
clientAchievement(emp.player, "ACH_WIN_HARD");
|
||||
if(maxDiff >= 2 && maxCheats >= 1)
|
||||
clientAchievement(emp.player, "ACH_WIN_SAVAGE");
|
||||
if(maxDiff >= 2 && maxCheats >= 4)
|
||||
clientAchievement(emp.player, "ACH_WIN_INSANE");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void tick(double time) {
|
||||
if(hasGameEnded) {
|
||||
for(uint i = 0, cnt = getEmpireCount(); i < cnt; ++i) {
|
||||
Empire@ emp = getEmpire(i);
|
||||
emp.visionMask = ~0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(gameTime < 5.0)
|
||||
return;
|
||||
|
||||
if((!mpServer && playerEmpire.Victory == -1)
|
||||
|| (config::GAME_TIME_LIMIT > 0.01 && gameTime >= config::GAME_TIME_LIMIT*60.0)) {
|
||||
Empire@ winner;
|
||||
int bestPts = INT_MIN;
|
||||
for(uint i = 0, cnt = getEmpireCount(); i < cnt; ++i) {
|
||||
Empire@ emp = getEmpire(i);
|
||||
if(emp.major && emp.SubjugatedBy is null && emp.Victory == 0) {
|
||||
int pts = emp.points.value;
|
||||
if(pts > bestPts) {
|
||||
bestPts = pts;
|
||||
@winner = emp;
|
||||
}
|
||||
}
|
||||
}
|
||||
declareVictor(winner);
|
||||
return;
|
||||
}
|
||||
|
||||
uint aliveAlone = 0;
|
||||
set_int aliveTeams;
|
||||
int aliveTeam = -1;
|
||||
|
||||
uint players = 0;
|
||||
set_int teams;
|
||||
|
||||
bool foundVictor = false;
|
||||
for(uint i = 0, cnt = getEmpireCount(); i < cnt; ++i) {
|
||||
Empire@ other = getEmpire(i);
|
||||
if(!other.major)
|
||||
continue;
|
||||
if(other.team < 0)
|
||||
players += 1;
|
||||
else
|
||||
teams.insert(other.team);
|
||||
|
||||
if(other.Victory == 0) {
|
||||
if(other.TotalPlanets.value == 0)
|
||||
other.Victory = -1;
|
||||
else if(other.SubjugatedBy !is null)
|
||||
other.Victory = -2;
|
||||
}
|
||||
|
||||
if(other.Victory >= 0) {
|
||||
if(other.SubjugatedBy is null) {
|
||||
if(other.team < 0)
|
||||
aliveAlone += 1;
|
||||
else {
|
||||
aliveTeams.insert(other.team);
|
||||
aliveTeam = other.team;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(other.Victory == 1)
|
||||
foundVictor = true;
|
||||
}
|
||||
|
||||
if(players + teams.size() > 1 && !foundVictor && aliveAlone + aliveTeams.size() == 1) {
|
||||
for(uint i = 0, cnt = getEmpireCount(); i < cnt; ++i) {
|
||||
Empire@ other = getEmpire(i);
|
||||
if(!other.major)
|
||||
continue;
|
||||
if(other.Victory >= 0)
|
||||
declareVictor(other);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void syncInitial(Message& msg) {
|
||||
msg << hasGameEnded;
|
||||
}
|
||||
Reference in New Issue
Block a user