Files
starruler-linux/scripts/server/empire_ai/EmpireAI.as
T
2018-07-17 14:15:37 +02:00

171 lines
3.2 KiB
ActionScript

import settings.game_settings;
import AIController@ createBumAI() from "empire_ai.BumAI";
import AIController@ createBasicAI() from "empire_ai.BasicAI";
import AIController@ createWeaselAI() from "empire_ai.weasel.WeaselAI";
interface AIController {
void debugAI();
void commandAI(string cmd);
void aiPing(Empire@ fromEmpire, vec3d position, uint type);
void init(Empire& emp, EmpireSettings& settings);
void init(Empire& emp);
void tick(Empire& emp, double time);
void pause(Empire& emp);
void resume(Empire& emp);
void load(SaveFile& msg);
void save(SaveFile& msg);
int getDifficultyLevel();
vec3d get_aiFocus();
string getOpinionOf(Empire& emp, Empire@ other);
int getStandingTo(Empire& emp, Empire@ other);
}
class EmpireAI : Component_EmpireAI, Savable {
AIController@ ctrl;
uint aiType;
bool paused = false;
bool override = false;
EmpireAI() {
}
vec3d get_aiFocus() {
if(ctrl !is null)
return ctrl.aiFocus;
else
return vec3d();
}
int get_difficulty() {
if(ctrl !is null)
return ctrl.getDifficultyLevel();
else
return -1;
}
bool get_isAI(Empire& emp) {
return ctrl !is null && (emp.player is null || override);
}
string getRelation(Player& pl, Empire& emp) {
auto@ other = pl.emp;
if(ctrl is null || other is null || !other.valid || other.ContactMask.value & emp.mask == 0)
return "";
else
return ctrl.getOpinionOf(emp, other);
}
int getRelationState(Player& pl, Empire& emp) {
auto@ other = pl.emp;
if(ctrl is null || other is null || !other.valid || other.ContactMask.value & emp.mask == 0)
return 0;
else
return ctrl.getStandingTo(emp, other);
}
uint getAIType() {
return aiType;
}
void debugAI() {
if(ctrl !is null)
ctrl.debugAI();
}
void commandAI(string cmd) {
if(ctrl !is null)
ctrl.commandAI(cmd);
}
void load(SaveFile& msg) {
msg >> paused;
msg >> override;
msg >> aiType;
createAI(aiType);
if(ctrl !is null)
ctrl.load(msg);
}
void save(SaveFile& msg) {
msg << paused;
msg << override;
msg << aiType;
if(ctrl !is null)
ctrl.save(msg);
}
void createAI(uint type) {
aiType = type;
//Create the controller
switch(type) {
case ET_Player:
//Do nothing
break;
case ET_BumAI:
@ctrl = createBasicAI();
break;
case ET_WeaselAI:
@ctrl = createWeaselAI();
break;
}
}
void aiPing(Empire@ fromEmpire, vec3d position, uint type = 0) {
if(ctrl !is null)
ctrl.aiPing(fromEmpire, position, type);
}
void init(Empire& emp, EmpireSettings& settings) {
createAI(settings.type);
//Initialize
if(ctrl !is null)
ctrl.init(emp, settings);
}
void initBasicAI(Empire& emp) {
override = true;
if(ctrl !is null)
return;
createAI(ET_WeaselAI);
if(ctrl !is null) {
EmpireSettings settings;
settings.difficulty = 2;
settings.aiFlags |= AIF_Aggressive;
ctrl.init(emp, settings);
ctrl.init(emp);
}
}
void init(Empire& emp) {
if(ctrl !is null)
ctrl.init(emp);
}
void aiTick(Empire& emp, double tick) {
if(ctrl is null)
return;
if(emp.player is null || override) {
if(paused) {
ctrl.resume(emp);
paused = false;
}
ctrl.tick(emp, tick);
}
else {
if(!paused) {
ctrl.pause(emp);
paused = true;
}
}
}
};