Jump to content

Photo

Power Bracelet Script

power bracelet

  • Please log in to reply
7 replies to this topic

#1 Shadowblitz16

Shadowblitz16

    Illustrious

  • Members

Posted 28 December 2016 - 07:16 PM

umm I was using the power bracelet script that is in the script database. 

does anybody know why the following bugs are happening?

 

- when I lift the combo the lweapon that is supposed to be drawn over links head is actually just the combo I lifted

- when I get hurt the rock I'm carrying just disappears

- the crash sprites only works if I don't hit an enemy

- the LTM's are not working link just uses his walking animation

- possible sound issues. right now I don't know since I have no working stereo jack

 

Edit: here is what it looks like

https://gfycat.com/GentleInsecureJenny

 

and this is the scripts
 


import "Headers/Header.zh"

import "Scripts/NES/Global/PowerBraclet.z"

import "Scripts/NES/FFC/FreeFormDoors.z"
import "Scripts/NES/FFC/PushSecret.z"
import "Scripts/NES/FFC/HoleLava.z"

//import "Scripts/NES/NPC/Mothula.z"

global script Active
{
	
	void run()
	{
		//ExtendEnemies()
		holding_block = 0;
		while(true)
		{
			PowerBracelet();
			Waitframe();
		}
	}
}

global script OnExit
{
	void run()
	{
		Link->Item[LTM_CATCHING] = false;
		Link->Item[LTM_HOLDING] = false;
		Link->Item[LTM_PULLING] = false;
		holding_block = 0;
		holding_bush = false;
		link_catching = 0;	
	}
}
// GB power bracelet

// global constants

const int CF_PICK = 98; // SCRIPT1, bracelet

const int SCRIPT_POWERBRACELET = 6; // set this to the ffc script slot assigned to PowerBracelet script when compiling

const int LTM_CATCHING = 2; // LTM for Link catching a block with the Power Bracelet
const int LTM_PULLING = 4; // LTM for Link pulling a block with the Power Bracelet
const int LTM_HOLDING = 6; // LTM for Link holding a block with the Power Bracelet

const int BLOCK_VH=4; //thrown block/bush horizontal initial velocity
const int BLOCK_VV=0; //thrown block/bush vertical initial velocity
const int BLOCK_DMG=32; //damage dealt to enemies by thrown block/bush
const int LW_BLOCK = 144; //id of a lweapon to be used as thrown block
const float BLOCK_FALL = 0.5; //gravity acceleration for block in sideview screens
const int PB_PULL_TIME=15; // num of frames to wait for pickup with PB
const int PB_UNDERCOMBO= -1; // combo to set after picking up a block; set a negative value to have a shift of the original combo

const int SFX_PICKUP_BLOCK = 0; // sfx played when link picks up the block
const int SFX_THROW_BLOCK = 0; // sfx played when the block is thrown
const int SFX_CRASH_BLOCK = 0; // sfx of a block crashing

const int INV_COMBO_ID = 8; // id af an invisible combo
const int INV_TILE_ID = 28780; // id af an invisible tile
const int CRASH_SPR = 89; // sprite for a block crashing at ground
const int BUSH_SPR = 90; // sprite for a bush crashing at ground
const int LAYER_OVER = 3; // an overhead layer

const int NPC_ITEMSET = 182; // id of a dummy enemy with type different from "none"

// ------------------------------------------

// global variables
bool throw_disabled;
int holding_block;
bool holding_bush;
int link_catching;


// ------------------------------------------

// Example of Global Scripts (comment this out if using other global scripts in the quest)

//global script Slot_2{
//	void run(){
//		holding_block = 0;
//		while(true){
//			PowerBracelet();
//			Waitframe();
//		}
//	}
//}

//global script Slot_3{
//  void run(){
//		Link->Item[LTM_CATCHING] = false;
//		Link->Item[LTM_HOLDING] = false;
//		Link->Item[LTM_PULLING] = false;
//		holding_block = 0;
//		holding_bush = false;
//		link_catching = 0;
//	}
//}

// ------------------------------------------

