001package com.fs.starfarer.api.impl.campaign.enc; 002 003import java.util.Random; 004 005import org.lwjgl.util.vector.Vector2f; 006 007import com.fs.starfarer.api.campaign.CampaignFleetAPI; 008import com.fs.starfarer.api.campaign.FleetAssignment; 009import com.fs.starfarer.api.campaign.SectorEntityToken; 010import com.fs.starfarer.api.impl.campaign.fleets.AutoDespawnScript; 011import com.fs.starfarer.api.impl.campaign.ids.Factions; 012import com.fs.starfarer.api.impl.campaign.ids.FleetTypes; 013import com.fs.starfarer.api.impl.campaign.ids.Tags; 014import com.fs.starfarer.api.impl.campaign.missions.FleetCreatorMission; 015import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetQuality; 016import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.FleetSize; 017import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerNum; 018import com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.OfficerQuality; 019import com.fs.starfarer.api.impl.campaign.procgen.themes.RemnantStationFleetManager; 020import com.fs.starfarer.api.util.Misc; 021 022public class OutsideSystemRemnantEPEC extends BaseEPEncounterCreator { 023 024 @Override 025 public void createEncounter(EncounterManager manager, EncounterPoint point) { 026 if (!(point.custom instanceof RemnantStationFleetManager)) return; 027 028 Random random = manager.getRandom(); 029 RemnantStationFleetManager fm = (RemnantStationFleetManager) point.custom; 030 031 int difficulty = 0; 032 int max = 10; 033 float mult = 1f; 034 if (fm.getSource() != null && fm.getSource().getStarSystem() != null && 035 fm.getSource().getStarSystem().hasTag(Tags.THEME_REMNANT_SUPPRESSED)) { 036 max = 3; 037 mult = 0.25f; 038 } 039 040 difficulty += (int) Math.min(fm.getTotalLost() * mult, max); 041 difficulty += random.nextInt(4); 042 if (difficulty > 10) difficulty = 10; 043 044 FleetCreatorMission m = new FleetCreatorMission(random); 045 m.beginFleet(); 046 047 Vector2f loc = point.getLocInHyper(); 048 049 FleetSize size = FleetSize.MEDIUM; 050 FleetQuality quality = FleetQuality.VERY_HIGH; 051 OfficerQuality oQuality = OfficerQuality.AI_MIXED; 052 OfficerNum oNum = OfficerNum.ALL_SHIPS; 053 String type = FleetTypes.PATROL_SMALL; 054 055 if (difficulty <= 1) { 056 size = FleetSize.VERY_SMALL; 057 type = FleetTypes.PATROL_SMALL; 058 oQuality = OfficerQuality.AI_GAMMA; 059 } else if (difficulty <= 2) { 060 size = FleetSize.SMALL; 061 type = FleetTypes.PATROL_SMALL; 062 oQuality = OfficerQuality.AI_GAMMA; 063 } else if (difficulty <= 5) { 064 size = FleetSize.MEDIUM; 065 type = FleetTypes.PATROL_SMALL; 066 oQuality = OfficerQuality.AI_BETA_OR_GAMMA; 067 } else if (difficulty <= 7) { 068 size = FleetSize.LARGE; 069 type = FleetTypes.PATROL_MEDIUM; 070 oQuality = OfficerQuality.AI_BETA_OR_GAMMA; 071 } else if (difficulty == 8) { 072 size = FleetSize.LARGE; 073 type = FleetTypes.PATROL_LARGE; 074 oQuality = OfficerQuality.AI_MIXED; 075 } else if (difficulty == 9) { 076 size = FleetSize.LARGER; 077 type = FleetTypes.PATROL_LARGE; 078 oQuality = OfficerQuality.AI_ALPHA; 079 } else { 080 size = FleetSize.VERY_LARGE; 081 type = FleetTypes.PATROL_LARGE; 082 oQuality = OfficerQuality.AI_ALPHA; 083 } 084 085 m.triggerCreateFleet(size, quality, Factions.REMNANTS, type, loc); 086 m.triggerSetFleetOfficers(oNum, oQuality); 087 m.triggerSetRemnantConfigActive(); 088 m.triggerFleetUnsetAllowLongPursuit(); 089 090 CampaignFleetAPI fleet = m.createFleet(); 091 if (fleet != null) { 092 point.where.addEntity(fleet); 093 fleet.setLocation(point.loc.x, point.loc.y); 094 Vector2f spawnLoc = Misc.getPointWithinRadius(point.loc, 1000f); 095 SectorEntityToken e = point.where.createToken(spawnLoc); 096 String actionText = "patrolling"; 097 if (difficulty <= 2) actionText = "reconnoitering"; 098 fleet.addAssignment(FleetAssignment.PATROL_SYSTEM, e, 30f * random.nextFloat(), actionText); 099 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION, fm.getSource(), 1000f, "returning to " + fm.getSource().getName()); 100 fleet.addAssignment(FleetAssignment.ORBIT_PASSIVE, fm.getSource(), 3f + random.nextFloat() * 2f, "uploading encrypted data"); 101 fleet.addAssignment(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, fm.getSource(), 10f); 102 fleet.addScript(new AutoDespawnScript(fleet)); 103 } 104 } 105 106 public float getFrequencyForPoint(EncounterManager manager, EncounterPoint point) { 107 if (!EncounterManager.EP_TYPE_OUTSIDE_SYSTEM.equals(point.type)) return 0f; 108 if (!(point.custom instanceof RemnantStationFleetManager)) return 0f; 109 RemnantStationFleetManager fm = (RemnantStationFleetManager) point.custom; 110 111 float mult = 0.5f; 112 if (fm.getSource() != null && fm.getSource().getStarSystem() != null && 113 fm.getSource().getStarSystem().hasTag(Tags.THEME_REMNANT_SUPPRESSED)) { 114 mult = 0.1f; 115 } 116 117 return 10f * (float) Math.min(10f, fm.getTotalLost()) * mult; 118 } 119 120 121 122} 123 124 125 126 127