import "std.zh"
//Better Stone of Agony
const int BetterAgony_ID = 123; //item ID
const int BetterAgony_DetectionRadius = 32; //the secret detection radius in pixels
const int BetterAgony_DetectionFlag = 98; //script flag number to use for secret detection
const int BetterAgony_Vibrate = 1; //wether or not it makes link vibrate. 0 = no, 1 = yes
const int BetterAgony_SFX = 61; //sound effect to play. leave as 0 if unneeded
const int BetterAgony_SFXRepeatRate = 30; //how fast to repeat the sound effect, in frames
const int BetterAgony_ComboID = 8; //combo to draw above links head as an indicator. leave as 0 if unneeded.
const int BetterAgony_ComboCSet = 7; //cset to use for the combo
global script Active{
void run(){
int BetterAgony_LastDMap = Game->GetCurDMap();
int BetterAgony_LastScreen = Game->GetCurDMapScreen();
while(true){
if ( Game->GetCurDMap() != BetterAgony_LastDMap || Game->GetCurDMapScreen() != BetterAgony_LastScreen )
Link->DrawYOffset = 0; //fix better stone of agony link draw offset
BetterAgony_LastDMap = Game->GetCurDMap();
BetterAgony_LastScreen = Game->GetCurDMapScreen();
Waitframe();
}
}
}
//D0: How to detect secrets
//0 = Detect trigger flags
//1 = Detect the script flag
//2 = Detect both trigger flags and the script flag
//D1: Condition for detecting secrets
//0 = Always detect
//1 = Don't detect if permanent secrets are activated
ffc script BetterStoneOfAgony{
void run(int type, int condition){
bool SecretDetected;
bool OtherFrame;
int LinkVibration;
bool LinkOffset;
int SFXRepeat;
while(true){
while( !Link->Item[BetterAgony_ID] || (condition == 1 && Screen->State[ST_SECRET]) ) { //halt the script
LinkVibration = 0;
if ( LinkOffset )
Link->DrawYOffset ++; //revert drawoffset
LinkOffset = false;
SFXRepeat = 0;
Waitframe();
}
if ( OtherFrame ) { //only check every other frame to prevent slowdown
SecretDetected = false;
for(int i = 0; i <= 6; i++) { //for all layers
if ( i == 0 || Screen->LayerMap(i) != -1 ) { //dont check unvalid layers
for(int j = 0; j <= 175; j++) { //all combos
if ( Distance(Link->X, Link->Y, ComboX(j), ComboY(j)) <= BetterAgony_DetectionRadius ) //check distance
if ( (IsATriggerFlag(GetLayerComboF(i, j)) && type != 1)
|| (GetLayerComboF(i, j) == BetterAgony_DetectionFlag && type != 0) ) //check flag
SecretDetected = true;
}
}
}
}
if ( OtherFrame )
OtherFrame = false;
else
OtherFrame = true;
if ( SecretDetected ) {
if ( BetterAgony_Vibrate == 1 ) { //link vibrates using drawoffset
if ( LinkVibration == 0 ) {
Link->DrawYOffset --;
LinkOffset = true;
}
if ( LinkVibration == 3 ) {
Link->DrawYOffset ++;
LinkOffset = false;
}
LinkVibration ++;
if ( LinkVibration > 5 )
LinkVibration = 0;
}
if ( BetterAgony_SFX != 0 ) { //repeatedly played sfx
if ( SFXRepeat == 0 )
Game->PlaySound(BetterAgony_SFX);
SFXRepeat ++;
if ( SFXRepeat > BetterAgony_SFXRepeatRate )
SFXRepeat = 0;
}
if ( BetterAgony_ComboID != 0 ) //indicator combo drawn on layer 7 above link
Screen->FastCombo(7, Link->X, Link->Y-16, BetterAgony_ComboID, BetterAgony_ComboCSet, OP_OPAQUE);
}
else { //secrets not detected
LinkVibration = 0;
if ( LinkOffset )
Link->DrawYOffset ++; //revert drawoffset
LinkOffset = false;
SFXRepeat = 0;
}
Waitframe();
}
}
}
bool IsATriggerFlag(int f) {
if ( (f >= 3 && f <= 6) || f == 11 || (f >= 68 && f <= 90) ) //trigger flags
return true;
else
return false;
}