001package com.fs.starfarer.api.impl.combat.threat; 002 003import java.util.ArrayList; 004import java.util.List; 005import java.util.Random; 006 007import com.fs.starfarer.api.Global; 008import com.fs.starfarer.api.campaign.CampaignFleetAPI; 009import com.fs.starfarer.api.campaign.CargoAPI; 010import com.fs.starfarer.api.campaign.CargoStackAPI; 011import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.DataForEncounterSide; 012import com.fs.starfarer.api.campaign.FleetEncounterContextPlugin.FleetMemberData; 013import com.fs.starfarer.api.campaign.InteractionDialogAPI; 014import com.fs.starfarer.api.combat.BattleCreationContext; 015import com.fs.starfarer.api.combat.ShipVariantAPI; 016import com.fs.starfarer.api.fleet.FleetMemberAPI; 017import com.fs.starfarer.api.impl.campaign.DebugFlags; 018import com.fs.starfarer.api.impl.campaign.FleetEncounterContext; 019import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.BaseFIDDelegate; 020import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.FIDConfig; 021import com.fs.starfarer.api.impl.campaign.FleetInteractionDialogPluginImpl.FIDConfigGen; 022import com.fs.starfarer.api.impl.campaign.ids.Tags; 023import com.fs.starfarer.api.impl.combat.threat.ConstructionSwarmSystemScript.SwarmConstructableVariant; 024import com.fs.starfarer.api.loading.HullModSpecAPI; 025import com.fs.starfarer.api.util.Misc; 026import com.fs.starfarer.api.util.WeightedRandomPicker; 027 028public class ThreatFIDConfig implements FIDConfigGen { 029 public FIDConfig createConfig() { 030 FIDConfig config = new FIDConfig(); 031 032 config.alwaysAttackVsAttack = true; 033 //config.alwaysPursue = true; 034 config.alwaysHarry = true; 035 config.showTransponderStatus = false; 036 //config.showEngageText = false; 037 config.lootCredits = false; 038 039 040 config.delegate = new BaseFIDDelegate() { 041 public void postPlayerSalvageGeneration(InteractionDialogAPI dialog, FleetEncounterContext context, CargoAPI salvage) { 042 if (!(dialog.getInteractionTarget() instanceof CampaignFleetAPI)) return; 043 044 float mult = context.computePlayerContribFraction(); 045 float p = Global.getSettings().getFloat("salvageHullmodProb"); 046 float pItem = Global.getSettings().getFloat("salvageHullmodRequiredItemProb"); 047 048 CampaignFleetAPI fleet = (CampaignFleetAPI) dialog.getInteractionTarget(); 049 050 DataForEncounterSide data = context.getDataFor(fleet); 051 List<FleetMemberAPI> losses = new ArrayList<FleetMemberAPI>(); 052 for (FleetMemberData fmd : data.getOwnCasualties()) { 053 losses.add(fmd.getMember()); 054 } 055 056 Random random = Misc.getRandom(Misc.getSalvageSeed(fleet), 7); 057 //random = new Random(); 058 059 for (FleetMemberAPI member : losses) { 060 if (member.getHullSpec().hasTag(Tags.THREAT_FABRICATOR)) { 061 int rolls = 0; 062 switch (member.getHullSpec().getHullSize()) { 063 case CAPITAL_SHIP: rolls = 30; break; 064 case CRUISER: rolls = 18; break; 065 case DESTROYER: rolls = 12; break; 066 case FRIGATE: rolls = 6; break; 067 } 068 069 WeightedRandomPicker<SwarmConstructableVariant> picker = new WeightedRandomPicker<>(random); 070 for (SwarmConstructableVariant curr : ConstructionSwarmSystemScript.CONSTRUCTABLE) { 071 picker.add(curr, curr.dp); 072 } 073 074 for (int i = 0; i < rolls; i++) { 075 SwarmConstructableVariant pick = picker.pick(); 076 ShipVariantAPI variant = Global.getSettings().getVariant(pick.variantId); 077 078 for (String id : variant.getHullMods()) { 079 if (!variant.getHullSpec().isBuiltInMod(id)) { 080 if (random.nextFloat() < pItem && random.nextFloat() < mult) { 081 HullModSpecAPI spec = Global.getSettings().getHullModSpec(id); 082 CargoStackAPI item = spec.getEffect().getRequiredItem(); 083 if (item != null) { 084 boolean addToLoot = true; 085 if (item.getSpecialItemSpecIfSpecial() != null && item.getSpecialItemSpecIfSpecial().hasTag(Tags.NO_DROP)) { 086 addToLoot = false; 087 } else if (item.getResourceIfResource() != null && item.getResourceIfResource().hasTag(Tags.NO_DROP)) { 088 addToLoot = false; 089 } else if (item.getFighterWingSpecIfWing() != null && item.getFighterWingSpecIfWing().hasTag(Tags.NO_DROP)) { 090 addToLoot = false; 091 } else if (item.getWeaponSpecIfWeapon() != null && item.getWeaponSpecIfWeapon().hasTag(Tags.NO_DROP)) { 092 addToLoot = false; 093 } 094 if (addToLoot) { 095 salvage.addItems(item.getType(), item.getData(), 1); 096 } 097 } 098 } 099 } 100 101 //if (random.nextFloat() > mult) continue; 102 if (random.nextFloat() < p && random.nextFloat() < mult) { 103 HullModSpecAPI spec = Global.getSettings().getHullModSpec(id); 104 boolean known = Global.getSector().getPlayerFaction().knowsHullMod(id); 105 if (DebugFlags.ALLOW_KNOWN_HULLMOD_DROPS) known = false; 106 if (known || spec.isHidden() || spec.isHiddenEverywhere()) continue; 107 //if (spec.isAlwaysUnlocked()) continue; 108 if (spec.hasTag(Tags.HULLMOD_NO_DROP)) continue; 109 110 salvage.addHullmods(id, 1); 111 } 112 } 113 } 114 } 115 } 116 } 117 118 public void battleContextCreated(InteractionDialogAPI dialog, BattleCreationContext bcc) { 119 bcc.aiRetreatAllowed = false; 120 bcc.fightToTheLast = true; 121 122 if (bcc.getOtherFleet() != null) { 123 for (FleetMemberAPI curr : bcc.getOtherFleet().getMembersWithFightersCopy()) { 124 if (curr.getHullSpec().hasTag(Tags.THREAT_FABRICATOR)) { 125 bcc.forceObjectivesOnMap = true; 126 break; 127 } 128 } 129 } 130 131 Global.getSector().getPlayerMemoryWithoutUpdate().set("$encounteredThreat", true); 132 Global.getSector().getPlayerMemoryWithoutUpdate().set("$encounteredWeird", true); 133 //bcc.enemyDeployAll = true; 134 } 135 }; 136 return config; 137 } 138} 139 140 141 142 143