84 OfficerDataMap result =
new OfficerDataMap();
90 Map<OfficerDataAPI, FleetMemberAPI> members =
new LinkedHashMap<OfficerDataAPI, FleetMemberAPI>();
91 Set<OfficerDataAPI> unusable =
new LinkedHashSet<OfficerDataAPI>();
92 if (maxOfficersPre > maxOfficersPost) {
95 boolean merc = Misc.isMercenary(officer.getPerson());
99 if (count > maxOfficersPost && !merc) {
100 unusable.add(officer);
106 for (FleetMemberAPI member :
Global.
getSector().getPlayerFleet().getFleetData().getMembersListCopy()) {
107 if (member.getCaptain() == officer.getPerson()) {
108 members.put(officer, member);
124 if (Misc.isMercenary(person)) {
131 OfficerEffectData effect =
new OfficerEffectData();
135 if (members.containsKey(data)) {
136 effect.member = members.get(data);
138 if (unusable.contains(data)) {
139 effect.unusable =
true;
142 if (stats.
getLevel() > maxLevelPost && maxLevelPost < maxLevelPre) {
143 final List<String> skillsInOrderOfGain =
new ArrayList<String>();
144 for (OfficerSkillGainRecord rec : PlaythroughLog.getInstance().getOfficerSkillsLearned()) {
145 if (rec.getPersonId().equals(person.
getId()) && !rec.isElite() &&
147 skillsInOrderOfGain.add(rec.getSkillId());
150 Collections.reverse(skillsInOrderOfGain);
155 int skillsToRemove = stats.
getLevel() - maxLevelPost;
156 for (
int i = 0; i < skillsToRemove && !skillsInOrderOfGain.isEmpty(); i++) {
157 effect.removeSkills.add(skillsInOrderOfGain.remove(0));
159 if (!effect.removeSkills.isEmpty()) {
160 effect.newLevel = maxLevelPost;
165 if (numElite > maxElitePost && maxElitePost < maxElitePre) {
166 final List<String> eliteInOrderOfGain =
new ArrayList<String>();
167 for (OfficerSkillGainRecord rec : PlaythroughLog.getInstance().getOfficerSkillsLearned()) {
168 if (rec.getPersonId().equals(person.
getId()) && rec.isElite() &&
170 !effect.removeSkills.contains(rec.getSkillId())) {
171 eliteInOrderOfGain.add(rec.getSkillId());
174 Collections.reverse(eliteInOrderOfGain);
176 int eliteToRemove = numElite - maxElitePost;
177 for (
int i = 0; i < eliteToRemove && !eliteInOrderOfGain.isEmpty(); i++) {
178 effect.removeElite.add(eliteInOrderOfGain.remove(0));
183 if (effect.hasChanges()) {
184 result.map.put(person, effect);
209 info.addSectionHeading(
"Officers",
base,
dark, Alignment.MID, 15f);
211 info.addPara(
"Officers whose skills that exceed the new limits will have their excess skills removed, or become mercenaries on a temporary contract. "
212 +
"Officers that already had those kinds of skills when acquired will not be affected.", opad,
213 Misc.getNegativeHighlightColor(),
214 "excess skills removed");
215 float initPad = opad;
216 for (
final OfficerEffectData data : map.map.values()) {
217 final PersonAPI person = data.data.getPerson();
219 if (data.member ==
null) {
220 str +=
", unassigned, will...";
222 str +=
", commanding the " + data.member.getShipName() +
223 " (" + data.member.getHullSpec().getHullNameWithDashClass() +
"), will...";
226 String mercText =
"Become a mercenary, drawing higher pay on a new contract";
227 String otherText =
"";
229 if (data.unusable && data.removeElite.isEmpty() && data.removeSkills.isEmpty()) {
230 if (data.member ==
null) {
231 otherText =
"Become unable to be assigned command of a ship";
233 otherText =
"Be relieved of command, and unable to be assigned command of a ship";
238 part1 =
"Be relieved of command, and";
241 if (!data.removeElite.isEmpty() && data.removeSkills.isEmpty()) {
242 part2 =
" lose excess elite skill effects";
243 }
else if (data.removeElite.isEmpty() && !data.removeSkills.isEmpty()) {
244 part2 =
" lose excess skills";
246 part2 =
" lose excess skills and elite skill effects";
248 if (part1.isEmpty()) {
249 part2 = part2.trim();
250 otherText = Misc.ucFirst(part2);
252 otherText = part1 + part2;
256 info.addPara(str, opad + 5f);
259 data.buttonOther = info.addAreaCheckbox(otherText,
new Object(),
base,
dark,
bright, bw, bh, opad,
true);
260 data.buttonOther.getPosition().setXAlignOffset(indent);
262 info.addTooltipToPrevious(
new TooltipCreator() {
263 public boolean isTooltipExpandable(Object tooltipParam) {
266 public float getTooltipWidth(Object tooltipParam) {
269 public void createTooltip(TooltipMakerAPI tooltip,
boolean expanded, Object tooltipParam) {
272 tooltip.addPara(
"This officer has the following skills:", 0f);
273 tooltip.addSkillPanel(person, pad);
275 if (!data.removeSkills.isEmpty()) {
276 tooltip.addPara(
"They will lose the following skills:", opad);
278 for (String skillId : data.removeSkills) {
281 tooltip.addSkillPanel(fake, pad);
283 if (!data.removeElite.isEmpty()) {
284 tooltip.addPara(
"They will lose the elite effects of the following skills:", opad);
286 for (String skillId : data.removeElite) {
289 tooltip.addSkillPanel(fake, pad);
292 }, TooltipLocation.RIGHT);
295 data.buttonMerc = info.addAreaCheckbox(mercText,
new Object(),
sBase,
sDark,
sBright, bw, bh, pad,
true);
296 data.buttonOther.setChecked(
true);
297 data.buttonMerc.setChecked(
false);
299 info.addTooltipToPrevious(
new TooltipCreator() {
300 public boolean isTooltipExpandable(Object tooltipParam) {
303 public float getTooltipWidth(Object tooltipParam) {
306 public void createTooltip(TooltipMakerAPI tooltip,
boolean expanded, Object tooltipParam) {
307 int payPre = (int) Misc.getOfficerSalary(person,
false);
308 int payPost = (int) Misc.getOfficerSalary(person,
true);
310 tooltip.addPara(
"This officer's pay will be increased from %s to %s per month,"
311 +
" and they will want to leave after %s days, when their contract expires.", 0f,
312 Misc.getHighlightColor(),
313 Misc.getDGSCredits(payPre),
314 Misc.getDGSCredits(payPost),
317 tooltip.addPara(
"Extending the contract beyond that will require a %s.", 10f,
318 Misc.getStoryOptionColor(), Misc.STORY +
" point");
320 }, TooltipLocation.RIGHT);
322 info.addSpacer(0).getPosition().setXAlignOffset(-indent);
328 OfficerDataMap map =
getMap(dataMap);
330 for (OfficerEffectData data : map.map.values()) {
331 if (data.buttonMerc == button) {
332 data.makeMercenary =
true;
333 data.buttonMerc.setChecked(
true);
334 data.buttonOther.setChecked(
false);
336 }
else if (data.buttonOther == button) {
337 data.makeMercenary =
false;
338 data.buttonMerc.setChecked(
false);
339 data.buttonOther.setChecked(
true);
347 OfficerDataMap map =
getMap(dataMap);
349 for (OfficerEffectData data : map.map.values()) {
350 if (data.makeMercenary) {
351 Misc.setMercenary(data.data.getPerson(),
true);
352 Misc.setMercHiredNow(data.data.getPerson());
354 if (data.unusable && data.member !=
null) {
358 for (String
id : data.removeElite) {
360 PlaythroughLog.getInstance().removeOfficerSkillRecord(data.data.getPerson().getId(), id,
true);
362 for (String
id : data.removeSkills) {
364 PlaythroughLog.getInstance().removeOfficerSkillRecord(data.data.getPerson().getId(), id,
false);
365 PlaythroughLog.getInstance().removeOfficerSkillRecord(data.data.getPerson().getId(), id,
true);
367 if (data.newLevel != stats.
getLevel()) {