Starsector API
Loading...
Searching...
No Matches
ApplyCRDamage.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.rulecmd;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Map;
6import java.util.Random;
7
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.campaign.CampaignFleetAPI;
10import com.fs.starfarer.api.campaign.InteractionDialogAPI;
11import com.fs.starfarer.api.campaign.TextPanelAPI;
12import com.fs.starfarer.api.campaign.rules.MemoryAPI;
13import com.fs.starfarer.api.fleet.FleetMemberAPI;
14import com.fs.starfarer.api.util.Misc;
15import com.fs.starfarer.api.util.Misc.Token;
16import com.fs.starfarer.api.util.WeightedRandomPicker;
17
37public class ApplyCRDamage extends BaseCommandPlugin {
38
39
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;
43
44 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
45 //CampaignFleetAPI other = (CampaignFleetAPI) dialog.getInteractionTarget();
46
47 TextPanelAPI text = dialog.getTextPanel();
48 //Color red = Misc.getNegativeHighlightColor();
49
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);
54
55 long seed;
56 if (dialog.getInteractionTarget() != null) {
57 seed = Misc.getSalvageSeed(dialog.getInteractionTarget());
58 seed += (ruleId == null ? 0 : ruleId.hashCode());
59 seed /= 321L;
60 seed *= (Global.getSector().getClock().getMonth() + 10 + (baseFP * fpMult * crMult) * 10f);
61 } else {
62 seed = Misc.genRandomSeed();
63 }
64
65 Random random = Misc.getRandom(seed, 7);
66
67 applyCRDamage(playerFleet, baseFP * fpMult, crMult, desc, text, random);
68
69 return true;
70 }
71
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());
78 }
79
80 float totalDamage = damageFP;
81 float picked = 0f;
82 while (picked < totalDamage && !picker.isEmpty()) {
83 FleetMemberAPI pick = picker.pickAndRemove();
84 shipsToDamage.add(pick);
85 picked += pick.getFleetPointCost();
86 }
87
88
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);
92 crLost *= crMult;
93 if (crLost > 0) {
94 member.getRepairTracker().applyCREvent(-crLost, desc);
95 if (text != null) {
96 AddRemoveCommodity.addCRLossText(member, text, crLost);
97 }
98 }
99 }
100 }
101
102}
103
104
105
106
107
108
109
static SectorAPI getSector()
Definition Global.java:59
static void addCRLossText(FleetMemberAPI member, TextPanelAPI text, float crLoss)
static void applyCRDamage(CampaignFleetAPI fleet, float damageFP, float crMult, String desc, TextPanelAPI text, Random random)
boolean execute(String ruleId, InteractionDialogAPI dialog, List< Token > params, Map< String, MemoryAPI > memoryMap)