001package com.fs.starfarer.api.util;
002
003
004public class AutoReducingValue {
005
006        public static interface ValueChangedListener {
007                void valueChanged(int prev, int val, AutoReducingValue arv);
008        }
009        
010        private float elapsed = 0f;
011        private int value = 0;
012        private float elapsedPerPoint;
013        private final ValueChangedListener listener;
014        
015
016        public AutoReducingValue(int value, float elapsedPerPoint, ValueChangedListener listener) {
017                this.value = value;
018                this.elapsedPerPoint = elapsedPerPoint;
019                this.listener = listener;
020        }
021
022        public void advance(float amount) {
023                elapsed += amount;
024                
025                if (elapsed >= elapsedPerPoint) {
026                        elapsed -= elapsedPerPoint;
027                        
028                        int prev = value;
029                        value--;
030                        if (value < 0) value = 0;
031                        if (prev != value && listener != null) {
032                                listener.valueChanged(prev, value, this);
033                        }
034                }
035        }
036        
037        public int getValue() {
038                return value;
039        }
040
041        public void setValue(int value) {
042                int prev = value;
043                this.value = value;
044                if (prev != value && listener != null) {
045                        listener.valueChanged(prev, value, this);
046                }
047        }
048        
049        public void increaseValue(int amt) {
050                int prev = value;
051                this.value += amt;
052                if (value < 0) {
053                        value = 0;
054                }
055                if (prev != value && listener != null) {
056                        listener.valueChanged(prev, value, this);
057                }
058        }
059        
060        public void reduceValue(int amt) {
061                int prev = value;
062                this.value -= amt;
063                if (value < 0) {
064                        value = 0;
065                }
066                if (prev != value && listener != null) {
067                        listener.valueChanged(prev, value, this);
068                }
069        }
070        
071}