#include "time.zh" namespace smb { namespace version { const float ID = 0.0003; const int YEAR = 2020; const int MONTH = 1; const int DAY = 12; const int HOUR = 7; const int MINUTE = 25; const int TIMEZONE = tzGMT; } const int PIPEDIR_DOWN = 0; const int PIPEDIR_UP = 1; const int PIPEDIR_EXIT_UP = 0; const int PIPEDIR_EXIT_DOWN = 1; const int PIPEBLOCK_LEFT = 0; const int PIPEBLOCK_RIGHT = 0; const int PLAYER_USING_PIPE = 31; //Hero->Misc[] const int PLAYER_USING_PIPE_DOWN = 1; //Value const int PLAYER_USING_PIPE_UP = 2; //Value const int PLAYER_USING_PIPE_CLEANUP = 3; //Value int isBig = 0; combodata script pipe { void run(int destscreen, int destdmap) { int sfx = this->Attribytes[0]; int lr = this->Attribytes[1]; int pipedir = this->Attribytes[2]; bool usingpipe = false; int hero_y_adj = 0; int clk = 0; if ( Hero->Misc[PLAYER_USING_PIPE] ) Quit(); until(usingpipe) { switch(pipedir) { case PIPEDIR_DOWN: { if(Hero->Y == this->PosY() - 16) { switch(lr) //left or right { case PIPEBLOCK_LEFT: { if ( (Hero->X >= (this->PosX() + 2)) && Hero->X <= (this->PosX() + 16) ) { if ( Hero->InputDown ) { usingpipe = true; Hero->Misc[PLAYER_USING_PIPE] = PLAYER_USING_PIPE_DOWN; } } break; } case PIPEBLOCK_RIGHT: { if ( (Hero->X >= (this->PosX())) && Hero->X <= (this->PosX() + 14) ) { if ( Hero->InputDown ) { usingpipe = true; Hero->Misc[PLAYER_USING_PIPE] = PLAYER_USING_PIPE_DOWN; } } break; } default: break; } } break; } case PIPEDIR_UP: { if(Hero->Y == this->PosY() + 16) { switch(lr) //left or right { case PIPEBLOCK_LEFT: { if ( (Hero->X >= (this->PosX() + 2)) && Hero->X <= (this->PosX() + 16) ) { if ( Hero->InputUp ) { usingpipe = true; Hero->Misc[PLAYER_USING_PIPE] = PLAYER_USING_PIPE_UP; } } break; } case PIPEBLOCK_RIGHT: { if ( (Hero->X >= (this->PosX())) && Hero->X <= (this->PosX() + 14) ) { if ( Hero->InputUp ) { usingpipe = true; Hero->Misc[PLAYER_USING_PIPE] = PLAYER_USING_PIPE_UP; } } break; } default: break; } } break; } default: break; } Waitframe(); } Audio->PlaySound(sfx); while(usingpipe) { ++clk; unless(clk%4) { switch(lr) { case PIPEDIR_DOWN: ++Hero->Y; ++hero_y_adj; break; case PIPEDIR_UP: --Hero->Y; ++hero_y_adj; break; default: break; } } if ( hero_y_adj > ( isBig ? 33 : 17 ) ) { break; } Waitframe(); } Hero->Misc[PLAYER_USING_PIPE] = PLAYER_USING_PIPE_CLEANUP; Hero->Warp({wtSCROLL,destdmap,destscreen,-1,0,warpEffectNONE,0,0}); } } void PipeCleanup() { if ( Hero->Misc[PLAYER_USING_PIPE] == PLAYER_USING_PIPE_CLEANUP ) { Hero->Misc[PLAYER_USING_PIPE] = 0; } } //Place warp return 0 over this combo combodata script exitpipe { void run(int pipe_exit_dir, int sfx) { unless(Hero->Misc[PLAYER_USING_PIPE] == PLAYER_USING_PIPE_CLEANUP) Quit(); //Only if exiting a warp. int clk; int hero_y_adj; Hero->X = this->PosX()+8; //Centre over exit pipe. int done = 0; Audio->PlaySound(sfx); until(done) { ++clk; unless(clk%4) { switch(pipe_exit_dir) { case PIPEDIR_EXIT_UP: --Hero->Y; ++hero_y_adj; break; case PIPEDIR_EXIT_DOWN: ++Hero->Y; ++hero_y_adj; break; default: break; } } if ( hero_y_adj > ( isBig ? 33 : 17 ) ) { done = true; break; } Waitframe(); } Hero->Misc[PLAYER_USING_PIPE] = 0; } } } //end namespace smb