Go Back   The PokéCommunity Forums > Creative Discussions > Game Development > Scripts & Tutorials
Reload this Page [Essentials tutorial] Turn HM moves to items

Notices
For all updates, view the main page.

Scripts & Tutorials This forum is for scripts and code, as well as all kinds of tutorials, software, tools and so forth. Remember to give credit!
The thread revival limit does not apply here.



Reply
 
Thread Tools
  #1    
Old July 13th, 2013 (01:29 PM). Edited December 26th, 2013 by FL.
FL's Avatar
FL FL is offline
Pokémon Island Creator
 
Join Date: Sep 2010
Gender: Male
Posts: 1,405
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 'if $DEBUG || movefinder' (there's one for each move) to 'if $DEBUG || ($PokemonBag.pbQuantity(PBItems::YOURITEMINTERNALNAME)>0'. There's a item example for item.txt PBs:

Code:
601,SURFBOARD,Surfboard,8,0,"Insert description here.",0,0,6
Adding the move in the "Use" item command

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'. 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 seventh value to 2.

Code:
602,KNIFE,Knife,8,0,"Cut down thin trees.",2,0,6
So I made the two methods before the two handlers:

Code:
def canUseMoveCut?
   if !$DEBUG &&
      !(HIDDENMOVESCOUNTBADGES ? $Trainer.numbadges>=BADGEFORCUT : $Trainer.badges[BADGEFORCUT])
     Kernel.pbMessage(_INTL("Sorry, a new Badge is required."))
     return false
   end
   facingEvent=$game_player.pbFacingEvent
   if !facingEvent || facingEvent.name!="Tree"
     Kernel.pbMessage(_INTL("Can't use that here."))
     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
     facingEvent.erase
     $PokemonMap.addErasedEvent(facingEvent.id)
   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?
})
__________________
Reply With Quote
  #2    
Old December 22nd, 2013 (09:25 PM).
arktyz arktyz is offline
 
Join Date: Sep 2013
Posts: 5
i am confused as to what and where to comment, and change in the hiddenmovehandlers sections
Reply With Quote
  #3    
Old December 23rd, 2013 (02:24 AM).
Rayquaza.'s Avatar
Rayquaza. Rayquaza. is offline
Lead Dev in Pokémon Chaos
 
Join Date: Sep 2011
Location: United Kingdom
Age: 18
Gender: Male
Nature: Adamant
Posts: 598
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?
__________________
Reply With Quote
  #4    
Old December 23rd, 2013 (08:37 AM).
p.claydon p.claydon is offline
 
Join Date: Jan 2011
Gender:
Posts: 300
thank yu for this its pretty straight forward if you follow the steps
Reply With Quote
  #5    
Old December 23rd, 2013 (09:34 AM).
Rayquaza.'s Avatar
Rayquaza. Rayquaza. is offline
Lead Dev in Pokémon Chaos
 
Join Date: Sep 2011
Location: United Kingdom
Age: 18
Gender: Male
Nature: Adamant
Posts: 598
Quote originally posted by p.claydon:
thank yu for this its pretty straight forward if you follow the steps
I am following the steps. But the middle section isn't very clear to me.
__________________
Reply With Quote
  #6    
Old December 24th, 2013 (03:47 AM).
p.claydon p.claydon is offline
 
Join Date: Jan 2011
Gender:
Posts: 300
well bit busy atm (sortting new laptop out) but when able (prob boxing day) i'll see if i can do a better tutorial
Reply With Quote
  #7    
Old December 24th, 2013 (05:23 AM).
Rayquaza.'s Avatar
Rayquaza. Rayquaza. is offline
Lead Dev in Pokémon Chaos
 
Join Date: Sep 2011
Location: United Kingdom
Age: 18
Gender: Male
Nature: Adamant
Posts: 598
Okay. Does that mean you and FL are the same person or something?
__________________
Reply With Quote
  #8    
Old December 26th, 2013 (06:34 AM).
FL's Avatar
FL FL is offline
Pokémon Island Creator
 
Join Date: Sep 2010
Gender: Male
Posts: 1,405
Topic updated with an example.

