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.DBConstants;
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.editor.TextAnalyzer;
import com.opticalcobra.storybear.game.RenderThreadWrapper.Element;
import com.opticalcobra.storybear.main.ILevelAppearance;
import com.opticalcobra.storybear.main.Ringbuffer;
import com.opticalcobra.storybear.main.SBLinkedList;
import com.opticalcobra.storybear.res.Imagelib;
import com.opticalcobra.storybear.res.Ressources;
import com.opticalcobra.storybear.res.StoryBearRandom;
public class DummyRenderer 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 static LinkedList<TileResult> tileQue = new SBLinkedList<TileResult>();
private Database db;
private ArrayList<Integer> currentTileIds;
boolean wasFreeRide = false;
int lastElementPointer = 0;
public DummyRenderer(StoryInfo si){
db = new Database();
storyInfo = si;
}
private BufferedImage getNextMapElement(int nextCurrentElementPointer, int currentBlockId){
int next = 0;
int nextSecondStep = 0;
int nextThirdStep = 0;
int followingBlockId = 0;
int followingFollowingBlockId= 0;
int randomUsedCounter = 0;
int characterPointerCurrent = nextCurrentElementPointer;
int characterPointerFollowing = nextCurrentElementPointer;
int characterPointerFollowingFollowing = nextCurrentElementPointer;
boolean walkableTile = true;
boolean needNewTile= true;
boolean needNewTileSecond= true;
boolean newTileFound = false;
boolean characterOnCurrentPanel = false;
boolean characterOnFollowingPanel = false;
boolean characterOnFollowingFollowingPanel = false;
int freeRideCounterStep = 0;
currentBlockId = currentBlockId + ((panelnum-1)*Ressources.TILESPERPANEL);
followingBlockId = currentBlockId+1;
followingFollowingBlockId = followingBlockId +1;
if (currentBlockId>0){
while (storyInfo.getElements().size() > nextCurrentElementPointer + randomUsedCounter &&
storyInfo.getElements().get(nextCurrentElementPointer + randomUsedCounter).getBlock() == currentBlockId){
if (storyInfo.getElements().get(nextCurrentElementPointer+randomUsedCounter) instanceof Character){
characterOnCurrentPanel = true;
characterPointerCurrent = nextCurrentElementPointer+randomUsedCounter;
}
randomUsedCounter ++;
}
randomUsedCounter = 0;
while (storyInfo.getElements().size() > characterPointerCurrent + randomUsedCounter &&
storyInfo.getElements().get(characterPointerCurrent + randomUsedCounter).getBlock() < followingBlockId){
randomUsedCounter++;
}
while (storyInfo.getElements().size() > characterPointerCurrent + randomUsedCounter &&
storyInfo.getElements().get(characterPointerCurrent + randomUsedCounter).getBlock() == followingBlockId){
if (storyInfo.getElements().get(characterPointerCurrent + randomUsedCounter) instanceof Character){
characterOnFollowingPanel = true;
characterPointerFollowing = nextCurrentElementPointer+randomUsedCounter;
}
randomUsedCounter ++;
}
randomUsedCounter = 0;
while (storyInfo.getElements().size() > characterPointerFollowing + randomUsedCounter &&
storyInfo.getElements().get(characterPointerFollowing + randomUsedCounter).getBlock() < followingFollowingBlockId){
randomUsedCounter++;
}
while (storyInfo.getElements().size() > characterPointerFollowing + randomUsedCounter &&
storyInfo.getElements().get(characterPointerFollowing + randomUsedCounter).getBlock() == followingFollowingBlockId){
if (storyInfo.getElements().get(characterPointerFollowing + randomUsedCounter) instanceof Character){
characterOnFollowingFollowingPanel = true;
characterPointerFollowingFollowing = nextCurrentElementPointer+randomUsedCounter;
}
randomUsedCounter ++;
}
randomUsedCounter = 0;
if (characterOnCurrentPanel){
Integer[] following = il.getFollowingTiles(lastTileType, Imagelib.QUERY_FOREGROUND);
next = following[rand.nextInt(following.length)];
//Solange suchen, bis eine begehbare Fl�che entsteht
while (!(walkableTile = db.getTileInfo(next).isWalkable())){
next = following[rand.nextInt(following.length)];
}
//Danach ist next begehbar
newTileFound = true;
} else if (characterOnFollowingPanel){
Integer[] following = il.getFollowingTiles(lastTileType, Imagelib.QUERY_FOREGROUND);
while (needNewTile){
next = following[rand.nextInt(following.length)];
Integer[] followingSecond = il.getFollowingTiles(next, Imagelib.QUERY_FOREGROUND);
for (int i=0; i<15; i++){
nextSecondStep = followingSecond[rand.nextInt(followingSecond.length)];
if (walkableTile = db.getTileInfo(nextSecondStep).isWalkable()){
needNewTile = false;
break; //Kachel ist begehbar f�r next
}
}
}
newTileFound = true;
} else if (characterOnFollowingFollowingPanel){
Integer[] following = il.getFollowingTiles(lastTileType, Imagelib.QUERY_FOREGROUND);
while (needNewTile){
for (int i=0; i<15; i++){
next = following[rand.nextInt(following.length)];
Integer[] followingSecond = il.getFollowingTiles(next, Imagelib.QUERY_FOREGROUND);
for (int j=0; j<15; j++){
nextSecondStep = followingSecond[rand.nextInt(followingSecond.length)];
Integer[] followingThird = il.getFollowingTiles(nextSecondStep, Imagelib.QUERY_FOREGROUND);
for (int k=0; k<15; k++){
nextThirdStep = followingThird[rand.nextInt(followingThird.length)];
if (walkableTile = db.getTileInfo(nextThirdStep).isWalkable()){
needNewTile = false;
break; //Kachel ist begehbar f�r next
}
}
if (!needNewTile){
break;
}
}
if (!needNewTile){
break;
}
}
}
newTileFound = true;
} else{
Integer[] following = il.getFollowingTiles(lastTileType, Imagelib.QUERY_FOREGROUND);
next = following[rand.nextInt(following.length)];
}
}
lastTileType = next;
tileQue.add(db.getTileInfo(lastTileType));
currentTileIds.add(next);
return il.loadLandscapeTile(next, Imagelib.QUERY_FOREGROUND, null);
// if ((storyInfo.getElements().size() > nextCurrentElementPointer)&&storyInfo.getElements().get(nextCurrentElementPointer).getBlock() > currentBlockId){
// freeRideCounterStep = storyInfo.getElements().get(nextCurrentElementPointer).getBlock() - currentBlockId +1;
// if ((currentBlockId+1) % Ressources.TILESPERPANEL == 0){
// freeRideCounterStep--;
// }
// }
//
//
// //The first tile has to be 0
// if (currentBlockId>0){
// if ((storyInfo.getElements().size() > nextCurrentElementPointer)&&storyInfo.getElements().get(nextCurrentElementPointer) instanceof Character && freeRideCounterStep==0){
// Integer[] following = il.getFollowingTiles(lastTileType, Imagelib.QUERY_FOREGROUND);
// next = following[rand.nextInt(following.length)];
//
// //Solange suchen, bis eine begehbare Fl�che entsteht
// while (!(walkableTile = db.getTileInfo(next).isWalkable())){
// next = following[rand.nextInt(following.length)];
// }
// //Danach ist next begehbar
// newTileFound = true;
//
// }
//
//
//
// while (storyInfo.getElements().size() > nextCurrentElementPointer+1 && !newTileFound &&
// currentBlockId <= storyInfo.getElements().get(nextCurrentElementPointer+1).getBlock()){
// if (freeRideCounterStep == 0){
// nextCurrentElementPointer++;
// }
//
// freeRideCounterStep--;
// //N�chste Kachel kommt ein Character -> Auf begehbare Fl�che vorbereiten
// if (storyInfo.getElements().get(nextCurrentElementPointer) instanceof Character && !newTileFound){
// Integer[] following = il.getFollowingTiles(lastTileType, Imagelib.QUERY_FOREGROUND);
//
// while (needNewTile){
// next = following[rand.nextInt(following.length)];
// Integer[] followingSecond = il.getFollowingTiles(next, Imagelib.QUERY_FOREGROUND);
//
// for (int i=0; i<15; i++){
// nextSecondStep = followingSecond[rand.nextInt(followingSecond.length)];
// if (walkableTile = db.getTileInfo(nextSecondStep).isWalkable()){
// needNewTile = false;
// break; //Kachel ist begehbar f�r next
// }
// }
// }
//
// newTileFound = true;
// }
// }
//
//
// while (storyInfo.getElements().size() > nextCurrentElementPointer+1 && !newTileFound &&
// currentBlockId == storyInfo.getElements().get(nextCurrentElementPointer+1).getBlock()){
// nextCurrentElementPointer++;
//
// //�bern�chste Kachel kommt ein Character -> Auf begehbare Fl�che vorbereiten
// if (storyInfo.getElements().get(nextCurrentElementPointer) instanceof Character && !newTileFound){
// Integer[] following = il.getFollowingTiles(lastTileType, Imagelib.QUERY_FOREGROUND);
//
// while (needNewTile){
// for (int i=0; i<15; i++){
// next = following[rand.nextInt(following.length)];
// Integer[] followingSecond = il.getFollowingTiles(next, Imagelib.QUERY_FOREGROUND);
//
// for (int j=0; j<15; j++){
// nextSecondStep = followingSecond[rand.nextInt(followingSecond.length)];
// Integer[] followingThird = il.getFollowingTiles(nextSecondStep, Imagelib.QUERY_FOREGROUND);
//
// for (int k=0; k<15; k++){
// nextThirdStep = followingSecond[rand.nextInt(followingThird.length)];
// if (walkableTile = db.getTileInfo(nextThirdStep).isWalkable()){
// needNewTile = false;
// break; //Kachel ist begehbar f�r next
// }
// }
// if (!needNewTile){
// break;
// }
//
// }
// if (!needNewTile){
// break;
// }
// }
// }
// newTileFound = true;
// }
// }
//
// if (!newTileFound){
// Integer[] following = il.getFollowingTiles(lastTileType, Imagelib.QUERY_FOREGROUND);
// next = following[rand.nextInt(following.length)];
// }
//
// }
//
// //System.out.println("Aktueller Block = "+ currentBlock + "mit tileId" + next);
// lastTileType = next;
// tileQue.add(db.getTileInfo(lastTileType));
//
//// System.out.print("\nCurrentBlock" + currentBlock + "tileQue sieht so aus: ");
//// for (int y = 0; y < tileQue.size(); y++){
//// System.out.print(tileQue.get(y).getTileType());
//// }
//
// currentTileIds.add(next);
// return il.loadLandscapeTile(next, Imagelib.QUERY_FOREGROUND, null);
}
@Override
public void getNextViewPart(JLabel pane) {
int currentElementCounter = 0;
ArrayList<ILevelAppearance> elements = this.storyInfo.getElements();
currentTileIds = new ArrayList<Integer>();
if (panelnum >= 3){
for (int i = 0; i < Ressources.TILESPERPANEL; i++){
tileQue.removeFirst();
}
Hero.getInstance().setQueCounter(Hero.getInstance().getQueCounter()- Ressources.TILESPERPANEL);
}
panelnum++;
BufferedImage image = new BufferedImage(Ressources.WINDOW.width, Ressources.WINDOW.height, BufferedImage.TYPE_INT_ARGB);
BufferedImage bgimage = new BufferedImage(Ressources.WINDOW.width, Ressources.WINDOW.height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) image.getGraphics();
Graphics2D bg = (Graphics2D) bgimage.getGraphics();
if(storyInfo.getElements().size() > elementPointer){
for(int i=0;i<Ressources.TILESPERPANEL;i++){
g.drawImage(getNextMapElement(elementPointer+currentElementCounter, i),i*Ressources.RASTERSIZE,0,null);
while (storyInfo.getElements().size() > (elementPointer+currentElementCounter)&&
(storyInfo.getElements().size() > (elementPointer+currentElementCounter+1))&&
storyInfo.getElements().get(elementPointer+currentElementCounter).getBlock() == storyInfo.getElements().get(elementPointer+currentElementCounter+1).getBlock()){
currentElementCounter++;
}
while (storyInfo.getElements().size() > (elementPointer+currentElementCounter)&&
i+ ((panelnum-1)*Ressources.TILESPERPANEL) <storyInfo.getElements().get(elementPointer+currentElementCounter).getBlock()){
currentElementCounter--;
}
currentElementCounter++;
if(DebugSettings.fg1tilenum)
renderText(g,((float) (Ressources.STORYTEXTSIZE/Ressources.SCALE)), lastTileType+"", (i*Ressources.RASTERSIZE)+20,100);
if(DebugSettings.fg1panelborder)
g.drawRect(i*Ressources.RASTERSIZE, 0, Ressources.RASTERSIZE, Ressources.WINDOW.height);
}
for(int i=0;i<Ressources.TILESPERPANEL;i++){
//Bilder werden geredert
if(elementPointer < storyInfo.getElements().size() &&
storyInfo.getElements().get(elementPointer).getBlock() <= (i + (panelnum-1)*Ressources.TILESPERPANEL)){
ILevelAppearance element = (elements.get(elementPointer));
if (element.getBlock() == i +(panelnum-1)*Ressources.TILESPERPANEL){
if(element instanceof IllustrationBig){
element.render(bg, currentTileIds.get(0), Ressources.LAYERFOREGROUNDONE, pane);
}
else{
element.render(g, currentTileIds.get(0), Ressources.LAYERFOREGROUNDONE, 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);
}
}
}
if(DebugSettings.fg1panelnum)
renderText(g,50, panelnum+"", 20, 40);
bg.drawImage(image, 0, 0, null);
pane.setIcon(new ImageIcon(bgimage));
}
public LinkedList<TileResult> getTileQue() {
return this.tileQue;
}
public static void cleanup() {
tileQue = new SBLinkedList<TileResult>();
}
}