11 March 2016 - Forum Rules
Started by redmagejoe, December 10, 2019, 03:09:14 AM
Quote from: abw on May 28, 2020, 07:42:50 PMI haven't encountered an Iron Giant yet, but I do feel that monsters flee too much in general. Dividing the HP difference by 64 (minimum 14444 party HP required for a 1% chance for a lone Iron Giant to run) or even 128 (25388 HP) instead of 32 (8972 HP) would be an easy change to make. That said, I've had an average over my recent playthroughs of about 7000 HP when reaching the final boss and haven't had any serious difficulties, so 12000 HP seems like a lot... maybe I've been abusing save states too much?
Quote from: redmagejoe on May 28, 2020, 02:04:45 PMI will upload the patch to my drive and link it here, while also updating the submission. Sorry about the inconvenience. https://tinyurl.com/ybk7sz2a
Quote from: redmagejoe on June 02, 2020, 09:45:20 PMAwesome work as always, abw! And that's a LOT of bugs fixed, indeed. Which of course means that's a lot of bugs in this game, hoo boy...
Quote from: redmagejoe on June 02, 2020, 09:45:20 PMI think Confuse taking effect immediately qualifies in Bug Fix using the same concept of other statuses, lack of MP, etc, not being checked in the same turn. Confuse should definitely immediately result in the next attack being affected.
Quote from: redmagejoe on June 02, 2020, 09:45:20 PMAs for doing a random command, I don't think that's necessary. Series convention has always been physical attacks
QuoteMonsters that are killed by poison/venom have their current HP set to 0 and KO Ailment bit set, but are not actually removed from battle; they remain valid targets (you can even cast Life on them to bring them back!) and need to attacked again in order to remove them from battle.
Quote from: redmagejoe on June 02, 2020, 10:00:17 PMYou're right, I see that it was handled differently depending on the installment. I think it would be best not to depart too much from source material, design-wise, for Restored though. I think we can leave it as it is.
Quote from: redmagejoe on June 02, 2020, 10:00:17 PMI also opted to remove the INT/SPR penalty removal from the Restored list, because after playing with it, I realize it's actually not too hard to have a good "mage" equipment setup where you only lose 0-20% of your bonus depending on good equipment choices. I feel that remakes also took too far the desire to make the game more accessible, and I don't think the armor penalties were all that hard to work around.
Quote from: redmagejoe on June 02, 2020, 10:00:17 PMIf you see anything on my list I neglected to remove, please say so. I've been trying to organize the items near similar items compared to when I first made it, but it's possible I've still overlooked curating it.
Quote from: redmagejoe on June 02, 2020, 10:00:17 PMQuoteMonsters that are killed by poison/venom have their current HP set to 0 and KO Ailment bit set, but are not actually removed from battle; they remain valid targets (you can even cast Life on them to bring them back!) and need to attacked again in order to remove them from battle.Did this already get fixed? I feel like it already got fixed.
QuoteWeapons and Shields: At the end of combat, you gain skill independently for the items in each hand, based on the number of attacks you made during the fight. Note that the game doesn't check what you were using when you made the attack, but rather assigns the skill advancement to whatever you were holding at the end of combat. If you're holding two of the same type of weapon, both will add progress points, effectively doubling your rate of progress. The modifier for weapon advancement is +1, so the formula is Rank + Attacks %u2212 Level + 1. Attacking a rank 1 monster with a level 1 weapon will thus result in 2 points of progress for the first attack, and 1 additional point for each subsequent attack during the same combat. Note that weapons are subject to the target-canceling exploit mentioned below.Magic: Each of your known spells levels independently during combat, and you can progress in multiple spells during the same fight. The modifier for spells is +3, making the formula Rank + Times Cast %u2212 Level + 3. Casting a level 1 spell during a rank 1 fight will earn you 4 progress points for the first cast, and 1 point for each additional cast. It is thus prudent to mix up your spells during combat, since the first casting of each spell is generally worth the most progress. Magic is also subject to the target-canceling exploit described below. Note that magic spells cast outside of combat always gain 2 progress points per casting, regardless of level. You cannot cast a spell outside of combat unless it would have some effect.
Quote from: redmagejoe on June 04, 2020, 01:58:04 PMAre any of these calls in the battle routines? I can imagine a noticeable impact with the smaller overhead if so, like the very long pause between the last action of a round before Firion steps forward and the player can issue commands again. Something like 2-3 whole seconds of waiting.
Quote from: redmagejoe on June 04, 2020, 01:58:04 PMIs my assumption about the behavior of the passive growth incorrect? Is it simply doing a different minor addition based on difference in rank?
QuoteConsider adding running gross of lost HP/MP rather than net for end-of-battle growth calculations.
L1D97: 9D97 LDY $88 ; put tile counter ? in Y 9D99 LDX $7400,Y ; get ??? in X 9D9C LDY #$00 9D9E LDA $7800,X ; get tile ID 9DA1 STA ($80),Y ; save as map tile 9DA3 INY 9DA4 LDA $7880,X ; get tile ID +$80 9DA7 STA ($80),Y ; save as map tile +1 9DA9 LDY #$20 ; move up $20 9DAB LDA $7900,X ; get tile ID +$100 9DAE STA ($80),Y ; save as map tile +$20 9DB0 INY 9DB1 LDA $7980,X ; get tile ID +$180 9DB4 STA ($80),Y ; save as map tile +$21 9DB6 LDA $80 ; load low byte of map tile pointer 9DB8 CLC 9DB9 ADC #$02 ; add 2 9DBB STA $80 ; save low byte of map tile pointer 9DBD AND #$1F ; keep it under 32 tiles 9DBF BNE L1DCC ; if map tile = #$20 then jump ahead 9DC1 LDA $80 ; load low byte of map tile pointer 9DC3 CLC 9DC4 ADC #$20 ; add $20 (next row) 9DC6 STA $80 9DC8 BCC L1DCC ; if it wrapped, jump ahead 9DCA INC $81 ; else, increase the high byte of map tile pointer L1DCC: 9DCC INC $88 ; increase the tile counter ? 9DCE BNE L1D97 ; and jump back to loading the map until it wraps
L3D39F: D39F LDY #$00 D3A1 LDA ($80),Y ; load compressed map byte D3A3 BPL L3D3D0 ; if below $80, branch to single-tile writing D3A5 CMP #$FF ; if = $FF, branch to RTS D3A7 BEQ L3D3E1 D3A9 AND #$7F ; remove high bit to get tile ID D3AB STA $84 D3AD INC $80 ; increment pointer D3AF BNE L3D3B3 D3B1 INC $81 ; increment high byte if pointer wrapped L3D3B3: D3B3 LDA ($80),Y ; get second byte (amount of tiles) D3B5 TAX ; put it in X D3B6 LDA $84 ; then reload the tile ID L3D3B8: D3B8 STA ($82),Y ; save the tile to $7400 D3BA INY ; increment the destination D3BB BEQ L3D3C8 ; branch to increment the destination high byte if it wraps D3BD DEX ; subtract the tile count by 1 D3BE BNE L3D3B8 ; if X = 0, branch to increment pointer D3C0 TYA D3C1 CLC D3C2 ADC $82 ; $82 = total tiles written? ; add Y to total? D3C4 STA $82 D3C6 BCC L3D3CA ; if carry clear, branch ahead L3D3C8: D3C8 INC $83 ; increment high byte of pointer destination L3D3CA: D3CA INC $80 ; increment source pointer D3CC BNE L3D39F ; if it is NOT yet wrapped to 0, get next byte in compressed map data D3CE BEQ L3D3DC ; else, branch ahead L3D3D0: D3D0 STA ($82),Y ; for single tiles, just prints the tile to the destination D3D2 INC $82 ; increment the destination D3D4 BNE L3D3D8 D3D6 INC $83 ; increment the high byte if low byte wrapped L3D3D8: D3D8 INC $80 ; increment the source pointer D3DA BNE L3D39F L3D3DC: D3DC INC $81 ; increment the high byte if the low byte wrapped D3DE JMP L3D39F ; and jump to resume loop L3D3E1: D3E1 RTS
Quote from: redmagejoe on June 11, 2020, 04:32:48 PMI decided to remove this as a goal for Restored, as after extensive playtesting I found it to be a largely unnecessary idea.
Quote from: redmagejoe on June 11, 2020, 04:32:48 PMSo something has gone decisively wrong in my Restored playtesting
Quote from: Jiggers on June 12, 2020, 03:21:10 PMTrying to figure out FF2's dungeon/town map data. My notes so far:
Quote from: abw on June 12, 2020, 07:44:38 PMNice - I've added your comments to the disassembly!
L1D52: 9D52 LDA $48 ; get map ID 9D54 LSR A 9D55 LSR A 9D56 LSR A 9D57 LSR A ; left shift 4 times 9D58 ORA #$A0 9D5A STA $81 ; save as high byte of pointer 9D5C LDA $48 ; get map ID 9D5E ASL A 9D5F ASL A 9D60 ASL A 9D61 ASL A ; right shift 4 times 9D62 STA $80 ; save as low byte of pointer 9D64 LDY #$0F ; set following loop to 16 ;; Starting town's map ID is 5, resulting in a 16 bit pointer: $A050L1D66: 9D66 LDA ($80),Y ; copy 16 bytes (some kind of info about the map?) 9D68 STA $0780,Y 9D6B DEY 9D6C BPL L1D66 ; when Y = $FF, stop[/td]
F1E3B: 9E3B LDA $0780 9E3E AND #$80 9E40 STA $49 9E42 LDX #$00 L1E44: 9E44 LDA $8B00,X ; copy $100 bytes to 0400 for something 9E47 STA $0400,X ; most likely tile properties 9E4A INX 9E4B BNE L1E44 9E4D LDX $48 ; get current map ID in X 9E4F LDA $B300,X ; get a byte from B300, I assume its a table 9E52 LSR A ; left shift the byte, to set carry 9E53 LDX #$3F ; amount of loops to do, really $40 9E55 BCS L1E92 ; if carry was set, load from +$100 ;; these values are guesses based on FF1's structure ;; the UL, UR, LL, LR tile graphics are 8x8 pixels ;; and combined into 1 16x16 pixel tile later L1E57: 9E57 LDA $8400,X 9E5A STA $0500,X ; upper left tile graphic 9E5D LDA $8440,X 9E60 STA $0580,X ; upper right tile graphic 9E63 LDA $8480,X 9E66 STA $0600,X ; lower left tile graphic 9E69 LDA $84C0,X 9E6C STA $0680,X ; lower right tile graphic 9E6F LDA $8700,X 9E72 STA $7800,X ; upper left 2x2 metatile 9E75 LDA $8740,X 9E78 STA $7880,X ; upper right 2x2 metatile 9E7B LDA $8780,X 9E7E STA $7900,X ; lower left 2x2 metatile 9E81 LDA $87C0,X 9E84 STA $7980,X ; lower right 2x2 metatile 9E87 LDA $8A00,X 9E8A STA $0700,X ; attribute ? for metatile ? 9E8D DEX 9E8E BPL L1E57 ; loop until ... 9E90 BMI L1ECB ; high bit set (X = $FF), then branchL1E92: ; same, but load from +$100 9E92 LDA $8500,X 9E95 STA $0500,X ; upper left tile graphic 9E98 LDA $8540,X 9E9B STA $0580,X ; upper right tile graphic 9E9E LDA $8580,X 9EA1 STA $0600,X ; lower left tile graphic 9EA4 LDA $85C0,X 9EA7 STA $0680,X ; lower right tile graphic 9EAA LDA $8800,X 9EAD STA $7800,X ; upper left 2x2 metatile 9EB0 LDA $8840,X 9EB3 STA $7880,X ; upper right 2x2 metatile 9EB6 LDA $8880,X 9EB9 STA $7900,X ; lower left 2x2 metatile 9EBC LDA $88C0,X 9EBF STA $7980,X ; lower right 2x2 metatile 9EC2 LDA $8A40,X 9EC5 STA $0700,X ; attribute ? for metatile ? 9EC8 DEX 9EC9 BPL L1E92 ; loop until high bit set (X = $FF)L1ECB: 9ECB LDX #$3F ; another $40 loops... same data no matter what the map ID is L1ECD: 9ECD LDA $8600,X 9ED0 STA $0540,X ; upper left tile graphic ? 9ED3 LDA $8640,X 9ED6 STA $05C0,X ; upper right tile graphic ? 9ED9 LDA $8680,X 9EDC STA $0640,X ; lower left tile graphic ? 9EDF LDA $86C0,X 9EE2 STA $06C0,X ; lower right tile graphic ? 9EE5 LDA $8900,X 9EE8 STA $7840,X ; upper left 2x2 metatile ? 9EEB LDA $8940,X 9EEE STA $78C0,X ; upper right 2x2 metatile ? 9EF1 LDA $8980,X 9EF4 STA $7940,X ; lower left 2x2 metatile ? 9EF7 LDA $89C0,X 9EFA STA $79C0,X ; lower right 2x2 metatile ? 9EFD LDA $8A80,X 9F00 STA $0740,X ; attribute ? for metatile ? 9F03 DEX 9F04 BPL L1ECD ; loop until high bit set (X = $FF) 9F06 LDA $0786 9F09 STA $044D 9F0C STA $046F ; these 2 are copies of the same byte for some reason 9F0F LDX $48 ; get map ID in X 9F11 LDA $B000,X ; use it to load a byte from another table? 9F14 LSR A 9F15 LSR A 9F16 LSR A 9F17 LSR A 9F18 LSR A ; left shift it 5 times and put in X 9F19 TAX 9F1A LDA $83C2,X ; which is used to read from ANOTHER table? 9F1D STA $0738 ; then saved twice 9F20 STA $0716 9F23 RTS
QuoteThe code for printing "%u3057%u3087%u3046%u3072%uFF2D%uFF30" (MP Cost) in the battle magic menu doesn't set the memory address used to hold the menu window width before adding the string to the CHR buffer, so the width uses the previous value of that address, which happens to be the tile ID for the ones digit of the character's maximum MP. This bug isn't triggered in the Japanese version since "%u3057%u3087%u3046%u3072%uFF2D%uFF30" doesn't contain any diacritics and is unlikely to affect translations into scripts that only use 1 row for their characters.
\FFII_ChaosRushENTranslation_v2.2a.ips1. 03160C:[1A] [C9] [6E] [B0]   [DD] [AA] [BD] [DA] [EE]  [BD] [A7] [EE] [A6] [DD]  [6C] [C8]   [6C] [E8] [C8] [D0] [E1] 2. 031628: (irrelevant)[FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF] [FF]\restored.ips1. 03160C:[4E] [C9] [6E] [B0]  [C9]     [A9] [C1]  [6A]   [4E]  [C9]  [B0]    [3F] [D0] [2E]   [7A] [D0]   [A9] [C0]  [6A]   [4E]  [C9] [5F]      [4C]   [C9]      [7F] [4C]   [C9] [4B]      [D0]      [6C] [E8] [C8] [D0] [AD]  [EA] [EA]
Quote from: Jiggers on June 12, 2020, 08:06:39 PMCool! I did a little more digging, don't know exactly how right I am about it, but...[...]I think this should account for all that "indirect data load target" stuff in Bank 0.
Quote from: redmagejoe on June 12, 2020, 08:11:32 PMBased on how I'm reading this then, this is more or less a non-issue bug then, isn't it? I mean, not that we shouldn't consider fixing it at all, but it's pretty low priority, right?
Quote from: redmagejoe on June 12, 2020, 08:11:32 PMErm, it seems that something in the latest Restored (and Bug Fix too) update is not playing nicely with the Chaos Rush translation, causing a great deal of garbled text in combat messages. I do believe load order didn't matter prior to this version, and though it seems to look fine if I do the translation second... well we both know that simply means that something important is probably being excluded or overwritten.
F3D341: D341 LDA #$00 D343 JSR F3FE03 D346 LDX $48 ; get map ID in X D348 LDA $B200,X ; use to get from LUT D34B PHA ; push value D34C ASL A ; shift high bit into carry D34D ROL A ; then shift carry into lowest bit D34E AND #$01 ; clear out every bit EXCEPT the lowest bit D350 ORA #$04 ; then ORA with the map bank ($04) D352 JSR F3FE03 ; and swap to that bank ($04 or $05) (Bank 04 has 96 maps, Bank 05 has 64) D355 PLA ; pull the value from before D356 ASL A ; double it, and put in X D357 TAX D358 LDA $8000,X ; Load the low byte of the compressed map data pointer and put in $80 D35B STA $80 D35D LDA $8001,X ; And do the same with the high byte D360 STA $81 D362 LDA #$00 D364 STA $82 D366 LDA #$74 D368 STA $83 D36A JSR F3D39F D36D LDA #$00 D36F JSR F3FE03 D372 JMP $9C00
------ Bank 04 -------;;-- Bank 05 --00 ; 20 3 ; 40 2 ;; 80 ; A0 01 2 ; 21 3 ; 41 ;; 81 ; A1 02 ; 22 2 ; 42 ;; 82 ; A2 2 03 ; 23 13 ; 43 4 ;; 83 ; A3 2 04 ; 24 6 ; 44 4 ;; 84 2 ; A4 2 05 ; 25 9 ; 45 3 ;; 85 2 ; A5 06 ; 26 ; 46 3 ;; 86 ; A6 07 ; 27 ; 47 ;; 87 ; A7 08 ; 28 ; 48 ;; 88 ; A8 09 ; 29 ; 49 2 ;; 89 ; A9 0A ; 2A ; 4A ;; 8A ; AA 0B ; 2B 2 ; 4B 2 ;; 8B ; AB 0C ; 2C ; 4C ;; 8C ; AC 0D ; 2D ; 4D ;; 8D ; AD 0E 20 ; 2E ; 4E ;; 8E ; AE 0F ; 2F - 0 ; 4F ;; 8F 2 ; AF 2 10 ; 30 ; 50 ;; 90 ; B0 11 ; 31 ; 51 ;; 91 ; B1 12 ; 32 ; 52 ;; 92 ; B2 13 ; 33 ; 53 2 ;; 93 ; B3 14 2 ; 34 2 ; 54 2 ;; 94 ; B4 2 15 ; 35 ; 55 2 ;; 95 ; B5 16 11 ; 36 ; 56 2 ;; 96 ; 17 ; 37 2 ; 57 2 ;; 97 ; 18 ; 38 2 ; 58 ;; 98 ; 19 4 ; 39 2 ; 59 ;; 99 ; 1A 3 ; 3A ; 5A ;; 9A ; 1B 3 ; 3B ; 5B ;; 9B ; 1C 2 ; 3C 2 ; 5C ;; 9C ; 1D 5 ; 3D ; 5D ;; 9D ; 1E ; 3E ; 5E ;; 9E ; 1F 3 ; 3F ; 5F ;; 9F ;
QuoteExample usage: python ffcompress.py maps\00.binThe above will create the file 'maps\00.cmap' which will be the compressed map.Additionally wildcard characters will work, so you can do this: python ffcompress.py maps\*.binAnd it will compress ALL .bin files in that directory and create their respective .cmap fileAlso, the compressor will examine 'last modified' timestamps and will only recompress maps if their cmap file is out of date. So you can run this in a build step and it will mostly do nothing (and thus run very fast) unless you have recently modified a map.However, this behavior can be ignored if you do: python ffcompress.py yourfile.bin -fThe '-f' will force compression to happen even if the cmap file is up to date.Last thing to note:A compressed overworld map WILL contain a pointer table. However compressed standard maps DO NOT.I figure it'd make more sense for the standard maps to be individual files that can be incbin'd in the source, and you can probably use labels in ca65 to generate the pointer table.
F3C75C: C75C LDA $27 ; overworld scroll x or y C75E CLC C75F ADC #$07 ; add 7 to get player position C761 STA $80 C763 LDA $28 ; overworld scroll x or y C765 CLC C766 ADC #$07 ; add 7 to get player position C768 AND #$0F C76A ORA #$70 C76C STA $81 ; $80 is now a pointer to $765A - one step left in the bright grass outside the starting town's gate C76E LDY #$00 C770 LDA ($80),Y ; gets the tile ID and puts it in Y C772 TAY C773 ASL A ; double tile ID and put in X C774 TAX C775 LDA $0400,X ; get tile properties? C778 AND #$10 ; cut out all bits but this 1 C77A STA $43 C77C LDA #$00 C77E JSR F3FE03 ; swap to bank 0 C781 LDX $9500,Y ; $9500 is a table with battle backdrop IDs? C784 RTS ; Y = $24 gets an ID of $02
L3FA9E: FA9E STA $7B48 FAA1 TXA ; X = backdrop ID? FAA2 AND #$0F ; cut off high bits FAA4 STA $7B49 ; save at $7B49 FAA7 JSR F3FA1F
F2DFAE: 9FAE LDA $7B49 ; battle backdrop ID? 9FB1 AND #$07 ; cut off all bits except lowest 3 9FB3 CLC ; 9FB4 ADC #$B8 ; add in the start of backdrop graphics 9FB6 STA $01 ; save as high byte of pointer 9FB8 LDA #$00 9FBA STA $00 ; $00 becomes the pointer to the backdrop graphics 9FBC JSR F3FB53
Page created in 0.114 seconds with 20 queries.