Posts for Nitrodon


1 2
9 10 11 12 13 14
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
Gorash wrote:
No leveling required, all weapons at max already. Use the spear, it does more damage, and (not coincidently) is already selected.
Except for the fact that the spear is currently selected, all of these assertions become false when you get your sword upgraded, which you are forced to do before Tropicallo. I think the sword would therefore be more useful.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
I use X-Chat, and I never installed ActiveTCL, so I always get that same warning, but I still don't have any trouble joining #nesvideos. Your problem is elsewhere. Maybe you should describe exactly what you did in your attempt to enter #nesvideos, and what the result was.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
When trying to improve Soulrivers' run, I stumbled upon a bug in stage 7. It's useless there, but it I managed to abuse it in stage 4. This bug lets you go through walls which are only 1 tile wide. (If you use it in a wall more than 1 tile wide, it's useless.) Note that if you are inside a block which can fall down (or presumably a rock, but my brief test failed to push myself into one), you die, so this bug doesn't apply there. WIP completing stage 4. Also, falling off a platform gives exactly the same 1-pixel boost as jumping. EDIT: I confirmed that glitching inside a rock will kill you. It seems that you can't glitch into ground-level blocks (ground level where you enter the block, not where you start the jump) unless the space above them is blocked. Smashing blocks by headbutting them instantly moves you next to them, so it's the fastest way to travel when applicable. And since I'm here, WIP completing stage 10.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
I'm reviving this topic. I finished a run of this game a couple days ago. It's nearly 13 minutes faster than windeu's run. I've decided not to submit this version due to several known improvements. http://dehacked.2y.net/microstorage.php/info/666779019/Lolo3-nitrodon.fcm
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
When an apprentice leaves your party, the stats and levels he gained while in your party are completely ignored. If you talk to that apprentice again, he gains levels from the time that he joined you earlier, using the formula for apprentices not in your party. On a tangentially related subject, the Patrof apprentice's level works differently. He starts at your level+5 when the Eygus sage moves out of the way, and never gains any levels after that. Stats are randomly generated when an apprentice levels up, which happens when the apprentice takes over Patrof, joins you, or attacks you outside of Patrof castle. For direct RNG manipulation, I usually use a spreadsheet program, but I suppose your idea of making a DOS-like program will also work.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
Did you ask a question? I can't find one. Anyway, the code that executes every frame is a 15-bit linear feedback shift register with tap sequence [15,7]. When the RNG is actually used, it causes a nonlinear transformation of the RNG state, thus making it hard to predict the results of multiple calls to the RNG.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
If I'm not mistaken, there is some water that you need to drain before fighting Death in a normal playthrough. It's possible to try to go through the water before draining it. (but you lose health, and you can't open the door to the boss fight anyway)
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
The command at C2/9582 clears the "M" flag, and thus sets the accumulator and memory to 16-bit mode. Thus, when C2/95A0 rotates $40, it uses $41 as the high byte. You appear to understand this part. ROR actually rotates 17 bits (in 16-bit mode): the 16-bit $40 and the carry flag. If the carry flag is set from the ROR at C2/959E, it will be rotated into $40.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
The routine that deals damage to an enemy is at C4/4ECA-C4/4F43. At C4/4EFF, it calls C2/79D3 to determine the amount of damage dealt. Excuse any vagueness or omissions in my comments; This game was the first game I did much hacking on, and thus I was inexperienced with ROM hacking when I did this.
C2/79D3: 22 AF 72 C2  JSR $C272AF   (get player data)
C2/79D7: C2 20        REP #$20
C2/79D9: A0 0C 00     LDY #$000C
C2/79DC: B7 56        LDA [$56],Y   (power)
C2/79DE: 85 40        STA $40
C2/79E0: A0 1E 00     LDY #$001E
C2/79E3: B7 56        LDA [$56],Y   (status)
C2/79E5: 89 20 00     BIT #$0020    (if power up)
C2/79E8: F0 02        BEQ $79EC
C2/79EA: 06 40        ASL $40
C2/79EC: A0 12 00     LDY #$0012
C2/79EF: B7 56        LDA [$56],Y   (equipped weapon)
C2/79F1: 29 FF 00     AND #$00FF
C2/79F4: 85 42        STA $42
C2/79F6: 0A           ASL
C2/79F7: 18           CLC
C2/79F8: 65 42        ADC $42
C2/79FA: A8           TAY
C2/79FB: C2 20        REP #$20
C2/79FD: A9 3A 4F     LDA #$4F3A
C2/7A00: 85 50        STA $50
C2/7A02: E2 20        SEP #$20
C2/7A04: A9 C0        LDA #$C0
C2/7A06: 85 52        STA $52
C2/7A08: C2 20        REP #$20
C2/7A0A: B7 50        LDA [$50],Y   (weapon data pointer)
C2/7A0C: 85 53        STA $53
C2/7A0E: C8           INY
C2/7A0F: C8           INY
C2/7A10: E2 20        SEP #$20
C2/7A12: B7 50        LDA [$50],Y
C2/7A14: 85 55        STA $55
C2/7A16: C2 20        REP #$20
C2/7A18: A7 53        LDA [$53]     (weapon power)
C2/7A1A: 18           CLC
C2/7A1B: 65 40        ADC $40
C2/7A1D: 85 40        STA $40
C2/7A1F: A0 1E 00     LDY #$001E
C2/7A22: B7 56        LDA [$56],Y
C2/7A24: 89 00 08     BIT #$0800    (if defend)
C2/7A27: F0 08        BEQ $7A31
C2/7A29: A5 40        LDA $40
C2/7A2B: 4A           LSR
C2/7A2C: 18           CLC
C2/7A2D: 65 40        ADC $40
C2/7A2F: 85 40        STA $40       (x1.5)
C2/7A31: 22 D3 72 C2  JSR $C272D3   (get enemy data)
C2/7A35: C2 20        REP #$20
C2/7A37: A0 1C 00     LDY #$001C
C2/7A3A: B7 59        LDA [$59],Y
C2/7A3C: 4A           LSR
C2/7A3D: 85 42        STA $42       (defense/2)
C2/7A3F: A0 1E 00     LDY #$001E
C2/7A42: B7 59        LDA [$59],Y
C2/7A44: 89 08 00     BIT #$0008    (if defense down)
C2/7A47: F0 02        BEQ $7A4B
C2/7A49: 46 42        LSR $42
C2/7A4B: A0 14 00     LDY #$0014
C2/7A4E: B7 59        LDA [$59],Y   (enemy armor)
C2/7A50: 29 FF 00     AND #$00FF
C2/7A53: F0 66        BEQ $7ABB     (branch if no armor, i.e. not an apprentice)
C2/7A55: 85 44        STA $44
C2/7A57: 0A           ASL 
C2/7A58: 18           CLC 
C2/7A59: 65 44        ADC $44
C2/7A5B: A8           TAY 
C2/7A5C: C2 20        REP #$20
C2/7A5E: A9 3A 4F     LDA #$4F3A
C2/7A61: 85 50        STA $50
C2/7A63: E2 20        SEP #$20
C2/7A65: A9 C0        LDA #$C0
C2/7A67: 85 52        STA $52
C2/7A69: C2 20        REP #$20
C2/7A6B: B7 50        LDA [$50],Y   (armor data pointer)
C2/7A6D: 85 53        STA $53
C2/7A6F: C8           INY
C2/7A70: C8           INY
C2/7A71: E2 20        SEP #$20
C2/7A73: B7 50        LDA [$50],Y
C2/7A75: 85 55        STA $55
C2/7A77: C2 20        REP #$20
C2/7A79: A7 53        LDA [$53]     (armor defense stat)
C2/7A7B: 29 FF 00     AND #$00FF
C2/7A7E: 18           CLC
C2/7A7F: 65 42        ADC $42
C2/7A81: 85 42        STA $42
C2/7A83: A0 13 00     LDY #$0013
C2/7A86: B7 59        LDA [$59],Y   (accessory)
C2/7A88: 29 FF 00     AND #$00FF
C2/7A8B: F0 2E        BEQ $7ABB     (branch if no accessory)
C2/7A8D: 85 44        STA $44
C2/7A8F: 0A           ASL
C2/7A90: 18           CLC
C2/7A91: 65 44        ADC $44
C2/7A93: A8           TAY
C2/7A94: C2 20        REP #$20
C2/7A96: A9 3A 4F     LDA #$4F3A
C2/7A99: 85 50        STA $50
C2/7A9B: E2 20        SEP #$20
C2/7A9D: A9 C0        LDA #$C0
C2/7A9F: 85 52        STA $52
C2/7AA1: C2 20        REP #$20
C2/7AA3: B7 50        LDA [$50],Y   (accessory data pointer)
C2/7AA5: 85 53        STA $53
C2/7AA7: C8           INY
C2/7AA8: C8           INY
C2/7AA9: E2 20        SEP #$20
C2/7AAB: B7 50        LDA [$50],Y
C2/7AAD: 85 55        STA $55
C2/7AAF: C2 20        REP #$20
C2/7AB1: A7 53        LDA [$53]     (accessory defense stat)
C2/7AB3: 29 FF 00     AND #$00FF
C2/7AB6: 18           CLC
C2/7AB7: 65 42        ADC $42
C2/7AB9: 85 42        STA $42
C2/7ABB: C2 20        REP #$20
C2/7ABD: A5 40        LDA $40
C2/7ABF: 38           SEC
C2/7AC0: E5 42        SBC $42
C2/7AC2: 90 2C        BCC $7AF0     (branch if negative)
C2/7AC4: 85 40        STA $40       (base damage)
C2/7AC6: 4A           LSR
C2/7AC7: 22 6B 95 C2  JSR $C2956B   (random number 0 to (damage/2)-1)
C2/7ACB: C2 20        REP #$20
C2/7ACD: 85 44        STA $44
C2/7ACF: A5 40        LDA $40
C2/7AD1: 4A           LSR
C2/7AD2: 4A           LSR
C2/7AD3: 85 42        STA $42       (damage/4)
C2/7AD5: A5 40        LDA $40
C2/7AD7: 38           SEC
C2/7AD8: E5 42        SBC $42
C2/7ADA: 18           CLC
C2/7ADB: 65 44        ADC $44       (adjusted damage)
C2/7ADD: 30 11        BMI $7AF0
C2/7ADF: F0 0F        BEQ $7AF0
C2/7AE1: 85 40        STA $40
C2/7AE3: A0 1E 00     LDY #$001E
C2/7AE6: B7 59        LDA [$59],Y
C2/7AE8: 89 04 00     BIT #$0004    (if enemy defense up)
C2/7AEB: F0 02        BEQ $7AEF
C2/7AED: 46 40        LSR $40
C2/7AEF: 6B           RTL

C2/7AF0: A9 01 00     LDA #$0001    (damage = 1)
C2/7AF3: 85 40        STA $40
C2/7AF5: 6B           RTL
Critical hits are checked at C4/4F0E and are determined at the beginning of the round, before you get a chance to select an action. If my notes were better organized, I might even be able to tell you where that code is.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
According to my disassembly, the RNG state is at 7E006C (low byte) and 7E006E (high byte), and the algorithm consists of multiplying that number by 0x0383 and returning the high byte. The routine is at C2/95F2 if you wanted to look, assuming you were successful in learning assembly language. The only reason the RNG advances every couple seconds in overworld battles is because of the waves rolling onto the shore.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
Interesting. I wouldn't have known that, since I never TASed a fog chapter after learning how to turn off fog completely. My old vision+15 code should still work without affecting enemy AI, since I used the same type of code to plan turns in my old FE7 test run with no problems. I am curious as to what the AI did differently with and without fog.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
There are 2 diagonally adjacent spaces that are 7 spaces away from Seth on the final turn, perfect for wasting RNs for the critical against Zonta. Otherwise, this chapter looks perfect. (You don't need to bother releasing another update until sometime after you beat chapter 6.) There's not much risk of your run being obsoleted, since you and I are probably the only ones crazy enough to TAS a Fire Emblem game.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
What I meant was that if you manipulate criticals on both the archer and the cavalier, you will still be able to get the 54% hit 3% critical from a different RN, approximately 32 later than the one you used. The silver sword thing was mostly based on the assumption that (1) you'll want the silver sword sometime in chapters 9-14, and (2) the javelin Orson took can wait until chapter 15. If either of these assumptions is incorrect, I didn't really have any point at all. Also, I still mentioned trading Orson's weapons to Ephraim at the end of turn 6 before dropping him, which will probably save a pitiful 10 frames or so from your current version (the time it took to change Orson's equipped weapon).
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
After looking again, I can see that manipulating the critical to kill that archer makes it harder (98 RNs wasted) to manipulate the critical against the cavalier next turn. However, getting criticals against the next two enemies only wastes 11 and 29 RNs respectively in that case, assuming my memory doesn't suck. Your current run has 17, 2, and 67 RNs wasted respectively. If you don't kill the archer, the fighter still dies to a critical if you waste 4 RNs instead of 2, so the silver sword is unnecessary either way.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
(Actually I meant 3% minus the 2 luck the archer had, sorry for the misunderstanding.) I checked, and the 1% critical can be manipulated anyway by wasting 34 RNs (which you would waste on the way to the 54% hit, 3% critical anyway), so it would be worth manipulating. Since you don't use the silver sword during this chapter, it would be faster to trade that away to put the javelin in the first slot. (If you plan to give Seth the silver sword and don't need the extra javelin prior to chapter 15, this also saves a trade in chapter 8.) I also noticed you unnecessarily killed a mage with a javelin counter on turn 6. Since you use the Steel Lance against Zonta and don't trade it to Ephraim at the end, you can do all of your trading to Ephraim before dropping him on turn 6, thus avoiding this counter efficiently.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
Indeed, manipulating a 54% hit with a 3% critical can be annoying. It may be faster to waste the RNs on a previous turn, but I could be wrong. Also, I'd just like to remind you that this isn't FE3, and thus the cursor is allowed to cut across walls and other places you can't move in order to reach somewhere you can move.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
Chapter 3: Unless I'm mistaken, this is approximately 1 second faster than Molotov's run, which means the strategy is slower. Were the levels gained by Vanessa worth the extra time taken? Chapter 4: This chapter looks good, and winning before the reinforcements show up on the upper left is impressive. As for your question, I don't know exactly how to do it, even though I successfully did the same thing (unmanipulated, even) in chapter 26 of my FE7 test run. I know lowering Artur's HP helps, but I'm not sure if that would be enough here. Chapter 5: May I suggest moving to this space on turn 2 instead? It's a slightly longer route (measured in squares), but you'll get into 3 fewer battles, and you'll still win in 3 turns.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
IronSlayer wrote:
Another question; why did you save during the Great Wall?
The only way to manipulate luck in this game is to change the number of times the RNG is used. Whenever Gaia opens her mouth, the RNG is used once. The result is a perfectly manipulated Sand Fanger battle. (Also, he didn't save when he talked to Gaia.)
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
Just a few things I didn't mention yet: 1. In menus, you can press A on the same frame that you press the last directional button. A small warning: if you do this in the item menu, that direction will also be pressed in the next submenu (equip/use, discard, trade). 2. Because L doesn't work unless the cursor is on a square, if you want to move the cursor before pressing L, you should continue holding B even on the frame that you press L. Also (you did this correctly once), you can press A immediately on the next frame after pressing L. I didn't check any of the times you skipped a cutscene, but I'll assume you did that optimally. Other than what I mentioned here, I don't think there are any other places where you can shave off a few frames. As for javelins, I don't know how many to buy. I can tell you that Molotov bought 10 javelins in his run, and I think I remember hearing that he had one left at the end.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
First, I'd like to say that the strategy looks good, and the manipulation is good too. Now, I'll get into some optimizations. General: You're much better at pressing buttons on earlier frames now, but it's still possible to do certain things (such as select a character, select a destination, or start moving the cursor) one frame faster. When in doubt, just keep doing it earlier until it doesn't work. Chapter 1, turn 2: When wasting RNs, it's usually better to waste them while moving the cursor in a useful direction. In this case, up+left, down+left, up+left, up+left, down+left, up+left, down+left, up+right would reach the same RN and make the cursor reach Seth's destination about 20 frames more quickly than you did. Chapter 2, turn 1: Moving the cursor to Gilliam and pressing L is 3 frames faster than moving the cursor to Vanessa directly. (Moving the cursor to Franz and pressing L twice will also work.) Also, after moving Vanessa, moving the cursor off her before pressing L will save 1 frame. Chapter 2, turn 2: Again, moving to Gilliam and pressing L is faster. Also, moving the cursor in a way which forces the screen to scroll back after selecting Vanessa's destination lost a few frames. As in turn 1, move the cursor off Vanessa before pressing L (which is even more important now that pressing L immediately makes the screen scroll). Chapter 2, turn 3: You made Vanessa move 2 extra spaces, thus losing 8 frames. This can be fixed by replacing up, nil, up+right, down+left, up with up, left, up+right, down+left, up+right. Chapter 2, turn 4: I assume you've considered this, but I'd just like to point out that (if the RNG cooperates) it would probably be faster to make Eirika kill that brigand during the player phase. I apologize if any of this sounds harsh. I merely intend to point out things you could have done slightly faster, most of which can only be noticed by someone with experience TASing a Fire Emblem game. I encourage you to keep up the good work on this run.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
Nice trick to stop your vertical speed. I expected you were just repeating a method which had been proven wrong, especially since the screenshot you linked to is the same URL, but I'm glad I was proven wrong about that.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
It's already been established that the person who made that screenshot forgot that he had the "always run" cheat activated. This allowed him to keep running speed after kicking against the wall. The sequence break is impossible without cheats.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
I never actually figured out how much boost a headbounce gives (because I don't know how to do a headbounce), but the 128 you listed on that page is a reasonable assumption. EDIT: It's 152. If Flip+Twist+Z-flip (432) takes less than 18/19 of the time taken for Tabletop+Flip+Twist (456), then it will turn out to be better.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
The only reason it was done that way is because the damage formula is (rng.callRN()/8*attack/256+attack-defense/2)/2, where the random variance (rng.callRN()/8) also depends on the type of attack. The attack value of a boomerang is 100, and the catfish's defense is 10.
Experienced Forum User, Published Author, Active player (283)
Joined: 3/4/2006
Posts: 341
qbproger wrote:
I was looking at the source code you posted. I don't know if it's true for Java, but I know in C++ multiplication is slightly faster than division so instead of /2 you can do *0.5 get the same results and it's less assembly instructions. Also, on a line like this: int damage = (rng.callRN()/8*100/256+100-10/2)/2; You could do the math in a calculator and just put in a number (of what you can) the 10/2 in the end could just be 5 and 100 is then 95 then after all reducing you get something like this: (rng.callRN()*25)/1024+47.5 put in 5 for the callRN() both came out with the same answers, but the second one does much less math. I don't know if you're still using that program or not, but it could be faster... there might be other optimizations, i only saw what you posted.
The numbers used are integers, so Java rounds every intermediate result to an integer. (and I hope it rounds down, since that's what the game does.) The simplified expression you suggested doesn't give the same result.
1 2
9 10 11 12 13 14