package com.opticalcobra.storybear.game;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.LinkedList;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import com.opticalcobra.storybear.db.Database;
import com.opticalcobra.storybear.db.TileResult;
import com.opticalcobra.storybear.debug.DebugSettings;
import com.opticalcobra.storybear.editor.StoryInfo;
import com.opticalcobra.storybear.main.ILevelAppearance;
import com.opticalcobra.storybear.main.Ringbuffer;
import com.opticalcobra.storybear.res.Imagelib;
import com.opticalcobra.storybear.res.Ressources;
import com.opticalcobra.storybear.res.StoryBearRandom;
public class RendererFG2 extends Renderer implements IRenderer {
private Imagelib il = Imagelib.getInstance();
private StoryBearRandom rand = StoryBearRandom.getInstance();
private int lastTileType = 0;
private int panelnum = 0;
private StoryInfo storyInfo;
private int elementPointer = 0;
//private Ringbuffer<TileResult> ringbuffer = new Ringbuffer<TileResult>(3*16);
private LinkedList<TileResult> tileQue;
private Database db;
private ArrayList<Integer> currentTileIds;
public RendererFG2(LinkedList<TileResult> tileQue, StoryInfo level) {
this.storyInfo = level;
this.tileQue = tileQue;
this.db = new Database();
}
private BufferedImage getNextMapElement(int currentBlock){
int next = 0;
if (panelnum>3){
if(tileQue.size() > 2*Ressources.TILESPERPANEL + currentBlock){
next = tileQue.get(2*Ressources.TILESPERPANEL + currentBlock).getTileType();
}
} else{
if(tileQue.size() > ((panelnum-1) *Ressources.TILESPERPANEL)+ currentBlock){
next = tileQue.get(((panelnum-1) *Ressources.TILESPERPANEL)+ currentBlock).getTileType();
}
}
lastTileType = next;
currentTileIds.add(lastTileType);
for (int i = 0 ; i < storyInfo.getElements().size(); i++){
if (storyInfo.getElements().get(i) instanceof RenderHint && storyInfo.getElements().get(i).getBlock() == currentBlock + (panelnum-1)*Ressources.TILESPERPANEL){
if (((RenderHint)(storyInfo.getElements().get(i))).getRenderHint() == RenderHint.RENDERHINT_FOREST){
return il.loadLandscapeTile(next, Imagelib.QUERY_FOREGROUNDTWO, "FOREST");
} else{
return il.loadLandscapeTile(next, Imagelib.QUERY_FOREGROUNDTWO, "MEADOEW");
}
}
}
return il.loadLandscapeTile(next, Imagelib.QUERY_FOREGROUNDTWO, "MEADOEW");
}
@Override
public void getNextViewPart(JLabel pane) {
int pointerCounter=1;
ArrayList<ILevelAppearance> elements = this.storyInfo.getElements();
currentTileIds = new ArrayList<Integer>();
panelnum++;
BufferedImage image = new BufferedImage(Ressources.WINDOW.width, Ressources.WINDOW.height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) image.getGraphics();
for(int i=0;i*Ressources.RASTERSIZE<Ressources.WINDOW.width;i++){
g.drawImage(getNextMapElement(i),i*Ressources.RASTERSIZE,0,null);
}
for(int i=0;i<Ressources.TILESPERPANEL;i++){
if (elementPointer < storyInfo.getElements().size() && elementPointer > 0 &&
storyInfo.getElements().get(elementPointer).getBlock() % 16 != 0 && i == 0 &&
storyInfo.getElements().get(elementPointer-1) instanceof Word){
//Wort�bertrag auf ein neues Panel
//if (storyInfo.getElements().get(elementPointer) instanceof Word){
while (!(storyInfo.getElements().get(elementPointer - pointerCounter) instanceof Word)){
pointerCounter++;
}
((Word)elements.get(elementPointer-pointerCounter)).renderPreviousLostWord(g, ((16 - (elements.get(elementPointer-1).getBlock()%16)))*-1);
//}
}
//W�rter und Bilder werden gerendert
if(elementPointer < storyInfo.getElements().size() &&
storyInfo.getElements().get(elementPointer).getBlock() <= (i + (panelnum-1)*16)){
(elements.get(elementPointer)).render(g, currentTileIds.get(0), Ressources.LAYERFOREGROUNDTWO, pane);
//Wenn mehrere Elemente auf eine Kachel gerendert werden, darf i nicht hochgez�hlt werden
if (elementPointer+1 < storyInfo.getElements().size() && storyInfo.getElements().get(elementPointer).getBlock() == storyInfo.getElements().get(elementPointer+1).getBlock()){
i--;
} else{
currentTileIds.remove(0);
}
elementPointer++;
} else{
currentTileIds.remove(0);
}
}
pane.setIcon(new ImageIcon(image));
}
}