Well. I know that this is a fairly old game, and I don't remember if this has been brought up or not.
But it is a really fun game for an early Dungeon Crawler.
THis game could possibly make for a very entertaining TAS. :3
So I reloaded this game to attempt a TAS on it ... and it's nightmarish. Manipulating luck in a way that actually gains time is a huge struggle (especially within battle), though I am just starting out. So let's necro a five-year-old one post thread and see if there's even any interest in seeing this game worked on! If anyone has any sort of progress on this particular beast, has interest in seeing it get done, or knows of any exploits/bugs/tricks that would be useful, I'd love to know and get involved. The game is one of my old favorites from when I was a kid.
http://www.gamefaqs.com/nes/587676-swords-and-serpents/faqs
A decent FAQ that also has ASCII maps within which will definitely help.
Enemy randomness sucks big time though.... but I am sure toying with RNG will allow some control.
Not sure how much levelling you'd want to do to ensure you have HP to Manipulate enemy encounters.
Not sure if it will be quicker to use Last Resort to shortcut back to a temple on levels 1, 5 or 10.
Manipulating drops is going to probably be a total bitch, but at least drops are WAYYYYY better then what the armory will offer you, which means money is pointless.
Not sure how exactly battles work.. I mean I used to use a turbo controller to go insane... hard to tell exactly what triggers the enemy to attack or remain dormant.
Frame rule or something?
I think a TAS will definitely make quick work of this.. probably 20 mins worst case.. maybe 15, since you need all 7 Ruby Treasures.
Hope this little bit is of some meager assistance to anyone wanting to speedrun this undderated RPG.
Edit: Just remembered that when you run from battle, you get ejected back one square. I think this definitely has its advantages.. but I wish I knew if you could go backwards into a scripted encounter and run and then go past the square, or if it ejects you back to the square you arrived from, regardless of the wrong direction.
Mr. Kelly R. Flewin
Mr. Kelly R. Flewin
Just another random gamer
----
<OmnipotentEntity> How do you people get bored in the span of 10 seconds? Worst ADD ever.
Well, I've had no problem beating the game, and on fairly low levels, and gave it a mini test run. The RNG is more Dragon Quest / Warrior style than Final Fantasy style, so all unwanted encounters can be avoided through proper movement manipulation. I'd assume a LUA script would do so in the optimal number of frames, but I'm not even sure where to get started on something like that (or if it's even available and can meet the needs).
Taking a step the first frame that it doesn't result in a battle seems great, but will lose frames in the long run because in many instances more frames can be gained back by waiting an extra 1 or few on an earlier step =/.
Anyway, assuming a solution for that, dealing with in-battle RNG seems like the trickiest part. You have to balance the ability to get extra attacks in (as the game allows) with the success rate of attacks and manipulation of enemy movements. Fun times. My time is short this upcoming week (will be out of town) but I may work on this later next month.
http://forum.speeddemosarchive.com/post/swords__serpents_not_your_parents_dd.html
I am planning on speedrunning this at some point in the future and apparently so is Feasel. I'm popping the link up for anyone who may consider a TAS of this title, so they can gain from our information findings.
Edit: a LOT of new info is now available, and also at the aforementioned link is a 2 Part test route run by Feasel and later in the thread, my thoughts and my FM2. [Which desyncs?!]
Definitely a treasure trove of info if this will ever be TAS'd. Would love to get a lua script for this game to figure out the more important stuff, like how to determine if something is going to be dropped from an enemy and more importantly, does AC do jackshit, or does awesome rolled chars do it all and it's a ruse.
Well that and the more important question that's bothering us. Does holding a directional on the pad with the attack button actually WORK or was the manual lying to us?
Mr. Kelly R. Flewin
Mr. Kelly R. Flewin
Just another random gamer
----
<OmnipotentEntity> How do you people get bored in the span of 10 seconds? Worst ADD ever.
Wow, It'd been so long that I'd forgotten I even made this thread. xD
Course I haven't exactly been very active on the forum for the last few years anyway.
Feasel has a 1:11:10 on a speedrun of this game. I'm sure a TAS can do better.
Yeah, Feasel was a BEAST with the new path that has been devised. 3 Mages and a Warrior... though I am unsure if a Thief is better.
Definitely 1 Mage, 3 Thieves may have potential... or 1 Mage, 1 Warrior and 2 Thieves.
Thieves to crit hits a lot and Warrior can equip Ruby Sword for 3 hits. A TAS will manipulate enemies to get 2 or 3 +3 swords from enemies starting on Level 10, depending on how you wish to go about it.
Mr. Kelly R. Flewin
Mr. Kelly R. Flewin
Just another random gamer
----
<OmnipotentEntity> How do you people get bored in the span of 10 seconds? Worst ADD ever.
1 Mage would be impossible outside of a TAS. Especially if the party is only Level 5 or 6. In a regular speedrun, you really need at least two Mages casting Major heal, otherwise the dragon is going to kill you.
I'm not really sure if a Warrior or thief is better, either. Thief if you can proc his crits on every hit. Otherwise Warrior would be best for raw brute attack power because of the Ruby Sword which grants you 4 attacks per turn.
FINALLY! Thanks to AnS, I now have found a version of FCEUX that LETS ME record Swords and Serpents!@
ANYWAYS, First you will require FCEUX 2.16 Interim SVN 2620 which can be found here;
http://fceux.com/zip
And now for the concept run itself!
http://dehacked.2y.net/microstorage.php/info/1250321623/Swords%20%26%20Serpents%20-%20Don%27t%20Take%205%2C%20Take%20What%20You%20Want%20To%20Take.fm2
This was done as a concept run for Swords and Serpents for a future run to SDA on an actual console. I wanted to work out the most optimal pathway and luck to get an idea of roughly how fast insanely good luck would be and how to guage what a good run time would be.
http://forum.speeddemosarchive.com/post/swords__serpents_not_your_parents_dd.html
This is the thread stared on SDA by me, after being inspired by this very thread here.
I hope this willl inspire someone to TAS this badboy and bring it to its knees. It's definitely going to be a challenge as it's RNG hell to say the least!
Mr. Kelly R. Flewin
Mr. Kelly R. Flewin
Just another random gamer
----
<OmnipotentEntity> How do you people get bored in the span of 10 seconds? Worst ADD ever.
Updating this thread with information that will hopefully intrigue someone to TAS the shit out of this RNG Insane game. Thanks to Gyre on the SDA forums for this information!
---
First post is data on how the game memory is laid out.
Like most NES games zero-page memory is used heavily especially in the combat routines. Here are some offsets I found useful (locations in hex):
01E Frame counter (0-60)
01F Second counter (0-60, increments when 01E flips)
020 Minute counter (0-60, increments when 01F flips)
021 Hour counter (0-23, increments when 020 flips)
022 Counter (increments when 01E flips)
064 Player1 Initiative
065 Player2 Initiative
066 Player3 Initiative
067 Player4 Initiative
068 Monster1 Initiative
069 Monster2 Initiative
06A Monster3 Initiative
06B Monster4 Initiative
06C Monster5 Initiative
06D Monster6 Initiative
06E Monster7 Initiative
06F Monster8 Initiative
070 Party Hit Roll
071 Party Evade Roll
072 Party Damage Roll
073 Monster Hit Roll
074 Monster Evade Roll
075 Monster Damage Roll
083 Number enemies
085 Active Monster
087 Active Player
09C-09D Treasury
09E-09F Experience
0A0 Exp. Level
0A2-0A5 RNG scrambling bytes
0E0-0EF Scratch space
0F0-0FF Temporary table pointers
Character data is stored at 600 with 20 offset between each record:
00-05 Name
06 Strength
07 Intelligence
08 Agility
09 Health
0A Spell Points
0B Profession
(00- Magician)
(01- Warrior)
(02- Thieft)
0C-11 Inventory
(| 80- Equipped)
(00- Jewel)
(01- Sword)
(02- Dagger)
(03- Broadsword)
(04- Axe)
(05- Staff)
(06- Leather)
(07- Shield)
(08- Halberd)
(09- Plus 2 Sword)
(0A- Long Sword)
(0B- Great Sword)
(0C- Great Axe)
(0D- Wizards Wand)
(0E- Scale)
(0F- Helmet)
(10- Ruby Glasses)
(11- Plus 2 Sword)
(12- Horseshoe)
(13- Gold Key)
(14- Mirror Shld)
(15- Silver Sword)
(16- Red Staff)
(17- Death Dagger)
(18- Silver Helm)
(19- Chain)
(1A- Glow Cloak)
(1B- Glow Sword)
(1C- Mage Staff)
(1D- Plate)
(1E- Mage Cloak)
(1F- Ruby Ring)
(20- Ruby Shield)
(21- Ruby Helmet)
(22- Mithril Chn.)
(23- Brass Key)
(24- Ruby Crown)
(25- Blood Dagger)
(26- Rope)
(27- Spell Staff)
(28- Quickblade)
(29- Plus 3 Sword)
(2A- Mithril Shld)
(2B- Crush Mace)
(2C- Magic Plate)
(2D- Mage Ring)
(30- Shovel)
(31- Fire Sword)
(32- Fire Shield)
(33- Ruby Sword)
(3A- Blk Crystal)
(3B- Ruby Amulet)
(3C- Plus 1 Sword)
12-13 Spells Known
(| 0100- Heal)
(| 0200- Flash Fire)
(| 0400- Sting)
(| 0800- Shield)
(| 1000- Deadeye)
(| 2000- Death Mist)
(| 4000- Strength)
(| 8000- Passwall)
(| 0001- Thunder)
(| 0002- Viper)
(| 0004- Phalanx)
(| 0008- Stun)
(| 0010- Major Heal)
(| 0020- Flight)
(| 0040- Regenerate)
(| 0080- Crystallize)
14 AC
15 Maximum Health
16 Maximum Spell Points
In combat monster data is stored at 680 with 16 offset between each record. Don't have the record layout typed up yet.
When mapped item data is stored at 8000 with 16 offset between each record. This is paged from ROM so isn't always available.
00-0B Item Name
0C Initiative
0D To-Hit
0E Damage1
0F Damage2
10-11 Cost
12 Armor Class
13 Foes Hit Min
14 Usable By
(| 01- Magician)
(| 02- Warrior)
(| 04- Thief)
15 Foes Hit Max
Efficiency = Initiative + To-Hit
Damage Class = Damage1 * Damage2
Mr. Kelly R. Flewin
Just another random gamer
----
<OmnipotentEntity> How do you people get bored in the span of 10 seconds? Worst ADD ever.
2nd post from Gyre
---
I'm not a LUA expert but I've got a WIP script for displaying the raw combat stats.
function PlayerStats()
for curplayer = 0, 3, 1 do
local initiative = memory.readbyte(0x64 + curplayer)
local hp = memory.readbyte(0x609 + 0x20 * curplayer)
local ypos = 1 + 10 * curplayer
local stats = string.format("P%u Initiative %u HP %u", curplayer, initiative, hp)
gui.text(1, ypos, stats)
end
end
function MonsterStats()
local maxmonster = memory.readbyte(0x83)
if maxmonster > 8 then
maxmonster = 8
end
for curmonster = 0, maxmonster - 1, 1 do
local initiative = memory.readbyte(0x68 + curmonster)
local hp = memory.readbyte(0x684 + 0x10 * curmonster)
local ypos = 1 + 10 * curmonster
local stats = string.format("M%u Initiative %u HP %u", curmonster, initiative, hp)
gui.text(140, ypos, stats)
end
end
function CombatResults()
local ypos = 91
for i,str in ipairs(combatstrs) do
gui.text(1, ypos, str)
ypos = ypos + 10
end
end
amonster = -1
function ActiveMonster()
amonster = memory.readbyte(0x85)
end
function UpdateCombatResults()
local n = table.getn(combatstrs)
local aplayer = memory.readbyte(0x87)
local tohit = memory.readbyte(0x70 + 3 * lastcombat)
local evade = memory.readbyte(0x71 + 3 * (1 - lastcombat))
local damage = memory.readbyte(0x72 + 3 * lastcombat)
local hit = false
if lastcombat == 0 then
hit = tohit >= evade
attacker = string.format("P%u", aplayer)
defender = string.format("M%u", amonster)
elseif lastcombat == 1 then
hit = tohit > evade
attacker = string.format("M%u", amonster)
defender = string.format("P%u", aplayer)
end
damagestr = string.format("%s To Hit %u vs %s Evade %u", attacker, tohit, defender, evade)
if hit then
damagestr = damagestr .. string.format(" (%u damage)", damage)
else
damagestr = damagestr .. " (miss)"
end
combatstrs[n] = damagestr
end
memory.registerwrite(0x75, UpdateCombatResults)
function NewCombatResult()
table.insert(combatstrs, "")
if table.getn(combatstrs) > 6 then
table.remove(combatstrs, 1)
end
end
function PlayerAttack()
ActiveMonster()
end
memory.registerwrite(0x70, PlayerAttack)
function PlayerEvade()
if not incombat then
lastcombat = 1
incombat = true
ActiveMonster()
NewCombatResult()
end
UpdateCombatResults()
end
memory.registerwrite(0x71, PlayerEvade)
function PlayerDamage()
ActiveMonster()
UpdateCombatResults()
end
memory.registerwrite(0x72, PlayerDamage)
function MonsterAttack()
ActiveMonster()
end
memory.registerwrite(0x73, MonsterAttack)
function MonsterEvade()
if not incombat then
lastcombat = 0
incombat = true
ActiveMonster()
NewCombatResult()
end
UpdateCombatResults()
end
memory.registerwrite(0x74, MonsterEvade)
function PlayerInitiativeChange(address, size)
incombat = false
end
memory.registerwrite(0x64, 4, PlayerInitiativeChange)
minitiative = {}
function MonsterInitiativeChange(address, size)
local initiative = memory.readbyte(address)
if minitiative[address] == nil then
minitiative[address] = initiative
return
end
local initiativechange = initiative - minitiative[address]
if ((not incombat) or (lastcombat ~= 1)) and initiativechange >= -5 and initiativechange < 0 then
NewCombatResult()
local n = table.getn(combatstrs)
combatstrs[n] = string.format("M%u passed", address - 0x68)
end
incombat = false
minitiative[address] = initiative
end
memory.registerwrite(0x68, MonsterInitiativeChange)
memory.registerwrite(0x69, MonsterInitiativeChange)
memory.registerwrite(0x6A, MonsterInitiativeChange)
memory.registerwrite(0x6B, MonsterInitiativeChange)
memory.registerwrite(0x6C, MonsterInitiativeChange)
memory.registerwrite(0x6D, MonsterInitiativeChange)
memory.registerwrite(0x6E, MonsterInitiativeChange)
memory.registerwrite(0x6F, MonsterInitiativeChange)
lastcombat = -1
incombat = false
combatstrs = {}
emu.speedmode("normal")
while true do
if lastcombat == -1 and memory.readbyte(0x15) == 2 then
lastcombat = 2
end
if memory.readbyte(0x86) > 0 then
combatstrs = {}
lastcombat = -1
end
if lastcombat >= 0 then
PlayerStats()
MonsterStats()
CombatResults()
end
emu.frameadvance()
end
Mr. Kelly R. Flewin
Just another random gamer
----
<OmnipotentEntity> How do you people get bored in the span of 10 seconds? Worst ADD ever.
Final post from Gyre
----
Finally, some of the combat mechanics.
The basic turn order uses an initiative system.
Each of your characters has a starting initiative = random[0,9] + agility + intelligence + weapon initiative + currentHP - maxHP.
Monsters have a simpler formula replacing the non-random components with a value in the monster record.
The current turn is based on the highest initiative. In case of ties, monsters (in their order 1, 2, ...) go first followed by player characters (in their order).
Taking a turn drops your initiative by 5 (set to 0 if you had a positive score but less than 5 points left). When everyone's initiative reaches 0, the initiative round is over and the numbers are all rerolled. Monsters can choose to pass their turn which deducts from initiative without taking an action.
There are 2 major bugs with how initiative works.
The first bug is the initiative underflow glitch. This is a really good bug. You'll notice that your initiative is penalized by the amount of damage you've taken. If all of the other factors are bad you can underflow to 255 initiative. Since each turn costs 5 initiative this often gives you 30+ turns of action in a row before anyone else gets to go. Unfortunately your bad stats will make the character suck so it requires careful building. The best way to exploit it is using a warrior at 2 intelligence with a low-initiative weapon that has high to-hit (luckily the Ruby Sword fits this) and with as much agility as you can get away with safely.
The second bug is the zombie attack glitch. This is a really bad bug. When a monster gets killed, it's initiative gets set to 0 to take it out of combat. Monster HP is never checked again so when the initiative round ends dead monsters get a new initiative value just like everyone else. This lets all of the dead monsters rejoin combat and start attacking again. Since they're already dead there's no way to kill them again to stop it from happening.
For party members the basic combat formulas are:
to-hit = random[0,9] + agility + weapon to-hit
evade = agility + AC
Your attack is successful if player to-hit >= monster's evade. The other way around it's monster to-hit roll > player's evade.
When calculating to-hit monsters roll a random[2,12] choice.
If 2 <= random < 11 then to-hit = random + monster base to-hit
if random >= 11 then to-hit = 128 + monster base to-hit
This gives monsters a devastating ability to bypass your evade. It's basically impossible to build an invulnerable tank warrior because better armor stops making a difference once you're 10 points over the monster's base to-hit.
Pushing buttons in combat has been a long-standing debate. The only code I can find is when you're pushing up while attacking. That gives the monster +4 to their evade but does an extra die of damage if the attack hits. The best way to use this is against monsters that have crummy evade so you're always hitting them anyway. Outside of a TAS it's probably not a good idea for most encounters.
Mr. Kelly R. Flewin
Just another random gamer
----
<OmnipotentEntity> How do you people get bored in the span of 10 seconds? Worst ADD ever.
Joined: 12/8/2012
Posts: 706
Location: Missouri, USA
So I have a story to share about this game which happened to me about 5 years ago, playing this on the NES.
I was in the process of doing a full playthrough, mapping out the entire game on pencil and graph paper. Real old-school stuff. Anyhow, as I was going through and mapping out Level 9, I made my way up to the top-middle part of the map and PASSWALL'd through into the room containing the tile giving you 1,000 XP (circled on the pic).
I have no idea how or why this next part happened, but immediately after I cast PASSWALL, the game went directly to the ending! At first I thought the game crashed due to the seizure-like graphics, but it was the legit ending scene with the 'Hall of Fame' screen and all that. I ended up resetting and continuing, and didn't have that happen again on the 8th floor. It did happen to me one other time later on in the game, though.
No idea what causes this to happen. Just wanted to throw this out there to inform that there's something glitchy within the game's RNG which can cause a game-end glitch.
"But as it is written, Eye hath not seen, nor ear heard, neither have entered into the heart of man, the things which God hath prepared for them that love him." - 1 Corinthians 2:9
Joined: 12/8/2012
Posts: 706
Location: Missouri, USA
I dug around the house and found my old maps :D Here's an upload:
Slight correction as it was actually Level 9. Also, the game-end glitch occurred in the upper-left corner of the wall leading into the room with the 1,000 XP.
I'll edit in the corrections to my prior post.
"But as it is written, Eye hath not seen, nor ear heard, neither have entered into the heart of man, the things which God hath prepared for them that love him." - 1 Corinthians 2:9
o.o;;
Wowsers.. I mean this game is RNG nightmare in a box of RNG nightmare... but to think it may be possible to end it like that? This means the game could be beaten around 10-12 mins depending on manipulation... and that's scary as fuck.
Hopefully now with all the info provided in my prior posts, and this potential, someone will be willing to give this a shot.
Mr. Kelly R. Flewin
Mr. Kelly R. Flewin
Just another random gamer
----
<OmnipotentEntity> How do you people get bored in the span of 10 seconds? Worst ADD ever.
Just noting for posterity that this ought to be reproducible. On a real NES-101, I was able to trigger it nearly every time I entered that room, by pacing back and forth repeatedly in the corners. Then I forgot about it because I was trying an ironman win and it seemed cheap. :7
(Sorry for bumping without even attempting a test movie, but compiling any emu on this ancient computer is baffling me currently. HTH.)
So this thread inspired me to make my first ever TAS.
This is a 00:06:57 any% run counting from Power-on to last input.
Youtube:
Link to video
FM2: User movie #53903553681581760
I'm sure this can be optimized but I didn't feel like going back and messing up RNG everytime I discovered something new late game. Basically the entire run needs to be redone so if anyone feels like it, go at it.
So I'll do a breakdown of this run and if anyone has questions feel free to ask.
Description:
This run skips all random encounters and item drops, takes damage to save time and uses a glitch on level 9 to fight an alternative final boss.
It relies heavily on luck manipulation to determine the type of enemy fought during forced encounters and kills most of them using the thieves lucky strike.
Choosing game:
RTA: Timing doesn't start until after characters are created so players roll dice and assemble a nice team.
TAS: Time starts at power on and the run is short enough that it is faster to just go with the pre-existing team.
Level 1:
RTA: Runners usually use Last Resort here teleporting them to the temple giving them fewer squares to walk on and lessening the chance of random encounters.
TAS: Faster to manipulate encounters and run straight through the level. First encounter is killed normally as this was 2 frames faster then waiting for a instakill frame.
Level 2:
RTA: Picks up a Plus 2 Sword.
TAS: Simply walk through the level.
Level 3:
RTA: Due to use of healing from random encounters a runner may pick up a magic fountain here.
TAS: Walking through the trap is faster then walking around. Skips fountain as it is faster to walk around it. Also, after hitting the first switch, moving backwards and then turning saves frames over having to turn twice to exit the room, this is because of animation frames when turning.
Level 4:
RTA: Once again can pick up a fountain to replenish magic.
TAS: Walks around the fountain.
Level 5:
RTA: Passwall greatly decreases chances of random encounters.
TAS: Can skip random encounters so combines Passwall with walking for shortest path (measured in frames).
Level 4(again):
RTA: Now with Passwall a teleporter to level 9 can be reached.
TAS: Same.
Level 9:
RTA: Flight to not get teleported away, uses glitch to fight alternative boss.
TAS: Picks up 1000exp to reach level 4. (Was unable to use thiefs instakill on boss while only on level3.)
Tricks:Random Encounters: Can be avoided by walking 1-2 frames later.
Forced Encounters: Who you fight and what initiative values are set can be manipulated by which frame the fight is entered on.
These are my notes from level 2 where you can see I delay until frame 4774 to get the initative I want.
----------------
Enemy 1 - BOSS
4774 For great Initiative. ($0064-$0067) vs Monster ($0069-$006c)
4923 4940 4956 insta
4972 4988 4999 pressed until 5001 5039 insta
5054 5069 5088 5102 5126 insta
5141 5157 5172 5186 5196 insta 5356 Greenzone
----------------
4771 - Goblin 41 32 33 37 vs 34 34 32 26
4772 - Goblin 39 39 35 34 vs 33 33 27 34
4774 - Goblin 33 39 27 39 vs 29 25 32 32
4775 - Goblin 38 38 30 34 vs 27 26 34 29
4778 - Goblin 32 35 32 32 vs 34 25 34 33
4779 - Goblin 33 34 33 40 vs 27 32 30 26
4781 - Goblin 35 34 29 37 vs 27 33 25 25
And here are notes from first fight in level 1 where you can see monster type changing dependending on frame.
----------------
Enemy 1
----------------
0601 - Spider 34 33 30 41 0707, 0722, 0737, 0750, 0785 - Instakill, 0945 Greenzone
0602 - Spider 34 33 30 41 0707, 0722, 0737, 0750, 0785 - Instakill, 0945 Greenzone
0603 - Zombie 36 37 34 41 0758, 0770, 0801 - Instakill, 0958 Greenzone
0604 - Bat 40 35 33 40 0732, 0749, 0766, 0780 - Regularkill, 0939 Greenzone
0604 - Bat 40 35 33 40 0732, 0747, 0762, 0782 - Instakill, 0941 Greenzone
0605 - Spider 41 31 35 38
0606 - Zombie 33 35 34 38
0607 - Bat 41 34 31 36
0608 - Guard 33 30 31 32
0609 - Spider 40 36 30 34
0610 - Spider 35 34 32 32
0611 - Zombie 32 39 36 32 ... (haven't checked what comes next)
Thief Instakill: So the thief has an instakill ability that is randomly triggered. The RNG for this depends on what the framecounter ($001e) is and the values at $00a2-a5.
Button presses in fights change the a2-a5 values. This means that if you find a frame where you instakill, it cycles and repeats every 60 frames, that is you can press the button 60 frames sooner or later because the a2-a5 are the same and the framecounter goes from 0-59.
If you cannot find an instakill (or want a faster one) you can change the a2-a5 setup by changing frame of last button press on previous character.
Also the last boss didn't seem instakillable at character level 3 however there is a 1000xp bonus right next to the glitch warp which gets you to character level 4.
Glitch Warp: No idea how this works. RTA runners use it so I did what they do. Have not been able to find any information at all about this glitch or how it was discovered.