1package com.fs.starfarer.api.impl.campaign;
3import java.util.ArrayList;
5import java.util.Random;
7import com.fs.starfarer.api.Global;
8import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
9import com.fs.starfarer.api.characters.MutableCharacterStatsAPI.SkillLevelAPI;
10import com.fs.starfarer.api.characters.PersonAPI;
11import com.fs.starfarer.api.characters.SkillSpecAPI;
12import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
13import com.fs.starfarer.api.impl.campaign.ids.Skills;
14import com.fs.starfarer.api.impl.campaign.ids.Stats;
15import com.fs.starfarer.api.plugins.OfficerLevelupPlugin;
16import com.fs.starfarer.api.util.Misc;
17import com.fs.starfarer.api.util.SkillData;
18import com.fs.starfarer.api.util.SkillData.SkillsForAptitude;
19import com.fs.starfarer.api.util.WeightedRandomPicker;
52 if (level <= 1)
return 0;
61 for (
int i = maxSpecified; i < level; i++) {
69 public static void main(String[] args) {
70 for (
int i = 1; i <= 6; i++) {
104 if (random ==
null) random =
new Random();
107 List<SkillSpecAPI> leftovers =
new ArrayList<SkillSpecAPI>();
108 List<List<SkillSpecAPI>> unknownTiers =
new ArrayList<List<SkillSpecAPI>>();
111 int level = stats.getLevel();
116 for (List<SkillSpecAPI> list : skills.tiers) {
119 List<SkillSpecAPI> unknown =
new ArrayList<SkillSpecAPI>();
121 if (!skill.isCombatOfficerSkill())
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);
140 List<String> result =
new ArrayList<String>();
142 if (!unknownTiers.isEmpty()) {
144 picker.
addAll(unknownTiers);
145 while (!picker.
isEmpty() && result.size() < max) {
148 if (result.size() >= max)
break;
149 result.add(s.getId());
154 if (!leftovers.isEmpty()) {
157 while (!picker.
isEmpty() && result.size() < max) {
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>();
179 for (List<SkillSpecAPI> list : skills.tiers) {
180 boolean topTier =
false;
182 if (!skill.isCombatOfficerSkill())
continue;
186 if (skill.getTier() == 5) topTier =
true;
187 if (!topTier || level >= 3) {
191 leftovers.add(skill);
206 List<String> result =
new ArrayList<String>();
208 if (!top.isEmpty()) {
211 while (!picker.
isEmpty() && result.size() < max) {
213 result.add(pick.
getId());
216 if (!leftovers.isEmpty()) {
219 while (!picker.
isEmpty() && result.size() < max) {
221 result.add(pick.
getId());
231 if (random ==
null) random =
new Random();
233 boolean hasCarrierSkills =
false;
235 if (!skill.getSkill().isCombatOfficerSkill())
continue;
238 hasCarrierSkills =
true;
250 int knownSkillCount = 0;
251 for (String skillId : allSkillIds) {
254 addSkill(person, nonMaxedSkills, skillId);
258 addSkill(person, knownSkills, skillId);
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>();
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()) {
286 }
else if (!knownNonCarrierSkills.
isEmpty() && result.size() == 0) {
289 }
else if (!knownSkills.
isEmpty()) {
294 if (hasCarrierSkills && !carrierSkills.
isEmpty()) {
297 }
else if (!nonCarrierSkills.
isEmpty() && result.size() == 0) {
300 }
else if (!nonMaxedSkills.
isEmpty()) {
306 if (result.size() < 2 && knownSkillCount < maxSkillsPerOfficer) {
307 for (String
id : result) {
308 nonMaxedSkills.
remove(
id);
310 if (!nonMaxedSkills.
isEmpty()) {
static SettingsAPI getSettings()
float computeEffective(float baseValue)
List< String > pickLevelupSkillsV3(PersonAPI person, Random random)
long getXPForLevel(int level)
int getMaxLevel(PersonAPI person)
static long[] XP_PER_LEVEL
static void main(String[] args)
int getMaxEliteSkills(PersonAPI person)
static float EXPONENT_BEYOND_MAX_SPECIFIED_LEVEL
static long[] TOTAL_XP_PER_LEVEL
List< String > pickLevelupSkills(PersonAPI person, Random random)
List< String > pickLevelupSkillsV2(PersonAPI person, Random random)
static final String OFFICER_SKILL_PICKS_PER_LEVEL
static final String OFFICER_MAX_LEVEL
static final String OFFICER_MAX_ELITE_SKILLS
static final String TAG_CARRIER
static final String TAG_DEPRECATED
static final String TAG_PLAYER_ONLY
static final String OFFICER_MAX_ELITE_SKILLS_MOD
static final String OFFICER_MAX_LEVEL_MOD
static boolean isMentored(PersonAPI person)
static SkillsForAptitude getSkills(String aptitudeId)
static Map< String, SkillsForAptitude > getAptitudes()
void addAll(Collection< T > items)
SkillSpecAPI getSkillSpec(String skillId)
List< String > getSortedSkillIds()
float getFloat(String key)
boolean contains(String key)
DynamicStatsAPI getDynamic()
List< SkillLevelAPI > getSkillsCopy()
float getSkillLevel(String id)
MutableCharacterStatsAPI getStats()
MemoryAPI getMemoryWithoutUpdate()
MutableCharacterStatsAPI getFleetCommanderStats()
boolean hasTag(String tag)
boolean isCombatOfficerSkill()
StatBonus getMod(String id)