001package com.fs.starfarer.api.impl.combat.dweller; 002 003import java.awt.Color; 004 005import com.fs.starfarer.api.combat.MutableShipStatsAPI; 006import com.fs.starfarer.api.combat.ShipAPI; 007import com.fs.starfarer.api.combat.ShipAPI.HullSize; 008import com.fs.starfarer.api.impl.campaign.ids.Stats; 009import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams; 010import com.fs.starfarer.api.util.Misc; 011 012public class BaseDwellerShipCreator implements DwellerShipCreator { 013 014 public static float IMPACT_VOLUME_MULT = 0.33f; 015 016 public static float AIM_BONUS = 1f; 017 public static float MISSILE_GUIDANCE_BONUS = 1f; 018 public static float CR_BONUS = 30f; 019 public static float SENSOR_PROFILE_MULT = 0f; 020 public static float EW_PENALTY_MULT = 0.5f; 021 022 public static float FLAT_RANGE_BONUS = 200f; 023 024 public static float FLAT_ARMOR_BONUS = 50f; 025 026 027// public static String STANDARD_SWARM_EXCHANGE_CLASS = "dweller_exchange_class"; 028// public static String STANDARD_SWARM_FLOCKING_CLASS = "dweller_flocking_class"; 029 030 @Override 031 public void initBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) { 032 stats.getAutofireAimAccuracy().modifyFlat(id, AIM_BONUS); 033 stats.getMissileGuidance().modifyFlat(id, MISSILE_GUIDANCE_BONUS); 034 stats.getMaxCombatReadiness().modifyFlat(id, CR_BONUS * 0.01f); 035 036 stats.getSensorProfile().modifyMult(id, SENSOR_PROFILE_MULT); 037 038 stats.getDynamic().getMod(Stats.ELECTRONIC_WARFARE_PENALTY_MOD).modifyMult(id, EW_PENALTY_MULT); 039 040 stats.getEnergyWeaponRangeBonus().modifyFlat(id, FLAT_RANGE_BONUS); 041 stats.getBallisticWeaponRangeBonus().modifyFlat(id, FLAT_RANGE_BONUS); 042 043 stats.getEffectiveArmorBonus().modifyFlat(id, FLAT_ARMOR_BONUS); 044 } 045 046 @Override 047 public void initAfterShipCreation(ShipAPI ship, String id) { 048 ship.setDoNotRenderWeapons(true); 049 ship.setNoMuzzleFlash(true); 050 ship.setRenderEngines(false); 051 ship.setDoNotRenderVentingAnimation(true); 052 } 053 054 @Override 055 public void initAfterShipAddedToCombatEngine(ShipAPI ship, String id) { 056 ship.setDoNotRenderSprite(true); 057 } 058 059 060 @Override 061 public void initInCombat(ShipAPI ship) { 062 initBasicShipProperties(ship); 063 064 DwellerShroud shroud = createShroud(ship); 065 DwellerCombatPlugin plugin = createPlugin(ship); 066 067 setOverloadColorAndText(ship, shroud); 068 } 069 070 protected DwellerShroud createShroud(ShipAPI ship) { 071 DwellerShroud shroud = DwellerShroud.getShroudFor(ship); 072 if (shroud == null) { 073 shroud = new DwellerShroud(ship, createShroudParams(ship)); 074 075 } 076 return shroud; 077 } 078 079 protected DwellerShroudParams createShroudParams(ShipAPI ship) { 080 DwellerShroudParams params = DwellerShroud.createBaselineParams(ship); 081 modifyBaselineShroudParams(ship, params); 082 return params; 083 } 084 085 protected void modifyBaselineShroudParams(ShipAPI ship, DwellerShroudParams params) { 086 } 087 088 protected DwellerCombatPlugin createPlugin(ShipAPI ship) { 089 DwellerCombatPlugin plugin = DwellerCombatPlugin.getDwellerPluginFor(ship); 090 if (plugin == null) { 091 plugin = new DwellerCombatPlugin(ship); 092 } 093 return plugin; 094 } 095 096 protected void initBasicShipProperties(ShipAPI ship) { 097 //ship.setDoNotRender(true); 098 099 //ship.setExplosionScale(0.75f); 100 ship.setExplosionScale(0.001f); // no 0 so the explosion sound plays 101 ship.setHulkChanceOverride(0f); 102 ship.setImpactVolumeMult(IMPACT_VOLUME_MULT); 103 ship.getArmorGrid().clearComponentMap(); // no damage to weapons/engines 104 ship.setNoDamagedExplosions(true); 105 ship.setSpawnDebris(false); 106 107 ship.setShipCollisionSoundOverride("dweller_collision_ships"); 108 ship.setAsteroidCollisionSoundOverride("dweller_collision_asteroid_ship"); 109 } 110 111 protected void setOverloadColorAndText(ShipAPI ship, DwellerShroud shroud) { 112 Color color = Misc.setAlpha(Misc.setBrightness(shroud.getParams().flashFringeColor, 255), 255); 113 ship.getFluxTracker().setOverloadColor(color); 114 ship.getFluxTracker().setOverloadText("Stunned!"); 115 } 116 117 118} 119 120 121 122 123 124 125 126