001package com.fs.starfarer.api.impl.combat;
002
003import java.awt.Color;
004import java.util.ArrayList;
005import java.util.EnumSet;
006import java.util.List;
007
008import com.fs.starfarer.api.Global;
009import com.fs.starfarer.api.combat.MutableShipStatsAPI;
010import com.fs.starfarer.api.combat.ShipAPI;
011import com.fs.starfarer.api.combat.WeaponAPI.WeaponType;
012import com.fs.starfarer.api.util.Misc;
013
014public class TargetingFeedStats extends BaseShipSystemScript {
015        public static final Object KEY_JITTER = new Object();
016        
017        public static final float DAMAGE_INCREASE_PERCENT = 50;
018        
019        public static final Color JITTER_UNDER_COLOR = new Color(255,50,0,125);
020        public static final Color JITTER_COLOR = new Color(255,50,0,75);
021
022        
023        public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
024                ShipAPI ship = null;
025                if (stats.getEntity() instanceof ShipAPI) {
026                        ship = (ShipAPI) stats.getEntity();
027                } else {
028                        return;
029                }
030                
031                
032                if (effectLevel > 0) {
033                        float jitterLevel = effectLevel;
034                        float maxRangeBonus = 5f;
035                        float jitterRangeBonus = jitterLevel * maxRangeBonus;
036                        for (ShipAPI fighter : getFighters(ship)) {
037                                if (fighter.isHulk()) continue;
038                                MutableShipStatsAPI fStats = fighter.getMutableStats();
039//                              fStats.getBallisticWeaponDamageMult().modifyPercent(id, DAMAGE_INCREASE_PERCENT * effectLevel);
040//                              fStats.getEnergyWeaponDamageMult().modifyPercent(id, DAMAGE_INCREASE_PERCENT * effectLevel);
041//                              fStats.getMissileWeaponDamageMult().modifyPercent(id, DAMAGE_INCREASE_PERCENT * effectLevel);
042                                
043                                fStats.getBallisticWeaponDamageMult().modifyMult(id, 1f + 0.01f * DAMAGE_INCREASE_PERCENT * effectLevel);
044                                fStats.getEnergyWeaponDamageMult().modifyMult(id, 1f + 0.01f * DAMAGE_INCREASE_PERCENT * effectLevel);
045                                fStats.getMissileWeaponDamageMult().modifyMult(id, 1f + 0.01f * DAMAGE_INCREASE_PERCENT * effectLevel);
046                                
047                                if (jitterLevel > 0) {
048                                        //fighter.setWeaponGlow(effectLevel, new Color(255,50,0,125), EnumSet.allOf(WeaponType.class));
049                                        fighter.setWeaponGlow(effectLevel, Misc.setAlpha(JITTER_UNDER_COLOR, 255), EnumSet.allOf(WeaponType.class));
050                                        
051                                        fighter.setJitterUnder(KEY_JITTER, JITTER_COLOR, jitterLevel, 5, 0f, jitterRangeBonus);
052                                        fighter.setJitter(KEY_JITTER, JITTER_UNDER_COLOR, jitterLevel, 2, 0f, 0 + jitterRangeBonus * 1f);
053                                        Global.getSoundPlayer().playLoop("system_targeting_feed_loop", ship, 1f, 1f, fighter.getLocation(), fighter.getVelocity());
054                                }
055                        }
056                }
057        }
058        
059        private List<ShipAPI> getFighters(ShipAPI carrier) {
060                List<ShipAPI> result = new ArrayList<ShipAPI>();
061                
062//              this didn't catch fighters returning for refit          
063//              for (FighterLaunchBayAPI bay : carrier.getLaunchBaysCopy()) {
064//                      if (bay.getWing() == null) continue;
065//                      result.addAll(bay.getWing().getWingMembers());
066//              }
067                
068                for (ShipAPI ship : Global.getCombatEngine().getShips()) {
069                        if (!ship.isFighter()) continue;
070                        if (ship.getWing() == null) continue;
071                        if (ship.getWing().getSourceShip() == carrier) {
072                                result.add(ship);
073                        }
074                }
075                
076                return result;
077        }
078        
079        
080        public void unapply(MutableShipStatsAPI stats, String id) {
081                ShipAPI ship = null;
082                if (stats.getEntity() instanceof ShipAPI) {
083                        ship = (ShipAPI) stats.getEntity();
084                } else {
085                        return;
086                }
087                for (ShipAPI fighter : getFighters(ship)) {
088                        if (fighter.isHulk()) continue;
089                        MutableShipStatsAPI fStats = fighter.getMutableStats();
090                        fStats.getBallisticWeaponDamageMult().unmodify(id);
091                        fStats.getEnergyWeaponDamageMult().unmodify(id);
092                        fStats.getMissileWeaponDamageMult().unmodify(id);
093                }
094        }
095        
096        
097        public StatusData getStatusData(int index, State state, float effectLevel) {
098                float percent = DAMAGE_INCREASE_PERCENT * effectLevel;
099                if (index == 0) {
100                        //return new StatusData("+" + (int)percent + "% fighter damage", false);
101                        return new StatusData("" + Misc.getRoundedValueMaxOneAfterDecimal(1f + DAMAGE_INCREASE_PERCENT * effectLevel * 0.01f) + "x fighter damage", false);
102                }
103                return null;
104        }
105
106        
107}
108
109
110
111
112
113
114
115