001package com.fs.starfarer.api.impl.campaign.fleets;
002
003import com.fs.starfarer.api.EveryFrameScript;
004import com.fs.starfarer.api.campaign.CampaignFleetAPI;
005import com.fs.starfarer.api.campaign.FleetAssignment;
006import com.fs.starfarer.api.campaign.FleetOrStubAPI;
007import com.fs.starfarer.api.campaign.FleetStubAPI;
008import com.fs.starfarer.api.campaign.SectorEntityToken;
009import com.fs.starfarer.api.campaign.StarSystemAPI;
010import com.fs.starfarer.api.impl.campaign.fleets.PatrolFleetManagerV2.PatrolFleetData;
011import com.fs.starfarer.api.util.WeightedRandomPicker;
012
013public class PatrolAssignmentAIV2 implements EveryFrameScript {
014
015        private FleetStubAPI stub;
016        private PatrolFleetData data;
017        
018        //private IntervalUtil tracker = new IntervalUtil(0.5f, 1.5f);
019
020        public PatrolAssignmentAIV2(FleetStubAPI stub, PatrolFleetData data) {
021                this.stub = stub;
022                this.data = data;
023                giveInitialAssignment();
024        }
025
026        private void giveInitialAssignment() {
027                float daysToOrbit = getDaysToOrbit() * 0.25f;
028                if (daysToOrbit < 0.2f) {
029                        daysToOrbit = 0.2f;
030                }
031                FleetOrStubAPI fleet = getAssignable();
032                //fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
033                fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
034                                "preparing for patrol duty");
035        }
036
037        private FleetOrStubAPI getAssignable() {
038                FleetOrStubAPI fleet = stub;
039                if (stub.getFleet() != null) {
040                        fleet = stub.getFleet();
041                }
042                return fleet;
043        }
044        
045        private boolean orderedReturn = false;
046        public void advance(float amount) {
047                //float days = Global.getSector().getClock().convertToDays(amount);
048                
049                FleetOrStubAPI fleet = getAssignable();
050                
051                if (fleet.getCurrentAssignment() != null) {
052                        if (fleet instanceof CampaignFleetAPI) {
053                                float fp = ((CampaignFleetAPI)fleet).getFleetPoints();
054                                if (fp < data.startingFleetPoints && !orderedReturn) {
055                                        orderedReturn = true;
056                                        fleet.clearAssignments();
057                                        
058                                        fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
059                                                                                "returning to " + data.sourceMarket.getName());
060                                        fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), 1f,
061                                                                                "standing down from patrol duty");
062                                        fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, data.sourceMarket.getPrimaryEntity(), 1000);
063                                }
064                        }
065                } else {
066                        float daysToOrbit = getDaysToOrbit();
067                        StarSystemAPI system = data.sourceMarket.getStarSystem();
068                        if (system == null) {
069                                fleet.addAssignment(FleetAssignment.DEFEND_LOCATION, data.sourceMarket.getPrimaryEntity(), 20,
070                                                                        "patrolling around " + data.sourceMarket.getName());
071                                fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
072                                                                        "returning to " + data.sourceMarket.getName());
073                                fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
074                                                                        "standing down from patrol duty");
075                        } else {
076                                if ((float) Math.random() > 0.95f) {
077                                        fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, system.getHyperspaceAnchor(), 20,
078                                                                                "patrolling around the " + system.getBaseName() + " star system");
079                                        fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
080                                                                                "returning to " + data.sourceMarket.getName());
081                                        fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
082                                                                                "standing down from patrol duty");
083                                } else {
084                                        WeightedRandomPicker<SectorEntityToken> defenseTargets = new WeightedRandomPicker<SectorEntityToken>();
085                                        SectorEntityToken generalPatrol = data.sourceMarket.getPrimaryEntity().getContainingLocation().createToken(0, 0);
086                                        
087                                        defenseTargets.add(generalPatrol, 30);
088                                        
089                                        SectorEntityToken pick = defenseTargets.pick();
090                                        
091                                        if (pick == generalPatrol) {
092                                                fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, system.getStar(), 30,
093                                                                "patrolling the " + system.getBaseName() + " star system");
094                                                fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
095                                                                "returning to " + data.sourceMarket.getName());
096                                                fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
097                                                                "standing down from patrol duty");
098                                        } else {
099                                                fleet.addAssignment(FleetAssignment.DEFEND_LOCATION, pick, 30,
100                                                                "patrolling around " + pick.getName());
101                                                fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, data.sourceMarket.getPrimaryEntity(), 1000,
102                                                                "returning to " + data.sourceMarket.getName());
103                                                fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, data.sourceMarket.getPrimaryEntity(), daysToOrbit,
104                                                                "standing down from patrol duty");
105                                        }
106                                }
107                        }
108                }
109        }
110
111        
112        private float getDaysToOrbit() {
113                float daysToOrbit = 0f;
114                switch (data.type) {
115                case FAST:
116                        daysToOrbit += 2f;
117                        break;
118                case COMBAT:
119                        daysToOrbit += 4f;
120                        break;
121                case HEAVY:
122                        daysToOrbit += 6f;
123                        break;
124                }
125                
126                daysToOrbit = daysToOrbit * (0.5f + (float) Math.random() * 0.5f);
127                return daysToOrbit;
128        }
129        
130        public boolean isDone() {
131                return false;
132        }
133        public boolean runWhilePaused() {
134                return false;
135        }
136}
137
138
139
140
141
142
143