• Just a reminder that providing specifics on, sharing links to, or naming websites where ROMs can be accessed is against the rules. If your post has any of this information it will be removed.
  • Ever thought it'd be cool to have your art, writing, or challenge runs featured on PokéCommunity? Click here for info - we'd love to spotlight your work!
  • Our weekly protagonist poll is now up! Vote for your favorite Conquest protagonist in the poll by clicking here.
  • 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,545
    Posts
    14
    Years
    • Online now
    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:
    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.
     
    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
     
    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.
     
    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.
     
    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.
     
    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.
     
    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