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