Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <#
- .SYNOPSIS
- Calculates how much grinding you have left until your next milestone in four
- possible locations in Chrono Trigger.
- .DESCRIPTION
- DISCLAIMER: This was written with the SNES/PS1 item names and terminology.
- Where relevant, I've made notes for the DS version, though.
- When grinding XP/TP in Chrono Trigger, there are four locations that I use:
- 1000AD Guardia Forest, 600AD Guardia Forest, 65000000BC Forest Maze, and 2300AD
- Geno Dome. There are other locations that the community uses (such as Rubbles
- in 12000BC Mt. Woe for their juicy 100 TP reward), but I specifically chose
- these four for their ease of getting your party there, ease of repetition, and
- proximity to the world map. Proximity to a free source of HP/MP recovery was
- also a factor. I consider Shelters free since you can get as many as you want
- from 600AD Guardia Forest, and they can be used on the world map.
- Given the amount of experience and tech points left for a single character's
- next level and next tech, this script will calculate how many times you must
- perform each grinding run to get that next level and that next tech.
- Grinding in the first three locations will get you all techs as early as
- possible. Technically, you could grind in other locations, but these three
- locations are the most efficient, so it's a better use of your time to just
- stick with them. When Magus joins, he should be 20-30 levels behind.
- When grinding for XP, you can use regular attacks or techs. It comes down to
- your personal preference. I generally prefer to use regular attacks, since I
- can take the counterattack accessories to speed things up, but if you have three
- Gold Studs (DS: Golden Studs) available, techs become a viable option. You can
- obtain the Gold Studs easily in Black Omen, just charm Flyclops until you have
- three of them.
- Here's a few notes on both regular attacks, and techs:
- * If using regular attacks, leave Marle and Lucca out of the party at all
- times. The reduced rate of XP gain when they're out of party is faster than
- having them in the party and having them deal their horrible attack damage.
- Also, never ever have the two of them in the party at the same time while
- grinding with regular attacks.
- * On the DS version, you should grab the new ultimate weapons out of the
- Dimensional Vortex areas. This will net you, among other things, Marle's
- Venus Bow (always deals 777 damage), and Lucca's Spellslinger (damage
- calculation based on the last digit of her MP, 9 = best). With these
- weapons, Marle and Lucca can be in the party using regular attacks for XP
- grinding. This is best capped off by getting the new ending (complete all
- three Dimensional Vortex areas, then go to the End of Time, use the bucket,
- and select "Time's Eclipse"), so you can grab Crono's Dreamseeker, and then
- reload your save to do your XP grinding.
- * If you're using techs, Marle and Lucca can both be in the party, and you
- should probably have the two of them spam Antipode 3. If just Lucca is in
- the party, have her use Flare. Avoid having just Marle in the party, because
- the damage from Ice 2 is pretty low, and it's her highest damage single tech.
- One 'run' refers to the following actions, depending on location:
- 1000AD Guardia Forest: (-location guardia, -location 1000)
- 1. Enter from Truce Village side
- 2. Kill everything
- 3. Leave on Guardia Castle side
- 4. Re-enter
- 5. Kill everything
- 6. Leave on Truce Village side
- 7. Replenish HP/MP by sleeping in Crono's bed, save if desired
- Reward: 92 XP, 30 TP
- Items: Tonic (DS: Potion)
- Gold: 474
- 600AD Guardia Forest: (-location 600)
- Note: On your second visit to 600 AD, the Knights of the Square Table have been
- deployed to defend Zenan Bridge, and in the process of going there, they
- wiped out all but two encounters here. Get that grinding done on the
- first visit!
- 1. Enter from Guardia Castle side
- 2. Kill everything, grab free Shelter
- 3. Leave on Truce Village side
- 4. Re-enter
- 5. Kill everything, grab free Shelter
- 6. Leave on Guardia Castle side
- 7. Replenish HP/MP by sleeping in the castle basement infirmary type place,
- save if desired
- Reward: 126 XP, 46 TP
- Items: Tonic, Heal (DS: Potion, Panacea)
- Gold: 1050
- 65000000BC Forest Maze: (-location maze)
- 1. Enter from Ioka Village side
- 2. Kill everything
- 3. Leave on Reptite Lair side
- 4. Re-enter
- 5. Kill everything
- 6. Leave on Ioka Village side
- 7. Replenish HP/MP with sweet water (DS: happy water), or if it's gone,
- sleep in Ayla's hut, save if desired
- Reward: 2154-2274 XP, 70 TP (XP reward varies because Gold Eaglets turn into Red
- Eaglets if they're still alive after being hit twice, and the Red
- Eaglets give more XP than the Gold Eaglets)
- Items: Petal, Fang, Feather, and Horn
- Gold: 0
- 2300AD Geno Dome: (-location geno)
- 1. Enter from world map (Robo first in party)
- 2. Kill everything on the conveyor belt
- 3. Run to the right, dodging the robot (or kill it your first time, it won't
- respawn)
- 4. Use the sparkle, go through the dust chute
- 5. If you need to replenish HP/MP, leave and use a shelter, save if desired,
- re-enter
- Reward: 8286 XP, 144 TP
- Items: Barrier, Shield (DS: Barrier Sphere, Shield Sphere)
- Gold: 10200
- My recommendations (or, my "route", if you will):
- * Grind Crono+Marle for their first two techs in 1000AD Guardia Forest, before
- sending Marle off to 600 AD.
- * Grind Lucca+Frog for their first two techs in 600AD Guardia Forest,
- immediately after Frog joins, before going any further into the Cathedral.
- * Introduce Crono+Marle+Lucca to Spekkio, so they get magic and can resume
- getting tech points.
- * Grind Crono+Ayla+Robo+Lucca for all techs in 6500000BC Forest Maze. Do
- Crono+Ayla+Robo first, then Crono+Ayla+Lucca. Do all this before the Reptite
- Lair.
- * Introduce Frog to Spekkio after giving him the Hero Badge and repaired
- Masamune.
- * Grind Frog+Marle for all techs in 6500000BC Forest Maze, before proceeding
- with the story.
- * Once you get Ayla back, swap everyone around and get all the dual and triple
- techs. (copy/paste this checklist into a text editor!)
- [ ] Crono+Marle+Lucca [ ] Crono+Lucca+Ayla [ ] Crono+Ayla+Robo
- [ ] Crono+Marle+Ayla [ ] Crono+Lucca+Robo [ ] Crono+Ayla+Frog
- [ ] Crono+Marle+Robo [ ] Crono+Lucca+Frog [ ] Crono+Frog+Robo
- [ ] Crono+Marle+Frog
- * Optional equipment acquisition on the DS version:
- * Complete Lost Sanctum and the three Dimensional Vortex areas, making sure
- to grab all the chests with all the delicious new loot.
- * Go to the End of Time and use the bucket to go to Time's Eclipse.
- * Defeat the Dream Devourer and get the Dreamseeker for Crono.
- * Reload your save (don't select New Game +!) and continue.
- * Optional equipment acquisition:
- * Do side quests and get people's ultimate equipment.
- * The only exception is Robo, whose ultimate equipment comes from the end of
- Geno Dome.
- * We want to use the beginning of Geno Dome to grind, and finishing the place
- to get Robo's ultimate equipment makes Geno Dome inaccessible.
- * Grind Magus for all techs in 2300AD Geno Dome, while you're grinding for XP.
- * XP grind everyone to level 99 in Geno Dome, leaving Lucca+Marle out of party
- at all times. Accessory recommendation is Berserker/Rage Band/Fury Band.
- * DS version accessory recommendation:
- * Ayla in party: equip Valor Crest on her, and Rage Band/Wrath Band on the
- other two.
- * Ayla not in party: Berserker Ring/Rage Band/Wrath Band
- * Optionally, Berserker/Berserker/Berserker lol (this is only possible on
- first playthrough in the DS version)
- * If you're using regular attacks for grinding, and you aren't playing the DS
- version, then once everyone but Marle and Lucca reaches level 99, set your
- party as Robo/Crono/Ayla and get Marle and Lucca to level 99 on out-of-party
- experience.
- * Now go pwn Lavos and use New Game + to get all the endings.
- Note that if you have another location you prefer to use, you can add it to the
- script. I've tried to make that process as simple as possible. Open the script
- in your favorite text editor (I recommend Notepad++), and scroll down to the
- comment that says 'ADDING YOUR OWN LOCATIONS' for the process.
- .PARAMETER location
- Five possible values: 'guardia', '1000', '600', 'maze', and 'geno'.
- 'guardia' and '1000' refer to 1000AD Guardia Forest.
- '600' refers to 600AD Guardia Forest.
- 'maze' refers to 65000000BC Forest Maze.
- 'geno' refers to 2300AD Geno Dome.
- .PARAMETER xp
- The amount of experience left for the character's next level.
- .PARAMETER tp
- The amount of tech points left for the character's next tech. Defaults to 0.
- If they're out of party or have all their techs, you can omit this entirely.
- .PARAMETER outofparty
- Specify this if the character you're levelling is out of party. Out-of-party
- characters receive 75% XP and 0 TP. This is the fastest way to level Marle and
- Lucca, on SNES/PS1, if you're using regular attacks.
- If a character is out of party and you specify how much TP they have left for
- their next tech, the number of runs it would take is still calculated, just so
- you know what they're missing out on.
- PROTIP: you can shorten this to -oop
- .PARAMETER name
- The character's name. Purely for display purposes. Defaults to "Crono", so
- you only really need to specify it for the other characters.
- .INPUTS
- Pipe in one or more objects whose property names and values match the
- parameters.
- .OUTPUTS
- Plain text lol.
- .NOTES
- Author: XT-8147
- E-Mail: xt8147@gmail.com - put "ctgrind.ps1" in the subject line
- .LINK
- Twitter: @XT8147
- Reddit: /u/XT-8147
- Blog: https://xt-8147.blogspot.com/
- .EXAMPLE
- ctgrind -location geno -name Magus -xp 9830 -tp 124
- Output of the above command will be:
- 2300AD Geno Dome grinding runs for Magus:
- Next level: 2 runs
- Next tech: 1 runs
- ...yeah, I didn't bother to only pluralize when it was absolutely necessary.
- Deal with it.
- .EXAMPLE
- Jumbled mess of code go:
- @( ( new-object psobject -property @{ name = 'Crono'; location = 'maze';
- xp = 1338; tp = 336; outofparty = $false; } ),
- ( new-object psobject -property @{ name = 'Ayla'; location = 'maze';
- xp = 2344; tp = 20; outofparty = $false; } ),
- ( new-object psobject -property @{ name = 'Robo'; location = 'maze';
- xp = 2032; tp = 205; outofparty = $false; } ) ) | ctgrind
- 65000000BC Forest Maze grinding for Crono:
- Next level: 1 runs
- Next tech: 5 runs
- 65000000BC Forest Maze grinding for Ayla:
- Next level: 2 runs
- Next tech: 1 runs
- 65000000BC Forest Maze grinding for Robo:
- Next level: 1 runs
- Next tech: 3 runs
- As you can see, you can pipe objects in via the command line that have property
- names identical to our parameter names, and get an entire party done at once.
- It's kinda janky because you have to make a hashtable with the shortcut syntax
- and then convert it to an object because NOOO WE CAN'T JUST LET PEOPLE PIPE IN
- HASHTABLES THAT WOULD BE TOO EASY and also the extra parentheses are entirely
- necessary because powershell says "oh hi I see this perfectly good code but I'm
- going to throw an exception even though it should just work" if you omit them.
- I mean, I could have just made there be one parameter that can be piped in
- that's of type [System.Collections.Hashtable[]] and then just explicitly let you
- pipe in a hashtable, but I didn't really feel like writing it that way. I'd
- have to write validation code to verify the structure of the hashtable, and I'm
- lazy.
- Also, I decided to make location settable per party member instead of having it
- passed as a parameter and apply to everyone. The tradeoff is that the way I did
- it, you can compare different grinding runs in one function call, but the other
- way is far more convenient.
- #>
- [CmdletBinding()]
- param (
- [Parameter( Mandatory = $true, ValueFromPipelineByPropertyName = $true )]
- [ValidateSet( 'guardia', '1000', '600', 'maze', 'geno' )]
- [string]$location,
- [Parameter( Mandatory = $false, ValueFromPipelineByPropertyName = $true )]
- [string]$name = 'Crono',
- [Parameter( Mandatory = $true, ValueFromPipelineByPropertyName = $true )]
- [int]$xp,
- [Parameter( Mandatory = $false, ValueFromPipelineByPropertyName = $true )]
- [int]$tp = 0,
- [Parameter( Mandatory = $false, ValueFromPipelineByPropertyName = $true )]
- [Alias( 'oop' )]
- [bool]$outofparty = $false
- )
- begin {
- # relevant data
- # constant used below
- new-variable -name LOW_HIGH -value -1 -option readonly
- ###############################################################################
- # ADDING YOUR OWN LOCATIONS
- # 1. Decide on a location name. It should be short, because you'll have to
- # enter it when using the script. It's used as the index into $rewards.xp
- # and $rewards.tp, as well as the index into $names.
- # 2. Add your chosen location name to the ValidateSet in the param block above.
- # 3. Add XP and TP rewards to $rewards.xp and $rewards.tp, respectively.
- # 4. Add a friendly name to $names.
- #
- # NOTE: If there's a low and high amount of XP, make three entries as shown
- # here.
- # 'locationname' = $LOW_HIGH;
- # 'locationnamelow' = <low amount of XP>;
- # 'locationnamehigh' = <high amount of XP>;
- #
- # The low amount of XP should be calculated as if you only ever get the low
- # reward, and same for the high reward. The 65000000 BC Forest Maze run is an
- # example of how it should look. There, the Gold Eaglets give a lower amount
- # of XP, and if you don't kill them after two hits, they turn into Red Eaglets,
- # which give more XP. In practice, some will become Red Eaglets and others
- # won't, so the actual XP reward experienced by the player will be somewhere
- # between the two extremes. This is why the script outputs a low and high
- # number of runs left as necessary.
- #
- # This can be tough if you have a run with enemies that randomly leave the
- # fight. In that case, why are you trying to grind there? It's a horrible
- # location.
- #
- # I don't believe it's necessary to be able to handle low and high TP rewards,
- # because I don't think there's anything that changes TP reward during a fight.
- ###############################################################################
- # This will be referenced in the form $rewards.xp[$location] or
- # $rewards.tp[$location]. Note that -location guardia and -location 1000
- # produce the same results intentionally (for historic reasons)
- # (i.e. I added 1000 AD Guardia Forest first and didn't think about 600 AD
- # Guardia Forest until much later even though I always use it)
- new-variable rewards @{
- 'xp' = @{
- 'guardia' = 92;
- '1000' = 92;
- '600' = 126;
- 'maze' = $LOW_HIGH;
- 'mazelow' = 2154;
- 'mazehigh' = 2274;
- 'geno' = 8286;
- };
- 'tp' = @{
- 'guardia' = 30;
- '1000' = 30;
- '600' = 46;
- 'maze' = 70;
- 'geno' = 144;
- };
- }
- # lookup table for printing friendly location names
- new-variable names @{
- 'guardia' = '1000AD Guardia Forest';
- '1000' = '1000AD Guardia Forest';
- '600' = '600AD Guardia Forest';
- 'maze' = '65000000BC Forest Maze';
- 'geno' = '2300AD Geno Dome';
- }
- # technically we don't have to provide values for these, but I feel better
- # doing it.
- new-variable xplow 0
- new-variable xphigh 0
- new-variable xpout ''
- new-variable tpout ''
- }
- process {
- # if this party member is out-of-party, adjust xp reward (tp reward being 0 is
- # handled differently (shows what they'd have left if they were in party))
- if( $outofparty ) {
- if( $rewards.xp[$location] -eq $LOW_HIGH ) {
- $rewards.xp['{0}low' -f $location] *= 0.75
- $rewards.xp['{0}high' -f $location] *= 0.75
- }
- else {
- $rewards.xp[$location] *= 0.75
- }
- }
- # calculate runs left for next level
- # see if there's a low and high reward for the area
- # we use [math]::ceiling() because we don't care about fractional runs
- if( $rewards.xp[$location] -eq $LOW_HIGH ) {
- $xplow = [math]::ceiling( $xp / $rewards.xp['{0}low' -f $location] )
- $xphigh = [math]::ceiling( $xp / $rewards.xp['{0}high' -f $location] )
- # if the low and high XP rewards result in the same number of runs, simplify
- # output
- if( $xplow -eq $xphigh ) {
- $xpout = $xplow
- }
- else { # otherwise, output the range.
- $xpout = ( '{0}-{1}' -f $xphigh, $xplow )
- }
- }
- else { # nope, just one unchanging reward.
- $xpout = [math]::ceiling( $xp / $rewards.xp[$location] )
- }
- # for consistency
- $xpout = ( '{0} runs' -f $xpout )
- # for clarity
- if( $outofparty ) {
- $xpout = ( '{0} (out-of-party)' -f $xpout )
- }
- # calculate runs left for next tech
- # if there's a TP reward to be had, output it (omitting -tp should signal that
- # the user doesn't care about it)
- if( $tp -ne 0 ) {
- $tpout = ( '{0} runs' -f [math]::ceiling( $tp / $rewards.tp[$location] ) )
- if( $outofparty ) {
- $tpout = ( '{0} (No TP gain when out-of-party)' -f $tpout )
- }
- }
- # ...aaaaaaaaand output.
- write-output ( '{0} grinding for {1}:' -f $names[$location], $name )
- write-output ( 'Next level: {0}' -f $xpout )
- if( $tp -ne 0 ) {
- write-output ( 'Next tech: {0}' -f $tpout )
- }
- }
- end {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement