001package com.fs.starfarer.api.impl.campaign.intel.bar.events;
002
003import java.util.Random;
004
005import org.lwjgl.util.vector.Vector2f;
006
007import com.fs.starfarer.api.EveryFrameScript;
008import com.fs.starfarer.api.Global;
009import com.fs.starfarer.api.campaign.CampaignFleetAPI;
010import com.fs.starfarer.api.campaign.FleetAssignment;
011import com.fs.starfarer.api.campaign.StarSystemAPI;
012import com.fs.starfarer.api.campaign.rules.MemoryAPI;
013import com.fs.starfarer.api.characters.AbilityPlugin;
014import com.fs.starfarer.api.characters.FullName.Gender;
015import com.fs.starfarer.api.impl.campaign.DebugFlags;
016import com.fs.starfarer.api.impl.campaign.fleets.AutoDespawnScript;
017import com.fs.starfarer.api.impl.campaign.fleets.FleetFactoryV3;
018import com.fs.starfarer.api.impl.campaign.fleets.FleetParamsV3;
019import com.fs.starfarer.api.impl.campaign.ids.Abilities;
020import com.fs.starfarer.api.impl.campaign.ids.Factions;
021import com.fs.starfarer.api.impl.campaign.ids.FleetTypes;
022import com.fs.starfarer.api.impl.campaign.ids.MemFlags;
023import com.fs.starfarer.api.util.Misc;
024
025public class TriTachLoanIncentiveScript implements EveryFrameScript {
026
027        protected float delayDays;
028        protected boolean sentFleet;
029        //protected TriTachLoanIntel intel;
030        protected Gender gender;
031        protected long seed;
032        public TriTachLoanIncentiveScript(TriTachLoanIntel intel) {
033                //this.intel = intel;
034                gender = intel.getEvent().getPerson().getGender();
035                seed = Misc.genRandomSeed();
036                
037                // revenge is a dish best served after at least this many days
038                delayDays = 200f + (float) Math.random() * 100f;
039                if (DebugFlags.BAR_DEBUG) {
040                        delayDays = 0f;
041                }
042        }
043        
044        protected StarSystemAPI systemPlayerIsIn = null;
045        protected float daysInSystem = 0f;
046        public void advance(float amount) {
047                if (sentFleet) return;
048                
049                float days = Misc.getDays(amount);
050                //days *= 1000f;
051                delayDays -= days;
052                if (delayDays > 0) return;
053                
054                
055                final CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
056                float distFromCore = playerFleet.getLocationInHyperspace().length();
057                if (distFromCore > 30000f) {
058                        daysInSystem = 0f;
059                        systemPlayerIsIn = null;
060                        return;
061                }
062                        
063                if (!(playerFleet.getContainingLocation() instanceof StarSystemAPI)) {
064                        if ((daysInSystem > 7f || DebugFlags.BAR_DEBUG) && systemPlayerIsIn != null) {
065                                float dist = Misc.getDistance(systemPlayerIsIn.getLocation(), playerFleet.getLocationInHyperspace());
066                                if (dist < 3000f) {
067                                        sendFleet();
068                                }
069                        }
070                        daysInSystem = 0f;
071                        systemPlayerIsIn = null;
072                        return;
073                }
074                
075                systemPlayerIsIn = (StarSystemAPI)playerFleet.getContainingLocation();
076                daysInSystem += days;
077        }
078        
079        protected void sendFleet() {
080                if (sentFleet) return;
081                sentFleet = true;
082                CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
083                CampaignFleetAPI hunter = createBountyHunter();
084                if (hunter != null) {
085                        Global.getSector().getHyperspace().addEntity(hunter);
086                        Vector2f hunterLoc = Misc.getPointAtRadius(playerFleet.getLocationInHyperspace(), 500f);
087                        hunter.setLocation(hunterLoc.x, hunterLoc.y);
088                        
089                        hunter.getAI().addAssignmentAtStart(FleetAssignment.INTERCEPT, playerFleet, 1000f, null);
090                        
091                        Misc.giveStandardReturnToSourceAssignments(hunter, false);
092                        
093                        hunter.getMemoryWithoutUpdate().set("$ttli_bountyHunter", true);
094                        //PersonAPI person = hunter.getCommander();
095                        //person.getMemoryWithoutUpdate().set("$mpm_eventRef", this, mission.getBaseDuration());
096                }
097                
098        }
099
100        protected CampaignFleetAPI createBountyHunter() {
101                float pts = 200f;
102                FleetParamsV3 params = new FleetParamsV3(
103                                null,
104                                Global.getSector().getPlayerFleet().getLocationInHyperspace(),
105                                Factions.TRITACHYON,
106                                1f, 
107                                FleetTypes.MERC_BOUNTY_HUNTER,
108                                pts, // combatPts
109                                0f, // freighterPts 
110                                pts * 0.1f, // tankerPts
111                                0f, // transportPts
112                                0f, // linerPts
113                                0f, // utilityPts
114                                0f // qualityMod
115                );
116                params.officerNumberBonus = 4;
117                params.officerLevelBonus = 3;
118                params.doctrineOverride = Global.getSector().getFaction(Factions.TRITACHYON).getDoctrine().clone();
119                params.doctrineOverride.setWarships(3);
120                params.doctrineOverride.setPhaseShips(3);
121                params.doctrineOverride.setCarriers(1);
122                params.random = new Random(seed);
123                
124                CampaignFleetAPI fleet = FleetFactoryV3.createFleet(params);
125                if (fleet.isEmpty()) fleet = null;
126                
127                if (fleet != null) {
128                        fleet.setFaction(Factions.INDEPENDENT, true);
129                        Misc.makeLowRepImpact(fleet, "ttli");
130
131                        fleet.addScript(new AutoDespawnScript(fleet));
132                        
133                        MemoryAPI memory = fleet.getMemoryWithoutUpdate();
134                        memory.set(MemFlags.MEMORY_KEY_MAKE_HOSTILE, true);
135                        
136                        String hisOrHer = "his";
137                        if (gender == Gender.FEMALE) hisOrHer = "her";
138                        memory.set("$ttli_hisOrHer", hisOrHer);
139                        
140                        AbilityPlugin eb = fleet.getAbility(Abilities.EMERGENCY_BURN);
141                        if (eb != null) eb.activate();
142                }
143                return fleet;
144        }
145        
146        
147
148        public boolean isDone() {
149                return sentFleet;
150        }
151
152        public boolean runWhilePaused() {
153                return false;
154        }
155
156}