Submission Text Full Submission Page
Shining Force completed in record time. Every aspect of randomness in the game was disassembled, simulated in MATLAB, and manipulated to the maximum advantage of speed. A smaller then normal band of fighters takes on the ancient legend of Dark Dragon! The enemy is only allowed to attack 14 times over the course of 30 battles, 5 of which are used to kill useless force members.
Movie Goals:
  • Aims for fastest time
  • Manipulates luck
  • Kills characters to save time
  • Takes no damage (except for intentional deaths)
  • Abuses programming glitches
  • No warps or passwords

Background

I've wanted to do a Shining Force run for 3 years now. You can look at the history of the TAS board and at shiningforcecentral.com to see my post from many years ago, asking about this run. It wasn't a possibility until Upthorn created the movie/frame advance/decompiler version of Gens, allowing me to disassemble every aspect of the game. Using my history with MATLAB, I created many different programs to simulate the results of every random possibility. Then, the next step was the long, interesting task of TASing an epic strategy game. I spent countless hours figuring out the best possible approach to every battle. Each battle attempt takes around 5 hours, and it often took 2 to 4 attempts to get a battle correct.

Shining Force

Shining Force is a turn-based strategy RPG. Every round of battle, the Player and CPU take interleaved turns, determined by the Battle Order, to try and destroy the opponent. Your team can be comprised of 12 of the 30 possible warriors found through out the game. The game usually takes 8-10 hours to play all the way through. Large amounts of time is wasted when playing the game normally, because every attack animation on either side takes at least 7 seconds to perform. Therefore, minimizing the number of attacks is essential to maximize the speed of the run

Luck manipulation and MATLAB

All luck manipulation can be performed with the controller. There is a 16 byte value (0-65535) at FF0EC2 which can be incremented from 1 to 255 by different button combinations. Thus, there are 65536 different possible random outcomes at any given time. MATLAB was used to simulate every one of these outcomes. Additionally, MATLAB was programmed to tell me the exact button presses to achieve the "random" outcome I desired. Surprisingly, I was able to minimize the number of times that I have to wait for the counter to get to the random outcome I wanted. The only time it is noticeable is in Battle 20, Bleu waits about 1/5th of second to correctly manipulate battle order.

Battle Order

Manipulating the Battle Order was the key to obtaining the ridiculous speed of this run, and lack of enemy attacks. Like noted before, the Battle Order determines the order in which the CPU/player take turns, based on the characters agilities. Thus, the most important part of the run was selecting the best Battle Order out of the 65536 possible. Now, it would have been ridiculous to try and look through all of those. So, I created a program to help me "shop" for the best battle order. I set it up to allow me to look for groupings of characters, look for one character to perform before another, or to look for the earliest character movement. This usually allowed me to narrow down the choices to 2-10 different options. B
The choosing of each Battle Order was no small task. The priorities in which Battle Order was chosen was:
  1. Avoid enemy attacks
  2. Group close characters together
  3. Group close groupings together
Thus, when priority 1 takes precedent, the cursor will be forced to bounce around the screen often. This is extremely noticeable in the Colossus battle, which I will discuss later.
Additionally, the question is often raised, "Why not kill more enemies to reduce cursor movement and enemy turns?" The major reason being that each enemy turn takes approximately 1 second, plus the cursor movement. Killing an enemy takes 7 seconds of battle animation, plus the time to move a character to the enemy. Since battles rarely go beyond 3-4 rounds, the only enemies that are killed are those which would otherwise attack me, wasting the 7 seconds anway, or are necessary to end the battle.

Enemy AI

The AI in this game is based completely on locational threshold crossings. Thus, to manipulate the AI to be stupid, you have to know where these thresholds are. Battle 3 is a great example of this. Max stops right before the threshold for the 5 knights to move, and then takes two consecutive turns (achieved by being at the end of a round, and beginning of the next) to pass the knights with them never moving. In the following battle explinations, this will be used often.

Programming Glitches

