40 public boolean execute(String ruleId, InteractionDialogAPI dialog, List<Token> params, Map<String, MemoryAPI> memoryMap) {
41 if (dialog ==
null)
return false;
42 if (!(dialog.getInteractionTarget() instanceof CampaignFleetAPI))
return false;
47 TextPanelAPI text = dialog.getTextPanel();
50 float baseFP = params.get(0).getFloat(memoryMap);
51 float fpMult = params.get(1).getFloat(memoryMap);
52 float crMult = params.get(2).getFloat(memoryMap);
53 String desc = params.get(3).getString(memoryMap);
56 if (dialog.getInteractionTarget() !=
null) {
57 seed = Misc.getSalvageSeed(dialog.getInteractionTarget());
58 seed += (ruleId ==
null ? 0 : ruleId.hashCode());
60 seed *= (
Global.
getSector().getClock().getMonth() + 10 + (baseFP * fpMult * crMult) * 10f);
62 seed = Misc.genRandomSeed();
65 Random random = Misc.getRandom(seed, 7);
67 applyCRDamage(playerFleet, baseFP * fpMult, crMult, desc, text, random);
72 public static void applyCRDamage(CampaignFleetAPI fleet,
float damageFP,
float crMult, String desc, TextPanelAPI text, Random random) {
73 List<FleetMemberAPI> shipsToDamage =
new ArrayList<FleetMemberAPI>();
74 WeightedRandomPicker<FleetMemberAPI> picker =
new WeightedRandomPicker<FleetMemberAPI>(random);
75 for (FleetMemberAPI member : fleet.getFleetData().getMembersListCopy()) {
76 if (member.isMothballed() && member.getRepairTracker().getBaseCR() < 0.2f)
continue;
77 picker.add(member, member.getFleetPointCost());
80 float totalDamage = damageFP;
82 while (picked < totalDamage && !picker.isEmpty()) {
83 FleetMemberAPI pick = picker.pickAndRemove();
84 shipsToDamage.add(pick);
85 picked += pick.getFleetPointCost();
89 for (FleetMemberAPI member : shipsToDamage) {
90 float crLost = Math.min(member.getRepairTracker().getBaseCR(), member.getDeployCost() * 0.5f);
91 crLost += 0.01f * (float)random.nextInt(10);
94 member.getRepairTracker().applyCREvent(-crLost, desc);