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