001package com.fs.starfarer.api.impl.campaign.fleets; 002 003import java.util.List; 004 005import com.fs.starfarer.api.Global; 006import com.fs.starfarer.api.campaign.CampaignFleetAPI; 007import com.fs.starfarer.api.campaign.SectorEntityToken; 008import com.fs.starfarer.api.campaign.econ.MarketAPI; 009import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteData; 010import com.fs.starfarer.api.impl.campaign.fleets.RouteManager.RouteSegment; 011import com.fs.starfarer.api.impl.campaign.ids.Factions; 012import com.fs.starfarer.api.impl.campaign.procgen.themes.RouteFleetAssignmentAI; 013import com.fs.starfarer.api.util.IntervalUtil; 014import com.fs.starfarer.api.util.Misc; 015 016public class PilgrimageFleetAssignmentAI extends RouteFleetAssignmentAI { 017 018 public static class PilgrimageRouteData { 019 public boolean smuggling = false; 020 public MarketAPI from; 021 public SectorEntityToken to; 022 public float size; 023 public String factionId; 024 } 025 026 027 private String origFaction; 028 private IntervalUtil factionChangeTracker = new IntervalUtil(0.1f, 0.3f); 029 public PilgrimageFleetAssignmentAI(CampaignFleetAPI fleet, RouteData route) { 030 super(fleet, route); 031 //origFaction = fleet.getFaction().getId(); 032 origFaction = route.getFactionId(); 033 if (!getData().smuggling) { 034 origFaction = null; 035 factionChangeTracker = null; 036 } else { 037 factionChangeTracker.forceIntervalElapsed(); 038 doSmugglingFactionChangeCheck(0.1f); 039 } 040 } 041 042 @Override 043 protected String getStartingActionText(RouteSegment segment) { 044 return "preparing for pilgrimage to shrine on " + getData().to.getName(); 045 } 046 @Override 047 protected String getEndingActionText(RouteSegment segment) { 048 return "disembarking pilgrims at " + getData().from.getName(); 049 } 050 051 @Override 052 protected String getTravelActionText(RouteSegment segment) { 053 Integer id = segment.getId(); 054 if (id == PilgrimageFleetRouteManager.ROUTE_TRAVEL_DST) { 055 return "taking pilgrims to shrine on " + getData().to.getName(); 056 } else if (id == PilgrimageFleetRouteManager.ROUTE_TRAVEL_SRC) { 057 return "returning pilgrims to " + getData().from.getName(); 058 } 059 return super.getTravelActionText(segment); 060 } 061 062 @Override 063 protected String getInSystemActionText(RouteSegment segment) { 064 Integer id = segment.getId(); 065 066 if (id == PilgrimageFleetRouteManager.ROUTE_DST_UNLOAD) { 067 return "disembarking pilgrims at shrine on " + getData().to.getName(); 068 } else if (id == PilgrimageFleetRouteManager.ROUTE_DST_LOAD) { 069 return "embarking pilgrims for return voyage to " + getData().from.getName(); 070 } 071 return super.getInSystemActionText(segment); 072 } 073 074 protected PilgrimageRouteData getData() { 075 PilgrimageRouteData data = (PilgrimageRouteData) route.getCustom(); 076 return data; 077 } 078 079 @Override 080 public void advance(float amount) { 081 super.advance(amount); 082 doSmugglingFactionChangeCheck(amount); 083 } 084 085 086 public void doSmugglingFactionChangeCheck(float amount) { 087 PilgrimageRouteData data = getData(); 088 if (!data.smuggling) return; 089 float days = Global.getSector().getClock().convertToDays(amount); 090 091// if (fleet.isInCurrentLocation()) { 092// System.out.println("23wefwf23"); 093// days *= 100000f; 094// } 095 096 factionChangeTracker.advance(days); 097 if (factionChangeTracker.intervalElapsed() && fleet.getAI() != null) { 098 List<MarketAPI> markets = Misc.getMarketsInLocation(fleet.getContainingLocation()); 099 MarketAPI align = null; 100 int max = 0; 101 for (MarketAPI market : markets) { 102 if (market.getFaction().isHostileTo(data.factionId)) { 103 int size = market.getSize(); 104 if (size > max) { 105 max = size; 106 align = market; 107 } 108 } 109 } 110 111 if (align == null || fleet.isInHyperspace() || 112 fleet.getContainingLocation() == data.from.getContainingLocation()) { 113 align = data.from; 114 } 115 116 117 if (align != null) { 118 String targetFac = origFaction; 119 boolean hostile = align.getFaction().isHostileTo(targetFac); 120 if (hostile) { 121 targetFac = Factions.INDEPENDENT; 122 hostile = align.getFaction().isHostileTo(targetFac); 123 } 124 if (hostile) { 125 targetFac = align.getFactionId(); 126 } 127 if (!fleet.getFaction().getId().equals(targetFac)) { 128 fleet.setFaction(targetFac, true); 129 } 130 } else { 131 String targetFac = origFaction; 132 if (fleet.isInHyperspace()) { 133 targetFac = Factions.INDEPENDENT; 134 } 135 if (!fleet.getFaction().getId().equals(targetFac)) { 136 fleet.setFaction(targetFac, true); 137 } 138 } 139 } 140 } 141 142} 143 144 145 146 147 148 149 150 151 152