• 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?".
  • Forum moderator applications are now open! Click here for details.
  • 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,434
Posts
13
Years
  • Seen today
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
  • Age 37
  • Seen Aug 31, 2023
thank yu for this its pretty straight forward if you follow the steps
 
423
Posts
13
Years
  • Age 37
  • 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
 

Rayquaza.

Lead Dev in Pokémon Order and Chaos
702
Posts
12
Years
I'm still having trouble with the script. It keeps coming up with syntax errors and I'm unsure why.
 

FL

Pokémon Island Creator
2,434
Posts
13
Years
  • Seen today
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,434
Posts
13
Years
  • Seen today
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,434
Posts
13
Years
  • Seen today
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
  • Age 27
  • Seen Apr 9, 2021
What does this look like in a hex editor? I dont't understand what to do with these ASM commands.
 
6
Posts
10
Years
  • Age 29
  • 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