001package com.fs.starfarer.api.impl.combat.dweller; 002 003import java.awt.Color; 004import java.util.List; 005 006import org.lwjgl.util.vector.Vector2f; 007 008import com.fs.starfarer.api.combat.CombatEntityAPI; 009import com.fs.starfarer.api.combat.MutableShipStatsAPI; 010import com.fs.starfarer.api.combat.ShipAPI; 011import com.fs.starfarer.api.combat.ShipAPI.HullSize; 012import com.fs.starfarer.api.combat.WeaponAPI; 013import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.DCPPlugin; 014import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.WobblyPart; 015import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams; 016import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMember; 017import com.fs.starfarer.api.impl.combat.threat.RoilingSwarmEffect.SwarmMemberOffsetModifier; 018import com.fs.starfarer.api.loading.ProjectileWeaponSpecAPI; 019import com.fs.starfarer.api.util.ListMap; 020 021public class ShroudedMaelstromShipCreator extends BaseDwellerShipCreator { 022 023 public static float FLUX_COST_MULT = 1f; 024 public static float RANGE_BONUS = 200f; 025 026// public static float RL_DELAY = 0.33f; 027// public static float IE_DELAY = 0.25f; 028 029 @Override 030 public void initBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) { 031 super.initBeforeShipCreation(hullSize, stats, id); 032 033// stats.getEnergyWeaponFluxCostMod().modifyMult(id, FLUX_COST_MULT); 034// stats.getBallisticWeaponFluxCostMod().modifyMult(id, FLUX_COST_MULT); 035// stats.getMissileWeaponFluxCostMod().modifyMult(id, FLUX_COST_MULT); 036 037 stats.getBallisticWeaponRangeBonus().modifyPercent(id, RANGE_BONUS); 038 stats.getEnergyWeaponRangeBonus().modifyPercent(id, RANGE_BONUS); 039 } 040 041 042 @Override 043 protected DwellerCombatPlugin createPlugin(ShipAPI ship) { 044 DwellerCombatPlugin plugin = super.createPlugin(ship); 045 plugin.setPlugin(new DCPPlugin() { 046 ListMap<WeaponAPI> weapons = new ListMap<>(); 047 int [] currIndex = new int[10]; 048 float [] currElapsed = new float [10]; 049 @Override 050 public void advance(DwellerCombatPlugin plugin, float amount) { 051 CombatEntityAPI attachedTo = plugin.getAttachedTo(); 052 if (attachedTo instanceof ShipAPI) { 053 ShipAPI ship = (ShipAPI) attachedTo; 054 055 if (weapons.isEmpty()) { 056 for (WeaponAPI w : ship.getAllWeapons()) { 057 if (w.isDecorative()) continue; 058 weapons.add(w.getId(), w); 059 } 060 } 061 062 int i = 0; 063 for (List<WeaponAPI> list : weapons.values()) { 064 065 WeaponAPI w = list.get(0); 066 float delay = ((ProjectileWeaponSpecAPI)w.getSpec()).getRefireDelay() / (float) list.size(); 067 068 currElapsed[i] += amount; 069 while (currElapsed[i] > delay) { 070 currElapsed[i] -= delay; 071 currIndex[i]++; 072 currIndex[i] %= list.size(); 073 } 074 075 int index = 0; 076 for (WeaponAPI curr : list) { 077 if (index != currIndex[i]) { 078 curr.setForceDisabled(true); 079 } else { 080 curr.setForceDisabled(false); 081 } 082 index++; 083 } 084 085 i++; 086 } 087 } 088 } 089 }); 090 091 092 List<DwellerShipPart> parts = plugin.getParts(); 093 094 float scale = 1f; 095 scale = 1.33f; 096 097 //scale = 1.5f; 098 099 float spinMult = 1f; 100 spinMult = 0.5f; 101 spinMult = 0.125f; 102 103 104 105 106 /*part = new WobblyPart("shrouded_maelstrom_base", 2f * scale, 1f, new Vector2f(0, 0), 0f); 107 part.setSpin(360f * 2f * spinMult, 360f * 2f * spinMult, 360f * spinMult); 108 part.alphaMult = 0.5f; 109 parts.add(part); 110 */ 111 112 113 WobblyPart part = new WobblyPart("shrouded_vortex_base2", 3f * scale, 3, 3, 1f, new Vector2f(0, 0), 0f); 114 part.setSpin(270f * 2f * spinMult, 360f * 2f * spinMult, 270f * spinMult); 115 part.alphaMult = 0.5f; 116 parts.add(part); 117 118 part = new WobblyPart("shrouded_vortex_base2", 2f * scale, 3, 3, 1f, new Vector2f(0, 0), 180f); 119 part.setSpin(270f * 2f * spinMult, 360f * 2f * spinMult, 270f * spinMult); 120 part.alphaMult = 0.4f; 121 parts.add(part); 122 123 //WobblyPart part = new WobblyPart("shrouded_vortex_base", 3f * scale, 1f, new Vector2f(0, 0), 0f); 124 125 126 Color glow = DwellerCombatPlugin.STANDARD_PART_GLOW_COLOR; 127 // eye spot clusters 128 part = new WobblyPart("shrouded_eye_cluster1", 1.2f * scale, 5, 5, 1f, new Vector2f(0, 0), 0f); 129 part.setSpin(50f * 2f * spinMult, 90f * 2f * spinMult, 320f * spinMult); 130 part.color = glow; 131 part.additiveBlend = true; 132 parts.add(part); 133 134 part = new WobblyPart("shrouded_eye_cluster2", 1.2f * scale, 5, 5, 1f, new Vector2f(0, 0), 0f); 135 part.setSpin(60f * 2f * spinMult, 100f * 2f * spinMult, 320f * spinMult); 136 part.color = glow; 137 part.additiveBlend = true; 138 parts.add(part); 139 140 part = new WobblyPart("shrouded_eye_cluster3", 1.2f * scale, 5, 5, 1f, new Vector2f(0, 0), 0f); 141 part.setSpin(70f * 2f * spinMult, 110f * 2f * spinMult, 320f * spinMult); 142 part.color = glow; 143 part.additiveBlend = true; 144 parts.add(part); 145 146 147 part = new WobblyPart("shrouded_maelstrom_base", 1.8f * scale, 1f, new Vector2f(0, 0), 0f); 148 part.setSpin(300f * 2f * spinMult, 340f * 2f * spinMult, 320f * spinMult); 149 parts.add(part); 150 151 152 153 154 155// WobblyPart part = new WobblyPart("shrouded_maelstrom", 0.3f * scale, 1f, new Vector2f(0, 0), 0f); 156// parts.add(part); 157// Color glow = DwellerCombatPlugin.STANDARD_PART_GLOW_COLOR; 158// part = new WobblyPart("clusterA", 1f * scale, 3, 3, 2f, new Vector2f(70f * scale, 0), 0f); 159// part.color = glow; 160// part.additiveBlend = true; 161// //part.setWeaponActivated(); 162// parts.add(part); 163// 164// part = new WobblyPart("clusterB", 1f * scale, 3, 3, 2f, new Vector2f(-10f * scale, 0), 0f); 165// part.color = glow; 166// part.additiveBlend = true; 167// //part.setFluxActivated(); 168// parts.add(part); 169// 170// part = new WobblyPart("coronet_stalks", 0.5f * scale, 3, 3, 2f, new Vector2f(100f * scale, 0), 0f); 171// part.color = glow; 172// part.additiveBlend = true; 173// //part.setShieldActivated(); 174// parts.add(part); 175 176 return plugin; 177 } 178 179 @Override 180 protected void modifyBaselineShroudParams(ShipAPI ship, DwellerShroudParams params) { 181// numMembers = 100; 182// radius = 150f; 183 184 params.maxOffset = 200f; 185 params.initialMembers = 200; 186 params.baseMembersToMaintain = params.initialMembers; 187 188 params.numToRespawn = 2; 189 params.numToFlash = 3; 190 191 params.maxOffset = 250f; 192 params.numToFlash = 4; 193 params.baseSpriteSize *= 1.33f; 194 195 params.spawnOffsetMult = 0.67f; 196 params.spawnOffsetMultForInitialSpawn = params.spawnOffsetMult; 197 198 199 params.offsetModifier = new SwarmMemberOffsetModifier() { 200 @Override 201 public void modifyOffset(SwarmMember p) { 202 p.offset.x *= 0.85f; 203 p.offset.y *= 1.25f; 204 } 205 }; 206 207 } 208 209 210} 211 212 213 214 215 216 217 218 219