// global function to add to the global script
void PowerBracelet(){
if(Link->Item[LTM_HOLDING]){
if(CountFFCsRunning(SCRIPT_POWERBRACELET)==0 && holding_block>0){
holding_block = 0;
Link->Item[LTM_HOLDING] = false;
Link->Item[LTM_CATCHING] = false;
Link->Item[LTM_PULLING] = false;
}
}
}

// ------------------------------------------

// Item script
item script PowerBracelet{
void run(){
// if(holding_block==0 && holding_item==0 && holding_bomb==0){
if(holding_block==0){ // use this line if not using GB_Shop and GB_Bombs
if(!link_catching && isSolid(TouchedX(),TouchedY())){
link_catching=1;
int args[] = {0,0,0,0,0,0,0,0};
int id = RunFFCScript(SCRIPT_POWERBRACELET, args);
}
}
}
}

// ------------------------------------------

// FFC script (automatically called by the item script - you don't have to place any ffc on the screen for this)
ffc script UsePowerBracelet{
void run(int input){
// initialization
this->Data = INV_COMBO_ID;
this->X = -16;
this->Y = -16;
int counter = 0;

while(Link->InputA || Link->InputB){
// set link catching the wall / block / bush
if(!Link->Item[LTM_CATCHING]) Link->Item[LTM_CATCHING] = true;

// to fix a bug...
if(!isSolid(TouchedX(),TouchedY())) break;

// if pressing opposite direction, set link pulling
if(OppositeDir()){
if(!Link->Item[LTM_PULLING]) Link->Item[LTM_PULLING] = true;
counter ++;
}
else{
if(Link->Item[LTM_PULLING]) Link->Item[LTM_PULLING] = false;
counter = 0;
}

// if pulling a block or bush for 15 frames or more, pick it up
if(counter>PB_PULL_TIME){
int loc=TouchedComboLoc();
if(Screen->ComboF[loc]==CF_PICK || Screen->ComboI[loc]==CF_PICK){
link_catching = 0;
int combo = Screen->ComboD[loc];
int cset = Screen->ComboC[loc];
if(isBush(Screen->ComboT[loc])) holding_bush = true;
else holding_bush = false;
if(PB_UNDERCOMBO<0) Screen->ComboD[loc] += (-PB_UNDERCOMBO);
else Screen->ComboD[loc] = PB_UNDERCOMBO;
ItemSetAt(IS_DEFAULT,loc);
Game->PlaySound(SFX_PICKUP_BLOCK);
throw_disabled = true;

// mid-air block
for(int i=0;i<16;i++){
int blockX = (Link->X+ComboX(loc))/2;
int blockY = Link->Y-7;
Screen->FastCombo(LAYER_OVER, blockX, blockY, combo, cset, 128 );
WaitNoAction();
}

// set link holding
holding_block = 1;
if(!Link->Item[LTM_HOLDING]) Link->Item[LTM_HOLDING] = true;
while(throw_disabled || (!Link->InputA && !Link->InputB)){
if(!Link->InputA && !Link->InputB) throw_disabled = false;
Screen->FastCombo(LAYER_OVER, Link->X, Link->Y - 14, combo, cset, 128 );
if(Link->Invisible || (Link->Action != LA_NONE && Link->Action != LA_WALKING)) break; // break if falling in pit or water!
Waitframe();
}
if(Link->Invisible || (Link->Action != LA_NONE && Link->Action != LA_WALKING)) break; // break if falling in pit or water!
counter = 0;
holding_block = 0;
if(Link->Item[LTM_CATCHING]) Link->Item[LTM_CATCHING] = false;
if(Link->Item[LTM_PULLING]) Link->Item[LTM_PULLING] = false;
if(Link->Item[LTM_HOLDING]) Link->Item[LTM_HOLDING] = false;

// throw block
lweapon w = CreateLWeaponAt(LW_SCRIPT1,Link->X,Link->Y);
w->Damage = BLOCK_DMG;
w->OriginalTile = INV_TILE_ID;
w->NumFrames = 1;
w->Dir = Link->Dir;
w->Step = Floor(BLOCK_VH*100);
w->DrawYOffset = -14;
w->HitXOffset = -4;
w->HitYOffset = -4;
w->HitWidth = 16 + 8;
w->HitHeight = 16 + 8;
w->HitZHeight = 16 + 8;
Game->PlaySound(SFX_THROW_BLOCK);
while(w->DrawYOffset<0 && !isSolid(w->X+8,w->Y+ 8) && !isOutOfScreen(w->X,w->Y,16,16)){
if(counter<4) Link->Action = LA_ATTACKING;
w->DrawYOffset += Floor(counter*GRAVITY) - BLOCK_VV;
Screen->FastCombo(LAYER_OVER, w->X, w->Y + w->DrawYOffset, combo, cset, 128 );
Waitframe();
counter ++;
}
if(holding_bush) Game->PlaySound(SFX_GRASSCUT);
else Game->PlaySound(SFX_CRASH_BLOCK);
if(w->isValid()){
w->DeadState = WDS_DEAD;
if(holding_bush) CreateGraphicAt(BUSH_SPR,w->X,w->Y + w->DrawYOffset);
else CreateGraphicAt(CRASH_SPR,w->X,w->Y + w->DrawYOffset);
}
break;
}
}
NoMoveAction();
Waitframe();
}
link_catching = 0;
holding_block = 0;
counter = 0;
if(Link->Item[LTM_CATCHING]) Link->Item[LTM_CATCHING] = false;
if(Link->Item[LTM_PULLING]) Link->Item[LTM_PULLING] = false;
if(Link->Item[LTM_HOLDING]) Link->Item[LTM_HOLDING] = false;
this->Data = 0;
Quit();
}
}

