001package com.fs.starfarer.api.util; 002 003public class FlickerUtil { 004 private float angle; 005 private float brightness; 006 private float currTime; 007 private float currMaxBurstTime; 008 private float currMaxBrightness; 009 private float maxBurstTime; 010 private float peakTime; 011 private float peakDur; 012 private boolean stop = false; 013 014 public FlickerUtil() { 015 //maxBurstTime = 0.25f; 016 //maxBurstTime = 1f; 017 maxBurstTime = 0.5f; 018 newBurst(); 019 } 020 021 public void setStop(boolean stop) { 022 this.stop = stop; 023 } 024 025 private void newBurst() { 026 if (stop) { 027 brightness = 0f; 028 return; 029 } 030 currMaxBurstTime = maxBurstTime * 0.25f + (float) Math.random() * maxBurstTime * 0.75f; 031 //currMaxBrightness = (float) Math.random() * 0.75f + 0.5f; 032 currMaxBrightness = (float) Math.random() * 0.5f + 0.75f; 033 //currMaxBrightness = 1f; 034 if (currMaxBrightness > 1) currMaxBrightness = 1; 035 //peakTime = currMaxBurstTime / 3f; 036 //peakDur = peakTime/2f; 037 peakTime = 0f; 038 //peakDur = currMaxBurstTime / 5f; 039 peakDur = currMaxBurstTime / 20f; 040 currTime = 0f; 041 042 angle = (float) Math.random() * 360f; 043 brightness = 1f; 044 } 045 046 public float getBrightness() { 047 return brightness * currMaxBrightness; 048 } 049 050 public float getAngle() { 051 return angle; 052 } 053 054 /** 055 * Returns true if the current burst ended and a new one just started. 056 * @param amount 057 * @return 058 */ 059 public boolean advance(float amount) { 060 currTime += amount; 061 062 if (currTime > currMaxBurstTime) { 063 newBurst(); 064 return true; 065 } else { 066 if (currTime > peakTime + peakDur){ 067 //brightness -= amount / (currMaxBurstTime - peakTime - peakDur); 068 brightness -= amount / Math.max(0.1f, 0.25f - peakTime - peakDur); 069 if (brightness < 0) brightness = 0; 070 } else { 071 brightness = 1f; 072 } 073 } 074 return false; 075 } 076 077 public float getCurrTime() { 078 return currTime; 079 } 080 081 082 083}