001package com.fs.starfarer.api.impl.campaign.entities; 002 003import java.awt.Color; 004 005import org.lwjgl.util.vector.Vector2f; 006 007import com.fs.starfarer.api.Global; 008import com.fs.starfarer.api.campaign.CampaignEngineLayers; 009import com.fs.starfarer.api.campaign.SectorEntityToken; 010import com.fs.starfarer.api.combat.ViewportAPI; 011import com.fs.starfarer.api.impl.campaign.BaseCustomEntityPlugin; 012import com.fs.starfarer.api.util.CampaignEngineGlowIndividualEngine; 013import com.fs.starfarer.api.util.CampaignEngineGlowUtil; 014import com.fs.starfarer.api.util.CampaignEntityMovementUtil; 015import com.fs.starfarer.api.util.Misc; 016 017public class GateHaulerEntityPlugin extends BaseCustomEntityPlugin { // implements EngineGlowControls { 018 019 public static float MAX_SPEED = 1000f; 020 public static float ACCELERATION = 5f; 021 022 protected CampaignEntityMovementUtil movement; 023 protected CampaignEngineGlowUtil engineGlow; 024 protected boolean longBurn = false; 025 //protected boolean acceleratedThisFrame = false; 026 027 public void init(SectorEntityToken entity, Object pluginParams) { 028 super.init(entity, pluginParams); 029 readResolve(); 030 } 031 032 Object readResolve() { 033 if (engineGlow == null) { 034 Color fringe = new Color(255, 0, 0, 255); 035 Color flame = new Color(255, 100, 100, 255); 036 Color core = new Color(255, 255, 255, 255); 037 038 engineGlow = new CampaignEngineGlowUtil(entity, fringe, core, flame, 0.25f); 039 CampaignEngineGlowIndividualEngine engine = new CampaignEngineGlowIndividualEngine( 040 90f, 300f, 50f, 400f, new Vector2f(-115f, 0f), engineGlow); 041 engine.setFlameTexSpanMult(0.5f); 042 engineGlow.addEngine(engine); 043 } 044 045 if (movement == null) { 046 movement = new CampaignEntityMovementUtil(entity, 0.5f, 3f, ACCELERATION, MAX_SPEED); 047 movement.setEngineGlow(engineGlow); 048 } 049 050 return this; 051 } 052 053 public CampaignEntityMovementUtil getMovement() { 054 return movement; 055 } 056 057 public CampaignEngineGlowUtil getEngineGlow() { 058 return engineGlow; 059 } 060 061 public boolean isActivated() { 062 return entity.getMemoryWithoutUpdate().getBoolean("$activated"); 063 } 064 public boolean isActivating() { 065 return entity.getMemoryWithoutUpdate().getBoolean("$activating"); 066 } 067 public boolean isInTransit() { 068 return entity.getMemoryWithoutUpdate().getBoolean("$inTransit"); 069 } 070 public float getRemainingActivationDays() { 071 return entity.getMemoryWithoutUpdate().getExpire("$activating"); 072 } 073 074 public void advance(float amount) { 075 if (entity.isInCurrentLocation() || isInTransit()) { 076 engineGlow.advance(amount); 077 078 float soundVolume = engineGlow.getLengthMult().getCurr() * 0.5f; 079 if (soundVolume > 0.5f) soundVolume = 0.5f; 080 081 if (isActivating()) { 082 // full time is 1 day, set in rules 083 float remaining = getRemainingActivationDays(); 084 float f = remaining/1f; 085 if (f < 0f) f = 0f; 086 if (f > 1f) f = 1f; 087 engineGlow.getFlickerRateMult().shift(this, 1f + 25f * f, 0f, 0.1f, 1f); 088 engineGlow.getFlickerMult().shift(this, f, 0f, 0.1f, 1f); 089 } if (!isActivated()) { 090 engineGlow.showSuppressed(); 091 } else if (isActivated()) { 092 if (longBurn && movement.isDesiredFacingSet()) { 093 float angleDiff = Misc.getAngleDiff(movement.getDesiredFacing(), entity.getFacing()); 094 if (angleDiff < 2f) { 095 Vector2f dir = Misc.getUnitVectorAtDegreeAngle(movement.getDesiredFacing()); 096 float speedInDesiredDir = Vector2f.dot(dir, entity.getVelocity()); 097 if (movement.isFaceInOppositeDirection()) { 098 speedInDesiredDir *= -1f; 099 } 100 float speed = entity.getVelocity().length(); 101 102 if (speedInDesiredDir > 10f && speedInDesiredDir > speed * 0.7f) { 103 float speedForMaxEngineLength = 100f; 104 float f = speedInDesiredDir / speedForMaxEngineLength; 105 if (f < 0f) f = 0f; 106 if (f > 1f) f = 1f; 107 108 soundVolume = Math.min(soundVolume + f * 0.5f, 1f); 109 110 //System.out.println("longBurn factor: " + f); 111 112 float flickerZone = 0.5f; 113 if (f < flickerZone) { 114 engineGlow.getFlickerRateMult().shift(this, 5f, 0f, 0.1f, 1f); 115 engineGlow.getFlickerMult().shift(this, 0.33f - 0.33f * f / flickerZone, 0f, 0.1f, 1f); 116 } 117 118 engineGlow.getGlowMult().shift(this, 2f, 1f, 1f, f); 119 engineGlow.getLengthMult().shift(this, 5f, 1f, 1f, f); 120 engineGlow.getWidthMult().shift(this, 3f, 1f, 1f, f); 121 } 122 123 } 124 } 125 } 126 127 if (soundVolume > 0) { 128 if (entity.isInCurrentLocation() && entity.isVisibleToPlayerFleet()) { 129 Global.getSoundPlayer().playLoop("gate_hauler_engine_loop", entity, 130 1f, soundVolume, 131 entity.getLocation(), entity.getVelocity()); 132 } 133 } 134 } 135 136 if (isActivated()) { 137 movement.advance(amount); 138 } 139 } 140 141 public void render(CampaignEngineLayers layer, ViewportAPI viewport) { 142 float alphaMult = viewport.getAlphaMult(); 143 alphaMult *= entity.getSensorFaderBrightness(); 144 alphaMult *= entity.getSensorContactFaderBrightness(); 145 if (alphaMult <= 0f) return; 146 147 engineGlow.render(alphaMult); 148 } 149 150 public float getRenderRange() { 151 return entity.getRadius() + 3000f; // for engine glow/trails 152 } 153 154 public boolean isLongBurn() { 155 return longBurn; 156 } 157 158 public void setLongBurn(boolean longBurn) { 159 this.longBurn = longBurn; 160 } 161 162// public void showAccelerating() { 163// engineGlow.showAccelerating(); 164// acceleratedThisFrame = true; 165// } 166// 167// public void showIdling() { 168// engineGlow.showIdling(); 169// } 170// 171// public void showSuppressed() { 172// engineGlow.showSuppressed(); 173// } 174// 175// public void showOtherAction() { 176// engineGlow.showOtherAction(); 177// } 178 179 180 181} 182 183 184 185 186 187 188 189