mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2026-01-29 17:38:16 +03:00
Adding original mapping tools for the sake of completeness
This commit is contained in:
402
tools/editors/Level Mapping Editor/main.cpp
Normal file
402
tools/editors/Level Mapping Editor/main.cpp
Normal file
@@ -0,0 +1,402 @@
|
||||
#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);
|
||||
|
||||
PALLETE dummypal;
|
||||
BITMAP *buffer, *page[3];
|
||||
BITMAP *tiles[3000];
|
||||
|
||||
int mapcontents[40][30];
|
||||
int mapcontentsu[40][30];
|
||||
int mapcontentsd[40][30];
|
||||
int mapcontentsl[40][30];
|
||||
int mapcontentsr[40][30];
|
||||
|
||||
int xp, yp, ctile;
|
||||
|
||||
int xpos, ypos;
|
||||
|
||||
int tileselectdelay;
|
||||
bool getgrid(int x, int y, int u, int d, int l, int r){
|
||||
if(mapcontentsu[x][y]==u){
|
||||
if(mapcontentsd[x][y]==d){
|
||||
if(mapcontentsl[x][y]==l){
|
||||
if(mapcontentsr[x][y]==r){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
//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;
|
||||
}
|
||||
|
||||
void savemapsimple(){
|
||||
string s = "import.txt";
|
||||
ofstream file;
|
||||
file.open(s.c_str(), ios::trunc);
|
||||
int temp=0;
|
||||
|
||||
for(int j=0; j<30; j++){
|
||||
for(int i=0; i<40; i++){
|
||||
temp=1;
|
||||
if(getgrid(i,j,1,0,0,0)) temp=2;
|
||||
if(getgrid(i,j,0,0,0,1)) temp=3;
|
||||
if(getgrid(i,j,0,1,0,0)) temp=4;
|
||||
if(getgrid(i,j,0,0,1,0)) temp=5;
|
||||
if(getgrid(i,j,1,0,0,1)) temp=6;
|
||||
if(getgrid(i,j,1,1,0,0)) temp=7;
|
||||
if(getgrid(i,j,1,0,1,0)) temp=8;
|
||||
if(getgrid(i,j,0,1,0,1)) temp=9;
|
||||
if(getgrid(i,j,0,0,1,1)) temp=10;
|
||||
if(getgrid(i,j,0,1,1,0)) temp=11;
|
||||
if(getgrid(i,j,0,1,1,1)) temp=12;
|
||||
if(getgrid(i,j,1,1,1,0)) temp=13;
|
||||
if(getgrid(i,j,1,0,1,1)) temp=14;
|
||||
if(getgrid(i,j,1,1,0,1)) temp=15;
|
||||
if(getgrid(i,j,1,1,1,1)) temp=16;
|
||||
if(mapcontents[i][j]==1){
|
||||
file << temp << " ";
|
||||
}else{
|
||||
file << 0 << " ";
|
||||
}
|
||||
}
|
||||
file << "\n";
|
||||
}
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
||||
void savemap(){
|
||||
savemapsimple();
|
||||
int temp=0;
|
||||
string s = "output.txt";
|
||||
ofstream file;
|
||||
file.open(s.c_str(), ios::trunc);
|
||||
|
||||
for(int j=0; j<30; j++){
|
||||
for(int i=0; i<40; i++){
|
||||
temp=1;
|
||||
if(getgrid(i,j,1,0,0,0)) temp=2;
|
||||
if(getgrid(i,j,0,0,0,1)) temp=3;
|
||||
if(getgrid(i,j,0,1,0,0)) temp=4;
|
||||
if(getgrid(i,j,0,0,1,0)) temp=5;
|
||||
if(getgrid(i,j,1,0,0,1)) temp=6;
|
||||
if(getgrid(i,j,1,1,0,0)) temp=7;
|
||||
if(getgrid(i,j,1,0,1,0)) temp=8;
|
||||
if(getgrid(i,j,0,1,0,1)) temp=9;
|
||||
if(getgrid(i,j,0,0,1,1)) temp=10;
|
||||
if(getgrid(i,j,0,1,1,0)) temp=11;
|
||||
if(getgrid(i,j,0,1,1,1)) temp=12;
|
||||
if(getgrid(i,j,1,1,1,0)) temp=13;
|
||||
if(getgrid(i,j,1,0,1,1)) temp=14;
|
||||
if(getgrid(i,j,1,1,0,1)) temp=15;
|
||||
if(getgrid(i,j,1,1,1,1)) temp=16;
|
||||
if(mapcontents[i][j]==1){
|
||||
file << temp;
|
||||
if(i<39) file << ",";
|
||||
}else{
|
||||
file << 0;
|
||||
if(i<39) file << ",";
|
||||
}
|
||||
}
|
||||
file << "\n";
|
||||
}
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
||||
bool loadmap(){
|
||||
int xp, yp, t, n;
|
||||
string s = "import.txt";
|
||||
int temp=0;
|
||||
|
||||
ifstream file;
|
||||
file.open(s.c_str());
|
||||
if(!file){
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int j=0; j<30; j++){
|
||||
for(int i=0; i<40; i++){
|
||||
file >> temp;
|
||||
mapcontents[i][j]=1;
|
||||
switch(temp){
|
||||
case 0: mapcontents[i][j]=0; break;
|
||||
case 2: mapcontentsu[i][j]=1; break;
|
||||
case 3: mapcontentsr[i][j]=1; break;
|
||||
case 4: mapcontentsd[i][j]=1; break;
|
||||
case 5: mapcontentsl[i][j]=1; break;
|
||||
case 6: mapcontentsu[i][j]=1; mapcontentsr[i][j]=1; break;
|
||||
case 7: mapcontentsu[i][j]=1; mapcontentsd[i][j]=1; break;
|
||||
case 8: mapcontentsu[i][j]=1; mapcontentsl[i][j]=1; break;
|
||||
case 9: mapcontentsd[i][j]=1; mapcontentsr[i][j]=1; break;
|
||||
case 10: mapcontentsl[i][j]=1; mapcontentsr[i][j]=1; break;
|
||||
case 11: mapcontentsd[i][j]=1; mapcontentsl[i][j]=1; break;
|
||||
case 12: mapcontentsd[i][j]=1; mapcontentsl[i][j]=1; mapcontentsr[i][j]=1; break;
|
||||
case 13: mapcontentsu[i][j]=1; mapcontentsd[i][j]=1; mapcontentsl[i][j]=1; break;
|
||||
case 14: mapcontentsu[i][j]=1; mapcontentsl[i][j]=1; mapcontentsr[i][j]=1; break;
|
||||
case 15: mapcontentsu[i][j]=1; mapcontentsd[i][j]=1; mapcontentsr[i][j]=1; break;
|
||||
case 16: mapcontentsu[i][j]=1; mapcontentsd[i][j]=1; mapcontentsl[i][j]=1; mapcontentsr[i][j]=1; 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
int main(){
|
||||
int skipf=0, skipd=0;
|
||||
int state=0, gt=0;
|
||||
//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 graphics
|
||||
set_color_depth(32);
|
||||
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
|
||||
register_png_file_type();
|
||||
int currentpage=0;
|
||||
|
||||
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);
|
||||
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
|
||||
if(!loadmap()){
|
||||
for(int j=0; j<30; j++){
|
||||
for(int i=0; i<40; i++){
|
||||
mapcontents[i][j]=0;
|
||||
mapcontentsu[i][j]=0;
|
||||
mapcontentsd[i][j]=0;
|
||||
mapcontentsl[i][j]=0;
|
||||
mapcontentsr[i][j]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
xp=0; yp=0; ctile=0;
|
||||
tileselectdelay=0;
|
||||
|
||||
xpos=20; ypos=15;
|
||||
int temp=0;
|
||||
|
||||
//Starting main loop:
|
||||
while(!key[KEY_ESC]){
|
||||
xp=mouse_x/16;
|
||||
yp=mouse_y/16;
|
||||
//Render
|
||||
clear_to_color(buffer, makecol(32,32,32));
|
||||
for(int j=0; j<30; j++){
|
||||
for(int i=0; i<40; i++){
|
||||
if(mapcontents[i][j]>0){
|
||||
temp=1;
|
||||
if(getgrid(i,j,1,0,0,0)) temp=2;
|
||||
if(getgrid(i,j,0,0,0,1)) temp=3;
|
||||
if(getgrid(i,j,0,1,0,0)) temp=4;
|
||||
if(getgrid(i,j,0,0,1,0)) temp=5;
|
||||
if(getgrid(i,j,1,0,0,1)) temp=6;
|
||||
if(getgrid(i,j,1,1,0,0)) temp=7;
|
||||
if(getgrid(i,j,1,0,1,0)) temp=8;
|
||||
if(getgrid(i,j,0,1,0,1)) temp=9;
|
||||
if(getgrid(i,j,0,0,1,1)) temp=10;
|
||||
if(getgrid(i,j,0,1,1,0)) temp=11;
|
||||
if(getgrid(i,j,0,1,1,1)) temp=12;
|
||||
if(getgrid(i,j,1,1,1,0)) temp=13;
|
||||
if(getgrid(i,j,1,0,1,1)) temp=14;
|
||||
if(getgrid(i,j,1,1,0,1)) temp=15;
|
||||
if(getgrid(i,j,1,1,1,1)) temp=16;
|
||||
drawtile(i*8, j*8, temp+880+80+80);
|
||||
}
|
||||
}
|
||||
}
|
||||
//GUI
|
||||
/* rect(buffer, 4,4,21,21, makecol(0,0,0));
|
||||
drawtile(5, 5, ctile);
|
||||
print(buffer, 24, 7, "Tile " + its(ctile), 255,255,255);
|
||||
}else{
|
||||
rect(buffer, 4,215,21,232, makecol(0,0,0));
|
||||
drawtile(5, 216, ctile);
|
||||
print(buffer, 24, 220, "Tile " + its(ctile), 255,255,255);
|
||||
}*/
|
||||
|
||||
rect(buffer, (xp*8), (yp*8), (xp*8)+7, (yp*8)+7, makecol(96,96,96));
|
||||
|
||||
if(skipf==0){
|
||||
rect(buffer, (xpos*8), (ypos*8), (xpos*8)+7, (ypos*8)+7, makecol(255,255,255));
|
||||
}else{
|
||||
rect(buffer, (xpos*8), (ypos*8), (xpos*8)+7, (ypos*8)+7, makecol(128,128,128));
|
||||
}
|
||||
skipd--;
|
||||
if(skipd<=0){
|
||||
skipd=25;
|
||||
skipf=skipf+1;
|
||||
if(skipf==2)skipf=0;
|
||||
}
|
||||
|
||||
//Instructions
|
||||
//print(buffer, 5, 5, "Simple Tool framework", 255,255,255);
|
||||
|
||||
stretch_blit(buffer, page[currentpage], 0, 0, 320, 240, 0, 0, 640, 480);
|
||||
show_video_bitmap(page[currentpage]);
|
||||
currentpage = (currentpage+1)%3;
|
||||
//Input
|
||||
if(mouse_b & 1){
|
||||
//Left click
|
||||
mapcontents[xp][yp]=1;
|
||||
xpos=xp;
|
||||
ypos=yp;
|
||||
}
|
||||
if(mouse_b & 2){
|
||||
//Right click
|
||||
mapcontents[xp][yp]=0;
|
||||
mapcontentsu[xp][yp]=0;
|
||||
mapcontentsd[xp][yp]=0;
|
||||
mapcontentsl[xp][yp]=0;
|
||||
mapcontentsr[xp][yp]=0;
|
||||
|
||||
mapcontentsu[xp][yp+1]=0;
|
||||
mapcontentsd[xp][yp-1]=0;
|
||||
mapcontentsl[xp+1][yp]=0;
|
||||
mapcontentsr[xp-1][yp]=0;
|
||||
}
|
||||
|
||||
if(tileselectdelay<=0){
|
||||
if(key[KEY_COMMA]){
|
||||
ctile--;
|
||||
tileselectdelay=4;
|
||||
}
|
||||
if(key[KEY_STOP]){
|
||||
ctile++;
|
||||
tileselectdelay=4;
|
||||
}
|
||||
|
||||
if(key[KEY_UP]){
|
||||
tileselectdelay=8;
|
||||
mapcontents[xpos][ypos]=1;
|
||||
mapcontentsu[xpos][ypos]=1;
|
||||
ypos--;
|
||||
mapcontentsd[xpos][ypos]=1;
|
||||
}else if(key[KEY_DOWN]){
|
||||
tileselectdelay=8;
|
||||
mapcontents[xpos][ypos]=1;
|
||||
mapcontentsd[xpos][ypos]=1;
|
||||
ypos++;
|
||||
mapcontentsu[xpos][ypos]=1;
|
||||
}else if(key[KEY_LEFT]){
|
||||
tileselectdelay=8;
|
||||
mapcontents[xpos][ypos]=1;
|
||||
mapcontentsl[xpos][ypos]=1;
|
||||
xpos--;
|
||||
mapcontentsr[xpos][ypos]=1;
|
||||
}else if(key[KEY_RIGHT]){
|
||||
tileselectdelay=8;
|
||||
mapcontents[xpos][ypos]=1;
|
||||
mapcontentsr[xpos][ypos]=1;
|
||||
xpos++;
|
||||
mapcontentsl[xpos][ypos]=1;
|
||||
}
|
||||
|
||||
}else{
|
||||
tileselectdelay--;
|
||||
}
|
||||
if(ctile<0) ctile+=10;
|
||||
if(ctile>=10) ctile-=10;
|
||||
|
||||
|
||||
|
||||
if(key[KEY_F8]){
|
||||
savemap();
|
||||
while(key[KEY_F8]);
|
||||
}
|
||||
|
||||
//Logic
|
||||
gt++;
|
||||
while(speed_counter<1) rest(1); speed_counter = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
END_OF_MAIN()
|
||||
Reference in New Issue
Block a user