// ------------------------------------------

// utility functions
bool isBush(int ct){
if(ct==CT_BUSH) return true;
if(ct==CT_BUSHC) return true;
if(ct==CT_BUSHNEXT) return true;
if(ct==CT_BUSHNEXTC) return true;
if(ct==CT_FLOWERS) return true;
if(ct==CT_FLOWERSC) return true;
return false;
}

// ------------------------------------------

// x touched by Link
int TouchedX(){
int x;
if(Link->Dir == DIR_UP) x = Link->X+8;
else if(Link->Dir == DIR_DOWN) x = Link->X+8;
else if(Link->Dir == DIR_LEFT) x = Link->X-2;
else if(Link->Dir == DIR_RIGHT) x = Link->X+18;
return x;
}

// y touched by Link
int TouchedY(){
int y;
if(Link->Dir == DIR_UP) y = Link->Y+6;
else if(Link->Dir == DIR_DOWN) y = Link->Y+18;
else if(Link->Dir == DIR_LEFT) y = Link->Y+8;
else if(Link->Dir == DIR_RIGHT) y = Link->Y+8;
return y;
}

// location of the touched combo
int TouchedComboLoc(){
int loc;
loc = ComboAt( TouchedX(), TouchedY() );
return loc;
}

// create a dummy npc and kill it, giving an item
void ItemSetAt(int itemset,int loc){
npc e = Screen->CreateNPC(NPC_ITEMSET);
e->ItemSet = itemset;
if(e->isValid()){
e->X = loc%16*16;
e->Y = loc-loc%16;
}
e->HP = HP_SILENT;
}

// function to test if (x,y) is out of the screen
bool isOutOfScreen(int x, int y, int dx, int dy){
if((x+dx) > 16*16) return true;
else if(x < 0) return true;
else if((y+dy) > 16*11) return true;
else if(y < 0) return true;
else return false;
}

// create a sprite
int CreateGraphicAt(int sprite, int x, int y){
eweapon e = Screen->CreateEWeapon(EW_SCRIPT1);
e->HitXOffset = 500;
e->UseSprite(sprite);
e->DeadState = e->NumFrames*e->ASpeed;
e->X = x;
e->Y = y;
return e->DeadState;
}

// inhibit all the movement actions
void NoMoveAction(){
Link->InputUp = false;
Link->InputDown = false;
Link->InputLeft = false;
Link->InputRight = false;
}

