Advertisement
TechSkylander1518

Little Details

Nov 13th, 2023 (edited)
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.04 KB | None | 0 0
  1. Welcome back to WatchMojo, where today we're counting down our top ten picks for easy ways to give your Pokémon fangame an extra bit of professional polish.
  2.  
  3. *ahem*
  4.  
  5. After judging the last game jam, I noticed there were a few common stumbles I saw devs run into - not anything that it a worse experience overall, just little things that I thought could be improved on! A lot of these are code-based, so I figured I'd make some quick tutorials on them! The rest is pretty simple stuff, but I figured I'd make my case for them all the same, haha.
  6.  
  7. This tutorial is being written in v21, and I will try to keep it up-to-date as new Essentials versions are released. Most of it should still be applicable for earlier versions, but some things will be pretty different.
  8. [HEADING=1]Aesthetic[/HEADING]
  9.  
  10. [HEADING=2]Changing the title cry[/HEADING]
  11. This is one that I feel like I've seen asked a lot. I think what trips up new devs is that it's a change that requires you to look through the code a little more, when a lot of changes are usually done via constants at the top of scripts. But once you find it, it's really not hard at all!
  12.  
  13. We know we're looking in UI_SplashesAndTitleScreen, and we know what's happening is that a cry is being played... so let's Ctrl+F for "cry" and see what we find!
  14. [code=Ruby]
  15. # Play random cry
  16. species_keys = GameData::Species.keys
  17. species_data = GameData::Species.get(species_keys.sample)
  18. Pokemon.play_cry(species_data.species, species_data.form)
  19. [/code]
  20. (Maruno's really good about leaving comments to help explain what code is being used for! It really makes it easier to understand and navigate scripts!)
  21.  
  22. We actually don't even need those first two lines - that's the part that's picking a random species and form to play. All we need is this line -
  23. [code=Ruby]
  24. Pokemon.play_cry(species_data.species, species_data.form)
  25. [/code]
  26. Just a simple method with two arguments, the species and the form! You can actually see this method used in the default maps - the Deoxys and Mew events play their cries before battle!
  27. ((insert image1
  28.  
  29. So just do the same thing here - replace species_data.species with the specific Pokémon species you want!
  30.  
  31. [HEADING=2]Defeat message[/HEADING]
  32. If the player gets defeated, the game plays a message saying that they "scurry back to a Pokémon Center" or "scurry back home", depending on whether they've visited a PMC yet or not. But plenty of games don't start at home, or don't have PMCs to rest at, and it breaks the immersion a bit to see the default message when it's clearly wrong!
  33.  
  34. It's not as obvious where in the scripts you'll find this - UI_SplashesAndTitleScreen is clearly about the title, but there's not any script name that clearly references losing... Luckily, Ctrl+Shift+F will search all script sections at once! Let's search for "scurry back", since we know that phrase is used in the message.
  35. ((insert image2
  36.  
  37. There it is, Overworld_MapTransitionAnims!
  38. [code=Ruby]
  39. if gameover
  40. pbMessage("\\w[]\\wm\\c[8]\\l[3]" +
  41. _INTL("After the unfortunate defeat, you scurry back to a Pokémon Center."))
  42. else
  43. pbMessage("\\w[]\\wm\\c[8]\\l[3]" +
  44. _INTL("You scurry back to a Pokémon Center, protecting your exhausted Pokémon from any further harm..."))
  45. end
  46. [/code]
  47. [code=Ruby]
  48. if gameover
  49. pbMessage("\\w[]\\wm\\c[8]\\l[3]" +
  50. _INTL("After the unfortunate defeat, you scurry back home."))
  51. else
  52. pbMessage("\\w[]\\wm\\c[8]\\l[3]" +
  53. _INTL("You scurry back home, protecting your exhausted Pokémon from any further harm..."))
  54. end
  55. [/code]
  56. Just change the text right here! You can see from that conditional that the first version of each message (the one that doesn't say "protecting your exhausted Pokémon") is only used if the player has gotten a gameover, so you don't need to worry about that unless you're using gameovers!
  57. [HEADING=2]Trainer card[/HEADING]
  58.  
  59. [HEADING=2]Save and load displays[/HEADING]
  60.  
  61. [HEADING=2]Load BG[/HEADING]
  62.  
  63. [HEADING=1]Convenience[/HEADING]
  64.  
  65. [HEADING=2]Running shoes[/HEADING]
  66.  
  67. I feel like devs put this because they want to But this is something that hasn't been a thing in new games since B2W2! That's over ten years now! Yes, to be fair, BDSP did bring it back, for whatever bizarre reason - but the majority of games have
  68. [HEADING=2]Shorter messages[/HEADING]
  69. There's a lot of messages in Pokémon that you kinda have to button mash through. HM prompts, all the "1, 2, and... ta-da!", and on and on. Just like with running shoes, sometimes it's better to deviate from canon to make things smoother!
  70.  
  71. This is a scattered idea, and it's kind of just whatever you think could be simplified! Just like with the lose text, use Ctrl+Shift+F to find where in the scripts a message is set up, and see what you could do to simplify it!
  72.  
  73. Here's a couple examples -
  74.  
  75. I was just complaining about the "ta-da!" message, so let's go ahead and find that.
  76.  
  77. I've personally never interacted with a cut tree and [i]not[/i] wanted to cut it - there's literally no benefit to keeping it up, and it's not even like Rock Smash where I might trigger an encounter. So how about I remove the prompt, and just have my Pokémon automatically cut a tree down?
  78.  
  79. Ctrl+Shift+F for "can be cut", and I find this -
  80. [code=Ruby]
  81. def pbCut
  82. move = :CUT
  83. movefinder = $player.get_pokemon_with_move(move)
  84. if !pbCheckHiddenMoveBadge(Settings::BADGE_FOR_CUT, false) || (!$DEBUG && !movefinder)
  85. pbMessage(_INTL("This tree looks like it can be cut down."))
  86. return false
  87. end
  88. if pbConfirmMessage(_INTL("This tree looks like it can be cut down!\nWould you like to cut it?"))
  89. $stats.cut_count += 1
  90. speciesname = (movefinder) ? movefinder.name : $player.name
  91. pbMessage(_INTL("{1} used {2}!", speciesname, GameData::Move.get(move).name))
  92. pbHiddenMoveAnimation(movefinder)
  93. return true
  94. end
  95. return false
  96. end
  97. [/code]
  98. I can remove that line beginning with ((if pbConfirmMessage, and I'll have to remove the ((end closing it out. I might as well also remove that return false at the end now - it's just there if the player selects "No", which isn't possible anymore.
  99. ((include footage
  100.  
  101. But, like I said, this is really up to your own judgement - maybe you prefer to keep the flavor text in, so it feels more like the player chose to take action. And you should definitely consider situations where the player might want to cancel out of a field move - it would suck to accidentally Dig or Teleport out of a map!
  102.  
  103. [HEADING=2]Keyboard entry default[/HEADING]
  104.  
  105. [HEADING=2]Leaving in PBS[/HEADING]
  106. This is something that takes almost no work on your part! When you're zipping up your game for release, just leave the PBS folder in instead of deleting it. Now, players who are familiar with PBS files can use them as guides!
  107.  
  108. I will admit, you have two other options here, and each one has its own pros and cons.
  109.  
  110.  
  111. [HEADING=2]Resources[/HEADING]
  112. Here's some resources I've found that make things easier for players!
  113. https://reliccastle.com/resources/344/ nickname from party
  114.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement