001package com.fs.starfarer.api.impl.combat;
002
003import java.util.HashMap;
004import java.util.Map;
005
006import com.fs.starfarer.api.Global;
007import com.fs.starfarer.api.combat.MutableShipStatsAPI;
008import com.fs.starfarer.api.combat.ShipAPI;
009import com.fs.starfarer.api.combat.ShipAPI.HullSize;
010import com.fs.starfarer.api.combat.ShipSystemAPI;
011import com.fs.starfarer.api.impl.campaign.ids.Tags;
012
013public class DamperFieldStats extends BaseShipSystemScript {
014
015        private static Map mag = new HashMap();
016        static {
017                mag.put(HullSize.FIGHTER, 0.33f);
018                mag.put(HullSize.FRIGATE, 0.33f);
019                mag.put(HullSize.DESTROYER, 0.33f);
020                mag.put(HullSize.CRUISER, 0.5f);
021                mag.put(HullSize.CAPITAL_SHIP, 0.5f);
022        }
023        
024        protected Object STATUSKEY1 = new Object();
025        
026        //public static final float INCOMING_DAMAGE_MULT = 0.25f;
027        //public static final float INCOMING_DAMAGE_CAPITAL = 0.5f;
028        
029        public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
030                effectLevel = 1f;
031                
032                float mult = (Float) mag.get(HullSize.CRUISER);
033                if (stats.getVariant() != null) {
034                        mult = (Float) mag.get(stats.getVariant().getHullSize());
035                }
036                stats.getHullDamageTakenMult().modifyMult(id, 1f - (1f - mult) * effectLevel);
037                stats.getArmorDamageTakenMult().modifyMult(id, 1f - (1f - mult) * effectLevel);
038                stats.getEmpDamageTakenMult().modifyMult(id, 1f - (1f - mult) * effectLevel);
039                
040                
041                ShipAPI ship = null;
042                boolean player = false;
043                if (stats.getEntity() instanceof ShipAPI) {
044                        ship = (ShipAPI) stats.getEntity();
045                        player = ship == Global.getCombatEngine().getPlayerShip();
046                }
047                if (player) {
048                        ShipSystemAPI system = getDamper(ship);
049                        if (system != null) {
050                                float percent = (1f - mult) * effectLevel * 100;
051                                Global.getCombatEngine().maintainStatusForPlayerShip(STATUSKEY1,
052                                        system.getSpecAPI().getIconSpriteName(), system.getDisplayName(),
053                                        (int) Math.round(percent) + "% less damage taken", false);
054                        }
055                }
056        }
057        
058        public static ShipSystemAPI getDamper(ShipAPI ship) {
059//              ShipSystemAPI system = ship.getSystem();
060//              if (system != null && system.getId().equals("damper")) return system;
061//              if (system != null && system.getId().equals("damper_omega")) return system;
062//              if (system != null && system.getSpecAPI() != null && system.getSpecAPI().hasTag(Tags.SYSTEM_USES_DAMPER_FIELD_AI)) return system;
063//              return ship.getPhaseCloak();
064                ShipSystemAPI system = ship.getPhaseCloak();
065                if (system != null && system.getId().equals("damper")) return system;
066                if (system != null && system.getId().equals("damper_omega")) return system;
067                if (system != null && system.getSpecAPI() != null && system.getSpecAPI().hasTag(Tags.SYSTEM_USES_DAMPER_FIELD_AI)) return system;
068                return ship.getSystem();
069        }
070        
071        public void unapply(MutableShipStatsAPI stats, String id) {
072                stats.getHullDamageTakenMult().unmodify(id);
073                stats.getArmorDamageTakenMult().unmodify(id);
074                stats.getEmpDamageTakenMult().unmodify(id);
075        }
076        
077        
078//      public StatusData getStatusData(int index, State state, float effectLevel) {
079//              float mult = (Float) mag.get(HullSize.CRUISER);
080//              if (stats.getVariant() != null) {
081//                      mult = (Float) mag.get(stats.getVariant().getHullSize());
082//              }
083//              effectLevel = 1f;
084//              float percent = (1f - INCOMING_DAMAGE_MULT) * effectLevel * 100;
085//              if (index == 0) {
086//                      return new StatusData((int) percent + "% less damage taken", false);
087//              }
088//              return null;
089//      }
090}