|
Post by Ascended Mermaid on Dec 27, 2012 10:25:06 GMT -5
0F:F628:E9 1F SBC #$1F 0F:F62A: 16 02 STA byte_216 = #$1F I've stepped in and discovered this... it... it... it became #$1F?! That would explain the text wrap-around bug for some dialogues. I'll have to add something like this: CPY #$22 BCC ; After BCS DEY ; DEY 1 DEY CPY #$22 BCS ; To DEY 1 That way, the result *has to* be 20 or 21, minus 1F (given the prior SBC isn't altered for any reason). Considering I'm running out of room, I'll have to switch banks -- which can get pretty hairy considering that the game is already switching between roughly 3 banks for the dialogue subroutines alone. There was definitely a reason I saved this step for last; I expected a challenge, and that's exactly what I got.
|
|
|
Post by Ascended Mermaid on Dec 28, 2012 13:49:56 GMT -5
I don't feel like working on this right now.
|
|
|
Post by Ascended Mermaid on Dec 31, 2012 15:46:11 GMT -5
Crap. :\ Considering that I'm moving and will be doing live-in care, I'll be too busy to finish this project. Luckily, there should only be a *little* bit of hacking remaining to be done, I've posted the beta build here on the forums, and anyone who would like to finish where I left off is welcome to do so. Once the hacking is done, all that's needed is a translator for the script dump, which can also be found in this topic and my website; umaggot.webs.com/While I dislike the fact that I have to leave before I get to finish this, it's for the best.
|
|
|
Post by tancients on Dec 31, 2012 18:16:42 GMT -5
Ah-ha. I should've had you doing live-in care....
|
|
|
Post by Ascended Mermaid on Dec 31, 2012 20:43:28 GMT -5
Indeed, I wish we'd thought of it! My search was narrowed down to the basic minimum wage jobs, (call centers, warehousing, fast food, and retail) but I definitely didn't see the full scope of available work in the grand scheme of things.
Although I had volunteer work and attended job source programs to improve my techniques (which in spite of my graduation, are still poor at best), I just didn't see. I had my blinders on, and the lights were off in my head for the longest time. I really have no idea what my malfunction was, but it was clear that I didn't do a good job in keeping to my word or fulfilling my promises.
tancients, you've always had not only a "can do" attitude, but a "do" attitude -- you're built on action and progress, and you did what you could to help me find at least a sliver of that in myself. You're truly a great person for making the effort to make me a better person. I know I've said thank you, but you really do have my gratitude.
As most know by now, I'm a bit of a sore loser McEmoPants, and I dwell on everything that ever goes wrong. (problems at work, finding work, personal feelings, emotional attachments) I need to stop doing that, because I realize it just pushes me deeper into the hole I keep digging for myself, and that's not what I need. I'm a very backwards kind of guy, and I realize almost everything I do in general is a detriment to progress in all forms.
All I can do now is look forward and keep working. Instead of sharing the same tired "oh hey, I have something that sounds like an intelligent life lesson", it's just time I stop being lazy, take action, and show what I know.
|
|
|
Post by Ascended Mermaid on Jan 18, 2013 20:05:58 GMT -5
I have some down time so I figured I'd do some more work. - Lines 1 and 3 actually DO print, but are quickly overwritten by lines 2 and 4. - The letters are still being written to the PPU two consecutive tiles per letter, which is why the blank/null tiles are overwriting lines 1 and 3. - The 'Name' and 'Title' control codes are still functional. - The 'Page/Prompt break' (FA) control code needs to be revised for the new dialogue engine. - There are no automatic line breaks. - All control codes paste a blank space, which may be why background tiles are overwritten when line 4 is full, as all dialogue ends with an 'End' (FF) control code. Here is the revised code: 0F:F601:AD 16 02 LDA byte_216 0F:F604:2D 17 02 AND byte_217 0F:F607:C9 03 CMP #$03 0F:F609:90 01 BCC $F60C 0F:F60B:60 RTS 0F:F60C:EE 16 02 INC byte_216 0F:F60F:EE 16 02 INC byte_216 0F:F612:4C 6E F5 JMP $F56E 0F:F615:AD 16 02 LDA byte_216 0F:F618:C9 1F CMP #$1F 0F:F61A:90 F0 BCC $F60C 0F:F61C:AC 16 02 LDY byte_216 0F:F61F:C0 1F CPY #$1F 0F:F621:B0 06 BCS $F629 0F:F623:C8 INY 0F:F624:C8 INY 0F:F625:C0 1F CPY #$1F 0F:F627:90 FA BCC $F623 0F:F629:98 TYA 0F:F62A:E9 1F SBC #$1F 0F:F62C: 16 02 STA byte_216 0F:F62F:D0 E1 BNE $F612 0F:F631:EE 17 02 INC byte_217 0F:F634:EE 17 02 INC byte_217 0F:F637:AD 17 02 LDA byte_217 0F:F63A:C9 04 CMP #$04 0F:F63C:90 D4 BCC $F612 0F:F63E:60 RTS The original (vanilla) code is as follows: 0F:F601:EE 16 02 INC byte_216 = #$00 0F:F604:AD 16 02 LDA byte_216 = #$00 0F:F607:C9 08 CMP #$08 0F:F609:90 27 BCC $F632 0F:F60B:AD 16 02 LDA byte_216 = #$00 0F:F60E:F0 B7 BEQ $F5C7 0F:F610:A9 00 LDA #$00 0F:F612: 16 02 STA byte_216 = #$00 0F:F615:CE 1B 02 DEC byte_21B = #$00 0F:F618:D0 19 BNE $F633 0F:F61A:AD 18 02 LDA byte_218 = #$40 0F:F61D:85 EC STA byte_EC = #$A8 0F:F61F:AD 19 02 LDA byte_219 = #$A8 0F:F622:85 ED STA byte_ED = #$99 0F:F624:AC 14 02 LDY byte_214 = #$36 0F:F627:B1 EC LDA ($EC),Y @ $99B8 = #$4A 0F:F629:C9 FF CMP #$FF 0F:F62B:F0 15 BEQ $F642 0F:F62D:A9 FF LDA #$FF 0F:F62F: 15 02 STA byte_215 = #$00 0F:F632:60 RTS 0F:F633:AC 17 02 LDY byte_217 = #$01 0F:F636:C8 INY 0F:F637:C0 02 CPY #$02 0F:F639:F0 04 BEQ $F63F 0F:F63B:8C 17 02 STY byte_217 = #$01 0F:F63E:60 RTS 0F:F63F:4C 85 F6 JMP $F685 0F:F642:A9 00 LDA #$00 0F:F644: 13 02 STA MessageID = #$00 0F:F647:60 RTS I understand my code, and I think I get what the original code was trying to accomplish. My code works around the whole "every other tile is a new letter" thing. The original code utilizes subroutines and checks that are missing from the new code; checking if the dialogue window is full (page break if so), automatic line breaks, control codes function properly, pause + SFX after printing each letter, and probably other such details. I may have a leak somewhere. I can't confirm it, however; it has crashed inconsistently (during coding, with all further testing done after restarting), with no way for me to accurately judge it without further testing. I'll look further into what kagemusha and Xalphenos have explained earlier. The way I see it, writing that work-around might've just been a waste of time (a learning experience, however wasteful it may have been), considering that I still have to focus on stripping a PPU write somewhere, which may also cover the letter print positioning. (In theory.) THere has to be something obvious in this PPU business that I'm overlooking. No more hints! I'll get it, lol.
|
|
|
Post by Ascended Mermaid on Jan 19, 2013 13:28:17 GMT -5
I've managed to trace the dialogue bug. $C976:A2 05 LDX #$05 A:0D X:00 Y:0F S:7D P:nVUbdIzc $C978:20 85 CC JSR $CC85 A:0D X:05 Y:0F S:7D P:nVUbdIzc $CC85:8E 00 01 STX $0100 = #$0D A:0D X:05 Y:0F S:7B P:nVUbdIzc $CC88:A5 12 LDA $0012 = #$00 A:0D X:05 Y:0F S:7B P:nVUbdIzc $CC8A:F0 46 BEQ $CCD2 A:00 X:05 Y:0F S:7B P:nVUbdIZc $CCD2:8A TXA A:00 X:05 Y:0F S:7B P:nVUbdIZc $CCD3: FF FF STA $FFFF = #$C9 A:05 X:05 Y:0F S:7B P:nVUbdIzc $CCD6:4A LSR A:05 X:05 Y:0F S:7B P:nVUbdIzc $CCD7: FF FF STA $FFFF = #$C9 A:02 X:05 Y:0F S:7B P:nVUbdIzC $CCDA:4A LSR A:02 X:05 Y:0F S:7B P:nVUbdIzC $CCDB: FF FF STA $FFFF = #$C9 A:01 X:05 Y:0F S:7B P:nVUbdIzc $CCDE:4A LSR A:01 X:05 Y:0F S:7B P:nVUbdIzc $CCDF: FF FF STA $FFFF = #$C9 A:00 X:05 Y:0F S:7B P:nVUbdIZC $CCE2:4A LSR A:00 X:05 Y:0F S:7B P:nVUbdIZC $CCE3: FF FF STA $FFFF = #$C9 A:00 X:05 Y:0F S:7B P:nVUbdIZc $CCE6:60 RTS A:00 X:05 Y:0F S:7B P:nVUbdIZc $C97B:20 09 80 JSR $8009 A:00 X:05 Y:0F S:7D P:nVUbdIZc $8009:4C 0D 80 JMP $800D A:00 X:05 Y:0F S:7B P:nVUbdIZc $800D:AD 20 01 LDA $0120 = #$00 A:00 X:05 Y:0F S:7B P:nVUbdIZc $8010:D0 1C BNE $802E A:00 X:05 Y:0F S:7B P:nVUbdIZc $8012:A5 FA LDA $00FA = #$89 A:00 X:05 Y:0F S:7B P:nVUbdIZc $8014:F0 22 BEQ $8038 A:89 X:05 Y:0F S:7B P:NVUbdIzc $8016:10 61 BPL $8079 A:89 X:05 Y:0F S:7B P:NVUbdIzc $8018:4C 06 81 JMP $8106 A:89 X:05 Y:0F S:7B P:NVUbdIzc $8106:A9 00 LDA #$00 A:89 X:05 Y:0F S:7B P:NVUbdIzc $8108: 6B 01 STA $016B = #$00 A:00 X:05 Y:0F S:7B P:nVUbdIZc $810B: 6A 01 STA $016A = #$04 A:00 X:05 Y:0F S:7B P:nVUbdIZc $810E:AE 6A 01 LDX $016A = #$00 A:00 X:05 Y:0F S:7B P:nVUbdIZc $8111:DE 30 01 DEC $0130,X @ $0130 = #$21 A:00 X:00 Y:0F S:7B P:nVUbdIZc $8114:D0 03 BNE $8119 A:00 X:00 Y:0F S:7B P:nVUbdIzc $8119:20 32 81 JSR $8132 A:00 X:00 Y:0F S:7B P:nVUbdIzc $8132:AE 6A 01 LDX $016A = #$00 A:00 X:00 Y:0F S:79 P:nVUbdIzc $8135:F0 29 BEQ $8160 A:00 X:00 Y:0F S:79 P:nVUbdIZc $8160:AE 6A 01 LDX $016A = #$00 A:00 X:00 Y:0F S:79 P:nVUbdIZc $8163:BC 76 01 LDY $0176,X @ $0176 = #$00 A:00 X:00 Y:0F S:79 P:nVUbdIZc $8166:F0 07 BEQ $816F A:00 X:00 Y:00 S:79 P:nVUbdIZc $816F:AE 6A 01 LDX $016A = #$00 A:00 X:00 Y:00 S:79 P:nVUbdIZc $8172:BD 70 01 LDA $0170,X @ $0170 = #$00 A:00 X:00 Y:00 S:79 P:nVUbdIZc $8175:F0 06 BEQ $817D A:00 X:00 Y:00 S:79 P:nVUbdIZc $817D:4A LSR A:00 X:00 Y:00 S:79 P:nVUbdIZc $817E:4A LSR A:00 X:00 Y:00 S:79 P:nVUbdIZc $817F:4A LSR A:00 X:00 Y:00 S:79 P:nVUbdIZc $8180:4A LSR A:00 X:00 Y:00 S:79 P:nVUbdIZc $8181:29 0F AND #$0F A:00 X:00 Y:00 S:79 P:nVUbdIZc $8183: 6C 01 STA $016C = #$C0 A:00 X:00 Y:00 S:79 P:nVUbdIZc $8186:BD 23 01 LDA $0123,X @ $0123 = #$00 A:00 X:00 Y:00 S:79 P:nVUbdIZc $8189:D0 06 BNE $8191 A:00 X:00 Y:00 S:79 P:nVUbdIZc $818B:20 F1 81 JSR $81F1 A:00 X:00 Y:00 S:79 P:nVUbdIZc $81F1:AE 6A 01 LDX $016A = #$00 A:00 X:00 Y:00 S:77 P:nVUbdIZc $81F4:8A TXA A:00 X:00 Y:00 S:77 P:nVUbdIZc $81F5:0A ASL A:00 X:00 Y:00 S:77 P:nVUbdIZc $81F6:0A ASL A:00 X:00 Y:00 S:77 P:nVUbdIZc $81F7:A8 TAY A:00 X:00 Y:00 S:77 P:nVUbdIZc $81F8:AD 6C 01 LDA $016C = #$00 A:00 X:00 Y:00 S:77 P:nVUbdIZc $81FB:38 SEC A:00 X:00 Y:00 S:77 P:nVUbdIZc $81FC:FD 74 01 SBC $0174,X @ $0174 = #$02 A:00 X:00 Y:00 S:77 P:nVUbdIZC $81FF:B0 02 BCS $8203 A:FE X:00 Y:00 S:77 P:NvUbdIzc $8201:A9 00 LDA #$00 A:FE X:00 Y:00 S:77 P:NvUbdIzc $8203:AE 6A 01 LDX $016A = #$00 A:00 X:00 Y:00 S:77 P:nvUbdIZc $8206:1D 72 01 ORA $0172,X @ $0172 = #$50 A:00 X:00 Y:00 S:77 P:nvUbdIZc $8209:99 00 40 STA $4000,Y @ $4000 = #$FF A:50 X:00 Y:00 S:77 P:nvUbdIzc $820C:60 RTS A:50 X:00 Y:00 S:77 P:nvUbdIzc $818E:20 0D 82 JSR $820D A:50 X:00 Y:00 S:79 P:nvUbdIzc $820D:AE 6A 01 LDX $016A = #$00 A:50 X:00 Y:00 S:77 P:nvUbdIzc $8210:BD 79 01 LDA $0179,X @ $0179 = #$81 A:50 X:00 Y:00 S:77 P:nvUbdIZc $8213:C9 12 CMP #$12 A:81 X:00 Y:00 S:77 P:NvUbdIzc $8215:90 22 BCC $8239 A:81 X:00 Y:00 S:77 P:nvUbdIzC $8217:4A LSR A:81 X:00 Y:00 S:77 P:nvUbdIzC $8218:4A LSR A:40 X:00 Y:00 S:77 P:nvUbdIzC $8219:3D 7F 01 AND $017F,X @ $017F = #$00 A:20 X:00 Y:00 S:77 P:nvUbdIzc $821C: 78 01 STA $0178 = #$90 A:00 X:00 Y:00 S:77 P:nvUbdIZc $821F:BD 23 01 LDA $0123,X @ $0123 = #$00 A:00 X:00 Y:00 S:77 P:nvUbdIZc $8222:D0 15 BNE $8239 A:00 X:00 Y:00 S:77 P:nvUbdIZc $8224:AD 6A 01 LDA $016A = #$00 A:00 X:00 Y:00 S:77 P:nvUbdIZc $8227:0A ASL A:00 X:00 Y:00 S:77 P:nvUbdIZc $8228:0A ASL A:00 X:00 Y:00 S:77 P:nvUbdIZc $8229:A8 TAY A:00 X:00 Y:00 S:77 P:nvUbdIZc $822A:BD 7C 01 LDA $017C,X @ $017C = #$7D A:00 X:00 Y:00 S:77 P:nvUbdIZc $822D:DD 7F 01 CMP $017F,X @ $017F = #$00 A:7D X:00 Y:00 S:77 P:nvUbdIzc $8230:90 07 BCC $8239 A:7D X:00 Y:00 S:77 P:nvUbdIzC $8232:38 SEC A:7D X:00 Y:00 S:77 P:nvUbdIzC $8233:ED 78 01 SBC $0178 = #$00 A:7D X:00 Y:00 S:77 P:nvUbdIzC $8236:99 02 40 STA $4002,Y @ $4002 = #$FF A:7D X:00 Y:00 S:77 P:nvUbdIzC $8239:60 RTS A:7D X:00 Y:00 S:77 P:nvUbdIzC $8101:73 UNDEFINED A:7D X:00 Y:00 S:79 P:nvUbdIzC Now I just have to figure out *why*.
|
|
|
Post by Ascended Mermaid on Jan 19, 2013 13:38:27 GMT -5
This is the PPU routine. 0F:CF97:BD 00 05 LDA PPUBuffer,X @ $0538 = #$00 0F:CF9A:E8 INX 0F:CF9B: 07 20 STA $2007 = #$00 0F:CF9E:88 DEY 0F:CF9F:D0 F6 BNE loc_CF97 0F:CFA1:86 1F STX byte_1F = #$33 0F:CFA3:C6 21 DEC byte_21 = #$06 0F:CFA5:F0 0C BEQ loc_CFB3 0F:CFA7:BC 00 05 LDY PPUBuffer,X @ $0538 = #$00 0F:CFAA:88 DEY 0F:CFAB:C0 F9 CPY #$F9 0F:CFAD:B0 04 BCS loc_CFB3 0F:CFAF:A5 22 LDA byte_22 = #$F0 0F:CFB1:30 B0 BMI loc_CF63 0F:CFB3:A9 00 LDA #$00 0F:CFB5: 06 20 STA $2006 = #$01 0F:CFB8: 06 20 STA $2006 = #$01 0F:CFBB:60 RTS I'm not 100% sure what I'm doing with this. It'll probably come to me if I stare at it long enough. // This appears to be the main PPU code, however. Altering it in any way seems to affect the whole game, and not just the tiny bit. At any rate... *reads "DISCH EXPLAINS PPU WRITING"* Maybe it'll be more clear once I do some more research. // Well... it makes SOME sense, and clearly I'm a little farther ahead of the actual routine that I'm looking for; a write to $2000, and the crazy math that kagemusha had mentioned earlier? I wonder if I might find what I'm looking for in with certain things like character portraits and sprite tiles. Seeing as I did find and correct the nurse's missing tile and the main character's missing tile... I might find letter tile stuff in the same bank, maybe. That could just be wishful thinking on my part.
|
|
|
Post by Ascended Mermaid on Jan 19, 2013 17:35:38 GMT -5
So here's the full routine, via the trace logger. $CF3C:A5 1F LDA $001F = #$A9 A:02 X:02 Y:20 S:DD P:NvUbdIzC $CF3E:C5 20 CMP $0020 = #$9E A:A9 X:02 Y:20 S:DD P:NvUbdIzC $CF40:F0 F9 BEQ $CF3B A:A9 X:02 Y:20 S:DD P:nvUbdIzC $CF42:A6 1F LDX $001F = #$A9 A:A9 X:02 Y:20 S:DD P:nvUbdIzC $CF44:A9 00 LDA #$00 A:A9 X:A9 Y:20 S:DD P:NvUbdIzC $CF46:38 SEC A:00 X:A9 Y:20 S:DD P:nvUbdIZC $CF47:FD 00 05 SBC $0500,X @ $05A9 = #$20 A:00 X:A9 Y:20 S:DD P:nvUbdIZC $CF4A:C9 07 CMP #$07 A:E0 X:A9 Y:20 S:DD P:NvUbdIzc $CF4C:B0 0D BCS $CF5B A:E0 X:A9 Y:20 S:DD P:NvUbdIzC $CF5B:A9 D0 LDA #$D0 A:E0 X:A9 Y:20 S:DD P:NvUbdIzC $CF5D:85 22 STA $0022 = #$04 A:D0 X:A9 Y:20 S:DD P:NvUbdIzC $CF5F:A9 06 LDA #$06 A:D0 X:A9 Y:20 S:DD P:NvUbdIzC $CF61:85 21 STA $0021 = #$02 A:06 X:A9 Y:20 S:DD P:nvUbdIzC $CF63:A6 1F LDX $001F = #$A9 A:06 X:A9 Y:20 S:DD P:nvUbdIzC $CF65:E4 20 CPX $0020 = #$9E A:06 X:A9 Y:20 S:DD P:NvUbdIzC $CF67:F0 4A BEQ $CFB3 A:06 X:A9 Y:20 S:DD P:nvUbdIzC $CF69:A5 0A LDA $000A = #$90 A:06 X:A9 Y:20 S:DD P:nvUbdIzC $CF6B:29 FB AND #$FB A:90 X:A9 Y:20 S:DD P:NvUbdIzC $CF6D:A8 TAY A:90 X:A9 Y:20 S:DD P:NvUbdIzC $CF6E:BD 00 05 LDA $0500,X @ $05A9 = #$20 A:90 X:A9 Y:90 S:DD P:NvUbdIzC $CF71:10 06 BPL $CF79 A:20 X:A9 Y:90 S:DD P:nvUbdIzC $CF79:8C 00 20 STY $2000 = #$90 A:20 X:A9 Y:90 S:DD P:nvUbdIzC $CF7C:BD 00 05 LDA $0500,X @ $05A9 = #$20 A:20 X:A9 Y:90 S:DD P:nvUbdIzC $CF7F:29 7F AND #$7F A:20 X:A9 Y:90 S:DD P:nvUbdIzC $CF81:A8 TAY A:20 X:A9 Y:90 S:DD P:nvUbdIzC $CF82:E8 INX A:20 X:A9 Y:20 S:DD P:nvUbdIzC $CF83:BD 00 05 LDA $0500,X @ $05AA = #$14 A:20 X:AA Y:20 S:DD P:NvUbdIzC $CF86: 06 20 STA $2006 = #$08 A:14 X:AA Y:20 S:DD P:nvUbdIzC $CF89:E8 INX A:14 X:AA Y:20 S:DD P:nvUbdIzC $CF8A:BD 00 05 LDA $0500,X @ $05AB = #$00 A:14 X:AB Y:20 S:DD P:NvUbdIzC $CF8D: 06 20 STA $2006 = #$08 A:00 X:AB Y:20 S:DD P:nvUbdIZC $CF90:E8 INX A:00 X:AB Y:20 S:DD P:nvUbdIZC $CF91:98 TYA A:00 X:AC Y:20 S:DD P:NvUbdIzC $CF92:18 CLC A:20 X:AC Y:20 S:DD P:nvUbdIzC $CF93:65 22 ADC $0022 = #$D0 A:20 X:AC Y:20 S:DD P:nvUbdIzc $CF95:85 22 STA $0022 = #$D0 A:F0 X:AC Y:20 S:DD P:NvUbdIzc $CF97:BD 00 05 LDA $0500,X @ $05AC = #$00 A:F0 X:AC Y:20 S:DD P:NvUbdIzc $CF9A:E8 INX A:00 X:AC Y:20 S:DD P:nvUbdIZc
Now I just have to figure out how to make this linear and get rid of the 16x16 stuff. // I'm not convinced that this is the right routine, but it could just be that I'm messing with the wrong parts of it.
|
|
|
Post by Ascended Mermaid on Jan 19, 2013 18:53:30 GMT -5
I randomly made this happen when I NOPed 3 of 4 JSRs at 0F:F763. The funny thing is, I've looked at and edited the routine beginning at 0F:F732 several times before, while working on the dialogue. Considering all of the free space this gives me, I should consider a byte exclusive to the name registration screen. I can put those JSRs back in and skip over them if the byte is different from what it would otherwise be at the registration screen. By doing this, I can keep the 16x16 font there. // Unfortunately, this causes more crashing bugs. I have about 3 to worry about now: 1. Crashes when selecting a letter on the name registration screen as a result of shifting around parts of the routine at 0F:F732 to utilize the free bytes. This one should be fairly easy to fix. 2. Crashes on a fresh boot while talking due to the new dialogue code. Some characters can cause the crash, while others will disable the crashing. I'm not sure what enables it, however. 2. Crashes on a fresh boot while talking as a result of NOPing the 3 JSRs. If I don't NOP those JSRs, talk once, and then NOP them, all further dialogue will work without crashing.
|
|
|
Post by Ascended Mermaid on Jan 21, 2013 11:15:04 GMT -5
I really am the laziest guy ever. Of all time. It's like I get one thing done, and then *poof*, my motivation disappears. Then we wait until some random happenstance where I magically muster up the motivation to check off one more thing from my personal checklist. Lather, rinse, repeat. This project started on September 20th, 2008. This means that in a mere 8 months, this project will be 5 YEARS OLD. It's a combination of things; not having the right knowledge, or not seeing what I should be seeing, relying often on my incredible ability to magically fix things on sheer dumb luck, and my impressive lack of motivation, all of these factors are the reason this project has been set back for so long.
It's a miracle that I've come this far.
|
|
|
Post by Ascended Mermaid on Jan 23, 2013 7:49:51 GMT -5
My previous translators have no doubt seen something that I haven't seen until now. A line that follows the infamous line "Don't have negative thoughts. Remember your mantra."; "Do you want to hear it once more?" Which has also been translated as: "Would you like to try again?" This seems to be another undocumented feature that was either removed or never implemented. My best guess is that it would be handled like the dialogue from the doctor and butcher; B for no (back to title screen?), A for yes (respawn at the guru). Anyway, as tired as I am, I figured I'd look at the code some more: 0F:F735:A9 00 LDA #$00 0F:F737:85 E9 STA byte_E9 = #$08 0F:F739:AD 16 02 LDA byte_216 = #$00 0F:F73C:0A ASL 0F:F73D:0A ASL 0F:F73E:0A ASL 0F:F73F:0A ASL 0F:F740:EA NOP 0F:F741:EA NOP 0F:F742:26 E9 ROL byte_E9 = #$08 0F:F744:85 E8 STA byte_E8 = #$10 0F:F746:AD 1A 02 LDA byte_21A = #$00 0F:F749:4A LSR 0F:F74A:4D 17 02 EOR byte_217 = #$00 0F:F74D:29 03 AND #$03 0F:F74F:EA NOP 0F:F750:05 E9 ORA byte_E9 = #$08 0F:F752:69 14 ADC #$14 0F:F754:85 E9 STA byte_E9 = #$08 0F:F756:AD 00 01 LDA CurrentBank = #$0C 0F:F759:48 PHA 0F:F75A:A2 0D LDX #$0D 0F:F75C:20 1A CC JSR SwitchBank_Part 0F:F75F:98 TYA 0F:F760:48 PHA 0F:F761:A0 00 LDY #$00 0F:F763:20 74 F7 JSR $F774 0F:F766:EA NOP 0F:F767:EA NOP 0F:F768:EA NOP 0F:F769:EA NOP 0F:F76A:EA NOP 0F:F76B:EA NOP 0F:F76C:EA NOP 0F:F76D:EA NOP 0F:F76E:EA NOP 0F:F76F:68 PLA 0F:F770:A8 TAY 0F:F771:4C 4D F4 JMP $F44D You can see two NOPs together and one apart. If I move those three down to the rest of the NOP cluster, the name screen will crash as soon as you pick a letter; it will RTS to a bad sector. The problem with it RTSing to a bad sector is that I'm stumped, even when I use the trace logger; it makes no sense to me that it behaves this way, and according to one of my more recent posts, another crashing bug works the same way. Since there's only one instance of JSR $F774, it will only draw the top-left corner of the 16x16 letters. I plan on using the NOP space to check somehow for a Name Registration specific variable. If true, check if all 4 tiles are drawn, and branch to $F763 if not. It doesn't look like I'll have enough bytes. I may have to use the NOP space to switch banks, and write said checks in the extra space. It could switch to a bank that would, in the same bank, switch to another bank, and fail to switch back, if a fail safe hasn't been coded properly. I wonder if that could be part of what's messing up the code when I move those NOPs, but it doesn't appear that moving them actually causes the game to read the code any differently; all lines show up in the trace logger correctly. It doesn't actually go off track until an RTS a while after my code. Anyway, it's anyone's guess what's *really* going on with that.
|
|
|
Post by SkyeWelse on Jan 23, 2013 8:48:46 GMT -5
A bit off topic here, but something to note. I recently got this off of Yahoo Auctions. Still awaiting shipping, but it's more material from Faxanadu that I've not seen before. Hopefully there is something in there worthwhile like the other guidebook that we used for the Bestiary chart's original monster artwork. All that I can currently read is that is says "Handbook". Looks rather thin though, it might be just a preview on he game and a guide for just the start of the game. -Thomas
|
|
|
Post by Xalphenos on Jan 23, 2013 10:55:20 GMT -5
It could be returning or jumping to the start of code after one of those nops. So if you move all the nops together, thus changing those code positions, you will need to check if anything returns or jumps to F742 or F750. If it does they will need to be corrected with the new code positions presumably F740 and F74D.
|
|
|
Post by Ascended Mermaid on Jan 23, 2013 13:55:39 GMT -5
Xalphenos: That was my initial thought before I used the trace logger with Break on Bad Opcode. I'll extend the amount of instructions the logger will display and give it another shot. I'll also apply this logic to crash bugs 2 and 3. Thanks for the heads up! SkyeWelse: I'm definitely interested in any information and scans you can pull from the handbook. Does it say who wrote and published it? It's always nice to see publications and other such material related to Faxanadu and the history surrounding it, so it really is a nice find! Due to a post on GameFAQs, I have some more questions regarding the instruction manuals; do all versions (the most important of the three being the Japanese manual) feature the "misinformation" that the Battle Helmet blocks all magic damage? I think we *might* be looking at either a misprint (I'll have to run an Ointment + magic damage check to see if it uses its own hitbox for magic damage like the shields did; blocking "all" magic damage might mean the amount of coverage it provides, and not the actual amount of damage it prevents), another bug (like the Pendant, missing tiles, Dragon Slayer, and Battle Suit bugs) or a feature that didn't make the cut (like the 5 items, 5 enemies, 2 portraits, 2 characters, and recently discovered dialogue). One last thing I'm still bothered by; Ointment doesn't block magic damage unless you don't have a shield equipped. The reason this bothers me is because I'm not sure whether it *should* block magic damage regardless, or if it's intended specifically for blocking physical damage only. I'm strongly leaning toward the latter, but am uncomfortable with gameplay-altering decisions that cannot be clearly defined as an oversight, a bug, or a missing/scrapped feature. Whether or not you're invulnerable to magic (while using the ointment) with or without a shield is clearly one of the three. Does the Japanese manual have any information with regard to the Ointment that could ultimately define its intended use?
|
|
|
Post by Ascended Mermaid on Jan 23, 2013 14:53:41 GMT -5
$CFCD:90 FB BCC $CFCA A:1C X:0D Y:00 S:86 P:NvUbdIzc $C999:48 PHA A:1C X:0D Y:00 S:83 P:NvUbdIzc Wait, it... what? The clear flag is off, but it branches to $C999 instead. This is a redundant code, however: $CFCA:20 D0 CF JSR $CFD0 A:1C X:0D Y:00 S:86 P:NvUbdIzc $CFD0:A5 1F LDA $001F = #$E9 A:1C X:0D Y:00 S:84 P:NvUbdIzc $CFD2:38 SEC A:E9 X:0D Y:00 S:84 P:NvUbdIzc $CFD3:E5 20 SBC $0020 = #$CD A:E9 X:0D Y:00 S:84 P:NvUbdIzC $CFD5:F0 02 BEQ $CFD9 A:1C X:0D Y:00 S:84 P:nvUbdIzC $CFD7:C9 24 CMP #$24 A:1C X:0D Y:00 S:84 P:nvUbdIzC $CFD9:60 RTS A:1C X:0D Y:00 S:84 P:NvUbdIzc $CFCD:90 FB BCC $CFCA A:1C X:0D Y:00 S:86 P:NvUbdIzc $CFCF is an RTS, but it doesn't appear as though it's ever processed. $8131:60 RTS A:00 X:01 Y:04 S:7D P:NVUbdIzc 0F:C97D:80 UNDEFINED It doesn't explain this. Is there a way to set a breakpoint range for a JMP/JSR/BNE/BEQ/BCC/BCS/etc. to $C970-C97D, or will I just have to dig, starting with wherever the debugger snaps on bad opcode? //Correction: to, not from. From is easy. Oh right, I need to fix that, too. That should be easy enough.
|
|
|
Post by SkyeWelse on Jan 23, 2013 16:54:02 GMT -5
Not sure on who the publisher is. I'll know more once I get the book in hot little hands. : )
From the Japanese Manual it states for the Battle Helmet Discription:
ヘルメト。魔力のほとんどをさえぎる。 Helmet. Blocks nearly all (most) Magic Power.
In the English Manual it says:
Battle Helmet Intercepts almost all the magic.
In the Japanese Guidebook:
Battle Helmet
バトルスーツ と一組になっている頭を守るヘルメット。やばり迷宮のある敵を倒さないと手に入らない。
This Helmet that protects the head is part of the one set. (Referring to the Battle Suits)
This second part, I could not translate. So here's Google Translate to the rescue! Not hat this will help any: Google says, "I do not get and do not kill the enemy with a labyrinth Ri Yaba."
-Thomas
|
|
|
Post by Ascended Mermaid on Jan 23, 2013 17:23:26 GMT -5
Oooo... thanks a ton! The second part probably wasn't a big deal, but at least we know it's not all magic. I'll have to do further testing to conclude their intent; from what I hear, the Battle Helmet wasn't at all useful. Does the manual say anything about the Ointment, and whether or not it's supposed to block magic? I also have these from the script: オイルでダメ一ジをうけなくなった
オイルの こうかがきれた
ウィングブ一ツの こうかがきれた
アワ一グラスの こうかがきれた Translation courtesy of Google Translate: I no longer receive a bad one in the oil storage
The effect of oil has expired
The effect of one ツ U~ingubu has expired
The effect of one glass bubble has expired Translation courtesy of Hudson USA: I am free from injury because of the ointment.
The power of the ointment is gone.
The power of the Wing Boots is gone.
The power of the Hour Glass is gone.
|
|
|
Post by SkyeWelse on Jan 24, 2013 2:05:21 GMT -5
Japanese Translation of Oil from Manual:
Literal For 1 Minute, for the main character, Nothing(Mu)Enemy Movements(Dekijyou)Tai(Ability/Skill)will become.
For 1 Minute, enemy attacks and movements will become ineffective to the player.
Let's see, English manual says:
Ointment
For a fixed period of time the Hero will be protected from any enemy attack.
|
|
|
Post by Ascended Mermaid on Jan 24, 2013 8:07:15 GMT -5
It sounds a lot like it leans toward protecting against both magical and physical attacks. That could just be how I'm reading it, however. Many thanks for your help! // Level design seems to support the theory that it should protect against both kinds of attack; like the placement of the Ointment outside of Forepaw, which is surrounded by many Charon and a Reapershiek. There's also an Ointment in the Tower above Forepaw (Lots of enemies, casters and otherwise.) and an Ointment in the Tower of Suffer, where again you are surrounded by Reapershiek. It seems like they really planned on placing it in rooms adjacent to spell casting enemies. On the other hand, it could be argued that roughly a third or fourth of the screens in the game have casters. I'll make extra sure there I didn't miss anything conclusive somewhere in the code that could hint at the Ointment/Oil being specific. If I can't find anything definite, I think I'll lose my mind trying to figure out ultimately what to do with it. I'll probably poll it. I think I've been pondering over this for a couple of years now, haha. // The biggest argument with regard to level design is that they're usually placed in areas either adjacent to or near bigger enemies, like Reapershiek (usually the closest boss to the Ointment), Rock Stand, Zoradouna, Zorugeriru, and Porapoura.
|
|