001package com.fs.starfarer.api.impl.campaign.rulecmd.salvage.special; 002 003import java.util.ArrayList; 004import java.util.List; 005import java.util.Random; 006 007import com.fs.starfarer.api.Global; 008import com.fs.starfarer.api.campaign.FactionAPI; 009import com.fs.starfarer.api.characters.PersonAPI; 010import com.fs.starfarer.api.impl.campaign.ids.Skills; 011import com.fs.starfarer.api.impl.campaign.procgen.themes.SalvageSpecialAssigner; 012import com.fs.starfarer.api.plugins.OfficerLevelupPlugin; 013import com.fs.starfarer.api.util.WeightedRandomPicker; 014 015public class CryopodOfficerGen { 016 017 public static String EXCEPTIONAL_OFFICERS_CREATED_KEY = "$SleeperPodsSpecialCreator_exceptionalCount"; 018 019 public static int getNumExceptionalCreated() { 020 return Global.getSector().getMemoryWithoutUpdate().getInt(EXCEPTIONAL_OFFICERS_CREATED_KEY); 021 } 022 023 public static void incrNumExceptionalCreated() { 024 int num = getNumExceptionalCreated() + 1; 025 Global.getSector().getMemoryWithoutUpdate().set(EXCEPTIONAL_OFFICERS_CREATED_KEY, num); 026 } 027 028 public static boolean canAddMoreExceptional() { 029 return getNumExceptionalCreated() < SalvageSpecialAssigner.MAX_EXCEPTIONAL_PODS_OFFICERS; 030 } 031 032 033 034 public static class CryopodOfficerTemplate { 035 public List<String> base = new ArrayList<String>(); 036 public List<String> elite = new ArrayList<String>(); 037 038 public String personality = null; 039 040 041 public CryopodOfficerTemplate() { 042 } 043 public CryopodOfficerTemplate(String personality) { 044 this.personality = personality; 045 } 046 047 public PersonAPI create(FactionAPI faction, Random random) { 048 PersonAPI officer = faction.createRandomPerson(random); 049 if (personality != null) { 050 officer.setPersonality(personality); 051 } 052 053 int level = base.size() + elite.size(); 054 officer.getStats().setLevel(level); 055 056 OfficerLevelupPlugin plugin = (OfficerLevelupPlugin) Global.getSettings().getPlugin("officerLevelUp"); 057 officer.getStats().setXP(plugin.getXPForLevel(level)); 058 059 for (String id : base) { 060 officer.getStats().setSkillLevel(id, 1); 061 } 062 for (String id : elite) { 063 officer.getStats().setSkillLevel(id, 2); 064 } 065 return officer; 066 } 067 } 068 069 public static WeightedRandomPicker<CryopodOfficerTemplate> TEMPLATES_NORMAL = new WeightedRandomPicker<CryopodOfficerTemplate>(); 070 public static WeightedRandomPicker<CryopodOfficerTemplate> TEMPLATES_EXCEPTIONAL = new WeightedRandomPicker<CryopodOfficerTemplate>(); 071 072 static { 073 CryopodOfficerTemplate t; 074 075 // BEGIN LEVEL 7 OFFICERS 076 077 // fast high-tech ship 078 t = new CryopodOfficerTemplate(); 079 t.elite.add(Skills.TARGET_ANALYSIS); 080 t.elite.add(Skills.ENERGY_WEAPON_MASTERY); 081 t.elite.add(Skills.FIELD_MODULATION); 082 t.elite.add(Skills.GUNNERY_IMPLANTS); 083 t.elite.add(Skills.SYSTEMS_EXPERTISE); 084 t.base.add(Skills.COMBAT_ENDURANCE); 085 t.base.add(Skills.HELMSMANSHIP); 086 TEMPLATES_EXCEPTIONAL.add(t, 10f); 087 088 // slow high-tech ship 089 t = new CryopodOfficerTemplate(); 090 t.elite.add(Skills.HELMSMANSHIP); 091 t.elite.add(Skills.ENERGY_WEAPON_MASTERY); 092 t.elite.add(Skills.FIELD_MODULATION); 093 t.elite.add(Skills.GUNNERY_IMPLANTS); 094 t.elite.add(Skills.ORDNANCE_EXPERTISE); 095 t.base.add(Skills.TARGET_ANALYSIS); 096 t.base.add(Skills.COMBAT_ENDURANCE); 097 TEMPLATES_EXCEPTIONAL.add(t, 10f); 098 099 // hull/armor tank, low tech 100 t = new CryopodOfficerTemplate(); 101 t.elite.add(Skills.DAMAGE_CONTROL); 102 t.elite.add(Skills.IMPACT_MITIGATION); 103 t.elite.add(Skills.POLARIZED_ARMOR); 104 t.elite.add(Skills.BALLISTIC_MASTERY); 105 t.elite.add(Skills.TARGET_ANALYSIS); 106 t.base.add(Skills.MISSILE_SPECIALIZATION); 107 t.base.add(Skills.GUNNERY_IMPLANTS); 108 TEMPLATES_EXCEPTIONAL.add(t, 5f); 109 110 t = new CryopodOfficerTemplate(); 111 t.elite.add(Skills.ORDNANCE_EXPERTISE); 112 t.elite.add(Skills.IMPACT_MITIGATION); 113 t.elite.add(Skills.POLARIZED_ARMOR); 114 t.elite.add(Skills.BALLISTIC_MASTERY); 115 t.elite.add(Skills.TARGET_ANALYSIS); 116 t.base.add(Skills.MISSILE_SPECIALIZATION); 117 t.base.add(Skills.GUNNERY_IMPLANTS); 118 TEMPLATES_EXCEPTIONAL.add(t, 5f); 119 120 // phase ship 121 t = new CryopodOfficerTemplate(); 122 t.elite.add(Skills.IMPACT_MITIGATION); 123 t.elite.add(Skills.FIELD_MODULATION); 124 t.elite.add(Skills.TARGET_ANALYSIS); 125 t.elite.add(Skills.SYSTEMS_EXPERTISE); 126 t.elite.add(Skills.COMBAT_ENDURANCE); 127 t.base.add(Skills.POLARIZED_ARMOR); 128 t.base.add(Skills.ENERGY_WEAPON_MASTERY); 129 TEMPLATES_EXCEPTIONAL.add(t, 10f); 130 131 132 // generally-ok-for-most-ships, take 1 133 t = new CryopodOfficerTemplate(); 134 t.elite.add(Skills.FIELD_MODULATION); 135 t.elite.add(Skills.ORDNANCE_EXPERTISE); 136 t.elite.add(Skills.TARGET_ANALYSIS); 137 t.elite.add(Skills.POINT_DEFENSE); 138 t.elite.add(Skills.GUNNERY_IMPLANTS); 139 t.base.add(Skills.HELMSMANSHIP); 140 t.base.add(Skills.COMBAT_ENDURANCE); 141 TEMPLATES_EXCEPTIONAL.add(t, 5f); 142 143 // generally-ok-for-most-ships, take 2 144 t = new CryopodOfficerTemplate(); 145 t.elite.add(Skills.FIELD_MODULATION); 146 t.elite.add(Skills.ORDNANCE_EXPERTISE); 147 t.elite.add(Skills.TARGET_ANALYSIS); 148 t.elite.add(Skills.IMPACT_MITIGATION); 149 t.elite.add(Skills.GUNNERY_IMPLANTS); 150 t.base.add(Skills.HELMSMANSHIP); 151 t.base.add(Skills.COMBAT_ENDURANCE); 152 TEMPLATES_EXCEPTIONAL.add(t, 5f); 153 154 155 // SO, ballistic weapons 156 t = new CryopodOfficerTemplate(); 157 t.elite.add(Skills.COMBAT_ENDURANCE); 158 t.elite.add(Skills.TARGET_ANALYSIS); 159 t.elite.add(Skills.SYSTEMS_EXPERTISE); 160 t.elite.add(Skills.DAMAGE_CONTROL); 161 t.elite.add(Skills.IMPACT_MITIGATION); 162 t.base.add(Skills.FIELD_MODULATION); 163 t.base.add(Skills.BALLISTIC_MASTERY); 164 TEMPLATES_EXCEPTIONAL.add(t, 5f); 165 166 // SO, energy weapons 167 t = new CryopodOfficerTemplate(); 168 t.elite.add(Skills.COMBAT_ENDURANCE); 169 t.elite.add(Skills.TARGET_ANALYSIS); 170 t.elite.add(Skills.SYSTEMS_EXPERTISE); 171 t.elite.add(Skills.DAMAGE_CONTROL); 172 t.elite.add(Skills.IMPACT_MITIGATION); 173 t.base.add(Skills.FIELD_MODULATION); 174 t.base.add(Skills.ENERGY_WEAPON_MASTERY); 175 TEMPLATES_EXCEPTIONAL.add(t, 5f); 176 // END LEVEL 7 OFFICERS 177 178 179 // BEGIN LEVEL 5 OFFICERS 180 181 // generic, take 1 182 t = new CryopodOfficerTemplate(); 183 t.elite.add(Skills.IMPACT_MITIGATION); 184 t.base.add(Skills.ORDNANCE_EXPERTISE); 185 t.base.add(Skills.FIELD_MODULATION); 186 t.base.add(Skills.TARGET_ANALYSIS); 187 t.base.add(Skills.COMBAT_ENDURANCE); 188 TEMPLATES_NORMAL.add(t, 5f); 189 190 // generic, take 2 191 t = new CryopodOfficerTemplate(); 192 t.elite.add(Skills.TARGET_ANALYSIS); 193 t.base.add(Skills.IMPACT_MITIGATION); 194 t.base.add(Skills.ORDNANCE_EXPERTISE); 195 t.base.add(Skills.FIELD_MODULATION); 196 t.base.add(Skills.COMBAT_ENDURANCE); 197 TEMPLATES_NORMAL.add(t, 5f); 198 199 // generic, take 3 200 t = new CryopodOfficerTemplate(); 201 t.elite.add(Skills.SYSTEMS_EXPERTISE); 202 t.base.add(Skills.TARGET_ANALYSIS); 203 t.base.add(Skills.ORDNANCE_EXPERTISE); 204 t.base.add(Skills.FIELD_MODULATION); 205 t.base.add(Skills.COMBAT_ENDURANCE); 206 TEMPLATES_NORMAL.add(t, 5f); 207 208 // low-tech, take 1 209 t = new CryopodOfficerTemplate(); 210 t.elite.add(Skills.MISSILE_SPECIALIZATION); 211 t.base.add(Skills.TARGET_ANALYSIS); 212 t.base.add(Skills.BALLISTIC_MASTERY); 213 t.base.add(Skills.IMPACT_MITIGATION); 214 t.base.add(Skills.COMBAT_ENDURANCE); 215 TEMPLATES_NORMAL.add(t, 5f); 216 217 // low-tech, take 2 218 t = new CryopodOfficerTemplate(); 219 t.elite.add(Skills.BALLISTIC_MASTERY); 220 t.base.add(Skills.GUNNERY_IMPLANTS); 221 t.base.add(Skills.TARGET_ANALYSIS); 222 t.base.add(Skills.IMPACT_MITIGATION); 223 t.base.add(Skills.COMBAT_ENDURANCE); 224 TEMPLATES_NORMAL.add(t, 5f); 225 226 // low-tech, take 3 227 t = new CryopodOfficerTemplate(); 228 t.elite.add(Skills.BALLISTIC_MASTERY); 229 t.base.add(Skills.MISSILE_SPECIALIZATION); 230 t.base.add(Skills.TARGET_ANALYSIS); 231 t.base.add(Skills.IMPACT_MITIGATION); 232 t.base.add(Skills.DAMAGE_CONTROL); 233 TEMPLATES_NORMAL.add(t, 5f); 234 235 // low-tech, take 4 236 t = new CryopodOfficerTemplate(); 237 t.elite.add(Skills.HELMSMANSHIP); 238 t.base.add(Skills.MISSILE_SPECIALIZATION); 239 t.base.add(Skills.TARGET_ANALYSIS); 240 t.base.add(Skills.IMPACT_MITIGATION); 241 t.base.add(Skills.BALLISTIC_MASTERY); 242 TEMPLATES_NORMAL.add(t, 5f); 243 244 // high-tech, take 1 245 t = new CryopodOfficerTemplate(); 246 t.elite.add(Skills.ENERGY_WEAPON_MASTERY); 247 t.base.add(Skills.TARGET_ANALYSIS); 248 t.base.add(Skills.MISSILE_SPECIALIZATION); 249 t.base.add(Skills.ORDNANCE_EXPERTISE); 250 t.base.add(Skills.COMBAT_ENDURANCE); 251 TEMPLATES_NORMAL.add(t, 5f); 252 253 // high-tech, take 2 254 t = new CryopodOfficerTemplate(); 255 t.elite.add(Skills.ENERGY_WEAPON_MASTERY); 256 t.base.add(Skills.TARGET_ANALYSIS); 257 t.base.add(Skills.HELMSMANSHIP); 258 t.base.add(Skills.ORDNANCE_EXPERTISE); 259 t.base.add(Skills.COMBAT_ENDURANCE); 260 TEMPLATES_NORMAL.add(t, 5f); 261 262 // phase ship, take 1 263 t = new CryopodOfficerTemplate(); 264 t.elite.add(Skills.FIELD_MODULATION); 265 t.base.add(Skills.IMPACT_MITIGATION); 266 t.base.add(Skills.TARGET_ANALYSIS); 267 t.base.add(Skills.SYSTEMS_EXPERTISE); 268 t.base.add(Skills.COMBAT_ENDURANCE); 269 TEMPLATES_NORMAL.add(t, 5f); 270 271 // phase ship, take 2 272 t = new CryopodOfficerTemplate(); 273 t.elite.add(Skills.FIELD_MODULATION); 274 t.base.add(Skills.IMPACT_MITIGATION); 275 t.base.add(Skills.TARGET_ANALYSIS); 276 t.base.add(Skills.MISSILE_SPECIALIZATION); 277 t.base.add(Skills.COMBAT_ENDURANCE); 278 TEMPLATES_NORMAL.add(t, 5f); 279 280 281 // SO? fairly generic 282 t = new CryopodOfficerTemplate(); 283 t.elite.add(Skills.TARGET_ANALYSIS); 284 t.base.add(Skills.COMBAT_ENDURANCE); 285 t.base.add(Skills.MISSILE_SPECIALIZATION); 286 t.base.add(Skills.IMPACT_MITIGATION); 287 t.base.add(Skills.FIELD_MODULATION); 288 TEMPLATES_NORMAL.add(t, 10f); 289 290 // END LEVEL 5 OFFICERS 291 292 } 293 294} 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318