Two glitches were abused in this game. First, the BOOST spell (provided by the power ring) ends after 3-4 turns. However, as long as the character is not attacked or does not gain a level, the BOOST spell lasts indefinitely. Thus, a character can kill up to 3 enemies post-BOOST with the elevated attack. This is abused considerably through the entire run. Additionally, the mobility ring can be unequipped at the end of a turn, without losing the ground gained by it previously being equipped. The start of the movie also has Max leaving town without obtaining the first 5 members of the force. Whether or not this was intentionally available is debatable.

Promotion

Only 4 characters are promoted in this run. Promotion is the double-edged sword of the game. First, the actual time it takes to promote a character is extremely long, since the game has to play music to promote. Second, characters are absolutely DECIMATED post promotion. Additionally, the first 3 level gains of any promoted character are extremely poor. The only reason characters are promoted in this run at all is to be able to equip the higher level weapons. The actual statistics of the characters don't greatly benefit from promotion given the low post-promotion levels achieved (aside for one: Max's Agility). Therefore, characters other than Max are only promoted when a new super-powerful weapon is available. For Gort, it is the Heat Axe, for Pelle, the Halberd, and Balbaroy, the Broad Sword. Earnest goes unpromoted, since his only purpose post Chapter 6 is to kill one High Priest, and stop the Armed Skeleton in Dark Dragon battle from regenerating. Musashi can not be promoted (thankfully). All other characters are eliminated before they would ever need a promotion. It may be arguable that buying a steel sword and promoting Amon would make battle 20 faster. However, the Power ring takes 8 seconds to use. It takes well over 30 seconds to promote a character, and that doesn't include the time to buy and equip a new weapon. Additionally, the hit to her agility would have killed her ability to attack Mages before they attack her.
!WARNING! SPOILERS AHEAD YOU MAY WANT TO WATCH THE MOVIE FIRST !WARNING!

Battle 1

Max goes it alone, manipulating the villager to block the guard. At the gate, Max kills 2 goblins, and takes out the knight. The 2nd round order was specific to end with Max then Knight, to have the Knight move into position to be killed. Otherwise, the Knight is blocked by the 2 dwarves. The threshold location for his movement is next to the goblin.

Battle 2

Nothing much exciting here. The dwarf attack was used to move him out of the way, maximizing the next move Max makes.

Battle 3

Gort is picked up here, and ends up being an asset the rest of the run. As noted before, Max stops early, and then takes 2 consecutive turns, bypassing the 5 knights a 3 bats, without them ever moving.

Battle 4

Khris is the most useless and time consuming member to join the force. She takes 3 turns to move into a position to die. Luckily, her death distracts one of the bats, minimizing the number of useless attacks. An interesting note. At the end of round 2, Gort crosses the bridge. This is a threshold which causes the Mage and archers to start moving down. Once they start, they don't stop their planned movement. However, if Max or Mae were to cross the second bridge/threshold, they would never move. They are moved downwards for the convience of Max and Mae.

Battle 5

Gort and Mae stay back, and let Max take the back route into Alterone. If Mae moved 1 square forward, the Zombies and Mage would move into a position that would make getting into the town early impossible.

Battle 6

The only enemy to be attacked twice before Dark Dragon is in this battle. Nothing could be done to avoid this, that wouldn't take longer than the extra 7 seconds. The power ring is picked up in this battle, setting up the rest of the run.

Battle 7

Thanks to an idea by ZeXr0, the Marionette falls quickly by a Mae double turn. Mae is the first and only person in the 3rd battle round.

Battle 8

This battle was difficult to optimize, since it is a small field, with the enemy on top of you from the start. The enemy's affinity to attack Max is abused. They line up to attack him at the one space available. This is abused, to allow Mae and Gort to clean up the field. Also, every FAQ on GameFAQs is wrong, killing the Ghoul does not end the battle early.

Battle 9

The addition of the Birds makes the speed of the run really pick up. This shows how many future battles will be achieved.

Battle 10

