//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);
}
}
Comments