//v0.6 - 10th march, 2019 //Revision History //v0.2 //v0.3 //v0.4 Fix compile //v0.5 Update DMaps after Levels in Link Active //v0.6 Move locations.clear() to Link active, because that array data is not available // early enough in the engine for Link init. (Engine bug.) script typedef screendata struct; script typedef screendata class; struct script locations { enum{ curDMAP, curSCREEN, curLEVEL, pvsDMAP, pvsSCREEN, pvsLEVEL, locLAST}; int data[locLAST]; void run(){} void clear() { for ( int q = 0; q < locLAST; ++q ) data[q] = 0; } bool changed() { return ( Game->GetCurDMap() != data[curDMAP] || Game->GetCurScreen() != data[curSCREEN] ); } bool dmapchanged() { return ( Game->GetCurDMap() != data[curDMAP] ); } bool screenchanged() { return ( Game->GetCurScreen() != data[curSCREEN] ); } bool levelchanged() { return ( Game->GetCurLevel() != data[curLEVEL] ); } int priorDMap() { return ( data[pvsDMAP] ); } void update() { data[pvsSCREEN] = data[curSCREEN]; data[pvsDMAP] = data[curDMAP]; data[curSCREEN] = Game->GetCurScreen(); data[curDMAP] = Game->GetCurDMap(); } void update_dmap() { data[pvsDMAP] = data[curDMAP]; data[curDMAP] = Game->GetCurDMap(); } void update_level() { data[pvsLEVEL] = data[curLEVEL]; data[curLEVEL] = Game->GetCurLevel(); } void update_screen() { data[pvsSCREEN] = data[curSCREEN]; data[curSCREEN] = Game->GetCurScreen(); } } class script screenintros { const int REGISTER = 6; const int BIT = 2; void run(){} void clear() { for ( int q = 0; q < 0x80; ++q ) { SetScreenDBit(locations.data[locations.pvsDMAP], q, REGISTER, BIT, false); } } void update() { if ( locations.levelchanged() ) { locations.update_level(); locations.update_dmap(); clear(); //Re-display after changing dmaps, like DMap intros repeat, but for screens. } } } link script active { void run() { locations.clear(); locations.clear(); //Call twice to push the previous screen down. while(1) { screenintros.update(); Waitframe(); } } } //Does not repeat if you revisit the screen, unless you change dmaps. ffc script screenmessage { const int REGISTER = 6; const int BIT = 2; const int DELAY_DEFAULT = 20; void run(int delay, int reg, int bit ) { reg = ( reg > 0 ) ? reg : REGISTER; bit = ( bit > 0 ) ? reg : BIT; delay = ( delay > 0 ) ? delay : DELAY_DEFAULT; while(1) { if ( !(GetScreenDBit(Game->GetCurDMap(), Game->GetCurScreen(), reg, bit)) ) { Waitframes(delay); Screen->Message(Screen->String); SetScreenDBit(Game->GetCurDMap(), Game->GetCurScreen(), reg, bit, true); } Waitframe(); } } } link script init { void run() { //locations.clear(); //locations.clear(); //Call twice to push the previous screen down. } } /////////////////////////// /// NPC Script Room Guy /// /// v0.3 /// /// 8th March, 2019 /// /// By: ZoriaRPG /// /////////////////////////// //ZQuest Screen Menu Sets Options //Set Screen->String to the string to display //Set Screen->Catchall to the delay time, if the roomtype is none. //Otherwise, you can set a default delay on the enemy using D0. //v0.2 Initial Fixes //v0.3 Added Once Only Behavioural Flag npc script screenguy { const int DELAY = 20; //Time to spawn. const int BFLAG_ONCE = 4; const int REGISTER = 6; const int BIT = 2; void run(int delay, int reg, int bit) { delay = this->InitD[0] > 0 ? delay : DELAY; reg = this->InitD[1] > 0 ? reg : REGISTER; bit = this->InitD[2] > 0 ? bit : BIT; if ( !Screen->RoomType ) { if ( Screen->Catchall ) { delay = Screen->Catchall; } } this->CollDetection = false; //this->DrawYOffset = -32768; //Waitframes(Screen->Catchall); //might be in use depending on room type Waitframes(delay); if ( this->BFlags[BFLAG_ONCE] ) { if ( !(GetScreenDBit(Game->GetCurDMap(), Game->GetCurScreen(), reg, bit)) ) { Screen->Message(Screen->String); SetScreenDBit(Game->GetCurDMap(), Game->GetCurScreen(), reg, bit, true); } } else Screen->Message(Screen->String); } }