Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,330 @@
|
||||
import resources;
|
||||
import tile_resources;
|
||||
import saving;
|
||||
|
||||
export ResourceSpecType;
|
||||
export ResourceSpec;
|
||||
export implementSpec;
|
||||
|
||||
export ImportData;
|
||||
export ExportData;
|
||||
|
||||
enum ResourceSpecType {
|
||||
RST_Specific,
|
||||
RST_Level_Specific,
|
||||
RST_Level_Minimum,
|
||||
RST_Pressure_Type,
|
||||
RST_Pressure_Level0,
|
||||
RST_Class,
|
||||
};
|
||||
|
||||
tidy final class ResourceSpec : Savable {
|
||||
uint type = RST_Specific;
|
||||
const ResourceType@ resource;
|
||||
const ResourceClass@ cls;
|
||||
uint level = 0;
|
||||
uint pressureType = 0;
|
||||
bool isLevelRequirement = false;
|
||||
bool isForImport = true;
|
||||
bool allowUniversal = true;
|
||||
|
||||
void save(SaveFile& file) {
|
||||
file << type;
|
||||
if(resource !is null) {
|
||||
file.write1();
|
||||
file.writeIdentifier(SI_Resource, resource.id);
|
||||
}
|
||||
else {
|
||||
file.write0();
|
||||
}
|
||||
if(cls !is null) {
|
||||
file.write1();
|
||||
file << cls.ident;
|
||||
}
|
||||
else {
|
||||
file.write0();
|
||||
}
|
||||
file << level;
|
||||
file << pressureType;
|
||||
file << isLevelRequirement;
|
||||
file << isForImport;
|
||||
file << allowUniversal;
|
||||
}
|
||||
|
||||
void load(SaveFile& file) {
|
||||
file >> type;
|
||||
if(file.readBit())
|
||||
@resource = getResource(file.readIdentifier(SI_Resource));
|
||||
if(file.readBit()) {
|
||||
string clsName;
|
||||
file >> clsName;
|
||||
@cls = getResourceClass(clsName);
|
||||
}
|
||||
file >> level;
|
||||
file >> pressureType;
|
||||
file >> isLevelRequirement;
|
||||
file >> isForImport;
|
||||
file >> allowUniversal;
|
||||
}
|
||||
|
||||
bool opEquals(const ResourceSpec& other) const {
|
||||
if(type != other.type)
|
||||
return false;
|
||||
if(isLevelRequirement != other.isLevelRequirement)
|
||||
return false;
|
||||
switch(type) {
|
||||
case RST_Specific:
|
||||
return other.resource is resource;
|
||||
case RST_Level_Specific:
|
||||
case RST_Level_Minimum:
|
||||
return other.level == level;
|
||||
case RST_Pressure_Type:
|
||||
case RST_Pressure_Level0:
|
||||
return other.pressureType == pressureType;
|
||||
case RST_Class:
|
||||
return other.cls is cls;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool meets(const ResourceType@ check, Object@ fromObj = null, Object@ toObj = null) const {
|
||||
if(check is null)
|
||||
return false;
|
||||
if(allowUniversal && isLevelRequirement) {
|
||||
if(check.mode == RM_UniversalUnique || check.mode == RM_Universal) {
|
||||
//HACK: The AI shouldn't use drugs for food and water
|
||||
switch(type) {
|
||||
case RST_Level_Specific:
|
||||
case RST_Level_Minimum:
|
||||
return level >= 2;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(isForImport && !check.exportable && (fromObj is null || fromObj !is toObj))
|
||||
return false;
|
||||
if(isLevelRequirement && check.mode == RM_NonRequirement)
|
||||
return false;
|
||||
switch(type) {
|
||||
case RST_Specific:
|
||||
return check is resource;
|
||||
case RST_Level_Specific:
|
||||
return check.level == level;
|
||||
case RST_Level_Minimum:
|
||||
return check.level >= level;
|
||||
case RST_Pressure_Type:
|
||||
return check.tilePressure[pressureType] >= max(check.totalPressure * 0.4, 1.0);
|
||||
case RST_Pressure_Level0:
|
||||
return check.level == 0 && check.tilePressure[pressureType] >= max(check.totalPressure * 0.4, 1.0);
|
||||
case RST_Class:
|
||||
return check.cls is cls;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool implements(const ResourceRequirement& req) const {
|
||||
if(!isLevelRequirement)
|
||||
return false;
|
||||
switch(req.type) {
|
||||
case RRT_Resource:
|
||||
return this.type == RST_Specific && this.resource is req.resource;
|
||||
case RRT_Class:
|
||||
case RRT_Class_Types:
|
||||
return this.type == RST_Class && this.cls is req.cls;
|
||||
case RRT_Level:
|
||||
case RRT_Level_Types:
|
||||
return this.type == RST_Level_Specific && this.level == req.level;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
string dump() {
|
||||
switch(type) {
|
||||
case RST_Specific:
|
||||
return resource.name;
|
||||
case RST_Level_Specific:
|
||||
return "Tier "+level;
|
||||
case RST_Level_Minimum:
|
||||
return "Tier "+level+"+";
|
||||
case RST_Pressure_Type:
|
||||
return "Any "+getTileResourceIdent(pressureType);
|
||||
case RST_Pressure_Level0:
|
||||
return "Level 0 "+getTileResourceIdent(pressureType);
|
||||
case RST_Class:
|
||||
return "Of "+cls.ident;
|
||||
}
|
||||
return "??";
|
||||
}
|
||||
|
||||
int get_resourceLevel() const {
|
||||
switch(type) {
|
||||
case RST_Specific:
|
||||
return 0;
|
||||
case RST_Level_Specific:
|
||||
return level;
|
||||
case RST_Level_Minimum:
|
||||
return level;
|
||||
case RST_Pressure_Type:
|
||||
return 0;
|
||||
case RST_Pressure_Level0:
|
||||
return 0;
|
||||
case RST_Class:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int opCmp(const ResourceSpec@ other) const {
|
||||
int level = this.resourceLevel;
|
||||
int otherLevel = other.resourceLevel;
|
||||
if(level > otherLevel)
|
||||
return 1;
|
||||
if(level < otherLevel)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
ResourceSpec@ implementSpec(const ResourceRequirement& req) {
|
||||
ResourceSpec spec;
|
||||
spec.isLevelRequirement = true;
|
||||
|
||||
switch(req.type) {
|
||||
case RRT_Resource:
|
||||
spec.type = RST_Specific;
|
||||
@spec.resource = req.resource;
|
||||
break;
|
||||
case RRT_Class:
|
||||
case RRT_Class_Types:
|
||||
spec.type = RST_Class;
|
||||
@spec.cls = req.cls;
|
||||
break;
|
||||
case RRT_Level:
|
||||
case RRT_Level_Types:
|
||||
spec.type = RST_Level_Specific;
|
||||
spec.level = req.level;
|
||||
break;
|
||||
}
|
||||
return spec;
|
||||
}
|
||||
|
||||
tidy final class ImportData : Savable {
|
||||
int id = -1;
|
||||
Object@ obj;
|
||||
ResourceSpec@ spec;
|
||||
const ResourceType@ resource;
|
||||
Object@ fromObject;
|
||||
int resourceId = -1;
|
||||
bool beingMet = false;
|
||||
bool forLevel = false;
|
||||
bool cycled = false;
|
||||
bool isColonizing = false;
|
||||
bool claimedFor = false;
|
||||
double idleSince = 0.0;
|
||||
|
||||
void save(SaveFile& file) {
|
||||
file << obj;
|
||||
file << spec;
|
||||
if(resource !is null) {
|
||||
file.write1();
|
||||
file.writeIdentifier(SI_Resource, resource.id);
|
||||
}
|
||||
else {
|
||||
file.write0();
|
||||
}
|
||||
file << fromObject;
|
||||
file << resourceId;
|
||||
file << beingMet;
|
||||
file << forLevel;
|
||||
file << cycled;
|
||||
file << isColonizing;
|
||||
file << claimedFor;
|
||||
file << idleSince;
|
||||
}
|
||||
|
||||
void load(SaveFile& file) {
|
||||
file >> obj;
|
||||
@spec = ResourceSpec();
|
||||
file >> spec;
|
||||
if(file.readBit())
|
||||
@resource = getResource(file.readIdentifier(SI_Resource));
|
||||
file >> fromObject;
|
||||
file >> resourceId;
|
||||
file >> beingMet;
|
||||
file >> forLevel;
|
||||
file >> cycled;
|
||||
file >> isColonizing;
|
||||
file >> claimedFor;
|
||||
file >> idleSince;
|
||||
}
|
||||
|
||||
void set(ExportData@ source) {
|
||||
@fromObject = source.obj;
|
||||
resourceId = source.resourceId;
|
||||
@resource = source.resource;
|
||||
}
|
||||
|
||||
int opCmp(const ImportData@ other) const {
|
||||
return spec.opCmp(other.spec);
|
||||
}
|
||||
|
||||
bool get_isOpen() const {
|
||||
return !beingMet;
|
||||
}
|
||||
};
|
||||
|
||||
tidy final class ExportData : Savable {
|
||||
int id = -1;
|
||||
Object@ obj;
|
||||
const ResourceType@ resource;
|
||||
int resourceId = -1;
|
||||
ImportData@ request;
|
||||
Object@ developUse;
|
||||
bool localOnly = false;
|
||||
|
||||
bool get_usable() const {
|
||||
if(obj is null)
|
||||
return false;
|
||||
if(resourceId == obj.primaryResourceId)
|
||||
return obj.primaryResourceUsable;
|
||||
else
|
||||
return obj.getNativeResourceUsableByID(resourceId);
|
||||
}
|
||||
|
||||
bool get_isPrimary() const {
|
||||
return resourceId == obj.primaryResourceId;
|
||||
}
|
||||
|
||||
bool isExportedTo(Object@ check) const {
|
||||
if(check is obj)
|
||||
return true;
|
||||
if(resourceId == obj.primaryResourceId)
|
||||
return obj.isPrimaryDestination(check);
|
||||
else
|
||||
return obj.getNativeResourceDestinationByID(obj.owner, resourceId) is check;
|
||||
}
|
||||
|
||||
void save(SaveFile& file) {
|
||||
//Does not save the request link, this is done by Resources
|
||||
file << obj;
|
||||
if(resource !is null) {
|
||||
file.write1();
|
||||
file.writeIdentifier(SI_Resource, resource.id);
|
||||
}
|
||||
else {
|
||||
file.write0();
|
||||
}
|
||||
file << resourceId;
|
||||
file << developUse;
|
||||
file << localOnly;
|
||||
}
|
||||
|
||||
void load(SaveFile& file) {
|
||||
file >> obj;
|
||||
if(file.readBit())
|
||||
@resource = getResource(file.readIdentifier(SI_Resource));
|
||||
file >> resourceId;
|
||||
file >> developUse;
|
||||
file >> localOnly;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user