From 93759e985db7f1ae12def060bade8205cfe02d6c Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:19:16 +0200 Subject: [PATCH 01/52] Adds new fonts --- fonts/bold_vwf.png | Bin 0 -> 663 bytes fonts/book_vwf.png | Bin 0 -> 835 bytes fonts/vwf.png | Bin 1900 -> 666 bytes fonts/wicked_vwf.png | Bin 0 -> 982 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 fonts/bold_vwf.png create mode 100644 fonts/book_vwf.png create mode 100644 fonts/wicked_vwf.png diff --git a/fonts/bold_vwf.png b/fonts/bold_vwf.png new file mode 100644 index 0000000000000000000000000000000000000000..490930066da1071cd62d7f12ef93ca6c076d6cae GIT binary patch literal 663 zcmV;I0%-k-P)H@00I|DL_t(o!|jx@juSBuhUWoXP;NoN15mh3nQ{vrVjh6P9aFdfPNG_& zNHnQ<5NJk_BE>J!t_Vd$L%X8d!a5k+(Ozy-Af0p~#r}#S?WggKJ@eZ{ixw?f^j{^T zj426*2Kwf$0bmE!9oWFvF9oOpHPGv?pBapbVbH|QpnrZFNG0M2xbOAzr)dccKtFt( zl2&l@zT~j7YGnh`&AY4WMo7Q`NTlR!*78`aYn=bwF?0U6?`=8RkGTl^ju1N~)`+JEHy`5TfuXJ!sgI zXWJ*AfcI_N`qpnYm%-ILQUyD0wMsr&*Wm=j=4^@)Qv_?iW2nHKVWu&iKz2qfNn;e@ zx(_!m-Cel(5sl$P-i5FvmsYklYWoauMDtYH0YuvZ*!kzG27=v(0vdTSj!w+@ye`1I z&RL71VqF2dTL%wkcct`{6_&uG+2@ytazDh`eUlJGb#i0Yvto%eu%7=(V|6HqrVsG%kUy*6@dT%002ovPDHLkV1ljRBoqJu literal 0 HcmV?d00001 diff --git a/fonts/book_vwf.png b/fonts/book_vwf.png new file mode 100644 index 0000000000000000000000000000000000000000..b090b027378da81c863b99c6d68588952486b857 GIT binary patch literal 835 zcmV-J1HAl+P)S#iYP^W1YtU5(%>=uFFJPUAYv0TT$+r;1vT$#oL`u z%wQM$&lqfm@pc%-eH0p>zc3(=IL(hVA2aAPKs+kIQwB}tsWzG_s@-fdm}X8kPiko* z()slBa)+|q^5p+aVguH|;V$+rQlmcCSqC15I(p|BH37kbp&F_~!H>2VEr2h)z_V>j z_jC`2y0c3zeuEL<-6dnbmGjI~;+egO{ z_SBgNJ*~LC`{jNgmBGD#GX>b#xO#M8f?~2X@eUvg#H(oJ7c2mR#=Rbjm)PCXTfx@r z8Bp>mnACbW|3P2qJ0WC9%2=hVND+1r;vD#wpoTC)t&CN?9MCT41k+@Eo}{S`!{mdp zLQS`~C{Pi8E~DF9o=#+b!H2J9GTjEqiBXoo>vJe-O=X%OhT)_J8B zhrGX`n^Rm<-*`Zy&aAA)t${l>fF>l?W3-5PUpYWaZpJYKpJV}qelnX`nvMw@IgnOl zk)SZ9Mgh>8TO`Tiy8=0gi4#Z?$HY_OvPq^bt)=#T9p_}(&;ZMzv3Oh7+duxnG;Tnd z+dfY#rR%!Vm4kr+DT}O N002ovPDHLkV1kR2atr_f literal 0 HcmV?d00001 diff --git a/fonts/vwf.png b/fonts/vwf.png index 12685b5b211a4966e6cabdee2786e5b574b091dc..a7dc58923f31cf358941617c221c4ce59d2b6766 100644 GIT binary patch delta 657 zcmV;C0&e~64w?lsiBL{Q4GJ0x0000DNk~Le0001h000310RsR406{nG1cV3-#~Dh( zfXE*+;^~V(#1JFi&|GF{@`(2!@bQ`9kRjwpGWa}clPC4>0L+(bIO5lHe|BRZ6`%AK zVZS!4^e{s6*&!0bRE# z85fZ345pwWm~cRX8EkPYf(-?~D=Gs7EueAWKJopqH>VRX-g7qu9txh=BJ`lghH* r*Y3XTQxR);+y3~rY}vA9%WLuzR%|r1-?u~v00000NkvXXu0mjf1kxSB literal 1900 zcmeAS@N?(olHy`uVBq!ia0vp^6B!s71v!|3ET4m0YZ(}r83KGlTp1V|{{R2a5V{j6 zJ_<%dV5Eh>1=+nCKtD4kdAqwXbg;^L06Clm9+AZi417mGm~pB$pEOXAy~NYkmHi$! zv#5-r&cV_@zzp=s)5S5Q;?~>QH_Kit@VGAh_uu`#*|D?wRchPiPD!fn|4mQH}zkZ(G~So?@sdv{GT{AaO=d9wccM0Lj03E zJ=8iU>dhDKU+rz13%AZla#Nd;+iOMHwd6!#?yOL7Qx}S{|4}3Z6TYSx(FU})&nVRFb|~b!4K9^W&ovYr8%Clx8Z|uF%XUQtY%wm7nk}aH@W+cmezgc6Tb}GMGbE1u_$(MaGb#qiMRVo?o zo&SE)h2N6)0X=5l*Z+QzHRtG)7BL=G|HoyY@2?XmHMwFE_>8Gp$Z)Ybx z*{ia|i`Q&#*wG9FLlKv!v;5pAo}I%h*wt&%l+pCUD=sm2#VX&@Dd%_}pE`E0+^Ft$ zbf-_-rklsVPFy=p_UW`nE4>z{)zgJ1M#prTrYw)TcJbyymNQkBzfXw0RO@`AsdPC~ zHL&`lvRzhdwRg#3_j3z&J1#l8=zz<&9;tWX%c4VX_vQ%3A9PpV6c;zu%{cw6#8n$o$u!2=<7b)bgNtFw7yFp(r$?={hk!G%k6mIlGU{#HHMr0 zQa&xbyIg0NnoVuSw{t}aC!_*5u3F)`;A=t848stL`$g5>`CeV0JL6{M^yIFSfYfaf|wKR`~JURoAUMzl1%Gy)<*tjepaU zs>5%tn5S5-A^o-EP2ns5`N`1=v-CQ7PPu*KsL6}*VOhE^Yp-oMXXPT5N!vHw`0XsH_hxf%Agq^GN&%Q~lo FCIEkc`*HvP diff --git a/fonts/wicked_vwf.png b/fonts/wicked_vwf.png new file mode 100644 index 0000000000000000000000000000000000000000..c1971f10672c9ead9432b7864b137830e396fa0b GIT binary patch literal 982 zcmV;{11bE8P)XRVK#>xdXgM^=wa|QNWeV=rqnkr%ygmu zfG|jOr6R~s6!fLW`sD3Pm_u>9;9(a;{S)T6;2hqjC9e81UOe<95oPtThaNQ7>h;Dm7*>R(?ojAcCA^ap9-?YWv+qX?$2#jEe4`o=4-TjuS z5}_pA#e31H*s`m!`Ee`iN~q#_uUo7XU+kH%pTRFQwGWr`HuH}Pl^dHYy76pJfvr?+ zV9aEfQl{gv2~H<(as@&8TgA*KJAK4o>*Nr-(IaL~)by!-@BA!CA@apjWuD?dMxOXJ zK7#Dac&yBnKzKrN23YP&G#}(pkI`a~lnVrXHIT`ZF77ZIr4XSh{ecY53>^D3P~j#_ z7U#l1UZraU%L9YPVshE#sxIOGrkI!X>V-*Na8lR(8`^I3orc>4@IgX&)lLouAmb2D zE&__{a+zc8zUUh<<@i`jpPIDpKao~MiQ{MvyALbU&L~2N1$X9c<&%AEicfj!-Kksw?2pp%;XgCdrHlJWJS-Tq< zLB6$|b3L7MKs9K9qG*cmkLjMqU6f9Lh)UVXm_db1DB{;Sh%w%KNzZJwL_1?d8m2N(n~!T Date: Sat, 16 May 2015 17:20:01 +0200 Subject: [PATCH 02/52] Upgrade menu text display, plus battle hack embryo. --- src/battle.s | 221 ++++++++++++++++++++++++++++++ src/battle_magic.s | 175 ++++++++++++++++++++++++ src/battle_sram.s | 109 +++++++++++++++ src/ingame/items.s | 7 + src/ingame/magic.s | 38 +++++ src/ingame/main.s | 123 +++++++++++++++++ src/ingame/menus.i | 5 + src/ingame/options.s | 26 ++++ src/ingame/status.s | 15 ++ src/menus.s | 2 +- src/menus/in_game_text.s | 251 ++++++++++++++++++++++++++++++++++ src/menus/start_screen_text.s | 40 ++++++ src/menus/tools_shop_text.s | 28 ++++ src/minimal_vwf_patches.s | 48 +++---- src/new_game.s | 59 ++------ src/shop_menu.s | 47 +++++++ src/system_menus_text.i | 17 +++ src/system_menus_text.s | 98 +++++++++++++ src/vwf.s | 136 +++++++++++++----- 19 files changed, 1334 insertions(+), 111 deletions(-) create mode 100644 src/battle.s create mode 100644 src/battle_magic.s create mode 100644 src/battle_sram.s create mode 100644 src/ingame/items.s create mode 100644 src/ingame/magic.s create mode 100644 src/ingame/main.s create mode 100644 src/ingame/menus.i create mode 100644 src/ingame/options.s create mode 100644 src/ingame/status.s create mode 100644 src/menus/in_game_text.s create mode 100644 src/menus/start_screen_text.s create mode 100644 src/menus/tools_shop_text.s create mode 100644 src/shop_menu.s create mode 100644 src/system_menus_text.i create mode 100644 src/system_menus_text.s diff --git a/src/battle.s b/src/battle.s new file mode 100644 index 0000000..bab4157 --- /dev/null +++ b/src/battle.s @@ -0,0 +1,221 @@ + +;*=0x029D39 +; lda.l battle_actions, x +; +;; copy 8 bytes for the action +;*=0x029D42 +; ;cpy #0x0008 +; +;*=0x0FA7B9 +;battle_actions: +;.table 'text/ff4_menus.tbl' +;.text 'Attaquer' + +;*=0x028561 +; ldx #0x000A + + +;.02:8561 LDX #8 + + +; 0x029A63 +; may be main battle init +; all the windows are prebuilt +; call that results in loading funcs. +; $02/9A78 20 69 9D JSR $9D69 [$02:9D69] A:0005 X:7505 Y:000C P:envMxdIZC + + +; Ram address of the first tilemap +; 029A45 LDA $0000, x ; 7E8CBC +; +;*=0x0289BB +; ldy #0x6AC0 +;*=0x029A75 +; nop +; nop +; nop +;.02:89BB LDY #$6C00 +command_length = 10 + +{ +*=0x029CD6 + lda.b #command_length + +*=0x029D15 + lda.b #command_length + +*=0x029D42 + cpy.w #command_length + 2 +; +*=0x029D5A + cpy.w #command_length + 2 +; +*=0x029D39 + lda.l assets_battle_commands_dat, x +; +;; this byte controls the command window size +*=0x16fe68 + .db command_length + 3 + + +*=0x029CE0 + lda.b #command_length * 4 + +;*=0x029D9E +; lda.b #command_length * 4 +;*=0x16FEAD +; .dw 0x8CB2 +; .dw 0x8CB2 + 0x64 +; .dw 0x8CB2 + 0x64 * 2 +; .dw 0x8CB2 + 0x64 * 3 +; .dw 0x8CB2 + 0x64 * 4 + +; japanese window +;*=0x16FE54 +;.db 0x0A +;.db 0x0A ; number of lines of text +;.dw 0x8CB2 ; read address +;.dw 0xC1F4 ; write address +;.db 0x01 + +;*=0x029A55 +; ADC.b #0x80 ; '@' +;*=0x02A4C8 +;.dw 0xA64E +;.dw 0xA637; monsters names +;.dw 0xA657 ; Char names +;.dw 0xA6A4 ; dunno +;.dw 0xA64F +;.dw 0xA6AC ; supposed to clear monsters +;.dw 0xA4E6 +;.dw 0xA6BD ; dunno +;.dw 0xA6C3 ; dunno +;.dw 0xA6CA +;.dw 0xA6D1 +;.dw 0xA6D8 +;.dw 0xA7AD +;.dw 0xA782 +;.dw 0xA77A +;*=0x02999A ; window borders for battle commands + +;*=0x029B20 ; all windows +; nop +; nop +; nop + + +;*=0x0299A2 ; nukes the content of the battle window +; rts +; nop +; nop + +*=0x16FE54 +.db command_length * 2 +.db 5 * 2 +.dw 0x8CB2 ; read address +.dw 0xC1F4 ; write address +.db 0x01 + + +{ +; ram position of the prebuilt battle windows +*=0x16FEAD +battle_data_size = command_length * 4 * 5 +.dw 0x8CB2 +.dw 0x8CB2 + battle_data_size +.dw 0x8CB2 + battle_data_size * 2 +.dw 0x8CB2 + battle_data_size * 3 +.dw 0x8CB2 + battle_data_size * 4 + +*=0x02999F + ldx.w #battle_data_size + ; move items ram location + + +*=0x029FBB +; battle_items_position = 0x8CB2 + battle_data_size * 5 + battle_items_position = 0x2E00 + adc.w #battle_items_position + +*=0x02991E + jsr.l copy_battle_char + nop + + nop + nop + nop + + nop + nop + + +*=0x029932 + jsr.l copy_battle_char + nop + + nop + nop + nop + + nop + nop + + +; patch normal display_char to include 7FFFFF based switch +*=0x02A49B + jsr.l battle_display_char + rts + +; patch normal display_dakuten_char to include 7FFFFF based switch +*=0x02A4AC + jsr.l battle_display_dakuten_char + rts + +; enclose jsr build_tileset_function +; with 7FFFFF switch in the items related stuff. +*=0x02A06C + jsr.w 0xFFC2 + +; write window data to sram new size 0x3e8 +;*=0x029D63 +;; JSR copy_data_to_the_tile_map +; jsr.w 0xFFC2 + +; write magic data to sram 0x2d00 +;*=0x02A128 +; jsr.w 0xFFC2 + +*=0x02FFC2 + lda #0x85 + sta.l 0x7FFFFF + jsr 0xA455 + lda #0x00 + sta.l 0x7FFFFF + rts + +; battle display +;*=0x02991E +; lda.w battle_items_position, x +;*=0x029923 +; lda.w battle_items_position + 0x30,x +; +;*=0x029932 +; lda.w battle_items_position, x +;*=0x029937 +; lda.w battle_items_position + 0x30,x +; +;; build equiped items ts +;*=0x029E5C +; lda.b #0x42 +; nop +; nop + +} +;.16:FEAD .WORD $8CB2 +;.16:FEAF .WORD $8D16 +;.16:FEB1 .WORD $8D7A +;.16:FEB3 .WORD $8DDE +;.16:FEB5 .WORD $8E42 + +} + diff --git a/src/battle_magic.s b/src/battle_magic.s new file mode 100644 index 0000000..97e0227 --- /dev/null +++ b/src/battle_magic.s @@ -0,0 +1,175 @@ +battle_magic_length = 8 + +; used for the copy for the dakuten offset +*=0x02A094 + ; _ _ _ _ _ _ + ; A B B B B B + lda.b #battle_magic_length + +;*=0x02A0DC +; lda.b #battle_magic_length - 1 + +*=0x02A0E2 + lda.b #battle_magic_length + +*=0x02a113 + lda.b #battle_magic_length - 1 + +*=0x02A0FF + lda.l assets_magic_dat, x + +*=0x02A117 + lda.l assets_magic_dat+1, x + +*=0x02A09E + lda.b #battle_magic_length * 4 + +*=0x02986C + ldx #0xC52A + stx 0x00 + ldx.w #0xC52A + 2 + battle_magic_length * 2 + stx 0x02 + ldx #0xC546 + stx 0x04 + +;original +magic_data_base = 0x909A + +;magic_data_base = 0x703720 +*=0x029893 + lda.w magic_data_base, x + sta (0x00), y + lda.w magic_data_base + battle_magic_length * 4, x + sta (0x02), y + nop + nop + nop + ;LDA 0x97D6,X + nop + nop + ;STA (0x4),Y + iny + inx + cpy.w #battle_magic_length * 2 + + +*=0x0298AC + lda.w magic_data_base, x + sta (0x00), y + lda.w magic_data_base + battle_magic_length * 4, x + sta (0x02), y + ;LDA $97D6,X + nop + nop + nop + ;STA (D,4),Y + nop + nop + iny + inx + cpy.w #0x40 + battle_magic_length * 2 + +*=0x0298C6 + adc.w #battle_magic_length * 2 * 2 + +*=0x02988D + lda.b #12 + + +; 0x240 * 3 = 0x6C0 +{ +size = 0x120 +;fsize = size * 4 +;fsize = 0x6C0 ; original +fsize = 0x900 +*=0x029825 + .dw 0x0000 + .dw fsize + .dw fsize * 2 + .dw fsize * 3 + .dw fsize * 4 + +*=0x16FF2F + .dw magic_data_base & 0xFFFF + .dw (magic_data_base + fsize) & 0xFFFF + .dw (magic_data_base + fsize * 2) & 0xFFFF + .dw (magic_data_base + fsize * 3) & 0xFFFF + .dw (magic_data_base + fsize * 4) & 0xFFFF + +;*=0x16ff39 +; .dw 0x2C7A +; .dw 0x2C7A + fsize +; .dw 0x2C7A + fsize * 2 +; .dw 0x2C7A + fsize * 3 +; .dw 0x2C7A + fsize * 4 + + +*=0x029834 + ldx.w #0x300 ; 0x240 + +*=0x02982F + ldx.w #0x600 ; 0x480 + +; patches the transfer size +*=0x16fe1c + .dw 0x600 ; 0x400 +} +; number of lines to scroll ? +*=0x02B72B + cmp #11 + +; items per line for cursor dpad right +*=0x02B781 + cmp #1 + + +; dpad up +*=0x02B712 + nop + nop + +*=0x02B71C + nop + nop + +; dpad down +*=0x02B751 +; INC D,$63 + nop + nop + +*=0x02B742 + nop + nop + + +*=0x16FC56 + .db 2 + .db 0x3C + 14 + .db 0x74 + +*=0x16FC5B + .db 0x9C + .db 0xA8 + .db 0xB4 + + +*=0x02B764 + inc 0x5F + ;inc 0x5F + nop + nop + inc 0x63 + ;inc 0x63 + nop + nop + +*=0x02B785 + dec 0x5F + ;dec 0x5F + nop + nop + dec 0x63 + ;dec 0x63 + nop + nop diff --git a/src/battle_sram.s b/src/battle_sram.s new file mode 100644 index 0000000..bda9a77 --- /dev/null +++ b/src/battle_sram.s @@ -0,0 +1,109 @@ +sram_base = 0x700000 +.macro long_sram_store(src) { + phy + phx + + php + rep #0x20 + pha + tya + clc + adc.b src + tax + pla + sep #0x20 + plp + sta.l sram_base, x + + plx + ply +} + + +copy_battle_char: + lda.l sram_base + 0x2E00, x + sta (0x00),Y + lda.l sram_base + 0x2E00 + 0x30, x + sta (0x02),Y + rtl + + +battle_display_char: +{ + pha + lda.l 0x7FFFFF + cmp #0x85 + beq sram_store +wram_store: + pla + phx + sta (0x34),Y + lda #0xFF + sta (0x32),Y + iny + lda 0x36 + sta (0x32),Y + sta (0x34),Y + iny + plx + rtl +sram_store: + pla + phx + long_sram_store(0x34) + lda #0xFF + long_sram_store(0x32) + iny + lda 0x36 + long_sram_store(0x32) + long_sram_store(0x34) + iny + plx + rtl +} + +battle_display_dakuten_char: +{ + pha + lda.l 0x7FFFFF + cmp #0x85 + beq sram_store +wram_store: + pla + phx + sec + sbc #0xF + asl + tax + lda 0x16FA40, x + sta (0x32), y + lda 0x16FA41, x + sta (0x34), y + iny + lda 0x36 + sta (0x32), y + sta (0x34), y + iny + plx + rtl + +sram_store: + pla + phx + sec + sbc #0x0F + asl + tax + lda 0x16FA40, x + long_sram_store(0x32) + lda 0x16FA41, x + long_sram_store(0x34) + iny + lda 0x36 + long_sram_store(0x32) + long_sram_store(0x34) + iny + plx + rtl + +} diff --git a/src/ingame/items.s b/src/ingame/items.s new file mode 100644 index 0000000..57ca4d9 --- /dev/null +++ b/src/ingame/items.s @@ -0,0 +1,7 @@ +; during scroll +*=0x01A814 + load_system_menu_text_pointer(items_menu.item) + +; when scroll done +*=0x019F56 + load_system_menu_text_pointer(items_menu.item) diff --git a/src/ingame/magic.s b/src/ingame/magic.s new file mode 100644 index 0000000..ff5b566 --- /dev/null +++ b/src/ingame/magic.s @@ -0,0 +1,38 @@ +; White spells +*=0x01AFA2 + load_system_menu_text_pointer(spells.white) + +; Black spells +*=0x01AFB6 + load_system_menu_text_pointer(spells.black) + +; summons +*=0x01AFCA + load_system_menu_text_pointer(spells.summon) + +*=0x01AFDE + load_system_menu_text_pointer(spells.ninja) + +*=0x1d95e + load_system_menu_text_pointer(spells.kokan) + +*=0x01b0ec + ldx.w #0x020A + 0x40 + load_system_menu_text_pointer(spells.mp_needed) + +; Grisement des types sorts : 'Blancs' 'Noirs' etc ... +*=0x01B419 + ldy.w #0x0007 + sta.w 0xC5FF,x + +; Spells type cursor offset +*=0x01B0CE + lda.b #0x00 + +; Spells cost before char +*=0x01B0F7 + STA.W 0xC816 + 0x40 + 2 + +; Spells cost +*=0x01B0E6 + LDY.W #0x021A + 0x40 + 2 diff --git a/src/ingame/main.s b/src/ingame/main.s new file mode 100644 index 0000000..8970f3e --- /dev/null +++ b/src/ingame/main.s @@ -0,0 +1,123 @@ +{ +*=0x01DB61 + .dw 0x0000, 0x1A16 ; fenètre principale + .dw 0x05EC, 0x0308 ; fenètre Gils + .dw 0x04EE, 0x0207 ; fenetre temps + .dw 0x002E, 0x1107 ; fenètre menu principal + +*=0x01892E + load_system_menu_text_pointer(in_game_menu.menu) + +; Gils +*=0x0187CE + load_system_menu_text_pointer(in_game_menu.gils) + +; moves gils two chars on the right +*=0x0187DA + ldy.w #0x062A + 4 + +; TIME +*=0x0187C5 + ldx.w #0x52E + 2 + load_system_menu_text_pointer(in_game_menu.time) + +; disable Save text +*=0x018939 + jmp.l disable_save + +; Moves the classes on the left +*=0x018C1A + adc.w #0x0000 + + +*=0x018FD3 + jsr.l load_classes_pointer + nop + sta 0x45 + xba + sta 0x46 + ldx 0x45 + lda #0x0F + +*=0x018fe3 +{ +load_next_char: + lda.l assets_classes_dat, x + beq end + ; dakuten + jsr.w 0x8E32 + sta.w 0x0000, y + xba + sta.w 0x0040, y + iny + lda.b 0x34 + sta.w 0x0000, y + sta.w 0x0040, y + inx + iny + bra load_next_char +end: + rts +} + +; LEVEL +*=0x0189C3 +{ + level_offset = 7 * 2 + lda #0xF0 + sta.w 0+level_offset, x + lda #0xF1 + sta.w 2+level_offset, x + lda #0xF2 + sta.w 4+level_offset, x + lda #0xF3 + sta.w 6+level_offset, x + nop + + lda #0x57 ; H 49 V 57 + sta.w 0x40 + 2,X + lda #0x51 ; P + sta.w 0x42 - 2,X + sta.w 0x82 -2 ,X + lda #0x4E ; M + sta.w 0x80 + 2,X + lda #0xC7 ; / + sta.w 0x4E,X + sta.w 0x8E,X +} + +; Moves the level down in the digest +*=0x0189FA + sta.w 0x0016,X + xba + sta.w 0x0018,X + +; deplacement du nom du perso +*=0x0183D5 + sta.w 0x0040,Y + xba + sta.w 0x0080,Y + +; gils offset ; very bad idea it's used to display numbers everywhere +;*=0x018FAF +; adc.w #0x0052 + +; Time offset +*=0x018BC1 + lda.b #0x80 + STA.W 0x0578,Y + XBA + STA.W 0x057A,Y + REP #0x20 + LDA.B 0x73 + SEP #0x20 + JSR.W 0x81D6 + LDA.B 0x5B + STA.W 0x0570,Y + LDA.B 0x5D + STA.W 0x0572,Y + LDA.B 0x5E + STA.W 0x0574,Y + LDA.B #0xC8 + STA.W 0x0576,Y +} \ No newline at end of file diff --git a/src/ingame/menus.i b/src/ingame/menus.i new file mode 100644 index 0000000..b5a797a --- /dev/null +++ b/src/ingame/menus.i @@ -0,0 +1,5 @@ +.include 'src/ingame/main.s' +.include 'src/ingame/items.s' +.include 'src/ingame/options.s' +.include 'src/ingame/status.s' +.include 'src/ingame/magic.s' diff --git a/src/ingame/options.s b/src/ingame/options.s new file mode 100644 index 0000000..94f205d --- /dev/null +++ b/src/ingame/options.s @@ -0,0 +1,26 @@ + +;RGB -> RVB :o) +*=0x01D1BB + lda.b #0x57 + +; déplacement du curseur principal des options +*=0x01D247 + lda.b #0x00 + +; Cursor offset in controls menu (x) +*=0x01D4E6 + lda.b #0x03 + +;y +*=0x01D4E2 + adc.b #0x4C + +*=0x01D1B0 + load_system_menu_text_pointer(options.title) + +*=0x01D1A4 + load_system_menu_text_pointer(options.config) + +; controles +*=0x01D48D + load_system_menu_text_pointer(options.controls) diff --git a/src/ingame/status.s b/src/ingame/status.s new file mode 100644 index 0000000..ef6422e --- /dev/null +++ b/src/ingame/status.s @@ -0,0 +1,15 @@ +;décalage du nom vers le haut +*=0x01A9B7 + ldy.w #0x0044 + +*=0x01A99E + load_system_menu_text_pointer(status.status) + +*=0x01AAE9 + load_system_menu_text_pointer(status.exp_for_next_level) + +*=0x01ABBC + load_system_menu_text_pointer(status.char_stats) + +*=0x01A9CA + ldy.w #0x15C - 0x80 \ No newline at end of file diff --git a/src/menus.s b/src/menus.s index 3982bde..267fde3 100644 --- a/src/menus.s +++ b/src/menus.s @@ -571,7 +571,6 @@ PT0000: ;dma_transfer_to_vram_nofunk(assets_menu_bin, 0x6000, assets_menu_bin__size, 0x1801) - highway_to_hell: ; wait_for_vblank_inline() ; dma_transfer_to_vram_nofunk(0x0AF000 ,0x6000, 0x1000, 0x1801) ; wait_for_vblank_inline() @@ -596,6 +595,7 @@ PT0003: LDA.B #0x06 JSR.L textload RTS +endofbidule: ; freespace *=0x20B000 diff --git a/src/menus/in_game_text.s b/src/menus/in_game_text.s new file mode 100644 index 0000000..d693f3b --- /dev/null +++ b/src/menus/in_game_text.s @@ -0,0 +1,251 @@ +.scope in_game_menu { +menu: + ; window + .dw 0x002E, 0x1107 + ; position + .dw 0x0070 + .text 'Objets' + .db 0x01 + .dw 0x00F0 + .text 'Sorts' + .db 0x01 + .dw 0x0170 + .text 'Equiper' + .db 0x01 + .dw 0x01F0 + .text 'Statut' + .db 0x01 + .dw 0x0270 + .text 'Placer' + .db 0x01 + .dw 0x02F0 + .text 'Changer' + .db 0x01 + .dw 0x0370 + .text 'Options' + .db 0x01 + .dw 0x03F0 + .text 'Sauver' + .db 0 + +gils: + .text 'Gils' + .db 0 + +time: + .text 'TEMPS' + .db 0 +} + +.scope items_menu { + item: + .db 2 + .db 0 + .db 7 + .db 3 + + .dw 0x0044 + .text 'Objets' + .db 0 + notuse: + .dw 0x0052 + .text 'Impossible à utiliser.' + .db 0 + +} + +.scope spells { + white: + .dw 0x00EE + .text 'Blanc' + .db 0 + black: + .dw 0x016E + .text 'Noir' + .db 0 + summon: + .dw 0x01EE + .text 'Chimere' + .db 0 + ninja: + .dw 0x016E + .text 'Ninja' + .db 0 + kokan: + .dw 0x0054 + .text 'Echange' + .db 0 + mp_needed: + .text 'Coût PM' + .db 0 +} + +.scope status { +status: + .dw 0x01F0 + .text 'Statut' + .db 0 + +exp_for_next_level: + .dw 0x0260 + .text 'Niveau suivant' + .db 0 + +char_stats: + .dw 0x0114 - 0x80 + ; use precomputed 8x8vwf. + .db 0xF0 + .db 0xF1 + .db 0xF2 + .db 0xF3 + .db 1 + .dw 0x01A0 + .text 'Expérience' + .db 1 + + .dw 0x0206 + .text 'PV' + .db 1 + + .dw 0x0286 + .text 'PM' + .db 1 + + .dw 0x0344 + .text 'Talents' + .db 1 + + .dw 0x03C2 + .text 'Vigueur' + .db 1 + + .dw 0x0442 + .text 'Agilité' + .db 1 + + .dw 0x04C2 + .text 'Vitesse' + .db 1 + + .dw 0x0542 + .text 'Esprit' + .db 1 + + .dw 0x05C2 + .text 'Volonté' + .db 1 + +;att/def/mag: + + .dw 0x035A + .text 'Attaque' + .db 1 + + .dw 0x03DA + .text 'Attaque%' + .db 1 + + .dw 0x045A + .text 'Défense' + .db 1 + + .dw 0x04DA + .text 'Défense%' + .db 1 + + .dw 0x055A + .text 'Déf Mag' + .db 1 + + .dw 0x05DA + .text 'Déf Mag%' + .db 0 +} + +.scope options { +title: + .dw 0x0096 + .text 'Options' + .db 0 + +config: + .dw 0x0102, 0x141C + + .dw 0x0144 + .text 'Mode Combat' + .db 0x01 + + .dw 0x015E + .text 'Actif Pause' + .db 0x01 + + .dw 0x01C4 + .text 'Vitesse Cbt' + .db 0x01 + + .dw 0x021E + .text 'Vite Lent' + .db 0x01 + + .dw 0x0244 + .text 'Vitesse Msg' + .db 0x01 + + .dw 0x02C4 + .text 'Audio' + .db 0x01 + + .dw 0x02DE + .text 'Stéréo Mono' + .db 0x01 + + .dw 0x0344 + .text 'Contrôle' + .db 0x01 + + .dw 0x035E + .text 'Normal Perso.' + .db 0x01 + + .dw 0x03DE + .text 'Seul Multiple' + .db 0x01 + + .dw 0x0444 + .text 'Curseur' + .db 0x01 + + .dw 0x045E + .text 'Reset Mémoire' + .db 0x01 + + .dw 0x04C4 + .text 'Couleur' + .db 0 + + +controls: + .dw 0x0204 + .text 'Action' + .db 0x01 + + .dw 0x0284 + .text 'Annuler' + .db 0x01 + + .dw 0x0304 + .text 'Menu' + .db 0x01 + + .dw 0x0384 + .text 'Left Button' + .db 0x01 + + .dw 0x0404 + .text 'Start' + .db 1 + + .dw 0x0484 + .text 'Fin' + .db 0 +} \ No newline at end of file diff --git a/src/menus/start_screen_text.s b/src/menus/start_screen_text.s new file mode 100644 index 0000000..ce40ff6 --- /dev/null +++ b/src/menus/start_screen_text.s @@ -0,0 +1,40 @@ +.scope newgame { +new_game: + .dw 0x0042 ; text position + .text 'Nouvelle partie' + .db 0 + +time_load_save: + .dw 0x046E + .text 'TEMPS' + .db 0 + +gils_load_game: + .text 'Gils' + .db 0 + +save: + .text 'Partie' + .db 0 + +load_this_save: + .dw 0x006E + .text 'Cette' + .db 1 + .dw 0x00EE + .text 'partie?' + .db 0 + +yes_no: + .dw 0x0172 + .text 'Oui' + .db 1 + .dw 0x01F2 + .text 'Non' + .db 0 + +empty_save: + .db 0x90 + 2, 0x00 + .text 'VIDE' + .db 0 +} \ No newline at end of file diff --git a/src/menus/tools_shop_text.s b/src/menus/tools_shop_text.s new file mode 100644 index 0000000..56f79e1 --- /dev/null +++ b/src/menus/tools_shop_text.s @@ -0,0 +1,28 @@ +.scope shops { +gils: + .dw 0x0176 ; - 4 + .db 0xf4, 0xf5 +; .text 'Gils' + .db 0 + +welcome_and_actions: + .dw 0x0054 - 2 + .text 'Puis-je vous aider ?' + ;.text 'いらっしゃい! どんなごようけんで?' + .db 1 + .dw 0x0148 - 4 + .text 'Achat Vente Sortir' + .db 0 + ;.text 'かう うる でる' + +quantity: + .dw 0x0052 + .text 'Que désirez vous ?' + .db 1 + .dw 0x0144 + .text 'Quantité' + .db 1 + .dw 0x0146 + 8 * 2 + .text '1' + .db 0 +} \ No newline at end of file diff --git a/src/minimal_vwf_patches.s b/src/minimal_vwf_patches.s index e9419bb..173c81f 100644 --- a/src/minimal_vwf_patches.s +++ b/src/minimal_vwf_patches.s @@ -3,36 +3,36 @@ ;===================================================================== *=0x00B404 - JSR.L CalculePositionTb - JSR.L PointeurBank1de1 - STA.B 0xDD - LDX.B 0x3D - STX.W 0x0772 - RTS + jsr.l CalculePositionTb + jsr.l PointeurBank1de1 + sta 0xDD + ldx 0x3D + stx 0x0772 + rts *=0x00B41D - JSR.L CalculePositionTb - JSR.L PointeurBank1de2 - STA.B 0xDD - LDX.B 0x3D - STX.W 0x0772 - RTS + jsr.l CalculePositionTb + jsr.l PointeurBank1de2 + sta 0xDD + ldx 0x3D + stx 0x0772 + rts *=0x00B436 - JSR.L CalculePositionTb - JSR.L PointeurBank3 - STA.B 0xDD - LDX.B 0x3D - STX.W 0x0772 - RTS + jsr.l CalculePositionTb + jsr.l PointeurBank3 + sta 0xDD + ldx 0x3D + stx 0x0772 + rts *=0x00B3BB - LDA.W 0x1702 - STA.B 0x3D - LDA.W 0x1701 - STA.B 0x3E - JSR.L PointeurBank2 - RTS + lda 0x1702 + sta 0x3D + lda 0x1701 + sta 0x3E + jsr.l PointeurBank2 + rts ; nukes the first call of display_script because the text ; has to be rendered before animating the window display diff --git a/src/new_game.s b/src/new_game.s index 87ae1ef..73e2c02 100644 --- a/src/new_game.s +++ b/src/new_game.s @@ -1,11 +1,6 @@ .table 'text/ff4_menus.tbl' { -*=0x01E00C - .db 0x90 + 2, 0x00 - .text 'VIDE' - .db 0 - ; new game window *=0x01dfc7 .db 0x12 ; width @@ -25,58 +20,24 @@ *=0x019A52 - ldy.w #save + load_system_menu_text_pointer(newgame.save) *=0x01962E - ldy.w #new_game + load_system_menu_text_pointer(newgame.new_game) *=0x019826 - ldy.w #load_this_save + load_system_menu_text_pointer(newgame.load_this_save) *=0x01982C - ldy.w #yes_no - + load_system_menu_text_pointer(newgame.yes_no) +; *=0x01983E - ldy.w #time_load_save + load_system_menu_text_pointer(newgame.time_load_save) *=0x01984D - ldy.w #gils_load_game + load_system_menu_text_pointer(newgame.gils_load_game) ldx.w #0x674 +*=0x019AC5 + load_system_menu_text_pointer(newgame.empty_save) -*=0x019856 - ldy.w #0x62C-4 -*=0x01DFE8 -time_load_save: - .dw 0x046E - .text 'TEMPS' - .db 0 -gils_load_game: - .text 'Gils' - .db 0 -*=0x01FFA0 -save: - .text 'Partie' - .db 0 - -new_game: - .dw 0x0042 ; text position - .text 'Nouvelle partie' - .db 0 - -load_this_save: - .dw 0x006E - .text 'Cette' - .db 1 - .dw 0x00EE - .text 'partie?' - .db 0 - -yes_no: - .dw 0x0172 - .text 'Oui' - .db 1 - .dw 0x01F2 - .text 'Non' - .db 0 - -} +} \ No newline at end of file diff --git a/src/shop_menu.s b/src/shop_menu.s new file mode 100644 index 0000000..d534bf7 --- /dev/null +++ b/src/shop_menu.s @@ -0,0 +1,47 @@ +; ギル : gils +*=0x01C3EC + load_system_menu_text_pointer(shops.gils) + +*=0x01C350 + load_system_menu_text_pointer(shops.welcome_and_actions) + +*=0x01C43F + load_system_menu_text_pointer(shops.quantity) + +*=0x01C568 + load_system_menu_text_pointer(shops.gils + 2) + +; moves gils text char right +*=0x01C561 + sec + sbc #0x30 - 2 + +; 'tools message window +;*=0x01DEB2 +;.db 0x10 +;.db 0 +;.db 0x14 +;.db 3 + + + +; Tools Buy Sell Exit menu window +*=0x01DEAA + ; position + .db 0x02,0x01 + ; + .db 0x12,0x03 + +; Changes the offset of the hand pointer +*=0x01C37C + lda 0x1B79 + asl + asl + asl + asl + sta 0x45 + asl + adc 0x45 + nop + nop + sta 0x45 \ No newline at end of file diff --git a/src/system_menus_text.i b/src/system_menus_text.i new file mode 100644 index 0000000..bb8f4e6 --- /dev/null +++ b/src/system_menus_text.i @@ -0,0 +1,17 @@ +.macro load_system_menu_text_pointer(pointer) { + ldy.w #pointer - 0x8000 +} + +{ +*=0x018301 + jmp.l display_text_in_menus + +*=0x0182CD + jmp.l load_text_with_destination_in_x + +*=0x0180D9 + jmp.l display_window_with_text + +*=0x018798 + jmp.l display_time +} \ No newline at end of file diff --git a/src/system_menus_text.s b/src/system_menus_text.s new file mode 100644 index 0000000..765ac03 --- /dev/null +++ b/src/system_menus_text.s @@ -0,0 +1,98 @@ +.macro bank_switch() { + cpy.w #0x8000 + bmi moved_text + lda.b #0x01 + pha + bra jump_to_original + +moved_text: + pha + rep #0x20 + tya + adc.w #0x8000 + tay + sep #0x20 + pla + phk + +jump_to_original: + plb +} + +.macro bank_switch_with_jump(jump_to) { + bank_switch() + jmp.l jump_to +} + + +display_text_in_menus: +{ + + phb + phd + phx + ldx.w #0x100 + phx + pld + + bank_switch_with_jump(0x01830B) +} + +load_text_with_destination_in_x: + + phb + phd + phx + phx + ldx.w #0x0100 + phx + pld + plx + + + rep #0x20 + + txa + clc + adc 0x29 + tax + sep #0x20 + + bank_switch_with_jump(0x018318) + + +display_window_with_text: + phy + phb + bank_switch_with_jump(0x0180DD) + +display_time: + phb + bank_switch() + rep #0x20 + jmp.l 0x01879D + +disable_save: + lda.b #0x24 + sta 0xCA31 ;S + sta 0xCA33 ;a + sta 0xCA35 ;u + sta 0xCA37 ;v + sta 0xCA39 ;e + sta 0xCA3B ;r + jmp.l 0x018947 + +load_classes_pointer: + phx + rep #0x20 + + and.w #0x00FF + asl + tax + + lda.l assets_classes_ptr, x + sep #0x20 + + plx + rtl + diff --git a/src/vwf.s b/src/vwf.s index 3a5322d..737446b 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -25,17 +25,20 @@ vwfstart: BITSLEFT = var_base + 4 CNTR2 = var_base + 6 temp = var_base + 8 - scroll = var_base + 10 - vsize = var_base + 12 -;;buildmap call - winstate = var_base + 14 - tstart = var_base + 16 - nchars = var_base + 18 - pixel_c = var_base + 20 - oldtilepos = var_base + 22 - TILEPOS = var_base + 24 + font_addr = var_base + 10 ; 11 12 +; scroll = var_base + 10 +; vsize = var_base + 12 + font_length = var_base + 13 ; 14 15 + winstate = var_base + 16 + nchars = var_base + 18 + pixel_c = var_base + 20 + oldtilepos = var_base + 22 + TILEPOS = var_base + 24 no_wait_for_action = 0xcb + lda #0 + jsr.w setup_font + php sep #0x20 save_16_bit_var(CNTR, ram_mirror) @@ -43,10 +46,10 @@ vwfstart: save_16_bit_var(BITSLEFT, ram_mirror) save_16_bit_var(CNTR2, ram_mirror) save_16_bit_var(temp, ram_mirror) - save_16_bit_var(scroll, ram_mirror) - save_16_bit_var(vsize, ram_mirror) +; save_16_bit_var(scroll, ram_mirror) +; save_16_bit_var(vsize, ram_mirror) save_16_bit_var(winstate, ram_mirror) - save_16_bit_var(tstart, ram_mirror) +; save_16_bit_var(tstart, ram_mirror) save_16_bit_var(nchars, ram_mirror) save_16_bit_var(pixel_c, ram_mirror) save_16_bit_var(oldtilepos, ram_mirror) @@ -132,7 +135,7 @@ _nxt5: ; Delay avant de fermer ? CMP #0x05 BNE _nxt6 - JMP.W _code05 + JMP.W _code05 _nxt6: ; it might lack 06 and 07 text opcodes @@ -158,11 +161,17 @@ _nxtFB: CMP #0xFC BNE _nxtFC JMP.W suit3 - -_nxtFC: +_nxtFC: + cmp #0xFE + bne _nxtFE + jsr.w ChargeLettreInc + jsr.w setup_font + jmp.w main +_nxtFE: CMP #0xFF BNE _nxtFF JMP.W retour_auto + _nxtFF: @@ -251,6 +260,10 @@ _loop_B5D2: ;**************** display_character_name: { +; pha +; lda.b #3 +; jsr.w setup_font +; pla JSR.W ChargeLettreInc ASL STA.B 0x30 @@ -286,6 +299,10 @@ suite: BEQ exit JMP.W next exit: +; pha +; lda.b #0 +; jsr.w setup_font +; pla JMP.W main } ;******************** @@ -362,15 +379,15 @@ musique: _code05: JSR.W ChargeLettreInc - STZ 0x19 + STZ.b temp+1 ASL - ROL 0x19 + ROL.b temp+1 ASL - ROL 0x19 + ROL.b temp+1 ASL - ROL 0x19 - STA 0x18 - LDX 0x18 + ROL.b temp+1 + STA.b temp + LDX.b temp STX 0x08F4 LDX 0x0000 STX 0x08F6 @@ -456,7 +473,12 @@ Boucle2: CMP #0x08 BNE _shift PLX - LDA.L assets_font_dat,X + ; LDA.L assets_font_dat,X + phy + txy + lda.b [font_addr], y + tyx + ply INX XBA BRA _store @@ -471,7 +493,12 @@ _shift: ;REP #0x20 - LDA.L assets_font_dat,X + ;LDA.L assets_font_dat,X + phy + txy + lda.b [font_addr], y + tyx + ply INX STA.L 0x004203 ; MULTIPLICAND @@ -513,7 +540,10 @@ _store: LDA.B CURRENT_C TAX - LDA.L assets_font_length_table_dat,X +; LDA.L assets_font_length_table_dat,X + txy + lda.b [font_length], y + tyx STA.B temp REP #0x20 @@ -557,6 +587,33 @@ vwf_shift_table: .db 0b10000000 ;7 .db 0b10000000 ;8 +setup_font: +{ + phx + pha + asl + sta.b temp + pla + clc + adc.b temp + tax + + rep #0x20 + lda.l font_table, x + sta.b font_addr + lda.l length_table,x + sta.b font_length + sep #0x20 + + lda.l font_table+2, x + sta.b font_addr+2 + lda.l length_table+2,x + sta.b font_length+2 + + plx + rts +} + ;************************ ;** build font pointer ** ;************************ @@ -663,7 +720,12 @@ firstrun2: TAX ;SEP #0x20 - LDA.L assets_font_length_table_dat,X ; on load la largeur de la lettre + ;LDA.L assets_font_length_table_dat,X ; on load la largeur de la lettre + phy + txy + lda.b [font_length], y + tyx + ply INC add_accumulator_value_to_temp: @@ -718,18 +780,18 @@ padloop: BRA end nowaitpad: -; LDA.B #0x10 -; STA.B CNTR -; -;{ -;loop: -; WAI -; WAI -; WAI -; WAI -; DEC.B CNTR -; BNE loop -;} + LDA.B #0x10 + STA.B CNTR + +{ +loop: + wai + wai + wai + wai + dec.b CNTR + bne loop +} end: pla jsr.w clr From fc60bc24544aece5ea4db3ce01882b135b4ac19f Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:20:40 +0200 Subject: [PATCH 03/52] Adds font change tags. --- text/ff4fr.tbl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/text/ff4fr.tbl b/text/ff4fr.tbl index 32b2773..5402c6a 100644 --- a/text/ff4fr.tbl +++ b/text/ff4fr.tbl @@ -3,10 +3,14 @@ 02:1=[space] 03:1=[music] 05:1=[delay] +fe00=[normal] +fe01=[wicked] +fe02=[book] +fe03=[bold] 0400=Cecil 0401=Cain 0402=Rydia -0403=Tella +0403=Tellah 0404=Gilbert 0405=Rosa 0406=Yang @@ -111,7 +115,6 @@ 9D=Ï 9E=Î 9F=Ç -A0A1=œ FB=[nowindow] FC=[new]\n FD=° From 1bd9337ff9f4d7394fa6cdca7ec15d23745b0f8a Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:21:21 +0200 Subject: [PATCH 04/52] Reuse japanese symbols for - .. ? and !. --- text/ff4_menus.tbl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/text/ff4_menus.tbl b/text/ff4_menus.tbl index abcd95a..b8a1abd 100644 --- a/text/ff4_menus.tbl +++ b/text/ff4_menus.tbl @@ -76,15 +76,16 @@ 89=9 8A=ç 8B=û -8C=? -8D=! +C2=- +C3=.. +C4=! +C5=? 8E=. 8F=, 90=' 91=: 92=`` 93='' -94=- 95=É 96=È 97=Ê From 3135c639a53383d95f28b18d2c6f03f57e1ccafc Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:22:11 +0200 Subject: [PATCH 05/52] Updgrade binary font generation. --- utils/font.py | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/utils/font.py b/utils/font.py index 750258a..35e9655 100644 --- a/utils/font.py +++ b/utils/font.py @@ -1,29 +1,31 @@ -from math import ceil -import binascii import numpy as np from PIL import Image -# from scipy import ndimage -import struct - def get_char(image, char, has_grid, char_width, char_height): shape = image.shape width = shape[1] height = shape[0] - x_char_count = (width - 1) / (char_width + 1) - y_char_count = (height - 1) / (char_height + 1) + if has_grid: + x_char_count = (width - 1) / (char_width + 1) + y_char_count = (height - 1) / (char_height + 1) + else: + x_char_count = width / char_width + y_char_count = height / char_height line = int(char / x_char_count) column = int(char % x_char_count) - x_offset = column * (char_width + 1) + 1 - y_offset = line * (char_height + 1) + 1 + if has_grid: + x_offset = column * (char_width + 1) + 1 + y_offset = line * (char_height + 1) + 1 + else: + x_offset = column * char_width + y_offset = line * char_height return image[y_offset:y_offset + char_height, x_offset:x_offset + char_width] - def char_as_1bbp(char): binary_data = [] for byte in char: @@ -60,3 +62,31 @@ def convert_font_to_1bpp(font_file, has_grid=True): len_table[i] = get_max_width(get_char(image, i, has_grid, 8, 16)) return len_table, data + + +def remove_grid(font_file): + image = np.array(Image.open(font_file)) + + font = None + for i in range(0, 0x10): + line = None + for k in range(0, 0x10): + char = get_char(image, i * 0x10 + k, True, 8, 16) + + if line is not None: + line = np.concatenate([line, char], 1) + else: + line = char + if font is not None: + font = np.concatenate([font, line], 0) + else: + font = line + + im = Image.fromarray(np.uint8(font * 255)) + # output = io.BytesIO() + + im.save('/tmp/font.png', format='PNG') + + +if __name__ == '__main__': + remove_grid('/Users/emmanuel/PycharmProjects/ff4/fonts/wicked_vwf.png') \ No newline at end of file From a5f7741b867d180c84fefef903fe249c3c69ffe6 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:22:49 +0200 Subject: [PATCH 06/52] Upgrade build script. --- build.py | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/build.py b/build.py index b09a778..cb98a00 100755 --- a/build.py +++ b/build.py @@ -1,5 +1,5 @@ # coding:utf-8 -#!/usr/bin/env python3.4 +# !/usr/bin/env python3.4 import os from xml.etree import ElementTree @@ -9,6 +9,7 @@ from script.formulas import long_low_rom_pointer from script.pointers import read_pointers_from_xml, write_pointers_value_as_binary, write_pointers_addresses_as_binary, \ Pointer +import struct from utils.font import convert_font_to_1bpp @@ -78,9 +79,11 @@ def build_fixed_asset(table, input_file, binary_text_file): write_pointers_value_as_binary(pointers, binary_text_file) -def build_null_terminated(table, input_file, binary_text_file): +def build_null_terminated(table, input_file, binary_text_file, pointers_file=None): pointers = read_stringarray_from_xml(input_file, table) write_pointers_value_as_binary(pointers, binary_text_file) + if pointers_file: + write_pointers_addresses_as_binary(pointers, lambda v: struct.pack(' Date: Sat, 16 May 2015 17:23:13 +0200 Subject: [PATCH 07/52] Upgrade main ff4 assembly file. --- ff4.s | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/ff4.s b/ff4.s index fae52d8..5a18db1 100644 --- a/ff4.s +++ b/ff4.s @@ -2,11 +2,17 @@ ; Final Fantasy IV the new hack. ; ---------------- .include 'src/libmz.i' +.include 'src/system_menus_text.i' .include 'src/minimal_vwf_patches.s' -;.include 'src/battle.s' +.include 'src/battle.s' +.include 'src/battle_magic.s' + .include 'src/places_names.s' .include 'src/new_game.s' +.include 'src/shop_menu.s' +.include 'src/ingame/menus.i' + dialog_bank_ptr_base = 0x218000 @@ -34,6 +40,9 @@ dialog_bank_ptr_base = 0x218000 ;*=0x0AF000 ; .incbin 'fonts/8x8.bin' +*=0x0AFF00 + .incbin 'assets/niveau.bin' + ; Patch des noms des personages *=0x0FA710 .incbin 'assets/characters_names.dat' @@ -46,10 +55,21 @@ dialog_bank_ptr_base = 0x218000 .include 'src/intro.s' .include 'src/vwf.s' .include 'src/dialog.s' - .include 'src/menus.s' .include 'src/places_names_window.s' + ; system menu text routines + .include 'src/system_menus_text.s' + + ; menu text scopes + .include 'src/menus/start_screen_text.s' + .include 'src/menus/tools_shop_text.s' + .include 'src/menus/in_game_text.s' + + .include 'src/battle_sram.s' + .incbin 'assets/magic.dat' .incbin 'assets/places_names.dat' + .incbin 'assets/classes.ptr' + .incbin 'assets/classes.dat' *=0x218000 .incbin 'assets/bank1_1.ptr' @@ -68,9 +88,27 @@ dialog_bank_ptr_base = 0x218000 *=0x27A000 .incbin 'assets/font.dat' .incbin 'assets/font_length_table.dat' + .incbin 'assets/wicked_font.dat' + .incbin 'assets/wicked_font_length_table.dat' + .incbin 'assets/book_font.dat' + .incbin 'assets/book_font_length_table.dat' + .incbin 'assets/bold_font.dat' + .incbin 'assets/bold_font_length_table.dat' + .incbin 'assets/battle_commands.dat' + +font_table: + .pointer assets_font_dat + .pointer assets_wicked_font_dat + .pointer assets_book_font_dat + .pointer assets_bold_font_dat +length_table: + .pointer assets_font_length_table_dat + .pointer assets_wicked_font_length_table_dat + .pointer assets_book_font_length_table_dat + .pointer assets_bold_font_length_table_dat ; Splash screen assets -*=0x288000 +*=0x298000 .incbin 'assets/intro.map' .incbin 'assets/intro.col' .incbin 'assets/intro.set' From e634f5ffb4fa8dfccd824f0879d1ab9c94441c3a Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:24:42 +0200 Subject: [PATCH 08/52] Upgrade text files. --- text/en/en-bank2.xml | 20 +-- text/en/en-battle_commands.xml | 33 ++++ text/en/en-characters_classes.xml | 17 ++ text/en/en-magic.xml | 4 +- text/en/en-monsters.xml | 259 ++++++++++++++++++++++++++++++ text/fr/fr-battle_commands.xml | 33 ++++ text/fr/fr-characters_classes.xml | 17 ++ text/fr/fr-items.xml | 2 +- text/fr/fr-magic.xml | 4 +- text/fr/fr-monsters.xml | 259 ++++++++++++++++++++++++++++++ 10 files changed, 626 insertions(+), 22 deletions(-) create mode 100644 text/en/en-battle_commands.xml create mode 100644 text/en/en-characters_classes.xml create mode 100644 text/en/en-monsters.xml create mode 100644 text/fr/fr-battle_commands.xml create mode 100644 text/fr/fr-characters_classes.xml create mode 100644 text/fr/fr-monsters.xml diff --git a/text/en/en-bank2.xml b/text/en/en-bank2.xml index afb32b2..928d886 100644 --- a/text/en/en-bank2.xml +++ b/text/en/en-bank2.xml @@ -1455,23 +1455,9 @@ fashion on the menu screen![end] [0x55][end] -'Turn back....' - - - -Cecil: Who's there?![end]'Leave now...' - - - -Cain: Is that a - Phantom Beast?[end]Cecil: We must deliver this - Bomb Ring to the village of - Mist! - -'Then I have no choice!' - - - +[wicked]Turn back....[/wicked][new] +Cecil: Who's there?![end][wicked]Leave now...[/wicked][new] +Cain: Is that a Phantom Beast?[end]Cecil: We must deliver this Bomb Ring to the village of Mist![new][wicked]Then I have no choice![wicked][new] Cain: The fog is gathering![end] [0x55][end] diff --git a/text/en/en-battle_commands.xml b/text/en/en-battle_commands.xml new file mode 100644 index 0000000..eca3d74 --- /dev/null +++ b/text/en/en-battle_commands.xml @@ -0,0 +1,33 @@ + + + Fight + Item + White + Black + Summon + Dark Wave + Jump + Remember + Sing + Hide + Medicine + Prayer + Aim + Build Up + Kick + Endure + Twin Magic + Strengthen + Fake Tears + Cover + Peep + Spirビ Wave + Dart + Sneak + Ninjutsu + SpiritWave + Change Row + Defend + Show + Cover Off + diff --git a/text/en/en-characters_classes.xml b/text/en/en-characters_classes.xml new file mode 100644 index 0000000..a6c22ac --- /dev/null +++ b/text/en/en-characters_classes.xml @@ -0,0 +1,17 @@ + + + Black Knight + Dragon Knight + Summoner + Sage + Ministrel + White Mage + Monk + Black Knight + White Knight + Paladin + Engineer + Summoner + Ninja + Lunarian + \ No newline at end of file diff --git a/text/en/en-magic.xml b/text/en/en-magic.xml index 8c10491..104cd43 100644 --- a/text/en/en-magic.xml +++ b/text/en/en-magic.xml @@ -64,8 +64,8 @@ Levithan Ashura Bahamut - Lt[0xC1]Meteo - Lt[0xC1]Flare + Lt-Meteo + Lt-Flare Katon Suiton Raijin diff --git a/text/en/en-monsters.xml b/text/en/en-monsters.xml new file mode 100644 index 0000000..7eadd23 --- /dev/null +++ b/text/en/en-monsters.xml @@ -0,0 +1,259 @@ + + + Goblin + Basilisk + Dive Eagle + Float Eye + Insectus + Face Bat + Wood Eyes + Sword Rat + Mini Mage + Sand Sahag + Flying Eye + HandLegger + Sand Worm + Gigantoad + Fang Shell + Zombie + Fly Killer + Blood Rose + Organitoad + Marshma[0xba]ow + Ye[0xba]ow Je[0xba]y + Sahagin + Lacy + Creesalis + GoblinCap[0xc1] + Black Liz[0xc1] + Adamantium + Domovoy + Bavarois + Soldier + General + Gatlinger + Rilmarder + DethBeauty + Spirit + Skeleton + Cockatrice + Gargoyle + RudranBaby + Belfegoyle + Zuu + Sea Pot + Alligator + Splasher + Marine + Captain + Soul + BloodyBone + Ghoul + Skulljar + Revenant + DracuLady + Heiropatra + Sku[0xba]Dragon + Lit[0xc1] Fish + GigasGator + Hydra + Flood Worm + BaronGuard + Lamia + HellNeedle + Twin Snake + Lit[0xc1]Spirit + MindFlayer + Naga + Ogre + Cait Sith + Black Kn[0xc1] + Centaur + Miss Vamp[0xc1] + Marion + Marionette + Gloom Wing + Deathtanet + Marid + Satanite + Armadillo + Lady Guard + IceWarrior + NagaRusher + Medusa + Zombiesaur + MagmaTurtl + Imp + Dream Evil + Bomb + Pain Bomb + Chimera + HellTurtle + Iron Dress + Flame Dog + Gorgon + StoneGolem + Lilith + QueenLamia + Toady Toad + Molz + Rudra + Sorcerer + Mad Ogre + FakePuppet + Bloody Bat + Arachne + Flame Kn[0xc1] + MachCannon + RemedyBomb + Dk[0xc1]Grenade + Plague + Last Arm + Kuar + MachDragon + Araneid + Prankster + Centipede + Abyss Worm + Bloody Red + Misleader + Blizlizard + He[0xba]Flapper + Evil Head + Ice Beast + Summoner + Sorceress + AssultDoor + ToadyWitch + Mammon + ChimraHead + Luna Virus + ZemusBreth + WhiteMoose + Pudding + Zemus Mind + MithrilGol + GreenDragn + Pink Puff + Eyes + MachSolder + GiantSoldr + MoonGodess + Molbol + SilverDrag + YellowDrag + Satan Jr[0xc1] + Eucaryote + Phase + IronSolder + DemonSoldr + SteelGolem + Allemagne + Lunasaurus + Searcher + DarkWizard + Dk[0xc1]Bahamut + Procaryote + Tidar[0xd3]hian + BlueDragon + GoldDragon + Lit[0xc1]Dragon + Wh[0xd3]eDragon + Red Dragon + Behemoth + MistDragon + Octomamoth + Antlion + MotherBomb + Scarmig[0xee]on + Scarmig[0xee]on + Beigan + Right Arm + Left Arm + Cagnazzo + Dark Elf + Dark Elf + Dog + Mag + Rag + Golbeze + Barbaricia + Calca + Calcabrena + Golbeze + ShadowDrgn + Doctor + Balnaba + Lugeie + Eblana K[0xc1] + Eblana Q[0xc1] + Rubicante + Odin + Leviathan + Bahamut + Demon Wall + Ashura + 4 Emperors + 4 Emperors + DarkDragon + Sahagin + ControlSys + DefenseSys + Zemus + Zeromus + Zeromus + Dragon Kn[0xc1] + Bard + Monk + DarkKnight + Girl + Titan + Float Eye + Zuu + Brena + Skullnant + FusedMecha + Attack Sys + Monster214 + K[0xc1] Higuchi + Zeromus + H[0xc1] Ito + A[0xc1] Matsui + K[0xc1] Aoki + H[0xc1] Nakada + K[0xc1] Yoshii + Takahashi + MysteryEgg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/text/fr/fr-battle_commands.xml b/text/fr/fr-battle_commands.xml new file mode 100644 index 0000000..ad6bd74 --- /dev/null +++ b/text/fr/fr-battle_commands.xml @@ -0,0 +1,33 @@ + + + Fight + Item + White Magic + Black + Summon + Dark Wave + Jump + Remember + Sing + Hide + Medicine + Prayer + Aim + Build Up + Kick + Endure + Twin Magic + Strengthen + Fake Tears + Cover + Peep + Spirit Wave + Dart + Sneak + Ninjutsu + SpiritWave + Change Row + Defend + Show + Cover Off + diff --git a/text/fr/fr-characters_classes.xml b/text/fr/fr-characters_classes.xml new file mode 100644 index 0000000..1f68dd1 --- /dev/null +++ b/text/fr/fr-characters_classes.xml @@ -0,0 +1,17 @@ + + + Chevalier noir + Chevalier dragon + Invokeur + Sage + Menestrel + Sorcier Blanc + Moine + Sorcier Noir + Sorcier Blanc + Paladin + Ingenieur + Invokeur + Ninja + Selenite + \ No newline at end of file diff --git a/text/fr/fr-items.xml b/text/fr/fr-items.xml index 4699b23..360c9c5 100644 --- a/text/fr/fr-items.xml +++ b/text/fr/fr-items.xml @@ -1,6 +1,6 @@ - + [0x29]FireClaw [0x29]IceClaw [0x29]Thunder diff --git a/text/fr/fr-magic.xml b/text/fr/fr-magic.xml index 8c10491..bce50f9 100644 --- a/text/fr/fr-magic.xml +++ b/text/fr/fr-magic.xml @@ -64,8 +64,8 @@ Levithan Ashura Bahamut - Lt[0xC1]Meteo - Lt[0xC1]Flare + Lt.Meteo + Lt.Flare Katon Suiton Raijin diff --git a/text/fr/fr-monsters.xml b/text/fr/fr-monsters.xml new file mode 100644 index 0000000..7eadd23 --- /dev/null +++ b/text/fr/fr-monsters.xml @@ -0,0 +1,259 @@ + + + Goblin + Basilisk + Dive Eagle + Float Eye + Insectus + Face Bat + Wood Eyes + Sword Rat + Mini Mage + Sand Sahag + Flying Eye + HandLegger + Sand Worm + Gigantoad + Fang Shell + Zombie + Fly Killer + Blood Rose + Organitoad + Marshma[0xba]ow + Ye[0xba]ow Je[0xba]y + Sahagin + Lacy + Creesalis + GoblinCap[0xc1] + Black Liz[0xc1] + Adamantium + Domovoy + Bavarois + Soldier + General + Gatlinger + Rilmarder + DethBeauty + Spirit + Skeleton + Cockatrice + Gargoyle + RudranBaby + Belfegoyle + Zuu + Sea Pot + Alligator + Splasher + Marine + Captain + Soul + BloodyBone + Ghoul + Skulljar + Revenant + DracuLady + Heiropatra + Sku[0xba]Dragon + Lit[0xc1] Fish + GigasGator + Hydra + Flood Worm + BaronGuard + Lamia + HellNeedle + Twin Snake + Lit[0xc1]Spirit + MindFlayer + Naga + Ogre + Cait Sith + Black Kn[0xc1] + Centaur + Miss Vamp[0xc1] + Marion + Marionette + Gloom Wing + Deathtanet + Marid + Satanite + Armadillo + Lady Guard + IceWarrior + NagaRusher + Medusa + Zombiesaur + MagmaTurtl + Imp + Dream Evil + Bomb + Pain Bomb + Chimera + HellTurtle + Iron Dress + Flame Dog + Gorgon + StoneGolem + Lilith + QueenLamia + Toady Toad + Molz + Rudra + Sorcerer + Mad Ogre + FakePuppet + Bloody Bat + Arachne + Flame Kn[0xc1] + MachCannon + RemedyBomb + Dk[0xc1]Grenade + Plague + Last Arm + Kuar + MachDragon + Araneid + Prankster + Centipede + Abyss Worm + Bloody Red + Misleader + Blizlizard + He[0xba]Flapper + Evil Head + Ice Beast + Summoner + Sorceress + AssultDoor + ToadyWitch + Mammon + ChimraHead + Luna Virus + ZemusBreth + WhiteMoose + Pudding + Zemus Mind + MithrilGol + GreenDragn + Pink Puff + Eyes + MachSolder + GiantSoldr + MoonGodess + Molbol + SilverDrag + YellowDrag + Satan Jr[0xc1] + Eucaryote + Phase + IronSolder + DemonSoldr + SteelGolem + Allemagne + Lunasaurus + Searcher + DarkWizard + Dk[0xc1]Bahamut + Procaryote + Tidar[0xd3]hian + BlueDragon + GoldDragon + Lit[0xc1]Dragon + Wh[0xd3]eDragon + Red Dragon + Behemoth + MistDragon + Octomamoth + Antlion + MotherBomb + Scarmig[0xee]on + Scarmig[0xee]on + Beigan + Right Arm + Left Arm + Cagnazzo + Dark Elf + Dark Elf + Dog + Mag + Rag + Golbeze + Barbaricia + Calca + Calcabrena + Golbeze + ShadowDrgn + Doctor + Balnaba + Lugeie + Eblana K[0xc1] + Eblana Q[0xc1] + Rubicante + Odin + Leviathan + Bahamut + Demon Wall + Ashura + 4 Emperors + 4 Emperors + DarkDragon + Sahagin + ControlSys + DefenseSys + Zemus + Zeromus + Zeromus + Dragon Kn[0xc1] + Bard + Monk + DarkKnight + Girl + Titan + Float Eye + Zuu + Brena + Skullnant + FusedMecha + Attack Sys + Monster214 + K[0xc1] Higuchi + Zeromus + H[0xc1] Ito + A[0xc1] Matsui + K[0xc1] Aoki + H[0xc1] Nakada + K[0xc1] Yoshii + Takahashi + MysteryEgg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f332eea83b2dae2567f68205899dd4ee0867eae7 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:48:06 +0200 Subject: [PATCH 09/52] Remove release deployment from travis.yml. --- .travis.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8a02ae4..b390f83 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,10 +3,10 @@ python: - '3.4' install: pip install -r requirements.txt script: python3.4 build.py -deploy: - provider: releases - api_key: - secure: nRzGa4y5c1Au3rYSoepsyIM8m6NTvkobmze0iKqOpRkNkS0L+r+EfAySgVpOB9eFPDzkgIbjWPe5L1TbPs/UQDHxauPpL2xwJiDSKimGYipVGhVZoSwI6jREIc51zU4jqAi37kNUKPRsDg5HDKkE7IhnRlcEqppOkGT23/DYd7o= - file: build/ff4.ips - on: - repo: manz/ff4 +#deploy: +# provider: releases +# api_key: +# secure: nRzGa4y5c1Au3rYSoepsyIM8m6NTvkobmze0iKqOpRkNkS0L+r+EfAySgVpOB9eFPDzkgIbjWPe5L1TbPs/UQDHxauPpL2xwJiDSKimGYipVGhVZoSwI6jREIc51zU4jqAi37kNUKPRsDg5HDKkE7IhnRlcEqppOkGT23/DYd7o= +# file: build/ff4.ips +# on: +# repo: manz/ff4 From febe84f9c14822156b01d1e446645367cd82eaba Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:49:31 +0200 Subject: [PATCH 10/52] Adds 8x8 font generation. --- utils/8x8vwf.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/utils/8x8vwf.py b/utils/8x8vwf.py index 6f194af..70ecc40 100644 --- a/utils/8x8vwf.py +++ b/utils/8x8vwf.py @@ -116,9 +116,11 @@ def write_as_2bpp(data): 'Selenite' ] + def generate_8x8_vwf_asset(string_list, prefix, table_start, max_tile_length=None): k = 0 current_id = table_start + with open('assets/%s.bin' % prefix, 'wb') as output: with open('assets/%s.len' % prefix, 'wb') as length_table: with open('text/gen/%s.tbl' % prefix, 'wt', encoding='utf-8') as table: @@ -139,5 +141,6 @@ def generate_8x8_vwf_asset(string_list, prefix, table_start, max_tile_length=Non current_id += tile_count k += 1 + if __name__ == '__main__': - generate_8x8_vwf_asset(menu_items, 'menu', 0x02) \ No newline at end of file + generate_8x8_vwf_asset(['Niveau', 'Gils'], 'niveau', 0xF0) \ No newline at end of file From bc1d49f1df08a726322dbbe94f4f1acdbec9948f Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:51:07 +0200 Subject: [PATCH 11/52] Builds Niveau + gils font tiles. --- build.py | 2 ++ utils/{8x8vwf.py => smallvwf.py} | 0 2 files changed, 2 insertions(+) rename utils/{8x8vwf.py => smallvwf.py} (100%) diff --git a/build.py b/build.py index cb98a00..565b668 100755 --- a/build.py +++ b/build.py @@ -11,6 +11,7 @@ Pointer import struct from utils.font import convert_font_to_1bpp +from utils.smallvwf import generate_8x8_vwf_asset def read_fixed_from_xml(input_file, table, formatter=None): @@ -152,6 +153,7 @@ def build_assets(assets): ] build_assets(assets_list) + generate_8x8_vwf_asset(['Niveau', 'Gils'], 'niveau', 0xF0) if not os.path.exists('build'): os.mkdir('build') diff --git a/utils/8x8vwf.py b/utils/smallvwf.py similarity index 100% rename from utils/8x8vwf.py rename to utils/smallvwf.py From 126b4bcf0ca47deb8b5ccb1dd0f63c04fa93b2b9 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 17:58:55 +0200 Subject: [PATCH 12/52] Do not use gen subdirectory it does not exists. --- utils/smallvwf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/smallvwf.py b/utils/smallvwf.py index 70ecc40..4896421 100644 --- a/utils/smallvwf.py +++ b/utils/smallvwf.py @@ -123,7 +123,7 @@ def generate_8x8_vwf_asset(string_list, prefix, table_start, max_tile_length=Non with open('assets/%s.bin' % prefix, 'wb') as output: with open('assets/%s.len' % prefix, 'wb') as length_table: - with open('text/gen/%s.tbl' % prefix, 'wt', encoding='utf-8') as table: + with open('text/%s.tbl' % prefix, 'wt', encoding='utf-8') as table: if max_tile_length: line_length = (max_tile_length * 2 * 8) for string in string_list: From cb38c0c188e2c8eaf53300d9ab48edaae1225016 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 18:04:50 +0200 Subject: [PATCH 13/52] Build battle command asset. --- build.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.py b/build.py index 565b668..3ec1461 100755 --- a/build.py +++ b/build.py @@ -146,6 +146,8 @@ def build_assets(assets): 'assets/characters_names.dat'), ('fixed', menu_table, os.path.join(text_root, '{lang}-characters_names.xml'.format(lang=lang)), 'assets/characters_names.dat'), + ('fixed', menu_table, os.path.join(text_root, '{lang}-battle_commands.xml'.format(lang=lang)), + 'assets/battle_commands.dat'), ('nullterminated', menu_table, os.path.join(text_root, '{lang}-places-names.xml'.format(lang=lang)), 'assets/places_names.dat'), ('nullterminated', menu_table, os.path.join(text_root, '{lang}-characters_classes.xml'.format(lang=lang)), From 7ba7dff6193494ad020478ded619ef72267f0498 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 20:22:38 +0200 Subject: [PATCH 14/52] Fixed build.py shebang --- build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.py b/build.py index 3ec1461..a102982 100755 --- a/build.py +++ b/build.py @@ -1,5 +1,5 @@ +#!/usr/bin/env python3.4 # coding:utf-8 -# !/usr/bin/env python3.4 import os from xml.etree import ElementTree From f25bb3b58524b229dfc40bcf44ad10d7df73c436 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 16 May 2015 20:22:59 +0200 Subject: [PATCH 15/52] Fixed battle command length --- text/en/en-battle_commands.xml | 2 +- text/fr/fr-battle_commands.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/text/en/en-battle_commands.xml b/text/en/en-battle_commands.xml index eca3d74..e2dac98 100644 --- a/text/en/en-battle_commands.xml +++ b/text/en/en-battle_commands.xml @@ -1,5 +1,5 @@ - + Fight Item White diff --git a/text/fr/fr-battle_commands.xml b/text/fr/fr-battle_commands.xml index ad6bd74..e103276 100644 --- a/text/fr/fr-battle_commands.xml +++ b/text/fr/fr-battle_commands.xml @@ -1,5 +1,5 @@ - + Fight Item White Magic From 07eee913ce4147c71d0b42e8a64b2417e931862d Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 12 Jun 2015 13:23:14 +0200 Subject: [PATCH 16/52] Display english spells in main menu. --- src/ingame/main.s | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/ingame/main.s b/src/ingame/main.s index 8970f3e..26621c4 100644 --- a/src/ingame/main.s +++ b/src/ingame/main.s @@ -14,7 +14,7 @@ ; moves gils two chars on the right *=0x0187DA - ldy.w #0x062A + 4 + ldy.w #0x062A + 4 ; TIME *=0x0187C5 @@ -120,4 +120,34 @@ end: STA.W 0x0574,Y LDA.B #0xC8 STA.W 0x0576,Y -} \ No newline at end of file +} + +; main menu spells + +; length of spells names +*=0x01B345 + lda.b #0x07 + +; compute spell pointer +;01b319 rep #0x20 +;01b31b asl a +;01b31c sta 0x45 +;01b31e asl a +;01b31f adc 0x45 +;01b321 adc #0x8900 +;01b324 tay +;01b325 sep #0x20 +;01b327 lda #0x0f + +*=0x01b319 + rep #0x20 + asl + asl + asl + nop + nop + nop + adc.w #assets_magic_dat + tay + sep #0x20 + lda.b #assets_magic_dat >> 16 \ No newline at end of file From 97594018097e96f5a4ea513a2aa8154f12bb58a1 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 12 Jun 2015 13:23:38 +0200 Subject: [PATCH 17/52] Fix the auto scroll text. --- src/vwf.s | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/vwf.s b/src/vwf.s index 737446b..7fbae43 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -780,16 +780,11 @@ padloop: BRA end nowaitpad: - LDA.B #0x10 - STA.B CNTR - + lda.b #0x20 { -loop: - wai - wai - wai - wai - dec.b CNTR + loop: + jsr.w wait_for_vblank + dec bne loop } end: From 1e44251d1e55dd1e0cb95a74b7e42d9c3c629b20 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 2 May 2016 11:50:59 +0200 Subject: [PATCH 18/52] Removed unused code --- src/battle.s | 146 +----- src/battle_magic.s | 31 +- src/ingame/main.s | 10 +- src/libmz.i | 47 +- src/menus.s | 860 ------------------------------------ src/menus/in_game_text.s | 15 +- src/menus/tools_shop_text.s | 8 +- src/txt_menu.s | 390 ---------------- 8 files changed, 75 insertions(+), 1432 deletions(-) delete mode 100644 src/menus.s delete mode 100644 src/txt_menu.s diff --git a/src/battle.s b/src/battle.s index bab4157..6be9ed2 100644 --- a/src/battle.s +++ b/src/battle.s @@ -1,41 +1,4 @@ - -;*=0x029D39 -; lda.l battle_actions, x -; -;; copy 8 bytes for the action -;*=0x029D42 -; ;cpy #0x0008 -; -;*=0x0FA7B9 -;battle_actions: -;.table 'text/ff4_menus.tbl' -;.text 'Attaquer' - -;*=0x028561 -; ldx #0x000A - - -;.02:8561 LDX #8 - - -; 0x029A63 -; may be main battle init -; all the windows are prebuilt -; call that results in loading funcs. -; $02/9A78 20 69 9D JSR $9D69 [$02:9D69] A:0005 X:7505 Y:000C P:envMxdIZC - - -; Ram address of the first tilemap -; 029A45 LDA $0000, x ; 7E8CBC -; -;*=0x0289BB -; ldy #0x6AC0 -;*=0x029A75 -; nop -; nop -; nop -;.02:89BB LDY #$6C00 -command_length = 10 +command_length = 11 { *=0x029CD6 @@ -52,68 +15,21 @@ command_length = 10 ; *=0x029D39 lda.l assets_battle_commands_dat, x -; +; x offset of the battle commands window +;*=0x16fe66 +; .db 0 ;; this byte controls the command window size *=0x16fe68 - .db command_length + 3 - + .db command_length + 2 *=0x029CE0 lda.b #command_length * 4 -;*=0x029D9E -; lda.b #command_length * 4 -;*=0x16FEAD -; .dw 0x8CB2 -; .dw 0x8CB2 + 0x64 -; .dw 0x8CB2 + 0x64 * 2 -; .dw 0x8CB2 + 0x64 * 3 -; .dw 0x8CB2 + 0x64 * 4 - -; japanese window -;*=0x16FE54 -;.db 0x0A -;.db 0x0A ; number of lines of text -;.dw 0x8CB2 ; read address -;.dw 0xC1F4 ; write address -;.db 0x01 - -;*=0x029A55 -; ADC.b #0x80 ; '@' -;*=0x02A4C8 -;.dw 0xA64E -;.dw 0xA637; monsters names -;.dw 0xA657 ; Char names -;.dw 0xA6A4 ; dunno -;.dw 0xA64F -;.dw 0xA6AC ; supposed to clear monsters -;.dw 0xA4E6 -;.dw 0xA6BD ; dunno -;.dw 0xA6C3 ; dunno -;.dw 0xA6CA -;.dw 0xA6D1 -;.dw 0xA6D8 -;.dw 0xA7AD -;.dw 0xA782 -;.dw 0xA77A -;*=0x02999A ; window borders for battle commands - -;*=0x029B20 ; all windows -; nop -; nop -; nop - - -;*=0x0299A2 ; nukes the content of the battle window -; rts -; nop -; nop - *=0x16FE54 .db command_length * 2 .db 5 * 2 .dw 0x8CB2 ; read address -.dw 0xC1F4 ; write address +.dw 0xC1F4 ; - 6 * 2 ; write address .db 0x01 @@ -133,7 +49,6 @@ battle_data_size = command_length * 4 * 5 *=0x029FBB -; battle_items_position = 0x8CB2 + battle_data_size * 5 battle_items_position = 0x2E00 adc.w #battle_items_position @@ -176,46 +91,31 @@ battle_data_size = command_length * 4 * 5 *=0x02A06C jsr.w 0xFFC2 -; write window data to sram new size 0x3e8 -;*=0x029D63 -;; JSR copy_data_to_the_tile_map -; jsr.w 0xFFC2 -; write magic data to sram 0x2d00 -;*=0x02A128 -; jsr.w 0xFFC2 +.macro set_battle_sram_copy_flag(value) { + lda.b #value + sta.l 0x7FFFFF +} + +.macro enable_battle_sram_copy() { + set_battle_sram_copy_flag(0x85) +} + +.macro disable_battle_sram_copy() { + set_battle_sram_copy_flag(0x00) +} *=0x02FFC2 - lda #0x85 - sta.l 0x7FFFFF + enable_battle_sram_copy() jsr 0xA455 - lda #0x00 - sta.l 0x7FFFFF + disable_battle_sram_copy() rts -; battle display -;*=0x02991E -; lda.w battle_items_position, x -;*=0x029923 -; lda.w battle_items_position + 0x30,x -; -;*=0x029932 -; lda.w battle_items_position, x -;*=0x029937 -; lda.w battle_items_position + 0x30,x -; -;; build equiped items ts -;*=0x029E5C -; lda.b #0x42 -; nop -; nop + +; 0x16FA40 battle dakuten + } -;.16:FEAD .WORD $8CB2 -;.16:FEAF .WORD $8D16 -;.16:FEB1 .WORD $8D7A -;.16:FEB3 .WORD $8DDE -;.16:FEB5 .WORD $8E42 } diff --git a/src/battle_magic.s b/src/battle_magic.s index 97e0227..e8a8d3d 100644 --- a/src/battle_magic.s +++ b/src/battle_magic.s @@ -1,14 +1,29 @@ battle_magic_length = 8 +*=0x029EAD + rts +; Try to fix the disable mask +*=0x029EC0 + adc.b #battle_magic_length * 2 + +; Use the Yellow text palette +*=0x029EDB + lda #0x0f + +*=0x029EE9 + cpy.b #battle_magic_length * 2 + 1 + +; number of spells line (Adds 50% because we have 2 spells per line +; where originaly it was 3. clear related +*=0x02984D + ldx.w #0x0018 + ; used for the copy for the dakuten offset *=0x02A094 ; _ _ _ _ _ _ ; A B B B B B lda.b #battle_magic_length -;*=0x02A0DC -; lda.b #battle_magic_length - 1 - *=0x02A0E2 lda.b #battle_magic_length @@ -33,7 +48,7 @@ battle_magic_length = 8 stx 0x04 ;original -magic_data_base = 0x909A +magic_data_base = 0x909A + 0x60 ;magic_data_base = 0x703720 *=0x029893 @@ -96,14 +111,6 @@ fsize = 0x900 .dw (magic_data_base + fsize * 3) & 0xFFFF .dw (magic_data_base + fsize * 4) & 0xFFFF -;*=0x16ff39 -; .dw 0x2C7A -; .dw 0x2C7A + fsize -; .dw 0x2C7A + fsize * 2 -; .dw 0x2C7A + fsize * 3 -; .dw 0x2C7A + fsize * 4 - - *=0x029834 ldx.w #0x300 ; 0x240 diff --git a/src/ingame/main.s b/src/ingame/main.s index 26621c4..9f04c44 100644 --- a/src/ingame/main.s +++ b/src/ingame/main.s @@ -64,13 +64,13 @@ end: *=0x0189C3 { level_offset = 7 * 2 - lda #0xF0 + lda #0x90 sta.w 0+level_offset, x - lda #0xF1 + lda #0x91 sta.w 2+level_offset, x - lda #0xF2 + lda #0x92 sta.w 4+level_offset, x - lda #0xF3 + lda #0x93 sta.w 6+level_offset, x nop @@ -150,4 +150,4 @@ end: adc.w #assets_magic_dat tay sep #0x20 - lda.b #assets_magic_dat >> 16 \ No newline at end of file + lda.b #assets_magic_dat >> 16 diff --git a/src/libmz.i b/src/libmz.i index 9170ca6..69b4b2c 100644 --- a/src/libmz.i +++ b/src/libmz.i @@ -1,22 +1,3 @@ -.macro dma_transfer_to_vram_call(source, vramptr, count, mode) -{ - php - pha - phx - pea.w return_addr-1 - pea.w source & 0xFFFF - pea.w 0x00FF & (source >> 16) - pea.w vramptr - pea.w count - pea.w mode - jmp.l dma_transfer_to_vram -return_addr: - plx - pla - plp -} - - .macro wait_for_vblank_inline() { pha negative: @@ -69,7 +50,6 @@ positive: PLP } - .macro dma_transfer_to_vram_call(source, vramptr, count, mode) { php @@ -81,27 +61,28 @@ positive: pea.w vramptr pea.w count pea.w mode - jmp.l dma_transfer_to_vram + jmp.w dma_transfer_to_vram return_addr: plx pla plp } + .macro dma_transfer_to_palette_call(source, count) { - php - pha - phx - pea.w return_addr-1 + php + pha + phx + pea.w return_addr-1 pea.w source & 0xFFFF pea.w 0x00FF & (source >> 16) - pea.w count - jmp.w dma_transfer_to_palette - return_addr: - plx - pla - plp + pea.w count + jmp.w dma_transfer_to_palette + return_addr: + plx + pla + plp } .macro save_8_bit_var(var, mirror_addr) { @@ -135,6 +116,10 @@ return_addr: sep #0x30 } +.macro set_ax_16() { + rep #0x30 +} + .macro set_a_8_x_16() { sep #0x10 rep #0x20 diff --git a/src/menus.s b/src/menus.s deleted file mode 100644 index 267fde3..0000000 --- a/src/menus.s +++ /dev/null @@ -1,860 +0,0 @@ -.table 'text/ff4_menus.tbl' -*=0x1efccd - ; D:2100 - lda #0x02 - sta 0x01 - lda #0x00 - sta 0x02 - sta 0x03 - sta 0x05 - sta 0x06 - - ; BG 1 screen address - lda #0x62 - sta 0x07 - ; BG 2 screen address - lda #0x6a - sta 0x08 - ; BG 3 screen address - lda #0x72 - sta 0x09 - ; BG 4 screen address - lda #0x7a - sta 0x0a - - ; BG 1, 2 Name address - ; old value 0x22 - lda #0x22 - sta 0x0b - ; BG 2, 4 Name address - lda #0x22 - sta 0x0c - - lda #0x00 - sta 0x420b - sta 0x420c - lda #0x80 - sta 0x15 - tdc - sta 0x16 - sta 0x17 - lda #0x1f - sta 0x2c - tdc - sta 0x2d - sta 0x2e - sta 0x2f - sta 0x30 - sta 0x31 - sta 0x33 - lda #0xe0 - sta 0x32 - rtl - -; RELATED TO ADD SOME TILES TO THE FONT TILESET 8x8 font stuff -; copy more to vram to erase tileset extension. -;*=0x14ffeb -; ldx #0x2000 - -; copies the vram to the wram to make room for 8x8 font when on the map (might be used for inside as well). -;*=0x14ff90 -; ldx #0x1800 - -; Petite fenètre 'Impossible ...' : 0x01A7DE -*=0x01A80D - NOP - NOP - NOP - - - - -; Move monsters names -;02ffcf lda 0x2e8000,x - - - -; NIVEAU -*=0x0189C3 - LDA.B #0x9A - STA.W 0x000A,X - - LDA.B #0x9B - STA.W 0x000C,X - - LDA.B #0x9C - STA.W 0x000E,X - - LDA.B #0x9D - STA.W 0x0010,X - - LDA.B #0x70 - STA.W 0x0012,X - - LDA.B #0x51 - STA.W 0x0040,X - STA.W 0x0080,X - JSR.L deroutage - - NOP - NOP - -;deroutage du grisement de 'sauver' -*=0x018939 - JSR.L derout_save - NOP - - NOP - NOP - NOP - - NOP - NOP - NOP - - NOP - NOP - NOP - - -;modification des fenètres: -*=0x01DB61 -; .dw 0x0000, 0x1A1C ;fenètre principale -; .dw 0x04EE, 0x0507 ;fenètre Gils -; .dw 0x04EE, 0x0507 ;fenètre temps -; .dw 0x006E, 0x0F07 ;fenètre menu principal - - -.dw 0x0000, 0x1A16 ; fenètre principale -.dw 0x05EC, 0x0308 ; fenètre Gils -.dw 0x04EE, 0x0207 ; fenetre temps -.dw 0x002E, 0x1107 ; fenètre menu principal -;.dw 0x0070, 0xCBCA -;.dw 0xEADC, 0xF001 -;.dw 0xA800, 0x8CA7 -;.dw 0x01FF, 0x0170 - -; original windowZe -;.dw 0x0000, 0x1A16 ; fenètre principale -;.dw 0x05EA, 0x0308 ; fenètre Gils -;.dw 0x04EC, 0x0207 ; fenetre temps -;.dw 0x002C, 0x1107 ; fenètre menu principal -;.dw 0x0070, 0xCBCA -;.dw 0xEADC, 0xF001 -;.dw 0xA800, 0x8CA7 -;.dw 0x01FF, 0x0170 - -;*=0x01DB6D - - -;***************** -;** Decalages ! ** -;***************** - -; décalage du niveau (ex: 10) -*=0x0189FA - STA.W 0x0014,X - XBA - STA.W 0x0016,X - - -; deplacement du nom du perso -*=0x0183D5 - STA.W 0x0040,Y - XBA - STA.W 0x0080,Y - - -; decalage du nombre de Gils -*=0x018FAF - ADC.W #0x0052 - - - -; décalage du Temps -*=0x018BC1 - LDA.B #0x80 - STA.W 0x0578,Y - XBA - STA.W 0x057A,Y - REP #0x20 - LDA.B 0x73 - SEP #0x20 - JSR.W 0x81D6 - LDA.B 0x5B - STA.W 0x0570,Y - LDA.B 0x5D - STA.W 0x0572,Y - LDA.B 0x5E - STA.W 0x0574,Y - LDA.B #0xC8 - STA.W 0x0576,Y - - -;************************** -;** Classes des Persos ! ** -;************************** -; Modification pour alonger les noms des classes. -; Deplacement du nom des classe vers la gauche -*=0x018C1A - ADC.W #0x0000 - -; alongement des noms de classe à 16 caractères. -*=0x018FD3 - jsr.l load_classes_pointer - - ;ASL - ;ASL - ;ASL - ;ASL - NOP - NOP - STA.B 0x45 - STZ.B 0x46 - LDX.B 0x45 - LDA.B #0x0F - - -;018ff4 sta 0x0000,y [7ed8d5] A:0002 X:003c Y:d8d5 S:02e5 D:0100 DB:7e nvMxdIzc V: 92 H: 512 -*=0x18ff4 - nop - nop - nop -; Move the class names where to freespace -; 018fe3 lda 0x0fa764,x -*=0x018fe3 - lda.l characters_classes, x - beq 0x018ffe + 2 - ;JSR.L _8x16 - ;NOP - ;NOP -; NOP -; NOP - jsr.l _8x16 - jsr.l _8x16dis2 - ;jsr.l _8x8_vwf_display2 -; NOP -; NOP - NOP - -;exemple d'appel -; -; LDA.B #0xnumptr -; JSR.L textload ;textload(numptr) - -;deroutage pour charger le menu à l'aide d'un pointeur 24bit -*=0x018931 - JSR.W PT0000 - -; TIME -*=0x0187CE - LDA.B #0x01 - JSR.L textload - NOP - NOP - NOP - -; Gils -*=0x0187C5 - LDA.B #0x02 - JSR.L textload - NOP - NOP - NOP - -; 'Ne peux utiliser' -*=0x01AED9 - JSR.W PT0001 - -; fenètre Ne peut utiliser -*=0x01DD40 - .dw 0x0210, 0x0310 - - -;************************************* -;** Menu Objet ** -;************************************* -;Objet: -;Layer 4 -*=0x01A817 - JSR.W PT0002 - - -;layer 2 -*=0x019F59 - JSR.W PT0002 - - -;fenètre Objet -*=0x01DCFC - .dw 0x0000, 0x0307 - -;fenètre Description objet -*=0x01DCD6 - .dw 0x0010, 0x0316 - -*=0x01A36F - LDA.B #0x05 - JSR.L textload - -;Fenètre principale objet -*=0x01DCCE - .dw 0x0000, 0x301E - -;************************************* -;** Menu Configuration ** -;************************************* - -; Configuration -*=0x01D1A7 - JSR.W PT0003 - -*=0x01E168 - .dw 0x0102, 0x141C - -;RGB -> RVB :o) -*=0x01D1BB - LDA.B #0x57 - -;fenètre du titre 'options' -*=0x01E15C - .dw 0x0054, 0x0209 - -;'Options' -*=0x01D1B0 - LDA.B #0x07 - JSR.L textload - -;déplacement du curseur principal des options -*=0x01D247 - LDA.B #0x00 - -;main dans le menu controle -;x -*=0x01D4E6 - LDA.B #0x03 - -;y -*=0x01D4E2 - ADC.B #0x4C - -; 'buttons' :) -*=0x01D496 - LDA.B #0x0F - JSR.L textload - -; -*=0x01E200 - .dw 0x01C0, 0x0C1C - -;multiple: -*=0x01D662 - JSR.W derout_mult - -*=0x01D685 - LDA.B #0x13 - JSR.L textload - -;************************************* -;** Menu Magie ** -;************************************* -*=0x01AFA2 - LDA.B #0x08 - JMP.W derout_magie - -*=0x01AFB6 - LDA.B #0x09 - JMP.W derout_magie2 - -*=0x01AFCA - LDA.B #0x0A - JMP.W derout_magie3 - -;.patch (0x01AFA7) -;LDA.B #0x11 -; JMP.W derout_magie4 - -*=0x01AFDE - LDA.B #0x11 - JSR.L textload - -;MP needed -*=0x01B0EC - LDA.B #0x10 - JSR.L textload - NOP - NOP - NOP - -;décalage du cout -*=0x01B0F7 - STA.W 0xC858 - -*=0x01B0E6 - LDY.W #0x025C - - -;décalage de la 'main' -*=0x01B0CE - LDA.B #0x00 - -;Grisement des types sorts : 'Blancs' 'Noirs' etc ... -*=0x01B419 - LDY.W #0x0007 - STA.W 0xC5FF,X - - -; -; Spells menu -; - - -; length of spells names -*=0x01B345 - LDA.B #0x07 - -; compute spell pointer -;01b319 rep #0x20 -;01b31b asl a -;01b31c sta 0x45 -;01b31e asl a -;01b31f adc 0x45 -;01b321 adc #0x8900 -;01b324 tay -;01b325 sep #0x20 -;01b327 lda #0x0f - -*=0x01b319 - rep #0x20 - asl - asl - asl - nop - nop - nop - adc.w #assets_magic_dat - tay - sep #0x20 - lda.b #assets_magic_dat >> 16 - -;************************************* -;** Menu Status ** -;************************************* - -;décalage du nom vers le haut -*=0x01A9B7 - LDY.W #0x0044 - -*=0x01A99E - LDA.B #0x0B - JSR.L textload - -*=0x01AAE9 - LDA.B #0x0C - JSR.L textload - -;experience et tout le bidule -*=0x01ABBC - LDA.B #0x0D - JSR.L textload - -*=0x01D48D - LDA.B #0x0E - JSR.L textload - -;******************* -;** Menu Equiper ** -;******************* - -;dernière fenètre a apparaitre: -*=0x01DDA9 - .dw 0x0000, 0x0B1E - -;données pour translater ... -*=0x01DD95 - .dw 0x0000, 0x0B1E - -*=0x01BD12 - JSR.W derout_equip - -;********************************* -;** Décalage des objets equipés ** -;********************************* - -;Main D -*=0x01BD92 - LDX.W #0x0068 - -;Main G -*=0x01BDA8 - LDX.W #0x00E8 - -;Tête -*=0x01BD7B - LDX.W #0x0168 - -;Corps -*=0x01BD82 - LDX.W #0x01E8 - -;Bras -*=0x01BD89 - LDX.W #0x0268 - -; this code belongs more to the items module. -;*=0x01903F -; LDA.B #0x0A - -;*=0x019028 -; JSR.W calc_itempos -; retcalcpos: - -;*=0x019047 -; JSR.W _8x16item - -; Routines d'affichage de differents textes ^^ -*=0x01FF36 -retmag = 0x01AFAD -retmag2 = 0x01AFC1 -retmag3 = 0x01AFD5 - -load_classes_pointer: - phx - rep #0x20 - - and.w #0x00FF - asl - tax - - lda.l characters_classes_table, x - sep #0x20 - - plx - rtl - -;ça foire si je mets autre chose que des ASL -calc_itempos: - ASL - ASL - ASL - ASL - RTS - -_8x16item: - JSR.L _8x16 - RTS - -derout_magie: - JSR.L textload - JMP.W retmag - -derout_magie2: - JSR.L textload - JMP.W retmag2 - -derout_magie3: - JSR.L textload - JMP.W retmag3 - -derout_mult: - JSR.W 0x80D9 - LDA.B #0x12 - JSR.L textload - RTS - -derout_equip: - LDA.B #0x14 - JSR.L textload - RTS -PT0000: - JSR.W 0x80D9 - - ;dma_transfer_to_vram_nofunk(assets_menu_bin, 0x6000, assets_menu_bin__size, 0x1801) - -; wait_for_vblank_inline() -; dma_transfer_to_vram_nofunk(0x0AF000 ,0x6000, 0x1000, 0x1801) -; wait_for_vblank_inline() - ; dma_transfer_to_vram_nofunk(fuck, 0x2810, assets_menu_bin__size, 0x1801) - - LDA.B #0x00 - JSR.L textload - RTS - -PT0001: - JSR.W 0x80D9 - LDA.B #0x03 - JSR.L textload - RTS -PT0002: - JSR.W 0x80D9 - LDA.B #0x04 - JSR.L textload - RTS -PT0003: - JSR.W 0x80D9 - LDA.B #0x06 - JSR.L textload - RTS -endofbidule: - -; freespace -*=0x20B000 - -; routine de 8x16 -_8x16: - PHX - REP #0x20 - AND.W #0x00FF - ASL - TAX - LDA.L _8x16tbl,X - SEP #0x20 - PLX - RTL - -; modification de la 8x16 pour le menu -_8x8_vwf_display1: - sta.l 0x7E0040,X - lda #0x01 - ora 0x7E0041, X - sta.l 0x7E0041, X - inx - inx - rtl - -_8x8_vwf_display2: - STA.W 0x0040,Y - lda #0x01 - ora 0x34 - sta 0x34 - iny - rtl - -_8x16disp: - CMP #0x00 - BEQ no_8x16 - STA.L 0x7E0000,X - - no_8x16: - XBA - STA.L 0x7E0040,X - INX - INX - RTL - -_8x16dis2: - CMP #0x00 - BEQ no2_8x16 - STA.W 0x0000,Y - - no2_8x16: - XBA - STA.W 0x0040,Y - INY - RTL - -;pointeur Items: -ptr_items: - LDA.B 0x43 - ASL - PHA - ADC.B 0x43 - STA.B 0x43 - PLA - ASL - ASL - ADC.B 0x43 - RTL - -;deroutage pour le grisement de 'Sauver -derout_save: - LDA.B #0x24 - STA 0xCA31 ;S - STA 0xCA33 ;a - STA 0xCA35 ;u - STA 0xCA37 ;v - STA 0xCA39 ;e - STA 0xCA3B ;r - RTL - -;deroutage pour l'affichage du NIVEAU -deroutage: - LDA.B #0x4E ;M - STA.W 0x0082,X - - LDA.B #0x57 ;V - STA.W 0x0042,X - -; LDA.B #0xC7 ;/ -; STA.W 0x004E,X -; STA.W 0x008E,X - RTL - - -;chargement du pointeur et chargement du texte -vwf_text_load: - pha - lda #0x01 - sta 0x03 - pla - bra _textload - -textload: - stz 0x03 -_textload: - ;chargement du pointeur - PHX - REP #0x20 - AND.W #0x00FF - STA 0x00 - ASL - ADC.B 0x00 - TAX - - LDA.L menu_text_pointer_table,X - INX - INX - TAY - SEP #0x20 - - LDA.L menu_text_pointer_table,X - STA 0x02 - STZ 0x01 - STZ 0x00 -load_wram_pointer: - REP #0x20 - LDA [0x00],Y - INY - INY - CLC - ADC 0x29 - TAX - SEP #0x20 -load_char_loop: - LDA [0x00],Y - BEQ end_of_string - INY - - CMP #0x01 - BEQ load_wram_pointer - pha - lda 0x03 - bne vwf_display - pla - JSR.L _8x16 - JSR.L _8x16disp - bra _text_load_continue - -vwf_display: - pla - jsr.l _8x8_vwf_display1 -_text_load_continue: - BRA load_char_loop -end_of_string: - PLX - RTL - - -_8x16tbl: -;00= on affiche rien au dessus de la lettre :) -;ex: 0x4200 affiche un A majuscule sans rien au dessus -; 0 1 2 3 4 5 6 7 8 9 A B C D E F - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x0 - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x1 - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x2 - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x3 - .dw 0xff00,0xff00,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700,0x4800,0x4900,0x4A00,0x4B00,0x4C00,0x4D00,0x4E00,0x4F00 ;0x4 - .dw 0x5000,0x5100,0x5200,0x5300,0x5400,0x5500,0x5600,0x5700,0x5800,0x5900,0x5A00,0x5B00,0x5C00,0x5D00,0x5E00,0x5F00 ;0x5 - .dw 0x6000,0x6100,0x6200,0x6300,0x6400,0x6500,0x6600,0x6700,0x6800,0x6900,0x6A00,0x6B00,0x6C00,0x6D00,0x6E00,0x6F00 ;0x6 - .dw 0x7000,0x7100,0x7200,0x7300,0x7400,0x7500,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x7 - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x8 - .dw 0x608A,0x608B,0x608C,0x608D,0x5C8A,0x5C8B,0x6A8B,0x708A,0x708B,0xffff,0xffff,0xffff,0xffff,0xffff,0x9E00,0xffff ;0x9 - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xA - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xB - .dw 0xC000,0xC100,0xC200,0xC300,0xC400,0xC500,0xC600,0xC700,0xC800,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xC - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xD - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xE - .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xff00 ;0xF - - -; addresse de la table des pointeurs pour le code :) -menu_text_pointer_table: - ; table de pointeurs 24 bits pour les textes du menu -.include 'src/txt_menu.s' - -commandes: - .text 'Attaquer ' - - - - -characters_classes: -; .table 'text/gen/menu.tbl' - black_knight: - .text 'Chevalier noir' - .db 0 - dragon_knight: - .text 'Chevalier dragon' - .db 0 - - summoner: - .text 'Invokeur' - .db 0 - - sage: - .text 'Sage' - .db 0 - - ministrel: - .text 'Menestrel' - .db 0 - - white_wizard: - .text 'Sorcier Blanc' - .db 0 - - monk: - .text 'Moine' - .db 0 - - black_wizard: - .text 'Sorcier Noir' - .db 0 - - paladin: - .text 'Paladin' - .db 0 - - engineer: - .text 'Ingenieur' - .db 0 - - - ninja: - .text 'Ninja' - .db 0 - - lunarian: - .text 'Selenite' - .db 0 - - - -characters_classes_table: - .dw black_knight - characters_classes - .dw dragon_knight - characters_classes - .dw summoner - characters_classes - .dw sage - characters_classes - .dw ministrel - characters_classes - .dw white_wizard - characters_classes - .dw monk - characters_classes - .dw black_wizard - characters_classes - .dw white_wizard - characters_classes - .dw paladin - characters_classes - .dw engineer - characters_classes - .dw summoner - characters_classes - .dw ninja - characters_classes - .dw lunarian - characters_classes - - -;.incbin 'assets/menu.bin' \ No newline at end of file diff --git a/src/menus/in_game_text.s b/src/menus/in_game_text.s index d693f3b..2593964 100644 --- a/src/menus/in_game_text.s +++ b/src/menus/in_game_text.s @@ -93,11 +93,10 @@ exp_for_next_level: char_stats: .dw 0x0114 - 0x80 - ; use precomputed 8x8vwf. - .db 0xF0 - .db 0xF1 - .db 0xF2 - .db 0xF3 +{ + .table 'text/vwf_precomp.tbl' + .text 'Niveau' +} .db 1 .dw 0x01A0 .text 'Expérience' @@ -180,7 +179,7 @@ config: .db 0x01 .dw 0x01C4 - .text 'Vitesse Cbt' + .text 'Vit. Combat' .db 0x01 .dw 0x021E @@ -188,7 +187,7 @@ config: .db 0x01 .dw 0x0244 - .text 'Vitesse Msg' + .text 'Vit. Texte' .db 0x01 .dw 0x02C4 @@ -248,4 +247,4 @@ controls: .dw 0x0484 .text 'Fin' .db 0 -} \ No newline at end of file +} diff --git a/src/menus/tools_shop_text.s b/src/menus/tools_shop_text.s index 56f79e1..16b2464 100644 --- a/src/menus/tools_shop_text.s +++ b/src/menus/tools_shop_text.s @@ -1,8 +1,10 @@ .scope shops { gils: .dw 0x0176 ; - 4 - .db 0xf4, 0xf5 -; .text 'Gils' + { + .table 'text/vwf_precomp.tbl' + .text 'Gils' + } .db 0 welcome_and_actions: @@ -25,4 +27,4 @@ quantity: .dw 0x0146 + 8 * 2 .text '1' .db 0 -} \ No newline at end of file +} diff --git a/src/txt_menu.s b/src/txt_menu.s deleted file mode 100644 index dbda85e..0000000 --- a/src/txt_menu.s +++ /dev/null @@ -1,390 +0,0 @@ -.table 'text/ff4_menus.tbl' - -main_menu_text = 0x00 -gils_text = 0x01 -time_text = 0x02 -cantuse_text = 0x03 -item_text = 0x04 -not_use_text = 0x05 -config_text = 0x06 -options_text = 0x07 -white_magic_text = 0x08 -black_magic_text = 0x09 -summon_magic_text = 0x0A -state_text = 0x0B - - -{ -;============================================= -; Table de Pointeurs 24bits: -;============================================= -;menu principal 00 -.pointer menup -;Gils 01 -.pointer gils -;temps 02 -.pointer time -;Can't use 03 -.pointer cantuse - -;item 04 -.pointer item - -;Impossible a utiliser 05 -.pointer notuse - -;configuration 06 -.pointer config - -;options 07 -.pointer options - -;magie 08 -.pointer blanc - -;noir 09 -.pointer noir - -;Invokation 0A -.pointer invok - -;Etat 0B -.pointer etat - -;for level up 0C -.pointer forlevup - -;Stats 0D -.pointer stats - -;controles 0E -.pointer controles - -;buttons: 0F -.pointer button - -;Mpneeded: 10 -.pointer mpneed - -;Ninja: 11 -.pointer ninja - -;Multiple: 12 -.pointer mult - -;manette: 13 -.pointer manette - -;equiper: 14 -.pointer equip - - -;============================================= -; Menu Principal: -;============================================= -menup: - .dw 0x0070 -{ -; .table 'text/gen/menu.tbl' - .text 'Objets' - .db 0x01, 0xF0, 0x00 - .text 'Sorts' - .db 0x01, 0x70, 0x01 - .text 'Equiper' - .db 0x01, 0xF0, 0x01 - .text 'Statut' - .db 0x01, 0x70, 0x02 - .text 'Placer' - .db 0x01, 0xF0, 0x02 - .text 'Changer' - .db 0x01, 0x70, 0x03 - .text 'Options' - .db 0x01, 0xF0, 0x03 - .text 'Sauver' - .db 0 - } -; old - .dw 0x0070 - .text 'Objets' - .db 0x01, 0xF0, 0x00 - - .text 'Sorts' - .db 0x01, 0x70, 0x01 - - .text 'Equiper' - .db 0x01, 0xF0, 0x01 - - .text 'Statut' - .db 0x01, 0x70, 0x02 - - .text 'Placer' - .db 0x01, 0xF0, 0x02 - - .text 'Changer' - .db 0x01, 0x70, 0x03 - - .text 'Options' - .db 0x01, 0xF0, 0x03 - - .text 'Sauver' - .db 0 -gils: - .dw 0x05B0 + 0x40 + 0x40 + 0x40 + 6 - .text 'Gils' - .db 0 -time: - .dw 0x04F0 - .text 'Temps' - .db 0 -cantuse: - .dw 0x0252 - .text ' Inutilisable' - .db 0 -item: - .dw 0x0044 - .text 'Objets' - .db 0 -notuse: - .dw 0x0052 - .text 'Impossible à utiliser.' - .db 0 - -;============================================= -; Options: -;============================================= -config: - .dw 0x0144 - .text 'Mode Combat' - .db 0x01 - - .dw 0x015E - .text 'Actif Pause' - .db 0x01 - - .dw 0x01C4 - .text 'Vitesse Cbt' - .db 0x01 - - .dw 0x021E - .text 'Vite Lent' - .db 0x01 - - .dw 0x0244 - .text 'Vitesse Msg' - .db 0x01 - - .dw 0x02C4 - .text 'Audio' - .db 0x01 - - .dw 0x02DE - .text 'Stéréo Mono' - .db 0x01 - - .dw 0x0344 - .text 'Contrôle' - .db 0x01 - - .dw 0x035E - .text 'Normal Perso.' - .db 0x01 - - .dw 0x03DE - .text 'Seul Multiple' - .db 0x01 - - .dw 0x0444 - .text 'Curseur' - .db 0x01 - - .dw 0x045E - .text 'Reset Mémoire' - .db 0x01 - - .dw 0x04C4 - .text 'Couleur' - .db 0 -options: - .dw 0x0098 - .text 'Options' - .db 0 -controles: - .dw 0x0096 - .text 'Contrôles' - .db 1 - - .dw 0x0204 - .text 'Action' - .db 0x01 - - .dw 0x0284 - .text 'Annuler' - .db 0x01 - - .dw 0x0304 - .text 'Menu' - .db 0x01 - - .dw 0x0384 - .text 'Left Button' - .db 0x01 - - .dw 0x0404 - .text 'Start' - .db 1 - - .dw 0x0484 - .text 'Fin' - .db 0 -button: - .dw 0x0488 - .text 'Eteins Action Annuler Menu' - .db 0 -mult: - .dw 0x0096 - .text 'Multiple' - .db 0 -manette: - .dw 0x021E - .text 'Manette' - .db 1 - - .dw 0x029E - .text 'Manette' - .db 1 - - .dw 0x031E - .text 'Manette' - .db 1 - - .dw 0x039E - .text 'Manette' - .db 1 - - .dw 0x041E - .text 'Manette' - .db 0 - -;============================================= -; Sorts: -;============================================= -blanc: - .dw 0x00EE - .text 'Blanc' - .db 0 -noir: - .dw 0x016E - .text 'Noir' - .db 0 -invok: - .dw 0x01EE - .text 'Chimere' - .db 0 -ninja: - .dw 0x016E - .text 'Ninja' - .db 0 -mpneed: - .dw 0x020A - .text 'Coût PM' - .db 0 - -;============================================= -; Statut: -;============================================= -etat: - .dw 0x01F0 - .text 'Statut' - .db 0 -forlevup: - .dw 0x0260 - .text 'Niveau suivant' - .db 0 -stats: - .dw 0x01A0 - .text 'Expérience' - .db 0x01 - - .dw 0x0206 - .text 'PV' - .db 1 - - .dw 0x0286 - .text 'PM' - .db 1 - - .dw 0x0344 - .text 'Talents' - .db 1 - - .dw 0x03C2 - .text 'Vigueur' - .db 1 - - .dw 0x0442 - .text 'Agilité' - .db 1 - - .dw 0x04C2 - .text 'Vitesse' - .db 1 - - .dw 0x0542 - .text 'Esprit' - .db 1 - - .dw 0x05C2 - .text 'Volonté' - .db 1 - -;att/def/mag: - - .dw 0x035A - .text 'Attaque' - .db 1 - - .dw 0x03DA - .text 'Attaque%' - .db 1 - - .dw 0x045A - .text 'Défense' - .db 1 - - .dw 0x04DA - .text 'Défense%' - .db 1 - - .dw 0x055A - .text 'Déf Mag' - .db 1 - - .dw 0x05DA - .text 'Déf Mag%' - .db 0 - - -;============================================= -; Equiper: -;============================================= -equip: - .dw 0x005C - .text 'MainD' - .db 1 - - .dw 0x00DC - .text 'MainG' - .db 1 - - .dw 0x015C - .text 'Tête' - .db 1 - - .dw 0x01DC - .text 'Corps' - .db 1 - - .dw 0x025C - .text 'Bras' - .db 0 -} \ No newline at end of file From 02071a3bdaf94ec0192dd5b0e92e03971d896d5a Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 2 May 2016 11:54:23 +0200 Subject: [PATCH 19/52] Adds more words to the precomputed 8x8 text. --- build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.py b/build.py index a102982..c1cdbf3 100755 --- a/build.py +++ b/build.py @@ -126,7 +126,7 @@ def build_assets(assets): dialog_table = Table('text/ff4fr.tbl') menu_table = Table('text/ff4_menus.tbl') - lang = 'en' + lang = 'fr' text_root = 'text/{lang}'.format(lang=lang) assets_list = [ @@ -155,7 +155,7 @@ def build_assets(assets): ] build_assets(assets_list) - generate_8x8_vwf_asset(['Niveau', 'Gils'], 'niveau', 0xF0) + generate_8x8_vwf_asset(['Niveau', 'Gils', 'Passer', 'Garde'], 'vwf_precomp', 0x90) if not os.path.exists('build'): os.mkdir('build') From b30dcfaf197847b9664ff4921ab5bd0fa76e5044 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 2 May 2016 11:56:48 +0200 Subject: [PATCH 20/52] Use vwf_precomp asset instead of niveau. --- ff4.s | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ff4.s b/ff4.s index 5a18db1..e3ccced 100644 --- a/ff4.s +++ b/ff4.s @@ -40,8 +40,9 @@ dialog_bank_ptr_base = 0x218000 ;*=0x0AF000 ; .incbin 'fonts/8x8.bin' -*=0x0AFF00 - .incbin 'assets/niveau.bin' +;*=0x0AFF00-0x10 * 10 +*=0x0AF900 + .incbin 'assets/vwf_precomp.bin' ; Patch des noms des personages *=0x0FA710 From f8296e8b7141eba949142e07be6ca439082f9dd3 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 22 Jul 2016 15:47:10 +0200 Subject: [PATCH 21/52] Renamed text files. --- build.py | 44 +++++++++++-------- text/en/{en-bank1-1.xml => bank1-1.xml} | 0 text/en/{en-bank1-2.xml => bank1-2.xml} | 0 text/en/{en-bank2.xml => bank2.xml} | 0 .../battle_commands.xml} | 8 ++-- ...ers_classes.xml => characters_classes.xml} | 0 ...racters_names.xml => characters_names.xml} | 0 text/en/en-battle_commands.xml | 33 -------------- text/en/{en-items.xml => items.xml} | 0 text/en/{en-magic.xml => magic.xml} | 0 text/{fr/fr-monsters.xml => en/monsters.xml} | 2 +- .../{en-places-names.xml => places-names.xml} | 2 +- text/fr/{fr-bank1-1.xml => bank1-1.xml} | 0 text/fr/{fr-bank1-2.xml => bank1-2.xml} | 0 text/fr/{fr-bank2.xml => bank2.xml} | 0 text/fr/battle_commands.xml | 33 ++++++++++++++ ...ers_classes.xml => characters_classes.xml} | 0 ...racters_names.xml => characters_names.xml} | 0 text/fr/{fr-items.xml => items.xml} | 0 text/fr/{fr-magic.xml => magic.xml} | 0 text/{en/en-monsters.xml => fr/monsters.xml} | 2 +- .../{fr-places-names.xml => places-names.xml} | 12 ++--- 22 files changed, 72 insertions(+), 64 deletions(-) rename text/en/{en-bank1-1.xml => bank1-1.xml} (100%) rename text/en/{en-bank1-2.xml => bank1-2.xml} (100%) rename text/en/{en-bank2.xml => bank2.xml} (100%) rename text/{fr/fr-battle_commands.xml => en/battle_commands.xml} (84%) rename text/en/{en-characters_classes.xml => characters_classes.xml} (100%) rename text/en/{en-characters_names.xml => characters_names.xml} (100%) delete mode 100644 text/en/en-battle_commands.xml rename text/en/{en-items.xml => items.xml} (100%) rename text/en/{en-magic.xml => magic.xml} (100%) rename text/{fr/fr-monsters.xml => en/monsters.xml} (99%) rename text/en/{en-places-names.xml => places-names.xml} (99%) rename text/fr/{fr-bank1-1.xml => bank1-1.xml} (100%) rename text/fr/{fr-bank1-2.xml => bank1-2.xml} (100%) rename text/fr/{fr-bank2.xml => bank2.xml} (100%) create mode 100644 text/fr/battle_commands.xml rename text/fr/{fr-characters_classes.xml => characters_classes.xml} (100%) rename text/fr/{fr-characters_names.xml => characters_names.xml} (100%) rename text/fr/{fr-items.xml => items.xml} (100%) rename text/fr/{fr-magic.xml => magic.xml} (100%) rename text/{en/en-monsters.xml => fr/monsters.xml} (99%) rename text/fr/{fr-places-names.xml => places-names.xml} (94%) diff --git a/build.py b/build.py index c1cdbf3..f5ff9a1 100755 --- a/build.py +++ b/build.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3.4 +#!/usr/bin/env python3 # coding:utf-8 import os from xml.etree import ElementTree @@ -71,6 +71,7 @@ def build_patch(input, output): def build_text_asset(table, input_file, binary_text_file, pointers_file, address): pointers = read_pointers_from_xml(input_file, table) + write_pointers_value_as_binary(pointers, binary_text_file) write_pointers_addresses_as_binary(pointers, long_low_rom_pointer(snes_to_rom(address)), pointers_file) @@ -130,36 +131,41 @@ def build_assets(assets): text_root = 'text/{lang}'.format(lang=lang) assets_list = [ - ('script', dialog_table, os.path.join(text_root, '{lang}-bank1-1.xml'.format(lang=lang)), 'assets/bank1_1.dat', + ('script', dialog_table, os.path.join(text_root, 'bank1-1.xml'), 'assets/bank1_1.dat', 'assets/bank1_1.ptr', 0x228000), - ('script', dialog_table, os.path.join(text_root, '{lang}-bank1-2.xml'.format(lang=lang)), 'assets/bank1_2.dat', + ('script', dialog_table, os.path.join(text_root, 'bank1-2.xml'), 'assets/bank1_2.dat', 'assets/bank1_2.ptr', 0x24A000), - ('script', dialog_table, os.path.join(text_root, '{lang}-bank2.xml'.format(lang=lang)), 'assets/bank2.dat', + ('script', dialog_table, os.path.join(text_root, 'bank2.xml'), 'assets/bank2.dat', 'assets/bank2.ptr', 0x25A000), + ('vwf-font', 'fonts/vwf.png', False, 'assets/font.dat', 'assets/font_length_table.dat'), ('vwf-font', 'fonts/bold_vwf.png', False, 'assets/bold_font.dat', 'assets/bold_font_length_table.dat'), ('vwf-font', 'fonts/wicked_vwf.png', False, 'assets/wicked_font.dat', 'assets/wicked_font_length_table.dat'), ('vwf-font', 'fonts/book_vwf.png', False, 'assets/book_font.dat', 'assets/book_font_length_table.dat'), - ('fixed', menu_table, os.path.join(text_root, '{lang}-items.xml'.format(lang=lang)), 'assets/items.dat'), - ('fixed', menu_table, os.path.join(text_root, '{lang}-magic.xml'.format(lang=lang)), 'assets/magic.dat'), - ('fixed', menu_table, os.path.join(text_root, '{lang}-characters_names.xml'.format(lang=lang)), - 'assets/characters_names.dat'), - ('fixed', menu_table, os.path.join(text_root, '{lang}-characters_names.xml'.format(lang=lang)), - 'assets/characters_names.dat'), - ('fixed', menu_table, os.path.join(text_root, '{lang}-battle_commands.xml'.format(lang=lang)), - 'assets/battle_commands.dat'), - ('nullterminated', menu_table, os.path.join(text_root, '{lang}-places-names.xml'.format(lang=lang)), - 'assets/places_names.dat'), - ('nullterminated', menu_table, os.path.join(text_root, '{lang}-characters_classes.xml'.format(lang=lang)), - 'assets/classes.dat', 'assets/classes.ptr') + + ('fixed', menu_table, os.path.join(text_root, 'items.xml'), 'assets/items.dat'), + ('fixed', menu_table, os.path.join(text_root, 'magic.xml'), 'assets/magic.dat'), + ('fixed', menu_table, os.path.join(text_root, 'monsters.xml'), 'assets/monsters.dat'), + ('fixed', menu_table, os.path.join(text_root, 'characters_names.xml'), 'assets/characters_names.dat'), + ('fixed', menu_table, os.path.join(text_root, 'battle_commands.xml'), 'assets/battle_commands.dat'), + + ('nullterminated', menu_table, os.path.join(text_root, 'places-names.xml'), 'assets/places_names.dat'), + ('nullterminated', menu_table, os.path.join(text_root, 'characters_classes.xml'), + 'assets/classes.dat', 'assets/classes.ptr'), ] build_assets(assets_list) - generate_8x8_vwf_asset(['Niveau', 'Gils', 'Passer', 'Garde'], 'vwf_precomp', 0x90) + + small_text = [ + 'Niveau', + 'Gils', + 'Passer', + 'Garde' + ] + + generate_8x8_vwf_asset(small_text, 'vwf_precomp', 0x90) if not os.path.exists('build'): os.mkdir('build') build_patch('ff4.s', 'build/ff4.ips') - - diff --git a/text/en/en-bank1-1.xml b/text/en/bank1-1.xml similarity index 100% rename from text/en/en-bank1-1.xml rename to text/en/bank1-1.xml diff --git a/text/en/en-bank1-2.xml b/text/en/bank1-2.xml similarity index 100% rename from text/en/en-bank1-2.xml rename to text/en/bank1-2.xml diff --git a/text/en/en-bank2.xml b/text/en/bank2.xml similarity index 100% rename from text/en/en-bank2.xml rename to text/en/bank2.xml diff --git a/text/fr/fr-battle_commands.xml b/text/en/battle_commands.xml similarity index 84% rename from text/fr/fr-battle_commands.xml rename to text/en/battle_commands.xml index e103276..71497e3 100644 --- a/text/fr/fr-battle_commands.xml +++ b/text/en/battle_commands.xml @@ -1,11 +1,11 @@ - + Fight Item White Magic - Black + Black Magic Summon - Dark Wave + Darkness Jump Remember Sing @@ -25,7 +25,7 @@ Dart Sneak Ninjutsu - SpiritWave + Spirit Wave Change Row Defend Show diff --git a/text/en/en-characters_classes.xml b/text/en/characters_classes.xml similarity index 100% rename from text/en/en-characters_classes.xml rename to text/en/characters_classes.xml diff --git a/text/en/en-characters_names.xml b/text/en/characters_names.xml similarity index 100% rename from text/en/en-characters_names.xml rename to text/en/characters_names.xml diff --git a/text/en/en-battle_commands.xml b/text/en/en-battle_commands.xml deleted file mode 100644 index e2dac98..0000000 --- a/text/en/en-battle_commands.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - Fight - Item - White - Black - Summon - Dark Wave - Jump - Remember - Sing - Hide - Medicine - Prayer - Aim - Build Up - Kick - Endure - Twin Magic - Strengthen - Fake Tears - Cover - Peep - Spirビ Wave - Dart - Sneak - Ninjutsu - SpiritWave - Change Row - Defend - Show - Cover Off - diff --git a/text/en/en-items.xml b/text/en/items.xml similarity index 100% rename from text/en/en-items.xml rename to text/en/items.xml diff --git a/text/en/en-magic.xml b/text/en/magic.xml similarity index 100% rename from text/en/en-magic.xml rename to text/en/magic.xml diff --git a/text/fr/fr-monsters.xml b/text/en/monsters.xml similarity index 99% rename from text/fr/fr-monsters.xml rename to text/en/monsters.xml index 7eadd23..7e1e7aa 100644 --- a/text/fr/fr-monsters.xml +++ b/text/en/monsters.xml @@ -1,5 +1,5 @@ - + Goblin Basilisk Dive Eagle diff --git a/text/en/en-places-names.xml b/text/en/places-names.xml similarity index 99% rename from text/en/en-places-names.xml rename to text/en/places-names.xml index 6dcdbce..a322928 100644 --- a/text/en/en-places-names.xml +++ b/text/en/places-names.xml @@ -20,7 +20,7 @@ Weapon Shop Armor Shop Tool Shop - Cafe + Bar Camp King's Room Dungeon diff --git a/text/fr/fr-bank1-1.xml b/text/fr/bank1-1.xml similarity index 100% rename from text/fr/fr-bank1-1.xml rename to text/fr/bank1-1.xml diff --git a/text/fr/fr-bank1-2.xml b/text/fr/bank1-2.xml similarity index 100% rename from text/fr/fr-bank1-2.xml rename to text/fr/bank1-2.xml diff --git a/text/fr/fr-bank2.xml b/text/fr/bank2.xml similarity index 100% rename from text/fr/fr-bank2.xml rename to text/fr/bank2.xml diff --git a/text/fr/battle_commands.xml b/text/fr/battle_commands.xml new file mode 100644 index 0000000..07771a0 --- /dev/null +++ b/text/fr/battle_commands.xml @@ -0,0 +1,33 @@ + + + Attaquer + Objets + Sorts Blancs + Sorts Noirs + Invoquer + Obscurité + Saut + Souvenir + Chanter + Cacher + Medecine + Prière + Viser + Build Up + Kick + Endure + Double Magie + Strengthen + Pleurnicher + Couvrir + Peep + Choc Mental + Dart + Sneak + Ninjutsu + Choc Mental + Change Row + Defend + Show + Cover Off + diff --git a/text/fr/fr-characters_classes.xml b/text/fr/characters_classes.xml similarity index 100% rename from text/fr/fr-characters_classes.xml rename to text/fr/characters_classes.xml diff --git a/text/fr/fr-characters_names.xml b/text/fr/characters_names.xml similarity index 100% rename from text/fr/fr-characters_names.xml rename to text/fr/characters_names.xml diff --git a/text/fr/fr-items.xml b/text/fr/items.xml similarity index 100% rename from text/fr/fr-items.xml rename to text/fr/items.xml diff --git a/text/fr/fr-magic.xml b/text/fr/magic.xml similarity index 100% rename from text/fr/fr-magic.xml rename to text/fr/magic.xml diff --git a/text/en/en-monsters.xml b/text/fr/monsters.xml similarity index 99% rename from text/en/en-monsters.xml rename to text/fr/monsters.xml index 7eadd23..7e1e7aa 100644 --- a/text/en/en-monsters.xml +++ b/text/fr/monsters.xml @@ -1,5 +1,5 @@ - + Goblin Basilisk Dive Eagle diff --git a/text/fr/fr-places-names.xml b/text/fr/places-names.xml similarity index 94% rename from text/fr/fr-places-names.xml rename to text/fr/places-names.xml index 6dcdbce..d1f3a43 100644 --- a/text/fr/fr-places-names.xml +++ b/text/fr/places-names.xml @@ -28,11 +28,13 @@ Chocobo Forest Chocobo Village Weapon and Armor Shop - Left Tower - Right Tower - Hidden Room - Training Room - Baron Castle + + Tour Ouest + + Tour Est + Piece Cachée + Salle d'entrainement + Château de Baron White Magic Classroom Black Magic Classroom Your Room From b1e7f28e6b06dc00aac020ef7d3d76d5fd1ccb1b Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 26 Jul 2016 18:51:34 +0200 Subject: [PATCH 22/52] Expand an move the Customize controls title window. --- src/ingame/options.s | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ingame/options.s b/src/ingame/options.s index 94f205d..239355b 100644 --- a/src/ingame/options.s +++ b/src/ingame/options.s @@ -21,6 +21,16 @@ *=0x01D1A4 load_system_menu_text_pointer(options.config) +; move controls title window +*=0x01E204 + .db 0x50 + .db 0x00 + .db 0x0B + .db 0x02 + +*=0x01D487 + ldy.w #0xE204 + ; controles *=0x01D48D load_system_menu_text_pointer(options.controls) From 1351d29e4f5db28060fb1f4843658c660c31fdcc Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 26 Jul 2016 18:52:02 +0200 Subject: [PATCH 23/52] Adds customized controls title text. --- src/menus/in_game_text.s | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/menus/in_game_text.s b/src/menus/in_game_text.s index 2593964..848d8e5 100644 --- a/src/menus/in_game_text.s +++ b/src/menus/in_game_text.s @@ -224,6 +224,10 @@ config: controls: + .dw 0x0092 + .text 'Personaliser' + .db 0x01 + .dw 0x0204 .text 'Action' .db 0x01 From 1751a275a87c7c5ec6fe4abd2d0737b4b5a4b604 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 26 Jul 2016 18:52:47 +0200 Subject: [PATCH 24/52] Disabled spells are now correctly displayed. --- src/battle_magic.s | 68 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/src/battle_magic.s b/src/battle_magic.s index e8a8d3d..c0a0323 100644 --- a/src/battle_magic.s +++ b/src/battle_magic.s @@ -1,19 +1,5 @@ battle_magic_length = 8 -*=0x029EAD - rts -; Try to fix the disable mask -*=0x029EC0 - adc.b #battle_magic_length * 2 - -; Use the Yellow text palette -*=0x029EDB - lda #0x0f - -*=0x029EE9 - cpy.b #battle_magic_length * 2 + 1 - -; number of spells line (Adds 50% because we have 2 spells per line ; where originaly it was 3. clear related *=0x02984D ldx.w #0x0018 @@ -180,3 +166,57 @@ fsize = 0x900 ;dec 0x63 nop nop + +*=0x02A567 + lda.b #battle_magic_length + +*=0x02A573 + lda.l assets_magic_dat,X +*=0x02A57E + lda.l assets_magic_dat+1,X + +; sets the palette for disabled spells (Not enough MP) +*=0x029EC8 + lda #0x48 + sta 7 +loc_29ECC: + ldy.w #1 + lda (0) + bmi loc_29EDB + lda #0 + sta 6 + lda #0 + bra loc_29EE3 +loc_29EDB: + lda #4 + sta 6 + bra loc_29EE3 +loc_29EE1: + lda 6 +loc_29EE3: + + sta (2),Y + sta (4),Y + iny + iny + cpy.w #battle_magic_length * 2 + 1 ; len * 2 + 1 : 0x0D + bne loc_29EE1 + rep #0x20 ; ' ' +;.A16 + lda 2 + clc + adc.w #battle_magic_length * 4 ; next word len * 4 : 0x18 + sta 2 + clc + adc.w #battle_magic_length * 2 ; len * 2 0x0c + sta 4 + lda 0 + clc + adc.w #4 ; next magic struct + sta 0 + tdc + sep #0x20 +;.A8 + dec 7 ; loop on all magic + bne loc_29ECC + rts From 2495fd7bc9e1cca4d505d4bea2b51406be624408 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 26 Jul 2016 18:54:27 +0200 Subject: [PATCH 25/52] Include monsters names assets. --- ff4.s | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ff4.s b/ff4.s index e3ccced..b4f0b86 100644 --- a/ff4.s +++ b/ff4.s @@ -51,6 +51,9 @@ dialog_bank_ptr_base = 0x218000 *=0x0f8000 .incbin 'assets/items.dat' +*=0x0E9800 + .incbin 'assets/monsters.dat' + *=0x208000 .include 'src/libmz.s' .include 'src/intro.s' From 40ec316a865a4757882bc1d6858acef59502e7cc Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 5 Aug 2024 19:35:19 +0200 Subject: [PATCH 26/52] Use a816 v1.0.2. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b271913..e3642aa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -git+https://github.com/manz/a816.git +a816==1.0.2 pillow numpy From c9de45952e6ba68ed484ec04f046e582a729529d Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 5 Aug 2024 20:15:30 +0200 Subject: [PATCH 27/52] Adds github build workflow. --- .github/workflows/build.yml | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..225d0eb --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,37 @@ +name: CI + +on: + push: + branches: + - master + create: + tags: + + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Setup Python 3.12 + uses: actions/setup-python@v4 + with: + python-version: '3.12' + - uses: actions/cache@v3 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + - name: Install Requirements + if: steps.cache-requirements.outputs.cache-hit != 'true' + run: pip install -r requirements.txt + - name: Build patch + run: ./build.py + - name: Upload nightly patch artifact + uses: actions/upload-artifact@v1 + with: + name: ff4-nightly + path: ff4.ips From 30a585b91b44c03cdd36b16eddf883c8dfdf18f1 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 5 Aug 2024 20:17:28 +0200 Subject: [PATCH 28/52] Fixes ff4.ips path. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 225d0eb..71d5b55 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,4 +34,4 @@ jobs: uses: actions/upload-artifact@v1 with: name: ff4-nightly - path: ff4.ips + path: build/ff4.ips From 0c9ae311b0d43ebf2956595502c5f5b408fd5d05 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 5 Aug 2024 20:22:28 +0200 Subject: [PATCH 29/52] Updates actions to their latest version. --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 71d5b55..e44e022 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,10 +16,10 @@ jobs: steps: - uses: actions/checkout@v4 - name: Setup Python 3.12 - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.12' - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} @@ -31,7 +31,7 @@ jobs: - name: Build patch run: ./build.py - name: Upload nightly patch artifact - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: ff4-nightly path: build/ff4.ips From c19159442618e2d05294f32a1b290c200d1c9dc8 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:23:19 +0200 Subject: [PATCH 30/52] Updates menu. --- src/ingame/equip.s | 37 +++ src/ingame/items.s | 114 ++++++++- src/ingame/macros.i | 16 ++ src/ingame/magic.s | 93 ++++++- src/ingame/main.s | 222 +++++++++++------ src/ingame/menus.i | 2 + src/ingame/options.s | 18 +- src/ingame/shop.s | 100 ++++++++ src/ingame/status.s | 16 +- src/menus/in_game_text.s | 452 ++++++++++++++++++++-------------- src/menus/start_screen_text.s | 64 +++-- src/menus/tools_shop_text.s | 49 ++-- 12 files changed, 847 insertions(+), 336 deletions(-) create mode 100644 src/ingame/equip.s create mode 100644 src/ingame/macros.i create mode 100644 src/ingame/shop.s diff --git a/src/ingame/equip.s b/src/ingame/equip.s new file mode 100644 index 0000000..2eb04e4 --- /dev/null +++ b/src/ingame/equip.s @@ -0,0 +1,37 @@ +*=0x01bd0f + load_system_menu_text_pointer(equip.menu) + +; Moves Character name one line up to avoid colision with dextrality text. +*=0x01bd54 + ldy.w #0x01c6 - 0x40 - 2 + +_item_delta = 8 + +*=0x01bd7b + ldx.w #0x0164 + _item_delta + +*=0x01bd82 + ldx.w #0x01e4 + _item_delta + +*=0x01bd89 + ldx.w #0x0264 + _item_delta + +*=0x01bd92 + ldx.w #0x0064 + _item_delta + +*=0x01bda8 + ldx.w #0x00e4 + _item_delta + + +*=0x1bd5c + jsr.l load_dextrelity_pointer + destrelity_return = 0x1bd73 + ldx.w #0x244 + jmp.w destrelity_return + +*=0x01e2d9 + .dw (dextrality.string_0 & 0xFFFF) - 0x8000 + .dw (dextrality.string_1 & 0xFFFF) - 0x8000 + .dw (dextrality.string_2 & 0xFFFF) - 0x8000 + .dw (dextrality.string_3 & 0xFFFF) - 0x8000 + diff --git a/src/ingame/items.s b/src/ingame/items.s index 57ca4d9..20726cd 100644 --- a/src/ingame/items.s +++ b/src/ingame/items.s @@ -1,7 +1,117 @@ +.include 'src/ingame/macros.i' + ; during scroll *=0x01A814 - load_system_menu_text_pointer(items_menu.item) + load_system_menu_text_pointer(items_menu.item) ; when scroll done *=0x019F56 - load_system_menu_text_pointer(items_menu.item) + load_system_menu_text_pointer(items_menu.item) + +*=0x1a750 + load_system_menu_text_pointer(items_menu.item) + +; patching find description setup bank and offset +*=0x01a7f6 + ldx.w #assets_item_descriptions_dat & 0xffff + +*=0x01a7fc + addr = ((assets_item_descriptions_dat >> 16) << 16) + lda.l addr, x + + +; Hook in the display_item_description function, draw the window and render the string +*=0x01a808 + lda.b #assets_item_descriptions_dat>>16 + ldx.w #0x0054 + jsr.w draw_vwf_message + + +*=0x1a439 + ldy.w #messages.use_on_whom + jsr.w draw_vwf_message_pos_with_bank + +*=0x1a36f + ldy.w #messages.cantuse + jsr.w draw_vwf_message_pos_with_bank + + +; inventory window +*=0x01dcce + menu_window(0,0,30,48) + +; +*=0x01dcd6 + menu_window(9,0,21,3) + +; item select character on the left side (selected item in the right column) +*=0x01dd38 + menu_window(0,5,16,21) + +; item select character on the right side (selected item in the left column) +*=0x01dd3c + menu_window(14,5,16,21) + +; moves the right item column one tile to the right +*=0x01a227 + adc.w #0x001c + 4 + +*=0x1efd7d +__delta_l = 0 +__delta_r = 2 + + .dw 0x039e- __delta_l,0x019e- __delta_l,0x059e- __delta_l,0x029e- __delta_l,0x049e- __delta_l + .dw 0x0384- __delta_r,0x0184- __delta_r,0x0584- __delta_r,0x0284- __delta_r,0x0484- __delta_r + +*=0x01a4f4 + adc.w #0x0082 + +*=0x01a51a + draw_hp_mp = 0x018a2a + lda.w #0x0046 + 0x40 + ldy.w #0x0007 + jsr.w draw_hp_mp + lda.w #0x0050 + 0x40 + ldy.w #0x0009 + jsr.w draw_hp_mp + lda.w #0x0086 + 0x40 + ldy.w #0x000b + jsr.w draw_hp_mp + lda.w #0x0090 + 0x40 + ldy.w #0x000d + jsr.w draw_hp_mp + +*=0x01aed6 + ldy.w #messages.cant_use_magic - 0x8000 + jsr.w draw_window_and_vwf_message + +; free space at the end of the bank + +*=0x01ff40 +draw_window = 0x0180d9 + +draw_vwf_message: + jsr.l items_description.draw_trampoline + rts +draw_window_and_vwf_message: + jsr.w draw_window + ; quirks from the hardcore bank switching can be solved by loading the bank in A before the call. + pha + rep #0x20 + tya + adc.w #0x8000 + tay + sep #0x20 + pla + + iny + iny + iny + iny +draw_vwf_message_pos_with_bank: + lda.b #messages.use_on_whom >> 16 + +draw_vwf_message_pos: + jsr.l items_description.draw_trampoline_pos + rts + diff --git a/src/ingame/macros.i b/src/ingame/macros.i new file mode 100644 index 0000000..f7b5e01 --- /dev/null +++ b/src/ingame/macros.i @@ -0,0 +1,16 @@ +.macro move_to(left, top) { + .dw left * 2 + top * 64 +} + +.macro menu_window(left, top, width, height) { + move_to(left, top) + .db width, height +} + +.macro menu_window_move_text(left, top, width, height) { + move_to(left, top) + .db width, height + move_to(left + 1, top + 1) +} + + diff --git a/src/ingame/magic.s b/src/ingame/magic.s index ff5b566..407428b 100644 --- a/src/ingame/magic.s +++ b/src/ingame/magic.s @@ -1,38 +1,107 @@ +.include 'src/ingame/macros.i' + ; White spells *=0x01AFA2 - load_system_menu_text_pointer(spells.white) + load_system_menu_text_pointer(spells.white) ; Black spells *=0x01AFB6 - load_system_menu_text_pointer(spells.black) + load_system_menu_text_pointer(spells.black) ; summons *=0x01AFCA - load_system_menu_text_pointer(spells.summon) + load_system_menu_text_pointer(spells.summon) *=0x01AFDE - load_system_menu_text_pointer(spells.ninja) + load_system_menu_text_pointer(spells.ninja) *=0x1d95e - load_system_menu_text_pointer(spells.kokan) + load_system_menu_text_pointer(spells.kokan) *=0x01b0ec - ldx.w #0x020A + 0x40 - load_system_menu_text_pointer(spells.mp_needed) + ldx.w #0x020A + 0x40 + load_system_menu_text_pointer(spells.mp_needed) ; Grisement des types sorts : 'Blancs' 'Noirs' etc ... *=0x01B419 - ldy.w #0x0007 - sta.w 0xC5FF,x + ldy.w #0x0007 + sta.w 0xC5FF,x ; Spells type cursor offset *=0x01B0CE - lda.b #0x00 + lda.b #0x00 ; Spells cost before char *=0x01B0F7 - STA.W 0xC816 + 0x40 + 2 + STA.W 0xC816 + 0x40 + 2 ; Spells cost *=0x01B0E6 - LDY.W #0x021A + 0x40 + 2 + LDY.W #0x021A + 0x40 + 2 + + + + +; [use spell] Choose Spell character target window. + +*=0x01dd6d + menu_window(8, 0, 22, 26) + +; [use spell] Magic name window. +*=0x01dd75 + menu_window(0, 0, 8, 7) + +; [use spell] Use spell on whom window. +*=0x01dd71 + menu_window(0, 8, 8, 5) + +; [use spell] Magic name position. +*=0x01b4a7 + ldx.w #0x0042 + +; move character blocks one tile back +*=0x01b4c5 + ldx.w #0x02e0 - 2 +*=0x01b4ce + ldx.w #0x0060 - 2 +*=0x01b4d7 + ldx.w #0x0560 - 2 +*=0x01b4e0 + ldx.w #0x01a0 - 2 +*=0x01b4e9 + ldx.w #0x0420 - 2 + +; moves character portrait 8 pixels back +*=0x1efea9 +delta = 8 +.db 0x58 - delta,0x68 +.db 0x58 - delta,0x18 +.db 0x58 - delta,0xb8 +.db 0x60 - delta,0x40 +.db 0x60 - delta,0x90 ; 3 front/2 back +.db 0x60 - delta,0x68 +.db 0x60 - delta,0x18 +.db 0x60 - delta,0xb8 +.db 0x58 - delta,0x40 +.db 0x58 - delta,0x90 ; 2 front/3 back + +; do not display on whom window +*=0x01b498 +nop +nop +nop + +; do not display to "on whom ?" text +*=0x01b4ad +nop +nop +nop +; load_system_menu_text_pointer(use_spell.use_on_whom) +;ldy.w #0xdd79 +nop +nop +nop + +*=0x01b4b3 +load_system_menu_text_pointer(use_spell.mp_cost) + diff --git a/src/ingame/main.s b/src/ingame/main.s index 9f04c44..d6e6ac8 100644 --- a/src/ingame/main.s +++ b/src/ingame/main.s @@ -1,16 +1,17 @@ { *=0x01DB61 - .dw 0x0000, 0x1A16 ; fenètre principale - .dw 0x05EC, 0x0308 ; fenètre Gils - .dw 0x04EE, 0x0207 ; fenetre temps - .dw 0x002E, 0x1107 ; fenètre menu principal + .dw 0x0000, 0x1A16 ; fenètre principale + .dw 0x05EE, 0x0307 ; fenètre Gils + .dw 0x04EE, 0x0207 ; fenetre temps + .dw 0x002E, 0x1107 ; fenètre menu principal *=0x01892E - load_system_menu_text_pointer(in_game_menu.menu) + load_system_menu_text_pointer(in_game_menu.menu) + ; jsr.w draw_window_and_vwf_message ; Gils *=0x0187CE - load_system_menu_text_pointer(in_game_menu.gils) + load_system_menu_text_pointer(in_game_menu.gils) ; moves gils two chars on the right *=0x0187DA @@ -18,26 +19,29 @@ ; TIME *=0x0187C5 - ldx.w #0x52E + 2 - load_system_menu_text_pointer(in_game_menu.time) + ldx.w #0x52E + 2 + load_system_menu_text_pointer(in_game_menu.time) ; disable Save text *=0x018939 - jmp.l disable_save + jmp.l disable_save -; Moves the classes on the left +; Moves the classes on the next line *=0x018C1A - adc.w #0x0000 + adc.w #0x0040 + +;*=0x0188d0 +; ldx.w #0x02CE *=0x018FD3 jsr.l load_classes_pointer - nop - sta 0x45 - xba - sta 0x46 - ldx 0x45 - lda #0x0F + nop + sta 0x45 + xba + sta 0x46 + ldx 0x45 + lda #0x0F *=0x018fe3 { @@ -45,88 +49,118 @@ load_next_char: lda.l assets_classes_dat, x beq end ; dakuten - jsr.w 0x8E32 - sta.w 0x0000, y - xba - sta.w 0x0040, y - iny - lda.b 0x34 - sta.w 0x0000, y - sta.w 0x0040, y - inx - iny - bra load_next_char + nop + nop + nop + ;jsr.w 0x8E32 + nop + nop + nop + ; sta.w 0x0000, y + ;xba + sta.w 0x0040, y + iny + lda.b 0x34 + nop + nop + nop + ;sta.w 0x0000, y + sta.w 0x0040, y + inx + iny + + bra load_next_char end: rts } +*=0x0189b9 +; Level offset + adc.w #0x0044 + +*=0x018a03 +draw_hp_mp = 0x018a2a + lda.w #0x0046 + 0x40 + ldy.w #0x0007 ; current hp + jsr.w draw_hp_mp + lda.w #0x0050 + 0x40 + ldy.w #0x0009 ; max hp + jsr.w draw_hp_mp + lda.w #0x0086 + 0x40 + ldy.w #0x000b ; current mp + jsr.w draw_hp_mp + lda.w #0x0090 + 0x40 + ldy.w #0x000d ; max mp + jsr.w draw_hp_mp + ; LEVEL *=0x0189C3 { - level_offset = 7 * 2 - lda #0x90 - sta.w 0+level_offset, x - lda #0x91 - sta.w 2+level_offset, x - lda #0x92 - sta.w 4+level_offset, x - lda #0x93 - sta.w 6+level_offset, x - nop + level_offset = 7 * 2 + lda #0xFF + sta.w 0+level_offset, x + lda #0x4F ; N + sta.w 2+level_offset, x + lda #0x57 ; V + sta.w 4+level_offset, x + lda #0xFF ; V + sta.w 6+level_offset, x + nop - lda #0x57 ; H 49 V 57 - sta.w 0x40 + 2,X - lda #0x51 ; P - sta.w 0x42 - 2,X - sta.w 0x82 -2 ,X - lda #0x4E ; M - sta.w 0x80 + 2,X - lda #0xC7 ; / - sta.w 0x4E,X - sta.w 0x8E,X + lda #0x57 ; H 49 V 57 + sta.w 0x40 + 2 + 0x40,X + lda #0x51 ; P + sta.w 0x42 - 2 + 0x40,X + sta.w 0x82 -2 + 0x40 ,X + lda #0x4E ; M + sta.w 0x80 + 2 + 0x40,X + lda #0xC7 ; / + sta.w 0x4E + 0x40,X + sta.w 0x8E + 0x40,X } ; Moves the level down in the digest *=0x0189FA - sta.w 0x0016,X - xba - sta.w 0x0018,X + sta.w 0x0016,X + xba + sta.w 0x0018,X -; deplacement du nom du perso +;; Move character name. *=0x0183D5 - sta.w 0x0040,Y + sta.w 0x0000, y xba - sta.w 0x0080,Y + sta.w 0x0040, y + +;*=0x018b6b +; lda #0x42 + -; gils offset ; very bad idea it's used to display numbers everywhere -;*=0x018FAF -; adc.w #0x0052 ; Time offset *=0x018BC1 - lda.b #0x80 - STA.W 0x0578,Y - XBA - STA.W 0x057A,Y - REP #0x20 - LDA.B 0x73 - SEP #0x20 - JSR.W 0x81D6 - LDA.B 0x5B - STA.W 0x0570,Y - LDA.B 0x5D - STA.W 0x0572,Y - LDA.B 0x5E - STA.W 0x0574,Y - LDA.B #0xC8 - STA.W 0x0576,Y + lda.b #0x80 + STA.W 0x0578,Y + XBA + STA.W 0x057A,Y + REP #0x20 + LDA.B 0x73 + SEP #0x20 + JSR.W 0x81D6 + LDA.B 0x5B + STA.W 0x0570,Y + LDA.B 0x5D + STA.W 0x0572,Y + LDA.B 0x5E + STA.W 0x0574,Y + LDA.B #0xC8 + STA.W 0x0576,Y } ; main menu spells ; length of spells names *=0x01B345 - lda.b #0x07 + lda.b #0x07 ; compute spell pointer ;01b319 rep #0x20 @@ -151,3 +185,43 @@ end: tay sep #0x20 lda.b #assets_magic_dat >> 16 + + +; save 0x200 more data from field to properly handle render buffer 0x200. +; There's a buffer nearby we'll probably use an aditional buffer +;*=0x14ff90 +; ldx.w #0x1000 + render.buffer_size +;*=0x14ffeb +; ldx.w #0x1000 + render.buffer_size + +; patches the save vram function to save the 0x200 extra vram used by small vwf +*=0x01873a + jsr.l vram_copy.save_dialog_vram_far + rts + +; patches the restore vram function to restore the 0x200 saved to the cartdrige ram +*=0x01873f + phb + jsr.l vram_copy.restore_dialog_gfx_far + + + +;*=0x1efe1f +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x0 +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x1 +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x2 +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x3 +; .dw 0xff00,0xff00,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700,0x4800,0x4900,0x4A00,0x4B00,0x4C00,0x4D00,0x4E00,0x4F00 ;0x4 +; .dw 0x5000,0x5100,0x5200,0x5300,0x5400,0x5500,0x5600,0x5700,0x5800,0x5900,0x5A00,0x5B00,0x5C00,0x5D00,0x5E00,0x5F00 ;0x5 +; .dw 0x6000,0x6100,0x6200,0x6300,0x6400,0x6500,0x6600,0x6700,0x6800,0x6900,0x6A00,0x6B00,0x6C00,0x6D00,0x6E00,0x6F00 ;0x6 +; .dw 0x7000,0x7100,0x7200,0x7300,0x7400,0x7500,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x7 +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x8 +; .dw 0x608C,0x608D,0x608E,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0x9 +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xA +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xB +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xC +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xD +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff ;0xE +; .dw 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xff00 ;0xF + + diff --git a/src/ingame/menus.i b/src/ingame/menus.i index b5a797a..c604c6c 100644 --- a/src/ingame/menus.i +++ b/src/ingame/menus.i @@ -3,3 +3,5 @@ .include 'src/ingame/options.s' .include 'src/ingame/status.s' .include 'src/ingame/magic.s' +.include 'src/ingame/shop.s' +.include 'src/ingame/equip.s' diff --git a/src/ingame/options.s b/src/ingame/options.s index 239355b..9c8ebb0 100644 --- a/src/ingame/options.s +++ b/src/ingame/options.s @@ -1,25 +1,27 @@ ;RGB -> RVB :o) *=0x01D1BB - lda.b #0x57 + lda.b #0x57 ; déplacement du curseur principal des options *=0x01D247 - lda.b #0x00 + lda.b #0x00 ; Cursor offset in controls menu (x) *=0x01D4E6 - lda.b #0x03 + lda.b #0x03 -;y +; cursor y *=0x01D4E2 - adc.b #0x4C + adc.b #0x4C *=0x01D1B0 - load_system_menu_text_pointer(options.title) + load_system_menu_text_pointer(options.title) *=0x01D1A4 - load_system_menu_text_pointer(options.config) + load_system_menu_text_pointer(options.config) + ;jsr.w draw_window_and_vwf_message + ; move controls title window *=0x01E204 @@ -33,4 +35,4 @@ ; controles *=0x01D48D - load_system_menu_text_pointer(options.controls) + load_system_menu_text_pointer(options.controls) diff --git a/src/ingame/shop.s b/src/ingame/shop.s new file mode 100644 index 0000000..9d10b75 --- /dev/null +++ b/src/ingame/shop.s @@ -0,0 +1,100 @@ +.include 'src/ingame/macros.i' + +; move gils window +*=0x1dea6 + menu_window(23,4,7,3) + +; move character 1 tile below +*=0x1deba + menu_window(23,9,7,11) + +; message window +*=0x01deaa + menu_window(1,4,20,3) + +; list window +*=0x01deb6 + menu_window(1,8,21,17) + + +; Moves gils 7 digits 2 tiles to the right. +*=0x1c3f5 + ldy.w #0x01a6 + 8 + +; ギル : gils +*=0x01C3EC + load_system_menu_text_pointer(shops.gils) + +*=0x01C350 + load_system_menu_text_pointer(shops.welcome_and_actions) + +*=0x01C43F + load_system_menu_text_pointer(shops.quantity) + +*=0x01c7e4 + load_system_menu_text_pointer(shops.quantity) + +*=0x01C568 + load_system_menu_text_pointer(shops.gils + 2) + +; Buy menu +; quantity hand pointer position "10" +*=0x01cb12 + ldx #0x3058 + 48 + +; quantity hand pointer position "1" +*=0x01cb17 + ldx.w #0x3040 + 54 + +; Sell menu +*=0x01c80b + ldx.w #0x3058 + 48 + +*=0x01c810 + ldx.w #0x3040 + 54 + +{ +; the 10 is drawn using a draw number function while the 1 is in the text. +; the 10 is dynamic if you place the cursor on 10 and press X it'll increase the number (10 increments) + +_quantity_10_position = 0x019a + 12 + +; Sell menu +*=0x01c81e + ldy.w #_quantity_10_position + +; Buy menu +*=0x01c464 + ldy.w #_quantity_10_position + +} + +; Changes the offset of the hand pointer +*=0x01C37C + lda 0x1B79 + asl + asl + asl + asl + sta 0x45 + asl + adc 0x45 + nop + nop + sta 0x45 + +*=0x01920a + ; shop party sprite positions + ; Attack formation 3 front, 2 back + .db 0x00+8,0x1c+8 + .db 0x00+8,0x00+8 + .db 0x00+8,0x38+8 + .db 0x18+8,0x0c+8 + .db 0x18+8,0x2c+8 + + ; Defense formation 3 back, 2 front + .db 0x18+8,0x1c+8 + .db 0x18+8,0x00+8 + .db 0x18+8,0x38+8 + .db 0x00+8,0x0c+8 + .db 0x00+8,0x2c+8 diff --git a/src/ingame/status.s b/src/ingame/status.s index ef6422e..10fe749 100644 --- a/src/ingame/status.s +++ b/src/ingame/status.s @@ -1,15 +1,19 @@ ;décalage du nom vers le haut -*=0x01A9B7 - ldy.w #0x0044 +;*=0x01A9B7 +; ldy.w #0x0044 *=0x01A99E - load_system_menu_text_pointer(status.status) + load_system_menu_text_pointer(status.status) *=0x01AAE9 - load_system_menu_text_pointer(status.exp_for_next_level) + load_system_menu_text_pointer(status.exp_for_next_level) *=0x01ABBC - load_system_menu_text_pointer(status.char_stats) + load_system_menu_text_pointer(status.char_stats) *=0x01A9CA - ldy.w #0x15C - 0x80 \ No newline at end of file + ldy.w #0x15C - 0x80 + +*=0x1aab3 + jsr.l load_dextrelity_pointer + jmp.w 0x1aac9 diff --git a/src/menus/in_game_text.s b/src/menus/in_game_text.s index 848d8e5..56bdcd6 100644 --- a/src/menus/in_game_text.s +++ b/src/menus/in_game_text.s @@ -1,226 +1,238 @@ +.include 'src/ingame/macros.i' + .scope in_game_menu { menu: - ; window - .dw 0x002E, 0x1107 - ; position - .dw 0x0070 - .text 'Objets' - .db 0x01 - .dw 0x00F0 - .text 'Sorts' - .db 0x01 - .dw 0x0170 - .text 'Equiper' - .db 0x01 - .dw 0x01F0 - .text 'Statut' - .db 0x01 - .dw 0x0270 - .text 'Placer' - .db 0x01 - .dw 0x02F0 - .text 'Changer' - .db 0x01 - .dw 0x0370 - .text 'Options' - .db 0x01 - .dw 0x03F0 - .text 'Sauver' - .db 0 + ; window + .dw 0x002E, 0x1107 + ; position + .dw 0x0070 + .text 'Objets' + .db 0x01 + .dw 0x00F0 + .text 'Magie' + .db 0x01 + .dw 0x0170 + .text 'Equiper' + .db 0x01 + .dw 0x01F0 + .text 'Statut' + .db 0x01 + .dw 0x0270 + .text 'Placer' + .db 0x01 + .dw 0x02F0 + .text 'Changer' + .db 0x01 + .dw 0x0370 + .text 'Options' + .db 0x01 + .dw 0x03F0 + .text 'Sauver' + .db 0 gils: - .text 'Gils' - .db 0 + .text 'Gils' + .db 0 time: - .text 'TEMPS' - .db 0 + .text 'Temps' + .db 0 } .scope items_menu { - item: - .db 2 - .db 0 - .db 7 - .db 3 - - .dw 0x0044 - .text 'Objets' - .db 0 - notuse: - .dw 0x0052 - .text 'Impossible à utiliser.' - .db 0 + item: + .db 2 + .db 0 + .db 7 + .db 3 + + .dw 0x0044 + .text 'Objets' + .db 0 + notuse: + .dw 0x0052 + .text 'Impossible à utiliser.' + .db 0 } .scope spells { - white: - .dw 0x00EE - .text 'Blanc' - .db 0 - black: - .dw 0x016E - .text 'Noir' - .db 0 - summon: - .dw 0x01EE - .text 'Chimere' - .db 0 - ninja: - .dw 0x016E - .text 'Ninja' - .db 0 - kokan: - .dw 0x0054 - .text 'Echange' - .db 0 - mp_needed: - .text 'Coût PM' - .db 0 + white: + .dw 0x00EE + .text 'Sorts' + .db 0 + black: + .dw 0x016E + .text 'Rituel' + .db 0 + summon: + .dw 0x01EE + .text 'Chimere' + .db 0 + ninja: + .dw 0x016E + .text 'Ninja ' + .db 0 + kokan: + .dw 0x0054 + .text 'Echange' + .db 0 + mp_needed: + .text 'Coût PM' + .db 0 } .scope status { status: - .dw 0x01F0 - .text 'Statut' - .db 0 + .dw 0x01F0 + .text 'Statut' + .db 0 exp_for_next_level: - .dw 0x0260 - .text 'Niveau suivant' - .db 0 + .dw 0x0260 + .text 'Niveau suivant' + .db 0 char_stats: - .dw 0x0114 - 0x80 -{ - .table 'text/vwf_precomp.tbl' - .text 'Niveau' -} - .db 1 - .dw 0x01A0 - .text 'Expérience' - .db 1 + .dw 0x0114 - 0x80 + .text 'Niveau' - .dw 0x0206 - .text 'PV' - .db 1 + .db 1 + .dw 0x01A0 + .text 'Expérience' + .db 1 - .dw 0x0286 - .text 'PM' - .db 1 + .dw 0x0206 + .text 'PV' + .db 1 - .dw 0x0344 - .text 'Talents' - .db 1 + .dw 0x0286 + .text 'PM' + .db 1 - .dw 0x03C2 - .text 'Vigueur' - .db 1 + .dw 0x0344 + .text 'Talents' + .db 1 - .dw 0x0442 - .text 'Agilité' - .db 1 + .dw 0x03C2 + .text 'Vigueur' + .db 1 - .dw 0x04C2 - .text 'Vitesse' - .db 1 + .dw 0x0442 + .text 'Agilité' + .db 1 - .dw 0x0542 - .text 'Esprit' - .db 1 + .dw 0x04C2 + .text 'Vitesse' + .db 1 - .dw 0x05C2 - .text 'Volonté' - .db 1 + .dw 0x0542 + .text 'Esprit' + .db 1 + + .dw 0x05C2 + .text 'Volonté' + .db 1 ;att/def/mag: - .dw 0x035A - .text 'Attaque' - .db 1 + .dw 0x035A + .text 'Attaque' + .db 1 - .dw 0x03DA - .text 'Attaque%' - .db 1 + .dw 0x03DA + .text 'Attaque%' + .db 1 - .dw 0x045A - .text 'Défense' - .db 1 + .dw 0x045A + .text 'Défense' + .db 1 - .dw 0x04DA - .text 'Défense%' - .db 1 + .dw 0x04DA + .text 'Défense%' + .db 1 - .dw 0x055A - .text 'Déf Mag' - .db 1 + .dw 0x055A + .text 'Déf Mag' + .db 1 - .dw 0x05DA - .text 'Déf Mag%' - .db 0 + .dw 0x05DA + .text 'Déf Mag%' + .db 0 } .scope options { title: - .dw 0x0096 - .text 'Options' - .db 0 + .dw 0x0096 + .text 'Options' + .db 0 config: - .dw 0x0102, 0x141C + .dw 0x0102, 0x141C + + .dw 0x0144 + .text 'Mode Combat' + + .db 0x01 + .dw 0x015E + + .text 'Actif Pause' + + .db 0x01 + .dw 0x01C4 + + .text 'Vit. Combat' + + .db 0x01 + .dw 0x021E + + .text 'Vite Lent' + + .db 0x01 + .dw 0x0244 + + .text 'Vit. Texte' + + .db 0x01 + .dw 0x02C4 + + .text 'Audio' + + .db 0x01 + .dw 0x02DE - .dw 0x0144 - .text 'Mode Combat' - .db 0x01 + .text 'Stéréo Mono' - .dw 0x015E - .text 'Actif Pause' - .db 0x01 + .db 0x01 + .dw 0x0344 - .dw 0x01C4 - .text 'Vit. Combat' - .db 0x01 + .text 'Contrôle' - .dw 0x021E - .text 'Vite Lent' - .db 0x01 + .db 0x01 + .dw 0x035E - .dw 0x0244 - .text 'Vit. Texte' - .db 0x01 + .text 'Normal Perso.' - .dw 0x02C4 - .text 'Audio' - .db 0x01 + .db 0x01 + .dw 0x03DE - .dw 0x02DE - .text 'Stéréo Mono' - .db 0x01 + .text 'Seul Multiple' - .dw 0x0344 - .text 'Contrôle' - .db 0x01 + .db 0x01 + .dw 0x0444 - .dw 0x035E - .text 'Normal Perso.' - .db 0x01 + .text 'Curseur' - .dw 0x03DE - .text 'Seul Multiple' - .db 0x01 + .db 0x01 + .dw 0x045E - .dw 0x0444 - .text 'Curseur' - .db 0x01 + .text 'Reset Mémoire' - .dw 0x045E - .text 'Reset Mémoire' - .db 0x01 + .db 0x01 + .dw 0x04C4 - .dw 0x04C4 - .text 'Couleur' - .db 0 + .text 'Couleur' + .db 0 controls: @@ -228,27 +240,97 @@ controls: .text 'Personaliser' .db 0x01 - .dw 0x0204 - .text 'Action' - .db 0x01 + .dw 0x0204 + .text 'Action' + .db 0x01 + + .dw 0x0284 + .text 'Annuler' + .db 0x01 + + .dw 0x0304 + .text 'Menu' + .db 0x01 + + .dw 0x0384 + .text 'Left Button' + .db 0x01 - .dw 0x0284 - .text 'Annuler' - .db 0x01 + .dw 0x0404 + .text 'Start' + .db 1 - .dw 0x0304 - .text 'Menu' - .db 0x01 + .dw 0x0484 + .text 'Fin' + .db 0 +} + +.scope equip { +menu: + _text_y = 1 + menu_window(0, 0, 30, 11) + move_to(13, 0 + _text_y) + .text 'M. Droite' + .db 0x01 + move_to(13, 2 + _text_y) + .text 'M. Gauche' + .db 0x01 + move_to(13, 4 + _text_y) + .text 'Tête' + .db 0x01 + move_to(13, 6 + _text_y) + .text 'Corps' + .db 0x01 + move_to(13, 8 + _text_y) + .text 'Mains' + .db 0 + + +} +.scope dextrality { +hands: +string_0: +; ぶきよう + .text 'String 0' + .db 0 +string_1: +; ひだりきき + .text 'Gaucher' + .db 0 +string_2: +; みぎきき + .text 'Droiter' + .db 0 +string_3: +; りょうきき + .text 'Ambidextre' + .db 0 +} + +.scope messages { +use_on_whom: + move_to(10, 1) + .text 'Utiliser sur qui ?' + .db 0 +cantuse: + move_to(10, 1) + .text 'Cet objet ne peut être utilisé ici.' + .db 0 +cant_use_magic: + menu_window_move_text(7, 12, 14, 1) + .text 'Ne peut utiliser la magie' + .db 0 +} - .dw 0x0384 - .text 'Left Button' - .db 0x01 - .dw 0x0404 - .text 'Start' - .db 1 - .dw 0x0484 - .text 'Fin' - .db 0 +.scope use_spell { +mp_cost: + move_to(1, 4) + .text 'Requis' + .db 0 +; use_on_whom: +; move_to(1, 10) +; .text 'Sur qui ?' +; .db 0 } diff --git a/src/menus/start_screen_text.s b/src/menus/start_screen_text.s index ce40ff6..c03429d 100644 --- a/src/menus/start_screen_text.s +++ b/src/menus/start_screen_text.s @@ -1,40 +1,52 @@ +.include 'src/ingame/macros.i' + .scope newgame { new_game: - .dw 0x0042 ; text position - .text 'Nouvelle partie' - .db 0 + move_to(1, 1) + .text 'Nouvelle partie' + .db 0 time_load_save: - .dw 0x046E - .text 'TEMPS' - .db 0 + .dw 0x046E + 2 + .text 'Temps' + .db 0 gils_load_game: - .text 'Gils' - .db 0 + .text 'Gils' + .db 0 save: - .text 'Partie' - .db 0 + .text 'Partie' + .db 0 load_this_save: - .dw 0x006E - .text 'Cette' - .db 1 - .dw 0x00EE - .text 'partie?' - .db 0 + .dw 0x006E + 2 + .text 'Cette' + .db 1 + .dw 0x00EE + 2 + .text 'partie?' + .db 0 yes_no: - .dw 0x0172 - .text 'Oui' - .db 1 - .dw 0x01F2 - .text 'Non' - .db 0 + .dw 0x0172 + .text 'Oui' + .db 1 + .dw 0x01F2 + .text 'Non' + .db 0 empty_save: - .db 0x90 + 2, 0x00 - .text 'VIDE' - .db 0 -} \ No newline at end of file + .dw 0x0090 + 2 + .text 'VIDE' + .db 0 + +saves: + move_to(1, 1) + .text 'Sauvegardes' + .db 0 + +did_not_save: + move_to(1, 1) + .text 'Annulation ' ; extra space at the end to clear the previous title. + .db 0 +} diff --git a/src/menus/tools_shop_text.s b/src/menus/tools_shop_text.s index 16b2464..4df34c0 100644 --- a/src/menus/tools_shop_text.s +++ b/src/menus/tools_shop_text.s @@ -1,30 +1,33 @@ +.include 'src/ingame/macros.i' + .scope shops { gils: - .dw 0x0176 ; - 4 - { - .table 'text/vwf_precomp.tbl' - .text 'Gils' - } - .db 0 + ;.dw 0x0176 ; - 4 + move_to(27, 6) +; { +; .table 'text/vwf_precomp.tbl' + .text 'Gils' +; } + .db 0 welcome_and_actions: - .dw 0x0054 - 2 - .text 'Puis-je vous aider ?' - ;.text 'いらっしゃい! どんなごようけんで?' - .db 1 - .dw 0x0148 - 4 - .text 'Achat Vente Sortir' - .db 0 - ;.text 'かう うる でる' + .dw 0x0054 - 2 + .text 'Puis-je vous aider ?' + ;.text 'いらっしゃい! どんなごようけんで?' + .db 1 + .dw 0x0148 - 4 + .text 'Achat Vente Sortir' + .db 0 + ;.text 'かう うる でる' quantity: - .dw 0x0052 - .text 'Que désirez vous ?' - .db 1 - .dw 0x0144 - .text 'Quantité' - .db 1 - .dw 0x0146 + 8 * 2 - .text '1' - .db 0 + .dw 0x0052 + .text 'Que désirez vous ?' + .db 1 + .dw 0x0144 + .text 'Quantité' + .db 1 + .dw 0x0146 + 14 * 2 + .text '1' + .db 0 } From 2fc2231d112c25350747221d98d6a08d2256bc7f Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:24:59 +0200 Subject: [PATCH 31/52] Updates new game screen. --- src/new_game.s | 61 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/src/new_game.s b/src/new_game.s index 73e2c02..eb5fc9f 100644 --- a/src/new_game.s +++ b/src/new_game.s @@ -1,43 +1,74 @@ +.include 'src/ingame/macros.i' + .table 'text/ff4_menus.tbl' { ; new game window *=0x01dfc7 - .db 0x12 ; width - .db 0x02 ; height + .db 0x12 ; width + .db 0x02 ; height ; Cecil sprite position on the new game item *=0x019904 - .db 0x85 ; x - .db 0x04 ; y + .db 0x85 ; x + .db 0x04 ; y + + +; load game message window +*=0x01dfdc + menu_window(23,0,7,8) + +;LoadTimeWindow: +*=0x01dfe0 + menu_window(23,16,7,5) + +;LoadGilWindow: +*=0x01dfe4 + menu_window(23,23,7,3) ; save number display *=0x019A62 - sta.w 0xC8 - 0x40 + 8 ,y + sta.w 0xC8 - 0x40 + 8 ,y *=0x019A55 - ldx.w #0x82 - 0x40 + ldx.w #0x82 - 0x40 *=0x019A52 - load_system_menu_text_pointer(newgame.save) + load_system_menu_text_pointer(newgame.save) *=0x01962E - load_system_menu_text_pointer(newgame.new_game) + load_system_menu_text_pointer(newgame.new_game) *=0x019826 - load_system_menu_text_pointer(newgame.load_this_save) + load_system_menu_text_pointer(newgame.load_this_save) *=0x01982C - load_system_menu_text_pointer(newgame.yes_no) -; + load_system_menu_text_pointer(newgame.yes_no) + *=0x01983E - load_system_menu_text_pointer(newgame.time_load_save) + load_system_menu_text_pointer(newgame.time_load_save) *=0x01984D - load_system_menu_text_pointer(newgame.gils_load_game) - ldx.w #0x674 + load_system_menu_text_pointer(newgame.gils_load_game) + ; gils text position + ldx.w #0x676 + jsr.w 0x82cd ; menu_draw_text + ; gils count position + ldy #0x062c + 2 + +; Time position +*=0x019838 + ldy.w #0xcb2e + 2 *=0x019AC5 load_system_menu_text_pointer(newgame.empty_save) -} \ No newline at end of file + +*=0x01cbad + load_system_menu_text_pointer(newgame.saves) + +*=0x1cc12 + load_system_menu_text_pointer(newgame.did_not_save) + + +} From 0582b555f6e38240d5e592ec3b5ce94ca9664f6e Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:25:25 +0200 Subject: [PATCH 32/52] Update place names. --- src/places_names.s | 56 +++++++++++++++++++-------------------- src/places_names_window.s | 4 +-- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/places_names.s b/src/places_names.s index 59cb75a..a659802 100644 --- a/src/places_names.s +++ b/src/places_names.s @@ -1,77 +1,77 @@ { place_name_length = 0x1A *=0x00B90E - lda.b #place_name_length + lda.b #place_name_length *=0x00B922 - cpx.b #place_name_length + cpx.b #place_name_length *=0x00B8F1 - lda.l assets_places_names_dat, x + lda.l assets_places_names_dat, x *=0x00B901 - lda.l assets_places_names_dat, x + lda.l assets_places_names_dat, x *=0x00B92C - lda.l assets_places_names_dat, x + lda.l assets_places_names_dat, x *=0x00B938 - sta.w 0x774 + place_name_length, y + sta.w 0x774 + place_name_length, y *=0x00B91E - sta.w 0x774 + place_name_length, x + sta.w 0x774 + place_name_length, x ; window transfer related stuff *=0x00B963 - lda.l places_top_window, x + lda.l places_top_window, x *=0x00B96B - lda.l places_top_window, x + lda.l places_top_window, x *=0x00B973 - cpx.w #0x003C ;place_name_length * 2 + 8 + cpx.w #0x003C ;place_name_length * 2 + 8 ;.00:B98D LDA $780,X *=0x00B98D - lda.w 0x774 + place_name_length, x + lda.w 0x774 + place_name_length, x *=0x00B999 - cpx.w #place_name_length + cpx.w #place_name_length *=0x00B9D1 - cpx.w #place_name_length + cpx.w #place_name_length *=0x00B9F6 - lda.l places_bottom_window, x + lda.l places_bottom_window, x *=0x00B9FE - lda.l places_bottom_window, x + lda.l places_bottom_window, x *=0x00BA06 - cpx.w #0x003C; place_name_length + 8 + cpx.w #0x003C; place_name_length + 8 vram_ptr = 0x2840 + 1 *=0x00B95A - ;.00:B95A LDX #$2848 ; top window - ldx.w #vram_ptr + ;.00:B95A LDX #$2848 ; top window + ldx.w #vram_ptr *=0x00B978 - ;.00:B978 LDX #$2868 ; left window piece - ldx.w #vram_ptr + 0x20 + ;.00:B978 LDX #$2868 ; left window piece + ldx.w #vram_ptr + 0x20 *=0x00B99E - ;.00:B99E LDX #$2876 ; right window piece - ldx.w #vram_ptr + 0x20 + place_name_length + 2 + ;.00:B99E LDX #$2876 ; right window piece + ldx.w #vram_ptr + 0x20 + place_name_length + 2 *=0x00B9B0 - ;.00:B9B0 LDX #$2888 ; left window piece - ldx.w #vram_ptr + 0x40 + ;.00:B9B0 LDX #$2888 ; left window piece + ldx.w #vram_ptr + 0x40 *=0x00B9D6 - ;.00:B9D6 LDX #$2896 ; right window piece - ldx.w #vram_ptr + 0x40 + place_name_length + 2 + ;.00:B9D6 LDX #$2896 ; right window piece + ldx.w #vram_ptr + 0x40 + place_name_length + 2 *=0x00B9ED - ;.00:B9ED LDX #$28A8 ; bottom window - ldx.w #vram_ptr + 0x60 + ;.00:B9ED LDX #$28A8 ; bottom window + ldx.w #vram_ptr + 0x60 } diff --git a/src/places_names_window.s b/src/places_names_window.s index 1c55775..7e4a646 100644 --- a/src/places_names_window.s +++ b/src/places_names_window.s @@ -1,4 +1,4 @@ places_top_window: - .db 0x16, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x18, 0x20 + .db 0x16, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x17, 0x20, 0x18, 0x20 places_bottom_window: - .db 0x1B, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1D, 0x20 + .db 0x1B, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x1D, 0x20 From 4cef8386a4058af5ae64ad5a24c399fc9629aacd Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:27:12 +0200 Subject: [PATCH 33/52] Update system menu text module. --- src/system_menus_text.i | 12 ++-- src/system_menus_text.s | 123 ++++++++++++++++++++++------------------ 2 files changed, 75 insertions(+), 60 deletions(-) diff --git a/src/system_menus_text.i b/src/system_menus_text.i index bb8f4e6..04b81b4 100644 --- a/src/system_menus_text.i +++ b/src/system_menus_text.i @@ -1,17 +1,17 @@ .macro load_system_menu_text_pointer(pointer) { - ldy.w #pointer - 0x8000 + ldy.w #pointer - 0x8000 } { *=0x018301 - jmp.l display_text_in_menus + jmp.l display_text_in_menus *=0x0182CD - jmp.l load_text_with_destination_in_x + jmp.l load_text_with_destination_in_x *=0x0180D9 - jmp.l display_window_with_text + jmp.l display_window_with_text *=0x018798 - jmp.l display_time -} \ No newline at end of file + jmp.l display_time +} diff --git a/src/system_menus_text.s b/src/system_menus_text.s index 765ac03..d2e5d5b 100644 --- a/src/system_menus_text.s +++ b/src/system_menus_text.s @@ -1,27 +1,27 @@ .macro bank_switch() { - cpy.w #0x8000 - bmi moved_text - lda.b #0x01 - pha - bra jump_to_original + cpy.w #0x8000 + bmi moved_text + lda.b #0x01 ; this assumes we shoud load data from bank 1 + pha + bra jump_to_original moved_text: - pha - rep #0x20 - tya - adc.w #0x8000 - tay - sep #0x20 - pla - phk + pha + rep #0x20 + tya + adc.w #0x8000 + tay + sep #0x20 + pla + phk ; this assumes that the text lives in the same bank as this routine. jump_to_original: - plb + plb } .macro bank_switch_with_jump(jump_to) { - bank_switch() - jmp.l jump_to + bank_switch() + jmp.l jump_to } @@ -29,61 +29,60 @@ display_text_in_menus: { phb - phd - phx - ldx.w #0x100 - phx - pld + phd + phx + ldx.w #0x100 + phx + pld - bank_switch_with_jump(0x01830B) + bank_switch_with_jump(0x01830B) } load_text_with_destination_in_x: - phb - phd - phx - phx - ldx.w #0x0100 - phx - pld - plx - + phb + phd + phx + phx + ldx.w #0x0100 + phx + pld + plx - rep #0x20 + rep #0x20 - txa - clc - adc 0x29 - tax - sep #0x20 + txa + clc + adc 0x29 + tax + sep #0x20 - bank_switch_with_jump(0x018318) + bank_switch_with_jump(0x018318) display_window_with_text: - phy - phb - bank_switch_with_jump(0x0180DD) + phy + phb + bank_switch_with_jump(0x0180DD) display_time: - phb - bank_switch() - rep #0x20 - jmp.l 0x01879D + phb + bank_switch() + rep #0x20 + jmp.l 0x01879D disable_save: - lda.b #0x24 - sta 0xCA31 ;S - sta 0xCA33 ;a - sta 0xCA35 ;u - sta 0xCA37 ;v - sta 0xCA39 ;e - sta 0xCA3B ;r - jmp.l 0x018947 + lda.b #0x24 + sta 0xCA31 ;S + sta 0xCA33 ;a + sta 0xCA35 ;u + sta 0xCA37 ;v + sta 0xCA39 ;e + sta 0xCA3B ;r + jmp.l 0x018947 load_classes_pointer: - phx + phx rep #0x20 and.w #0x00FF @@ -96,3 +95,19 @@ load_classes_pointer: plx rtl +load_dextrelity_pointer: + rep #0x20 + lda (0x60) + and.w #0x00c0 + lsr + lsr + lsr + lsr + lsr + phx + tax + lda.l 0x01e2d9, x + plx + tay + sep #0x20 + rtl From ed93c7a54106325bfffc949ea4e082a18e4ee3ce Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:27:35 +0200 Subject: [PATCH 34/52] Updates vwf module formating. --- src/vwf.s | 182 +++++++++++++++++++++++++++--------------------------- 1 file changed, 90 insertions(+), 92 deletions(-) diff --git a/src/vwf.s b/src/vwf.s index 7fbae43..a6a4a37 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -28,7 +28,7 @@ vwfstart: font_addr = var_base + 10 ; 11 12 ; scroll = var_base + 10 ; vsize = var_base + 12 - font_length = var_base + 13 ; 14 15 + font_length = var_base + 13 ; 14 15 winstate = var_base + 16 nchars = var_base + 18 pixel_c = var_base + 20 @@ -56,7 +56,7 @@ vwfstart: save_16_bit_var(TILEPOS, ram_mirror) plp - + LDA.B #0x01 STA.B winstate @@ -70,9 +70,9 @@ vwfstart: dma_transfer_to_vram_call(WRAM,vram_tile_set_pointer,0x0690,0x1801) jsr.w wait_for_vblank dma_transfer_to_vram_call(WRAM,vram_tile_set_pointer+0x348,0x0690,0x1801) - jsr.w wait_for_vblank ; copy the old font tileset + jsr.w wait_for_vblank dma_transfer_to_vram_call(0x0AF000,0x6000, 0x800, 0x1801) jsr.w wait_for_vblank dma_transfer_to_vram_call(0x0AF000+0x800,0x6000+0x400, 0x800, 0x1801) @@ -86,15 +86,15 @@ vwfstart: JSR.W ChargeLettre BRA firstrun - -main: + +main: JSR.W ChargeLettreInc - + firstrun: JMP.W parse BRA main fin: - lda #0x01 + lda #0x01 sta 0xDE rtl @@ -108,23 +108,23 @@ parse: CMP #0x00 BNE _nxt1 JMP.W fin - + _nxt1: CMP #0x01 BNE _nxt2 JMP.W newline - -_nxt2: + +_nxt2: CMP #0x02 BNE _nxt3 JMP.W space - + _nxt3: ;Changement de Musique CMP #0x03 BNE _nxt4 JMP.W musique - + _nxt4: ; Nom des personages CMP #0x04 @@ -135,7 +135,7 @@ _nxt5: ; Delay avant de fermer ? CMP #0x05 BNE _nxt6 - JMP.W _code05 + JMP.W _code05 _nxt6: ; it might lack 06 and 07 text opcodes @@ -151,7 +151,7 @@ _nxt6: CMP #0x08 BNE _nxt9 JMP.W _code08 - + _nxt9: CMP #0xFB BNE _nxtFB @@ -162,8 +162,8 @@ _nxtFB: BNE _nxtFC JMP.W suit3 _nxtFC: - cmp #0xFE - bne _nxtFE + cmp #0xFE + bne _nxtFE jsr.w ChargeLettreInc jsr.w setup_font jmp.w main @@ -172,20 +172,20 @@ _nxtFE: BNE _nxtFF JMP.W retour_auto - + _nxtFF: ; on fabrique le pointeur de font et le pointeur vers la wram ;retour auto a ajouter ici - + return_a: JSR.W makeptr JSR.W ShiftNew JSR.W wdisplay JMP.W main - - + + ;*********** ;** Space ** ;*********** @@ -248,7 +248,7 @@ _loop_B5D2: ;Nouveau Cadre ;================================ -;nouveau_cadre: +;nouveau_cadre: ; dma_transfer_to_vram_call(winmap, vram_tile_map_pointer, 0x2C0, 0x1801) ; STZ.B TILEPOS ; JSR.W incpointer @@ -260,10 +260,10 @@ _loop_B5D2: ;**************** display_character_name: { -; pha -; lda.b #3 -; jsr.w setup_font -; pla +; pha +; lda.b #3 +; jsr.w setup_font +; pla JSR.W ChargeLettreInc ASL STA.B 0x30 @@ -275,7 +275,7 @@ display_character_name: LDX.B 0x30 LDY.W #0x0000 - + next: LDX.B 0x30 LDA 0x1500,X @@ -299,10 +299,10 @@ suite: BEQ exit JMP.W next exit: -; pha -; lda.b #0 -; jsr.w setup_font -; pla +; pha +; lda.b #0 +; jsr.w setup_font +; pla JMP.W main } ;******************** @@ -323,7 +323,7 @@ newline: ;Second line CMP #0x1A+1 BCS suit - + LDA.B #0x1A STA.B TILEPOS BRA end @@ -336,7 +336,7 @@ suit: STA.B TILEPOS BRA end suit2: - + ;Forth Line CMP #0x4E+1 BCS suit3 @@ -345,7 +345,7 @@ suit2: STA.B TILEPOS BRA end -suit3: +suit3: STZ.B CURRENT_C STZ.B TILEPOS @@ -469,7 +469,7 @@ Boucle2: SEP #0x20 PHX LDA.B BITSLEFT - + CMP #0x08 BNE _shift PLX @@ -482,18 +482,15 @@ Boucle2: INX XBA BRA _store - + _shift: TAX ; using math multiplication LDA.L vwf_shift_table,X STA.L 0x004202 ; MULTPILIER - + PLX - - ;REP #0x20 - - ;LDA.L assets_font_dat,X + phy txy lda.b [font_addr], y @@ -502,7 +499,7 @@ _shift: INX STA.L 0x004203 ; MULTIPLICAND - + REP #0x20 NOP NOP @@ -523,10 +520,10 @@ _store: TXY PLX INY - + DEC.B CNTR BNE Boucle2 - + PLB PHA PLA @@ -541,14 +538,14 @@ _store: TAX ; LDA.L assets_font_length_table_dat,X - txy - lda.b [font_length], y - tyx + txy + lda.b [font_length], y + tyx STA.B temp - + REP #0x20 CLC - + ADC.B pixel_c INC CLC @@ -565,7 +562,7 @@ loopdec: CMP #0x00 BMI coupe BEQ coupe - + STA.B BITSLEFT RTS @@ -588,30 +585,31 @@ vwf_shift_table: .db 0b10000000 ;8 setup_font: +; A: font index { - phx - pha - asl - sta.b temp - pla - clc - adc.b temp - tax - - rep #0x20 - lda.l font_table, x - sta.b font_addr - lda.l length_table,x - sta.b font_length - sep #0x20 - - lda.l font_table+2, x - sta.b font_addr+2 - lda.l length_table+2,x - sta.b font_length+2 - - plx - rts + phx + pha + asl + sta.b temp + pla + clc + adc.b temp + tax + + rep #0x20 + lda.l font_table, x + sta.b font_addr + lda.l length_table,x + sta.b font_length + sep #0x20 + + lda.l font_table+2, x + sta.b font_addr+2 + lda.l length_table+2,x + sta.b font_length+2 + + plx + rts } ;************************ @@ -619,8 +617,8 @@ setup_font: ;************************ makeptr: - PHA - + PHA + LDX.W #0x0000 LDY.W #0x0000 LDA.B CURRENT_C @@ -668,16 +666,16 @@ lop: INX CPX.W #0x0D10 - + BNE lop - + lop2: - + LDA.B #0x00 STA.W WRAM,X - + INX - + CPX.W #0x0D20 BNE lop2 @@ -734,7 +732,7 @@ add_accumulator_value_to_temp: ADC.B temp STA.B temp SEP #0x20 - + ;else BRA loopchr @@ -755,7 +753,7 @@ retour: STY.W 0x0772 ; restoration de la position du texte PLX JMP.W newline - + noreturn: ;LDA.W #0x0000 SEP #0x20 @@ -773,12 +771,12 @@ waitpad: PHA LDA.B no_wait_for_action BNE nowaitpad - + padloop: LDA.W 0x4218 BEQ padloop BRA end - + nowaitpad: lda.b #0x20 { @@ -805,7 +803,7 @@ wdisplay: ;macro expansion - + PHP PHA PHX @@ -822,17 +820,17 @@ wdisplay: adc.w #vram_tile_set_pointer sta.w 0x2116 - + lda.b oldtilepos clc adc.w #WRAM & 0xFFFF sta.w 0x4372 - + pla sep #0x20 - + channel=7 - + LDX.W #0x1801 STX.W 0x4370 LDA.B #0xFF & (WRAM >> 16) @@ -845,18 +843,18 @@ wdisplay: NOP NOP - + PLX PLA PLP - + LDA.B no_wait_for_action BNE nowindow - + dma_transfer_to_vram_call(winmap, vram_tile_map_pointer, endwinmap-winmap, 0x1801) BRA window - + nowindow: dma_transfer_to_vram_call(intromap, vram_tile_map_pointer, endintromap-intromap, 0x1801) From 15e653183b18334ce566baba0e84142320b929cd Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:28:01 +0200 Subject: [PATCH 35/52] Updates minial_vwf_patches module formatting. --- src/minimal_vwf_patches.s | 98 +++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/src/minimal_vwf_patches.s b/src/minimal_vwf_patches.s index 173c81f..68f25ce 100644 --- a/src/minimal_vwf_patches.s +++ b/src/minimal_vwf_patches.s @@ -3,85 +3,85 @@ ;===================================================================== *=0x00B404 - jsr.l CalculePositionTb - jsr.l PointeurBank1de1 - sta 0xDD - ldx 0x3D - stx 0x0772 - rts + jsr.l CalculePositionTb + jsr.l PointeurBank1de1 + sta 0xDD + ldx 0x3D + stx 0x0772 + rts *=0x00B41D - jsr.l CalculePositionTb - jsr.l PointeurBank1de2 - sta 0xDD - ldx 0x3D - stx 0x0772 - rts + jsr.l CalculePositionTb + jsr.l PointeurBank1de2 + sta 0xDD + ldx 0x3D + stx 0x0772 + rts *=0x00B436 - jsr.l CalculePositionTb - jsr.l PointeurBank3 - sta 0xDD - ldx 0x3D - stx 0x0772 - rts + jsr.l CalculePositionTb + jsr.l PointeurBank3 + sta 0xDD + ldx 0x3D + stx 0x0772 + rts *=0x00B3BB - lda 0x1702 - sta 0x3D - lda 0x1701 - sta 0x3E - jsr.l PointeurBank2 - rts + lda 0x1702 + sta 0x3D + lda 0x1701 + sta 0x3E + jsr.l PointeurBank2 + rts ; nukes the first call of display_script because the text ; has to be rendered before animating the window display *=0x00B32C - jsr.w first_window + jsr.w first_window ; Replace the display_script function by the vwfed one. *=0x00B463 - jsr.l vwfstart - rts + jsr.l vwfstart + rts first_window: - lda 0x01 - sta 0xDE - sta 0xED - rts + lda 0x01 + sta 0xDE + sta 0xED + rts animation_wait_route: - wait_for_nmi_end=0x912F - jsr.w wait_for_nmi_end + wait_for_nmi_end=0x912F + jsr.w wait_for_nmi_end wait_for_open_animation: - lda 0x7F - cmp #0x02 - bne wait_for_open_animation - inc 0xDF - lda 0xDF - cmp #0x08 - bne animation_wait_route - - ; restore tileset position - lda 0x210C + lda 0x7F + cmp #0x02 + bne wait_for_open_animation + inc 0xDF + lda 0xDF + cmp #0x08 + bne animation_wait_route + + ; restore tileset position + lda 0x210C and #0xF0 clc adc #0x02 sta 0x210C - jmp.w end_of_animation + jmp.w end_of_animation ; do not scroll between text blocks *=0x00B370 - lda #0x00 - sta 0x07 - jmp.w 0xB398 + lda #0x00 + sta 0x07 + jmp.w 0xB398 *=0x00B335 - jmp.w animation_wait_route + jmp.w animation_wait_route end_of_animation: - jmp.w 0xB369 ; skip_wait_for_action_button + jmp.w 0xB369 ; skip_wait_for_action_button From df5abfe6a907610bea0232cf79078be06110df06 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:28:24 +0200 Subject: [PATCH 36/52] Updates limbz module formatting. --- src/libmz.i | 67 +++++++++-------- src/libmz.s | 207 ++++++++++++++++++++++++++-------------------------- 2 files changed, 141 insertions(+), 133 deletions(-) diff --git a/src/libmz.i b/src/libmz.i index 69b4b2c..6d30664 100644 --- a/src/libmz.i +++ b/src/libmz.i @@ -1,53 +1,53 @@ .macro wait_for_vblank_inline() { pha negative: - lda.l 0x004212 - bmi negative + lda.l 0x004212 + bmi negative positive: - lda.l 0x004212 - bpl positive - pla + lda.l 0x004212 + bpl positive + pla } .macro dma_transfer_to_vram_nofunk(source_address, vram_pointer, count, dma_mode) { channel = 7 PHP - PHA - PHX - phb - lda #0x00 - pha - plb + PHA + PHX + phb + lda #0x00 + pha + plb - LDA.B #0x80 - STA.W 0x2115 + LDA.B #0x80 + STA.W 0x2115 - LDX.W #vram_pointer - STX.W 0x2116 + LDX.W #vram_pointer + STX.W 0x2116 - LDX.W #dma_mode - STX.W 0x4300+(channel<<4) + LDX.W #dma_mode + STX.W 0x4300+(channel<<4) - LDA.B #source_address >> 16 - STA.W 0x4304+(channel<<4) + LDA.B #source_address >> 16 + STA.W 0x4304+(channel<<4) - LDX.W #source_address - STX.W 0x4302+(channel<<4) + LDX.W #source_address + STX.W 0x4302+(channel<<4) - LDX.W #count - STX.W 0x4305+(channel<<4) - LDA.B #0x01<> 16) @@ -63,6 +67,7 @@ positive: pea.w mode jmp.w dma_transfer_to_vram return_addr: + plb plx pla plp diff --git a/src/libmz.s b/src/libmz.s index c534a5d..87e3abd 100644 --- a/src/libmz.s +++ b/src/libmz.s @@ -2,15 +2,18 @@ wait_for_vblank: { pha negative: - lda 0x4212 - bmi negative + lda.l 0x004212 + bmi negative positive: - lda 0x4212 - bpl positive - pla - rts + lda.l 0x004212 + bpl positive + pla + rts } +wait_for_vblank_long: + jsr.w wait_for_vblank + rtl dma_transfer_to_vram: { @@ -107,10 +110,10 @@ dma_transfer_to_palette: enable_display: pha - lda #0x00 ; enable screen, full brightness - sta 0x2100 - pla - rts + lda #0x00 ; enable screen, full brightness + sta 0x2100 + pla + rts enable_gamepad: pha @@ -126,96 +129,96 @@ disable_gamepad: initialize_snes: - sep #0x30 ; make X, Y, A all 8-bits - lda #0x80 ; screen off, no brightness - sta 0x2100 ; brightness & screen enable register - lda #0x00 - sta 0x2101 ; sprite register (size & address in VRAM) - sta 0x2102 ; sprite registers (address of sprite memory [OAM]) - sta 0x2103 ; sprite registers (address of sprite memory [OAM]) - sta 0x2105 ; graphic mode register - sta 0x2106 ; mosaic register - sta 0x2107 ; plane 0 map VRAM location - sta 0x2108 ; plane 1 map VRAM location - sta 0x2109 ; plane 2 map VRAM location - sta 0x210A ; plane 3 map VRAM location - sta 0x210B ; plane 0 & 1 Tile data location - sta 0x210C ; plane 2 & 3 Tile data location - sta 0x210D ; plane 0 scroll x (first 8 bits) - sta 0x210D ; plane 0 scroll x (last 3 bits) - sta 0x210E ; plane 0 scroll y (first 8 bits) - sta 0x210E ; plane 0 scroll y (last 3 bits) - sta 0x210F ; plane 1 scroll x (first 8 bits) - sta 0x210F ; plane 1 scroll x (last 3 bits) - sta 0x2110 ; plane 1 scroll y (first 8 bits) - sta 0x2110 ; plane 1 scroll y (last 3 bits) - sta 0x2111 ; plane 2 scroll x (first 8 bits) - sta 0x2111 ; plane 2 scroll x (last 3 bits) - sta 0x2112 ; plane 2 scroll y (first 8 bits) - sta 0x2112 ; plane 2 scroll y (last 3 bits) - sta 0x2113 ; plane 3 scroll x (first 8 bits) - sta 0x2113 ; plane 3 scroll x (last 3 bits) - sta 0x2114 ; plane 3 scroll y (first 8 bits) - sta 0x2114 ; plane 3 scroll y (last 3 bits) - lda #0x80 ; increase VRAM address after writing to 0x2119 - sta 0x2115 ; VRAM address increment register - lda #0x00 - sta 0x2116 ; VRAM address low - sta 0x2117 ; VRAM address high - sta 0x211A ; initial mode 7 setting register - sta 0x211B ; mode 7 matrix parameter A register (low) - lda #0x01 - sta 0x211B ; mode 7 matrix parameter A register (high) - lda #0x00 - sta 0x211C ; mode 7 matrix parameter B register (low) - sta 0x211C ; mode 7 matrix parameter B register (high) - sta 0x211D ; mode 7 matrix parameter C register (low) - sta 0x211D ; mode 7 matrix parameter C register (high) - sta 0x211E ; mode 7 matrix parameter D register (low) - lda #0x01 - sta 0x211E ; mode 7 matrix parameter D register (high) - lda #0x00 - sta 0x211F ; mode 7 center position X register (low) - sta 0x211F ; mode 7 center position X register (high) - sta 0x2120 ; mode 7 center position Y register (low) - sta 0x2120 ; mode 7 center position Y register (high) - sta 0x2121 ; color number register (0x00-0xff) - sta 0x2123 ; bg1 & bg2 window mask setting register - sta 0x2124 ; bg3 & bg4 window mask setting register - sta 0x2125 ; obj & color window mask setting register - sta 0x2126 ; window 1 left position register - sta 0x2127 ; window 2 left position register - sta 0x2128 ; window 3 left position register - sta 0x2129 ; window 4 left position register - sta 0x212A ; bg1, bg2, bg3, bg4 window logic register - sta 0x212B ; obj, color window logic register (or, and, xor, xnor) - lda #0x01 - sta 0x212C ; main screen designation (planes, sprites enable) - lda #0x00 - sta 0x212D ; sub screen designation - sta 0x212E ; window mask for main screen - sta 0x212F ; window mask for sub screen - lda #0x30 - sta 0x2130 ; color addition & screen addition init setting - lda #0x00 - sta 0x2131 ; add/sub sub designation for screen, sprite, color - lda #0xE0 - sta 0x2132 ; color data for addition/subtraction - stz 0x2133 ; screen setting (interlace x,y/enable SFX data) - stz 0x4200 ; disable v-blank, interrupt, joypad register - lda #0xFF - sta 0x4201 ; programmable I/O port - lda #0x00 - sta 0x4202 ; multiplicand A - sta 0x4203 ; multiplier B - sta 0x4204 ; multiplier C - sta 0x4205 ; multiplicand C - sta 0x4206 ; divisor B - sta 0x4207 ; horizontal count timer - sta 0x4208 ; horizontal count timer MSB - sta 0x4209 ; vertical count timer - sta 0x420A ; vertical count timer MSB - sta 0x420B ; general DMA enable (bits 0-7) - sta 0x420C ; horizontal DMA (HDMA) enable (bits 0-7) - sta 0x420D ; access cycle designation (slow/fast rom) + sep #0x30 ; make X, Y, A all 8-bits + lda #0x80 ; screen off, no brightness + sta 0x2100 ; brightness & screen enable register + lda #0x00 + sta 0x2101 ; sprite register (size & address in VRAM) + sta 0x2102 ; sprite registers (address of sprite memory [OAM]) + sta 0x2103 ; sprite registers (address of sprite memory [OAM]) + sta 0x2105 ; graphic mode register + sta 0x2106 ; mosaic register + sta 0x2107 ; plane 0 map VRAM location + sta 0x2108 ; plane 1 map VRAM location + sta 0x2109 ; plane 2 map VRAM location + sta 0x210A ; plane 3 map VRAM location + sta 0x210B ; plane 0 & 1 Tile data location + sta 0x210C ; plane 2 & 3 Tile data location + sta 0x210D ; plane 0 scroll x (first 8 bits) + sta 0x210D ; plane 0 scroll x (last 3 bits) + sta 0x210E ; plane 0 scroll y (first 8 bits) + sta 0x210E ; plane 0 scroll y (last 3 bits) + sta 0x210F ; plane 1 scroll x (first 8 bits) + sta 0x210F ; plane 1 scroll x (last 3 bits) + sta 0x2110 ; plane 1 scroll y (first 8 bits) + sta 0x2110 ; plane 1 scroll y (last 3 bits) + sta 0x2111 ; plane 2 scroll x (first 8 bits) + sta 0x2111 ; plane 2 scroll x (last 3 bits) + sta 0x2112 ; plane 2 scroll y (first 8 bits) + sta 0x2112 ; plane 2 scroll y (last 3 bits) + sta 0x2113 ; plane 3 scroll x (first 8 bits) + sta 0x2113 ; plane 3 scroll x (last 3 bits) + sta 0x2114 ; plane 3 scroll y (first 8 bits) + sta 0x2114 ; plane 3 scroll y (last 3 bits) + lda #0x80 ; increase VRAM address after writing to 0x2119 + sta 0x2115 ; VRAM address increment register + lda #0x00 + sta 0x2116 ; VRAM address low + sta 0x2117 ; VRAM address high + sta 0x211A ; initial mode 7 setting register + sta 0x211B ; mode 7 matrix parameter A register (low) + lda #0x01 + sta 0x211B ; mode 7 matrix parameter A register (high) + lda #0x00 + sta 0x211C ; mode 7 matrix parameter B register (low) + sta 0x211C ; mode 7 matrix parameter B register (high) + sta 0x211D ; mode 7 matrix parameter C register (low) + sta 0x211D ; mode 7 matrix parameter C register (high) + sta 0x211E ; mode 7 matrix parameter D register (low) + lda #0x01 + sta 0x211E ; mode 7 matrix parameter D register (high) + lda #0x00 + sta 0x211F ; mode 7 center position X register (low) + sta 0x211F ; mode 7 center position X register (high) + sta 0x2120 ; mode 7 center position Y register (low) + sta 0x2120 ; mode 7 center position Y register (high) + sta 0x2121 ; color number register (0x00-0xff) + sta 0x2123 ; bg1 & bg2 window mask setting register + sta 0x2124 ; bg3 & bg4 window mask setting register + sta 0x2125 ; obj & color window mask setting register + sta 0x2126 ; window 1 left position register + sta 0x2127 ; window 2 left position register + sta 0x2128 ; window 3 left position register + sta 0x2129 ; window 4 left position register + sta 0x212A ; bg1, bg2, bg3, bg4 window logic register + sta 0x212B ; obj, color window logic register (or, and, xor, xnor) + lda #0x01 + sta 0x212C ; main screen designation (planes, sprites enable) + lda #0x00 + sta 0x212D ; sub screen designation + sta 0x212E ; window mask for main screen + sta 0x212F ; window mask for sub screen + lda #0x30 + sta 0x2130 ; color addition & screen addition init setting + lda #0x00 + sta 0x2131 ; add/sub sub designation for screen, sprite, color + lda #0xE0 + sta 0x2132 ; color data for addition/subtraction + stz 0x2133 ; screen setting (interlace x,y/enable SFX data) + stz 0x4200 ; disable v-blank, interrupt, joypad register + lda #0xFF + sta 0x4201 ; programmable I/O port + lda #0x00 + sta 0x4202 ; multiplicand A + sta 0x4203 ; multiplier B + sta 0x4204 ; multiplier C + sta 0x4205 ; multiplicand C + sta 0x4206 ; divisor B + sta 0x4207 ; horizontal count timer + sta 0x4208 ; horizontal count timer MSB + sta 0x4209 ; vertical count timer + sta 0x420A ; vertical count timer MSB + sta 0x420B ; general DMA enable (bits 0-7) + sta 0x420C ; horizontal DMA (HDMA) enable (bits 0-7) + sta 0x420D ; access cycle designation (slow/fast rom) rts From cf8c133372cbd180689f871c4aa145fc6ca0114a Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:29:37 +0200 Subject: [PATCH 37/52] Explode battle module in a myriad of files. reduce BG1 size, reorganize how vram is laid out. Adds a small vwf for the message and battle text. --- src/battle/commands_patches.s | 49 ++++++ src/battle/graphics.s | 10 ++ src/battle/graphics_patches.s | 64 ++++++++ src/battle/init.s | 2 + src/battle/init_patches.s | 5 + src/battle/items_patches.s | 1 + src/battle/magic_patches.s | 224 +++++++++++++++++++++++++++ src/battle/message.s | 281 ++++++++++++++++++++++++++++++++++ src/battle/message_patches.s | 88 +++++++++++ src/battle/sram.i | 56 +++++++ src/battle/sram.s | 117 ++++++++++++++ src/battle/sram_patches.s | 52 +++++++ 12 files changed, 949 insertions(+) create mode 100644 src/battle/commands_patches.s create mode 100644 src/battle/graphics.s create mode 100644 src/battle/graphics_patches.s create mode 100644 src/battle/init.s create mode 100644 src/battle/init_patches.s create mode 100644 src/battle/items_patches.s create mode 100644 src/battle/magic_patches.s create mode 100644 src/battle/message.s create mode 100644 src/battle/message_patches.s create mode 100644 src/battle/sram.i create mode 100644 src/battle/sram.s create mode 100644 src/battle/sram_patches.s diff --git a/src/battle/commands_patches.s b/src/battle/commands_patches.s new file mode 100644 index 0000000..43f527c --- /dev/null +++ b/src/battle/commands_patches.s @@ -0,0 +1,49 @@ +command_length = 11 + +; move command cursor on the moved window +*=0x2b990 + lda.b #0x18 +{ +*=0x029CD6 + lda.b #command_length + +*=0x029D15 + lda.b #command_length + +*=0x029D42 + cpy.w #command_length + 2 + +*=0x029D5A + cpy.w #command_length + 2 + +*=0x029D39 + lda.l assets_battle_commands_dat, x + +*=0x029CE0 + lda.b #command_length * 4 + +*=0x16FE54 + .db command_length * 2 + .db 0x0a + .dw 0x8CB2 ; read address + .dw 0xC1F4 - 4 ; write address +} + +{ +; ram position of the prebuilt battle windows +*=0x16FEAD +battle_data_size = command_length * 4 * 5 +.dw 0x8CB2 +.dw 0x8CB2 + battle_data_size +.dw 0x8CB2 + battle_data_size * 2 +.dw 0x8CB2 + battle_data_size * 3 +.dw 0x8CB2 + battle_data_size * 4 + +*=0x02999F + ldx.w #battle_data_size + + ; move items ram location +*=0x029FBB + battle_items_position = 0x2E00 + adc.w #battle_items_position +} diff --git a/src/battle/graphics.s b/src/battle/graphics.s new file mode 100644 index 0000000..6a70e1b --- /dev/null +++ b/src/battle/graphics.s @@ -0,0 +1,10 @@ +.scope defend_row { + defend_row_length = 6 +defend_text: + .db 0xff,0xff,0xff,0xff,0xff,0xff + .db 222, 224, 231, 225, 226, 255 +row_text: + .db 0xff,0xff,0xff,0xff,0xff,0xff + .db 223, 224, 229, 227, 255, 255 + +} diff --git a/src/battle/graphics_patches.s b/src/battle/graphics_patches.s new file mode 100644 index 0000000..e962710 --- /dev/null +++ b/src/battle/graphics_patches.s @@ -0,0 +1,64 @@ +; MISS sprite graphics +*=0x0cfc60 + .incbin 'fonts/miss.bin' + +*=0x16fb87 +{ + ; chars to copy from the font to the 4bpp tileset in battle + .table 'text/ff4_menus.tbl' + + .db 0x76,0x78 + .text '/' + .text 'GRadeginqrsu' + .db 0x8c, 0x90, 0x7f + .db 0x80, 0x81, 0x82 + .db 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x16, 0x17, 0x18, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff +} + +*=0x02975d +; PM Needed +.db 223, 226, 230, 233, 228, 232, 0xff + +; Defend / Row window content +; moves the row destination back a few bytes +*=0x29a90 + ldx.w #0xd618 + +*=0x29a8b + ldx.w #0xd5e8 + +*=0x029a98 + lda.l defend_row.defend_text, x + +*=0x029a9e + lda.l defend_row.row_text, x + +*=0x029aa7 + cpx.w #defend_row.defend_row_length * 2 + +*=0x029aac + cpx.w #defend_row.defend_row_length + +; moves row pointer back 8 pixels. +*=0x02b96a + lda.b #0x0c + +; Command window +*=0x16fe5a + 6 * 2 + .db 0x04, 0x00 ,command_length + 2, 0x0d + +; defend window +*=0x16fe5a + 6 * 8 + .db 0x00, 0x09, 0x08, 0x04 + + +*=0x16fe5a + 6 * 9 +; row window +.db 0x18,0x09,0x08,0x04 + +; switches around small mp to pm in the MP Needed battle window. +*=0x02a1e3 + lda #0xdc + sta 0xba94,y + dec + sta 0xba96,y diff --git a/src/battle/init.s b/src/battle/init.s new file mode 100644 index 0000000..c9397c4 --- /dev/null +++ b/src/battle/init.s @@ -0,0 +1,2 @@ +.include './src/battle/message.s' +.include './src/battle/sram.s' diff --git a/src/battle/init_patches.s b/src/battle/init_patches.s new file mode 100644 index 0000000..0f15d27 --- /dev/null +++ b/src/battle/init_patches.s @@ -0,0 +1,5 @@ +.include 'commands_patches.s' +.include 'graphics_patches.s' +.include 'items_patches.s' +.include 'magic_patches.s' +.include 'sram_patches.s' diff --git a/src/battle/items_patches.s b/src/battle/items_patches.s new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/battle/items_patches.s @@ -0,0 +1 @@ + diff --git a/src/battle/magic_patches.s b/src/battle/magic_patches.s new file mode 100644 index 0000000..b181169 --- /dev/null +++ b/src/battle/magic_patches.s @@ -0,0 +1,224 @@ +battle_magic_length = 8 + +; where originaly it was 3. clear related +*=0x02984D + ldx.w #0x0018 + +; used for the copy for the dakuten offset +*=0x02A094 + ; _ _ _ _ _ _ + ; A B B B B B + lda.b #battle_magic_length + +*=0x02A0E2 + lda.b #battle_magic_length + +*=0x02a113 + lda.b #battle_magic_length - 1 + +*=0x02A0FF + lda.l assets_magic_dat, x + +*=0x02A117 + lda.l assets_magic_dat+1, x + +*=0x02A09E + lda.b #battle_magic_length * 4 + +*=0x02986C + ldx #0xC52A + stx 0x00 + ldx.w #0xC52A + 2 + battle_magic_length * 2 + stx 0x02 + ldx #0xC546 + stx 0x04 + +;original +magic_data_base = 0x909A + 0x60 + +;magic_data_base = 0x703720 +*=0x029893 + lda.w magic_data_base, x + sta (0x00), y + lda.w magic_data_base + battle_magic_length * 4, x + sta (0x02), y + nop + nop + nop + ;LDA 0x97D6,X + nop + nop + ;STA (0x4),Y + iny + inx + cpy.w #battle_magic_length * 2 + + +*=0x0298AC + lda.w magic_data_base, x + sta (0x00), y + lda.w magic_data_base + battle_magic_length * 4, x + sta (0x02), y + ;LDA $97D6,X + nop + nop + nop + ;STA (D,4),Y + nop + nop + iny + inx + cpy.w #0x40 + battle_magic_length * 2 + +*=0x0298C6 + adc.w #battle_magic_length * 2 * 2 + +*=0x02988D + lda.b #12 + + +; 0x240 * 3 = 0x6C0 +{ +size = 0x120 +;fsize = size * 4 +;fsize = 0x6C0 ; original +fsize = 0x900 +*=0x029825 + .dw 0x0000 + .dw fsize + .dw fsize * 2 + .dw fsize * 3 + .dw fsize * 4 + +*=0x16FF2F + .dw magic_data_base & 0xFFFF + .dw (magic_data_base + fsize) & 0xFFFF + .dw (magic_data_base + fsize * 2) & 0xFFFF + .dw (magic_data_base + fsize * 3) & 0xFFFF + .dw (magic_data_base + fsize * 4) & 0xFFFF + +; Black magic +*=0x029834 + ldx.w #0x300 ; 0x240 + +; summon +*=0x02982F + ldx.w #0x600 ; 0x480 + +; patches the transfer size +*=0x16fe1c + .dw 0x600 ; 0x400 +} +; number of lines to scroll ? +*=0x02B72B + cmp #11 + +; items per line for cursor dpad right +*=0x02B781 + cmp #1 + + +; dpad up +*=0x02B712 + nop + nop + +*=0x02B71C + nop + nop + +; dpad down +*=0x02B751 +; INC D,$63 + nop + nop + +*=0x02B742 + nop + nop + + +*=0x16FC56 + .db 2 + .db 0x3C + 14 + .db 0x74 + +*=0x16FC5B + .db 0x9C + .db 0xA8 + .db 0xB4 + + +*=0x02B764 + inc 0x5F + ;inc 0x5F + nop + nop + inc 0x63 + ;inc 0x63 + nop + nop + +*=0x02B785 + dec 0x5F + ;dec 0x5F + nop + nop + dec 0x63 + ;dec 0x63 + nop + nop + +*=0x02A567 + lda.b #battle_magic_length + +*=0x02A573 + lda.l assets_magic_dat,X +*=0x02A57E + lda.l assets_magic_dat+1,X + +; sets the palette for disabled spells (Not enough MP) +*=0x029EC8 + lda #0x48 + sta 7 +loc_29ECC: + ldy.w #1 + lda (0) + bmi loc_29EDB + lda #0 + sta 6 + lda #0 + bra loc_29EE3 +loc_29EDB: + lda #4 + sta 6 + bra loc_29EE3 +loc_29EE1: + lda 6 +loc_29EE3: + + sta (2),Y + sta (4),Y + iny + iny + cpy.w #battle_magic_length * 2 + 1 ; len * 2 + 1 : 0x0D + bne loc_29EE1 + rep #0x20 ; ' ' +;.A16 + lda 2 + clc + adc.w #battle_magic_length * 4 ; next word len * 4 : 0x18 + sta 2 + clc + adc.w #battle_magic_length * 2 ; len * 2 0x0c + sta 4 + lda 0 + clc + adc.w #4 ; next magic struct + sta 0 + tdc + sep #0x20 +;.A8 + dec 7 ; loop on all magic + bne loc_29ECC + rts diff --git a/src/battle/message.s b/src/battle/message.s new file mode 100644 index 0000000..6225406 --- /dev/null +++ b/src/battle/message.s @@ -0,0 +1,281 @@ +.scope battle_render { + buffer_ptr = 0x7fA000 + buffer_size = 384 + + bits_left_on_tile = 0x81 + tilemap_offset = 0x82 + temp = 0x84 + counter = 0x85 + current_char = 0x87 + + font_ptr = assets_menu_font_dat + length_table_ptr = assets_menu_font_length_table_dat + +init: + jsr.w clear_buffer + pha + lda.b #0x08 + sta.b bits_left_on_tile + pla + + stz.b temp + + stz.b counter + jsr.w render_allocator.init + rts + +clear_buffer: + pha + phx + ldx.w #buffer_size +_clear_loop: + lda.b #0xFF + sta.l buffer_ptr, x + lda.b #0x00 + sta.l buffer_ptr + 1, x + dex + dex + bne _clear_loop + plx + pla + rts + +make_pointers: +{ + pha + + ldx.w #0x0000 + ldy.w #0x0000 + lda.b current_char + xba + lda.b #0x00 + xba + rep #0x20 + asl + asl + asl + asl + tax + lda.w #0x0000 + sep #0x20 + + lda.l render_allocator.allocated_tile_id + + rep #0x20 + asl + asl + asl + asl + tay + sep #0x20 + pla + rts +} + +display_char: + pha + phx + phy + jsr.w _display_char + ply + plx + pla + ldy.b tilemap_offset + + rts + +_display_char: +{ + sta.b current_char + sty.b tilemap_offset + + jsr.w make_pointers + + rep #0x20 + lda.w #0x0010 + sta.b counter + sep #0x20 + +char_line_loop: + rep #0x20 + lda.w #0x0000 + sep #0x20 + + lda.b bits_left_on_tile + + cmp #0x08 + bne _shift + +_read_8x8_char: + lda.l font_ptr, x + + inx + xba + bra _store + +_shift: + ; expects bitsleft in A + phx + tax + lda.l vwf_shift_table, x + sta.l 0x004202 + + + plx + lda.l font_ptr, x + + inx + + sta.l 0x004203 ; MULTIPLICAND + + rep #0x20 + nop + nop + nop + nop + lda.l 0x004216 ; the result is stored in 0x4216-0x4217 + sep #0x20 + +_store: + + xba + phx + tyx + ora.l buffer_ptr, x + sta.l buffer_ptr, x + xba + ora.l buffer_ptr + 0x10, x + sta.l buffer_ptr + 0x10, x + txy + plx + iny + + dec.b counter + bne char_line_loop + + rep #0x20 + stz.b temp + lda.w #0x0000 + ldx.w #0x0000 + sep #0x20 + + lda.b current_char + tax + +brk_bits_left: + lda.l length_table_ptr, x + + sta.b temp + + rep #0x20 + clc + + lda.w #0x0000 + sep #0x20 + + lda.b bits_left_on_tile + + clc + sbc.b temp + +loopdec: + cmp #0x00 + bmi coupe + beq coupe + + sta.b bits_left_on_tile + jsr.w tilemap_write_no_inc + + rts + +coupe: + clc + adc.b #0x08 + jsr.w tilemap_write + bra loopdec +} + +tilemap_write_no_inc: + lda.l render_allocator.allocated_tile_id + + phy + ldy.b tilemap_offset + sta (0x34),y + iny + lda 0x36 + ora.b #0x01 + sta (0x34),y + ply + rts + + +tilemap_write: + pha + jsr.w tilemap_write_no_inc + jsr.w render_allocator.increment + rep #0x20 + inc.b tilemap_offset + inc.b tilemap_offset + sep #0x20 + pla + rts +} + +.scope messages_vwf { + dakuten_table = 0x16fa40 + ; put char + ; write to the tilemap if needed + ; maintain counters + put_fixed_char: + cmp #0x42 + bcc put_fixed_char_dakuten + + put_fixed_char_no_dakuten: + jmp.w battle_render.display_char + + put_fixed_char_dakuten: + jmp.w battle_render.display_char + + ; far calls for the new implementation + put_fixed_char_far: + jsr.w put_fixed_char + rtl + + put_fixed_char_dakuten_far: + jsr.w put_fixed_char_dakuten + rtl + + put_fixed_char_no_dakuten_far: + jsr.w put_fixed_char_no_dakuten + rtl + + ; inits the renderer for the messages window + ; flips the flag for enabling the messages renderer. + init: + jsr.l battle_flags.set_vwf_render + jsr.w battle_render.init + rtl + + ; deinit the renderer + ; disables messages renderer falling back to fixed mode. + deinit: + jsr.l battle_flags.clear_vwf_render + ; vram transfer was moved to a trampoline in the battle nmi. + rtl + + _wait_for_vblank: { + inc 0x1811 + _wait: + lda 0x1811 + bne _wait + rts + } + +DMA_TRANSFER: + dma_transfer_to_vram_call(battle_render.buffer_ptr, 0xb000>>1, 512, 0x1801) + jsr.l 0x03fe03 + rtl +} + + + diff --git a/src/battle/message_patches.s b/src/battle/message_patches.s new file mode 100644 index 0000000..e5d7e8f --- /dev/null +++ b/src/battle/message_patches.s @@ -0,0 +1,88 @@ +.scope message_patches { + ; pointers to battle dialog +*=0x02c909 + lda.l assets_battle_messages_ptr,x + sta 0x00 + lda.l assets_battle_messages_ptr+1,x + sta 0x01 + lda.w #assets_battle_messages_ptr >> 16 + sta 0x02 + + + ; pointers to battle messages +*=0x02cc07 + lda.l assets_battle_text_ptr,x + sta 0x00 + tdc + sep #0x20 + lda.b #assets_battle_text_ptr >> 16 + sta 0x02 + +; |tileset 0xb000 -> 0xbfff bg3 tiles +; |------------------- +; |tilemap bg2 64*32 +; |0xb000, 0x1000 +; |------------------- +; |tile map bg1 64*64 +; |0xc0000, 0x2000 +; |------------------- +; |tilemap bg3 64*64 +; |0xe0000, 0x2000 +; |------------------- + + +; resize bg1 to 32x64 and moves it to v:0xd000 +*=0x0382f5 + ; bg 1 + lda.b #(0xd000 >> 9 | 0b01) + sta 0x2107 + lda.b #(0xc000 >> 9 | 0b01) + sta 0x2108 + +; bg1 move +*=0x028B3B + ldy.w #0x6000 + 0x800 +*=0x02bcad + ldy.w #0x6000 + 0x800 +*=0x02BCB2 + ldy.w #0x6400 + 0x800 + +; bg1 move +;02/91FE: A0 00 58 LDY #$5800 +*=0x0291FE + ldy.w #0x6000 + +;02/921F: A0 00 5C LDY #$5C00 +*=0x02921F + ldy.w#0x6400 + +; Menu defend row mp cost init +*=0x16fdd6 + 6 * 6 + ; wram vram size + .dw 0xd366, 0x6400 + 0x260, 0x0340 + +*=0x16fe0c + 6 * 6 + .dw 0xd366, 0x6400 + 0x260, 0x0140 + + + + +*=0x0292F8 + ; move the text buffer pointer back 3 entries + ldx.w #0xDB2E - 3 * 2 + stx 0xEF52 + jsr.w msg_window_draw_text_trampoline + +} + +; patch the battle nmi routine to transfer the battle render buffer. +*=0x02836e + jsr.l messages_vwf.DMA_TRANSFER + +; make the message window bigger +*=0x0292DF + ; (0, 3) (26, 4) + ldx.w #0x0000 + stx.w 0xEF56 + ldx.w #0x041A + 6 + stx.w 0xEF58 diff --git a/src/battle/sram.i b/src/battle/sram.i new file mode 100644 index 0000000..8f8a33b --- /dev/null +++ b/src/battle/sram.i @@ -0,0 +1,56 @@ +sram_base = 0x700000 +.macro long_sram_store(src) { + phy + phx + + php + rep #0x20 + pha + tya + clc + adc.b src + tax + pla + sep #0x20 + plp + sta.l sram_base, x + + plx + ply +} + +BATTLE_FLAGS = 0x7FFFFF +.macro battle_flags_set(value) { + lda.b #value + ora.l BATTLE_FLAGS + sta.l BATTLE_FLAGS +} + +.macro battle_flags_clear(value) { + lda.b #value + eor.l BATTLE_FLAGS + sta.l BATTLE_FLAGS +} + +.macro battle_flags_test(value) { + pha + lda.l BATTLE_FLAGS + and #value + pla +} + +.macro battle_flag_switch(jump_table) { + pha + phx + lda.l BATTLE_FLAGS + asl + tax + lda.l jump_table, x + sta 0x04 + lda.l jump_table + 1, x + sta 0x05 +; sep #0x20 + plx + pla + jmp.w (0x0004) +} diff --git a/src/battle/sram.s b/src/battle/sram.s new file mode 100644 index 0000000..252eafd --- /dev/null +++ b/src/battle/sram.s @@ -0,0 +1,117 @@ +.include 'src/battle/sram.i' + +BATTLE_DAKUTEN_TABLE = 0x16FA40 + +.scope battle_flags { + set_sram_copy: + battle_flags_set(0x01) + rtl + + clear_sram_copy: + battle_flags_clear(0x01) + rtl + + set_vwf_render: + battle_flags_set(0x02) + rtl + + clear_vwf_render: + battle_flags_clear(0x02) + rtl +} + +copy_battle_char: + lda.l sram_base + 0x2E00, x + sta (0x00),Y + lda.l sram_base + 0x2E00 + 0x30, x + sta (0x02),Y + rtl + +.scope wram { +put_char: + phx + sta (0x34),Y + lda #0xFF + sta (0x32),Y + iny + lda 0x36 + sta (0x32),Y + sta (0x34),Y + iny + plx + rtl + +put_char_with_dakuten: + phx + sec + sbc #0xF + asl + tax + lda.l BATTLE_DAKUTEN_TABLE, x + sta (0x32), y + lda.l BATTLE_DAKUTEN_TABLE + 1, x + sta (0x34), y + iny + lda 0x36 + sta (0x32), y + sta (0x34), y + iny + plx + rtl +} + +.scope sram { +put_char: + phx + long_sram_store(0x34) + lda #0xFF + long_sram_store(0x32) + iny + lda 0x36 + long_sram_store(0x32) + long_sram_store(0x34) + iny + plx + rtl + +put_char_with_dakuten: + phx + sec + sbc #0x0F + asl + tax + lda.l BATTLE_DAKUTEN_TABLE, x + long_sram_store(0x32) + lda.l BATTLE_DAKUTEN_TABLE + 1, x + long_sram_store(0x34) + iny + lda 0x36 + long_sram_store(0x32) + long_sram_store(0x34) + iny + plx + rtl +} + +battle_display_char: +{ + battle_flag_switch(battle_flags_jump_table) +battle_flags_jump_table: + .dw wram.put_char + .dw sram.put_char + .dw messages_vwf.put_fixed_char_dakuten_far +} + +battle_display_dakuten_char: +{ + battle_flag_switch(battle_flags_jump_table) +battle_flags_jump_table: + .dw wram.put_char_with_dakuten + .dw sram.put_char_with_dakuten + .dw messages_vwf.put_fixed_char_no_dakuten_far +} + +sink: + rtl + + diff --git a/src/battle/sram_patches.s b/src/battle/sram_patches.s new file mode 100644 index 0000000..be12ed4 --- /dev/null +++ b/src/battle/sram_patches.s @@ -0,0 +1,52 @@ +; inventory buffer +*=0x02991E + jsr.l copy_battle_char + nop + + nop + nop + nop + + nop + nop + + +; inventory buffer +*=0x029932 + jsr.l copy_battle_char + nop + + nop + nop + nop + + nop + nop + + +; patch normal display_char to include 7FFFFF based switch +*=0x02A49B + jsr.l battle_display_char + rts + +; patch normal display_dakuten_char to include 7FFFFF based switch +*=0x02A4AC + jsr.l battle_display_dakuten_char + rts + +; enclose jsr build_tileset_function +; with 7FFFFF switch in the items related stuff. +*=0x02A06C + jsr.w 0xFFC2 + +*=0x02FFC2 + jsr.l battle_flags.set_sram_copy + jsr 0xA455 + jsr.l battle_flags.clear_sram_copy + rts +msg_window_draw_text_trampoline: + jsr.l messages_vwf.init + jsr 0xA455 + jsr.l messages_vwf.deinit + rts + From 4c04e6e2c47e40ebd26cc9ca859f2eddc0075e82 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:35:32 +0200 Subject: [PATCH 38/52] Removes old battle files. --- src/battle.s | 121 ------------------------ src/battle_magic.s | 222 --------------------------------------------- src/battle_sram.s | 109 ---------------------- src/shop_menu.s | 47 ---------- 4 files changed, 499 deletions(-) delete mode 100644 src/battle.s delete mode 100644 src/battle_magic.s delete mode 100644 src/battle_sram.s delete mode 100644 src/shop_menu.s diff --git a/src/battle.s b/src/battle.s deleted file mode 100644 index 6be9ed2..0000000 --- a/src/battle.s +++ /dev/null @@ -1,121 +0,0 @@ -command_length = 11 - -{ -*=0x029CD6 - lda.b #command_length - -*=0x029D15 - lda.b #command_length - -*=0x029D42 - cpy.w #command_length + 2 -; -*=0x029D5A - cpy.w #command_length + 2 -; -*=0x029D39 - lda.l assets_battle_commands_dat, x -; x offset of the battle commands window -;*=0x16fe66 -; .db 0 -;; this byte controls the command window size -*=0x16fe68 - .db command_length + 2 - -*=0x029CE0 - lda.b #command_length * 4 - -*=0x16FE54 -.db command_length * 2 -.db 5 * 2 -.dw 0x8CB2 ; read address -.dw 0xC1F4 ; - 6 * 2 ; write address -.db 0x01 - - -{ -; ram position of the prebuilt battle windows -*=0x16FEAD -battle_data_size = command_length * 4 * 5 -.dw 0x8CB2 -.dw 0x8CB2 + battle_data_size -.dw 0x8CB2 + battle_data_size * 2 -.dw 0x8CB2 + battle_data_size * 3 -.dw 0x8CB2 + battle_data_size * 4 - -*=0x02999F - ldx.w #battle_data_size - ; move items ram location - - -*=0x029FBB - battle_items_position = 0x2E00 - adc.w #battle_items_position - -*=0x02991E - jsr.l copy_battle_char - nop - - nop - nop - nop - - nop - nop - - -*=0x029932 - jsr.l copy_battle_char - nop - - nop - nop - nop - - nop - nop - - -; patch normal display_char to include 7FFFFF based switch -*=0x02A49B - jsr.l battle_display_char - rts - -; patch normal display_dakuten_char to include 7FFFFF based switch -*=0x02A4AC - jsr.l battle_display_dakuten_char - rts - -; enclose jsr build_tileset_function -; with 7FFFFF switch in the items related stuff. -*=0x02A06C - jsr.w 0xFFC2 - - -.macro set_battle_sram_copy_flag(value) { - lda.b #value - sta.l 0x7FFFFF -} - -.macro enable_battle_sram_copy() { - set_battle_sram_copy_flag(0x85) -} - -.macro disable_battle_sram_copy() { - set_battle_sram_copy_flag(0x00) -} - -*=0x02FFC2 - enable_battle_sram_copy() - jsr 0xA455 - disable_battle_sram_copy() - rts - - -; 0x16FA40 battle dakuten - - -} - -} - diff --git a/src/battle_magic.s b/src/battle_magic.s deleted file mode 100644 index c0a0323..0000000 --- a/src/battle_magic.s +++ /dev/null @@ -1,222 +0,0 @@ -battle_magic_length = 8 - -; where originaly it was 3. clear related -*=0x02984D - ldx.w #0x0018 - -; used for the copy for the dakuten offset -*=0x02A094 - ; _ _ _ _ _ _ - ; A B B B B B - lda.b #battle_magic_length - -*=0x02A0E2 - lda.b #battle_magic_length - -*=0x02a113 - lda.b #battle_magic_length - 1 - -*=0x02A0FF - lda.l assets_magic_dat, x - -*=0x02A117 - lda.l assets_magic_dat+1, x - -*=0x02A09E - lda.b #battle_magic_length * 4 - -*=0x02986C - ldx #0xC52A - stx 0x00 - ldx.w #0xC52A + 2 + battle_magic_length * 2 - stx 0x02 - ldx #0xC546 - stx 0x04 - -;original -magic_data_base = 0x909A + 0x60 - -;magic_data_base = 0x703720 -*=0x029893 - lda.w magic_data_base, x - sta (0x00), y - lda.w magic_data_base + battle_magic_length * 4, x - sta (0x02), y - nop - nop - nop - ;LDA 0x97D6,X - nop - nop - ;STA (0x4),Y - iny - inx - cpy.w #battle_magic_length * 2 - - -*=0x0298AC - lda.w magic_data_base, x - sta (0x00), y - lda.w magic_data_base + battle_magic_length * 4, x - sta (0x02), y - ;LDA $97D6,X - nop - nop - nop - ;STA (D,4),Y - nop - nop - iny - inx - cpy.w #0x40 + battle_magic_length * 2 - -*=0x0298C6 - adc.w #battle_magic_length * 2 * 2 - -*=0x02988D - lda.b #12 - - -; 0x240 * 3 = 0x6C0 -{ -size = 0x120 -;fsize = size * 4 -;fsize = 0x6C0 ; original -fsize = 0x900 -*=0x029825 - .dw 0x0000 - .dw fsize - .dw fsize * 2 - .dw fsize * 3 - .dw fsize * 4 - -*=0x16FF2F - .dw magic_data_base & 0xFFFF - .dw (magic_data_base + fsize) & 0xFFFF - .dw (magic_data_base + fsize * 2) & 0xFFFF - .dw (magic_data_base + fsize * 3) & 0xFFFF - .dw (magic_data_base + fsize * 4) & 0xFFFF - -*=0x029834 - ldx.w #0x300 ; 0x240 - -*=0x02982F - ldx.w #0x600 ; 0x480 - -; patches the transfer size -*=0x16fe1c - .dw 0x600 ; 0x400 -} -; number of lines to scroll ? -*=0x02B72B - cmp #11 - -; items per line for cursor dpad right -*=0x02B781 - cmp #1 - - -; dpad up -*=0x02B712 - nop - nop - -*=0x02B71C - nop - nop - -; dpad down -*=0x02B751 -; INC D,$63 - nop - nop - -*=0x02B742 - nop - nop - - -*=0x16FC56 - .db 2 - .db 0x3C + 14 - .db 0x74 - -*=0x16FC5B - .db 0x9C - .db 0xA8 - .db 0xB4 - - -*=0x02B764 - inc 0x5F - ;inc 0x5F - nop - nop - inc 0x63 - ;inc 0x63 - nop - nop - -*=0x02B785 - dec 0x5F - ;dec 0x5F - nop - nop - dec 0x63 - ;dec 0x63 - nop - nop - -*=0x02A567 - lda.b #battle_magic_length - -*=0x02A573 - lda.l assets_magic_dat,X -*=0x02A57E - lda.l assets_magic_dat+1,X - -; sets the palette for disabled spells (Not enough MP) -*=0x029EC8 - lda #0x48 - sta 7 -loc_29ECC: - ldy.w #1 - lda (0) - bmi loc_29EDB - lda #0 - sta 6 - lda #0 - bra loc_29EE3 -loc_29EDB: - lda #4 - sta 6 - bra loc_29EE3 -loc_29EE1: - lda 6 -loc_29EE3: - - sta (2),Y - sta (4),Y - iny - iny - cpy.w #battle_magic_length * 2 + 1 ; len * 2 + 1 : 0x0D - bne loc_29EE1 - rep #0x20 ; ' ' -;.A16 - lda 2 - clc - adc.w #battle_magic_length * 4 ; next word len * 4 : 0x18 - sta 2 - clc - adc.w #battle_magic_length * 2 ; len * 2 0x0c - sta 4 - lda 0 - clc - adc.w #4 ; next magic struct - sta 0 - tdc - sep #0x20 -;.A8 - dec 7 ; loop on all magic - bne loc_29ECC - rts diff --git a/src/battle_sram.s b/src/battle_sram.s deleted file mode 100644 index bda9a77..0000000 --- a/src/battle_sram.s +++ /dev/null @@ -1,109 +0,0 @@ -sram_base = 0x700000 -.macro long_sram_store(src) { - phy - phx - - php - rep #0x20 - pha - tya - clc - adc.b src - tax - pla - sep #0x20 - plp - sta.l sram_base, x - - plx - ply -} - - -copy_battle_char: - lda.l sram_base + 0x2E00, x - sta (0x00),Y - lda.l sram_base + 0x2E00 + 0x30, x - sta (0x02),Y - rtl - - -battle_display_char: -{ - pha - lda.l 0x7FFFFF - cmp #0x85 - beq sram_store -wram_store: - pla - phx - sta (0x34),Y - lda #0xFF - sta (0x32),Y - iny - lda 0x36 - sta (0x32),Y - sta (0x34),Y - iny - plx - rtl -sram_store: - pla - phx - long_sram_store(0x34) - lda #0xFF - long_sram_store(0x32) - iny - lda 0x36 - long_sram_store(0x32) - long_sram_store(0x34) - iny - plx - rtl -} - -battle_display_dakuten_char: -{ - pha - lda.l 0x7FFFFF - cmp #0x85 - beq sram_store -wram_store: - pla - phx - sec - sbc #0xF - asl - tax - lda 0x16FA40, x - sta (0x32), y - lda 0x16FA41, x - sta (0x34), y - iny - lda 0x36 - sta (0x32), y - sta (0x34), y - iny - plx - rtl - -sram_store: - pla - phx - sec - sbc #0x0F - asl - tax - lda 0x16FA40, x - long_sram_store(0x32) - lda 0x16FA41, x - long_sram_store(0x34) - iny - lda 0x36 - long_sram_store(0x32) - long_sram_store(0x34) - iny - plx - rtl - -} diff --git a/src/shop_menu.s b/src/shop_menu.s deleted file mode 100644 index d534bf7..0000000 --- a/src/shop_menu.s +++ /dev/null @@ -1,47 +0,0 @@ -; ギル : gils -*=0x01C3EC - load_system_menu_text_pointer(shops.gils) - -*=0x01C350 - load_system_menu_text_pointer(shops.welcome_and_actions) - -*=0x01C43F - load_system_menu_text_pointer(shops.quantity) - -*=0x01C568 - load_system_menu_text_pointer(shops.gils + 2) - -; moves gils text char right -*=0x01C561 - sec - sbc #0x30 - 2 - -; 'tools message window -;*=0x01DEB2 -;.db 0x10 -;.db 0 -;.db 0x14 -;.db 3 - - - -; Tools Buy Sell Exit menu window -*=0x01DEAA - ; position - .db 0x02,0x01 - ; - .db 0x12,0x03 - -; Changes the offset of the hand pointer -*=0x01C37C - lda 0x1B79 - asl - asl - asl - asl - sta 0x45 - asl - adc 0x45 - nop - nop - sta 0x45 \ No newline at end of file From 7d110491920bb7b981e8c7e4ed9dc1bf650ad2fd Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:35:42 +0200 Subject: [PATCH 39/52] Adds small vwf module. --- src/small_vwf/init.s | 2 + src/small_vwf/item_description.s | 121 ++++++++++ src/small_vwf/render.s | 368 +++++++++++++++++++++++++++++++ 3 files changed, 491 insertions(+) create mode 100644 src/small_vwf/init.s create mode 100644 src/small_vwf/item_description.s create mode 100644 src/small_vwf/render.s diff --git a/src/small_vwf/init.s b/src/small_vwf/init.s new file mode 100644 index 0000000..989a318 --- /dev/null +++ b/src/small_vwf/init.s @@ -0,0 +1,2 @@ +.include 'src/small_vwf/render.s' +.include 'src/small_vwf/item_description.s' diff --git a/src/small_vwf/item_description.s b/src/small_vwf/item_description.s new file mode 100644 index 0000000..3f55a3c --- /dev/null +++ b/src/small_vwf/item_description.s @@ -0,0 +1,121 @@ +.scope items_description { +draw_trampoline: + jsr.w draw + rtl + +draw_trampoline_pos: + jsr.w draw_pos + rtl + +draw_pos: + phb + phd + phx + ldx #0x0100 + phx + pld + phk + plb + rep #0x20 + lda.w 0x0000,y + clc + adc 0x29 + sta.b render.tilemap_offset + tax + sep #0x20 + iny + iny + bra draw_string + +draw: +; +x: destination offset +; +y: source address +; a: source bank + + phb + phd + phx + phx + ldx.w #0x0100 + phx + pld + plx + pha + plb + rep #0x20 + phx + txa + clc + adc 0x29 + sta.b render.tilemap_offset + plx + sep #0x20 + +; cpy.b render.last_drawn_text_ptr +; beq _already_drawn +; sty.b render.last_drawn_text_ptr + +draw_string: + jsr.w render.init + +_char_loop: + lda.w 0x0000, y + beq _char_loop_exit + iny + cmp #0x01 + beq _move_to + cmp #0x02 + beq _newline + phx + phy + jsr.w render.display_char + ply + plx + + bra _char_loop + +_char_loop_exit: + jsr.w _transfer_item_description + jsr.w render.deinit +_already_drawn: + plx + pld + plb + rts + +_move_to: + rep #0x20 + lda.w 0x0000, y + iny + iny + tax + clc + adc 0x29 + sta.b render.tilemap_offset + sep #0x20 + bra _reset_render +_newline: + rep #0x20 + txa + clc + adc.w #0x0040 + tax + clc + adc 0x29 + sta.b render.tilemap_offset + sep #0x20 + +_reset_render: + lda #0x08 + sta.b render.bits_left_on_tile + + jsr.w render_allocator.increment + bra _char_loop + + + +_transfer_item_description: + jsr.w wait_for_vblank + dma_transfer_to_vram_call(render.buffer_ptr, 0x5000>>1, render.buffer_size, 0x1801) + rts +} diff --git a/src/small_vwf/render.s b/src/small_vwf/render.s new file mode 100644 index 0000000..ee51de4 --- /dev/null +++ b/src/small_vwf/render.s @@ -0,0 +1,368 @@ +VARS_BUFFER = 0x702F02 + +.macro initialize(var) { + lda.b var + sta.l VARS_BUFFER + var +} + +.macro initialize_long(var) { + initialize(var) + initialize(var + 1) + initialize(var + 2) +} + +.macro restore(var) { + lda.b VARS_BUFFER + var + sta.b var +} + +.macro restore_long(var) { + restore(var) + restore(var + 1) + restore(var + 2) +} + +.macro set_var_value(var, value) { + lda.b #value + sta.b var +} + +.scope vram_copy { +buffer = 0x703200 +save_dialog_vram_far: + jsr.l 0x14fd0f ; original save + jsr.l wait_for_vblank_long + phb + tdc + pha + plb + lda #0x80 + sta 0x2115 + ldx #0x2800 + stx 0x2116 + ldx 0x2139 + lda #0x81 + sta 0x4300 + lda #0x39 + sta 0x4301 + ldx.w #buffer & 0xffff + stx 0x4302 + lda.b #buffer >> 16 + sta 0x4304 + ldx.w #render.buffer_size + stx 0x4305 + lda #0x01 + sta 0x420b + plb + rtl +restore_dialog_gfx_far: + lda #0x00 + pha + plb + ldx #0x2800 + stx 0x011d + ldx.w #buffer & 0xffff + stx 0x011f + lda.b #buffer >> 16 + sta 0x0121 + ldx.w #render.buffer_size + stx 0x0122 + jsr.w _transfer_to_vram + jsr.l wait_for_vblank_long + jsr.l 0x14ffd6 ; original restore + rtl + +; clone of the original copy to be able to call it from the 0x20 bank. +_transfer_to_vram: + phb + tdc + pha + plb + lda #0x80 + sta 0x2115 + tdc + sta 0x420c + ldy 0x011d + sty 0x2116 + lda #0x01 + sta 0x4300 + rep #0x20 + + lda #0x2118 + sta 0x4301 + + lda 0x011f + sta 0x4302 + lda 0x0121 + sta 0x4304 + sep #0x20 + lda 0x0123 + sta 0x4306 + lda #0x01 + sta 0x420b + plb + rts +} + +.scope render_allocator { +allocated_tile_id = 0x702F00 +init: + pha + lda.b #0x00 + sta.l allocated_tile_id + pla + rts + +increment: + pha + lda.l allocated_tile_id + inc + ; and #0x1f + sta.l allocated_tile_id + pla + rts + +get: + lda.l allocated_tile_id + rts +} + +.scope render { +; variables + +__var_base = 0x00 +bits_left_on_tile = __var_base + 3 +temp = bits_left_on_tile + 1 +counter = temp + 1 +current_char = counter + 2 + +tilemap_offset = 0x1d + +last_drawn_text_ptr = 0xfe + +buffer_ptr = 0x7fA000 +buffer_size = 0x200 +font_ptr = assets_menu_font_dat +length_table_ptr = assets_menu_font_length_table_dat + +init: +; Initialize the renderer +; clear a chunk of ram +; resets variables + initialize(bits_left_on_tile) + jsr.w render_allocator.init + pha + set_var_value(bits_left_on_tile, 0x08) + lda.b bits_left_on_tile +_brk_init_bits: + pla + initialize(temp) + stz.b temp + pha + lda #0x00 + phx + ldx.w #buffer_size +_clear_loop: + lda.b #0xFF + sta.l buffer_ptr, x + lda.b #0x00 + sta.l buffer_ptr + 1, x + dex + dex + bne _clear_loop + plx + pla + + initialize(counter) +rts + +deinit: +{ + restore_long(buffer_ptr) + restore(bits_left_on_tile) + restore(temp) + restore(counter) + rts +} + +make_pointers: +{ + pha + + ldx.w #0x0000 + ldy.w #0x0000 + lda.b current_char + xba + lda.b #0x00 + xba + rep #0x20 + asl + asl + asl + asl + tax + lda.w #0x0000 + sep #0x20 + + lda.l render_allocator.allocated_tile_id + + sta.b oldtilepos + rep #0x20 + asl + asl + asl + asl + sta.b oldtilepos + tay + sep #0x20 + pla + rts +} + +display_char: +{ + sta.b current_char + + jsr.w make_pointers + + rep #0x20 + lda.w #0x0010 + sta.b counter + sep #0x20 + +char_line_loop: + rep #0x20 + lda.w #0x0000 + sep #0x20 + + lda.b bits_left_on_tile + + cmp #0x08 + bne _shift + +_read_8x8_char: + lda.l font_ptr, x + + inx + xba + bra _store + +_shift: + ; expects bitsleft in A + phx + tax + lda.l vwf_shift_table, x + sta.l 0x004202 + + + plx + lda.l font_ptr, x + + inx + + sta.l 0x004203 ; MULTIPLICAND + + rep #0x20 + nop + nop + nop + nop + lda.l 0x004216 ; the result is stored in 0x4216-0x4217 + sep #0x20 + +_store: + + xba + phx + tyx + ora.l buffer_ptr, x + sta.l buffer_ptr, x + xba + ora.l buffer_ptr + 0x10, x + sta.l buffer_ptr + 0x10, x + txy + plx + iny + + dec.b counter + bne char_line_loop + + rep #0x20 + stz.b temp + lda.w #0x0000 + ldx.w #0x0000 + sep #0x20 + + lda.b current_char + tax + +brk_bits_left: + lda.l length_table_ptr, x + + sta.b temp + + rep #0x20 + clc + + lda.w #0x0000 + sep #0x20 + + lda.b bits_left_on_tile + + clc + sbc.b temp + +loopdec: + cmp #0x00 + bmi coupe + beq coupe + + sta.b bits_left_on_tile + jsr.w tilemap_write_no_inc + rts + +coupe: + clc + adc.b #0x08 + jsr.w tilemap_write + bra loopdec +} + +.macro save_a(code) { + pha + {{code}} + pla +} + +.macro with_long_a(code) { + rep #0x20 + {{ code }} + sep #0x20 +} + +tilemap_write_no_inc: + _base_addr = 0x7e0000 + lda.l render_allocator.allocated_tile_id + + ldx.b tilemap_offset + + sta.l _base_addr,x + lda.l _base_addr + 1,x + ora.b #0x01 + sta.l _base_addr + 1,x + + rts + +tilemap_write: + pha + jsr.w tilemap_write_no_inc + jsr.w render_allocator.increment + with_long_a({ + inc.b tilemap_offset + inc.b tilemap_offset + }) + pla + rts +} + + From 83b386dbe642a42bd8a8292f4ef8386f6d4f351a Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:39:10 +0200 Subject: [PATCH 40/52] Adds a build flag to flip intro on. --- ff4.s | 129 +++++++++++++++++++++++++++++++--------------------- src/intro.s | 114 +++++++++++++++++++++++----------------------- 2 files changed, 133 insertions(+), 110 deletions(-) diff --git a/ff4.s b/ff4.s index b4f0b86..2d4c1b9 100644 --- a/ff4.s +++ b/ff4.s @@ -5,12 +5,15 @@ .include 'src/system_menus_text.i' .include 'src/minimal_vwf_patches.s' -.include 'src/battle.s' -.include 'src/battle_magic.s' + +.include 'src/battle/graphics_patches.s' +.include 'src/battle/magic_patches.s' +.include 'src/battle/commands_patches.s' +.include 'src/battle/message_patches.s' +.include 'src/battle/sram_patches.s' .include 'src/places_names.s' .include 'src/new_game.s' -.include 'src/shop_menu.s' .include 'src/ingame/menus.i' @@ -28,21 +31,23 @@ dialog_bank_ptr_base = 0x218000 .db 0x05 ; RAM Size +.if BUILD_INTRO { ; déroutage pour ajouter le splash screen *=0x008031 jsr.l start_splash_screen +} ; déroutage pour utiliser la vwf dans les dialogues. *=0x00B463 jsr.l vwfstart rts -;*=0x0AF000 -; .incbin 'fonts/8x8.bin' +*=0x0AF000 + .incbin 'fonts/8x8.bin' ;*=0x0AFF00-0x10 * 10 -*=0x0AF900 - .incbin 'assets/vwf_precomp.bin' +;*=0x0AF900 +; .incbin 'assets/vwf_precomp.bin' ; Patch des noms des personages *=0x0FA710 @@ -55,68 +60,86 @@ dialog_bank_ptr_base = 0x218000 .incbin 'assets/monsters.dat' *=0x208000 - .include 'src/libmz.s' - .include 'src/intro.s' - .include 'src/vwf.s' - .include 'src/dialog.s' - .include 'src/places_names_window.s' - ; system menu text routines - .include 'src/system_menus_text.s' - - ; menu text scopes - .include 'src/menus/start_screen_text.s' - .include 'src/menus/tools_shop_text.s' - .include 'src/menus/in_game_text.s' - - .include 'src/battle_sram.s' - - .incbin 'assets/magic.dat' - .incbin 'assets/places_names.dat' - .incbin 'assets/classes.ptr' - .incbin 'assets/classes.dat' + .include 'src/libmz.s' + .if BUILD_INTRO { + .include 'src/intro.s' + } + .include 'src/vwf.s' + .include 'src/small_vwf/init.s' + + .include 'src/battle/sram.s' + .include 'src/battle/message.s' + .include 'src/battle/graphics.s' + + .include 'src/dialog.s' + .include 'src/places_names_window.s' + ; system menu text routines + .include 'src/system_menus_text.s' + + ; menu text scopes + .include 'src/menus/start_screen_text.s' + .include 'src/menus/tools_shop_text.s' + .include 'src/menus/in_game_text.s' + + + .incbin 'assets/magic.dat' + .incbin 'assets/places_names.dat' + .incbin 'assets/classes.ptr' + .incbin 'assets/classes.dat' + .incbin 'assets/item_descriptions.dat' *=0x218000 - .incbin 'assets/bank1_1.ptr' - .incbin 'assets/bank1_2.ptr' - .incbin 'assets/bank2.ptr' + .incbin 'assets/bank1_1.ptr' + .incbin 'assets/bank1_2.ptr' + .incbin 'assets/bank2.ptr' *=0x228000 - .incbin 'assets/bank1_1.dat' + .incbin 'assets/bank1_1.dat' *=0x24A000 - .incbin 'assets/bank1_2.dat' + .incbin 'assets/bank1_2.dat' *=0x25A000 - .incbin 'assets/bank2.dat' + .incbin 'assets/bank2.dat' *=0x27A000 - .incbin 'assets/font.dat' - .incbin 'assets/font_length_table.dat' - .incbin 'assets/wicked_font.dat' - .incbin 'assets/wicked_font_length_table.dat' - .incbin 'assets/book_font.dat' - .incbin 'assets/book_font_length_table.dat' - .incbin 'assets/bold_font.dat' - .incbin 'assets/bold_font_length_table.dat' - .incbin 'assets/battle_commands.dat' + .incbin 'assets/menu_font.dat' + .incbin 'assets/menu_font_length_table.dat' + .incbin 'assets/font.dat' + .incbin 'assets/font_length_table.dat' + .incbin 'assets/wicked_font.dat' + .incbin 'assets/wicked_font_length_table.dat' + .incbin 'assets/book_font.dat' + .incbin 'assets/book_font_length_table.dat' + .incbin 'assets/bold_font.dat' + .incbin 'assets/bold_font_length_table.dat' + .incbin 'assets/battle_commands.dat' font_table: - .pointer assets_font_dat - .pointer assets_wicked_font_dat - .pointer assets_book_font_dat - .pointer assets_bold_font_dat + .pointer assets_font_dat + .pointer assets_wicked_font_dat + .pointer assets_book_font_dat + .pointer assets_bold_font_dat length_table: - .pointer assets_font_length_table_dat - .pointer assets_wicked_font_length_table_dat - .pointer assets_book_font_length_table_dat - .pointer assets_bold_font_length_table_dat + .pointer assets_font_length_table_dat + .pointer assets_wicked_font_length_table_dat + .pointer assets_book_font_length_table_dat + .pointer assets_bold_font_length_table_dat ; Splash screen assets *=0x298000 - .incbin 'assets/intro.map' - .incbin 'assets/intro.col' - .incbin 'assets/intro.set' - + .incbin 'assets/battle_messages.ptr' + .incbin 'assets/battle_messages.dat' + +*=0x299900 + .incbin 'assets/battle_text.ptr' + .incbin 'assets/battle_text.dat' + +.if BUILD_INTRO { + .incbin 'assets/logo.map' + .incbin 'assets/logo.col' + .incbin 'assets/logo.set' +} diff --git a/src/intro.s b/src/intro.s index 3f7df3b..0be4f88 100644 --- a/src/intro.s +++ b/src/intro.s @@ -3,18 +3,18 @@ start_splash_screen: jsr.w initialize_snes ; set register modes - rep #0x10 ; make X & Y 16-bits - sep #0x20 ; make A 8-bits + rep #0x10 ; make X & Y 16-bits + sep #0x20 ; make A 8-bits ; initialise graphics hardware - lda #0x03 ; graphics mode 3 - sta 0x2105 - lda #0x01 ; enable plane 0 - sta 0x212c - lda #0x00 ; set plane 0 memory to 0x0000, 32x32 chars - sta 0x2107 - lda #0x01 ; set plane 0 character set to 0x1000 - sta 0x210b + lda #0x03 ; graphics mode 3 + sta 0x2105 + lda #0x01 ; enable plane 0 + sta 0x212c + lda #0x00 ; set plane 0 memory to 0x0000, 32x32 chars + sta 0x2107 + lda #0x01 ; set plane 0 character set to 0x1000 + sta 0x210b ; copy intro map data dma_transfer_to_vram_call(assets_intro_map, 0x0000, assets_intro_map__size, 0x1801) @@ -27,41 +27,41 @@ start_splash_screen: jsr.w splash_screen_fade_in - lda #0x80 - jsr.w gamepad_interruptable_loop + lda #0x80 + jsr.w gamepad_interruptable_loop jsr.w splash_screen_fade_out ; runs the original jsl routines - jsr.l 0x15C8DF - jsr.l 0x15C9AA + jsr.l 0x15C8DF + jsr.l 0x15C9AA - rtl + rtl ; TODO: rewrite as HDMA table would make it look less hacky. splash_screen_fade_out: { stz 0x00 loop: - inc 0x00 - lda #0x0F - sbc 0x00 - sta 0x2100 - lda 0x00 - cmp #0x0F - beq exit - lda 0x00 - asl - asl - asl - asl - inc - sta 0x2106 - - jsr.w wait_for_vblank - jsr.w wait_for_vblank - jsr.w wait_for_vblank - bra loop + inc 0x00 + lda #0x0F + sbc 0x00 + sta 0x2100 + lda 0x00 + cmp #0x0F + beq exit + lda 0x00 + asl + asl + asl + asl + inc + sta 0x2106 + + jsr.w wait_for_vblank + jsr.w wait_for_vblank + jsr.w wait_for_vblank + bra loop exit: rts } @@ -71,26 +71,26 @@ splash_screen_fade_in: { stz 0x00 loop: - inc 0x00 - lda 0x00 - sta 0x2100 - asl - asl - asl - asl - sta 0x01 - lda #0xF0 - sec - sbc 0x01 + inc 0x00 + lda 0x00 + sta 0x2100 + asl + asl + asl + asl + sta 0x01 + lda #0xF0 + sec + sbc 0x01 inc - sta 0x2106 + sta 0x2106 - jsr.w wait_for_vblank - jsr.w wait_for_vblank + jsr.w wait_for_vblank + jsr.w wait_for_vblank - lda 0x00 - cmp #0x0F - beq exit + lda 0x00 + cmp #0x0F + beq exit bra loop exit: rts @@ -101,13 +101,13 @@ gamepad_interruptable_loop: ; 8bit A: Number of iterations { jsr.w enable_gamepad - jsr.w wait_for_vblank + jsr.w wait_for_vblank - ldx 0x4218 ; lecture depuis joystick - bne exit ; si on appuye sur quelque chose on sort du delay - dec - bne gamepad_interruptable_loop + ldx 0x4218 ; lecture depuis joystick + bne exit ; si on appuye sur quelque chose on sort du delay + dec + bne gamepad_interruptable_loop exit: jsr.w disable_gamepad - rts + rts } From 95c072cb8cdb88849d2dde1aadd242400a5084ab Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:40:08 +0200 Subject: [PATCH 41/52] Adds battle dialogs and texts. --- text/fr/battle_messages.xml | 375 ++++++++++++++++++++++++++++++++++++ text/fr/battle_text.xml | 119 ++++++++++++ 2 files changed, 494 insertions(+) create mode 100644 text/fr/battle_messages.xml create mode 100644 text/fr/battle_text.xml diff --git a/text/fr/battle_messages.xml b/text/fr/battle_messages.xml new file mode 100644 index 0000000..4904ec0 --- /dev/null +++ b/text/fr/battle_messages.xml @@ -0,0 +1,375 @@ + + +Le dragon a changé de forme en brouillard ![end] + +Retour à la normale ! C’est le moment d’attaquer ![end] + +Le brouillard annule toutes les attaques.[end] + +Si vous attaquez, vous serez touché par le souffle du dragon ![end] + +C’est le moment de le vaincre quand il montre sa véritable forme ![end] + +Adieu[end] + +Argh ! Mon corps se décompose !![end] + +Mes adorables enfants[end] + +… en train de confirmer l’intrus…[end] + +Fou ! Je vais venir vers vous maintenant ![end] + +Yang「C’est inutile… il n’y a pas de chance de gagner…[end] + +Si seulement je pouvais utiliser l’épée…[end] + +Tella「Bon sang...[end] + +Si c’est le cas, il n’y a pas d’autre choix que de changer de forme ![end] + +Réveillez-vous! Yang![end] + +Meurs !![end] + +『Cecilだ! Tu ne comprends pas ![end] + +En avant ![end] + +Aïe‥‥[end] + +Je n’en peux plus, c’est insupportable !!![end] + +Celui qui a vu l’invitation ne peut pas être laissé en vie.”[end] + +S’il vous plaît ! Arrêtez tous les deux ![end] + +Tella: Toi, comment oses-tu faire du mal à ma fille‥‥[end] + +C’est faux ![end] + +Tella「Qu’est-ce qui est faux ?![end] + +Veuillez écouter ce que j’ai à dire ![end] + +Tella: Tais-toi ![end] + +Barde:Je vous en prie ![end] + +Tell: Cette douleur, c’est la douleur d’Anna…[end] + +Anna… qu’est-ce que…[end] + +Si tu es un véritable paladin…[end] + +Range ton épée et endure ![end] + +Plutôt que la justice, plutôt que ce qui est juste…[end] + +Il y a quelque chose de plus important.[end] + +Un jour, tu comprendras.[end] + +Je vais te pousser du haut de la falaise ![end] + +Tella: Le moment est-il venu d’utiliser Météore‥‥ ?[end] + +Arrête ! Si tu fais ça‥‥[end] + +Yang: C’est toi qui ne tiendras pas ![end] + +Tella: Convertis toute ma vie en PM ![end] + +Je vais te vaincre‥‥!![end] + +Argh, quel désastre, le Météore‥‥![end] + +Après tout, à toi, un vieil homme‥‥[end] + +Je ne devrais pas avoir la force de te vaincre ![end] + +Imbécile ![end] + +Maintenant, Rag! Utilise la magie sur moi ![end] + +C’est inutile, on ne peut pas voir à cause du vent depuis l’avant ![end] + +Il n’y a pas d’autre choix que de frapper en sautant ![end] + +Roi: Vous aussi, hein ? Si vous voulez mourir autant que ça‥‥[end] + +Je vais tous vous réduire en sable de l’enfer ![end] + +Edge: Qu’est-ce qui t’arrive !?[end] + +Papa ! Maman ![end] + +Edge: C’est moi ! Hé‥‥[end] + +Le roi et la reine ont récupéré leur raison ![end] + +Roi: Edge, hein‥‥ Écoute ce que j’ai à dire.[end] + +Nous ne sommes plus des êtres humains‥‥[end] + +Nous sommes des êtres qui ne devraient pas exister.[end] + +Reine: Il n’y a rien à te laisser‥‥[end] + +Pourquoi ! Cain ![end] + +Cette question est inutile ![end] + +Que diable s’est-il passé !?[end] + +Tais-toi, c’est bruyant ![end] + +Cecil ! C’est le coup final ![end] + +Ça va exploserーーー![end] + +Anna: Libère ton courage ![end] + +A-Anna ![end] + +Tu n’es pas aussi faible que tu le penses.[end] + +Crois en toi ![end] + +Je vais essayer, Anna ![end] + +Ugh, gloups ![end] + +Nous avons commencé à rassembler de l’eau pour le tsunami ![end] + +Renforcez la défense en restant à l’intérieur ![end] + +Tella: Comme prévu, un serviteur des ténèbres ![end] + +Tes mouvements sont devenus lents ![end] + +Golbez: Ha ha ha ha[end] + +C’est cela, votre pouvoir‥‥[end] + +Je vais vous demander de rester tranquille un moment ![end] + +Avec les yeux laissés dans un corps immobile[end] + +Tu ferais bien de goûter à la véritable terreur ![end] + +Viens, Dragon Noir ![end] + +Golbez: Cecil, c’est toi le prochain ![end] + +Capitaine: Attaquez ! [end] + +Général: Attaquez ![end] + +Golbez: Le dragon‥‥[end] + +????: Ça va, je peux déjà bouger ![end] + +Cette voix‥‥[end] + +Que je perde‥‥[end] + +Professeur: Va ! Balneva, écrase-les complètement ![end] + +Balneva: Ugh ![end] + +Professeur: Aïe ! Que fais-tu en me frappant ?[end] + +C’est là-bas, là-bas, tu as compris ![end] + +Professeur: Bien, montre-moi ta puissance ![end] + +Professeur : Comment osez-vous, ma chère Balneva‥ ![end] + +Professeur: Dans ce cas, je vais m’en occuper moi-même.[end] + +Balneva, contrôle-le ![end] + +Professeur: Il ne faut pas que l’huile vienne à manquer ![end] + +Balneva: A‥b‥ra‥c‥k‥[end] + +Je vais te montrer ce qu’est la véritable terreur ![end] + +Transformation ![end] + +Professeur: “Oh, qu’est-ce que c’est que ce bouton… ◉Tch”[end] + +Chien : “Grande sœur, on y va!”[end] + +Lag : “Grande sœur Mag, renvoie-le!”[end] + +Les trois sœurs Magus : “Attaque Delta !!”[end] + +“Tu vas mourir.”[end] + +Le courant électrique a transpercé Odin ![end] + +Rubicante : “Qu’est-ce que c’est que cette pitoyable technique…?”[end] + +“Un jour, je renaîtrai certainement.”[end] + +“Le feu, c’est comme ça qu’on l’utilise !”[end] + +Edge「‥‥[end] + +“Pendant que nous avons encore conscience”[end] + +“Nous devons nous battre ici…”[end] + +“Après, je compte sur toi, Edge.”[end] + +Edge: “Je ne veux pas ! Je ne veux pas y aller !”[end] + +“Adieu, Edge.”[end] + +Edge: “Attends ! Maman !”[end] + +“Je ne veux pas――”[end] + +“La barrière a été brisée par l’élément foudre !”[end] + +“Tous les effets magiques ont été annulés !”[end] + +“Incompétent !”[end] + +Ah[end] + + 5[end] + + 4[end] + + 3[end] + + 2[end] + + 1[end] + +“Les poupées vont fusionner !”[end] + +“La puissance de fusion est épuisée !”[end] + +FuSoYa: “Encore un effort et la puissance sera dirigée vers Méteo !”[end] + +Bien sûr ![end] + +Zemus: “Utilise toute ta puissance.”[end] + +Zemus: “Même si ce corps se détruit…”[end] + +“Mais l’âme… se… fusionnera…”[end] + +FuSoYa: “C’est inutile, Méteo ne lui fera aucun effet !”[end] + +“Golbez ! C’est le moment d’utiliser les cristaux !”[end] + +Zeromus: “C’est toi qui as emprunté le chemin des ténèbres.”[end] + +“Même si tu utilises les cristaux, la lumière ne reviendra pas.”[end] + +“Il ne reste plus que l’oubli dans les ténèbres !”[end] + +"Croassements !”[end] + +“Un monstre est sorti de la porte !”[end] + +“Encore trop jeune !”[end] + +“Regarde mon statut !”[end] + +“Faible face à la force.”[end] + +“Faible face à la fille aux lunettes.”[end] + +Rubicante: “C’est une défaite pour moi ici, mais…”[end] + +“Complètement faible.”[end] + +“Ce n’était pas censé se passer ainsi…”[end] + +“Comment oses-tu me frapper, moi, dans cet état !?”[end] + +“Oh non, pardonne-moi !”[end] + +“Vas-y, Cecil !”[end] + +“Maître Zemus… le rapport…”[end] + +“Tu veux entendre mon violon (morceau) préféré ?”[end] + +“Je n’ai pas envie d’écouter…”[end] + +“Ah, je vois…”[end] + +“Dansons ensemble !”[end] + +Gilbert: “Tout le monde ! Courage !”[end] + +Tella: “Si tu persévères, tu réussiras. Crois en toi !”[end] + +“La force des souhaits des deux personnes a été accordée !”[end] + +Palom: “Grand frère !”[end] + +Porom: “Nous allons t’envoyer notre magie !”[end] + +“La force de la gentillesse des deux a été accordée !”[end] + +Yang: “Concentre ton esprit !”[end] + +Cid: “Tu dois absolument revenir !”[end] + +“La force des prières des deux a été accordée !”[end] + +FuSoYa: “Ô lune, accorde-nous ta lumière !”[end] + +Golbez :“Mon frère !”[end] + +“La puissance sacrée que tu as cachée.”[end] + +“Confie-le au cristal !”[end] + +“Zeromus ! Montre-nous ta véritable forme !”[end] + +ふたりの こころが せいなるひかりさ あたえた![end] + +ゼロムス「ガ‥‥グ‥‥グ‥‥ゴ‥‥‥[end] + +「ガスさすって いけるしかばねに なるがいい![end] + +「しねっ![end] + +ゼロムスの しんのすがたさ てらしだした![end] + +「バトルプログラマーさ なぐるとは![end] + +「このやろー じばく してやるっ![end] + +「ヒッ ヒッ ひっかかりおったな![end] + +「こくりゅうさ きりのちからで けしさるとは‥‥[end] + +「おまえたちさ ころして わたしも しのう![end] + +「このいかづちさ ばいにして かえしてやるわ![end] + +「なんで おこすんじゃ いいとこじゃったのに[end] + +「つづきさ みるとするか‥‥[end] + +「さあ だれからいくの?[end] + +マネージャー「ひろみさん ごしめいです![end] + +「こんど ぱぱになるんだ はァん[end] + +「いいだろ[end] + +「じゃあな はァん[end] + + diff --git a/text/fr/battle_text.xml b/text/fr/battle_text.xml new file mode 100644 index 0000000..8664b56 --- /dev/null +++ b/text/fr/battle_text.xml @@ -0,0 +1,119 @@ + + +Aucun effet[end] + +PM insuffisants[end] + +Attaque préventive ![end] + +Attaque surprise ![end] + +Attaque par-derrière ![end] + +Il s’est enfui[end] + +Victoire en combat ![end] + +Je me souviens ![end] + +Non, ce n’est pas ça[end] + +Hélas, je ne me souviens de rien[end] + +Je ne peux pas parler[end] + +Chanson des grenouilles[end] + +Berceuse[end] + +Chanson de séduction[end] + +Chanson du silence[end] + +くすりが たりない[end] + +La prière n’a pas atteint le ciel[end] + +La synchronisation est perturbée[end] + +Magie augmentée ![end] + +Monstre paniqué[end] + +Pas de faiblesse[end] + +Faible au feu[end] + +Faible au gel[end] + +Faible à la foudre[end] + +Faible aux ténèbres[end] + +Faible à la lumière[end] + +Faible aux objets volants[end] + +Vol raté[end] + +Découvert par un monstre[end] + +[0x6]3 à volé[end] + +[0x6]0/[0x6]1[end] + +[0x6]0 Gils obtenus[end] + +[0x6]1 points d'expérience acquis[end] + +[0x6]2 gagne un niveau.[end] + +Impossible de fuir ![end] + +[0x6]4 appris![end] + +Le groupe a été anéanti…[end] + +Incapable de se battre ![end] + +Pétrifié ![end] + +Transformé en grenouille ![end] + +Transformé en nain ![end] + +Transformé en cochon ![end] + +Silence ![end] + +Enveloppé dans les ténèbres ![end] + +Empoisonné ![end] + +Maudit ![end] + +だみー[end] + +Paralysé ![end] + +Endormi ![end] + +Confus ![end] + +Évanoui ![end] + +On se pétrifie peu à peu !?[end] + +On se pétrifie peu à peu !?[end] + +Dégâts de poison[end] + +PV régénérés[end] + +[0x6]0 Gils tombés![end] + +“Peu à peu, l’énergie s’est épuisée et la force a disparu.[end] + +Force concentrée, puissance d’attaque doublée ![end] + + From fb842262b83b2478acb4f31b47cdb334aa43e369 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:40:26 +0200 Subject: [PATCH 42/52] Adds item descriptions. --- text/fr/item_descriptions.xml | 50 +++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 text/fr/item_descriptions.xml diff --git a/text/fr/item_descriptions.xml b/text/fr/item_descriptions.xml new file mode 100644 index 0000000..8852517 --- /dev/null +++ b/text/fr/item_descriptions.xml @@ -0,0 +1,50 @@ + + + Ne peut pas être utilisé dans le menu. + Restaure des HP. + Restaure des MP. + Restaure complètement les HP/MP. + Guérit l'incapacité de combattre. + Guérit la pétrification. + Guérit le statut de grenouille. + Guérit le statut de nain. + Guérit le statut de cochon. + Guérit le silence. + Guérit la cécité. + Neutralise le poison. + Enlève la malédiction. + Guérit divers états. + Reposez-vous pour restaurer les HP/MP. + Revient à l'étape précédente. + Téléporte à la surface. + Affichez la carte de la région. + Lévitera temporairement. + Livre favori! + C'est de la magie d'invocation. + Transforme en nain ou rétablit. + Transforme en grenouille ou rétablit. + Transforme en cochon ou rétablit. + C'est une boisson mystique. + C'est une pomme dorée. + C'est une pomme argentée. + Cela attire des monstres. + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + Test + From fac314d2378ecdf73f8b37414e3a0bf64385d8f5 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:40:46 +0200 Subject: [PATCH 43/52] Translate place names. --- text/fr/places-names.xml | 50 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/text/fr/places-names.xml b/text/fr/places-names.xml index d1f3a43..efd88c0 100644 --- a/text/fr/places-names.xml +++ b/text/fr/places-names.xml @@ -1,13 +1,13 @@ - Floor 1 - Floor 2 - Floor 3 - Floor 4 - Floor 5 - Floor 6 - Floor 7 - Floor 8 + Rez-de-chaussé + 1er Étage + 2eme Étage + 3eme Étage + 4eme Étage + 5eme Étage + 6eme Étage + 7eme Étage Basement Floor 1 Basement Floor 2 Basement Floor 3 @@ -16,17 +16,17 @@ Basement Floor 6 Basement Floor 7 Basement Floor 8 - Inn - Weapon Shop + Auberge + Armurerie Armor Shop - Tool Shop - Cafe + Quincaillerie + Café Camp - King's Room - Dungeon - Crystal Room - Chocobo Forest - Chocobo Village + Chambre Royale + Donjon + Chambre du Crystal + Forêt Chocobo + Village Chocobo Weapon and Armor Shop Tour Ouest @@ -37,14 +37,14 @@ Château de Baron White Magic Classroom Black Magic Classroom - Your Room - Town of Baron - Underground Lake + Ta Chambre + Village de Baron + Lac Souterrain Underground Channel -N. - Cave of Mist - Village of Mist - A House - Oasis Village of Kaipo + Grotte de Mist + Village de Mist + Maison + Oasis de Kaipo Underground Channel -S. Underground Waterfall Damcyan Castle @@ -79,7 +79,7 @@ Tower of Babil - Floor 1 Tower of Zott Giant's Mouth - Castle of Dwarves + Château des Nains Back Room Passage to Babil Mt. Ordeals -3rd Station From e0c9cc6b5165e632f34ad1aa87e25c89cbd0c4d0 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:41:15 +0200 Subject: [PATCH 44/52] Rename Gilbert into Edward. --- text/fr/characters_names.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text/fr/characters_names.xml b/text/fr/characters_names.xml index e83de3a..8651031 100644 --- a/text/fr/characters_names.xml +++ b/text/fr/characters_names.xml @@ -4,7 +4,7 @@ Cain Rydia Tella - Gilbert + Edward Rosa Yang Palom @@ -14,4 +14,4 @@ FuSoYa Golbez Anna - \ No newline at end of file + From f757a9f5db7a123628326f752e5d13781735ceda Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:41:50 +0200 Subject: [PATCH 45/52] Updates characters classes. --- text/fr/characters_classes.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/text/fr/characters_classes.xml b/text/fr/characters_classes.xml index 1f68dd1..72e5ba9 100644 --- a/text/fr/characters_classes.xml +++ b/text/fr/characters_classes.xml @@ -2,7 +2,7 @@ Chevalier noir Chevalier dragon - Invokeur + Invocateur Sage Menestrel Sorcier Blanc @@ -10,8 +10,8 @@ Sorcier Noir Sorcier Blanc Paladin - Ingenieur - Invokeur + M[0x90]canicien + Invocateur Ninja - Selenite - \ No newline at end of file + S[0x90]l[0x90]nite + From fccbf4ab7877bd59b34dbec5023a3b4c69c688a6 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:42:06 +0200 Subject: [PATCH 46/52] Updates ff4 menu table. --- text/ff4_menus.tbl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/text/ff4_menus.tbl b/text/ff4_menus.tbl index b8a1abd..a029df1 100644 --- a/text/ff4_menus.tbl +++ b/text/ff4_menus.tbl @@ -76,10 +76,14 @@ 89=9 8A=ç 8B=û +C1=. C2=- C3=.. C4=! C5=? +C6=% +C7=/ +C8=: 8E=. 8F=, 90=' @@ -99,5 +103,5 @@ C5=? 9F=Ç FB=[nowindow] FC=[new]\n -FD=° FF= +FD=° From 2b6f11713ee38edeb0fb099c187d63659f493ec9 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:42:32 +0200 Subject: [PATCH 47/52] Update build script. --- build.py | 89 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 74 insertions(+), 15 deletions(-) diff --git a/build.py b/build.py index f5ff9a1..23b558e 100755 --- a/build.py +++ b/build.py @@ -1,16 +1,18 @@ #!/usr/bin/env python3 # coding:utf-8 import os +import struct +from typing import Callable from xml.etree import ElementTree -from a816.cpu.cpu_65c816 import snes_to_rom from a816.program import Program +from a816.symbols import low_rom_bus from script import Table from script.formulas import long_low_rom_pointer from script.pointers import read_pointers_from_xml, write_pointers_value_as_binary, write_pointers_addresses_as_binary, \ Pointer -import struct -from utils.font import convert_font_to_1bpp + +from utils.font import convert_font_to_1bpp, convert_font_to_2bpp from utils.smallvwf import generate_8x8_vwf_asset @@ -25,7 +27,8 @@ def read_fixed_from_xml(input_file, table, formatter=None): for child in root: text = child.text pointer = Pointer(i) - pointer.value = table.to_bytes(formatter(text) if formatter else text) if text else b'' + formatted_text = formatter(text) if formatter else text + pointer.value = table.to_bytes(formatted_text) if text else b'' if len(pointer.value) < length: pad_length = length - len(pointer.value) @@ -67,13 +70,40 @@ def build_patch(input, output): ff4_asm = Program() ff4_asm.assemble_as_patch(input, output) ff4_asm.resolver.dump_symbol_map() + ff4_asm.exports_symbol_file("./build/ff4.cpu.sym") + +def word_low_rom_pointer(base: int) -> Callable[[int], bytes]: + def inner_func(pointer: int) -> bytes: + snes_address = low_rom_bus.get_address(base) + pointer + return struct.pack(" Date: Mon, 16 Sep 2024 23:42:59 +0200 Subject: [PATCH 48/52] Updates a816 to v1.0.3.b1. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e3642aa..05bfb9e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -a816==1.0.2 +a816==1.0.3.b1 pillow numpy From 4790bca5cee3ac6f7fac8390b2a6b7e429620192 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 16 Sep 2024 23:43:31 +0200 Subject: [PATCH 49/52] Updates the python utils. --- tests/__init__.py | 0 tests/vwf_renderer_test.py | 32 +++++++++ utils/dump.py | 138 ++++++++++++++++++++++++++++++++++++- utils/font.py | 48 +++++++++++-- utils/scratchpad.py | 22 ++++++ utils/smallvwf.py | 103 ++++++++++++++++++++++----- 6 files changed, 315 insertions(+), 28 deletions(-) create mode 100644 tests/__init__.py create mode 100644 tests/vwf_renderer_test.py create mode 100644 utils/scratchpad.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/vwf_renderer_test.py b/tests/vwf_renderer_test.py new file mode 100644 index 0000000..f1eb9fe --- /dev/null +++ b/tests/vwf_renderer_test.py @@ -0,0 +1,32 @@ +import unittest +from pathlib import Path +from xml.etree import ElementTree + +from build import read_fixed_from_xml +from utils.smallvwf import VwfAsset + + +class VwfRendererTestCase(unittest.TestCase): + def test_render(self): + vwf = VwfAsset("./fonts/8x8vwf.png") + strings = [] + # with open("./text/fr/monsters.xml", encoding='utf-8') as datasource: + # tree = ElementTree.parse(datasource) + # root = tree.getroot() + # + # for child in root: + # text = child.text + # if text: + # strings.append(text) + + strings = [ + "Objets", "Magie", "Equiper", "Statut", "Placer", "Changer", "Options", "Sauver" + ] + + vwf.set_strings(strings) + + vwf.render() + renderd = Path("./renderd.bin") + serialized = vwf.serialize() + + renderd.write_bytes(serialized) diff --git a/utils/dump.py b/utils/dump.py index 9bede5b..683e59b 100755 --- a/utils/dump.py +++ b/utils/dump.py @@ -1,8 +1,12 @@ #!/usr/bin/env python3.4 +import struct + +import script from a816.cpu.cpu_65c816 import snes_to_rom +from a816.symbols import low_rom_bus from script import Table from script.formulas import base_relative_16bits_pointer_formula -from script.pointers import Script, write_pointers_as_xml +from script.pointers import Script, write_pointers_as_xml, Pointer def write_fixed_text_as_xml(pointers, table, length, output_file): @@ -16,9 +20,137 @@ def write_fixed_text_as_xml(pointers, table, length, output_file): fd.write('\n') fd.write('\n') +def write_nul_terminated_strings_as_xml(strings, output_file): + with open(output_file, 'wt', encoding='utf-8') as fd: + fd.writelines('\n') + fd.write('\n') + for s in strings: + fd.write('') + fd.write(s) #.strip()) + fd.write('\n') + fd.write('\n') + +def dump_en(): + # jtable = Table('../text/ff4_jap.tbl') + jtable = Table('../text/ff4_menus.tbl') + item_description = low_rom_bus.get_address(0x2407ad) + item_desc = [] + + # with open('../ff4j.smc', 'rb') as rom: + with open('../Final Fantasy IV (Japan) (Rev 1) [En by J2e v3.21].sfc', 'rb') as rom: + rom.seek(item_description.physical) + for k in range(443): + s = bytes() + while (char := rom.read(1)) != b'\x00': + print(char) + s += char + item_desc.append(jtable.to_text(s)) + + write_nul_terminated_strings_as_xml(item_desc, "../text/en/item_descriptions.xml") + ... + +def dump_jp(): + jtable = Table('../text/ff4_jap.tbl') + #jtable = Table('.text/ff4_menus.tbl') + item_description = low_rom_bus.get_address(0x0fae2a) + item_desc = [] + + with open('../ff4j.smc', 'rb') as rom: + #with open('../Final Fantasy IV (Japan) (Rev 1) [En by J2e v3.21].sfc', 'rb') as rom: + rom.seek(item_description.physical) + for k in range(47): + s = bytes() + while (char := rom.read(1)) != b'\x00': + print(char) + s += char + item_desc.append(jtable.to_text(s)) + + write_nul_terminated_strings_as_xml(item_desc, "../text/jp/item_descriptions.xml") + ... + + +def dump_handedness(): + jtable = Table('../text/ff4_jap.tbl') + addr = low_rom_bus.get_address(0x01e2d9) + with open('../ff4j.smc', 'rb') as rom: + rom.seek(addr.physical) + data = rom.read(8*4) + text = jtable.to_text(data) + ... if __name__ == '__main__': - table = Table('text/ff4_menus.tbl') + jtable = Table('../text/ff4_jap.tbl') +# addr = low_rom_bus.get_address(0xef200) +# with open('../ff4j.smc', 'rb') as rom: +# rom.seek(addr.physical) +# i = 0 +# battle_messages_pointers = [] +# while i < 0xba: +# data = rom.read(2) +# pointer = struct.unpack(' np.ndarray: shape = image.shape width = shape[1] height = shape[0] @@ -34,7 +35,7 @@ def char_as_1bbp(char): return bytes(binary_data) -def get_max_width(char): +def get_max_width(char: np.ndarray) -> int: max_width = 0 for byte in char: trimmed = np.trim_zeros(byte, 'b') @@ -43,23 +44,43 @@ def get_max_width(char): return max_width -def convert_font_to_1bpp(font_file, has_grid=True): +def convert_font_to_1bpp(font_file, has_grid=True, char_height=16): image = np.array(Image.open(font_file)) # image = ndimage.imread(font_file) - char = get_char(image, 0x00, has_grid, 8, 16) + char = get_char(image, 0x00, has_grid, 8, char_height) data = b'' char_index = 1 while len(char) > 0: data += char_as_1bbp(char) - char = get_char(image, char_index, has_grid, 8, 16) + char = get_char(image, char_index, has_grid, 8, char_height) + char_index += 1 + + len_table = {} + for i in range(char_index - 1): + len_table[i] = get_max_width(get_char(image, i, has_grid, 8, char_height)) + + return len_table, data + +def convert_font_to_2bpp(font_file, has_grid=True, char_height=16): + image = np.array(Image.open(font_file)) + + # image = ndimage.imread(font_file) + + char = get_char(image, 0x00, has_grid, 8, char_height) + + data = b'' + char_index = 1 + while len(char) > 0: + data += write_as_2bpp(char) + char = get_char(image, char_index, has_grid, 8, char_height) char_index += 1 len_table = {} for i in range(char_index - 1): - len_table[i] = get_max_width(get_char(image, i, has_grid, 8, 16)) + len_table[i] = get_max_width(get_char(image, i, has_grid, 8, char_height)) return len_table, data @@ -89,4 +110,17 @@ def remove_grid(font_file): if __name__ == '__main__': - remove_grid('/Users/emmanuel/PycharmProjects/ff4/fonts/wicked_vwf.png') \ No newline at end of file + remove_grid('/Users/emmanuel/PycharmProjects/ff4/fonts/wicked_vwf.png') + + +def write_as_2bpp(data: np.ndarray) -> bytearray: + binary_data = bytearray() + for y_value in range(0, len(data[0]), 8): + char = data[0:8, y_value:y_value + 8] + + for byte in char: + byte_value = int(''.join(byte.astype(str)).ljust(8, '0'), 2) + binary_data.append(0xFF) + binary_data.append(byte_value) + + return binary_data diff --git a/utils/scratchpad.py b/utils/scratchpad.py new file mode 100644 index 0000000..83b98d9 --- /dev/null +++ b/utils/scratchpad.py @@ -0,0 +1,22 @@ +if __name__ == "__main__": + texts = [ + "Requis", + "Garde", + "Rang" + ] + t = ' '.join(texts) + + available = sorted({c for c in t}) + print(''.join(sorted(available))) + print (len(available)) + mp_needed = [available.index(c) + 0xdd for c in "Requis"] + # mp_needed[mp_needed.index(0xdd)]= 0xff + + garde_text = [available.index(c) + 0xdd for c in "Garde "] + garde_text[garde_text.index(0xdd)]= 0xff + + passer_text = [available.index(c) + 0xdd for c in "Rang"] + + print(mp_needed) + print(garde_text) + print(passer_text) diff --git a/utils/smallvwf.py b/utils/smallvwf.py index 4896421..6b1253c 100644 --- a/utils/smallvwf.py +++ b/utils/smallvwf.py @@ -1,12 +1,15 @@ -from math import ceil import binascii import struct -from PIL import Image -from utils.font import get_char, get_max_width +from math import ceil + import numpy as np +from PIL import Image +from script import Table + +from utils.font import get_char, get_max_width, write_as_2bpp + def text_to_char(text): - ord('Z') - ord('A') data = [] for char in text: if 'A' <= char <= 'Z': @@ -44,18 +47,6 @@ def build_text_image(font_file, text_data): return buffer -def write_as_2bpp(data): - binary_data = bytearray() - for y_value in range(0, len(data[0]), 8): - char = data[0:8, y_value:y_value + 8] - - for byte in char: - byte_value = int(''.join(byte.astype(str)).ljust(8, '0'), 2) - binary_data.append(0xFF) - binary_data.append(byte_value) - - return binary_data - classes = [ 'Chevalier noir ', 'Chevalier dragon ', @@ -117,6 +108,82 @@ def write_as_2bpp(data): ] +# new file format: +# ptr: 2 len:1 tile_count: 1 +# +# ptr: data: len +# on the programming side: +# we need to know where we can write in the vram +# vram_ptr +# need to display item n: lookup the n-th pointer and the data size, +# setup DMA transfer +# know the tile_id and tile_count ? +# ring buffer ? + +class VwfAsset: + def __init__(self, font_file: str, table: Table) -> None: + self.font = np.array(Image.open(font_file)) + self.strings = [] + self.rendered_strings: dict[str, np.ndarray] = {} + self.table = table + + def set_strings(self, strings: list[str]) -> None: + self.strings = strings + + def get_char(self, char: int) -> np.ndarray: + current_char = get_char(self.font, char, True, 8, 8) + if char == 0xFF: + width = 2 + else: + width = get_max_width(current_char) + + return current_char[0:8, 0:width + 1] + + def render_string(self, string: str) -> np.ndarray | None: + buffer: np.ndarray | None = None + chars = self.table.to_bytes(string) + for char in chars: + culled_char = self.get_char(char) + + if buffer is not None: + buffer = np.concatenate((buffer, culled_char), 1) + else: + buffer = culled_char + + return buffer + + def render(self) -> None: + buffer: np.ndarray | None = None + + for string in self.strings: + string_buffer = self.render_string(string) + self.rendered_strings[string] = string_buffer + + return buffer + + def serialize(self) -> bytearray: + pointers: list[tuple[int, int, int]] = [] + data = bytearray() + data_origin = len(self.rendered_strings.keys()) * 3 + + for string, rendered_string in self.rendered_strings.items(): + serialized_string = write_as_2bpp(rendered_string) + pointers.append((len(data) + data_origin, len(serialized_string), len(serialized_string) // 16)) + data += serialized_string + + pointer_data = bytearray() + + for pointer in pointers: + pointer_data += struct.pack(">HBB", pointer[0] & 0xffff, pointer[1], pointer[2]) + + + return pointer_data + data + + + + + + def generate_8x8_vwf_asset(string_list, prefix, table_start, max_tile_length=None): k = 0 current_id = table_start @@ -129,7 +196,7 @@ def generate_8x8_vwf_asset(string_list, prefix, table_start, max_tile_length=Non for string in string_list: if max_tile_length: output.seek(k * line_length) - data = build_text_image('fonts/8x8vwf.png', string.strip()) + data = build_text_image('fonts/8x8vwf2.png', string.strip()) data_2bpp = write_as_2bpp(data) output.write(data_2bpp) length_table.write(struct.pack(' Date: Mon, 16 Sep 2024 23:45:23 +0200 Subject: [PATCH 50/52] Adds 8x8vwf2p.png. --- fonts/8x8vwf2p.png | Bin 0 -> 854 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fonts/8x8vwf2p.png diff --git a/fonts/8x8vwf2p.png b/fonts/8x8vwf2p.png new file mode 100644 index 0000000000000000000000000000000000000000..262132a01380552357aa975102aca13067bf1094 GIT binary patch literal 854 zcmeAS@N?(olHy`uVBq!ia0vp^6M=X!2Q!e|yM<>vkWxtY2=ZlMs8VBKXlP+z_yrVd zc)`F>YQVtoDuIE)Y6b&?c)^@qfi^%1wg8_HS0MfW|No^o=iddg7?Zr+T^Ro}>D~i! z*h@TpUD;o73W)IWao*zvn#QE*>EaktaqI02#=OG@9Ij{o>f2_%j(Ws@W6RBJW$#x8 z=~|c7F(gki1nP!@2bzYz|7~A$d|&jlU3&lL??3z{yFdHRueSywTwP)-runSzf_Uslpt8DHXrdcHC$-A&l=9PP3inG`r4a4`3FXv3DJj*2=E84qmk^7?z z!@a`p*41Y%t8MS{-d(m{v~j~k{@U|X?DpJrH&gkoQ4%0o7I~Qc?LMWc1#OEmqk=Eq z`nAt{a@@X1FW0iUWqZq>TXfzDSmJonI@@(&x4N^4c`tkO?X<2rsb|8vzB!e?&`c?s zx^gYk>!qKbis(G%u}1kLl-F<8bD+$9{IXy_>b^T=vehYoBCo*l9P_-{{j;wLf)>-CevV zp06u5jZj^-XkpmxNg^pHbY7M{exWCQknN!1ylLO3wg0#l*Y9VwSEJ+2m)I2bnr;ie zuFhAhoNWtoZp?7rq8B^uX+iYFDRYd(LIk7p<8;@za+dj3H9Duxebx3|^OA%nUq$GZ zv+b)4{~xpPy58|`Zt>Pzis!poZG-OrFLqscLX-FJ%s%l$8tVHFfYKlk@P8`N594sU zaGR3}A^;{EzCUDUILutld0^uipnz(LYeY#(Vo9o1a#1RfVlXl=GSM}#)HO5 Date: Mon, 16 Sep 2024 23:47:22 +0200 Subject: [PATCH 51/52] Use the vwf2p file in the smallvwf python. --- utils/smallvwf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/smallvwf.py b/utils/smallvwf.py index 6b1253c..36c62b0 100644 --- a/utils/smallvwf.py +++ b/utils/smallvwf.py @@ -196,7 +196,7 @@ def generate_8x8_vwf_asset(string_list, prefix, table_start, max_tile_length=Non for string in string_list: if max_tile_length: output.seek(k * line_length) - data = build_text_image('fonts/8x8vwf2.png', string.strip()) + data = build_text_image('fonts/8x8vwf2p.png', string.strip()) data_2bpp = write_as_2bpp(data) output.write(data_2bpp) length_table.write(struct.pack(' Date: Mon, 16 Sep 2024 23:48:54 +0200 Subject: [PATCH 52/52] Adds miss gfx. --- fonts/miss.bin | Bin 0 -> 48 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fonts/miss.bin diff --git a/fonts/miss.bin b/fonts/miss.bin new file mode 100644 index 0000000000000000000000000000000000000000..fb812d217da0ecde667640d25fc04970b362bd51 GIT binary patch literal 48 rcmZQzNMe|pv?_E}=#2DLp`i>gAj0uVK=jqxprujk0+vR3!GswANq-Cl literal 0 HcmV?d00001