104 if (random ==
null) random =
new Random();
107 List<SkillSpecAPI> leftovers =
new ArrayList<SkillSpecAPI>();
108 List<List<SkillSpecAPI>> unknownTiers =
new ArrayList<List<SkillSpecAPI>>();
110 MutableCharacterStatsAPI stats = person.getStats();
111 int level = stats.getLevel();
113 for (String ap : SkillData.getAptitudes().keySet()) {
114 SkillsForAptitude skills = SkillData.getSkills(ap);
116 for (List<SkillSpecAPI> list : skills.tiers) {
119 List<SkillSpecAPI> unknown =
new ArrayList<SkillSpecAPI>();
120 for (SkillSpecAPI skill : list) {
121 if (!skill.isCombatOfficerSkill())
continue;
122 if (skill.hasTag(Skills.TAG_DEPRECATED))
continue;
123 if (skill.hasTag(Skills.TAG_PLAYER_ONLY))
continue;
124 if (stats.getSkillLevel(skill.getId()) <= 0) {
128 if (list.size() == unknown.size() && (tier < 4 || level >= 3)) {
129 unknownTiers.add(list);
131 leftovers.addAll(unknown);
137 if (Misc.isMentored(person)) {
140 List<String> result =
new ArrayList<String>();
142 if (!unknownTiers.isEmpty()) {
143 WeightedRandomPicker<List<SkillSpecAPI>> picker =
new WeightedRandomPicker<List<SkillSpecAPI>>(random);
144 picker.addAll(unknownTiers);
145 while (!picker.isEmpty() && result.size() < max) {
146 List<SkillSpecAPI> pick = picker.pickAndRemove();
147 for (SkillSpecAPI s : pick) {
148 if (result.size() >= max)
break;
149 result.add(s.getId());
154 if (!leftovers.isEmpty()) {
155 WeightedRandomPicker<SkillSpecAPI> picker =
new WeightedRandomPicker<SkillSpecAPI>(random);
156 picker.addAll(leftovers);
157 while (!picker.isEmpty() && result.size() < max) {
158 SkillSpecAPI pick = picker.pickAndRemove();
159 result.add(pick.getId());
168 if (random ==
null) random =
new Random();
171 List<SkillSpecAPI> top =
new ArrayList<SkillSpecAPI>();
172 List<SkillSpecAPI> leftovers =
new ArrayList<SkillSpecAPI>();
174 MutableCharacterStatsAPI stats = person.getStats();
175 int level = stats.getLevel();
177 for (String ap : SkillData.getAptitudes().keySet()) {
178 SkillsForAptitude skills = SkillData.getSkills(ap);
179 for (List<SkillSpecAPI> list : skills.tiers) {
180 boolean topTier =
false;
181 for (SkillSpecAPI skill : list) {
182 if (!skill.isCombatOfficerSkill())
continue;
183 if (skill.hasTag(Skills.TAG_DEPRECATED))
continue;
184 if (skill.hasTag(Skills.TAG_PLAYER_ONLY))
continue;
185 if (stats.getSkillLevel(skill.getId()) <= 0) {
186 if (skill.getTier() == 5) topTier =
true;
187 if (!topTier || level >= 3) {
191 leftovers.add(skill);
200 if (Misc.isMentored(person)) {
203 if (person.getMemoryWithoutUpdate().contains(MemFlags.OFFICER_SKILL_PICKS_PER_LEVEL)) {
204 max = person.getMemoryWithoutUpdate().getInt(MemFlags.OFFICER_SKILL_PICKS_PER_LEVEL);
206 List<String> result =
new ArrayList<String>();
208 if (!top.isEmpty()) {
209 WeightedRandomPicker<SkillSpecAPI> picker =
new WeightedRandomPicker<SkillSpecAPI>(random);
211 while (!picker.isEmpty() && result.size() < max) {
212 SkillSpecAPI pick = picker.pickAndRemove();
213 result.add(pick.getId());
216 if (!leftovers.isEmpty()) {
217 WeightedRandomPicker<SkillSpecAPI> picker =
new WeightedRandomPicker<SkillSpecAPI>(random);
218 picker.addAll(leftovers);
219 while (!picker.isEmpty() && result.size() < max) {
220 SkillSpecAPI pick = picker.pickAndRemove();
221 result.add(pick.getId());
231 if (random ==
null) random =
new Random();
233 boolean hasCarrierSkills =
false;
234 for (SkillLevelAPI skill : person.getStats().getSkillsCopy()) {
235 if (!skill.getSkill().isCombatOfficerSkill())
continue;
237 if (skill.getSkill().hasTag(Skills.TAG_CARRIER)) {
238 hasCarrierSkills =
true;
243 WeightedRandomPicker<String> nonMaxedSkills =
new WeightedRandomPicker<String>(random);
244 WeightedRandomPicker<String> knownSkills =
new WeightedRandomPicker<String>(random);
245 WeightedRandomPicker<String> carrierSkills =
new WeightedRandomPicker<String>(random);
246 WeightedRandomPicker<String> knownCarrierSkills =
new WeightedRandomPicker<String>(random);
247 WeightedRandomPicker<String> nonCarrierSkills =
new WeightedRandomPicker<String>(random);
248 WeightedRandomPicker<String> knownNonCarrierSkills =
new WeightedRandomPicker<String>(random);
250 int knownSkillCount = 0;
251 for (String skillId : allSkillIds) {
253 if (skill.isCombatOfficerSkill()) {
254 addSkill(person, nonMaxedSkills, skillId);
255 float level = person.getStats().getSkillLevel(skillId);
258 addSkill(person, knownSkills, skillId);
260 if (skill.hasTag(Skills.TAG_CARRIER)) {
261 addSkill(person, carrierSkills, skillId);
262 if (level > 0) addSkill(person, knownCarrierSkills, skillId);
264 addSkill(person, nonCarrierSkills, skillId);
265 if (level > 0) addSkill(person, knownNonCarrierSkills, skillId);
269 List<String> result =
new ArrayList<String>();
271 if (!knownSkills.isEmpty()) {
272 String pick = knownSkills.pickAndRemove();
273 nonMaxedSkills.remove(pick);
274 carrierSkills.remove(pick);
275 nonCarrierSkills.remove(pick);
276 knownCarrierSkills.remove(pick);
277 knownNonCarrierSkills.remove(pick);
281 int maxSkillsPerOfficer = 10;
282 if (knownSkillCount >= maxSkillsPerOfficer) {
283 if (hasCarrierSkills && !knownCarrierSkills.isEmpty()) {
284 String pick = knownCarrierSkills.pickAndRemove();
286 }
else if (!knownNonCarrierSkills.isEmpty() && result.size() == 0) {
287 String pick = knownNonCarrierSkills.pickAndRemove();
289 }
else if (!knownSkills.isEmpty()) {
290 String pick = knownSkills.pickAndRemove();
294 if (hasCarrierSkills && !carrierSkills.isEmpty()) {
295 String pick = carrierSkills.pickAndRemove();
297 }
else if (!nonCarrierSkills.isEmpty() && result.size() == 0) {
298 String pick = nonCarrierSkills.pickAndRemove();
300 }
else if (!nonMaxedSkills.isEmpty()) {
301 String pick = nonMaxedSkills.pickAndRemove();
306 if (result.size() < 2 && knownSkillCount < maxSkillsPerOfficer) {
307 for (String
id : result) {
308 nonMaxedSkills.remove(
id);
310 if (!nonMaxedSkills.isEmpty()) {
311 String pick = nonMaxedSkills.pickAndRemove();
312 knownSkills.remove(pick);