• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

[Essentials Tutorial] Turn HM moves into items

FL

Pokémon Island Creator
2,449
Posts
13
Years
    • Seen yesterday
    In this tutorial I explain how to turn HMs and/or other moves that work outside of battle to items.

    First, in PokemonHiddenMoves script section comment the 'HiddenMoveHandlers::CanUseMove' proc (all the code, inclusive the '})'). Change the line '(!$DEBUG && !movefinder)' (there's one for each move that can be used outside menu) to '(!$DEBUG && $PokemonBag.pbQuantity(PBItems::YOURITEMINTERNALNAME)==0)'. Before line 'speciesname = (movefinder) ? movefinder.name : $Trainer.name', add line 'movefinder=nil' for won't show pokémon name and animation. There's a item example for item.txt PBS:

    Code:
    601,SURFBOARD,Surfboard,Surfboards,8,0,"Insert description here.",0,0,6

    Adding the move in the "Use" item command

    At this point, the item is already working except the "Use" command. This command is almost unnecessary for some moves like Cut and Surf, but is vital for others like Fly and Flash.

    In item PBS data change the '0,0,6' to '2,0,6'. Copy the content of 'HiddenMoveHandlers::CanUseMove' proc (the code between the first line and the '})') and put between a method who start in the first line like 'def canUseMoveSurf?' and ends with 'end'. After method first line (the one who starts with "def"), add line 'showmsg = true'. Do the same with 'HiddenMoveHandlers::UseMove' and name the method something like 'def useMoveSurf'. For this last one remember to change pokemon.name to $Trainer.name, pbHiddenMoveAnimation(pokemon) to pbHiddenMoveAnimation(nil) and PBMoves.getName(move) to the move name (e. g. "Surf"). In PokemonItemEffects script section, add the two item handlers:

    Code:
    ItemHandlers::UseFromBag.add(:YOURITEMINTERNALNAME,proc{|item|
       next canUseMoveSurf? ? 2 : 0
    })
    
    ItemHandlers::UseInField.add(:YOURITEMINTERNALNAME,proc{|item|
       useMoveSurf if canUseMoveSurf?
    })

    I suggest to change the text like "used Surf" to "used Surfboard". Mark HIDDENMOVESCOUNTBADGES as true and all badges to 0 to remove the badge requirements.

    Example

    I will made an example of the adding in the "use" item command using a knife item for Cut. First, I changed the eighth value to 2.

    Code:
    602,KNIFE,Knife,Knifes,8,0,"Cut down thin trees.",2,0,6

    I copied the two HiddenMoveHandlers below (these are in base Essentials):

    Code:
    HiddenMoveHandlers::CanUseMove.add(:CUT,proc{|move,pkmn,showmsg|
       return false if !pbCheckHiddenMoveBadge(BADGEFORCUT,showmsg)
       facingEvent = $game_player.pbFacingEvent
       if !facingEvent || facingEvent.name!="Tree"
         Kernel.pbMessage(_INTL("Can't use that here.")) if showmsg
         return false
       end
       return true
    })
    
    HiddenMoveHandlers::UseMove.add(:CUT,proc{|move,pokemon|
       if !pbHiddenMoveAnimation(pokemon)
         Kernel.pbMessage(_INTL("{1} used {2}!",pokemon.name,PBMoves.getName(move)))
       end
       facingEvent = $game_player.pbFacingEvent
       if facingEvent
         pbSmashEvent(facingEvent)
       end
       return true
    })

    For making the two methods below. I added after the handlers:

    Code:
    def canUseMoveCut?
       showmsg = true
       return false if !pbCheckHiddenMoveBadge(BADGEFORCUT,showmsg)
       facingEvent = $game_player.pbFacingEvent
       if !facingEvent || facingEvent.name!="Tree"
         Kernel.pbMessage(_INTL("Can't use that here.")) if showmsg
         return false
       end
       return true
    end
    
    def useMoveCut
       if !pbHiddenMoveAnimation(nil)
         Kernel.pbMessage(_INTL("{1} used {2}!",$Trainer.name,"Cut"))
       end
       facingEvent = $game_player.pbFacingEvent
       if facingEvent
         pbSmashEvent(facingEvent)
       end
       return true
    end

    And I added at PokemonItemEffects script section:

    Code:
    ItemHandlers::UseFromBag.add(:KNIFE,proc{|item|
       next canUseMoveCut? ? 2 : 0
    })
    
    ItemHandlers::UseInField.add(:KNIFE,proc{|item|
       useMoveCut if canUseMoveCut?
    })
     
    Last edited:

    Rayquaza.

    Lead Dev in Pokémon Order and Chaos
    702
    Posts
    12
    Years
  • I too am finding it difficult to understand what you've stated in the 'Adding the move in the "Use" item command'.

    Is there no way that it could be better explained?
     
    423
    Posts
    13
    Years
    • Seen Aug 31, 2023
    well bit busy atm (sortting new laptop out) but when able (prob boxing day) i'll see if i can do a better tutorial
     

    FL

    Pokémon Island Creator
    2,449
    Posts
    13
    Years
    • Seen yesterday
    I'm still having trouble with the script. It keeps coming up with syntax errors and I'm unsure why.
    Post the script parts here and I try to help you.

    Your problem may be the same problem of other people that will uses this tutorial.
     
    1,224
    Posts
    10
    Years
  • How does one alter this code for moves like Fly or Flash in which the
    Spoiler:
    lines do not exist? I am getting syntax errors.
     

    Derxwna Kapsyla

    Derxwna "The Badman" Kapsyla
    437
    Posts
    12
    Years
  • I'm actually curious about how to bind Fly to an item as well. My scripters and I have been unable to really figure out how to bind what fly does to an individual item, despite searching through the code for fly to find a clue, and I have it planned for a Fly item to appear in the next demo of my game, and I'd rather not delay the item or the game if it's unavoidable
     

    FL

    Pokémon Island Creator
    2,449
    Posts
    13
    Years
    • Seen yesterday
    How does one alter this code for moves like Fly or Flash in which the
    Spoiler:
    lines do not exist? I am getting syntax errors.
    For these moves that only can be triggered at menu screen just don't change HiddenMoveHandlers::CanUseMove code since it's can't be called when the player haven't a pokémon with this move.
     
    1,224
    Posts
    10
    Years
  • I can't get the item to be useable for fly. For the cut example, that line you said to initially change is not located in CanUseMove, it's in Kernel.pbCut, and returns sytnax errors if you change it.
    Sorry if I'm just incompetent, but it's really confusing me.
     

    FL

    Pokémon Island Creator
    2,449
    Posts
    13
    Years
    • Seen yesterday
    Sorry! Fly is an exception since $PokemonTemp.flydata had some definitions at the summary screen, so the methods should be:

    Code:
    def canUseMoveFly?
      if !$DEBUG &&
        !(HIDDENMOVESCOUNTBADGES ? $Trainer.numbadges>=BADGEFORFLY : $Trainer.badges[BADGEFORFLY])
        Kernel.pbMessage(_INTL("Sorry, a new Badge is required."))
        return false
      end
      if $game_player.pbHasDependentEvents?
        Kernel.pbMessage(_INTL("It can't be used when you have someone with you."))
        return false
      end
      if !pbGetMetadata($game_map.map_id,MetadataOutdoor)
        Kernel.pbMessage(_INTL("Can't use that here."))
        return false
      end
      return true
    end  
    
    def useMoveFly
      scene=PokemonRegionMapScene.new(-1,false)
      screen=PokemonRegionMap.new(scene)
      ret=screen.pbStartFlyScreen
      return false if !ret
      $PokemonTemp.flydata=ret
      if !$PokemonTemp.flydata
        Kernel.pbMessage(_INTL("Can't use that here."))
      end
      if !pbHiddenMoveAnimation(nil)
        Kernel.pbMessage(_INTL("{1} used {2}!",$Trainer.name,"Fly"))
      end
      pbFadeOutIn(99999){
        Kernel.pbCancelVehicles
        $game_temp.player_new_map_id=$PokemonTemp.flydata[0]
        $game_temp.player_new_x=$PokemonTemp.flydata[1]
        $game_temp.player_new_y=$PokemonTemp.flydata[2]
        $PokemonTemp.flydata=nil
        $game_temp.player_new_direction=2
        $scene.transfer_player
        $game_map.autoplay
        $game_map.refresh
      }
      pbEraseEscapePoint
      return true
    end

    Tested.
     

    Mugendai

    Glitchologist
    11
    Posts
    13
    Years
    • Seen Apr 17, 2014
    This is my attempt at turning Fly into a key item, called the Mini Teleporter, but it doesn't work. HM Fly works normally, but if I press F5, it says "Can't use that here." and if I bypass that part of the code, the game has a scripting error.

    I assume it's because specifically $PokemonTemp.flydata is missing; $PokemonTemp itself exists to the code. How would I fix this?

    Code:
    ItemHandlers::UseInField.add(:TELEPORTER,proc{|item|
       if !$PokemonTemp.flydata || !pbGetMetadata($game_map.map_id,MetadataOutdoor)
         Kernel.pbMessage(_INTL("Can't use that here."))
         next false
       end
       if $game_player.pbHasDependentEvents?
         Kernel.pbMessage(_INTL("It can't be used when you have someone with you."))
         next false
       end
       Kernel.pbMessage(_INTL("{1} used the Mini Teleporter!",$Trainer.name))
       pbFadeOutIn(99999){
          $game_temp.player_new_map_id=$PokemonTemp.flydata[0]
          $game_temp.player_new_x=$PokemonTemp.flydata[1]
          $game_temp.player_new_y=$PokemonTemp.flydata[2]
          $PokemonTemp.flydata=nil
          $game_temp.player_new_direction=2
          $scene.transfer_player
          $game_map.autoplay
          $game_map.refresh
       }
       pbEraseEscapePoint
       next true
    })
    Here's the error if I bypass the "Can't use that here." message:

    Code:
    ---------------------------
    Touhoumon Faith & Prayer Version 1.8
    ---------------------------
    Exception: NoMethodError
    
    Message: undefined method `[]' for nil:NilClass
    
    PokemonItemEffects:996
    
    PokemonItemEffects:995:in `pbFadeOutIn'
    
    PokemonItemEffects:995
    
    PokemonItemEffects:985:in `call'
    
    PBEvent:150:in `trigger'
    
    PokemonItems:186:in `triggerUseInField'
    
    PokemonItems:379:in `pbUseKeyItemInField'
    
    PokemonField:2276:in `pbUseKeyItem'
    
    Scene_Map:170:in `update'
    
    Scene_Map:68:in `main'
    
    
    
    This exception was logged in 
    
    C:\Users\Mugendai\Saved Games/Touhoumon Faith _ Prayer Version 1_8/errorlog.txt.
    
    Press Ctrl+C to copy this message to the clipboard.
    ---------------------------
    OK   
    ---------------------------

    Edit: Sorry, didn't see new post above.
     

    C me

    Creator of Pokemon League Of Legends
    681
    Posts
    10
    Years
    • Seen Apr 9, 2021
    What does this look like in a hex editor? I dont't understand what to do with these ASM commands.
     

    Maruno

    Lead Dev of Pokémon Essentials
    5,286
    Posts
    16
    Years
    • Seen yesterday
    This isn't the ROM Hacking section. We don't use hex editors here.
     
    6
    Posts
    10
    Years
    • Seen Jul 20, 2018
    i am getting this message for when making a surfboard as an item, i do not know what i am doing wrong i followed everything, can anyone offer help? am i not seeing my mistake?

    ---------------------------
    Pokemon Essentials
    ---------------------------
    Exception: NameError

    Message: undefined local variable or method `terrain' for nil:NilClass

    PokemonHiddenMoves:455:in `canUseMoveSurf?'

    PokemonItemEffects:131

    PokemonItemEffects:130:in `call'

    PBEvent:150:in `trigger'

    PokemonItems:165:in `triggerUseFromBag'

    PokemonItems:520:in `pbUseItem'

    PokemonBag:677:in `pbStartScreen'

    PokemonBag:651:in `loop'

    PokemonBag:716:in `pbStartScreen'

    PokemonPauseMenu:189:in `pbStartPokemonMenu'



    This exception was logged in
     
    Back
    Top