Quote originally posted by Rayquaza.:
Okay. Does that mean you and FL are the same person or something?
Yeah! And in this post I'm talking with myself!

Just joking. I'm not p.claydon.
__________________
Reply With Quote
  #9    
Old December 27th, 2013 (03:51 AM).
Rayquaza.'s Avatar
Rayquaza. Rayquaza. is offline
Lead Dev in Pokémon Chaos
 
Join Date: Sep 2011
Location: United Kingdom
Age: 18
Gender: Male
Nature: Adamant
Posts: 598
I'm still having trouble with the script. It keeps coming up with syntax errors and I'm unsure why.
__________________
Reply With Quote
  #10    
Old December 28th, 2013 (11:49 AM).
FL's Avatar
FL FL is offline
Pokémon Island Creator
 
Join Date: Sep 2010
Gender: Male
Posts: 1,405
Quote originally posted by Rayquaza.:
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.
__________________
Reply With Quote
  #11    
Old March 23rd, 2014 (12:01 AM).
mej71's Avatar
mej71 mej71 is online now
 
Join Date: Mar 2014
Location: Omnipresence
Gender: Male
Posts: 734
How does one alter this code for moves like Fly or Flash in which the
Spoiler:
if $DEBUG || movefinder
lines do not exist? I am getting syntax errors.
Reply With Quote
  #12    
Old March 24th, 2014 (08:37 PM).
Derxwna Kapsyla's Avatar
Derxwna Kapsyla Derxwna Kapsyla is offline
X-Class Project, Derxwna, #003
 
Join Date: Jun 2011
Location: Margate, FL
Age: 22
Gender: Male
Nature: Lax
Posts: 282
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
__________________
Development Blog:
For more information future news and updates to any projects, the following blogs are where I post information. You can usually hit me with a message there when it comes to bug reports or feedback, or general conversation about something.
Game Projects:
In Progress:
Reply With Quote
  #13    
Old March 25th, 2014 (10:22 AM).
FL's Avatar
FL FL is offline
Pokémon Island Creator
 
Join Date: Sep 2010
Gender: Male
Posts: 1,405
Quote originally posted by mej71:
How does one alter this code for moves like Fly or Flash in which the
Spoiler:
if $DEBUG || movefinder
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.
__________________
Reply With Quote
  #14    
Old March 25th, 2014 (01:48 PM).
mej71's Avatar
mej71 mej71 is online now
 
Join Date: Mar 2014
Location: Omnipresence
Gender: Male
Posts: 734
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.
Reply With Quote
  #15    
Old March 27th, 2014 (12:34 PM).
FL's Avatar
FL FL is offline
Pokémon Island Creator
 
Join Date: Sep 2010
Gender: Male
Posts: 1,405
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.
__________________
Reply With Quote
  #16    
Old March 27th, 2014 (12:40 PM).
Mugendai's Avatar
Mugendai Mugendai is offline
Glitchologist
 
Join Date: Jun 2010
Posts: 11
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.
Reply With Quote
  #17    
Old March 27th, 2014 (12:44 PM).
mej71's Avatar
mej71 mej71 is online now
 
Join Date: Mar 2014
Location: Omnipresence
Gender: Male
Posts: 734
Worked. Thank you so much!
Reply With Quote
  #18    
Old March 28th, 2014 (05:27 AM).
Mugendai's Avatar
Mugendai Mugendai is offline
Glitchologist
 
Join Date: Jun 2010
Posts: 11
It worked for me as well, thanks.
Reply With Quote
  #19    
Old November 13th, 2014 (04:55 AM).
pokenoobend's Avatar
pokenoobend pokenoobend is online now
 
Join Date: Jan 2014
Posts: 106
What does this look like in a hex editor? I dont't understand what to do with these ASM commands.
Reply With Quote
  #20    
Old November 13th, 2014 (12:17 PM).
Maruno's Avatar
Maruno Maruno is online now
Lead Dev of Pokémon Essentials
Moderator
 
Join Date: Jan 2008
Location: England
Posts: 3,970
This isn't the ROM Hacking section. We don't use hex editors here.
__________________
Reply With Quote
Reply
Quick Reply

Sponsored Links
Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are UTC -8. The time now is 10:36 AM.