The battle can be ended by Max entering the bridge, however, the designers, out of sheer stupidity, must have thought "Hey! Lets make every last outdoor battle until the end of the game a mash of trees and mountains, so every one can only move 2 at a time! That will be ridiculously annoying and slow! Great Idea!" Thus, the unaffected birds are used to clear the map out quickly.

Battle 11

The Laser Eye counts down, and fires every 5 or 6 turns, at every creature on the map in it's large range. Unfortunately, when Battle Messages are turned off, a glitch causes the text not to show. Balbaroy is used to end the battle before the laser eye ever gets a chance to fire.

Battle 12

Instead of trees and mountains, they made this map 3x larger than necessary. Mae had started to become useless, so she is used to cross the threshold for the first group of enemies, and than is slaughter for the sake of speed. One knight is moved via Max threshold crossing, so Balbaroy can gain 1 attack. The 1 attack point is the difference between being able to one hit Elliot and not.

Battle 13

Nothing too special about this battle. The top hellhound is killed before the lower artillery. This opens the lower door as oppose to the upper door, skipping a long animation when you meet Earnest.

Battle 14

Unfortunately, the poor position and weakness of the birds means that the majority of the enemies need to be killed, to make way for Pelle to kill Balbazak. I had wished a more optimal strategy were possible. However, the extra experience helps later versus Kane. Additionally, I had originally thought that I had chosen the wrong time to promote Max, since he becomes a weakling. However, the agility he gains from this early promotion will be essential an entire 14 battles later.

Battle 15

Just another clear the map battle. No real special manipulation went into this one.

Battle 16

The mobility ring is picked up before battle, starting up the absurd amount of item swaping that will be occuring for the rest of the game. This and the power ring made this run. Amon gets the ring, and makes her way to the mage, ending the battle in haste.

Battle 17

Ah, the beauty of manipulation. If any of the bottom 4 conchs move before they are destroyed, 4 shellfish can appear, like the seabats. There are 2 thresholds. If someone does not enter the top-lower (below the stairs) part of the ship before the conch's turn, they will move. If anyone moves past the 2 anchor lines, they will move. Hence, the 4 force members that kill them need to take double turns, to get there and kill them to end the battle. If the spot where they stand is open at the end of the round, the shellfish will appear, unless the end of the round ends the battle. The Shellfish never appear :) There is some standing around in round 2 to wait until everyone can make the move downwards.

Battle 18

2 Mages, 3 Ice worms, and 5 Golems can appear on this map. By taking Balbaroy south, he never crosses a threshold to make them appear, and by the time he does, he ends the battle by killing the Durhan, thus, they never appear. Luckily, the designers didn't include the mountains in the threshold.

Battle 19

Pelle is the only member of the force strong enough to one hit Kane, and only after getting the Halberd. So, he gets the mobility ring, and goes on a power trip. The mage had to be manipulated to not cast a spell at him. Oh, and Bleu sucks. His agility absolutely limits the number of battle orders I can use that group the force together. Too bad he is essential for the next battle.

Battle 20

MORE MOUNTAINS AND TREES! I had dreaded doing this battle since I started the TAS. Luckily, the 3 fliers are able to slowly but surely clear out the map. This also introduces the magic multi-critical.

Battle 21

Mishaela is far too fast, so no one can move in to kill her before she makes it around the corner. Luckily, she comes right back towards balbaroy, making for an easy kill. The gargoyles are destroyed by a triple magic critical.

Battle 22

EVEN MORE MOUNTAINS AND TREES! GENIUS DESIGNERS! Amon had been useful for the last time in Battle 20. Now, she is useful in moving the laser eye into Gort's range. Same with Bleu. Good bye and good riddance.

Battle 23

This battle could be ended a round early by giving Balbaroy a turbo pepper. However, Musashi needs it more, and this way, he can pick up the Valkrye for Pelle. This weapon can only be received by opening the chest during battle.

Battle 24

Musashi with the mobility ring is able to cross Chaos's movement threshold before his turn, but after all but one of his guards turns. This prevents them from doing there job of guarding him, leaving him wide open for a quick kill. Also, the enemy achieves a nice double magic critical, eliminating the new useless force members.

