/** ** Define which units/upgrades are allowed. */ static int CclDefineAllow(lua_State *l) { const char *ident; const char *ids; int i; int n; int args; int j; int id; args = lua_gettop(l); for (j = 0; j < args; ++j) { ident = LuaToString(l, j + 1); ++j; ids = LuaToString(l, j + 1); n = strlen(ids); if (n > PlayerMax) { fprintf(stderr, "%s: Allow string too long %d\n", ident, n); n = PlayerMax; } if (!strncmp(ident, "unit-", 5)) { id = UnitTypeIdByIdent(ident); for (i = 0; i < n; ++i) { if (ids[i] == 'A') { AllowUnitId(&Players[i], id, UnitMax); } else if (ids[i] == 'F') { AllowUnitId(&Players[i], id, 0); } } } else if (!strncmp(ident, "upgrade-", 8)) { id = UpgradeIdByIdent(ident); for (i = 0; i < n; ++i) { AllowUpgradeId(&Players[i], id, ids[i]); } } else { DebugPrint(" wrong ident %s\n" _C_ ident); } } return 0; }
/** ** Handle that an upgrade was acquired. ** ** @param player Player researching the upgrade. ** @param upgrade Upgrade ready researched. */ void UpgradeAcquire(CPlayer &player, const CUpgrade *upgrade) { int id = upgrade->ID; player.UpgradeTimers.Upgrades[id] = upgrade->Costs[TimeCost]; AllowUpgradeId(player, id, 'R'); // research done for (int z = 0; z < NumUpgradeModifiers; ++z) { if (UpgradeModifiers[z]->UpgradeId == id) { ApplyUpgradeModifier(player, UpgradeModifiers[z]); } } // // Upgrades could change the buttons displayed. // if (&player == ThisPlayer) { SelectedUnitChanged(); } }
/** ** Apply researched upgrades when map is loading ** ** @return: void */ void ApplyUpgrades() { for (std::vector<CUpgrade *>::size_type j = 0; j < AllUpgrades.size(); ++j) { CUpgrade *upgrade = AllUpgrades[j]; if (upgrade) { for (int p = 0; p < PlayerMax; ++p) { if (Players[p].Allow.Upgrades[j] == 'R') { int id = upgrade->ID; Players[p].UpgradeTimers.Upgrades[id] = upgrade->Costs[TimeCost]; AllowUpgradeId(Players[p], id, 'R'); // research done for (int z = 0; z < NumUpgradeModifiers; ++z) { if (UpgradeModifiers[z]->UpgradeId == id) { ApplyUpgradeModifier(Players[p], UpgradeModifiers[z]); } } } } } } }
/** ** for now it will be empty? ** perhaps acquired upgrade can be lost if (for example) a building is lost ** (lumber mill? stronghold?) ** this function will apply all modifiers in reverse way */ void UpgradeLost(Player *player, int id) { player->UpgradeTimers.Upgrades[id] = 0; AllowUpgradeId(player, id, 'A'); // research is lost i.e. available // FIXME: here we should reverse apply upgrade... }