/***************************************************** Block Dude 2: Trapped (68k) Copyright (C) 2010 Danny Clark Project started on August 9, 2010 at 7:45:20 PM Scratch restart on September 29, 2010 at 12:50:54 PM Port of "Block Dude 2: Trapped (TI-Nspire)" ******************************************************/ #include #include "draw.h" #include "data.h" void _main(void) { int inc,level=1,guyx,guyy,box,win=0,dir,x,y,beat,moved,bmove,bomb=0,gbomb=0,spike=0,lad=0,key=0,gbombe=0; //long int passwords[15]={12414,65643,87934,36472,10284,60497,73016,97820,15974,15637,52018}; char currentlevel[25][40]; char currentladders[25][40]; char levelinfo[6]; clrscr(); FontSetSys(F_8x10); DrawStr(0,0,"Trapped!\n",A_NORMAL); FontSetSys(F_6x8); DrawStr(0,15,"Press the number key (1-5) of\nthe level you want to play!",A_NORMAL); key=ngetchx(); switch (key) { case 50: level=2; break; case 51: level=3; break; case 52: level=4; break; case 53: level=5; break; default: level=1; break; } GrayOn(); while(key!=KEY_ESC) { for(x=0;x<25;x++) { for(y=0;y<40;y++) { currentlevel[x][y]=setlevel(level,x,y); } } for(x=0;x<25;x++) { for(y=0;y<40;y++) { currentladders[x][y]=setladder(level,x,y); } } for(x=0;x<6;x++) { levelinfo[x]=setlevelinfo(level,x); } guyx=levelinfo[0]; guyy=levelinfo[1]; drawlevel(currentlevel,currentladders,levelinfo,0); box=0; while(!win) { key=keypress(); levelinfo[0]=guyx; levelinfo[1]=guyy; if(key==KEY_F2&¤tladders[guyy][guyx]&&!box&&!bomb&&!gbomb) { lad=1; currentlevel[guyy][guyx]=202; while(lad) { key=keypress(); if(key==KEY_UP) { if(currentladders[guyy-1][guyx]) { currentlevel[guyy][guyx]=0; guyy--; currentlevel[guyy][guyx]=202; levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,1); //slowdown(1600000); } } if(key==KEY_DOWN) { if(currentladders[guyy+1][guyx]&&!currentlevel[guyy+1][guyx]) { currentlevel[guyy][guyx]=0; guyy++; currentlevel[guyy][guyx]=202; levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,1); //slowdown(1600000); } if(!currentladders[guyy+1][guyx]&&!currentlevel[guyy+1][guyx]) { currentladders[guyy][guyx]=2; while(currentlevel[guyy+1][guyx]==0) { currentlevel[guyy][guyx]=0; guyy++; currentlevel[guyy][guyx]=3; levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,1); //slowdown(500000/3); } lad=0; } } if(key==KEY_LEFT) { if(currentladders[guyy][guyx-1]==2) { currentlevel[guyy][guyx]=0; guyx--; currentlevel[guyy][guyx]=202; } else { lad=0; break; } levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,1); //slowdown(1600000); } if(key==KEY_RIGHT) { if(currentladders[guyy][guyx+1]==2) { currentlevel[guyy][guyx]=0; guyx++; currentlevel[guyy][guyx]=202; } else { lad=0; break; } levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,1); //slowdown(1600000); } levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,1); //slowdown(1600000); }//end of while no ladders }//end of ladders if(key==KEY_LEFT) { //change the current pic of the guy to face left currentlevel[guyy][guyx]=3; //If the door is there, exit the game loop if(currentlevel[guyy][guyx-1]==4) { win=1;beat=1; } //If the space to the left is open, move the guy if(currentlevel[guyy][guyx-1]==0) { currentlevel[guyy][guyx]=0; currentlevel[guyy][guyx-1]=3; moved=1; //If he has a box, move that too. if (box||bomb||gbomb) { if(currentlevel[guyy-1][guyx-1]==1||currentlevel[guyy-1][guyx-1]==2) { currentlevel[guyy-1][guyx]=0; if(box) { currentlevel[guyy][guyx]=2; box=0; } if(bomb) { currentlevel[guyy][guyx]=6; bomb=0; } if(gbomb) { currentlevel[guyy][guyx]=7; gbomb=0; } moved=1; } else { currentlevel[guyy-1][guyx]=0; if(box) { currentlevel[guyy-1][guyx-1]=2; } if(bomb) { currentlevel[guyy-1][guyx-1]=6; } if(gbomb) { currentlevel[guyy-1][guyx-1]=7; } } } //change the guy position guyx--; if(moved) { levelinfo[0]=guyx; levelinfo[1]=guyy; currentlevel[guyy][guyx]=3; } if(currentlevel[guyy+1][guyx]==4) { win=1; } if(currentlevel[guyy+1][guyx]==10) { spike=1; } //if there is not a brick/box under the guy, move him down while(currentlevel[guyy+1][guyx]==0) { currentlevel[guyy][guyx]=0; guyy++; currentlevel[guyy][guyx]=3; if(currentlevel[guyy+1][guyx]==4) { win=1;beat=1; } if(currentlevel[guyy+1][guyx]==10) { spike=1; } //if he has a box, move that too if(box||bomb||gbomb) { currentlevel[guyy-2][guyx]=0; if(box) { currentlevel[guyy-1][guyx]=2; } if(bomb) { currentlevel[guyy-1][guyx]=6; } if(gbomb) { currentlevel[guyy-1][guyx]=7; } } drawlevel(currentlevel,currentladders,levelinfo,0); } } //draw the updated level levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(1600000/2); }//end of key left if(key==KEY_RIGHT) { //change the current pic of the guy to face right currentlevel[guyy][guyx]=5; //if there is a brick/block to the right, do nothing if(currentlevel[guyy][guyx+1]==1||currentlevel[guyy][guyx+1]==2) { } //if the door is to the right, exit this loop if(currentlevel[guyy][guyx+1]==4) { win=1;beat=1; } //If there is a blank spot, move right if(currentlevel[guyy][guyx+1]==0) { currentlevel[guyy][guyx]=0; currentlevel[guyy][guyx+1]=5; moved=1; //move the box too if (box||bomb||gbomb) { if(currentlevel[guyy-1][guyx+1]==1||currentlevel[guyy-1][guyx+1]==2) { currentlevel[guyy-1][guyx]=0; if(box) { currentlevel[guyy][guyx]=2; box=0; } if(bomb) { currentlevel[guyy][guyx]=6; bomb=0; } if(gbomb) { currentlevel[guyy][guyx]=7; gbomb=0; } moved=1; } else { currentlevel[guyy-1][guyx]=0; if(box) { currentlevel[guyy-1][guyx+1]=2; } if(bomb) { currentlevel[guyy-1][guyx+1]=6; } if(gbomb) { currentlevel[guyy-1][guyx+1]=7; } } } //change guy position guyx++; if(moved) { levelinfo[0]=guyx; levelinfo[1]=guyy; currentlevel[guyy][guyx]=5; } if(currentlevel[guyy+1][guyx]==4) { win=1; } if(currentlevel[guyy+1][guyx]==10) { spike=1; } //check if guy can be moved down after moving, and if so, move him while(currentlevel[guyy+1][guyx]==0) { currentlevel[guyy][guyx]=0; guyy++; currentlevel[guyy][guyx]=5; if(currentlevel[guyy+1][guyx]==4) { win=1; beat=1; } if(currentlevel[guyy+1][guyx]==10) { spike=1; } //move the box too if he has one if(box||bomb||gbomb) { currentlevel[guyy-2][guyx]=0; if(box) { currentlevel[guyy-1][guyx]=2; } if(bomb) { currentlevel[guyy-1][guyx]=6; } if(gbomb) { currentlevel[guyy-1][guyx]=7; } } drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(1600000/8); } } //draw the level levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(1600000/2); }//end of key right if(key==KEY_DOWN) { //set moved to true moved=1; //determine if guy is facing left or right if (currentlevel[guyy][guyx]==3) { dir=-1; } else { dir=1; } //if he has anything... if ((box||bomb||gbomb)&&!currentlevel[guyy-1][guyx+dir]) { //if spot to left or right is open put block there. If the space below that is open, keep moving until it hits a brick or another block bmove=0; while(currentlevel[guyy+bmove][guyx+dir]==0) { currentlevel[guyy-1][guyx]=0; currentlevel[guyy+(bmove-1)][guyx+dir]=0; if(box) { currentlevel[guyy+bmove][guyx+dir]=2; } if(bomb) { currentlevel[guyy+bmove][guyx+dir]=6; } if(gbomb) { currentlevel[guyy+bmove][guyx+dir]=7; } moved=0; bmove++; } //If the space to the left up one square is open... if((currentlevel[guyy][guyx+dir]==1||currentlevel[guyy][guyx+dir]==2||currentlevel[guyy-1][guyx+dir]!=6||currentlevel[guyy-1][guyx+dir]!=7)&&moved) { if(currentlevel[guyy-1][guyx+dir]==0) { currentlevel[guyy-1][guyx]=0; if(box) { currentlevel[guyy-1][guyx+dir]=2; box=0; } if(bomb) { currentlevel[guyy-1][guyx+dir]=6; bomb=0; } if(gbomb) { currentlevel[guyy-1][guyx+dir]=7; gbomb=0; } } } box=0; bomb=0; gbomb=0; } //if the guy didn't have a box and there is one available, pick it up else if(!currentlevel[guyy-1][guyx]){ if (!box) { if(currentlevel[guyy][guyx+dir]==2) { if(currentlevel[guyy-1][guyx+dir]!=1&¤tlevel[guyy-1][guyx+dir]!=2&¤tlevel[guyy-1][guyx+dir]!=6&¤tlevel[guyy-1][guyx+dir]!=7) { currentlevel[guyy][guyx+dir]=0; currentlevel[guyy-1][guyx]=2; box=1; } } } if (!bomb) { if(currentlevel[guyy][guyx+dir]==6) { if(currentlevel[guyy-1][guyx+dir]!=1&¤tlevel[guyy-1][guyx+dir]!=2&¤tlevel[guyy-1][guyx+dir]!=6&¤tlevel[guyy-1][guyx+dir]!=7) { currentlevel[guyy][guyx+dir]=0; currentlevel[guyy-1][guyx]=6; bomb=1; } } } if (!gbomb) { if(currentlevel[guyy][guyx+dir]==7) { if(currentlevel[guyy-1][guyx+dir]!=1&¤tlevel[guyy-1][guyx+dir]!=2&¤tlevel[guyy-1][guyx+dir]!=6&¤tlevel[guyy-1][guyx+dir]!=7) { currentlevel[guyy][guyx+dir]=0; currentlevel[guyy-1][guyx]=7; gbomb=1; } } } } //redraw the level levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(1600000); while(keypress()==KEY_ESC); }//end of key down if(key==KEY_UP) { //set the direction if (currentlevel[guyy][guyx]==3) { dir=-1; } else { dir=1; } //check if up move is possible if (currentlevel[guyy][guyx+dir]==1||currentlevel[guyy][guyx+dir]==2||currentlevel[guyy][guyx+dir]==6||currentlevel[guyy][guyx+dir]==7||currentlevel[guyy][guyx+dir]==11||currentlevel[guyy][guyx+dir]==9) { //check for a win if (currentlevel[guyy-1][guyx+dir]==4) { win=1; beat=1; } //move guy if(currentlevel[guyy-1][guyx+dir]==0&¤tlevel[guyy-1][guyx]!=1&¤tlevel[guyy-1][guyx]!=11) { currentlevel[guyy][guyx]=0; if (dir==1) { currentlevel[guyy-1][guyx+dir]=5; } else if (dir==-1) { currentlevel[guyy-1][guyx+dir]=3; } //move box,bomb, or gold bomb too if (box||bomb||gbomb) { if(currentlevel[guyy-2][guyx+dir]==1||currentlevel[guyy-2][guyx+dir]==2) { currentlevel[guyy-1][guyx+dir]=0; if (dir==1) { currentlevel[guyy-1][guyx+dir]=0; } else if (dir==-1) { currentlevel[guyy-1][guyx+dir]=0; } guyx-=dir; guyy++; } else { currentlevel[guyy-1][guyx]=0; if(box) { currentlevel[guyy-2][guyx+dir]=2; } if(bomb) { currentlevel[guyy-2][guyx+dir]=6; } if(gbomb) { currentlevel[guyy-2][guyx+dir]=7; } } } //reset guy position guyx+=dir; guyy--; } } //redraw level if(dir==1) { currentlevel[guyy][guyx]=5; } levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(1600000); }//end of key up if(key==KEY_ESC) { GrayOff(); return; }//end of key escape if(key==KEY_F1) { if (currentlevel[guyy][guyx]==3) { dir=-1; } else { dir=1; } if(!gbomb&&!box&&!bomb&&(currentlevel[guyy][guyx+dir]==6||currentlevel[guyy][guyx]==7)) { gbombe=0; if(currentlevel[guyy][guyx]==7) { gbombe=1; } currentlevel[guyy][guyx+dir]=100; drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(500000/4); currentlevel[guyy][guyx+dir]=101; drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(500000/4); if(currentlevel[guyy][guyx+(2*dir)]!=11) { currentlevel[guyy][guyx+(2*dir)]=102; drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(500000/4); currentlevel[guyy][guyx+(2*dir)]=0; x=1; inc=0; while(currentlevel[guyy+x][guyx+(dir<<1)]==0) { x++; inc++; } x=1; if (currentlevel[guyy-x][guyx+(2*dir)]==2||currentlevel[guyy-x][guyx+(2*dir)]==6||currentlevel[guyy-x][guyx+(2*dir)]==7) { while(currentlevel[guyy-x][guyx+(dir*2)]==2||currentlevel[guyy-x][guyx+(dir*2)]==6||currentlevel[guyy-x][guyx+(dir*2)]==7) { currentlevel[guyy-x+1+inc][guyx+(2*dir)]=currentlevel[guyy-x][guyx+(2*dir)]; currentlevel[guyy-x][guyx+(2*dir)]=0; x++; } } } if(gbombe) { currentlevel[guyy][guyx+dir]=7; } else if (!gbombe) { currentlevel[guyy][guyx+dir]=0; x=1; inc=0; while(currentlevel[guyy+x][guyx+(dir<<1)]==0) { x++; inc++; } x=1; if(currentlevel[guyy-x][guyx+dir]==2||currentlevel[guyy-x][guyx+dir]==6||currentlevel[guyy-x][guyx+dir]==7) { while(currentlevel[guyy-x][guyx+dir]==2||currentlevel[guyy-x][guyx+dir]==6||currentlevel[guyy-x][guyx+dir]==7) { currentlevel[guyy-x+1+inc][guyx+dir]=currentlevel[guyy-x][guyx+dir]; currentlevel[guyy-x][guyx+dir]=0; x++; } } } } if(currentlevel[guyy][guyx+dir]==9&¤tlevel[guyy][guyx+(dir<<1)]==0) { currentlevel[guyy][guyx+dir]=0; currentlevel[guyy][guyx+(dir<<1)]=9; x=1; while(currentlevel[guyy-x][guyx+dir]==2||currentlevel[guyy-x][guyx+dir]==6||currentlevel[guyy-x][guyx+dir]==7||currentlevel[guyy-x][guyx+dir]==9) { currentlevel[guyy-x+1][guyx+dir]=currentlevel[guyy-x][guyx+dir]; currentlevel[guyy-x][guyx+dir]=0; x++; } x=1; while(currentlevel[guyy+x][guyx+(dir<<1)]==0) { currentlevel[guyy+x-1][guyx+(dir<<1)]=0; currentlevel[guyy+x][guyx+(dir<<1)]=9; x++; } } levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(500000/2); } /*if(key==KEY_F1) { if (currentlevel[guyy][guyx]==3) { dir=-1; } else { dir=1; } if(!gbomb&&!box&&!bomb&&(currentlevel[guyy][guyx+dir]==6||currentlevel[guyy][guyx]==7)) { gbombe=0; if(currentlevel[guyy][guyx]==7) { gbombe=1; } if(currentlevel[guyy][guyx+(dir<<1)]!=11) { currentlevel[guyy][guyx+(dir<<1)]=0; x=1; while(currentlevel[guyy-x][guyx+(dir<<1)]==2||currentlevel[guyy-x][guyx+(dir<<1)]==6||currentlevel[guyy-x][guyx+(dir<<1)]==7) { currentlevel[guyy-x+1][guyx+(dir<<1)]=currentlevel[guyy-x][guyx+(dir<<1)]; currentlevel[guyy-x][guyx+(dir<<1)]=0; x++; } } if(gbombe) { currentlevel[guyy][guyx+dir]=7; } else { currentlevel[guyy][guyx+dir]=0; x=1; while(currentlevel[guyy-x][guyx+dir]==2||currentlevel[guyy-x][guyx+dir]==6||currentlevel[guyy-x][guyx+dir]==7) { currentlevel[guyy-x+1][guyx+dir]=currentlevel[guyy-x][guyx+dir]; currentlevel[guyy-x][guyx+dir]=0; x++; } } } if(currentlevel[guyy][guyx+dir]==9&¤tlevel[guyy][guyx+(dir<<1)]==0) { currentlevel[guyy][guyx+dir]=0; currentlevel[guyy][guyx+(dir<<1)]=9; x=1; while(currentlevel[guyy-x][guyx+dir]==2||currentlevel[guyy-x][guyx+dir]==6||currentlevel[guyy-x][guyx+dir]==7||currentlevel[guyy-x][guyx+dir]==9) { currentlevel[guyy-x+1][guyx+dir]=currentlevel[guyy-x][guyx+dir]; currentlevel[guyy-x][guyx+dir]=0; x++; } x=1; while(currentlevel[guyy+x][guyx+(dir<<1)]==0) { currentlevel[guyy+x-1][guyx+(dir<<1)]=0; currentlevel[guyy+x][guyx+(dir<<1)]=9; x++; } } levelinfo[0]=guyx; levelinfo[1]=guyy; drawlevel(currentlevel,currentladders,levelinfo,0); //slowdown(1600000/2); }//end of f1 key*/ if(key==KEY_F3||spike) { level--; win=1; beat=0; spike=0; }//end f3 if(key==KEY_F4) { if(currentlevel[guyy][guyx]==3) { currentlevel[guyy][guyx]=5; } else { currentlevel[guyy][guyx]=3; } drawlevel(currentlevel,currentladders,levelinfo,0); // slowdown(1600000); }//end f4 }//end of while no win if (level!=5) { level++; win=0; continue; } else { GrayOff(); return; } }//end of while no keyesc }//end of main