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}