1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-11-05 02:39:41 +01:00
VVVVVV/tools/editors/World Map Fork (for Eurogamer)/map.hpp

931 lines
28 KiB
C++
Raw Normal View History

class entities{
public:
int x, y, t;
//parameters
int p1, p2, p3, p4, p5, p6;
};
int numentities;
entities entity[200];
void addentity(int xp, int yp, int tp, int p1=0, int p2=0, int p3=0, int p4=0, int p5=320, int p6=240){
entity[numentities].x=xp;
entity[numentities].y=yp;
entity[numentities].t=tp;
entity[numentities].p1=p1;
entity[numentities].p2=p2;
entity[numentities].p3=p3;
entity[numentities].p4=p4;
entity[numentities].p5=p5;
entity[numentities].p6=p6;
numentities++;
}
void naddentity(int xp, int yp, int tp, int p1=0, int p2=0, int p3=0, int p4=0, int p5=320, int p6=240){
entity[numentities].x=xp;
entity[numentities].y=yp;
entity[numentities].t=tp;
entity[numentities].p1=p1;
entity[numentities].p2=p2;
entity[numentities].p3=p3;
entity[numentities].p4=p4;
entity[numentities].p5=p5;
entity[numentities].p6=p6;
}
void copyentity(int a, int b){
entity[a].x=entity[b].x;
entity[a].y=entity[b].y;
entity[a].t=entity[b].t;
entity[a].p1=entity[b].p1;
entity[a].p2=entity[b].p2;
entity[a].p3=entity[b].p3;
entity[a].p4=entity[b].p4;
entity[a].p5=entity[b].p5;
entity[a].p6=entity[b].p6;
}
void removeentity(int t){
if(t==numentities-1){
numentities--;
}else{
for(int m=t;m<numentities;m++) copyentity(m,m+1);
numentities--;
}
}
int entat(int xp, int yp){
for(int i=0; i<numentities; i++){
if(entity[i].x==xp && entity[i].y==yp) return i;
}
return -1;
}
bool entclear(int xp, int yp){
for(int i=0; i<numentities; i++){
if(entity[i].x==xp && entity[i].y==yp) return false;
}
return true;
}
void savemapsimple(){
string s = "imports/"+currentarea+"/x"+its(mapx)+"y"+its(mapy)+".txt";
ofstream file;
file.open(s.c_str(), ios::trunc);
for(int j=0; j<30; j++){
for(int i=0; i<40; i++){
file << mapcontents[i][j] << " ";
}
file << "\n";
}
file << numentities << "\n";
for(int i=0; i<numentities; i++){
file << entity[i].x << " " << entity[i].y << " " << entity[i].t;
switch(entity[i].t){
case 1: case 2: //Enemy
file << " " << entity[i].p1 << " " << entity[i].p2
<< " " << entity[i].p3 << " " << entity[i].p4
<< " " << entity[i].p5 << " " << entity[i].p6;
break;
case 10: case 11: case 12: //Save point
file << " " << entity[i].p1; //p1: 0 hanging from roof
break;
default:
break;
}
file << "\n";
}
file.close();
}
void saveareamapimport(){
string s = "areamapin.txt";
ofstream file;
file.open(s.c_str(), ios::trunc);
for(int j=0; j<20; j++){
for(int i=0; i<20; i++){
file << areamap[i][j] << " ";
}
file << "\n";
}
file.close();
}
void saveareamap(){
saveareamapimport();
string s = "areamap.txt";
ofstream file;
file.open(s.c_str(), ios::trunc);
file << "tmap = new Array();\n";
for(int j=0; j<20; j++){
file << "tmap.push(\"";
for(int i=0; i<19; i++){
file << areamap[i][j] << ",";
}
file << areamap[19][j] << "\");\n";
}
file.close();
}
bool existmap(int x, int y){
//returns true if an "other" map exists at x, y
x+=100;
y+=100;
string s = "imports/other/x"+its(x)+"y"+its(y)+".txt";
ifstream file;
file.open(s.c_str());
if(!file){
return false;
}
file.close();
return true;
}
bool loadmap(int x, int y){
//set current area based on area
maptileset=1;
temp=areamap[x-100][y-100];
switch(temp){
case 0: currentarea="unset"; break;
case 1: currentarea="other"; break;
case 2: currentarea="lab"; break;
case 3: currentarea="tower"; break;
case 4: currentarea="warp"; break;
case 5: currentarea="spacestation2"; break;
}
//set area offset
x=x-100;
y=y-100;
switch(temp){
case 0: currentarea="unset"; break;
case 1:
x+=100;
y+=100;
break;
case 2:
if(y<5){
x+=50-2; y+=54; //lab
}else{
x+=50-2; y+=50-16; //lab
}
break;
case 3: currentarea="tower"; break;
case 4:
x+=50-14; y+=49; //warp
break;
case 5:
x+=50-12; y+=50-14; //Space Station
break;
}
int xp, yp, t, n;
int p1, p2, p3, p4, p5, p6;
string s = "imports/"+currentarea+"/x"+its(x)+"y"+its(y)+".txt";
ifstream file;
file.open(s.c_str());
if(!file){
for(int j=1; j<29; j++){
for(int i=1; i<39; i++){
mapcontents[i][j]=0;
}
}
numentities=0;
return false;
}
for(int j=0; j<30-(temp>2); j++){
for(int i=0; i<40; i++){
file >> mapcontents[i][j];
}
}
file >> p;
numentities=0;
for(int i=0; i<p; i++){
file >> temp; file >> temp2; file >> temp3;
switch(temp3){
case 1: case 2: //Enemy, or platform
file >> p1; file >> p2; file >> p3; file >> p4; file >> p5; file >> p6;
addentity(temp,temp2,temp3,p1,p2,p3,p4,p5,p6);
break;
case 10: case 11: case 12: //Save point
file >> p1;
addentity(temp,temp2,temp3,p1);
break;
default:
addentity(temp,temp2,temp3);
break;
}
}
file.close();
return true;
}
void supersavemap(){
//holy crap
int tmpx, tmpy;
int ccount=0, scount=0;
string s = "overworld.txt";
ofstream file;
file.open(s.c_str(), ios::trunc);
tmpx=mapx; tmpy=mapy;
for(int i=0; i<20; i++){
for(int j=0; j<20; j++){
if(existmap(i,j)){
mapx=i; mapy=j;
loadmap(i+100,j+100);
scount=0;
file << "case rn("<< its(mapx) << ","<< its(mapy) << "):\n";
file << "tmap = new Array();\n";
for(int j=0; j<30; j++){
file << "tmap.push(\"";
for(int i=0; i<39; i++){
file << mapcontents[i][j] << ",";
}
file << mapcontents[39][j] << "\");\n";
}
//file << "fillcontent(tmap);\n";
if(numentities>0){
file << "\n";
for(int i=0; i<numentities; i++){
if(entity[i].t==11){
if(entity[i].x==0){
file << "obj.createentity(game, " << -8 << ", " << (entity[i].y*8)+4
<< ", " << entity[i].t;
}else{
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)+4
<< ", " << entity[i].t;
}
}else if(entity[i].t==12){
if(entity[i].y==0){
file << "obj.createentity(game, " << (entity[i].x*8)+3 << ", " << -8
<< ", " << entity[i].t;
}else{
file << "obj.createentity(game, " << (entity[i].x*8)+3 << ", " << (entity[i].y*8)
<< ", " << entity[i].t;
}
}else if(entity[i].t==9){
//Ok, we're looking for the warp token signiture, which is a teleporter on top of
//a shiny trinket. So we need to check the other entities here:
for(int j=0; j<numentities; j++){
if(entity[j].t==8){
if(entity[j].x+1==entity[i].x){
if(entity[j].y+1==entity[i].y){
//It's a warp token!
entity[i].t=13;
entity[j].t=14;
}
}
}
}
if(entity[i].t==9){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", " << entity[i].t;
}
}else if(entity[i].t==8){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 14); //Teleporter!";
}else if(entity[i].t==2 && entity[i].p1==4){
entity[i].t=3;
}else if(entity[i].t==2 && entity[i].p1==5){
entity[i].t=4;
}else if(entity[i].t==2 && entity[i].p1==6){
entity[i].t=4;
}else if(entity[i].t==2 && entity[i].p1==7){
entity[i].t=4;
}else if(entity[i].t==2 && entity[i].p1==8){
entity[i].t=4;
}else if(entity[i].t==10 && entity[i].x==0 && entity[i].y==0){
//This means use a different tileset, so don't output a savepoint
}else{
if(entity[i].t!=14){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", " << entity[i].t;
}
}
switch(entity[i].t){
case 1: //Enemy
file << ", " << entity[i].p1 << ", " << entity[i].p2;
if(entity[i].p3==0 && entity[i].p4==0 && entity[i].p5==320 && entity[i].p6==240){
file << "); // Enemy";
}else{
file << ", " << entity[i].p3 << ", " << entity[i].p4
<< ", " << entity[i].p5 << ", " << entity[i].p6
<< "); // Enemy, bounded";
}
break;
case 2: //Moving platform
file << ", " << entity[i].p1 << ", " << entity[i].p2;
if(entity[i].p3==0 && entity[i].p4==0 && entity[i].p5==320 && entity[i].p6==240){
file << "); // Platform";
}else{
file << ", " << entity[i].p3 << ", " << entity[i].p4
<< ", " << entity[i].p5 << ", " << entity[i].p6
<< "); // Platform, bounded";
}
break;
case 3:
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 3); //Disappearing Platform";
entity[i].t=2; //So that it doesn't disapear from the editor
break;
case 4:
if(entity[i].p1==5){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 2, 8, " << entity[i].p2 << "); //Threadmill, >>>";
}else if(entity[i].p1==6){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 2, 9, " << entity[i].p2 << "); //Threadmill, <<<";
}else if(entity[i].p1==7){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 2, 10, " << entity[i].p2 << "); //Big Threadmill, >>>>>>";
}else if(entity[i].p1==8){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 2, 11, " << entity[i].p2 << "); //Big Threadmill, <<<<<<";
}
entity[i].t=2; //So that it doesn't disapear from the editor
break;
case 8: //coin
//file << ", " << entity[i].p1 << ", coin"); // (coins)";
//ccount++;
break;
case 9: //shiny
file << ", " << ccount <<"); // (shiny trinket)";
ccount++;
break;
case 10: //Save point
if(entity[i].x==0 && entity[i].y==0){
file << "roomtileset = 0; // (Use space station tileset)";
}else{
file << ", " << entity[i].p1 << ", " << int(scount+((mapx+(mapy*100))*10)) << "); // (savepoint)";
scount++;
}
break;
case 11: //Horizontal
if(entity[i].x==0){
file << ", " << entity[i].p1+8 <<"); // (horizontal gravity line)";
}else{
file << ", " << entity[i].p1 <<"); // (horizontal gravity line)";
}
break;
case 12: //Vertical
if(entity[i].y==0){
file << ", " << entity[i].p1+8 <<"); // (vertical gravity line)";
}else{
file << ", " << entity[i].p1 <<"); // (vertical gravity line)";
}
break;
case 13: //Warp Token
entity[i].t=9;
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 13); //Warp Token";
break;
case 14: //Warp Token aid
entity[i].t=8;
break;
default:
file << ", behave, para);";
break;
}
file << "\n";
}
}
//this bit only if in the lab:
temp=-1;
for(int j=0; j<30; j++){
for(int i=0; i<39; i++){
if(temp==-1){
if(mapcontents[i][j]==280) temp=0;
if(mapcontents[i][j]==283) temp=1;
if(mapcontents[i][j]==286) temp=2;
if(mapcontents[i][j]==289) temp=3;
if(mapcontents[i][j]==292) temp=4;
if(mapcontents[i][j]==295) temp=5;
}
}
}
//if(temp>=0){
// file << "rcol="<<temp<<";\n";
// }
//
file << "break;\n\n";
}
}
}
mapx=tmpx; mapy=tmpy;
file.close();
}
void supersaveminimap(){
//holy crap
int tmpx, tmpy;
int ccount=0, scount=0;
string s = "overworld.txt";
ofstream file;
file.open(s.c_str(), ios::trunc);
tmpx=mapx; tmpy=mapy;
clear_to_color(worldmap, makecol(0,0,0));
for(int i=0; i<20; i++){
for(int j=0; j<20; j++){
if(existmap(i,j)){
mapx=i; mapy=j;
loadmap(i+100,j+100);
scount=0;
//Output pixels to bitmap here
for(int j2=0;j2<30; j2++){
for(int i2=0;i2<40; i2++){
if(mapcontents[i2][j2]<80){
putpixel(worldmap, i2+(i*40), j2+(j*30), makecol(0,0,0));
}else if(mapcontents[i2][j2]>=80 && mapcontents[i2][j2]<280){
putpixel(worldmap, i2+(i*40), j2+(j*30), makecol(164,164,164));
}else if(mapcontents[i2][j2]>=280 && mapcontents[i2][j2]<680){
putpixel(worldmap, i2+(i*40), j2+(j*30), makecol(128,128,128));
}else{
putpixel(worldmap, i2+(i*40), j2+(j*30), makecol(64,64,64));
}
}
}
}
}
}
//Ok, we have a complete map, now output it!
savescreen(worldmap);
mapx=tmpx; mapy=tmpy;
file.close();
}
void savemap(){
int ccount=0, scount=0;
temp=areamap[mapx-100][mapy-100];
switch(temp){
case 0: currentarea="unset"; break;
case 1: currentarea="other"; break;
case 2: currentarea="lab"; break;
case 3: currentarea="tower"; break;
case 4: currentarea="warp"; break;
case 5: currentarea="spacestation2"; break;
}
if(temp==0){
temp=1;
areamap[mapx-100][mapy-100]=1;
currentarea="other";
saveareamap();
}
if(temp<2){
savemapsimple();
string s = "maps/"+currentarea+"/x"+its(mapx)+"y"+its(mapy)+".txt";
ofstream file;
file.open(s.c_str(), ios::trunc);
file << "case rn("<< its(mapx) << ","<< its(mapy) << "):\n";
file << "tmap = new Array();\n";
for(int j=0; j<30; j++){
file << "tmap.push(\"";
for(int i=0; i<39; i++){
file << mapcontents[i][j] << ",";
}
file << mapcontents[39][j] << "\");\n";
}
//file << "fillcontent(tmap);\n";
if(numentities>0){
file << "\n";
for(int i=0; i<numentities; i++){
if(entity[i].t==11){
if(entity[i].x==0){
file << "obj.createentity(game, " << -8 << ", " << (entity[i].y*8)+4
<< ", " << entity[i].t;
}else{
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)+4
<< ", " << entity[i].t;
}
}else if(entity[i].t==12){
if(entity[i].y==0){
file << "obj.createentity(game, " << (entity[i].x*8)+3 << ", " << -8
<< ", " << entity[i].t;
}else{
file << "obj.createentity(game, " << (entity[i].x*8)+3 << ", " << (entity[i].y*8)
<< ", " << entity[i].t;
}
}else if(entity[i].t==8){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 14); //Teleporter!";
}else if(entity[i].t==2 && entity[i].p1==4){
entity[i].t=3;
}else if(entity[i].t==2 && entity[i].p1==5){
entity[i].t=4;
}else if(entity[i].t==2 && entity[i].p1==6){
entity[i].t=4;
}else if(entity[i].t==2 && entity[i].p1==7){
entity[i].t=4;
}else if(entity[i].t==2 && entity[i].p1==8){
entity[i].t=4;
}else{
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", " << entity[i].t;
}
switch(entity[i].t){
case 1: //Enemy
file << ", " << entity[i].p1 << ", " << entity[i].p2;
if(entity[i].p3==0 && entity[i].p4==0 && entity[i].p5==320 && entity[i].p6==240){
file << "); // Enemy";
}else{
file << ", " << entity[i].p3 << ", " << entity[i].p4
<< ", " << entity[i].p5 << ", " << entity[i].p6
<< "); // Enemy, bounded";
}
break;
case 2: //Moving platform
file << ", " << entity[i].p1 << ", " << entity[i].p2;
if(entity[i].p3==0 && entity[i].p4==0 && entity[i].p5==320 && entity[i].p6==240){
file << "); // Platform";
}else{
file << ", " << entity[i].p3 << ", " << entity[i].p4
<< ", " << entity[i].p5 << ", " << entity[i].p6
<< "); // Platform, bounded";
}
break;
case 3:
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 3); //Disappearing Platform";
entity[i].t=2; //So that it doesn't disapear from the editor
break;
case 4:
if(entity[i].p1==5){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 2, 8, " << entity[i].p2 << "); //Threadmill, >>>";
}else if(entity[i].p1==6){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 2, 9, " << entity[i].p2 << "); //Threadmill, <<<";
}else if(entity[i].p1==7){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 2, 10, " << entity[i].p2 << "); //Big Threadmill, >>>>>>";
}else if(entity[i].p1==8){
file << "obj.createentity(game, " << (entity[i].x*8) << ", " << (entity[i].y*8)
<< ", 2, 11, " << entity[i].p2 << "); //Big Threadmill, <<<<<<";
}
entity[i].t=2; //So that it doesn't disapear from the editor
break;
case 8: //coin
//file << ", " << entity[i].p1 << ", coin+"<<ccount<<"); // (coins)";
//ccount++;
break;
case 9: //shiny
file << ", "<<ccount<<"); // (shiny trinket)";
ccount++;
break;
case 10: //Save point
if(currentarea=="otherlevel") mapy+=100;
if(currentarea=="lab") mapy+=200;
if(currentarea=="spacestation") mapy+=300;
if(currentarea=="spacestation2") mapy+=400;
file << ", " << entity[i].p1 << ", " << int(scount+((mapx+(mapy*100))*10)) << "); // (savepoint)";
scount++;
if(currentarea=="otherlevel") mapy-=100;
if(currentarea=="lab") mapy-=200;
if(currentarea=="spacestation") mapy-=300;
if(currentarea=="spacestation2") mapy-=400;
break;
case 11: //Horizontal
if(entity[i].x==0){
file << ", " << entity[i].p1+8 <<"); // (horizontal gravity line)";
}else{
file << ", " << entity[i].p1 <<"); // (horizontal gravity line)";
}
break;
case 12: //Vertical
if(entity[i].y==0){
file << ", " << entity[i].p1+8 <<"); // (vertical gravity line)";
}else{
file << ", " << entity[i].p1 <<"); // (vertical gravity line)";
}
break;
default:
file << ", behave, para);";
break;
}
file << "\n";
}
}
//this bit only if in the lab:
temp=-1;
for(int j=0; j<30; j++){
for(int i=0; i<39; i++){
if(temp==-1){
if(mapcontents[i][j]==280) temp=0;
if(mapcontents[i][j]==283) temp=1;
if(mapcontents[i][j]==286) temp=2;
if(mapcontents[i][j]==289) temp=3;
if(mapcontents[i][j]==292) temp=4;
if(mapcontents[i][j]==295) temp=5;
}
}
}
//if(temp>=0){
// file << "rcol="<<temp<<";\n";
// }
//
file << "break;\n";
file.close();
}
}
void copymap(){
for(int j=0; j<30; j++){
for(int i=0; i<40; i++){
mapcopycontents[i][j]=mapcontents[i][j];
}
}
}
void mapput(int x, int y, int t){
if(x>=0 && x<40 && y>=0 && y<30){
mapcontents[x][y]=t;
}
}
int at(int x, int y){
if(x>=0 && x<40 && y>=0 && y<30){
return mapcopycontents[x][y];
}
if(x==-1) return at(x+1,y);
if(x==40) return at(x-1,y);
if(y==-1) return at(x,y+1);
if(y==30) return at(x,y-1);
return 0;
}
int match(int x, int y, int t){
//Returns the first position match for a border
// 5 1 6
// 2 X 4
// 7 3 8
if(at(x-1,y)!=t && at(x,y-1)!=t) return 10;
if(at(x+1,y)!=t && at(x,y-1)!=t) return 11;
if(at(x-1,y)!=t && at(x,y+1)!=t) return 12;
if(at(x+1,y)!=t && at(x,y+1)!=t) return 13;
if(at(x,y-1)!=t) return 1;
if(at(x-1,y)!=t) return 2;
if(at(x,y+1)!=t) return 3;
if(at(x+1,y)!=t) return 4;
if(at(x-1,y-1)!=t) return 5;
if(at(x+1,y-1)!=t) return 6;
if(at(x-1,y+1)!=t) return 7;
if(at(x+1,y+1)!=t) return 8;
return 0;
}
bool inbox(int x1, int y1, int x2, int y2, int xt, int yt){
if(xt>=x1 && xt<x2 && yt>=y1 && yt<y2) return true;
return false;
}
int getbackground(){
//Return the background tile used on the map.
int x, y, t;
for(int j=0; j<30; j++){
for(int i=0; i<40; i++){
t=at(i,j);
x=t%40;
y=(t-x)/40;
if(inbox(0,17,40,22,x,y)){
y=x%3;
x=(x-y)/3;
return x;
}
}
}
return -1;
}
int antiedge(int x, int y, int t){
//Opposite problem to edge: if t is in the range of any tile group, simplify
//it back to its basics.
//Simplist way is to turn it into a coordinate and check inbox ranges.
x=t%40;
y=(t-x)/40;
for(int i=0; i<13; i++){
if(inbox(0+(i*3),2,3+(i*3),7,x,y)) return 80+(i*3);
if(inbox(0+(i*3),7,3+(i*3),12,x,y)) return 280+(i*3);
if(inbox(0+(i*3),12,3+(i*3),17,x,y)) return 480+(i*3);
if(inbox(0+(i*3),17,3+(i*3),22,x,y)) return 680+(i*3);
}
return t;
}
int edge(int x, int y, int t){
temp=1;
if(t>=880 && t<920){
temp=t-880;
}else if(t>=680 && t<720){
temp=t-680;
}else if(t>=480 && t<520){
temp=t-480;
}else if(t>=280 && t<320){
temp=t-280;
}else if(t>=80 && t<120){
temp=t-80;
}else{
return t;
}
if(temp%3==0){
//we have a candidate for edginess!
switch(match(x,y,t)){
case 10: return t+80; break;
case 11: return t+82; break;
case 12: return t+160; break;
case 13: return t+162; break;
case 1: return t+81; break;
case 2: return t+120; break;
case 3: return t+161; break;
case 4: return t+122; break;
case 5: return t+42; break;
case 6: return t+41; break;
case 7: return t+2; break;
case 8: return t+1; break;
case 0: default: return t; break;
}
}
return t;
}
void drawentities(){
temp=entat(xp,yp);
for(int i=0; i<numentities; i++){
switch(entity[i].t){
case 1: //Enemy
teststring="E";
if(entity[i].p1==0) teststring+="v";
if(entity[i].p1==1) teststring+="^";
if(entity[i].p1==2) teststring+="<";
if(entity[i].p1==3) teststring+=">";
textout_ex(buffer, font, teststring.c_str(), (entity[i].x*8),(entity[i].y*8)+4,
makecol(255,255,255), -1);
if(i==temp){
teststring=its(entity[i].p2);
textout_ex(buffer, font, teststring.c_str(), (entity[i].x*8)+4,(entity[i].y*8)+17,
makecol(255,255,255), -1);
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+15,(entity[i].y*8)+15,
makecol(255,0,0));
rect(buffer,entity[i].p3,entity[i].p4,entity[i].p5-1,entity[i].p6-1,
makecol(255,128,0));
}else{
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+15,(entity[i].y*8)+15,
makecol(255,164,164));
}
break;
case 2: //Platform
teststring="P ";
if(entity[i].p1==0) teststring+="v";
if(entity[i].p1==1) teststring+="^";
if(entity[i].p1==2) teststring+="<";
if(entity[i].p1==3) teststring+=">";
if(entity[i].p1==4) teststring+="=";
if(entity[i].p1==5) teststring=">>>";
if(entity[i].p1==6) teststring="<<<";
if(entity[i].p1==7) teststring="> > > >";
if(entity[i].p1==8) teststring="< < < <";
textout_ex(buffer, font, teststring.c_str(), (entity[i].x*8)+4,(entity[i].y*8),
makecol(255,255,255), -1);
if(i==temp){
teststring=its(entity[i].p2);
textout_ex(buffer, font, teststring.c_str(), (entity[i].x*8)+4,(entity[i].y*8)+9,
makecol(255,255,255), -1);
if(entity[i].p1<7){
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+31,(entity[i].y*8)+7,
makecol(0,0,255));
rect(buffer,entity[i].p3,entity[i].p4,entity[i].p5-1,entity[i].p6-1,
makecol(255,128,0));
}else{
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+31+32,(entity[i].y*8)+7,
makecol(0,0,255));
rect(buffer,entity[i].p3,entity[i].p4,entity[i].p5-1,entity[i].p6-1,
makecol(255,128,0));
}
}else{
if(entity[i].p1<7){
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+31,(entity[i].y*8)+7,
makecol(164,164,255));
}else{
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+31+32,(entity[i].y*8)+7,
makecol(164,164,255));
}
}
break;
case 8: //Small Pickup
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+95,(entity[i].y*8)+95,
makecol(164,164,255));
break;
case 9: //Big Pickup
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+15,(entity[i].y*8)+15,
makecol(164,164,255));
break;
case 10: //Savepoint
if(entity[i].p1==0){
//on the roof!
teststring="r";
textout_ex(buffer, font, teststring.c_str(), (entity[i].x*8)+4,entity[i].y*8,
makecol(255,255,255), -1);
teststring="v";
textout_ex(buffer, font, teststring.c_str(), (entity[i].x*8)+4,(entity[i].y*8)+8,
makecol(255,255,255), -1);
}else{
//on the floor!
teststring="^";
textout_ex(buffer, font, teststring.c_str(), (entity[i].x*8)+4,entity[i].y*8,
makecol(255,255,255), -1);
teststring="f";
textout_ex(buffer, font, teststring.c_str(), (entity[i].x*8)+4,(entity[i].y*8)+8,
makecol(255,255,255), -1);
}
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+15,(entity[i].y*8)+15,
makecol(164,255,164));
break;
case 11:
if(i==temp){
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+entity[i].p1-1,(entity[i].y*8)+7,
makecol(0,255,0));
line(buffer,entity[i].x*8,(entity[i].y*8)+3,(entity[i].x*8)+entity[i].p1-1,(entity[i].y*8)+3,
makecol(0,255,0));
line(buffer,entity[i].x*8,(entity[i].y*8)+4,(entity[i].x*8)+entity[i].p1-1,(entity[i].y*8)+4,
makecol(0,255,0));
}else{
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+entity[i].p1-1,(entity[i].y*8)+7,
makecol(164,255,164));
line(buffer,entity[i].x*8,(entity[i].y*8)+3,(entity[i].x*8)+entity[i].p1-1,(entity[i].y*8)+3,
makecol(164,255,164));
line(buffer,entity[i].x*8,(entity[i].y*8)+4,(entity[i].x*8)+entity[i].p1-1,(entity[i].y*8)+4,
makecol(164,255,164));
}
break;
case 12: //vertical
if(i==temp){
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+7,(entity[i].y*8)-1+entity[i].p1,
makecol(0,255,0));
line(buffer,(entity[i].x*8)+3,(entity[i].y*8),(entity[i].x*8)+3,(entity[i].y*8)-1+entity[i].p1,
makecol(0,255,0));
line(buffer,(entity[i].x*8)+4,(entity[i].y*8),(entity[i].x*8)+4,(entity[i].y*8)-1+entity[i].p1,
makecol(0,255,0));
}else{
rect(buffer,entity[i].x*8,entity[i].y*8,(entity[i].x*8)+7,(entity[i].y*8)-1+entity[i].p1,
makecol(164,255,164));
line(buffer,(entity[i].x*8)+3,(entity[i].y*8),(entity[i].x*8)+3,(entity[i].y*8)-1+entity[i].p1,
makecol(164,255,164));
line(buffer,(entity[i].x*8)+4,(entity[i].y*8),(entity[i].x*8)+4,(entity[i].y*8)-1+entity[i].p1,
makecol(164,255,164));
}
break;
}
}
}