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}