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