Battle 25

WOW, WHAT A SURPRISE! MORE MOUNTAINS AND TREES! Balbaroy makes his way down to kill the skeleton quickly. This debuts the mobility ring trick. He swaps over to the power ring, avoiding the need to waste 7 seconds casting BOOST.

Battle 26

The last of the "clear the map" battles. Gort achieves a triple magic critical on the 3 doggies. Lots of item swapping is done to prepare for the next battle, since there are no pauses.

Battle 27

Ramaladu! The only battle orders available had Ramaladu and 1 enemy attacking before Musashi and Max can go. Thus, the closest enemy that can not attack is chosen. Having Balbaroy BOOST Max was my first try. This caused the worst battle ever seen. If Max and Musashi hadn't had such high agility, my force would have been decimated. Laser Eyes cause 20 damage, that can't be avoided.

Battle 28

I HATED this battle. There is an impassable by flight barrier I didn't know about between Colossus and the bottom of the map. Thus, I have to go left, and around. The mobility ring glitch and the BOOST glitch are used extensively. On balbaroy's 2nd to last turn, he equips the mobility ring, moves to his new spot, equips the power ring, and the BOOST spell ends. If he tried to equip the power ring on the next turn, the BOOST spell glitch would end. The cursor bounces around for the 4th and 5th battle round, quite a bit. This is because the earliest Balbaroy can move/attack is 11th! Only one order exists which he is 11th, which is used for both the 4th and 5th round. This avoids the 2 jets below him from getting into range to attack him, much less even moving! Unfortunately, he could not go before the one Jet hence why it follows him.

Battle 29

Musashi shows his necessity. His attack level is the only one that can defeat Darksol with such ease. The 2nd and final round only consists of Darksol, Max, and Musashi.

Battle 30

The END! Having Dark Dragon attack my 2 heroes turned out to be the fastest strategy. One last bug was found for this battle, allowing the movie to end early. Equipping the evil ring removes the BOOST has ended notice. The movie could be shorter by ending the "Dark Dragon has been defeated!" line, but that would make the actual file longer.

Thanks and Acknowledgments

Special thanks to Upthorn for his version of Gens with decompiler. This run wouldn't be possible without it. Thanks to ZeXr0 for his constant support of the run, even though his suggestions forced me to restart more than once! :) Thanks to matO for his intial run, which solved many thought problems for me, as well as giving me a benchmark to blast away. :)
Fun Facts
  • No shop is ever visited, All weapons obtained from Chests and Enemies
  • There are 454 enemies in the game, 238 which are completely ignored, or 52%!
  • The average number of characters on the force is 5
  • Only 4 players are promoted
  • The average end level of the remaining 6 (+pre-promoted levels) is 12.

Known Improvements

  • Setting the character name to A or Z can save 2 frames per time the hero name is said. They say 'Max' probably over 100 times in this run, stupid scripters.
  • The villager who blocks the guard in Guardiana can be manipulated from far away, allowing for a faster escape.
  • It may be possible to end Battle 3 one round earlier
Suggested SS

Truncated: It's quite long, but not longer than our other RPGs, and there is action most of the time and surprises to those familiar with the game. Also it has received good feedback. Accepting.

Bisqwit: Hi, because of a software glitch, I'm posting NesVideoAgent's screenshot selection instead of NesVideoAgent posting them. Here goes...

adelikat: Setting to cancelled by the author as he has improved it.


Joined: 8/10/2004
Posts: 173
Location: Bethel, VT
So when do we get to see the follow up run of Shining Force 2? :)
Joined: 11/16/2006
Posts: 66
I love how you used MATLAB, especially considering how close to home that is for me since I just did a liniar algebra project last week. Did you get a free version of it on your computer or something? Watching this later.
TASVideosGrue
They/Them
Joined: 10/1/2008
Posts: 2785
Location: The dark corners of the TASVideos server
om, nom, nom... blech, stale!