Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
#include "include/region_effect_spec.as"
|
||||
|
||||
class _Type : RegionEffectType {
|
||||
_Type() {
|
||||
ident = "GrantVision";
|
||||
implementationClass = "GrantVision";
|
||||
}
|
||||
};
|
||||
|
||||
class GrantVision : RegionEffect {
|
||||
double timer = 0.0;
|
||||
|
||||
GrantVision(Empire@ emp, double timer) {
|
||||
@this.forEmpire = emp;
|
||||
this.timer = timer;
|
||||
@this.type = definition;
|
||||
}
|
||||
|
||||
#section server
|
||||
void save(SaveFile& file) override {
|
||||
file << timer;
|
||||
}
|
||||
|
||||
void load(SaveFile& file) override {
|
||||
file >> timer;
|
||||
}
|
||||
|
||||
bool tick(Region& region, double time) override {
|
||||
timer -= time;
|
||||
if(timer <= 0)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void start(Region& region) override {
|
||||
region.grantVision(forEmpire);
|
||||
}
|
||||
|
||||
void end(Region& region) override {
|
||||
region.revokeVision(forEmpire);
|
||||
}
|
||||
#section all
|
||||
};
|
||||
@@ -0,0 +1,24 @@
|
||||
#include "include/region_effect_spec.as"
|
||||
|
||||
class _Type : RegionEffectType {
|
||||
_Type() {
|
||||
ident = "ProtectedZone";
|
||||
implementationClass = "ProtectedZone";
|
||||
}
|
||||
};
|
||||
|
||||
class ProtectedZone : RegionEffect {
|
||||
bool tick(Region& region, double time) override {
|
||||
region.ProtectedMask |= forEmpire.mask;
|
||||
return true;
|
||||
}
|
||||
|
||||
void changeEffectOwner(Region& region, Empire@ prevOwner, Empire@ newOwner) override {
|
||||
region.ProtectedMask &= ~prevOwner.mask;
|
||||
region.ProtectedMask |= newOwner.mask;
|
||||
}
|
||||
|
||||
void end(Region& region) override {
|
||||
region.ProtectedMask &= ~forEmpire.mask;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,82 @@
|
||||
#include "include/region_effect_spec.as"
|
||||
|
||||
export ZealotRegion, ZealotRegionEffect, createZealotRegionEffect;
|
||||
const RegionEffectType@ get_ZealotRegion() {
|
||||
return definition;
|
||||
}
|
||||
|
||||
ZealotRegionEffect@ createZealotRegionEffect(Empire@ empire, Empire@ other) {
|
||||
ZealotRegionEffect eff;
|
||||
@eff.type = definition;
|
||||
@eff.forEmpire = empire;
|
||||
@eff.other = other;
|
||||
|
||||
return eff;
|
||||
}
|
||||
|
||||
class _Type : RegionEffectType {
|
||||
_Type() {
|
||||
ident = "ZealotRegion";
|
||||
implementationClass = "ZealotRegionEffect";
|
||||
}
|
||||
};
|
||||
|
||||
const uint MAX_PER_TICK = 100;
|
||||
const double STR_FACTOR = 0.5 / (6.0 * 60.0);
|
||||
|
||||
class ZealotRegionEffect : RegionEffect {
|
||||
Empire@ other;
|
||||
double accStr = 0.0;
|
||||
double storedTime = 0.0;
|
||||
|
||||
#section server
|
||||
void save(SaveFile& file) override {
|
||||
file << other;
|
||||
file << accStr;
|
||||
file << storedTime;
|
||||
}
|
||||
|
||||
void load(SaveFile& file) override {
|
||||
file >> other;
|
||||
file >> accStr;
|
||||
file >> storedTime;
|
||||
}
|
||||
|
||||
bool tick(Region& region, double time) override {
|
||||
storedTime += time;
|
||||
if(storedTime < 1.0)
|
||||
return true;
|
||||
|
||||
double str = region.getStrength(other) * STR_FACTOR * storedTime;
|
||||
accStr += str;
|
||||
storedTime = 0.0;
|
||||
|
||||
if(accStr > 1.0) {
|
||||
uint objCount = region.objectCount;
|
||||
uint index = randomi(0, objCount-1);
|
||||
uint cnt = min(objCount, MAX_PER_TICK);
|
||||
for(uint i = 0; i < cnt; ++i) {
|
||||
Ship@ obj = cast<Ship>(region.objects[i]);
|
||||
if(obj !is null && obj.owner is other) {
|
||||
//Check if we can take over this ship
|
||||
if(!obj.hasLeaderAI || obj.supportCount == 0) {
|
||||
double size = obj.blueprint.design.size;
|
||||
double chance = accStr / size;
|
||||
chance *= chance;
|
||||
|
||||
if(chance > 1.0 || randomd() < chance) {
|
||||
@obj.owner = forEmpire;
|
||||
accStr -= size;
|
||||
if(accStr < 1.0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
index = (index+1) % cnt;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#section all
|
||||
};
|
||||
Reference in New Issue
Block a user