// this utility routine by Saffith checks for walkability of combos
bool isSolid(int x, int y){
if(x<0 || x>255 || y<0 || y>175) return false;
int mask=1111b;
if(x%16< 8) mask&=0011b;
else mask&=1100b;
if(y%16< 8) mask&=0101b;
else mask&=1010b;
return (!(Screen->ComboS[ComboAt(x, y)]&mask)==0);
}

// gives true if Link pushes the opposite direction of his facing direction
bool OppositeDir(){
if(Link->InputDown && Link->Dir==DIR_UP) return true;
if(Link->InputUp && Link->Dir==DIR_DOWN) return true;
if(Link->InputRight && Link->Dir==DIR_LEFT) return true;
if(Link->InputLeft && Link->Dir==DIR_RIGHT) return true;
else return false;
}

// ------------------------------------------

Edited by Shadowblitz16, 28 December 2016 - 08:44 PM.


#2 Quanta

Quanta

    King of Thieves

  • Members
  • Real Name:Willem
  • Location:Earth

Posted 28 December 2016 - 11:34 PM

It seems to me that the link tile modifier is set in the const int variables (LTM catching,pulling and holding), which is 2, 4 and 6, so set that to the link tile modifier you want. The errors with the combo will probably just have to be fixed with using a different rock tile with a transparent background.
The rest I think are not 'bugs', but limitations in the script itself (such as the rock disappearing when you get hit by an enemy or the crash effect not working on them, although I may be entirely wrong.



#3 judasrising

judasrising

    I play guitar

  • Members
  • Location:Sweden but born in Finland

Posted 29 December 2016 - 06:29 AM

Hi
I have that bracelet script fully setuped and working so if you need help with the setup or a testquest about it,let me know.

#4 Shadowblitz16

Shadowblitz16

    Illustrious

  • Members

Posted 29 December 2016 - 01:16 PM

@Ganondorf I have set the LTM constants to 2, 4, and 6 within the script

when you say rock tile with transparent background do you mean the combo? if so I would have to use layers which I don't want to do.

 

 

@judasrising that would be nice. I really want to use it.

I was thinking setup and a test quest.

 

I was trying to set up the LTM's by taking the tile I want and then subtracting the first tile of Link's walking up animation in the Link sprite editor

as for the rock being transparent I thought the tile drawn above link's head when he is walking around was the lweapon defined for LW_BLOCK.



#5 judasrising

judasrising

    I play guitar

  • Members
  • Location:Sweden but born in Finland

Posted 29 December 2016 - 01:28 PM

@Ganondorf I have set the LTM constants to 2, 4, and 6 within the script

when you say rock tile with transparent background do you mean the combo? if so I would have to use layers which I don't want to do.

 

 

@judasrising that would be nice. I really want to use it.

I was thinking setup and a test quest.

 

I was trying to set up the LTM's by taking the tile I want and then subtracting the first tile of Link's walking up animation in the Link sprite editor

as for the rock being transparent I thought the tile drawn above link's head when he is walking around was the lweapon defined for LW_BLOCK.

Okay can you wait until the weekend,and i send a testquest about it and the scriptfile my bracelet is altered a bit,it is allmost the same script and same setup.


Edited by judasrising, 29 December 2016 - 01:58 PM.


#6 Shadowblitz16

Shadowblitz16

    Illustrious

  • Members

Posted 29 December 2016 - 01:55 PM

ok I can wait thanks


  • judasrising likes this

#7 Quanta

Quanta

    King of Thieves

  • Members
  • Real Name:Willem
  • Location:Earth

Posted 29 December 2016 - 06:12 PM

2,4 and 6 for the LTM doesn't really seem right..
Can I see the tile sheet for link?


Edited by Ganondorf, 29 December 2016 - 06:12 PM.


#8 Shadowblitz16

Shadowblitz16

    Illustrious

  • Members

Posted 29 December 2016 - 06:26 PM

sure here it is


Edited by Shadowblitz16, 29 December 2016 - 06:26 PM.



1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users