Advertisement
XT-8147

XT's Chrono Trigger XP/TP grinding run calculation script

Feb 17th, 2015
612
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <#
  2. .SYNOPSIS
  3. Calculates how much grinding you have left until your next milestone in four
  4. possible locations in Chrono Trigger.
  5. .DESCRIPTION
  6. DISCLAIMER: This was written with the SNES/PS1 item names and terminology.
  7. Where relevant, I've made notes for the DS version, though.
  8.  
  9. When grinding XP/TP in Chrono Trigger, there are four locations that I use:
  10. 1000AD Guardia Forest, 600AD Guardia Forest, 65000000BC Forest Maze, and 2300AD
  11. Geno Dome.  There are other locations that the community uses (such as Rubbles
  12. in 12000BC Mt. Woe for their juicy 100 TP reward), but I specifically chose
  13. these four for their ease of getting your party there, ease of repetition, and
  14. proximity to the world map.  Proximity to a free source of HP/MP recovery was
  15. also a factor.  I consider Shelters free since you can get as many as you want
  16. from 600AD Guardia Forest, and they can be used on the world map.
  17.  
  18. Given the amount of experience and tech points left for a single character's
  19. next level and next tech, this script will calculate how many times you must
  20. perform each grinding run to get that next level and that next tech.
  21.  
  22. Grinding in the first three locations will get you all techs as early as
  23. possible.  Technically, you could grind in other locations, but these three
  24. locations are the most efficient, so it's a better use of your time to just
  25. stick with them.  When Magus joins, he should be 20-30 levels behind.
  26.  
  27. When grinding for XP, you can use regular attacks or techs.  It comes down to
  28. your personal preference.  I generally prefer to use regular attacks, since I
  29. can take the counterattack accessories to speed things up, but if you have three
  30. Gold Studs (DS: Golden Studs) available, techs become a viable option.  You can
  31. obtain the Gold Studs easily in Black Omen, just charm Flyclops until you have
  32. three of them.
  33.  
  34. Here's a few notes on both regular attacks, and techs:
  35.     * If using regular attacks, leave Marle and Lucca out of the party at all
  36.       times.  The reduced rate of XP gain when they're out of party is faster than
  37.       having them in the party and having them deal their horrible attack damage.
  38.       Also, never ever have the two of them in the party at the same time while
  39.       grinding with regular attacks.
  40.       * On the DS version, you should grab the new ultimate weapons out of the
  41.         Dimensional Vortex areas.  This will net you, among other things, Marle's
  42.         Venus Bow (always deals 777 damage), and Lucca's Spellslinger (damage
  43.         calculation based on the last digit of her MP, 9 = best).  With these
  44.         weapons, Marle and Lucca can be in the party using regular attacks for XP
  45.         grinding.  This is best capped off by getting the new ending (complete all
  46.         three Dimensional Vortex areas, then go to the End of Time, use the bucket,
  47.         and select "Time's Eclipse"), so you can grab Crono's Dreamseeker, and then
  48.         reload your save to do your XP grinding.
  49.     * If you're using techs, Marle and Lucca can both be in the party, and you
  50.       should probably have the two of them spam Antipode 3.  If just Lucca is in
  51.       the party, have her use Flare.  Avoid having just Marle in the party, because
  52.       the damage from Ice 2 is pretty low, and it's her highest damage single tech.
  53.  
  54. One 'run' refers to the following actions, depending on location:
  55.  
  56. 1000AD Guardia Forest: (-location guardia, -location 1000)
  57.     1. Enter from Truce Village side
  58.     2. Kill everything
  59.     3. Leave on Guardia Castle side
  60.     4. Re-enter
  61.     5. Kill everything
  62.     6. Leave on Truce Village side
  63.     7. Replenish HP/MP by sleeping in Crono's bed, save if desired
  64. Reward: 92 XP, 30 TP
  65. Items: Tonic (DS: Potion)
  66. Gold: 474
  67.  
  68. 600AD Guardia Forest: (-location 600)
  69. Note: On your second visit to 600 AD, the Knights of the Square Table have been
  70.       deployed to defend Zenan Bridge, and in the process of going there, they
  71.       wiped out all but two encounters here.  Get that grinding done on the
  72.       first visit!
  73.     1. Enter from Guardia Castle side
  74.     2. Kill everything, grab free Shelter
  75.     3. Leave on Truce Village side
  76.     4. Re-enter
  77.     5. Kill everything, grab free Shelter
  78.     6. Leave on Guardia Castle side
  79.     7. Replenish HP/MP by sleeping in the castle basement infirmary type place,
  80.        save if desired
  81. Reward: 126 XP, 46 TP
  82. Items: Tonic, Heal (DS: Potion, Panacea)
  83. Gold: 1050
  84.  
  85. 65000000BC Forest Maze: (-location maze)
  86.     1. Enter from Ioka Village side
  87.     2. Kill everything
  88.     3. Leave on Reptite Lair side
  89.     4. Re-enter
  90.     5. Kill everything
  91.     6. Leave on Ioka Village side
  92.     7. Replenish HP/MP with sweet water (DS: happy water), or if it's gone,
  93.        sleep in Ayla's hut, save if desired
  94. Reward: 2154-2274 XP, 70 TP (XP reward varies because Gold Eaglets turn into Red
  95.         Eaglets if they're still alive after being hit twice, and the Red
  96.         Eaglets give more XP than the Gold Eaglets)
  97. Items: Petal, Fang, Feather, and Horn
  98. Gold: 0
  99.  
  100. 2300AD Geno Dome: (-location geno)
  101.     1. Enter from world map (Robo first in party)
  102.     2. Kill everything on the conveyor belt
  103.     3. Run to the right, dodging the robot (or kill it your first time, it won't
  104.        respawn)
  105.     4. Use the sparkle, go through the dust chute
  106.     5. If you need to replenish HP/MP, leave and use a shelter, save if desired,
  107.        re-enter
  108. Reward: 8286 XP, 144 TP
  109. Items: Barrier, Shield (DS: Barrier Sphere, Shield Sphere)
  110. Gold: 10200
  111.  
  112. My recommendations (or, my "route", if you will):
  113.     * Grind Crono+Marle for their first two techs in 1000AD Guardia Forest, before
  114.       sending Marle off to 600 AD.
  115.     * Grind Lucca+Frog for their first two techs in 600AD Guardia Forest,
  116.       immediately after Frog joins, before going any further into the Cathedral.
  117.     * Introduce Crono+Marle+Lucca to Spekkio, so they get magic and can resume
  118.       getting tech points.
  119.     * Grind Crono+Ayla+Robo+Lucca for all techs in 6500000BC Forest Maze.  Do
  120.       Crono+Ayla+Robo first, then Crono+Ayla+Lucca.  Do all this before the Reptite
  121.       Lair.
  122.     * Introduce Frog to Spekkio after giving him the Hero Badge and repaired
  123.       Masamune.
  124.     * Grind Frog+Marle for all techs in 6500000BC Forest Maze, before proceeding
  125.       with the story.
  126.     * Once you get Ayla back, swap everyone around and get all the dual and triple
  127.       techs. (copy/paste this checklist into a text editor!)
  128.       [ ] Crono+Marle+Lucca  [ ] Crono+Lucca+Ayla  [ ] Crono+Ayla+Robo
  129.       [ ] Crono+Marle+Ayla   [ ] Crono+Lucca+Robo  [ ] Crono+Ayla+Frog
  130.       [ ] Crono+Marle+Robo   [ ] Crono+Lucca+Frog  [ ] Crono+Frog+Robo
  131.       [ ] Crono+Marle+Frog
  132.     * Optional equipment acquisition on the DS version:
  133.       * Complete Lost Sanctum and the three Dimensional Vortex areas, making sure
  134.         to grab all the chests with all the delicious new loot.
  135.       * Go to the End of Time and use the bucket to go to Time's Eclipse.
  136.       * Defeat the Dream Devourer and get the Dreamseeker for Crono.
  137.       * Reload your save (don't select New Game +!) and continue.
  138.     * Optional equipment acquisition:
  139.       * Do side quests and get people's ultimate equipment.
  140.       * The only exception is Robo, whose ultimate equipment comes from the end of
  141.         Geno Dome.
  142.       * We want to use the beginning of Geno Dome to grind, and finishing the place
  143.         to get Robo's ultimate equipment makes Geno Dome inaccessible.
  144.     * Grind Magus for all techs in 2300AD Geno Dome, while you're grinding for XP.
  145.     * XP grind everyone to level 99 in Geno Dome, leaving Lucca+Marle out of party
  146.       at all times.  Accessory recommendation is Berserker/Rage Band/Fury Band.
  147.     * DS version accessory recommendation:
  148.       * Ayla in party: equip Valor Crest on her, and Rage Band/Wrath Band on the
  149.         other two.
  150.       * Ayla not in party: Berserker Ring/Rage Band/Wrath Band
  151.       * Optionally, Berserker/Berserker/Berserker lol (this is only possible on
  152.         first playthrough in the DS version)
  153.     * If you're using regular attacks for grinding, and you aren't playing the DS
  154.       version, then once everyone but Marle and Lucca reaches level 99, set your
  155.       party as Robo/Crono/Ayla and get Marle and Lucca to level 99 on out-of-party
  156.       experience.
  157.     * Now go pwn Lavos and use New Game + to get all the endings.
  158.  
  159. Note that if you have another location you prefer to use, you can add it to the
  160. script.  I've tried to make that process as simple as possible.  Open the script
  161. in your favorite text editor (I recommend Notepad++), and scroll down to the
  162. comment that says 'ADDING YOUR OWN LOCATIONS' for the process.
  163. .PARAMETER location
  164. Five possible values: 'guardia', '1000', '600', 'maze', and 'geno'.
  165.  
  166. 'guardia' and '1000' refer to 1000AD Guardia Forest.
  167. '600' refers to 600AD Guardia Forest.
  168. 'maze' refers to 65000000BC Forest Maze.
  169. 'geno' refers to 2300AD Geno Dome.
  170. .PARAMETER xp
  171. The amount of experience left for the character's next level.
  172. .PARAMETER tp
  173. The amount of tech points left for the character's next tech.  Defaults to 0.
  174. If they're out of party or have all their techs, you can omit this entirely.
  175. .PARAMETER outofparty
  176. Specify this if the character you're levelling is out of party.  Out-of-party
  177. characters receive 75% XP and 0 TP.  This is the fastest way to level Marle and
  178. Lucca, on SNES/PS1, if you're using regular attacks.
  179.  
  180. If a character is out of party and you specify how much TP they have left for
  181. their next tech, the number of runs it would take is still calculated, just so
  182. you know what they're missing out on.
  183.  
  184. PROTIP: you can shorten this to -oop
  185. .PARAMETER name
  186. The character's name.  Purely for display purposes.  Defaults to "Crono", so
  187. you only really need to specify it for the other characters.
  188. .INPUTS
  189. Pipe in one or more objects whose property names and values match the
  190. parameters.
  191. .OUTPUTS
  192. Plain text lol.
  193. .NOTES
  194. Author: XT-8147
  195. E-Mail: xt8147@gmail.com - put "ctgrind.ps1" in the subject line
  196. .LINK
  197. Twitter: @XT8147
  198.  Reddit: /u/XT-8147
  199.    Blog: https://xt-8147.blogspot.com/
  200. .EXAMPLE
  201. ctgrind -location geno -name Magus -xp 9830 -tp 124
  202.  
  203. Output of the above command will be:
  204.  
  205. 2300AD Geno Dome grinding runs for Magus:
  206. Next level: 2 runs
  207. Next tech: 1 runs
  208.  
  209. ...yeah, I didn't bother to only pluralize when it was absolutely necessary.
  210. Deal with it.
  211. .EXAMPLE
  212. Jumbled mess of code go:
  213. @( ( new-object psobject -property @{ name = 'Crono'; location = 'maze';
  214.      xp = 1338; tp = 336; outofparty = $false; } ),
  215.    ( new-object psobject -property @{ name = 'Ayla'; location = 'maze';
  216.      xp = 2344; tp = 20; outofparty = $false; } ),
  217.    ( new-object psobject -property @{ name = 'Robo'; location = 'maze';
  218.      xp = 2032; tp = 205; outofparty = $false; } ) ) | ctgrind
  219.  
  220. 65000000BC Forest Maze grinding for Crono:
  221. Next level: 1 runs
  222. Next tech: 5 runs
  223. 65000000BC Forest Maze grinding for Ayla:
  224. Next level: 2 runs
  225. Next tech: 1 runs
  226. 65000000BC Forest Maze grinding for Robo:
  227. Next level: 1 runs
  228. Next tech: 3 runs
  229.  
  230. As you can see, you can pipe objects in via the command line that have property
  231. names identical to our parameter names, and get an entire party done at once.
  232. It's kinda janky because you have to make a hashtable with the shortcut syntax
  233. and then convert it to an object because NOOO WE CAN'T JUST LET PEOPLE PIPE IN
  234. HASHTABLES THAT WOULD BE TOO EASY and also the extra parentheses are entirely
  235. necessary because powershell says "oh hi I see this perfectly good code but I'm
  236. going to throw an exception even though it should just work" if you omit them.
  237.  
  238. I mean, I could have just made there be one parameter that can be piped in
  239. that's of type [System.Collections.Hashtable[]] and then just explicitly let you
  240. pipe in a hashtable, but I didn't really feel like writing it that way.  I'd
  241. have to write validation code to verify the structure of the hashtable, and I'm
  242. lazy.
  243.  
  244. Also, I decided to make location settable per party member instead of having it
  245. passed as a parameter and apply to everyone.  The tradeoff is that the way I did
  246. it, you can compare different grinding runs in one function call, but the other
  247. way is far more convenient.
  248. #>
  249. [CmdletBinding()]
  250. param (
  251.     [Parameter( Mandatory = $true, ValueFromPipelineByPropertyName = $true )]
  252.     [ValidateSet( 'guardia', '1000', '600', 'maze', 'geno' )]
  253.     [string]$location,
  254.     [Parameter( Mandatory = $false, ValueFromPipelineByPropertyName = $true )]
  255.     [string]$name = 'Crono',
  256.     [Parameter( Mandatory = $true, ValueFromPipelineByPropertyName = $true )]
  257.     [int]$xp,
  258.     [Parameter( Mandatory = $false, ValueFromPipelineByPropertyName = $true )]
  259.     [int]$tp = 0,
  260.     [Parameter( Mandatory = $false, ValueFromPipelineByPropertyName = $true )]
  261.     [Alias( 'oop' )]
  262.     [bool]$outofparty = $false
  263. )
  264.  
  265. begin {
  266.     # relevant data
  267.     # constant used below
  268.     new-variable -name LOW_HIGH -value -1 -option readonly
  269.    
  270.     ###############################################################################
  271.     # ADDING YOUR OWN LOCATIONS
  272.     # 1. Decide on a location name.  It should be short, because you'll have to
  273.     #    enter it when using the script.  It's used as the index into $rewards.xp
  274.     #    and $rewards.tp, as well as the index into $names.
  275.     # 2. Add your chosen location name to the ValidateSet in the param block above.
  276.     # 3. Add XP and TP rewards to $rewards.xp and $rewards.tp, respectively.
  277.     # 4. Add a friendly name to $names.
  278.     #
  279.     # NOTE: If there's a low and high amount of XP, make three entries as shown
  280.     # here.
  281.     # 'locationname' = $LOW_HIGH;
  282.     # 'locationnamelow' = <low amount of XP>;
  283.     # 'locationnamehigh' = <high amount of XP>;
  284.     #
  285.     # The low amount of XP should be calculated as if you only ever get the low
  286.     # reward, and same for the high reward.  The 65000000 BC Forest Maze run is an
  287.     # example of how it should look.  There, the Gold Eaglets give a lower amount
  288.     # of XP, and if you don't kill them after two hits, they turn into Red Eaglets,
  289.     # which give more XP.  In practice, some will become Red Eaglets and others
  290.     # won't, so the actual XP reward experienced by the player will be somewhere
  291.     # between the two extremes.  This is why the script outputs a low and high
  292.     # number of runs left as necessary.
  293.     #
  294.     # This can be tough if you have a run with enemies that randomly leave the
  295.     # fight.  In that case, why are you trying to grind there?  It's a horrible
  296.     # location.
  297.     #
  298.     # I don't believe it's necessary to be able to handle low and high TP rewards,
  299.     # because I don't think there's anything that changes TP reward during a fight.
  300.     ###############################################################################
  301.    
  302.     # This will be referenced in the form $rewards.xp[$location] or
  303.     # $rewards.tp[$location]. Note that -location guardia and -location 1000
  304.     # produce the same results intentionally (for historic reasons)
  305.     # (i.e. I added 1000 AD Guardia Forest first and didn't think about 600 AD
  306.     # Guardia Forest until much later even though I always use it)
  307.     new-variable rewards @{
  308.                             'xp' = @{
  309.                                 'guardia' = 92;
  310.                                 '1000' = 92;
  311.                                 '600' = 126;
  312.                                 'maze' = $LOW_HIGH;
  313.                                 'mazelow' = 2154;
  314.                                 'mazehigh' = 2274;
  315.                                 'geno' = 8286;
  316.                             };
  317.                             'tp' = @{
  318.                                 'guardia' = 30;
  319.                                 '1000' = 30;
  320.                                 '600' = 46;
  321.                                 'maze' = 70;
  322.                                 'geno' = 144;
  323.                             };
  324.                          }
  325.    
  326.     # lookup table for printing friendly location names
  327.     new-variable names @{
  328.                         'guardia' = '1000AD Guardia Forest';
  329.                         '1000' = '1000AD Guardia Forest';
  330.                         '600' = '600AD Guardia Forest';
  331.                         'maze' = '65000000BC Forest Maze';
  332.                         'geno' = '2300AD Geno Dome';
  333.                        }
  334.    
  335.     # technically we don't have to provide values for these, but I feel better
  336.     # doing it.
  337.     new-variable xplow 0
  338.     new-variable xphigh 0
  339.     new-variable xpout ''
  340.     new-variable tpout ''
  341. }
  342.  
  343. process {
  344.     # if this party member is out-of-party, adjust xp reward (tp reward being 0 is
  345.     # handled differently (shows what they'd have left if they were in party))
  346.     if( $outofparty ) {
  347.         if( $rewards.xp[$location] -eq $LOW_HIGH ) {
  348.             $rewards.xp['{0}low' -f $location] *= 0.75
  349.             $rewards.xp['{0}high' -f $location] *= 0.75
  350.         }
  351.         else {
  352.             $rewards.xp[$location] *= 0.75
  353.         }
  354.     }
  355.    
  356.     # calculate runs left for next level
  357.    
  358.     # see if there's a low and high reward for the area
  359.     # we use [math]::ceiling() because we don't care about fractional runs
  360.     if( $rewards.xp[$location] -eq $LOW_HIGH ) {
  361.         $xplow = [math]::ceiling( $xp / $rewards.xp['{0}low' -f $location] )
  362.         $xphigh = [math]::ceiling( $xp / $rewards.xp['{0}high' -f $location] )
  363.        
  364.         # if the low and high XP rewards result in the same number of runs, simplify
  365.         # output
  366.         if( $xplow -eq $xphigh ) {
  367.             $xpout = $xplow
  368.         }
  369.         else { # otherwise, output the range.
  370.             $xpout = ( '{0}-{1}' -f $xphigh, $xplow )
  371.         }
  372.     }
  373.     else { # nope, just one unchanging reward.
  374.         $xpout = [math]::ceiling( $xp / $rewards.xp[$location] )
  375.     }
  376.    
  377.     # for consistency
  378.     $xpout = ( '{0} runs' -f $xpout )
  379.    
  380.     # for clarity
  381.     if( $outofparty ) {
  382.         $xpout = ( '{0} (out-of-party)' -f $xpout )
  383.     }
  384.    
  385.     # calculate runs left for next tech
  386.    
  387.     # if there's a TP reward to be had, output it (omitting -tp should signal that
  388.     # the user doesn't care about it)
  389.     if( $tp -ne 0 ) {
  390.         $tpout = ( '{0} runs' -f [math]::ceiling( $tp / $rewards.tp[$location] ) )
  391.         if( $outofparty ) {
  392.             $tpout = ( '{0} (No TP gain when out-of-party)' -f $tpout )
  393.         }
  394.     }
  395.    
  396.     # ...aaaaaaaaand output.
  397.    
  398.     write-output ( '{0} grinding for {1}:' -f $names[$location], $name )
  399.     write-output ( 'Next level: {0}' -f $xpout )
  400.     if( $tp -ne 0 ) {
  401.         write-output ( 'Next tech: {0}' -f $tpout )
  402.     }
  403. }
  404.  
  405. end {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement