Jump to content

Photo

Power bracelet script


  • Please log in to reply
1 reply to this topic

#1 judasrising

judasrising

    I play guitar

  • Members
  • Location:Sweden but born in Finland

Posted 18 June 2017 - 02:22 PM

Hi

 

i am using this script for lift things and carry it 

// GB power bracelet
 
 
// global constants
 
const int CF_PICK = 98; // SCRIPT1, bracelet
 
const int SCRIPT_POWERBRACELET = 2; // set this to the ffc script slot assigned to PowerBracelet script when compiling
 
const int LTM_CATCHING = 148; // LTM for Link catching a block with the Power Bracelet
const int LTM_PULLING = 150; // LTM for Link pulling a block with the Power Bracelet
const int LTM_HOLDING = 149; // 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=8; //damage dealt to enemies by thrown block/bush
const int LW_BLOCK = 31; //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 = 21; // sfx played when link picks up the block
const int SFX_THROW_BLOCK = 78; // sfx played when the block is thrown
const int SFX_CRASH_BLOCK = 79; // sfx of a block crashing
 
const int INV_COMBO_ID = 248; // id af an invisible combo
const int INV_TILE_ID = 160; // id af an invisible tile
const int CRASH_SPR = 53; // sprite for a block crashing at ground
const int BUSH_SPR = 54; // sprite for a bush crashing at ground
const int LAYER_OVER = 3; // an overhead layer
 
const int NPC_ITEMSET = 192; // id of a dummy enemy with type different from "none"
 
// ------------------------------------------
 
// global variables
bool throw_disabled;
int holding_block;
bool holding_bush;
int link_catching;
 
// ------------------------------------------
 
// 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+2, 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 - 10, combo+2, 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+2, 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);
if(Link->Item[214]){
e->ItemSet = 8;
} else {
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;
}
 
I would like to have it altered so it allows to carry liftable blocks or whatever in to next screen also.
As the script is now when i carry something in to next screen it disappears.

Edited by judasrising, 18 June 2017 - 02:27 PM.


#2 Gégé

Gégé

    Senior

  • Members
  • Real Name:Gérard
  • Location:France

Posted 03 July 2017 - 04:50 PM

In ffc script UsePowerBracelet :
 

                    
     while(throw_disabled || (!Link->InputA && !Link->InputB)){
          if(!Link->InputA && !Link->InputB) throw_disabled = false;
          Screen->FastCombo(LAYER_OVER, Link->X, Link->Y - 10, combo+2, 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!

Try this : I do not know if it will work.
 

                    
     while(throw_disabled || (!Link->InputA && !Link->InputB)){
          if(!Link->InputA && !Link->InputB) throw_disabled = false;
          Screen->FastCombo(LAYER_OVER, Link->X, Link->Y - 10, combo+2, cset, 128 );
          if(Link->Invisible || (Link->Action != LA_NONE && Link->Action != LA_WALKING && Link->Action != LA_SCROLLING)) break; // break if falling in pit or water!
          Waitframe();
          }
          if(Link->Invisible || (Link->Action != LA_NONE && Link->Action != LA_WALKING && Link->Action != LA_SCROLLING))  break; // break if falling in pit or water!

Edited by Gégé, 03 July 2017 - 04:57 PM.



1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users