#pragma once
/*
* Copyright 2010-2016 OpenXcom Developers.
*
* This file is part of OpenXcom.
*
* OpenXcom is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenXcom is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenXcom. If not, see .
*/
#include "Target.h"
#include
#include
#include
namespace OpenXcom
{
class Mod;
class BaseFacility;
class Soldier;
class Craft;
class ItemContainer;
class Transfer;
class Language;
class Mod;
class SavedGame;
class ResearchProject;
class Production;
class Vehicle;
/**
* Represents a player base on the globe.
* Bases can contain facilities, personnel, crafts and equipment.
*/
class Base : public Target
{
private:
static const int BASE_SIZE = 6;
const Mod *_mod;
std::vector _facilities;
std::vector _soldiers;
std::vector _crafts;
std::vector _transfers;
ItemContainer *_items;
int _scientists, _engineers;
std::vector _research;
std::vector _productions;
bool _inBattlescape;
bool _retaliationTarget;
std::vector _vehicles;
std::vector _defenses;
/// Determines space taken up by ammo clips about to rearm craft.
double getIgnoredStores();
/// Gets the base's default name (unused).
std::wstring getDefaultName(Language *) const { return L""; }
using Target::load;
public:
/// Creates a new base.
Base(const Mod *mod);
/// Cleans up the base.
~Base();
/// Loads the base from YAML.
void load(const YAML::Node& node, SavedGame *save, bool newGame, bool newBattleGame = false);
/// Saves the base to YAML.
YAML::Node save() const;
/// Saves the base's ID to YAML.
YAML::Node saveId() const;
/// Gets the base's name.
std::wstring getName(Language *lang = 0) const;
/// Gets the base's marker.
int getMarker() const;
/// Gets the base's facilities.
std::vector *getFacilities();
/// Gets the base's soldiers.
std::vector *getSoldiers();
/// Gets the base's crafts.
std::vector *getCrafts();
/// Gets the base's transfers.
std::vector *getTransfers();
/// Gets the base's items.
ItemContainer *getStorageItems();
/// Gets the base's scientists.
int getScientists() const;
/// Sets the base's scientists.
void setScientists(int scientists);
/// Gets the base's engineers.
int getEngineers() const;
/// Sets the base's engineers.
void setEngineers(int engineers);
/// Checks if a target is detected by the base's radar.
int detect(Target *target) const;
/// Checks if a target is inside the base's radar range.
int insideRadarRange(Target *target) const;
/// Gets the base's available soldiers.
int getAvailableSoldiers(bool checkCombatReadiness = false) const;
/// Gets the base's total soldiers.
int getTotalSoldiers() const;
/// Gets the base's available scientists.
int getAvailableScientists() const;
/// Gets the base's total scientists.
int getTotalScientists() const;
/// Gets the base's available engineers.
int getAvailableEngineers() const;
/// Gets the base's total engineers.
int getTotalEngineers() const;
/// Gets the base's used living quarters.
int getUsedQuarters() const;
/// Gets the base's available living quarters.
int getAvailableQuarters() const;
/// Gets the base's used storage space.
double getUsedStores();
/// Checks if the base's stores are overfull.
bool storesOverfull(double offset = 0.0);
/// Gets the base's available storage space.
int getAvailableStores() const;
/// Gets the base's used laboratory space.
int getUsedLaboratories() const;
/// Gets the base's available laboratory space.
int getAvailableLaboratories() const;
/// Gets the base's used workshop space.
int getUsedWorkshops() const;
/// Gets the base's available workshop space.
int getAvailableWorkshops() const;
/// Gets the base's used hangars.
int getUsedHangars() const;
/// Gets the base's available hangars.
int getAvailableHangars() const;
/// Get the number of available space lab (not used by a ResearchProject)
int getFreeLaboratories() const;
/// Get the number of available space lab (not used by a Production)
int getFreeWorkshops() const;
int getAllocatedScientists() const;
int getAllocatedEngineers() const;
/// Gets the base's defense value.
int getDefenseValue() const;
/// Gets the base's short range detection.
int getShortRangeDetection() const;
/// Gets the base's long range detection.
int getLongRangeDetection() const;
/// Gets the base's crafts of a certain type.
int getCraftCount(const std::string &craft) const;
/// Gets the base's craft maintenance.
int getCraftMaintenance() const;
/// Gets the base's soldiers of a certain type.
int getSoldierCount(const std::string &soldier) const;
/// Gets the base's personnel maintenance.
int getPersonnelMaintenance() const;
/// Gets the base's facility maintenance.
int getFacilityMaintenance() const;
/// Gets the base's total monthly maintenance.
int getMonthlyMaintenace() const;
/// Get the list of base's ResearchProject
const std::vector & getResearch() const;
/// Add a new ResearchProject to the Base
void addResearch(ResearchProject *);
/// Remove a ResearchProject from the Base
void removeResearch(ResearchProject *);
/// Add a new Production to Base
void addProduction (Production * p);
/// Remove a Base Production's
void removeProduction (Production * p);
/// Get the list of Base Production's
const std::vector & getProductions() const;
/// Checks if this base is hyper-wave equipped.
bool getHyperDetection() const;
/// Gets the base's used psi lab space.
int getUsedPsiLabs() const;
/// Gets the base's total available psi lab space.
int getAvailablePsiLabs() const;
/// Gets the base's total free psi lab space.
int getFreePsiLabs() const;
/// Gets the amount of free Containment space.
int getFreeContainment() const;
/// Gets the total amount of Containment space.
int getAvailableContainment() const;
/// Gets the total amount of used Containment space.
int getUsedContainment() const;
/// Sets the craft's battlescape status.
void setInBattlescape(bool inbattle);
/// Gets if the craft is in battlescape.
bool isInBattlescape() const;
/// Mark this base for alien retaliation.
void setRetaliationTarget(bool mark = true);
/// Gets the retaliation status of this base.
bool getRetaliationTarget() const;
/// Get the detection chance for this base.
size_t getDetectionChance() const;
/// Gets how many Grav Shields the base has
int getGravShields() const;
/// Setup base defenses.
void setupDefenses();
/// Get a list of Defensive Facilities
std::vector *getDefenses();
/// Gets the base's vehicles.
std::vector *getVehicles();
/// Destroys all disconnected facilities in the base.
void destroyDisconnectedFacilities();
/// Gets a sorted list of the facilities(=iterators) NOT connected to the Access Lift.
std::list::iterator> getDisconnectedFacilities(BaseFacility *remove);
/// destroy a facility and deal with the side effects.
void destroyFacility(std::vector::iterator facility);
/// Cleans up the defenses vector and optionally reclaims the tanks and their ammo.
void cleanupDefenses(bool reclaimItems);
};
}