Co-authored-by: r3cp3ct <45179536+r3cp3ct@users.noreply.github.com> Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
321 lines
14 KiB
Java
321 lines
14 KiB
Java
package sig.objects;
|
|
|
|
import java.awt.event.MouseEvent;
|
|
import java.io.IOException;
|
|
|
|
import sig.RabiClone;
|
|
import sig.engine.Action;
|
|
import sig.engine.Alpha;
|
|
import sig.engine.Font;
|
|
import sig.engine.MouseScrollValue;
|
|
import sig.engine.PaletteColor;
|
|
import sig.engine.Panel;
|
|
import sig.engine.String;
|
|
import sig.map.Background;
|
|
import sig.map.DataTile;
|
|
import sig.map.Map;
|
|
import sig.map.Tile;
|
|
import sig.map.View;
|
|
import sig.map.Type;
|
|
|
|
public class EditorRenderer extends LevelRenderer{
|
|
|
|
Tile selectedTile = Tile.WALL;
|
|
DataTile selectedDataTile = DataTile.BUN1;
|
|
|
|
String messageLog = new String();
|
|
final static long MESSAGE_TIME = 5000;
|
|
long last_message_log = System.currentTimeMillis();
|
|
|
|
final static String HELP_TEXT = new String("(F3) Toggle Camera (F4) Toggle Map Type (F5) Toggle Background");
|
|
|
|
final static char CAMERA_SPD = 512;
|
|
|
|
boolean dataTileView=false;
|
|
boolean inputDataTileValue=false;
|
|
String dataTileValue=new String("");
|
|
int storedTileX,storedTileY;
|
|
|
|
String inputMessageLogDisplay = new String();
|
|
|
|
public EditorRenderer(Panel panel) {
|
|
super(panel);
|
|
setX(3.5*Tile.TILE_WIDTH);
|
|
setY(3.5*Tile.TILE_HEIGHT);
|
|
AddMessage(PaletteColor.YELLOW_GREEN,"Level editing mode",PaletteColor.NORMAL," started.");
|
|
}
|
|
|
|
private void AddMessage(Object...s) {
|
|
messageLog.append('\n');
|
|
messageLog.append(s);
|
|
last_message_log = System.currentTimeMillis();
|
|
}
|
|
|
|
@Override
|
|
public void update(double updateMult) {
|
|
int right = KeyHeld(Action.MOVE_RIGHT)?1:0;
|
|
int left = KeyHeld(Action.MOVE_LEFT)?1:0;
|
|
int up = KeyHeld(Action.JUMP)?1:0;
|
|
int down = KeyHeld(Action.FALL)?1:0;
|
|
if (right-left!=0) {
|
|
setX(Math.max(0,getX()+(right-left)*CAMERA_SPD*updateMult));
|
|
}
|
|
if (up-down!=0) {
|
|
setY(Math.max(0,getY()+(down-up)*CAMERA_SPD*updateMult));
|
|
}
|
|
|
|
if (!inputDataTileValue) {
|
|
boolean left_mb = MouseHeld(MouseEvent.BUTTON1);
|
|
// boolean middle_mb = MouseHeld(MouseEvent.BUTTON2);
|
|
boolean right_mb = MouseHeld(MouseEvent.BUTTON3);
|
|
|
|
if(left_mb){
|
|
int tileX = (int)(RabiClone.MOUSE_POS.getX()+getX())/Tile.TILE_WIDTH;
|
|
int tileY = (int)(RabiClone.MOUSE_POS.getY()+getY())/Tile.TILE_HEIGHT;
|
|
if (dataTileView) {
|
|
if (selectedDataTile==DataTile.DATATILE) {
|
|
inputDataTileValue=true;
|
|
inputMessageLogDisplay=new String("Enter a Data Value: ");
|
|
storedTileX=tileX;
|
|
storedTileX=tileY;
|
|
} else {
|
|
RabiClone.CURRENT_MAP.ModifyDataTile(tileX, tileY, selectedDataTile);
|
|
}
|
|
} else {
|
|
RabiClone.CURRENT_MAP.ModifyTile(tileX, tileY, selectedTile);
|
|
}
|
|
}
|
|
if (right_mb) {
|
|
int tileX = (int)(RabiClone.MOUSE_POS.getX()+getX())/Tile.TILE_WIDTH;
|
|
int tileY = (int)(RabiClone.MOUSE_POS.getY()+getY())/Tile.TILE_HEIGHT;
|
|
if (dataTileView) {
|
|
RabiClone.CURRENT_MAP.ModifyDataTile(tileX, tileY, DataTile.NULL);
|
|
} else {
|
|
RabiClone.CURRENT_MAP.ModifyTile(tileX, tileY, Tile.VOID);
|
|
}
|
|
}
|
|
if(KeyHeld(Action.SLIDE)&&KeyHeld(Action.FALL)){
|
|
AddMessage("Saving map...");
|
|
try {
|
|
Map.SaveMap(RabiClone.CURRENT_MAP);
|
|
AddMessage(RabiClone.CURRENT_MAP.toString()," has been saved successfully.");
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
AddMessage(PaletteColor.RED,"Map failed to save: ",e.getLocalizedMessage());
|
|
}
|
|
}
|
|
}
|
|
updateMessageLog();
|
|
}
|
|
|
|
private void updateMessageLog() {
|
|
if (messageLog.length()>0) {
|
|
if (System.currentTimeMillis()-last_message_log>MESSAGE_TIME) {
|
|
last_message_log=System.currentTimeMillis();
|
|
int secondMarker = messageLog.indexOf("\n",messageLog.indexOf("\n")+1);
|
|
messageLog.replace(messageLog.indexOf("\n"), secondMarker==-1?messageLog.length():secondMarker, "");
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void MouseScrolled(MouseScrollValue scrolled) {
|
|
int up = scrolled==MouseScrollValue.UP?1:0;
|
|
int down = scrolled==MouseScrollValue.DOWN?1:0;
|
|
if (dataTileView) {
|
|
int tempIndex = selectedDataTile.ordinal()+down-up;
|
|
int selectedIndex = tempIndex<0?DataTile.values().length-1:tempIndex%DataTile.values().length;
|
|
selectedDataTile = DataTile.values()[selectedIndex];
|
|
} else {
|
|
int tempIndex = selectedTile.ordinal()+down-up;
|
|
int selectedIndex = tempIndex<0?Tile.values().length-1:tempIndex%Tile.values().length;
|
|
selectedTile = Tile.values()[selectedIndex];
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void draw(byte[] p) {
|
|
super.draw(p);
|
|
for (int y=(int)(this.getY()/Tile.TILE_HEIGHT);y<(int)(RabiClone.BASE_HEIGHT/Tile.TILE_HEIGHT+this.getY()/Tile.TILE_HEIGHT+1);y++) {
|
|
if (y<0||y>Map.MAP_HEIGHT) {
|
|
continue;
|
|
}
|
|
for (int x=(int)(0+this.getX()/Tile.TILE_WIDTH);x<(int)(RabiClone.BASE_WIDTH/Tile.TILE_WIDTH+this.getX()/Tile.TILE_WIDTH+1);x++) {
|
|
if (x<0||x>Map.MAP_WIDTH) {
|
|
continue;
|
|
}
|
|
if (dataTileView) {
|
|
drawMapTileForDataTileMode(p,x,y);
|
|
if (RabiClone.CURRENT_MAP.getDataTileRawValue(x, y)>=8192) {
|
|
DrawDataTileValue(p,x*Tile.TILE_WIDTH-this.getX(),y*Tile.TILE_HEIGHT-this.getY(),RabiClone.CURRENT_MAP.getDataTileRawValue(x, y));
|
|
} else if (RabiClone.CURRENT_MAP.getDataTile(x, y)!=DataTile.NULL) {
|
|
DrawDataTile(p,x*Tile.TILE_WIDTH-this.getX(),y*Tile.TILE_HEIGHT-this.getY(),RabiClone.CURRENT_MAP.getDataTile(x, y));
|
|
}
|
|
} else {
|
|
drawMapTileForEditorMode(x,y);
|
|
}
|
|
}
|
|
}
|
|
for (int y=(int)(this.getY()/Tile.TILE_HEIGHT);y<(int)(RabiClone.BASE_HEIGHT/Tile.TILE_HEIGHT+this.getY()/Tile.TILE_HEIGHT+1);y++) {
|
|
if (y<0||y>Map.MAP_HEIGHT) {
|
|
continue;
|
|
}
|
|
for (int x=(int)(0+this.getX()/Tile.TILE_WIDTH);x<(int)(RabiClone.BASE_WIDTH/Tile.TILE_WIDTH+this.getX()/Tile.TILE_WIDTH+1);x++) {
|
|
if (x<0||x>Map.MAP_WIDTH) {
|
|
continue;
|
|
}
|
|
drawTileGrid(p,x,y);
|
|
}
|
|
}
|
|
Draw_Rect(p,PaletteColor.YELLOW,2,0,messageLog.getBounds(Font.PROFONT_12).getX(),messageLog.getBounds(Font.PROFONT_12).getY());
|
|
Draw_Text(4,0,messageLog,Font.PROFONT_12);
|
|
Draw_Rect(p,PaletteColor.YELLOW,2,messageLog.getBounds(Font.PROFONT_12).getY()+10,inputMessageLogDisplay.getBounds(Font.PROFONT_12).getX(),inputMessageLogDisplay.getBounds(Font.PROFONT_12).getY());
|
|
Draw_Text(4,messageLog.getBounds(Font.PROFONT_12).getY()+12,inputMessageLogDisplay,Font.PROFONT_12);
|
|
Draw_Rect(p,PaletteColor.YELLOW,4+inputMessageLogDisplay.getBounds(Font.PROFONT_12).getX()+2,messageLog.getBounds(Font.PROFONT_12).getY()+10,dataTileValue.getBounds(Font.PROFONT_12).getX(),dataTileValue.getBounds(Font.PROFONT_12).getY());
|
|
Draw_Text_Ext(4+inputMessageLogDisplay.getBounds(Font.PROFONT_12).getX()+4,messageLog.getBounds(Font.PROFONT_12).getY()+12,dataTileValue,Font.PROFONT_12,Alpha.ALPHA0,PaletteColor.DEEP_RUBY);
|
|
Draw_Text(4,RabiClone.BASE_HEIGHT-Font.PROFONT_12.getGlyphHeight()-4,HELP_TEXT,Font.PROFONT_12);
|
|
}
|
|
|
|
private void drawTileGrid(byte[] p, int x, int y) {
|
|
if (x%Tile.TILE_SCREEN_COUNT_X==0&&y%Tile.TILE_SCREEN_COUNT_Y==0) {
|
|
int xpos=(int)(x*Tile.TILE_WIDTH-getX());
|
|
int ypos=(int)(y*Tile.TILE_HEIGHT-getY());
|
|
Draw_Text(xpos+2,ypos+2,
|
|
new String("View:").append(PaletteColor.EMERALD).append(RabiClone.CURRENT_MAP.getView(x,y))
|
|
.append(PaletteColor.NORMAL).append("\nType:").append(PaletteColor.MIDNIGHT_BLUE).append(RabiClone.CURRENT_MAP.getType(x,y))
|
|
.append(PaletteColor.NORMAL).append("\nBackground:").append(PaletteColor.GRAPE).append(RabiClone.CURRENT_MAP.getBackground(x,y))
|
|
,Font.PROFONT_12);
|
|
}
|
|
if (x%Tile.TILE_SCREEN_COUNT_X==0) {
|
|
for (int yy=0;yy<Tile.TILE_HEIGHT;yy++) {
|
|
int ypos=(int)(y*Tile.TILE_HEIGHT-getY()+yy);
|
|
int xpos=(int)(x*Tile.TILE_WIDTH-getX());
|
|
int index=ypos*Map.MAP_WIDTH+xpos;
|
|
if (index<0||index>=p.length) {
|
|
continue;
|
|
}
|
|
Draw(p,index,PaletteColor.BLACK,Alpha.ALPHA0);
|
|
}
|
|
}
|
|
if (y%Tile.TILE_SCREEN_COUNT_Y==0) {
|
|
for (int xx=0;xx<Tile.TILE_HEIGHT;xx++) {
|
|
int ypos=(int)(y*Tile.TILE_HEIGHT-getY());
|
|
int xpos=(int)(x*Tile.TILE_WIDTH-getX()+xx);
|
|
int index=ypos*Map.MAP_WIDTH+xpos;
|
|
if (xpos<0||xpos>=Map.MAP_WIDTH||ypos<0||ypos>=Map.MAP_HEIGHT||index<0||index>=p.length) {
|
|
continue;
|
|
}
|
|
Draw(p,index,PaletteColor.BLACK,Alpha.ALPHA0);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void drawMapTileForEditorMode(int x, int y) {
|
|
int tilerX = (int)(RabiClone.MOUSE_POS.getX()+getX())/Tile.TILE_WIDTH;
|
|
int tilerY = (int)(RabiClone.MOUSE_POS.getY()+getY())/Tile.TILE_HEIGHT;
|
|
if (x==tilerX&&y==tilerY) {
|
|
double tileX = x*Tile.TILE_WIDTH-this.getX();
|
|
double tileY = y*Tile.TILE_HEIGHT-this.getY();
|
|
DrawTransparentTile(tileX,tileY,selectedTile,Alpha.ALPHA160);
|
|
Draw_Text(tileX+2,tileY-Font.PROFONT_12.getGlyphHeight()-2,new String(selectedTile.toString()),Font.PROFONT_12);
|
|
Draw_Text_Ext(tileX+2,tileY+Tile.TILE_HEIGHT+2,new String(RabiClone.CURRENT_MAP.getTile(x,y).toString()),Font.PROFONT_12,Alpha.ALPHA0,PaletteColor.CRIMSON);
|
|
}
|
|
}
|
|
|
|
protected void drawMapTileForDataTileMode(byte[] p, int x, int y) {
|
|
int tilerX = (int)(RabiClone.MOUSE_POS.getX()+getX())/Tile.TILE_WIDTH;
|
|
int tilerY = (int)(RabiClone.MOUSE_POS.getY()+getY())/Tile.TILE_HEIGHT;
|
|
if (x==tilerX&&y==tilerY) {
|
|
double tileX = x*Tile.TILE_WIDTH-this.getX();
|
|
double tileY = y*Tile.TILE_HEIGHT-this.getY();
|
|
DrawTransparentDataTile(p,tileX,tileY,selectedDataTile,PaletteColor.GRAPE);
|
|
Draw_Text_Ext(tileX+2,tileY+Tile.TILE_HEIGHT+2,selectedDataTile.getDescription(),Font.PROFONT_12,Alpha.ALPHA0,PaletteColor.CRIMSON);
|
|
}
|
|
}
|
|
|
|
protected void DrawTransparentDataTile(byte[] p, double x, double y, DataTile tile,PaletteColor col) {
|
|
Draw_Rect(p,col,x,y,Tile.TILE_WIDTH,Tile.TILE_HEIGHT);
|
|
Draw_Text_Ext(x+2,y+2,new String(tile.toString()),Font.PROFONT_12,Alpha.ALPHA0,PaletteColor.WHITE);
|
|
}
|
|
|
|
protected void DrawTransparentDataTile(byte[] p, double x, double y, char tile,PaletteColor col) {
|
|
Draw_Rect(p,col,x,y,Tile.TILE_WIDTH,Tile.TILE_HEIGHT);
|
|
Draw_Text_Ext(x+2,y+2,new String("V:").append(Integer.toString(tile-8192)),Font.PROFONT_12,Alpha.ALPHA0,PaletteColor.WHITE);
|
|
}
|
|
|
|
protected void DrawDataTile(byte[] p, double x, double y, DataTile tile) {
|
|
DrawTransparentDataTile(p,x,y,tile,PaletteColor.MIDNIGHT_BLUE);
|
|
}
|
|
|
|
private void DrawDataTileValue(byte[] p, double x, double y, char tile) {
|
|
DrawTransparentDataTile(p,x,y,tile,PaletteColor.RAZZMIC_BERRY);
|
|
}
|
|
|
|
@Override
|
|
@SuppressWarnings("incomplete-switch")
|
|
public void KeyPressed(Action a) {
|
|
int tileX = (int)(RabiClone.MOUSE_POS.getX()+getX())/Tile.TILE_WIDTH;
|
|
int tileY = (int)(RabiClone.MOUSE_POS.getY()+getY())/Tile.TILE_HEIGHT;
|
|
switch (a) {
|
|
case PLAY_GAME:{
|
|
RabiClone.OBJ.clear();
|
|
RabiClone.ResetGame();
|
|
RabiClone.OBJ.add(RabiClone.level_renderer = new LevelRenderer(RabiClone.p));
|
|
RabiClone.StartGame();
|
|
}break;
|
|
case LEVEL_EDITOR:{
|
|
dataTileView=!dataTileView;
|
|
}break;
|
|
case EDITOR_SET_VIEW:{
|
|
RabiClone.CURRENT_MAP.setView(tileX,tileY,View.values()[(RabiClone.CURRENT_MAP.getView(tileX, tileY).ordinal()+1)%View.values().length]);
|
|
}break;
|
|
case EDITOR_SET_TYPE:{
|
|
RabiClone.CURRENT_MAP.setType(tileX,tileY,Type.values()[(RabiClone.CURRENT_MAP.getType(tileX, tileY).ordinal()+1)%Type.values().length]);
|
|
}break;
|
|
case EDITOR_SET_BACKGROUND:{
|
|
RabiClone.CURRENT_MAP.setBackground(tileX,tileY,Background.values()[(RabiClone.CURRENT_MAP.getBackground(tileX, tileY).ordinal()+1)%Background.values().length]);
|
|
}break;
|
|
case _0:
|
|
case _1:
|
|
case _2:
|
|
case _3:
|
|
case _4:
|
|
case _5:
|
|
case _6:
|
|
case _7:
|
|
case _8:
|
|
case _9:
|
|
if (inputDataTileValue) {
|
|
dataTileValue=dataTileValue.append(a.toString().replace("_",""));
|
|
}
|
|
break;
|
|
case BACKSPACE:{
|
|
if (dataTileValue.length()>0) {
|
|
dataTileValue=dataTileValue.substring(0, dataTileValue.length()-1);
|
|
}
|
|
}break;
|
|
case ENTER:{
|
|
inputDataTileValue=false;
|
|
RabiClone.CURRENT_MAP.ModifyDataTileValue(tileX, tileY, (char)Integer.parseInt(dataTileValue.toString()));
|
|
inputMessageLogDisplay.clear();
|
|
dataTileValue.clear();
|
|
}break;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void drawBackground(byte[] p) {
|
|
int screenX = (int)(getX()+RabiClone.BASE_WIDTH/2)/Tile.TILE_WIDTH;
|
|
int screenY = (int)(getY()+RabiClone.BASE_HEIGHT/2)/Tile.TILE_HEIGHT;
|
|
Background targetBackground = RabiClone.CURRENT_MAP.getBackground(screenX, screenY);
|
|
for (int y=0;y<RabiClone.BASE_HEIGHT;y++) {
|
|
for (int x=0;x<RabiClone.BASE_WIDTH;x++) {
|
|
int index = y*RabiClone.BASE_WIDTH+x;
|
|
p[index] = targetBackground.getPixels()[
|
|
((y+(int)(getY()*targetBackground.getScrollSpeed()))%targetBackground.getHeight())*targetBackground.getWidth()+((x+(int)(getX()*targetBackground.getScrollSpeed()))%targetBackground.getWidth())
|
|
];
|
|
}
|
|
}
|
|
}
|
|
}
|