001package com.fs.starfarer.api.impl.combat.dweller; 002 003import java.util.List; 004 005import java.awt.Color; 006 007import org.lwjgl.util.vector.Vector2f; 008 009import com.fs.starfarer.api.Global; 010import com.fs.starfarer.api.combat.CombatFleetManagerAPI; 011import com.fs.starfarer.api.combat.DeployedFleetMemberAPI; 012import com.fs.starfarer.api.combat.MutableShipStatsAPI; 013import com.fs.starfarer.api.combat.ShipAPI; 014import com.fs.starfarer.api.combat.ShipAPI.HullSize; 015import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags; 016import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.DCPPlugin; 017import com.fs.starfarer.api.impl.combat.dweller.DwellerCombatPlugin.WobblyPart; 018import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams; 019import com.fs.starfarer.api.util.IntervalUtil; 020import com.fs.starfarer.api.util.Misc; 021 022public class ShroudedTendrilShipCreator extends BaseDwellerShipCreator { 023 024 025 public static float FLUX_COST_MULT = 0.33f; 026 027 @Override 028 public void initBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) { 029 super.initBeforeShipCreation(hullSize, stats, id); 030 031 stats.getEnergyWeaponFluxCostMod().modifyMult(id, FLUX_COST_MULT); 032 stats.getBallisticWeaponFluxCostMod().modifyMult(id, FLUX_COST_MULT); 033 stats.getMissileWeaponFluxCostMod().modifyMult(id, FLUX_COST_MULT); 034 } 035 036 037 @Override 038 protected DwellerCombatPlugin createPlugin(final ShipAPI ship) { 039 DwellerCombatPlugin plugin = super.createPlugin(ship); 040 plugin.setPlugin(new DCPPlugin() { 041 IntervalUtil interval = new IntervalUtil(0.5f, 1.5f); 042 boolean anythingLargerNearby = false; 043 @Override 044 public void advance(DwellerCombatPlugin plugin, float amount) { 045 interval.advance(amount); 046 if (interval.intervalElapsed()) { 047 CombatFleetManagerAPI fleetManager = Global.getCombatEngine().getFleetManager(ship.getOriginalOwner()); 048 if (fleetManager != null) { 049 anythingLargerNearby = false; 050 for (DeployedFleetMemberAPI curr : fleetManager.getDeployedCopyDFM()) { 051 if (curr.getShip() == null) continue; 052 if (curr.getShip().getHullSize().ordinal() > ship.getHullSize().ordinal()) { 053 float dist = Misc.getDistance(ship.getLocation(), curr.getLocation()); 054 dist -= ship.getCollisionRadius() + curr.getShip().getCollisionRadius(); 055 if (dist < 3000f) { 056 anythingLargerNearby = true; 057 break; 058 } 059 } 060 } 061 } 062 } 063 if (ship.getSinceLastDamageTaken() < 0.5f && anythingLargerNearby) { 064 ship.getAIFlags().setFlag(AIFlags.BACK_OFF, 1f); 065 ship.getAIFlags().setFlag(AIFlags.BACK_OFF_MIN_RANGE, 1f, 2000f); 066 ship.getAIFlags().unsetFlag(AIFlags.DO_NOT_BACK_OFF); 067 } else { 068 ship.getAIFlags().setFlag(AIFlags.DO_NOT_BACK_OFF, 1f); 069 ship.getAIFlags().unsetFlag(AIFlags.BACK_OFF); 070 ship.getAIFlags().unsetFlag(AIFlags.BACK_OFF_MIN_RANGE); 071 } 072 } 073 }); 074 075 List<DwellerShipPart> parts = plugin.getParts(); 076 parts.clear(); 077 078 float scale = 1f; 079 scale = 0.75f; 080 081 WobblyPart part = new WobblyPart("shrouded_tendril_base", 2f * scale, 1f, new Vector2f(0, 0), 0f); 082 parts.add(part); 083 084 Color glow = DwellerCombatPlugin.STANDARD_PART_GLOW_COLOR; 085 086// part = new WobblyPart("clusterA", 1f * scale, 3, 3, 2f, new Vector2f(70f * scale, 0), 0f); 087// part.color = glow; 088// part.additiveBlend = true; 089 //part.setWeaponActivated(); 090 //parts.add(part); 091 092 part = new WobblyPart("clusterB", 1f * scale, 3, 3, 2f, new Vector2f(30f * scale, 0), 0f); 093 part.color = glow; 094 part.additiveBlend = true; 095 //part.setFluxActivated(); 096// part.setWeaponActivated(); 097// part.setShieldActivated(); 098// part.setSystemActivated(); 099 parts.add(part); 100 101// part = new WobblyPart("coronet_stalks", 0.5f * scale, 3, 3, 2f, new Vector2f(100f * scale, 0), 0f); 102// part.color = glow; 103// part.additiveBlend = true; 104 //part.setShieldActivated(); 105 //parts.add(part); 106 107 return plugin; 108 } 109 110 @Override 111 protected void modifyBaselineShroudParams(ShipAPI ship, DwellerShroudParams params) { 112 params.maxOffset = 80f; 113 params.initialMembers = (int) (100f / 4f); 114 params.initialMembers = 70; 115 params.baseMembersToMaintain = params.initialMembers; 116 117 params.flashFrequency /= 2f; 118 119 //params.flashFrequency /= 3.5f; 120 //params.numToFlash = 1; 121 //params.flashFrequency = 17f; 122 //params.numToFlash = 2; 123 124 params.negativeParticleAreaMult = 1.25f; 125 //params.negativeParticleNumBase = 0; 126// params.negativeParticleSizeMult = 1.25f; 127 128 params.overloadGlowSizeMult *= 0.75f; 129 130// params.maxSpeed += 500f; 131// params.springStretchMult = 30f; 132// params.baseFriction *= 10f; 133// params.frictionRange *= 1f; 134 } 135 136// @Override 137// public void advance(DwellerCombatPlugin plugin, float amount) { 138// CombatEntityAPI attachedTo = plugin.getAttachedTo(); 139// if (attachedTo instanceof ShipAPI) { 140// ShipAPI ship = (ShipAPI) attachedTo; 141// if (ship.getSinceLastDamageTaken() < 0.5f) { 142// ship.getAIFlags().setFlag(AIFlags.BACK_OFF, 1f); 143// ship.getAIFlags().setFlag(AIFlags.BACK_OFF_MIN_RANGE, 1f, 2000f); 144// ship.getAIFlags().unsetFlag(AIFlags.DO_NOT_BACK_OFF); 145// } else { 146// ship.getAIFlags().setFlag(AIFlags.DO_NOT_BACK_OFF, 1f); 147// ship.getAIFlags().unsetFlag(AIFlags.BACK_OFF); 148// } 149// //ship.getAIFlags().setFlag(AIFlags.DO_NOT_BACK_OFF, 1f); 150// } 151// } 152 153} 154 155 156 157 158 159 160 161 162