001package com.fs.starfarer.api.impl.campaign;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import org.lwjgl.opengl.GL11;
007
008import com.fs.starfarer.api.Global;
009import com.fs.starfarer.api.campaign.CampaignEngineLayers;
010import com.fs.starfarer.api.campaign.SectorEntityToken;
011import com.fs.starfarer.api.combat.ViewportAPI;
012
013public class GenericFieldItemManager {
014        
015        protected transient List<GenericFieldItemSprite> items;
016        protected transient boolean inited = false;
017
018        protected SectorEntityToken entity;
019        
020        public int numPieces, cellSize;
021        public float minSize, maxSize;
022        public String category, key;
023        
024        public GenericFieldItemManager(SectorEntityToken entity) {
025                this.entity = entity;
026        }
027
028        Object readResolve() {
029                return this;
030        }
031        
032        public void advance(float amount) {
033                if (amount <= 0) {
034                        return; // happens during game load
035                }
036                if (!entity.isInCurrentLocation()) {
037                        items = null;
038                        inited = false;
039                        return;
040                }
041                
042                float days = Global.getSector().getClock().convertToDays(amount);
043                initDebrisIfNeeded();
044                
045                List<GenericFieldItemSprite> remove = new ArrayList<GenericFieldItemSprite>();
046                for (GenericFieldItemSprite item : items) {
047                        item.advance(days);
048                        if (item.isDone()) {
049                                remove.add(item);
050                        }
051                }
052                items.removeAll(remove);
053                
054                addPiecesToMax();
055        }
056                
057        public void render(CampaignEngineLayers layer, ViewportAPI viewport) {
058                float alphaMult = viewport.getAlphaMult();
059                alphaMult *= entity.getSensorFaderBrightness();
060                alphaMult *= entity.getSensorContactFaderBrightness();
061                if (alphaMult <= 0) return;
062
063                
064                GL11.glPushMatrix();
065                GL11.glTranslatef(entity.getLocation().x, entity.getLocation().y, 0);
066                
067                initDebrisIfNeeded();
068                for (GenericFieldItemSprite item : items) {
069                        item.render(alphaMult);
070                }
071                
072                GL11.glPopMatrix();
073        }
074        
075        protected void addPiecesToMax() {
076                while (items.size() < numPieces) {
077                        float size = minSize + (maxSize - minSize) * (float) Math.random();
078                        GenericFieldItemSprite item = new GenericFieldItemSprite(entity, category, key, cellSize, size, 
079                                                                        entity.getRadius() * 0.75f);
080                        items.add(item);
081                }
082        }
083        
084        protected void initDebrisIfNeeded() {
085                if (inited) return;
086                inited = true;
087                
088                items = new ArrayList<GenericFieldItemSprite>();
089                addPiecesToMax();
090                for (GenericFieldItemSprite piece : items) {
091                        piece.advance(0.1f);
092                }
093        }
094        
095        
096        
097}