Advertisement
DarkRevenant

Untitled

Apr 15th, 2014
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.31 KB | None | 0 0
  1. package com.fs.starfarer.api.impl.campaign;
  2.  
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6.  
  7. import com.fs.starfarer.api.Global;
  8. import com.fs.starfarer.api.campaign.FleetDataAPI;
  9. import com.fs.starfarer.api.campaign.BuffManagerAPI.Buff;
  10. import com.fs.starfarer.api.combat.HullModEffect;
  11. import com.fs.starfarer.api.combat.MutableShipStatsAPI;
  12. import com.fs.starfarer.api.combat.MutableStat;
  13. import com.fs.starfarer.api.combat.ShipAPI;
  14. import com.fs.starfarer.api.combat.MutableStat.StatMod;
  15. import com.fs.starfarer.api.combat.ShipAPI.HullSize;
  16. import com.fs.starfarer.api.fleet.FleetMemberAPI;
  17.  
  18. public class TowCable implements HullModEffect {
  19.    
  20.     public static final String HULLMOD_ID = "tow_cable";
  21.    
  22.     public static class TowCableBuff implements Buff {
  23.         public boolean wasApplied = false;
  24.         private String buffId;
  25.        
  26.         public TowCableBuff(String buffId) {
  27.             this.buffId = buffId;
  28.         }
  29.        
  30.         public boolean isExpired() {
  31.             return wasApplied;
  32.         }
  33.         public String getId() {
  34.             return buffId;
  35.         }
  36.         public void apply(FleetMemberAPI member) {
  37.             // this ensures the buff lasts for exactly one frame unless wasApplied is reset (as it is later)
  38.             wasApplied = true;
  39.             member.getStats().getMaxBurnLevel().modifyFlat(buffId, 1);
  40.         }
  41.         public void advance(float days) {
  42.         }
  43.     };
  44.    
  45.    
  46.     public TowCable() {
  47.  
  48.     }
  49.    
  50.     public void advanceInCampaign(FleetMemberAPI member, float amount) {
  51.         if (member.getFleetData() == null) return;
  52.         if (!member.canBeDeployedForCombat()) {
  53.             cleanUpTowCableBuffBy(member);
  54.             return;
  55.         }
  56.        
  57.         FleetDataAPI data = member.getFleetData();
  58.         List<FleetMemberAPI> all = data.getMembersListCopy();
  59.        
  60.         int numCables = 0;
  61.         int thisCableIndex = -1;
  62.         for (FleetMemberAPI curr : all) {
  63.             if (!curr.canBeDeployedForCombat()) continue;
  64.             if (curr.getVariant().getHullMods().contains(HULLMOD_ID)) {
  65.                 if (curr == member) {
  66.                     thisCableIndex = numCables;
  67.                 }
  68.                 numCables++;
  69.             }
  70.         }
  71.         if (numCables <= 0 || thisCableIndex == -1) {
  72.             cleanUpTowCableBuffBy(member);
  73.             return;
  74.         }
  75.        
  76.         TowCableBuff buff = getTowCableBuffBy(member);
  77.         Map<FleetMemberAPI, Integer> cables = new HashMap<FleetMemberAPI, Integer>();
  78.         float towSpeed = member.getStats().getMaxBurnLevel().getModifiedValue();
  79.         FleetMemberAPI thisCableTarget = null;
  80.        
  81.         for (int cableIndex = 0; cableIndex < numCables; cableIndex++) {
  82.             FleetMemberAPI slowest = getSlowest(all, towSpeed, cables);
  83.             if (slowest == null) break;
  84.             //slowest.getStats().getMaxBurnLevel().getModifiedValue()
  85.             Integer bonus = cables.get(slowest);
  86.             if (bonus == null) bonus = new Integer(0);
  87.             bonus++;
  88.             cables.put(slowest, bonus);
  89.            
  90.             if (cableIndex == thisCableIndex) {
  91.                 thisCableTarget = slowest;
  92.                 Buff existing = slowest.getBuffManager().getBuff(buff.getId());
  93.                 if (existing == buff) {
  94.                     // make sure it's using the same buff rather than reapplying it,
  95.                     // which would trigger a full stat recompute for the entire FLEET every frame
  96.                     buff.wasApplied = false;
  97.                     //System.out.println("renewed on " + slowest);
  98.                 } else {
  99.                     buff.wasApplied = false;
  100.                     slowest.getBuffManager().addBuff(buff);
  101.                     //System.out.println("added to " + slowest);
  102.                 }
  103.                 break;
  104.             }
  105.         }
  106.        
  107.         for (FleetMemberAPI curr : all) {
  108.             if (curr != thisCableTarget) {
  109.                 curr.getBuffManager().removeBuff(buff.getId());
  110.             }
  111.         }
  112.     }
  113.    
  114.     private FleetMemberAPI getSlowest(List<FleetMemberAPI> all, float speedCutoff, Map<FleetMemberAPI, Integer> cables) {
  115.         FleetMemberAPI slowest = null;
  116.         float minLevel = Float.MAX_VALUE;
  117.         for (FleetMemberAPI curr : all) {
  118.             if (!isSuitable(curr)) continue;
  119.            
  120.             float baseBurn = getMaxBurnWithoutCables(curr);
  121.             Integer bonus = cables.get(curr);
  122.             if (bonus == null) bonus = new Integer(0);
  123.            
  124.             if (bonus >= getMaxCablesFor(curr)) continue;
  125.            
  126.             float burnLevel = baseBurn + bonus;
  127.            
  128.             if (burnLevel >= speedCutoff) continue;
  129.        
  130.             if (burnLevel < minLevel) {
  131.                 minLevel = burnLevel;
  132.                 slowest = curr;
  133.             }
  134.         }
  135.         return slowest;    
  136.     }
  137.    
  138.     private int getMaxCablesFor(FleetMemberAPI member) {
  139.         switch (member.getHullSpec().getHullSize()) {
  140.         case CAPITAL_SHIP: return 4;
  141.         case CRUISER: return 3;
  142.         case DESTROYER: return 2;
  143.         case FRIGATE: return 1;
  144.         }
  145.         return 1;
  146.     }
  147.    
  148.     private float getMaxBurnWithoutCables(FleetMemberAPI member) {
  149.         MutableStat burn = member.getStats().getMaxBurnLevel();
  150.         float val = burn.getModifiedValue();
  151.         float sub = 0;
  152.         for (StatMod mod : burn.getFlatMods().values()) {
  153.             if (mod.getSource().startsWith(HULLMOD_ID)) sub++;
  154.         }
  155.         return Math.max(0, val - sub);
  156.     }
  157.    
  158.     private boolean isSuitable(FleetMemberAPI member) {
  159.         if (member.isFighterWing()) return false;
  160.         return true;
  161.     }
  162.    
  163.     private void cleanUpTowCableBuffBy(FleetMemberAPI member) {
  164.         if (member.getFleetData() == null) return;
  165.         FleetDataAPI data = member.getFleetData();
  166.         TowCableBuff buff = getTowCableBuffBy(member);
  167.         for (FleetMemberAPI curr : data.getMembersListCopy()) {
  168.             curr.getBuffManager().removeBuff(buff.getId());
  169.         }
  170.     }
  171.    
  172.     /**
  173.      * One instance of the buff object per ship with a Tow Cable.
  174.      */
  175.     public static final String TOW_CABLE_KEY = "TowCable_PersistentBuffs";
  176.    
  177.     @SuppressWarnings("unchecked")
  178.     private TowCableBuff getTowCableBuffBy(FleetMemberAPI member) {
  179.         Map<FleetMemberAPI, TowCableBuff> buffs;
  180.         if (Global.getSector().getPersistentData().containsKey(TOW_CABLE_KEY)) {
  181.             buffs = (Map<FleetMemberAPI, TowCableBuff>) Global.getSector().getPersistentData().get(TOW_CABLE_KEY);
  182.         } else {
  183.             buffs = new HashMap<FleetMemberAPI, TowCableBuff>();
  184.             Global.getSector().getPersistentData().put(TOW_CABLE_KEY, buffs);
  185.         }
  186.        
  187.         //new HashMap<FleetMemberAPI, TowCableBuff>();
  188.         TowCableBuff buff = buffs.get(member);
  189.         if (buff == null) {
  190.             String id = HULLMOD_ID + "_" + member.getId();
  191.             buff = new TowCableBuff(id);
  192.             buffs.put(member, buff);
  193.         }
  194.         return buff;
  195.     }
  196.    
  197.  
  198.     public void advanceInCombat(ShipAPI ship, float amount) {
  199.     }
  200.    
  201.     public void applyEffectsAfterShipCreation(ShipAPI ship, String id) {
  202.     }
  203.     public void applyEffectsBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) {
  204.     }
  205.     public boolean isApplicableToShip(ShipAPI ship) {
  206.         return true;
  207.     }
  208.  
  209.     public String getDescriptionParam(int index, HullSize hullSize) {
  210.         return null;
  211.     }
  212.    
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement