Saturday, April 02, 2011
Swords For $400, Alex
This is actually a word that begins with a bloody S! I am talking, of course, about SABRE! I picked the item up that allows me to cast this spell today and decided to give it a spin on the boss of that dungeon, the Kraken. The fight was like a scene from a ninja movie. The boss punched the ninja in the face and the ninja got mad. He started running around like crazy (IE: I used defense sword until I was invincible) and the boss kept swinging and swinging but never could hit the ninja again. Then the ninja started to taunt the boss, brandishing his sword but not actually doing anything noticeable with it. Look, a sword! After showing the Kraken his sword 10 times to scoop up an extra 160 damage and 100 hit the ninja cast fast on himself and finally moved in for the kill. One action, 16 swings, and a very, very dead Kraken.
Friday, April 01, 2011
Pointers
Welcome to Ziggyny's Coding Emporium. Today we're going to be discussing pointers using the random encounter system of the video game Final Fantasy as a starting point and ending up with the rough idea behind linked lists.
First off, how would you imagine the random encounter system works? Me, I'd think that every time you took a step the game would make a check. 10% chance that you get into a fight every step, say. When that check returned true, randomly figure out what the monsters were based on where the fight was taking place. I'd be wrong. It turns out that when the game is turned on and again after every random encounter the game picks a number and stores that value in a variable, and every time you take a step that value gets decremented. When it hits 0 or lower you get into a fight. So as soon as a fight ends you know exactly how many steps it will take to get into your next fight. (Or at least you would if you had access to that variable.)
Only it turns out that number isn't random at all, either. The first fight on the overworld takes place after 15 steps. The next one is after 24 steps. Then 32. Then 29. It turns out there's a list of 90 step number for the overworld and the game just loops through them all. There are similar lists for ocean and dungeon fights. (Ocean fights are much less frequent, dungeons are slightly less frequent.)
When the fight starts the game picks a fight for you, but there's actually no randomness involved here either. Every zone has 8 possible fights it could be. The game has a list of 256 numbers. The first fight you get when you turn the power on is the fight associated with the first number in that list, which it turns out is 3. Then a 4, then another 3, then a 6, and so on. People have actually used this deterministic nature to plot out exact movement patterns through dungeons to get specific random encounters. (You can't run from some fights in the game, so if you want to beat the game at minimum level you need to never encounter those fights!) The only way to change what fight you're going to do is to change zones. You'll still fight the 3rd fight, it will just be the 3rd one from a different list.
What does all this have to do with pointers? Well, how are those 256 numbers actually stored? You could have a variable for each one and use one gigantic module to track where you are in the list but that's really inefficient. A trick you can use is to use an array which lets you use one variable to store all 256 numbers and then a second variable to store an index into the array. The index is simply a number which tells you where to look in your huge array for the data you need. The programming language takes into account where the data actually is in memory. All you care about is the variable for your array and the variable for your index. But what is the language actually doing? It actually treats all of memory as one big array of its own. The variable you use to refer to your array is just an index itself into the gigantic memory array. Your array variable, in a sense, is just a number.
In C, it's more than just a number in a sense. It's a number period. This number is called a pointer because it 'points' to the specific section of memory the language set aside for you but all it is is an index into an array. The memory system doesn't know what you've stored there. It doesn't care in the slightest. An interesting thing about arrays in C is there's no actual array substance at all. If you allocate the memory for, say, 256 8-bit values you might think it's doing something specific to break up a 2048 bit chunk of memory into a bunch of 8-bit sections for you, but it doesn't. It just takes a contiguous chunk of memory sized 2048, sets it aside, and tells you where it starts. How does the index work then? Well, the system does know the size of the values you're storing so it can work out where it is. A[0] starts right at the start of the array. A[1]? It's exactly 8 bits ahead of A[0] because you're storing 8-bit values. So the system actually turns A[1] into A+8*1. A[200]? It's at A+8*200. (Ever wondered why arrays start at index 0?)
So our array solution was actually a pointer solution without even knowing it!
This is all well and dandy when we know our data isn't going to change, but what happens if we're writing a more dynamic data system? One where we might want to add or delete items from the middle of the list? If you think about it, in our array solution a given entry in the array implicitly 'knew' where the next item in the array was. It was at the location in memory 8 bits ahead of where the current entry is. A[151] obviously follows A[150]. But what if we want to delete A[151]? (Our subscribers whined that the fights referred to by A[151] were too hard and demanded we nerf the game by taking them out.) With an array and the implicit pointer to the next entry we're in trouble. Our best bet is to copy the value from A[152] into A[151]. And then A[153] into A[152]. And so on until we've copied them all. And then we have to change our check for when we hit the end of the array to loop back to the start to check for 255 instead of 256. It's all a big mess.
Even worse, what if the word came down from the president of the company that the users want super-rare fights to spring up. They want a 257th possible outcome, and they want it to come after A[180]. Following the idea above, we could copy A[255] to A[256] and then A[254] to A[255] and so on until we've made room for the new value. Hold on now! We only asked the memory manager for 2048 bits of memory and now we're using 2054. In some languages this would result in an error of some kind. In C the system just doesn't care. It'll let you write into that section of memory regardless of what it's actually supposed to be. (This is how many security flaws came about, by sticking something really big into a section of memory and overwriting actual code!) This is obviously a big, big problem. But we can't just tell the president to screw off or we'll get fired. So we need to allocate 8 new bits of memory somewhere and then remember somehow that we go from A[180] to the new value to A[181]. Probably we do this with a bunch of if statements and eventually end up with terrible, terrible code.
The real problem above is that we were relying on implicit pointers to the next value. What if we could assign an explicit pointer to the next value? That way if we had to add or remove values in our list we could change the explicit pointers and keep the right connections around. Well, we know pointers are simply numbers, so we could change our data from being an 8-bit number to being an 8-bit number AND a pointer. The size of the pointer variable depends on the operating system, but if you're on a 32-bit computer it'll be 32 bits in size. On the NES I'd imagine it would have been 8 bits. This will double the amount of space our data will occupy but it will let us add or remove items easily.
So, instead of allocating one big block of 2048 bits we'd get the system to give us 256 blocks of 16 bits. The first 8 bits will have our number. The second 8 bits will be a pointer to the next allocated block. Maybe it's the next one in memory. Maybe it's somewhere else entirely. We don't care. All we care about is the location of the very first number. After we're done with that number we don't even care about that anymore. So we could update our pointer variable to bits 9-16 of the section of memory it's pointing to! We can even get rid of our 'end of list' check by making the last entry point back to the first one. Now if we need to add an extra number we can allocate space for it and adjust a couple pointers and we're done.
Linked lists are often represented something like above. Pointers are represented with arrows and are made to seem more complicated than they are. The above picture (stolen ruthlessly from wikipedia) has 3 distinct blocks of memory. The circles are just numbers. Numbers that can be thought of as an index into the gigantic array which is memory. You can change the number in the circle to change the index of the array. Or you can follow the arrow and change the value on the other side to change the value stored in the array. Getting the syntax right can be tricky with all the *s and &s but the important thing to keep in mind is pointers are just numbers. There's nothing mythical about them and they're so useful because they can be manipulated as numbers.
First off, how would you imagine the random encounter system works? Me, I'd think that every time you took a step the game would make a check. 10% chance that you get into a fight every step, say. When that check returned true, randomly figure out what the monsters were based on where the fight was taking place. I'd be wrong. It turns out that when the game is turned on and again after every random encounter the game picks a number and stores that value in a variable, and every time you take a step that value gets decremented. When it hits 0 or lower you get into a fight. So as soon as a fight ends you know exactly how many steps it will take to get into your next fight. (Or at least you would if you had access to that variable.)
Only it turns out that number isn't random at all, either. The first fight on the overworld takes place after 15 steps. The next one is after 24 steps. Then 32. Then 29. It turns out there's a list of 90 step number for the overworld and the game just loops through them all. There are similar lists for ocean and dungeon fights. (Ocean fights are much less frequent, dungeons are slightly less frequent.)
When the fight starts the game picks a fight for you, but there's actually no randomness involved here either. Every zone has 8 possible fights it could be. The game has a list of 256 numbers. The first fight you get when you turn the power on is the fight associated with the first number in that list, which it turns out is 3. Then a 4, then another 3, then a 6, and so on. People have actually used this deterministic nature to plot out exact movement patterns through dungeons to get specific random encounters. (You can't run from some fights in the game, so if you want to beat the game at minimum level you need to never encounter those fights!) The only way to change what fight you're going to do is to change zones. You'll still fight the 3rd fight, it will just be the 3rd one from a different list.
What does all this have to do with pointers? Well, how are those 256 numbers actually stored? You could have a variable for each one and use one gigantic module to track where you are in the list but that's really inefficient. A trick you can use is to use an array which lets you use one variable to store all 256 numbers and then a second variable to store an index into the array. The index is simply a number which tells you where to look in your huge array for the data you need. The programming language takes into account where the data actually is in memory. All you care about is the variable for your array and the variable for your index. But what is the language actually doing? It actually treats all of memory as one big array of its own. The variable you use to refer to your array is just an index itself into the gigantic memory array. Your array variable, in a sense, is just a number.
In C, it's more than just a number in a sense. It's a number period. This number is called a pointer because it 'points' to the specific section of memory the language set aside for you but all it is is an index into an array. The memory system doesn't know what you've stored there. It doesn't care in the slightest. An interesting thing about arrays in C is there's no actual array substance at all. If you allocate the memory for, say, 256 8-bit values you might think it's doing something specific to break up a 2048 bit chunk of memory into a bunch of 8-bit sections for you, but it doesn't. It just takes a contiguous chunk of memory sized 2048, sets it aside, and tells you where it starts. How does the index work then? Well, the system does know the size of the values you're storing so it can work out where it is. A[0] starts right at the start of the array. A[1]? It's exactly 8 bits ahead of A[0] because you're storing 8-bit values. So the system actually turns A[1] into A+8*1. A[200]? It's at A+8*200. (Ever wondered why arrays start at index 0?)
So our array solution was actually a pointer solution without even knowing it!
This is all well and dandy when we know our data isn't going to change, but what happens if we're writing a more dynamic data system? One where we might want to add or delete items from the middle of the list? If you think about it, in our array solution a given entry in the array implicitly 'knew' where the next item in the array was. It was at the location in memory 8 bits ahead of where the current entry is. A[151] obviously follows A[150]. But what if we want to delete A[151]? (Our subscribers whined that the fights referred to by A[151] were too hard and demanded we nerf the game by taking them out.) With an array and the implicit pointer to the next entry we're in trouble. Our best bet is to copy the value from A[152] into A[151]. And then A[153] into A[152]. And so on until we've copied them all. And then we have to change our check for when we hit the end of the array to loop back to the start to check for 255 instead of 256. It's all a big mess.
Even worse, what if the word came down from the president of the company that the users want super-rare fights to spring up. They want a 257th possible outcome, and they want it to come after A[180]. Following the idea above, we could copy A[255] to A[256] and then A[254] to A[255] and so on until we've made room for the new value. Hold on now! We only asked the memory manager for 2048 bits of memory and now we're using 2054. In some languages this would result in an error of some kind. In C the system just doesn't care. It'll let you write into that section of memory regardless of what it's actually supposed to be. (This is how many security flaws came about, by sticking something really big into a section of memory and overwriting actual code!) This is obviously a big, big problem. But we can't just tell the president to screw off or we'll get fired. So we need to allocate 8 new bits of memory somewhere and then remember somehow that we go from A[180] to the new value to A[181]. Probably we do this with a bunch of if statements and eventually end up with terrible, terrible code.
The real problem above is that we were relying on implicit pointers to the next value. What if we could assign an explicit pointer to the next value? That way if we had to add or remove values in our list we could change the explicit pointers and keep the right connections around. Well, we know pointers are simply numbers, so we could change our data from being an 8-bit number to being an 8-bit number AND a pointer. The size of the pointer variable depends on the operating system, but if you're on a 32-bit computer it'll be 32 bits in size. On the NES I'd imagine it would have been 8 bits. This will double the amount of space our data will occupy but it will let us add or remove items easily.
So, instead of allocating one big block of 2048 bits we'd get the system to give us 256 blocks of 16 bits. The first 8 bits will have our number. The second 8 bits will be a pointer to the next allocated block. Maybe it's the next one in memory. Maybe it's somewhere else entirely. We don't care. All we care about is the location of the very first number. After we're done with that number we don't even care about that anymore. So we could update our pointer variable to bits 9-16 of the section of memory it's pointing to! We can even get rid of our 'end of list' check by making the last entry point back to the first one. Now if we need to add an extra number we can allocate space for it and adjust a couple pointers and we're done.
Linked lists are often represented something like above. Pointers are represented with arrows and are made to seem more complicated than they are. The above picture (stolen ruthlessly from wikipedia) has 3 distinct blocks of memory. The circles are just numbers. Numbers that can be thought of as an index into the gigantic array which is memory. You can change the number in the circle to change the index of the array. Or you can follow the arrow and change the value on the other side to change the value stored in the array. Getting the syntax right can be tricky with all the *s and &s but the important thing to keep in mind is pointers are just numbers. There's nothing mythical about them and they're so useful because they can be manipulated as numbers.
Thursday, March 31, 2011
Ding-Dong! The Lich Is Dead!
It took 8 tries last night but I finally killed Lich. He killed me 4 times and his trash killed me 3 times but the 8th time I got him. The crazy thing is the 4 times he killed me he landed a slow at about half health and then I got to fight for a long time before he finally killed me. On the kill he didn't even get to cast slow. Several crits in a row coupled with him melee attacking (and failing to paralyze) did him in. (In retrospect it turns out I was using the wrong weapon against Lich the whole time and should have had 3 more damage and 40 more hit against him. That hit would be just for chance to hit and not extra swings, I think, so not a huge deal but every bit counts!)
So, now what? I need to level to 50, become a ninja, gather all the gear I want, and kill a bunch of bosses. Ninja is the first step I think since I need to do that before I hit level 43 if I want all my spell charges. I may need to gear up a little to pull that off so I should also look for easily obtainable treasure chests containing useful stuff. In particular, stuff I may need/want:
Katana - Floating Castle
Light Axe - Sea Shrine
Heal Rod - Castle of Ordeals
Mage Rod - Sea Shrine
Defense Sword - Waterfall
Thor Hammer - Mirage Tower
Masamune - Temple of the Past
Opal Bracelet - Sea Shrine
Black Robe - Floating Castle
Flame Shield - Volcano
Ice Shield - Ice Cavern
Ribbon - Waterfall OR Sea Shrine OR Floating Castle
Heal Helm - Mirage Tower OR Floating Castle
Zeus Gauntlet - Castle of Ordeals
Power Gauntlet - Sea Shrine
ProRing - Floating Castle OR Gaia
In order to change into a Ninja I need to do the Ice Cavern to get the airship and I need to do the Castle of Ordeals to get the tail. Mirage Tower, Sea Shrine, and Floating Castle all require the airship to access. I really want a ribbon so I think my plan is going to be head for the Waterfall, the Ice Cavern, and then the Castle of Ordeals. Then I'll kill some fiends by doing Sea Shrine, Mirage Tower, and Floating Castle. I'll stop to level if things get tough but I have a feeling once I get a ribbon and a proring that I'll be ok. I will have to make sure I don't level off of any of the dungeon bosses though (I am still scumming, after all) so I may just level to 50 after I become a ninja to be safe.
So, now what? I need to level to 50, become a ninja, gather all the gear I want, and kill a bunch of bosses. Ninja is the first step I think since I need to do that before I hit level 43 if I want all my spell charges. I may need to gear up a little to pull that off so I should also look for easily obtainable treasure chests containing useful stuff. In particular, stuff I may need/want:
Katana - Floating Castle
Light Axe - Sea Shrine
Heal Rod - Castle of Ordeals
Mage Rod - Sea Shrine
Defense Sword - Waterfall
Thor Hammer - Mirage Tower
Masamune - Temple of the Past
Opal Bracelet - Sea Shrine
Black Robe - Floating Castle
Flame Shield - Volcano
Ice Shield - Ice Cavern
Ribbon - Waterfall OR Sea Shrine OR Floating Castle
Heal Helm - Mirage Tower OR Floating Castle
Zeus Gauntlet - Castle of Ordeals
Power Gauntlet - Sea Shrine
ProRing - Floating Castle OR Gaia
In order to change into a Ninja I need to do the Ice Cavern to get the airship and I need to do the Castle of Ordeals to get the tail. Mirage Tower, Sea Shrine, and Floating Castle all require the airship to access. I really want a ribbon so I think my plan is going to be head for the Waterfall, the Ice Cavern, and then the Castle of Ordeals. Then I'll kill some fiends by doing Sea Shrine, Mirage Tower, and Floating Castle. I'll stop to level if things get tough but I have a feeling once I get a ribbon and a proring that I'll be ok. I will have to make sure I don't level off of any of the dungeon bosses though (I am still scumming, after all) so I may just level to 50 after I become a ninja to be safe.
Wednesday, March 30, 2011
Ninja or Thief?
My intention was to try to beat the game as just a thief if it was at all plausible and only upgrade to a ninja if I felt it was going to be needed to win. Having found out that Chaos has twice as much health makes me really think I'll need to upgrade to a ninja but I want to find out for sure with a little napkin math. I need to make this decision soon since in order to get all your ninja spells you need to make the switch by level 42. I'm currently 37 and I'm spending more time scumming for good levels than I am actually leveling since I can defeat everything on the peninsula of power and most of the monsters there don't run away yet. So, what does Chaos have going for him?
Chaos has 100 attack, 100 absorb, 200 hit, 1 crit, and 100 evade. He has 200 magic defense if I feel like casting terrible spells. Half the time he casts a spell from the following list in order: ice3, lit3, slo2, cur4, fir3, ice2, fast, nuke. Half the time that he doesn't cast a spell he uses a skill from the following list in order: crack, inferno, swirl, tornado. The remaining quarter of the time he melees twice. (Four times after he casts fast.)
Crack is an instant kill which I should be immune from since I will have a ProRing. Inferno has a damage value of 96 but is fire so with the ribbon I should always take normal damage from it. Swirl and tornado have damage values of 64 but will do double damage 68 times out of 201.
Ice3 does 70 damage. Lit3 does 60. Slo2 will blow out the thief 100 times of 201 but will just force the ninja to cast fast again. Cur4 is a full heal so I either need to burn him out before he gets around to casting it or I have to live long enough to burn him out after he casts it. Fir3 does 50 damage. Ice2 does 40 damage. Fast doubles his melee damage. Nuke does 100 damage and does double damage 143 times out of 201!
(Note that when a spell does 'X damage' it actually does damage between X and 2X. So Nuke could very well hit for 400.)
If he melees then he swings twice with 168+200 hit. On the NES this would actually be capped at 255 before taking my evade into account but on the PS he gets the full hit. My avoid is likely to be 99 so on the NES I'd get crit 1 time and hit 156 times in 201. On the PS I get crit 1 time and hit 200 times out of 201. That's right, even if I max my agility the 'hard to hit' character is guaranteed to be hit. I could use the shirt to max my avoid at 255 if I wanted to waste time (say, if my plan was to win after he heals to full) which would eliminate all normal hits on the NES and lower them to being hit 113 times instead of every time on the PS. My absorb will be 55 if I wear ribbon, proring, fire shield, opal bracelet. (Ninja only for the shield. I can drop 2 evade and 4 absorb as a thief.) So each time he swings on the NES he does 74 damage and each time he swings on the PS he does 95 damage. But when he attacks he swings twice (4 times after fast) so he actually hits me for 148, 190, 296, or 380 depending on game and haste status.
The expected damage from his spells/skills is 144 for inferno, 128 for swirl and tornado, 105 for ice3, 90 for lit3, 75 for fir3, 60 for ice2, and 257 for nuke.
So his attack damage is actually scarier than his spell damage. (Nuke can only be cast after fast.) These swings all have pretty high variance though, so I while I will get hit by everything I may just take low damage from most of it. But most likely, I'm dead in 7 or 8 damage actions. Probably I have to just burn him out before he casts cur4 (and therefore fast). So I get 7ish attacks to win, more if I get lucky and he attacks me a lot. (But not much more, since if he attacks me a lot I actually die faster.)
Is 7 attacks enough? Well, I'll have equipped masamune at this point. (Or maybe katana?) Masamune has 56 base attack. I will have 54 strength, so I get an extra 27 from that. So I will have 83 total attack. It has 50 hit, for a total of 153 hit and 5 attacks. It has a crit of 40 on the NES and 10 on the PS. Katana has only 33 attack and 35 hit but it has 38 crit on the NES and 30 on the PS. Also, for what it matters, only a ninja can use katana but a thief can use masamune.
Plugging everything into my spreadsheet I have total average damage on the NES with a masamune at 54 per swing. On the NES with a katana is 21. On the PS with a masamune is 34. On the PS with a katana is 17. I have 5 attacks per round so I need 8 rounds to win on the NES with a masamune, 24 on the PS with a masamune, and 47 on the PS with a katana.
I can live 8 rounds for sure and I can definitely get lucky enough to have 8 actions before the full heal, so I'm pretty sure I could win as a thief on the NES. There's no way to win on the PS as a thief. Even if I had infinite life his full heals would come more often than I could deal 4000 damage. Now, I could certainly get lucky with infinite health and get a long enough string of crits to win but the likelihood of that happening seems pretty small.
If I become a ninja then I can cast both fast and temper to boost my own damage. I could try to get lucky and cast slow, dark, and lock to try to make chaos weaker. I have items to use to boost my evasion and to heal myself. Fast alone reduces the number of rounds to kill him from 24 to 12. (+1 for the one to cast fast.) Temper adds 14 to my attack which alone would take me from 24 to 15. Put them both together and I'm winning in 8. This actually doesn't seem unreasonable. I waste two rounds to cast them both so I need to get a lot luckier than on the NES but it just could work.
The debuff spells are essentially impossible to land since Chaos has 200 magic defense and resists status. I think I'd hit 1 time in 201 when I roll a 0 and that's it.
But I don't think I need them. (I guess if I thought I did then I could try over and over to land my 1 in 201.) I am convinced I need to be a ninja though, so I cannot power level to 50 right away. I pretty much have to ding 39, kill Lich, and rush to the class change quest. I think I might be able to kill Chaos if I can pull that off. I just hope I can become a ninja and kill everything before him!
Chaos has 100 attack, 100 absorb, 200 hit, 1 crit, and 100 evade. He has 200 magic defense if I feel like casting terrible spells. Half the time he casts a spell from the following list in order: ice3, lit3, slo2, cur4, fir3, ice2, fast, nuke. Half the time that he doesn't cast a spell he uses a skill from the following list in order: crack, inferno, swirl, tornado. The remaining quarter of the time he melees twice. (Four times after he casts fast.)
Crack is an instant kill which I should be immune from since I will have a ProRing. Inferno has a damage value of 96 but is fire so with the ribbon I should always take normal damage from it. Swirl and tornado have damage values of 64 but will do double damage 68 times out of 201.
Ice3 does 70 damage. Lit3 does 60. Slo2 will blow out the thief 100 times of 201 but will just force the ninja to cast fast again. Cur4 is a full heal so I either need to burn him out before he gets around to casting it or I have to live long enough to burn him out after he casts it. Fir3 does 50 damage. Ice2 does 40 damage. Fast doubles his melee damage. Nuke does 100 damage and does double damage 143 times out of 201!
(Note that when a spell does 'X damage' it actually does damage between X and 2X. So Nuke could very well hit for 400.)
If he melees then he swings twice with 168+200 hit. On the NES this would actually be capped at 255 before taking my evade into account but on the PS he gets the full hit. My avoid is likely to be 99 so on the NES I'd get crit 1 time and hit 156 times in 201. On the PS I get crit 1 time and hit 200 times out of 201. That's right, even if I max my agility the 'hard to hit' character is guaranteed to be hit. I could use the shirt to max my avoid at 255 if I wanted to waste time (say, if my plan was to win after he heals to full) which would eliminate all normal hits on the NES and lower them to being hit 113 times instead of every time on the PS. My absorb will be 55 if I wear ribbon, proring, fire shield, opal bracelet. (Ninja only for the shield. I can drop 2 evade and 4 absorb as a thief.) So each time he swings on the NES he does 74 damage and each time he swings on the PS he does 95 damage. But when he attacks he swings twice (4 times after fast) so he actually hits me for 148, 190, 296, or 380 depending on game and haste status.
The expected damage from his spells/skills is 144 for inferno, 128 for swirl and tornado, 105 for ice3, 90 for lit3, 75 for fir3, 60 for ice2, and 257 for nuke.
So his attack damage is actually scarier than his spell damage. (Nuke can only be cast after fast.) These swings all have pretty high variance though, so I while I will get hit by everything I may just take low damage from most of it. But most likely, I'm dead in 7 or 8 damage actions. Probably I have to just burn him out before he casts cur4 (and therefore fast). So I get 7ish attacks to win, more if I get lucky and he attacks me a lot. (But not much more, since if he attacks me a lot I actually die faster.)
Is 7 attacks enough? Well, I'll have equipped masamune at this point. (Or maybe katana?) Masamune has 56 base attack. I will have 54 strength, so I get an extra 27 from that. So I will have 83 total attack. It has 50 hit, for a total of 153 hit and 5 attacks. It has a crit of 40 on the NES and 10 on the PS. Katana has only 33 attack and 35 hit but it has 38 crit on the NES and 30 on the PS. Also, for what it matters, only a ninja can use katana but a thief can use masamune.
Plugging everything into my spreadsheet I have total average damage on the NES with a masamune at 54 per swing. On the NES with a katana is 21. On the PS with a masamune is 34. On the PS with a katana is 17. I have 5 attacks per round so I need 8 rounds to win on the NES with a masamune, 24 on the PS with a masamune, and 47 on the PS with a katana.
I can live 8 rounds for sure and I can definitely get lucky enough to have 8 actions before the full heal, so I'm pretty sure I could win as a thief on the NES. There's no way to win on the PS as a thief. Even if I had infinite life his full heals would come more often than I could deal 4000 damage. Now, I could certainly get lucky with infinite health and get a long enough string of crits to win but the likelihood of that happening seems pretty small.
If I become a ninja then I can cast both fast and temper to boost my own damage. I could try to get lucky and cast slow, dark, and lock to try to make chaos weaker. I have items to use to boost my evasion and to heal myself. Fast alone reduces the number of rounds to kill him from 24 to 12. (+1 for the one to cast fast.) Temper adds 14 to my attack which alone would take me from 24 to 15. Put them both together and I'm winning in 8. This actually doesn't seem unreasonable. I waste two rounds to cast them both so I need to get a lot luckier than on the NES but it just could work.
The debuff spells are essentially impossible to land since Chaos has 200 magic defense and resists status. I think I'd hit 1 time in 201 when I roll a 0 and that's it.
But I don't think I need them. (I guess if I thought I did then I could try over and over to land my 1 in 201.) I am convinced I need to be a ninja though, so I cannot power level to 50 right away. I pretty much have to ding 39, kill Lich, and rush to the class change quest. I think I might be able to kill Chaos if I can pull that off. I just hope I can become a ninja and kill everything before him!
Tuesday, March 29, 2011
8-Bit Theater
Before I'd decided to run the solo thief I'd actually started a game up with a normal sized party. I used a party based on the webcomic 8-Bit Theater which is the best serial webcomic I've ever seen. (It loosely follows the plot of Final Fantasy and has finished. Go read it if you haven't. Read it again if you have!) The party featured in the comic is Fighter, Thief, Red Mage, and Black Mage but I got to name the characters in my game party. Now, these characters are taken to some real extremes so it's hard to match characters up to people I know exactly, but I was pretty happy with my overall choices. Can you guess who is who?
Monday, March 28, 2011
Lich Dropped Out And Got Big
I did a lot of digging yesterday (ok, I googled "how much health does Lich have in Final Fantasy Origins" and clicked each link until I found one with the information I wanted) and I figured out why Lich didn't die when I did way more than his max health to him. It turns out the people at Square who put out the remakes of the game decided to buff his health along with that of some other bosses. (I did notice Vampire didn't die when he should have but since I just hit him again and he died I didn't pay much attention to it.) So while Lich has 400 health on the NES he has 800 health on the PS and actually has 1200 health on the GBA and PSP. I'm not aware of any changes to the game that would justify this so I assume they just wanted to make it harder. Damage dealt in the PS version is actually substantially lower than damage dealt on the NES as it is, so doubling the health of a monster drastically increases the difficulty of the fight. (Crit percentages were a lot higher on the NES due to a bug and crit damage was a lot higher due to what I believe was a design change and not a bug fix as they fundamentally changed the crit damage formula.)
I'm currently working on leveling to 39 to obtain my 4th attack. My hope is the extra magic defense will help make the slow spell miss and coupled with the 4th attack I should be able to beat him, but I'm running out of ways to get more powerful. There is no 5th attack coming until either I become a ninja (and get a much better weapon) or obtain masamune. There is never a 6th attack. The level cap of 50 means my damage gain from strength, evade from agility, and magic defense from leveling is going to run dry real soon. I was pretty sure I could win with the NES values but can I win with PS values? Who else fatted up? I went into the pages at this site and looked through all the bosses. Most seemed to change between the NES and PSP version but only 6 look to have changed between the NES and PS versions.
Vampire - 156 - 280 - 280
Lich - 400 - 800 - 1200
Kary - 600 - 1200 - 1440
Lich #2 - 500 - 1000 - 2800
Kary #2 - 700 - 1400 - 3200
Chaos - 2000 - 4000 - 20000
Vampire was no problem. Lich hurt but I think I can surmount it. The remaining 4 I'm not sure so sure of. An extra 700 health on the second Kary seems like it might be a real problem but I'm hoping it can be done. 4000 on Chaos is shattering my will to go on. Doing 2000 damage at all was pretty daunting. 4000 seems off the chart, especially with the nerfed crit damage. I'm going to press on, of course, but I no longer feel like this is something I can accomplish. I am now wishing my dead idiots were also thieves so I could kill him with 2 thieves. Instead all my buddies were squishy black mages.
Oh, and Warmech has 1000 health on the NES and 2000 health with a 100 health per round regen rate on the PS. Yikes!
I'm currently working on leveling to 39 to obtain my 4th attack. My hope is the extra magic defense will help make the slow spell miss and coupled with the 4th attack I should be able to beat him, but I'm running out of ways to get more powerful. There is no 5th attack coming until either I become a ninja (and get a much better weapon) or obtain masamune. There is never a 6th attack. The level cap of 50 means my damage gain from strength, evade from agility, and magic defense from leveling is going to run dry real soon. I was pretty sure I could win with the NES values but can I win with PS values? Who else fatted up? I went into the pages at this site and looked through all the bosses. Most seemed to change between the NES and PSP version but only 6 look to have changed between the NES and PS versions.
Vampire - 156 - 280 - 280
Lich - 400 - 800 - 1200
Kary - 600 - 1200 - 1440
Lich #2 - 500 - 1000 - 2800
Kary #2 - 700 - 1400 - 3200
Chaos - 2000 - 4000 - 20000
Vampire was no problem. Lich hurt but I think I can surmount it. The remaining 4 I'm not sure so sure of. An extra 700 health on the second Kary seems like it might be a real problem but I'm hoping it can be done. 4000 on Chaos is shattering my will to go on. Doing 2000 damage at all was pretty daunting. 4000 seems off the chart, especially with the nerfed crit damage. I'm going to press on, of course, but I no longer feel like this is something I can accomplish. I am now wishing my dead idiots were also thieves so I could kill him with 2 thieves. Instead all my buddies were squishy black mages.
Oh, and Warmech has 1000 health on the NES and 2000 health with a 100 health per round regen rate on the PS. Yikes!
Sunday, March 27, 2011
Lich is a Big Cheater!
I leveled up to 28 and made it to Lich. He has 400 health according to every FAQ I've been able to find. I'm sure I did well over 500 damage to him and he still didn't die. So I decided to level up some more and came back at level 32. I kept a running total of how much damage I did to him and it was only 457 this time but that still exceeds 400 by quite a bit so I really don't know what's going on here. Do I need to level all the way to 39 to get my fourth attack to be safe? I wish I knew what my actual goal was so I could work out if I needed to level more or just try again and get luckier.
Saturday, March 26, 2011
Final Fantasy Marathon: What To Include?
A couple days ago my sister linked to the music from one of the zones in Final Fantasy XI (the MMORPG from 9 years ago). It brought back memories of playing it before I got converted to World of Warcraft and got me wondering... Should it be part of this marathon? If so, when have I 'beaten' it to move on to FFXII? Should I even be doing things in order? I have hand held versions of several of the games. Should I be playing those on the bus to work? How about true sequels that came out at later dates? FFX-2 and FFIV-2 in particular. What about spin off games? Final Fantasy: Mystic Quest, Final Fantasy Tactics, Final Fantasy Crystal Chronicles. The old Gameboy Final Fantasy Legends games. Chocobo Tales. Something I've never heard of before for the DS "Final Fantasy: The 4 Heroes of Light"?
My initial thinking was to just play the true console games. I through X, XII, XIII. X-2 because wanting to play it in particular inspired playing them all again. But why shouldn't I track down other games I haven't played before? FFIV is my favourite game of all time, shouldn't I give the sequel a spin? And if I could find other people to play FFXI, shouldn't I? (Apparently the servers were shut down due to the tragedy in Japan but I imagine they'll be up and running again eventually.) I think things would get a little confusing if I was playing multiple games at once so the hand held ones will just be played once their time comes, but I think the MMO would be such a break that I shouldn't wait to 'finish' it.
I don't own any of the spin-off games except Mystic Quest and the Tactics Advance games but I may try to track them down if the mood strikes when I get close to the proper times. For my later reference in order, by initial release date. (Wow! A lot of stuff here!)
Final Fantasy- 1987
Final Fantasy II - 1988
Final Fantasy III - 1990
Final Fantasy Legend - 1989
Final Fantasy IV - 1991Final Fantasy Legend II - 1991
Final Fantasy Adventure - 1991
Final Fantasy Legend III - 1991
Final Fantasy Mystic Quest - 1992
Final Fantasy V - 1992
Final Fantasy VI - 1994
Final Fantasy VII - 1997
Final Fantasy Tactics - 1997
Chocobo's Mysterious Dungeon - 1997
Ehrgeiz - 1998
Chocobo's Mysterious Dungeon 2 - 1998
Final Fantasy VIII - 1999
Chocobo Racing - 1999
Chocobo Stallion - 1999
Chocobo Collection - 1999
Final Fantasy IX - 2000
Working Chocobo - 2000
Final Fantasy X - 2001
Final Fantasy XI - 2002
Kingdom Hearts - 2002
Chocobo Land - 2002
Final Fantasy X-2 - 2003
Final Fantasy Tactics: Advance - 2003
Final Fantasy Crystal Chronicles - 2003
Final Fantasy VII: Before Crisis - 2004
Kingdom Hearts: Chain of Memories - 2004
Final Fantasy VII: Snowboarding - 2005
Kingdom Hearts 2 - 2005
Final Fantasy XII - 2006
Final Fantasy VII: Dirge of Cerberus - 2006
Final Fantasy XII: Revenant Wings - 2007
Final Fantasy VII: Crisis Core - 2007
Final Fantasy Tactics: The War of the Lions - 2007
Final Fantasy Tactics A2: Grimoire of the Rift - 2007
Final Fantasy Crystal Chronicles: Ring of Fates - 2007
Final Fantasy IV: The After Years - 2008
Final Fantasy XIII - 2009
Dissidia: Final Fantasy - 2009
Final Fantasy: The 4 Heroes of Light - 2009
Final Fantasy XIV - 2010
Final Fantasy XIII: Agito - TBA
Final Fantasy XIII: Versus - TBA
Final Fantasy XIII-2 - TBA
My initial thinking was to just play the true console games. I through X, XII, XIII. X-2 because wanting to play it in particular inspired playing them all again. But why shouldn't I track down other games I haven't played before? FFIV is my favourite game of all time, shouldn't I give the sequel a spin? And if I could find other people to play FFXI, shouldn't I? (Apparently the servers were shut down due to the tragedy in Japan but I imagine they'll be up and running again eventually.) I think things would get a little confusing if I was playing multiple games at once so the hand held ones will just be played once their time comes, but I think the MMO would be such a break that I shouldn't wait to 'finish' it.
I don't own any of the spin-off games except Mystic Quest and the Tactics Advance games but I may try to track them down if the mood strikes when I get close to the proper times. For my later reference in order, by initial release date. (Wow! A lot of stuff here!)
Final Fantasy- 1987
Final Fantasy II - 1988
Final Fantasy III - 1990
Final Fantasy Legend - 1989
Final Fantasy IV - 1991Final Fantasy Legend II - 1991
Final Fantasy Adventure - 1991
Final Fantasy Legend III - 1991
Final Fantasy Mystic Quest - 1992
Final Fantasy V - 1992
Final Fantasy VI - 1994
Final Fantasy VII - 1997
Final Fantasy Tactics - 1997
Chocobo's Mysterious Dungeon - 1997
Ehrgeiz - 1998
Chocobo's Mysterious Dungeon 2 - 1998
Final Fantasy VIII - 1999
Chocobo Racing - 1999
Chocobo Stallion - 1999
Chocobo Collection - 1999
Final Fantasy IX - 2000
Working Chocobo - 2000
Final Fantasy X - 2001
Final Fantasy XI - 2002
Kingdom Hearts - 2002
Chocobo Land - 2002
Final Fantasy X-2 - 2003
Final Fantasy Tactics: Advance - 2003
Final Fantasy Crystal Chronicles - 2003
Final Fantasy VII: Before Crisis - 2004
Kingdom Hearts: Chain of Memories - 2004
Final Fantasy VII: Snowboarding - 2005
Kingdom Hearts 2 - 2005
Final Fantasy XII - 2006
Final Fantasy VII: Dirge of Cerberus - 2006
Final Fantasy XII: Revenant Wings - 2007
Final Fantasy VII: Crisis Core - 2007
Final Fantasy Tactics: The War of the Lions - 2007
Final Fantasy Tactics A2: Grimoire of the Rift - 2007
Final Fantasy Crystal Chronicles: Ring of Fates - 2007
Final Fantasy IV: The After Years - 2008
Final Fantasy XIII - 2009
Dissidia: Final Fantasy - 2009
Final Fantasy: The 4 Heroes of Light - 2009
Final Fantasy XIV - 2010
Final Fantasy XIII: Agito - TBA
Final Fantasy XIII: Versus - TBA
Final Fantasy XIII-2 - TBA
Subscribe to:
Posts (Atom)

