119 lines
2.6 KiB
ActionScript
119 lines
2.6 KiB
ActionScript
import construction.Constructible;
|
|
import constructions;
|
|
import resources;
|
|
|
|
tidy class ConstructionConstructible : Constructible {
|
|
Construction@ cons;
|
|
bool isTimed = false;
|
|
double timeProgress = 0;
|
|
|
|
ConstructionConstructible(Object& obj, const ConstructionType@ type, const Targets@ targs) {
|
|
@cons = Construction(type);
|
|
cons.targets = targs;
|
|
@cons.obj = obj;
|
|
|
|
buildCost = type.getBuildCost(obj, targs);
|
|
maintainCost = type.getMaintainCost(obj, targs);
|
|
totalLabor = type.getLaborCost(obj, targs);
|
|
if(totalLabor == 0) {
|
|
totalLabor = max(type.getTimeCost(obj, targs), 1.0);
|
|
isTimed = true;
|
|
}
|
|
}
|
|
|
|
bool get_canComplete() {
|
|
return !isTimed || timeProgress >= totalLabor;
|
|
}
|
|
|
|
bool repeat(Object& obj) {
|
|
if(!Constructible::repeat(obj))
|
|
return false;
|
|
if(!cons.type.canBuild(obj, cons.targets))
|
|
return false;
|
|
buildCost = cons.type.getBuildCost(obj, cons.targets);
|
|
maintainCost = cons.type.getMaintainCost(obj, cons.targets);
|
|
totalLabor = cons.type.getLaborCost(obj, cons.targets);
|
|
if(totalLabor == 0) {
|
|
totalLabor = max(cons.type.getTimeCost(obj, cons.targets), 1.0);
|
|
isTimed = true;
|
|
}
|
|
else {
|
|
isTimed = false;
|
|
}
|
|
timeProgress = 0;
|
|
return true;
|
|
}
|
|
|
|
bool pay(Object& obj) {
|
|
for(uint i = 0, cnt = cons.type.hooks.length; i < cnt; ++i) {
|
|
if(!cons.type.hooks[i].consume(cons, cons.data[i], cons.targets)) {
|
|
for(uint j = 0; j < i; ++j)
|
|
cons.type.hooks[j].reverse(cons, cons.data[j], cons.targets);
|
|
return false;
|
|
}
|
|
}
|
|
if(buildCost != 0) {
|
|
if(cons.type.alwaysBorrowable && !repeated) {
|
|
budgetCycle = obj.owner.lowerBudget(buildCost);
|
|
}
|
|
else {
|
|
budgetCycle = obj.owner.consumeBudget(buildCost, borrow=!repeated);
|
|
if(budgetCycle == -1)
|
|
return false;
|
|
}
|
|
}
|
|
paid = true;
|
|
cons.start(this);
|
|
return true;
|
|
}
|
|
|
|
ConstructionConstructible(SaveFile& file) {
|
|
Constructible::load(file);
|
|
@cons = Construction();
|
|
file >> cons;
|
|
if(file >= SV_0110) {
|
|
file >> isTimed;
|
|
file >> timeProgress;
|
|
}
|
|
}
|
|
|
|
void save(SaveFile& file) {
|
|
Constructible::save(file);
|
|
file << cons;
|
|
file << isTimed;
|
|
file << timeProgress;
|
|
}
|
|
|
|
ConstructibleType get_type() {
|
|
return CT_Construction;
|
|
}
|
|
|
|
string get_name() {
|
|
return cons.type.name;
|
|
}
|
|
|
|
TickResult tick(Object& obj, double time) override {
|
|
if(isTimed) {
|
|
timeProgress += time;
|
|
curLabor = timeProgress;
|
|
}
|
|
cons.tick(this, time);
|
|
return isTimed ? TR_VanishLabor : TR_UsedLabor;
|
|
}
|
|
|
|
void cancel(Object& obj) override {
|
|
Constructible::cancel(obj);
|
|
cons.cancel(this);
|
|
}
|
|
|
|
void complete(Object& obj) {
|
|
cons.finish(this);
|
|
}
|
|
|
|
void write(Message& msg) {
|
|
Constructible::write(msg);
|
|
msg << cons.type.id;
|
|
msg << isTimed;
|
|
}
|
|
};
|