mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-11-16 07:59:43 +01:00
1079 lines
31 KiB
C++
1079 lines
31 KiB
C++
#include <string>
|
|
#include <sstream>
|
|
#include <fstream>
|
|
#include <allegro.h>
|
|
#include <loadpng.h>
|
|
using namespace std;
|
|
|
|
volatile int speed_counter=0;
|
|
void increment_speed_counter(){speed_counter++;}
|
|
END_OF_FUNCTION(increment_speed_counter);
|
|
|
|
string currentarea;
|
|
PALLETE dummypal;
|
|
BITMAP *buffer, *biggerbuffer, *page[3];
|
|
BITMAP *tiles[4000];
|
|
|
|
bool test;
|
|
string teststring;
|
|
|
|
|
|
int mapcontents[40][29];
|
|
int mapcopycontents[40][29];
|
|
|
|
int xp, yp, ctile;
|
|
int reversekey;
|
|
int mapx, mapy;
|
|
int savednote;
|
|
int temp, temp2, temp3, p;
|
|
|
|
int tileselectdelay;
|
|
int paraadjustdelay;
|
|
string tempstring;
|
|
|
|
bool fullscreen;
|
|
|
|
//Some helpful functions!
|
|
string its(int t, int s=0){
|
|
string te;
|
|
ostringstream *its_temp;
|
|
its_temp = new ostringstream;
|
|
(*its_temp) << t;
|
|
te = (*its_temp).str();
|
|
delete its_temp;
|
|
if(s==0){ return te;
|
|
}else{
|
|
int d;
|
|
d=s-te.length();
|
|
if(d<0){
|
|
return te;
|
|
}else{
|
|
while(d>0){
|
|
te = "0" + te;
|
|
d--;
|
|
}
|
|
return te;
|
|
}
|
|
}
|
|
}
|
|
|
|
int sti(string s){
|
|
istringstream stringbuf(s);
|
|
int t;
|
|
stringbuf >> t;
|
|
return t;
|
|
}
|
|
|
|
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<29; 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 savemap(){
|
|
int ccount=0, scount=0;
|
|
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<29; 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==2 && entity[i].p1==4){
|
|
entity[i].t=3;
|
|
}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 8: //coin
|
|
file << ", " << entity[i].p1 << ", coin+"<<ccount<<"); // (coins)";
|
|
ccount++;
|
|
break;
|
|
case 9: //shiny
|
|
file << ", " << entity[i].p1 << ", "<<ccount<<"+coin); // (shiny trinket)";
|
|
ccount++;
|
|
break;
|
|
case 10: //Save point
|
|
if(currentarea=="otherlevel") mapy+=100;
|
|
if(currentarea=="lab") mapy+=200;
|
|
if(currentarea=="spacestation") mapy+=300;
|
|
|
|
|
|
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;
|
|
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<29; j++){
|
|
for(int i=0; i<39; i++){
|
|
if(temp==-1){
|
|
if(mapcontents[i][j]==80) temp=0;
|
|
if(mapcontents[i][j]==83) temp=1;
|
|
if(mapcontents[i][j]==86) temp=2;
|
|
if(mapcontents[i][j]==89) temp=3;
|
|
if(mapcontents[i][j]==92) temp=4;
|
|
if(mapcontents[i][j]==95) temp=5;
|
|
}
|
|
}
|
|
}
|
|
if(temp>=0){
|
|
file << "rcol="<<temp<<";\n";
|
|
}
|
|
//
|
|
|
|
file << "break;\n";
|
|
|
|
file.close();
|
|
}
|
|
|
|
bool loadmap(int x, int y){
|
|
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<28; j++){
|
|
for(int i=1; i<39; i++){
|
|
mapcontents[i][j]=0;
|
|
}
|
|
}
|
|
numentities=0;
|
|
return false;
|
|
}
|
|
|
|
for(int j=0; j<29; 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 drawtile(int xp, int yp, int t){
|
|
blit(tiles[t], buffer, 0, 0, xp, yp, 16, 16);
|
|
}
|
|
|
|
void print(BITMAP* bmp, int x, int y, string t, int r, int g, int b, bool c=false){
|
|
const char* txt=t.c_str();
|
|
if(c){x=160-(t.length()*4);}
|
|
textout_ex(bmp, font, txt, x-1, y, makecol(0,0,0), -1);
|
|
textout_ex(bmp, font, txt, x+1, y, makecol(0,0,0), -1);
|
|
textout_ex(bmp, font, txt, x, y-1, makecol(0,0,0), -1);
|
|
textout_ex(bmp, font, txt, x, y+1, makecol(0,0,0), -1);
|
|
textout_ex(bmp, font, txt, x, y, makecol(r,g,b), -1);
|
|
}
|
|
|
|
void rprint(BITMAP* bmp, int x, int y, string t, int r, int g, int b, bool c=false){
|
|
const char* txt=t.c_str();
|
|
if(c){x=160-(t.length()*4);}
|
|
x=640-x-t.length()*8;
|
|
textout_ex(bmp, font, txt, x-1, y, makecol(0,0,0), -1);
|
|
textout_ex(bmp, font, txt, x+1, y, makecol(0,0,0), -1);
|
|
textout_ex(bmp, font, txt, x, y-1, makecol(0,0,0), -1);
|
|
textout_ex(bmp, font, txt, x, y+1, makecol(0,0,0), -1);
|
|
textout_ex(bmp, font, txt, x, y, makecol(r,g,b), -1);
|
|
}
|
|
|
|
|
|
void copymap(){
|
|
for(int j=0; j<29; 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<29){
|
|
mapcontents[x][y]=t;
|
|
}
|
|
}
|
|
|
|
int at(int x, int y){
|
|
if(x>=0 && x<40 && y>=0 && y<29){
|
|
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==29) 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<29; 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<8; 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>=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 change_fullscreen(){
|
|
destroy_bitmap(page[0]);
|
|
destroy_bitmap(page[1]);
|
|
destroy_bitmap(page[2]);
|
|
set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0);
|
|
clear_bitmap(screen);
|
|
|
|
|
|
page[0]=create_video_bitmap(640, 480);
|
|
page[1]=create_video_bitmap(640, 480);
|
|
page[2]=create_video_bitmap(640, 480);
|
|
}
|
|
|
|
void change_windowed(){
|
|
destroy_bitmap(page[0]);
|
|
destroy_bitmap(page[1]);
|
|
destroy_bitmap(page[2]);
|
|
|
|
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
|
|
clear_bitmap(screen);
|
|
|
|
|
|
page[0]=create_video_bitmap(640, 480);
|
|
page[1]=create_video_bitmap(640, 480);
|
|
page[2]=create_video_bitmap(640, 480);
|
|
}
|
|
|
|
int main(){
|
|
test=false; teststring="TEST = True";
|
|
int state=0, gt=0;
|
|
int tileset=1;
|
|
savednote=0; numentities=0; paraadjustdelay=0;
|
|
//currentarea="spacestation";
|
|
currentarea="towerhallway";
|
|
//currentarea="otherlevel";
|
|
//Setup Allegro
|
|
allegro_init();
|
|
//Setup input
|
|
install_keyboard();
|
|
install_mouse();
|
|
show_os_cursor(MOUSE_CURSOR_ARROW);
|
|
|
|
//Setup timer
|
|
install_timer();
|
|
LOCK_VARIABLE(speed_counter);
|
|
LOCK_FUNCTION(increment_speed_counter);
|
|
install_int_ex(increment_speed_counter, BPS_TO_TIMER(60));
|
|
|
|
//Setup graphics8
|
|
set_color_depth(32);
|
|
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
|
|
register_png_file_type();
|
|
int currentpage=0;
|
|
fullscreen=false;
|
|
|
|
buffer=load_png("../../engine/current/data/graphics/tiles3.png", dummypal);
|
|
/*if(tileset==0){
|
|
buffer=load_png("../../engine/current/data/graphics/tiles.png", dummypal);
|
|
}else if(tileset==1){
|
|
buffer=load_png("../../engine/current/data/graphics/tiles2.png", dummypal);
|
|
}*/
|
|
for(int y=0;y<30;y++){
|
|
for(int x=0;x<40;x++){
|
|
tiles[x+(y*40)] = create_bitmap(8, 8);
|
|
rectfill(tiles[x+(y*40)], 0, 0, 8, 8, makecol(16,16,16));
|
|
blit(buffer, tiles[x+(y*40)], x*8, y*8, 0, 0, 8,8);
|
|
}
|
|
}
|
|
destroy_bitmap(buffer);
|
|
|
|
buffer=create_bitmap(320,240);
|
|
biggerbuffer=create_bitmap(640,480);
|
|
page[0]=create_video_bitmap(640, 480);
|
|
page[1]=create_video_bitmap(640, 480);
|
|
page[2]=create_video_bitmap(640, 480);
|
|
currentpage=0;
|
|
|
|
//Setup sound
|
|
set_volume_per_voice(0);
|
|
if (install_sound(DIGI_AUTODETECT, MIDI_NONE, 0) < 0) {
|
|
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
|
|
allegro_message("Error installing sound.\n");
|
|
}
|
|
|
|
//Init map
|
|
//Load last?
|
|
//Blank
|
|
mapx=50; mapy=50;
|
|
if(!loadmap(mapx, mapy)){
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
mapcontents[i][j]=0;
|
|
}
|
|
}
|
|
}
|
|
xp=0; yp=0; ctile=0;
|
|
tileselectdelay=0;
|
|
reversekey=0;
|
|
|
|
//Starting main loop:
|
|
while(!key[KEY_ESC]){
|
|
xp=mouse_x/16;
|
|
yp=mouse_y/16;
|
|
//Render
|
|
if(tileset==0){
|
|
clear_to_color(buffer, makecol(0,0,0));
|
|
}else{
|
|
clear_to_color(buffer, makecol(0,0,0));
|
|
}
|
|
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
rect(buffer, i*8, j*8, (i*8)+7, (j*8)+7, makecol(16,16,16)); //a simple grid
|
|
if(i%4==0) rect(buffer, i*8, j*8, (i*8)+7, (j*8)+7, makecol(32,32,32));
|
|
if(j%4==0) rect(buffer, i*8, j*8, (i*8)+7, (j*8)+7, makecol(32,32,32));
|
|
|
|
//Minor guides
|
|
if(i==9) rect(buffer, i*8, j*8, (i*8)+7, (j*8)+7, makecol(48,48,48));
|
|
if(i==30) rect(buffer, i*8, j*8, (i*8)+7, (j*8)+7, makecol(48,48,48));
|
|
if(j==6 || j==7) rect(buffer, i*8, j*8, (i*8)+7, (j*8)+7, makecol(48,48,48));
|
|
if(j==21 || j==22) rect(buffer, i*8, j*8, (i*8)+7, (j*8)+7, makecol(48,48,48));
|
|
|
|
//Major guides
|
|
if(i==20 || i==19) rect(buffer, i*8, j*8, (i*8)+7, (j*8)+7, makecol(64,64,64));
|
|
if(j==14) rect(buffer, i*8, j*8, (i*8)+7, (j*8)+7, makecol(64,64,64));
|
|
}
|
|
}
|
|
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
if(mapcontents[i][j]>0) drawtile(i*8, j*8, mapcontents[i][j]);
|
|
}
|
|
}
|
|
//Draw entities
|
|
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+="=";
|
|
|
|
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);
|
|
|
|
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,(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)+7,(entity[i].y*8)+7,
|
|
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;
|
|
}
|
|
}
|
|
//GUI
|
|
rect(buffer, 4,230,13,239,makecol(128,128,128));
|
|
drawtile(5, 231, ctile);
|
|
print(buffer, 24, 231, "Tile " + its(ctile), 255,255,255);
|
|
tempstring="("+its(xp)+","+its(yp)+") ["+its(mapx)+","+its(mapy)+"]";
|
|
print(buffer, 200, 231, tempstring, 196,196,255);
|
|
|
|
if(savednote>0){
|
|
if(savednote>70){
|
|
temp=200-((90-savednote)*10);
|
|
print(buffer, 24, 115, "[Map Saved]", 255-temp,255-temp,255-temp, true);
|
|
}else if(savednote<20){
|
|
temp=(20-savednote)*10;
|
|
print(buffer, 24, 115, "[Map Saved]", 255-temp,255-temp,255-temp, true);
|
|
}else{
|
|
print(buffer, 24, 115, "[Map Saved]", 255,255,255, true);
|
|
}
|
|
|
|
savednote--;
|
|
}
|
|
|
|
|
|
rect(buffer, (xp*8), (yp*8), (xp*8)+7, (yp*8)+7, makecol(255,128,128));
|
|
|
|
if(test) print(buffer, 5, 5, teststring, 255,255,255);
|
|
|
|
//Instructions
|
|
//print(buffer, 5, 5, "Simple Tool framework", 255,255,255);
|
|
|
|
stretch_blit(buffer, biggerbuffer, 0, 0, 320, 240, 0, 0, 640, 480);
|
|
rprint(biggerbuffer, 5, 5, "Current Area: [" + currentarea+"]", 128,128, 255);
|
|
rprint(biggerbuffer, 5, 20, "R[Hori] T[Vert] Y[Plat] U[Coins] I[Shiny] O[Enemy] P[Save]", 196,196,196);
|
|
rprint(biggerbuffer, 5, 30, "Q[Edge] W[AntiEdge] A+[Move] S+[Invert] F[Fill]", 196,196,196);
|
|
|
|
rprint(biggerbuffer, 5, 20, "R T Y U I O P ", 128,128, 255);
|
|
rprint(biggerbuffer, 5, 30, "Q W A+ S+ F ", 128,128, 255);
|
|
|
|
//print(biggerbuffer, 5, 5, its(numentities), 255,255,255);
|
|
//for(int i=0; i<numentities; i++){
|
|
// tempstring="entity["+its(i)+"]=("+its(entity[i].x)+","+its(entity[i].y)+","+its(entity[i].t)+")";
|
|
// print(biggerbuffer, 5, 15+(i*10), tempstring, 255,255,255);
|
|
// }
|
|
|
|
blit(biggerbuffer, page[currentpage], 0, 0, 0, 0, 640, 480);
|
|
//Instructions, more info
|
|
show_video_bitmap(page[currentpage]);
|
|
currentpage = (currentpage+1)%3;
|
|
//Input
|
|
if(mouse_b & 1){
|
|
if(yp<29){
|
|
//Left click
|
|
if(key[KEY_Z]){
|
|
mapput(xp-1, yp-1, ctile);
|
|
mapput(xp, yp-1, ctile);
|
|
mapput(xp+1, yp-1, ctile);
|
|
mapput(xp-1, yp, ctile);
|
|
mapput(xp, yp, ctile);
|
|
mapput(xp+1, yp, ctile);
|
|
mapput(xp-1, yp+1, ctile);
|
|
mapput(xp, yp+1, ctile);
|
|
mapput(xp+1, yp+1, ctile);
|
|
}else{
|
|
mapput(xp, yp, ctile);
|
|
}
|
|
}
|
|
}
|
|
if(mouse_b & 2){
|
|
//Right click
|
|
if(yp<29){
|
|
ctile=mapcontents[xp][yp];
|
|
}
|
|
for(int i=0; i<numentities; i++){
|
|
if(entity[i].x==xp && entity[i].y==yp){
|
|
removeentity(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(tileselectdelay<=0){
|
|
if(key[KEY_COMMA]){
|
|
ctile--;
|
|
tileselectdelay=10;
|
|
}
|
|
if(key[KEY_STOP]){
|
|
ctile++;
|
|
tileselectdelay=10;
|
|
}
|
|
if(key[KEY_CLOSEBRACE]){
|
|
ctile+=40;
|
|
tileselectdelay=10;
|
|
}
|
|
if(key[KEY_OPENBRACE]){
|
|
ctile-=40;
|
|
tileselectdelay=10;
|
|
}
|
|
if(key[KEY_A]){
|
|
if(key[KEY_UP]) { mapy--; loadmap(mapx,mapy); tileselectdelay=10; }
|
|
if(key[KEY_DOWN]) { mapy++; loadmap(mapx,mapy); tileselectdelay=10; }
|
|
if(key[KEY_LEFT]) { mapx--; loadmap(mapx,mapy); tileselectdelay=10; }
|
|
if(key[KEY_RIGHT]){ mapx++; loadmap(mapx,mapy); tileselectdelay=10; }
|
|
}
|
|
}else{
|
|
tileselectdelay--;
|
|
}
|
|
if(ctile<0) ctile+=1200;
|
|
if(ctile>=1200) ctile-=1200;
|
|
|
|
//Shortcuts
|
|
if(tileselectdelay<=0){
|
|
tileselectdelay=20;
|
|
if(key[KEY_B]){ctile=680;} //Backgrounds
|
|
else if(key[KEY_V]){ctile=80;} //Foregrounds
|
|
else if(key[KEY_1]){p=80;if(ctile==200+p){ctile=400+p;}else if(ctile==p){ctile=200+p;}else{ctile=p;}}
|
|
else if(key[KEY_2]){p=83;if(ctile==200+p){ctile=400+p;}else if(ctile==p){ctile=200+p;}else{ctile=p;}}
|
|
else if(key[KEY_3]){p=86;if(ctile==200+p){ctile=400+p;}else if(ctile==p){ctile=200+p;}else{ctile=p;}}
|
|
else if(key[KEY_4]){p=89;if(ctile==200+p){ctile=400+p;}else if(ctile==p){ctile=200+p;}else{ctile=p;}}
|
|
else if(key[KEY_5]){p=92;if(ctile==200+p){ctile=400+p;}else if(ctile==p){ctile=200+p;}else{ctile=p;}}
|
|
else if(key[KEY_6]){p=95;if(ctile==200+p){ctile=400+p;}else if(ctile==p){ctile=200+p;}else{ctile=p;}}
|
|
else if(key[KEY_7]){p=98;if(ctile==200+p){ctile=400+p;}else if(ctile==p){ctile=200+p;}else{ctile=p;}}
|
|
else if(key[KEY_8]){p=101;if(ctile==200+p){ctile=400+p;}else if(ctile==p){ctile=200+p;}else{ctile=p;}}
|
|
else if(key[KEY_9]){ctile=680;}
|
|
else{
|
|
tileselectdelay=0;
|
|
}
|
|
}else{
|
|
tileselectdelay--;
|
|
}
|
|
|
|
if(key[KEY_H]){
|
|
//Flip background
|
|
copymap();
|
|
temp=getbackground();
|
|
if(temp>-1){
|
|
temp2=temp+1;
|
|
if(temp2>=7) temp2=0;
|
|
temp=680+(temp*3);
|
|
temp2=680+(temp2*3);
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
if(mapcontents[i][j]==temp) mapcontents[i][j]=temp2;
|
|
}
|
|
}
|
|
while(key[KEY_H]);
|
|
}
|
|
}
|
|
|
|
if(key[KEY_F8]){
|
|
savemap();
|
|
while(key[KEY_F8]);
|
|
savednote=90;
|
|
}
|
|
|
|
if(key[KEY_F7]){
|
|
loadmap(mapx,mapy);
|
|
while(key[KEY_F7]);
|
|
}
|
|
|
|
|
|
if(key[KEY_F]){
|
|
copymap();
|
|
temp=at(xp,yp);
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
if(mapcontents[i][j]==temp) mapcontents[i][j]=ctile;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(key[KEY_G]){
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
mapcontents[i][j]=ctile;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(key[KEY_Q]){
|
|
//Autoedge! Experimental :O
|
|
copymap();
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
temp=mapcopycontents[i][j];
|
|
mapcontents[i][j]=edge(i, j, temp);
|
|
}
|
|
}
|
|
while(key[KEY_Q]);
|
|
}
|
|
|
|
if(key[KEY_W]){
|
|
//Antiedge!
|
|
copymap();
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
temp=mapcopycontents[i][j];
|
|
mapcontents[i][j]=antiedge(i, j, temp);
|
|
}
|
|
}
|
|
while(key[KEY_W]);
|
|
}
|
|
|
|
if(reversekey<=0){
|
|
if(key[KEY_S] && (key[KEY_LEFT]||key[KEY_RIGHT])){
|
|
copymap();
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
mapcontents[i][j]=mapcopycontents[39-i][j];
|
|
}
|
|
}
|
|
reversekey=10;
|
|
}
|
|
if(key[KEY_S] && (key[KEY_UP]||key[KEY_DOWN])){
|
|
copymap();
|
|
for(int j=0; j<29; j++){
|
|
for(int i=0; i<40; i++){
|
|
mapcontents[i][j]=mapcopycontents[i][28-j];
|
|
}
|
|
}
|
|
reversekey=10;
|
|
}
|
|
}else{
|
|
reversekey--;
|
|
}
|
|
|
|
if(key[KEY_F4]){
|
|
if(fullscreen){
|
|
change_windowed();
|
|
fullscreen=false;
|
|
}else{
|
|
change_fullscreen();
|
|
fullscreen=true;
|
|
}
|
|
while(key[KEY_F4]);
|
|
}
|
|
|
|
if(entclear(xp,yp)){
|
|
if(key[KEY_R]){ addentity(xp,yp,11,8); while(key[KEY_R]); }
|
|
if(key[KEY_T]){ addentity(xp,yp,12,8); while(key[KEY_T]); }
|
|
|
|
if(key[KEY_Y]){ addentity(xp,yp,2); while(key[KEY_Y]); }
|
|
if(key[KEY_U]) addentity(xp,yp,8);
|
|
if(key[KEY_I]) addentity(xp,yp,9);
|
|
if(key[KEY_O]){ addentity(xp,yp,1); while(key[KEY_O]); }
|
|
if(key[KEY_P]){ addentity(xp,yp,10); while(key[KEY_P]); }
|
|
}else{
|
|
temp=entat(xp,yp);
|
|
if(temp>-1){
|
|
if(key[KEY_O]){
|
|
if(entity[temp].t==1){
|
|
entity[temp].p1++;
|
|
if(entity[temp].p1>=4) entity[temp].p1=0;
|
|
while(key[KEY_O]);
|
|
}
|
|
}
|
|
|
|
if(key[KEY_Y]){
|
|
if(entity[temp].t==2){
|
|
entity[temp].p1++;
|
|
if(entity[temp].p1>=5) entity[temp].p1=0;
|
|
while(key[KEY_Y]);
|
|
}
|
|
}
|
|
|
|
if(key[KEY_P]){
|
|
if(entity[temp].t==10){
|
|
if(entity[temp].p1==0){
|
|
entity[temp].p1=1;
|
|
}else{
|
|
entity[temp].p1=0;
|
|
}
|
|
while(key[KEY_P]);
|
|
}
|
|
}
|
|
|
|
if(entity[temp].t==11 || entity[temp].t==12){
|
|
if(paraadjustdelay<=0){
|
|
if(key[KEY_J]){
|
|
if(key[KEY_LEFT]) { entity[temp].p1-=8; paraadjustdelay=4; }
|
|
if(key[KEY_RIGHT]){ entity[temp].p1+=8; paraadjustdelay=4; }
|
|
if(key[KEY_UP]) { entity[temp].p1-=8; paraadjustdelay=4; }
|
|
if(key[KEY_DOWN]){ entity[temp].p1+=8; paraadjustdelay=4; }
|
|
if(entity[temp].p1<=0) entity[temp].p1=0;
|
|
}
|
|
}else{
|
|
paraadjustdelay--;
|
|
}
|
|
}
|
|
|
|
if(entity[temp].t==1 || entity[temp].t==2){
|
|
if(paraadjustdelay<=0){
|
|
if(key[KEY_J]){
|
|
if(key[KEY_LEFT]) { entity[temp].p2--; paraadjustdelay=4; }
|
|
if(key[KEY_RIGHT]){ entity[temp].p2++; paraadjustdelay=4; }
|
|
if(entity[temp].p2<=0) entity[temp].p2=0;
|
|
}
|
|
if(key[KEY_K]){
|
|
if(key[KEY_LEFT]) { entity[temp].p3-=8; paraadjustdelay=4; }
|
|
if(key[KEY_RIGHT]){ entity[temp].p3+=8; paraadjustdelay=4; }
|
|
if(key[KEY_UP]) { entity[temp].p4-=8; paraadjustdelay=4; }
|
|
if(key[KEY_DOWN]){ entity[temp].p4+=8; paraadjustdelay=4; }
|
|
}
|
|
if(key[KEY_L]){
|
|
if(key[KEY_LEFT]) { entity[temp].p5-=8; paraadjustdelay=4; }
|
|
if(key[KEY_RIGHT]){ entity[temp].p5+=8; paraadjustdelay=4; }
|
|
if(key[KEY_UP]) { entity[temp].p6-=8; paraadjustdelay=4; }
|
|
if(key[KEY_DOWN]){ entity[temp].p6+=8; paraadjustdelay=4; }
|
|
}
|
|
}else{
|
|
paraadjustdelay--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(key[KEY_BACKSPACE]){
|
|
numentities=0;
|
|
}
|
|
|
|
/*if(key[KEY_F1]) currentarea="otherlevel";
|
|
if(key[KEY_F2]) currentarea="spacestation";
|
|
if(key[KEY_F3]) currentarea="lab";*/
|
|
|
|
//Logic
|
|
gt++;
|
|
while(speed_counter<1) rest(1); speed_counter = 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
END_OF_MAIN()
|