import "std.zh"
const int CT_CLIFF = 142; //This is the combo type used for the cliffs. Look in std_constants.zh for reference. It's Script 1 (142) by default.
const int CLIFF_PAUSE = 15; //This is the number of frames (60ths of a second) Link must walk into the cliff before jumping
ffc script GBCliff{
bool CheckCliffDirection(int Combo){
int Dir;
if(Screen->ComboS[Combo]==0101b)
Dir = DIR_UP;
else if(Screen->ComboS[Combo]==1010b)
Dir = DIR_DOWN;
else if(Screen->ComboS[Combo]==0011b)
Dir = DIR_LEFT;
else if(Screen->ComboS[Combo]==1100b)
Dir = DIR_RIGHT;
else
return false;
if(Dir==Link->Dir)
return true;
return false;
}
void run(){
int PushCounter = 0;
while(true){
if(Link->Dir==DIR_UP&&!CanWalk(Link->X, Link->Y, DIR_UP, 1, false)&&Link->InputUp&&Screen->ComboT[ComboAt(Link->X+8, Link->Y+14)]==CT_CLIFF&&CheckCliffDirection(ComboAt(Link->X+8, Link->Y+14))&&(Link->Action==LA_WALKING||Link->Action==LA_NONE)){
PushCounter++;
if(PushCounter>=CLIFF_PAUSE){
Game->PlaySound(SFX_JUMP);
Link->Jump = 2;
int Y = Link->Y;
for(int i=0; i<26; i++){
Y -= 0.61;
Link->Y = Y;
WaitNoAction();
}
PushCounter = 0;
}
}
else if(Link->Dir==DIR_DOWN&&!CanWalk(Link->X, Link->Y, DIR_DOWN, 1, false)&&Link->InputDown&&Screen->ComboT[ComboAt(Link->X+8, Link->Y+12)]==CT_CLIFF&&CheckCliffDirection(ComboAt(Link->X+8, Link->Y+12))&&(Link->Action==LA_WALKING||Link->Action==LA_NONE)){
PushCounter++;
if(PushCounter>=CLIFF_PAUSE){
Game->PlaySound(SFX_JUMP);
Link->Jump = 1;
int Combo = ComboAt(Link->X+8, Link->Y+12);
int CliffHeight = 1;
for(int i=1; i<11; i++){
if(Screen->isSolid(ComboX(Combo)+8, ComboY(Combo)+8+16*i))
CliffHeight++;
else
break;
}
Link->Z = CliffHeight*16;
Link->Y += CliffHeight*16;
while(Link->Z>0){
WaitNoAction();
}
PushCounter = 0;
}
}
else if(Link->Dir==DIR_LEFT&&!CanWalk(Link->X, Link->Y, DIR_LEFT, 1, false)&&Link->InputLeft&&Screen->ComboT[ComboAt(Link->X+4, Link->Y+8)]==CT_CLIFF&&CheckCliffDirection(ComboAt(Link->X+4, Link->Y+8))&&(Link->Action==LA_WALKING||Link->Action==LA_NONE)){
PushCounter++;
if(PushCounter>=CLIFF_PAUSE){
Game->PlaySound(SFX_JUMP);
Link->Jump = 2;
int X = Link->X;
for(int i=0; i<26; i++){
X -= 0.92;
if(i==13){
Link->Z += 16;
Link->Y += 16;
}
Link->X = X;
WaitNoAction();
}
while(Link->Z>0){
WaitNoAction();
}
PushCounter = 0;
}
}
else if(Link->Dir==DIR_RIGHT&&!CanWalk(Link->X, Link->Y, DIR_RIGHT, 1, false)&&Link->InputRight&&Screen->ComboT[ComboAt(Link->X+12, Link->Y+8)]==CT_CLIFF&&CheckCliffDirection(ComboAt(Link->X+12, Link->Y+8))&&(Link->Action==LA_WALKING||Link->Action==LA_NONE)){
PushCounter++;
if(PushCounter>=CLIFF_PAUSE){
Game->PlaySound(SFX_JUMP);
Link->Jump = 2;
int X = Link->X;
for(int i=0; i<26; i++){
X += 0.92;
if(i==13){
Link->Z += 16;
Link->Y += 16;
}
Link->X = X;
WaitNoAction();
}
while(Link->Z>0){
WaitNoAction();
}
PushCounter = 0;
}
}
else{
PushCounter = 0;
}
Waitframe();
}
}
}
ffc script GBDungeonCliff{
void run(int CliffCombo){
int PushCounter = 0;
while(true){
if(Link->Dir==DIR_UP&&!CanWalk(Link->X, Link->Y, DIR_UP, 1, false)&&Link->InputUp&&Screen->ComboD[ComboAt(Link->X+8, Link->Y+7)]==CliffCombo&&(Link->Action==LA_WALKING||Link->Action==LA_NONE)){
PushCounter++;
if(PushCounter>=CLIFF_PAUSE){
Game->PlaySound(SFX_JUMP);
Link->Jump = 2;
int Y = Link->Y;
for(int i=0; i<26; i++){
Y -= 0.92;
Link->Y = Y;
WaitNoAction();
}
PushCounter = 0;
}
}
else if(Link->Dir==DIR_DOWN&&!CanWalk(Link->X, Link->Y, DIR_DOWN, 1, false)&&Link->InputDown&&Screen->ComboD[ComboAt(Link->X+8, Link->Y+16)]==CliffCombo+1&&(Link->Action==LA_WALKING||Link->Action==LA_NONE)){
PushCounter++;
if(PushCounter>=CLIFF_PAUSE){
Game->PlaySound(SFX_JUMP);
Link->Jump = 1;
int Combo = ComboAt(Link->X+8, Link->Y+12);
int CliffHeight = 1;
for(int i=1; i<11; i++){
if(Screen->isSolid(ComboX(Combo)+8, ComboY(Combo)+8+16*i))
CliffHeight++;
else
break;
}
Link->Z = CliffHeight*16-8;
Link->Y += CliffHeight*16-8;
while(Link->Z>0){
WaitNoAction();
}
PushCounter = 0;
}
}
else if(Link->Dir==DIR_LEFT&&!CanWalk(Link->X, Link->Y, DIR_LEFT, 1, false)&&Link->InputLeft&&Screen->ComboD[ComboAt(Link->X-1, Link->Y+8)]==CliffCombo+2&&(Link->Action==LA_WALKING||Link->Action==LA_NONE)){
PushCounter++;
if(PushCounter>=CLIFF_PAUSE){
Game->PlaySound(SFX_JUMP);
Link->Jump = 2;
int X = Link->X;
for(int i=0; i<26; i++){
X -= 1.23;
Link->X = X;
WaitNoAction();
}
PushCounter = 0;
}
}
else if(Link->Dir==DIR_RIGHT&&!CanWalk(Link->X, Link->Y, DIR_RIGHT, 1, false)&&Link->InputRight&&Link->InputRight&&Screen->ComboD[ComboAt(Link->X+16, Link->Y+8)]==CliffCombo+3&&(Link->Action==LA_WALKING||Link->Action==LA_NONE)){
PushCounter++;
if(PushCounter>=CLIFF_PAUSE){
Game->PlaySound(SFX_JUMP);
Link->Jump = 2;
int X = Link->X;
for(int i=0; i<26; i++){
X += 1.23;
Link->X = X;
WaitNoAction();
}
}
}
else{
PushCounter = 0;
}
Waitframe();
}
}
}
item script Frogforce{
void run(){
Game->End();
}
}