Files
2018-07-17 14:15:37 +02:00

89 lines
1.9 KiB
ActionScript

import construction.Constructible;
import buildings;
import saving;
tidy class BuildingConstructible : Constructible {
vec2i position;
const BuildingType@ building;
bool isTimed = false;
double timeProgress = 0;
BuildingConstructible(Object& obj, vec2i pos, const BuildingType@ type) {
position = pos;
@building = type;
totalLabor = type.laborCost;
if(totalLabor == 0) {
totalLabor = max(type.buildTime, 1.0) / obj.buildingConstructRate / obj.owner.BuildingConstructRate / obj.owner.ImperialBldConstructionRate;
isTimed = true;
}
}
BuildingConstructible(SaveFile& file) {
Constructible::load(file);
uint id = file.readIdentifier(SI_Building);
@building = getBuildingType(id);
file >> position;
if(file >= SV_0149) {
file >> isTimed;
file >> timeProgress;
}
}
void save(SaveFile& file) {
Constructible::save(file);
file.writeIdentifier(SI_Building, building.id);
file << position;
file << isTimed;
file << timeProgress;
}
ConstructibleType get_type() {
return CT_Building;
}
bool get_canComplete() {
return !isTimed || timeProgress >= totalLabor;
}
string get_name() {
return building.name;
}
TickResult tick(Object& obj, double time) override {
if(!building.canProgress(obj))
return TR_UnusedLabor;
if(isTimed) {
timeProgress += time;
curLabor = timeProgress;
}
double progress = curLabor / max(totalLabor, 0.001);
obj.setBuildingCompletion(position.x, position.y, progress);
return isTimed ? TR_VanishLabor : TR_UsedLabor;
}
void cancel(Object& obj) {
Constructible::cancel(obj);
vec2i pos = position;
position = vec2i(-1, -1);
obj.forceDestroyBuilding(pos);
}
void complete(Object& obj) {
obj.setBuildingCompletion(position.x, position.y, 1.f);
}
void write(Message& msg) {
Constructible::write(msg);
msg << building.id;
msg << isTimed;
}
bool repeat(Object& obj) {
return false;
}
};