Starsector API
Loading...
Searching...
No Matches
InvestigationEvent.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.events;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Map;
6
7import org.apache.log4j.Logger;
8
9import com.fs.starfarer.api.Global;
10import com.fs.starfarer.api.campaign.FactionAPI;
11import com.fs.starfarer.api.campaign.OnMessageDeliveryScript;
12import com.fs.starfarer.api.campaign.RepLevel;
13import com.fs.starfarer.api.campaign.comm.MessagePriority;
14import com.fs.starfarer.api.campaign.events.CampaignEventTarget;
15import com.fs.starfarer.api.impl.campaign.ids.Conditions;
16import com.fs.starfarer.api.impl.campaign.ids.Factions;
17import com.fs.starfarer.api.util.WeightedRandomPicker;
18
30public class InvestigationEvent extends BaseEventPlugin {
31
32 public static Logger log = Global.getLogger(InvestigationEvent.class);
33
34// public static final String START = "start";
35// public static final String CLEAR = "clear";
36// public static final String PLAYER_GUILTY = "player_guilty";
37// public static final String PLAYER_GUILTY_FALSE = "player_false";
38// public static final String OTHER_GUILTY = "other_guilty";
39
40 public static class InvestigationResult {
41 public String stageName;
42 public float weight = 0;
43 public MessagePriority priority = MessagePriority.SECTOR;
44 public OnMessageDeliveryScript onDelivery = null;
45 public InvestigationResult(String stage, MessagePriority priority) {
46 this.stageName = stage;
47 this.priority = priority;
48 }
49 }
50
51 public static class InvestigationEventParams {
52 public String name;
53 public String startStage;
54 public String warningSender = null;
55 public MessagePriority warningPriority = MessagePriority.SECTOR;
56 public List<InvestigationResult> results = new ArrayList<InvestigationResult>();
57 public float minInitialDelay = 1f;
58 public float maxInitialDelay = 6f;
59 public float minDuration = 10f;
60 public float maxDuration = 15f;
61 public InvestigationEventParams(String name, String startStage) {
62 this.name = name;
63 this.startStage = startStage;
64 }
65
66 }
67
68 private float elapsedDays = 0f;
69 private float initialDelay = 0f;
70 private float duration = 0f;
71
72 private InvestigationEventParams params;
73
74 public void init(String type, CampaignEventTarget eventTarget) {
75 super.init(type, eventTarget);
76 }
77
78 @Override
79 public void setParam(Object param) {
80 params = (InvestigationEventParams) param;
81 }
82
83 public void startEvent() {
84 super.startEvent();
85
86 if (market != null && market.hasCondition(Conditions.DECIVILIZED)) {
87 endEvent();
88 return;
89 }
90
91 initialDelay = params.minInitialDelay + (params.maxInitialDelay - params.minInitialDelay) * (float) Math.random();
92 duration = params.minDuration + (params.maxDuration - params.minDuration) * (float) Math.random();
93
94 log.info(String.format("Starting investigation with suffix \"%s\" at %s. Delay: %f, dur: %f",
95 params.startStage, getTargetName(), initialDelay, duration));
96 }
97
98 private int stage = 0;
99 public void advance(float amount) {
100 if (!isEventStarted()) return;
101 if (isDone()) return;
102
103 float days = Global.getSector().getClock().convertToDays(amount);
104 elapsedDays += days;
105
106 if (elapsedDays >= initialDelay && stage == 0) {
107 stage++;
108 log.info("Reporting investigation stage " + params.startStage + " at priority " + params.warningPriority.name());
109 Global.getSector().reportEventStage(this, params.startStage, params.warningPriority);
110 }
111
112 if (elapsedDays >= initialDelay + duration && stage == 1) {
113 WeightedRandomPicker<InvestigationResult> picker = new WeightedRandomPicker<InvestigationResult>();
114
115 for (InvestigationResult result : params.results) {
116 picker.add(result, result.weight);
117 }
118 InvestigationResult result = picker.pick();
119 if (result.stageName != null) {
120 Global.getSector().reportEventStage(this, result.stageName, null, result.priority, result.onDelivery);
121 log.info("Investigation outcome: " + result.stageName + " at priority " + result.priority);
122 }
123
124 endEvent();
125 }
126 }
127
128
129 @Override
130 public String getEventName() {
131 return params.name;
132 }
133
134
135
136 @Override
137 public Map<String, String> getTokenReplacements() {
138 Map<String, String> map = super.getTokenReplacements();
139 if (params.warningSender != null) {
140 map.put("$sender", params.warningSender);
141 }
142 return map;
143 }
144
145 private boolean ended = false;
146 protected void endEvent() {
147 ended = true;
148 }
149
150 public boolean isDone() {
151 return ended;
152 }
153
154 public static float getPlayerRepGuiltMult(FactionAPI faction) {
155 FactionAPI player = Global.getSector().getFaction(Factions.PLAYER);
156 //RepLevel level = market.getFaction().getRelationshipLevel(player);
157 RepLevel level = faction.getRelationshipLevel(player);
158 switch (level) {
159 case COOPERATIVE:
160 return 0.1f;
161 case FRIENDLY:
162 return 0.2f;
163 case WELCOMING:
164 return 0.3f;
165 case FAVORABLE:
166 return 0.5f;
167 case NEUTRAL:
168 return 1f;
169 case SUSPICIOUS:
170 return 1.5f;
171 case INHOSPITABLE:
172 return 2f;
173 case HOSTILE:
174 return 5f;
175 case VENGEFUL:
176 return 10f;
177 }
178 return 1f;
179 }
180
181}
182
183
184
185
static Logger getLogger(Class c)
Definition Global.java:26
static SectorAPI getSector()
Definition Global.java:59
void init(String type, CampaignEventTarget eventTarget)