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}