At the start f this year I was working on a 2D game engine I was hoping to eventually turn into a network game (( any one know an easy to understand Java threaded socket tutorial ? )) ... the last thing I was working on before I moved on to something else was implementing player placed items on the map.
That was 8 months ago .
I decided to pick up the project again yesterday, and I have to hand it to myself, I can write some really good spaghetti code !
I had forgotten how tangled everything had become as I added features and fixed bugs.
Here is the class that handles the map generation, and some how the player collision, and a few other things I forgotten about ( there are 19 classes, almost all of them are tangled ) . Note how I have a tendency to abuse non static classes as static ...
// note: add methods to add and remove from the maps
public class MapGen {
Font font ;
Screen scr;
Graphics gr;
InteractiveObject io;
InteractiveObjectsINI eo;
GameLoop gl;
String output;
InteractiveObject[][] iomap; // <-- generated items
Items[][] iimap; // <-- player placed
ProbSelect ps; // add in methods to handle ii items
int mapX;
int mapY;
int cordX;
int cordY;
Random rand;
int offsetX;
int offsetY;
int tile_size;
List <String> objects;
List <Integer> xlist;
List <Integer> ylist;
List <Color> clist;
public MapGen(int x, int y,InteractiveObjectsINI e, GameLoop g){
eo = e;
gl = g;
mapX = x;
mapY = y;
output = "";
cordX = 0;
cordY = 0;
rand = new Random();
io = new InteractiveObject();
iomap = new InteractiveObject[mapX][mapY];
iimap = new Items[mapX][mapY];
ps = new ProbSelect();
tile_size = 32;
offsetX = 10; //height
offsetY = 10; // width
// This is going into a different class ... does *not* belong in the IntObj class
// based on x out of 10000
//TODO create different "group" class
InteractiveObject.tree_rarity = 100;
InteractiveObject.rock_rarity = 150;
InteractiveObject.mining_node_rarity = 25;
InteractiveObject.plant_rarity = 200;
font = new Font("Times New Roman",Font.BOLD,tile_size);
scr = new Screen(this);
}
public void generateMap(){
// Trees
addEnvObjectsToMap(io.getTreeRarity(),eo.getTrees() );
// Rocks
addEnvObjectsToMap(io.getRockRarity(),eo.getRocks() );
// Mining Nodes
addEnvObjectsToMap(io.getMiningNodeRarity(),eo.getMiningNodes() );
// Plants
addEnvObjectsToMap(io.getPlantRarity(),eo.getPlants() );
for (cordX = 0 ; cordX < mapX; cordX ++){ // <-- iiMap builder ... needs expanded later
for (cordY = 0; cordY < mapY ; cordY ++){
if (iomap[cordX][cordY] == null){iimap[cordX][cordY] = null;}
}} // < for loops
}
public void outputMap(Player p){
//generateMap();
String [] temp = new String[2];
output = "|";
int poX1 = p.getPlayerX() - offsetX;
int poY1 = p.getPlayerY() - offsetY;
int poX2 = p.getPlayerX() + offsetX;
int poY2 = p.getPlayerY() + offsetY;
objects = new ArrayList<String>();
xlist = new ArrayList<Integer>();
ylist = new ArrayList<Integer>();
clist = new ArrayList<Color>();
if (poX1 < 0){poX1 = 0;}
if (poY1 < 0){poY1 = 0;}
if (poX2 > mapX){poX2 = mapX;}
if (poY2 > mapY){poY2 = mapY;}
for (cordX = poX1 ; cordX < poX2; cordX ++){
for (cordY = poY1; cordY < poY2 ; cordY ++){
if (p.getPlayerX() == cordX && p.getPlayerY() == cordY ){
objects.add(p.getPlayerSprite() ) ;
xlist.add( ((cordX - p.getPlayerX() ) + offsetX ) * tile_size );
ylist.add( ((cordY - p.getPlayerY() ) + offsetY ) * tile_size );
clist.add(Color.BLACK );
}
else{
if (iomap[cordX][cordY] != null){
temp = iomap[cordX][cordY].getStates();
objects.add(temp[iomap[cordX][cordY].getCurrentState()]) ;
xlist.add( ((cordX - p.getPlayerX() ) + offsetX ) * tile_size );
ylist.add( ((cordY - p.getPlayerY() ) + offsetY ) * tile_size );
clist.add(iomap[cordX][cordY].getColor() );
}
}
}
}
scr.run();
}
public boolean chance(int x){
int num = rand.nextInt(10000);
if (num < x){ return true;}
else {return false;}
}
public void addEnvObjectsToMap(int rar,List<InteractiveObject> items){
for (cordX = 0 ; cordX < mapX; cordX ++){
for (cordY = 0; cordY < mapY ; cordY ++){
if (iomap[cordX][cordY] == null){
if (chance(rar) ){
iomap[cordX][cordY] = ps.selectItem(items).getCopy(); // <--- I hope to the gods this works !
}} // < if loops
else{} // < first if
}} // < for loops
}
public void say(String x){
System.out.println(x);
}
public int getMapX(){return mapX;}
public int getMapY(){return mapY;}
///
/// Get Object On Map - lazy way
///
public InteractiveObject checkMapLoc(Player p){
if (strBoo(p.getPlayerDirection(),"n") ){
try{ return iomap[p.getPlayerX() -1 ][p.getPlayerY()];}
catch (Exception e){return null;}
}
else if (strBoo(p.getPlayerDirection(),"s") ){
try{return iomap[p.getPlayerX() + 1 ][p.getPlayerY()];}
catch (Exception e){return null;}
}
else if (strBoo(p.getPlayerDirection(),"w") ){
try{return iomap[p.getPlayerX()][p.getPlayerY() - 1 ];}
catch (Exception e){return null;}
}
else if (strBoo(p.getPlayerDirection(),"e") ){
try{return iomap[p.getPlayerX()][p.getPlayerY() + 1 ];}
catch (Exception e){return null;}
}
else{return null;}
}
public Items checkPlacedLoc(Player p){
if (strBoo(p.getPlayerDirection(),"n") ){
try{ return iimap[p.getPlayerX() -1 ][p.getPlayerY()];}
catch (Exception e){return null;}
}
else if (strBoo(p.getPlayerDirection(),"s") ){
try{return iimap[p.getPlayerX() + 1 ][p.getPlayerY()];}
catch (Exception e){return null;}
}
else if (strBoo(p.getPlayerDirection(),"w") ){
try{return iimap[p.getPlayerX()][p.getPlayerY() - 1 ];}
catch (Exception e){return null;}
}
else if (strBoo(p.getPlayerDirection(),"e") ){
try{return iimap[p.getPlayerX()][p.getPlayerY() + 1 ];}
catch (Exception e){return null;}
}
else{return null;}
}
public boolean strBoo(String s, String s1){
if (s.equalsIgnoreCase(s1) ){
return true;
}
else{
return false;
}
}
public void map_out (Graphics g){ // were all the magic happens
g.setFont(font);
int tmp = objects.size();
for (int i = 0; i < tmp; i++){
g.setColor(clist.get(i) );
g.drawString(objects.get(i),ylist.get(i),xlist.get(i));
}
}
public void addToMapObjects(InteractiveObject o){
}
public void addToMapItems(Items i){
}
}