233 lines
5.0 KiB
ActionScript
233 lines
5.0 KiB
ActionScript
import resources;
|
|
|
|
tidy class ResourceManager : Component_ResourceManager {
|
|
Mutex budgetMutex;
|
|
Mutex ftlMutex;
|
|
Mutex energyMutex;
|
|
|
|
double Population = 0;
|
|
|
|
double FTL_Capacity = 0;
|
|
double FTL_Stored = 0;
|
|
double FTL_Income = 0;
|
|
double FTL_Use = 0;
|
|
|
|
double Energy_Stored = 0;
|
|
double Energy_Income = 0;
|
|
double Energy_Use = 0;
|
|
double Energy_Allocated = 0;
|
|
|
|
uint welfareMode = WM_Influence;
|
|
int Budget_Total = 0;
|
|
int Maintenance = 0;
|
|
int PrevBudget = 0;
|
|
int PrevMaintenance = 0;
|
|
int Budget_Remaining = 0;
|
|
int Budget_Forward = 0;
|
|
int Budget_CycleId = 0;
|
|
int Budget_Bonus = 0;
|
|
double Budget_Cycle = 3.0 * 60.0;
|
|
double Budget_Tick = Budget_Cycle;
|
|
double Borrow_Rate = 1.5;
|
|
|
|
array<int> moneyTypes = array<int>(MoT_COUNT, 0);
|
|
|
|
//Population
|
|
double get_EstTotalPopulation() const {
|
|
return max(round(Population / 10.0), 1.0) * 10.0;
|
|
}
|
|
|
|
double get_TotalPopulation() const {
|
|
return Population;
|
|
}
|
|
|
|
//FTL
|
|
double get_FTLIncome() {
|
|
return FTL_Income;
|
|
}
|
|
|
|
double get_FTLStored() {
|
|
return FTL_Stored;
|
|
}
|
|
|
|
double get_FTLUse(const Empire& emp) {
|
|
return FTL_Use * emp.FTLCostFactor;
|
|
}
|
|
|
|
double get_FTLCapacity() {
|
|
return FTL_Capacity;
|
|
}
|
|
|
|
bool get_FTLShortage(const Empire& emp) const {
|
|
return FTL_Stored <= 0.0001 && (FTL_Use * emp.FTLCostFactor) > FTL_Income + 0.0001;
|
|
}
|
|
|
|
bool isFTLShortage(const Empire& emp, double amt) const {
|
|
if(FTL_Use + amt <= FTL_Income + 0.0001)
|
|
return false;
|
|
|
|
//Only not a shortage if we can run it for at least a minute
|
|
double cons = (FTL_Use + amt) * emp.FTLCostFactor * 60.0;
|
|
double have = FTL_Stored + FTL_Income * 60.0;
|
|
return cons >= have;
|
|
}
|
|
|
|
//Energy
|
|
double get_EnergyIncome() {
|
|
return Energy_Income;
|
|
}
|
|
|
|
double get_EnergyStored() {
|
|
return Energy_Stored;
|
|
}
|
|
|
|
double get_EnergyUse() {
|
|
return Energy_Use;
|
|
}
|
|
|
|
double get_EnergyEfficiency(Empire& emp) {
|
|
return pow(0.5, max(Energy_Stored + Energy_Allocated - emp.FreeEnergyStorage, 0.0) / config::ENERGY_EFFICIENCY_STEP);
|
|
}
|
|
|
|
bool get_EnergyShortage() {
|
|
return Energy_Stored <= 0.0001 && Energy_Use > EnergyIncome + 0.0001;
|
|
}
|
|
|
|
bool isEnergyShortage(double amt) {
|
|
if(Energy_Use + amt <= EnergyIncome + 0.0001)
|
|
return false;
|
|
|
|
//Only not a shortage if we can run it for at least a minute
|
|
double cons = (Energy_Use + amt) * 60.0;
|
|
double have = Energy_Stored + EnergyIncome * 60.0;
|
|
return cons >= have;
|
|
}
|
|
|
|
bool consumeEnergyUse(double amt) {
|
|
Lock lock(energyMutex);
|
|
if(Energy_Use + amt <= EnergyIncome + 0.0001) {
|
|
Energy_Use += amt;
|
|
return true;
|
|
}
|
|
|
|
//Only not a shortage if we can run it for at least a minute
|
|
double cons = (Energy_Use + amt) * 60.0;
|
|
double have = Energy_Stored + EnergyIncome * 60.0;
|
|
if(cons >= have)
|
|
return false;
|
|
|
|
Energy_Use += amt;
|
|
return true;
|
|
}
|
|
|
|
//Budget
|
|
int getMoneyFromType(uint type) {
|
|
if(type < MoT_COUNT)
|
|
return moneyTypes[type];
|
|
return 0;
|
|
}
|
|
|
|
int get_TotalBudget() {
|
|
return Budget_Total;
|
|
}
|
|
|
|
int get_MaintenanceBudget() {
|
|
return Maintenance;
|
|
}
|
|
|
|
int get_RemainingBudget() {
|
|
return Budget_Remaining;
|
|
}
|
|
|
|
int get_ForwardBudget() {
|
|
return Budget_Forward;
|
|
}
|
|
|
|
int get_BonusBudget() {
|
|
return Budget_Bonus;
|
|
}
|
|
|
|
double get_BorrowRate() {
|
|
return Borrow_Rate;
|
|
}
|
|
|
|
double get_BudgetCycle() {
|
|
return Budget_Cycle;
|
|
}
|
|
|
|
double get_BudgetTimer() {
|
|
return Budget_Tick;
|
|
}
|
|
|
|
float get_DebtFactor() {
|
|
if(Budget_Remaining >= 0)
|
|
return 0.f;
|
|
if(Budget_Total < 100)
|
|
return float(-Budget_Remaining) / 100.f;
|
|
return float(-Budget_Remaining) / float(Budget_Total);
|
|
}
|
|
|
|
int get_EstNextBudget() const {
|
|
int budget = Budget_Total - Maintenance + Budget_Forward + Budget_Bonus;
|
|
budget += min(Budget_Remaining - min(PrevBudget - PrevMaintenance, 0), 0);
|
|
return budget;
|
|
}
|
|
|
|
int getEstBudgetConsuming(int amount) const {
|
|
int budget = Budget_Total - Maintenance + Budget_Forward + max(Budget_Bonus - amount, 0);
|
|
budget += min(Budget_Remaining - amount - min(PrevBudget - PrevMaintenance, 0), 0);
|
|
return budget;
|
|
}
|
|
|
|
int get_BudgetCycleId() {
|
|
return Budget_CycleId;
|
|
}
|
|
|
|
uint get_WelfareMode() const {
|
|
return welfareMode;
|
|
}
|
|
|
|
bool canBorrow(int amount) const {
|
|
amount = ceil(double(amount) * Borrow_Rate);
|
|
return EstNextBudget >= amount;
|
|
}
|
|
|
|
bool canPay(int amount) const {
|
|
if(amount <= Budget_Remaining)
|
|
return true;
|
|
return canBorrow(amount - Budget_Remaining);
|
|
}
|
|
|
|
//Networking
|
|
void readResources(Empire& emp, Message& msg) {
|
|
Population = msg.read_float();
|
|
|
|
FTL_Capacity = msg.read_float();
|
|
FTL_Stored = msg.read_float();
|
|
FTL_Income = msg.read_float();
|
|
FTL_Use = msg.read_float();
|
|
|
|
Energy_Stored = msg.read_float();
|
|
Energy_Income = msg.read_float();
|
|
Energy_Use = msg.read_float();
|
|
Energy_Allocated = msg.read_float();
|
|
|
|
msg >> Budget_Total;
|
|
msg >> Maintenance;
|
|
msg >> PrevMaintenance;
|
|
msg >> PrevBudget;
|
|
msg >> Budget_Remaining;
|
|
msg >> Budget_Forward;
|
|
msg >> Budget_Bonus;
|
|
msg >> Budget_CycleId;
|
|
Budget_Cycle = msg.read_float();
|
|
Budget_Tick = msg.read_float();
|
|
Borrow_Rate = msg.read_float();
|
|
|
|
for(uint i = 0; i < MoT_COUNT; ++i)
|
|
moneyTypes[i] = msg.readSignedSmall();
|
|
|
|
welfareMode = msg.readLimited(WM_COUNT-1);
|
|
}
|
|
};
|