#define MAX_FACILITY_NUM 133
#define MAX_TECHNOLOGY_NUM 89
#define MAX_FACT_NUM 8
#define MAX_SP_NUM 64
#define MAX_BASE_NUM 2048
class SMACX_CORE {
public:
enum game_diff_level {
DIFF_CITIZEN,
DIFF_SPECIALIST,
DIFF_TALENT,
DIFF_LIBRARIAN,
DIFF_THINKER,
DIFF_TRANSCEND
};
enum game_rules_2 : DWORD {
TECH_STAGNATION = 0x20,
INTENSE_RIVALRY = 0x40,
IRONMAN = 0x400,
VICTORY_HIGHER_GOAL = 0x800,
DISABLE_SP_PRODUCTION = 0x80000000,
};
enum faction_special_rules : DWORD {
FACT_TECHSTEAL = 0x10,
FACT_TECHSHARE = 0x20,
FACT_WORMPOLICE = 0x40,
FACT_ALIEN = 0x80,
FACT_AQUATIC = 0x100,
FACT_FREEPROTO = 0x200,
FACT_FANATIC = 0x400,
FACT_MINDCONTROL = 0x800,
FACT_COMMFREQ = 0x1000,
FACT_TERRAFORM = 0x2000,
FACT_INTEREST = 0x4000,
FACT_MORALE = 0x8000,
};
};
class BASE_Management {
public:
enum facility_id {
FACL_HEADQUARTERS = 1,
FACL_CHILDREN_CRECHE = 2,
FACL_RECYCLING_TANKS = 3,
FACL_PERIMETER_DEFENSE = 4,
FACL_TACHYON_FIELD = 5,
FACL_RECREATION_COMMONS = 6,
FACL_ENERGY_BANK = 7,
FACL_NETWORK_NODE = 8,
FACL_BIOLOGY_LAB = 9,
FACL_SKUNKWORKS = 10,
FACL_HOLOGRAM_THEATRE = 11,
FACL_PARADISE_GARDEN = 12,
FACL_TREE_FARM = 13,
FACL_HYBRID_FOREST = 14,
FACL_FUSION_LAB = 15,
FACL_QUANTUM_LAB = 16,
FACL_RESEARCH_HOSPITAL = 17,
FACL_NANOHOSPITAL = 18,
FACL_ROBOTIC_ASSEMBLY_PLANT = 19,
FACL_NANOREPLICATOR = 20,
FACL_QUANTUM_CONVERTER = 21,
FACL_GENEJACK_FACTORY = 22,
FACL_PUNISHMENT_SPHERE = 23,
FACL_HAB_COMPLEX = 24,
FACL_HABITATION_DOME = 25,
FACL_PRESSURE_DOME = 26,
FACL_COMMAND_CENTER = 27,
FACL_NAVAL_YARD = 28,
FACL_AEROSPACE_COMPLEX = 29,
FACL_BIOENHANCEMENT_CENTER = 30,
FACL_CENTAURI_PRESERVE = 31,
FACL_TEMPLE_OF_PLANET = 32,
FACL_PSI_GATE = 33,
FACL_COVERT_OPS_CENTER = 34,
FACL_BROOD_PIT = 35,
FACL_AQUAFARM = 36,
FACL_SUBSEA_TRUNKLINE = 37,
FACL_THERMOCLINE_TRANSDUCER = 38,
FACL_FLECHETTE_DEFENSE_SYS = 39,
FACL_SUBSPACE_GENERATOR = 40,
FACL_GEOSYNC_SURVEY_POD = 41,
FACL_EMPTY_FACILITY_42 = 42,
FACL_EMPTY_FACILITY_64 = 64,
FACL_SKY_HYDRO_LAB = 65,
FACL_NESSUS_MINING_STATION = 66,
FACL_ORBITAL_POWER_TRANS = 67,
FACL_ORBITAL_DEFENSE_POD = 68,
FACL_STOCKPILE_ENERGY = 69,
FACL_HUMAN_GENOME_PROJ = 70,
FACL_COMMAND_NEXUS = 71,
FACL_WEATHER_PARADIGM = 72,
FACL_MERCHANT_EXCHANGE = 73,
FACL_EMPATH_GUILD = 74,
FACL_CITIZENS_DEFENSE_FORCE = 75,
FACL_VIRTUAL_WORLD = 76,
FACL_PLANETARY_TRANS_SYS = 77,
FACL_XENOEMPATYH_DOME = 78,
FACL_NEURAL_AMPLIFIER = 79,
FACL_MARITIME_CONTROL_CENTER = 80,
FACL_PLANETARY_DATALINKS = 81,
FACL_SUPERCOLLIDER = 82,
FACL_ASCETIC_VIRTUES = 83,
FACL_LONGEVITY_VACCINE = 84,
FACL_HUNTER_SEEKER_ALGO = 85,
FACL_PHOLUS_MUTAGEN = 86,
FACL_CYBORG_FACTORY = 87,
FACL_THEORY_OF_EVERYTHING = 88,
FACL_DREAM_TWISTER = 89,
FACL_UNIVERSAL_TRANSLATOR = 90,
FACL_NETWORK_BACKBONE = 91,
FACL_NANO_FACTORY = 92,
FACL_LIVING_REFINERY = 93,
FACL_CLONING_VATS = 94,
FACL_SELF_AWARE_COLONY = 95,
FACL_CLINICAL_IMMORTALITY = 96,
FACL_SPACE_ELEVATOR = 97,
FACL_SINGULARITY_INDUCTOR = 98,
FACL_BULK_MATTER_TRANSMITTER = 99,
FACL_TELEPATHIC_MATRIX = 100,
FACL_VOICE_OF_PLANET = 101,
FACL_ASCENT_TO_TRANSCENDENCE = 102,
FACL_MANIFOLD_HARMONICS = 103,
FACL_NETHACK_TERMINUS = 104,
FACL_CLOUDBASE_ACADEMY = 105,
FACL_PLANETARY_ENERGY_GRID = 106,
FACL_EMPTY_SP_38 = 107,
FACL_EMPTY_SP_64 = 133,
};
int BASE_load_production_queue_list(int facil_prod_id, int faction_id, int base_id, int queue_slot_id);
int BASE_main(int factionID);
};
struct facility_data_struct {
int FACL_struct_name_str; // LPSTR
int FACL_struct_effect_str; // LPSTR
int FACL_struct_unk; // unused, set to 0
int FACL_struct_cost;
int FACL_struct_maint;
int FACL_struct_preq_tech_id;
int FACL_struct_FREE; // disable, automatically set to -2
int FACL_struct_SP_AI_fight;
int FACL_struct_SP_AI_growth;
int FACL_struct_SP_AI_tech;
int FACL_struct_SP_AI_wealth;
int FACL_struct_SP_AI_power;
} facility_data[MAX_FACILITY_NUM];
struct technology_data_struct {
int TECH_struct_flags;
int TECH_struct_name_str; // LPSTR
CHAR TECH_id_str[8];
int TECH_struct_unk; // unused
int TECH_struct_growth;
int TECH_struct_tech;
int TECH_struct_wealth;
int TECH_struct_power;
int TECH_struct_preq_tech1;
int TECH_struct_preq_tech2;
} technology_data[MAX_TECHNOLOGY_NUM];
struct faction_data_struct {
int FACT_struct_gender;
CHAR FACT_struct_filename[24];
CHAR FACT_struct_search_key[24];
CHAR FACT_struct_leader_name[24];
CHAR FACT_struct_leader_title[24];
// cont
DWORD FACT_struct_spec_rules_bitfield;
} faction_data[MAX_FACT_NUM];
struct base_data_struct {
WORD base_struct_x_coord;
WORD base_struct_y_coord;
BYTE base_struct_faction_current;
BYTE base_struct_faction_former;
BYTE base_struct_population_size;
BYTE base_struct_assimilation_timer;
BYTE base_struct_nerve_staple_effect;
BYTE base_struct_unk1;
BYTE base_struct_unk2;
BYTE base_struct_faction_pop_size_intel[8];
CHAR base_struct_name_str[25];
WORD base_struct_unk_x_coord;
WORD base_struct_unk_y_coord;
DWORD base_struct_status_bitfield;
DWORD base_struct_events_bitfield2;
DWORD base_struct_unk3;
DWORD base_struct_unk4;
DWORD base_struct_unk5;
DWORD base_struct_unk6;
DWORD base_struct_unk7;
DWORD base_struct_queue_size;
DWORD base_struct_queue_id[10];
DWORD base_struct_unk8;
DWORD base_struct_unk9;
DWORD base_struct_unk10;
DWORD base_struct_unk11;
DWORD base_struct_unk12;
BYTE base_facilities_table[12];
// cont
} base_data[MAX_BASE_NUM];
// globals
int GVAR_DIFF_level = SMACX_CORE::DIFF_TRANSCEND;
int GVAR_game_rules_bitfield_2 = 0x00001A0E;
int GVAR_SMACX_TGL = 1;
CHAR GVAR_STR_TEMP[1024] = { 0 };
BYTE GVAR_GAME_TECH_DISCOVERED[MAX_TECHNOLOGY_NUM] = { 0 };
DWORD GVAR_GAME_SP_LOCATION[MAX_SP_NUM] = { -1 }; // init to not built
// functions
int BASE_has_secret_project(int spID, int factionID) {
int spBaseID = GVAR_GAME_SP_LOCATION[spID];
if(spBaseID >= 0)
return base_data[spBaseID].base_struct_faction_current == factionID;
return 0;
}
int BASE_facility_struct_offset(int facilID, int *facilOffset, int *facilBit) {
*facilOffset = facilID / 8;
int result = 1 << (facilID & 7);
*facilBit = result;
return result;
}
int BASE_has_facility_ex(int facilID, int baseID, int queueSlot)
{
if(facilID >= BASE_Management::FACL_SKY_HYDRO_LAB)
return 0;
int facilOffset, facilBit;
BASE_facility_struct_offset(facilID, &facilOffset, &facilBit);
int returnVal = facilBit & base_data[baseID].base_facilities_table[facilOffset];
if(returnVal || !queueSlot)
return returnVal;
if(queueSlot <= 0)
return 0;
for(int nPos = 0; nPos < queueSlot; nPos++) {
if(base_data[baseID].base_struct_queue_id[nPos] == -facilID)
return 1;
}
return 0;
}
int SQUARE_is_ocean_adjacent(int x_coord, int y_coord, int toggle) {
return 1;
}
int BASE_load_production_queue_list(int facilID, int factionID, int baseID, int queueSlot) {
if(!facilID)
return 0;
if(facilID == BASE_Management::FACL_SKUNKWORKS){
if(GVAR_DIFF_level <= SMACX_CORE::DIFF_SPECIALIST)
return 0;
}else{
if((facilID >= BASE_Management::FACL_HUMAN_GENOME_PROJ) && (GVAR_game_rules_bitfield_2 & SMACX_CORE::DISABLE_SP_PRODUCTION))
return 0;
if(facilID == BASE_Management::FACL_ASCENT_TO_TRANSCENDENCE){
if(GVAR_GAME_SP_LOCATION[BASE_Management::FACL_VOICE_OF_PLANET-BASE_Management::FACL_HUMAN_GENOME_PROJ] == -1)
return 0;
if(GVAR_game_rules_bitfield_2 & SMACX_CORE::VICTORY_HIGHER_GOAL)
return 1; // bug: can return TRUE as CARETAKERS
else
return 0;
}
}
if(factionID <= 0)
return 0;
int tech_preq = facility_data[factionID].FACL_struct_preq_tech_id;
if(tech_preq != -1){
if(tech_preq < 0 || tech_preq >= 88 || technology_data[tech_preq].TECH_struct_preq_tech1 < -1 ||
technology_data[tech_preq].TECH_struct_preq_tech2 < -1 || technology_data[tech_preq].TECH_struct_preq_tech1 == -1 ||
!((1 << factionID) & GVAR_GAME_TECH_DISCOVERED[tech_preq]))
return 0;
}
if(!GVAR_SMACX_TGL && (facilID == BASE_Management::FACL_MANIFOLD_HARMONICS || facilID == BASE_Management::FACL_NETHACK_TERMINUS
|| facilID == BASE_Management::FACL_CLOUDBASE_ACADEMY || facilID == BASE_Management::FACL_PLANETARY_ENERGY_GRID)
|| (GVAR_STR_TEMP[0] = 0, strcat(GVAR_STR_TEMP, faction_data[factionID].FACT_struct_filename), CharUpperA(GVAR_STR_TEMP), !strcmp(GVAR_STR_TEMP, "CARETAKE"))
&& (facilID == BASE_Management::FACL_VOICE_OF_PLANET || facilID == BASE_Management::FACL_ASCENT_TO_TRANSCENDENCE))
return 0;
if(facilID >= BASE_Management::FACL_HUMAN_GENOME_PROJ)
return GVAR_GAME_SP_LOCATION[facilID-BASE_Management::FACL_HUMAN_GENOME_PROJ] == -1;
if(baseID < 0)
return 1;
if(BASE_has_facility_ex(facilID, baseID, queueSlot))
return 0;
if(facilID == BASE_Management::FACL_NAVAL_YARD){
int MMC_baseID = GVAR_GAME_SP_LOCATION[BASE_Management::FACL_MARITIME_CONTROL_CENTER-BASE_Management::FACL_HUMAN_GENOME_PROJ];
if(MMC_baseID >= 0 && base_data[MMC_baseID].base_struct_faction_current == factionID)
return 0;
if(!SQUARE_is_ocean_adjacent(base_data[baseID].base_struct_x_coord, base_data[baseID].base_struct_y_coord, 0))
return 0;
}else{
int spID;
if(facilID == BASE_Management::FACL_PERIMETER_DEFENSE){
spID = BASE_Management::FACL_CITIZENS_DEFENSE_FORCE-BASE_Management::FACL_HUMAN_GENOME_PROJ;
goto CHECK_SP;
}else if(facilID == BASE_Management::FACL_COMMAND_CENTER){
spID = BASE_Management::FACL_COMMAND_NEXUS-BASE_Management::FACL_HUMAN_GENOME_PROJ;
goto CHECK_SP;
}else if(facilID == BASE_Management::FACL_BIOENHANCEMENT_CENTER){
spID = BASE_Management::FACL_CYBORG_FACTORY-BASE_Management::FACL_HUMAN_GENOME_PROJ;
goto CHECK_SP;
}else if(facilID == BASE_Management::FACL_QUANTUM_CONVERTER){
spID = BASE_Management::FACL_SINGULARITY_INDUCTOR-BASE_Management::FACL_HUMAN_GENOME_PROJ;
goto CHECK_SP;
}else if(facilID == BASE_Management::FACL_AEROSPACE_COMPLEX){
spID = BASE_Management::FACL_CLOUDBASE_ACADEMY-BASE_Management::FACL_HUMAN_GENOME_PROJ;
goto CHECK_SP;
}else if(facilID == BASE_Management::FACL_ENERGY_BANK){
spID = BASE_Management::FACL_PLANETARY_ENERGY_GRID-BASE_Management::FACL_HUMAN_GENOME_PROJ;
CHECK_SP:
if(BASE_has_secret_project(spID, factionID))
return 0;
}else if((facilID == BASE_Management::FACL_AQUAFARM || facilID == BASE_Management::FACL_SUBSEA_TRUNKLINE || facilID == BASE_Management::FACL_THERMOCLINE_TRANSDUCER)
&& (!GVAR_SMACX_TGL || !SQUARE_is_ocean_adjacent(base_data[baseID].base_struct_x_coord, base_data[baseID].base_struct_y_coord, 0)))
return 0;
}
if(!GVAR_SMACX_TGL && (facilID == BASE_Management::FACL_GEOSYNC_SURVEY_POD || facilID == BASE_Management::FACL_COVERT_OPS_CENTER
|| facilID == BASE_Management::FACL_BROOD_PIT || facilID == BASE_Management::FACL_FLECHETTE_DEFENSE_SYS || facilID == BASE_Management::FACL_SUBSPACE_GENERATOR)
|| !(faction_data[factionID].FACT_struct_spec_rules_bitfield & SMACX_CORE::FACT_ALIEN) && facilID == BASE_Management::FACL_SUBSPACE_GENERATOR)
return 0;
if(facilID == BASE_Management::FACL_RECYCLING_TANKS){
if(BASE_has_facility_ex(BASE_Management::FACL_PRESSURE_DOME, baseID, queueSlot))
return 0;
return 1;
}
if(facilID == BASE_Management::FACL_TACHYON_FIELD){
if(BASE_has_facility_ex(BASE_Management::FACL_PERIMETER_DEFENSE, baseID, queueSlot))
return 1;
if(BASE_has_secret_project(BASE_Management::FACL_CITIZENS_DEFENSE_FORCE-BASE_Management::FACL_HUMAN_GENOME_PROJ, factionID))
return 1;
return 0;
}
if(facilID == BASE_Management::FACL_HOLOGRAM_THEATRE){
if(!BASE_has_facility_ex(BASE_Management::FACL_RECREATION_COMMONS, baseID, queueSlot))
return 0;
if(BASE_has_secret_project(BASE_Management::FACL_VIRTUAL_WORLD-BASE_Management::FACL_HUMAN_GENOME_PROJ, factionID))
return 0;
return 1;
}
if(facilID == BASE_Management::FACL_HYBRID_FOREST){
if(BASE_has_facility_ex(BASE_Management::FACL_TREE_FARM, baseID, queueSlot))
return 1;
return 0;
}
if(facilID == BASE_Management::FACL_QUANTUM_LAB){
if(BASE_has_facility_ex(BASE_Management::FACL_FUSION_LAB, baseID, queueSlot))
return 1;
return 0;
}
if(facilID == BASE_Management::FACL_NANOHOSPITAL){
if(BASE_has_facility_ex(BASE_Management::FACL_RESEARCH_HOSPITAL, baseID, queueSlot))
return 1;
return 0;
}
if(facilID == BASE_Management::FACL_SKUNKWORKS) {
if(faction_data[factionID].FACT_struct_spec_rules_bitfield & SMACX_CORE::FACT_FREEPROTO)
return 0;
return 1;
}
if(facilID == BASE_Management::FACL_PUNISHMENT_SPHERE){
if(BASE_has_facility_ex(BASE_Management::FACL_PARADISE_GARDEN, baseID, queueSlot))
return 0;
return 1;
}
// bug: missing check to disable FACL_PARADISE_GARDEN if FACL_PUNISHMENT_SPHERE is being built
if(facilID == BASE_Management::FACL_HABITATION_DOME){
if(BASE_has_facility_ex(BASE_Management::FACL_HAB_COMPLEX, baseID, queueSlot))
return 1;
return 0;
}
if(facilID >= BASE_Management::FACL_SKY_HYDRO_LAB && facilID < BASE_Management::FACL_STOCKPILE_ENERGY ||
facilID == BASE_Management::FACL_GEOSYNC_SURVEY_POD){
if(BASE_has_facility_ex(BASE_Management::FACL_AEROSPACE_COMPLEX, baseID, queueSlot))
return 1;
if(BASE_has_secret_project(BASE_Management::FACL_CLOUDBASE_ACADEMY-BASE_Management::FACL_HUMAN_GENOME_PROJ, factionID))
return 1;
if(BASE_has_secret_project(BASE_Management::FACL_SPACE_ELEVATOR-BASE_Management::FACL_HUMAN_GENOME_PROJ, factionID))
return 1;
return 0;
}
if(facilID == BASE_Management::FACL_NANOREPLICATOR) {
if(BASE_has_facility_ex(BASE_Management::FACL_ROBOTIC_ASSEMBLY_PLANT, baseID, queueSlot))
return 1;
if(BASE_has_facility_ex(BASE_Management::FACL_GENEJACK_FACTORY, baseID, queueSlot))
return 1;
return 0;
}
if(facilID == BASE_Management::FACL_QUANTUM_CONVERTER) {
if(BASE_has_facility_ex(BASE_Management::FACL_ROBOTIC_ASSEMBLY_PLANT, baseID, queueSlot))
return 1;
return 0;
}
if(facilID == BASE_Management::FACL_TEMPLE_OF_PLANET) {
if(BASE_has_facility_ex(BASE_Management::FACL_CENTAURI_PRESERVE, baseID, queueSlot))
return 1;
return 0;
}
return 1;
}
I don't think there is a reason you would pick a Hologram Theater over Network Node if you had Virtual World.
I don't think there is a reason you would pick a Hologram Theater over Network Node if you had Virtual World.
Only if your opponent had the Network Backbone in a highly tech producing place, i.e. their super capitol, and you were obsessed with not contributing to their research in any way at all.
Only if you were worried about your opponent conquering your base soon, and not wanting them to have somewhere to cash an Artifact they have nearby.
You really have to contort to come up with circumstances where it could sorta matter.