From f70f87e74d595460aff8731392255627934a6c9e Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 13:50:00 +0200 Subject: [PATCH 01/63] Update test to include [bold]...[normal] encasing of speaking character name. --- tests/test_format_bank.py | 275 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 tests/test_format_bank.py diff --git a/tests/test_format_bank.py b/tests/test_format_bank.py new file mode 100644 index 0000000..131e09a --- /dev/null +++ b/tests/test_format_bank.py @@ -0,0 +1,275 @@ +from format_bank_xml import process_dialogue + + +def test_format() -> None: + """Test that a [new]\n tag is inserted between character speches, + \n should be inserted after a punctuation if it's not the end of the speach + Word wrapping should be applied to each sentence.""" + formatted = process_dialogue("""Edge: And here I am all + pumped up to fight + that bastard! + + Ah, well... + can't be breaking a sweat + in front of the ladies. + +Golbeze: Cecil...[end]""") + + assert ( + formatted + == """[bold]Edge[normal]: And here I am all pumped up +to fight that bastard! +Ah, well... can't be breaking a sweat in +front of the ladies.[new] +[bold]Golbez[normal]: Cecil...[end]""" + ) + + +def test_format2() -> None: + formatted = process_dialogue("""Soldier: Yes sir! + + + +Soldier: The monsters + have been increasing lately + though... + +Soldier: There's just too + many of them nowadays. + + +Cecil: Is something... + happening?[end]""") + + assert ( + formatted + == """[bold]Soldier[normal]: Yes sir![new] +[bold]Soldier[normal]: The monsters have been +increasing lately though...[new] +[bold]Soldier[normal]: There's just too many of +them nowadays.[new] +[bold]Cecil[normal]: Is something... happening?[end]""" + ) + + +def test_format3() -> None: + formatted = process_dialogue("""Soldier: Agh! +Cecil: Are you all right? + + +Soldier: There's more of them!Cecil: Damn![end]""") + + assert ( + formatted + == """[bold]Soldier[normal]: Agh![new] +[bold]Cecil[normal]: Are you all right?[new] +[bold]Soldier[normal]: There's more of them![new] +[bold]Cecil[normal]: Damn![end]""" + ) + + +def test_formatting_idempotency() -> None: + first_formatting = process_dialogue("""[bold]Soldier[normal]: Agh![new] +[bold]Cecil[normal]: Are you all right?[new] +[bold]Soldier[normal]: There's more[new] +of them![new] +[bold]Cecil[normal]: Damn![end]""") + + second_formatting = process_dialogue(first_formatting) + + assert first_formatting == second_formatting + + +def test_formatting_speech_without_the_character_visible() -> None: + """speech between '«' '»' should be put on a new window""" + assert ( + process_dialogue( + """«Je suis votre guide pour l'enfer...» «Je suis l'un des quatre Empereurs de seigneur Golbeze... Scarmiglione de la Terre... Il est temps que dînent mes précieux morts-vivants!» Cecil: Comment!?[end]""" + ) + == """«Je suis votre guide pour l'enfer...»[new] +«Je suis l'un des quatre Empereurs de seigneur Golbeze... Scarmiglione de la Terre... Il est temps que dînent mes précieux morts-vivants!»[new] +[bold]Cecil[normal]: Comment!?[end]""" + ) + + +def test_sentences_not_fitting_the_current_window_should_be_moved() -> None: + assert ( + process_dialogue( + """Pourquoi avez-vous besoin de ces cristaux? Était-ce parce que les Mythidiens représentaient une menace? Alors pourquoi n'ont-ils pas résisté? Nous ne comprenons pas pourquoi des innocents ont dû périr.[end]""" + ) + == """Pourquoi avez-vous besoin de ces +cristaux? +Était-ce parce que les Mythidiens +représentaient une menace?[new] +Alors pourquoi n'ont-ils pas résisté? +Nous ne comprenons pas pourquoi des +innocents ont dû périr.[end]""" + ) + + +def test_character_speech_sentences_not_fitting_the_current_window_should_be_moved() -> ( + None +): + assert ( + process_dialogue( + """Cecil: Votre Majesté, nous ne comprenons pas vos intentions. Pourquoi avez-vous besoin de ces cristaux? Était-ce parce que les Mythidiens représentaient une menace? Alors pourquoi n'ont-ils pas résisté? Nous ne comprenons pas pourquoi des innocents ont dû périr.[end]""" + ) + == """[bold]Cecil[normal]: Votre Majesté, nous ne +comprenons pas vos intentions. +Pourquoi avez-vous besoin de ces +cristaux?[new] +Était-ce parce que les Mythidiens +représentaient une menace? +Alors pourquoi n'ont-ils pas résisté?[new] +Nous ne comprenons pas pourquoi des +innocents ont dû périr.[end]""" + ) + + +def test_changing_character_should_introduce_a_new_tag() -> None: + assert process_dialogue( + """Soldat: Mais, Capitaine! Soldat: Piller une cité de magiciens qui n'opposent aucune résistance! Cecil: Écoutez bien, vous tous! Le cristal est absolument nécessaire à la prospérité de notre royaume de Baron. Sa Majesté a jugé que les habitants de Mythidia en savaient trop sur les secrets du cristal. Nous sommes l'escadron des Ailes Rouges de Baron, et les ordres de Sa Majesté sont absolus! Soldat: Capitaine...[end]""" + ) == ( + "[bold]Soldat[normal]: Mais, Capitaine![new]\n" + "[bold]Soldat[normal]: Piller une cité de magiciens qui\n" + "n'opposent aucune résistance![new]\n" + "[bold]Cecil[normal]: Écoutez bien, vous tous!\n" + "Le cristal est absolument nécessaire à\n" + "la prospérité de notre royaume de Baron.[new]\n" + "Sa Majesté a jugé que les habitants de\n" + "Mythidia en savaient trop sur les secrets\n" + "du cristal.[new]\n" + "Nous sommes l'escadron des Ailes\n" + "Rouges de Baron, et les ordres de Sa\n" + "Majesté sont absolus![new]\n" + "[bold]Soldat[normal]: Capitaine...[end]" + ) + + assert ( + process_dialogue("""Caïn: Qu'est-ce qu'il y a? +Cecil: Je suis désolé, Caïn... Caïn: Pourquoi t'excuses-tu encore? Je t'ai défendu de mon plein gré!![end]""") + == """[bold]Caïn[normal]: Qu'est-ce qu'il y a?[new] +[bold]Cecil[normal]: Je suis désolé, Caïn...[new] +[bold]Caïn[normal]: Pourquoi t'excuses-tu +encore? +Je t'ai défendu de mon plein gré!![end]""" + ) + + +def test_long_sentence_splitting_within_character_speech() -> None: + """Sentences should be intelligently grouped based on 4-line dialog box capacity""" + assert ( + process_dialogue( + """Tellah: Je ne suis pas en mesure de vaincre quelqu'un d'aussi puissant que lui avec la magie dont je dispose actuellement. Je recherchais la légendaire magie scellée, Météor... Et j'ai senti une forte aura émise de cette montagne. Serait-ce possible, après toutes ces années de recherches..?[end]""" + ) + == """[bold]Tellah[normal]: Je ne suis pas en mesure de +vaincre quelqu'un d'aussi puissant que lui +avec la magie dont je dispose +actuellement.[new] +Je recherchais la légendaire magie +scellée, Météor... +Et j'ai senti une forte aura émise de +cette montagne.[new] +Serait-ce possible, après toutes ces +années de recherches..?[end]""" + ) + + +def test_abbreviation_handling() -> None: + """M. abbreviation should not be treated as sentence ending""" + assert ( + process_dialogue( + """Cecil: Bonjour M. Rosa, comment allez-vous? Nous devons partir maintenant.[end]""" + ) + == """[bold]Cecil[normal]: Bonjour M. Rosa, +comment allez-vous? +Nous devons partir maintenant.[end]""" + ) + + +def test_bank2_variants_end_should_clear_the_state() -> None: + assert ( + process_dialogue("""Si le capitaine des chevaliers dragons Caïn et Cecil font équipe, cette bague est sûre d'arriver à bon port![end]M.Caïn est intouchable![end] +On dit beaucoup de choses sur sa majesté, mais si elle entendait ça...[end]""") + == """Si le capitaine des chevaliers dragons +Caïn et Cecil font équipe, +cette bague est sûre d'arriver à bon +port![end] +M.Caïn est intouchable![end] +On dit beaucoup de choses sur sa +majesté, mais si elle entendait ça...[end]""" + ) + + +def test_pointer_49() -> None: + """[new] should never be preceded by a \n""" + text = """Cecil: Votre Majesté, nous ne comprenons pas vos intentions. +Pourquoi avez-vous besoin de ces cristaux? +Était-ce parce que les Mythidiens représentaient une menace? +Alors pourquoi n'ont-ils pas résisté? +Nous ne comprenons pas pourquoi des innocents ont dû périr.[end]""" + + expected = """[bold]Cecil[normal]: Votre Majesté, nous ne +comprenons pas vos intentions. +Pourquoi avez-vous besoin de ces +cristaux?[new] +Était-ce parce que les Mythidiens +représentaient une menace? +Alors pourquoi n'ont-ils pas résisté?[new] +Nous ne comprenons pas pourquoi des +innocents ont dû périr.[end]""" + + result = process_dialogue(text) + assert result == expected + + # Test idempotency - running it again should give same result + result2 = process_dialogue(result) + assert result == result2 + + +def test_break_line_should_not_introduce_spaces() -> None: + assert ( + process_dialogue( + """Yang: Il est trop tard! Cecil: Mais qui est en train de combattre les Ailes Rouges? Cid: Malheur! On est touché! On va s'écraser! Accrochez-vous![end]""" + ) + == """[bold]Yang[normal]: Il est trop tard![new] +[bold]Cecil[normal]: Mais qui est en train de +combattre les Ailes Rouges?[new] +[bold]Cid[normal]: Malheur! +On est touché! +On va s'écraser! +Accrochez-vous![end]""" + ) + + +def test_bank_2_thingie() -> None: + text = """T[end]T[end]T[end]T[end]T[end]T[end]T[end]T[end]T[end]T[end]Le trésor de Baron est entreposé ici! C'est interdit![end]""" + + processed = process_dialogue(text) + assert ( + processed + == """T[end] +T[end] +T[end] +T[end] +T[end] +T[end] +T[end] +T[end] +T[end] +T[end] +Le trésor de Baron est entreposé ici! +C'est interdit![end]""" + ) + + +def test_mixed_offscreen_and_character_dialog() -> None: + assert process_dialogue( + "«Vous êtes de Baron, hein...» Caïn: Qui est là?[music][0x2d] «Partez maintenant et il ne vous fait aucun mal...» Caïn: Montre-toi! «Vous voulez vraiment continuer?»[end]" + ) == ( + "«Vous êtes de Baron, hein...»[new]\n" + "[bold]Caïn[normal]: Qui est là?[music][0x2d][new]\n" + "«Partez maintenant et il ne vous fait aucun mal...»[new]\n" + "[bold]Caïn[normal]: Montre-toi![new]\n" + "«Vous voulez vraiment continuer?»[end]" + ) From 8bec1ec4f7a5d1158cc8f94afabac1680e0f6481 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 15:12:34 +0200 Subject: [PATCH 02/63] Adds missing shops translations. --- src/ingame/shop.s | 13 +++++++++++ src/menus/tools_shop_text.s | 45 ++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/ingame/shop.s b/src/ingame/shop.s index 7f95d51..f28293f 100644 --- a/src/ingame/shop.s +++ b/src/ingame/shop.s @@ -45,6 +45,19 @@ *=0x01C568 load_system_menu_text_pointer(shops.gils + 2) +*=0x01c74e + load_system_menu_text_pointer(shops.thank_you_window) + +*=0x01c962 + load_system_menu_text_pointer(shops.sell_window) + +*=0x01c41e + load_system_menu_text_pointer(shops.inventory_full) + +*=0x01c700 + load_system_menu_text_pointer(shops.not_enough_gils) + + ; Buy menu ; quantity hand pointer position "10" *=0x01cb12 diff --git a/src/menus/tools_shop_text.s b/src/menus/tools_shop_text.s index 3d19fc3..8fe3a3e 100644 --- a/src/menus/tools_shop_text.s +++ b/src/menus/tools_shop_text.s @@ -18,7 +18,7 @@ welcome_and_actions: quantity: .dw 0x0052 - .text 'Que désirez vous ?' + .text 'Que désirez vous ? ' .db 1 .dw 0x0144 .text 'Quantité' @@ -27,6 +27,49 @@ quantity: .text '1' .db 0 +thank_you_window: + menu_window(5,10,11,2) +thank_you_text: + move_to(6,11) + .text 'Merci !' + .db 0 + +inventory_full: + menu_window(1,10,20,4) + move_to(2,11) + .text 'L\'inventaire est' + .db 1 + move_to(2,13) + .text 'plein.' + .db 0 + +not_enough_gils: + menu_window(5,10,16,4) + move_to(6,11) + .text 'Vous n\'avez pas' + .db 1 + move_to(6,13) + .text 'de Gils.' + .db 0 + +sell_window: + menu_window(8,10,14,13) + move_to(13,13) + .text ' Unités' + .db 1 + move_to(19,15) + .text 'Gils' + .db 1 + move_to(10,17) + .text 'Êtes-vous' + .db 1 + move_to(11,19) + .text 'd\'accord ?' + .db 1 + move_to(12,21) + .text 'Oui Non' + .db 0 + weapons_title: .text 'Armes' .db 0 From ff259b9238977f060a81c6d0b88011f30c763950 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 15:40:51 +0200 Subject: [PATCH 03/63] Updates formatting, make font metrics use the new font asset format. --- format_bank_xml.py | 104 ++++++++++-- metrics.py | 64 ++++++- tests/test_format_bank.py | 8 +- text/fr/bank1-1.xml | 343 +++++++++++++++++++++----------------- text/fr/bank1-2.xml | 117 ++++++------- text/fr/bank2.xml | 338 ++++++++++++++++++------------------- 6 files changed, 574 insertions(+), 400 deletions(-) diff --git a/format_bank_xml.py b/format_bank_xml.py index e8c425f..a006cb8 100755 --- a/format_bank_xml.py +++ b/format_bank_xml.py @@ -30,6 +30,7 @@ def __init__(self): self.character_pattern = re.compile(r"(\w+(?:\s+\w+)*):") self.guillemet_pattern = re.compile(r"«([^»]*)»") self.end_pattern = re.compile(r"\[end\]") + self.close_window_pattern = re.compile(r"\[close_window\]") def tokenize(self, text): tokens = [] @@ -54,6 +55,13 @@ def tokenize(self, text): i = end_match.end() continue + # Check for [close_window] marker + close_window_match = self.close_window_pattern.match(text, i) + if close_window_match: + tokens.append(Token("CLOSE_WINDOW", "[close_window]", i)) + i = close_window_match.end() + continue + # Check for guillemet speech guillemet_match = self.guillemet_pattern.match(text, i) if guillemet_match: @@ -78,10 +86,13 @@ def tokenize(self, text): sentence = "" while i < len(text): - # Check if we hit [end] at current position (only [end], not other control codes) + # Check if we hit [end] or [close_window] at current position if text[i: i + 5] == "[end]" and sentence.strip(): # We found [end] and we already have some sentence content break + if text[i: i + 14] == "[close_window]" and sentence.strip(): + # We found [close_window] and we already have some sentence content + break # Check if we hit a guillemet at current position if text[i] == "«" and sentence.strip(): @@ -110,6 +121,8 @@ def tokenize(self, text): break elif text[i: i + 5] == "[end]": # Followed by [end] (special case) break + elif text[i: i + 14] == "[close_window]": # Followed by [close_window] (special case) + break elif i < len(text) and text[i] == "[": # Check if this is followed by a control code (not [end]) # Continue consuming control codes as part of the sentence @@ -117,14 +130,14 @@ def tokenize(self, text): bracket_end = text.find("]", i) if bracket_end != -1: control_code = text[i: bracket_end + 1] - if control_code != "[end]": + if control_code not in ["[end]", "[close_window]"]: # This is a control code, include it in the sentence but don't consume following spaces sentence += text[i: bracket_end + 1] i = bracket_end + 1 # Don't consume the space - let the main loop handle it continue else: - # This is [end], break here + # This is [end] or [close_window], break here break elif i < len(text) and text[i].isspace(): # Check if next non-space character is uppercase or special pattern @@ -137,6 +150,7 @@ def tokenize(self, text): or text[j: j + 1] == "«" or self.character_pattern.match(text, j) or text[j: j + 5] == "[end]" + or text[j: j + 14] == "[close_window]" ): break else: @@ -155,13 +169,17 @@ def __init__(self, text_metrics=None): # Initialize TextMetrics if not provided if text_metrics is None: try: - normal_length_table = Path("assets/font_length_table.dat").read_bytes() - bold_length_table = Path("assets/bold_font_length_table.dat").read_bytes() - book_length_table = Path("assets/book_font_length_table.dat").read_bytes() - wicked_length_table = Path("assets/wicked_font_length_table.dat").read_bytes() table = Table("text/ff4fr.tbl") - self.text_metrics = TextMetrics(table, [normal_length_table, wicked_length_table, bold_length_table, - book_length_table]) + + # Use new interleaved format + font_files = [ + "assets/font.dat", + "assets/wicked_font.dat", + "assets/bold_font.dat", + "assets/book_font.dat" + ] + + self.text_metrics = TextMetrics(table, font_files, char_height=16) except (FileNotFoundError, Exception): # Fallback to None if metrics can't be loaded (for testing) self.text_metrics = None @@ -231,9 +249,11 @@ def parse(self, tokens): else: # Would exceed limit - flush accumulated with [new] at end, then start new if accumulated_sentences: + # Don't add [new] if next token is [end] + add_new = not self._is_next_token_end(tokens, i) result.extend( self._flush_pre_wrapped_sentences( - accumulated_sentences, add_new=True + accumulated_sentences, add_new=add_new ) ) @@ -277,9 +297,11 @@ def parse(self, tokens): else: # Would exceed limit - flush accumulated with [new] at end, then start new if accumulated_sentences: + # Don't add [new] if next token is [end] + add_new = not self._is_next_token_end(tokens, i) result.extend( self._flush_pre_wrapped_sentences( - accumulated_sentences, add_new=True + accumulated_sentences, add_new=add_new ) ) @@ -302,23 +324,29 @@ def parse(self, tokens): elif token.type == "GUILLEMET_SPEECH": # Flush any accumulated sentences first if accumulated_sentences: + # Don't add [new] if next token is [end] + add_new = not self._is_next_token_end(tokens, i) result.extend( self._flush_pre_wrapped_sentences( - accumulated_sentences, add_new=True + accumulated_sentences, add_new=add_new ) ) accumulated_sentences = [] accumulated_text = "" accumulated_lines = 0 - # Check if this guillemet is followed immediately by [end] - is_followed_by_end = i + 1 < len(tokens) and tokens[i + 1].type == "END" + # Apply word wrapping to guillemet speech + wrapped_guillemet = self.text_metrics.word_warp(token.value, WINDOW_WIDTH) + + # Check if this guillemet is followed immediately by [end] or [close_window] + is_followed_by_end = (i + 1 < len(tokens) and + tokens[i + 1].type in ["END", "CLOSE_WINDOW"]) # Add guillemet speech as separate dialog box if is_followed_by_end: - result.append(token.value) # Don't add [new] if followed by [end] + result.append(wrapped_guillemet) # Don't add [new] if followed by [end] or [close_window] else: - result.append(token.value + "[new]") + result.append(wrapped_guillemet + "[new]") current_character = None # Reset character context i += 1 @@ -347,6 +375,30 @@ def parse(self, tokens): accumulated_lines = 0 i += 1 + elif token.type == "CLOSE_WINDOW": + # Close window marker - flush accumulated and add close window marker, then reset state + if accumulated_sentences: + # Add [close_window] to the last accumulated sentence + last_sentence = accumulated_sentences[-1] + accumulated_sentences[-1] = last_sentence + "[close_window]" + result.extend( + self._flush_pre_wrapped_sentences(accumulated_sentences) + ) + accumulated_sentences = [] # Clear to prevent double processing + elif result: + # No accumulated sentences, but we have previous results - append [close_window] to the last result + result[-1] = result[-1] + "[close_window]" + else: + # No accumulated sentences and no previous results - this is a standalone [close_window] + result.append("[close_window]") + + # Reset all state after [close_window] + current_character = None + accumulated_sentences = [] + accumulated_text = "" + accumulated_lines = 0 + i += 1 + else: i += 1 @@ -356,6 +408,26 @@ def parse(self, tokens): return result + def _is_next_token_end(self, tokens, current_index): + """Check if the next token is END or CLOSE_WINDOW""" + return (current_index + 1 < len(tokens) and + tokens[current_index + 1].type in ["END", "CLOSE_WINDOW"]) + + def _will_character_end_with_end_token(self, tokens, character_index): + """Check if the upcoming character speech will end with an END or CLOSE_WINDOW token""" + # Look ahead from the character token to find where this character's speech ends + i = character_index + 1 + while i < len(tokens): + token = tokens[i] + if token.type in ["END", "CLOSE_WINDOW"]: + return True + elif token.type == "CHARACTER" or token.type == "GUILLEMET_SPEECH": + # Another character or guillemet starts, so this character won't end with END/CLOSE_WINDOW + return False + i += 1 + # Reached end of tokens without finding END/CLOSE_WINDOW or another character + return False + def _measure_lines_wrapped(self, wrapped_text): """Measure how many lines the already-wrapped text takes by counting newlines.""" if not wrapped_text: diff --git a/metrics.py b/metrics.py index f9a0382..7fee7ad 100644 --- a/metrics.py +++ b/metrics.py @@ -1,11 +1,21 @@ from script import Table +from pathlib import Path +import struct class TextMetrics: - def __init__(self, table: Table, length_tables: list[bytes]): + def __init__(self, table: Table, font_files: list[str], char_height: int = 16): self.table = table - # self.length_table = length_table - self.length_tables = length_tables + self.font_files = font_files + self.char_height = char_height + + # Load new interleaved format + self.length_tables = [] + self.kerning_tables = [] + for font_file in font_files: + length_table, kerning_table = self._load_interleaved_font(font_file, char_height) + self.length_tables.append(length_table) + self.kerning_tables.append(kerning_table) def measure_bytes(self, binary: bytes) -> int: size = 0 @@ -113,3 +123,51 @@ def measure_line_count(self, line: str, max_pixel_width: int) -> int: break return lines_count + 1 + + def _load_interleaved_font(self, font_file: str, char_height: int = 16) -> tuple[bytes, dict]: + """Load font data in the new interleaved format with kerning after character data.""" + try: + with open(font_file, 'rb') as f: + font_data = f.read() + except FileNotFoundError: + # Return empty tables if font file doesn't exist + return bytes(256), {} + + # Extract character width data from interleaved format + length_table = bytearray(256) + bytes_per_char = char_height + 1 + + for char_index in range(256): + data_offset = char_index * bytes_per_char + width_offset = data_offset + char_height + + if width_offset < len(font_data): + length_table[char_index] = font_data[width_offset] + else: + length_table[char_index] = 8 # Default width + + kerning_table = {} + kerning_offset = 256 * (char_height + 1) + + if len(font_data) > kerning_offset + 2: + # Check if there's actually kerning data at this offset + # Read potential kerning count and validate it's reasonable + try: + kerning_count = struct.unpack(" None: """«Je suis votre guide pour l'enfer...» «Je suis l'un des quatre Empereurs de seigneur Golbeze... Scarmiglione de la Terre... Il est temps que dînent mes précieux morts-vivants!» Cecil: Comment!?[end]""" ) == """«Je suis votre guide pour l'enfer...»[new] -«Je suis l'un des quatre Empereurs de seigneur Golbeze... Scarmiglione de la Terre... Il est temps que dînent mes précieux morts-vivants!»[new] +«Je suis l'un des quatre Empereurs de +seigneur Golbez... Scarmiglione de la +Terre... Il est temps que dînent mes +précieux morts-vivants!»[new] [bold]Cecil[normal]: Comment!?[end]""" ) @@ -269,7 +272,8 @@ def test_mixed_offscreen_and_character_dialog() -> None: ) == ( "«Vous êtes de Baron, hein...»[new]\n" "[bold]Caïn[normal]: Qui est là?[music][0x2d][new]\n" - "«Partez maintenant et il ne vous fait aucun mal...»[new]\n" + "«Partez maintenant et il ne vous fait\n" + "aucun mal...»[new]\n" "[bold]Caïn[normal]: Montre-toi![new]\n" "«Vous voulez vraiment continuer?»[end]" ) diff --git a/text/fr/bank1-1.xml b/text/fr/bank1-1.xml index 45e43a0..4d5a81f 100644 --- a/text/fr/bank1-1.xml +++ b/text/fr/bank1-1.xml @@ -59,7 +59,7 @@ ont-elles bombardé le château?[new] [bold]Edward[normal]: Ils ont pillé le château... pour voler le cristal... Mon père... -Ma mère... morts...[new] +Ma mère... morts... Anna... elle m'a protégé... des flèches...[end] @@ -77,8 +77,8 @@ flèches...[end] Tu n'as pas assez de Gils![end] -«Bienvenue! C'est [0x08] Gils la nuit. Allez-vous rester?»[new] -[close_window][end] +«Bienvenue! C'est [gils] Gils la nuit. +Allez-vous rester?»[close_window][end] «Au plaisir de vous revoir!»[end] @@ -96,8 +96,8 @@ approchons de Baron![new] préoccupé...[new] [bold]Soldat[normal]: Même sur ordre de Sa Majesté...[new] -[bold]Soldat[normal]: Arracher le cristal à un -peuple innocent... +[bold]Soldat[normal]: Arracher le cristal à un peuple +innocent... C'est...[end] [bold]Soldat[normal]: Mais, Capitaine![new] @@ -105,11 +105,10 @@ C'est...[end] n'opposent aucune résistance![new] [bold]Cecil[normal]: Écoutez bien, vous tous! Le cristal est absolument nécessaire à -la prospérité de notre royaume de -Baron.[new] +la prospérité de notre royaume de Baron.[new] Sa Majesté a jugé que les habitants de -Mythidia en savaient trop sur les -secrets du cristal.[new] +Mythidia en savaient trop sur les secrets +du cristal.[new] Nous sommes l'escadron des Ailes Rouges de Baron, et les ordres de Sa Majesté sont absolus![new] @@ -129,7 +128,7 @@ Nul ne peut échapper à mes serviteurs![new] Vous ne survivrez pas assez longtemps pour me rencontrer! Alors sombrez dans les ténèbres pour -l'éternité, minables![new] +l'éternité, minables! Mwa ha ha ha ha![end] [bold]Soldat[normal]: Nous sommes au-dessus de @@ -192,9 +191,9 @@ représentaient une menace? Alors pourquoi n'ont-ils pas résisté?[new] Nous ne comprenons pas pourquoi des innocents ont dû périr.[new] -Certains se sont même interrogés sur -le caractère... véritablement... honorable -de vos actions...[new] +Certains se sont même interrogés sur le +caractère... véritablement... honorable de +vos actions...[new] [bold]Roi Baron[normal]: Tu oserais donc douter de ton propre roi, Cecil?![new] [bold]Cecil[normal]: !! @@ -207,7 +206,7 @@ mon propre fils![new] Et maintenant, toi aussi, tu ne peux me faire confiance... Je ne peux plus te confier le -commandement des Ailes Rouges.[new] +commandement des Ailes Rouges. Dès à présent, tu es relevé de tes fonctions![end] @@ -259,8 +258,8 @@ nobles raisons pour ses actions.[new] Il nous a élevés comme ses propres fils. Il n'accomplirait rien qui ne soit honorable...[new] -[bold]Cecil[normal]: Caïn, j'envie ta foi en Sa -Majesté. +[bold]Cecil[normal]: Caïn, j'envie ta foi en +Sa Majesté. Il a évoqué ton père...[new] Il possédait la même loyauté indéfectible...[new] @@ -337,7 +336,7 @@ Regarde-moi plutôt.[end] [bold]Cecil[normal]: À Mythidia... J'ai ôté la vie à des innocents et dérobé leur cristal sacré... mais pour -quelle raison?![new] +quelle raison?! Mon cur s'est assombri tout autant que cette armure maudite![end] @@ -402,9 +401,8 @@ Edward... je ne sais pas...[new] [bold]Yang[normal]: Où sommes-nous?[new] [bold]Cecil[normal]: À Baron. Si les soldats nous entendent, on aura -des ennuis.[new] -Il y a une chambre tranquille à -l'auberge. +des ennuis. +Il y a une chambre tranquille à l'auberge. Allons-y! [0xfa]Le Moine Yang a rejoint le groupe![music][0x29][delay][0x28][end] @@ -427,7 +425,7 @@ d'entrer dans le château...[end] [bold]Cecil[normal]: C'est la clef de Baron! Bien sûr! Yang, ils t'ont fait commander la -garde... c'est pour ça que tu l'as![new] +garde... c'est pour ça que tu l'as! Avec ça, on devrait pouvoir s'en sortir! [0xfa]Tu as la clef de Baron![music][0x29][delay][0x28][end] @@ -440,7 +438,7 @@ envoyé ici..![new] [bold]Cecil[normal]: POURQUOI?! Roi Baron!! -NON!![new] +NON!! «Ouiiiiin! Ouiiiiin...!!»[end] [bold]Cecil[normal]: Qui c'est?[end] @@ -479,9 +477,9 @@ exécuté pour trahison![new] [bold]Cecil[normal]: Mais ce n'est qu'une enfant![new] [bold]Caïn[normal]: ...Tu veux dire qu'on devrait braver le Roi?[new] -[bold]Cecil[normal]: Si le roi attend de nous qu'on -assassine des gens comme ça... -Je n'ai aucune intention de le suivre![new] +[bold]Cecil[normal]: Si le roi attend de nous +qu'on assassine des gens comme ça... +Je n'ai aucune intention de le suivre! Je renonce à toute loyauté envers le roi, les Ailes Rouges, et Baron!!![end] @@ -535,12 +533,14 @@ Où es-tu? !![end] [bold]Cecil[normal]: Je ne peux pas rester ici éternellement... Je dois emmener cette enfant et fuir -d'ici...[new] +d'ici... Caïn... sois vivant![end] [bold]Cecil[normal]: Si elle ne se repose pas...[end] -«Bienvenue! Oh, elle a l'air malade! Vite, vite, allez dans la chambre! Ne vous inquiétez pas pour l'argent!»[new] +«Bienvenue! Oh, elle a l'air malade! Vite, +vite, allez dans la chambre! Ne vous +inquiétez pas pour l'argent!»[new] [bold]Cecil[normal]: Merci.[end] [bold]Cecil[normal]: Tu as enfin repris...[new] @@ -560,13 +560,13 @@ t'avons trouvé!![new] [bold]Cecil[normal]: Attendez! Le roi de Baron a...[new] [bold]Général[normal]: Ordres du roi. -Si tu nous livres la survivante de Mist, -il pardonnera ta traîtrise.[new] +Si tu nous livres la survivante de Mist, il +pardonnera ta traîtrise.[new] Il a été jugé dangereux que le peuple de Mist puisse seulement exister![new] [bold]Cecil[normal]: Quoi!? -Le roi est donc tombé si bas au point de -tuer des enfants?![new] +Le roi est donc tombé si bas au point +de tuer des enfants?![new] [bold]Fille[normal]: !![new] [bold]Général[normal]: Épargne-moi ton sermon et donne-moi la fille![new] @@ -609,8 +609,8 @@ C'est sûrement Golbez qui influence le roi pour réunir les quatre cristaux.[new] Le cristal de l'eau de Mythidia... Le cristal du feu de Damcyan... -Le cristal du vent de Fabul... et le cristal -de la terre de Troia.[end] +Le cristal du vent de Fabul... et le +cristal de la terre de Troia.[end] [bold]Edward[normal]: Il a déjà pris le cristal du feu...[new] @@ -644,8 +644,8 @@ sort du[new] [bold]Rydia[normal]: ! ...Hmm...non, je peux pas...[end] [bold]Rosa[normal]: Si tu es une invocatrice, tu -devrais pouvoir lancer des sorts -basiques de magie noire tels que[new] +devrais pouvoir lancer des sorts basiques +de magie noire tels que[new] «Feu»[new] ... -keuf-[end] @@ -665,7 +665,7 @@ Ne me laisse pas![end] [bold]Anna[normal]: Edward, sois courageux, et ne laisse pas Golbez rassembler les cristaux... -Tu m'aimais.[new] +Tu m'aimais. À présent, donne cet amour aux gens de la Terre.[end] @@ -704,7 +704,7 @@ caverne?[new] [bold]Tellah[normal]: C'est une immense créature avec huit énormes pattes. Il nous faudra le battre si nous voulons -sauver Anna et votre amie...[new] +sauver Anna et votre amie... J'espère que ce mauvais pressentiment que j'ai sur Damcyan n'est que le fruit de mon imagination mais...[end] @@ -712,7 +712,7 @@ de mon imagination mais...[end] [bold]Cid[normal]: Mais de quoi vous vous inquiétez? Je vais bientôt revenir! -Je reviendrai avec des améliorations![new] +Je reviendrai avec des améliorations! Restez là à attendre comme de braves gosses![end] @@ -768,12 +768,13 @@ Golbez.[new] Nous devons nous préparer au combat![new] [bold]Rosa[normal]: Dépêchez-vous![end] -[bold]Edward[normal]: Ça faisait longtemps, roi Fabul.[new] +[bold]Edward[normal]: Ça faisait longtemps, roi +Fabul.[new] [bold]Roi Fabul[normal]: Prince Edward![new] [bold]Edward[normal]: Damcyan a déjà été attaqué et notre cristal a été volé! J'ai perdu... mon père... ma mère... et -celle que j'aimais...![new] +celle que j'aimais...! Allez-vous laisser Fabul subir le même sort que Damcyan?![end] @@ -792,7 +793,8 @@ médicale?[new] [bold]Roi Fabul[normal]: Yang, je compte sur toi![new] [bold]Yang[normal]: À vos ordres![end] -[bold]Rosa[normal]: Fais attention à toi, Cecil.[new] +[bold]Rosa[normal]: Fais attention à toi, +Cecil.[new] [bold]Cecil[normal]: Toi aussi... Rydia! Prends soin de Rosa![end] @@ -822,7 +824,7 @@ trône, là derrière...!?[new] [bold]Yang[normal]: Ne t'inquiète pas! Le roi a déjà trouvé refuge avec les femmes et les enfants dans un endroit -sûr![new] +sûr! Il faut nous occuper de ces monstres![end] [bold]Yang[normal]: Attaquez![end] @@ -859,7 +861,8 @@ souffrances![new] [bold]Caïn[normal]: Ourg...ahh..! Ne...me...regarde...pas[end] -«Qu'y a-t-il, Caïn? Qu'est-ce qui te trouble?»[end] +«Qu'y a-t-il, Caïn? Qu'est-ce qui +te trouble?»[end] [bold]Edward[normal]: Golbez![new] [bold]Cecil[normal]: Tu es Golbez![new] @@ -1006,13 +1009,12 @@ Ooh...[end] [bold]Scarmiglione[normal]: -Gargl-... Scarmiglione de la Terre, à ton service...[new] -[bold]Golbez[normal]: Ce Cecil pourrait -devenir un problème. +[bold]Golbez[normal]: Ce Cecil pourrait devenir +un problème. Il faut s'occuper de lui avant qu'il n'en devienne un.[new] C'est un chevalier noir, il devrait donc -être impuissant contre nos morts -vivants.[new] +être impuissant contre nos morts vivants. Mais il gravit en ce moment la Montagne de l'Épreuve.[new] [bold]Scarmiglione[normal]: Il veut... donc devenir... @@ -1115,13 +1117,21 @@ C'est l'homme qui contrôle Baron![end] «Gargl...»[new] [bold]Tellah[normal]: ...Une présence maléfique!![new] -«Je suis heureux... Très heureux... Tuer me rend heureux!»[new] +«Je suis heureux... Très heureux... Tuer +me rend heureux!»[new] [bold]Cecil[normal]: Qui est là!?[end] «Je suis votre guide pour l'enfer...»[new] -«Je suis l'un des quatre Empereurs de seigneur Golbez... Scarmiglione de la Terre... Il est temps que dînent mes précieux morts-vivants!»[end] +«Je suis l'un des quatre Empereurs de +seigneur Golbez... Scarmiglione de la +Terre... Il est temps que dînent mes +précieux morts-vivants!»[end] -«Fshhh... Bien joué... de m'avoir tué... Mais voyez la terrifiante puissance de Scarmiglione de la Terre... même dans la mort... Savourez lentement... votre agonie!»[end] +«Fshhh... Bien joué... de m'avoir tué... Mais +voyez la terrifiante puissance de +Scarmiglione de la Terre... même dans la +mort... Savourez lentement... votre +agonie!»[end] [bold]Scarmiglione[normal]: Maudit... Que moi, Scarmiglione... je sois vaincu @@ -1133,7 +1143,12 @@ par des vermines comme vous...![end] «Mon chagrin ne fera alors que grandir...»[new] «Mais c'est la seule solution qui reste.»[end] -«Laisse ton passé sanglant derrière toi... Purifie ton âme avec la lumière sacrée! Tu dois le faire! Pour recevoir cette force sacrée, combats et détruis ton double obscur en tant que chevalier noir!»[end] +«Laisse ton passé sanglant derrière toi... +Purifie ton âme avec la lumière sacrée! +Tu dois le faire! Pour recevoir cette +force sacrée, combats et détruis ton +double obscur en tant que chevalier +noir!»[end] [bold]Tellah[normal]: Deux Cecil?[new] [bold]Palom[normal]: Que se passe-t-il?[new] @@ -1144,7 +1159,9 @@ C'est mon combat! Pour expier mon passé, je dois surmonter ma propre noirceur![end] -«Bien joué... Reçois ma conscience... Prends-la... ma... lumière finale! Mon fils... arrête Golbez!»[new] +«Bien joué... Reçois ma conscience... +Prends-la... ma... lumière finale! Mon fils... +arrête Golbez!»[new] [bold]Cecil[normal]: A...attends![end] [0xfa]Cecil est devenu un paladin![end] @@ -1225,7 +1242,9 @@ en danger![end] [bold]Edward[normal]: ...Ne vous inquiétez pas... Juste jusqu'à ma harpe là-bas... Ooh![new] -«Dans votre état, vous ne devriez même pas marcher! Ne vous surmenez pas!»[new] +«Dans votre état, vous ne devriez +même pas marcher! Ne vous surmenez +pas!»[new] [bold]Edward[normal]: Ça ne fait rien... Je suis le seul... qui puisse sauver... Cecil et les autres![end] @@ -1242,7 +1261,7 @@ ARG...ARK, HIC![end] [bold]Edward[normal]: Maintenant, Cecil! Tant que je joue, il ne peut contrôler la gravité! -Votre épée![new] +Votre épée! Équipez-vous de votre épée![end] [bold]Elfe Noir[normal]: COMMENT CE BRUIT EST @@ -1303,35 +1322,37 @@ personne.[new] ayez tenu votre promesse...[new] [bold]Tellah[normal]: Montre-toi![new] [bold]Golbez[normal]: Je comprends votre -impatience, mais j'aimerais vous -remercier.[new] +impatience, mais j'aimerais vous remercier.[new] [bold]Yang[normal]: Nous remercier?[new] [bold]Golbez[normal]: Je suis avec votre chère Rosa au sommet de cette Tour de Zot.[new] -Si vous parvenez jusqu'ici, j'échangerai -la vie de Rosa contre le cristal.[new] +Si vous parvenez jusqu'ici, j'échangerai la +vie de Rosa contre le cristal.[new] [bold]Cecil[normal]: Golbez, tu n'es qu'un salaud![new] [bold]Golbez[normal]: Si vous ne venez pas -rapidement, je ne peux garantir la vie -de votre précieuse Rosa...[music][0x19] Alors, +rapidement, je ne peux garantir la vie de +votre précieuse Rosa...[music][0x19] Alors, montez![end] «Bienvenue dans la tour de Zot!»[end] «Heureuses de vous rencontrer!»[end] -«C'est nous, les servantes de Barbariccia, l'Impératrice de l'air!»[new] +«C'est nous, les servantes de +Barbariccia, l'Impératrice de l'air!»[new] «Je suis Dog, des trois sœurs Magus!»[new] «Je suis Mag, pareil!»[new] «Je suis Rag!»[new] «Désolées, votre quête va s'arrêter là.»[new] «On va vous prendre le cristal.»[new] -«Encaissez notre attaque delta et puis adieu! Vous n'atteindrez pas Rosa!»[end] +«Encaissez notre attaque delta et puis +adieu! Vous n'atteindrez pas Rosa!»[end] «Impossible!»[new] -«Vous avez déjoué notre attaque delta...»[new] +«Vous avez déjoué notre attaque +delta...»[new] «Grande sœur! Non...»[end] [bold]Golbez[normal]: Bien joué, messieurs.[new] @@ -1454,7 +1475,9 @@ services, revenez donc me voir.[end] [bold]Cecil[normal]: Allons-y, Caïn![end] -«Infliger des blessures à seigneur Golbez... Il semble que nous vous ayons sous-estimés!»[new] +«Infliger des blessures à seigneur +Golbez... Il semble que nous vous +ayons sous-estimés!»[new] [bold]Caïn[normal]: C'est un des quatre Empereurs de Golbez! Barbariccia du vent![end] @@ -1478,7 +1501,7 @@ pas ton exclusivité![end] [bold]Barbariccia[normal]: Caïn... maudit! Même en me vainquant... Le dernier des quatre Empereurs existe -encore![new] +encore! Disparaissez avec cette Tour de Zot![end] [bold]Cecil[normal]: La tour s'effondre![new] @@ -1491,7 +1514,8 @@ Disparaissez avec cette Tour de Zot![end] [bold]Cid[normal]: On est à l'abri. Cet imposteur de roi est mort.[new] [bold]Caïn[normal]: Cecil... -Il faut que je te parle de quelque chose.[end] +Il faut que je te parle de quelque +chose.[end] [bold]Cid[normal]: De quoi s'agit-il?[new] [bold]Caïn[normal]: Il s'agit des cristaux...[new] @@ -1514,8 +1538,8 @@ l'autre côté..?[new] [bold]Caïn[normal]: En effet. Donc, ça veut dire que Golbez n'a que la moitié des cristaux![new] -[bold]Cid[normal]: Alors les cristaux -d'Obscurité, c'est pas une rumeur... +[bold]Cid[normal]: Alors les cristaux d'Obscurité, +c'est pas une rumeur... Et la question inévitable... Où sont-ils?[new] [bold]Caïn[normal]: Golbez le sait.[new] @@ -1581,8 +1605,8 @@ combattaient les aéronefs.[new] ces choses aéronefs... Wow, le monde du dessus a des trucs de ce genre![new] -Nous sommes fiers de nos chars, mais -ils nous touchaient salement avec leurs +Nous sommes fiers de nos chars, mais ils +nous touchaient salement avec leurs attaques. Nous aiderez-vous avec votre aéronef?[new] [bold]Cid[normal]: J'ai rien contre, mais après @@ -1596,12 +1620,17 @@ On ne va pas en tirer grand chose.[end] [bold]Cecil[normal]: Il n'y a personne, ici.[new] [bold]Yang[normal]: J'ai senti une présence ici![end] -[bold]Caïn[normal]: Ça ne veut pas s'ouvrir![new] +[bold]Caïn[normal]: Ça ne veut pas s'ouvrir! «Yo-ho-ho-ho-!»[end] -«Nous sommes les joyeuses Calcabrina! Poupées effrayantes mais mignonnes! Bandes d'idiots! Vous venez ici si naïvement! On va vous battre et offrir vos têtes au seigneur Golbez en cadeau! Kya-ho-ho-ho!»[end] +«Nous sommes les joyeuses Calcabrina! +Poupées effrayantes mais mignonnes! +Bandes d'idiots! Vous venez ici si +naïvement! On va vous battre et offrir +vos têtes au seigneur Golbez en +cadeau! Kya-ho-ho-ho!»[end] -[bold]Cecil[normal]: Quoi!?[new] +[bold]Cecil[normal]: Quoi!? «Cela faisait longtemps...»[end] [bold]Cecil[normal]: Golbez..![new] @@ -1618,12 +1647,11 @@ C'est la clé pour faire revivre la Tour de Babel, le chemin scellé vers la Lune.[new] On dit qu'il y a sur la Lune un pouvoir qui dépasse notre imagination. -Avec ce cristal, j'en ai maintenant -sept...[new] -Il n'en reste plus qu'un. +Avec ce cristal, j'en ai maintenant sept... +Il n'en reste plus qu'un.[new] C'est aussi grâce à vous. Je me dois de vous remercier pour cela. -Prenez ceci![new] +Prenez ceci! C'est mon dernier cadeau![end] [bold]Cecil[normal]: On l'a vaincu! @@ -1674,12 +1702,13 @@ Rydia a rejoint l'équipe![music][0x29][delay][0x28][end] [bold]Edge[normal]: Ouais! On va tous y aller et rentrer dans leur base![new] -[bold]Rydia[normal]: Ça c'est bien trouvé! [0xfa]Le -ninja Edge a rejoint l'équipe![music][0x29][delay][0x28][end] +[bold]Rydia[normal]: Ça c'est bien trouvé! [0xfa]Le ninja +Edge a rejoint l'équipe![music][0x29][delay][0x28][end] [bold]Cid[normal]: Maintenant, vous pourrez voler sans vous soucier de la lave![new] -[bold]Rosa[normal]: Tu nous as sauvés, Cid.[new] +[bold]Rosa[normal]: Tu nous as sauvés, +Cid.[new] [bold]Cid[normal]: ...[new] [bold]Caïn[normal]: Cid![music][0x2a][delay][0x28][end] @@ -1693,17 +1722,17 @@ des ténèbres...[end] [bold]Golbez[normal]: Alors vous avez choisi de jouer avec vos vies jusqu'ici? Fini de rire... -Il est temps de nous dire adieu.[new] +Il est temps de nous dire adieu. Adieu...![end] -«Pile poil! Halàlà, j'ai horreur d'être aussi bon!»[new] +«Pile poil! Halàlà, j'ai horreur d'être aussi +bon!»[new] [bold]Rosa[normal]: Cid![end] [bold]Cid[normal]: Euh? Où est Yang?[new] [bold]Rosa[normal]: Il...[new] -[bold]Cecil[normal]: Pour détruire le super -canon...[new] +[bold]Cecil[normal]: Pour détruire le super canon...[new] [bold]Cid[normal]: Je vois... Yang...[new] [bold]Rydia[normal]: Sniff...[new] @@ -1718,8 +1747,8 @@ Prends les commandes, Cecil![end] [bold]Cecil[normal]: Où vas-tu?![end] [bold]Cid[normal]: Quand l'Entreprise arrivera à -la surface, je scellerai le trou avec -cette bombe![end] +la surface, je scellerai le trou avec cette +bombe![end] [bold]Cid[normal]: Golbez! L'ingénieur aéronautique Cid va @@ -1746,14 +1775,17 @@ Pendant que tu pilotes l'Entreprise, presse le bouton d'action au-dessus de l'aéroglisseur![new] Maintenant tu peux aller à la grotte -d'Eblana près de la Tour de Babel![new] +d'Eblana près de la Tour de Babel! Dépose l'aéroglisseur dans les eaux peu -profondes du continent et monte à -bord![end] +profondes du continent et monte à bord![end] [bold]Cecil[normal]: Pour être franc, Cid -est...[new] -«Trop énergique et embêtant, pas vrai? Soyez assurés que ce n'est pas quelqu'un qui mourrait facilement! Bon, on a des montagnes de travail qui nous attendent! Bon courage!»[end] +est... +«Trop énergique et embêtant, pas vrai? +Soyez assurés que ce n'est pas quelqu'un +qui mourrait facilement! Bon, on a des +montagnes de travail qui nous attendent! +Bon courage!»[end] [bold]Homme[normal]: Je t'ai enfin trouvé, Rubicante! J'attendais ce jour depuis longtemps![new] @@ -1880,12 +1912,11 @@ soigner! Combattez de toutes vos forces![end] [bold]Rubicante[normal]: Oh... je vois... -Individuellement, les humains sont faibles, -mais ensemble... ils sont puissants![new] -À présent, je comprends mieux -comment vous avez battu le seigneur -Golbez... -Je vous salue, braves guerriers![new] +Individuellement, les humains sont +faibles, mais ensemble... ils sont puissants![new] +À présent, je comprends mieux comment +vous avez battu le seigneur Golbez... +Je vous salue, braves guerriers! Adieu...[end] Jeune maître![end] @@ -1929,7 +1960,7 @@ Allez, laissez-moi la suite![new] [bold]Chambellan[normal]: Compris! Je m'occupe de la maison! Tout le monde, je vous confie notre -jeune maître![new] +jeune maître! Allez, on rentre![end] [bold]Tous[normal]: Jeune maître! @@ -1950,8 +1981,7 @@ je devrais pouvoir le vaincre. !? Oh![new] Cette fille est une invocatrice, hein? Je sens qu'elle a du talent. -À trois, nous devrions pouvoir y -arriver...[new] +À trois, nous devrions pouvoir y arriver...[new] [bold]Cecil[normal]: On est aussi en route pour Damcyan![new] [bold]Tellah[normal]: Bien, alors c'est d'accord! @@ -2004,7 +2034,7 @@ Cette guerre n'est pas seulement la vôtre![new] Elle implique toutes les créatures vivantes, tous les esprits qui vivent sur -Terre...[new] +Terre... Tout le monde doit se battre pour mère Nature![end] @@ -2025,7 +2055,7 @@ C'est le moment ou jamais![end] [bold]Rydia[normal]: Quand je suis venue du Monde Fantôme, je suis passée par ici! -Ah oui![new] +Ah oui! Demandons aussi à Léviathan et aux autres de nous prêter leur force![end] @@ -2041,7 +2071,7 @@ pouvoirs![new] [bold]Asura[normal]: Alors je voudrais vous aider... mais je dois d'abord évaluer votre force. C'est la loi du Monde des Bêtes -Fantômes.[new] +Fantômes. Avez-vous le courage de me défier et la force de me vaincre?[end] @@ -2057,7 +2087,8 @@ temps. Que va-tu répondre? Veux-tu te mesurer à moi?[end] -«Reviens à moi... Caïn... Rapporte-moi le cristal et reviens à moi...»[new] +«Reviens à moi... Caïn... +Rapporte-moi le cristal et reviens à moi...»[new] [bold]Cecil[normal]: Golbez![end] [bold]Cecil[normal]: Ooh! [0xfa]Caïn a volé le @@ -2097,13 +2128,14 @@ Le vaisseau céleste![end] [bold]Ancien[normal]: Pendant ma prière, j'ai entendu une voix chaleureuse.[new] -«Venez sur la Lune... Il y a ceux qui vous attendent sur la Lune!»[new] +«Venez sur la Lune... Il y a ceux qui +vous attendent sur la Lune!»[new] [bold]Cecil[normal]: Mais comment!?[end] Soyez maudits! Ouille!! Mais nous avons transmis l'emplacement -de ce lieu...[new] +de ce lieu... Au seigneur Golbez![end] [bold]Edge[normal]: Merde... @@ -2112,7 +2144,7 @@ Bon sang![end] [bold]Rubicante[normal]: Tu es effectivement assez fort pour avoir confiance... mais tu ne peux pas encore m'égaler. -Va perfectionner tes talents![new] +Va perfectionner tes talents! Je serai ton adversaire quand tu veux![end] [bold]Edge[normal]: At...tends! @@ -2153,14 +2185,14 @@ au sud-ouest.[new] Ce n'est qu'une question de temps avant qu'il n'y parvienne. Je veux que vous preniez le cristal -avant.[new] +avant. Luca![end] [bold]Cecil[normal]: Cid...[new] [bold]Rosa[normal]: Tu forces trop...[new] [bold]Cid[normal]: ...Il semblerait que ce ne soit plus mon tour d'intervenir... et avec ce -corps...[new] +corps... Tout ce que je peux faire, c'est bricoler des aéronefs...[end] @@ -2182,12 +2214,12 @@ occuper d'un vieux comme moi![new] [bold]Cecil[normal]: Merci... Cid![end] -[0xfa]Née de la bouche d'un dragon, -[0xfa]s'élevant dans les cieux [0xfa]avec Lumière et +[0xfa]Née de la bouche d'un dragon, [0xfa]s'élevant +dans les cieux [0xfa]avec Lumière et Obscurité, [0xfa]une promesse endormie [0xfa]s'éveillera. [0xfa]Voilée [0xfa]par la lumière [0xfa]de -l'éternité, [0xfa]La Terre Mère sera bénie -[0xfa]avec clémence et salut.[end] +l'éternité, [0xfa]La Terre Mère sera bénie [0xfa]avec +clémence et salut.[end] [bold]Palom[normal]: Ce vieux a appris Météor![new] [bold]Ancien[normal]: Météor...! @@ -2230,7 +2262,7 @@ Paladin Cecil![new] [bold]Luca[normal]: Celui-ci?[new] [bold]Autant te le dire[normal]: ce collier est la clé qui ouvre l'entrée de la grotte scellée! -Sans cela, la grotte n'accepte personne![new] +Sans cela, la grotte n'accepte personne! Il faut absolument protéger le dernier cristal![end] @@ -2274,7 +2306,7 @@ Vous ne pouvez rien faire sans moi![end] [bold]Cid[normal]: Vous aussi, vous êtes des hommes! Arrêtez de dire des choses -décontractées![new] +décontractées! Venez m'aider![end] [bold]Cecil[normal]: Caïn![new] @@ -2297,8 +2329,8 @@ Mais merde![end] [bold]Rydia[normal]: Il bouge![new] [bold]Caïn[normal]: Comme on pouvait s'y attendre de la grotte scellée - même -après avoir pris le cristal, on ne peut -pas se sentir en sécurité![new] +après avoir pris le cristal, on ne peut pas +se sentir en sécurité![new] [bold]Edge[normal]: Alors on va le démolir![end] [bold]Rydia[normal]: On a réussi![new] @@ -2357,7 +2389,7 @@ ce que signifie la légende.[new] Mais nous, Mythidiens devons prier pour cette légende. Prier pour celui qui possède la Lumière -Sacrée...[new] +Sacrée... Tu dois être cette personne![end] [bold]Cid[normal]: Je vais fixer un foret à la @@ -2365,8 +2397,7 @@ proue du Faucon pour percer la roche qui bloque le passage vers la surface![new] [bold]Rosa[normal]: Tes blessures vont mieux?[new] [bold]Cid[normal]: Ce n'est pas le moment de -s'inquiéter des blessures d'un vieil -homme![new] +s'inquiéter des blessures d'un vieil homme![new] [bold]Edge[normal]: Tu peux vraiment le faire?[new] [bold]Cid[normal]: Pour l'ingénieur aéronautique Cid, le mot[new] @@ -2380,7 +2411,7 @@ comédie, faites-le un peu mieux![new] [bold]Beigan[normal]: Je vous prie d'arrêter de parler ainsi... Cette personne m'a donné quelque -chose de merveilleux.[new] +chose de merveilleux. Un pouvoir si magnifique![end] Vous avez fait de Léviathan votre allié. @@ -2453,8 +2484,8 @@ Je ne sais pas si c'est un présage...[new] [bold]Soldat[normal]: Oui, mon capitaine![new] [bold]Soldat[normal]: Il y a de plus en plus de monstres ces derniers temps...[new] -[bold]Soldat[normal]: Mais il y en a vraiment trop, -à présent...[new] +[bold]Soldat[normal]: Mais il y en a vraiment trop, à +présent...[new] [bold]Cecil[normal]: Est-ce qu'il se passerait... quelque chose?[end] @@ -2462,8 +2493,9 @@ quelque chose?[end] «Vous êtes de Baron, hein...»[new] [bold]Caïn[normal]: Qui est là?[music][0x2d][new] -«Partez maintenant et il ne vous fait aucun mal...»[new] -[bold]Caïn[normal]: Montre-toi![new] +«Partez maintenant et il ne vous fait +aucun mal...»[new] +[bold]Caïn[normal]: Montre-toi! «Vous voulez vraiment continuer?»[end] [bold]Edward[normal]: Cecil... @@ -2474,8 +2506,8 @@ Mais il est tard. On part demain matin.[new] Pour le moment, on va se coucher.[new] [bold]Rosa[normal]: Cecil... -Merci. [0xfa]Le mage blanc Rosa a -rejoint l'équipe![end] +Merci. [0xfa]Le mage blanc Rosa a rejoint +l'équipe![end] [bold]Rosa[normal]: Je vais bien. Et je suis un mage blanc. @@ -2521,7 +2553,7 @@ reposer.[new] [bold]Roi Fabul[normal]: Je suis désolé. Ainsi c'était la vérité. Mais nos moines sont encore en -formation...[new] +formation... Voulez-vous nous assister?[end] [bold]Roi Fabul[normal]: Je ne puis vous forcer... @@ -2555,7 +2587,8 @@ Ma danse![end] [bold]Cecil[normal]: J'ai sommeil tout à coup...[end] -«Fufufu... Votre entraînement est insuffisant.»[end] +«Fufufu... Votre entraînement est +insuffisant.»[end] [bold]Palom[normal]: Je le sais même sans qu'on me le dise![end] @@ -2573,7 +2606,7 @@ Mais je lui ai envoyé Scarmiglione...[new] Scarmiglione est un des quatre Empereurs des Éléments. Il nous a promis un divertissant -spectacle.[new] +spectacle. Qu'en penses-tu, Rosa?[end] [bold]Caïn[normal]: Oui, maître![new] @@ -2590,7 +2623,7 @@ Fais attention![end] [bold]Cecil[normal]: Je suis venu pour être paladin. Je ne peux pas vaincre Golbez avec -la lame noire...[new] +la lame noire... Je dois laisser mon passé derrière moi...[end] [bold]Tellah[normal]: Golbez est à l'origine de @@ -2599,9 +2632,9 @@ tout le mal![end] [bold]Tellah[normal]: Un paladin..? C'est bien ce que je sentais, il doit y avoir un pouvoir mystérieux caché dans -cette montagne![new] -Si vous cherchez à contrer Golbez, -je me joins à vous! [0xfa]Le sage Tellah a +cette montagne! +Si vous cherchez à contrer Golbez, je +me joins à vous! [0xfa]Le sage Tellah a rejoint l'équipe![music][0x29][delay][0x28][end] [bold]Scarmiglione[normal]: GRRRR-BAAAH![end] @@ -2616,7 +2649,7 @@ Qui es-tu?[end] [bold]Porom[normal]: Il attaque![end] [bold]Tellah[normal]: !? -Mé... ...téor?[new] +Mé... ...téor? Cette lumière m'a donné l'ultime magie noire, Météor! [0xfa]Tellah apprend Météor![music][0x29][delay][0x28][end] @@ -2642,7 +2675,7 @@ lâcheté![end] [bold]Cid[normal]: Pas d'inquiétude! Moi et mon Entreprise, on va les aider! Alors c'est toi Edward... -J'ai entendu parler de toi.[new] +J'ai entendu parler de toi. Je vais prendre soin de Cecil et Rosa, t'en fais pas![end] @@ -2650,8 +2683,7 @@ Rosa, t'en fais pas![end] Où est Rosa?[new] [bold]Cecil[normal]: Il s'agit d'un échange avec le cristal de la Terre de Troia... -Mais le cristal a été volé par l'Elfe -Noir...[end] +Mais le cristal a été volé par l'Elfe Noir...[end] [bold]Edward[normal]: Cecil, prenez ça...[new] [bold]Cecil[normal]: C'est quoi?[new] @@ -2732,7 +2764,7 @@ de Baron![new] [bold]Rosa[normal]: Cid, tu es vraiment quelqu'un![new] [bold]Cid[normal]: N'est-ce pas, hein? -On part demain.[new] +On part demain. Je ne peux pas chercher d'entrées de mondes d'en dessous sans une bonne nuit de sommeil![end] @@ -2759,13 +2791,13 @@ de la cupidité. [0xfa]Le pays de Baron devint [0xfa]la plus forte puissance [0xfa]militaire au monde [0xfa]par leurs aéronefs, [0xfa]les Ailes Rouges... [0xfa]Mais pourquoi un pays aussi -[0xfa]puissant recherche-t-il [0xfa]les cristaux? -[0xfa]Quel pouvoir recèlent-ils? [0xfa]Pourquoi -l'humanité [0xfa]corrompt-elle chaque -[0xfa]réalisation de ses rêves? [0xfa]Et pourquoi les -monstres [0xfa]se font-ils toujours plus -nombreux, [0xfa]même en plein jour? [0xfa]Les -cristaux luisaient [0xfa]silencieusement...[end] +[0xfa]puissant recherche-t-il [0xfa]les cristaux? [0xfa]Quel +pouvoir recèlent-ils? [0xfa]Pourquoi l'humanité +[0xfa]corrompt-elle chaque [0xfa]réalisation de ses +rêves? [0xfa]Et pourquoi les monstres [0xfa]se +font-ils toujours plus nombreux, [0xfa]même +en plein jour? [0xfa]Les cristaux luisaient +[0xfa]silencieusement...[end] [bold]Cecil[normal]: Rosa![end] @@ -2777,7 +2809,7 @@ matériaux disponibles ici...[new] Mais le corps de l'aéronef ne résistera pas aux flammes de votre monde. Je dois retourner à la surface et -renforcer la coque au mithril![new] +renforcer la coque au mithril! Bon, ben, j'y vais![end] [0xfa]Tu as le cristal d'Obscurité![music][0x29][delay][0x24][end] @@ -2829,7 +2861,7 @@ Nous devons vaincre Golbez!![new] [bold]Cid[normal]: Merde, cet aéronef devrait être plus rapide que les leurs! Ils ont dû aussi modifier les Ailes -Rouges![new] +Rouges! Qui est-ce qu'ils ont pris pour faire ça?[end] [bold]Rydia[normal]: Ils approchent![new] @@ -2841,8 +2873,7 @@ Je voulais voir vos enfants, Rosa... Cecil...[new] Mais Yang va être seul, ça ne va pas... -Allez à Baron et parlez à mes -apprentis![end] +Allez à Baron et parlez à mes apprentis![end] [bold]Cecil[normal]: Cid![new] [bold]Rydia[normal]: Grand-père![end] @@ -2971,11 +3002,14 @@ On est touché! On va s'écraser! Accrochez-vous![end] -«Mort à ceux qui convoitent cette Lance Sacrée!»[end] +«Mort à ceux qui convoitent cette +Lance Sacrée!»[end] -«Tu n'obtiendras jamais la sainte protection de ces Rubans!»[end] +«Tu n'obtiendras jamais la sainte +protection de ces Rubans!»[end] -«Seigneur Zémus abhorre le pouvoir de cette épée. Il ne doit pas être libéré!»[end] +«Seigneur Zémus abhorre le pouvoir de +cette épée. Il ne doit pas être libéré!»[end] [bold]Dr Lugeie[normal]: Ha Ha Ha! Je me suis toujours demandé ce qu'était @@ -2992,7 +3026,8 @@ Et je vais anéantir les nains avec mon super canon! Même dans la mort, je suis gagnant![end] -«Allez-y donc avant de prendre ce katana! En enfer...!»[end] +«Allez-y donc avant de prendre ce +katana! En enfer...!»[end] [bold]Yang[normal]: Ça veut donc dire qu'ils vont essayer de voler le cristal de l'air![new] diff --git a/text/fr/bank1-2.xml b/text/fr/bank1-2.xml index dc48b40..a776c63 100644 --- a/text/fr/bank1-2.xml +++ b/text/fr/bank1-2.xml @@ -89,8 +89,8 @@ Zémus...[new] Quoi?![end] [bold]Edge[normal]: Rien à foutre! -C'est de ta faute à toi, si le Géant s'est -ramené, déjà![end] +C'est de ta faute à toi, si le Géant +s'est ramené, déjà![end] [bold]Caïn[normal]: Économise ta salive pour plus tard! @@ -138,7 +138,7 @@ frère de....[new] [bold]FuSoYa[normal]: Tu étais contrôlé par Zémus... Ceux de sang lunien sont sensibles aux pouvoirs psychiques, et donc plus faciles -à contrôler...[new] +à contrôler... Tu étais son pantin contre ton gré...[end] [bold]Edge[normal]: Qu'est-ce que![new] @@ -153,7 +153,7 @@ J'étais un chevalier noir...[new] [bold]Golbez[normal]: ...mais nos âmes ont été pesées... Tu as renoncé au mal, alors j'ai été jugé -ouvert à...[new] +ouvert à... Zémus!!![end] [bold]Cecil[normal]: Où vas-tu!?[new] @@ -185,16 +185,16 @@ C'est mauvais, ça![new] [bold]Cecil[normal]: .....[end] [bold]Edge[normal]: Mais qu'est-ce que tu fous!?[new] -[bold]Rydia[normal]: Comment on va sortir d'ici!?[new] +[bold]Rydia[normal]: Comment on va sortir d'ici!? «Par ici!»[end] [bold]Rosa[normal]: Caïn![new] [bold]Edge[normal]: On marche pas, cette fois![end] -[bold]Caïn[normal]: J'ai enfin repris le contrôle -de moi-même. +[bold]Caïn[normal]: J'ai enfin repris le contrôle de +moi-même. Mon esprit restait prisonnier de mes -mauvaises actions...[new] +mauvaises actions... Je ne peux pas vous demander de me pardonner, mais...[end] @@ -249,7 +249,7 @@ Edge![end] [bold]Edge[normal]: Rydia... C'était plutôt en dessous de la ceinture. Je t'en veux pas d'être chienne avec -moi...[new] +moi... Bon sang, tu vas me manquer.[end] [bold]Cecil[normal]: Allons-y![end] @@ -282,7 +282,7 @@ combat de tous, pas rien le tien. Et puis je suis votre seule invocatrice![new] [bold]Cecil[normal]: Rydia... Très bien... -Allons-y![new] +Allons-y! Nous allons combattre... pour tout le monde![end] @@ -312,7 +312,9 @@ Augmenté par la haine de Zémus...[end] [bold]Cecil[normal]: Zéromus....![new] [bold]Zéromus[normal]: Je... ...vais...vous...détruire...!!![end] -«....Je.... ne... périrai pas... ....Tant que...le... mal.... ...hantera...le... cœur...des...hommes... Urgh...Gyaa... Gyaaaaaaaaammmmmmm!!!!»[end] +«....Je.... ne... périrai pas... ....Tant que...le... +mal.... ...hantera...le... cur...des...hommes... +Urgh...Gyaa... Gyaaaaaaaaammmmmmm!!!!»[end] [bold]FuSoYa[normal]: Incroyable![end] @@ -321,8 +323,8 @@ de puissance.... La Planète Bleue a tant évolué pendant que nous dormions?[new] [bold]Edge[normal]: Ha! -Si on écoute Rydia, je pourrais -être le chaînon manquant...[end] +Si on écoute Rydia, je pourrais être +le chaînon manquant...[end] [bold]Ancien[normal]: Toi! C'est toi, le chevalier noir! @@ -370,8 +372,7 @@ l'homme que tu poursuis...[new] Si tu souhaites changer ta pâle lueur en lumière rayonnante, alors va sur la montagne de l'Épreuve à l'est.[new] -[bold]Cecil[normal]: Mais je dois sauver mon -amie![new] +[bold]Cecil[normal]: Mais je dois sauver mon amie![new] [bold]Ancien[normal]: Si tu chéris vraiment cette amie, tu devras endurer cette épreuve... et être baigné dans la lumière purifiante @@ -393,7 +394,7 @@ Que dis-tu, iras-tu?[new] [bold]Ancien[normal]: Mais ta lame noire n'aura que peu d'effet sur les monstres du mont. Je vais envoyer des magiciens avec toi. -Palom![new] +Palom! Porom![end] «Bienvenue!»[end] @@ -418,16 +419,15 @@ hiberner pour survivre.[new] [bold]FuSoYa[normal]: La planète sur laquelle vous vivez. Mais les créatures de votre planète -étaient encore en pleine évolution...[new] +étaient encore en pleine évolution... Alors nous créâmes une autre lune et continuâmes à dormir...[end] [bold]Edge[normal]: Une autre lune?[new] [bold]FuSoYa[normal]: Mais l'un des nôtres refusa -de dormir...[new] +de dormir... Il voulait purger votre planète de tout -être vivant pour pouvoir nous y -installer.[new] +être vivant pour pouvoir nous y installer.[new] [bold]Rydia[normal]: Quelle horreur...![new] [bold]FuSoYa[normal]: ...Il était un brillant mais impatient homme. @@ -444,7 +444,7 @@ dormir, mais son esprit était toujours Tout au long de ces ères, il se consuma par la haine, accroissant ses pouvoirs psychiques pour détruire toute chose -vivante...[new] +vivante... Depuis qu'il est scellé au-dessous, il utilise ses pouvoirs pour contrôler ceux dont l'âme est noire...[end] @@ -541,7 +541,7 @@ J'en fais mon devoir personnel, d'être un monument de vertu![end] [bold]Rydia[normal]: Monument de vertu! -Mais de quoi tu parles!?[new] +Mais de quoi tu parles!? C'est presque un miracle que quelqu'un comme toi n'ait pas été possédé par Zémus![end] @@ -555,7 +555,7 @@ Ce serait un terrible gâchis![new] [bold]FuSoYa[normal]: Enfin, la Planète Bleue sera vivable, avec vous deux sur la place... À présent, je dois retourner à mon -sommeil.[new] +sommeil. Qu'allez-vous faire?[end] [bold]Cecil[normal]: Nous allons retourner sur @@ -590,13 +590,12 @@ Qui plus est...[new] J'ai été arrogant... impitoyable,...rancunier... Maintenant, je suis devant toi un -homme... brisé... vaincu...et repentant.[new] +homme... brisé... vaincu...et repentant. Peut-être... pourrai-je soulager dans le sommeil le tourment de mon âme...[end] [bold]FuSoYa[normal]: Il nous faut à présent partir... -Je prie pour la paix sur la Planète -Bleue.[end] +Je prie pour la paix sur la Planète Bleue.[end] [bold]Rosa[normal]: Cecil...[new] [bold]Caïn[normal]: Cecil, pardonne-lui @@ -631,8 +630,8 @@ braves![new] Cecil avait besoin que je lance mon puissant sort[new] «Gel»[new] -... [delay][0x18] Il a dit que j'étais bien plus -héroïque que lui...[new] +... [delay][0x18] Il a dit que j'étais bien plus héroïque +que lui... Ah, je peux lire au fond de tes yeux que tu le penses aussi... [delay][0x18] Qu'est-ce que tu dirais de trouver un coin plus @@ -642,19 +641,19 @@ impressionnant...?[delay][0x10][close_window][end] [bold]Palom[normal]: Ouyouyouille![new] [bold]Porom[normal]: Espèce de petit pervers![new] -[bold]Palom[normal]: J'allais juste lui[delay][0x18] montrer -mon... heu... +[bold]Palom[normal]: J'allais juste lui[delay][0x18] montrer mon... +heu... Bâton de Feu![new] [bold]Porom[normal]: Ouais, je parie... -Notre ancien est vraiment furieux -après toi! +Notre ancien est vraiment furieux après +toi! Allez![delay][0x10][close_window][end] [bold]Ancien[normal]: Combien de fois devrai-je te dire de ne pas sécher les leçons? [delay][0x18] Qu'est-ce qu'il faut que je fasse pour venir à bout d'un précoce monsieur -je-sais-tout?[new] +je-sais-tout? Peut-être que de recopier des sorts va t'aider à voir l'importance des leçons! [delay][0x18][close_window][end] @@ -694,7 +693,7 @@ pour changer! [delay][0x18][close_window][end] [bold]Edge[normal]: Mais Rydia... Beauté, intelligence, et une langue acérée... [delay][0x18] Maintenant, il y a une femme -qui peut me faire me ranger![new] +qui peut me faire me ranger! Bon sang, ce que j'ai besoin d'elle... [delay][0x18][close_window][end] [bold]Léviathan[normal]: C'est une fille incroyable![new] @@ -712,7 +711,7 @@ J'aimerais être comme toi.[delay][0x8][close_window][end] [bold]Rydia[normal]: De quoi parles-tu? Humains et Chimères ont la même capacité[delay][0x18] d'aimer et de prêter attention -aux autres.[new] +aux autres. Alors, tu vois, nous ne sommes pas si différents. [delay][0x18][close_window][end] @@ -728,13 +727,15 @@ plus importante, pourtant...[delay][0x10][close_window][end] Prince![delay][0x8][close_window][end] -«Chante-nous une autre chanson sur le paladin!»[new] +«Chante-nous une autre chanson sur le +paladin!»[new] [delay][0xc] -[bold]Edward[normal]: Pas tant que vous n'avez pas -fini le travail d'aujourd'hui. +[bold]Edward[normal]: Pas tant que vous n'avez +pas fini le travail d'aujourd'hui. Ne voulez-vous pas reconstruire notre château? [delay][0x8][new] -«Ha là là... Mais il n'y a plus de monstres! »[new] +«Ha là là... Mais il n'y a plus de monstres! +»[new] [delay][0x8] [bold]Edward[normal]: C'est ce que le paladin a fait pour nous.[new] @@ -744,7 +745,7 @@ que les monstres.[new] Nous ne voulons pas que nos mamans et papas tombent malades et meurent. [delay][0x11] Voilà pourquoi nous devons reconstruire -notre château.[new] +notre château. Et nous avons besoin de l'aide de tout le monde aide, même vous, petits enfants. [delay][0x11] Dites-vous... qu'après avoir fini @@ -755,7 +756,7 @@ chanson super-spéciale! [delay][0x10][close_window][end] [delay][0x8][close_window][end] [bold]Edward[normal]: Regarde-moi de là-haut, -Anna.[new] +Anna. J'ai toujours le peuple de Damcyan à m'occuper... [delay][0x18] Je ne peux que prier pour que toi et ton père souriiez sur nous...[delay][0x18][close_window][end] @@ -782,7 +783,7 @@ grandeurs de la[delay][0xd] noblesse. La royauté n'est rien de plus que le cadeau à quelqu'un de la capacité de gouverner et de l'amour pour les[delay][0xd] -compatriotes...[new] +compatriotes... Je suis certain que tu vas rendre à Fabul sa gloire passée! [delay][0xd][close_window][end] @@ -792,7 +793,8 @@ Fabul sa gloire passée! [delay][0xd][close_window][end] Mettons-nous au travail et restaurons ce château! [delay][0x18][close_window][end] -«Majesté! Nous n'avons pas assez de matières premières pour ça, Lali!»[new] +«Majesté! Nous n'avons pas assez de +matières premières pour ça, Lali!»[new] [delay][0x18][close_window][end] [bold]Giotto[normal]: Les chars! @@ -827,7 +829,7 @@ ont partout éhonté les rangs des chevaliers dragons...[new] Le mont de l'Épreuve t'a testé, Cecil...[delay][0x18] Maintenant, je dois me -tester...[new] +tester... Si je surpasse mon père en tant que chevalier dragon, son esprit pourrait me pardonner..[delay][0x18][close_window][end] @@ -837,7 +839,8 @@ pardonner..[delay][0x18][close_window][end] [bold]Colliro[normal]: Qu'est-ce qui ne va pas?! [delay][0x10][close_window][end] -«C'est terrible! La lune est en train de...!»[new] +«C'est terrible! La lune est en train +de...!»[new] [delay][0x18][close_window][end] [bold]Cecil[normal]: ...!![delay][0x10][close_window][end] @@ -865,7 +868,7 @@ Alors dépêchez-vous![new] [bold]Cid[normal]: Pffff! Vous pourrez vous tripoter jusqu'à plus soif plus tard! -Maintenant, allez, Rosa![delay][0x20] ...[new] +Maintenant, allez, Rosa![delay][0x20] ... Non, non, je veux dire Majesté! [delay][0x10][close_window][end] [bold]Rosa[normal]: Non, appelle-moi juste @@ -883,10 +886,10 @@ On se dépêche![new] Prends...Prends ceci! Utilise...le![end] -[bold]Rosa[normal]: Ça faisait tellement longtemps -que nous n'avions pas vu tout le monde. -[delay][0x18] Ils devraient arriver à partir de -maintenant![new] +[bold]Rosa[normal]: Ça faisait tellement +longtemps que nous n'avions pas vu tout +le monde. [delay][0x18] Ils devraient arriver à partir +de maintenant![new] Cecil, dépêche-toi, toi aussi![new] [bold]Cecil[normal]: J'arrive, Rosa.[delay][0x18][close_window][end] @@ -914,7 +917,7 @@ Ta fin te viendra de mes propres mains![end] [bold]Zéromus[normal]: ...Souffrez! Périssez! Jusqu'à ce que tout soit détruit... -Ma haine continuera...[new] +Ma haine continuera... Maintenant...Venez... ...dans mes ténèbres éternelles...[end] @@ -935,8 +938,7 @@ tout le monde à Cecil![end] [bold]Yang[normal]: M. Cecil...![end] -[bold]Edward[normal]: Montrez-nous le vrai -courage![end] +[bold]Edward[normal]: Montrez-nous le vrai courage![end] [bold]Cid[normal]: On t'attend tous!![end] @@ -964,8 +966,7 @@ précoce...[new] [bold]Palom[normal]: Attention les yeux! Je vais t'aider, alors sois reconnaissant![new] [bold]Ancien[normal]: Palom! -Qu'est-ce que je t'ai dit sur -l'arrogance?[end] +Qu'est-ce que je t'ai dit sur l'arrogance?[end] [bold]Caïn[normal]: Cecil...[end] @@ -986,11 +987,11 @@ Chimères... et reviens ici...[new] [bold]Roi Baron[normal]: Tu es venu...[end] [bold]Cecil[normal]: Majesté...[new] -[bold]Roi Baron[normal]: Le regard dans tes yeux est -un regard de tristesse, Cecil...[new] +[bold]Roi Baron[normal]: Le regard dans tes yeux +est un regard de tristesse, Cecil...[new] Oui, c'est vraiment moi, j'ai... j'ai été assassiné, mais je suis devenu l'âme -d'une Chimère...[new] +d'une Chimère... L'Invocatrice de Mist pourrait appeler mon nom, mais vous devez être testés...[end] diff --git a/text/fr/bank2.xml b/text/fr/bank2.xml index fbdcec0..2090486 100644 --- a/text/fr/bank2.xml +++ b/text/fr/bank2.xml @@ -21,7 +21,7 @@ de Mist...[end] Un moine étranger a été placé à la tête des gardes. J'ai entendu dire qu'il recherchait -quelqu'un.[new] +quelqu'un. Il doit être à l'auberge...[end] J'ai entendu dire que le roi a été tué et remplacé par un monstre. @@ -37,14 +37,14 @@ Tuez Golbez!![end] La porte du bâtiment à l'ouest de la ville? Elle donne sur une voie navigable -souterraine qui mène au château.[new] +souterraine qui mène au château. Mais maintenant elle est scellée.[end] C'est la première fois depuis la fondation de Baron qu'on n'a pas de roi...[end] Le chevalier noir! Non...m-m-monsieur, je n'ai rien dit contre le roi! -Je...je danserai pour vous.[new] +Je...je danserai pour vous. Ça vous va?[end] Le roi a été vraiment dur, dernièrement,... @@ -65,8 +65,8 @@ sous le château de Baron... On dit que son épée tue ses ennemis d'un seul coup![end] Nous, les invocateurs, avons la capacité -de faire venir des montres du monde -des Chimères...[new] +de faire venir des montres du monde des +Chimères... Un endroit qui se trouverait loin sous la surface de la Terre.[end] @@ -79,7 +79,7 @@ Elle a été emmenée chez un voisin pour Anna est tombée amoureuse. Qui est Anna? C'est une fille qui vivait ici, elle est -tombée amoureuse d'un barde errant.[new] +tombée amoureuse d'un barde errant. Son père, maître Tellah, n'acceptait pas qu'ils se fréquentent, alors ils se sont enfuis de Kaïpo.[end] @@ -163,13 +163,13 @@ Non? Une tourte à la sauterelle, alors?[end] Nous extrayons le minerai de mithril, les grenouilles le raffinent, et les nabots le -forgent.[new] +forgent. Nous faisons même des armes que vous, les humains, pouvez utiliser![end] J'ai fait une longue route depuis la Montagne de Mithril au nord. Même si vous pouvez y aller en une -minute avec vos longues jambes...[new] +minute avec vos longues jambes... Pour nous ça fait une sacrée trotte![end] Ouais, baby! Ouais![end] @@ -191,7 +191,7 @@ Enlevez-la, idiots![end] Hé, celle-là est drôlement bien roulée... Hé!! Qu..qu'est-ce que... -Tu m'as fait peur![new] +Tu m'as fait peur! Fiche le camp, bon sang![end] Je me demande où est passé mon mari...[end] As-tu entendu parler de la Harpe @@ -204,7 +204,7 @@ Je prends un bain de soleil![end] On extrait des joyaux dans la grotte au nord. Par contre, on ne peut pas porter de -métal du tout.[new] +métal du tout. Il devient vraiment très lourd...[end] C'est la ville des gens de sang nain... @@ -253,7 +253,7 @@ pour l'égalité des chances[end] Ah, le chevalier noir du château! Buvez donc un coup. Hein?... -Oh, non, monsieur.[new] +Oh, non, monsieur. Votre argent n'est pas bon, ici.[end] On dit que Cid a été enfermé dans le château! @@ -266,8 +266,8 @@ C'est... c'est Cecil des Ailes Rouges! Je n'ai rien fait de mal! Je paie toujours la totalité de mes impôts à temps![end] -Les soldats du château font ce que bon -leur semble au bar![end] +Les soldats du château font ce que +bon leur semble au bar![end] La ville a enfin retrouvé son esprit d'antan! Bon, retournons au travail![end] @@ -277,7 +277,7 @@ T[end] Vous êtes costauds! Vous avez vraiment rossé de ces soldats! -Vous me plaisez![new] +Vous me plaisez! Cette nuit, restez ici gratuitement![end] Hé, les boissons sont toujours pas prêtes? @@ -288,12 +288,12 @@ Mais vous êtes qui, vous!?[end] [bold]Cid[normal]: Zzz...Zzz... J'ai fini le nouveau modèle de moteur! rrron...rrron...[end] -[bold]Cid[normal]: Papa a encore passé une nuit -blanche! +[bold]Cid[normal]: Papa a encore passé une +nuit blanche! Il se croit encore jeune....[new] Et en plus, tout le monde en ville peste contre les soldats et le roi, mais il y a -plein de gens bien, comme vous...[new] +plein de gens bien, comme vous... Papa se chamaille sans cesse avec les habitants de la ville à ce sujet...[end] [bold]Cid[normal]: Principes de la Flottaison[end] @@ -309,7 +309,7 @@ S'il vous plaît, trouvez-le[end] Papa! Tu vas bien! Comment ça? -Tu pars avec Cecil?[new] +Tu pars avec Cecil? Papa, tu n'as plus tout d'un jeune coq![end] [bold]Cid[normal]: Cecil, veillez sur lui. Et évitez qu'il s'attire des ennuis! @@ -319,7 +319,7 @@ Est-ce qu'il retravaille sur l'aéronef?[end] [bold]Mère de Rosa[normal]: Qu'est-ce que le roi mijote, ces temps-ci... Il paraît que vous avez fait des choses -horribles à l'étranger![new] +horribles à l'étranger! Surtout, n'embarque pas Rosa dans tout ça...[end] [bold]Mère de Rosa[normal]: Rosa s'est @@ -335,14 +335,14 @@ Je n'aurais jamais dû te laisser devenir mage blanc.[new] [bold]Rosa[normal]: Non, Maman! J'ai bien fait! -Cecil est un guerrier, alors je -peux l'assister![new] +Cecil est un guerrier, alors je peux +l'assister![new] Et tu as combattu aux côtés de papa en tant que mage blanc, autrefois![new] [bold]Mère de Rosa[normal]: ... Rosa... Ton père... c'était un grand chevalier... je -comprends...[new] +comprends... Cecil, prends bien soin d'elle.[end] T[end] @@ -356,13 +356,13 @@ vivaient heureux ensemble, et puis Anna s'est sauvée de chez elle... Je me demande bien pourquoi...[end] -Salut, je suis un savant itinérant.[new] +Salut, je suis un savant itinérant. Je veux faire des recherches à Fabul, une ville à l'est de Damcyan, mais au canal souterrain, il y a un drôle de vieux qui ne veut pas me laisser passer...[end] Oh, comme c'est singulier... -Un client...[new] +Un client... À cause de tous les monstres, nous voyons de moins en moins de clients, de nos jours.[end] @@ -389,14 +389,15 @@ Afin de guérir la fièvre du désert, il te faut la Lumière du Désert... un joyau rarissime qu'on trouve uniquement dans l'antre du Fourmilion...[end] -«La Lumière du Désert est le seul remède contre la fièvre du désert...»[end] +«La Lumière du Désert est le seul +remède contre la fièvre du désert...»[end] [bold]Rosa[normal]: ... [music][0x13] Ooh... Cecil... Ne m'abandonne pas, Cecil![end] [bold]Rosa[normal]: Je suis content que tu ailles mieux. L'espace d'un instant, c'est comme si -j'avais eu une fille à moi.[new] +j'avais eu une fille à moi. Reviens nous voir bientôt![end] Que veux-tu nous voler, cette fois![end] @@ -424,7 +425,7 @@ Ouaah! Un vrai paladin?[end] Oh, voyez donc qui est entré dans mon bar... -Le chevalier noir de Baron.[new] +Le chevalier noir de Baron. Hé, prends-en une aux frais de la maison.[end] Toi, un paladin? @@ -455,7 +456,7 @@ Feu, terre, eau, et vent sont la base de toute chose.[end] Méthodes de respiration pour faire de la magie noire.[end] -Mon premier[new] +Mon premier «Soin»[end] T[end] T[end] @@ -484,7 +485,7 @@ Palom, ça ne va pas recommencer![end] [bold]Garçon[normal]: Alors c'est toi le mec de Baron, hein? Le vieux m'a dit de t'aider, il faut croire -que je n'ai pas le choix.[new] +que je n'ai pas le choix. Sois-m'en reconnaissant![end] [bold]Porom[normal]: Vous êtes M. Cecil, n'est-ce pas? @@ -500,12 +501,12 @@ toi! [music][0x29][delay][0x28][end] [bold]Ancien[normal]: Maintenant, va sur la Montagne de l'Épreuve! Palom! -Porom![new] +Porom! Je compte sur vous![end] Tu es maître de ton destin. Tout ce que je peux faire à présent, -c'est prier pour toi...[new] +c'est prier pour toi... Palom, Porom, tenez-vous bien, et essayez de ne pas gêner M. Cecil.[end] @@ -538,7 +539,7 @@ c'est pourquoi nos soirées sont chaudes... si tu vois ce que je veux dire.[end] Bien! Aujourd'hui, J'ai eu un rencard au -comptoir![new] +comptoir! Demain, c'est au-dessus que ça se passe![end] Salut, chéri! -clin d'il[end] @@ -596,8 +597,8 @@ Ha dis donc, qu'est-ce que j'aimerais T[end] Grâce à l'eau pure et au sol fertile, -nous pouvons avoir de nombreux -légumes frais.[new] +nous pouvons avoir de nombreux légumes +frais. C'est donc un cadre idéal pour élever des chocobos.[end] T[end] @@ -612,12 +613,12 @@ domestiqués par les humains, ils ne peuvent plus voler.[new] Toutefois, ceux qui sont sauvages, au village chocobo au nord peuvent voler, -bien que pas très haut.[new] +bien que pas très haut. Ils ne peuvent se poser que dans des forêts, malheureusement.[end] Les chocobos noirs se souviennent du chemin pour rentrer chez eux, et y -retourneront.[new] +retourneront. Mais, après tout, comme ce sont des animaux sauvages, ils se sauvent après seulement un voyage.[end] @@ -644,7 +645,7 @@ ici.[new] Il y a peu, phénomènes étranges ont eu lieu sur la lune. Nous avons fait tout notre possible -pour les observer.[new] +pour les observer. Qu'est-ce qui se passe, là- bas..?[end] Mon mari est tellement absorbé par ses observations qu'il en oublie de boire et @@ -661,7 +662,7 @@ Cette planète a deux lunes.[new] L'une n'héberge aucune vie, mais l'autre est plus singulière... Cette Lune devient rouge... le rouge...la -même couleur que notre sang...[new] +même couleur que notre sang... J'espère que rien de mauvais ne se prépare...[end] @@ -669,17 +670,17 @@ prépare...[end] le cratère au nord![end] Même quand le reste du monde souffre des ravages de la guerre, c'est paisible, -ici.[new] +ici. Par contre, nous sommes bien atteints par les tremblements de terre.[end] Ma grand-mère est la doyenne du village. Elle sait tout![end] -Nos ancêtres sont venus du grand -trou, dans les montagnes au nord.[new] +Nos ancêtres sont venus du grand trou, +dans les montagnes au nord. Mais maintenant le trou est bouché et -on ne peut y aller, ni par la terre, ni -par les airs.[end] +on ne peut y aller, ni par la terre, ni par +les airs.[end] Il y a une ancienne légende... Quand nous retournons la Pierre de Magma à son lieu de naissance, le chemin @@ -749,12 +750,12 @@ Les villageois sont pertutbés... Et je parle même pas de moi...[new] Enfin, de toute façon, sois prudent, reçu? -Je rentre à la maison.[new] +Je rentre à la maison. J'ai pas mal bossé ces derniers temps... et ma fille me pique des crises à cause de ça![end] As-tu vu notre patron Cid dans -le coin?[new] +le coin? Il s'est mis à penser à Dieu Sait Quoi, nous laissant seuls à nettoyer les aéronefs.[end] @@ -764,8 +765,8 @@ On dirait que le patron fait comme à son habitude, non?[end] Quoi, on doit ENCORE passer une nuit blanche sur ce projet? -Si ce n'était pas un soudard pareil, on -y prendrait du plaisir.[new] +Si ce n'était pas un soudard pareil, on y +prendrait du plaisir.[new] Ah! N...ne le dis pas au patron! D...dis-lui que... heu... le travail, c'est @@ -773,7 +774,7 @@ amusant![end] Aah! Un f-f-f-f-fantôme! Eh, c'est vraiment toi? -Merci mon Dieu![new] +Merci mon Dieu! Je croyais que tu me prenais en chasse ou quelque chose comme ça![end] Ouaip...Je suis devenu aussi bon que le @@ -795,8 +796,7 @@ manière ou d'une autre.[end] Ah, M. Cecil![end] J'adore être une grenouille. -Plein de baisers de jeunes filles -blondes...[end] +Plein de baisers de jeunes filles blondes...[end] Bienvenue au château de Troia![end] Oui, je m'appelle Kermit, comment tu sais?[end] @@ -811,8 +811,7 @@ dans le château.[end] T[end] Les Clercs sont les dignes messagères de Dieu. -Veuillez vous comporter -convenablement.[end] +Veuillez vous comporter convenablement.[end] T[end] @@ -825,7 +824,7 @@ s'ouvrira.[end] J'ai entendu des complaintes venant de dessous le château. Ça ne pourrait pas être... -Sa majesté?[new] +Sa majesté? Est-ce que ça pourrait être... une malédiction?[end] J'ai entendu dire que tu as apporté le @@ -865,8 +864,8 @@ Le village de Mist est au nord-ouest de Baron. On dit qu'il est toujours couvert d'une épaisse nappe de brouillard.[end] -Nous défendrons le château au nom -des chevaliers dragons![end] +Nous défendrons le château au nom des +chevaliers dragons![end] Si le capitaine des chevaliers dragons Caïn et Cecil font équipe, cette bague est sûre d'arriver à bon @@ -915,7 +914,7 @@ Elle a couru à ta recherche...[new] [bold]Cecil[normal]: Golbez l'a enlevée...[new] [bold]Cid[normal]: Quoi?! Alors que tu étais là pour la protéger? -Mais ce Golbez....[new] +Mais ce Golbez.... Non seulement il abuse de mes aéronefs, mais de Rosa aussi!?[end] [bold]Tellah[normal]: Cette fille est en danger. @@ -985,12 +984,11 @@ C'est interdit![end] les magiciens Mythidiens qui ont résisté. Tu peux leur parler à travers les barreaux.[end] -J'espère que nous n'aurons plus jamais -à utiliser ce donjon.[end] +J'espère que nous n'aurons plus jamais à +utiliser ce donjon.[end] Tu es ce chevalier noir! Tu crois t'en tirer comme ça!?[end] -Nous nous fichons de ce qui nous -arrive. +Nous nous fichons de ce qui nous arrive. Rendez juste le cristal à Mythidia![end] Tu ne comprends rien! Le cristal n'est pas qu'un joyau @@ -1011,12 +1009,12 @@ puisse diriger Baron![end] Ce boulot m'a laissé une mauvaise impression...[end] Golbez a pris les Ailes Rouges![end] -Les Ailes Rouges ont vraiment atteint le -fond![end] +Les Ailes Rouges ont vraiment atteint +le fond![end] Merde, alors! Si seulement on avait les aéronefs! J'en ai assez de m'asseoir par ici et de -me saouler![new] +me saouler! Je veux me battre![end] T[end] @@ -1071,23 +1069,21 @@ Il y a un aéroglisseur à Damcyan qui peut le traverser. Il devrait aussi pouvoir traverser les hauts-fonds pour aller vers Kaïpo.[end] -Nous sommes les seuls -survivants. +Nous sommes les seuls survivants. Peut-être pouvons-nous nous retirer à -Kaïpo...[new] +Kaïpo... Nous pouvons utiliser l'Aéroglisseur pour traverser les hauts-fonds à l'ouest pour y aller...[end] -Peut-être pouvons-nous -nous retirer à Fabul...[new] +Peut-être pouvons-nous nous retirer à +Fabul... Mais le chemin de Fabul par le mont Hobs a été bloqué par une épaisse couche de glace apportée par les vents glaciaux.[end] [bold]Tellah[normal]: ....Qui est ce Golbez!?[new] -[bold]Edward[normal]: Il est venu à Baron il y a -peu et a pris le contrôle des Ailes -Rouges.[new] +[bold]Edward[normal]: Il est venu à Baron il y a peu +et a pris le contrôle des Ailes Rouges.[new] Tout ce que je peux imaginer, c'est qu'il les utilise pour rassembler les cristaux... sniff...[new] @@ -1111,10 +1107,10 @@ Alors fais comme les adultes...![new] T'es pas le seul à avoir perdu quelqu'un que tu aimes...[new] [bold]Cecil[normal]: Rydia...[end] -[bold]Edward[normal]: Tu as raison... je ne suis qu'un -minable! +[bold]Edward[normal]: Tu as raison... je ne suis +qu'un minable! Dans ce cas, je vais rester ici avec -Anna pour toujours![new] +Anna pour toujours! Je me fiche bien de tout le reste![end] [bold]Cecil[normal]: Mais bordel, vous n'êtes le seul à être triste, ici![new] @@ -1181,9 +1177,8 @@ l'attaque et se repose dans sa chambre.[end] T[end] -J'ai entendu dire que vous avez été -pris en embuscade au sommet du mont -Hobs! +J'ai entendu dire que vous avez été pris +en embuscade au sommet du mont Hobs! Est-ce que vous allez bien?[end] Si seulement nous avions un aéronef, nous pourrions trouver un moyen pour @@ -1200,8 +1195,8 @@ Nous irons bien quoi qu'il arrive dans le château! Nous avons des Moines pour le défendre![end] -Je suis content que la ville de Fabul soit -dans le château. +Je suis content que la ville de Fabul +soit dans le château. Si nous avions été dehors, nous serions morts, à l'heure qu'il est![end] Maître Yang! @@ -1214,14 +1209,14 @@ rapide comme nos Moines![end] [bold]Roi de Fabul[normal]: Misère, quel désastre... Mais nous devons réorganiser et fortifier nos défenses! -Ne vous inquiétez pas pour moi.[new] +Ne vous inquiétez pas pour moi. Pour le moment, vous devriez vous reposer.[end] [bold]Roi de Fabul[normal]: ...Oh, vraiment? Très bien, Yang! Accompagne-les et aide-les![new] -Cecil, je n'arrive pas à trouver -mes mots pour te remercier assez. +Cecil, je n'arrive pas à trouver mes +mots pour te remercier assez. Et aussi, Rosa a été capturée...[new] Je vais ordonner qu'on affrète un bateau immédiatement. @@ -1268,15 +1263,15 @@ Lui et ses amis m'ont sauvé la vie.[new] Au fait, chéri, penses-tu vraiment que ce soit le moment de traîner par ici?[end] [bold]Femme de Yang[normal]: Tu es sauf![new] -[bold]Yang[normal]: Grâce à ces gens, Fabul a été -sauvée.[new] +[bold]Yang[normal]: Grâce à ces gens, Fabul a +été sauvée.[new] [bold]Femme de Yang[normal]: Vous avez beaucoup fait pour nous. Nous vous remercions du fond du cur...[new] [bold]Yang[normal]: Personne ne t'a fait de mal, hein?[new] [bold]Femme de Yang[normal]: Bien sûr que non! -Je suis ta femme, quand même![new] +Je suis ta femme, quand même! Un soldat de Baron est bien venu, mais je lui ai fichu un coup de ma poêle à frire sur la tête![end] @@ -1285,14 +1280,14 @@ Va battre les méchants et reviens![end] [bold]Yang[normal]: Yang est mort? Certainement! Ce n'est pas quelqu'un qui meurt -facilement![new] +facilement! Non...Il n'est pas...[end] [bold]Yang[normal]: Alors c'est là qu'il était... Oh, ces oignons... Ils me piquent tellement les yeux...[end] [bold]Yang[normal]: Il ne devrait pas être dans un état pareil! -S'il te plaît...[new] +S'il te plaît... Donne-lui un bon coup de ça sur la tête![end] [bold]Yang[normal]: Obtenu la Poêle à frire de @@ -1300,14 +1295,15 @@ l'Amour![end] [bold]Yang[normal]: Yang?! Il est sous terre?[end] [bold]Yang[normal]: Désolée, je suis bloquée ici à -faire les travaux ménagers tout le temps. +faire les travaux ménagers tout le +temps. C'est tout ce que j'ai pour vous remercier, mais ça pourrait bien servir.[end] [bold]Yang[normal]: Obtenu le Hachoir à Viande![end] [bold]Yang[normal]: Ne vous inquiétez pas pour moi! Dites à Yang de se remettre vite -et de se battre pour l'avenir du monde![new] +et de se battre pour l'avenir du monde! Et...que je l'aime.[end] T[end] @@ -1319,7 +1315,7 @@ nous entourera de façon à ce que les monstres ne puissent pas entrer.[new] Nous pouvons nous reposer ici dans une tente ou une cabine, et sauvegarder la -partie.[new] +partie. En vue du combat de demain, reposons-nous dans ma tente et soignons nos blessures![end] @@ -1332,7 +1328,7 @@ derniers temps, mais ils ne vont probablement pas attaquer ici.[end] Ça a beau ressembler à des maillots, ce sont bel et bien des tenues de combat! -Elles sont vraiment pratiques.[new] +Elles sont vraiment pratiques. Elles sont bien pour bouger dedans, légères, et confortables![end] Troia est protégée par des femmes. @@ -1366,27 +1362,26 @@ le cristal de la terre.[end] Le cristal de la terre a été pris? Mon Dieu![end] L'Elfe Noir est faible contre les armes -de métal.[new] +de métal. Pour protéger ce point faible... il a augmenté le champ gravitationnel dans sa grotte.[end] Nous te confions le cristal. Prends-en soin![end] -Dire qu'un homme maléfique est en -train de réunir les cristaux![end] +Dire qu'un homme maléfique est en train +de réunir les cristaux![end] L'Elfe Noir vit dans la grotte au nord-est.[end] Quelle était cette voix!?[end] Le cristal a été volé? Ne restez pas comme ça, rapportez-le![end] -Si vous pouvez récupérer le cristal, -nous promettons que nous vous le -prêterons. +Si vous pouvez récupérer le cristal, nous +promettons que nous vous le prêterons. Mais d'abord, ramenez-le ici.[end] Prenez le trésor qui est à la cave.[end] Golbez mettant les mains sur le -cristal est bien pire que ce qui va -arriver à Troia sans lui![end] +cristal est bien pire que ce qui va arriver +à Troia sans lui![end] Si vous portez des armes et des armures de métal dans la grotte qui se trouve au nord-est, Vous ne pourrez @@ -1512,13 +1507,13 @@ Désolé, c'était Minimum![end] Rosa voulait t'aider, alors elle a choisi de devenir mage blanc. Ne la tourmente pas![end] -Nous ne pouvons que prier pour que -les âmes des soldats morts puissent -reposer en paix.[end] +Nous ne pouvons que prier pour que les +âmes des soldats morts puissent reposer +en paix.[end] J'étudie les rudiments de la magie blanche. Je peux utiliser trois niveaux de magie -blanche...[new] +blanche... Soin, Soin 2, Soin 3![end] Dire qu'un monstre a remplacé le roi...[end] Dernièrement, le roi a été aussi @@ -1542,7 +1537,7 @@ tant qu'objet dans un combat, sélectionne[new] «Objet»[new] et déplace le curseur tout en haut pour -sélectionner ton arme![new] +sélectionner ton arme! Utilise ça pour changer d'arme ou refaire le plein de flèches, et la victoire est à toi![end] @@ -1552,7 +1547,7 @@ Ceux qui n'en sont pas sûrs devraient diminuer la vitesse de bataille![new] Ceux qui sont confiants en leurs capacités peuvent changer le mode de -combat dans le menu Option en Actif.[new] +combat dans le menu Option en Actif. Les monstres vont t'attaquer même pendant que tu sélectionnes des objets ou des magies... pour rendre la bataille @@ -1562,13 +1557,13 @@ tu peux sauvegarder ton jeu. Utilise bien ces endroits![end] Si tu ne peux plus porter d'objets supplémentaires, tu peux les donner au -Gros Chocobo dans la Forêt Chocobo![new] +Gros Chocobo dans la Forêt Chocobo! Si tu sens des chocobos, utilise des légumes de Gysahl![end] L'homme qui est là-bas, c'est Namingway. -Si tu veux changer de nom, tu n'as -qu'à le lui demander![end] +Si tu veux changer de nom, tu n'as qu'à +le lui demander![end] Si tu te bats dans une bataille désespérée, tu ne pourras que mourir![new] Si tu crois être en difficulté, n'y @@ -1581,7 +1576,7 @@ invoquer sur de multiples cibles.[new] Si tu appuies vers la gauche pendant le combat, tu sélectionneras tous les ennemis... appuyer vers la droite -sélectionnera tous tes alliés![new] +sélectionnera tous tes alliés! Tu peux invoquer un sort sur ton groupe entier de cette même manière sur l'écran de menu![end] @@ -1606,7 +1601,7 @@ au village de Mist![new] [bold]Vieil Homme[normal]: Qui êtes-vous? Ce canal est infesté de monstres. C'est trop dangereux pour des jeunes -gens comme vous![new] +gens comme vous! Rentrez à Kaïpo![end] T[end] @@ -1617,7 +1612,7 @@ Rentrez à Kaïpo![end] [bold]Tellah[normal]: Nous sortirons par ici. Le monstre se trouve au-dessous de la -chute d'eau qui nous attend![new] +chute d'eau qui nous attend! Il serait avisé de nous reposer dans une tente dehors, juste au cas où![end] @@ -1692,7 +1687,8 @@ avons été attaqués par des hordes de monstres.[new] Mes hommes... tués... tous...je suis le seul survivant...[new] -[bold]Cecil[normal]: Nous faisons route vers Fabul.[new] +[bold]Cecil[normal]: Nous faisons route vers +Fabul.[new] [bold]Rosa[normal]: Un dénommé Golbez se sert de Baron pour rassembler les cristaux...[end] @@ -1756,7 +1752,12 @@ Tiens-toi tranquille![new] T[end] -«Ha ha ha ha... Ainsi vous avez réussi à me vaincre... Toutefois... Je ne vais pas mourir si facilement... Je vais utiliser mon dernier souffle de vie pour vous emporter avec moi! Je vous attendrai en Enfer! Héhéheh!»[end] +«Ha ha ha ha... Ainsi vous avez réussi à +me vaincre... Toutefois... Je ne vais pas +mourir si facilement... Je vais utiliser mon +dernier souffle de vie pour vous +emporter avec moi! Je vous attendrai en +Enfer! Héhéheh!»[end] [bold]Tellah[normal]: Les murs![end] [bold]Cid[normal]: C'est fermé![music][0x23][new] [bold]Tellah[normal]: Cette porte aussi![end] @@ -1793,15 +1794,15 @@ vous délivriez la bague à Mist.[end] [bold]Tellah[normal]: Ces jeunes fous! Ils étaient si jeunes! Pourquoi?... -Ç'aurait dû être moi![new] +Ç'aurait dû être moi! Pas ces enfants![end] [bold]Cecil[normal]: Ce puits semble sans fond...[end] [bold]Cid[normal]: Ourg! La gravité est si forte, ici! -On pourra même pas remuer si on -porte des armures métalliques![new] +On pourra même pas remuer si on porte +des armures métalliques![new] [bold]Yang[normal]: Mes griffes, ça a l'air d'aller.[new] [bold]Tellah[normal]: Ne vous inquiétez pas! Nous avons toujours ma magie![end] @@ -1838,7 +1839,7 @@ Mythidia.[new] Nous l'utilisions pour faire du commerce avec Mythidia... mais elle a été scellée du côté de Mythidia, maintenant c'est -impossible de passer.[new] +impossible de passer. En dessous d'ici se trouve la salle d'entraînement.[end] Ainsi le sceau de Mythidia a été brisé @@ -1877,7 +1878,7 @@ Qu'en dis-tu?[end] [bold]Golbez[normal]: Oh, je vois... Et alors nous pouvons le tuer quand il nous le ramène... -Diaboliquement intelligent, Caïn...[new] +Diaboliquement intelligent, Caïn... Tu pourrais encore te montrer utile.[end] [bold]Caïn[normal]: Très bien, alors je vais lui transmettre le message.[end] @@ -1900,7 +1901,7 @@ c'est une autre affaire![end] C...c'est la queue de rat que je cherchais! D'accord, je vais vous donner un bout -de ce minerai![new] +de ce minerai! Obtenu l'Adamant![music][0x29][delay][0xc][end] C..c'est...la légendaire queue rose! D'accord, je vais aussi vous donner ça! @@ -1988,10 +1989,10 @@ vie...[new] [bold]Rubicante[normal]: Nous nous rencontrons à nouveau! Vous m'avez montré la puissance de -ceux qui unissent leurs forces![new] +ceux qui unissent leurs forces! Maintenant, préparez-vous![end] -[bold]Rubicante[normal]: Combattez-nous de toute -votre force![end] +[bold]Rubicante[normal]: Combattez-nous de +toute votre force![end] [bold]Scarmiglione[normal]: Seigneur Zémus![end] [bold]Cagnazzo[normal]: Non... C'est impossible...[end] @@ -2027,9 +2028,9 @@ C'est quoi, que tu veux?[end] soit à l'abri... elle l'est?[new] [bold]Caïn[normal]: Alors tu t'inquiètes vraiment pour ta petite pute, hein?[new] -Si tu veux la revoir... vivante... tu -devras l'échanger contre le cristal de la -terre de Troia.[new] +Si tu veux la revoir... vivante... tu devras +l'échanger contre le cristal de la terre de +Troia.[new] [bold]Cecil[normal]: Quoi!?[end] [bold]Tellah[normal]: Lâche![new] [bold]Caïn[normal]: Quand tu l'auras, je te @@ -2113,7 +2114,7 @@ Cet enfant est désespérant...[end] Le jeune maître a dit qu'il allait tuer les méchants! On va bientôt pouvoir rentrer au -château, hein?[new] +château, hein? Hein?[end] Je vais m'occuper de tout, ici! Sois prudent! @@ -2123,7 +2124,7 @@ Si tu meurs aussi, Eblana va...[end] [bold]Cid[normal]: Dès qu'on la sort tourner, elle étale ce qu'elle sait faire! -T'en dis quoi, poulette?[new] +T'en dis quoi, poulette? On va leur montrer ce que t'as dans le ventre![end] [bold]Cecil[normal]: Attends![new] @@ -2184,9 +2185,9 @@ T[end] T[end] T[end] T[end] -Un misérable chevalier noir comme toi -ne peut même pas toucher la -marchandise que nous vendons ici![end] +Un misérable chevalier noir comme toi ne +peut même pas toucher la marchandise +que nous vendons ici![end] Si tu revenais en un morceau, tu pourras utiliser ces armes-là... mais c'est impossible.[end] @@ -2261,8 +2262,8 @@ Je croyais que tous les nains disaient «Hey-ho'! Bien, je dois retourner au boulot.[end] Hey-ho! -Il y a eu beaucoup de remue-ménage au -château, récemment... il s'est passé +Il y a eu beaucoup de remue-ménage +au château, récemment... il s'est passé quelque chose?[end] Vous êtes venus de la surface? Alors il y a vraiment un monde de @@ -2289,7 +2290,7 @@ Ne sois pas si impatient![end] C'est fait! L'épée sacrée Excalibur! Utilise-la avec tout ton esprit, corps, et -âme![new] +âme! Tu as obtenu Excalibur![music][0x29][delay][0xc][end] Grâce à toi, j'ai enfin retrouvé le cur à l'ouvrage.[end] @@ -2346,7 +2347,7 @@ beauté![end] Il y a peu de temps, le trou vers la surface s'est effondré! Dans le même coin, nous avons sauvé -un drôle de vieux![new] +un drôle de vieux! Il récupère à l'infirmerie![end] Je suis Luca! Mes poupées ont disparu. @@ -2430,7 +2431,7 @@ mains![end] appartenait à ma mère, l'ancienne reine.[end] [bold]Giotto[normal]: Près de la grotte scellée se trouve la continent de Toméra où vivent -d'autres nains![new] +d'autres nains! Mais on ne peut pas y aller à cause de la lave![end] [bold]Giotto[normal]: Si vous pouvez voler, vous @@ -2499,8 +2500,8 @@ utiliser?[end] C'est l'infirmerie![end] Parfois, même les nains se blessent![end] -Cet homme est vraiment énergique -pour un vieux râleur![end] +Cet homme est vraiment énergique pour +un vieux râleur![end] Quel vieux grincheux! Il ne fait rien et se plaint de la nourriture, mais il mange comme quatre![end] @@ -2577,7 +2578,7 @@ Lali, chuis vraiment bourré![end] prudent...[new] [bold]Rubicante[normal]: Ne t'inquiète pas. Eblana, le château des ninjas, est déjà -tombé.[new] +tombé. Je te confie la tour pendant mon absence.[end] [bold]Docteur[normal]: Hahahaha! @@ -2591,8 +2592,8 @@ paix...[new] [bold]Caïn[normal]: Qu'est-ce que ça peut faire? Tu ferais mieux d'appeler de l'aide, doc. Rubicante n'est pas là pour te protéger![end] -[bold]Docteur[normal]: Vous ne me prenez -vraiment que pour un souffreteux? +[bold]Docteur[normal]: Vous ne me prenez vraiment +que pour un souffreteux? C'est moi le cerveau de toute cette opération![new] Je suis Lugeie! @@ -2629,14 +2630,13 @@ Oups....[end] [bold]Yasushi Matsumura[normal]: Graphismes -[new] [bold]Masanori Hoshino[normal]: C'est moi qui ai dessiné tous les monstres que tu -combats.[new] +combats. S'il y en a un que tu préfères, dis-moi lequel![end] [bold]Masanori Hoshino[normal]: Je suis Taka, le -metteur de Points![new] -Dès que j'aurai fini ce jeu, je -deviendrai probablement un Super -Pointeur![end] +metteur de Points! +Dès que j'aurai fini ce jeu, je deviendrai +probablement un Super Pointeur![end] [bold]Masanori Hoshino[normal]: Graphismes -[new] [bold]Ryuko Tanaka[normal]: Ce sera ma toute dernière production. @@ -2650,13 +2650,13 @@ Vous pouvez compter sur moi![end] -[new] [bold]Keitaro Adachi[normal]: Héhé... On ne sue pas, on ne sue pas![end] -[bold]Nouveau Toshio Endo[normal]: Mon épaule est -bloquée! +[bold]Nouveau Toshio Endo[normal]: Mon épaule +est bloquée! J'ai mal aux yeux! J'ai mal aux oreilles![end] [bold]Nouveau Shinichi Tanaka[normal]: ... À partir de notre prochaine sortie, je -serai dans l'équipe de programmation.[new] +serai dans l'équipe de programmation. Content de vous rencontrer! ...Je veux avoir bientôt mon bureau personnel...[end] [bold]Nouveau Shinichi Tanaka[normal]: Ikuya @@ -2667,7 +2667,7 @@ Je n'ai rien volé!![end] [bold]Kyoji Koizumi[normal]: Heh... Si tu sais dès le début que tu n'as pas de vacances, faire des jeux, ce n'est pas -si mal![new] +si mal! Vous ne trouvez pas, Monsieur Sakaguchi?[end] @@ -2679,7 +2679,7 @@ maintenant?[end] [bold]Akira Ueda[normal]: M. Aki Yama, Takemotchi Shin-kun, Kas-kun, et tous les autres, vous regardez? -J'ai fait plein de sons.[new] +J'ai fait plein de sons. Écoutez-les![end] [bold]Akira Ueda[normal]: Compositeur-[new] [bold]Nobuo Uematsu[normal]: Hm! @@ -2702,7 +2702,7 @@ Je n'en peux plus![music][0x2][end] Programme principal - [bold]Ken Narita[normal]: N'ajoutez plus d'événements!! -Arrêtez de trouver encore des bugs![new] +Arrêtez de trouver encore des bugs! Vache, je risque de devoir lâcher l'université![end] [bold]Ken Narita[normal]: Zzz..Zzz..[end] @@ -2711,7 +2711,12 @@ l'université![end] c'est possible![end] [bold]Cecil[normal]: Aide-nous, Cid![end] -«Wahaha! Crevez, nains minables![end]Cecil: Vous n'irez pas plus loin![end]«Salopards! «Comment vous êtes entrés!? «Attrapez-les![end]«Merde! Tenez, prenez ça![end]«Maintenant, plus personne ne peut arrêter le super canon!»[end] +«Wahaha! Crevez, nains +minables![end]Cecil: Vous n'irez pas plus +loin![end]«Salopards! «Comment vous êtes +entrés!? «Attrapez-les![end]«Merde! Tenez, +prenez ça![end]«Maintenant, plus personne ne +peut arrêter le super canon!»[end] [bold]Cecil[normal]: Merde![new] [bold]Caïn[normal]: Bon Dieu![end] [bold]Cecil[normal]: Yang![new] @@ -2752,9 +2757,10 @@ Je prie pour ta survie![end] Comment ça se fait que vous ne me preniez pas avec vous! Vraiment... -Écoutez, vous![new] +Écoutez, vous! Vous revenez vivant![end] -«Parce que si tu n'est pas dans le coin, le patron fait la tronche!»[end] +«Parce que si tu n'est pas dans le coin, +le patron fait la tronche!»[end] M. Cecil, revenez bientôt![end] Prince Edward pense tout le temps à vous![end] @@ -2833,7 +2839,7 @@ Chocobo... La plus adorable des Chimères![end] La magie d'invocation... La magie qui appelle les Chimères de -leur royaume mystique...[new] +leur royaume mystique... Ceux qui possèdent ce pouvoir sont très peu nombreux.[end] Le monde des Chimères a une histoire @@ -2844,7 +2850,7 @@ des humains... Seuls ceux qui ont un corps forts et un esprit pur peuvent passer...[end] Les Chimères sont des animaux -fantastiques...[new] +fantastiques... Quand leur pouvoir est manié par quelqu'un qui a une lumière directrice... ils frappent un coup puissant pour la cause @@ -2858,8 +2864,7 @@ une éternité pour tous les lire![end] Pour les monstres sur lesquels[new] «Épier»[new] ne marche pas... le Dictionnaire des -Monstres montrera leur véritable -nature....[end] +Monstres montrera leur véritable nature....[end] Chimère, Monstre, Humain... D'où sont-ils venus et où vont-ils.... Le mystère de l'éternité...[end] @@ -2869,8 +2874,7 @@ Maintenant, il dort au fond du ventre d'un dragon.[end] Pour celui qui surpasse le roi Chimère... Il est dit qu'il existe un dieu Chimère qui -nous a créés et qui nous protège de -loin.[new] +nous a créés et qui nous protège de loin. Il ne connaît pas la défaite... Seule sa propre puissance retournée contre lui pourrait lui faire du mal...[end] @@ -2880,15 +2884,15 @@ il n'y en avait qu'une seule.[end] La Reine du Monde des Chimères, Asura... En tant qu'épouse du roi Chimère, elle -est la clef vers son audience.[new] +est la clef vers son audience. Seuls ceux qui peuvent la surpasser pourront voir la vraie forme du roi...[end] Le roi Chimère... Il est apparu dans l'océan du nord. -On dit de lui qu'il est maître des -océans et sans rival.[end] +On dit de lui qu'il est maître des océans +et sans rival.[end] Odin, le chevalier des grands guerriers -du passé...[new] +du passé... La seule fois qu'il a jamais été vaincu, c'était quand un éclair s'est abattu sur son épée.[end] @@ -2962,7 +2966,7 @@ si violents![end] [bold]Yang[normal]: Nous l'avons trouvé évanoui au-dehors de notre trou. Mais il ne s'est pas réveillé... -Depuis lors, nous restons à ses côtés...[new] +Depuis lors, nous restons à ses côtés... Notre amour n'y suffit-il pas...?[end] [bold]Yang[normal]: Que feriez-vous si Yang mourait!?[end] @@ -3060,7 +3064,7 @@ Léviathan. Partez maintenant.[end] Je ressens d'immenses puissance et esprit chez... -Rydia![new] +Rydia! Si jamais vous avez besoin de ma puissance, tu peux appeler mon nom![end] @@ -3123,7 +3127,7 @@ Nous sommes la famille Humingway.[end] À bien y réfléchir... Un de nos amis avait construit un vaisseau et était allé vers la Planète -Bleue...[new] +Bleue... Il était vraiment très doué pour donner des surnoms...[end] From 9b7f8193e9c9d13ba93ffa2a1fd70a391cb944e2 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 20:27:12 +0200 Subject: [PATCH 04/63] Update fonts, adds more accents to the variable width 8x8. --- fonts/8x8vwf2p.png | Bin 510 -> 527 bytes fonts/vwf.png | Bin 597 -> 603 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/fonts/8x8vwf2p.png b/fonts/8x8vwf2p.png index ed67bfa4ce3637cf17b17f9a0ac9f97b3431366a..2a3935909abcbd5dd466c6292f62ca70804aa5e6 100644 GIT binary patch delta 483 zcmV<90UZAR1CIodHh;uPL_t(|+U?T;h9f}~#__MJDm`5zIyJFFBjTYEKmme5g+&0t zU;%rC1q6%g4lE!?$q{O9ut&(=AV=7j%4Db7u*O=f+5W@u^ZLD>&=~qZ8yZ(iwa1fd zWYLd;fjifky2REc+LYLltAAcRaKhXrhhWTV|r)9 z=EGxi`5`^9rGM&d;n@(`Jjq{kmFhrg-^^$!h;3Y=6Or)OTQ_$`@8W9p#-8Q)K{bO^1ab!(cm|^dR$y65#pZgbuN9E2rJ5M`!JuV z_Nix{Z2I()<@?$gKa;KTZX@Jr5nh}0(CDY(QTklwYylR%lI7d{^{>y2E^`6@a6>~w ZKLN6QZfJKRt$Y9g002ovPDHLkV1h?$_hJA5 delta 466 zcmV;@0WJQI1pWh%Hh;58L_t(|+U?VUhFd`t#_{jWOzzICxS5SELBwFNfB`HP6N&&9 zi#|pHL2+^e1>{lk2-7#{BcyMTN9fGWZugF$tBTs@56jQlb8aFRm;TQ#jaw-W|VDT?=!DA`n#O( zHfsAV+nWpb<(YrDuOI!*1Ol+Y%I6!r>5YbllL;v~ea?2D?-qNST`P1;x69_H23*W5 zE%Sr+_MzYR_$8Y<%>{RDBsjS{uO@O^_PxCsv?2oIxd^~P1GNR$w*B0?|B##x{WF_v zk)QnOi;Te9wSUF<*^shDCw|SfvV-gQ&5aV|vW+!5N)CU$mA^4+o6e16ZFjeg+;DB- z)}TXGa0_!K6aJ)N#|_Dpj$t;qF*Q;Ub}RpCR?tXpU@KG22+QQcd|;Zcc%Rpe#u)Jhe4fGAFJ8t1hkt)EJXaX&k_toJ)Ynai zmjY!h^4P1T3?HR!+{QkQ!(ki}fgE}B2FdW~U4_Ah0zLzWQ|JrqcLkb_xC@MiI9yrA z&1=KbTLBDvSKyJ=3V3+S!2Xdj87A6dYf*akBd0Egj))vB`itJ9h5!L*PRj$LHxRD< z39`q3r*P^|A%BvoT_8t%zSzaiP)ceBIpbhCoRv`Fc!Q?Elwn_C0xR{}-5|sc*JeHs zp%NU`0@3*nzcW@LQBl$xh_r1htsIZ^LuLoF80Jj1Kx=F{=d42en%AaW-`_!zGpjI( zZv~}kvMEC+-X!+9t_xj;lF}m3A57}FAR%ySQV7&u3xC+otbsZ+BCc?Bt_9dE*bKtW zK1K-!lNrSAor(1@ok3l4rsiNo6<}O|F)5%FBn6H^!!C3c?#c3K>N|ev@>%%%%ir*( zUOs5?3sgus=IyBZaMK*K&!9xO!DcgLzzi|>4RQ%N@9#hbo}X`k8w|snO;c_dwtX49 yh?lUVk15jA5)2FYdkIEAgD21jZEbCBZS5YXfPRDqEMNeOL!q&NeS`%Jpn)44 zK5bAqGEOjnLBI+25e^XxAWyK5(11pe>Yi~M69kdmVg7)h(Zy8J*4Eb6+h)^U%K5H` z6@2?zKv)1)7-rZBdH@O&okk&AV5B|vl3ZtfZ*!YMOGJiNeW16fA%KA!FoEb5n8LL?g9m&$ zhjTZDM8a|bPk;D+k&C>5DYFPzFGDoEFrmVRR_1Vgnz zgd6I(tm)B2$8KY8FK`zNRSzvZHAOw z5Qv+>nZbyY4#G3A$wpWVgs1|<7O)r@UtDm9;qR93*2}l^@l_dWC7qMEf{fr+rdZWk3WL(*PB%h0^P0Tp<7SO5#e_{*bNi*etTv8(JFPV`>7 sUxQ!;A0yWw^e4Cnz0 Date: Sat, 13 Sep 2025 20:27:39 +0200 Subject: [PATCH 05/63] =?UTF-8?q?Moves=20=C3=B9=20at=200xAF=20instead=20of?= =?UTF-8?q?=200xB0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text/ff4_menus.tbl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/ff4_menus.tbl b/text/ff4_menus.tbl index e3c44c1..48af96b 100644 --- a/text/ff4_menus.tbl +++ b/text/ff4_menus.tbl @@ -96,7 +96,7 @@ A6=ô A7=ù A8=ï A9=î -B0=û +AF=û FB=[nowindow] FC=[new]\n FF= From 3f45ef7368e0f63ed56dd0b08b4bd42902cb983b Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 23:36:08 +0200 Subject: [PATCH 06/63] Update format bank. --- format_bank_xml.py | 10 +- test_format_bank.py | 268 -------------------------- tests/test_font_converter.py | 352 +++++++++++++++++++++++++++++++++++ tests/test_format_bank.py | 6 +- 4 files changed, 360 insertions(+), 276 deletions(-) delete mode 100644 test_format_bank.py create mode 100644 tests/test_font_converter.py diff --git a/format_bank_xml.py b/format_bank_xml.py index a006cb8..d12a40c 100755 --- a/format_bank_xml.py +++ b/format_bank_xml.py @@ -249,8 +249,8 @@ def parse(self, tokens): else: # Would exceed limit - flush accumulated with [new] at end, then start new if accumulated_sentences: - # Don't add [new] if next token is [end] - add_new = not self._is_next_token_end(tokens, i) + # Always add [new] for overflow (readability) + add_new = True result.extend( self._flush_pre_wrapped_sentences( accumulated_sentences, add_new=add_new @@ -297,8 +297,8 @@ def parse(self, tokens): else: # Would exceed limit - flush accumulated with [new] at end, then start new if accumulated_sentences: - # Don't add [new] if next token is [end] - add_new = not self._is_next_token_end(tokens, i) + # Always add [new] for overflow (readability) + add_new = True result.extend( self._flush_pre_wrapped_sentences( accumulated_sentences, add_new=add_new @@ -324,7 +324,7 @@ def parse(self, tokens): elif token.type == "GUILLEMET_SPEECH": # Flush any accumulated sentences first if accumulated_sentences: - # Don't add [new] if next token is [end] + # Always add [new] unless immediately followed by [end] add_new = not self._is_next_token_end(tokens, i) result.extend( self._flush_pre_wrapped_sentences( diff --git a/test_format_bank.py b/test_format_bank.py deleted file mode 100644 index cb3d49b..0000000 --- a/test_format_bank.py +++ /dev/null @@ -1,268 +0,0 @@ -from format_bank_xml import process_dialogue - - -def test_split_sentences() -> None: - # This test is no longer needed since we use lexer/parser approach - pass - - -def test_format() -> None: - """Test that a [new]\n tag is inserted between character speches, - \n should be inserted after a punctuation if it's not the end of the speach - Word wrapping should be applied to each sentence.""" - formatted = process_dialogue("""Edge: And here I am all - pumped up to fight - that bastard! - - Ah, well... - can't be breaking a sweat - in front of the ladies. - -Golbeze: Cecil...[end]""") - - assert ( - formatted - == """Edge: And here I am all pumped up -to fight that bastard! -Ah, well... can't be breaking a sweat in -front of the ladies.[new] -Golbeze: Cecil...[end]""" - ) - - -def test_format2() -> None: - formatted = process_dialogue("""Soldier: Yes sir! - - - -Soldier: The monsters - have been increasing lately - though... - -Soldier: There's just too - many of them nowadays. - - -Cecil: Is something... - happening?[end]""") - - assert ( - formatted - == """Soldier: Yes sir![new] -Soldier: The monsters have been -increasing lately though...[new] -Soldier: There's just too many of them -nowadays.[new] -Cecil: Is something... happening?[end]""" - ) - - -def test_format3() -> None: - formatted = process_dialogue("""Soldier: Agh! -Cecil: Are you all right? - - -Soldier: There's more of them!Cecil: Damn![end]""") - - assert ( - formatted - == """Soldier: Agh![new] -Cecil: Are you all right?[new] -Soldier: There's more of them![new] -Cecil: Damn![end]""" - ) - - -def test_formatting_idempotency() -> None: - first_formatting = process_dialogue("""Soldier: Agh![new] -Cecil: Are you all right?[new] -Soldier: There's more[new] -of them![new] -Cecil: Damn![end]""") - - second_formatting = process_dialogue(first_formatting) - - assert first_formatting == second_formatting - - -def test_formatting_speech_without_the_character_visible() -> None: - """speech between '«' '»' should be put on a new window""" - assert ( - process_dialogue( - """«Je suis votre guide pour l'enfer...» «Je suis l'un des quatre Empereurs de seigneur Golbeze... Scarmiglione de la Terre... Il est temps que dînent mes précieux morts-vivants!» Cecil: Comment!?[end]""" - ) - == """«Je suis votre guide pour l'enfer...»[new] -«Je suis l'un des quatre Empereurs de seigneur Golbeze... Scarmiglione de la Terre... Il est temps que dînent mes précieux morts-vivants!»[new] -Cecil: Comment!?[end]""" - ) - - -def test_sentences_not_fitting_the_current_window_should_be_moved() -> None: - assert ( - process_dialogue( - """Pourquoi avez-vous besoin de ces cristaux? Était-ce parce que les Mythidiens représentaient une menace? Alors pourquoi n'ont-ils pas résisté? Nous ne comprenons pas pourquoi des innocents ont dû périr.[end]""" - ) - == """Pourquoi avez-vous besoin de ces -cristaux? -Était-ce parce que les Mythidiens -représentaient une menace?[new] -Alors pourquoi n'ont-ils pas résisté? -Nous ne comprenons pas pourquoi des -innocents ont dû périr.[end]""" - ) - - -def test_character_speech_sentences_not_fitting_the_current_window_should_be_moved() -> ( - None -): - assert ( - process_dialogue( - """Cecil: Votre Majesté, nous ne comprenons pas vos intentions. Pourquoi avez-vous besoin de ces cristaux? Était-ce parce que les Mythidiens représentaient une menace? Alors pourquoi n'ont-ils pas résisté? Nous ne comprenons pas pourquoi des innocents ont dû périr.[end]""" - ) - == """Cecil: Votre Majesté, nous ne -comprenons pas vos intentions. -Pourquoi avez-vous besoin de ces -cristaux?[new] -Était-ce parce que les Mythidiens -représentaient une menace? -Alors pourquoi n'ont-ils pas résisté?[new] -Nous ne comprenons pas pourquoi des -innocents ont dû périr.[end]""" - ) - - -def test_changing_character_should_introduce_a_new_tag() -> None: - assert process_dialogue( - """Soldat: Mais, Capitaine! Soldat: Piller une cité de magiciens qui n'opposent aucune résistance! Cecil: Écoutez bien, vous tous! Le cristal est absolument nécessaire à la prospérité de notre royaume de Baron. Sa Majesté a jugé que les habitants de Mythidia en savaient trop sur les secrets du cristal. Nous sommes l'escadron des Ailes Rouges de Baron, et les ordres de Sa Majesté sont absolus! Soldat: Capitaine...[end]""" - ) == ( - "Soldat: Mais, Capitaine![new]\n" - "Soldat: Piller une cité de magiciens qui\n" - "n'opposent aucune résistance![new]\n" - "Cecil: Écoutez bien, vous tous!\n" - "Le cristal est absolument nécessaire à\n" - "la prospérité de notre royaume de Baron.[new]\n" - "Sa Majesté a jugé que les habitants de\n" - "Mythidia en savaient trop sur les secrets\n" - "du cristal.[new]\n" - "Nous sommes l'escadron des Ailes\n" - "Rouges de Baron, et les ordres de Sa\n" - "Majesté sont absolus![new]\n" - "Soldat: Capitaine...[end]" - ) - - assert ( - process_dialogue("""Caïn: Qu'est-ce qu'il y a? -Cecil: Je suis désolé, Caïn... Caïn: Pourquoi t'excuses-tu encore? Je t'ai défendu de mon plein gré!![end]""") - == """Caïn: Qu'est-ce qu'il y a?[new] -Cecil: Je suis désolé, Caïn...[new] -Caïn: Pourquoi t'excuses-tu encore? -Je t'ai défendu de mon plein gré!![end]""" - ) - - -def test_long_sentence_splitting_within_character_speech() -> None: - """Sentences should be intelligently grouped based on 4-line dialog box capacity""" - assert ( - process_dialogue( - """Tellah: Je ne suis pas en mesure de vaincre quelqu'un d'aussi puissant que lui avec la magie dont je dispose actuellement. Je recherchais la légendaire magie scellée, Météor... Et j'ai senti une forte aura émise de cette montagne. Serait-ce possible, après toutes ces années de recherches..?[end]""" - ) - == """Tellah: Je ne suis pas en mesure de -vaincre quelqu'un d'aussi puissant que lui -avec la magie dont je dispose -actuellement.[new] -Je recherchais la légendaire magie -scellée, Météor... -Et j'ai senti une forte aura émise de -cette montagne.[new] -Serait-ce possible, après toutes ces -années de recherches..?[end]""" - ) - - -def test_abbreviation_handling() -> None: - """M. abbreviation should not be treated as sentence ending""" - assert ( - process_dialogue( - """Cecil: Bonjour M. Rosa, comment allez-vous? Nous devons partir maintenant.[end]""" - ) - == """Cecil: Bonjour M. Rosa, -comment allez-vous? -Nous devons partir maintenant.[end]""" - ) - - -def test_bank2_variants_end_should_clear_the_state() -> None: - assert ( - process_dialogue("""Si le capitaine des chevaliers dragons Caïn et Cecil font équipe, cette bague est sûre d'arriver à bon port![end]M.Caïn est intouchable![end] -On dit beaucoup de choses sur sa majesté, mais si elle entendait ça...[end]""") - == """Si le capitaine des chevaliers dragons -Caïn et Cecil font équipe, cette -bague est sûre d'arriver à bon port![end] -M.Caïn est intouchable![end] -On dit beaucoup de choses sur sa -majesté, mais si elle entendait ça...[end]""" - ) - - -def test_pointer_49() -> None: - """[new] should never be preceded by a \n""" - text = """Cecil: Votre Majesté, nous ne comprenons pas vos intentions. -Pourquoi avez-vous besoin de ces cristaux? -Était-ce parce que les Mythidiens représentaient une menace? -Alors pourquoi n'ont-ils pas résisté? -Nous ne comprenons pas pourquoi des innocents ont dû périr.[end]""" - - expected = """Cecil: Votre Majesté, nous ne -comprenons pas vos intentions. -Pourquoi avez-vous besoin de ces -cristaux?[new] -Était-ce parce que les Mythidiens -représentaient une menace? -Alors pourquoi n'ont-ils pas résisté?[new] -Nous ne comprenons pas pourquoi des -innocents ont dû périr.[end]""" - - result = process_dialogue(text) - assert result == expected - - # Test idempotency - running it again should give same result - result2 = process_dialogue(result) - assert result == result2 - - -def test_break_line_should_not_introduce_spaces() -> None: - assert ( - process_dialogue( - """Yang: Il est trop tard! Cecil: Mais qui est en train de combattre les Ailes Rouges? Cid: Malheur! On est touché! On va s'écraser! Accrochez-vous![end]""" - ) - == """Yang: Il est trop tard![new] -Cecil: Mais qui est en train de -combattre les Ailes Rouges?[new] -Cid: Malheur! -On est touché! -On va s'écraser! -Accrochez-vous![end]""" - ) - - -def test_bank_2_thingie() -> None: - text = """T[end]T[end]T[end]T[end]T[end]T[end]T[end]T[end]T[end]T[end]Le trésor de Baron est entreposé ici! C'est interdit![end]""" - - processed = process_dialogue(text) - assert ( - processed - == """T[end]T[end]T[end]T[end]T[end]T[end]T[end]T[end]T[end]T[end]Le trésor de Baron est entreposé ici! -C'est interdit![end]""" - ) - - -def test_mixed_offscreen_and_character_dialog() -> None: - assert process_dialogue( - "«Vous êtes de Baron, hein...» Caïn: Qui est là?[music][0x2d] «Partez maintenant et il ne vous fait aucun mal...» Caïn: Montre-toi! «Vous voulez vraiment continuer?»[end]" - ) == ( - "«Vous êtes de Baron, hein...»[new]\n" - "Caïn: Qui est là?[music][0x2d][new]\n" - "«Partez maintenant et il ne vous fait aucun mal...»[new]\n" - "Caïn: Montre-toi![new]\n" - "«Vous voulez vraiment continuer?»[end]" - ) diff --git a/tests/test_font_converter.py b/tests/test_font_converter.py new file mode 100644 index 0000000..2e2c762 --- /dev/null +++ b/tests/test_font_converter.py @@ -0,0 +1,352 @@ +from script import Table +from pathlib import Path +import numpy as np +import pytest +from PIL import Image +import tempfile +import os + +from numpy.f2py.auxfuncs import ischaracter + +from utils.font_converter import FontConverter + + +class TestFontConverter: + + @pytest.fixture + def sample_font_file(self): + data = np.zeros((32, 32), dtype=np.uint8) + data[0:8, 0:8] = 1 + data[0:8, 9:17] = 1 + + with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as f: + Image.fromarray(data * 255).save(f.name, 'PNG') + yield f.name + os.unlink(f.name) + + + + def test_font_converter_init(self, sample_font_file): + converter = FontConverter(sample_font_file) + assert converter.font_file == sample_font_file + assert converter.image is None + + def test_load_image(self, sample_font_file): + converter = FontConverter(sample_font_file) + converter._load_image() + assert converter.image is not None + assert isinstance(converter.image, np.ndarray) + + def test_get_char_with_grid(self, sample_font_file): + converter = FontConverter(sample_font_file) + char = converter.get_char(0, True, 8, 8) + assert char.shape == (8, 8) + + def test_get_char_without_grid(self, sample_font_file): + converter = FontConverter(sample_font_file) + char = converter.get_char(0, False, 8, 8) + assert char.shape == (8, 8) + + def test_char_as_1bbp(self, sample_font_file): + converter = FontConverter(sample_font_file) + char = np.array([[1, 0, 1, 0, 1, 0, 1, 0]]) + result = converter.char_as_1bbp(char) + assert isinstance(result, bytes) + assert len(result) == 1 + assert result[0] == 0b10101010 + + def test_get_max_width(self, sample_font_file): + converter = FontConverter(sample_font_file) + char = np.array([[1, 1, 0, 0], [1, 1, 1, 0]]) + width = converter.get_max_width(char) + assert width == 3 + + def test_convert_to_1bpp(self, sample_font_file): + converter = FontConverter(sample_font_file) + len_table, data = converter.convert_to_1bpp(has_grid=True, char_height=8) + assert isinstance(len_table, dict) + assert isinstance(data, bytes) + + def test_convert_to_2bpp(self, sample_font_file): + converter = FontConverter(sample_font_file) + len_table, data = converter.convert_to_2bpp(has_grid=True, char_height=8) + assert isinstance(len_table, dict) + assert isinstance(data, bytes) + + def test_write_as_2bpp(self, sample_font_file): + converter = FontConverter(sample_font_file) + data = np.zeros((8, 16), dtype=np.uint8) + result = converter.write_as_2bpp(data) + assert isinstance(result, bytearray) + + def test_remove_grid(self, sample_font_file): + converter = FontConverter(sample_font_file) + with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as f: + converter.remove_grid(f.name) + assert os.path.exists(f.name) + os.unlink(f.name) + + def test_with_vwf_font_and_tbl(self): + from script import Table + from pathlib import Path + + test_dir = Path(__file__).parent.parent + vwf_path = test_dir / "fonts" / "vwf.png" + tbl_path = test_dir / "text" / "ff4fr.tbl" + + if not vwf_path.exists() or not tbl_path.exists(): + pytest.skip("VWF font or TBL file not found") + + # Load the table to find char index for 'T' + table = Table(str(tbl_path)) + char_bytes = table.to_bytes("T") + + if not char_bytes: + pytest.skip("Character 'T' not found in TBL file") + + char_index = char_bytes[0] # Get the first byte as char index + + # Test FontConverter with actual VWF font + converter = FontConverter(str(vwf_path)) + char_data = converter.get_char(char_index, False, 8, 16) + + assert char_data.shape == (16, 8) + assert isinstance(char_data, np.ndarray) + + # Test that the character has some non-zero pixels (assuming 'T' has content) + assert np.any(char_data > 0), "Character 'T' should have some visible pixels" + + # Get the width of the character and trim to that width + char_width = converter.get_max_width(char_data) + trimmed_char = char_data[:, :char_width] + + assert trimmed_char.shape == (16, char_width) + assert char_width > 0, "Character 'T' should have a positive width" + + # Test with character "a" + char_a_bytes = table.to_bytes("a") + char_a_index = char_a_bytes[0] + char_a_data = converter.get_char(char_a_index, False, 8, 16) + + assert char_a_data.shape == (16, 8) + assert np.any(char_a_data > 0), "Character 'a' should have some visible pixels" + + # Get the width of character "a" and trim to that width + char_a_width = converter.get_max_width(char_a_data) + trimmed_char_a = char_a_data[:, :char_a_width] + + # Find where 'a' actually starts horizontally (first non-empty column) + a_cols_with_pixels = np.any(trimmed_char_a > 0, axis=0) + a_left_col = np.argmax(a_cols_with_pixels) if np.any(a_cols_with_pixels) else 0 + a_right_col = len(a_cols_with_pixels) - 1 - np.argmax(a_cols_with_pixels[::-1]) if np.any( + a_cols_with_pixels) else char_a_width - 1 + a_actual_width = a_right_col - a_left_col + 1 + + # Extract only the part of 'a' that has pixels + actual_trimmed_char_a = trimmed_char_a[:, a_left_col:a_right_col + 1] + + assert trimmed_char_a.shape == (16, char_a_width) + assert char_a_width > 0, "Character 'a' should have a positive width" + + # Find the vertical extent of 'a' - where it actually has pixels + a_rows_with_pixels = np.any(trimmed_char_a > 0, axis=1) + a_top_row = np.argmax(a_rows_with_pixels) if np.any(a_rows_with_pixels) else 0 + a_bottom_row = len(a_rows_with_pixels) - 1 - np.argmax(a_rows_with_pixels[::-1]) if np.any( + a_rows_with_pixels) else 15 + a_height = a_bottom_row - a_top_row + 1 + + # Find the vertical extent of 'T' + t_rows_with_pixels = np.any(trimmed_char > 0, axis=1) + t_top_row = np.argmax(t_rows_with_pixels) if np.any(t_rows_with_pixels) else 0 + t_bottom_row = len(t_rows_with_pixels) - 1 - np.argmax(t_rows_with_pixels[::-1]) if np.any( + t_rows_with_pixels) else 15 + + # Compute horizontal kerning (1 pixel spacing between chars) + kerning = 1 + + # Create a combined array with T + kerning + a + combined_width = char_width + kerning + char_a_width + combined_char = np.zeros((16, combined_width), dtype=np.uint8) + + # Place T at the beginning + combined_char[:, :char_width] = trimmed_char + + # Place a after T with kerning + combined_char[:, char_width + kerning:] = trimmed_char_a + + assert combined_char.shape == (16, combined_width) + assert np.any(combined_char[:, :char_width] > 0), "T part should have visible pixels" + assert np.any(combined_char[:, char_width + kerning:] > 0), "a part should have visible pixels" + + # Verify kerning space is empty + if kerning > 0: + assert not np.any(combined_char[:, char_width:char_width + kerning] > 0), "Kerning space should be empty" + + # Compute optimal kerning by finding how much closer we can bring 'a' to 'T' + # Since T has horizontal crossbar at top and 'a' sits lower, they can overlap significantly + max_kerning_reduction = 0 + + # Check each possible kerning reduction, allowing 'a' to move under T's crossbar + for reduction in range(1, kerning + char_width + 1): # Can potentially overlap completely + collision = False + + # Calculate where 'a' would start with this reduction + a_start_pos = char_width + kerning - reduction + + # Check for pixel collision only in rows where both characters have content + overlap_top = max(a_top_row, t_top_row) + overlap_bottom = min(a_bottom_row, t_bottom_row) + + # Only check for collision if there's actual vertical overlap + if overlap_top <= overlap_bottom: + for row in range(overlap_top, overlap_bottom + 1): + for a_col in range(char_a_width): + a_pixel_pos = a_start_pos + a_col + + # If 'a' pixel is within T's width, check for collision + if 0 <= a_pixel_pos < char_width: + t_pixel = trimmed_char[row, a_pixel_pos] + a_pixel = trimmed_char_a[row, a_col] + + if t_pixel > 0 and a_pixel > 0: + collision = True + break + if collision: + break + + if not collision: + max_kerning_reduction = reduction + else: + break + + optimal_kerning = kerning - max_kerning_reduction + 1 + + # Debug: print the kerning values to see what's happening + print(f"Original kerning: {kerning}") + print(f"Max kerning reduction: {max_kerning_reduction}") + print(f"Optimal kerning: {optimal_kerning}") + print(f"T vertical range: {t_top_row}-{t_bottom_row}") + print(f"a vertical range: {a_top_row}-{a_bottom_row}") + + # Create optimally kerned version using actual character dimensions + optimal_combined_width = char_width + optimal_kerning + a_actual_width + optimal_combined_char = np.zeros((16, optimal_combined_width), dtype=np.uint8) + + # Place T at the beginning + optimal_combined_char[:, :char_width] = trimmed_char + + # Place a with optimal kerning at its correct vertical position + a_start_col = char_width + optimal_kerning + a_end_col = a_start_col + a_actual_width + + print(f"T ends at column: {char_width - 1}") + print(f"a starts at column: {a_start_col}") + print(f"Gap between T and a: {a_start_col - char_width} pixels") + print(f"a_actual_width: {a_actual_width}") + print(f"actual_trimmed_char_a shape: {actual_trimmed_char_a.shape}") + print(f"a_end_col: {a_end_col}") + print(f"Placing 'a' from column {a_start_col} to {a_end_col - 1}") + print(f"a_left_col: {a_left_col}") + print(f"a_right_col: {a_right_col}") + print(f"First row of 'a' that has pixels: {actual_trimmed_char_a[a_top_row, :].tolist()}") + + # Only place 'a' pixels in the rows where 'a' actually has content + optimal_combined_char[a_top_row:a_bottom_row + 1, a_start_col:a_start_col + char_a_width] = trimmed_char_a[ + a_top_row:a_bottom_row + 1, :] + + assert optimal_combined_char.shape == (16, optimal_combined_width) + assert optimal_combined_width <= combined_width, "Optimal kerning should not increase width" + + kerning_improvement = combined_width - optimal_combined_width + assert kerning_improvement >= 0, "Kerning should improve or stay the same" + + def test_render_string_methods(self): + + known_pairs_to_kern = [] + + letters = ["T", "V", "F"] + vowels = ["a", "e", "i", "o", "u", "é", "à", "è", "ê", "ï"] + for letter in letters: + for vowel in vowels: + known_pairs_to_kern.append(letter + vowel) + + for vowel in vowels: + known_pairs_to_kern.append(vowel + "j") + + test_dir = Path(__file__).parent.parent + vwf_path = test_dir / "fonts" / "vwf.png" + tbl_path = test_dir / "text" / "ff4fr.tbl" + + # Create converter and table + converter = FontConverter(str(vwf_path), has_grid=False, char_height=16) + + table = Table(str(tbl_path)) + pairs_to_kern_for_real = [] + # known_pairs_to_kern = [] + # symbols = set(filter(lambda k: len(k) == 1 and k.isalpha(), table.lookup.keys())) + # + # symbols = symbols - {'\n'} + # for k in symbols: + # for j in symbols: + # known_pairs_to_kern .append(k+j) + for pair in known_pairs_to_kern: + chars = table.to_bytes(pair) + if len(chars) != 2: + continue + if converter.compute_kerning(chars[0], chars[1]) < 1: + pairs_to_kern_for_real.append(pair) + + # test_dir = Path(__file__).parent.parent + # vwf_path = test_dir / "fonts" / "8x8vwf2p.png" + # tbl_path = test_dir / "text" / "ff4_menus.tbl" + # # Create converter and table + # converter = FontConverter(str(vwf_path), has_grid=True, char_height=8) + # + + # Test string + test_text = "-".join(pairs_to_kern_for_real) + text_bytes = table.to_bytes(test_text) + + if not text_bytes: + pytest.skip(f"Could not convert text '{test_text}' to bytes") + + # Test simple render_string method + simple_rendered = converter.render_string(text_bytes) + + # assert simple_rendered.shape[0] == 16, "Rendered text should have correct height" + # assert simple_rendered.shape[1] > 0, "Rendered text should have positive width" + # assert np.any(simple_rendered > 0), "Rendered text should have visible pixels" + # + # Test optimized render_kerned_string method + kerned_rendered = converter.render_kerned_string(text_bytes) + + # assert kerned_rendered.shape[0] == 16, "Kerned text should have correct height" + # assert kerned_rendered.shape[1] > 0, "Kerned text should have positive width" + # assert np.any(kerned_rendered > 0), "Kerned text should have visible pixels" + # + # Kerned version should generally be more compact (smaller width) + # though this isn't guaranteed for all strings + print(f"Simple rendering width: {simple_rendered.shape[1]}") + print(f"Kerned rendering width: {kerned_rendered.shape[1]}") + print(f"Space saved: {simple_rendered.shape[1] - kerned_rendered.shape[1]} pixels") + kerned_rendered = kerned_rendered * 255 + simple_rendered = simple_rendered * 255 + # Both should have the same height + assert simple_rendered.shape[0] == kerned_rendered.shape[0], "Both renderings should have same height" + + def test_kerning_pair(self) -> None: + test_dir = Path(__file__).parent.parent + vwf_path = test_dir / "fonts" / "vwf.png" + tbl_path = test_dir / "text" / "ff4fr.tbl" + + # Create converter and table + converter = FontConverter(str(vwf_path), has_grid=False, char_height=16) + + table = Table(str(tbl_path)) + + data = table.to_bytes("fo") + advance_x = converter.compute_kerning(data[0], data[1], 0) + + kerned_rendered = converter.render_kerned_string(data) * 255 + + assert advance_x != 0 diff --git a/tests/test_format_bank.py b/tests/test_format_bank.py index 48012f3..f75013d 100644 --- a/tests/test_format_bank.py +++ b/tests/test_format_bank.py @@ -123,7 +123,7 @@ def test_character_speech_sentences_not_fitting_the_current_window_should_be_mov cristaux?[new] Était-ce parce que les Mythidiens représentaient une menace? -Alors pourquoi n'ont-ils pas résisté?[new] +Alors pourquoi n'ont-ils pas résisté? Nous ne comprenons pas pourquoi des innocents ont dû périr.[end]""" ) @@ -172,7 +172,7 @@ def test_long_sentence_splitting_within_character_speech() -> None: Je recherchais la légendaire magie scellée, Météor... Et j'ai senti une forte aura émise de -cette montagne.[new] +cette montagne. Serait-ce possible, après toutes ces années de recherches..?[end]""" ) @@ -218,7 +218,7 @@ def test_pointer_49() -> None: cristaux?[new] Était-ce parce que les Mythidiens représentaient une menace? -Alors pourquoi n'ont-ils pas résisté?[new] +Alors pourquoi n'ont-ils pas résisté? Nous ne comprenons pas pourquoi des innocents ont dû périr.[end]""" From c04798568c42c57fa449ea14eda01b7fb9463274 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 23:37:28 +0200 Subject: [PATCH 07/63] Restores avoiding to start sentences that would overflow the current window. --- text/fr/bank1-1.xml | 303 ++++++++++++++++++++------------------ text/fr/bank1-2.xml | 132 +++++++++-------- text/fr/bank2.xml | 345 +++++++++++++++++++++++--------------------- 3 files changed, 410 insertions(+), 370 deletions(-) diff --git a/text/fr/bank1-1.xml b/text/fr/bank1-1.xml index 4d5a81f..f41a09e 100644 --- a/text/fr/bank1-1.xml +++ b/text/fr/bank1-1.xml @@ -59,7 +59,7 @@ ont-elles bombardé le château?[new] [bold]Edward[normal]: Ils ont pillé le château... pour voler le cristal... Mon père... -Ma mère... morts... +Ma mère... morts...[new] Anna... elle m'a protégé... des flèches...[end] @@ -96,8 +96,8 @@ approchons de Baron![new] préoccupé...[new] [bold]Soldat[normal]: Même sur ordre de Sa Majesté...[new] -[bold]Soldat[normal]: Arracher le cristal à un peuple -innocent... +[bold]Soldat[normal]: Arracher le cristal à un +peuple innocent... C'est...[end] [bold]Soldat[normal]: Mais, Capitaine![new] @@ -105,10 +105,11 @@ C'est...[end] n'opposent aucune résistance![new] [bold]Cecil[normal]: Écoutez bien, vous tous! Le cristal est absolument nécessaire à -la prospérité de notre royaume de Baron.[new] +la prospérité de notre royaume de +Baron.[new] Sa Majesté a jugé que les habitants de -Mythidia en savaient trop sur les secrets -du cristal.[new] +Mythidia en savaient trop sur les +secrets du cristal.[new] Nous sommes l'escadron des Ailes Rouges de Baron, et les ordres de Sa Majesté sont absolus![new] @@ -128,7 +129,7 @@ Nul ne peut échapper à mes serviteurs![new] Vous ne survivrez pas assez longtemps pour me rencontrer! Alors sombrez dans les ténèbres pour -l'éternité, minables! +l'éternité, minables![new] Mwa ha ha ha ha![end] [bold]Soldat[normal]: Nous sommes au-dessus de @@ -191,22 +192,22 @@ représentaient une menace? Alors pourquoi n'ont-ils pas résisté?[new] Nous ne comprenons pas pourquoi des innocents ont dû périr.[new] -Certains se sont même interrogés sur le -caractère... véritablement... honorable de -vos actions...[new] +Certains se sont même interrogés sur +le caractère... véritablement... honorable +de vos actions...[new] [bold]Roi Baron[normal]: Tu oserais donc douter de ton propre roi, Cecil?![new] [bold]Cecil[normal]: !! Non, Sire! Ce n'était nullement mon intention!![new] -[bold]Roi Baron[normal]: Croyais-tu que j'ignorais tes -véritables sentiments?! +[bold]Roi Baron[normal]: Croyais-tu que j'ignorais +tes véritables sentiments?! Dire que je t'ai recueilli et élevé comme mon propre fils![new] Et maintenant, toi aussi, tu ne peux me faire confiance... Je ne peux plus te confier le -commandement des Ailes Rouges. +commandement des Ailes Rouges.[new] Dès à présent, tu es relevé de tes fonctions![end] @@ -310,8 +311,8 @@ appartements ce soir...[new] [bold]Cecil[normal]: Pourquoi le roi agit-il de la sorte? -Il était réputé comme chevalier pour son -courage et sa bonté.[new] +Il était réputé comme chevalier pour +son courage et sa bonté.[new] Caïn et moi étions orphelins, mais il nous a élevés comme ses propres fils. Mais maintenant... @@ -336,15 +337,15 @@ Regarde-moi plutôt.[end] [bold]Cecil[normal]: À Mythidia... J'ai ôté la vie à des innocents et dérobé leur cristal sacré... mais pour -quelle raison?! +quelle raison?![new] Mon cur s'est assombri tout autant que cette armure maudite![end] [bold]Rosa[normal]: ...Tu n'est pas comme cela.[end] [bold]Cecil[normal]: Je ne suis rien qu'un -chevalier noir docile, tout juste un pantin -du roi.[end] +chevalier noir docile, tout juste un +pantin du roi.[end] [bold]Rosa[normal]: Le Cecil des Ailes Rouges n'aurait jamais pleurniché comme @@ -401,8 +402,9 @@ Edward... je ne sais pas...[new] [bold]Yang[normal]: Où sommes-nous?[new] [bold]Cecil[normal]: À Baron. Si les soldats nous entendent, on aura -des ennuis. -Il y a une chambre tranquille à l'auberge. +des ennuis.[new] +Il y a une chambre tranquille à +l'auberge. Allons-y! [0xfa]Le Moine Yang a rejoint le groupe![music][0x29][delay][0x28][end] @@ -425,7 +427,7 @@ d'entrer dans le château...[end] [bold]Cecil[normal]: C'est la clef de Baron! Bien sûr! Yang, ils t'ont fait commander la -garde... c'est pour ça que tu l'as! +garde... c'est pour ça que tu l'as![new] Avec ça, on devrait pouvoir s'en sortir! [0xfa]Tu as la clef de Baron![music][0x29][delay][0x28][end] @@ -479,14 +481,14 @@ exécuté pour trahison![new] braver le Roi?[new] [bold]Cecil[normal]: Si le roi attend de nous qu'on assassine des gens comme ça... -Je n'ai aucune intention de le suivre! +Je n'ai aucune intention de le suivre![new] Je renonce à toute loyauté envers le roi, les Ailes Rouges, et Baron!!![end] [bold]Caïn[normal]: Je me doutais que tu allais dire ça. -Je ne vais pas te laisser affronter le roi -tout seul.[new] +Je ne vais pas te laisser affronter le +roi tout seul.[new] [bold]Cecil[normal]: Caïn?[new] [bold]Caïn[normal]: Peu importe ce que je dois au roi, en tant que chevalier dragon... @@ -533,7 +535,7 @@ Où es-tu? !![end] [bold]Cecil[normal]: Je ne peux pas rester ici éternellement... Je dois emmener cette enfant et fuir -d'ici... +d'ici...[new] Caïn... sois vivant![end] [bold]Cecil[normal]: Si elle ne se repose pas...[end] @@ -560,8 +562,8 @@ t'avons trouvé!![new] [bold]Cecil[normal]: Attendez! Le roi de Baron a...[new] [bold]Général[normal]: Ordres du roi. -Si tu nous livres la survivante de Mist, il -pardonnera ta traîtrise.[new] +Si tu nous livres la survivante de Mist, +il pardonnera ta traîtrise.[new] Il a été jugé dangereux que le peuple de Mist puisse seulement exister![new] [bold]Cecil[normal]: Quoi!? @@ -644,8 +646,8 @@ sort du[new] [bold]Rydia[normal]: ! ...Hmm...non, je peux pas...[end] [bold]Rosa[normal]: Si tu es une invocatrice, tu -devrais pouvoir lancer des sorts basiques -de magie noire tels que[new] +devrais pouvoir lancer des sorts +basiques de magie noire tels que[new] «Feu»[new] ... -keuf-[end] @@ -665,7 +667,7 @@ Ne me laisse pas![end] [bold]Anna[normal]: Edward, sois courageux, et ne laisse pas Golbez rassembler les cristaux... -Tu m'aimais. +Tu m'aimais.[new] À présent, donne cet amour aux gens de la Terre.[end] @@ -704,7 +706,7 @@ caverne?[new] [bold]Tellah[normal]: C'est une immense créature avec huit énormes pattes. Il nous faudra le battre si nous voulons -sauver Anna et votre amie... +sauver Anna et votre amie...[new] J'espère que ce mauvais pressentiment que j'ai sur Damcyan n'est que le fruit de mon imagination mais...[end] @@ -712,7 +714,7 @@ de mon imagination mais...[end] [bold]Cid[normal]: Mais de quoi vous vous inquiétez? Je vais bientôt revenir! -Je reviendrai avec des améliorations! +Je reviendrai avec des améliorations![new] Restez là à attendre comme de braves gosses![end] @@ -774,7 +776,7 @@ Fabul.[new] [bold]Edward[normal]: Damcyan a déjà été attaqué et notre cristal a été volé! J'ai perdu... mon père... ma mère... et -celle que j'aimais...! +celle que j'aimais...![new] Allez-vous laisser Fabul subir le même sort que Damcyan?![end] @@ -787,8 +789,8 @@ front!![new] [bold]Roi Fabul[normal]: Puisque tu insistes, je laisse tout entre tes mains, Yang![new] Mesdemoiselles, puisque vous utilisez la -magie blanche, fournirez-vous l'assistance -médicale?[new] +magie blanche, fournirez-vous +l'assistance médicale?[new] [bold]Rosa[normal]: D'accord.[new] [bold]Roi Fabul[normal]: Yang, je compte sur toi![new] [bold]Yang[normal]: À vos ordres![end] @@ -824,7 +826,7 @@ trône, là derrière...!?[new] [bold]Yang[normal]: Ne t'inquiète pas! Le roi a déjà trouvé refuge avec les femmes et les enfants dans un endroit -sûr! +sûr![new] Il faut nous occuper de ces monstres![end] [bold]Yang[normal]: Attaquez![end] @@ -870,7 +872,8 @@ te trouble?»[end] Désolé que nous venions juste de nous rencontrer, mais voici mes salutations![new] [bold]Edward[normal]: Cecil![new] -[bold]Yang[normal]: Je ne vous laisserai pas faire![end] +[bold]Yang[normal]: Je ne vous laisserai pas +faire![end] [bold]Golbez[normal]: Je n'ai que faire de ces vermines![end] @@ -1009,12 +1012,13 @@ Ooh...[end] [bold]Scarmiglione[normal]: -Gargl-... Scarmiglione de la Terre, à ton service...[new] -[bold]Golbez[normal]: Ce Cecil pourrait devenir -un problème. +[bold]Golbez[normal]: Ce Cecil pourrait +devenir un problème. Il faut s'occuper de lui avant qu'il n'en devienne un.[new] C'est un chevalier noir, il devrait donc -être impuissant contre nos morts vivants. +être impuissant contre nos morts +vivants.[new] Mais il gravit en ce moment la Montagne de l'Épreuve.[new] [bold]Scarmiglione[normal]: Il veut... donc devenir... @@ -1127,8 +1131,8 @@ seigneur Golbez... Scarmiglione de la Terre... Il est temps que dînent mes précieux morts-vivants!»[end] -«Fshhh... Bien joué... de m'avoir tué... Mais -voyez la terrifiante puissance de +«Fshhh... Bien joué... de m'avoir tué... +Mais voyez la terrifiante puissance de Scarmiglione de la Terre... même dans la mort... Savourez lentement... votre agonie!»[end] @@ -1140,7 +1144,8 @@ par des vermines comme vous...![end] «Je t'attendais...»[new] «Le chagrin me remplit...»[new] «...Je vais t'insuffler mes pouvoirs...»[new] -«Mon chagrin ne fera alors que grandir...»[new] +«Mon chagrin ne fera alors que +grandir...»[new] «Mais c'est la seule solution qui reste.»[end] «Laisse ton passé sanglant derrière toi... @@ -1259,9 +1264,9 @@ QUEL EST CE BRUIT DÉSAGRÉABLE? ARG...ARK, HIC![end] [bold]Edward[normal]: Maintenant, Cecil! -Tant que je joue, il ne peut contrôler la -gravité! -Votre épée! +Tant que je joue, il ne peut contrôler +la gravité! +Votre épée![new] Équipez-vous de votre épée![end] [bold]Elfe Noir[normal]: COMMENT CE BRUIT EST @@ -1309,7 +1314,8 @@ homme courageux![new] [bold]Edward[normal]: Anna... j'ai l'impression de commencer à comprendre...[end] -[bold]Caïn[normal]: Où est le Cristal de la Terre?[end] +[bold]Caïn[normal]: Où est le Cristal de la +Terre?[end] [bold]Cecil[normal]: Caïn![new] [bold]Cid[normal]: Où te caches-tu?[new] @@ -1322,18 +1328,19 @@ personne.[new] ayez tenu votre promesse...[new] [bold]Tellah[normal]: Montre-toi![new] [bold]Golbez[normal]: Je comprends votre -impatience, mais j'aimerais vous remercier.[new] +impatience, mais j'aimerais vous +remercier.[new] [bold]Yang[normal]: Nous remercier?[new] [bold]Golbez[normal]: Je suis avec votre chère Rosa au sommet de cette Tour de Zot.[new] -Si vous parvenez jusqu'ici, j'échangerai la -vie de Rosa contre le cristal.[new] +Si vous parvenez jusqu'ici, j'échangerai +la vie de Rosa contre le cristal.[new] [bold]Cecil[normal]: Golbez, tu n'es qu'un salaud![new] [bold]Golbez[normal]: Si vous ne venez pas -rapidement, je ne peux garantir la vie de -votre précieuse Rosa...[music][0x19] Alors, +rapidement, je ne peux garantir la vie +de votre précieuse Rosa...[music][0x19] Alors, montez![end] «Bienvenue dans la tour de Zot!»[end] @@ -1501,7 +1508,7 @@ pas ton exclusivité![end] [bold]Barbariccia[normal]: Caïn... maudit! Même en me vainquant... Le dernier des quatre Empereurs existe -encore! +encore![new] Disparaissez avec cette Tour de Zot![end] [bold]Cecil[normal]: La tour s'effondre![new] @@ -1538,8 +1545,8 @@ l'autre côté..?[new] [bold]Caïn[normal]: En effet. Donc, ça veut dire que Golbez n'a que la moitié des cristaux![new] -[bold]Cid[normal]: Alors les cristaux d'Obscurité, -c'est pas une rumeur... +[bold]Cid[normal]: Alors les cristaux +d'Obscurité, c'est pas une rumeur... Et la question inévitable... Où sont-ils?[new] [bold]Caïn[normal]: Golbez le sait.[new] @@ -1570,7 +1577,8 @@ passage vers le monde souterrain.[new] bien être?[new] [bold]Caïn[normal]: Je ne sais pas...[end] -[bold]Cecil[normal]: La Pierre de Magma rougeoie![end] +[bold]Cecil[normal]: La Pierre de Magma +rougeoie![end] [bold]Cecil[normal]: Qu'est-ce que c'est!?[new] [bold]Caïn[normal]: Les Ailes Rouges![end] @@ -1605,8 +1613,8 @@ combattaient les aéronefs.[new] ces choses aéronefs... Wow, le monde du dessus a des trucs de ce genre![new] -Nous sommes fiers de nos chars, mais ils -nous touchaient salement avec leurs +Nous sommes fiers de nos chars, mais +ils nous touchaient salement avec leurs attaques. Nous aiderez-vous avec votre aéronef?[new] [bold]Cid[normal]: J'ai rien contre, mais après @@ -1643,15 +1651,16 @@ vous dire pourquoi je rassemble les cristaux.[new] Lumière et ténèbres réunies... 8 cristaux... -C'est la clé pour faire revivre la Tour de -Babel, le chemin scellé vers la Lune.[new] +C'est la clé pour faire revivre la Tour +de Babel, le chemin scellé vers la Lune.[new] On dit qu'il y a sur la Lune un pouvoir qui dépasse notre imagination. -Avec ce cristal, j'en ai maintenant sept... -Il n'en reste plus qu'un.[new] +Avec ce cristal, j'en ai maintenant +sept...[new] +Il n'en reste plus qu'un. C'est aussi grâce à vous. Je me dois de vous remercier pour cela. -Prenez ceci! +Prenez ceci![new] C'est mon dernier cadeau![end] [bold]Cecil[normal]: On l'a vaincu! @@ -1702,8 +1711,8 @@ Rydia a rejoint l'équipe![music][0x29][delay][0x28][end] [bold]Edge[normal]: Ouais! On va tous y aller et rentrer dans leur base![new] -[bold]Rydia[normal]: Ça c'est bien trouvé! [0xfa]Le ninja -Edge a rejoint l'équipe![music][0x29][delay][0x28][end] +[bold]Rydia[normal]: Ça c'est bien trouvé! [0xfa]Le +ninja Edge a rejoint l'équipe![music][0x29][delay][0x28][end] [bold]Cid[normal]: Maintenant, vous pourrez voler sans vous soucier de la lave![new] @@ -1722,7 +1731,7 @@ des ténèbres...[end] [bold]Golbez[normal]: Alors vous avez choisi de jouer avec vos vies jusqu'ici? Fini de rire... -Il est temps de nous dire adieu. +Il est temps de nous dire adieu.[new] Adieu...![end] «Pile poil! Halàlà, j'ai horreur d'être aussi @@ -1732,7 +1741,8 @@ bon!»[new] [bold]Cid[normal]: Euh? Où est Yang?[new] [bold]Rosa[normal]: Il...[new] -[bold]Cecil[normal]: Pour détruire le super canon...[new] +[bold]Cecil[normal]: Pour détruire le super +canon...[new] [bold]Cid[normal]: Je vois... Yang...[new] [bold]Rydia[normal]: Sniff...[new] @@ -1747,8 +1757,8 @@ Prends les commandes, Cecil![end] [bold]Cecil[normal]: Où vas-tu?![end] [bold]Cid[normal]: Quand l'Entreprise arrivera à -la surface, je scellerai le trou avec cette -bombe![end] +la surface, je scellerai le trou avec +cette bombe![end] [bold]Cid[normal]: Golbez! L'ingénieur aéronautique Cid va @@ -1775,17 +1785,18 @@ Pendant que tu pilotes l'Entreprise, presse le bouton d'action au-dessus de l'aéroglisseur![new] Maintenant tu peux aller à la grotte -d'Eblana près de la Tour de Babel! +d'Eblana près de la Tour de Babel![new] Dépose l'aéroglisseur dans les eaux peu -profondes du continent et monte à bord![end] +profondes du continent et monte à +bord![end] [bold]Cecil[normal]: Pour être franc, Cid est... «Trop énergique et embêtant, pas vrai? -Soyez assurés que ce n'est pas quelqu'un -qui mourrait facilement! Bon, on a des -montagnes de travail qui nous attendent! -Bon courage!»[end] +Soyez assurés que ce n'est pas +quelqu'un qui mourrait facilement! Bon, +on a des montagnes de travail qui nous +attendent! Bon courage!»[end] [bold]Homme[normal]: Je t'ai enfin trouvé, Rubicante! J'attendais ce jour depuis longtemps![new] @@ -1830,7 +1841,8 @@ Tout le monde... tout le monde![new] puissant des Quatre Élémentaux. On ne sait même pas si on a une chance![new] -Mais nous devons récupérer les cristaux![new] +Mais nous devons récupérer les +cristaux![new] [bold]Edge[normal]: ...Une si jolie fille qui pleure... je n'ai pas le choix... Bon, unissons nos forces![new] @@ -1882,12 +1894,13 @@ Oh, Dieu, TU PAIERAS POUR ÇA!!![new] [bold]Rubicante[normal]: Lugeie a transformé tes parents en monstres de lui-même. Je m'excuse profondément pour cela.[new] -Crois-moi, je ne ferais jamais une chose -comme cela. +Crois-moi, je ne ferais jamais une +chose comme cela. Je ne suis pas comme les autres. Je veux combattre à armes égales.[new] [bold]Edge[normal]: Ferme-la! -La mort est encore trop bonne pour toi![new] +La mort est encore trop bonne pour +toi![new] [bold]Rubicante[normal]: J'aime les gens courageux comme toi! ...Mais aussi longtemps que les humains se laisseront piéger pas des @@ -1914,9 +1927,10 @@ Combattez de toutes vos forces![end] [bold]Rubicante[normal]: Oh... je vois... Individuellement, les humains sont faibles, mais ensemble... ils sont puissants![new] -À présent, je comprends mieux comment -vous avez battu le seigneur Golbez... -Je vous salue, braves guerriers! +À présent, je comprends mieux +comment vous avez battu le seigneur +Golbez... +Je vous salue, braves guerriers![new] Adieu...[end] Jeune maître![end] @@ -1960,7 +1974,7 @@ Allez, laissez-moi la suite![new] [bold]Chambellan[normal]: Compris! Je m'occupe de la maison! Tout le monde, je vous confie notre -jeune maître! +jeune maître![new] Allez, on rentre![end] [bold]Tous[normal]: Jeune maître! @@ -1981,7 +1995,8 @@ je devrais pouvoir le vaincre. !? Oh![new] Cette fille est une invocatrice, hein? Je sens qu'elle a du talent. -À trois, nous devrions pouvoir y arriver...[new] +À trois, nous devrions pouvoir y +arriver...[new] [bold]Cecil[normal]: On est aussi en route pour Damcyan![new] [bold]Tellah[normal]: Bien, alors c'est d'accord! @@ -2034,9 +2049,9 @@ Cette guerre n'est pas seulement la vôtre![new] Elle implique toutes les créatures vivantes, tous les esprits qui vivent sur -Terre... -Tout le monde doit se battre pour mère -Nature![end] +Terre...[new] +Tout le monde doit se battre pour +mère Nature![end] [bold]Rydia[normal]: Aaaaaah![new] [bold]Cecil[normal]: La tour de Babel!?[end] @@ -2055,7 +2070,7 @@ C'est le moment ou jamais![end] [bold]Rydia[normal]: Quand je suis venue du Monde Fantôme, je suis passée par ici! -Ah oui! +Ah oui![new] Demandons aussi à Léviathan et aux autres de nous prêter leur force![end] @@ -2071,7 +2086,7 @@ pouvoirs![new] [bold]Asura[normal]: Alors je voudrais vous aider... mais je dois d'abord évaluer votre force. C'est la loi du Monde des Bêtes -Fantômes. +Fantômes.[new] Avez-vous le courage de me défier et la force de me vaincre?[end] @@ -2088,7 +2103,8 @@ Que va-tu répondre? Veux-tu te mesurer à moi?[end] «Reviens à moi... Caïn... -Rapporte-moi le cristal et reviens à moi...»[new] +Rapporte-moi le cristal et reviens à +moi...»[new] [bold]Cecil[normal]: Golbez![end] [bold]Cecil[normal]: Ooh! [0xfa]Caïn a volé le @@ -2135,7 +2151,7 @@ vous attendent sur la Lune!»[new] Soyez maudits! Ouille!! Mais nous avons transmis l'emplacement -de ce lieu... +de ce lieu...[new] Au seigneur Golbez![end] [bold]Edge[normal]: Merde... @@ -2144,7 +2160,7 @@ Bon sang![end] [bold]Rubicante[normal]: Tu es effectivement assez fort pour avoir confiance... mais tu ne peux pas encore m'égaler. -Va perfectionner tes talents! +Va perfectionner tes talents![new] Je serai ton adversaire quand tu veux![end] [bold]Edge[normal]: At...tends! @@ -2185,16 +2201,16 @@ au sud-ouest.[new] Ce n'est qu'une question de temps avant qu'il n'y parvienne. Je veux que vous preniez le cristal -avant. +avant.[new] Luca![end] [bold]Cecil[normal]: Cid...[new] [bold]Rosa[normal]: Tu forces trop...[new] [bold]Cid[normal]: ...Il semblerait que ce ne soit plus mon tour d'intervenir... et avec ce -corps... -Tout ce que je peux faire, c'est bricoler -des aéronefs...[end] +corps...[new] +Tout ce que je peux faire, c'est +bricoler des aéronefs...[end] [bold]Edge[normal]: Pfff... Vieil homme, je te salue![new] @@ -2214,12 +2230,12 @@ occuper d'un vieux comme moi![new] [bold]Cecil[normal]: Merci... Cid![end] -[0xfa]Née de la bouche d'un dragon, [0xfa]s'élevant -dans les cieux [0xfa]avec Lumière et +[0xfa]Née de la bouche d'un dragon, +[0xfa]s'élevant dans les cieux [0xfa]avec Lumière et Obscurité, [0xfa]une promesse endormie [0xfa]s'éveillera. [0xfa]Voilée [0xfa]par la lumière [0xfa]de -l'éternité, [0xfa]La Terre Mère sera bénie [0xfa]avec -clémence et salut.[end] +l'éternité, [0xfa]La Terre Mère sera bénie +[0xfa]avec clémence et salut.[end] [bold]Palom[normal]: Ce vieux a appris Météor![new] [bold]Ancien[normal]: Météor...! @@ -2262,7 +2278,7 @@ Paladin Cecil![new] [bold]Luca[normal]: Celui-ci?[new] [bold]Autant te le dire[normal]: ce collier est la clé qui ouvre l'entrée de la grotte scellée! -Sans cela, la grotte n'accepte personne! +Sans cela, la grotte n'accepte personne![new] Il faut absolument protéger le dernier cristal![end] @@ -2306,7 +2322,7 @@ Vous ne pouvez rien faire sans moi![end] [bold]Cid[normal]: Vous aussi, vous êtes des hommes! Arrêtez de dire des choses -décontractées! +décontractées![new] Venez m'aider![end] [bold]Cecil[normal]: Caïn![new] @@ -2329,8 +2345,8 @@ Mais merde![end] [bold]Rydia[normal]: Il bouge![new] [bold]Caïn[normal]: Comme on pouvait s'y attendre de la grotte scellée - même -après avoir pris le cristal, on ne peut pas -se sentir en sécurité![new] +après avoir pris le cristal, on ne peut +pas se sentir en sécurité![new] [bold]Edge[normal]: Alors on va le démolir![end] [bold]Rydia[normal]: On a réussi![new] @@ -2389,15 +2405,16 @@ ce que signifie la légende.[new] Mais nous, Mythidiens devons prier pour cette légende. Prier pour celui qui possède la Lumière -Sacrée... +Sacrée...[new] Tu dois être cette personne![end] [bold]Cid[normal]: Je vais fixer un foret à la -proue du Faucon pour percer la roche qui -bloque le passage vers la surface![new] +proue du Faucon pour percer la roche +qui bloque le passage vers la surface![new] [bold]Rosa[normal]: Tes blessures vont mieux?[new] [bold]Cid[normal]: Ce n'est pas le moment de -s'inquiéter des blessures d'un vieil homme![new] +s'inquiéter des blessures d'un vieil +homme![new] [bold]Edge[normal]: Tu peux vraiment le faire?[new] [bold]Cid[normal]: Pour l'ingénieur aéronautique Cid, le mot[new] @@ -2411,15 +2428,15 @@ comédie, faites-le un peu mieux![new] [bold]Beigan[normal]: Je vous prie d'arrêter de parler ainsi... Cette personne m'a donné quelque -chose de merveilleux. +chose de merveilleux.[new] Un pouvoir si magnifique![end] Vous avez fait de Léviathan votre allié. Mais cela aurait pu se faire sans le pouvoir de la Lumière.[new] -Le jugement final pour savoir si la vraie -Lumière réside en vous... sera rendu par -le Dieu des Bêtes Fantômes... +Le jugement final pour savoir si la +vraie Lumière réside en vous... sera +rendu par le Dieu des Bêtes Fantômes... Bahamut![end] [0xfa]Rydia a appris Bahamut![music][0x29][delay][0x28][end] @@ -2484,8 +2501,8 @@ Je ne sais pas si c'est un présage...[new] [bold]Soldat[normal]: Oui, mon capitaine![new] [bold]Soldat[normal]: Il y a de plus en plus de monstres ces derniers temps...[new] -[bold]Soldat[normal]: Mais il y en a vraiment trop, à -présent...[new] +[bold]Soldat[normal]: Mais il y en a vraiment trop, +à présent...[new] [bold]Cecil[normal]: Est-ce qu'il se passerait... quelque chose?[end] @@ -2506,8 +2523,8 @@ Mais il est tard. On part demain matin.[new] Pour le moment, on va se coucher.[new] [bold]Rosa[normal]: Cecil... -Merci. [0xfa]Le mage blanc Rosa a rejoint -l'équipe![end] +Merci. [0xfa]Le mage blanc Rosa a +rejoint l'équipe![end] [bold]Rosa[normal]: Je vais bien. Et je suis un mage blanc. @@ -2545,15 +2562,15 @@ reposer.[new] Veux-tu me voir danser?[end] -Tu es horrible, te moquer de moi comme -ça?![end] +Tu es horrible, te moquer de moi +comme ça?![end] Oui![delay][0x5][close_window][end] [bold]Roi Fabul[normal]: Je suis désolé. Ainsi c'était la vérité. Mais nos moines sont encore en -formation... +formation...[new] Voulez-vous nous assister?[end] [bold]Roi Fabul[normal]: Je ne puis vous forcer... @@ -2606,7 +2623,7 @@ Mais je lui ai envoyé Scarmiglione...[new] Scarmiglione est un des quatre Empereurs des Éléments. Il nous a promis un divertissant -spectacle. +spectacle.[new] Qu'en penses-tu, Rosa?[end] [bold]Caïn[normal]: Oui, maître![new] @@ -2623,7 +2640,7 @@ Fais attention![end] [bold]Cecil[normal]: Je suis venu pour être paladin. Je ne peux pas vaincre Golbez avec -la lame noire... +la lame noire...[new] Je dois laisser mon passé derrière moi...[end] [bold]Tellah[normal]: Golbez est à l'origine de @@ -2632,9 +2649,9 @@ tout le mal![end] [bold]Tellah[normal]: Un paladin..? C'est bien ce que je sentais, il doit y avoir un pouvoir mystérieux caché dans -cette montagne! -Si vous cherchez à contrer Golbez, je -me joins à vous! [0xfa]Le sage Tellah a +cette montagne![new] +Si vous cherchez à contrer Golbez, +je me joins à vous! [0xfa]Le sage Tellah a rejoint l'équipe![music][0x29][delay][0x28][end] [bold]Scarmiglione[normal]: GRRRR-BAAAH![end] @@ -2649,7 +2666,7 @@ Qui es-tu?[end] [bold]Porom[normal]: Il attaque![end] [bold]Tellah[normal]: !? -Mé... ...téor? +Mé... ...téor?[new] Cette lumière m'a donné l'ultime magie noire, Météor! [0xfa]Tellah apprend Météor![music][0x29][delay][0x28][end] @@ -2675,7 +2692,7 @@ lâcheté![end] [bold]Cid[normal]: Pas d'inquiétude! Moi et mon Entreprise, on va les aider! Alors c'est toi Edward... -J'ai entendu parler de toi. +J'ai entendu parler de toi.[new] Je vais prendre soin de Cecil et Rosa, t'en fais pas![end] @@ -2683,7 +2700,8 @@ Rosa, t'en fais pas![end] Où est Rosa?[new] [bold]Cecil[normal]: Il s'agit d'un échange avec le cristal de la Terre de Troia... -Mais le cristal a été volé par l'Elfe Noir...[end] +Mais le cristal a été volé par l'Elfe +Noir...[end] [bold]Edward[normal]: Cecil, prenez ça...[new] [bold]Cecil[normal]: C'est quoi?[new] @@ -2764,7 +2782,7 @@ de Baron![new] [bold]Rosa[normal]: Cid, tu es vraiment quelqu'un![new] [bold]Cid[normal]: N'est-ce pas, hein? -On part demain. +On part demain.[new] Je ne peux pas chercher d'entrées de mondes d'en dessous sans une bonne nuit de sommeil![end] @@ -2791,13 +2809,13 @@ de la cupidité. [0xfa]Le pays de Baron devint [0xfa]la plus forte puissance [0xfa]militaire au monde [0xfa]par leurs aéronefs, [0xfa]les Ailes Rouges... [0xfa]Mais pourquoi un pays aussi -[0xfa]puissant recherche-t-il [0xfa]les cristaux? [0xfa]Quel -pouvoir recèlent-ils? [0xfa]Pourquoi l'humanité -[0xfa]corrompt-elle chaque [0xfa]réalisation de ses -rêves? [0xfa]Et pourquoi les monstres [0xfa]se -font-ils toujours plus nombreux, [0xfa]même -en plein jour? [0xfa]Les cristaux luisaient -[0xfa]silencieusement...[end] +[0xfa]puissant recherche-t-il [0xfa]les cristaux? +[0xfa]Quel pouvoir recèlent-ils? [0xfa]Pourquoi +l'humanité [0xfa]corrompt-elle chaque +[0xfa]réalisation de ses rêves? [0xfa]Et pourquoi les +monstres [0xfa]se font-ils toujours plus +nombreux, [0xfa]même en plein jour? [0xfa]Les +cristaux luisaient [0xfa]silencieusement...[end] [bold]Cecil[normal]: Rosa![end] @@ -2809,7 +2827,7 @@ matériaux disponibles ici...[new] Mais le corps de l'aéronef ne résistera pas aux flammes de votre monde. Je dois retourner à la surface et -renforcer la coque au mithril! +renforcer la coque au mithril![new] Bon, ben, j'y vais![end] [0xfa]Tu as le cristal d'Obscurité![music][0x29][delay][0x24][end] @@ -2861,7 +2879,7 @@ Nous devons vaincre Golbez!![new] [bold]Cid[normal]: Merde, cet aéronef devrait être plus rapide que les leurs! Ils ont dû aussi modifier les Ailes -Rouges! +Rouges![new] Qui est-ce qu'ils ont pris pour faire ça?[end] [bold]Rydia[normal]: Ils approchent![new] @@ -2873,7 +2891,8 @@ Je voulais voir vos enfants, Rosa... Cecil...[new] Mais Yang va être seul, ça ne va pas... -Allez à Baron et parlez à mes apprentis![end] +Allez à Baron et parlez à mes +apprentis![end] [bold]Cecil[normal]: Cid![new] [bold]Rydia[normal]: Grand-père![end] @@ -3012,15 +3031,15 @@ protection de ces Rubans!»[end] cette épée. Il ne doit pas être libéré!»[end] [bold]Dr Lugeie[normal]: Ha Ha Ha! -Je me suis toujours demandé ce qu'était -la mort... +Je me suis toujours demandé ce +qu'était la mort... Soyez maudits, robots et humains![new] L'au-delà est l'ultime expérience... Vous croyez avoir gagné? Cette tour relie les deux mondes, celui du dessus et celui du dessous...[new] -Les cristaux y ont déjà été amenés par -Rubicante! +Les cristaux y ont déjà été amenés +par Rubicante! Hahahahaha![new] Et je vais anéantir les nains avec mon super canon! diff --git a/text/fr/bank1-2.xml b/text/fr/bank1-2.xml index a776c63..397f03d 100644 --- a/text/fr/bank1-2.xml +++ b/text/fr/bank1-2.xml @@ -57,8 +57,9 @@ Mais nous n'avions pas le choix.[new] [bold]Cecil[normal]: Je comprends. Vu mon passé, c'était prévisible.[new] [bold]Ancien[normal]: Mais tu as purgé la noirceur -de ton âme... et reçu la lumière sacrée. !? -Ce n'est pas possible..! +de ton âme... et reçu la lumière sacrée. +!? +Ce n'est pas possible..![new] Cette épée?![new] [bold]Cecil[normal]: La lumière de la montagne me l'a donnée...[new] @@ -105,8 +106,8 @@ système de contrôle![new] [bold]Edge[normal]: La vache, c'est ÉNORME![new] [bold]FuSoYa[normal]: Avant d'attaquer le système de contrôle, nous devons détruire le -système de défense, sinon, il se réparera -tout seul![end] +système de défense, sinon, il se +réparera tout seul![end] [bold]Cecil[normal]: On a réussi![new] [bold]Edge[normal]: Il est arrêté![end] @@ -138,7 +139,7 @@ frère de....[new] [bold]FuSoYa[normal]: Tu étais contrôlé par Zémus... Ceux de sang lunien sont sensibles aux pouvoirs psychiques, et donc plus faciles -à contrôler... +à contrôler...[new] Tu étais son pantin contre ton gré...[end] [bold]Edge[normal]: Qu'est-ce que![new] @@ -147,13 +148,13 @@ frère... ...[new] [bold]Golbez[normal]: Tu es mon....[new] [bold]Cecil[normal]: Mais l'inverse aurait pu se produire... -J'aurais pu avoir été utilisé pour faire le -mal...[new] +J'aurais pu avoir été utilisé pour faire +le mal...[new] J'étais un chevalier noir...[new] [bold]Golbez[normal]: ...mais nos âmes ont été pesées... -Tu as renoncé au mal, alors j'ai été jugé -ouvert à... +Tu as renoncé au mal, alors j'ai été +jugé ouvert à...[new] Zémus!!![end] [bold]Cecil[normal]: Où vas-tu!?[new] @@ -191,10 +192,10 @@ C'est mauvais, ça![new] [bold]Rosa[normal]: Caïn![new] [bold]Edge[normal]: On marche pas, cette fois![end] -[bold]Caïn[normal]: J'ai enfin repris le contrôle de -moi-même. +[bold]Caïn[normal]: J'ai enfin repris le contrôle +de moi-même. Mon esprit restait prisonnier de mes -mauvaises actions... +mauvaises actions...[new] Je ne peux pas vous demander de me pardonner, mais...[end] @@ -237,8 +238,8 @@ Reste ici et sois une gentille petite fille![new] [bold]Rydia[normal]: ...J'espère pour toi que tu plaisantes, parce que sinon je n'aimerais pas du tout être à ta place.[new] -Laisse-moi te dire ce que je ferais à un -porc qui me parlerait comme ça. +Laisse-moi te dire ce que je ferais à +un porc qui me parlerait comme ça. Je mettrais fin à sa période de fertilité vite fait bien fait.[end] @@ -249,7 +250,7 @@ Edge![end] [bold]Edge[normal]: Rydia... C'était plutôt en dessous de la ceinture. Je t'en veux pas d'être chienne avec -moi... +moi...[new] Bon sang, tu vas me manquer.[end] [bold]Cecil[normal]: Allons-y![end] @@ -257,14 +258,15 @@ Bon sang, tu vas me manquer.[end] [bold]Rosa[normal]: ....[new] [bold]Cecil[normal]: Écarte-toi de mon chemin...[new] [bold]Rosa[normal]: Non! -Tant que tu ne me prends pas avec toi, -je ne bouge pas d'un pouce.[new] +Tant que tu ne me prends pas avec +toi, je ne bouge pas d'un pouce.[new] [bold]Cecil[normal]: Quoi!! Rosa! C'est dangereux, là dehors![new] [bold]Rosa[normal]: Tant que je suis auprès de toi, quoi qu'il arrive...[music][0x13] ... non, tant que je -suis avec toi, je me fiche bien du danger![new] +suis avec toi, je me fiche bien du +danger![new] [bold]Cecil[normal]: Rosa...[new] [bold]Caïn[normal]: ....Allez, Cecil...[new] [bold]Edge[normal]: Ouais, laisse-la venir! @@ -282,7 +284,7 @@ combat de tous, pas rien le tien. Et puis je suis votre seule invocatrice![new] [bold]Cecil[normal]: Rydia... Très bien... -Allons-y! +Allons-y![new] Nous allons combattre... pour tout le monde![end] @@ -323,8 +325,8 @@ de puissance.... La Planète Bleue a tant évolué pendant que nous dormions?[new] [bold]Edge[normal]: Ha! -Si on écoute Rydia, je pourrais être -le chaînon manquant...[end] +Si on écoute Rydia, je pourrais +être le chaînon manquant...[end] [bold]Ancien[normal]: Toi! C'est toi, le chevalier noir! @@ -359,9 +361,9 @@ Il semble que le destin ait choisi de te faire subir cette épreuve. Et le destin t'a ramené ici...[new] Tu cherches à détruire une immense -noirceur... mais tant que tu te fieras à la -lame noire, tu ne pourras pas vaincre le -mal véritable.[new] +noirceur... mais tant que tu te fieras à +la lame noire, tu ne pourras pas vaincre +le mal véritable.[new] Ton âme est entachée par la noirceur de tes actions... Le mal est comme un cancer.[new] @@ -369,17 +371,18 @@ Il se répand, consumant entièrement l'âme. Tu pourrais devenir aussi mauvais que l'homme que tu poursuis...[new] -Si tu souhaites changer ta pâle lueur en -lumière rayonnante, alors va sur la +Si tu souhaites changer ta pâle lueur +en lumière rayonnante, alors va sur la montagne de l'Épreuve à l'est.[new] -[bold]Cecil[normal]: Mais je dois sauver mon amie![new] +[bold]Cecil[normal]: Mais je dois sauver mon +amie![new] [bold]Ancien[normal]: Si tu chéris vraiment cette amie, tu devras endurer cette épreuve... et être baigné dans la lumière purifiante de la rédemption au sommet...[new] Tu dois renoncer à ta lame moire et -recevoir le pouvoir du chevalier sacré... le -paladin! +recevoir le pouvoir du chevalier sacré... +le paladin! Sois averti, néanmoins.[new] Nombreux sont ceux qui ont tenté de devenir paladin.[new] @@ -394,7 +397,7 @@ Que dis-tu, iras-tu?[new] [bold]Ancien[normal]: Mais ta lame noire n'aura que peu d'effet sur les monstres du mont. Je vais envoyer des magiciens avec toi. -Palom! +Palom![new] Porom![end] «Bienvenue!»[end] @@ -419,15 +422,16 @@ hiberner pour survivre.[new] [bold]FuSoYa[normal]: La planète sur laquelle vous vivez. Mais les créatures de votre planète -étaient encore en pleine évolution... +étaient encore en pleine évolution...[new] Alors nous créâmes une autre lune et continuâmes à dormir...[end] [bold]Edge[normal]: Une autre lune?[new] [bold]FuSoYa[normal]: Mais l'un des nôtres refusa -de dormir... +de dormir...[new] Il voulait purger votre planète de tout -être vivant pour pouvoir nous y installer.[new] +être vivant pour pouvoir nous y +installer.[new] [bold]Rydia[normal]: Quelle horreur...![new] [bold]FuSoYa[normal]: ...Il était un brillant mais impatient homme. @@ -435,16 +439,16 @@ Nous tentâmes de le raisonner, mais il ne voulut pas nous écouter.[new] Au lieu de cela, il devint amer et rancunier...[new] -Il créa la Tour de Bab-Ilu afin de donner -à l'humanité l'outil pour se détruire -d'elle-même.[new] +Il créa la Tour de Bab-Ilu afin de +donner à l'humanité l'outil pour se +détruire d'elle-même.[new] C'est alors que je forçai cet homme à dormir, mais son esprit était toujours éveillé.[new] Tout au long de ces ères, il se consuma par la haine, accroissant ses pouvoirs psychiques pour détruire toute chose -vivante... +vivante...[new] Depuis qu'il est scellé au-dessous, il utilise ses pouvoirs pour contrôler ceux dont l'âme est noire...[end] @@ -541,7 +545,7 @@ J'en fais mon devoir personnel, d'être un monument de vertu![end] [bold]Rydia[normal]: Monument de vertu! -Mais de quoi tu parles!? +Mais de quoi tu parles!?[new] C'est presque un miracle que quelqu'un comme toi n'ait pas été possédé par Zémus![end] @@ -555,7 +559,7 @@ Ce serait un terrible gâchis![new] [bold]FuSoYa[normal]: Enfin, la Planète Bleue sera vivable, avec vous deux sur la place... À présent, je dois retourner à mon -sommeil. +sommeil.[new] Qu'allez-vous faire?[end] [bold]Cecil[normal]: Nous allons retourner sur @@ -590,12 +594,14 @@ Qui plus est...[new] J'ai été arrogant... impitoyable,...rancunier... Maintenant, je suis devant toi un -homme... brisé... vaincu...et repentant. +homme... brisé... vaincu...et repentant.[new] Peut-être... pourrai-je soulager dans le sommeil le tourment de mon âme...[end] -[bold]FuSoYa[normal]: Il nous faut à présent partir... -Je prie pour la paix sur la Planète Bleue.[end] +[bold]FuSoYa[normal]: Il nous faut à présent +partir... +Je prie pour la paix sur la Planète +Bleue.[end] [bold]Rosa[normal]: Cecil...[new] [bold]Caïn[normal]: Cecil, pardonne-lui @@ -630,8 +636,8 @@ braves![new] Cecil avait besoin que je lance mon puissant sort[new] «Gel»[new] -... [delay][0x18] Il a dit que j'étais bien plus héroïque -que lui... +... [delay][0x18] Il a dit que j'étais bien plus +héroïque que lui...[new] Ah, je peux lire au fond de tes yeux que tu le penses aussi... [delay][0x18] Qu'est-ce que tu dirais de trouver un coin plus @@ -641,19 +647,19 @@ impressionnant...?[delay][0x10][close_window][end] [bold]Palom[normal]: Ouyouyouille![new] [bold]Porom[normal]: Espèce de petit pervers![new] -[bold]Palom[normal]: J'allais juste lui[delay][0x18] montrer mon... -heu... +[bold]Palom[normal]: J'allais juste lui[delay][0x18] montrer +mon... heu... Bâton de Feu![new] [bold]Porom[normal]: Ouais, je parie... -Notre ancien est vraiment furieux après -toi! +Notre ancien est vraiment furieux +après toi! Allez![delay][0x10][close_window][end] [bold]Ancien[normal]: Combien de fois devrai-je te dire de ne pas sécher les leçons? [delay][0x18] Qu'est-ce qu'il faut que je fasse pour venir à bout d'un précoce monsieur -je-sais-tout? +je-sais-tout?[new] Peut-être que de recopier des sorts va t'aider à voir l'importance des leçons! [delay][0x18][close_window][end] @@ -693,7 +699,7 @@ pour changer! [delay][0x18][close_window][end] [bold]Edge[normal]: Mais Rydia... Beauté, intelligence, et une langue acérée... [delay][0x18] Maintenant, il y a une femme -qui peut me faire me ranger! +qui peut me faire me ranger![new] Bon sang, ce que j'ai besoin d'elle... [delay][0x18][close_window][end] [bold]Léviathan[normal]: C'est une fille incroyable![new] @@ -711,7 +717,7 @@ J'aimerais être comme toi.[delay][0x8][close_window][end] [bold]Rydia[normal]: De quoi parles-tu? Humains et Chimères ont la même capacité[delay][0x18] d'aimer et de prêter attention -aux autres. +aux autres.[new] Alors, tu vois, nous ne sommes pas si différents. [delay][0x18][close_window][end] @@ -734,8 +740,8 @@ paladin!»[new] pas fini le travail d'aujourd'hui. Ne voulez-vous pas reconstruire notre château? [delay][0x8][new] -«Ha là là... Mais il n'y a plus de monstres! -»[new] +«Ha là là... Mais il n'y a plus de +monstres! »[new] [delay][0x8] [bold]Edward[normal]: C'est ce que le paladin a fait pour nous.[new] @@ -745,7 +751,7 @@ que les monstres.[new] Nous ne voulons pas que nos mamans et papas tombent malades et meurent. [delay][0x11] Voilà pourquoi nous devons reconstruire -notre château. +notre château.[new] Et nous avons besoin de l'aide de tout le monde aide, même vous, petits enfants. [delay][0x11] Dites-vous... qu'après avoir fini @@ -756,7 +762,7 @@ chanson super-spéciale! [delay][0x10][close_window][end] [delay][0x8][close_window][end] [bold]Edward[normal]: Regarde-moi de là-haut, -Anna. +Anna.[new] J'ai toujours le peuple de Damcyan à m'occuper... [delay][0x18] Je ne peux que prier pour que toi et ton père souriiez sur nous...[delay][0x18][close_window][end] @@ -783,7 +789,7 @@ grandeurs de la[delay][0xd] noblesse. La royauté n'est rien de plus que le cadeau à quelqu'un de la capacité de gouverner et de l'amour pour les[delay][0xd] -compatriotes... +compatriotes...[new] Je suis certain que tu vas rendre à Fabul sa gloire passée! [delay][0xd][close_window][end] @@ -829,7 +835,7 @@ ont partout éhonté les rangs des chevaliers dragons...[new] Le mont de l'Épreuve t'a testé, Cecil...[delay][0x18] Maintenant, je dois me -tester... +tester...[new] Si je surpasse mon père en tant que chevalier dragon, son esprit pourrait me pardonner..[delay][0x18][close_window][end] @@ -868,7 +874,7 @@ Alors dépêchez-vous![new] [bold]Cid[normal]: Pffff! Vous pourrez vous tripoter jusqu'à plus soif plus tard! -Maintenant, allez, Rosa![delay][0x20] ... +Maintenant, allez, Rosa![delay][0x20] ...[new] Non, non, je veux dire Majesté! [delay][0x10][close_window][end] [bold]Rosa[normal]: Non, appelle-moi juste @@ -917,7 +923,7 @@ Ta fin te viendra de mes propres mains![end] [bold]Zéromus[normal]: ...Souffrez! Périssez! Jusqu'à ce que tout soit détruit... -Ma haine continuera... +Ma haine continuera...[new] Maintenant...Venez... ...dans mes ténèbres éternelles...[end] @@ -938,7 +944,8 @@ tout le monde à Cecil![end] [bold]Yang[normal]: M. Cecil...![end] -[bold]Edward[normal]: Montrez-nous le vrai courage![end] +[bold]Edward[normal]: Montrez-nous le vrai +courage![end] [bold]Cid[normal]: On t'attend tous!![end] @@ -966,7 +973,8 @@ précoce...[new] [bold]Palom[normal]: Attention les yeux! Je vais t'aider, alors sois reconnaissant![new] [bold]Ancien[normal]: Palom! -Qu'est-ce que je t'ai dit sur l'arrogance?[end] +Qu'est-ce que je t'ai dit sur +l'arrogance?[end] [bold]Caïn[normal]: Cecil...[end] @@ -991,7 +999,7 @@ Chimères... et reviens ici...[new] est un regard de tristesse, Cecil...[new] Oui, c'est vraiment moi, j'ai... j'ai été assassiné, mais je suis devenu l'âme -d'une Chimère... +d'une Chimère...[new] L'Invocatrice de Mist pourrait appeler mon nom, mais vous devez être testés...[end] diff --git a/text/fr/bank2.xml b/text/fr/bank2.xml index 2090486..6f9fc6a 100644 --- a/text/fr/bank2.xml +++ b/text/fr/bank2.xml @@ -21,7 +21,7 @@ de Mist...[end] Un moine étranger a été placé à la tête des gardes. J'ai entendu dire qu'il recherchait -quelqu'un. +quelqu'un.[new] Il doit être à l'auberge...[end] J'ai entendu dire que le roi a été tué et remplacé par un monstre. @@ -37,14 +37,14 @@ Tuez Golbez!![end] La porte du bâtiment à l'ouest de la ville? Elle donne sur une voie navigable -souterraine qui mène au château. +souterraine qui mène au château.[new] Mais maintenant elle est scellée.[end] C'est la première fois depuis la fondation de Baron qu'on n'a pas de roi...[end] Le chevalier noir! Non...m-m-monsieur, je n'ai rien dit contre le roi! -Je...je danserai pour vous. +Je...je danserai pour vous.[new] Ça vous va?[end] Le roi a été vraiment dur, dernièrement,... @@ -65,8 +65,8 @@ sous le château de Baron... On dit que son épée tue ses ennemis d'un seul coup![end] Nous, les invocateurs, avons la capacité -de faire venir des montres du monde des -Chimères... +de faire venir des montres du monde +des Chimères...[new] Un endroit qui se trouverait loin sous la surface de la Terre.[end] @@ -79,7 +79,7 @@ Elle a été emmenée chez un voisin pour Anna est tombée amoureuse. Qui est Anna? C'est une fille qui vivait ici, elle est -tombée amoureuse d'un barde errant. +tombée amoureuse d'un barde errant.[new] Son père, maître Tellah, n'acceptait pas qu'ils se fréquentent, alors ils se sont enfuis de Kaïpo.[end] @@ -163,13 +163,13 @@ Non? Une tourte à la sauterelle, alors?[end] Nous extrayons le minerai de mithril, les grenouilles le raffinent, et les nabots le -forgent. -Nous faisons même des armes que vous, -les humains, pouvez utiliser![end] +forgent.[new] +Nous faisons même des armes que +vous, les humains, pouvez utiliser![end] J'ai fait une longue route depuis la Montagne de Mithril au nord. Même si vous pouvez y aller en une -minute avec vos longues jambes... +minute avec vos longues jambes...[new] Pour nous ça fait une sacrée trotte![end] Ouais, baby! Ouais![end] @@ -191,7 +191,7 @@ Enlevez-la, idiots![end] Hé, celle-là est drôlement bien roulée... Hé!! Qu..qu'est-ce que... -Tu m'as fait peur! +Tu m'as fait peur![new] Fiche le camp, bon sang![end] Je me demande où est passé mon mari...[end] As-tu entendu parler de la Harpe @@ -204,7 +204,7 @@ Je prends un bain de soleil![end] On extrait des joyaux dans la grotte au nord. Par contre, on ne peut pas porter de -métal du tout. +métal du tout.[new] Il devient vraiment très lourd...[end] C'est la ville des gens de sang nain... @@ -253,7 +253,7 @@ pour l'égalité des chances[end] Ah, le chevalier noir du château! Buvez donc un coup. Hein?... -Oh, non, monsieur. +Oh, non, monsieur.[new] Votre argent n'est pas bon, ici.[end] On dit que Cid a été enfermé dans le château! @@ -277,7 +277,7 @@ T[end] Vous êtes costauds! Vous avez vraiment rossé de ces soldats! -Vous me plaisez! +Vous me plaisez![new] Cette nuit, restez ici gratuitement![end] Hé, les boissons sont toujours pas prêtes? @@ -293,7 +293,7 @@ nuit blanche! Il se croit encore jeune....[new] Et en plus, tout le monde en ville peste contre les soldats et le roi, mais il y a -plein de gens bien, comme vous... +plein de gens bien, comme vous...[new] Papa se chamaille sans cesse avec les habitants de la ville à ce sujet...[end] [bold]Cid[normal]: Principes de la Flottaison[end] @@ -309,7 +309,7 @@ S'il vous plaît, trouvez-le[end] Papa! Tu vas bien! Comment ça? -Tu pars avec Cecil? +Tu pars avec Cecil?[new] Papa, tu n'as plus tout d'un jeune coq![end] [bold]Cid[normal]: Cecil, veillez sur lui. Et évitez qu'il s'attire des ennuis! @@ -319,7 +319,7 @@ Est-ce qu'il retravaille sur l'aéronef?[end] [bold]Mère de Rosa[normal]: Qu'est-ce que le roi mijote, ces temps-ci... Il paraît que vous avez fait des choses -horribles à l'étranger! +horribles à l'étranger![new] Surtout, n'embarque pas Rosa dans tout ça...[end] [bold]Mère de Rosa[normal]: Rosa s'est @@ -335,14 +335,14 @@ Je n'aurais jamais dû te laisser devenir mage blanc.[new] [bold]Rosa[normal]: Non, Maman! J'ai bien fait! -Cecil est un guerrier, alors je peux -l'assister![new] +Cecil est un guerrier, alors je +peux l'assister![new] Et tu as combattu aux côtés de papa en tant que mage blanc, autrefois![new] [bold]Mère de Rosa[normal]: ... Rosa... -Ton père... c'était un grand chevalier... je -comprends... +Ton père... c'était un grand chevalier... +je comprends...[new] Cecil, prends bien soin d'elle.[end] T[end] @@ -356,13 +356,13 @@ vivaient heureux ensemble, et puis Anna s'est sauvée de chez elle... Je me demande bien pourquoi...[end] -Salut, je suis un savant itinérant. +Salut, je suis un savant itinérant.[new] Je veux faire des recherches à Fabul, une ville à l'est de Damcyan, mais au canal souterrain, il y a un drôle de vieux qui ne veut pas me laisser passer...[end] Oh, comme c'est singulier... -Un client... +Un client...[new] À cause de tous les monstres, nous voyons de moins en moins de clients, de nos jours.[end] @@ -397,7 +397,7 @@ Ne m'abandonne pas, Cecil![end] [bold]Rosa[normal]: Je suis content que tu ailles mieux. L'espace d'un instant, c'est comme si -j'avais eu une fille à moi. +j'avais eu une fille à moi.[new] Reviens nous voir bientôt![end] Que veux-tu nous voler, cette fois![end] @@ -425,7 +425,7 @@ Ouaah! Un vrai paladin?[end] Oh, voyez donc qui est entré dans mon bar... -Le chevalier noir de Baron. +Le chevalier noir de Baron.[new] Hé, prends-en une aux frais de la maison.[end] Toi, un paladin? @@ -454,8 +454,8 @@ Pas assez fort![end] T[end] Feu, terre, eau, et vent sont la base de toute chose.[end] -Méthodes de respiration pour faire de la -magie noire.[end] +Méthodes de respiration pour faire de +la magie noire.[end] Mon premier «Soin»[end] T[end] @@ -484,8 +484,8 @@ le destin.[end] Palom, ça ne va pas recommencer![end] [bold]Garçon[normal]: Alors c'est toi le mec de Baron, hein? -Le vieux m'a dit de t'aider, il faut croire -que je n'ai pas le choix. +Le vieux m'a dit de t'aider, il faut +croire que je n'ai pas le choix.[new] Sois-m'en reconnaissant![end] [bold]Porom[normal]: Vous êtes M. Cecil, n'est-ce pas? @@ -501,12 +501,12 @@ toi! [music][0x29][delay][0x28][end] [bold]Ancien[normal]: Maintenant, va sur la Montagne de l'Épreuve! Palom! -Porom! +Porom![new] Je compte sur vous![end] Tu es maître de ton destin. Tout ce que je peux faire à présent, -c'est prier pour toi... +c'est prier pour toi...[new] Palom, Porom, tenez-vous bien, et essayez de ne pas gêner M. Cecil.[end] @@ -539,7 +539,7 @@ c'est pourquoi nos soirées sont chaudes... si tu vois ce que je veux dire.[end] Bien! Aujourd'hui, J'ai eu un rencard au -comptoir! +comptoir![new] Demain, c'est au-dessus que ça se passe![end] Salut, chéri! -clin d'il[end] @@ -597,8 +597,8 @@ Ha dis donc, qu'est-ce que j'aimerais T[end] Grâce à l'eau pure et au sol fertile, -nous pouvons avoir de nombreux légumes -frais. +nous pouvons avoir de nombreux +légumes frais.[new] C'est donc un cadre idéal pour élever des chocobos.[end] T[end] @@ -613,12 +613,12 @@ domestiqués par les humains, ils ne peuvent plus voler.[new] Toutefois, ceux qui sont sauvages, au village chocobo au nord peuvent voler, -bien que pas très haut. +bien que pas très haut.[new] Ils ne peuvent se poser que dans des forêts, malheureusement.[end] Les chocobos noirs se souviennent du chemin pour rentrer chez eux, et y -retourneront. +retourneront.[new] Mais, après tout, comme ce sont des animaux sauvages, ils se sauvent après seulement un voyage.[end] @@ -645,7 +645,7 @@ ici.[new] Il y a peu, phénomènes étranges ont eu lieu sur la lune. Nous avons fait tout notre possible -pour les observer. +pour les observer.[new] Qu'est-ce qui se passe, là- bas..?[end] Mon mari est tellement absorbé par ses observations qu'il en oublie de boire et @@ -662,7 +662,7 @@ Cette planète a deux lunes.[new] L'une n'héberge aucune vie, mais l'autre est plus singulière... Cette Lune devient rouge... le rouge...la -même couleur que notre sang... +même couleur que notre sang...[new] J'espère que rien de mauvais ne se prépare...[end] @@ -670,17 +670,17 @@ prépare...[end] le cratère au nord![end] Même quand le reste du monde souffre des ravages de la guerre, c'est paisible, -ici. +ici.[new] Par contre, nous sommes bien atteints par les tremblements de terre.[end] Ma grand-mère est la doyenne du village. Elle sait tout![end] -Nos ancêtres sont venus du grand trou, -dans les montagnes au nord. +Nos ancêtres sont venus du grand +trou, dans les montagnes au nord.[new] Mais maintenant le trou est bouché et -on ne peut y aller, ni par la terre, ni par -les airs.[end] +on ne peut y aller, ni par la terre, ni +par les airs.[end] Il y a une ancienne légende... Quand nous retournons la Pierre de Magma à son lieu de naissance, le chemin @@ -750,12 +750,12 @@ Les villageois sont pertutbés... Et je parle même pas de moi...[new] Enfin, de toute façon, sois prudent, reçu? -Je rentre à la maison. +Je rentre à la maison.[new] J'ai pas mal bossé ces derniers temps... et ma fille me pique des crises à cause de ça![end] As-tu vu notre patron Cid dans -le coin? +le coin?[new] Il s'est mis à penser à Dieu Sait Quoi, nous laissant seuls à nettoyer les aéronefs.[end] @@ -765,8 +765,8 @@ On dirait que le patron fait comme à son habitude, non?[end] Quoi, on doit ENCORE passer une nuit blanche sur ce projet? -Si ce n'était pas un soudard pareil, on y -prendrait du plaisir.[new] +Si ce n'était pas un soudard pareil, on +y prendrait du plaisir.[new] Ah! N...ne le dis pas au patron! D...dis-lui que... heu... le travail, c'est @@ -774,7 +774,7 @@ amusant![end] Aah! Un f-f-f-f-fantôme! Eh, c'est vraiment toi? -Merci mon Dieu! +Merci mon Dieu![new] Je croyais que tu me prenais en chasse ou quelque chose comme ça![end] Ouaip...Je suis devenu aussi bon que le @@ -796,7 +796,8 @@ manière ou d'une autre.[end] Ah, M. Cecil![end] J'adore être une grenouille. -Plein de baisers de jeunes filles blondes...[end] +Plein de baisers de jeunes filles +blondes...[end] Bienvenue au château de Troia![end] Oui, je m'appelle Kermit, comment tu sais?[end] @@ -811,20 +812,22 @@ dans le château.[end] T[end] Les Clercs sont les dignes messagères de Dieu. -Veuillez vous comporter convenablement.[end] +Veuillez vous comporter +convenablement.[end] T[end] T[end] -Tu devrais prendre le trésor dans cette -salle pour t'aider à vaincre les Chimères. +Tu devrais prendre le trésor dans +cette salle pour t'aider à vaincre les +Chimères.[new] Si tu presses l'interrupteur, la porte s'ouvrira.[end] J'ai entendu des complaintes venant de dessous le château. Ça ne pourrait pas être... -Sa majesté? +Sa majesté?[new] Est-ce que ça pourrait être... une malédiction?[end] J'ai entendu dire que tu as apporté le @@ -864,8 +867,8 @@ Le village de Mist est au nord-ouest de Baron. On dit qu'il est toujours couvert d'une épaisse nappe de brouillard.[end] -Nous défendrons le château au nom des -chevaliers dragons![end] +Nous défendrons le château au nom +des chevaliers dragons![end] Si le capitaine des chevaliers dragons Caïn et Cecil font équipe, cette bague est sûre d'arriver à bon @@ -914,7 +917,7 @@ Elle a couru à ta recherche...[new] [bold]Cecil[normal]: Golbez l'a enlevée...[new] [bold]Cid[normal]: Quoi?! Alors que tu étais là pour la protéger? -Mais ce Golbez.... +Mais ce Golbez....[new] Non seulement il abuse de mes aéronefs, mais de Rosa aussi!?[end] [bold]Tellah[normal]: Cette fille est en danger. @@ -984,11 +987,12 @@ C'est interdit![end] les magiciens Mythidiens qui ont résisté. Tu peux leur parler à travers les barreaux.[end] -J'espère que nous n'aurons plus jamais à -utiliser ce donjon.[end] +J'espère que nous n'aurons plus jamais +à utiliser ce donjon.[end] Tu es ce chevalier noir! Tu crois t'en tirer comme ça!?[end] -Nous nous fichons de ce qui nous arrive. +Nous nous fichons de ce qui nous +arrive. Rendez juste le cristal à Mythidia![end] Tu ne comprends rien! Le cristal n'est pas qu'un joyau @@ -1014,7 +1018,7 @@ le fond![end] Merde, alors! Si seulement on avait les aéronefs! J'en ai assez de m'asseoir par ici et de -me saouler! +me saouler![new] Je veux me battre![end] T[end] @@ -1071,19 +1075,20 @@ Il devrait aussi pouvoir traverser les hauts-fonds pour aller vers Kaïpo.[end] Nous sommes les seuls survivants. Peut-être pouvons-nous nous retirer à -Kaïpo... +Kaïpo...[new] Nous pouvons utiliser l'Aéroglisseur pour traverser les hauts-fonds à l'ouest pour y aller...[end] Peut-être pouvons-nous nous retirer à -Fabul... +Fabul...[new] Mais le chemin de Fabul par le mont Hobs a été bloqué par une épaisse couche de glace apportée par les vents glaciaux.[end] [bold]Tellah[normal]: ....Qui est ce Golbez!?[new] -[bold]Edward[normal]: Il est venu à Baron il y a peu -et a pris le contrôle des Ailes Rouges.[new] +[bold]Edward[normal]: Il est venu à Baron il y a +peu et a pris le contrôle des Ailes +Rouges.[new] Tout ce que je peux imaginer, c'est qu'il les utilise pour rassembler les cristaux... sniff...[new] @@ -1110,7 +1115,7 @@ que tu aimes...[new] [bold]Edward[normal]: Tu as raison... je ne suis qu'un minable! Dans ce cas, je vais rester ici avec -Anna pour toujours! +Anna pour toujours![new] Je me fiche bien de tout le reste![end] [bold]Cecil[normal]: Mais bordel, vous n'êtes le seul à être triste, ici![new] @@ -1177,8 +1182,9 @@ l'attaque et se repose dans sa chambre.[end] T[end] -J'ai entendu dire que vous avez été pris -en embuscade au sommet du mont Hobs! +J'ai entendu dire que vous avez été +pris en embuscade au sommet du mont +Hobs! Est-ce que vous allez bien?[end] Si seulement nous avions un aéronef, nous pourrions trouver un moyen pour @@ -1209,14 +1215,14 @@ rapide comme nos Moines![end] [bold]Roi de Fabul[normal]: Misère, quel désastre... Mais nous devons réorganiser et fortifier nos défenses! -Ne vous inquiétez pas pour moi. +Ne vous inquiétez pas pour moi.[new] Pour le moment, vous devriez vous reposer.[end] [bold]Roi de Fabul[normal]: ...Oh, vraiment? Très bien, Yang! Accompagne-les et aide-les![new] -Cecil, je n'arrive pas à trouver mes -mots pour te remercier assez. +Cecil, je n'arrive pas à trouver +mes mots pour te remercier assez. Et aussi, Rosa a été capturée...[new] Je vais ordonner qu'on affrète un bateau immédiatement. @@ -1225,8 +1231,9 @@ Prends cette épée.[new] C'est l'épée d'un chevalier noir qui a est passé il y a longtemps.[new] C'est le moins que je puisse faire pour -te remercier d'avoir défendu Fabul. ...Mais -c'est toujours une épée de l'obscurité...[new] +te remercier d'avoir défendu Fabul. +...Mais c'est toujours une épée de +l'obscurité...[new] Elle se montrera inutile contre le mal véritable. Vaincs Golbez![end] @@ -1252,8 +1259,8 @@ somme dans le lit du roi![end] Si seulement j'avais autant de puissance magique que Rosa...[end] Tue....ce Golbez![end] -Des monstres faisaient partie de l'armée -de Baron![end] +Des monstres faisaient partie de +l'armée de Baron![end] [bold]Femme[normal]: Ah, bienvenue à la maison![new] [bold]Yang[normal]: C'est ma femme. @@ -1271,7 +1278,7 @@ Nous vous remercions du fond du cur...[new] [bold]Yang[normal]: Personne ne t'a fait de mal, hein?[new] [bold]Femme de Yang[normal]: Bien sûr que non! -Je suis ta femme, quand même! +Je suis ta femme, quand même![new] Un soldat de Baron est bien venu, mais je lui ai fichu un coup de ma poêle à frire sur la tête![end] @@ -1280,14 +1287,14 @@ Va battre les méchants et reviens![end] [bold]Yang[normal]: Yang est mort? Certainement! Ce n'est pas quelqu'un qui meurt -facilement! +facilement![new] Non...Il n'est pas...[end] [bold]Yang[normal]: Alors c'est là qu'il était... Oh, ces oignons... Ils me piquent tellement les yeux...[end] [bold]Yang[normal]: Il ne devrait pas être dans un état pareil! -S'il te plaît... +S'il te plaît...[new] Donne-lui un bon coup de ça sur la tête![end] [bold]Yang[normal]: Obtenu la Poêle à frire de @@ -1296,14 +1303,14 @@ l'Amour![end] Il est sous terre?[end] [bold]Yang[normal]: Désolée, je suis bloquée ici à faire les travaux ménagers tout le -temps. +temps.[new] C'est tout ce que j'ai pour vous remercier, mais ça pourrait bien servir.[end] [bold]Yang[normal]: Obtenu le Hachoir à Viande![end] [bold]Yang[normal]: Ne vous inquiétez pas pour moi! Dites à Yang de se remettre vite -et de se battre pour l'avenir du monde! +et de se battre pour l'avenir du monde![new] Et...que je l'aime.[end] T[end] @@ -1315,7 +1322,7 @@ nous entourera de façon à ce que les monstres ne puissent pas entrer.[new] Nous pouvons nous reposer ici dans une tente ou une cabine, et sauvegarder la -partie. +partie.[new] En vue du combat de demain, reposons-nous dans ma tente et soignons nos blessures![end] @@ -1328,7 +1335,7 @@ derniers temps, mais ils ne vont probablement pas attaquer ici.[end] Ça a beau ressembler à des maillots, ce sont bel et bien des tenues de combat! -Elles sont vraiment pratiques. +Elles sont vraiment pratiques.[new] Elles sont bien pour bouger dedans, légères, et confortables![end] Troia est protégée par des femmes. @@ -1362,26 +1369,27 @@ le cristal de la terre.[end] Le cristal de la terre a été pris? Mon Dieu![end] L'Elfe Noir est faible contre les armes -de métal. +de métal.[new] Pour protéger ce point faible... il a augmenté le champ gravitationnel dans sa grotte.[end] Nous te confions le cristal. Prends-en soin![end] -Dire qu'un homme maléfique est en train -de réunir les cristaux![end] +Dire qu'un homme maléfique est en +train de réunir les cristaux![end] L'Elfe Noir vit dans la grotte au nord-est.[end] Quelle était cette voix!?[end] Le cristal a été volé? Ne restez pas comme ça, rapportez-le![end] -Si vous pouvez récupérer le cristal, nous -promettons que nous vous le prêterons. +Si vous pouvez récupérer le cristal, +nous promettons que nous vous le +prêterons. Mais d'abord, ramenez-le ici.[end] Prenez le trésor qui est à la cave.[end] Golbez mettant les mains sur le -cristal est bien pire que ce qui va arriver -à Troia sans lui![end] +cristal est bien pire que ce qui va +arriver à Troia sans lui![end] Si vous portez des armes et des armures de métal dans la grotte qui se trouve au nord-est, Vous ne pourrez @@ -1389,8 +1397,8 @@ même pas bouger![end] Et nous venons juste de le récupérer! Je suppose qu'il n'y a pas le choix. Nous ne faisons que vous le prêter![end] -Les cristaux ont été éparpillés de par le -monde pour être sûrs que de telles +Les cristaux ont été éparpillés de par +le monde pour être sûrs que de telles choses n'arrivent jamais.[end] Nous ne pouvons pas vous donner le cristal de la terre... @@ -1403,8 +1411,8 @@ cristaux acquerra une puissance incroyable.[end] Le cristal de la terre? Il a été volé par l'Elfe Noir.[end] -Le pouvoir du cristal varie suivant qui le -possède! +Le pouvoir du cristal varie suivant qui +le possède! Si une personne maléfique l'avait, cela pourrait avoir de terribles répercussions![end] Si la rumeur disant qu'il y a plus de @@ -1507,13 +1515,13 @@ Désolé, c'était Minimum![end] Rosa voulait t'aider, alors elle a choisi de devenir mage blanc. Ne la tourmente pas![end] -Nous ne pouvons que prier pour que les -âmes des soldats morts puissent reposer -en paix.[end] +Nous ne pouvons que prier pour que +les âmes des soldats morts puissent +reposer en paix.[end] J'étudie les rudiments de la magie blanche. Je peux utiliser trois niveaux de magie -blanche... +blanche...[new] Soin, Soin 2, Soin 3![end] Dire qu'un monstre a remplacé le roi...[end] Dernièrement, le roi a été aussi @@ -1536,8 +1544,8 @@ Aussi, si tu veux utiliser une arme en tant qu'objet dans un combat, sélectionne[new] «Objet»[new] -et déplace le curseur tout en haut pour -sélectionner ton arme! +et déplace le curseur tout en haut +pour sélectionner ton arme![new] Utilise ça pour changer d'arme ou refaire le plein de flèches, et la victoire est à toi![end] @@ -1547,7 +1555,7 @@ Ceux qui n'en sont pas sûrs devraient diminuer la vitesse de bataille![new] Ceux qui sont confiants en leurs capacités peuvent changer le mode de -combat dans le menu Option en Actif. +combat dans le menu Option en Actif.[new] Les monstres vont t'attaquer même pendant que tu sélectionnes des objets ou des magies... pour rendre la bataille @@ -1557,13 +1565,13 @@ tu peux sauvegarder ton jeu. Utilise bien ces endroits![end] Si tu ne peux plus porter d'objets supplémentaires, tu peux les donner au -Gros Chocobo dans la Forêt Chocobo! +Gros Chocobo dans la Forêt Chocobo![new] Si tu sens des chocobos, utilise des légumes de Gysahl![end] L'homme qui est là-bas, c'est Namingway. -Si tu veux changer de nom, tu n'as qu'à -le lui demander![end] +Si tu veux changer de nom, tu n'as +qu'à le lui demander![end] Si tu te bats dans une bataille désespérée, tu ne pourras que mourir![new] Si tu crois être en difficulté, n'y @@ -1576,7 +1584,7 @@ invoquer sur de multiples cibles.[new] Si tu appuies vers la gauche pendant le combat, tu sélectionneras tous les ennemis... appuyer vers la droite -sélectionnera tous tes alliés! +sélectionnera tous tes alliés![new] Tu peux invoquer un sort sur ton groupe entier de cette même manière sur l'écran de menu![end] @@ -1601,7 +1609,7 @@ au village de Mist![new] [bold]Vieil Homme[normal]: Qui êtes-vous? Ce canal est infesté de monstres. C'est trop dangereux pour des jeunes -gens comme vous! +gens comme vous![new] Rentrez à Kaïpo![end] T[end] @@ -1612,9 +1620,9 @@ Rentrez à Kaïpo![end] [bold]Tellah[normal]: Nous sortirons par ici. Le monstre se trouve au-dessous de la -chute d'eau qui nous attend! -Il serait avisé de nous reposer dans une -tente dehors, juste au cas où![end] +chute d'eau qui nous attend![new] +Il serait avisé de nous reposer dans +une tente dehors, juste au cas où![end] T[end] @@ -1794,15 +1802,15 @@ vous délivriez la bague à Mist.[end] [bold]Tellah[normal]: Ces jeunes fous! Ils étaient si jeunes! Pourquoi?... -Ç'aurait dû être moi! +Ç'aurait dû être moi![new] Pas ces enfants![end] [bold]Cecil[normal]: Ce puits semble sans fond...[end] [bold]Cid[normal]: Ourg! La gravité est si forte, ici! -On pourra même pas remuer si on porte -des armures métalliques![new] +On pourra même pas remuer si on +porte des armures métalliques![new] [bold]Yang[normal]: Mes griffes, ça a l'air d'aller.[new] [bold]Tellah[normal]: Ne vous inquiétez pas! Nous avons toujours ma magie![end] @@ -1839,7 +1847,7 @@ Mythidia.[new] Nous l'utilisions pour faire du commerce avec Mythidia... mais elle a été scellée du côté de Mythidia, maintenant c'est -impossible de passer. +impossible de passer.[new] En dessous d'ici se trouve la salle d'entraînement.[end] Ainsi le sceau de Mythidia a été brisé @@ -1878,7 +1886,7 @@ Qu'en dis-tu?[end] [bold]Golbez[normal]: Oh, je vois... Et alors nous pouvons le tuer quand il nous le ramène... -Diaboliquement intelligent, Caïn... +Diaboliquement intelligent, Caïn...[new] Tu pourrais encore te montrer utile.[end] [bold]Caïn[normal]: Très bien, alors je vais lui transmettre le message.[end] @@ -1901,7 +1909,7 @@ c'est une autre affaire![end] C...c'est la queue de rat que je cherchais! D'accord, je vais vous donner un bout -de ce minerai! +de ce minerai![new] Obtenu l'Adamant![music][0x29][delay][0xc][end] C..c'est...la légendaire queue rose! D'accord, je vais aussi vous donner ça! @@ -1989,7 +1997,7 @@ vie...[new] [bold]Rubicante[normal]: Nous nous rencontrons à nouveau! Vous m'avez montré la puissance de -ceux qui unissent leurs forces! +ceux qui unissent leurs forces![new] Maintenant, préparez-vous![end] [bold]Rubicante[normal]: Combattez-nous de toute votre force![end] @@ -2028,9 +2036,9 @@ C'est quoi, que tu veux?[end] soit à l'abri... elle l'est?[new] [bold]Caïn[normal]: Alors tu t'inquiètes vraiment pour ta petite pute, hein?[new] -Si tu veux la revoir... vivante... tu devras -l'échanger contre le cristal de la terre de -Troia.[new] +Si tu veux la revoir... vivante... tu +devras l'échanger contre le cristal de la +terre de Troia.[new] [bold]Cecil[normal]: Quoi!?[end] [bold]Tellah[normal]: Lâche![new] [bold]Caïn[normal]: Quand tu l'auras, je te @@ -2065,8 +2073,8 @@ T[end] Il ne reste plus beaucoup de vivres. Je me demande combien de temps nous pourrons tenir...[end] -Jeune maître, montre-nous ton Ninjutsu -ultime![end] +Jeune maître, montre-nous ton +Ninjutsu ultime![end] Nous tiendrons ici jusqu'à ce que le jeune maître rentre![end] @@ -2111,10 +2119,10 @@ Tiens bon, chérie![end] D'où sont venus des monstres comme ça?[end] Cet enfant est désespérant...[end] -Le jeune maître a dit qu'il allait tuer les -méchants! +Le jeune maître a dit qu'il allait tuer +les méchants! On va bientôt pouvoir rentrer au -château, hein? +château, hein?[new] Hein?[end] Je vais m'occuper de tout, ici! Sois prudent! @@ -2124,7 +2132,7 @@ Si tu meurs aussi, Eblana va...[end] [bold]Cid[normal]: Dès qu'on la sort tourner, elle étale ce qu'elle sait faire! -T'en dis quoi, poulette? +T'en dis quoi, poulette?[new] On va leur montrer ce que t'as dans le ventre![end] [bold]Cecil[normal]: Attends![new] @@ -2185,9 +2193,9 @@ T[end] T[end] T[end] T[end] -Un misérable chevalier noir comme toi ne -peut même pas toucher la marchandise -que nous vendons ici![end] +Un misérable chevalier noir comme toi +ne peut même pas toucher la +marchandise que nous vendons ici![end] Si tu revenais en un morceau, tu pourras utiliser ces armes-là... mais c'est impossible.[end] @@ -2279,8 +2287,8 @@ C'est dégoûtant![end] C'est la maison du meilleur forgeron du monde, maître Kukuro, Lali.[end] -Le maître n'a plus le cur à l'ouvrage, et -passe son temps à dormir, Lali.[end] +Le maître n'a plus le cur à l'ouvrage, +et passe son temps à dormir, Lali.[end] Le maître a été vraiment occupé, Lali![end] Je vais devenir un forgeron aussi talentueux que le maître!![end] @@ -2289,8 +2297,8 @@ vite!? Ne sois pas si impatient![end] C'est fait! L'épée sacrée Excalibur! -Utilise-la avec tout ton esprit, corps, et -âme! +Utilise-la avec tout ton esprit, corps, +et âme![new] Tu as obtenu Excalibur![music][0x29][delay][0xc][end] Grâce à toi, j'ai enfin retrouvé le cur à l'ouvrage.[end] @@ -2347,7 +2355,7 @@ beauté![end] Il y a peu de temps, le trou vers la surface s'est effondré! Dans le même coin, nous avons sauvé -un drôle de vieux! +un drôle de vieux![new] Il récupère à l'infirmerie![end] Je suis Luca! Mes poupées ont disparu. @@ -2431,7 +2439,7 @@ mains![end] appartenait à ma mère, l'ancienne reine.[end] [bold]Giotto[normal]: Près de la grotte scellée se trouve la continent de Toméra où vivent -d'autres nains! +d'autres nains![new] Mais on ne peut pas y aller à cause de la lave![end] [bold]Giotto[normal]: Si vous pouvez voler, vous @@ -2500,8 +2508,8 @@ utiliser?[end] C'est l'infirmerie![end] Parfois, même les nains se blessent![end] -Cet homme est vraiment énergique pour -un vieux râleur![end] +Cet homme est vraiment énergique +pour un vieux râleur![end] Quel vieux grincheux! Il ne fait rien et se plaint de la nourriture, mais il mange comme quatre![end] @@ -2578,7 +2586,7 @@ Lali, chuis vraiment bourré![end] prudent...[new] [bold]Rubicante[normal]: Ne t'inquiète pas. Eblana, le château des ninjas, est déjà -tombé. +tombé.[new] Je te confie la tour pendant mon absence.[end] [bold]Docteur[normal]: Hahahaha! @@ -2591,9 +2599,10 @@ paix...[new] [bold]Docteur[normal]: Qui est là!!?[end] [bold]Caïn[normal]: Qu'est-ce que ça peut faire? Tu ferais mieux d'appeler de l'aide, doc. -Rubicante n'est pas là pour te protéger![end] -[bold]Docteur[normal]: Vous ne me prenez vraiment -que pour un souffreteux? +Rubicante n'est pas là pour te +protéger![end] +[bold]Docteur[normal]: Vous ne me prenez +vraiment que pour un souffreteux? C'est moi le cerveau de toute cette opération![new] Je suis Lugeie! @@ -2630,13 +2639,14 @@ Oups....[end] [bold]Yasushi Matsumura[normal]: Graphismes -[new] [bold]Masanori Hoshino[normal]: C'est moi qui ai dessiné tous les monstres que tu -combats. +combats.[new] S'il y en a un que tu préfères, dis-moi lequel![end] [bold]Masanori Hoshino[normal]: Je suis Taka, le -metteur de Points! -Dès que j'aurai fini ce jeu, je deviendrai -probablement un Super Pointeur![end] +metteur de Points![new] +Dès que j'aurai fini ce jeu, je +deviendrai probablement un Super +Pointeur![end] [bold]Masanori Hoshino[normal]: Graphismes -[new] [bold]Ryuko Tanaka[normal]: Ce sera ma toute dernière production. @@ -2656,7 +2666,7 @@ J'ai mal aux yeux! J'ai mal aux oreilles![end] [bold]Nouveau Shinichi Tanaka[normal]: ... À partir de notre prochaine sortie, je -serai dans l'équipe de programmation. +serai dans l'équipe de programmation.[new] Content de vous rencontrer! ...Je veux avoir bientôt mon bureau personnel...[end] [bold]Nouveau Shinichi Tanaka[normal]: Ikuya @@ -2666,8 +2676,8 @@ de là! Je n'ai rien volé!![end] [bold]Kyoji Koizumi[normal]: Heh... Si tu sais dès le début que tu n'as pas -de vacances, faire des jeux, ce n'est pas -si mal! +de vacances, faire des jeux, ce n'est +pas si mal![new] Vous ne trouvez pas, Monsieur Sakaguchi?[end] @@ -2679,7 +2689,7 @@ maintenant?[end] [bold]Akira Ueda[normal]: M. Aki Yama, Takemotchi Shin-kun, Kas-kun, et tous les autres, vous regardez? -J'ai fait plein de sons. +J'ai fait plein de sons.[new] Écoutez-les![end] [bold]Akira Ueda[normal]: Compositeur-[new] [bold]Nobuo Uematsu[normal]: Hm! @@ -2702,13 +2712,13 @@ Je n'en peux plus![music][0x2][end] Programme principal - [bold]Ken Narita[normal]: N'ajoutez plus d'événements!! -Arrêtez de trouver encore des bugs! +Arrêtez de trouver encore des bugs![new] Vache, je risque de devoir lâcher l'université![end] [bold]Ken Narita[normal]: Zzz..Zzz..[end] -[bold]FuSoYa[normal]: Maintenant, entrons tant que -c'est possible![end] +[bold]FuSoYa[normal]: Maintenant, entrons tant +que c'est possible![end] [bold]Cecil[normal]: Aide-nous, Cid![end] «Wahaha! Crevez, nains @@ -2757,7 +2767,7 @@ Je prie pour ta survie![end] Comment ça se fait que vous ne me preniez pas avec vous! Vraiment... -Écoutez, vous! +Écoutez, vous![new] Vous revenez vivant![end] «Parce que si tu n'est pas dans le coin, le patron fait la tronche!»[end] @@ -2839,7 +2849,7 @@ Chocobo... La plus adorable des Chimères![end] La magie d'invocation... La magie qui appelle les Chimères de -leur royaume mystique... +leur royaume mystique...[new] Ceux qui possèdent ce pouvoir sont très peu nombreux.[end] Le monde des Chimères a une histoire @@ -2850,7 +2860,7 @@ des humains... Seuls ceux qui ont un corps forts et un esprit pur peuvent passer...[end] Les Chimères sont des animaux -fantastiques... +fantastiques...[new] Quand leur pouvoir est manié par quelqu'un qui a une lumière directrice... ils frappent un coup puissant pour la cause @@ -2864,7 +2874,8 @@ une éternité pour tous les lire![end] Pour les monstres sur lesquels[new] «Épier»[new] ne marche pas... le Dictionnaire des -Monstres montrera leur véritable nature....[end] +Monstres montrera leur véritable +nature....[end] Chimère, Monstre, Humain... D'où sont-ils venus et où vont-ils.... Le mystère de l'éternité...[end] @@ -2874,7 +2885,8 @@ Maintenant, il dort au fond du ventre d'un dragon.[end] Pour celui qui surpasse le roi Chimère... Il est dit qu'il existe un dieu Chimère qui -nous a créés et qui nous protège de loin. +nous a créés et qui nous protège de +loin.[new] Il ne connaît pas la défaite... Seule sa propre puissance retournée contre lui pourrait lui faire du mal...[end] @@ -2884,15 +2896,15 @@ il n'y en avait qu'une seule.[end] La Reine du Monde des Chimères, Asura... En tant qu'épouse du roi Chimère, elle -est la clef vers son audience. +est la clef vers son audience.[new] Seuls ceux qui peuvent la surpasser pourront voir la vraie forme du roi...[end] Le roi Chimère... Il est apparu dans l'océan du nord. -On dit de lui qu'il est maître des océans -et sans rival.[end] +On dit de lui qu'il est maître des +océans et sans rival.[end] Odin, le chevalier des grands guerriers -du passé... +du passé...[new] La seule fois qu'il a jamais été vaincu, c'était quand un éclair s'est abattu sur son épée.[end] @@ -2908,7 +2920,8 @@ Affirmez cette force, et testez leur C'est la salle du roi et de la reine des Chimères.[end] Pour parler au roi Chimère, vous avez -besoin de la permission de la reine Asura.[end] +besoin de la permission de la reine +Asura.[end] Rydia... Tu as des amis forts et bienveillants. Tu peux m'appeler n'importe quand...[end] @@ -2953,8 +2966,8 @@ Si tu lances le sort Lévite, tu [bold]Yang[normal]: ...Combattez pour moi![end] [bold]Yang[normal]: AAH! Des humains!![end] -[bold]Yang[normal]: Laissez-nous nous occuper de -Yang![end] +[bold]Yang[normal]: Laissez-nous nous occuper +de Yang![end] [bold]Yang[normal]: Qu'est-ce que vous fichez ici! Dehors! Tout de suite![end] @@ -2966,7 +2979,7 @@ si violents![end] [bold]Yang[normal]: Nous l'avons trouvé évanoui au-dehors de notre trou. Mais il ne s'est pas réveillé... -Depuis lors, nous restons à ses côtés... +Depuis lors, nous restons à ses côtés...[new] Notre amour n'y suffit-il pas...?[end] [bold]Yang[normal]: Que feriez-vous si Yang mourait!?[end] @@ -3064,7 +3077,7 @@ Léviathan. Partez maintenant.[end] Je ressens d'immenses puissance et esprit chez... -Rydia! +Rydia![new] Si jamais vous avez besoin de ma puissance, tu peux appeler mon nom![end] @@ -3089,8 +3102,8 @@ le sol, son esprit maléfique ne cesse de s'accroître...[end] Seul notre pouvoir garde Zémus scellé dans le noyau de la lune.[end] -Zémus a utilisé Golbez pour réunir les -cristaux de la Planète Bleue... et a +Zémus a utilisé Golbez pour réunir +les cristaux de la Planète Bleue... et a amplifié leur puissance avec la tour de Bab-Ilu.[end] Dès à présent, nous sentons ses @@ -3127,7 +3140,7 @@ Nous sommes la famille Humingway.[end] À bien y réfléchir... Un de nos amis avait construit un vaisseau et était allé vers la Planète -Bleue... +Bleue...[new] Il était vraiment très doué pour donner des surnoms...[end] From 0c14644548e2ed275c4d2b87f2f574af01af6f19 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 23:38:26 +0200 Subject: [PATCH 08/63] Updates the 8x8 vwf font asset to interleave glyphs and width. --- build.py | 54 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/build.py b/build.py index b9f52c3..df57f0d 100755 --- a/build.py +++ b/build.py @@ -143,7 +143,7 @@ def build_fixed_asset(table, input_file, binary_text_file): def build_fixed_to_ptr_asset(table, input_file, binary_text_file, pointers_file): pointers = read_fixed_from_xml(input_file, table, formatter=lambda t: t.strip() + "[end]") - metrics = TextMetrics(table, [Path("./assets/menu_font_length_table.dat").read_bytes()]) + metrics = TextMetrics(table, ["./assets/menu_font.dat"], char_height=8) max_length = 0 max_ptr = None for i, pointer in enumerate(pointers): @@ -195,19 +195,38 @@ def build_text_assets(banks): def build_vwf_font_asset_2bpp( font_file, has_grid, data_file, len_table_file, char_height ): - len_table, data = convert_font_to_2bpp(font_file, has_grid, char_height) - - # Espace - len_table[0xFF] = 3 - # Espace fine - len_table[0xFD] = 1 - # Espace insécable - len_table[0xFE] = 2 + # Use the FontConverter approach but for 2bpp + converter = FontConverter(font_file, has_grid, char_height=char_height) + + len_table, font_data = converter.convert_to_2bpp() + + # Apply width overrides + len_table[0xff] = 3 # Space + len_table[0xfd] = 1 # Thin space + len_table[0xfe] = 2 # Non-breaking space + + # Create interleaved format: char_data, char_width, char_data, char_width, ... + output_data = bytearray() + + for char_index in range(256): + # Add character bitmap data + char_start = char_index * char_height * 2 + char_end = char_start + char_height * 2 + char_data = font_data[char_start:char_end] + + # Pad if necessary + # while len(char_data) < char_height: + # char_data += b'\x00' + + output_data.extend(char_data) + + # Add width data + width = len_table.get(char_index, 0) # Default width 0 + output_data.append(width) with open(data_file, "wb") as fd: - fd.write(data) - with open(len_table_file, "wb") as fd: - fd.write(bytes(len_table.values())) + fd.write(output_data) + def build_vwf_font_asset(font_file, has_grid, data_file, len_table_file, char_height, table): @@ -230,15 +249,12 @@ def build_vwf_font_asset(font_file, has_grid, data_file, len_table_file, char_he len_table[0xFE] = 2 len_table[0xA0] = len_table[0xA0] - 1 - kerning_table_path = Path(len_table_file) - kerning_table_path = kerning_table_path.with_stem(kerning_table_path.stem.replace("length", "kerning")) - # Generate test pairs (common kerning candidates) known_pairs_to_kern = [] # Uppercase + lowercase (classic kerning pairs) letters = ["T", "V", "F", "P", "A", "W", "Y", "L", "v", "t", "f", "r"] - vowels = ["a", "e", "i", "o", "u", "é", "à", "â", "è", "ê", "ï"] + vowels = ["a", "e", "i", "o", "u", "é", "à", "â", "è", "ê", "ï", "r"] for letter in letters: for vowel in vowels: @@ -273,15 +289,13 @@ def add_custom_kernings(text: str, advance) -> None: with open(data_file, "wb") as fd: fd.write(data) + + # Write kerning data immediately after character data count = len(kerning_pairs) fd.write(struct.pack(" Date: Sat, 13 Sep 2025 23:41:15 +0200 Subject: [PATCH 09/63] Updates the 8x8 vwf glyph & width loading for both battle and item descriptions. Fixes the multiplication bug induced by NMI using PPU multiplication while we do. --- src/battle/message.s | 33 +++++---------------------------- src/small_vwf/render.s | 10 +++++----- 2 files changed, 10 insertions(+), 33 deletions(-) diff --git a/src/battle/message.s b/src/battle/message.s index a2fef41..6ac0255 100644 --- a/src/battle/message.s +++ b/src/battle/message.s @@ -9,7 +9,6 @@ current_char = bits_left_on_tile + 8 font_ptr = assets_menu_font_dat - length_table_ptr = assets_menu_font_length_table_dat init: jsr.w clear_buffer @@ -56,11 +55,14 @@ make_pointers: lda.b #0x00 xba rep #0x20 + pha asl asl asl asl + adc 1,s tax + pla lda.w #0x0000 sep #0x20 @@ -121,8 +123,7 @@ _read_8x8_char: bra _store _shift: -DONT_USE_PPU_MULTIPLICATION = 1 ; PPU multiplication is being used by the NMI which wrecks char lines once in e while -.if DONT_USE_PPU_MULTIPLICATION { + ; PPU multiplication is being used by the NMI which wrecks char lines once in a while phx lda.l font_ptr, x xba @@ -167,29 +168,8 @@ _mul_1: _mul_0: sep #0x20 plx -} else { - ; 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 -} _and_store: xba phx @@ -224,14 +204,11 @@ _next_line: 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 + lda.l font_ptr, x sta.b temp diff --git a/src/small_vwf/render.s b/src/small_vwf/render.s index b2097b5..781dbcb 100644 --- a/src/small_vwf/render.s +++ b/src/small_vwf/render.s @@ -150,7 +150,6 @@ buffer_size = 0x300 last_drawn_text_ptr = buffer_ptr + buffer_size + 2 font_ptr = assets_menu_font_dat -length_table_ptr = assets_menu_font_length_table_dat init: ; Initialize the renderer @@ -204,11 +203,15 @@ make_pointers: lda.b #0x00 xba rep #0x20 + pha asl asl asl asl + clc + adc 1, s tax + pla lda.w #0x0000 sep #0x20 @@ -298,14 +301,11 @@ _store: 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 + lda.l font_ptr, x sta.b temp From 52fec259ea1684a6713a45e3232cebdfacc553d9 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 23:41:35 +0200 Subject: [PATCH 10/63] Removes the menu_font_length_table. --- ff4.s | 1 - 1 file changed, 1 deletion(-) diff --git a/ff4.s b/ff4.s index c5222ef..8421872 100644 --- a/ff4.s +++ b/ff4.s @@ -150,7 +150,6 @@ _loop: *=0x288000 .incbin 'assets/menu_font.dat' - .incbin 'assets/menu_font_length_table.dat' .incbin 'assets/font.dat' .incbin 'assets/wicked_font.dat' .incbin 'assets/book_font.dat' From 6a53e74c9f771302be2fe15542d1f5bfec9438ba Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 23:42:50 +0200 Subject: [PATCH 11/63] Bumps a816 to 1.1.0a2 to properly support jmp (..., x). --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5816e26..c775b43 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -a816==1.1.0a1 +a816==1.1.0a2 pillow numpy From 1646012078fcac4e79a048a8f2dbb043655c9773 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 13 Sep 2025 23:45:55 +0200 Subject: [PATCH 12/63] Enable kerning for dialog font. --- src/vwf.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vwf.s b/src/vwf.s index ef20f64..bf603f2 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -585,7 +585,7 @@ TEXT_SHADOW :=1 REP #0x20 lda.b CURRENT_C -.if 0 { +.if ENABLE_KERNING { jsr.w GetKerningAdjustmentLinearSearch pha } else { From 321034bc7702b8e01cde7d283093396b27c669d5 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 15 Sep 2025 11:02:31 +0200 Subject: [PATCH 13/63] Makes TextMetrics kerning aware. --- metrics.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/metrics.py b/metrics.py index 7fee7ad..6c662b3 100644 --- a/metrics.py +++ b/metrics.py @@ -21,17 +21,35 @@ def measure_bytes(self, binary: bytes) -> int: size = 0 k = 0 current_font_index = 0 + prev_char = None + while k < len(binary): char = binary[k] match char: case 0xfe: k += 1 current_font_index = binary[k] + prev_char = None # Reset previous char on font change case 0x4: k += 1 size += 6 * 8 + prev_char = None # Reset previous char after special sequence case _: - size += self.length_tables[current_font_index][char] + 1 + # Add character width + char_width = self.length_tables[current_font_index][char] + size += char_width + + # Add spacing (default 1 pixel, adjusted by kerning) + spacing = 1 + if prev_char is not None: + # Check for kerning adjustment + kerning_pair = (prev_char, char) + if kerning_pair in self.kerning_tables[current_font_index]: + kerning_value = self.kerning_tables[current_font_index][kerning_pair] + spacing = kerning_value + 1 # Kerning + 1 = actual spacing + + size += spacing + prev_char = char k += 1 @@ -162,8 +180,10 @@ def _load_interleaved_font(self, font_file: str, char_height: int = 16) -> tuple for i in range(kerning_count): entry_offset = data_start + (i * 3) if entry_offset + 3 <= len(font_data): - char1, char2, kerning = struct.unpack("BBB", font_data[entry_offset:entry_offset + 3]) - kerning_table[(char1, char2)] = kerning + char1, char2, kerning_abs = struct.unpack("BBB", font_data[entry_offset:entry_offset + 3]) + # Convert unsigned kerning value back to signed (stored as abs value) + kerning_value = -kerning_abs if kerning_abs > 0 else 0 + kerning_table[(char1, char2)] = kerning_value else: break except (struct.error, IndexError): From c7c0d9046872bc56c99f65af0a6359425817c82c Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 15 Sep 2025 11:03:00 +0200 Subject: [PATCH 14/63] Updates how the [new] is handled when character changes. --- format_bank_xml.py | 79 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 16 deletions(-) diff --git a/format_bank_xml.py b/format_bank_xml.py index d12a40c..6fb83f8 100755 --- a/format_bank_xml.py +++ b/format_bank_xml.py @@ -187,7 +187,51 @@ def __init__(self, text_metrics=None): self.text_metrics = text_metrics def parse(self, tokens): - """Parse tokens into dialog segments with intelligent grouping.""" + """Parse tokens and inject WINDOW_BREAK tokens for guillemet speech transitions.""" + # First pass: inject WINDOW_BREAK tokens for guillemet transitions + enhanced_tokens = self._inject_window_breaks(tokens) + + # Second pass: process the enhanced tokens for dialog formatting + return self._format_dialog(enhanced_tokens) + + def _inject_window_breaks(self, tokens): + """Inject WINDOW_BREAK tokens where guillemet speeches should create new windows.""" + enhanced_tokens = [] + + for i, token in enumerate(tokens): + # Add the current token + enhanced_tokens.append(token) + + # Check if we need to add WINDOW_BREAK after this token + if token.type == "GUILLEMET_SPEECH": + # Add WINDOW_BREAK after guillemet speech if there's a next dialog token + # and it's not immediately followed by END or CLOSE_WINDOW + if (i + 1 < len(tokens) and + tokens[i + 1].type in ["CHARACTER", "GUILLEMET_SPEECH", "SENTENCE"] and + tokens[i + 1].type not in ["END", "CLOSE_WINDOW"]): + enhanced_tokens.append(Token("WINDOW_BREAK", "[window_break]")) + + elif token.type == "SENTENCE" and i > 0: + # Add WINDOW_BREAK after character speech if followed by guillemet + # First, find if we're in a character context by looking backwards + in_character_context = False + for j in range(i - 1, -1, -1): + if tokens[j].type == "CHARACTER": + in_character_context = True + break + elif tokens[j].type in ["GUILLEMET_SPEECH", "END", "CLOSE_WINDOW"]: + break + + if in_character_context: + # Look ahead to see if followed by guillemet speech + if (i + 1 < len(tokens) and + tokens[i + 1].type == "GUILLEMET_SPEECH"): + enhanced_tokens.append(Token("WINDOW_BREAK", "[window_break]")) + + return enhanced_tokens + + def _format_dialog(self, tokens): + """Format dialog tokens into final output, handling WINDOW_BREAK tokens.""" result = [] current_character = None accumulated_sentences = [] @@ -198,7 +242,17 @@ def parse(self, tokens): while i < len(tokens): token = tokens[i] - if token.type == "CHARACTER": + if token.type == "WINDOW_BREAK": + # Flush accumulated sentences with [new] and reset state + if accumulated_sentences: + result.extend(self._flush_pre_wrapped_sentences(accumulated_sentences, add_new=True)) + accumulated_sentences = [] + accumulated_text = "" + accumulated_lines = 0 + current_character = None + i += 1 + + elif token.type == "CHARACTER": # Character change - process any accumulated sentences first if accumulated_sentences: # Always add [new] when character changes (except for the very first character) @@ -324,13 +378,7 @@ def parse(self, tokens): elif token.type == "GUILLEMET_SPEECH": # Flush any accumulated sentences first if accumulated_sentences: - # Always add [new] unless immediately followed by [end] - add_new = not self._is_next_token_end(tokens, i) - result.extend( - self._flush_pre_wrapped_sentences( - accumulated_sentences, add_new=add_new - ) - ) + result.extend(self._flush_pre_wrapped_sentences(accumulated_sentences)) accumulated_sentences = [] accumulated_text = "" accumulated_lines = 0 @@ -338,15 +386,14 @@ def parse(self, tokens): # Apply word wrapping to guillemet speech wrapped_guillemet = self.text_metrics.word_warp(token.value, WINDOW_WIDTH) - # Check if this guillemet is followed immediately by [end] or [close_window] - is_followed_by_end = (i + 1 < len(tokens) and - tokens[i + 1].type in ["END", "CLOSE_WINDOW"]) + # Check if next token is WINDOW_BREAK to determine if we need [new] + next_is_window_break = (i + 1 < len(tokens) and + tokens[i + 1].type == "WINDOW_BREAK") - # Add guillemet speech as separate dialog box - if is_followed_by_end: - result.append(wrapped_guillemet) # Don't add [new] if followed by [end] or [close_window] - else: + if next_is_window_break: result.append(wrapped_guillemet + "[new]") + else: + result.append(wrapped_guillemet) current_character = None # Reset character context i += 1 From 968ad553dc7beabb8600ff4f27c70320f46c7dd5 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 15 Sep 2025 11:03:21 +0200 Subject: [PATCH 15/63] Adds debugging methods, tries to make touches detection better. --- utils/font_converter.py | 380 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 349 insertions(+), 31 deletions(-) diff --git a/utils/font_converter.py b/utils/font_converter.py index abbd4f3..886be0e 100644 --- a/utils/font_converter.py +++ b/utils/font_converter.py @@ -143,29 +143,96 @@ def _get_char_bounds(self, char_data: np.ndarray) -> tuple[int, int]: bottom_row = len(rows_with_pixels) - 1 - np.argmax(rows_with_pixels[::-1]) return top_row, bottom_row + def _count_touches(self, char1_data: np.ndarray, char2_data: np.ndarray, + char2_start_pos: int, overlap_top: int, overlap_bottom: int) -> tuple[int, int]: + """Count diagonal and orthogonal touches between two characters separately.""" + char1_width = char1_data.shape[1] + char2_width = char2_data.shape[1] + char1_height = char1_data.shape[0] + + # Calculate total width for the combined render + total_width = max(char1_width, char2_start_pos + char2_width) + + # Create a combined render and track ownership + combined = np.zeros((char1_height, total_width), dtype=np.uint8) + ownership = np.zeros((char1_height, total_width), dtype=np.uint8) # 1=char1, 2=char2 + + # Place char1 first + for row in range(char1_data.shape[0]): + for col in range(char1_data.shape[1]): + if char1_data[row, col] > 0: + combined[row, col] = char1_data[row, col] + ownership[row, col] = 1 + + # Place char2, only overwriting with non-zero pixels + for row in range(char2_data.shape[0]): + for col in range(char2_data.shape[1]): + if char2_data[row, col] > 0: # Only place non-zero pixels + result_col = char2_start_pos + col + if result_col < total_width: + combined[row, result_col] = char2_data[row, col] + ownership[row, result_col] = 2 + + # Count diagonal and orthogonal touches separately + diagonal_pairs = set() + orthogonal_pairs = set() + + for row in range(char1_height): + for col in range(total_width): + if combined[row, col] == 1: + pixel_owner = ownership[row, col] + + # Check diagonal directions + for dr, dc in [(1, 1), (1, -1), (-1, 1), (-1, -1)]: + new_row, new_col = row + dr, col + dc + if (0 <= new_row < char1_height and 0 <= new_col < total_width and + combined[new_row, new_col] == 1): + + neighbor_owner = ownership[new_row, new_col] + + # Only count touches between different characters + if pixel_owner != neighbor_owner and pixel_owner > 0 and neighbor_owner > 0: + # Create a unique key for this touch pair to avoid double counting + touch_key = tuple(sorted([(row, col), (new_row, new_col)])) + diagonal_pairs.add(touch_key) + + # Check orthogonal directions + for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]: + new_row, new_col = row + dr, col + dc + if (0 <= new_row < char1_height and 0 <= new_col < total_width and + combined[new_row, new_col] == 1): + + neighbor_owner = ownership[new_row, new_col] + + # Only count touches between different characters + if pixel_owner != neighbor_owner and pixel_owner > 0 and neighbor_owner > 0: + # Create a unique key for this touch pair to avoid double counting + touch_key = tuple(sorted([(row, col), (new_row, new_col)])) + orthogonal_pairs.add(touch_key) + + return len(diagonal_pairs), len(orthogonal_pairs) + def _check_collision(self, char1_data: np.ndarray, char2_data: np.ndarray, char2_start_pos: int, overlap_top: int, overlap_bottom: int) -> bool: - """Check if characters collide at given position.""" + """Check for direct collisions (overlapping pixels).""" char1_width = char1_data.shape[1] char2_width = char2_data.shape[1] + char1_height = char1_data.shape[0] - for row in range(overlap_top, overlap_bottom + 1): + # Check for direct pixel overlap + for row in range(char1_height): for char2_col in range(char2_width): char2_pixel_pos = char2_start_pos + char2_col - if 0 <= char2_pixel_pos < char1_width and char2_data[row, char2_col] > 0: - # Direct collision - if char1_data[row, char2_pixel_pos] > 0: - return True - - # Check immediate left diagonal (prevents char2 from getting too close to horizontal bars) - if (char2_pixel_pos > 0 and - char1_data[row, char2_pixel_pos - 1] > 0): - return True + if (0 <= char2_pixel_pos < char1_width and + char1_data[row, char2_pixel_pos] == 1 and + char2_data[row, char2_col] == 1): + return True + return False def compute_kerning(self, char1_index: int, char2_index: int, default_kerning: int = 1) -> int: - """Compute optimal kerning between two characters.""" + """Compute optimal kerning between two characters, targeting exactly 1 touch.""" self._load_image() char1_data = self.get_char(char1_index) @@ -181,28 +248,60 @@ def compute_kerning(self, char1_index: int, char2_index: int, default_kerning: i overlap_top = max(char1_top, char2_top) overlap_bottom = min(char1_bottom, char2_bottom) - max_kerning_reduction = 0 + # Try kerning values from most aggressive to most conservative + best_kerning = default_kerning max_reduction_limit = max(1, default_kerning) + char1_width for reduction in range(1, max_reduction_limit + 1): - char2_start_pos = char1_width + default_kerning - reduction + # Calculate the actual position used in rendering (kerning + 1) + kerning = default_kerning - reduction + actual_spacing = kerning + 1 + char2_start_pos = char1_width + actual_spacing - # Only check collision if there's vertical overlap + # Check for direct collisions (forbidden) if overlap_top <= overlap_bottom: if self._check_collision(trimmed_char1, trimmed_char2, char2_start_pos, overlap_top, overlap_bottom): break - max_kerning_reduction = reduction + + # Count diagonal and orthogonal touches separately + diagonal_touches, orthogonal_touches = self._count_touches(trimmed_char1, trimmed_char2, char2_start_pos, overlap_top, overlap_bottom) + + # Reject if any orthogonal touches (horizontal/vertical adjacency not allowed) + if orthogonal_touches > 0: + continue + + # Target exactly 1 diagonal touch as optimal + if diagonal_touches == 1: + return kerning + elif diagonal_touches == 0: + # 0 diagonal touches is also acceptable, save as fallback + best_kerning = kerning + # If diagonal_touches > 1, this kerning is too aggressive, continue to less aggressive values # When default_kerning is 0, try negative kerning (overlapping) - if default_kerning == 0 and max_kerning_reduction == 0: + if default_kerning == 0 and best_kerning == default_kerning: for overlap_pixels in range(1, char1_width): - char2_start_pos = char1_width - overlap_pixels - if overlap_top > overlap_bottom or not self._check_collision(trimmed_char1, trimmed_char2, char2_start_pos, overlap_top, overlap_bottom): - return -overlap_pixels - - optimal_kerning = default_kerning - max_kerning_reduction + # Calculate the actual position used in rendering (kerning + 1) + kerning = -overlap_pixels + actual_spacing = kerning + 1 + char2_start_pos = char1_width + actual_spacing + + if overlap_top <= overlap_bottom: + if self._check_collision(trimmed_char1, trimmed_char2, char2_start_pos, overlap_top, overlap_bottom): + continue + + diagonal_touches, orthogonal_touches = self._count_touches(trimmed_char1, trimmed_char2, char2_start_pos, overlap_top, overlap_bottom) + + # Reject if any orthogonal touches + if orthogonal_touches > 0: + continue + + if diagonal_touches == 1: + return kerning + elif diagonal_touches == 0: + best_kerning = kerning - return optimal_kerning + return best_kerning def render_kerned_string(self, text_bytes: bytes, default_kerning: int = 1) -> np.ndarray: """ @@ -260,13 +359,15 @@ def render_kerned_string(self, text_bytes: bytes, default_kerning: int = 1) -> n kerning = kerning_values[i - 1] current_pos += kerning - # Find vertical extent of current character for proper placement - char_rows_with_pixels = np.any(chars[i] > 0, axis=1) - char_top_row = np.argmax(char_rows_with_pixels) if np.any(char_rows_with_pixels) else 0 - char_bottom_row = len(char_rows_with_pixels) - 1 - np.argmax(char_rows_with_pixels[::-1]) if np.any(char_rows_with_pixels) else self.char_height-1 + # Place character, only overwriting with non-zero pixels + char_data = chars[i] + for row in range(char_data.shape[0]): + for col in range(char_data.shape[1]): + if char_data[row, col] > 0: # Only place non-zero pixels + result_col = current_pos + col + if result_col < result.shape[1]: + result[row, result_col] = char_data[row, col] - # Place character at its correct vertical position - result[char_top_row:char_bottom_row+1, current_pos:current_pos + char_widths[i]] = chars[i][char_top_row:char_bottom_row+1, :] current_pos += char_widths[i] return result @@ -319,6 +420,225 @@ def render_string(self, text_bytes: bytes) -> np.ndarray: return result + def debug_kerned_string(self, text: str, table) -> None: + """Debug tool to display and analyze a kerned string with detailed information.""" + print(f"=== KERNING DEBUG: '{text}' ===") + + # Convert to bytes + text_bytes = table.to_bytes(text) + if not text_bytes: + print(f"Could not convert '{text}' to bytes") + return + + print(f"Text bytes: {[hex(b) for b in text_bytes]}") + print() + + # Analyze each character pair + pairs_info = [] + for i in range(len(text_bytes) - 1): + char1_index = text_bytes[i] + char2_index = text_bytes[i + 1] + char1_str = table.to_text(bytes([char1_index])) + char2_str = table.to_text(bytes([char2_index])) + + # Get character data + char1_data = self.get_char(char1_index) + char2_data = self.get_char(char2_index) + char1_width = self.get_max_width(char1_data) + char2_width = self.get_max_width(char2_data) + + # Compute kerning + kerning = self.compute_kerning(char1_index, char2_index, default_kerning=1) + actual_spacing = kerning + 1 + char2_start_pos = char1_width + actual_spacing + + # Count diagonal and orthogonal touches separately + diagonal_touches, orthogonal_touches = self._count_touches( + char1_data[:, :char1_width], + char2_data[:, :char2_width], + char2_start_pos, 0, 15 + ) + + # Check for direct collisions + has_collision = self._check_collision( + char1_data[:, :char1_width], + char2_data[:, :char2_width], + char2_start_pos, 0, 15 + ) + + pairs_info.append({ + 'pair': f"{char1_str}{char2_str}", + 'chars': (char1_index, char2_index), + 'widths': (char1_width, char2_width), + 'kerning': kerning, + 'actual_spacing': actual_spacing, + 'char2_start_pos': char2_start_pos, + 'diagonal_touches': diagonal_touches, + 'orthogonal_touches': orthogonal_touches, + 'has_collision': has_collision + }) + + print(f"Pair {i+1}: '{char1_str}'{char2_str}' ({char1_index:02x},{char2_index:02x})") + print(f" Widths: char1={char1_width}, char2={char2_width}") + print(f" Kerning: {kerning} (actual spacing: {actual_spacing})") + print(f" Char2 starts at position: {char2_start_pos}") + print(f" Diagonal touches: {diagonal_touches}") + print(f" Orthogonal touches: {orthogonal_touches}") + print(f" Direct collision: {has_collision}") + print() + + # Render the string + kerned_render = self.render_kerned_string(text_bytes) + simple_render = self.render_string(text_bytes) + + print("KERNED RENDER:") + self._display_render_with_boundaries(kerned_render, pairs_info) + + print("\nSIMPLE RENDER (1px spacing):") + for i, row in enumerate(simple_render): + row_str = ''.join('█' if pixel == 1 else ' ' for pixel in row) + print(f'{i:2d}: {row_str}') + + print(f"\nWidth comparison: Kerned={kerned_render.shape[1]}, Simple={simple_render.shape[1]}") + print(f"Space saved: {simple_render.shape[1] - kerned_render.shape[1]} pixels") + + def _display_render_with_boundaries(self, render, pairs_info): + """Display render with character boundaries marked.""" + # Calculate character boundaries + boundaries = [] + current_pos = 0 + + # First character + if pairs_info: + char1_width = pairs_info[0]['widths'][0] + boundaries.append(current_pos + char1_width - 1) # End of char1 + current_pos += char1_width + + # Remaining characters + for info in pairs_info: + current_pos += info['actual_spacing'] + char2_width = info['widths'][1] + boundaries.append(current_pos + char2_width - 1) # End of char2 + current_pos += char2_width + + # Create column numbers header + col_nums = ''.join(str(i % 10) for i in range(render.shape[1])) + print(f" {col_nums}") + + # Display each row with boundary markers + for i, row in enumerate(render): + row_str = ''.join('█' if pixel == 1 else ' ' for pixel in row) + + # Add boundary markers + marked_row = list(row_str) + for boundary in boundaries: + if boundary < len(marked_row): + if marked_row[boundary] == '█': + marked_row[boundary] = '╬' # Character pixel at boundary + else: + marked_row[boundary] = '|' # Empty space at boundary + + print(f'{i:2d}: {"".join(marked_row)}') + + def debug_diagonal_touches(self, pair: str, table, test_kerning: int) -> None: + """Debug tool to visualize diagonal touches for a character pair at a specific kerning.""" + print(f"=== DIAGONAL TOUCHES DEBUG: '{pair}' at kerning {test_kerning} ===") + + # Convert to bytes + chars = table.to_bytes(pair) + if len(chars) != 2: + print(f"Could not convert '{pair}' to character pair") + return + + char1_data = self.get_char(chars[0]) + char2_data = self.get_char(chars[1]) + char1_width = self.get_max_width(char1_data) + char2_width = self.get_max_width(char2_data) + + # Calculate positioning + actual_spacing = test_kerning + 1 + char2_start_pos = char1_width + actual_spacing + + print(f"char1_width={char1_width}, char2_width={char2_width}") + print(f"actual_spacing={actual_spacing}, char2_start_pos={char2_start_pos}") + print() + + # Create combined render and track ownership + total_width = max(char1_width, char2_start_pos + char2_width) + combined = np.zeros((16, total_width), dtype=np.uint8) + ownership = np.zeros((16, total_width), dtype=np.uint8) # 1=char1, 2=char2 + + # Place char1 first + for row in range(char1_data.shape[0]): + for col in range(char1_width): + if char1_data[row, col] > 0: + combined[row, col] = char1_data[row, col] + ownership[row, col] = 1 + + # Place char2, only non-zero pixels + for row in range(char2_data.shape[0]): + for col in range(char2_width): + if char2_data[row, col] > 0: + result_col = char2_start_pos + col + if 0 <= result_col < total_width: + combined[row, result_col] = char2_data[row, col] + ownership[row, result_col] = 2 + + # Find diagonal touches and mark them + touch_pairs = set() + touch_pixels = set() # All pixels involved in touches + + for row in range(16): + for col in range(total_width): + if combined[row, col] == 1: + pixel_owner = ownership[row, col] + + # Check all 4 diagonal directions + for dr, dc in [(1, 1), (1, -1), (-1, 1), (-1, -1)]: + new_row, new_col = row + dr, col + dc + if (0 <= new_row < 16 and 0 <= new_col < total_width and + combined[new_row, new_col] == 1): + + neighbor_owner = ownership[new_row, new_col] + + # Only count touches between different characters + if pixel_owner != neighbor_owner and pixel_owner > 0 and neighbor_owner > 0: + # Create a unique key for this touch pair + touch_key = tuple(sorted([(row, col), (new_row, new_col)])) + if touch_key not in touch_pairs: + touch_pairs.add(touch_key) + touch_pixels.add((row, col)) + touch_pixels.add((new_row, new_col)) + direction_name = { + (1, 1): '↘', (1, -1): '↙', + (-1, 1): '↗', (-1, -1): '↖' + }[dr, dc] + char_type1 = 'char1' if pixel_owner == 1 else 'char2' + char_type2 = 'char2' if neighbor_owner == 2 else 'char1' + print(f"Touch: {char_type1}({row},{col}) {direction_name} {char_type2}({new_row},{new_col})") + + print(f"\\nTotal diagonal touches found: {len(touch_pairs)}") + print() + + # Create visualization + print("Visualization (* = touch pixel, █ = regular pixel, · = empty):") + col_nums = ''.join(str(i % 10) for i in range(total_width)) + print(f" {col_nums}") + + for row in range(16): + row_str = "" + for col in range(total_width): + if (row, col) in touch_pixels: + row_str += '*' + elif combined[row, col] == 1: + row_str += '█' + else: + row_str += '·' + print(f"{row:2d}: {row_str}") + + print() + print(f"Character boundary: char1 ends at col {char1_width-1}, char2 starts at col {char2_start_pos}") + def find_kerning_pairs(self, table, test_pairs: List[str]) -> Dict[Tuple[int, int], int]: """Find character pairs that benefit from kerning.""" kerning_pairs = {} @@ -331,8 +651,6 @@ def find_kerning_pairs(self, table, test_pairs: List[str]) -> Dict[Tuple[int, in try: optimal_kerning = self.compute_kerning(chars[0], chars[1], default_kerning=1) - if optimal_kerning < -1: - optimal_kerning = 0 # Skip useless entries: # - Same as default (no benefit) # - Invalid kerning values From 1ee58196921e4d76de216386365a5856adad717c Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 15 Sep 2025 11:03:44 +0200 Subject: [PATCH 16/63] Adds more pair to check restores custom kernings. --- build.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.py b/build.py index df57f0d..8ad7993 100755 --- a/build.py +++ b/build.py @@ -40,7 +40,6 @@ def read_fixed_from_xml(input_file, table, formatter=None): for child in root: text = child.text pointer = Pointer(i) - print(f"{hex(i)}: {text}") formatted_text = formatter(text) if formatter else text pointer.value = table.to_bytes(formatted_text) if text else b"" max_length = max(max_length, len(pointer.value)) @@ -53,7 +52,6 @@ def read_fixed_from_xml(input_file, table, formatter=None): pointer_table.append(pointer) i += 1 - print(f"max {max_length}") return pointer_table @@ -254,7 +252,7 @@ def build_vwf_font_asset(font_file, has_grid, data_file, len_table_file, char_he # Uppercase + lowercase (classic kerning pairs) letters = ["T", "V", "F", "P", "A", "W", "Y", "L", "v", "t", "f", "r"] - vowels = ["a", "e", "i", "o", "u", "é", "à", "â", "è", "ê", "ï", "r"] + vowels = ["a", "e", "i", "o", "u", "é", "à", "â", "è", "ê", "ï", "î" "r"] for letter in letters: for vowel in vowels: @@ -268,23 +266,25 @@ def build_vwf_font_asset(font_file, has_grid, data_file, len_table_file, char_he known_pairs_to_kern.append(vowel + "t") known_pairs_to_kern.append(vowel + "f") + # Common letter combinations that might benefit common_pairs = ["rn", "fi", "fl", "ff", "tt", "ll"] known_pairs_to_kern.extend(common_pairs) + known_pairs_to_kern.extend(["ît", "aî", "va", "ïe", "în", "bî", "îm" + ""]) - print(f"Testing {len(known_pairs_to_kern)} potential kerning pairs...") + print(f"Testing {len(known_pairs_to_kern)} potential kerning pairs in {Path(font_file).stem}...") # known_pairs_to_kern = ["Ta"] # Find pairs that benefit from kerning kerning_pairs = converter.find_kerning_pairs(table, known_pairs_to_kern) - def add_custom_kernings(text: str, advance) -> None: + def add_custom_kernings(text: str, advance: int) -> None: chars = table.to_bytes(text) kerning_pairs[(chars[0], chars[1])] = advance add_custom_kernings("tt", 2) - kerning_pairs = converter.find_kerning_pairs(table, known_pairs_to_kern) with open(data_file, "wb") as fd: From d2838ca265046118f8432727caac3a1cd853511d Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 15 Sep 2025 11:04:16 +0200 Subject: [PATCH 17/63] Add a flag to ENABLE_KERNING. --- ff4.s | 1 + 1 file changed, 1 insertion(+) diff --git a/ff4.s b/ff4.s index 8421872..fed90fd 100644 --- a/ff4.s +++ b/ff4.s @@ -8,6 +8,7 @@ ENABLE_INTRO := 1 ENABLE_VWF_ATTACK_NAMES := 1 BATTLE_ENABLED := 1 MAGIC_ENABLED := 1 +ENABLE_KERNING := 1 ; Debug flags TRIGGER_ENDING_CUTSCENE := 0 From 1202efae32dfe45ba2ad7a9c97f3da7b0aaa471d Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 15 Sep 2025 11:05:26 +0200 Subject: [PATCH 18/63] Fixes the intro map that had inverted tiles at the end of the fourth line. --- src/minimal_vwf_patches.s | 4 ++++ src/vwf.s | 14 ++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/minimal_vwf_patches.s b/src/minimal_vwf_patches.s index 83052e0..195df25 100644 --- a/src/minimal_vwf_patches.s +++ b/src/minimal_vwf_patches.s @@ -143,3 +143,7 @@ end_of_animation: ;AE AA 16 LDX $16AA ;00823E 8E DD 0C STX $0CDD ;008241 20 13 8A JSR $8A13 + +; update the text palette used in the intro +*=0x8ff04 + .dw 0x0463 \ No newline at end of file diff --git a/src/vwf.s b/src/vwf.s index bf603f2..89e4196 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -4,13 +4,12 @@ update_palette: -ldx.w 0x16AA -stx.w 0x0CDD -stx.w 0x0CE5 -rtl + ldx.w 0x16AA + stx.w 0x0CDD + stx.w 0x0CE5 + rtl window_palette: -.if 1 { ; Menu color palette I probably need to add one color ; Palette 1, normal text .db 0x00, 0x00 @@ -35,7 +34,6 @@ window_palette: .db 0x00, 0x40 .db 0xFF, 0x40 .db 0x7F, 0x2E -} ;current_pos = 0x3d ;current_text_pointer = 0x0772 @@ -889,8 +887,8 @@ intromap: .dw 0x2000,0x2000,0x2000,0x2135,0x2137,0x2139,0x213B,0x213D,0x213F,0x2141,0x2143,0x2145,0x2147,0x2149,0x214B,0x214D,0x214F,0x2151,0x2153,0x2155,0x2157,0x2159,0x215B,0x215D,0x215F,0x2161,0x2163,0x2165,0x2167,0x2000,0x2000,0x2000 .dw 0x2000,0x2000,0x2000,0x2168,0x216A,0x216C,0x216E,0x2170,0x2172,0x2174,0x2176,0x2178,0x217A,0x217C,0x217E,0x2180,0x2182,0x2184,0x2186,0x2188,0x218A,0x218C,0x218E,0x2190,0x2192,0x2194,0x2196,0x2198,0x219A,0x2000,0x2000,0x2000 .dw 0x2000,0x2000,0x2000,0x2169,0x216B,0x216D,0x216F,0x2171,0x2173,0x2175,0x2177,0x2179,0x217B,0x217D,0x217F,0x2181,0x2183,0x2185,0x2187,0x2189,0x218B,0x218D,0x218F,0x2191,0x2193,0x2195,0x2197,0x2199,0x219B,0x2000,0x2000,0x2000 -.dw 0x2000,0x2000,0x2000,0x219C,0x219E,0x21A0,0x21A2,0x21A4,0x21A6,0x21A8,0x21AA,0x21AC,0x21AE,0x21B0,0x21B2,0x21B4,0x21B6,0x21B8,0x21BA,0x21BC,0x21BE,0x21C0,0x21C2,0x21C4,0x21C6,0x21C8,0x21CA,0x21CD,0x21CF,0x2000,0x2000,0x2000 -.dw 0x2000,0x2000,0x2000,0x219D,0x219F,0x21A1,0x21A3,0x21A5,0x21A7,0x21A9,0x21AB,0x21AD,0x21AF,0x21B1,0x21B3,0x21B5,0x21B7,0x21B9,0x21BB,0x21BD,0x21BF,0x21C1,0x21C3,0x21C5,0x21C7,0x21C9,0x21CB,0x21CE,0x21D0,0x2000,0x2000,0x2000 +.dw 0x2000,0x2000,0x2000,0x219C,0x219E,0x21A0,0x21A2,0x21A4,0x21A6,0x21A8,0x21AA,0x21AC,0x21AE,0x21B0,0x21B2,0x21B4,0x21B6,0x21B8,0x21BA,0x21BC,0x21BE,0x21C0,0x21C2,0x21C4,0x21C6,0x21C8,0x21CA,0x21CC,0x21CE,0x2000,0x2000,0x2000 +.dw 0x2000,0x2000,0x2000,0x219D,0x219F,0x21A1,0x21A3,0x21A5,0x21A7,0x21A9,0x21AB,0x21AD,0x21AF,0x21B1,0x21B3,0x21B5,0x21B7,0x21B9,0x21BB,0x21BD,0x21BF,0x21C1,0x21C3,0x21C5,0x21C7,0x21C9,0x21CB,0x21CD,0x21CF,0x2000,0x2000,0x2000 endintromap: From 17642af22f10e26004bf2cab0e860aba1e206942 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 15 Sep 2025 11:05:57 +0200 Subject: [PATCH 19/63] Updates bank formatting. --- text/fr/bank1-1.xml | 345 ++++++++++++++++++++------------------------ text/fr/bank1-2.xml | 116 +++++++-------- text/fr/bank2.xml | 334 ++++++++++++++++++++---------------------- 3 files changed, 373 insertions(+), 422 deletions(-) diff --git a/text/fr/bank1-1.xml b/text/fr/bank1-1.xml index f41a09e..771231a 100644 --- a/text/fr/bank1-1.xml +++ b/text/fr/bank1-1.xml @@ -96,20 +96,19 @@ approchons de Baron![new] préoccupé...[new] [bold]Soldat[normal]: Même sur ordre de Sa Majesté...[new] -[bold]Soldat[normal]: Arracher le cristal à un -peuple innocent... +[bold]Soldat[normal]: Arracher le cristal à un peuple +innocent... C'est...[end] [bold]Soldat[normal]: Mais, Capitaine![new] [bold]Soldat[normal]: Piller une cité de magiciens qui n'opposent aucune résistance![new] [bold]Cecil[normal]: Écoutez bien, vous tous! -Le cristal est absolument nécessaire à -la prospérité de notre royaume de -Baron.[new] +Le cristal est absolument nécessaire à la +prospérité de notre royaume de Baron.[new] Sa Majesté a jugé que les habitants de -Mythidia en savaient trop sur les -secrets du cristal.[new] +Mythidia en savaient trop sur les secrets +du cristal.[new] Nous sommes l'escadron des Ailes Rouges de Baron, et les ordres de Sa Majesté sont absolus![new] @@ -145,8 +144,7 @@ Par ici, Cecil, sa Majesté attend.[end] ...[end] -[bold]Beigan[normal]: Messire Cecil, attendez -ici.[end] +[bold]Beigan[normal]: Messire Cecil, attendez ici.[end] [bold]Beigan[normal]: Majesté! Je redoute que Cecil n'ait @@ -192,16 +190,16 @@ représentaient une menace? Alors pourquoi n'ont-ils pas résisté?[new] Nous ne comprenons pas pourquoi des innocents ont dû périr.[new] -Certains se sont même interrogés sur -le caractère... véritablement... honorable -de vos actions...[new] +Certains se sont même interrogés sur le +caractère... véritablement... honorable de +vos actions...[new] [bold]Roi Baron[normal]: Tu oserais donc douter de ton propre roi, Cecil?![new] [bold]Cecil[normal]: !! Non, Sire! Ce n'était nullement mon intention!![new] -[bold]Roi Baron[normal]: Croyais-tu que j'ignorais -tes véritables sentiments?! +[bold]Roi Baron[normal]: Croyais-tu que j'ignorais tes +véritables sentiments?! Dire que je t'ai recueilli et élevé comme mon propre fils![new] Et maintenant, toi aussi, tu ne peux me @@ -231,8 +229,8 @@ dans tout ça, Caïn.[new] [bold]Caïn[normal]: Ne t'en fais pas.[new] Une fois que tu auras éliminé ces Chimères, le Roi te pardonnera sûrement -et tu seras réintégré comme -commandant des Ailes Rouges.[new] +et tu seras réintégré comme commandant +des Ailes Rouges.[new] [bold]Cecil[normal]: ...[new] [bold]Caïn[normal]: Tu as eu une longue journée. Laisse-moi m'occuper des préparatifs et @@ -276,8 +274,8 @@ Il a péri quand j'étais encore enfant... Il y a des moments où j'espère qu'il m'observe... J'espère qu'il serait fier de moi...[new] -J'ai souvent ces moments... ...moments -de réflexion silencieuse où je peux sentir +J'ai souvent ces moments... ...moments de +réflexion silencieuse où je peux sentir son esprit en moi qui me guide...[new] [bold]Cecil[normal]: ...[new] [bold]Caïn[normal]: Pardonne-moi d'avoir divagué @@ -311,8 +309,8 @@ appartements ce soir...[new] [bold]Cecil[normal]: Pourquoi le roi agit-il de la sorte? -Il était réputé comme chevalier pour -son courage et sa bonté.[new] +Il était réputé comme chevalier pour son +courage et sa bonté.[new] Caïn et moi étions orphelins, mais il nous a élevés comme ses propres fils. Mais maintenant... @@ -335,17 +333,17 @@ Ce n'est rien...[end] Regarde-moi plutôt.[end] [bold]Cecil[normal]: À Mythidia... -J'ai ôté la vie à des innocents et -dérobé leur cristal sacré... mais pour -quelle raison?![new] +J'ai ôté la vie à des innocents et dérobé +leur cristal sacré... mais pour quelle +raison?![new] Mon cur s'est assombri tout autant que cette armure maudite![end] [bold]Rosa[normal]: ...Tu n'est pas comme cela.[end] [bold]Cecil[normal]: Je ne suis rien qu'un -chevalier noir docile, tout juste un -pantin du roi.[end] +chevalier noir docile, tout juste un pantin +du roi.[end] [bold]Rosa[normal]: Le Cecil des Ailes Rouges n'aurait jamais pleurniché comme @@ -405,8 +403,8 @@ Si les soldats nous entendent, on aura des ennuis.[new] Il y a une chambre tranquille à l'auberge. -Allons-y! [0xfa]Le Moine Yang a rejoint -le groupe![music][0x29][delay][0x28][end] +Allons-y! [0xfa]Le Moine Yang a rejoint le +groupe![music][0x29][delay][0x28][end] [bold]Yang[normal]: Et qui est ce monsieur?[new] [bold]Cecil[normal]: Tellah, le sage. @@ -440,7 +438,7 @@ envoyé ici..![new] [bold]Cecil[normal]: POURQUOI?! Roi Baron!! -NON!! +NON!![new] «Ouiiiiin! Ouiiiiin...!!»[end] [bold]Cecil[normal]: Qui c'est?[end] @@ -479,16 +477,16 @@ exécuté pour trahison![new] [bold]Cecil[normal]: Mais ce n'est qu'une enfant![new] [bold]Caïn[normal]: ...Tu veux dire qu'on devrait braver le Roi?[new] -[bold]Cecil[normal]: Si le roi attend de nous -qu'on assassine des gens comme ça... +[bold]Cecil[normal]: Si le roi attend de nous qu'on +assassine des gens comme ça... Je n'ai aucune intention de le suivre![new] Je renonce à toute loyauté envers le roi, les Ailes Rouges, et Baron!!![end] [bold]Caïn[normal]: Je me doutais que tu allais dire ça. -Je ne vais pas te laisser affronter le -roi tout seul.[new] +Je ne vais pas te laisser affronter le roi +tout seul.[new] [bold]Cecil[normal]: Caïn?[new] [bold]Caïn[normal]: Peu importe ce que je dois au roi, en tant que chevalier dragon... @@ -562,8 +560,8 @@ t'avons trouvé!![new] [bold]Cecil[normal]: Attendez! Le roi de Baron a...[new] [bold]Général[normal]: Ordres du roi. -Si tu nous livres la survivante de Mist, -il pardonnera ta traîtrise.[new] +Si tu nous livres la survivante de Mist, il +pardonnera ta traîtrise.[new] Il a été jugé dangereux que le peuple de Mist puisse seulement exister![new] [bold]Cecil[normal]: Quoi!? @@ -611,8 +609,8 @@ C'est sûrement Golbez qui influence le roi pour réunir les quatre cristaux.[new] Le cristal de l'eau de Mythidia... Le cristal du feu de Damcyan... -Le cristal du vent de Fabul... et le -cristal de la terre de Troia.[end] +Le cristal du vent de Fabul... et le cristal +de la terre de Troia.[end] [bold]Edward[normal]: Il a déjà pris le cristal du feu...[new] @@ -646,8 +644,8 @@ sort du[new] [bold]Rydia[normal]: ! ...Hmm...non, je peux pas...[end] [bold]Rosa[normal]: Si tu es une invocatrice, tu -devrais pouvoir lancer des sorts -basiques de magie noire tels que[new] +devrais pouvoir lancer des sorts basiques +de magie noire tels que[new] «Feu»[new] ... -keuf-[end] @@ -671,8 +669,7 @@ Tu m'aimais.[new] À présent, donne cet amour aux gens de la Terre.[end] -[bold]Edward[normal]: Oui, Anna, je me -battrai... +[bold]Edward[normal]: Oui, Anna, je me battrai... Mais le courage... Que dois-je faire, Anna?[end] @@ -686,8 +683,7 @@ potentiel. Elle pourrait devenir une sorcière très douée... ...[new] Un visage si paisible... -Comme Anna quand elle était -petite.[new] +Comme Anna quand elle était petite.[new] [bold]Cecil[normal]: Anna est...[new] [bold]Tellah[normal]: Ma fille unique. Elle s'est sauvée à Damcyan avec un @@ -782,21 +778,20 @@ sort que Damcyan?![end] [bold]Yang[normal]: Eh bien, Cecil![end] -[bold]Yang[normal]: Ces gens sont des maîtres -au combat! +[bold]Yang[normal]: Ces gens sont des maîtres au +combat! Laissez-les se battre avec moi sur le front!![new] [bold]Roi Fabul[normal]: Puisque tu insistes, je laisse tout entre tes mains, Yang![new] Mesdemoiselles, puisque vous utilisez la -magie blanche, fournirez-vous -l'assistance médicale?[new] +magie blanche, fournirez-vous l'assistance +médicale?[new] [bold]Rosa[normal]: D'accord.[new] [bold]Roi Fabul[normal]: Yang, je compte sur toi![new] [bold]Yang[normal]: À vos ordres![end] -[bold]Rosa[normal]: Fais attention à toi, -Cecil.[new] +[bold]Rosa[normal]: Fais attention à toi, Cecil.[new] [bold]Cecil[normal]: Toi aussi... Rydia! Prends soin de Rosa![end] @@ -872,8 +867,7 @@ te trouble?»[end] Désolé que nous venions juste de nous rencontrer, mais voici mes salutations![new] [bold]Edward[normal]: Cecil![new] -[bold]Yang[normal]: Je ne vous laisserai pas -faire![end] +[bold]Yang[normal]: Je ne vous laisserai pas faire![end] [bold]Golbez[normal]: Je n'ai que faire de ces vermines![end] @@ -940,10 +934,9 @@ Tu es venu à son secours, il t'en allouera sûrement un.[new] [bold]Cecil[normal]: Merci.[end] -[bold]Yang[normal]: Qui était ce chevalier -dragon?[new] -[bold]Cecil[normal]: Il s'appelle Caïn et -c'est... c'était... mon meilleur ami. +[bold]Yang[normal]: Qui était ce chevalier dragon?[new] +[bold]Cecil[normal]: Il s'appelle Caïn et c'est... +c'était... mon meilleur ami. Nous nous étions juré de fuir de Baron ensemble.[new] [bold]Yang[normal]: Je vois...[new] @@ -1017,10 +1010,9 @@ devenir un problème. Il faut s'occuper de lui avant qu'il n'en devienne un.[new] C'est un chevalier noir, il devrait donc -être impuissant contre nos morts -vivants.[new] -Mais il gravit en ce moment la -Montagne de l'Épreuve.[new] +être impuissant contre nos morts vivants. +Mais il gravit en ce moment la Montagne +de l'Épreuve.[new] [bold]Scarmiglione[normal]: Il veut... donc devenir... -hiss-... paladin?[new] [bold]Golbez[normal]: Bien évidemment, ta mission @@ -1150,10 +1142,9 @@ grandir...»[new] «Laisse ton passé sanglant derrière toi... Purifie ton âme avec la lumière sacrée! -Tu dois le faire! Pour recevoir cette -force sacrée, combats et détruis ton -double obscur en tant que chevalier -noir!»[end] +Tu dois le faire! Pour recevoir cette force +sacrée, combats et détruis ton double +obscur en tant que chevalier noir!»[end] [bold]Tellah[normal]: Deux Cecil?[new] [bold]Palom[normal]: Que se passe-t-il?[new] @@ -1247,9 +1238,8 @@ en danger![end] [bold]Edward[normal]: ...Ne vous inquiétez pas... Juste jusqu'à ma harpe là-bas... Ooh![new] -«Dans votre état, vous ne devriez -même pas marcher! Ne vous surmenez -pas!»[new] +«Dans votre état, vous ne devriez même +pas marcher! Ne vous surmenez pas!»[new] [bold]Edward[normal]: Ça ne fait rien... Je suis le seul... qui puisse sauver... Cecil et les autres![end] @@ -1264,8 +1254,8 @@ QUEL EST CE BRUIT DÉSAGRÉABLE? ARG...ARK, HIC![end] [bold]Edward[normal]: Maintenant, Cecil! -Tant que je joue, il ne peut contrôler -la gravité! +Tant que je joue, il ne peut contrôler la +gravité! Votre épée![new] Équipez-vous de votre épée![end] @@ -1314,8 +1304,7 @@ homme courageux![new] [bold]Edward[normal]: Anna... j'ai l'impression de commencer à comprendre...[end] -[bold]Caïn[normal]: Où est le Cristal de la -Terre?[end] +[bold]Caïn[normal]: Où est le Cristal de la Terre?[end] [bold]Cecil[normal]: Caïn![new] [bold]Cid[normal]: Où te caches-tu?[new] @@ -1328,8 +1317,7 @@ personne.[new] ayez tenu votre promesse...[new] [bold]Tellah[normal]: Montre-toi![new] [bold]Golbez[normal]: Je comprends votre -impatience, mais j'aimerais vous -remercier.[new] +impatience, mais j'aimerais vous remercier.[new] [bold]Yang[normal]: Nous remercier?[new] [bold]Golbez[normal]: Je suis avec votre chère Rosa au sommet de cette Tour de @@ -1339,8 +1327,8 @@ la vie de Rosa contre le cristal.[new] [bold]Cecil[normal]: Golbez, tu n'es qu'un salaud![new] [bold]Golbez[normal]: Si vous ne venez pas -rapidement, je ne peux garantir la vie -de votre précieuse Rosa...[music][0x19] Alors, +rapidement, je ne peux garantir la vie de +votre précieuse Rosa...[music][0x19] Alors, montez![end] «Bienvenue dans la tour de Zot!»[end] @@ -1358,8 +1346,7 @@ Barbariccia, l'Impératrice de l'air!»[new] adieu! Vous n'atteindrez pas Rosa!»[end] «Impossible!»[new] -«Vous avez déjoué notre attaque -delta...»[new] +«Vous avez déjoué notre attaque delta...»[new] «Grande sœur! Non...»[end] [bold]Golbez[normal]: Bien joué, messieurs.[new] @@ -1399,8 +1386,7 @@ Peu importe, tu ne me servais plus à rien. Cette dette, je la rembourserai![end] -[bold]Cecil[normal]: Tu n'iras nulle part, -Golbez![end] +[bold]Cecil[normal]: Tu n'iras nulle part, Golbez![end] [bold]Golbez[normal]: Guh... Ne me sous-estimez pas![end] @@ -1425,8 +1411,8 @@ Mais Tellah![end] [bold]Tellah[normal]: Je n'ai pas pu le tuer...[new] [bold]Cid[normal]: Ne parle pas![new] [bold]Tellah[normal]: C'est peut-être... la -rétribution pour avoir combattu... -consumé par la haine... +rétribution pour avoir combattu... consumé +par la haine... La vengeance d'Anna... je vous en...[end] [bold]Cecil[normal]: Tellah![new] @@ -1531,8 +1517,8 @@ chose.[end] Cela signifie qu'il possède maintenant tous les cristaux.[new] [bold]Caïn[normal]: Non, il n'en a que quatre![new] -[bold]Rosa[normal]: Quatre ne font pas le -compte total...?[new] +[bold]Rosa[normal]: Quatre ne font pas le compte +total...?[new] [bold]Cid[normal]: Alors cette rumeur est vraie![new] [bold]Rosa[normal]: Ce ne peut pas être...[new] [bold]Caïn[normal]: Si... les Cristaux d'Obscurité![end] @@ -1545,8 +1531,8 @@ l'autre côté..?[new] [bold]Caïn[normal]: En effet. Donc, ça veut dire que Golbez n'a que la moitié des cristaux![new] -[bold]Cid[normal]: Alors les cristaux -d'Obscurité, c'est pas une rumeur... +[bold]Cid[normal]: Alors les cristaux d'Obscurité, +c'est pas une rumeur... Et la question inévitable... Où sont-ils?[new] [bold]Caïn[normal]: Golbez le sait.[new] @@ -1577,8 +1563,7 @@ passage vers le monde souterrain.[new] bien être?[new] [bold]Caïn[normal]: Je ne sais pas...[end] -[bold]Cecil[normal]: La Pierre de Magma -rougeoie![end] +[bold]Cecil[normal]: La Pierre de Magma rougeoie![end] [bold]Cecil[normal]: Qu'est-ce que c'est!?[new] [bold]Caïn[normal]: Les Ailes Rouges![end] @@ -1600,8 +1585,8 @@ mais ils vous ont abattus.[new] En fait, on était nous-mêmes prêts à vous tirer dessus.[new] [bold]Caïn[normal]: Les cristaux sont à l'abri?[new] -[bold]Giotto[normal]: Hélas, ils ont déjà pris deux -des quatre cristaux.[new] +[bold]Giotto[normal]: Hélas, ils ont déjà pris deux des +quatre cristaux.[new] [bold]Yang[normal]: Nous arrivons tard...[new] [bold]Giotto[normal]: Mais le cristal de ce château est, lui, toujours en sécurité. @@ -1609,8 +1594,8 @@ On a pu faire battre en retraite ces... heu... trucs volants avec nos chars nains.[new] [bold]Rosa[normal]: Alors c'étaient vos chars qui combattaient les aéronefs.[new] -[bold]Giotto[normal]: Oh, comme ça vous appelez -ces choses aéronefs... +[bold]Giotto[normal]: Oh, comme ça vous appelez ces +choses aéronefs... Wow, le monde du dessus a des trucs de ce genre![new] Nous sommes fiers de nos chars, mais @@ -1628,7 +1613,7 @@ On ne va pas en tirer grand chose.[end] [bold]Cecil[normal]: Il n'y a personne, ici.[new] [bold]Yang[normal]: J'ai senti une présence ici![end] -[bold]Caïn[normal]: Ça ne veut pas s'ouvrir! +[bold]Caïn[normal]: Ça ne veut pas s'ouvrir![new] «Yo-ho-ho-ho-!»[end] «Nous sommes les joyeuses Calcabrina! @@ -1638,7 +1623,7 @@ naïvement! On va vous battre et offrir vos têtes au seigneur Golbez en cadeau! Kya-ho-ho-ho!»[end] -[bold]Cecil[normal]: Quoi!? +[bold]Cecil[normal]: Quoi!?[new] «Cela faisait longtemps...»[end] [bold]Cecil[normal]: Golbez..![new] @@ -1651,16 +1636,15 @@ vous dire pourquoi je rassemble les cristaux.[new] Lumière et ténèbres réunies... 8 cristaux... -C'est la clé pour faire revivre la Tour -de Babel, le chemin scellé vers la Lune.[new] +C'est la clé pour faire revivre la Tour de +Babel, le chemin scellé vers la Lune.[new] On dit qu'il y a sur la Lune un pouvoir qui dépasse notre imagination. -Avec ce cristal, j'en ai maintenant -sept...[new] -Il n'en reste plus qu'un. +Avec ce cristal, j'en ai maintenant sept... +Il n'en reste plus qu'un.[new] C'est aussi grâce à vous. Je me dois de vous remercier pour cela. -Prenez ceci![new] +Prenez ceci! C'est mon dernier cadeau![end] [bold]Cecil[normal]: On l'a vaincu! @@ -1711,13 +1695,12 @@ Rydia a rejoint l'équipe![music][0x29][delay][0x28][end] [bold]Edge[normal]: Ouais! On va tous y aller et rentrer dans leur base![new] -[bold]Rydia[normal]: Ça c'est bien trouvé! [0xfa]Le -ninja Edge a rejoint l'équipe![music][0x29][delay][0x28][end] +[bold]Rydia[normal]: Ça c'est bien trouvé! [0xfa]Le ninja +Edge a rejoint l'équipe![music][0x29][delay][0x28][end] [bold]Cid[normal]: Maintenant, vous pourrez voler sans vous soucier de la lave![new] -[bold]Rosa[normal]: Tu nous as sauvés, -Cid.[new] +[bold]Rosa[normal]: Tu nous as sauvés, Cid.[new] [bold]Cid[normal]: ...[new] [bold]Caïn[normal]: Cid![music][0x2a][delay][0x28][end] @@ -1757,8 +1740,8 @@ Prends les commandes, Cecil![end] [bold]Cecil[normal]: Où vas-tu?![end] [bold]Cid[normal]: Quand l'Entreprise arrivera à -la surface, je scellerai le trou avec -cette bombe![end] +la surface, je scellerai le trou avec cette +bombe![end] [bold]Cid[normal]: Golbez! L'ingénieur aéronautique Cid va @@ -1785,18 +1768,17 @@ Pendant que tu pilotes l'Entreprise, presse le bouton d'action au-dessus de l'aéroglisseur![new] Maintenant tu peux aller à la grotte -d'Eblana près de la Tour de Babel![new] +d'Eblana près de la Tour de Babel! Dépose l'aéroglisseur dans les eaux peu -profondes du continent et monte à -bord![end] +profondes du continent et monte à bord![end] [bold]Cecil[normal]: Pour être franc, Cid -est... +est...[new] «Trop énergique et embêtant, pas vrai? -Soyez assurés que ce n'est pas -quelqu'un qui mourrait facilement! Bon, -on a des montagnes de travail qui nous -attendent! Bon courage!»[end] +Soyez assurés que ce n'est pas quelqu'un +qui mourrait facilement! Bon, on a des +montagnes de travail qui nous attendent! +Bon courage!»[end] [bold]Homme[normal]: Je t'ai enfin trouvé, Rubicante! J'attendais ce jour depuis longtemps![new] @@ -1841,8 +1823,7 @@ Tout le monde... tout le monde![new] puissant des Quatre Élémentaux. On ne sait même pas si on a une chance![new] -Mais nous devons récupérer les -cristaux![new] +Mais nous devons récupérer les cristaux![new] [bold]Edge[normal]: ...Une si jolie fille qui pleure... je n'ai pas le choix... Bon, unissons nos forces![new] @@ -1894,8 +1875,8 @@ Oh, Dieu, TU PAIERAS POUR ÇA!!![new] [bold]Rubicante[normal]: Lugeie a transformé tes parents en monstres de lui-même. Je m'excuse profondément pour cela.[new] -Crois-moi, je ne ferais jamais une -chose comme cela. +Crois-moi, je ne ferais jamais une chose +comme cela. Je ne suis pas comme les autres. Je veux combattre à armes égales.[new] [bold]Edge[normal]: Ferme-la! @@ -1910,7 +1891,7 @@ Vous êtes condamnés à rester éternellement faibles.[new] «Humain»[new] ...c'est ça? -Je vais te montrer cette chose[new] +Je vais te montrer cette chose «humaine»[new] ... ...qu'est la rage![music][0xb] [0xfa]La rage a révélé les pouvoirs cachés de Edge! [0xfa]Edge @@ -1925,12 +1906,11 @@ soigner! Combattez de toutes vos forces![end] [bold]Rubicante[normal]: Oh... je vois... -Individuellement, les humains sont -faibles, mais ensemble... ils sont puissants![new] -À présent, je comprends mieux -comment vous avez battu le seigneur -Golbez... -Je vous salue, braves guerriers![new] +Individuellement, les humains sont faibles, +mais ensemble... ils sont puissants![new] +À présent, je comprends mieux comment +vous avez battu le seigneur Golbez... +Je vous salue, braves guerriers! Adieu...[end] Jeune maître![end] @@ -2050,8 +2030,8 @@ vôtre![new] Elle implique toutes les créatures vivantes, tous les esprits qui vivent sur Terre...[new] -Tout le monde doit se battre pour -mère Nature![end] +Tout le monde doit se battre pour mère +Nature![end] [bold]Rydia[normal]: Aaaaaah![new] [bold]Cecil[normal]: La tour de Babel!?[end] @@ -2103,8 +2083,7 @@ Que va-tu répondre? Veux-tu te mesurer à moi?[end] «Reviens à moi... Caïn... -Rapporte-moi le cristal et reviens à -moi...»[new] +Rapporte-moi le cristal et reviens à moi...»[new] [bold]Cecil[normal]: Golbez![end] [bold]Cecil[normal]: Ooh! [0xfa]Caïn a volé le @@ -2157,9 +2136,9 @@ Au seigneur Golbez![end] [bold]Edge[normal]: Merde... Bon sang![end] -[bold]Rubicante[normal]: Tu es effectivement -assez fort pour avoir confiance... mais tu -ne peux pas encore m'égaler. +[bold]Rubicante[normal]: Tu es effectivement assez +fort pour avoir confiance... mais tu ne +peux pas encore m'égaler. Va perfectionner tes talents![new] Je serai ton adversaire quand tu veux![end] @@ -2209,8 +2188,8 @@ Luca![end] [bold]Cid[normal]: ...Il semblerait que ce ne soit plus mon tour d'intervenir... et avec ce corps...[new] -Tout ce que je peux faire, c'est -bricoler des aéronefs...[end] +Tout ce que je peux faire, c'est bricoler +des aéronefs...[end] [bold]Edge[normal]: Pfff... Vieil homme, je te salue![new] @@ -2230,12 +2209,12 @@ occuper d'un vieux comme moi![new] [bold]Cecil[normal]: Merci... Cid![end] -[0xfa]Née de la bouche d'un dragon, -[0xfa]s'élevant dans les cieux [0xfa]avec Lumière et +[0xfa]Née de la bouche d'un dragon, [0xfa]s'élevant +dans les cieux [0xfa]avec Lumière et Obscurité, [0xfa]une promesse endormie [0xfa]s'éveillera. [0xfa]Voilée [0xfa]par la lumière [0xfa]de -l'éternité, [0xfa]La Terre Mère sera bénie -[0xfa]avec clémence et salut.[end] +l'éternité, [0xfa]La Terre Mère sera bénie [0xfa]avec +clémence et salut.[end] [bold]Palom[normal]: Ce vieux a appris Météor![new] [bold]Ancien[normal]: Météor...! @@ -2396,8 +2375,7 @@ Babel![end] «Je vais m'en occuper!»[end] -[bold]Cecil[normal]: ...Cette lumière m'a appelé -fils. +[bold]Cecil[normal]: ...Cette lumière m'a appelé fils. Qu'était cette lumière?[new] [bold]Ancien[normal]: Je ne sais pas ce qu'était la lumière sur la Montagne de l'Épreuve, ni @@ -2413,8 +2391,7 @@ proue du Faucon pour percer la roche qui bloque le passage vers la surface![new] [bold]Rosa[normal]: Tes blessures vont mieux?[new] [bold]Cid[normal]: Ce n'est pas le moment de -s'inquiéter des blessures d'un vieil -homme![new] +s'inquiéter des blessures d'un vieil homme![new] [bold]Edge[normal]: Tu peux vraiment le faire?[new] [bold]Cid[normal]: Pour l'ingénieur aéronautique Cid, le mot[new] @@ -2434,9 +2411,9 @@ Un pouvoir si magnifique![end] Vous avez fait de Léviathan votre allié. Mais cela aurait pu se faire sans le pouvoir de la Lumière.[new] -Le jugement final pour savoir si la -vraie Lumière réside en vous... sera -rendu par le Dieu des Bêtes Fantômes... +Le jugement final pour savoir si la vraie +Lumière réside en vous... sera rendu par +le Dieu des Bêtes Fantômes... Bahamut![end] [0xfa]Rydia a appris Bahamut![music][0x29][delay][0x28][end] @@ -2501,8 +2478,8 @@ Je ne sais pas si c'est un présage...[new] [bold]Soldat[normal]: Oui, mon capitaine![new] [bold]Soldat[normal]: Il y a de plus en plus de monstres ces derniers temps...[new] -[bold]Soldat[normal]: Mais il y en a vraiment trop, -à présent...[new] +[bold]Soldat[normal]: Mais il y en a vraiment trop, à +présent...[new] [bold]Cecil[normal]: Est-ce qu'il se passerait... quelque chose?[end] @@ -2512,7 +2489,7 @@ quelque chose?[end] [bold]Caïn[normal]: Qui est là?[music][0x2d][new] «Partez maintenant et il ne vous fait aucun mal...»[new] -[bold]Caïn[normal]: Montre-toi! +[bold]Caïn[normal]: Montre-toi![new] «Vous voulez vraiment continuer?»[end] [bold]Edward[normal]: Cecil... @@ -2523,8 +2500,8 @@ Mais il est tard. On part demain matin.[new] Pour le moment, on va se coucher.[new] [bold]Rosa[normal]: Cecil... -Merci. [0xfa]Le mage blanc Rosa a -rejoint l'équipe![end] +Merci. [0xfa]Le mage blanc Rosa a rejoint +l'équipe![end] [bold]Rosa[normal]: Je vais bien. Et je suis un mage blanc. @@ -2549,8 +2526,8 @@ homme, Cecil![new] [bold]Caïn[normal]: Tue-moi si tu peux![end] [bold]Yang[normal]: Cecil! -Maintenant, c'est à nous de nous -battre pour toi.[new] +Maintenant, c'est à nous de nous battre +pour toi.[new] Nous devons discuter d'un plan d'attaque, mais tout d'abord il faut nous reposer.[new] @@ -2562,8 +2539,8 @@ reposer.[new] Veux-tu me voir danser?[end] -Tu es horrible, te moquer de moi -comme ça?![end] +Tu es horrible, te moquer de moi comme +ça?![end] Oui![delay][0x5][close_window][end] @@ -2700,8 +2677,7 @@ Rosa, t'en fais pas![end] Où est Rosa?[new] [bold]Cecil[normal]: Il s'agit d'un échange avec le cristal de la Terre de Troia... -Mais le cristal a été volé par l'Elfe -Noir...[end] +Mais le cristal a été volé par l'Elfe Noir...[end] [bold]Edward[normal]: Cecil, prenez ça...[new] [bold]Cecil[normal]: C'est quoi?[new] @@ -2800,30 +2776,30 @@ reçurent l'ordre [0xfa]de se rendre à Mist, [0xfa]un village provincial situé [0xfa]par-delà les montagnes [0xfa]dans une vallée recouverte [0xfa]par un épais brouillard... [0xfa]Les aéronefs... -[0xfa]Le vol fut longtemps [0xfa]un rêve -inaccessible [0xfa]de l'humanité. [0xfa]Ces vaisseaux -donnèrent [0xfa]aux hommes le pouvoir [0xfa]de -s'élever dans les cieux. [0xfa]Très vite, [0xfa]comme -toute création [0xfa]humaine, il devint un [0xfa]outil -de la cupidité. [0xfa]Le pays de Baron devint -[0xfa]la plus forte puissance [0xfa]militaire au -monde [0xfa]par leurs aéronefs, [0xfa]les Ailes -Rouges... [0xfa]Mais pourquoi un pays aussi -[0xfa]puissant recherche-t-il [0xfa]les cristaux? -[0xfa]Quel pouvoir recèlent-ils? [0xfa]Pourquoi -l'humanité [0xfa]corrompt-elle chaque -[0xfa]réalisation de ses rêves? [0xfa]Et pourquoi les -monstres [0xfa]se font-ils toujours plus -nombreux, [0xfa]même en plein jour? [0xfa]Les -cristaux luisaient [0xfa]silencieusement...[end] +[0xfa]Le vol fut longtemps [0xfa]un rêve inaccessible +[0xfa]de l'humanité. [0xfa]Ces vaisseaux donnèrent +[0xfa]aux hommes le pouvoir [0xfa]de s'élever dans +les cieux. [0xfa]Très vite, [0xfa]comme toute +création [0xfa]humaine, il devint un [0xfa]outil de la +cupidité. [0xfa]Le pays de Baron devint [0xfa]la plus +forte puissance [0xfa]militaire au monde [0xfa]par +leurs aéronefs, [0xfa]les Ailes Rouges... [0xfa]Mais +pourquoi un pays aussi [0xfa]puissant +recherche-t-il [0xfa]les cristaux? [0xfa]Quel pouvoir +recèlent-ils? [0xfa]Pourquoi l'humanité +[0xfa]corrompt-elle chaque [0xfa]réalisation de ses +rêves? [0xfa]Et pourquoi les monstres [0xfa]se +font-ils toujours plus nombreux, [0xfa]même en +plein jour? [0xfa]Les cristaux luisaient +[0xfa]silencieusement...[end] [bold]Cecil[normal]: Rosa![end] [bold]Giotto[normal]: Que vous faut-il pour vos réparations?[new] [bold]Cid[normal]: Je peux faire quelques -réparations provisoires avec les -matériaux disponibles ici...[new] +réparations provisoires avec les matériaux +disponibles ici...[new] Mais le corps de l'aéronef ne résistera pas aux flammes de votre monde. Je dois retourner à la surface et @@ -2845,8 +2821,8 @@ Tu nous as dit de l'aider![new] [bold]Porom[normal]: S'il vous plaît, laissez-nous aussi y aller...[new] [bold]Ancien[normal]: Bien... -La Montagne de l'Épreuve t'a accepté -et tu en es revenu vivant.[new] +La Montagne de l'Épreuve t'a accepté et +tu en es revenu vivant.[new] Tu dois avoir une destinée bien plus importante que je ne peux l'entrevoir... Je voudrais bien vous accompagner, @@ -2891,8 +2867,7 @@ Je voulais voir vos enfants, Rosa... Cecil...[new] Mais Yang va être seul, ça ne va pas... -Allez à Baron et parlez à mes -apprentis![end] +Allez à Baron et parlez à mes apprentis![end] [bold]Cecil[normal]: Cid![new] [bold]Rydia[normal]: Grand-père![end] @@ -2951,8 +2926,8 @@ prince Edward a rejoint le groupe![music][0x29][delay][0x28][end] [bold]Tellah[normal]: Il est en bas![end] -[bold]Cecil[normal]: Le courant est trop fort -pour entrer![end] +[bold]Cecil[normal]: Le courant est trop fort pour +entrer![end] Vous avez votre carte de membre?[end] @@ -3021,8 +2996,8 @@ On est touché! On va s'écraser! Accrochez-vous![end] -«Mort à ceux qui convoitent cette -Lance Sacrée!»[end] +«Mort à ceux qui convoitent cette Lance +Sacrée!»[end] «Tu n'obtiendras jamais la sainte protection de ces Rubans!»[end] @@ -3031,15 +3006,15 @@ protection de ces Rubans!»[end] cette épée. Il ne doit pas être libéré!»[end] [bold]Dr Lugeie[normal]: Ha Ha Ha! -Je me suis toujours demandé ce -qu'était la mort... +Je me suis toujours demandé ce qu'était +la mort... Soyez maudits, robots et humains![new] L'au-delà est l'ultime expérience... Vous croyez avoir gagné? Cette tour relie les deux mondes, celui du dessus et celui du dessous...[new] -Les cristaux y ont déjà été amenés -par Rubicante! +Les cristaux y ont déjà été amenés par +Rubicante! Hahahahaha![new] Et je vais anéantir les nains avec mon super canon! @@ -3051,8 +3026,8 @@ katana! En enfer...!»[end] [bold]Yang[normal]: Ça veut donc dire qu'ils vont essayer de voler le cristal de l'air![new] [bold]Edward[normal]: Sûrement. -Damcyan a déjà été attaqué et le -cristal volé.[new] +Damcyan a déjà été attaqué et le cristal +volé.[new] [bold]Yang[normal]: !...Bon sang! Et nos forces principales qui ont été anéanties![new] diff --git a/text/fr/bank1-2.xml b/text/fr/bank1-2.xml index 397f03d..c3208b1 100644 --- a/text/fr/bank1-2.xml +++ b/text/fr/bank1-2.xml @@ -57,12 +57,11 @@ Mais nous n'avions pas le choix.[new] [bold]Cecil[normal]: Je comprends. Vu mon passé, c'était prévisible.[new] [bold]Ancien[normal]: Mais tu as purgé la noirceur -de ton âme... et reçu la lumière sacrée. -!? -Ce n'est pas possible..![new] +de ton âme... et reçu la lumière sacrée. !? +Ce n'est pas possible..! Cette épée?![new] -[bold]Cecil[normal]: La lumière de la montagne -me l'a donnée...[new] +[bold]Cecil[normal]: La lumière de la montagne me +l'a donnée...[new] [bold]Ancien[normal]: Ères de prophéties, prières, croyance... et maintenant..! Regarde! @@ -90,8 +89,8 @@ Zémus...[new] Quoi?![end] [bold]Edge[normal]: Rien à foutre! -C'est de ta faute à toi, si le Géant -s'est ramené, déjà![end] +C'est de ta faute à toi, si le Géant s'est +ramené, déjà![end] [bold]Caïn[normal]: Économise ta salive pour plus tard! @@ -106,8 +105,8 @@ système de contrôle![new] [bold]Edge[normal]: La vache, c'est ÉNORME![new] [bold]FuSoYa[normal]: Avant d'attaquer le système de contrôle, nous devons détruire le -système de défense, sinon, il se -réparera tout seul![end] +système de défense, sinon, il se réparera +tout seul![end] [bold]Cecil[normal]: On a réussi![new] [bold]Edge[normal]: Il est arrêté![end] @@ -148,13 +147,13 @@ frère... ...[new] [bold]Golbez[normal]: Tu es mon....[new] [bold]Cecil[normal]: Mais l'inverse aurait pu se produire... -J'aurais pu avoir été utilisé pour faire -le mal...[new] +J'aurais pu avoir été utilisé pour faire le +mal...[new] J'étais un chevalier noir...[new] [bold]Golbez[normal]: ...mais nos âmes ont été pesées... -Tu as renoncé au mal, alors j'ai été -jugé ouvert à...[new] +Tu as renoncé au mal, alors j'ai été jugé +ouvert à...[new] Zémus!!![end] [bold]Cecil[normal]: Où vas-tu!?[new] @@ -186,14 +185,14 @@ C'est mauvais, ça![new] [bold]Cecil[normal]: .....[end] [bold]Edge[normal]: Mais qu'est-ce que tu fous!?[new] -[bold]Rydia[normal]: Comment on va sortir d'ici!? +[bold]Rydia[normal]: Comment on va sortir d'ici!?[new] «Par ici!»[end] [bold]Rosa[normal]: Caïn![new] [bold]Edge[normal]: On marche pas, cette fois![end] -[bold]Caïn[normal]: J'ai enfin repris le contrôle -de moi-même. +[bold]Caïn[normal]: J'ai enfin repris le contrôle de +moi-même. Mon esprit restait prisonnier de mes mauvaises actions...[new] Je ne peux pas vous demander de me @@ -238,8 +237,8 @@ Reste ici et sois une gentille petite fille![new] [bold]Rydia[normal]: ...J'espère pour toi que tu plaisantes, parce que sinon je n'aimerais pas du tout être à ta place.[new] -Laisse-moi te dire ce que je ferais à -un porc qui me parlerait comme ça. +Laisse-moi te dire ce que je ferais à un +porc qui me parlerait comme ça. Je mettrais fin à sa période de fertilité vite fait bien fait.[end] @@ -258,8 +257,8 @@ Bon sang, tu vas me manquer.[end] [bold]Rosa[normal]: ....[new] [bold]Cecil[normal]: Écarte-toi de mon chemin...[new] [bold]Rosa[normal]: Non! -Tant que tu ne me prends pas avec -toi, je ne bouge pas d'un pouce.[new] +Tant que tu ne me prends pas avec toi, +je ne bouge pas d'un pouce.[new] [bold]Cecil[normal]: Quoi!! Rosa! C'est dangereux, là dehors![new] @@ -325,8 +324,8 @@ de puissance.... La Planète Bleue a tant évolué pendant que nous dormions?[new] [bold]Edge[normal]: Ha! -Si on écoute Rydia, je pourrais -être le chaînon manquant...[end] +Si on écoute Rydia, je pourrais être +le chaînon manquant...[end] [bold]Ancien[normal]: Toi! C'est toi, le chevalier noir! @@ -361,9 +360,9 @@ Il semble que le destin ait choisi de te faire subir cette épreuve. Et le destin t'a ramené ici...[new] Tu cherches à détruire une immense -noirceur... mais tant que tu te fieras à -la lame noire, tu ne pourras pas vaincre -le mal véritable.[new] +noirceur... mais tant que tu te fieras à la +lame noire, tu ne pourras pas vaincre le +mal véritable.[new] Ton âme est entachée par la noirceur de tes actions... Le mal est comme un cancer.[new] @@ -381,13 +380,12 @@ amie, tu devras endurer cette épreuve... et être baigné dans la lumière purifiante de la rédemption au sommet...[new] Tu dois renoncer à ta lame moire et -recevoir le pouvoir du chevalier sacré... -le paladin! +recevoir le pouvoir du chevalier sacré... le +paladin! Sois averti, néanmoins.[new] Nombreux sont ceux qui ont tenté de devenir paladin.[new] -[bold]Cecil[normal]: Ils ont essayé et ont -échoué?[new] +[bold]Cecil[normal]: Ils ont essayé et ont échoué?[new] [bold]Ancien[normal]: Oh, non. Ils ont essayé et sont morts... Mais tu sembles porter une grande @@ -428,10 +426,9 @@ continuâmes à dormir...[end] [bold]Edge[normal]: Une autre lune?[new] [bold]FuSoYa[normal]: Mais l'un des nôtres refusa -de dormir...[new] +de dormir... Il voulait purger votre planète de tout -être vivant pour pouvoir nous y -installer.[new] +être vivant pour pouvoir nous y installer.[new] [bold]Rydia[normal]: Quelle horreur...![new] [bold]FuSoYa[normal]: ...Il était un brillant mais impatient homme. @@ -439,9 +436,9 @@ Nous tentâmes de le raisonner, mais il ne voulut pas nous écouter.[new] Au lieu de cela, il devint amer et rancunier...[new] -Il créa la Tour de Bab-Ilu afin de -donner à l'humanité l'outil pour se -détruire d'elle-même.[new] +Il créa la Tour de Bab-Ilu afin de donner +à l'humanité l'outil pour se détruire +d'elle-même.[new] C'est alors que je forçai cet homme à dormir, mais son esprit était toujours éveillé.[new] @@ -457,8 +454,7 @@ dont l'âme est noire...[end] qu'un pantin?![new] [bold]Edge[normal]: Qui est ce type!?[new] [bold]FuSoYa[normal]: Son nom est Zémus...! -Les cristaux sont notre source -d'énergie.[new] +Les cristaux sont notre source d'énergie.[new] Zémus, ce sachant, usa de la puissance des cristaux pour mettre en marche l'ascenseur dimensionnel de la tour de @@ -541,8 +537,8 @@ soutenir, chérissant les idéaux de vertu, de confiance, et d'honneur, jamais il ne triomphera.[new] [bold]Edge[normal]: Prêche toujours, mon frère! -J'en fais mon devoir personnel, d'être -un monument de vertu![end] +J'en fais mon devoir personnel, d'être un +monument de vertu![end] [bold]Rydia[normal]: Monument de vertu! Mais de quoi tu parles!?[new] @@ -598,8 +594,7 @@ homme... brisé... vaincu...et repentant.[new] Peut-être... pourrai-je soulager dans le sommeil le tourment de mon âme...[end] -[bold]FuSoYa[normal]: Il nous faut à présent -partir... +[bold]FuSoYa[normal]: Il nous faut à présent partir... Je prie pour la paix sur la Planète Bleue.[end] @@ -636,8 +631,8 @@ braves![new] Cecil avait besoin que je lance mon puissant sort[new] «Gel»[new] -... [delay][0x18] Il a dit que j'étais bien plus -héroïque que lui...[new] +... [delay][0x18] Il a dit que j'étais bien plus héroïque +que lui...[new] Ah, je peux lire au fond de tes yeux que tu le penses aussi... [delay][0x18] Qu'est-ce que tu dirais de trouver un coin plus @@ -651,8 +646,8 @@ impressionnant...?[delay][0x10][close_window][end] mon... heu... Bâton de Feu![new] [bold]Porom[normal]: Ouais, je parie... -Notre ancien est vraiment furieux -après toi! +Notre ancien est vraiment furieux après +toi! Allez![delay][0x10][close_window][end] [bold]Ancien[normal]: Combien de fois devrai-je te @@ -736,12 +731,12 @@ plus importante, pourtant...[delay][0x10][close_window][end] «Chante-nous une autre chanson sur le paladin!»[new] [delay][0xc] -[bold]Edward[normal]: Pas tant que vous n'avez -pas fini le travail d'aujourd'hui. +[bold]Edward[normal]: Pas tant que vous n'avez pas +fini le travail d'aujourd'hui. Ne voulez-vous pas reconstruire notre château? [delay][0x8][new] -«Ha là là... Mais il n'y a plus de -monstres! »[new] +«Ha là là... Mais il n'y a plus de monstres! +»[new] [delay][0x8] [bold]Edward[normal]: C'est ce que le paladin a fait pour nous.[new] @@ -753,10 +748,10 @@ et papas tombent malades et meurent. [delay][0x11] Voilà pourquoi nous devons reconstruire notre château.[new] Et nous avons besoin de l'aide de tout -le monde aide, même vous, petits -enfants. [delay][0x11] Dites-vous... qu'après avoir fini -votre travail, je vais vous chanter une -chanson super-spéciale! [delay][0x10][close_window][end] +le monde aide, même vous, petits enfants. +[delay][0x11] Dites-vous... qu'après avoir fini votre +travail, je vais vous chanter une chanson +super-spéciale! [delay][0x10][close_window][end] «D'accord! Souviens-toi, tu as promis!»[new] [delay][0x8][close_window][end] @@ -796,8 +791,8 @@ Fabul sa gloire passée! [delay][0xd][close_window][end] Lali-Ho![delay][0x10][close_window][end] [bold]Giotto[normal]: Bien! -Mettons-nous au travail et restaurons -ce château! [delay][0x18][close_window][end] +Mettons-nous au travail et restaurons ce +château! [delay][0x18][close_window][end] «Majesté! Nous n'avons pas assez de matières premières pour ça, Lali!»[new] @@ -892,10 +887,10 @@ On se dépêche![new] Prends...Prends ceci! Utilise...le![end] -[bold]Rosa[normal]: Ça faisait tellement -longtemps que nous n'avions pas vu tout -le monde. [delay][0x18] Ils devraient arriver à partir -de maintenant![new] +[bold]Rosa[normal]: Ça faisait tellement longtemps +que nous n'avions pas vu tout le monde. +[delay][0x18] Ils devraient arriver à partir de +maintenant![new] Cecil, dépêche-toi, toi aussi![new] [bold]Cecil[normal]: J'arrive, Rosa.[delay][0x18][close_window][end] @@ -944,8 +939,7 @@ tout le monde à Cecil![end] [bold]Yang[normal]: M. Cecil...![end] -[bold]Edward[normal]: Montrez-nous le vrai -courage![end] +[bold]Edward[normal]: Montrez-nous le vrai courage![end] [bold]Cid[normal]: On t'attend tous!![end] diff --git a/text/fr/bank2.xml b/text/fr/bank2.xml index 6f9fc6a..04d9ea0 100644 --- a/text/fr/bank2.xml +++ b/text/fr/bank2.xml @@ -18,13 +18,13 @@ C'était vous, ce chevalier noir! Ce que vous êtes splendide, maintenant![end] J'ai un mauvais pressentiment à propos de Mist...[end] -Un moine étranger a été placé à la -tête des gardes. +Un moine étranger a été placé à la tête +des gardes. J'ai entendu dire qu'il recherchait quelqu'un.[new] Il doit être à l'auberge...[end] -J'ai entendu dire que le roi a été tué -et remplacé par un monstre. +J'ai entendu dire que le roi a été tué et +remplacé par un monstre. Et il n'a pas non plus d'héritier...[end] Ouah, c'est un chevalier noir! Effrayant! @@ -39,8 +39,8 @@ ville? Elle donne sur une voie navigable souterraine qui mène au château.[new] Mais maintenant elle est scellée.[end] -C'est la première fois depuis la -fondation de Baron qu'on n'a pas de roi...[end] +C'est la première fois depuis la fondation +de Baron qu'on n'a pas de roi...[end] Le chevalier noir! Non...m-m-monsieur, je n'ai rien dit contre le roi! @@ -51,8 +51,8 @@ dernièrement,... Et je n'ai pas le droit de danser. Déçu?[end] C'était vous, ce chevalier noir! -Vous êtes bien mieux sans cette -armure lugubre et toute pleine de sueur! +Vous êtes bien mieux sans cette armure +lugubre et toute pleine de sueur! Allez, dansons![end] Non seulement ce feu mystérieux a tué @@ -65,8 +65,8 @@ sous le château de Baron... On dit que son épée tue ses ennemis d'un seul coup![end] Nous, les invocateurs, avons la capacité -de faire venir des montres du monde -des Chimères...[new] +de faire venir des montres du monde des +Chimères...[new] Un endroit qui se trouverait loin sous la surface de la Terre.[end] @@ -111,8 +111,8 @@ cause de toi?[end] Oh, bonjour Palom et Porom. La Montagne de l'Épreuve se situe à l'est.[end] -J'ai senti que tu peinais sous le poids -de tes péchés... +J'ai senti que tu peinais sous le poids de +tes péchés... Je prierai pour toi aussi.[end] Je n'ai rien à te dire! Fiche-moi la paix![end] @@ -128,8 +128,8 @@ N'oublie pas l'esprit du paladin.[end] Sale fumier! T'en as du cran de venir ici![end] Nombreux sont ceux qui se sont -mesurés à la Montagne de l'Épreuve, -mais aucun n'en est jamais revenu.[end] +mesurés à la Montagne de l'Épreuve, mais +aucun n'en est jamais revenu.[end] Ça ne veut pas dire que je t'ai pardonné![end] Oh! @@ -164,8 +164,8 @@ Une tourte à la sauterelle, alors?[end] Nous extrayons le minerai de mithril, les grenouilles le raffinent, et les nabots le forgent.[new] -Nous faisons même des armes que -vous, les humains, pouvez utiliser![end] +Nous faisons même des armes que vous, +les humains, pouvez utiliser![end] J'ai fait une longue route depuis la Montagne de Mithril au nord. Même si vous pouvez y aller en une @@ -201,8 +201,8 @@ envoyer ta voix très loin![end] .... Laissez-moi tranquille. Je prends un bain de soleil![end] -On extrait des joyaux dans la grotte -au nord. +On extrait des joyaux dans la grotte au +nord. Par contre, on ne peut pas porter de métal du tout.[new] Il devient vraiment très lourd...[end] @@ -266,8 +266,8 @@ C'est... c'est Cecil des Ailes Rouges! Je n'ai rien fait de mal! Je paie toujours la totalité de mes impôts à temps![end] -Les soldats du château font ce que -bon leur semble au bar![end] +Les soldats du château font ce que bon +leur semble au bar![end] La ville a enfin retrouvé son esprit d'antan! Bon, retournons au travail![end] @@ -288,8 +288,8 @@ Mais vous êtes qui, vous!?[end] [bold]Cid[normal]: Zzz...Zzz... J'ai fini le nouveau modèle de moteur! rrron...rrron...[end] -[bold]Cid[normal]: Papa a encore passé une -nuit blanche! +[bold]Cid[normal]: Papa a encore passé une nuit +blanche! Il se croit encore jeune....[new] Et en plus, tout le monde en ville peste contre les soldats et le roi, mais il y a @@ -341,8 +341,8 @@ Et tu as combattu aux côtés de papa en tant que mage blanc, autrefois![new] [bold]Mère de Rosa[normal]: ... Rosa... -Ton père... c'était un grand chevalier... -je comprends...[new] +Ton père... c'était un grand chevalier... je +comprends...[new] Cecil, prends bien soin d'elle.[end] T[end] @@ -380,7 +380,7 @@ Tu te rends compte...tous ces joyaux..![end] Une fille de Baron s'est effondrée juste à l'entrée du village. Sa fièvre la faisait délirer et appelait -sans arrêt[new] +sans arrêt «Cecil, Cecil...»[new] .[end] Ainsi, tu es le Cecil qu'elle appelait. @@ -402,12 +402,12 @@ Reviens nous voir bientôt![end] Que veux-tu nous voler, cette fois![end] La Montagne de l'Épreuve? -Rien que[new] +Rien que «aller là-bas»[new] , ça ne veut rien dire![end] Ne pardonnez jamais le pillage baronien -qui nous a volé notre cristal et la vie -des nôtres![end] +qui nous a volé notre cristal et la vie des +nôtres![end] Je ne peux pas te croire... Tu es devenu...[end] Nos amis! @@ -452,10 +452,10 @@ Pas assez fort![end] T[end] T[end] -Feu, terre, eau, et vent sont la base -de toute chose.[end] -Méthodes de respiration pour faire de -la magie noire.[end] +Feu, terre, eau, et vent sont la base de +toute chose.[end] +Méthodes de respiration pour faire de la +magie noire.[end] Mon premier «Soin»[end] T[end] @@ -484,8 +484,8 @@ le destin.[end] Palom, ça ne va pas recommencer![end] [bold]Garçon[normal]: Alors c'est toi le mec de Baron, hein? -Le vieux m'a dit de t'aider, il faut -croire que je n'ai pas le choix.[new] +Le vieux m'a dit de t'aider, il faut croire +que je n'ai pas le choix.[new] Sois-m'en reconnaissant![end] [bold]Porom[normal]: Vous êtes M. Cecil, n'est-ce pas? @@ -676,8 +676,8 @@ par les tremblements de terre.[end] Ma grand-mère est la doyenne du village. Elle sait tout![end] -Nos ancêtres sont venus du grand -trou, dans les montagnes au nord.[new] +Nos ancêtres sont venus du grand trou, +dans les montagnes au nord.[new] Mais maintenant le trou est bouché et on ne peut y aller, ni par la terre, ni par les airs.[end] @@ -713,9 +713,9 @@ Golbez?[end] Vous partez tôt demain matin, n'est-ce pas? Reposez-vous bien cette nuit.[end] -Jusqu'à ce que vous ayez accompli -votre mission, nous avons l'ordre de ne -pas vous laisser entrer dans le château![end] +Jusqu'à ce que vous ayez accompli votre +mission, nous avons l'ordre de ne pas +vous laisser entrer dans le château![end] Qui diable es-tu? Tu as un passe pour entrer?[end] Il se fait tard... @@ -765,8 +765,8 @@ On dirait que le patron fait comme à son habitude, non?[end] Quoi, on doit ENCORE passer une nuit blanche sur ce projet? -Si ce n'était pas un soudard pareil, on -y prendrait du plaisir.[new] +Si ce n'était pas un soudard pareil, on y +prendrait du plaisir.[new] Ah! N...ne le dis pas au patron! D...dis-lui que... heu... le travail, c'est @@ -812,16 +812,14 @@ dans le château.[end] T[end] Les Clercs sont les dignes messagères de Dieu. -Veuillez vous comporter -convenablement.[end] +Veuillez vous comporter convenablement.[end] T[end] T[end] -Tu devrais prendre le trésor dans -cette salle pour t'aider à vaincre les -Chimères.[new] +Tu devrais prendre le trésor dans cette +salle pour t'aider à vaincre les Chimères. Si tu presses l'interrupteur, la porte s'ouvrira.[end] J'ai entendu des complaintes venant de @@ -848,8 +846,8 @@ démon..?[end] [bold]Beigan[normal]: Quoi!? Où!?[end] [bold]Palom[normal]: Rha là là! -On ne peut pas sortir et faire -confiance à tout le monde![new] +On ne peut pas sortir et faire confiance +à tout le monde![new] [bold]Cecil[normal]: Beigan aussi..? Combien de gens de Baron Golbez contrôle-t-il..?!![end] @@ -867,12 +865,11 @@ Le village de Mist est au nord-ouest de Baron. On dit qu'il est toujours couvert d'une épaisse nappe de brouillard.[end] -Nous défendrons le château au nom -des chevaliers dragons![end] +Nous défendrons le château au nom des +chevaliers dragons![end] Si le capitaine des chevaliers dragons -Caïn et Cecil font équipe, -cette bague est sûre d'arriver à bon -port![end] +Caïn et Cecil font équipe, cette +bague est sûre d'arriver à bon port![end] M. Caïn est intouchable![end] On dit beaucoup de choses sur sa majesté, mais si elle entendait ça...[end] @@ -882,8 +879,9 @@ quand vous serez partis![end] Tu n'arrives pas à dormir?[end] [bold]Cecil[normal]: C'est là!?[new] [bold]Cid[normal]: Ouaip, juste sous leur nez![end] -Si tu évaluais ta vie, tu ne devrais pas -commencer à te faire des idées.[end] +va Aïe abîme paraît Si tu évaluais ta +vie, tu ne devrais pas commencer à te +faire des idées.[end] Même si j'avais réalisé que le roi avait changé, je n'ai rien dit, pour me protéger...[end] @@ -944,8 +942,7 @@ votre connaissance, monsieur. C'est dangereux, ici, alors il faudrait se hâter.[new] [bold]Cid[normal]: Hé! -Tu connais vraiment les bonnes -manières![end] +Tu connais vraiment les bonnes manières![end] [bold]Cecil[normal]: Cid, où est le nouveau modèle d'aéronef?[new] [bold]Cid[normal]: Héhéhé...[end] @@ -1013,8 +1010,8 @@ puisse diriger Baron![end] Ce boulot m'a laissé une mauvaise impression...[end] Golbez a pris les Ailes Rouges![end] -Les Ailes Rouges ont vraiment atteint -le fond![end] +Les Ailes Rouges ont vraiment atteint le +fond![end] Merde, alors! Si seulement on avait les aéronefs! J'en ai assez de m'asseoir par ici et de @@ -1086,9 +1083,8 @@ Hobs a été bloqué par une épaisse couche de glace apportée par les vents glaciaux.[end] [bold]Tellah[normal]: ....Qui est ce Golbez!?[new] -[bold]Edward[normal]: Il est venu à Baron il y a -peu et a pris le contrôle des Ailes -Rouges.[new] +[bold]Edward[normal]: Il est venu à Baron il y a peu +et a pris le contrôle des Ailes Rouges.[new] Tout ce que je peux imaginer, c'est qu'il les utilise pour rassembler les cristaux... sniff...[new] @@ -1112,8 +1108,8 @@ Alors fais comme les adultes...![new] T'es pas le seul à avoir perdu quelqu'un que tu aimes...[new] [bold]Cecil[normal]: Rydia...[end] -[bold]Edward[normal]: Tu as raison... je ne suis -qu'un minable! +[bold]Edward[normal]: Tu as raison... je ne suis qu'un +minable! Dans ce cas, je vais rester ici avec Anna pour toujours![new] Je me fiche bien de tout le reste![end] @@ -1182,9 +1178,8 @@ l'attaque et se repose dans sa chambre.[end] T[end] -J'ai entendu dire que vous avez été -pris en embuscade au sommet du mont -Hobs! +J'ai entendu dire que vous avez été pris +en embuscade au sommet du mont Hobs! Est-ce que vous allez bien?[end] Si seulement nous avions un aéronef, nous pourrions trouver un moyen pour @@ -1195,14 +1190,13 @@ Soyez prudents![end] Es-tu de retour de l'entraînement, maître Yang?[end] -Wow, ça, c'était une attaque de la -mort![end] +Wow, ça, c'était une attaque de la mort![end] Nous irons bien quoi qu'il arrive dans le château! Nous avons des Moines pour le défendre![end] -Je suis content que la ville de Fabul -soit dans le château. +Je suis content que la ville de Fabul soit +dans le château. Si nous avions été dehors, nous serions morts, à l'heure qu'il est![end] Maître Yang! @@ -1231,9 +1225,8 @@ Prends cette épée.[new] C'est l'épée d'un chevalier noir qui a est passé il y a longtemps.[new] C'est le moins que je puisse faire pour -te remercier d'avoir défendu Fabul. -...Mais c'est toujours une épée de -l'obscurité...[new] +te remercier d'avoir défendu Fabul. ...Mais +c'est toujours une épée de l'obscurité...[new] Elle se montrera inutile contre le mal véritable. Vaincs Golbez![end] @@ -1259,8 +1252,8 @@ somme dans le lit du roi![end] Si seulement j'avais autant de puissance magique que Rosa...[end] Tue....ce Golbez![end] -Des monstres faisaient partie de -l'armée de Baron![end] +Des monstres faisaient partie de l'armée +de Baron![end] [bold]Femme[normal]: Ah, bienvenue à la maison![new] [bold]Yang[normal]: C'est ma femme. @@ -1270,8 +1263,8 @@ Lui et ses amis m'ont sauvé la vie.[new] Au fait, chéri, penses-tu vraiment que ce soit le moment de traîner par ici?[end] [bold]Femme de Yang[normal]: Tu es sauf![new] -[bold]Yang[normal]: Grâce à ces gens, Fabul a -été sauvée.[new] +[bold]Yang[normal]: Grâce à ces gens, Fabul a été +sauvée.[new] [bold]Femme de Yang[normal]: Vous avez beaucoup fait pour nous. Nous vous remercions du fond du cur...[new] @@ -1302,15 +1295,14 @@ l'Amour![end] [bold]Yang[normal]: Yang?! Il est sous terre?[end] [bold]Yang[normal]: Désolée, je suis bloquée ici à -faire les travaux ménagers tout le -temps.[new] +faire les travaux ménagers tout le temps. C'est tout ce que j'ai pour vous remercier, mais ça pourrait bien servir.[end] [bold]Yang[normal]: Obtenu le Hachoir à Viande![end] [bold]Yang[normal]: Ne vous inquiétez pas pour moi! -Dites à Yang de se remettre vite -et de se battre pour l'avenir du monde![new] +Dites à Yang de se remettre vite et +de se battre pour l'avenir du monde![new] Et...que je l'aime.[end] T[end] @@ -1344,8 +1336,8 @@ des femmes.[end] Je ne suis pas qu'une vieille femme! Je suis le premier ministre! Les Clercs sont dans la salle intérieure.[end] -Un survivant de Damcyan a été jeté -sur le rivage il y a peu de temps. +Un survivant de Damcyan a été jeté sur +le rivage il y a peu de temps. Il dit que c'était le prince, ou quelque chose comme ça...[end] T[end] @@ -1354,8 +1346,8 @@ Si nous entrons en guerre, que devrons nous faire pour protéger notre pays?..[end] Les clercs sont huit surs. -Des générations durant, elles ont été -les gardiennes du cristal.[end] +Des générations durant, elles ont été les +gardiennes du cristal.[end] Le cristal de la terre a comblé Troia avec les bénédictions de la nature. Si nous perdons le cristal, cette région @@ -1368,28 +1360,27 @@ Comme promis, nous allons vous prêter le cristal de la terre.[end] Le cristal de la terre a été pris? Mon Dieu![end] -L'Elfe Noir est faible contre les armes -de métal.[new] +L'Elfe Noir est faible contre les armes de +métal.[new] Pour protéger ce point faible... il a -augmenté le champ gravitationnel dans -sa grotte.[end] +augmenté le champ gravitationnel dans sa +grotte.[end] Nous te confions le cristal. Prends-en soin![end] -Dire qu'un homme maléfique est en -train de réunir les cristaux![end] +Dire qu'un homme maléfique est en train +de réunir les cristaux![end] L'Elfe Noir vit dans la grotte au nord-est.[end] Quelle était cette voix!?[end] Le cristal a été volé? Ne restez pas comme ça, rapportez-le![end] -Si vous pouvez récupérer le cristal, -nous promettons que nous vous le -prêterons. +Si vous pouvez récupérer le cristal, nous +promettons que nous vous le prêterons. Mais d'abord, ramenez-le ici.[end] Prenez le trésor qui est à la cave.[end] -Golbez mettant les mains sur le -cristal est bien pire que ce qui va -arriver à Troia sans lui![end] +Golbez mettant les mains sur le cristal +est bien pire que ce qui va arriver à +Troia sans lui![end] Si vous portez des armes et des armures de métal dans la grotte qui se trouve au nord-est, Vous ne pourrez @@ -1397,8 +1388,8 @@ même pas bouger![end] Et nous venons juste de le récupérer! Je suppose qu'il n'y a pas le choix. Nous ne faisons que vous le prêter![end] -Les cristaux ont été éparpillés de par -le monde pour être sûrs que de telles +Les cristaux ont été éparpillés de par le +monde pour être sûrs que de telles choses n'arrivent jamais.[end] Nous ne pouvons pas vous donner le cristal de la terre... @@ -1411,8 +1402,8 @@ cristaux acquerra une puissance incroyable.[end] Le cristal de la terre? Il a été volé par l'Elfe Noir.[end] -Le pouvoir du cristal varie suivant qui -le possède! +Le pouvoir du cristal varie suivant qui le +possède! Si une personne maléfique l'avait, cela pourrait avoir de terribles répercussions![end] Si la rumeur disant qu'il y a plus de @@ -1465,8 +1456,7 @@ C'est la harpe de Edward...[end] C'était une prison souterraine, mais maintenant c'est notre salle au trésor.[end] -Tu sais très bien que c'est un -mensonge![end] +Tu sais très bien que c'est un mensonge![end] Alors prends le trésor.[end] Et tu espères entrer?[end] @@ -1542,15 +1532,15 @@ Si tu appuies sur droite, tu vas rester en garde![new] Aussi, si tu veux utiliser une arme en tant qu'objet dans un combat, -sélectionne[new] +sélectionne «Objet»[new] et déplace le curseur tout en haut pour sélectionner ton arme![new] Utilise ça pour changer d'arme ou refaire le plein de flèches, et la victoire est à toi![end] -Tu dois prendre rapidement des -décisions au cours des combats! +Tu dois prendre rapidement des décisions +au cours des combats! Ceux qui n'en sont pas sûrs devraient diminuer la vitesse de bataille![new] Ceux qui sont confiants en leurs @@ -1586,8 +1576,8 @@ combat, tu sélectionneras tous les ennemis... appuyer vers la droite sélectionnera tous tes alliés![new] Tu peux invoquer un sort sur ton -groupe entier de cette même manière -sur l'écran de menu![end] +groupe entier de cette même manière sur +l'écran de menu![end] T[end] @@ -1621,8 +1611,8 @@ Rentrez à Kaïpo![end] [bold]Tellah[normal]: Nous sortirons par ici. Le monstre se trouve au-dessous de la chute d'eau qui nous attend![new] -Il serait avisé de nous reposer dans -une tente dehors, juste au cas où![end] +Il serait avisé de nous reposer dans une +tente dehors, juste au cas où![end] T[end] @@ -1695,8 +1685,7 @@ avons été attaqués par des hordes de monstres.[new] Mes hommes... tués... tous...je suis le seul survivant...[new] -[bold]Cecil[normal]: Nous faisons route vers -Fabul.[new] +[bold]Cecil[normal]: Nous faisons route vers Fabul.[new] [bold]Rosa[normal]: Un dénommé Golbez se sert de Baron pour rassembler les cristaux...[end] @@ -1772,8 +1761,8 @@ Enfer! Héhéheh!»[end] [bold]Cecil[normal]: Palom! Porom![end] [bold]Palom[normal]: Ç'a été marrant, mon pote![new] -[bold]Porom[normal]: J'ai été honorée de -combattre à vos côtés![new] +[bold]Porom[normal]: J'ai été honorée de combattre +à vos côtés![new] [bold]Tellah[normal]: Que faites-vous, tous les deux![new] [bold]Palom[normal]: Nous ne pouvons pas vous @@ -1873,8 +1862,8 @@ Mythidia, alors tu ne peux pas l'utiliser.[end] Cagnazzo... Il est devenu bien plus fort.[new] [bold]Caïn[normal]: À propos du dernier cristal...[new] -[bold]Golbez[normal]: Je sais... ça va être délicat -de le récupérer où il est maintenant.[new] +[bold]Golbez[normal]: Je sais... ça va être délicat de +le récupérer où il est maintenant.[new] [bold]Caïn[normal]: Pourquoi n'envoies-tu pas Cecil le chercher pour toi?[new] [bold]Golbez[normal]: Je ne saisis pas très bien ce @@ -1894,9 +1883,9 @@ transmettre le message.[end] [bold]Caïn[normal]: Tu trouves encore que ton Cecil est supérieur à moi?[end] [bold]Cecil[normal]: Si on était arrivé ne -serait-ce qu'une seconde plus tard... -cette guillotine aurait tranché Rosa -en deux![end] +serait-ce qu'une seconde plus tard... cette +guillotine aurait tranché Rosa en +deux![end] Mon père a trouvé un étrange minerai ici. @@ -1999,8 +1988,8 @@ nouveau! Vous m'avez montré la puissance de ceux qui unissent leurs forces![new] Maintenant, préparez-vous![end] -[bold]Rubicante[normal]: Combattez-nous de -toute votre force![end] +[bold]Rubicante[normal]: Combattez-nous de toute +votre force![end] [bold]Scarmiglione[normal]: Seigneur Zémus![end] [bold]Cagnazzo[normal]: Non... C'est impossible...[end] @@ -2036,9 +2025,9 @@ C'est quoi, que tu veux?[end] soit à l'abri... elle l'est?[new] [bold]Caïn[normal]: Alors tu t'inquiètes vraiment pour ta petite pute, hein?[new] -Si tu veux la revoir... vivante... tu -devras l'échanger contre le cristal de la -terre de Troia.[new] +Si tu veux la revoir... vivante... tu devras +l'échanger contre le cristal de la terre de +Troia.[new] [bold]Cecil[normal]: Quoi!?[end] [bold]Tellah[normal]: Lâche![new] [bold]Caïn[normal]: Quand tu l'auras, je te @@ -2073,15 +2062,15 @@ T[end] Il ne reste plus beaucoup de vivres. Je me demande combien de temps nous pourrons tenir...[end] -Jeune maître, montre-nous ton -Ninjutsu ultime![end] +Jeune maître, montre-nous ton Ninjutsu +ultime![end] Nous tiendrons ici jusqu'à ce que le jeune maître rentre![end] Notre jeune maître est parti seul en avant![end] -Quand le jeune maître se met en -colère, il devient très puissant...[end] +Quand le jeune maître se met en colère, +il devient très puissant...[end] Arrêtez notre jeune maître...[end] Notre jeune maître est parti à la @@ -2119,8 +2108,8 @@ Tiens bon, chérie![end] D'où sont venus des monstres comme ça?[end] Cet enfant est désespérant...[end] -Le jeune maître a dit qu'il allait tuer -les méchants! +Le jeune maître a dit qu'il allait tuer les +méchants! On va bientôt pouvoir rentrer au château, hein?[new] Hein?[end] @@ -2287,8 +2276,8 @@ C'est dégoûtant![end] C'est la maison du meilleur forgeron du monde, maître Kukuro, Lali.[end] -Le maître n'a plus le cur à l'ouvrage, -et passe son temps à dormir, Lali.[end] +Le maître n'a plus le cur à l'ouvrage, et +passe son temps à dormir, Lali.[end] Le maître a été vraiment occupé, Lali![end] Je vais devenir un forgeron aussi talentueux que le maître!![end] @@ -2297,8 +2286,8 @@ vite!? Ne sois pas si impatient![end] C'est fait! L'épée sacrée Excalibur! -Utilise-la avec tout ton esprit, corps, -et âme![new] +Utilise-la avec tout ton esprit, corps, et +âme![new] Tu as obtenu Excalibur![music][0x29][delay][0xc][end] Grâce à toi, j'ai enfin retrouvé le cur à l'ouvrage.[end] @@ -2317,8 +2306,8 @@ elle était neuve![end] Tu as donné l'Épée Légendaire.[end] Zzz....[end] -Il y a des Sylphes dans la grotte qui -est loin dans le nord-ouest![end] +Il y a des Sylphes dans la grotte qui est +loin dans le nord-ouest![end] Les Sylphes sont si timides! Malgré que nous soyons gentils![end] @@ -2363,8 +2352,7 @@ Vous ne les avez pas vues?[end] La force des chars est la principale force des Nains! -Nous ne serons pas vaincus si -facilement![end] +Nous ne serons pas vaincus si facilement![end] Le roi a été vraiment très gentil avec Luca depuis que la reine est morte![end] Lali-ho! @@ -2508,8 +2496,8 @@ utiliser?[end] C'est l'infirmerie![end] Parfois, même les nains se blessent![end] -Cet homme est vraiment énergique -pour un vieux râleur![end] +Cet homme est vraiment énergique pour +un vieux râleur![end] Quel vieux grincheux! Il ne fait rien et se plaint de la nourriture, mais il mange comme quatre![end] @@ -2599,10 +2587,9 @@ paix...[new] [bold]Docteur[normal]: Qui est là!!?[end] [bold]Caïn[normal]: Qu'est-ce que ça peut faire? Tu ferais mieux d'appeler de l'aide, doc. -Rubicante n'est pas là pour te -protéger![end] -[bold]Docteur[normal]: Vous ne me prenez -vraiment que pour un souffreteux? +Rubicante n'est pas là pour te protéger![end] +[bold]Docteur[normal]: Vous ne me prenez vraiment +que pour un souffreteux? C'est moi le cerveau de toute cette opération![new] Je suis Lugeie! @@ -2643,10 +2630,9 @@ combats.[new] S'il y en a un que tu préfères, dis-moi lequel![end] [bold]Masanori Hoshino[normal]: Je suis Taka, le -metteur de Points![new] -Dès que j'aurai fini ce jeu, je -deviendrai probablement un Super -Pointeur![end] +metteur de Points! +Dès que j'aurai fini ce jeu, je deviendrai +probablement un Super Pointeur![end] [bold]Masanori Hoshino[normal]: Graphismes -[new] [bold]Ryuko Tanaka[normal]: Ce sera ma toute dernière production. @@ -2660,8 +2646,8 @@ Vous pouvez compter sur moi![end] -[new] [bold]Keitaro Adachi[normal]: Héhé... On ne sue pas, on ne sue pas![end] -[bold]Nouveau Toshio Endo[normal]: Mon épaule -est bloquée! +[bold]Nouveau Toshio Endo[normal]: Mon épaule est +bloquée! J'ai mal aux yeux! J'ai mal aux oreilles![end] [bold]Nouveau Shinichi Tanaka[normal]: ... @@ -2676,8 +2662,8 @@ de là! Je n'ai rien volé!![end] [bold]Kyoji Koizumi[normal]: Heh... Si tu sais dès le début que tu n'as pas -de vacances, faire des jeux, ce n'est -pas si mal![new] +de vacances, faire des jeux, ce n'est pas +si mal![new] Vous ne trouvez pas, Monsieur Sakaguchi?[end] @@ -2717,8 +2703,8 @@ Vache, je risque de devoir lâcher l'université![end] [bold]Ken Narita[normal]: Zzz..Zzz..[end] -[bold]FuSoYa[normal]: Maintenant, entrons tant -que c'est possible![end] +[bold]FuSoYa[normal]: Maintenant, entrons tant que +c'est possible![end] [bold]Cecil[normal]: Aide-nous, Cid![end] «Wahaha! Crevez, nains @@ -2824,20 +2810,19 @@ Ces gens sont tes amis?[end] Ne repars plus jamais![end] Shh!! -Silence, vous êtes dans une -bibliothèque![end] +Silence, vous êtes dans une bibliothèque![end] Hmm....vais-je aimer ce livre...je me le demande?[end] Le géant qui secoue la terre, Titan... Avec sa force, il déchire la terre... et -toutes les créatures seront aspirées -dans l'abîme qu'il aura créé.[end] +toutes les créatures seront aspirées dans +l'abîme qu'il aura créé.[end] Le démon du Feu, Ifrit... On dit que son feu peut consumer n'importe quoi.[end] -Il paraît qu'il y a des magies -d'invocation dont personne n'a encore -entendu parler...[end] +Il paraît qu'il y a des magies d'invocation +dont personne n'a encore entendu +parler...[end] Le doux vieil homme Ramuh... Long à la colère, prompt à juger... Il appelle des nuages de tempêtes et de @@ -2871,11 +2856,10 @@ monde des humains?[end] On ne s'ennuie jamais, ici. Il y a tellement de livres qu'il faudrait une éternité pour tous les lire![end] -Pour les monstres sur lesquels[new] +Pour les monstres sur lesquels «Épier»[new] ne marche pas... le Dictionnaire des -Monstres montrera leur véritable -nature....[end] +Monstres montrera leur véritable nature....[end] Chimère, Monstre, Humain... D'où sont-ils venus et où vont-ils.... Le mystère de l'éternité...[end] @@ -2885,9 +2869,8 @@ Maintenant, il dort au fond du ventre d'un dragon.[end] Pour celui qui surpasse le roi Chimère... Il est dit qu'il existe un dieu Chimère qui -nous a créés et qui nous protège de -loin.[new] -Il ne connaît pas la défaite... +nous a créés et qui nous protège de loin. +Il ne connaît pas la défaite...[new] Seule sa propre puissance retournée contre lui pourrait lui faire du mal...[end] Il y a deux lunes... @@ -2901,8 +2884,8 @@ Seuls ceux qui peuvent la surpasser pourront voir la vraie forme du roi...[end] Le roi Chimère... Il est apparu dans l'océan du nord. -On dit de lui qu'il est maître des -océans et sans rival.[end] +On dit de lui qu'il est maître des océans +et sans rival.[end] Odin, le chevalier des grands guerriers du passé...[new] La seule fois qu'il a jamais été vaincu, @@ -2914,14 +2897,13 @@ canalisent l'énergie vitale de leurs ennemis vers elles-mêmes....[end] La loi du Monde des Chimères... ...est d'avoir de la force et un cur pur... -Affirmez cette force, et testez leur -âme par un combat![end] +Affirmez cette force, et testez leur âme +par un combat![end] C'est la salle du roi et de la reine des Chimères.[end] Pour parler au roi Chimère, vous avez -besoin de la permission de la reine -Asura.[end] +besoin de la permission de la reine Asura.[end] Rydia... Tu as des amis forts et bienveillants. Tu peux m'appeler n'importe quand...[end] @@ -2966,8 +2948,8 @@ Si tu lances le sort Lévite, tu [bold]Yang[normal]: ...Combattez pour moi![end] [bold]Yang[normal]: AAH! Des humains!![end] -[bold]Yang[normal]: Laissez-nous nous occuper -de Yang![end] +[bold]Yang[normal]: Laissez-nous nous occuper de +Yang![end] [bold]Yang[normal]: Qu'est-ce que vous fichez ici! Dehors! Tout de suite![end] From f79afae14c3ca5f912adb01eac0195a0d8357d5e Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 15 Sep 2025 12:43:28 +0200 Subject: [PATCH 20/63] Translates save menu remaining strings. --- src/menus/start_screen_text.s | 5 +++++ src/new_game.s | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/menus/start_screen_text.s b/src/menus/start_screen_text.s index c03429d..69b9ab0 100644 --- a/src/menus/start_screen_text.s +++ b/src/menus/start_screen_text.s @@ -45,6 +45,11 @@ saves: .text 'Sauvegardes' .db 0 +save_completed: + move_to(8, 11) + .text 'Sauvegarde terminée' + .db 0 + did_not_save: move_to(1, 1) .text 'Annulation ' ; extra space at the end to clear the previous title. diff --git a/src/new_game.s b/src/new_game.s index 81315f2..6694d57 100644 --- a/src/new_game.s +++ b/src/new_game.s @@ -43,6 +43,11 @@ *=0x019826 load_system_menu_text_pointer(newgame.load_this_save) +; for save menu we use the same string. +*=0x01981E + load_system_menu_text_pointer(newgame.load_this_save) + + *=0x01982C load_system_menu_text_pointer(newgame.yes_no) @@ -63,12 +68,16 @@ *=0x019AC5 load_system_menu_text_pointer(newgame.empty_save) - *=0x01cbad load_system_menu_text_pointer(newgame.saves) -*=0x1cc12 - load_system_menu_text_pointer(newgame.did_not_save) +*=0x01e050 + menu_window(7,10,19,2) + +*=0x1cc0d + load_system_menu_text_pointer(newgame.save_completed) +*=0x1cc12 + load_system_menu_text_pointer(newgame.did_not_save) } From 2d2fc5ec3dc2dabfedfe16cda49a7014ae6bc734 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 15 Sep 2025 14:30:24 +0200 Subject: [PATCH 21/63] Changes lowercase g height its shadow is cased on the next char top line. --- fonts/book_vwf.png | Bin 835 -> 751 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fonts/book_vwf.png b/fonts/book_vwf.png index b090b027378da81c863b99c6d68588952486b857..60c92f66a0da38585c010b4e0634bde9052f99c1 100644 GIT binary patch delta 710 zcmV;%0y+J|2JZ!sHGcx6Nkl3c*Wo-v)k<&hJEZm zW7rPOZWx+A3XRWSWRTx+mOs*b%+O~*JTBlVLsPk`gNi|QnoWjj>ZJ3ymc$~NPrt%S z5=u?rzqAD#;P6`1J|}K?P(8&-Y|58 zYxjgLqJYj}h<`(MN4QRJTSz`T%Hf@GMFy0CLf(a;-xMwdqjPX#=f`Kq5%$!X2cA{{ za34xND#N{hati#r1>AKd=M@jRzizm)P6UJHgKD8BqKsnAAL+ z|Dtd7lMqrQm5oYIks|COm>m2C)DT9f89a1zpncG>On>6>MVur$4C7DPNPGY|EVi^D z?-;#EJFY} z7_x{#oDiQ9ZyTrD(pqZY*M_?`(A+9Cic6`t@P~1Y?RQMSTQeI%U$}G5s$(cIY5t6Ea+y)k6l;p?}?CK}+R9IK3yOjw25( zr41SM8Eo|9-rf1`dp1C&N|h?zq(oNFE-vb6;-s_TR|Aw%?Y8nzbWnLYINU}&WYELl z6$3}b+nr9#U>Ez(7;J{|b{NKe6dIquFd&aO&5tx6Gw3rwJSxCb22JIuHkvA`-E12V zEr2h)z_V>j_jC`2y0c3zeuEL<-6dnbm zGjI~;+egO{_SBgNJ*~LC`{jNgmBGD#GX>b#xO#M8f`4MNH1Q4~3dE~ulsk;DVWrHIR8Ok=sO`~NXl5Ht4I-c5aJy8m!O6)LamHdyd2Oj=mgVb ze4eDK4#VVwu|x=PP?WTa()$4ZHE{H+=j1{08UE!=P=aJFoG4_ATB0SWbqV~t5kzaz z8bqsy&wq`XGF|B0_dyvm9S|#uNO4*fbZt*&EXOGTTgAqh#X$z_7-x)(PEKftL0vqY ziaco$=(^TsAtj4W@J2rqOB-UfJhO^LIf#i9NPiN?#8cw3Nv18WrS^Rt=VaN?0L!4U zcw5%nKmNfqZa|saK2Iy9>$=jFgMk6#@wMoN0cN$lDoPT~bp|e6u9m;oh|jo#B@h=` z6V?K-W+o!buE6S%>q!}yvP4>&vL&rp1#itC(wp)oC@z81GN5t}YWyx~rAn15Rk}6$ Z2^8Zbjx+3S>DT}O002ovPDHLkV1g2+YQO*h From 07b7d1c89d66571acb319b48a4323a28d0ed4399 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 10:21:41 +0200 Subject: [PATCH 22/63] Fixes the quote in battle_message and place names. --- text/fr/battle_messages.xml | 4 ++-- text/fr/battle_text.xml | 10 +++++----- text/fr/places-names.xml | 14 +++++++------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/text/fr/battle_messages.xml b/text/fr/battle_messages.xml index 945ac3c..d5c2945 100644 --- a/text/fr/battle_messages.xml +++ b/text/fr/battle_messages.xml @@ -2,7 +2,7 @@ Le dragon a changé de forme en brouillard ![end] -Il reprend sa forme ! C'est le moment d’attaquer ![end] +Il reprend sa forme ! C'est le moment d'attaquer ![end] Le brouillard annule toutes les attaques ![end] @@ -368,7 +368,7 @@ La prochaine fois, je serai papa. Ahhh.[end] -C’est bon, non ?[end] +C'est bon, non ?[end] À plus, alors. Ahhh.[end] diff --git a/text/fr/battle_text.xml b/text/fr/battle_text.xml index 304b280..6eb9059 100644 --- a/text/fr/battle_text.xml +++ b/text/fr/battle_text.xml @@ -5,10 +5,10 @@ Attaque préventive ![end] Attaque surprise ![end] Attaque par-derrière ![end] - Il s’est enfui[end] + Il s'est enfui[end] Victoire en combat ![end] Je me souviens ![end] - Non, ce n’est pas ça[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] @@ -16,7 +16,7 @@ Chanson de séduction[end] Chanson du silence[end] Pas assez de potions.[end] - La prière n’a pas atteint le ciel[end] + La prière n'a pas atteint le ciel[end] La synchronisation est perturbée[end] Magie augmentée ![end] Monstre paniqué[end] @@ -56,6 +56,6 @@ 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] + “Peu à peu, l'énergie s'est épuisée et la force a disparu.[end] + Force concentrée, puissance d'attaque doublée ![end] diff --git a/text/fr/places-names.xml b/text/fr/places-names.xml index bc3c528..90bfedf 100644 --- a/text/fr/places-names.xml +++ b/text/fr/places-names.xml @@ -47,8 +47,8 @@ Underground Waterfall Château de Damcyan Donjon de Damcyan - Sous-sol de l’Antlion - Étage 1 - Nid de l’Antlion + Sous-sol de l'Antlion - Étage 1 + Nid de l'Antlion Mont Hobs - Ouest Summit Fabul @@ -68,12 +68,12 @@ Village de Toroia Salle de Développement Ferme de Chocobos Noirs - Village d’Agalt + Village d'Agalt Tour des Étoiles Observatoire Grotte du Pouvoir - Château d’Eblana - Grotte d’Eblana + Château d'Eblana + Grotte d'Eblana Tour de Babil - Niveau 1 Tour de Zott Bouche du Géant @@ -117,8 +117,8 @@ Cou du Géant Poitrine du Géant Estomac du Géant - Passage à l’intérieur du Géant - À l’intérieur du Géant + Passage à l'intérieur du Géant + À l'intérieur du Géant Poumon du Géant Système de Contrôle Grotte des Sélénites From a8279aa49fe2856faf70a60f6ad755bdc80b3bab Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 10:23:56 +0200 Subject: [PATCH 23/63] The menu vwf is now stored as 1bpp just like the dialog fonts. Kerning tables are not supported on the menu font. --- build.py | 56 +++++++++++++++++++++-------------------- fonts/8x8vwf.png | Bin 1442 -> 408 bytes fonts/8x8vwf2p.png | Bin 527 -> 0 bytes src/battle/message.s | 25 +++++------------- src/small_vwf/render.s | 13 +++++----- 5 files changed, 41 insertions(+), 53 deletions(-) delete mode 100644 fonts/8x8vwf2p.png diff --git a/build.py b/build.py index 8ad7993..566bfda 100755 --- a/build.py +++ b/build.py @@ -228,24 +228,23 @@ def build_vwf_font_asset_2bpp( def build_vwf_font_asset(font_file, has_grid, data_file, len_table_file, char_height, table): + converter = FontConverter(font_file, has_grid, char_height=char_height) + data_path = Path(data_file) - converter = FontConverter(font_file, has_grid, char_height=char_height, ) - - len_table, data = converter.convert_to_1bpp(width_overrides={ - 0xff: 3 if Path(data_file).stem == "font" else 5, + if data_path.stem == "menu_font": + overrides = { + 0xff: 3 + } + else: + overrides = { + 0xff: 3 if data_path.stem == "font" else 5, 0xfd: 1, 0xFE: 2, 0xA0: -1 - }) + } - # Espace - len_table[0xFF] = 3 - # Espace fine - len_table[0xFD] = 1 - # Espace insécable - len_table[0xFE] = 2 - len_table[0xA0] = len_table[0xA0] - 1 + len_table, data = converter.convert_to_1bpp(width_overrides=overrides) # Generate test pairs (common kerning candidates) known_pairs_to_kern = [] @@ -270,21 +269,22 @@ def build_vwf_font_asset(font_file, has_grid, data_file, len_table_file, char_he # Common letter combinations that might benefit common_pairs = ["rn", "fi", "fl", "ff", "tt", "ll"] known_pairs_to_kern.extend(common_pairs) - known_pairs_to_kern.extend(["ît", "aî", "va", "ïe", "în", "bî", "îm" - ""]) - - print(f"Testing {len(known_pairs_to_kern)} potential kerning pairs in {Path(font_file).stem}...") - # known_pairs_to_kern = ["Ta"] - # Find pairs that benefit from kerning - kerning_pairs = converter.find_kerning_pairs(table, known_pairs_to_kern) + known_pairs_to_kern.extend(["ît", "aî", "va", "ïe", "în", "bî", "îm"]) - def add_custom_kernings(text: str, advance: int) -> None: - chars = table.to_bytes(text) + if data_path.stem != "menu_font": + print(f"Testing {len(known_pairs_to_kern)} potential kerning pairs in {Path(font_file).stem}...") + # known_pairs_to_kern = ["Ta"] + # Find pairs that benefit from kerning + kerning_pairs = converter.find_kerning_pairs(table, known_pairs_to_kern) - kerning_pairs[(chars[0], chars[1])] = advance + def add_custom_kernings(text: str, advance: int) -> None: + chars = table.to_bytes(text) - add_custom_kernings("tt", 2) + kerning_pairs[(chars[0], chars[1])] = advance + add_custom_kernings("tt", 2) + else: + kerning_pairs = {} with open(data_file, "wb") as fd: @@ -296,6 +296,8 @@ def add_custom_kernings(text: str, advance: int) -> None: for (char1, char2), advance in kerning_pairs.items(): fd.write(struct.pack("BBB", char1, char2, abs(advance))) + fd.write(struct.pack("B", char_height)) + assets_builder = { "script": build_text_asset, @@ -305,7 +307,6 @@ def add_custom_kernings(text: str, advance: int) -> None: "nullterminated": build_null_terminated, "nullterminated_with_base": build_null_terminated_with_base, "vwf-font": build_vwf_font_asset, - "vwf-font-2bpp": build_vwf_font_asset_2bpp, } @@ -400,12 +401,13 @@ def build_assets(assets): dialog_table ), ( - "vwf-font-2bpp", - "fonts/8x8vwf2p.png", - True, + "vwf-font", + "fonts/8x8vwf.png", + False, "assets/menu_font.dat", "assets/menu_font_length_table.dat", 8, + menu_table ), ("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"), diff --git a/fonts/8x8vwf.png b/fonts/8x8vwf.png index b335041cd8070efd3b20054be6af3cee36c50882..af982811a6f07eea53a06d2a02c48083b631866b 100644 GIT binary patch literal 408 zcmV;J0cZY+P)vg-gIVPHrb_t`Kj}za?I_q*=XXl~kT+QBd20S$?6N+k+5+`=W9DESU*?BWhX zYPx+Ds50;-G_;%A?EA)_!N?%(D9mUyTLA3IAZH>mkfw*k7~E7n7&h4p9tRL%q@Ner z>H9{CQ~~JBX8)0Nm*zA03S&dZ3Xe_B1;DAC_LmSqo0!10A%T>1Lb#8l7oX5DJR7=B z2%oNy^8~6%ag87+8V~^NrD_2~AS`e|G)YZu4B7YLND(?fmAiDota@L7m9zk=-hl|% zYsU4BXOR7{HM;#=4yLi0+gd?;9uHo?{i6J(d-og9OZPnv=?Rkn0000v0|PTdfKP}k14G0A|Nj|6cLK#n z!DtAKv=F!;yH^9~XU+nT$YKTtz9S&aI8~cZ8YswK;_2(keveCxkI(#jQ_?gB1}0Na z7srr_TW@FH>^rQ$<68Uszr5`w6YehY1)gpfzkK0zoF=R<{`l7GO#AAapQ_I=D0L|O zic%7pWYNT-)DhtE2uLb8DRwG%C^WrTEfQ44zlHBl&$NqnH`W_oe)uhSnPiUmf4{fh zf)f|9hxGfbGmM`}8-{&D0-+g`C?sZ!NpP7o9 z-RkhEmvG;ux5>TeYygS-W1@zVB_7NJrc}9o37Abk2IWZJWGU+RA7}vnP9plej!j;2x8>DZIxo zrg6xBNqe;_BSm@gf1&mJ+}FDrTh;|{Tp{nS@x+Js=9HSqx5=lb`|&-|u6K>j`_>TM zIpukV$d}BQGu+?a@mV<`ZnLOH%j&&q+f-T2xU}cm1qRMP*LXtMRj_bl@0=Gu%BL2J z>^lF+$yAw3$;3j|a_QXD9p{a-H*nOR_cM@Qct+b*OT zKJ5WVL2`;a*UCM@i}cT!iWDjJeY?Be!s3_R3jf2Ce@Z-ys@@zX;o3Mn?HY>uBbBep|-pLw~F?gqYF=-m_B zn{&(aJO7|>ADg=gBw&Gc!#6^kOyq`(Nu@&k!nWkQXM3z~HM$k;*=TAI&erHs@rx$= zkoIl9vgym5qg$g8A}ty{QMhV{`c- zJ+P(fY~k4u**wW#bCv2qY2VCfDTr-cq7#wu*IPGtM(^Tl3%+lQ`$Dy$Z|>fpLoY{j zbE6{uBxlEkP%)ldo!yukB?b2D=EbZOBh|w8Ocx`pBDq;+rML+z@@t)$HA1pw&${Kj z5F$j+ci&sqj-dpiC)8J?^76gWX3^j`xq4hE5#pZgbuN9E2rJ5M`!JuV_Nix{Z2I() z<@?$gKa;KTZX@Jr5nh}0(CDY(QTklwYylR%lI7d{^{>y2E^`6@a6>~wKLN6QZfJKR Rt$Y9g002ovPDHLkV1nMo0S*8F diff --git a/src/battle/message.s b/src/battle/message.s index 6ac0255..985f8df 100644 --- a/src/battle/message.s +++ b/src/battle/message.s @@ -59,7 +59,6 @@ make_pointers: asl asl asl - asl adc 1,s tax pla @@ -99,7 +98,7 @@ _display_char: jsr.w make_pointers rep #0x20 - lda.w #0x0010 + lda.w #0x0008 sta.b counter sep #0x20 @@ -170,32 +169,20 @@ _mul_0: plx inx -_and_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 - bra _next_line _store: xba phx tyx - ora.l buffer_ptr, x - sta.l buffer_ptr, x + ora.l buffer_ptr + 1, x + sta.l buffer_ptr + 1, x xba - ora.l buffer_ptr + 0x10, x - sta.l buffer_ptr + 0x10, x + ora.l buffer_ptr + 0x10 + 1, x + sta.l buffer_ptr + 0x10 + 1, x txy plx iny + iny _next_line: dec.b counter diff --git a/src/small_vwf/render.s b/src/small_vwf/render.s index 781dbcb..de48c96 100644 --- a/src/small_vwf/render.s +++ b/src/small_vwf/render.s @@ -207,7 +207,6 @@ make_pointers: asl asl asl - asl clc adc 1, s tax @@ -237,7 +236,7 @@ display_char: jsr.w make_pointers rep #0x20 - lda.w #0x0010 + lda.w #0x0008 sta.b counter sep #0x20 @@ -286,15 +285,15 @@ _store: xba phx tyx - ora.l buffer_ptr, x - sta.l buffer_ptr, x + ora.l buffer_ptr + 1, x + sta.l buffer_ptr + 1, x xba - ora.l buffer_ptr + 0x10, x - sta.l buffer_ptr + 0x10, x + ora.l buffer_ptr + 0x10 + 1, x + sta.l buffer_ptr + 0x10 + 1, x txy plx iny - + iny dec.b counter bne char_line_loop From 8e180b0eedf31e29d531f042b090614a6874b537 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 10:24:33 +0200 Subject: [PATCH 24/63] render_kerned_string allows using an external width table. --- utils/font_converter.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/utils/font_converter.py b/utils/font_converter.py index 886be0e..06de40f 100644 --- a/utils/font_converter.py +++ b/utils/font_converter.py @@ -303,7 +303,7 @@ def compute_kerning(self, char1_index: int, char2_index: int, default_kerning: i return best_kerning - def render_kerned_string(self, text_bytes: bytes, default_kerning: int = 1) -> np.ndarray: + def render_kerned_string(self, text_bytes: bytes, default_kerning: int = 1, external_kerning_table: dict = None, external_width_table: bytes = None) -> np.ndarray: """ Render a string with optimal kerning between character pairs. @@ -322,12 +322,19 @@ def render_kerned_string(self, text_bytes: bytes, default_kerning: int = 1) -> n self._load_image() - # Get all character data and compute widths + # Get all character data and determine widths chars = [] char_widths = [] for char_index in text_bytes: char_data = self.get_char(char_index) - actual_width = self.get_max_width(char_data) + + if external_width_table is not None: + # Use width from external table (file-based) + actual_width = external_width_table[char_index] + else: + # Compute width from PNG (autohint) + actual_width = self.get_max_width(char_data) + chars.append(char_data[:, :actual_width]) char_widths.append(actual_width) @@ -342,7 +349,17 @@ def render_kerned_string(self, text_bytes: bytes, default_kerning: int = 1) -> n for i in range(len(text_bytes) - 1): char1_index = text_bytes[i] char2_index = text_bytes[i + 1] - kerning = self.compute_kerning(char1_index, char2_index, default_kerning) + 1 + + if external_kerning_table and (char1_index, char2_index) in external_kerning_table: + # Use external kerning table value (already includes the +1) + kerning = external_kerning_table[(char1_index, char2_index)] + 1 + elif external_kerning_table is not None: + # External kerning table provided but no entry for this pair - use default spacing + kerning = default_kerning + else: + # No external kerning table - use auto-generated kerning + kerning = self.compute_kerning(char1_index, char2_index, default_kerning) + 1 + kerning_values.append(kerning) total_width += kerning + char_widths[i + 1] From bdbbb6d38c60294ec4c04507688153163b533bc9 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 10:25:06 +0200 Subject: [PATCH 25/63] Fix format_bank font order. Properly handle font changes. --- format_bank_xml.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/format_bank_xml.py b/format_bank_xml.py index 6fb83f8..14b2e83 100755 --- a/format_bank_xml.py +++ b/format_bank_xml.py @@ -171,12 +171,12 @@ def __init__(self, text_metrics=None): try: table = Table("text/ff4fr.tbl") - # Use new interleaved format + # Use new interleaved format with correct font order font_files = [ - "assets/font.dat", - "assets/wicked_font.dat", - "assets/bold_font.dat", - "assets/book_font.dat" + "assets/font.dat", # Index 0: [normal] (fe 00) + "assets/wicked_font.dat", # Index 1: [wicked] (fe 01) + "assets/book_font.dat", # Index 2: [book/force_book] (fe 02) + "assets/bold_font.dat" # Index 3: [bold] (fe 03) ] self.text_metrics = TextMetrics(table, font_files, char_height=16) @@ -185,6 +185,13 @@ def __init__(self, text_metrics=None): self.text_metrics = None else: self.text_metrics = text_metrics + + # Initialize font state tracking + self.reset_font_context() + + def reset_font_context(self): + """Reset font context to default state for processing a new pointer.""" + self.current_font_index = 0 # Track current font index (0=normal, 1=wicked, 2=book, 3=bold) def parse(self, tokens): """Parse tokens and inject WINDOW_BREAK tokens for guillemet speech transitions.""" @@ -280,8 +287,8 @@ def _format_dialog(self, tokens): ) # Apply word wrapping to this sentence immediately - wrapped_sentence = self.text_metrics.word_warp( - sentence, WINDOW_WIDTH + wrapped_sentence, self.current_font_index = self.text_metrics.word_warp( + sentence, WINDOW_WIDTH, self.current_font_index ) # Check if adding this wrapped sentence would exceed 4-line limit @@ -325,12 +332,12 @@ def _format_dialog(self, tokens): wrapped_sentence ) else: - # Narrative sentence + # Narrative sentence - use current font context sentence = token.value - # Apply word wrapping to narrative sentences too - wrapped_sentence = self.text_metrics.word_warp( - sentence, WINDOW_WIDTH + # Apply word wrapping with current font context + wrapped_sentence, self.current_font_index = self.text_metrics.word_warp( + sentence, WINDOW_WIDTH, self.current_font_index ) # Apply same intelligent grouping for narrative using wrapped sentences @@ -384,7 +391,7 @@ def _format_dialog(self, tokens): accumulated_lines = 0 # Apply word wrapping to guillemet speech - wrapped_guillemet = self.text_metrics.word_warp(token.value, WINDOW_WIDTH) + wrapped_guillemet, self.current_font_index = self.text_metrics.word_warp(token.value, WINDOW_WIDTH, self.current_font_index) # Check if next token is WINDOW_BREAK to determine if we need [new] next_is_window_break = (i + 1 < len(tokens) and From fbb37eb20ba55c92e9dd67df803a019b5dd26b50 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 19:12:13 +0200 Subject: [PATCH 26/63] Adds press button indicator character in main font. --- fonts/vwf.png | Bin 603 -> 610 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fonts/vwf.png b/fonts/vwf.png index f991e3567bc90eb8cf602afa6191c3fd9efb0184..0ce0208f1824d00da84c39d2b2381fda4c738287 100644 GIT binary patch delta 567 zcmV-70?7T_1mXmcHh&jML_t(|+U?Q-ha52&#_<coS2) z8NiC~-wLQzz-HJ_uu%*EG92*qxj@7aBYuKU6S(@t!%*PyQ-6m03PW8|A=FJ>-84KD zC}WYwUNmKRFKy#C_Gt)@Lr4TNuzFf`$Sv1N)=z3+#6VnvIwK6bb?(|HJ$ zV5sJaPFMJ!u@w?4mh227ZQDvKhXehQ>Z5A(Q)+F2R#|h#XodDEuT8nWzk)?hwZbT_ z6_mzN#|)h~mDuOH&UYC~mKK3tF{$Icc+aUx-cx%ipnp5n2G*z&afO31Ex@W?ClGG- zF^X5HOdw`&RJ4cM39Ly*tr{p%1t=F_j25uuC3%kC`kn78T$AO|)c^RW%V*)2m%rgn zy?oH(2~R8xCEuY!5xGaeOZEEg3#L9+S=MH^b7SlJCTRz7gYcN002ovPDHLk FV1k713(f!l delta 560 zcmV-00?+;81lt6VHh&OFL_t(|+U?SThU7{V#_@xT0-Q%UfCdE67#tJ^kVj}h00m4i z_(X6p+}17vXk0KZ`Vkt}Y5@BL{RjmpEVioBwr8_gtlb&pFNmL19jZcWYin!o8^?#3 z(!&TgeEPqDsR5c{Kf}f_0?2U0>%Rpe#u)Jhe4fGAFJ8t1hkt)EJXaX&k_toJ)Ynai zmjY!h^4P1T3?HR!+{QkQ!(ki}fgE}B2FdW~U4_Ah0zLzWQ|JrqcLkb_xC@MiI9yrA z&1=KbTLBDvSKyJ=3V3+S!2Xdj87A6dYf*akBd0Egj))vB`itJ9h5!L*PRj$LHxRD< z39`q3r*P^|A%BvoT_8t%zSzaiP)ceBIpbhCoRv`Fc!Q?Elwn_C0xR{}-5|sc*JeHs zp%NU`0@3*nzcW@LQBl$xh_r1htsIZ^LuLoF80Jj1Kx=F{=d42en%AaW-`_!zGpjI( zZv~}kvMEC+-X!+9t_xj;lF}m3A57}FAR%ySQV7&u3xC+otbsZ+BCc?Bt_9dE*bKtW zK1K-!lNrSAor(1@ok3l4rsiNo6<}O|F)5%FBn6H^!!C3c?#c3K>N|ev@>%%%%ir*( zUOs5?3sgus=IyBZaMK*K&!9xO!DcgLzzi|>4RQ%N@9#hbo}X`k8w|snO;c_dwtX49 yh?lUVk15jA5)2FYdkIEAgD21jZEbCBZS5 Date: Tue, 16 Sep 2025 19:13:18 +0200 Subject: [PATCH 27/63] Draw arrow when we are expecting the player to press a button to display next window. --- src/vwf.s | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/vwf.s b/src/vwf.s index 89e4196..5f6d71f 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -137,6 +137,9 @@ parse: BNE _nxt1 lda #0x01 sta 0xDE + lda #0x08 + jsr.w draw_arrow + JMP.W fin _nxt1: @@ -346,13 +349,15 @@ suit2: BRA end suit3: +; that's where new ends up - STZ.B CURRENT_C - STZ.B TILEPOS LDA.B #0x08 - STA.B BITSLEFT + jsr.w draw_arrow + sta.b BITSLEFT + STZ.B CURRENT_C + STZ.B TILEPOS JSR.W clr JSR.W waitpad JSR.W wdisplay @@ -360,6 +365,30 @@ end: JMP.W main +draw_arrow: + pha + lda #0x08 + STA.B BITSLEFT + lda #0x4E + 24 + sta.b oldtilepos + + lda #0x4E + 25 + sta.b TILEPOS + + + lda #0xa2 ; down arrow + sta.b CURRENT_C + + ldx.w #0xa2 * 17 + ldy.w #0xcc0 + jsr.w makeptr + jsr.w ShiftNew + jsr.w wdisplay + + pla + rts + + ;************* ;** Musique ** ;************* From 247cb385e3b55a72b934c9c094870bd15b5ee03d Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 19:14:40 +0200 Subject: [PATCH 28/63] Translate can't fight status in main menu, greys out the whole area. --- src/ingame/main.s | 45 ++++++++++------------------------------ src/menus/in_game_text.s | 3 +++ 2 files changed, 14 insertions(+), 34 deletions(-) diff --git a/src/ingame/main.s b/src/ingame/main.s index 81e98e5..278feee 100644 --- a/src/ingame/main.s +++ b/src/ingame/main.s @@ -131,6 +131,17 @@ draw_hp_mp = 0x018a2a xba sta.w 0x0040, y +; translate can't fight text + +*=0x018B2A + load_system_menu_text_pointer(in_game_menu.cant_fight) + +; grey out more tiles for the first line in char block +*=0x018C30 + lda #15 + + + ;*=0x018b6b ; lda #0x42 @@ -280,37 +291,3 @@ rts ;018E50 60 RTS ; ---------------- - - -.if 0 { - ; Menu color palette I probably need to add one color - ; Palette 1, normal text - .db 0x00, 0x00 - .db 0x00, 0x40 - .db 0xCE, 0x39 - .db 0xFF, 0x7F - - ; Palette 2, greyed out text - .db 0x00, 0x00 - .db 0x00, 0x40 - .db 0x08, 0x21 - .db 0xEF, 0x3D - - ; Palette 3, yellow - .db 0x00, 0x00 - .db 0x00, 0x40 - .db 0x80, 0x02 - .db 0x7F, 0x03 - - ; Palette 4, red - .db 0x00, 0x00 - .db 0x00, 0x40 - .db 0xFF, 0x40 - .db 0x7F, 0x2E - - ; New Palette extra black to make shadows we'll probably add - .db 0x00, 0x00 - .db 0x00, 0x40 - .db 0x00, 0x00 - .db 0xFF, 0x7F -} \ No newline at end of file diff --git a/src/menus/in_game_text.s b/src/menus/in_game_text.s index 434b01a..7254c1d 100644 --- a/src/menus/in_game_text.s +++ b/src/menus/in_game_text.s @@ -1,6 +1,9 @@ .include 'src/ingame/macros.i' .scope in_game_menu { +cant_fight: + .text 'KO' + .db 0 menu: ; window .dw 0x002E, 0x1107 From f32ff5f22dbdcdc4104753a31561531d9ee070d3 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 19:17:11 +0200 Subject: [PATCH 29/63] Moves all code using the bank 0x1 free space at the end to the same place. Tries to make the window transformation work as expected. --- src/ingame/free_space.s | 66 +++++++++++++++++++++++++++++++++++++++++ src/ingame/items.s | 46 ---------------------------- src/ingame/magic.s | 4 --- src/ingame/main.s | 17 +++++++---- src/ingame/menus.i | 2 ++ src/ingame/windows.s | 58 ++++++++++++++++++++++++++++++++++++ 6 files changed, 138 insertions(+), 55 deletions(-) create mode 100644 src/ingame/free_space.s create mode 100644 src/ingame/windows.s diff --git a/src/ingame/free_space.s b/src/ingame/free_space.s new file mode 100644 index 0000000..f743c6e --- /dev/null +++ b/src/ingame/free_space.s @@ -0,0 +1,66 @@ +*=0x01ff40 +draw_window = 0x0180d9 +check_if_description_was_rendered: + pha + + cmp.l render.last_drawn_text_ptr + bne _continue + pla + rts + _continue: + sta.l render.last_drawn_text_ptr + + pla + + pha + ldy.w #0xdcd6 + jmp _back + +draw_vwf_message: + jsr.l items_description.draw_trampoline + rts +draw_window_and_vwf_message: + jsr.w draw_window + ; NOTE: 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 + +transform_window_trampoline: + jmp.l transform_window_far + +copy_text_with_dakuten: + jsr.l copy_text_with_dakuten_far + rts + +display_build_number: +{ + jsr.w 0x8301 ; draw text at position. + load_system_menu_text_pointer(newgame.build_number) + left = 1 + top = 27 + ldx.w #left * 2 + top * 64 + jsr.w 0x8798 ; copy text at position. + rts +} +{ + END_OF_FREE_SPACE: + .if END_OF_FREE_SPACE > 0x01ffff { + .debug '(Bank 0x01): End of free space was reached !' + } +} \ No newline at end of file diff --git a/src/ingame/items.s b/src/ingame/items.s index 59163da..2cfd0a5 100644 --- a/src/ingame/items.s +++ b/src/ingame/items.s @@ -94,52 +94,6 @@ __delta_r = 2 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 -check_if_description_was_rendered: - pha - - cmp.l render.last_drawn_text_ptr - bne _continue - pla - rts - _continue: - sta.l render.last_drawn_text_ptr - - pla - - pha - ldy.w #0xdcd6 - jmp _back - -draw_vwf_message: - jsr.l items_description.draw_trampoline - rts -draw_window_and_vwf_message: - jsr.w draw_window - ; NOTE: 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 - - ; choice window *=0x01db40 load_system_menu_text_pointer(treasure.choice_window) diff --git a/src/ingame/magic.s b/src/ingame/magic.s index 90cd012..491ea55 100644 --- a/src/ingame/magic.s +++ b/src/ingame/magic.s @@ -32,10 +32,6 @@ first_column := 0x0248 - 4 ldy.w #spells.mp_needed & 0xffff jsr.w copy_text_with_dakuten -*=0x01ff80 -copy_text_with_dakuten: - jsr.l copy_text_with_dakuten_far - rts ; Grisement des types sorts : 'Blancs' 'Noirs' etc ... *=0x01B419 diff --git a/src/ingame/main.s b/src/ingame/main.s index 278feee..6abdfc6 100644 --- a/src/ingame/main.s +++ b/src/ingame/main.s @@ -1,11 +1,18 @@ .include 'src/ingame/macros.i' + + { *=0x01DB61 - .dw 0x0000, 0x1A16 ; fenètre principale - .dw 0x05EE, 0x0307 ; fenètre Gils - .dw 0x04EE, 0x0207 ; fenetre temps - .dw 0x002E, 0x1107 ; fenètre menu principal - +.scope _main_menu { +characters_window: + menu_window(0, 0, 22, 26) +gil_window: + menu_window(22, 23, 8, 3) +time_window: + menu_window(23, 19, 7, 2) +menu: + menu_window(23, 0, 7, 17) +} *=0x01dd51 menu_window(1,8,29,17) diff --git a/src/ingame/menus.i b/src/ingame/menus.i index c604c6c..0de0ca3 100644 --- a/src/ingame/menus.i +++ b/src/ingame/menus.i @@ -5,3 +5,5 @@ .include 'src/ingame/magic.s' .include 'src/ingame/shop.s' .include 'src/ingame/equip.s' +.include 'src/ingame/free_space.s' +.include 'src/ingame/windows.s' \ No newline at end of file diff --git a/src/ingame/windows.s b/src/ingame/windows.s new file mode 100644 index 0000000..a91df13 --- /dev/null +++ b/src/ingame/windows.s @@ -0,0 +1,58 @@ +; equip main window +*=0x01dda9 + menu_window(0, 0, 30, 11) + +; char 1 +*=0x01dd95 + menu_window(0, 0, 30, 11) +; char 2 +*=0x01dd99 + menu_window(0, 5, 30, 11) +; char 3 +*=0x01dd9d + menu_window(0, 10, 30, 11) +; char 4 +*=0x01dda1 + menu_window(0, 15, 30, 11) +; char 5 +*=0x01dda5 + menu_window(0, 20, 30, 11) + +; magic +;*=0x01B010 +; ldx.w #0xFF18 + 8 + +*=0x01dd55 + menu_window(1,0,19,7) + +*=0x01dd59 + menu_window(1,5,19,7) + +*=0x01dd5d + menu_window(1,10,19,7) + +*=0x01dd61 + menu_window(1,15,19,7) + +*=0x01dd65 + menu_window(1,20,19,7) + +; magic kind window +*=0x01dd69 + menu_window(23,2,7,7) + +; status +*=0x01de01 + menu_window(0,1,29,24) + menu_window(18,6,12,4) + +; clear next line of text in the right menu +*=0x01a974 + ldy.w #0x270 + lda #7 + +; item title +*=0x01dcd2 + menu_window(22, 0, 7, 3) + + From 92a563173ad03c88c2cc6b5cc987646c6144e96c Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 19:36:07 +0200 Subject: [PATCH 30/63] Adds down arrow to the table. --- text/ff4fr.tbl | 1 + 1 file changed, 1 insertion(+) diff --git a/text/ff4fr.tbl b/text/ff4fr.tbl index 18538f4..1e442c4 100644 --- a/text/ff4fr.tbl +++ b/text/ff4fr.tbl @@ -127,6 +127,7 @@ fe03=[bold] 9E=Î 9F=Ç A0A1=œ +A2=↓ FC=[new]\n FD=° FF= From ee4d0464e5c954454e6e868cee10e463a830d237 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 19:36:49 +0200 Subject: [PATCH 31/63] Add force font tags (right now just doubling it to avoid stripping them in the formatter). --- text/ff4fr.tbl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/text/ff4fr.tbl b/text/ff4fr.tbl index 1e442c4..096da33 100644 --- a/text/ff4fr.tbl +++ b/text/ff4fr.tbl @@ -10,7 +10,10 @@ fe0207fe00=[item] 08=[gils] fe0208fe00=[gils] fe00=[normal] +fe00fe00=[force_normal] fe01=[wicked] +fe01fe01=[force_wicked] +fe02fe02=[force_book] fe02=[book] fe03=[bold] 0400=Cecil From 01bc480b5c244067b03147003b8ed8c872f0aaf7 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 19:37:19 +0200 Subject: [PATCH 32/63] Update font metrics to support font changes. --- metrics.py | 128 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 118 insertions(+), 10 deletions(-) diff --git a/metrics.py b/metrics.py index 6c662b3..61073b9 100644 --- a/metrics.py +++ b/metrics.py @@ -59,38 +59,58 @@ def measure_string(self, line: str) -> int: binary_line = self.table.to_bytes(line) return self.measure_bytes(binary_line) - def word_warp(self, line: str, max_pixel_width: int) -> str: + def word_warp(self, line: str, max_pixel_width: int, start_font_index: int = 0) -> tuple[str, int]: breaking_chars = b"\xff" binary_line = self.table.to_bytes(line) binary_breaked_line = b"" current_line_pixel_width = 0 index = 0 + current_font_index = start_font_index # Start with provided font index + prev_char = None # Reset previous character for each new string - space_width = self.measure_string(" ") + 1 + # Calculate space width with current font context + space_char = 0xff # Space character + space_width = self.length_tables[current_font_index][space_char] + 1 while index < len(binary_line): next_break_point = binary_line.find(breaking_chars, index) if next_break_point != -1: next_word = binary_line[index:next_break_point] - next_word_pixel_length = self.measure_bytes(next_word) + # Measure word with current font context + next_word_pixel_length = self._measure_bytes_with_context( + next_word, current_font_index, prev_char + ) + if current_line_pixel_width + next_word_pixel_length >= max_pixel_width: current_line_pixel_width = next_word_pixel_length binary_breaked_line += b"\x01" - + prev_char = None # Reset after line break else: if current_line_pixel_width > 0: binary_breaked_line += b"\xff" current_line_pixel_width += next_word_pixel_length + space_width + prev_char = 0xff # Space character + binary_breaked_line += next_word + + # Update font context and prev_char after processing word + current_font_index, prev_char = self._update_context_after_bytes( + next_word, current_font_index, prev_char + ) + + # Recalculate space width for new font context + space_width = self.length_tables[current_font_index][space_char] + 1 index = next_break_point + 1 else: # No more break points, process remaining text remaining_word = binary_line[index:] if remaining_word: - remaining_word_pixel_length = self.measure_bytes(remaining_word) + remaining_word_pixel_length = self._measure_bytes_with_context( + remaining_word, current_font_index, prev_char + ) if index > 0: if ( current_line_pixel_width + remaining_word_pixel_length @@ -101,9 +121,76 @@ def word_warp(self, line: str, max_pixel_width: int) -> str: binary_breaked_line += b"\xff" binary_breaked_line += remaining_word + # Update font context after processing remaining word + current_font_index, prev_char = self._update_context_after_bytes( + remaining_word, current_font_index, prev_char + ) break - return self.table.to_text(binary_breaked_line) + return self.table.to_text(binary_breaked_line), current_font_index + + def _measure_bytes_with_context(self, binary: bytes, font_index: int, prev_char: int = None) -> int: + """Measure bytes with given font context and previous character.""" + size = 0 + k = 0 + current_font_index = font_index + + while k < len(binary): + char = binary[k] + match char: + case 0xfe: + k += 1 + current_font_index = binary[k] + prev_char = None # Reset previous char on font change + case 0x4: + k += 1 + size += 6 * 8 + prev_char = None # Reset previous char after special sequence + case 0x8: + size = 4 * 8 # Assume 4 full chars for gils count. + prev_char = None + case _: + # Add character width + char_width = self.length_tables[current_font_index][char] + size += char_width + + # Add spacing (default 1 pixel, adjusted by kerning) + spacing = 1 + if prev_char is not None: + # Check for kerning adjustment + kerning_pair = (prev_char, char) + if kerning_pair in self.kerning_tables[current_font_index]: + kerning_value = self.kerning_tables[current_font_index][kerning_pair] + spacing = kerning_value + 1 # Kerning + 1 = actual spacing + + size += spacing + prev_char = char + + k += 1 + + return size + + def _update_context_after_bytes(self, binary: bytes, font_index: int, prev_char: int = None) -> tuple[int, int]: + """Update font context and prev_char after processing bytes.""" + k = 0 + current_font_index = font_index + + while k < len(binary): + char = binary[k] + match char: + case 0xfe: + k += 1 + current_font_index = binary[k] + prev_char = None + case 0x4: + k += 1 + prev_char = None + case _: + prev_char = char + + k += 1 + + return current_font_index, prev_char def measure_line_count(self, line: str, max_pixel_width: int) -> int: breaking_chars = b"\xff" @@ -112,27 +199,47 @@ def measure_line_count(self, line: str, max_pixel_width: int) -> int: lines_count = 0 current_line_pixel_width = 0 index = 0 - space_width = self.measure_string(" ") + 1 + current_font_index = 0 # Always start with normal font (index 0) + space_char = 0xff # Space character + space_width = self.length_tables[current_font_index][space_char] + 1 + prev_char = None + while index < len(binary_line): next_break_point = binary_line.find(breaking_chars, index) if next_break_point != -1: next_word = binary_line[index:next_break_point] - next_word_pixel_length = self.measure_bytes(next_word) + # Measure word with current font context + next_word_pixel_length = self._measure_bytes_with_context( + next_word, current_font_index, prev_char + ) + if current_line_pixel_width + next_word_pixel_length >= max_pixel_width: current_line_pixel_width = next_word_pixel_length lines_count += 1 + prev_char = None # Reset after line break else: current_line_pixel_width += next_word_pixel_length + space_width + prev_char = 0xff # Space character + + # Update font context after processing word + current_font_index, prev_char = self._update_context_after_bytes( + next_word, current_font_index, prev_char + ) + + # Recalculate space width for new font context + space_width = self.length_tables[current_font_index][space_char] + 1 index = next_break_point + 1 else: # No more break points, process remaining text remaining_word = binary_line[index:] if remaining_word: - remaining_word_pixel_length = self.measure_bytes(remaining_word) + remaining_word_pixel_length = self._measure_bytes_with_context( + remaining_word, current_font_index, prev_char + ) if ( current_line_pixel_width + remaining_word_pixel_length >= max_pixel_width @@ -181,7 +288,8 @@ def _load_interleaved_font(self, font_file: str, char_height: int = 16) -> tuple entry_offset = data_start + (i * 3) if entry_offset + 3 <= len(font_data): char1, char2, kerning_abs = struct.unpack("BBB", font_data[entry_offset:entry_offset + 3]) - # Convert unsigned kerning value back to signed (stored as abs value) + # Kerning values are stored as abs() of the actual kerning in the file + # Convert back to negative (kerning is always negative for tighter spacing) kerning_value = -kerning_abs if kerning_abs > 0 else 0 kerning_table[(char1, char2)] = kerning_value else: From e4ba4d4d2cea29cf76adb6ce3e627431ddbe7542 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Tue, 16 Sep 2025 19:38:29 +0200 Subject: [PATCH 33/63] Format dialogs again. --- text/fr/bank1-1.xml | 751 ++++++++++++++++++-------------------- text/fr/bank1-2.xml | 316 ++++++++-------- text/fr/bank2.xml | 865 +++++++++++++++++++++----------------------- 3 files changed, 910 insertions(+), 1022 deletions(-) diff --git a/text/fr/bank1-1.xml b/text/fr/bank1-1.xml index 771231a..29d071c 100644 --- a/text/fr/bank1-1.xml +++ b/text/fr/bank1-1.xml @@ -48,8 +48,8 @@ pour cacher son identité...[new] Pardonne-moi... de m'être enfuie, père... Je... j'aime... Edward![new] -[bold]Edward[normal]: Golbez... commande les -Ailes Rouges de Baron...[new] +[bold]Edward[normal]: Golbez... commande les Ailes +Rouges de Baron...[new] [bold]Cecil[normal]: Qui est Golbez?[new] [bold]Edward[normal]: Je ne sais pas... Il était entièrement vêtu de noir... d'une @@ -77,8 +77,9 @@ flèches...[end] Tu n'as pas assez de Gils![end] -«Bienvenue! C'est [gils] Gils la nuit. -Allez-vous rester?»[close_window][end] +Bienvenue! +C'est [gils] Gils la nuit. +Allez-vous rester?[close_window][end] «Au plaisir de vous revoir!»[end] @@ -90,12 +91,11 @@ Allez-vous rester?»[close_window][end] [bold]Soldat[normal]: Capitaine Cecil, nous approchons de Baron![new] -[bold]Cecil[normal]: Bien[delay][0x18].[delay][0x18].[delay][0x18].[end] +[bold]Cecil[normal]: Bien[delay][0x3].[delay][0x3].[delay][0x3].[end] [bold]Soldat[normal]: Le capitaine semble également préoccupé...[new] -[bold]Soldat[normal]: Même sur ordre de Sa -Majesté...[new] +[bold]Soldat[normal]: Même sur ordre de Sa Majesté...[new] [bold]Soldat[normal]: Arracher le cristal à un peuple innocent... C'est...[end] @@ -109,9 +109,9 @@ prospérité de notre royaume de Baron.[new] Sa Majesté a jugé que les habitants de Mythidia en savaient trop sur les secrets du cristal.[new] -Nous sommes l'escadron des Ailes -Rouges de Baron, et les ordres de Sa -Majesté sont absolus![new] +Nous sommes l'escadron des Ailes Rouges +de Baron, et les ordres de Sa Majesté +sont absolus![new] [bold]Soldat[normal]: Capitaine...[end] [bold]Soldat[normal]: Capitaine! @@ -147,9 +147,8 @@ Par ici, Cecil, sa Majesté attend.[end] [bold]Beigan[normal]: Messire Cecil, attendez ici.[end] [bold]Beigan[normal]: Majesté! -Je redoute que Cecil n'ait -développé une défiance à l'égard du -trône...[new] +Je redoute que Cecil n'ait développé +une défiance à l'égard du trône...[new] [bold]Roi Baron[normal]: Vraiment!? Bravo, Beigan! Merci de m'en avoir informé! @@ -157,8 +156,8 @@ Mais le cristal avant tout...[new] Convoque-le ici![new] [bold]Beigan[normal]: Bien, Majesté.[end] -[bold]Beigan[normal]: Capitaine Cecil, Sa -Majesté attend. +[bold]Beigan[normal]: Capitaine Cecil, Sa Majesté +attend. Suivez-moi.[end] [bold]Roi Baron[normal]: Bien joué, Cecil. @@ -238,16 +237,14 @@ va te reposer un peu.[end] [bold]Caïn[normal]: Qu'est-ce qu'il y a?[new] [bold]Cecil[normal]: Je suis désolé, Caïn...[new] -[bold]Caïn[normal]: Pourquoi t'excuses-tu -encore? +[bold]Caïn[normal]: Pourquoi t'excuses-tu encore? Je t'ai défendu de mon plein gré!![new] [bold]Cecil[normal]: Ce n'est pas ça, Caïn. C'était ma mission d'aujourd'hui... -J'ai maîtrisé l'art de la lame noire -comme me l'avait ordonné Sa Majesté.[new] +J'ai maîtrisé l'art de la lame noire comme +me l'avait ordonné Sa Majesté.[new] Mais cela aurait dû servir à défendre -Baron, non à attaquer un peuple -innocent.[new] +Baron, non à attaquer un peuple innocent. Peut-être que mes excuses apaiseront ma conscience...[new] [bold]Caïn[normal]: Ne sois pas si sévère envers @@ -257,13 +254,12 @@ nobles raisons pour ses actions.[new] Il nous a élevés comme ses propres fils. Il n'accomplirait rien qui ne soit honorable...[new] -[bold]Cecil[normal]: Caïn, j'envie ta foi en -Sa Majesté. -Il a évoqué ton père...[new] -Il possédait la même loyauté -indéfectible...[new] -[bold]Caïn[normal]: Mon père...Mon père était -aussi un chevalier dragon. +[bold]Cecil[normal]: Caïn, j'envie ta foi en Sa +Majesté. +Il a évoqué ton père... +Il possédait la même loyauté indéfectible...[new] +[bold]Caïn[normal]: Mon père...Mon père était aussi +un chevalier dragon. Si j'avais maîtrisé l'art de la lame noire comme le roi me l'avait demandé...[new] J'aurais sûrement évolué comme toi... @@ -275,8 +271,8 @@ Il y a des moments où j'espère qu'il m'observe... J'espère qu'il serait fier de moi...[new] J'ai souvent ces moments... ...moments de -réflexion silencieuse où je peux sentir -son esprit en moi qui me guide...[new] +réflexion silencieuse où je peux sentir son +esprit en moi qui me guide...[new] [bold]Cecil[normal]: ...[new] [bold]Caïn[normal]: Pardonne-moi d'avoir divagué ainsi... @@ -285,8 +281,8 @@ Quoi qu'il en soit, je ne me tourmente pas outre mesure pour aujourd'hui. Tu ferais mieux de te préoccuper de demain![new] -Tu as accompli ce que le roi souhaitait, -et tu es devenu un chevalier noir...[new] +Tu as accompli ce que le roi souhaitait, et +tu es devenu un chevalier noir...[new] Tu détiens un rang et un prestige supérieurs aux miens, mais demain, nous verrons bien qui excelle! @@ -294,10 +290,9 @@ On part tôt demain, va te reposer.[end] [bold]Rosa[normal]: Cecil![end] -[bold]Rosa[normal]: Dieu merci, tu es sain et -sauf! -Ta mission était si soudaine, je -m'inquiétais terriblement.[new] +[bold]Rosa[normal]: Dieu merci, tu es sain et sauf! +Ta mission était si soudaine, je m'inquiétais +terriblement.[new] [bold]Cecil[normal]: Nous allons bien... Nous ne risquions guère d'être blessés par une poignée de magiciens... ...qui n'ont @@ -317,15 +312,15 @@ Mais maintenant... Le cristal de Mythidia...[new] Revêt-il donc une telle importance qu'il faille l'arracher à d'innocents villageois? -Et dire que nous avons dû commettre -un tel acte, sur ordre royal!![end] +Et dire que nous avons dû commettre un +tel acte, sur ordre royal!![end] [bold]Rosa[normal]: Que s'est-il passé? D'abord, tu es envoyé à Mythidia, puis soudain, tu es envoyé éliminer d'horribles créatures.[new] -Et tu te comportes de manière si -étrange depuis ton retour.[new] +Et tu te comportes de manière si étrange +depuis ton retour.[new] [bold]Cecil[normal]: Non... Ce n'est rien...[end] @@ -336,18 +331,16 @@ Regarde-moi plutôt.[end] J'ai ôté la vie à des innocents et dérobé leur cristal sacré... mais pour quelle raison?![new] -Mon cur s'est assombri tout autant que +Mon cœur s'est assombri tout autant que cette armure maudite![end] [bold]Rosa[normal]: ...Tu n'est pas comme cela.[end] -[bold]Cecil[normal]: Je ne suis rien qu'un -chevalier noir docile, tout juste un pantin -du roi.[end] +[bold]Cecil[normal]: Je ne suis rien qu'un chevalier +noir docile, tout juste un pantin du roi.[end] -[bold]Rosa[normal]: Le Cecil des Ailes -Rouges n'aurait jamais pleurniché comme -ça! +[bold]Rosa[normal]: Le Cecil des Ailes Rouges +n'aurait jamais pleurniché comme ça! Pas le Cecil que j'aime...[end] [bold]Rosa[normal]: Tu t'en vas à Mist demain, @@ -363,8 +356,7 @@ Va donc te coucher.[end] Pour l'amour de moi...[end] [bold]Cecil[normal]: Merci, Rosa. -Pourtant, je ne suis qu'un chevalier -noir... +Pourtant, je ne suis qu'un chevalier noir... Qu'est-ce que je peux y faire?[end] [bold]Cecil[normal]: Yang, tu vas bien![new] @@ -400,9 +392,8 @@ Edward... je ne sais pas...[new] [bold]Yang[normal]: Où sommes-nous?[new] [bold]Cecil[normal]: À Baron. Si les soldats nous entendent, on aura -des ennuis.[new] -Il y a une chambre tranquille à -l'auberge. +des ennuis. +Il y a une chambre tranquille à l'auberge.[new] Allons-y! [0xfa]Le Moine Yang a rejoint le groupe![music][0x29][delay][0x28][end] @@ -447,8 +438,8 @@ NON!![new] donc maman aussi... -sanglot-, -sanglot-...[end] [bold]Cecil[normal]: Bon sang![new] -[bold]Caïn[normal]: Maintenant que j'y pense, -j'en ai entendu parler. +[bold]Caïn[normal]: Maintenant que j'y pense, j'en +ai entendu parler. Des gens qui ont le pouvoir d'invoquer des monstres...[new] Ce sont les Invocateurs![new] @@ -459,17 +450,16 @@ de cette fille?[end] [bold]Fille[normal]: Alors c'est vous qui avez tué le dragon de maman?![new] -[bold]Cecil[normal]: On ne savait pas... qu'en -tuant ce dragon... on causerait la mort -de ta mère...[end] +[bold]Cecil[normal]: On ne savait pas... qu'en tuant +ce dragon... on causerait la mort de ta +mère...[end] -[bold]Caïn[normal]: Le Roi nous a envoyés ici -pour exterminer les invocateurs...[new] +[bold]Caïn[normal]: Le Roi nous a envoyés ici pour +exterminer les invocateurs...[new] [bold]Cecil[normal]: Miséricorde![new] [bold]Caïn[normal]: Malheureusement, les ordres sont les ordres... -On n'a d'autre choix que de la tuer -aussi.[end] +On n'a d'autre choix que de la tuer aussi.[end] [bold]Cecil[normal]: Caïn![new] [bold]Caïn[normal]: Si on désobéit, on sera @@ -480,26 +470,26 @@ braver le Roi?[new] [bold]Cecil[normal]: Si le roi attend de nous qu'on assassine des gens comme ça... Je n'ai aucune intention de le suivre![new] -Je renonce à toute loyauté envers le -roi, les Ailes Rouges, et Baron!!![end] +Je renonce à toute loyauté envers le roi, +les Ailes Rouges, et Baron!!![end] -[bold]Caïn[normal]: Je me doutais que tu allais -dire ça. +[bold]Caïn[normal]: Je me doutais que tu allais dire +ça. Je ne vais pas te laisser affronter le roi tout seul.[new] [bold]Cecil[normal]: Caïn?[new] -[bold]Caïn[normal]: Peu importe ce que je dois -au roi, en tant que chevalier dragon... -Jamais je ne pourrais commettre un -acte aussi bas.[new] -[bold]Cecil[normal]: Alors tu n'avais pas -réellement l'intention de...[new] -[bold]Caïn[normal]: Baron est la plus grande -force militaire au monde. +[bold]Caïn[normal]: Peu importe ce que je dois au +roi, en tant que chevalier dragon... +Jamais je ne pourrais commettre un acte +aussi bas.[new] +[bold]Cecil[normal]: Alors tu n'avais pas réellement +l'intention de...[new] +[bold]Caïn[normal]: Baron est la plus grande force +militaire au monde. On ne peut pas combattre son pouvoir rien qu'à deux.[new] -Il faut prévenir les autres pays et -obtenir à tout prix leur aide. +Il faut prévenir les autres pays et obtenir +à tout prix leur aide. Et il faut sauver Rosa![new] [bold]Cecil[normal]: Merci, Caïn.[new] [bold]Caïn[normal]: Ce n'est pas spécialement @@ -532,8 +522,7 @@ Où es-tu? !![end] [bold]Cecil[normal]: Je ne peux pas rester ici éternellement... -Je dois emmener cette enfant et fuir -d'ici...[new] +Je dois emmener cette enfant et fuir d'ici... Caïn... sois vivant![end] [bold]Cecil[normal]: Si elle ne se repose pas...[end] @@ -545,28 +534,27 @@ inquiétez pas pour l'argent!»[new] [bold]Cecil[normal]: Tu as enfin repris...[new] [bold]Fille[normal]: ...[new] -[bold]Cecil[normal]: Je ne sais même pas -comment tu t'appelles.[new] +[bold]Cecil[normal]: Je ne sais même pas comment +tu t'appelles.[new] [bold]Fille[normal]: ...[new] [bold]Cecil[normal]: Je ne peux pas te demander de me pardonner d'avoir tué ta mère.... -Mais je t'en prie, laisse-moi te -protéger...[new] +Mais je t'en prie, laisse-moi te protéger...[new] [bold]Fille[normal]: ...[end] -[bold]Général[normal]: Enfin, Cecil, nous -t'avons trouvé!![new] +[bold]Général[normal]: Enfin, Cecil, nous t'avons +trouvé!![new] [bold]Fille[normal]: !![new] [bold]Cecil[normal]: Attendez! Le roi de Baron a...[new] [bold]Général[normal]: Ordres du roi. Si tu nous livres la survivante de Mist, il pardonnera ta traîtrise.[new] -Il a été jugé dangereux que le peuple -de Mist puisse seulement exister![new] +Il a été jugé dangereux que le peuple de +Mist puisse seulement exister![new] [bold]Cecil[normal]: Quoi!? -Le roi est donc tombé si bas au point -de tuer des enfants?![new] +Le roi est donc tombé si bas au point de +tuer des enfants?![new] [bold]Fille[normal]: !![new] [bold]Général[normal]: Épargne-moi ton sermon et donne-moi la fille![new] @@ -582,8 +570,8 @@ Ce que j'ai fait est impardonnable.[new] [bold]Fille[normal]: Je m'appelle... Rydia...[new] [bold]Cecil[normal]: Merci... -Rydia. [0xfa]L'invocatrice Rydia se -joint à toi![end] +Rydia. [0xfa]L'invocatrice Rydia se joint +à toi![end] [0xfa]Cecil a fait briller la Lumière du Désert sur Rosa![end] @@ -605,27 +593,25 @@ pour te remplacer à la tête des Ailes Rouges.[new] Depuis qu'il est arrivé, le Roi lui a donné de plus en plus de pouvoir... -C'est sûrement Golbez qui influence -le roi pour réunir les quatre cristaux.[new] +C'est sûrement Golbez qui influence le +roi pour réunir les quatre cristaux.[new] Le cristal de l'eau de Mythidia... Le cristal du feu de Damcyan... Le cristal du vent de Fabul... et le cristal de la terre de Troia.[end] -[bold]Edward[normal]: Il a déjà pris le cristal du -feu...[new] +[bold]Edward[normal]: Il a déjà pris le cristal du feu...[new] [bold]Cecil[normal]: C'est Edward, le prince de Damcyan. C'est grâce à lui que nous avons pu te soigner.[new] -Et cette fille s'appelle Rydia, elle -vient de Mist.[new] +Et cette fille s'appelle Rydia, elle vient +de Mist.[new] [bold]Rydia[normal]: Tu vas bien?[new] [bold]Rosa[normal]: Je vais mieux... merci... -Si le cristal de Damcyan a déjà été -volé... -La prochaine cible, c'est...[new] -Fabul! +Si le cristal de Damcyan a déjà été volé... +La prochaine cible, c'est... +Fabul![new] Nous devons empêcher que ça ne se produise... -keuf-, -keuf-[end] @@ -633,9 +619,8 @@ produise... -keuf-, -keuf-[end] Ne te surmène pas... Tu dois te reposer. Nous allons aller à Fabul.[new] -[bold]Edward[normal]: Mais le passage vers Fabul -par le Mont Hobs est bloqué par la -glace...[end] +[bold]Edward[normal]: Mais le passage vers Fabul par +le Mont Hobs est bloqué par la glace...[end] [bold]Rosa[normal]: Rydia, tu peux lancer le sort du[new] @@ -657,8 +642,8 @@ Tu me manques tellement...[end] [bold]Edward[normal]: Anna![new] [bold]Anna[normal]: Edward, je dois partir... -L'heure est venue... ...pour que je ne -fasse plus qu'un avec un esprit éternel...[new] +L'heure est venue... ...pour que je ne fasse +plus qu'un avec un esprit éternel...[new] [bold]Edward[normal]: Anna! Ne me laisse pas![end] @@ -666,16 +651,16 @@ Ne me laisse pas![end] ne laisse pas Golbez rassembler les cristaux... Tu m'aimais.[new] -À présent, donne cet amour aux gens -de la Terre.[end] +À présent, donne cet amour aux gens de +la Terre.[end] [bold]Edward[normal]: Oui, Anna, je me battrai... Mais le courage... Que dois-je faire, Anna?[end] [bold]Tellah[normal]: Elle s'est bien vite endormie... -Ç'a dû être une journée éprouvante -pour quelqu'un de si jeune... +Ç'a dû être une journée éprouvante pour +quelqu'un de si jeune... Cette petite est-elle...[new] [bold]Cecil[normal]: Une invocatrice de Mist.[new] [bold]Tellah[normal]: Je ressens en elle un grand @@ -690,8 +675,7 @@ Elle s'est sauvée à Damcyan avec un barde parce que je n'ai pas consenti à leur mariage...[end] -[bold]Tellah[normal]: Pourquoi vous y -rendez-vous?[new] +[bold]Tellah[normal]: Pourquoi vous y rendez-vous?[new] [bold]Cecil[normal]: J'ai une amie à Kaïpo qui souffre d'une fièvre terrible.[new] [bold]Tellah[normal]: Alors il vous faut la Lumière @@ -704,8 +688,8 @@ avec huit énormes pattes. Il nous faudra le battre si nous voulons sauver Anna et votre amie...[new] J'espère que ce mauvais pressentiment -que j'ai sur Damcyan n'est que le fruit -de mon imagination mais...[end] +que j'ai sur Damcyan n'est que le fruit de +mon imagination mais...[end] [bold]Cid[normal]: Mais de quoi vous vous inquiétez? @@ -720,15 +704,14 @@ Craque pas pour moi maintenant![end] [bold]Cecil[normal]: Roi Giotto, où est le cristal dans ce château?[new] -[bold]Giotto[normal]: Il est caché dans une salle -secrète derrière ce trône même! +[bold]Giotto[normal]: Il est caché dans une salle secrète +derrière ce trône même! Tant que je peux le surveiller, tout ira bien![end] [bold]Yang[normal]: ![end] -[bold]Cecil[normal]: Qu'est-ce qu'il y a, -Yang?[new] +[bold]Cecil[normal]: Qu'est-ce qu'il y a, Yang?[new] [bold]Yang[normal]: Quelqu'un écoute![new] [bold]Giotto[normal]: Qui!?[end] @@ -741,10 +724,9 @@ aéronefs...[end] [bold]Roi Fabul[normal]: Yang, tu es de retour! Cette expression sur ton visage...[new] [bold]Yang[normal]: Oui! -Mais plus important, Roi Fabul![new] +Mais plus important, Roi Fabul! Un homme nommé Golbez mobilise les -forces de Baron afin de voler notre -cristal![new] +forces de Baron afin de voler notre cristal![new] [bold]Roi Fabul[normal]: Quoi!? Comment est-ce possible?[new] [bold]Yang[normal]: Ces personnes sont venues @@ -766,13 +748,12 @@ Golbez.[new] Nous devons nous préparer au combat![new] [bold]Rosa[normal]: Dépêchez-vous![end] -[bold]Edward[normal]: Ça faisait longtemps, roi -Fabul.[new] +[bold]Edward[normal]: Ça faisait longtemps, roi Fabul.[new] [bold]Roi Fabul[normal]: Prince Edward![new] -[bold]Edward[normal]: Damcyan a déjà été attaqué -et notre cristal a été volé! -J'ai perdu... mon père... ma mère... et -celle que j'aimais...![new] +[bold]Edward[normal]: Damcyan a déjà été attaqué et +notre cristal a été volé! +J'ai perdu... mon père... ma mère... et celle +que j'aimais...![new] Allez-vous laisser Fabul subir le même sort que Damcyan?![end] @@ -806,8 +787,8 @@ faire tuer, comme ça![new] [bold]Yang[normal]: Retraite! Repli dans le château![end] -[bold]Yang[normal]: Désolé de vous avoir -entraînés dans un combat sans espoir![new] +[bold]Yang[normal]: Désolé de vous avoir entraînés +dans un combat sans espoir![new] [bold]Cecil[normal]: Comme je l'ai déjà dit, c'est aussi notre combat! Et nous n'avons pas encore perdu![new] @@ -816,12 +797,11 @@ Et nous n'avons pas encore perdu![new] [bold]Yang[normal]: Merde! Replions-nous![end] -[bold]Cecil[normal]: Ce n'est pas la salle du -trône, là derrière...!?[new] +[bold]Cecil[normal]: Ce n'est pas la salle du trône, +là derrière...!?[new] [bold]Yang[normal]: Ne t'inquiète pas! Le roi a déjà trouvé refuge avec les -femmes et les enfants dans un endroit -sûr![new] +femmes et les enfants dans un endroit sûr! Il faut nous occuper de ces monstres![end] [bold]Yang[normal]: Attaquez![end] @@ -858,8 +838,8 @@ souffrances![new] [bold]Caïn[normal]: Ourg...ahh..! Ne...me...regarde...pas[end] -«Qu'y a-t-il, Caïn? Qu'est-ce qui -te trouble?»[end] +«Qu'y a-t-il, Caïn? Qu'est-ce qui te +trouble?»[end] [bold]Edward[normal]: Golbez![new] [bold]Cecil[normal]: Tu es Golbez![new] @@ -887,9 +867,9 @@ J'aimerais te revoir, Cecil...[new] Elle sera la preuve de notre promesse. Allons-y, Caïn![end] -[bold]Caïn[normal]: Apparemment, tu vas -survivre un peu plus longtemps que -prévu, Cecil![end] +[bold]Caïn[normal]: Apparemment, tu vas survivre +un peu plus longtemps que prévu, +Cecil![end] [bold]Cecil[normal]: At...tendez![end] @@ -915,8 +895,8 @@ Et puis on peut récupérer le cristal![end] Reposez-vous.[end] [bold]Edward[normal]: Il faut sauver Rosa! -Pour lutter contre Golbez, nous -avons besoin d'un Aéronef. +Pour lutter contre Golbez, nous avons +besoin d'un Aéronef. Mais seul Baron en a...[new] [bold]Yang[normal]: Je me demande s'il n'y aurait pas moyen de s'introduire dans Baron...[end] @@ -930,8 +910,8 @@ faudra le faire par la mer.[new] alors![new] [bold]Yang[normal]: Demandons au roi dès demain matin. -Tu es venu à son secours, il t'en -allouera sûrement un.[new] +Tu es venu à son secours, il t'en allouera +sûrement un.[new] [bold]Cecil[normal]: Merci.[end] [bold]Yang[normal]: Qui était ce chevalier dragon?[new] @@ -958,8 +938,7 @@ Vous serez à Baron avant de vous en rendre compte! Larguez les amarres![end] -[bold]Capitaine[normal]: Allez les gars, levez -l'ancre![new] +[bold]Capitaine[normal]: Allez les gars, levez l'ancre![new] [bold]Équipage[normal]: Hourra![end] [bold]Yang[normal]: Que comptez-vous faire une @@ -1005,8 +984,8 @@ Ooh...[end] [bold]Scarmiglione[normal]: -Gargl-... Scarmiglione de la Terre, à ton service...[new] -[bold]Golbez[normal]: Ce Cecil pourrait -devenir un problème. +[bold]Golbez[normal]: Ce Cecil pourrait devenir +un problème. Il faut s'occuper de lui avant qu'il n'en devienne un.[new] C'est un chevalier noir, il devrait donc @@ -1052,8 +1031,8 @@ C'est toi, Tellah?[end] Appelle-le maître Tellah! Tu es d'un grossier![end] -[bold]Porom[normal]: Nous sommes honorés de -vous rencontrer, maître Tellah. +[bold]Porom[normal]: Nous sommes honorés de vous +rencontrer, maître Tellah. Nous avons été envoyés ici par l'Ancien de Mythidia pour...[new] [bold]Palom[normal]: Surveiller Cecil...[end] @@ -1082,8 +1061,8 @@ Golbez...[end] [bold]Palom[normal]: C'est sûrement sa copine![end] [bold]Porom[normal]: Chut![new] -[bold]Cecil[normal]: Mais tu ne devais pas aller à -la recherche de Golbez?[end] +[bold]Cecil[normal]: Mais tu ne devais pas aller à la +recherche de Golbez?[end] [bold]Tellah[normal]: Je ne suis pas en mesure de vaincre quelqu'un d'aussi puissant que lui @@ -1091,8 +1070,8 @@ avec la magie dont je dispose actuellement.[new] Je recherchais la légendaire magie scellée, Météor... -Et j'ai senti une forte aura émise de -cette montagne.[new] +Et j'ai senti une forte aura émise de cette +montagne.[new] Serait-ce possible, après toutes ces années de recherches..?[new] [bold]Porom[normal]: Ce sort est dangereux! @@ -1113,8 +1092,8 @@ C'est l'homme qui contrôle Baron![end] «Gargl...»[new] [bold]Tellah[normal]: ...Une présence maléfique!![new] -«Je suis heureux... Très heureux... Tuer -me rend heureux!»[new] +«Je suis heureux... Très heureux... Tuer me +rend heureux!»[new] [bold]Cecil[normal]: Qui est là!?[end] «Je suis votre guide pour l'enfer...»[new] @@ -1123,26 +1102,24 @@ seigneur Golbez... Scarmiglione de la Terre... Il est temps que dînent mes précieux morts-vivants!»[end] -«Fshhh... Bien joué... de m'avoir tué... -Mais voyez la terrifiante puissance de +«Fshhh... Bien joué... de m'avoir tué... Mais +voyez la terrifiante puissance de Scarmiglione de la Terre... même dans la -mort... Savourez lentement... votre -agonie!»[end] +mort... Savourez lentement... votre agonie!»[end] [bold]Scarmiglione[normal]: Maudit... -Que moi, Scarmiglione... je sois vaincu -par des vermines comme vous...![end] +Que moi, Scarmiglione... je sois vaincu par +des vermines comme vous...![end] «Je t'attendais...»[new] «Le chagrin me remplit...»[new] «...Je vais t'insuffler mes pouvoirs...»[new] -«Mon chagrin ne fera alors que -grandir...»[new] +«Mon chagrin ne fera alors que grandir...»[new] «Mais c'est la seule solution qui reste.»[end] «Laisse ton passé sanglant derrière toi... -Purifie ton âme avec la lumière sacrée! -Tu dois le faire! Pour recevoir cette force +Purifie ton âme avec la lumière sacrée! Tu +dois le faire! Pour recevoir cette force sacrée, combats et détruis ton double obscur en tant que chevalier noir!»[end] @@ -1172,12 +1149,12 @@ Quelle était cette voix..?[new] [bold]Porom[normal]: Maître Tellah?[end] [bold]Tellah[normal]: Je commence à me souvenir... -Tous mes sorts commencent à me -revenir! [0xfa]Tellah a retrouvé tous les -[0xfa]sorts qu'il avait oubliés![end] +Tous mes sorts commencent à me revenir! +[0xfa]Tellah a retrouvé tous les [0xfa]sorts qu'il +avait oubliés![end] -[bold]Porom[normal]: Comme on pouvait s'y -attendre de Maître Tellah...[new] +[bold]Porom[normal]: Comme on pouvait s'y attendre +de Maître Tellah...[new] [bold]Palom[normal]: Hé, Porom...[end] [bold]Porom[normal]: Cecil..[new] @@ -1215,8 +1192,8 @@ Alors Rydia est aussi..?[new] [bold]Yang[normal]: J'ai honte...[end] [bold]Edward[normal]: Oh...c'est horrible... -Et dire que je ne peux rien faire -pendant que vous combattez...[end] +Et dire que je ne peux rien faire pendant +que vous combattez...[end] [bold]Edward[normal]: Vous êtes Cid? Alors vous devez pouvoir... !![end] @@ -1273,13 +1250,13 @@ Vous avez gagné...[new] [bold]Cecil[normal]: Edward! C'est grâce à vous![new] [bold]Edward[normal]: Non, pas vraiment...[new] -[bold]Cid[normal]: Mais pourquoi cette mélodie -lui a fait quelque chose?[end] +[bold]Cid[normal]: Mais pourquoi cette mélodie lui +a fait quelque chose?[end] [bold]Edward[normal]: Alors que je parcourais le -monde déguisé en barde, j'ai entendu -des mélodies qui repoussent les démons -et les esprits maléfiques.[new] +monde déguisé en barde, j'ai entendu des +mélodies qui repoussent les démons et les +esprits maléfiques.[new] J'ai pensé que cette mélodie pourrait marcher. Ç'a été le cas...[new] @@ -1293,10 +1270,9 @@ Ooh![end] D'être aimée par quelqu'un de si courageux...[new] [bold]Edward[normal]: Tellah...[new] -[bold]Tellah[normal]: Pour l'instant, -concentrez-vous juste sur votre -guérison. -Je vengerai Anna avec Météor![new] +[bold]Tellah[normal]: Pour l'instant, concentrez-vous +juste sur votre guérison. +Je vengerai Anna avec Météor! Edward... pour vous aussi.[new] [bold]Edward[normal]: ...Merci.[new] [bold]Cecil[normal]: Edward, vous êtes... un @@ -1313,8 +1289,8 @@ Golbez veut vous remercier en personne.[new] [bold]Tellah[normal]: Golbez![end] -[bold]Golbez[normal]: Je suis heureux que vous -ayez tenu votre promesse...[new] +[bold]Golbez[normal]: Je suis heureux que vous ayez +tenu votre promesse...[new] [bold]Tellah[normal]: Montre-toi![new] [bold]Golbez[normal]: Je comprends votre impatience, mais j'aimerais vous remercier.[new] @@ -1322,21 +1298,20 @@ impatience, mais j'aimerais vous remercier.[new] [bold]Golbez[normal]: Je suis avec votre chère Rosa au sommet de cette Tour de Zot.[new] -Si vous parvenez jusqu'ici, j'échangerai -la vie de Rosa contre le cristal.[new] +Si vous parvenez jusqu'ici, j'échangerai la +vie de Rosa contre le cristal.[new] [bold]Cecil[normal]: Golbez, tu n'es qu'un salaud![new] [bold]Golbez[normal]: Si vous ne venez pas rapidement, je ne peux garantir la vie de -votre précieuse Rosa...[music][0x19] Alors, -montez![end] +votre précieuse Rosa...[music][0x19] Alors, montez![end] «Bienvenue dans la tour de Zot!»[end] «Heureuses de vous rencontrer!»[end] -«C'est nous, les servantes de -Barbariccia, l'Impératrice de l'air!»[new] +«C'est nous, les servantes de Barbariccia, +l'Impératrice de l'air!»[new] «Je suis Dog, des trois sœurs Magus!»[new] «Je suis Mag, pareil!»[new] «Je suis Rag!»[new] @@ -1410,9 +1385,9 @@ Mais Tellah![end] [bold]Tellah[normal]: Je n'ai pas pu le tuer...[new] [bold]Cid[normal]: Ne parle pas![new] -[bold]Tellah[normal]: C'est peut-être... la -rétribution pour avoir combattu... consumé -par la haine... +[bold]Tellah[normal]: C'est peut-être... la rétribution +pour avoir combattu... consumé par la +haine... La vengeance d'Anna... je vous en...[end] [bold]Cecil[normal]: Tellah![new] @@ -1469,8 +1444,8 @@ services, revenez donc me voir.[end] [bold]Cecil[normal]: Allons-y, Caïn![end] «Infliger des blessures à seigneur -Golbez... Il semble que nous vous -ayons sous-estimés!»[new] +Golbez... Il semble que nous vous ayons +sous-estimés!»[new] [bold]Caïn[normal]: C'est un des quatre Empereurs de Golbez! Barbariccia du vent![end] @@ -1486,8 +1461,8 @@ familièrement! J'aurais dû vous éliminer, toi et Rosa![new] Mais l'utilisateur de Météor n'est plus. -Maintenant que vous êtes tous réunis, -je vais vous enterrer ensemble![new] +Maintenant que vous êtes tous réunis, je +vais vous enterrer ensemble![new] [bold]Caïn[normal]: Les combats aériens ne sont pas ton exclusivité![end] @@ -1507,15 +1482,14 @@ Disparaissez avec cette Tour de Zot![end] [bold]Cid[normal]: On est à l'abri. Cet imposteur de roi est mort.[new] [bold]Caïn[normal]: Cecil... -Il faut que je te parle de quelque -chose.[end] +Il faut que je te parle de quelque chose.[end] [bold]Cid[normal]: De quoi s'agit-il?[new] [bold]Caïn[normal]: Il s'agit des cristaux...[new] [bold]Cecil[normal]: Le cristal emprunté à Troia a été volé aussi... -Cela signifie qu'il possède maintenant -tous les cristaux.[new] +Cela signifie qu'il possède maintenant tous +les cristaux.[new] [bold]Caïn[normal]: Non, il n'en a que quatre![new] [bold]Rosa[normal]: Quatre ne font pas le compte total...?[new] @@ -1529,8 +1503,8 @@ face externe de la Terre.[new] l'autre côté..?[new] [bold]Cecil[normal]: Les cristaux d'Obscurité..?[new] [bold]Caïn[normal]: En effet. -Donc, ça veut dire que Golbez n'a -que la moitié des cristaux![new] +Donc, ça veut dire que Golbez n'a que +la moitié des cristaux![new] [bold]Cid[normal]: Alors les cristaux d'Obscurité, c'est pas une rumeur... Et la question inévitable... @@ -1549,8 +1523,8 @@ les cristaux de la face et de l'arrière réunis, le chemin vers la Lune s'ouvrirait.[new] [bold]Cecil[normal]: Le chemin vers la Lune?[new] [bold]Caïn[normal]: Je ne suis pas sûr de ce que -ça veut dire... mais apparemment cet -objet servirait dans notre quête. +ça veut dire... mais apparemment cet objet +servirait dans notre quête. Tiens, prends-le.[end] [0xfa]Tu reçois la Pierre du Magma. @@ -1578,8 +1552,8 @@ Tiens bon![new] souterrain, le roi des Nains, Giotto...[new] [bold]Cecil[normal]: Où sont les cristaux d'Obscurité?[new] -[bold]Giotto[normal]: Ah, c'est donc pour ça qu'ils -sont venus. +[bold]Giotto[normal]: Ah, c'est donc pour ça qu'ils sont +venus. On se disait que vous étiez avec eux, mais ils vous ont abattus.[new] En fait, on était nous-mêmes prêts à @@ -1588,18 +1562,18 @@ vous tirer dessus.[new] [bold]Giotto[normal]: Hélas, ils ont déjà pris deux des quatre cristaux.[new] [bold]Yang[normal]: Nous arrivons tard...[new] -[bold]Giotto[normal]: Mais le cristal de ce château -est, lui, toujours en sécurité. +[bold]Giotto[normal]: Mais le cristal de ce château est, +lui, toujours en sécurité. On a pu faire battre en retraite ces... heu... trucs volants avec nos chars nains.[new] [bold]Rosa[normal]: Alors c'étaient vos chars qui combattaient les aéronefs.[new] [bold]Giotto[normal]: Oh, comme ça vous appelez ces choses aéronefs... -Wow, le monde du dessus a des trucs -de ce genre![new] -Nous sommes fiers de nos chars, mais -ils nous touchaient salement avec leurs +Wow, le monde du dessus a des trucs de +ce genre![new] +Nous sommes fiers de nos chars, mais ils +nous touchaient salement avec leurs attaques. Nous aiderez-vous avec votre aéronef?[new] [bold]Cid[normal]: J'ai rien contre, mais après @@ -1627,23 +1601,22 @@ cadeau! Kya-ho-ho-ho!»[end] «Cela faisait longtemps...»[end] [bold]Cecil[normal]: Golbez..![new] -[bold]Golbez[normal]: L'autre jour, vous m'avez -bien aidé. +[bold]Golbez[normal]: L'autre jour, vous m'avez bien +aidé. Mais celui qui utilisait Météore n'est plus de ce monde maintenant.[new] En remerciement de l'autre fois, je vais vous dire pourquoi je rassemble les -cristaux.[new] -Lumière et ténèbres réunies... 8 -cristaux... +cristaux. +Lumière et ténèbres réunies... 8 cristaux...[new] C'est la clé pour faire revivre la Tour de -Babel, le chemin scellé vers la Lune.[new] -On dit qu'il y a sur la Lune un pouvoir -qui dépasse notre imagination. +Babel, le chemin scellé vers la Lune. +On dit qu'il y a sur la Lune un pouvoir qui +dépasse notre imagination.[new] Avec ce cristal, j'en ai maintenant sept... -Il n'en reste plus qu'un.[new] +Il n'en reste plus qu'un. C'est aussi grâce à vous. -Je me dois de vous remercier pour cela. +Je me dois de vous remercier pour cela.[new] Prenez ceci! C'est mon dernier cadeau![end] @@ -1660,26 +1633,25 @@ emmené dans le Monde Fantôme.[new] [bold]Rydia[normal]: C'est le monde où vivent les Bêtes Fantômes. Là-bas, elles sont devenues mes amies.[new] -Je ne peux plus utiliser la magie -blanche, mais en contrepartie, mes -pouvoirs d'invocation et de magie noire -se sont développés![new] +Je ne peux plus utiliser la magie blanche, +mais en contrepartie, mes pouvoirs +d'invocation et de magie noire se sont +développés![new] Mais dans le Monde Fantôme, le temps s'écoule différemment...[new] -[bold]Rosa[normal]: Et c'est pourquoi tu as -grandi si vite?[new] +[bold]Rosa[normal]: Et c'est pourquoi tu as grandi +si vite?[new] [bold]Caïn[normal]: Cecil, qui est cette enfant?[new] [bold]Cecil[normal]: C'est Rydia, du village de Mist.[new] [bold]Caïn[normal]: Cette enfant!?[new] [bold]Yang[normal]: Quelle surprise...[new] -[bold]Cecil[normal]: Mais pourquoi nous -aides-tu...? +[bold]Cecil[normal]: Mais pourquoi nous aides-tu...? J'ai tué ta mère...[new] [bold]Rydia[normal]: Ne dis rien! -La Reine du Monde Fantôme m'a dit -qu'un destin bien plus grand était en +La Reine du Monde Fantôme m'a dit qu'un +destin bien plus grand était en mouvement...[new] Que nous devons nous dresser contre lui...[new] @@ -1724,8 +1696,7 @@ bon!»[new] [bold]Cid[normal]: Euh? Où est Yang?[new] [bold]Rosa[normal]: Il...[new] -[bold]Cecil[normal]: Pour détruire le super -canon...[new] +[bold]Cecil[normal]: Pour détruire le super canon...[new] [bold]Cid[normal]: Je vois... Yang...[new] [bold]Rydia[normal]: Sniff...[new] @@ -1744,8 +1715,8 @@ la surface, je scellerai le trou avec cette bombe![end] [bold]Cid[normal]: Golbez! -L'ingénieur aéronautique Cid va -te montrer son chef-d'uvre![end] +L'ingénieur aéronautique Cid va te +montrer son chef-d'uvre![end] [bold]Cid[normal]: Écoutez! Magnez-vous, allez à Baron![end] @@ -1788,8 +1759,7 @@ présentés?[new] maître ninja Edge![new] [bold]Rubicante[normal]: Eblana? Qu'est-ce que c'est?[new] -[bold]Edge[normal]: Demande donc à ta -conscience![end] +[bold]Edge[normal]: Demande donc à ta conscience![end] [bold]Cecil[normal]: Ça va?[new] [bold]Edge[normal]: Quelle honte... que moi, je @@ -1821,11 +1791,10 @@ Tout le monde... tout le monde![new] [bold]Cecil[normal]: ...L'adversaire est le plus puissant des Quatre Élémentaux. -On ne sait même pas si on a une -chance![new] +On ne sait même pas si on a une chance! Mais nous devons récupérer les cristaux![new] -[bold]Edge[normal]: ...Une si jolie fille qui pleure... -je n'ai pas le choix... +[bold]Edge[normal]: ...Une si jolie fille qui pleure... je +n'ai pas le choix... Bon, unissons nos forces![new] [bold]Caïn[normal]: Franchement, ce prince et sa grande gueule malgré son état... @@ -1839,8 +1808,8 @@ Ils gagnent du terrain sur nous![end] [bold]Edge[normal]: Papa! Maman![end] -[bold]Reine Eblana[normal]: Je suis si contente de -te voir ici![new] +[bold]Reine Eblana[normal]: Je suis si contente de te +voir ici![new] [bold]Edge[normal]: Dieu merci, tu vas bien! Oh, maman... J'étais si inquiet...[new] @@ -1880,8 +1849,7 @@ comme cela. Je ne suis pas comme les autres. Je veux combattre à armes égales.[new] [bold]Edge[normal]: Ferme-la! -La mort est encore trop bonne pour -toi![new] +La mort est encore trop bonne pour toi![new] [bold]Rubicante[normal]: J'aime les gens courageux comme toi! ...Mais aussi longtemps que les humains se laisseront piéger pas des @@ -1896,10 +1864,10 @@ Je vais te montrer cette chose ... ...qu'est la rage![music][0xb] [0xfa]La rage a révélé les pouvoirs cachés de Edge! [0xfa]Edge a appris Suiton et Raijin! -[bold]Rubicante[normal]: Oh...ainsi, la rage donne -de la force aux humains... -Mais la glace elle-même ne peut -pénétrer mon manteau de flammes![end] +[bold]Rubicante[normal]: Oh...ainsi, la rage donne de la +force aux humains... +Mais la glace elle-même ne peut pénétrer +mon manteau de flammes![end] [bold]Rubicante[normal]: Maintenant je vais vous soigner! @@ -1922,8 +1890,8 @@ combattrons! Où est Rubicante?![end] [bold]Edge[normal]: C'est fini![new] -[bold]Chambellan[normal]: Ah, comme on s'y -attendait de notre jeune maître![new] +[bold]Chambellan[normal]: Ah, comme on s'y attendait +de notre jeune maître![new] [bold]Edge[normal]: C'est grâce à eux![new] [bold]Chambellan[normal]: Vous tous![end] @@ -1934,8 +1902,8 @@ d'aller sur la Lune![new] [bold]Edge[normal]: Cette Lune-là? Mais pourquoi?[new] [bold]Cecil[normal]: Il paraît qu'il y aurait sur la -Lune quelque chose capable de détruire -le monde.[new] +Lune quelque chose capable de détruire le +monde.[new] [bold]Rydia[normal]: Nous devons l'arrêter![new] [bold]Edge[normal]: Golbez! Tout ça à cause de lui... @@ -1945,16 +1913,16 @@ reconstruire le château![end] [bold]Edge[normal]: Ce n'est pas qu'Eblana! Le monde entier est en danger! -Moi aussi, je vais écraser ce Golbez -de mes propres mains![new] +Moi aussi, je vais écraser ce Golbez de +mes propres mains![new] [bold]Chambellan[normal]: Faites bien attention à vous...![new] [bold]Edge[normal]: Je sais! Allez, laissez-moi la suite![new] [bold]Chambellan[normal]: Compris! Je m'occupe de la maison! -Tout le monde, je vous confie notre -jeune maître![new] +Tout le monde, je vous confie notre jeune +maître![new] Allez, on rentre![end] [bold]Tous[normal]: Jeune maître! @@ -1966,17 +1934,15 @@ Que la bonne fortune soit avec vous![new] jusqu'au monde souterrain...[end] [bold]Tellah[normal]: Je suis Tellah! -Je me rendais à Damcyan, mais plus -haut dans le lac, il y a un énorme -monstre.[new] +Je me rendais à Damcyan, mais plus haut +dans le lac, il y a un énorme monstre.[new] Ma magie n'est pas assez forte pour le -battre seul, mais avec votre lame noire... -je devrais pouvoir le vaincre. !? +battre seul, mais avec votre lame noire... je +devrais pouvoir le vaincre. !? Oh![new] Cette fille est une invocatrice, hein? Je sens qu'elle a du talent. -À trois, nous devrions pouvoir y -arriver...[new] +À trois, nous devrions pouvoir y arriver...[new] [bold]Cecil[normal]: On est aussi en route pour Damcyan![new] [bold]Tellah[normal]: Bien, alors c'est d'accord! @@ -2055,35 +2021,33 @@ Demandons aussi à Léviathan et aux autres de nous prêter leur force![end] [bold]Rydia[normal]: C'est ici que j'ai vécu... -Voyons si nous pouvons trouver -quelque chose d'utile par ici.[end] +Voyons si nous pouvons trouver quelque +chose d'utile par ici.[end] [bold]Rydia[normal]: Reine Asura![new] -[bold]Asura[normal]: Ça faisait longtemps, -Rydia...[new] +[bold]Asura[normal]: Ça faisait longtemps, Rydia...[new] [bold]Rydia[normal]: Nous avons besoin de vos pouvoirs![new] [bold]Asura[normal]: Alors je voudrais vous aider... mais je dois d'abord évaluer votre force. -C'est la loi du Monde des Bêtes -Fantômes.[new] -Avez-vous le courage de me défier et -la force de me vaincre?[end] +C'est la loi du Monde des Bêtes Fantômes.[new] +Avez-vous le courage de me défier et la +force de me vaincre?[end] Rydia... -Bien que vous soyez les premiers à -avoir vaincu Asura, la force ne vous -suffira pas pour vous opposer au mal.[new] +Bien que vous soyez les premiers à avoir +vaincu Asura, la force ne vous suffira pas +pour vous opposer au mal.[new] Vous devez posséder une puissante -volonté pour vous guider sur la voie de -la lumière...[new] +volonté pour vous guider sur la voie de la +lumière...[new] Mon esprit a traversé les méandres du temps. Que va-tu répondre? Veux-tu te mesurer à moi?[end] -«Reviens à moi... Caïn... -Rapporte-moi le cristal et reviens à moi...»[new] +«Reviens à moi... Caïn... Rapporte-moi +le cristal et reviens à moi...»[new] [bold]Cecil[normal]: Golbez![end] [bold]Cecil[normal]: Ooh! [0xfa]Caïn a volé le @@ -2121,10 +2085,10 @@ Ont été entendues![end] Le légendaire vaisseau de lumière... Le vaisseau céleste![end] -[bold]Ancien[normal]: Pendant ma prière, j'ai -entendu une voix chaleureuse.[new] -«Venez sur la Lune... Il y a ceux qui -vous attendent sur la Lune!»[new] +[bold]Ancien[normal]: Pendant ma prière, j'ai entendu +une voix chaleureuse.[new] +«Venez sur la Lune... Il y a ceux qui vous +attendent sur la Lune!»[new] [bold]Cecil[normal]: Mais comment!?[end] Soyez maudits! @@ -2175,12 +2139,11 @@ cristaux?[new] [bold]Cecil[normal]: Pour être franc...[new] [bold]Giotto[normal]: Je vois... Afin d'avoir le dernier cristal, Golbez -doit briser le sceau de la grotte située -au sud-ouest.[new] -Ce n'est qu'une question de temps -avant qu'il n'y parvienne. -Je veux que vous preniez le cristal -avant.[new] +doit briser le sceau de la grotte située au +sud-ouest.[new] +Ce n'est qu'une question de temps avant +qu'il n'y parvienne. +Je veux que vous preniez le cristal avant. Luca![end] [bold]Cecil[normal]: Cid...[new] @@ -2210,11 +2173,10 @@ occuper d'un vieux comme moi![new] Cid![end] [0xfa]Née de la bouche d'un dragon, [0xfa]s'élevant -dans les cieux [0xfa]avec Lumière et -Obscurité, [0xfa]une promesse endormie -[0xfa]s'éveillera. [0xfa]Voilée [0xfa]par la lumière [0xfa]de -l'éternité, [0xfa]La Terre Mère sera bénie [0xfa]avec -clémence et salut.[end] +dans les cieux [0xfa]avec Lumière et Obscurité, +[0xfa]une promesse endormie [0xfa]s'éveillera. [0xfa]Voilée +[0xfa]par la lumière [0xfa]de l'éternité, [0xfa]La Terre Mère +sera bénie [0xfa]avec clémence et salut.[end] [bold]Palom[normal]: Ce vieux a appris Météor![new] [bold]Ancien[normal]: Météor...! @@ -2228,8 +2190,7 @@ Je le vaincrai avec Météor![new] Se battre avec haine détruit l'âme! Et dans ton état, Météor est trop dangereux![new] -[bold]Tellah[normal]: Même si cela doit me -détruire! +[bold]Tellah[normal]: Même si cela doit me détruire! Je ne peux pardonner à ce monstre![new] [bold]Ancien[normal]: Comme je m'y attendais. Tu n'as pas changé.[new] @@ -2237,14 +2198,14 @@ Tu n'as pas changé.[new] [bold]Ancien[normal]: Mais Cecil est devenu Paladin. Si vous unissez vos forces...![new] -[bold]Cecil[normal]: Mais pour affronter -Golbez, nous devons retourner à -Baron et prendre un aéronef...[new] +[bold]Cecil[normal]: Mais pour affronter Golbez, +nous devons retourner à Baron et prendre +un aéronef...[new] [bold]Ancien[normal]: Compris... Je vais briser le sceau de la Route du Démon![new] -En tant que Paladin, tu peux traverser -la Route du Démon! +En tant que Paladin, tu peux traverser la +Route du Démon! Va à Baron![new] J'entrerai dans la Tour des Prières et prierai pour vous... @@ -2290,8 +2251,7 @@ La ferme![end] Empereurs. Mais il a tous les cristaux sauf un...[new] [bold]Rosa[normal]: Il est caché dans une grotte -au sud-ouest, de l'autre côté du -magma...[new] +au sud-ouest, de l'autre côté du magma...[new] [bold]Caïn[normal]: On a piqué un aéronef à l'ennemi, mais il n'a pas les modifications de l'Entreprise.[new] @@ -2322,10 +2282,10 @@ Mais merde![end] [bold]Cecil[normal]: Le mur![new] [bold]Rydia[normal]: Il bouge![new] -[bold]Caïn[normal]: Comme on pouvait s'y -attendre de la grotte scellée - même -après avoir pris le cristal, on ne peut -pas se sentir en sécurité![new] +[bold]Caïn[normal]: Comme on pouvait s'y attendre +de la grotte scellée - même après avoir +pris le cristal, on ne peut pas se sentir en +sécurité![new] [bold]Edge[normal]: Alors on va le démolir![end] [bold]Rydia[normal]: On a réussi![new] @@ -2337,16 +2297,16 @@ pas se sentir en sécurité![new] Vous revoilà! Le dernier cristal...[end] -[bold]Cecil[normal]: Nous n'avons pas pu -protéger le cristal...[new] +[bold]Cecil[normal]: Nous n'avons pas pu protéger +le cristal...[new] [bold]Giotto[normal]: Quoi!? Il les a tous![new] Nous n'avons plus d'espoir... à moins que la légende du vaisseau magique ne soit vraie...[new] [bold]Cecil[normal]: Vaisseau magique!?[music][0x0][new] -[bold]Giotto[normal]: Un immense vaisseau qui -existait dans un lointain passé. +[bold]Giotto[normal]: Un immense vaisseau qui existait +dans un lointain passé. Il y a cette légende...[new] «Née de la bouche d'un dragon»[new] ... @@ -2361,8 +2321,8 @@ temple des prières et continue de prier.[new] [bold]Giotto[normal]: Se pourrait-il que cette personne...[new] [bold]Cecil[normal]: ?[new] -[bold]Giotto[normal]: Essaie de ressusciter le -vaisseau magique? +[bold]Giotto[normal]: Essaie de ressusciter le vaisseau +magique? Non! C'est notre seul espoir![new] Mysidia! @@ -2378,8 +2338,8 @@ Babel![end] [bold]Cecil[normal]: ...Cette lumière m'a appelé fils. Qu'était cette lumière?[new] [bold]Ancien[normal]: Je ne sais pas ce qu'était la -lumière sur la Montagne de l'Épreuve, ni -ce que signifie la légende.[new] +lumière sur la Montagne de l'Épreuve, ni ce +que signifie la légende.[new] Mais nous, Mythidiens devons prier pour cette légende. Prier pour celui qui possède la Lumière @@ -2387,8 +2347,8 @@ Sacrée...[new] Tu dois être cette personne![end] [bold]Cid[normal]: Je vais fixer un foret à la -proue du Faucon pour percer la roche -qui bloque le passage vers la surface![new] +proue du Faucon pour percer la roche qui +bloque le passage vers la surface![new] [bold]Rosa[normal]: Tes blessures vont mieux?[new] [bold]Cid[normal]: Ce n'est pas le moment de s'inquiéter des blessures d'un vieil homme![new] @@ -2402,18 +2362,18 @@ n'existe pas![end] [bold]Porom[normal]: Si vous voulez jouer la comédie, faites-le un peu mieux![new] [bold]Cecil[normal]: Toi aussi, Golbez t'a...[new] -[bold]Beigan[normal]: Je vous prie d'arrêter de -parler ainsi... -Cette personne m'a donné quelque -chose de merveilleux.[new] +[bold]Beigan[normal]: Je vous prie d'arrêter de parler +ainsi... +Cette personne m'a donné quelque chose +de merveilleux.[new] Un pouvoir si magnifique![end] Vous avez fait de Léviathan votre allié. Mais cela aurait pu se faire sans le pouvoir de la Lumière.[new] Le jugement final pour savoir si la vraie -Lumière réside en vous... sera rendu par -le Dieu des Bêtes Fantômes... +Lumière réside en vous... sera rendu par le +Dieu des Bêtes Fantômes... Bahamut![end] [0xfa]Rydia a appris Bahamut![music][0x29][delay][0x28][end] @@ -2431,18 +2391,18 @@ inébranlable![new] [bold]Cecil[normal]: J'ai entendu dire que Cid a été capturé... c'est vrai?[new] [bold]Beigan[normal]: Quelques gardes et moi avons -essayé de le sauver, mais hélas, je suis -le seul survivant...[new] +essayé de le sauver, mais hélas, je suis le +seul survivant...[new] [bold]Cecil[normal]: Je vois... Alors joins-toi à nous! À six, on a nos chances![new] -[bold]Beigan[normal]: Oui, Cecil! [0xfa]Le capitaine -des gardes, [0xfa]Beigan, a rejoint l'équipe! [music][0x29][delay][0x28][end] +[bold]Beigan[normal]: Oui, Cecil! [0xfa]Le capitaine des +gardes, [0xfa]Beigan, a rejoint l'équipe! [music][0x29][delay][0x28][end] [bold]Cid[normal]: Bien! Au boulot![end] -[bold]Cecil[normal]: Mon cur bat la chamade...![end] +[bold]Cecil[normal]: Mon cœur bat la chamade...![end] [bold]Ancien[normal]: Va à Baron par la Route du Démon à l'est de cette ville. @@ -2476,8 +2436,8 @@ Je ne sais pas si c'est un présage...[new] [bold]Cecil[normal]: Oui, allons-y.[end] [bold]Soldat[normal]: Oui, mon capitaine![new] -[bold]Soldat[normal]: Il y a de plus en plus de -monstres ces derniers temps...[new] +[bold]Soldat[normal]: Il y a de plus en plus de monstres +ces derniers temps...[new] [bold]Soldat[normal]: Mais il y en a vraiment trop, à présent...[new] [bold]Cecil[normal]: Est-ce qu'il se passerait... @@ -2485,7 +2445,8 @@ quelque chose?[end] [bold]Cecil[normal]: Préparez-vous au combat![end] -«Vous êtes de Baron, hein...»[new] +[force_wicked] +«Vous êtes de Baron, hein...»[new] [bold]Caïn[normal]: Qui est là?[music][0x2d][new] «Partez maintenant et il ne vous fait aucun mal...»[new] @@ -2520,17 +2481,16 @@ Je ne serai pas un fardeau![new] J'en ai bien l'intention. Mais contre TOI, Cecil![new] [bold]Cecil[normal]: Caïn!?[new] -[bold]Caïn[normal]: Un combat d'homme à -homme, Cecil![new] +[bold]Caïn[normal]: Un combat d'homme à homme, +Cecil![new] [bold]Cecil[normal]: Caïn?[new] [bold]Caïn[normal]: Tue-moi si tu peux![end] [bold]Yang[normal]: Cecil! Maintenant, c'est à nous de nous battre pour toi.[new] -Nous devons discuter d'un plan -d'attaque, mais tout d'abord il faut nous -reposer.[new] +Nous devons discuter d'un plan d'attaque, +mais tout d'abord il faut nous reposer.[new] [bold]Cecil[normal]: Merci, Yang...[end] Bam![end] @@ -2584,8 +2544,8 @@ Ma danse![end] «Fufufu... Votre entraînement est insuffisant.»[end] -[bold]Palom[normal]: Je le sais même sans qu'on -me le dise![end] +[bold]Palom[normal]: Je le sais même sans qu'on me +le dise![end] [bold]Porom[normal]: Palom! L'Ancien dit qu'il ne faut pas être @@ -2599,8 +2559,7 @@ pour ton ancien ami... Mais je lui ai envoyé Scarmiglione...[new] Scarmiglione est un des quatre Empereurs des Éléments. -Il nous a promis un divertissant -spectacle.[new] +Il nous a promis un divertissant spectacle. Qu'en penses-tu, Rosa?[end] [bold]Caïn[normal]: Oui, maître![new] @@ -2612,12 +2571,11 @@ Fais attention![end] [bold]Tellah[normal]: Cecil![end] [bold]Porom[normal]: Mais tais-toi donc![new] -[bold]Tellah[normal]: Cecil, pourquoi -êtes-vous venu ici?[new] -[bold]Cecil[normal]: Je suis venu pour être -paladin. -Je ne peux pas vaincre Golbez avec -la lame noire...[new] +[bold]Tellah[normal]: Cecil, pourquoi êtes-vous +venu ici?[new] +[bold]Cecil[normal]: Je suis venu pour être paladin. +Je ne peux pas vaincre Golbez avec la +lame noire... Je dois laisser mon passé derrière moi...[end] [bold]Tellah[normal]: Golbez est à l'origine de @@ -2627,8 +2585,8 @@ tout le mal![end] C'est bien ce que je sentais, il doit y avoir un pouvoir mystérieux caché dans cette montagne![new] -Si vous cherchez à contrer Golbez, -je me joins à vous! [0xfa]Le sage Tellah a +Si vous cherchez à contrer Golbez, je +me joins à vous! [0xfa]Le sage Tellah a rejoint l'équipe![music][0x29][delay][0x28][end] [bold]Scarmiglione[normal]: GRRRR-BAAAH![end] @@ -2643,10 +2601,9 @@ Qui es-tu?[end] [bold]Porom[normal]: Il attaque![end] [bold]Tellah[normal]: !? -Mé... ...téor?[new] +Mé... ...téor? Cette lumière m'a donné l'ultime magie -noire, Météor! [0xfa]Tellah apprend -Météor![music][0x29][delay][0x28][end] +noire, Météor! [0xfa]Tellah apprend Météor![music][0x29][delay][0x28][end] [bold]Palom[normal]: Hé, tiens bon![end] @@ -2706,8 +2663,7 @@ idiot! Ne nous meurs pas dessus![new] [bold]Yang[normal]: Maître Tellah... Il est...[new] -[bold]Cid[normal]: Repose en paix... avec ta -fille...[end] +[bold]Cid[normal]: Repose en paix... avec ta fille...[end] [bold]Caïn[normal]: ...Cecil! Je... je suis désolé...[new] @@ -2760,8 +2716,8 @@ quelqu'un![new] [bold]Cid[normal]: N'est-ce pas, hein? On part demain.[new] Je ne peux pas chercher d'entrées de -mondes d'en dessous sans une bonne -nuit de sommeil![end] +mondes d'en dessous sans une bonne nuit +de sommeil![end] [bold]Cecil[normal]: Mais... pourquoi Golbez ne m'a-t-il pas tué...? @@ -2769,29 +2725,41 @@ Qui est-il..?[end] [bold]Rosa[normal]: Qu'y a-t-il?[end] -[0xfa]Ainsi, le chevalier noir [0xfa]Cecil perdit -sa place [0xfa]de capitaine des Ailes Rouges. -[0xfa]Lui et le chevalier dragon [0xfa]Caïn -reçurent l'ordre [0xfa]de se rendre à Mist, [0xfa]un -village provincial situé [0xfa]par-delà les -montagnes [0xfa]dans une vallée recouverte -[0xfa]par un épais brouillard... [0xfa]Les aéronefs... -[0xfa]Le vol fut longtemps [0xfa]un rêve inaccessible -[0xfa]de l'humanité. [0xfa]Ces vaisseaux donnèrent -[0xfa]aux hommes le pouvoir [0xfa]de s'élever dans -les cieux. [0xfa]Très vite, [0xfa]comme toute -création [0xfa]humaine, il devint un [0xfa]outil de la -cupidité. [0xfa]Le pays de Baron devint [0xfa]la plus -forte puissance [0xfa]militaire au monde [0xfa]par -leurs aéronefs, [0xfa]les Ailes Rouges... [0xfa]Mais -pourquoi un pays aussi [0xfa]puissant -recherche-t-il [0xfa]les cristaux? [0xfa]Quel pouvoir -recèlent-ils? [0xfa]Pourquoi l'humanité -[0xfa]corrompt-elle chaque [0xfa]réalisation de ses -rêves? [0xfa]Et pourquoi les monstres [0xfa]se -font-ils toujours plus nombreux, [0xfa]même en -plein jour? [0xfa]Les cristaux luisaient -[0xfa]silencieusement...[end] +[force_book]Ainsi, le chevalier noir +Cecil perdit sa place de +capitaine des Ailes Rouges.[new] +Lui et le chevalier dragon +Caïn reçurent l'ordre de se +rendre à Mist, un village +provincial situé par-delà les +montagnes dans une vallée +recouverte par un épais +brouillard...[new] +Les aéronefs... +Le vol fut longtemps un rêve +inaccessible de l'humanité.[new] +Ces vaisseaux donnèrent aux +hommes le pouvoir de s'élever +dans les cieux.[new] +Très vite, comme toute +création humaine, il devint un +outil de la cupidité.[new] +Le pays de Baron devint la +plus forte puissance militaire +au monde par leurs aéronefs, +les Ailes Rouges...[new] +Mais pourquoi un pays aussi +puissant recherche-t-il les +cristaux? +Quel pouvoir recèlent-ils?[new] +Pourquoi l'humanité +corrompt-elle chaque +réalisation de ses rêves?[new] +Et pourquoi les monstres se +font-ils toujours plus +nombreux, même en plein jour?[new] +Les cristaux luisaient +silencieusement...[end] [bold]Cecil[normal]: Rosa![end] @@ -2809,7 +2777,7 @@ Bon, ben, j'y vais![end] [0xfa]Tu as le cristal d'Obscurité![music][0x29][delay][0x24][end] [bold]Cecil[normal]: Mais...[new] -[bold]Palom[normal]: Tu nous as vus à l'uvre, non?[new] +[bold]Palom[normal]: Tu nous as vus à l'œuvre, non?[new] [bold]Porom[normal]: Oui![new] [bold]Tellah[normal]: Pas d'inquiétude. Je suis avec vous![new] @@ -2825,8 +2793,8 @@ La Montagne de l'Épreuve t'a accepté et tu en es revenu vivant.[new] Tu dois avoir une destinée bien plus importante que je ne peux l'entrevoir... -Je voudrais bien vous accompagner, -mais je ne peux quitter Mythidia.[new] +Je voudrais bien vous accompagner, mais +je ne peux quitter Mythidia.[new] Cecil, Tellah... Prenez soin de ces deux enfants pour moi![end] @@ -2854,8 +2822,7 @@ Nous devons vaincre Golbez!![new] [bold]Caïn[normal]: Tu ne peux pas les semer!?[new] [bold]Cid[normal]: Merde, cet aéronef devrait être plus rapide que les leurs! -Ils ont dû aussi modifier les Ailes -Rouges![new] +Ils ont dû aussi modifier les Ailes Rouges! Qui est-ce qu'ils ont pris pour faire ça?[end] [bold]Rydia[normal]: Ils approchent![new] @@ -2890,16 +2857,15 @@ combattre avec vous![new] Ouvre la porte!![new] [bold]Yang[normal]: Aaaagh![end] -[bold]Porom[normal]: Ben oui, quoi, c'est un -paladin![new] +[bold]Porom[normal]: Ben oui, quoi, c'est un paladin![new] [bold]Palom[normal]: Même si je ne le croyais pas possible.[new] [bold]Cecil[normal]: Comment ça?[new] [bold]Ancien[normal]: J'ai honte... Palom et Porom étaient chargés de t'espionner.[new] -Mais il semble que c'était inutile en fin -de compte. +Mais il semble que c'était inutile en fin de +compte. Bon travail, Palom et Porom![end] [0xfa]Rydia apprend Asura![music][0x29][delay][0x28][end] @@ -2913,8 +2879,8 @@ Tu es..!![end] [bold]Tellah[normal]: Anna! Anna![delay][0x2b][end] -[bold]Tellah[normal]: Il représentait tant que ça -pour toi..?[new] +[bold]Tellah[normal]: Il représentait tant que ça pour +toi..?[new] [bold]Anna[normal]: Père... pardonne-moi... J'aime Edward..![end] @@ -2935,8 +2901,7 @@ entrer![end] [bold]Cecil[normal]: Yang![music][0x2a][delay][0x30][end] -[0xfa]Tu as trouvé le Livre de la -Connaissance![end] +[0xfa]Tu as trouvé le Livre de la Connaissance![end] [0xfa]Tu as trouvé un magazine coquin![end] @@ -2962,8 +2927,8 @@ Tu veux voir le roi? Je ne suis pas aussi pathétique que Scarmiglione![new] C'est un miracle qu'un cadavre animé -bouffe-charognes comme lui ait été l'un -de nous quatre! +bouffe-charognes comme lui ait été l'un de +nous quatre! Hé hé hé hé hé![new] [bold]Cecil[normal]: Alors tu es...![end] @@ -3011,8 +2976,8 @@ la mort... Soyez maudits, robots et humains![new] L'au-delà est l'ultime expérience... Vous croyez avoir gagné? -Cette tour relie les deux mondes, celui -du dessus et celui du dessous...[new] +Cette tour relie les deux mondes, celui du +dessus et celui du dessous...[new] Les cristaux y ont déjà été amenés par Rubicante! Hahahahaha![new] diff --git a/text/fr/bank1-2.xml b/text/fr/bank1-2.xml index c3208b1..15aa14d 100644 --- a/text/fr/bank1-2.xml +++ b/text/fr/bank1-2.xml @@ -1,13 +1,13 @@ Une force mystérieuse entoure ce lieu. -Tu peux utiliser une tente ou une -cabine, et sauvegarder.[end] +Tu peux utiliser une tente ou une cabine, +et sauvegarder.[end] [bold]Golbez[normal]: C'est terminé...[new] [bold]FuSoYa[normal]: Quelle tragédie... -Il avait de si fantastiques pouvoirs, mais -il était rongé par le mal...[new] +Il avait de si fantastiques pouvoirs, mais il +était rongé par le mal...[new] [bold]Edge[normal]: Yahoo!![end] [bold]FuSoYa[normal]: Oh, vous êtes venus![end] @@ -25,13 +25,13 @@ n'aurez rien à craindre! Plein gaz, les gars!![end] [bold]Edward[normal]: Cecil! -Je vais vous montrer le courage que -vous m'avez enseigné![end] +Je vais vous montrer le courage que vous +m'avez enseigné![end] -[bold]Edge[normal]: Et me voici, gonflé à bloc -pour combattre ce salaud! -Ah, bon... il ne faut pas transpirer -devant les dames.[new] +[bold]Edge[normal]: Et me voici, gonflé à bloc pour +combattre ce salaud! +Ah, bon... il ne faut pas transpirer devant +les dames.[new] [bold]Golbez[normal]: Cecil...[end] [bold]Giotto[normal]: Feu à volonté, force des chars @@ -51,13 +51,13 @@ Un travail d'intérieur![end] [bold]Palom[normal]: Hé bien, au fond, c'est un échange.[new] -[bold]Porom[normal]: Je suis désolée que nous -vous ayons trompé. +[bold]Porom[normal]: Je suis désolée que nous vous +ayons trompé. Mais nous n'avions pas le choix.[new] [bold]Cecil[normal]: Je comprends. Vu mon passé, c'était prévisible.[new] -[bold]Ancien[normal]: Mais tu as purgé la noirceur -de ton âme... et reçu la lumière sacrée. !? +[bold]Ancien[normal]: Mais tu as purgé la noirceur de +ton âme... et reçu la lumière sacrée. !? Ce n'est pas possible..! Cette épée?![new] [bold]Cecil[normal]: La lumière de la montagne me @@ -73,8 +73,7 @@ La légende de Mythidia![new] [bold]Edge[normal]: Comme si j'allais te croire! Et si tu redevenais mauvais?[end] -[bold]Caïn[normal]: ...Si c'était le cas, n'hésite -pas... +[bold]Caïn[normal]: ...Si c'était le cas, n'hésite pas... Tue-moi![end] [bold]Caïn[normal]: ...Moi aussi, je viens. @@ -124,10 +123,10 @@ Ne sais-tu donc même pas qui tu es!?[new] [bold]Golbez[normal]: ....Non... Qu'est-ce que j'ai fait?... -Seigneur... qu'est-ce que j'ai fait? -...J'étais rempli de tant de haine....[new] -[bold]FuSoYa[normal]: ...Tu as recouvré tes sens. -...Ton père...Dis-moi le nom de ton père![new] +Seigneur... qu'est-ce que j'ai fait? ...J'étais +rempli de tant de haine....[new] +[bold]FuSoYa[normal]: ...Tu as recouvré tes sens. ...Ton +père...Dis-moi le nom de ton père![new] [bold]Golbez[normal]: Mon père... KluYa...[new] [bold]Cecil[normal]: QUOI!?[new] @@ -137,8 +136,8 @@ frère de....[new] [bold]Cecil[normal]: Golbez est mon...[new] [bold]FuSoYa[normal]: Tu étais contrôlé par Zémus... Ceux de sang lunien sont sensibles aux -pouvoirs psychiques, et donc plus faciles -à contrôler...[new] +pouvoirs psychiques, et donc plus faciles à +contrôler...[new] Tu étais son pantin contre ton gré...[end] [bold]Edge[normal]: Qu'est-ce que![new] @@ -162,8 +161,7 @@ moi-même![end] [bold]FuSoYa[normal]: Attends![end] -[bold]FuSoYa[normal]: Zémus est aussi de notre -race! +[bold]FuSoYa[normal]: Zémus est aussi de notre race! Je vais venir avec toi...!![end] [bold]Golbez[normal]: Adieu, Cecil....[end] @@ -203,27 +201,27 @@ pardonner, mais...[end] [bold]Rosa[normal]: Golbez est le frère de Cecil...[new] [bold]Cecil[normal]: ...[new] -[bold]Rosa[normal]: Golbez et Cecil ont -du sang des Luniens, une race évoluée -qui hiberne sur la lune.[new] +[bold]Rosa[normal]: Golbez et Cecil ont du +sang des Luniens, une race évoluée qui +hiberne sur la lune.[new] Un Lunien, Zémus, voulait asservir la Terre, alors il a utilisé Golbez pour rassembler les cristaux.[new] -Par ailleurs, un autre Lunien, FuSoYa, -a désenvoûté Golbez...[new] +Par ailleurs, un autre Lunien, FuSoYa, a +désenvoûté Golbez...[new] [bold]Rydia[normal]: Et alors Golbez a accompagné FuSoYa sur la lune pour anéantir Zémus.[new] [bold]Caïn[normal]: Golbez est.... le frère de Cecil..?[end] -[bold]Edge[normal]: Ah, croyez-moi, je vais aussi -y aller! +[bold]Edge[normal]: Ah, croyez-moi, je vais aussi y +aller! Entre Zémus et vous, au moins, je suis sûr d'avoir de l'action![new] -En plus, je ne vais pas rester à -regarder Zémus jouer avec la vie des -gens comme ça![new] +En plus, je ne vais pas rester à regarder +Zémus jouer avec la vie des gens comme +ça![new] [bold]Caïn[normal]: Edge...[new] [bold]Cecil[normal]: Allons-y...[end] @@ -262,10 +260,9 @@ je ne bouge pas d'un pouce.[new] [bold]Cecil[normal]: Quoi!! Rosa! C'est dangereux, là dehors![new] -[bold]Rosa[normal]: Tant que je suis auprès de -toi, quoi qu'il arrive...[music][0x13] ... non, tant que je -suis avec toi, je me fiche bien du -danger![new] +[bold]Rosa[normal]: Tant que je suis auprès de toi, +quoi qu'il arrive...[music][0x13] ... non, tant que je suis +avec toi, je me fiche bien du danger![new] [bold]Cecil[normal]: Rosa...[new] [bold]Caïn[normal]: ....Allez, Cecil...[new] [bold]Edge[normal]: Ouais, laisse-la venir! @@ -319,8 +316,8 @@ Urgh...Gyaa... Gyaaaaaaaaammmmmmm!!!!»[end] [bold]FuSoYa[normal]: Incroyable![end] -[bold]FuSoYa[normal]: Dire que vous aviez autant -de puissance.... +[bold]FuSoYa[normal]: Dire que vous aviez autant de +puissance.... La Planète Bleue a tant évolué pendant que nous dormions?[new] [bold]Edge[normal]: Ha! @@ -338,8 +335,8 @@ Je ne pouvais me résoudre à désobéir aux ordres du Roi. Maintenant, je viens rechercher le pardon.[new] -[bold]Ancien[normal]: Même si tu t'excuses, cela ne -va pas ramener les gens que tu as +[bold]Ancien[normal]: Même si tu t'excuses, cela ne va +pas ramener les gens que tu as assassinés.[new] [bold]Cecil[normal]: ...[new] [bold]Ancien[normal]: Toutefois... @@ -347,14 +344,13 @@ Je sens une pâle lueur en toi qui n'était pas là avant.[new] Cela vaudrait peut-être la peine d'écouter ce que tu as à dire.[new] -[bold]Cecil[normal]: Je combats Golbez, -l'homme qui contrôle Baron.[new] +[bold]Cecil[normal]: Je combats Golbez, l'homme +qui contrôle Baron.[new] Quand mes amis et moi-même essayions d'empêcher le vol du cristal du vent... il a enlevé l'une des nôtres.[new] Nous étions partis la sauver, mais -Léviathan nous a attaqués, et -maintenant...[new] +Léviathan nous a attaqués, et maintenant...[new] [bold]Ancien[normal]: ...Tu as perdu tes amis... Il semble que le destin ait choisi de te faire subir cette épreuve. @@ -363,22 +359,21 @@ Tu cherches à détruire une immense noirceur... mais tant que tu te fieras à la lame noire, tu ne pourras pas vaincre le mal véritable.[new] -Ton âme est entachée par la noirceur -de tes actions... +Ton âme est entachée par la noirceur de +tes actions... Le mal est comme un cancer.[new] Il se répand, consumant entièrement l'âme. Tu pourrais devenir aussi mauvais que l'homme que tu poursuis...[new] -Si tu souhaites changer ta pâle lueur -en lumière rayonnante, alors va sur la +Si tu souhaites changer ta pâle lueur en +lumière rayonnante, alors va sur la montagne de l'Épreuve à l'est.[new] -[bold]Cecil[normal]: Mais je dois sauver mon -amie![new] -[bold]Ancien[normal]: Si tu chéris vraiment cette -amie, tu devras endurer cette épreuve... -et être baigné dans la lumière purifiante -de la rédemption au sommet...[new] +[bold]Cecil[normal]: Mais je dois sauver mon amie![new] +[bold]Ancien[normal]: Si tu chéris vraiment cette amie, +tu devras endurer cette épreuve... et être +baigné dans la lumière purifiante de la +rédemption au sommet...[new] Tu dois renoncer à ta lame moire et recevoir le pouvoir du chevalier sacré... le paladin! @@ -401,19 +396,17 @@ Porom![end] «Bienvenue!»[end] [bold]Cecil[normal]: Qui es-tu...?[new] -[bold]Vieil Homme[normal]: Je suis FuSoYa, -gardien du peuple endormi de la Lune, -les Luniens.[new] +[bold]Vieil Homme[normal]: Je suis FuSoYa, gardien +du peuple endormi de la Lune, les Luniens.[new] [bold]Rosa[normal]: Luniens?[new] [bold]FuSoYa[normal]: En effet. Il y a très longtemps...[new] Nous sommes le peuple d'une planète -jadis détruite, située entre la quatrième -et la cinquième planète du système -solaire.[new] +jadis détruite, située entre la quatrième et +la cinquième planète du système solaire.[new] Pendant les derniers jours de notre -monde, nous construisîmes un vaisseau -et voyageâmes vers la Planète Bleue...[new] +monde, nous construisîmes un vaisseau et +voyageâmes vers la Planète Bleue...[new] Le voyage fut long... il nous fallut hiberner pour survivre.[new] [bold]Cecil[normal]: La Planète Bleue...?[new] @@ -425,19 +418,19 @@ Alors nous créâmes une autre lune et continuâmes à dormir...[end] [bold]Edge[normal]: Une autre lune?[new] -[bold]FuSoYa[normal]: Mais l'un des nôtres refusa -de dormir... +[bold]FuSoYa[normal]: Mais l'un des nôtres refusa de +dormir... Il voulait purger votre planète de tout être vivant pour pouvoir nous y installer.[new] [bold]Rydia[normal]: Quelle horreur...![new] [bold]FuSoYa[normal]: ...Il était un brillant mais impatient homme. -Nous tentâmes de le raisonner, mais il -ne voulut pas nous écouter.[new] +Nous tentâmes de le raisonner, mais il ne +voulut pas nous écouter.[new] Au lieu de cela, il devint amer et rancunier...[new] -Il créa la Tour de Bab-Ilu afin de donner -à l'humanité l'outil pour se détruire +Il créa la Tour de Bab-Ilu afin de donner à +l'humanité l'outil pour se détruire d'elle-même.[new] C'est alors que je forçai cet homme à dormir, mais son esprit était toujours @@ -465,24 +458,23 @@ l'humanité... le géant de Bab-Ilu![new] [bold]Rosa[normal]: Le[new] «chemin vers la Lune»[new] ... c'est ça...? -[bold]FuSoYa[normal]: Mais le reste des nôtres -n'est pas comme ça...[new] -Nous voulions attendre que les gens de -la Planète Bleue fussent suffisamment +[bold]FuSoYa[normal]: Mais le reste des nôtres n'est +pas comme ça...[new] +Nous voulions attendre que les gens de la +Planète Bleue fussent suffisamment avancés... pour pouvoir parler avec nous, partager nos espoirs, nos craintes, nos expériences, et nos destins.[new] Ensemble, nos peuples unis eussent tant pu faire... Nous... rêvions de ce jour...[new] -[bold]Cecil[normal]: Et le vaisseau céleste qui -nous a amenés ici?[new] +[bold]Cecil[normal]: Et le vaisseau céleste qui nous +a amenés ici?[new] [bold]FuSoYa[normal]: Il n'y a pas si longtemps, mon -frère cadet, KluYa, le construisit et -partit sur la Planète Bleue.[new] -KlûYa était passionné par votre monde -et souvent parlait d'aider votre -évolution...[new] +frère cadet, KluYa, le construisit et partit +sur la Planète Bleue.[new] +KlûYa était passionné par votre monde et +souvent parlait d'aider votre évolution...[new] Il bâtit la Route du Démon, et donna à votre peuple la technologie pour construire des aéronefs.[new] @@ -504,13 +496,12 @@ Montagne de l'Épreuve, c'était...[new] C'était l'esprit de KluYa... Je vois, à présent... tu ressembles tellement à KluYa... quand il était jeune...[new] -[bold]Cecil[normal]: Cette voix, c'était... mon -père...![new] +[bold]Cecil[normal]: Cette voix, c'était... mon père...![new] [bold]FuSoYa[normal]: KluYa t'a donné sa puissance pour combattre Zémus... Nous devons l'arrêter![new] -Pour les gens de la Lune et de la -Planète Bleue! +Pour les gens de la Lune et de la Planète +Bleue! Hâtons-nous vers la tour de Bab-Ilu![new] [bold]Edge[normal]: La tour de Bab-Ilu!? Mais elle est entourée d'une barrière![end] @@ -527,10 +518,9 @@ Zéromus...[end] [bold]Rosa[normal]: Tant qu'il y aura des curs maléfiques...[new] -[bold]FuSoYa[normal]: Chacun porte tant le bien -que le mal en son cur... exactement -comme il y a des cristaux de Lumière et -d'Obscurité...[new] +[bold]FuSoYa[normal]: Chacun porte tant le bien que +le mal en son cur... exactement comme il y +a des cristaux de Lumière et d'Obscurité...[new] Le mal jamais ne disparaîtra... mais tant que les humains continueront de se soutenir, chérissant les idéaux de vertu, @@ -589,14 +579,13 @@ Je t'ai causé...tant de souffrances... Qui plus est...[new] J'ai été arrogant... impitoyable,...rancunier... -Maintenant, je suis devant toi un -homme... brisé... vaincu...et repentant.[new] +Maintenant, je suis devant toi un homme... +brisé... vaincu...et repentant.[new] Peut-être... pourrai-je soulager dans le sommeil le tourment de mon âme...[end] [bold]FuSoYa[normal]: Il nous faut à présent partir... -Je prie pour la paix sur la Planète -Bleue.[end] +Je prie pour la paix sur la Planète Bleue.[end] [bold]Rosa[normal]: Cecil...[new] [bold]Caïn[normal]: Cecil, pardonne-lui @@ -612,49 +601,45 @@ Adieu... ...mon frère![end] [bold]Ancien[normal]: Bien! Le sujet de la leçon d'aujourd'hui est la -Transfiguration et la Téléportation. [delay][0x18] -As-tu exercé ton sort[new] +Transfiguration et la Téléportation. [delay][0x18] As-tu +exercé ton sort[new] «Issue»[new] ? [bold]Porom[normal]: Oui, monsieur.[delay][0x18][new] -[bold]Ancien[normal]: Et ton sort Zone X, -Palom...? +[bold]Ancien[normal]: Et ton sort Zone X, Palom...? Palom?[new] [bold]Porom[normal]: Pas encore!![delay][0x18][close_window][end] [bold]Palom[normal]: Et alors, j'ai tué d'une seule main les hordes déferlantes de morts- vivants du mont de l'Épreuve.[new] -Comme tu peux l'imaginer,[delay][0x18] j'étais -fatigué, mais pas de repos pour les -braves![new] +Comme tu peux l'imaginer,[delay][0x18] j'étais fatigué, +mais pas de repos pour les braves! Cecil avait besoin que je lance mon puissant sort[new] «Gel»[new] ... [delay][0x18] Il a dit que j'étais bien plus héroïque que lui...[new] -Ah, je peux lire au fond de tes yeux -que tu le penses aussi... [delay][0x18] Qu'est-ce que -tu dirais de trouver un coin plus -tranquille où je pourrais te montrer -quelque chose, hem... de tout aussi... -impressionnant...?[delay][0x10][close_window][end] +Ah, je peux lire au fond de tes yeux que +tu le penses aussi... [delay][0x18] Qu'est-ce que tu +dirais de trouver un coin plus tranquille où +je pourrais te montrer quelque chose, +hem... de tout aussi... impressionnant...?[delay][0x10][close_window][end] [bold]Palom[normal]: Ouyouyouille![new] [bold]Porom[normal]: Espèce de petit pervers![new] -[bold]Palom[normal]: J'allais juste lui[delay][0x18] montrer -mon... heu... +[bold]Palom[normal]: J'allais juste lui[delay][0x18] montrer mon... +heu... Bâton de Feu![new] [bold]Porom[normal]: Ouais, je parie... Notre ancien est vraiment furieux après toi! Allez![delay][0x10][close_window][end] -[bold]Ancien[normal]: Combien de fois devrai-je te -dire de ne pas sécher les leçons? [delay][0x18] -Qu'est-ce qu'il faut que je fasse pour -venir à bout d'un précoce monsieur -je-sais-tout?[new] +[bold]Ancien[normal]: Combien de fois devrai-je te dire +de ne pas sécher les leçons? [delay][0x18] Qu'est-ce +qu'il faut que je fasse pour venir à bout +d'un précoce monsieur je-sais-tout?[new] Peut-être que de recopier des sorts va t'aider à voir l'importance des leçons! [delay][0x18][close_window][end] @@ -663,17 +648,17 @@ t'aider à voir l'importance des leçons! [delay][0x18][close_window][end][bold]Porom[normal]: Tu l'as bien cherché![delay][0x10][close_window][end] -[bold]Chambellan[normal]: ...En, outre, vous -manquez de discipline pour être un -dirigeant efficace... [delay][0x18][close_window][end] +[bold]Chambellan[normal]: ...En, outre, vous manquez +de discipline pour être un dirigeant +efficace... [delay][0x18][close_window][end] [bold]Edge[normal]: Assez! Je te demande quelques suggestions pour que je m'améliore... [delay][0x18] et tu me sors une un roman gigantesque! [delay][0x10][close_window][end] -[bold]Chambellan[normal]: Je n'ai même pas -encore commencé. +[bold]Chambellan[normal]: Je n'ai même pas encore +commencé. Ensuite, vos compagnes laissent quelque peu à désirer... [delay][0x18][new] [bold]Edge[normal]: Qu'est-ce qu'elles ont qui ne @@ -682,9 +667,9 @@ Il se trouve que j'aime les femmes... [delay][0x18][new] [bold]Chambellan[normal]: Ce n'est pas ce que je voulais dire. vous vous cognez[new] «accidentellement»[new] -dans chaque jolie fille que vous voyez, -et vous êtes pris[delay][0x18] de convulsions quand il -y en a une qui se penche pour ramasser +dans chaque jolie fille que vous voyez, et +vous êtes pris[delay][0x18] de convulsions quand il y +en a une qui se penche pour ramasser quelque chose. [bold]Edge[normal]: Bon, bon! Je vais me ranger! [delay][0x18][new] @@ -693,20 +678,20 @@ pour changer! [delay][0x18][close_window][end] [bold]Edge[normal]: Mais Rydia... Beauté, intelligence, et une langue -acérée... [delay][0x18] Maintenant, il y a une femme -qui peut me faire me ranger![new] +acérée... [delay][0x18] Maintenant, il y a une femme qui +peut me faire me ranger![new] Bon sang, ce que j'ai besoin d'elle... [delay][0x18][close_window][end] [bold]Léviathan[normal]: C'est une fille incroyable![new] -[bold]Asura[normal]: Je n'aurais jamais cru qu'elle -irait si loin... [delay][0x18][close_window][end] +[bold]Asura[normal]: Je n'aurais jamais cru qu'elle irait +si loin... [delay][0x18][close_window][end] [bold]Rydia[normal]: N'est-ce pas vrai... Cecil![delay][0x10][close_window][end] [bold]Enfant Monstre[normal]: Hé, Rydia. -Comment ça se fait que j'aie des crocs -et pas toi? +Comment ça se fait que j'aie des crocs et +pas toi? J'aimerais être comme toi.[delay][0x8][close_window][end] [bold]Rydia[normal]: De quoi parles-tu? @@ -716,11 +701,11 @@ aux autres.[new] Alors, tu vois, nous ne sommes pas si différents. [delay][0x18][close_window][end] -[bold]Asura[normal]: Notre monde va être -intéressant dorénavant, tu ne crois pas?[new] -[bold]Léviathan[normal]: Oui![delay][0x10] Elle a même rendu -une ancienne entité comme moi excitée -par l'avenir! +[bold]Asura[normal]: Notre monde va être intéressant +dorénavant, tu ne crois pas?[new] +[bold]Léviathan[normal]: Oui![delay][0x10] Elle a même rendu une +ancienne entité comme moi excitée par +l'avenir! Quelle adorable jeune femme! [delay][0x10][close_window][end] [bold]Rydia[normal]: La beauté intérieure est la @@ -735,21 +720,20 @@ paladin!»[new] fini le travail d'aujourd'hui. Ne voulez-vous pas reconstruire notre château? [delay][0x8][new] -«Ha là là... Mais il n'y a plus de monstres! -»[new] +«Ha là là... Mais il n'y a plus de monstres! »[new] [delay][0x8] [bold]Edward[normal]: C'est ce que le paladin a fait pour nous.[new] Il nous a débarrassés de ces monstres effrayants. [delay][0x11] Mais il y a des choses pires que les monstres.[new] -Nous ne voulons pas que nos mamans -et papas tombent malades et meurent. [delay][0x11] -Voilà pourquoi nous devons reconstruire -notre château.[new] -Et nous avons besoin de l'aide de tout -le monde aide, même vous, petits enfants. -[delay][0x11] Dites-vous... qu'après avoir fini votre +Nous ne voulons pas que nos mamans et +papas tombent malades et meurent. [delay][0x11] Voilà +pourquoi nous devons reconstruire notre +château.[new] +Et nous avons besoin de l'aide de tout le +monde aide, même vous, petits enfants. [delay][0x11] +Dites-vous... qu'après avoir fini votre travail, je vais vous chanter une chanson super-spéciale! [delay][0x10][close_window][end] @@ -768,8 +752,8 @@ que toi et ton père souriiez sur nous...[delay][0x18][close_window][end] +Je suis certain que tu vas rendre à Fabul +sa gloire passée! [delay][0xd][close_window][end] Lali-Ho![delay][0x10][close_window][end] @@ -840,8 +824,7 @@ pardonner..[delay][0x18][close_window][end] [bold]Colliro[normal]: Qu'est-ce qui ne va pas?! [delay][0x10][close_window][end] -«C'est terrible! La lune est en train -de...!»[new] +«C'est terrible! La lune est en train de...!»[new] [delay][0x18][close_window][end] [bold]Cecil[normal]: ...!![delay][0x10][close_window][end] @@ -861,8 +844,8 @@ Probablement...[delay][0x20][close_window][end] [bold]Cid[normal]: Qu'est-ce qui... Vous êtes ENCORE là, tous les deux!? [delay][0x18] -C'est une belle journée, et tout le -monde arrive![new] +C'est une belle journée, et tout le monde +arrive![new] Alors dépêchez-vous![new] [bold]Rosa[normal]: J'en suis désolée.[delay][0x10][close_window][end] @@ -888,14 +871,13 @@ Prends...Prends ceci! Utilise...le![end] [bold]Rosa[normal]: Ça faisait tellement longtemps -que nous n'avions pas vu tout le monde. -[delay][0x18] Ils devraient arriver à partir de +que nous n'avions pas vu tout le monde. [delay][0x18] +Ils devraient arriver à partir de maintenant![new] Cecil, dépêche-toi, toi aussi![new] [bold]Cecil[normal]: J'arrive, Rosa.[delay][0x18][close_window][end] -[bold]Cecil[normal]: Je l'ai entendue... j'en suis -sûr... +[bold]Cecil[normal]: Je l'ai entendue... j'en suis sûr... La voix de mon frère... [delay][0x20] Il a dit... Au revoir... [delay][0x10][close_window][end] @@ -929,13 +911,13 @@ Ils vont...[end] [bold]Ancien[normal]: Écoutez, tout le monde![end] -[bold]Ancien[normal]: Il est temps pour nous de -prier pour eux... ...non, nous devons prier -pour la Terre![end] +[bold]Ancien[normal]: Il est temps pour nous de prier +pour eux... ...non, nous devons prier pour +la Terre![end] [bold]Ancien[normal]: Palom, Porom! -Nous devons envoyer les prières de -tout le monde à Cecil![end] +Nous devons envoyer les prières de tout +le monde à Cecil![end] [bold]Yang[normal]: M. Cecil...![end] @@ -962,13 +944,11 @@ Reçois nos prières..!![end] Ces deux-là sont les magiciens jumeaux, Palom et Porom.[new] Ils sont jeunes et encore en formation, -mais ils possèdent un talent très -précoce...[new] +mais ils possèdent un talent très précoce...[new] [bold]Palom[normal]: Attention les yeux! Je vais t'aider, alors sois reconnaissant![new] [bold]Ancien[normal]: Palom! -Qu'est-ce que je t'ai dit sur -l'arrogance?[end] +Qu'est-ce que je t'ai dit sur l'arrogance?[end] [bold]Caïn[normal]: Cecil...[end] @@ -989,11 +969,11 @@ Chimères... et reviens ici...[new] [bold]Roi Baron[normal]: Tu es venu...[end] [bold]Cecil[normal]: Majesté...[new] -[bold]Roi Baron[normal]: Le regard dans tes yeux -est un regard de tristesse, Cecil...[new] +[bold]Roi Baron[normal]: Le regard dans tes yeux est +un regard de tristesse, Cecil...[new] Oui, c'est vraiment moi, j'ai... j'ai été -assassiné, mais je suis devenu l'âme -d'une Chimère...[new] +assassiné, mais je suis devenu l'âme d'une +Chimère...[new] L'Invocatrice de Mist pourrait appeler mon nom, mais vous devez être testés...[end] @@ -1035,8 +1015,8 @@ Palom![end] [bold]Porom[normal]: Veuillez pardonner son insolence.[new] -[bold]Palom[normal]: Je vois pourquoi vous êtes -les amis de Cecil. +[bold]Palom[normal]: Je vois pourquoi vous êtes les +amis de Cecil. Vous étiez tous les deux les pantins de Baron.[end] diff --git a/text/fr/bank2.xml b/text/fr/bank2.xml index 04d9ea0..85a02d4 100644 --- a/text/fr/bank2.xml +++ b/text/fr/bank2.xml @@ -5,8 +5,8 @@ Le village de Mist se trouve de l'autre côté de la grotte au nord-ouest![end] Le roi se comporte de plus en plus bizarrement! -Et tous ceux qui s'opposent à lui -finissent comme Cid...[end] +Et tous ceux qui s'opposent à lui finissent +comme Cid...[end] Seigneur Cecil! Vengez le roi![end] Pourquoi le roi enseignait-t-il la lame @@ -16,8 +16,8 @@ Il n'était jamais comme ça, avant. Pourquoi a-t-il changé?[end] C'était vous, ce chevalier noir! Ce que vous êtes splendide, maintenant![end] -J'ai un mauvais pressentiment à propos -de Mist...[end] +J'ai un mauvais pressentiment à propos de +Mist...[end] Un moine étranger a été placé à la tête des gardes. J'ai entendu dire qu'il recherchait @@ -34,10 +34,9 @@ vraiment mort... Je l'aimais plutôt![end] Seigneur Cecil! Tuez Golbez!![end] -La porte du bâtiment à l'ouest de la -ville? +La porte du bâtiment à l'ouest de la ville? Elle donne sur une voie navigable -souterraine qui mène au château.[new] +souterraine qui mène au château. Mais maintenant elle est scellée.[end] C'est la première fois depuis la fondation de Baron qu'on n'a pas de roi...[end] @@ -46,8 +45,7 @@ Non...m-m-monsieur, je n'ai rien dit contre le roi! Je...je danserai pour vous.[new] Ça vous va?[end] -Le roi a été vraiment dur, -dernièrement,... +Le roi a été vraiment dur, dernièrement,... Et je n'ai pas le droit de danser. Déçu?[end] C'était vous, ce chevalier noir! @@ -81,19 +79,19 @@ Qui est Anna? C'est une fille qui vivait ici, elle est tombée amoureuse d'un barde errant.[new] Son père, maître Tellah, n'acceptait -pas qu'ils se fréquentent, alors ils se -sont enfuis de Kaïpo.[end] -Je veux être danseuse à Damcyan, mais -il y a beaucoup de monstres qui rôdent +pas qu'ils se fréquentent, alors ils se sont +enfuis de Kaïpo.[end] +Je veux être danseuse à Damcyan, mais il +y a beaucoup de monstres qui rôdent dans le canal souterrain. Tu veux voir ma danse synchronisée?[end] -Le canal souterrain est au nord-est, -mais j'ai entendu dire que huit féroces -serpents de mer en gardent la sortie![end] +Le canal souterrain est au nord-est, mais +j'ai entendu dire que huit féroces serpents +de mer en gardent la sortie![end] Le château qui est au nord, Damcyan, gouverne ce désert. -J'ai entendu dire que le prince a une -voix angélique.[end] +J'ai entendu dire que le prince a une voix +angélique.[end] Si tu emmènes une petite fille avec toi, tu devrais la mettre à l'arrière.[end] @@ -104,13 +102,12 @@ Crapo![end] Toi, devenir paladin? Et puis quoi, encore?[end] T[end] -De tous ceux qui ont essayé, c'est toi -qui es devenu paladin...[end] +De tous ceux qui ont essayé, c'est toi qui +es devenu paladin...[end] Sais-tu combien nous avons souffert à cause de toi?[end] Oh, bonjour Palom et Porom. -La Montagne de l'Épreuve se situe à -l'est.[end] +La Montagne de l'Épreuve se situe à l'est.[end] J'ai senti que tu peinais sous le poids de tes péchés... Je prierai pour toi aussi.[end] @@ -122,16 +119,15 @@ Ta lame noire ne sert à rien![end] Toi... un paladin!?[end] Pourquoi les hommes font-ils du mal à d'autres hommes?[end] -Endure le jugement et accepte la -lumière sacrée![end] +Endure le jugement et accepte la lumière +sacrée![end] N'oublie pas l'esprit du paladin.[end] Sale fumier! T'en as du cran de venir ici![end] -Nombreux sont ceux qui se sont -mesurés à la Montagne de l'Épreuve, mais -aucun n'en est jamais revenu.[end] -Ça ne veut pas dire que je t'ai -pardonné![end] +Nombreux sont ceux qui se sont mesurés +à la Montagne de l'Épreuve, mais aucun +n'en est jamais revenu.[end] +Ça ne veut pas dire que je t'ai pardonné![end] Oh! C'est le... chevalier noir de Baron!![end] Oh! @@ -143,18 +139,17 @@ Pour une surprise..![end] T[end] C'est la Route du Démon qui mène vers Baron. -Pour nous protéger de futures -invasions, nous l'avons scellée.[end] -La Route du Démon est une -mystérieuse route dimensionnelle. +Pour nous protéger de futures invasions, +nous l'avons scellée.[end] +La Route du Démon est une mystérieuse +route dimensionnelle. Emprunter cette route draine beaucoup d'énergie vitale, d'où son nom.[end] Ou...Ouah, Vous êtes immenses! Vous êtes des géants?[end] Vous êtes des humains, pas vrai? -Faites gaffe de ne marcher sur -personne![end] +Faites gaffe de ne marcher sur personne![end] Il doit vous falloir énormément de nourriture pour remplir vos énormes estomacs! @@ -183,8 +178,8 @@ Merci à vous![end] Ohé, salut! Vous voulez nager avec moi?[end] -Bienvenue à Troia, la cité de l'eau et -des forêts![end] +Bienvenue à Troia, la cité de l'eau et des +forêts![end] Pourquoi nagez-vous en armure? Elle va rouiller! Enlevez-la, idiots![end] @@ -209,8 +204,8 @@ Il devient vraiment très lourd...[end] C'est la ville des gens de sang nain... Agalt.[end] -Selon une de nos légendes, tout -consiste en un avant et un arrière. +Selon une de nos légendes, tout consiste +en un avant et un arrière. Non, ce monde ne fait pas exception...[end] Comme je descends des Nains, je suis vraiment petit! @@ -255,8 +250,8 @@ Buvez donc un coup. Hein?... Oh, non, monsieur.[new] Votre argent n'est pas bon, ici.[end] -On dit que Cid a été enfermé -dans le château! +On dit que Cid a été enfermé dans +le château! Et il a aussi caché le nouveau modèle d'aéronef![end] M. Cecil, voulez-vous un verre? @@ -264,8 +259,8 @@ Comme vous êtes splendide, maintenant! Asseyez-vous, c'est pour la maison![end] C'est... c'est Cecil des Ailes Rouges! Je n'ai rien fait de mal! -Je paie toujours la totalité de mes -impôts à temps![end] +Je paie toujours la totalité de mes impôts +à temps![end] Les soldats du château font ce que bon leur semble au bar![end] La ville a enfin retrouvé son esprit @@ -275,12 +270,10 @@ C'était toi, ce chevalier noir, là, hein? Je te trouve bien mieux comme ça.[end] T[end] Vous êtes costauds! -Vous avez vraiment rossé de ces -soldats! -Vous me plaisez![new] +Vous avez vraiment rossé de ces soldats! +Vous me plaisez! Cette nuit, restez ici gratuitement![end] -Hé, les boissons sont toujours pas -prêtes? +Hé, les boissons sont toujours pas prêtes? Mais vous êtes qui, vous!?[end] T[end] @@ -292,8 +285,8 @@ rrron...rrron...[end] blanche! Il se croit encore jeune....[new] Et en plus, tout le monde en ville peste -contre les soldats et le roi, mais il y a -plein de gens bien, comme vous...[new] +contre les soldats et le roi, mais il y a plein +de gens bien, comme vous...[new] Papa se chamaille sans cesse avec les habitants de la ville à ce sujet...[end] [bold]Cid[normal]: Principes de la Flottaison[end] @@ -301,8 +294,8 @@ Histoire de la Construction Navale[end] Un Guide sur les Oiseaux du Monde[end] Seigneur Cecil!? Vous êtes en vie! -Papa n'est pas revenu du château -depuis longtemps.[new] +Papa n'est pas revenu du château depuis +longtemps.[new] Il paraît qu'il aurait été emprisonné! Oh, mon Dieu, je suis si inquiète... S'il vous plaît, trouvez-le[end] @@ -316,8 +309,8 @@ Et évitez qu'il s'attire des ennuis! Est-ce qu'il retravaille sur l'aéronef?[end] [bold]Cid[normal]: Zzz...Zzz....[end] -[bold]Mère de Rosa[normal]: Qu'est-ce que le -roi mijote, ces temps-ci... +[bold]Mère de Rosa[normal]: Qu'est-ce que le roi +mijote, ces temps-ci... Il paraît que vous avez fait des choses horribles à l'étranger![new] Surtout, n'embarque pas Rosa dans @@ -335,10 +328,10 @@ Je n'aurais jamais dû te laisser devenir mage blanc.[new] [bold]Rosa[normal]: Non, Maman! J'ai bien fait! -Cecil est un guerrier, alors je -peux l'assister![new] -Et tu as combattu aux côtés de papa -en tant que mage blanc, autrefois![new] +Cecil est un guerrier, alors je peux +l'assister![new] +Et tu as combattu aux côtés de papa en +tant que mage blanc, autrefois![new] [bold]Mère de Rosa[normal]: ... Rosa... Ton père... c'était un grand chevalier... je @@ -357,10 +350,10 @@ Anna s'est sauvée de chez elle... Je me demande bien pourquoi...[end] Salut, je suis un savant itinérant.[new] -Je veux faire des recherches à Fabul, -une ville à l'est de Damcyan, mais au -canal souterrain, il y a un drôle de vieux -qui ne veut pas me laisser passer...[end] +Je veux faire des recherches à Fabul, une +ville à l'est de Damcyan, mais au canal +souterrain, il y a un drôle de vieux qui ne +veut pas me laisser passer...[end] Oh, comme c'est singulier... Un client...[new] À cause de tous les monstres, nous @@ -369,18 +362,17 @@ nos jours.[end] Apaise ta cuisante soif du désert avec une micro infusion spéciale de Kaïpo! Carte d'identité valide obligatoire.[end] -Seule la famille royale peut pénétrer -dans la grotte du Fourmilion qui est à -l'est de Damcyan.[new] -Si les gens ordinaires y étaient -autorisés, ça remonterait vraiment les -affaires. +Seule la famille royale peut pénétrer dans +la grotte du Fourmilion qui est à l'est de +Damcyan.[new] +Si les gens ordinaires y étaient autorisés, +ça remonterait vraiment les affaires. Tu te rends compte...tous ces joyaux..![end] -Une fille de Baron s'est effondrée juste -à l'entrée du village. -Sa fièvre la faisait délirer et appelait -sans arrêt +Une fille de Baron s'est effondrée juste à +l'entrée du village. +Sa fièvre la faisait délirer et appelait sans +arrêt «Cecil, Cecil...»[new] .[end] Ainsi, tu es le Cecil qu'elle appelait. @@ -389,8 +381,8 @@ Afin de guérir la fièvre du désert, il te faut la Lumière du Désert... un joyau rarissime qu'on trouve uniquement dans l'antre du Fourmilion...[end] -«La Lumière du Désert est le seul -remède contre la fièvre du désert...»[end] +«La Lumière du Désert est le seul remède +contre la fièvre du désert...»[end] [bold]Rosa[normal]: ... [music][0x13] Ooh... Cecil... Ne m'abandonne pas, Cecil![end] @@ -416,8 +408,8 @@ Palom, Porom! N'ayez pas confiance en cet homme![end] Superbe... Alors c'est ça, un paladin...[end] -La f-f-ferme -hic- J'ai pas peur -d'aucun ch-chevalier noir![end] +La f-f-ferme -hic- J'ai pas peur d'aucun +ch-chevalier noir![end] -hic- Toi, devenir un paladin! Hi hi hi! Ha ha ha ha ha![end] @@ -441,8 +433,8 @@ Vous allez gravir la montagne de l'Épreuve![end] Wow, tu es vraiment splendide![end] [bold]Cecil[normal]: Argl![end] -[bold]Cecil[normal]: J'ai mis un petit peu de -poison dans ton verre! +[bold]Cecil[normal]: J'ai mis un petit peu de poison +dans ton verre! Zut! Pas assez fort![end] @@ -462,8 +454,8 @@ T[end] T[end] L'ancien pardonne tout. Mais je ne te pardonnerai pas...[end] -Si tu deviens un paladin, j'aurai -confiance en toi.[end] +Si tu deviens un paladin, j'aurai confiance +en toi.[end] Nous avons confiance en toi![end] C'est la Maison des Prières. L'ancien va écouter ton histoire.[end] @@ -476,14 +468,14 @@ Tout commence à partir d'un innocent bébé...[end] Le paladin est un chevalier sacré, l'opposé d'un chevalier noir.[end] -Tu es un paladin! ...Peut-être que c'était -le destin.[end] +Tu es un paladin! ...Peut-être que c'était le +destin.[end] [bold]Fille[normal]: Qu'est-ce qui ne va pas?[new] [bold]Ancien[normal]: Où est Palom?[new] [bold]Fille[normal]: Pfff... Palom, ça ne va pas recommencer![end] -[bold]Garçon[normal]: Alors c'est toi le mec de -Baron, hein? +[bold]Garçon[normal]: Alors c'est toi le mec de Baron, +hein? Le vieux m'a dit de t'aider, il faut croire que je n'ai pas le choix.[new] Sois-m'en reconnaissant![end] @@ -493,23 +485,22 @@ Je suis enchantée de faire votre connaissance.[end] [bold]Porom[normal]: Hé, Palom, allez salue-le aussi![end] -[bold]Palom[normal]: Content de te rencontrer, -mon pote![end] +[bold]Palom[normal]: Content de te rencontrer, mon +pote![end] [bold]Palom[normal]: Le mage noir Palom et le -mage blanc Porom se sont joints à -toi! [music][0x29][delay][0x28][end] -[bold]Ancien[normal]: Maintenant, va sur la -Montagne de l'Épreuve! +mage blanc Porom se sont joints à toi! +[music][0x29][delay][0x28][end] +[bold]Ancien[normal]: Maintenant, va sur la Montagne +de l'Épreuve! Palom! Porom![new] Je compte sur vous![end] Tu es maître de ton destin. -Tout ce que je peux faire à présent, -c'est prier pour toi...[new] +Tout ce que je peux faire à présent, c'est +prier pour toi...[new] Palom, Porom, tenez-vous bien, -et essayez de ne pas gêner M. -Cecil.[end] +et essayez de ne pas gêner M. Cecil.[end] Palom et Porom...! Je vois... mais est-ce que le destin prévoyait pour eux de se sacrifier...[end] @@ -539,16 +530,14 @@ c'est pourquoi nos soirées sont chaudes... si tu vois ce que je veux dire.[end] Bien! Aujourd'hui, J'ai eu un rencard au -comptoir![new] -Demain, c'est au-dessus que ça se -passe![end] +comptoir! +Demain, c'est au-dessus que ça se passe![end] Salut, chéri! -clin d'il[end] -Je suis content d'avoir vécu si -longtemps! +Je suis content d'avoir vécu si longtemps! Je préfère cet endroit au Paradis![end] Tu as l'air de vouloir passer un bon -moment avec une femme plus âgée, et -plus mature... +moment avec une femme plus âgée, et plus +mature... Non mais c'est quoi ce regard!?[end] Oh, ma poupée! Je crois que je craque pour toi! @@ -556,8 +545,8 @@ Aaah! T'es un mec!![end] T[end] Quelle que soit la façon dont tu les -regardes, et je le fais souvent, les filles -ici sont terribles![end] +regardes, et je le fais souvent, les filles ici +sont terribles![end] Bonjour! Quel est ton désir?[end] Menteur! @@ -591,16 +580,15 @@ Bienvenue. Ça va bientôt être l'heure du spectacle. Si tu apprécies, pense à être généreux avec le pourboire.[end] -Ha dis donc, qu'est-ce que j'aimerais -être aussi jeune que toi...[end] +Ha dis donc, qu'est-ce que j'aimerais être +aussi jeune que toi...[end] T[end] -Grâce à l'eau pure et au sol fertile, -nous pouvons avoir de nombreux -légumes frais.[new] -C'est donc un cadre idéal pour élever -des chocobos.[end] +Grâce à l'eau pure et au sol fertile, nous +pouvons avoir de nombreux légumes frais. +C'est donc un cadre idéal pour élever des +chocobos.[end] T[end] Biologie des Chocobos[end] Vous aussi pouvez faire éclore des @@ -635,17 +623,15 @@ T[end] T[end] T[end] Je veux voler sur un chocobo noir, mais -ils ont toujours peur quand je -m'approche. +ils ont toujours peur quand je m'approche. Est-ce que je ne les aime pas assez?[end] C'est l'observatoire de Colliro. -Le seul télescope au monde se trouve -ici.[new] +Le seul télescope au monde se trouve ici. Il y a peu, phénomènes étranges ont eu -lieu sur la lune. -Nous avons fait tout notre possible -pour les observer.[new] +lieu sur la lune.[new] +Nous avons fait tout notre possible pour +les observer. Qu'est-ce qui se passe, là- bas..?[end] Mon mari est tellement absorbé par ses observations qu'il en oublie de boire et @@ -666,21 +652,19 @@ même couleur que notre sang...[new] J'espère que rien de mauvais ne se prépare...[end] -J'ai vu des vaisseaux rouges aller dans -le cratère au nord![end] +J'ai vu des vaisseaux rouges aller dans le +cratère au nord![end] Même quand le reste du monde souffre -des ravages de la guerre, c'est paisible, -ici.[new] +des ravages de la guerre, c'est paisible, ici. Par contre, nous sommes bien atteints par les tremblements de terre.[end] -Ma grand-mère est la doyenne du -village. +Ma grand-mère est la doyenne du village. Elle sait tout![end] Nos ancêtres sont venus du grand trou, dans les montagnes au nord.[new] -Mais maintenant le trou est bouché et -on ne peut y aller, ni par la terre, ni -par les airs.[end] +Mais maintenant le trou est bouché et on +ne peut y aller, ni par la terre, ni par les +airs.[end] Il y a une ancienne légende... Quand nous retournons la Pierre de Magma à son lieu de naissance, le chemin @@ -720,11 +704,11 @@ Qui diable es-tu? Tu as un passe pour entrer?[end] Il se fait tard... Tu ne devrais pas partir maintenant.[end] -J'ai entendu dire qu'il y a des moments -où les Chimères sont immunisées aux +J'ai entendu dire qu'il y a des moments où +les Chimères sont immunisées aux attaques.[end] -J'ai l'impression de t'avoir déjà vu -quelque part...[end] +J'ai l'impression de t'avoir déjà vu quelque +part...[end] L'accès à cette tour est interdit.[end] [bold]Cid[normal]: Te revoilà, Cecil![end] [bold]Cid[normal]: Rosa était inquiète! @@ -748,21 +732,19 @@ Et puis maintenant, il te dit d'aller chasser les Chimères? Les villageois sont pertutbés... Et je parle même pas de moi...[new] -Enfin, de toute façon, sois prudent, -reçu? -Je rentre à la maison.[new] -J'ai pas mal bossé ces derniers temps... -et ma fille me pique des crises à cause -de ça![end] -As-tu vu notre patron Cid dans -le coin?[new] +Enfin, de toute façon, sois prudent, reçu? +Je rentre à la maison. +J'ai pas mal bossé ces derniers temps... et +ma fille me pique des crises à cause de ça![end] +As-tu vu notre patron Cid dans le +coin?[new] Il s'est mis à penser à Dieu Sait Quoi, nous laissant seuls à nettoyer les aéronefs.[end] Patron! Et M. Cecil![end] -On dirait que le patron fait comme à -son habitude, non?[end] +On dirait que le patron fait comme à son +habitude, non?[end] Quoi, on doit ENCORE passer une nuit blanche sur ce projet? Si ce n'était pas un soudard pareil, on y @@ -781,8 +763,8 @@ Ouaip...Je suis devenu aussi bon que le patron à ça... N...Ne va pas lui répéter ça![end] -Est-ce...est-ce que le Prince Edward -va bien...[end] +Est-ce...est-ce que le Prince Edward va +bien...[end] M. Yang! Vous êtes de retour. @@ -796,22 +778,20 @@ manière ou d'une autre.[end] Ah, M. Cecil![end] J'adore être une grenouille. -Plein de baisers de jeunes filles -blondes...[end] +Plein de baisers de jeunes filles blondes...[end] Bienvenue au château de Troia![end] -Oui, je m'appelle Kermit, comment tu -sais?[end] +Oui, je m'appelle Kermit, comment tu sais?[end] Oh, des voyageurs! Faites ici comme chez vous.[end] Croa-a! Croa-a! J'adore être vert![end] Vous êtes là pour le cristal? -Alors vous devriez parler aux clercs -dans le château.[end] +Alors vous devriez parler aux clercs dans +le château.[end] T[end] -Les Clercs sont les dignes messagères -de Dieu. +Les Clercs sont les dignes messagères de +Dieu. Veuillez vous comporter convenablement.[end] T[end] @@ -852,8 +832,8 @@ On ne peut pas sortir et faire confiance Combien de gens de Baron Golbez contrôle-t-il..?!![end] -J'ai perçu une drôle d'atmosphère -autour du roi, dernièrement...[end] +J'ai perçu une drôle d'atmosphère autour +du roi, dernièrement...[end] M. Cecil! Prenez le trône![end] Je n'aime pas ce naze de Beigan![end] @@ -879,17 +859,17 @@ quand vous serez partis![end] Tu n'arrives pas à dormir?[end] [bold]Cecil[normal]: C'est là!?[new] [bold]Cid[normal]: Ouaip, juste sous leur nez![end] -va Aïe abîme paraît Si tu évaluais ta -vie, tu ne devrais pas commencer à te -faire des idées.[end] +va Aïe abîme paraît Si tu évaluais ta vie, +tu ne devrais pas commencer à te faire +des idées.[end] Même si j'avais réalisé que le roi avait changé, je n'ai rien dit, pour me protéger...[end] [bold]Roi Baron[normal]: Cecil! Tu es sauf! -Et je vois que tu es devenu un -puissant guerrier![new] +Et je vois que tu es devenu un puissant +guerrier![new] [bold]Cecil[normal]: Majesté...[new] [bold]Roi Baron[normal]: Mais tu es devenu un paladin. @@ -899,10 +879,9 @@ Lumière Sacrée...[new] [bold]Cecil[normal]: Roi Baron?..[end] «Pourquoi tu... misérable imposteur!»[end] [bold]Cid[normal]: Fripouille! -Me mettre dans un trou puant comme -ça![new] +Me mettre dans un trou puant comme ça! Je m'en vais te botter le train, tu vas -voir! +voir![new] H..hein?[end] [bold]Cecil[normal]: Cid![new] [bold]Cid[normal]: Cecil! @@ -916,8 +895,8 @@ Elle a couru à ta recherche...[new] [bold]Cid[normal]: Quoi?! Alors que tu étais là pour la protéger? Mais ce Golbez....[new] -Non seulement il abuse de mes -aéronefs, mais de Rosa aussi!?[end] +Non seulement il abuse de mes aéronefs, +mais de Rosa aussi!?[end] [bold]Tellah[normal]: Cette fille est en danger. Vite, emmenez-nous à l'aéronef![end] [bold]Cid[normal]: C'est qui, cette épave?[new] @@ -948,14 +927,14 @@ modèle d'aéronef?[new] [bold]Cid[normal]: Héhéhé...[end] [bold]Cid[normal]: Nous ne laisserons plus les monstres prendre le château![end] -[bold]Cid[normal]: Là où personne n'aurait -jamais pensé mettre son nez! +[bold]Cid[normal]: Là où personne n'aurait jamais +pensé mettre son nez! Je viens de le terminer![end] [bold]Tellah[normal]: Nous n'avons pas le temps pour ça! La vie de Rosa ne tient qu'à un fil![end] -[bold]Cid[normal]: Merde alors, quel grincheux -tu fais! +[bold]Cid[normal]: Merde alors, quel grincheux tu +fais! Ça va, j'ai pigé! Allez, c'est par là![end] [bold]Roi Baron[normal]: En effet! @@ -984,16 +963,14 @@ C'est interdit![end] les magiciens Mythidiens qui ont résisté. Tu peux leur parler à travers les barreaux.[end] -J'espère que nous n'aurons plus jamais -à utiliser ce donjon.[end] +J'espère que nous n'aurons plus jamais à +utiliser ce donjon.[end] Tu es ce chevalier noir! Tu crois t'en tirer comme ça!?[end] -Nous nous fichons de ce qui nous -arrive. +Nous nous fichons de ce qui nous arrive. Rendez juste le cristal à Mythidia![end] Tu ne comprends rien! -Le cristal n'est pas qu'un joyau -ordinaire![end] +Le cristal n'est pas qu'un joyau ordinaire![end] Aïe! J'ai un bleu, ici![end] @@ -1003,8 +980,8 @@ Moi? Oh, je vais beaucoup mieux![end] Capitaine...[end] Vous étiez vivant, en fin de compte![end] -Je vais me saouler pour essayer -d'oublier ce qui s'est passé à Mythidia...[end] +Je vais me saouler pour essayer d'oublier +ce qui s'est passé à Mythidia...[end] Sa majesté morte, tu es le seul qui puisse diriger Baron![end] Ce boulot m'a laissé une mauvaise @@ -1060,14 +1037,14 @@ Anna!![end] Misérable! Anna est morte à cause de vous!![new] [bold]Barde[normal]: !?[end] -[bold]Edward[normal]: La Lumière du Désert se -forme à partir des sécrétions du -Fourmilion quand il pond ses ufs.[new] +[bold]Edward[normal]: La Lumière du Désert se forme +à partir des sécrétions du Fourmilion +quand il pond ses ufs.[new] Sa grotte est à l'est, mais nous devons -traverser un plan d'eau peu profond -pour y accéder.[new] -Il y a un aéroglisseur à Damcyan qui -peut le traverser. +traverser un plan d'eau peu profond pour +y accéder.[new] +Il y a un aéroglisseur à Damcyan qui peut +le traverser. Il devrait aussi pouvoir traverser les hauts-fonds pour aller vers Kaïpo.[end] Nous sommes les seuls survivants. @@ -1078,10 +1055,9 @@ traverser les hauts-fonds à l'ouest pour y aller...[end] Peut-être pouvons-nous nous retirer à Fabul...[new] -Mais le chemin de Fabul par le mont -Hobs a été bloqué par une épaisse -couche de glace apportée par les vents -glaciaux.[end] +Mais le chemin de Fabul par le mont Hobs +a été bloqué par une épaisse couche de +glace apportée par les vents glaciaux.[end] [bold]Tellah[normal]: ....Qui est ce Golbez!?[new] [bold]Edward[normal]: Il est venu à Baron il y a peu et a pris le contrôle des Ailes Rouges.[new] @@ -1125,8 +1101,7 @@ Une amie à moi s'est écroulée près de Kaïpo, frappée par la fièvre du désert.[new] Nous avons besoin de la Lumière du Désert! -De plus, nous avons besoin de votre -aide![new] +De plus, nous avons besoin de votre aide![new] [bold]Edward[normal]: Mon aide...[new] [bold]Cecil[normal]: Oui. Pour Rosa... @@ -1148,8 +1123,7 @@ Ne les laisse pas prendre ce trésor...!![end] T[end] -Nous avons perdu notre force -principale? +Nous avons perdu notre force principale? Impossible![end] Et nous restons là, inutiles...[end] Une étrange rumeur court parmi les @@ -1188,13 +1162,12 @@ Je ne dors pas. Je médite![end] Soyez prudents![end] -Es-tu de retour de l'entraînement, -maître Yang?[end] +Es-tu de retour de l'entraînement, maître +Yang?[end] Wow, ça, c'était une attaque de la mort![end] Nous irons bien quoi qu'il arrive dans le château! -Nous avons des Moines pour le -défendre![end] +Nous avons des Moines pour le défendre![end] Je suis content que la ville de Fabul soit dans le château. Si nous avions été dehors, nous serions @@ -1207,37 +1180,37 @@ Je veux m'entraîner pour être fort et rapide comme nos Moines![end] [bold]Roi de Fabul[normal]: Misère, quel désastre... -Mais nous devons réorganiser et -fortifier nos défenses! +Mais nous devons réorganiser et fortifier +nos défenses! Ne vous inquiétez pas pour moi.[new] Pour le moment, vous devriez vous reposer.[end] [bold]Roi de Fabul[normal]: ...Oh, vraiment? Très bien, Yang! Accompagne-les et aide-les![new] -Cecil, je n'arrive pas à trouver -mes mots pour te remercier assez. +Cecil, je n'arrive pas à trouver mes +mots pour te remercier assez. Et aussi, Rosa a été capturée...[new] -Je vais ordonner qu'on affrète un -bateau immédiatement. +Je vais ordonner qu'on affrète un bateau +immédiatement. Cecil. Prends cette épée.[new] C'est l'épée d'un chevalier noir qui a est passé il y a longtemps.[new] -C'est le moins que je puisse faire pour -te remercier d'avoir défendu Fabul. ...Mais +C'est le moins que je puisse faire pour te +remercier d'avoir défendu Fabul. ...Mais c'est toujours une épée de l'obscurité...[new] Elle se montrera inutile contre le mal véritable. Vaincs Golbez![end] [bold]Roi Fabul[normal]: Si tous les cristaux sont -rassemblés, le monde entier sera dans -une crise sans précédent! +rassemblés, le monde entier sera dans une +crise sans précédent! Je compte sur toi![end] [bold]Roi Fabul[normal]: C'est la chambre de sa majesté![end] -Sa majesté était aussi un Moine, alors -ne vous inquiétez pas pour sa santé.[end] +Sa majesté était aussi un Moine, alors ne +vous inquiétez pas pour sa santé.[end] [bold]Roi Fabul[normal]: Dès que vous serez prêts, allez à l'est, vers le port. Il devrait y avoir un navire qui vous y @@ -1260,8 +1233,8 @@ de Baron![end] Voici M. Cecil. Lui et ses amis m'ont sauvé la vie.[new] [bold]Femme de Yang[normal]: Merci! -Au fait, chéri, penses-tu vraiment que -ce soit le moment de traîner par ici?[end] +Au fait, chéri, penses-tu vraiment que ce +soit le moment de traîner par ici?[end] [bold]Femme de Yang[normal]: Tu es sauf![new] [bold]Yang[normal]: Grâce à ces gens, Fabul a été sauvée.[new] @@ -1273,8 +1246,8 @@ hein?[new] [bold]Femme de Yang[normal]: Bien sûr que non! Je suis ta femme, quand même![new] Un soldat de Baron est bien venu, mais -je lui ai fichu un coup de ma poêle à -frire sur la tête![end] +je lui ai fichu un coup de ma poêle à frire +sur la tête![end] [bold]Yang[normal]: Ne reste pas là comme ça! Va battre les méchants et reviens![end] [bold]Yang[normal]: Yang est mort? @@ -1285,11 +1258,10 @@ Non...Il n'est pas...[end] [bold]Yang[normal]: Alors c'est là qu'il était... Oh, ces oignons... Ils me piquent tellement les yeux...[end] -[bold]Yang[normal]: Il ne devrait pas être dans -un état pareil! -S'il te plaît...[new] -Donne-lui un bon coup de ça sur la -tête![end] +[bold]Yang[normal]: Il ne devrait pas être dans un +état pareil! +S'il te plaît... +Donne-lui un bon coup de ça sur la tête![end] [bold]Yang[normal]: Obtenu la Poêle à frire de l'Amour![end] [bold]Yang[normal]: Yang?! @@ -1316,8 +1288,8 @@ Nous pouvons nous reposer ici dans une tente ou une cabine, et sauvegarder la partie.[new] En vue du combat de demain, -reposons-nous dans ma tente et -soignons nos blessures![end] +reposons-nous dans ma tente et soignons +nos blessures![end] Tu veux que je danse? Quel rustre! @@ -1348,16 +1320,16 @@ nous faire pour protéger notre pays?..[end] Les clercs sont huit surs. Des générations durant, elles ont été les gardiennes du cristal.[end] -Le cristal de la terre a comblé Troia -avec les bénédictions de la nature. +Le cristal de la terre a comblé Troia avec +les bénédictions de la nature. Si nous perdons le cristal, cette région deviendra un terrain vague...[end] C'est bien mieux que d'être dirigées par des hommes brutaux![end] -On dirait que vous êtes dans un -mauvais pas. -Comme promis, nous allons vous prêter -le cristal de la terre.[end] +On dirait que vous êtes dans un mauvais +pas. +Comme promis, nous allons vous prêter le +cristal de la terre.[end] Le cristal de la terre a été pris? Mon Dieu![end] L'Elfe Noir est faible contre les armes de @@ -1369,8 +1341,7 @@ Nous te confions le cristal. Prends-en soin![end] Dire qu'un homme maléfique est en train de réunir les cristaux![end] -L'Elfe Noir vit dans la grotte au -nord-est.[end] +L'Elfe Noir vit dans la grotte au nord-est.[end] Quelle était cette voix!?[end] Le cristal a été volé? Ne restez pas comme ça, rapportez-le![end] @@ -1379,18 +1350,18 @@ promettons que nous vous le prêterons. Mais d'abord, ramenez-le ici.[end] Prenez le trésor qui est à la cave.[end] Golbez mettant les mains sur le cristal -est bien pire que ce qui va arriver à -Troia sans lui![end] -Si vous portez des armes et des -armures de métal dans la grotte qui se -trouve au nord-est, Vous ne pourrez -même pas bouger![end] +est bien pire que ce qui va arriver à Troia +sans lui![end] +Si vous portez des armes et des armures +de métal dans la grotte qui se trouve au +nord-est, Vous ne pourrez même pas +bouger![end] Et nous venons juste de le récupérer! Je suppose qu'il n'y a pas le choix. Nous ne faisons que vous le prêter![end] Les cristaux ont été éparpillés de par le -monde pour être sûrs que de telles -choses n'arrivent jamais.[end] +monde pour être sûrs que de telles choses +n'arrivent jamais.[end] Nous ne pouvons pas vous donner le cristal de la terre... Mais si vous nous le rapportez, nous @@ -1407,8 +1378,8 @@ possède! Si une personne maléfique l'avait, cela pourrait avoir de terribles répercussions![end] Si la rumeur disant qu'il y a plus de -quatre cristaux est vraie, il y a encore -de l'espoir.[end] +quatre cristaux est vraie, il y a encore de +l'espoir.[end] Troia est gouvernée par nous, les huit Clercs. Nous étions dotées de la bénédiction du @@ -1505,18 +1476,18 @@ Désolé, c'était Minimum![end] Rosa voulait t'aider, alors elle a choisi de devenir mage blanc. Ne la tourmente pas![end] -Nous ne pouvons que prier pour que -les âmes des soldats morts puissent -reposer en paix.[end] +Nous ne pouvons que prier pour que les +âmes des soldats morts puissent reposer +en paix.[end] J'étudie les rudiments de la magie blanche. Je peux utiliser trois niveaux de magie blanche...[new] Soin, Soin 2, Soin 3![end] Dire qu'un monstre a remplacé le roi...[end] -Dernièrement, le roi a été aussi -vigoureux et robuste qu'autrefois, plein -de vie et d'énergie! +Dernièrement, le roi a été aussi vigoureux +et robuste qu'autrefois, plein de vie et +d'énergie! Mais il a quelque chose d'étrange...[end] Nous assisterons les soldats avec notre magie blanche![end] @@ -1528,17 +1499,15 @@ d'énergie au rang arrière de ton groupe![new] Si tu déplaces le curseur vers la gauche pendant un combat, tu peux inverser les rangs avant et arrière.[new] -Si tu appuies sur droite, tu vas rester -en garde![new] +Si tu appuies sur droite, tu vas rester en +garde! Aussi, si tu veux utiliser une arme en -tant qu'objet dans un combat, -sélectionne +tant qu'objet dans un combat, sélectionne «Objet»[new] -et déplace le curseur tout en haut -pour sélectionner ton arme![new] -Utilise ça pour changer d'arme ou -refaire le plein de flèches, et la victoire -est à toi![end] +et déplace le curseur tout en haut pour +sélectionner ton arme! +Utilise ça pour changer d'arme ou refaire +le plein de flèches, et la victoire est à toi![end] Tu dois prendre rapidement des décisions au cours des combats! Ceux qui n'en sont pas sûrs devraient @@ -1550,34 +1519,32 @@ Les monstres vont t'attaquer même pendant que tu sélectionnes des objets ou des magies... pour rendre la bataille encore plus palpitante![end] -Il y a des endroits dans les grottes où -tu peux sauvegarder ton jeu. +Il y a des endroits dans les grottes où tu +peux sauvegarder ton jeu. Utilise bien ces endroits![end] Si tu ne peux plus porter d'objets supplémentaires, tu peux les donner au Gros Chocobo dans la Forêt Chocobo![new] Si tu sens des chocobos, utilise des légumes de Gysahl![end] -L'homme qui est là-bas, c'est -Namingway. -Si tu veux changer de nom, tu n'as -qu'à le lui demander![end] +L'homme qui est là-bas, c'est Namingway. +Si tu veux changer de nom, tu n'as qu'à +le lui demander![end] Si tu te bats dans une bataille -désespérée, tu ne pourras que mourir![new] -Si tu crois être en difficulté, n'y -réfléchis pas à deux fois avant de te -sauver.[new] -Presse les boutons L et R en même -temps pour te sauver d'une bataille! +désespérée, tu ne pourras que mourir! +Si tu crois être en difficulté, n'y réfléchis +pas à deux fois avant de te sauver.[new] +Presse les boutons L et R en même temps +pour te sauver d'une bataille! Aussi, il y a des sorts que tu peux invoquer sur de multiples cibles.[new] Si tu appuies vers la gauche pendant le combat, tu sélectionneras tous les ennemis... appuyer vers la droite sélectionnera tous tes alliés![new] -Tu peux invoquer un sort sur ton -groupe entier de cette même manière sur -l'écran de menu![end] +Tu peux invoquer un sort sur ton groupe +entier de cette même manière sur l'écran +de menu![end] T[end] @@ -1641,8 +1608,8 @@ cette chute d'eau![music][0x29][delay][0x28][end] Le passage est bloqué par une épaisse couche de glace.[end] -[bold]Rosa[normal]: Rydia, essaie d'invoquer -le feu.[new] +[bold]Rosa[normal]: Rydia, essaie d'invoquer le +feu.[new] [bold]Rydia[normal]: ....[end] [bold]Rydia[normal]: ....Non.[new] [bold]Rosa[normal]: ?[new] @@ -1654,8 +1621,8 @@ Tu es la seule ici à avoir le pouvoir de faire fondre cette glace.[new] [bold]Rydia[normal]: ....[new] [bold]Rosa[normal]: Si nous ne franchissons pas -cette glace pour aller à Fabul, beaucoup -de gens seront en danger! +cette glace pour aller à Fabul, beaucoup de +gens seront en danger! S'il te plaît... essaye d'être courageuse![new] [bold]Edward[normal]: Courageuse....[new] [bold]Rosa[normal]: Rydia, s'il te plaît![new] @@ -1677,12 +1644,11 @@ Ce doit être un moine de Fabul![end] [bold]Rydia[normal]: Aidons-le![end] [bold]Moine[normal]: Merci... de m'être venus en aide quand j'en avais besoin. -Je suis Yang, le capitaine des -moines de Fabul.[new] +Je suis Yang, le capitaine des moines +de Fabul.[new] Mes hommes et moi nous entraînions ici, -sur le mont Hobs... et soudain, nous -avons été attaqués par des hordes de -monstres.[new] +sur le mont Hobs... et soudain, nous avons +été attaqués par des hordes de monstres.[new] Mes hommes... tués... tous...je suis le seul survivant...[new] [bold]Cecil[normal]: Nous faisons route vers Fabul.[new] @@ -1692,8 +1658,7 @@ cristaux...[end] [bold]Moine[normal]: Haa![end] [bold]Cecil[normal]: Qu'est-ce que c'est?[end] [bold]Rosa[normal]: À tous les coups, ces -monstres ont été envoyés par -Golbez...[end] +monstres ont été envoyés par Golbez...[end] [bold]Yang[normal]: Dans le but d'affaiblir les défenses de Fabul!?[new] [bold]Cecil[normal]: Si c'est le cas, ils peuvent @@ -1719,8 +1684,8 @@ Allons-y![new] [bold]Yang[normal]: Fabul est à l'est des montagnes. Dépêchons-nous![end] -[bold]Yang[normal]: Le Moine Yang a rejoint -le groupe! [music][0x29][delay][0xc][end] +[bold]Yang[normal]: Le Moine Yang a rejoint le +groupe! [music][0x29][delay][0xc][end] T[end] @@ -1775,13 +1740,13 @@ Prenez soin de Cecil![end] [bold]Palom et Porom[normal]: ...ROC!![end] [bold]Cecil[normal]: Palom... Porom!!![music][0x2a][delay][0xc][end] -Ils se sont tous les deux pétrifiés par -leur propre volonté...[end] +Ils se sont tous les deux pétrifiés par leur +propre volonté...[end] [bold]Yang[normal]: Ils se sont sacrifiés...[end] [bold]Cid[normal]: C'est maintenant un combat de vengeance! -Lamentez-vous jusqu'à ce que je -ramène mon Entreprise![end] +Lamentez-vous jusqu'à ce que je ramène +mon Entreprise![end] [bold]Tellah[normal]: Quelle folie!! Laissez-moi voir ce que je peux faire... Esuna![end] @@ -1798,8 +1763,8 @@ Pas ces enfants![end] [bold]Cid[normal]: Ourg! La gravité est si forte, ici! -On pourra même pas remuer si on -porte des armures métalliques![new] +On pourra même pas remuer si on porte +des armures métalliques![new] [bold]Yang[normal]: Mes griffes, ça a l'air d'aller.[new] [bold]Tellah[normal]: Ne vous inquiétez pas! Nous avons toujours ma magie![end] @@ -1818,8 +1783,8 @@ Nous avons toujours ma magie![end] T[end] -[bold]Cecil[normal]: Si seulement je pouvais -utiliser mon épée...!![end] +[bold]Cecil[normal]: Si seulement je pouvais utiliser +mon épée...!![end] [bold]Cecil[normal]: Je comprends... Edward![end] [bold]Cecil[normal]: Scellé par le pouvoir magique @@ -1839,10 +1804,10 @@ côté de Mythidia, maintenant c'est impossible de passer.[new] En dessous d'ici se trouve la salle d'entraînement.[end] -Ainsi le sceau de Mythidia a été brisé -de leur côté![end] -La Route est scellée du côté de -Mythidia, alors tu ne peux pas l'utiliser.[end] +Ainsi le sceau de Mythidia a été brisé de +leur côté![end] +La Route est scellée du côté de Mythidia, +alors tu ne peux pas l'utiliser.[end] T[end] @@ -1858,8 +1823,7 @@ Mythidia, alors tu ne peux pas l'utiliser.[end] T[end] -[bold]Golbez[normal]: Ainsi, il a même tué -Cagnazzo... +[bold]Golbez[normal]: Ainsi, il a même tué Cagnazzo... Il est devenu bien plus fort.[new] [bold]Caïn[normal]: À propos du dernier cristal...[new] [bold]Golbez[normal]: Je sais... ça va être délicat de @@ -1882,23 +1846,20 @@ transmettre le message.[end] [bold]Rosa[normal]: Caïn![end] [bold]Caïn[normal]: Tu trouves encore que ton Cecil est supérieur à moi?[end] -[bold]Cecil[normal]: Si on était arrivé ne -serait-ce qu'une seconde plus tard... cette -guillotine aurait tranché Rosa en -deux![end] +[bold]Cecil[normal]: Si on était arrivé ne serait-ce +qu'une seconde plus tard... cette guillotine +aurait tranché Rosa en deux![end] -Mon père a trouvé un étrange minerai -ici. +Mon père a trouvé un étrange minerai ici. Son loisir, c'est de collectionner des queues d'animaux.[end] Qui êtes-vous? Allez-vous-en! -Par contre, si vous avez une queue, -c'est une autre affaire![end] -C...c'est la queue de rat que je -cherchais! -D'accord, je vais vous donner un bout -de ce minerai![new] +Par contre, si vous avez une queue, c'est +une autre affaire![end] +C...c'est la queue de rat que je cherchais! +D'accord, je vais vous donner un bout de +ce minerai! Obtenu l'Adamant![music][0x29][delay][0xc][end] C..c'est...la légendaire queue rose! D'accord, je vais aussi vous donner ça! @@ -1910,8 +1871,8 @@ Obtenu l'Armure d'Adamant![music][0x29][delay][0xc][end] [bold]FuSoYa[normal]: Monte près de sa bouche![new] [bold]Cid[normal]: Qui c'est, lui?[new] -[bold]Cecil[normal]: C'est FuSoYa, un homme -de la Lune.[new] +[bold]Cecil[normal]: C'est FuSoYa, un homme de +la Lune.[new] [bold]Cid[normal]: Un homme de la Lune?![new] [bold]FuSoYa[normal]: Peux-tu le faire?[new] [bold]Cid[normal]: Pour qui que tu me prends!? @@ -1985,8 +1946,8 @@ vie...[new] [bold]Barbariccia[normal]: Pour vous tuer![new] [bold]Rubicante[normal]: Nous nous rencontrons à nouveau! -Vous m'avez montré la puissance de -ceux qui unissent leurs forces![new] +Vous m'avez montré la puissance de ceux +qui unissent leurs forces![new] Maintenant, préparez-vous![end] [bold]Rubicante[normal]: Combattez-nous de toute votre force![end] @@ -2008,11 +1969,10 @@ C'est impossible...[end] T[end] -[bold]Yang[normal]: Et dire qu'elle était cachée -ici...[new] +[bold]Yang[normal]: Et dire qu'elle était cachée ici...[new] [bold]Tellah[normal]: Prodigieux![new] -[bold]Cid[normal]: Désolé de t'avoir fait -attendre, Entreprise! +[bold]Cid[normal]: Désolé de t'avoir fait attendre, +Entreprise! Allons-y![end] [bold]Cecil[normal]: C'est...!![end] @@ -2049,14 +2009,14 @@ sûr...[new] Oh, vous êtes humains![end] C'est ici que tous les survivants se cachent.[end] -C'est la route vers le quartier général -de Rubicante, la tour de Bab-Ilu.[end] +C'est la route vers le quartier général de +Rubicante, la tour de Bab-Ilu.[end] Nous avons perdu notre château... C'est notre maison, maintenant.[end] Nous sommes le fier peuple d'Eblana![end] Notre jeune maître est parti vérifier -quelque chose, mais ça fait bien -longtemps qu'il est parti... +quelque chose, mais ça fait bien longtemps +qu'il est parti... J'espère qu'il ne fait rien d'irréfléchi...[end] T[end] Il ne reste plus beaucoup de vivres. @@ -2064,13 +2024,13 @@ Je me demande combien de temps nous pourrons tenir...[end] Jeune maître, montre-nous ton Ninjutsu ultime![end] -Nous tiendrons ici jusqu'à ce que le -jeune maître rentre![end] +Nous tiendrons ici jusqu'à ce que le jeune +maître rentre![end] Notre jeune maître est parti seul en avant![end] -Quand le jeune maître se met en colère, -il devient très puissant...[end] +Quand le jeune maître se met en colère, il +devient très puissant...[end] Arrêtez notre jeune maître...[end] Notre jeune maître est parti à la @@ -2087,8 +2047,8 @@ maintenant![end] Le jeune maître va tuer l'ennemi, c'est sûr![end] -Quand le jeune maître était absent, le -roi et la reine ont été capturés...[end] +Quand le jeune maître était absent, le roi +et la reine ont été capturés...[end] Je vais protéger ma maman! Elle a mon petit frère ou ma petite sur dans son ventre![end] @@ -2105,8 +2065,7 @@ Bab-Ilu pour venger le roi et la Reine. Mais je m'inquiète pour lui. Il est sûrement encore parti trop loin...[end] Tiens bon, chérie![end] -D'où sont venus des monstres comme -ça?[end] +D'où sont venus des monstres comme ça?[end] Cet enfant est désespérant...[end] Le jeune maître a dit qu'il allait tuer les méchants! @@ -2119,8 +2078,8 @@ Si tu meurs aussi, Eblana va...[end] T[end] -[bold]Cid[normal]: Dès qu'on la sort tourner, -elle étale ce qu'elle sait faire! +[bold]Cid[normal]: Dès qu'on la sort tourner, elle +étale ce qu'elle sait faire! T'en dis quoi, poulette?[new] On va leur montrer ce que t'as dans le ventre![end] @@ -2182,11 +2141,11 @@ T[end] T[end] T[end] T[end] -Un misérable chevalier noir comme toi -ne peut même pas toucher la -marchandise que nous vendons ici![end] -Si tu revenais en un morceau, tu -pourras utiliser ces armes-là... mais c'est +Un misérable chevalier noir comme toi ne +peut même pas toucher la marchandise +que nous vendons ici![end] +Si tu revenais en un morceau, tu pourras +utiliser ces armes-là... mais c'est impossible.[end] Je t'ai déjà dit que tu ne pouvais pas utiliser.... un paladin? @@ -2195,8 +2154,7 @@ TOI...?[end] T[end] Je suis la plus belle de la ville! -Je suis trop petite pour que tu le -voies? +Je suis trop petite pour que tu le voies? Regarde de trèèèèès près![end] Laisse-moi te dire, avoir une belle fille, c'est rien que des embêtements! @@ -2259,15 +2217,15 @@ Je croyais que tous les nains disaient «Hey-ho'! Bien, je dois retourner au boulot.[end] Hey-ho! -Il y a eu beaucoup de remue-ménage -au château, récemment... il s'est passé +Il y a eu beaucoup de remue-ménage au +château, récemment... il s'est passé quelque chose?[end] Vous êtes venus de la surface? Alors il y a vraiment un monde de surface après tout![end] Tu savais ça? -La grotte au nord-ouest mène au -Monde des Chimères. +La grotte au nord-ouest mène au Monde +des Chimères. C'est-y pas bizarre?[end] J'entends dire que l'océan à la surface est bleu... @@ -2281,8 +2239,7 @@ passe son temps à dormir, Lali.[end] Le maître a été vraiment occupé, Lali![end] Je vais devenir un forgeron aussi talentueux que le maître!![end] -Tu croyais que ç'allait être fini aussi -vite!? +Tu croyais que ç'allait être fini aussi vite!? Ne sois pas si impatient![end] C'est fait! L'épée sacrée Excalibur! @@ -2319,8 +2276,8 @@ Prenez tout ce que vous voulez![end] Je ne suis qu'un simple paysan.[end] Lali-ho![end] -C'est le château des Nains gouverné -par le roi Giotto![end] +C'est le château des Nains gouverné par +le roi Giotto![end] Golbez est un méchant! Mais vous, vous avez l'air chouette![end] Allez voir le roi Giotto![end] @@ -2343,15 +2300,15 @@ Ici, la pilosité faciale est un critère de beauté![end] Il y a peu de temps, le trou vers la surface s'est effondré! -Dans le même coin, nous avons sauvé -un drôle de vieux![new] +Dans le même coin, nous avons sauvé un +drôle de vieux![new] Il récupère à l'infirmerie![end] Je suis Luca! Mes poupées ont disparu. Vous ne les avez pas vues?[end] -La force des chars est la principale -force des Nains! +La force des chars est la principale force +des Nains! Nous ne serons pas vaincus si facilement![end] Le roi a été vraiment très gentil avec Luca depuis que la reine est morte![end] @@ -2373,13 +2330,13 @@ Golbez y est allé, mais ne vous inquiétez pas.[new] Sans la clef pour briser le sceau, personne ne peut y entrer.[new] -Par ailleurs, nous avons un plan -d'attaque, mais nous avons besoin de -votre assistance![new] +Par ailleurs, nous avons un plan d'attaque, +mais nous avons besoin de votre +assistance![new] [bold]Cecil[normal]: C'est notre faute si nous avons perdu le cristal! -S'il y a rien que nous puissions faire -pour aider...[new] +S'il y a rien que nous puissions faire pour +aider...[new] [bold]Giotto[normal]: Pendant que Golbez est occupé à la grotte scellée...[new] Pourriez-vous vous introduire dans la @@ -2390,31 +2347,27 @@ autres cristaux?[new] [bold]Giotto[normal]: Ne vous inquiétez pas! Je fais ordonner à la force des chars d'attaquer la tour![new] -Pendant notre diversion, entrez et -prenez les cristaux! -C'est notre seule chance, maintenant -que Golbez est parti![end] +Pendant notre diversion, entrez et prenez +les cristaux! +C'est notre seule chance, maintenant que +Golbez est parti![end] [bold]Caïn[normal]: Alors qu'est-ce qu'il faudrait faire?[new] -[bold]Rydia[normal]: C'est la base de l'ennemi, -non?[new] +[bold]Rydia[normal]: C'est la base de l'ennemi, non?[new] [bold]Rosa[normal]: Ça pourrait être assez dangereux.[new] -[bold]Yang[normal]: Mais vous savez ce qu'on -dit... +[bold]Yang[normal]: Mais vous savez ce qu'on dit... Qui ne tente rien n'a rien.[new] [bold]Caïn[normal]: Notre seule chance, c'est maintenant vu que Golbez est ailleurs.[new] [bold]Cecil[normal]: Très bien, alors...[end] [bold]Cecil[normal]: Nous le ferons![end] [bold]Giotto[normal]: Merci! -Il y a un passage secret sous le -château![new] +Il y a un passage secret sous le château! Normalement, c'est interdit, mais vous -pouvez l'utiliser! +pouvez l'utiliser![new] Je prie pour votre bonne fortune![end] -[bold]Giotto[normal]: Mes poupées étaient -maléfiques? +[bold]Giotto[normal]: Mes poupées étaient maléfiques? Je suis si furieuse que j'en crierais![end] [bold]Giotto[normal]: Nous allons tenir à distance le gros des forces ennemies! @@ -2425,11 +2378,11 @@ Le sort de toute chose est entre vos mains![end] [bold]Giotto[normal]: Papa dit que ce collier appartenait à ma mère, l'ancienne reine.[end] -[bold]Giotto[normal]: Près de la grotte scellée se -trouve la continent de Toméra où vivent -d'autres nains![new] -Mais on ne peut pas y aller à cause de -la lave![end] +[bold]Giotto[normal]: Près de la grotte scellée se trouve +la continent de Toméra où vivent d'autres +nains![new] +Mais on ne peut pas y aller à cause de la +lave![end] [bold]Giotto[normal]: Si vous pouvez voler, vous devriez pouvoir aller à la grotte scellée. Mais les Nains ne peuvent pas voler! @@ -2447,8 +2400,8 @@ Promettez-le![end] Gros Chocobo!? Grossier personnage!! On l'appelle l'Oiseau Dieu, ici![end] -Ici, apparaît un oiseau glorieux, il -gardera n'importe quoi pour toi![end] +Ici, apparaît un oiseau glorieux, il gardera +n'importe quoi pour toi![end] Personne ne peut franchir ce mur sans la permission du roi![end] Vous avez la permission du roi? @@ -2478,8 +2431,8 @@ Mais vous êtes encore plus courageux![end] Revenez en un morceau![end] Si ça devient trop dangereux, n'abusez pas de votre chance... fuyez![end] -Même si Golbez n'est pas dans la -tour de Bab-Ilu... le plus fort des quatre +Même si Golbez n'est pas dans la tour +de Bab-Ilu... le plus fort des quatre empereurs, Rubicante du Feu, y est encore![end] Notre force des chars va distraire @@ -2499,16 +2452,16 @@ Parfois, même les nains se blessent![end] Cet homme est vraiment énergique pour un vieux râleur![end] Quel vieux grincheux! -Il ne fait rien et se plaint de la -nourriture, mais il mange comme quatre![end] -Rien de tel qu'une bonne nuit de -sommeil pour se sentir mieux, Lali![end] +Il ne fait rien et se plaint de la nourriture, +mais il mange comme quatre![end] +Rien de tel qu'une bonne nuit de sommeil +pour se sentir mieux, Lali![end] Zzz...Zzz[end] Le corps de ce vieux n'est pas assez solide pour faire ça![end] -Si vous mettez de côté son -tempérament, ses plaintes et ses -ronflements, c'est un chouette gars![end] +Si vous mettez de côté son tempérament, +ses plaintes et ses ronflements, c'est un +chouette gars![end] Zzz... rrron ...Zzz[end] Ce vieux est surprenant![end] Les gens du monde du dessus sont très @@ -2581,8 +2534,7 @@ absence.[end] Ni le seigneur Golbez ni Rubicante ne sont là! C'est moi le patron, maintenant![new] -Je peux mener mes expériences en -paix...[new] +Je peux mener mes expériences en paix...[new] [bold]Rydia[normal]: Quel drôle de...[end] [bold]Docteur[normal]: Qui est là!!?[end] [bold]Caïn[normal]: Qu'est-ce que ça peut faire? @@ -2617,16 +2569,14 @@ l'utiliser...[end] [bold]Hironobu Sakaguchi[normal]: Bienvenue![end] [bold]Hironobu Sakaguchi[normal]: Dessin des Cartes -[new] -[bold]Yasushi Matsumura[normal]: Eru, Naito, -Naoshi, Hoshiya, Kuwahara, ça faisait -longtemps! -Qu'est-ce qui ne va pas? ...Hein?[new] -Ce n'est pas les bonnes personnes!? +[bold]Yasushi Matsumura[normal]: Eru, Naito, Naoshi, +Hoshiya, Kuwahara, ça faisait longtemps! +Qu'est-ce qui ne va pas? ...Hein? +Ce n'est pas les bonnes personnes!?[new] Oups....[end] [bold]Yasushi Matsumura[normal]: Graphismes -[new] [bold]Masanori Hoshino[normal]: C'est moi qui ai -dessiné tous les monstres que tu -combats.[new] +dessiné tous les monstres que tu combats. S'il y en a un que tu préfères, dis-moi lequel![end] [bold]Masanori Hoshino[normal]: Je suis Taka, le @@ -2661,9 +2611,9 @@ Dobashi -[new] de là! Je n'ai rien volé!![end] [bold]Kyoji Koizumi[normal]: Heh... -Si tu sais dès le début que tu n'as pas -de vacances, faire des jeux, ce n'est pas -si mal![new] +Si tu sais dès le début que tu n'as pas de +vacances, faire des jeux, ce n'est pas si +mal![new] Vous ne trouvez pas, Monsieur Sakaguchi?[end] @@ -2683,17 +2633,16 @@ J'ai fait plein de sons.[new] un penchant caché pour la musique. Je peux te jouer de la clarinette?[end] [bold]Nobuo Uematsu[normal]: Effets Sonores -[new] -[bold]Kenji Ito[normal]: Une fois que tu auras -terminé Final Fantasy IV, essaie Seiken -Densetsu![end] +[bold]Kenji Ito[normal]: Une fois que tu auras terminé +Final Fantasy IV, essaie Seiken Densetsu![end] Jusqu'ici, les jeux ne sont pas autorisés![end] Rosa et Rydia sont vraiment chaudes! Vous trouverez mes pouvoirs utiles![new] L'ingénieur du jeu Tokita Takahashi a -rejoint l'équipe![music][0x29][delay][0x28] Par pitié...prenez-moi -avec vous! +rejoint l'équipe![music][0x29][delay][0x28] Par pitié...prenez-moi avec +vous! Je n'en peux plus![music][0x2][end] Programme principal - [bold]Ken Narita[normal]: N'ajoutez plus @@ -2743,10 +2692,9 @@ On compte sur toi, mon pote![end] Tu es devenu un si formidable paladin! On ne s'est vraiment pas trompé en t'aidant, alors![end] -Le sort de tout ce qui vit sur cette -terre repose entre tes mains![end] -Battez-vous pour moi... et pour -Tellah![end] +Le sort de tout ce qui vit sur cette terre +repose entre tes mains![end] +Battez-vous pour moi... et pour Tellah![end] Cela doit être ta destinée que de te confronter à cela. Je prie pour ta survie![end] @@ -2755,8 +2703,8 @@ preniez pas avec vous! Vraiment... Écoutez, vous![new] Vous revenez vivant![end] -«Parce que si tu n'est pas dans le coin, -le patron fait la tronche!»[end] +«Parce que si tu n'est pas dans le coin, le +patron fait la tronche!»[end] M. Cecil, revenez bientôt![end] Prince Edward pense tout le temps à vous![end] @@ -2778,12 +2726,12 @@ souterrain![end] T[end] Rydia, tu es de retour![end] -À l'exception de Rydia, vous êtes -les premiers humains à venir ici.[end] +À l'exception de Rydia, vous êtes les +premiers humains à venir ici.[end] C'est le Monde des Chimères. Le monde où les Chimères vivent.[end] -Le roi des Chimères vit au plus profond -de notre monde.[end] +Le roi des Chimères vit au plus profond de +notre monde.[end] T[end] @@ -2792,9 +2740,9 @@ Le monde des Chimères est dirigé par Asura et le roi des Chimères.[end] J'entends dire que nos copains dans l'autre monde ne se tiennent pas bien.[end] -On dit que si vous ne pouvez pas -vaincre Dame Asura, le roi ne t'écoutera -même pas![end] +On dit que si vous ne pouvez pas vaincre +Dame Asura, le roi ne t'écoutera même +pas![end] «Lut, Rydia! Quoi? C'est bizarre que nous parlions?[end] @@ -2821,8 +2769,7 @@ Le démon du Feu, Ifrit... On dit que son feu peut consumer n'importe quoi.[end] Il paraît qu'il y a des magies d'invocation -dont personne n'a encore entendu -parler...[end] +dont personne n'a encore entendu parler...[end] Le doux vieil homme Ramuh... Long à la colère, prompt à juger... Il appelle des nuages de tempêtes et de @@ -2833,10 +2780,10 @@ geler le cur.[end] Chocobo... La plus adorable des Chimères![end] La magie d'invocation... -La magie qui appelle les Chimères de -leur royaume mystique...[new] -Ceux qui possèdent ce pouvoir sont -très peu nombreux.[end] +La magie qui appelle les Chimères de leur +royaume mystique...[new] +Ceux qui possèdent ce pouvoir sont très +peu nombreux.[end] Le monde des Chimères a une histoire tellement plus longue que le monde des humains...[end] @@ -2854,8 +2801,8 @@ Y a-t-il aussi de la littérature dans le monde des humains?[end] On ne s'ennuie jamais, ici. -Il y a tellement de livres qu'il faudrait -une éternité pour tous les lire![end] +Il y a tellement de livres qu'il faudrait une +éternité pour tous les lire![end] Pour les monstres sur lesquels «Épier»[new] ne marche pas... le Dictionnaire des @@ -2865,8 +2812,8 @@ D'où sont-ils venus et où vont-ils.... Le mystère de l'éternité...[end] Il y a bien longtemps, un immense vaisseau est venu de la Lune sur Terre... -Maintenant, il dort au fond du ventre -d'un dragon.[end] +Maintenant, il dort au fond du ventre d'un +dragon.[end] Pour celui qui surpasse le roi Chimère... Il est dit qu'il existe un dieu Chimère qui nous a créés et qui nous protège de loin. @@ -2874,12 +2821,11 @@ Il ne connaît pas la défaite...[new] Seule sa propre puissance retournée contre lui pourrait lui faire du mal...[end] Il y a deux lunes... -Mais on dit que dans les temps anciens, -il n'y en avait qu'une seule.[end] -La Reine du Monde des Chimères, -Asura... -En tant qu'épouse du roi Chimère, elle -est la clef vers son audience.[new] +Mais on dit que dans les temps anciens, il +n'y en avait qu'une seule.[end] +La Reine du Monde des Chimères, Asura... +En tant qu'épouse du roi Chimère, elle est +la clef vers son audience.[new] Seuls ceux qui peuvent la surpasser pourront voir la vraie forme du roi...[end] Le roi Chimère... @@ -2889,12 +2835,12 @@ et sans rival.[end] Odin, le chevalier des grands guerriers du passé...[new] La seule fois qu'il a jamais été vaincu, -c'était quand un éclair s'est abattu sur -son épée.[end] +c'était quand un éclair s'est abattu sur son +épée.[end] Les douces et sveltes Sylphes... Quand elles unissent leurs forces, elles -canalisent l'énergie vitale de leurs -ennemis vers elles-mêmes....[end] +canalisent l'énergie vitale de leurs ennemis +vers elles-mêmes....[end] La loi du Monde des Chimères... ...est d'avoir de la force et un cur pur... Affirmez cette force, et testez leur âme @@ -2907,8 +2853,8 @@ besoin de la permission de la reine Asura.[end] Rydia... Tu as des amis forts et bienveillants. Tu peux m'appeler n'importe quand...[end] -Tu possèdes une lumière puissante qui -te guide! +Tu possèdes une lumière puissante qui te +guide! Je vais te donner mes pouvoirs en tant que maître des océans, Léviathan![end] Le roi Chimère? @@ -2916,8 +2862,8 @@ Non, non, je ne suis qu'un vieux fou![end] Alors je vais tester ta force![end] Alors, malheureusement, je ne peux pas vous donner mon pouvoir.[end] -Une fois que tu auras confiance en toi, -je te combattrai quand tu voudras![end] +Une fois que tu auras confiance en toi, je +te combattrai quand tu voudras![end] Est-ce que les humains peuvent utiliser les armes, ici?[end] @@ -2932,8 +2878,8 @@ Nous voulons juste vivre en paix.[end] Ils vivent tous ici...[end] Cet Ifrit! Une tête brûlée, comme toujours.[end] -Si tu lances le sort Lévite, tu -échapperas à la colère de Titan![end] +Si tu lances le sort Lévite, tu échapperas +à la colère de Titan![end] T[end] @@ -2956,8 +2902,8 @@ Tout de suite![end] [bold]Yang[normal]: N'emportez pas Yang![end] [bold]Yang[normal]: Nous ne vous laisserons pas Yang![end] -[bold]Yang[normal]: Vous, les humains, vous êtes -si violents![end] +[bold]Yang[normal]: Vous, les humains, vous êtes si +violents![end] [bold]Yang[normal]: Nous l'avons trouvé évanoui au-dehors de notre trou. Mais il ne s'est pas réveillé... @@ -2974,14 +2920,14 @@ M. Cecil?[new] [bold]Cecil[normal]: Yang![new] [bold]Rydia[normal]: Je suis si contente que tu ailles bien![new] -[bold]Yang[normal]: Les Sylphes m'ont arraché -aux griffes de la mort.[new] +[bold]Yang[normal]: Les Sylphes m'ont arraché aux +griffes de la mort.[new] [bold]Rosa[normal]: Grâce à toi, le super canon a été détruit![new] [bold]Yang[normal]: Je viens avec vous...[new] [bold]Sylphe[normal]: Non, tu dois dormir![end] -[bold]Yang[normal]: Le sort du monde est en -train de se jouer! +[bold]Yang[normal]: Le sort du monde est en train +de se jouer! Je ne peux pas rester ici et dormir![new] [bold]Edge[normal]: Ce n'est pas un endroit pour un mec blessé comme toi.[end] @@ -3005,8 +2951,7 @@ Rydia a appris Sylphe![music][0x29][delay][0xc][end] [bold]Sylphe[normal]: Ah! Arrêtez![end] [bold]Sylphe[normal]: Yang va beaucoup mieux![end] -[bold]Sylphe[normal]: C'est bien vide sans -Yang...[end] +[bold]Sylphe[normal]: C'est bien vide sans Yang...[end] [bold]Sylphe[normal]: Il est marié, alors.... enfin bon![end] [bold]Sylphe[normal]: Dites bonjour à Yang de notre part![end] @@ -3072,36 +3017,34 @@ puissance, tu peux appeler mon nom![end] T[end] Nous sommes les cristaux de la Lune.[end] -L'équilibre des huit cristaux sur la -Planète Bleue est maintenu ici sur la -Lune.[end] +L'équilibre des huit cristaux sur la Planète +Bleue est maintenu ici sur la Lune.[end] Les gens de la Lune dorment loin au-dessous de ce sol. FuSoYa est le gardien des dormeurs.[end] Zémus est un homme terrible. -Bien qu'il soit scellé profondément sous -le sol, son esprit maléfique ne cesse de +Bien qu'il soit scellé profondément sous le +sol, son esprit maléfique ne cesse de s'accroître...[end] Seul notre pouvoir garde Zémus scellé dans le noyau de la lune.[end] -Zémus a utilisé Golbez pour réunir -les cristaux de la Planète Bleue... et a -amplifié leur puissance avec la tour de -Bab-Ilu.[end] +Zémus a utilisé Golbez pour réunir les +cristaux de la Planète Bleue... et a amplifié +leur puissance avec la tour de Bab-Ilu.[end] Dès à présent, nous sentons ses tentatives pour détruire le sceau.[end] Le sol du centre de la salle mène au noyau de la lune... le royaume de Zémus...[end] -Quand la tour de Bab-Ilu a été -détruite, notre sceau a été affaibli![end] -Dormant avec les Luniens, au-dessous, -se trouvent des armes puissantes.[end] +Quand la tour de Bab-Ilu a été détruite, +notre sceau a été affaibli![end] +Dormant avec les Luniens, au-dessous, se +trouvent des armes puissantes.[end] Il y a déjà quelque temps que FuSoYa et le fils de KluYa sont entrés et descendus.[end] -Nous utilisons toute notre puissance -pour essayer de maintenir Zémus scellé... -au plus profond du noyau lunaire.[end] +Nous utilisons toute notre puissance pour +essayer de maintenir Zémus scellé... au +plus profond du noyau lunaire.[end] Il y a une énergie phénoménale qui transite entre Zémus et nous.[end] J'ai peur pour FuSoYa et le fils de @@ -3143,9 +3086,9 @@ des surnoms...[end] T[end] Tu as obtenu la Masamune![music][0x29][delay][0xc][end] -Pensiez-vous réellement que des gens -de la Planète Bleue pourraient être -capables d'utiliser cette... +Pensiez-vous réellement que des gens de +la Planète Bleue pourraient être capables +d'utiliser cette... Masamune!?[end] T[end] From 0aeb766c9ef0d82d67d3a702f09ac41a899515e9 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Wed, 17 Sep 2025 22:36:51 +0200 Subject: [PATCH 34/63] More formatting include avoiding the fourth line last tiles to make room for the action indicator. --- text/fr/bank1-1.xml | 36 ++++++++++++++++++------------------ text/fr/bank1-2.xml | 2 +- text/fr/bank2.xml | 17 ++++++++--------- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/text/fr/bank1-1.xml b/text/fr/bank1-1.xml index 29d071c..2af3d78 100644 --- a/text/fr/bank1-1.xml +++ b/text/fr/bank1-1.xml @@ -256,7 +256,7 @@ Il n'accomplirait rien qui ne soit honorable...[new] [bold]Cecil[normal]: Caïn, j'envie ta foi en Sa Majesté. -Il a évoqué ton père... +Il a évoqué ton père...[new] Il possédait la même loyauté indéfectible...[new] [bold]Caïn[normal]: Mon père...Mon père était aussi un chevalier dragon. @@ -392,8 +392,8 @@ Edward... je ne sais pas...[new] [bold]Yang[normal]: Où sommes-nous?[new] [bold]Cecil[normal]: À Baron. Si les soldats nous entendent, on aura -des ennuis. -Il y a une chambre tranquille à l'auberge.[new] +des ennuis.[new] +Il y a une chambre tranquille à l'auberge. Allons-y! [0xfa]Le Moine Yang a rejoint le groupe![music][0x29][delay][0x28][end] @@ -724,7 +724,7 @@ aéronefs...[end] [bold]Roi Fabul[normal]: Yang, tu es de retour! Cette expression sur ton visage...[new] [bold]Yang[normal]: Oui! -Mais plus important, Roi Fabul! +Mais plus important, Roi Fabul![new] Un homme nommé Golbez mobilise les forces de Baron afin de voler notre cristal![new] [bold]Roi Fabul[normal]: Quoi!? @@ -1517,7 +1517,7 @@ Terre, mot à mot, le monde souterrain.[new] [bold]Cid[normal]: Mais comment on va bien pouvoir y aller? En creusant un trou, ou quoi?[new] -[bold]Caïn[normal]: Je n'en sais rien... +[bold]Caïn[normal]: Je n'en sais rien...[new] En tout cas, Golbez a dit qu'une fois les cristaux de la face et de l'arrière réunis, le chemin vers la Lune s'ouvrirait.[new] @@ -1563,7 +1563,7 @@ vous tirer dessus.[new] quatre cristaux.[new] [bold]Yang[normal]: Nous arrivons tard...[new] [bold]Giotto[normal]: Mais le cristal de ce château est, -lui, toujours en sécurité. +lui, toujours en sécurité.[new] On a pu faire battre en retraite ces... heu... trucs volants avec nos chars nains.[new] [bold]Rosa[normal]: Alors c'étaient vos chars qui @@ -1593,9 +1593,9 @@ On ne va pas en tirer grand chose.[end] «Nous sommes les joyeuses Calcabrina! Poupées effrayantes mais mignonnes! Bandes d'idiots! Vous venez ici si -naïvement! On va vous battre et offrir -vos têtes au seigneur Golbez en -cadeau! Kya-ho-ho-ho!»[end] +naïvement! On va vous battre et offrir vos +têtes au seigneur Golbez en cadeau! +Kya-ho-ho-ho!»[end] [bold]Cecil[normal]: Quoi!?[new] «Cela faisait longtemps...»[end] @@ -1607,16 +1607,16 @@ Mais celui qui utilisait Météore n'est plus de ce monde maintenant.[new] En remerciement de l'autre fois, je vais vous dire pourquoi je rassemble les -cristaux. -Lumière et ténèbres réunies... 8 cristaux...[new] +cristaux.[new] +Lumière et ténèbres réunies... 8 cristaux... C'est la clé pour faire revivre la Tour de -Babel, le chemin scellé vers la Lune. +Babel, le chemin scellé vers la Lune.[new] On dit qu'il y a sur la Lune un pouvoir qui -dépasse notre imagination.[new] +dépasse notre imagination. Avec ce cristal, j'en ai maintenant sept... -Il n'en reste plus qu'un. +Il n'en reste plus qu'un.[new] C'est aussi grâce à vous. -Je me dois de vous remercier pour cela.[new] +Je me dois de vous remercier pour cela. Prenez ceci! C'est mon dernier cadeau![end] @@ -1791,7 +1791,7 @@ Tout le monde... tout le monde![new] [bold]Cecil[normal]: ...L'adversaire est le plus puissant des Quatre Élémentaux. -On ne sait même pas si on a une chance! +On ne sait même pas si on a une chance![new] Mais nous devons récupérer les cristaux![new] [bold]Edge[normal]: ...Une si jolie fille qui pleure... je n'ai pas le choix... @@ -2451,7 +2451,7 @@ quelque chose?[end] «Partez maintenant et il ne vous fait aucun mal...»[new] [bold]Caïn[normal]: Montre-toi![new] -«Vous voulez vraiment continuer?»[end] +«Vous voulez vraiment continuer?»[close_window][end] [bold]Edward[normal]: Cecil... Rosa veut être avec vous.[new] @@ -2601,7 +2601,7 @@ Qui es-tu?[end] [bold]Porom[normal]: Il attaque![end] [bold]Tellah[normal]: !? -Mé... ...téor? +Mé... ...téor?[new] Cette lumière m'a donné l'ultime magie noire, Météor! [0xfa]Tellah apprend Météor![music][0x29][delay][0x28][end] diff --git a/text/fr/bank1-2.xml b/text/fr/bank1-2.xml index 15aa14d..6673d44 100644 --- a/text/fr/bank1-2.xml +++ b/text/fr/bank1-2.xml @@ -419,7 +419,7 @@ continuâmes à dormir...[end] [bold]Edge[normal]: Une autre lune?[new] [bold]FuSoYa[normal]: Mais l'un des nôtres refusa de -dormir... +dormir...[new] Il voulait purger votre planète de tout être vivant pour pouvoir nous y installer.[new] [bold]Rydia[normal]: Quelle horreur...![new] diff --git a/text/fr/bank2.xml b/text/fr/bank2.xml index 85a02d4..afa3429 100644 --- a/text/fr/bank2.xml +++ b/text/fr/bank2.xml @@ -530,7 +530,7 @@ c'est pourquoi nos soirées sont chaudes... si tu vois ce que je veux dire.[end] Bien! Aujourd'hui, J'ai eu un rencard au -comptoir! +comptoir![new] Demain, c'est au-dessus que ça se passe![end] Salut, chéri! -clin d'il[end] Je suis content d'avoir vécu si longtemps! @@ -733,7 +733,7 @@ chasser les Chimères? Les villageois sont pertutbés... Et je parle même pas de moi...[new] Enfin, de toute façon, sois prudent, reçu? -Je rentre à la maison. +Je rentre à la maison.[new] J'ai pas mal bossé ces derniers temps... et ma fille me pique des crises à cause de ça![end] As-tu vu notre patron Cid dans le @@ -859,9 +859,8 @@ quand vous serez partis![end] Tu n'arrives pas à dormir?[end] [bold]Cecil[normal]: C'est là!?[new] [bold]Cid[normal]: Ouaip, juste sous leur nez![end] -va Aïe abîme paraît Si tu évaluais ta vie, -tu ne devrais pas commencer à te faire -des idées.[end] +Si tu évaluais ta vie, tu ne devrais pas +commencer à te faire des idées.[end] Même si j'avais réalisé que le roi avait changé, je n'ai rien dit, pour me protéger...[end] @@ -1260,7 +1259,7 @@ Oh, ces oignons... Ils me piquent tellement les yeux...[end] [bold]Yang[normal]: Il ne devrait pas être dans un état pareil! -S'il te plaît... +S'il te plaît...[new] Donne-lui un bon coup de ça sur la tête![end] [bold]Yang[normal]: Obtenu la Poêle à frire de l'Amour![end] @@ -1374,7 +1373,7 @@ incroyable.[end] Le cristal de la terre? Il a été volé par l'Elfe Noir.[end] Le pouvoir du cristal varie suivant qui le -possède! +possède![new] Si une personne maléfique l'avait, cela pourrait avoir de terribles répercussions![end] Si la rumeur disant qu'il y a plus de @@ -1500,12 +1499,12 @@ Si tu déplaces le curseur vers la gauche pendant un combat, tu peux inverser les rangs avant et arrière.[new] Si tu appuies sur droite, tu vas rester en -garde! +garde![new] Aussi, si tu veux utiliser une arme en tant qu'objet dans un combat, sélectionne «Objet»[new] et déplace le curseur tout en haut pour -sélectionner ton arme! +sélectionner ton arme![new] Utilise ça pour changer d'arme ou refaire le plein de flèches, et la victoire est à toi![end] Tu dois prendre rapidement des décisions From a965349b9198b1431f900c3f9ca4c042395f8e88 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Wed, 17 Sep 2025 22:41:52 +0200 Subject: [PATCH 35/63] Makes sure we are iterating over kerning pairs correctly, if the kerning table contains no entry return. --- src/kerning.s | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/kerning.s b/src/kerning.s index 736e428..c925a16 100644 --- a/src/kerning.s +++ b/src/kerning.s @@ -15,10 +15,12 @@ _GetKerningAdjustmentLinearSearch: { ldy.w #0x1100 lda.b [font_addr], y ; right = NumKerningPairs + beq NotFound + dec tax lda.w #0x0000 _loop: - + txa pha asl clc @@ -37,8 +39,9 @@ _loop: dec tax - bne _loop + bpl _loop +NotFound: lda.w #0x0000 sec rts From fb97e20f1a4ef8458963caabe099446917dce903 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Wed, 17 Sep 2025 23:17:11 +0200 Subject: [PATCH 36/63] Battle text use PV/PM instead of HP/MP --- text/fr/item_descriptions.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/text/fr/item_descriptions.xml b/text/fr/item_descriptions.xml index d21eab8..2a39cd9 100644 --- a/text/fr/item_descriptions.xml +++ b/text/fr/item_descriptions.xml @@ -1,9 +1,9 @@ Ne peut pas être utilisé depuis ce menu. - Restaure des HP. - Restaure des MP. - Restaure complètement les HP/MP. + Restaure des PV. + Restaure des PM. + Restaure complètement les PV/PM. Guérit l'incapacité de combattre. Guérit la pétrification. Guérit le statut de grenouille. @@ -14,7 +14,7 @@ Neutralise le poison. Enlève la malédiction. Guérit divers états. - Régénère 1000 HP et 100 MP à l'équipe[0x01][0xd4][0x00]et guérit des altérations d'état. + Régénère 1000 PV et 100 PM à l'équipe[0x01][0xd4][0x00]et guérit des altérations d'état. Revient à l'étape précédente. Téléporte à la surface. Affichez la carte de la région. From fb50e5565af1e46bf183fc5fcf3988637b61340e Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Wed, 17 Sep 2025 23:21:12 +0200 Subject: [PATCH 37/63] Adds support for kerning adjustments for the vwf8 with caveats. We can't apply it every time it's needed, if the previous char cleared the tile we currently cannot go back to the previous tile, contrary to the dialog vwf where we are more in control of string reading and it's easy to get the next char, here the chars are read by the original code and the char shifting code is injected after that part (because chars can come from various places) which means the kerning adjustment can only be done after the first letter rendering. --- build.py | 140 +++++++----- format_bank_xml.py | 140 ++++++++---- metrics.py | 108 +++++---- src/battle/message.s | 131 ++++++++++- src/small_vwf/render.s | 119 +++++++++- utils/font_converter.py | 483 +++++++++++++++++++++++++--------------- 6 files changed, 790 insertions(+), 331 deletions(-) diff --git a/build.py b/build.py index 566bfda..c717444 100755 --- a/build.py +++ b/build.py @@ -138,8 +138,11 @@ def build_fixed_asset(table, input_file, binary_text_file): pointers = read_fixed_from_xml(input_file, table) write_pointers_value_as_binary(pointers, binary_text_file) + def build_fixed_to_ptr_asset(table, input_file, binary_text_file, pointers_file): - pointers = read_fixed_from_xml(input_file, table, formatter=lambda t: t.strip() + "[end]") + pointers = read_fixed_from_xml( + input_file, table, formatter=lambda t: t.strip() + "[end]" + ) metrics = TextMetrics(table, ["./assets/menu_font.dat"], char_height=8) max_length = 0 @@ -156,6 +159,7 @@ def build_fixed_to_ptr_asset(table, input_file, binary_text_file, pointers_file) pointers, lambda x: struct.pack(" None: + +def build_null_terminated_with_base( + table: Table, input_file: str, binary_file: str, base: int +) -> None: pointers = read_stringarray_from_xml(input_file, table) pointers_bytes = io.BytesIO() @@ -174,7 +181,7 @@ def build_null_terminated_with_base(table: Table, input_file: str, binary_file:s for pointer in pointers: value = pointer.get_value() - pointers_bytes.write(struct.pack(" None: add_custom_kernings("tt", 2) else: - kerning_pairs = {} - + known_pairs_to_kern = [ + "Fa", + "Fe", + "Fo", + "Fu", + "Ta", + "Te", + "To", + "Tu", + "Tr", + "ra", + "re", + "ro", + "Aï", + "ïe", + "aî", + "ît", + "pa", + "at", + "ta", + "te", + "nt", + "fa", + "fe", + "fo", + "fu", + "fi", + "st", + "va", + ] + kerning_pairs = converter.find_kerning_pairs(table, known_pairs_to_kern) with open(data_file, "wb") as fd: fd.write(data) - + # Write kerning data immediately after character data count = len(kerning_pairs) fd.write(struct.pack("= len(text): # End of text break - elif text[i: i + 5] == "[end]": # Followed by [end] (special case) + elif text[i : i + 5] == "[end]": # Followed by [end] (special case) break - elif text[i: i + 14] == "[close_window]": # Followed by [close_window] (special case) + elif ( + text[i : i + 14] == "[close_window]" + ): # Followed by [close_window] (special case) break elif i < len(text) and text[i] == "[": # Check if this is followed by a control code (not [end]) @@ -129,10 +131,10 @@ def tokenize(self, text): # Find the closing bracket bracket_end = text.find("]", i) if bracket_end != -1: - control_code = text[i: bracket_end + 1] + control_code = text[i : bracket_end + 1] if control_code not in ["[end]", "[close_window]"]: # This is a control code, include it in the sentence but don't consume following spaces - sentence += text[i: bracket_end + 1] + sentence += text[i : bracket_end + 1] i = bracket_end + 1 # Don't consume the space - let the main loop handle it continue @@ -146,11 +148,11 @@ def tokenize(self, text): j += 1 if j < len(text): if ( - text[j].isupper() - or text[j: j + 1] == "«" - or self.character_pattern.match(text, j) - or text[j: j + 5] == "[end]" - or text[j: j + 14] == "[close_window]" + text[j].isupper() + or text[j : j + 1] == "«" + or self.character_pattern.match(text, j) + or text[j : j + 5] == "[end]" + or text[j : j + 14] == "[close_window]" ): break else: @@ -170,54 +172,59 @@ def __init__(self, text_metrics=None): if text_metrics is None: try: table = Table("text/ff4fr.tbl") - + # Use new interleaved format with correct font order font_files = [ - "assets/font.dat", # Index 0: [normal] (fe 00) - "assets/wicked_font.dat", # Index 1: [wicked] (fe 01) - "assets/book_font.dat", # Index 2: [book/force_book] (fe 02) - "assets/bold_font.dat" # Index 3: [bold] (fe 03) + "assets/font.dat", # Index 0: [normal] (fe 00) + "assets/wicked_font.dat", # Index 1: [wicked] (fe 01) + "assets/book_font.dat", # Index 2: [book/force_book] (fe 02) + "assets/bold_font.dat", # Index 3: [bold] (fe 03) ] - + self.text_metrics = TextMetrics(table, font_files, char_height=16) except (FileNotFoundError, Exception): # Fallback to None if metrics can't be loaded (for testing) self.text_metrics = None else: self.text_metrics = text_metrics - + # Initialize font state tracking self.reset_font_context() - + def reset_font_context(self): """Reset font context to default state for processing a new pointer.""" - self.current_font_index = 0 # Track current font index (0=normal, 1=wicked, 2=book, 3=bold) + self.current_font_index = ( + 0 # Track current font index (0=normal, 1=wicked, 2=book, 3=bold) + ) def parse(self, tokens): """Parse tokens and inject WINDOW_BREAK tokens for guillemet speech transitions.""" # First pass: inject WINDOW_BREAK tokens for guillemet transitions enhanced_tokens = self._inject_window_breaks(tokens) - + # Second pass: process the enhanced tokens for dialog formatting return self._format_dialog(enhanced_tokens) - + def _inject_window_breaks(self, tokens): """Inject WINDOW_BREAK tokens where guillemet speeches should create new windows.""" enhanced_tokens = [] - + for i, token in enumerate(tokens): # Add the current token enhanced_tokens.append(token) - + # Check if we need to add WINDOW_BREAK after this token if token.type == "GUILLEMET_SPEECH": # Add WINDOW_BREAK after guillemet speech if there's a next dialog token # and it's not immediately followed by END or CLOSE_WINDOW - if (i + 1 < len(tokens) and - tokens[i + 1].type in ["CHARACTER", "GUILLEMET_SPEECH", "SENTENCE"] and - tokens[i + 1].type not in ["END", "CLOSE_WINDOW"]): + if ( + i + 1 < len(tokens) + and tokens[i + 1].type + in ["CHARACTER", "GUILLEMET_SPEECH", "SENTENCE"] + and tokens[i + 1].type not in ["END", "CLOSE_WINDOW"] + ): enhanced_tokens.append(Token("WINDOW_BREAK", "[window_break]")) - + elif token.type == "SENTENCE" and i > 0: # Add WINDOW_BREAK after character speech if followed by guillemet # First, find if we're in a character context by looking backwards @@ -228,15 +235,14 @@ def _inject_window_breaks(self, tokens): break elif tokens[j].type in ["GUILLEMET_SPEECH", "END", "CLOSE_WINDOW"]: break - + if in_character_context: # Look ahead to see if followed by guillemet speech - if (i + 1 < len(tokens) and - tokens[i + 1].type == "GUILLEMET_SPEECH"): + if i + 1 < len(tokens) and tokens[i + 1].type == "GUILLEMET_SPEECH": enhanced_tokens.append(Token("WINDOW_BREAK", "[window_break]")) - + return enhanced_tokens - + def _format_dialog(self, tokens): """Format dialog tokens into final output, handling WINDOW_BREAK tokens.""" result = [] @@ -252,7 +258,11 @@ def _format_dialog(self, tokens): if token.type == "WINDOW_BREAK": # Flush accumulated sentences with [new] and reset state if accumulated_sentences: - result.extend(self._flush_pre_wrapped_sentences(accumulated_sentences, add_new=True)) + result.extend( + self._flush_pre_wrapped_sentences( + accumulated_sentences, add_new=True + ) + ) accumulated_sentences = [] accumulated_text = "" accumulated_lines = 0 @@ -271,7 +281,6 @@ def _format_dialog(self, tokens): ) accumulated_sentences = [] accumulated_text = "" - accumulated_lines = 0 current_character = "[bold]" + token.value + "[normal]" i += 1 @@ -287,8 +296,10 @@ def _format_dialog(self, tokens): ) # Apply word wrapping to this sentence immediately - wrapped_sentence, self.current_font_index = self.text_metrics.word_warp( - sentence, WINDOW_WIDTH, self.current_font_index + wrapped_sentence, self.current_font_index = ( + self.text_metrics.word_warp( + sentence, WINDOW_WIDTH, self.current_font_index + ) ) # Check if adding this wrapped sentence would exceed 4-line limit @@ -336,8 +347,10 @@ def _format_dialog(self, tokens): sentence = token.value # Apply word wrapping with current font context - wrapped_sentence, self.current_font_index = self.text_metrics.word_warp( - sentence, WINDOW_WIDTH, self.current_font_index + wrapped_sentence, self.current_font_index = ( + self.text_metrics.word_warp( + sentence, WINDOW_WIDTH, self.current_font_index + ) ) # Apply same intelligent grouping for narrative using wrapped sentences @@ -385,17 +398,23 @@ def _format_dialog(self, tokens): elif token.type == "GUILLEMET_SPEECH": # Flush any accumulated sentences first if accumulated_sentences: - result.extend(self._flush_pre_wrapped_sentences(accumulated_sentences)) + result.extend( + self._flush_pre_wrapped_sentences(accumulated_sentences) + ) accumulated_sentences = [] accumulated_text = "" - accumulated_lines = 0 # Apply word wrapping to guillemet speech - wrapped_guillemet, self.current_font_index = self.text_metrics.word_warp(token.value, WINDOW_WIDTH, self.current_font_index) + wrapped_guillemet, self.current_font_index = ( + self.text_metrics.word_warp( + token.value, WINDOW_WIDTH, self.current_font_index + ) + ) # Check if next token is WINDOW_BREAK to determine if we need [new] - next_is_window_break = (i + 1 < len(tokens) and - tokens[i + 1].type == "WINDOW_BREAK") + next_is_window_break = ( + i + 1 < len(tokens) and tokens[i + 1].type == "WINDOW_BREAK" + ) if next_is_window_break: result.append(wrapped_guillemet + "[new]") @@ -446,7 +465,7 @@ def _format_dialog(self, tokens): # No accumulated sentences and no previous results - this is a standalone [close_window] result.append("[close_window]") - # Reset all state after [close_window] + # Reset all state after [close_window] current_character = None accumulated_sentences = [] accumulated_text = "" @@ -464,9 +483,11 @@ def _format_dialog(self, tokens): def _is_next_token_end(self, tokens, current_index): """Check if the next token is END or CLOSE_WINDOW""" - return (current_index + 1 < len(tokens) and - tokens[current_index + 1].type in ["END", "CLOSE_WINDOW"]) - + return current_index + 1 < len(tokens) and tokens[current_index + 1].type in [ + "END", + "CLOSE_WINDOW", + ] + def _will_character_end_with_end_token(self, tokens, character_index): """Check if the upcoming character speech will end with an END or CLOSE_WINDOW token""" # Look ahead from the character token to find where this character's speech ends @@ -488,6 +509,29 @@ def _measure_lines_wrapped(self, wrapped_text): return 0 return wrapped_text.count("\n") + 1 + def _fits_in_dialog_window(self, wrapped_text): + """Check if the wrapped text fits in a dialog window considering the fourth line is 8 pixels shorter.""" + if not wrapped_text: + return True + + lines = wrapped_text.split("\n") + num_lines = len(lines) + + # More than 4 lines never fits + if num_lines > 4: + return False + + # If we have exactly 4 lines, check if the fourth line fits in the reduced width + if num_lines == 4: + fourth_line = lines[3] + # Measure the fourth line width using current font context + fourth_line_width = self.text_metrics.measure_string(fourth_line) + if fourth_line_width > FOURTH_LINE_WIDTH: + return False + + # 3 or fewer lines, or 4 lines where the fourth line fits + return True + def _flush_pre_wrapped_sentences(self, wrapped_sentences, add_new=False): """Flush pre-wrapped sentences without re-wrapping them.""" if not wrapped_sentences: diff --git a/metrics.py b/metrics.py index 61073b9..8595e93 100644 --- a/metrics.py +++ b/metrics.py @@ -8,12 +8,14 @@ def __init__(self, table: Table, font_files: list[str], char_height: int = 16): self.table = table self.font_files = font_files self.char_height = char_height - + # Load new interleaved format self.length_tables = [] self.kerning_tables = [] for font_file in font_files: - length_table, kerning_table = self._load_interleaved_font(font_file, char_height) + length_table, kerning_table = self._load_interleaved_font( + font_file, char_height + ) self.length_tables.append(length_table) self.kerning_tables.append(kerning_table) @@ -22,11 +24,11 @@ def measure_bytes(self, binary: bytes) -> int: k = 0 current_font_index = 0 prev_char = None - + while k < len(binary): char = binary[k] match char: - case 0xfe: + case 0xFE: k += 1 current_font_index = binary[k] prev_char = None # Reset previous char on font change @@ -38,16 +40,18 @@ def measure_bytes(self, binary: bytes) -> int: # Add character width char_width = self.length_tables[current_font_index][char] size += char_width - + # Add spacing (default 1 pixel, adjusted by kerning) spacing = 1 if prev_char is not None: # Check for kerning adjustment kerning_pair = (prev_char, char) if kerning_pair in self.kerning_tables[current_font_index]: - kerning_value = self.kerning_tables[current_font_index][kerning_pair] + kerning_value = self.kerning_tables[current_font_index][ + kerning_pair + ] spacing = kerning_value + 1 # Kerning + 1 = actual spacing - + size += spacing prev_char = char @@ -59,7 +63,9 @@ def measure_string(self, line: str) -> int: binary_line = self.table.to_bytes(line) return self.measure_bytes(binary_line) - def word_warp(self, line: str, max_pixel_width: int, start_font_index: int = 0) -> tuple[str, int]: + def word_warp( + self, line: str, max_pixel_width: int, start_font_index: int = 0 + ) -> tuple[str, int]: breaking_chars = b"\xff" binary_line = self.table.to_bytes(line) @@ -70,7 +76,7 @@ def word_warp(self, line: str, max_pixel_width: int, start_font_index: int = 0) prev_char = None # Reset previous character for each new string # Calculate space width with current font context - space_char = 0xff # Space character + space_char = 0xFF # Space character space_width = self.length_tables[current_font_index][space_char] + 1 while index < len(binary_line): next_break_point = binary_line.find(breaking_chars, index) @@ -81,7 +87,7 @@ def word_warp(self, line: str, max_pixel_width: int, start_font_index: int = 0) next_word_pixel_length = self._measure_bytes_with_context( next_word, current_font_index, prev_char ) - + if current_line_pixel_width + next_word_pixel_length >= max_pixel_width: current_line_pixel_width = next_word_pixel_length binary_breaked_line += b"\x01" @@ -91,15 +97,15 @@ def word_warp(self, line: str, max_pixel_width: int, start_font_index: int = 0) binary_breaked_line += b"\xff" current_line_pixel_width += next_word_pixel_length + space_width - prev_char = 0xff # Space character - + prev_char = 0xFF # Space character + binary_breaked_line += next_word - + # Update font context and prev_char after processing word current_font_index, prev_char = self._update_context_after_bytes( next_word, current_font_index, prev_char ) - + # Recalculate space width for new font context space_width = self.length_tables[current_font_index][space_char] + 1 @@ -113,8 +119,8 @@ def word_warp(self, line: str, max_pixel_width: int, start_font_index: int = 0) ) if index > 0: if ( - current_line_pixel_width + remaining_word_pixel_length - >= max_pixel_width + current_line_pixel_width + remaining_word_pixel_length + >= max_pixel_width ): binary_breaked_line += b"\x01" else: @@ -129,16 +135,18 @@ def word_warp(self, line: str, max_pixel_width: int, start_font_index: int = 0) return self.table.to_text(binary_breaked_line), current_font_index - def _measure_bytes_with_context(self, binary: bytes, font_index: int, prev_char: int = None) -> int: + def _measure_bytes_with_context( + self, binary: bytes, font_index: int, prev_char: int = None + ) -> int: """Measure bytes with given font context and previous character.""" size = 0 k = 0 current_font_index = font_index - + while k < len(binary): char = binary[k] match char: - case 0xfe: + case 0xFE: k += 1 current_font_index = binary[k] prev_char = None # Reset previous char on font change @@ -147,22 +155,24 @@ def _measure_bytes_with_context(self, binary: bytes, font_index: int, prev_char: size += 6 * 8 prev_char = None # Reset previous char after special sequence case 0x8: - size = 4 * 8 # Assume 4 full chars for gils count. + size = 4 * 8 # Assume 4 full chars for gils count. prev_char = None case _: # Add character width char_width = self.length_tables[current_font_index][char] size += char_width - + # Add spacing (default 1 pixel, adjusted by kerning) spacing = 1 if prev_char is not None: # Check for kerning adjustment kerning_pair = (prev_char, char) if kerning_pair in self.kerning_tables[current_font_index]: - kerning_value = self.kerning_tables[current_font_index][kerning_pair] + kerning_value = self.kerning_tables[current_font_index][ + kerning_pair + ] spacing = kerning_value + 1 # Kerning + 1 = actual spacing - + size += spacing prev_char = char @@ -170,15 +180,17 @@ def _measure_bytes_with_context(self, binary: bytes, font_index: int, prev_char: return size - def _update_context_after_bytes(self, binary: bytes, font_index: int, prev_char: int = None) -> tuple[int, int]: + def _update_context_after_bytes( + self, binary: bytes, font_index: int, prev_char: int = None + ) -> tuple[int, int]: """Update font context and prev_char after processing bytes.""" k = 0 current_font_index = font_index - + while k < len(binary): char = binary[k] match char: - case 0xfe: + case 0xFE: k += 1 current_font_index = binary[k] prev_char = None @@ -200,11 +212,11 @@ def measure_line_count(self, line: str, max_pixel_width: int) -> int: current_line_pixel_width = 0 index = 0 current_font_index = 0 # Always start with normal font (index 0) - space_char = 0xff # Space character + space_char = 0xFF # Space character space_width = self.length_tables[current_font_index][space_char] + 1 prev_char = None - + while index < len(binary_line): next_break_point = binary_line.find(breaking_chars, index) @@ -215,20 +227,20 @@ def measure_line_count(self, line: str, max_pixel_width: int) -> int: next_word_pixel_length = self._measure_bytes_with_context( next_word, current_font_index, prev_char ) - + if current_line_pixel_width + next_word_pixel_length >= max_pixel_width: current_line_pixel_width = next_word_pixel_length lines_count += 1 prev_char = None # Reset after line break else: current_line_pixel_width += next_word_pixel_length + space_width - prev_char = 0xff # Space character - + prev_char = 0xFF # Space character + # Update font context after processing word current_font_index, prev_char = self._update_context_after_bytes( next_word, current_font_index, prev_char ) - + # Recalculate space width for new font context space_width = self.length_tables[current_font_index][space_char] + 1 @@ -241,53 +253,59 @@ def measure_line_count(self, line: str, max_pixel_width: int) -> int: remaining_word, current_font_index, prev_char ) if ( - current_line_pixel_width + remaining_word_pixel_length - >= max_pixel_width + current_line_pixel_width + remaining_word_pixel_length + >= max_pixel_width ): lines_count += 1 break return lines_count + 1 - def _load_interleaved_font(self, font_file: str, char_height: int = 16) -> tuple[bytes, dict]: + def _load_interleaved_font( + self, font_file: str, char_height: int = 16 + ) -> tuple[bytes, dict]: """Load font data in the new interleaved format with kerning after character data.""" try: - with open(font_file, 'rb') as f: + with open(font_file, "rb") as f: font_data = f.read() except FileNotFoundError: # Return empty tables if font file doesn't exist return bytes(256), {} - + # Extract character width data from interleaved format length_table = bytearray(256) bytes_per_char = char_height + 1 - + for char_index in range(256): data_offset = char_index * bytes_per_char width_offset = data_offset + char_height - + if width_offset < len(font_data): length_table[char_index] = font_data[width_offset] else: length_table[char_index] = 8 # Default width - + kerning_table = {} kerning_offset = 256 * (char_height + 1) - + if len(font_data) > kerning_offset + 2: # Check if there's actually kerning data at this offset # Read potential kerning count and validate it's reasonable try: - kerning_count = struct.unpack(" 0 else 0 @@ -297,5 +315,5 @@ def _load_interleaved_font(self, font_file: str, char_height: int = 16) -> tuple except (struct.error, IndexError): # Invalid data at 0x1000, no kerning pass - + return bytes(length_table), kerning_table diff --git a/src/battle/message.s b/src/battle/message.s index 985f8df..8c73cbf 100644 --- a/src/battle/message.s +++ b/src/battle/message.s @@ -6,11 +6,14 @@ tilemap_offset = bits_left_on_tile + 2 temp = bits_left_on_tile + 4 counter = bits_left_on_tile + 6 - current_char = bits_left_on_tile + 8 - + prev_char = bits_left_on_tile + 8 + current_char = prev_char + 1 font_ptr = assets_menu_font_dat init: +.if ENABLE_KERNING_MENU { + stz.b prev_char +} jsr.w clear_buffer pha lda.b #0x08 @@ -45,7 +48,6 @@ clear_buffer_far: rtl make_pointers: -{ pha ldx.w #0x0000 @@ -62,12 +64,13 @@ make_pointers: adc 1,s tax pla - lda.w #0x0000 + ;lda.w #0x0000 sep #0x20 - +_refresh_destination_pointer: lda.l render_allocator.allocated_tile_id rep #0x20 + and.w #0x00ff asl asl asl @@ -97,6 +100,12 @@ _display_char: jsr.w make_pointers + ; vwf8_lookup_kerning there: +.if ENABLE_KERNING_MENU { + pha + jsr.w _adjust_bits_left_for_kerning + pla +} rep #0x20 lda.w #0x0008 sta.b counter @@ -226,6 +235,118 @@ coupe: jsr.w tilemap_write bra loopdec } +.if ENABLE_KERNING_MENU { +_adjust_bits_left_for_kerning: +{ + + lda.b bits_left_on_tile + cmp #8 + beq _overflow + + sta.b temp + + jsr.w get_kerning_adjustment_linear_search + bcc _adjustment + bra _end +_adjustment: + pha + lda.b temp + clc + adc 1,s + sta.b temp +.if 0 { + bpl _no_adjustment + + and.b #0x80 + sta.b bits_left_on_tile + sta.b temp + lda.l render_allocator.allocated_tile_id + dec + sta.l render_allocator.allocated_tile_id + jsr.w _refresh_destination_pointer +} +_no_adjustment: + + pla +_end: + lda.b temp + sta.b bits_left_on_tile + +_overflow: + pha + lda.b current_char + sta.b prev_char + pla + rts +} + +get_kerning_adjustment_linear_search: +{ + phx + phy + rep #0x20 + jsr.w _get_kerning_adjustment_linear_search + sep #0x20 + ply + plx + rts +} + +_get_kerning_adjustment_linear_search: +{ + phb + pea.w font_table >> 16 + plb + +kerning_table_offset = 256 * 9 + ldy.w #kerning_table_offset + lda.w font_ptr & 0xffff, y + beq not_found + dec + tax + lda.w #0x0000 + +_loop: + txa + pha + asl + clc + adc 0x01, s + clc + adc.w #kerning_table_offset + 2 + + tay + pla + + lda.w font_ptr & 0xffff, y ; Load 16-bit char pair + cmp.b prev_char + beq found_pair ; Found exact match! + + txa + dec + tax + + bne _loop + +not_found: + lda.w #0x0000 + sec + plb + plb + rts + +found_pair: + iny + iny + lda.w font_ptr, y + and.w #0x00FF + clc + plb + plb + rts +} +} + tilemap_write_no_inc: lda.l render_allocator.allocated_tile_id diff --git a/src/small_vwf/render.s b/src/small_vwf/render.s index de48c96..325e14c 100644 --- a/src/small_vwf/render.s +++ b/src/small_vwf/render.s @@ -140,7 +140,8 @@ __var_base = 0x00 bits_left_on_tile = __var_base + 0x10 temp = bits_left_on_tile + 1 counter = temp + 1 -current_char = counter + 2 +prev_char = counter + 2 +current_char = prev_char + 1 tilemap_offset = 0x1d @@ -155,6 +156,9 @@ init: ; Initialize the renderer ; clear a chunk of ram ; resets variables +.if ENABLE_KERNING_MENU { + stz.b prev_char +} initialize(bits_left_on_tile) jsr.w render_allocator.init pha @@ -244,7 +248,9 @@ char_line_loop: rep #0x20 lda.w #0x0000 sep #0x20 - +.if ENABLE_KERNING_MENU { + jsr.w _adjust_bits_left_for_kerning +} lda.b bits_left_on_tile cmp #0x08 @@ -347,6 +353,115 @@ coupe: sep #0x20 } +.if ENABLE_KERNING_MENU { +_adjust_bits_left_for_kerning: +{ + + lda.b bits_left_on_tile + cmp #8 + beq _overflow + sta.b temp + + jsr.w get_kerning_adjustment_linear_search + bcc _adjustment + bra _end +_adjustment: + pha + lda.b temp + clc + adc 1,s + sta.b temp +.if 0 { + bpl _no_adjustment + + and.b #0x80 + sta.b bits_left_on_tile + sta.b temp + lda.l render_allocator.allocated_tile_id + dec + sta.l render_allocator.allocated_tile_id + jsr.w _refresh_destination_pointer +} +_no_adjustment: + + pla +_end: + lda.b temp + sta.b bits_left_on_tile +_overflow: + pha + lda.b current_char + sta.b prev_char + pla + rts +} + +get_kerning_adjustment_linear_search: +{ + phx + phy + rep #0x20 + jsr.w _get_kerning_adjustment_linear_search + sep #0x20 + ply + plx + rts +} + +_get_kerning_adjustment_linear_search: +{ + phb + pea.w font_table >> 16 + plb + +kerning_table_offset = 256 * 9 + ldy.w #kerning_table_offset + lda.w font_ptr & 0xffff, y + beq not_found + dec + tax + lda.w #0x0000 + +_loop: + txa + pha + asl + clc + adc 0x01, s + clc + adc.w #kerning_table_offset + 2 + + tay + pla + + lda.w font_ptr & 0xffff, y ; Load 16-bit char pair + cmp.b prev_char + beq found_pair ; Found exact match! + + txa + dec + tax + + bne _loop + +not_found: + lda.w #0x0000 + sec + plb + plb + rts + +found_pair: + iny + iny + lda.w font_ptr, y + and.w #0x00FF + clc + plb + plb + rts +} +} tilemap_write_no_inc: _base_addr = 0x7e0000 lda.l render_allocator.allocated_tile_id diff --git a/utils/font_converter.py b/utils/font_converter.py index 06de40f..2812cb2 100644 --- a/utils/font_converter.py +++ b/utils/font_converter.py @@ -4,17 +4,23 @@ class FontConverter: - def __init__(self, font_file: str, has_grid: bool = False, char_width: int = 8, char_height: int = 16) -> None: + def __init__( + self, + font_file: str, + has_grid: bool = False, + char_width: int = 8, + char_height: int = 16, + ) -> None: self.font_file = font_file self.has_grid = has_grid self.char_width = char_width self.char_height = char_height self.image: Optional[np.ndarray] = None - + def _load_image(self) -> None: if self.image is None: self.image = np.array(Image.open(self.font_file)) - + def get_char(self, char: int) -> np.ndarray: self._load_image() shape = self.image.shape @@ -38,7 +44,10 @@ def get_char(self, char: int) -> np.ndarray: x_offset = column * self.char_width y_offset = line * self.char_height - return self.image[y_offset : y_offset + self.char_height, x_offset : x_offset + self.char_width] + return self.image[ + y_offset : y_offset + self.char_height, + x_offset : x_offset + self.char_width, + ] def char_as_1bbp(self, char: np.ndarray) -> bytes: binary_data = [] @@ -55,12 +64,14 @@ def get_max_width(self, char: np.ndarray) -> int: return max_width - def convert_to_1bpp(self, width_overrides: dict[int, int]) -> tuple[dict[int, int], bytes]: + def convert_to_1bpp( + self, width_overrides: dict[int, int] + ) -> tuple[dict[int, int], bytes]: self._load_image() data = b"" char_index = 0 - while char_index <= 0xff: + while char_index <= 0xFF: char = self.get_char(char_index) data += self.char_as_1bbp(char) @@ -138,32 +149,40 @@ def _get_char_bounds(self, char_data: np.ndarray) -> tuple[int, int]: rows_with_pixels = np.any(char_data > 0, axis=1) if not np.any(rows_with_pixels): return 0, self.char_height - 1 - + top_row = np.argmax(rows_with_pixels) bottom_row = len(rows_with_pixels) - 1 - np.argmax(rows_with_pixels[::-1]) return top_row, bottom_row - - def _count_touches(self, char1_data: np.ndarray, char2_data: np.ndarray, - char2_start_pos: int, overlap_top: int, overlap_bottom: int) -> tuple[int, int]: + + def _count_touches( + self, + char1_data: np.ndarray, + char2_data: np.ndarray, + char2_start_pos: int, + overlap_top: int, + overlap_bottom: int, + ) -> tuple[int, int]: """Count diagonal and orthogonal touches between two characters separately.""" char1_width = char1_data.shape[1] char2_width = char2_data.shape[1] char1_height = char1_data.shape[0] - + # Calculate total width for the combined render total_width = max(char1_width, char2_start_pos + char2_width) - + # Create a combined render and track ownership combined = np.zeros((char1_height, total_width), dtype=np.uint8) - ownership = np.zeros((char1_height, total_width), dtype=np.uint8) # 1=char1, 2=char2 - + ownership = np.zeros( + (char1_height, total_width), dtype=np.uint8 + ) # 1=char1, 2=char2 + # Place char1 first for row in range(char1_data.shape[0]): for col in range(char1_data.shape[1]): if char1_data[row, col] > 0: combined[row, col] = char1_data[row, col] ownership[row, col] = 1 - + # Place char2, only overwriting with non-zero pixels for row in range(char2_data.shape[0]): for col in range(char2_data.shape[1]): @@ -172,104 +191,142 @@ def _count_touches(self, char1_data: np.ndarray, char2_data: np.ndarray, if result_col < total_width: combined[row, result_col] = char2_data[row, col] ownership[row, result_col] = 2 - + # Count diagonal and orthogonal touches separately diagonal_pairs = set() orthogonal_pairs = set() - + for row in range(char1_height): for col in range(total_width): if combined[row, col] == 1: pixel_owner = ownership[row, col] - + # Check diagonal directions for dr, dc in [(1, 1), (1, -1), (-1, 1), (-1, -1)]: new_row, new_col = row + dr, col + dc - if (0 <= new_row < char1_height and 0 <= new_col < total_width and - combined[new_row, new_col] == 1): - + if ( + 0 <= new_row < char1_height + and 0 <= new_col < total_width + and combined[new_row, new_col] == 1 + ): neighbor_owner = ownership[new_row, new_col] - + # Only count touches between different characters - if pixel_owner != neighbor_owner and pixel_owner > 0 and neighbor_owner > 0: + if ( + pixel_owner != neighbor_owner + and pixel_owner > 0 + and neighbor_owner > 0 + ): # Create a unique key for this touch pair to avoid double counting - touch_key = tuple(sorted([(row, col), (new_row, new_col)])) + touch_key = tuple( + sorted([(row, col), (new_row, new_col)]) + ) diagonal_pairs.add(touch_key) - + # Check orthogonal directions for dr, dc in [(0, 1), (0, -1), (1, 0), (-1, 0)]: new_row, new_col = row + dr, col + dc - if (0 <= new_row < char1_height and 0 <= new_col < total_width and - combined[new_row, new_col] == 1): - + if ( + 0 <= new_row < char1_height + and 0 <= new_col < total_width + and combined[new_row, new_col] == 1 + ): neighbor_owner = ownership[new_row, new_col] - + # Only count touches between different characters - if pixel_owner != neighbor_owner and pixel_owner > 0 and neighbor_owner > 0: + if ( + pixel_owner != neighbor_owner + and pixel_owner > 0 + and neighbor_owner > 0 + ): # Create a unique key for this touch pair to avoid double counting - touch_key = tuple(sorted([(row, col), (new_row, new_col)])) + touch_key = tuple( + sorted([(row, col), (new_row, new_col)]) + ) orthogonal_pairs.add(touch_key) - + return len(diagonal_pairs), len(orthogonal_pairs) - def _check_collision(self, char1_data: np.ndarray, char2_data: np.ndarray, - char2_start_pos: int, overlap_top: int, overlap_bottom: int) -> bool: + def _check_collision( + self, + char1_data: np.ndarray, + char2_data: np.ndarray, + char2_start_pos: int, + overlap_top: int, + overlap_bottom: int, + ) -> bool: """Check for direct collisions (overlapping pixels).""" char1_width = char1_data.shape[1] char2_width = char2_data.shape[1] char1_height = char1_data.shape[0] - + # Check for direct pixel overlap for row in range(char1_height): for char2_col in range(char2_width): char2_pixel_pos = char2_start_pos + char2_col - - if (0 <= char2_pixel_pos < char1_width and - char1_data[row, char2_pixel_pos] == 1 and - char2_data[row, char2_col] == 1): + + if ( + 0 <= char2_pixel_pos < char1_width + and char1_data[row, char2_pixel_pos] == 1 + and char2_data[row, char2_col] == 1 + ): return True - + return False - def compute_kerning(self, char1_index: int, char2_index: int, default_kerning: int = 1) -> int: + def compute_kerning( + self, char1_index: int, char2_index: int, default_kerning: int = 1 + ) -> int: """Compute optimal kerning between two characters, targeting exactly 1 touch.""" self._load_image() - + char1_data = self.get_char(char1_index) char2_data = self.get_char(char2_index) - + char1_width = self.get_max_width(char1_data) trimmed_char1 = char1_data[:, :char1_width] - trimmed_char2 = char2_data[:, :self.get_max_width(char2_data)] - + trimmed_char2 = char2_data[:, : self.get_max_width(char2_data)] + char1_top, char1_bottom = self._get_char_bounds(trimmed_char1) char2_top, char2_bottom = self._get_char_bounds(trimmed_char2) - + overlap_top = max(char1_top, char2_top) overlap_bottom = min(char1_bottom, char2_bottom) - + # Try kerning values from most aggressive to most conservative best_kerning = default_kerning max_reduction_limit = max(1, default_kerning) + char1_width - + for reduction in range(1, max_reduction_limit + 1): # Calculate the actual position used in rendering (kerning + 1) kerning = default_kerning - reduction actual_spacing = kerning + 1 char2_start_pos = char1_width + actual_spacing - + # Check for direct collisions (forbidden) if overlap_top <= overlap_bottom: - if self._check_collision(trimmed_char1, trimmed_char2, char2_start_pos, overlap_top, overlap_bottom): + if self._check_collision( + trimmed_char1, + trimmed_char2, + char2_start_pos, + overlap_top, + overlap_bottom, + ): break - + # Count diagonal and orthogonal touches separately - diagonal_touches, orthogonal_touches = self._count_touches(trimmed_char1, trimmed_char2, char2_start_pos, overlap_top, overlap_bottom) - + diagonal_touches, orthogonal_touches = self._count_touches( + trimmed_char1, + trimmed_char2, + char2_start_pos, + overlap_top, + overlap_bottom, + ) + # Reject if any orthogonal touches (horizontal/vertical adjacency not allowed) if orthogonal_touches > 0: continue - + # Target exactly 1 diagonal touch as optimal if diagonal_touches == 1: return kerning @@ -277,7 +334,7 @@ def compute_kerning(self, char1_index: int, char2_index: int, default_kerning: i # 0 diagonal touches is also acceptable, save as fallback best_kerning = kerning # If diagonal_touches > 1, this kerning is too aggressive, continue to less aggressive values - + # When default_kerning is 0, try negative kerning (overlapping) if default_kerning == 0 and best_kerning == default_kerning: for overlap_pixels in range(1, char1_width): @@ -285,72 +342,93 @@ def compute_kerning(self, char1_index: int, char2_index: int, default_kerning: i kerning = -overlap_pixels actual_spacing = kerning + 1 char2_start_pos = char1_width + actual_spacing - + if overlap_top <= overlap_bottom: - if self._check_collision(trimmed_char1, trimmed_char2, char2_start_pos, overlap_top, overlap_bottom): + if self._check_collision( + trimmed_char1, + trimmed_char2, + char2_start_pos, + overlap_top, + overlap_bottom, + ): continue - - diagonal_touches, orthogonal_touches = self._count_touches(trimmed_char1, trimmed_char2, char2_start_pos, overlap_top, overlap_bottom) - + + diagonal_touches, orthogonal_touches = self._count_touches( + trimmed_char1, + trimmed_char2, + char2_start_pos, + overlap_top, + overlap_bottom, + ) + # Reject if any orthogonal touches if orthogonal_touches > 0: continue - + if diagonal_touches == 1: return kerning elif diagonal_touches == 0: best_kerning = kerning - + return best_kerning - def render_kerned_string(self, text_bytes: bytes, default_kerning: int = 1, external_kerning_table: dict = None, external_width_table: bytes = None) -> np.ndarray: + def render_kerned_string( + self, + text_bytes: bytes, + default_kerning: int = 1, + external_kerning_table: dict = None, + external_width_table: bytes = None, + ) -> np.ndarray: """ Render a string with optimal kerning between character pairs. - + Args: text_bytes: Bytes representing character indices (from table.to_bytes()) has_grid: Whether the font has grid lines char_width: Width of each character cell char_height: Height of each character cell default_kerning: Default spacing between characters - + Returns: 2D numpy array containing the rendered text with optimal kerning """ if len(text_bytes) == 0: return np.zeros((self.char_height, 0), dtype=np.uint8) - + self._load_image() - + # Get all character data and determine widths chars = [] char_widths = [] for char_index in text_bytes: char_data = self.get_char(char_index) - + if external_width_table is not None: # Use width from external table (file-based) actual_width = external_width_table[char_index] else: # Compute width from PNG (autohint) actual_width = self.get_max_width(char_data) - + chars.append(char_data[:, :actual_width]) char_widths.append(actual_width) - + if len(chars) == 1: # Single character, no kerning needed return chars[0] - + # Calculate optimal kerning between each pair and total width kerning_values = [] total_width = char_widths[0] # First character width - + for i in range(len(text_bytes) - 1): char1_index = text_bytes[i] char2_index = text_bytes[i + 1] - - if external_kerning_table and (char1_index, char2_index) in external_kerning_table: + + if ( + external_kerning_table + and (char1_index, char2_index) in external_kerning_table + ): # Use external kerning table value (already includes the +1) kerning = external_kerning_table[(char1_index, char2_index)] + 1 elif external_kerning_table is not None: @@ -358,24 +436,26 @@ def render_kerned_string(self, text_bytes: bytes, default_kerning: int = 1, exte kerning = default_kerning else: # No external kerning table - use auto-generated kerning - kerning = self.compute_kerning(char1_index, char2_index, default_kerning) + 1 - + kerning = ( + self.compute_kerning(char1_index, char2_index, default_kerning) + 1 + ) + kerning_values.append(kerning) total_width += kerning + char_widths[i + 1] - + # Create output array and place characters result = np.zeros((self.char_height, total_width), dtype=np.uint8) - + # Place first character current_pos = 0 - result[:, current_pos:current_pos + char_widths[0]] = chars[0] + result[:, current_pos : current_pos + char_widths[0]] = chars[0] current_pos += char_widths[0] - + # Place remaining characters with optimal kerning for i in range(1, len(chars)): kerning = kerning_values[i - 1] current_pos += kerning - + # Place character, only overwriting with non-zero pixels char_data = chars[i] for row in range(char_data.shape[0]): @@ -384,26 +464,26 @@ def render_kerned_string(self, text_bytes: bytes, default_kerning: int = 1, exte result_col = current_pos + col if result_col < result.shape[1]: result[row, result_col] = char_data[row, col] - + current_pos += char_widths[i] - + return result def render_string(self, text_bytes: bytes) -> np.ndarray: """ Render a string with fixed 1-pixel kerning between characters. - + Args: text_bytes: Bytes representing character indices (from table.to_bytes()) - + Returns: 2D numpy array containing the rendered text with 1-pixel spacing """ if len(text_bytes) == 0: return np.zeros((self.char_height, 0), dtype=np.uint8) - + self._load_image() - + # Get all character data and compute widths chars = [] char_widths = [] @@ -412,44 +492,53 @@ def render_string(self, text_bytes: bytes) -> np.ndarray: actual_width = self.get_max_width(char_data) chars.append(char_data[:, :actual_width]) char_widths.append(actual_width) - + if len(chars) == 1: # Single character, no kerning needed return chars[0] - + # Calculate total width with 1-pixel kerning between characters total_width = sum(char_widths) + (len(chars) - 1) # chars + gaps - + # Create output array and place characters result = np.zeros((self.char_height, total_width), dtype=np.uint8) - + # Place characters with 1-pixel spacing current_pos = 0 for i, char in enumerate(chars): # Find vertical extent of current character for proper placement char_rows_with_pixels = np.any(char > 0, axis=1) - char_top_row = np.argmax(char_rows_with_pixels) if np.any(char_rows_with_pixels) else 0 - char_bottom_row = len(char_rows_with_pixels) - 1 - np.argmax(char_rows_with_pixels[::-1]) if np.any(char_rows_with_pixels) else self.char_height-1 - + char_top_row = ( + np.argmax(char_rows_with_pixels) if np.any(char_rows_with_pixels) else 0 + ) + char_bottom_row = ( + len(char_rows_with_pixels) - 1 - np.argmax(char_rows_with_pixels[::-1]) + if np.any(char_rows_with_pixels) + else self.char_height - 1 + ) + # Place character at its correct vertical position - result[char_top_row:char_bottom_row+1, current_pos:current_pos + char_widths[i]] = char[char_top_row:char_bottom_row+1, :] + result[ + char_top_row : char_bottom_row + 1, + current_pos : current_pos + char_widths[i], + ] = char[char_top_row : char_bottom_row + 1, :] current_pos += char_widths[i] + 1 # Move to next position with 1-pixel gap - + return result def debug_kerned_string(self, text: str, table) -> None: """Debug tool to display and analyze a kerned string with detailed information.""" print(f"=== KERNING DEBUG: '{text}' ===") - + # Convert to bytes text_bytes = table.to_bytes(text) if not text_bytes: print(f"Could not convert '{text}' to bytes") return - + print(f"Text bytes: {[hex(b) for b in text_bytes]}") print() - + # Analyze each character pair pairs_info = [] for i in range(len(text_bytes) - 1): @@ -457,45 +546,53 @@ def debug_kerned_string(self, text: str, table) -> None: char2_index = text_bytes[i + 1] char1_str = table.to_text(bytes([char1_index])) char2_str = table.to_text(bytes([char2_index])) - + # Get character data char1_data = self.get_char(char1_index) char2_data = self.get_char(char2_index) char1_width = self.get_max_width(char1_data) char2_width = self.get_max_width(char2_data) - + # Compute kerning kerning = self.compute_kerning(char1_index, char2_index, default_kerning=1) actual_spacing = kerning + 1 char2_start_pos = char1_width + actual_spacing - + # Count diagonal and orthogonal touches separately diagonal_touches, orthogonal_touches = self._count_touches( - char1_data[:, :char1_width], + char1_data[:, :char1_width], char2_data[:, :char2_width], - char2_start_pos, 0, 15 + char2_start_pos, + 0, + 15, ) - + # Check for direct collisions has_collision = self._check_collision( - char1_data[:, :char1_width], + char1_data[:, :char1_width], char2_data[:, :char2_width], - char2_start_pos, 0, 15 + char2_start_pos, + 0, + 15, + ) + + pairs_info.append( + { + "pair": f"{char1_str}{char2_str}", + "chars": (char1_index, char2_index), + "widths": (char1_width, char2_width), + "kerning": kerning, + "actual_spacing": actual_spacing, + "char2_start_pos": char2_start_pos, + "diagonal_touches": diagonal_touches, + "orthogonal_touches": orthogonal_touches, + "has_collision": has_collision, + } + ) + + print( + f"Pair {i + 1}: '{char1_str}'{char2_str}' ({char1_index:02x},{char2_index:02x})" ) - - pairs_info.append({ - 'pair': f"{char1_str}{char2_str}", - 'chars': (char1_index, char2_index), - 'widths': (char1_width, char2_width), - 'kerning': kerning, - 'actual_spacing': actual_spacing, - 'char2_start_pos': char2_start_pos, - 'diagonal_touches': diagonal_touches, - 'orthogonal_touches': orthogonal_touches, - 'has_collision': has_collision - }) - - print(f"Pair {i+1}: '{char1_str}'{char2_str}' ({char1_index:02x},{char2_index:02x})") print(f" Widths: char1={char1_width}, char2={char2_width}") print(f" Kerning: {kerning} (actual spacing: {actual_spacing})") print(f" Char2 starts at position: {char2_start_pos}") @@ -503,95 +600,97 @@ def debug_kerned_string(self, text: str, table) -> None: print(f" Orthogonal touches: {orthogonal_touches}") print(f" Direct collision: {has_collision}") print() - + # Render the string kerned_render = self.render_kerned_string(text_bytes) simple_render = self.render_string(text_bytes) - + print("KERNED RENDER:") self._display_render_with_boundaries(kerned_render, pairs_info) - + print("\nSIMPLE RENDER (1px spacing):") for i, row in enumerate(simple_render): - row_str = ''.join('█' if pixel == 1 else ' ' for pixel in row) - print(f'{i:2d}: {row_str}') - - print(f"\nWidth comparison: Kerned={kerned_render.shape[1]}, Simple={simple_render.shape[1]}") + row_str = "".join("█" if pixel == 1 else " " for pixel in row) + print(f"{i:2d}: {row_str}") + + print( + f"\nWidth comparison: Kerned={kerned_render.shape[1]}, Simple={simple_render.shape[1]}" + ) print(f"Space saved: {simple_render.shape[1] - kerned_render.shape[1]} pixels") - + def _display_render_with_boundaries(self, render, pairs_info): """Display render with character boundaries marked.""" # Calculate character boundaries boundaries = [] current_pos = 0 - + # First character if pairs_info: - char1_width = pairs_info[0]['widths'][0] + char1_width = pairs_info[0]["widths"][0] boundaries.append(current_pos + char1_width - 1) # End of char1 current_pos += char1_width - + # Remaining characters for info in pairs_info: - current_pos += info['actual_spacing'] - char2_width = info['widths'][1] + current_pos += info["actual_spacing"] + char2_width = info["widths"][1] boundaries.append(current_pos + char2_width - 1) # End of char2 current_pos += char2_width - + # Create column numbers header - col_nums = ''.join(str(i % 10) for i in range(render.shape[1])) + col_nums = "".join(str(i % 10) for i in range(render.shape[1])) print(f" {col_nums}") - + # Display each row with boundary markers for i, row in enumerate(render): - row_str = ''.join('█' if pixel == 1 else ' ' for pixel in row) - + row_str = "".join("█" if pixel == 1 else " " for pixel in row) + # Add boundary markers marked_row = list(row_str) for boundary in boundaries: if boundary < len(marked_row): - if marked_row[boundary] == '█': - marked_row[boundary] = '╬' # Character pixel at boundary + if marked_row[boundary] == "█": + marked_row[boundary] = "╬" # Character pixel at boundary else: - marked_row[boundary] = '|' # Empty space at boundary - - print(f'{i:2d}: {"".join(marked_row)}') + marked_row[boundary] = "|" # Empty space at boundary + + print(f"{i:2d}: {''.join(marked_row)}") def debug_diagonal_touches(self, pair: str, table, test_kerning: int) -> None: """Debug tool to visualize diagonal touches for a character pair at a specific kerning.""" print(f"=== DIAGONAL TOUCHES DEBUG: '{pair}' at kerning {test_kerning} ===") - + # Convert to bytes chars = table.to_bytes(pair) if len(chars) != 2: print(f"Could not convert '{pair}' to character pair") return - + char1_data = self.get_char(chars[0]) char2_data = self.get_char(chars[1]) char1_width = self.get_max_width(char1_data) char2_width = self.get_max_width(char2_data) - + # Calculate positioning actual_spacing = test_kerning + 1 char2_start_pos = char1_width + actual_spacing - + print(f"char1_width={char1_width}, char2_width={char2_width}") print(f"actual_spacing={actual_spacing}, char2_start_pos={char2_start_pos}") print() - + # Create combined render and track ownership total_width = max(char1_width, char2_start_pos + char2_width) combined = np.zeros((16, total_width), dtype=np.uint8) ownership = np.zeros((16, total_width), dtype=np.uint8) # 1=char1, 2=char2 - + # Place char1 first for row in range(char1_data.shape[0]): for col in range(char1_width): if char1_data[row, col] > 0: combined[row, col] = char1_data[row, col] ownership[row, col] = 1 - + # Place char2, only non-zero pixels for row in range(char2_data.shape[0]): for col in range(char2_width): @@ -600,63 +699,83 @@ def debug_diagonal_touches(self, pair: str, table, test_kerning: int) -> None: if 0 <= result_col < total_width: combined[row, result_col] = char2_data[row, col] ownership[row, result_col] = 2 - + # Find diagonal touches and mark them touch_pairs = set() touch_pixels = set() # All pixels involved in touches - + for row in range(16): for col in range(total_width): if combined[row, col] == 1: pixel_owner = ownership[row, col] - + # Check all 4 diagonal directions for dr, dc in [(1, 1), (1, -1), (-1, 1), (-1, -1)]: new_row, new_col = row + dr, col + dc - if (0 <= new_row < 16 and 0 <= new_col < total_width and - combined[new_row, new_col] == 1): - + if ( + 0 <= new_row < 16 + and 0 <= new_col < total_width + and combined[new_row, new_col] == 1 + ): neighbor_owner = ownership[new_row, new_col] - + # Only count touches between different characters - if pixel_owner != neighbor_owner and pixel_owner > 0 and neighbor_owner > 0: + if ( + pixel_owner != neighbor_owner + and pixel_owner > 0 + and neighbor_owner > 0 + ): # Create a unique key for this touch pair - touch_key = tuple(sorted([(row, col), (new_row, new_col)])) + touch_key = tuple( + sorted([(row, col), (new_row, new_col)]) + ) if touch_key not in touch_pairs: touch_pairs.add(touch_key) touch_pixels.add((row, col)) touch_pixels.add((new_row, new_col)) direction_name = { - (1, 1): '↘', (1, -1): '↙', - (-1, 1): '↗', (-1, -1): '↖' + (1, 1): "↘", + (1, -1): "↙", + (-1, 1): "↗", + (-1, -1): "↖", }[dr, dc] - char_type1 = 'char1' if pixel_owner == 1 else 'char2' - char_type2 = 'char2' if neighbor_owner == 2 else 'char1' - print(f"Touch: {char_type1}({row},{col}) {direction_name} {char_type2}({new_row},{new_col})") - + char_type1 = ( + "char1" if pixel_owner == 1 else "char2" + ) + char_type2 = ( + "char2" if neighbor_owner == 2 else "char1" + ) + print( + f"Touch: {char_type1}({row},{col}) {direction_name} {char_type2}({new_row},{new_col})" + ) + print(f"\\nTotal diagonal touches found: {len(touch_pairs)}") print() - + # Create visualization print("Visualization (* = touch pixel, █ = regular pixel, · = empty):") - col_nums = ''.join(str(i % 10) for i in range(total_width)) + col_nums = "".join(str(i % 10) for i in range(total_width)) print(f" {col_nums}") - + for row in range(16): row_str = "" for col in range(total_width): if (row, col) in touch_pixels: - row_str += '*' + row_str += "*" elif combined[row, col] == 1: - row_str += '█' + row_str += "█" else: - row_str += '·' + row_str += "·" print(f"{row:2d}: {row_str}") - + print() - print(f"Character boundary: char1 ends at col {char1_width-1}, char2 starts at col {char2_start_pos}") + print( + f"Character boundary: char1 ends at col {char1_width - 1}, char2 starts at col {char2_start_pos}" + ) - def find_kerning_pairs(self, table, test_pairs: List[str]) -> Dict[Tuple[int, int], int]: + def find_kerning_pairs( + self, table, test_pairs: List[str] + ) -> Dict[Tuple[int, int], int]: """Find character pairs that benefit from kerning.""" kerning_pairs = {} @@ -667,18 +786,24 @@ def find_kerning_pairs(self, table, test_pairs: List[str]) -> Dict[Tuple[int, in continue try: - optimal_kerning = self.compute_kerning(chars[0], chars[1], default_kerning=1) + optimal_kerning = self.compute_kerning( + chars[0], chars[1], default_kerning=1 + ) # Skip useless entries: # - Same as default (no benefit) # - Invalid kerning values - if optimal_kerning != 1 and optimal_kerning < 0: # Different from default and valid + if ( + optimal_kerning != 1 and optimal_kerning < 0 + ): # Different from default and valid kerning_pairs[(chars[0], chars[1])] = optimal_kerning char1_str = table.to_text(bytes([chars[0]])) char2_str = table.to_text(bytes([chars[1]])) - print(f" {pair} '{chars[0]}{chars[1]}' ({chars[0]:02x},{chars[1]:02x}): kerning = {optimal_kerning}") + print( + f" {pair} '{chars[0]}{chars[1]}' ({chars[0]:02x},{chars[1]:02x}): kerning = {optimal_kerning}" + ) except Exception as e: print(f" Warning: Failed to compute kerning for '{pair}': {e}") continue print(f"Found {len(kerning_pairs)} pairs that benefit from kerning") - return kerning_pairs \ No newline at end of file + return kerning_pairs From 539968e47353d29e31db70b60613d4a0125c0c63 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Wed, 17 Sep 2025 23:21:55 +0200 Subject: [PATCH 38/63] Display action indicators when user input is expected. --- ff4.s | 2 ++ format_bank_xml.py | 31 ++--------------- src/vwf.s | 86 ++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 80 insertions(+), 39 deletions(-) diff --git a/ff4.s b/ff4.s index fed90fd..499e84a 100644 --- a/ff4.s +++ b/ff4.s @@ -9,6 +9,8 @@ ENABLE_VWF_ATTACK_NAMES := 1 BATTLE_ENABLED := 1 MAGIC_ENABLED := 1 ENABLE_KERNING := 1 +ENABLE_KERNING_MENU := 0 +ENABLE_BUTTON_DISPLAY := 1 ; Debug flags TRIGGER_ENDING_CUTSCENE := 0 diff --git a/format_bank_xml.py b/format_bank_xml.py index 7257e67..2fc6aae 100755 --- a/format_bank_xml.py +++ b/format_bank_xml.py @@ -13,6 +13,7 @@ from metrics import TextMetrics WINDOW_WIDTH = 208 +FOURTH_LINE_WIDTH = 200 # Fourth line is 8 pixels shorter class Token: @@ -249,7 +250,6 @@ def _format_dialog(self, tokens): current_character = None accumulated_sentences = [] accumulated_text = "" - accumulated_lines = 0 i = 0 while i < len(tokens): @@ -265,7 +265,6 @@ def _format_dialog(self, tokens): ) accumulated_sentences = [] accumulated_text = "" - accumulated_lines = 0 current_character = None i += 1 @@ -309,15 +308,10 @@ def _format_dialog(self, tokens): wrapped_sentence ] combined_wrapped_text = "\n".join(all_wrapped_sentences) - lines_needed = self._measure_lines_wrapped( - combined_wrapped_text - ) - - if lines_needed <= 4: + if self._fits_in_dialog_window(combined_wrapped_text): # Fits in current dialog box accumulated_sentences.append(wrapped_sentence) accumulated_text = combined_wrapped_text - accumulated_lines = lines_needed else: # Would exceed limit - flush accumulated with [new] at end, then start new if accumulated_sentences: @@ -332,16 +326,10 @@ def _format_dialog(self, tokens): # Start new accumulation with this wrapped sentence accumulated_sentences = [wrapped_sentence] accumulated_text = wrapped_sentence - accumulated_lines = self._measure_lines_wrapped( - wrapped_sentence - ) else: # First sentence for this character accumulated_sentences.append(wrapped_sentence) accumulated_text = wrapped_sentence - accumulated_lines = self._measure_lines_wrapped( - wrapped_sentence - ) else: # Narrative sentence - use current font context sentence = token.value @@ -360,14 +348,9 @@ def _format_dialog(self, tokens): wrapped_sentence ] combined_wrapped_text = "\n".join(all_wrapped_sentences) - lines_needed = self._measure_lines_wrapped( - combined_wrapped_text - ) - - if lines_needed <= 4: + if self._fits_in_dialog_window(combined_wrapped_text): accumulated_sentences.append(wrapped_sentence) accumulated_text = combined_wrapped_text - accumulated_lines = lines_needed else: # Would exceed limit - flush accumulated with [new] at end, then start new if accumulated_sentences: @@ -382,16 +365,10 @@ def _format_dialog(self, tokens): # Start new accumulation with this wrapped sentence accumulated_sentences = [wrapped_sentence] accumulated_text = wrapped_sentence - accumulated_lines = self._measure_lines_wrapped( - wrapped_sentence - ) else: # First narrative sentence accumulated_sentences.append(wrapped_sentence) accumulated_text = wrapped_sentence - accumulated_lines = self._measure_lines_wrapped( - wrapped_sentence - ) i += 1 @@ -445,7 +422,6 @@ def _format_dialog(self, tokens): current_character = None accumulated_sentences = [] accumulated_text = "" - accumulated_lines = 0 i += 1 elif token.type == "CLOSE_WINDOW": @@ -469,7 +445,6 @@ def _format_dialog(self, tokens): current_character = None accumulated_sentences = [] accumulated_text = "" - accumulated_lines = 0 i += 1 else: diff --git a/src/vwf.s b/src/vwf.s index 5f6d71f..8111492 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -1,12 +1,67 @@ .include 'src/definitions.s' .include 'src/kerning.s' +.if ENABLE_BUTTON_DISPLAY { +get_action_button_id: + lda.w 0x16A9 + bne custom_mapping + lda.b #0x00 + xba + lda.b #0x00 + rts +custom_mapping: + lda.b #0x00 + xba + lda 0x1A37 ; action button id location + rts +} update_palette: ldx.w 0x16AA stx.w 0x0CDD stx.w 0x0CE5 +.if ENABLE_BUTTON_DISPLAY { + stx.w 0x0CED + ldx.w #0x0000 + stx.w 0x0CEF + + jsr.w get_action_button_id + + cmp #0x04 + bcc _proceed + ldx.w #5 +_proceed: + asl + tax + bra select_color + ldx.w #0x0000 +select_color: + jmp.w (color_table, x) + + color_table: + .dw A_button + .dw B_button + .dw X_button + .dw Y_button + .dw white_color + A_button: + ldx.w #0x10DD + bra _store_color + B_button: + ldx.w #0x1BFF + bra _store_color + X_button: + ldx.w #0x5CC4 + bra _store_color + Y_button: + ldx.w #0x0ACA + bra _store_color + white_color: + ldx.w #0x7fff + _store_color: + stx.w 0x0CF1 +} rtl window_palette: @@ -137,9 +192,11 @@ parse: BNE _nxt1 lda #0x01 sta 0xDE - lda #0x08 - jsr.w draw_arrow - +.if ENABLE_BUTTON_DISPLAY { + lda #0xa4 + sta.b CURRENT_C + jsr.w draw_ending_symbol +} JMP.W fin _nxt1: @@ -351,9 +408,12 @@ suit2: suit3: ; that's where new ends up - +.if ENABLE_BUTTON_DISPLAY { + lda #0xa2 ; down arrow + sta.b CURRENT_C + jsr.w draw_ending_symbol +} LDA.B #0x08 - jsr.w draw_arrow sta.b BITSLEFT STZ.B CURRENT_C @@ -365,8 +425,9 @@ end: JMP.W main -draw_arrow: +draw_ending_symbol: pha + lda #0x08 STA.B BITSLEFT lda #0x4E + 24 @@ -376,8 +437,7 @@ draw_arrow: sta.b TILEPOS - lda #0xa2 ; down arrow - sta.b CURRENT_C + ldx.w #0xa2 * 17 ldy.w #0xcc0 @@ -597,7 +657,6 @@ TEXT_SHADOW :=1 eor.l WRAM + 2 + 0x20, x sta.l WRAM + 2 + 0x20, x pla - } TXY PLX @@ -889,14 +948,19 @@ window: winmap: .if TEXT_SHADOW { +.if ENABLE_BUTTON_DISPLAY { +last_character_palette := 2 +} else { +last_character_palette := 1 +} .dw 0x2000,0x2000,0x2019,0x2500,0x2502,0x2504,0x2506,0x2508,0x250A,0x250C,0x250E,0x2510,0x2512,0x2514,0x2516,0x2518,0x251A,0x251C,0x251E,0x2520,0x2522,0x2524,0x2526,0x2528,0x252A,0x252C,0x252E,0x2530,0x2532,0x201A,0x2000,0x2000 .dw 0x2000,0x2000,0x2019,0x2501,0x2503,0x2505,0x2507,0x2509,0x250B,0x250D,0x250F,0x2511,0x2513,0x2515,0x2517,0x2519,0x251B,0x251D,0x251F,0x2521,0x2523,0x2525,0x2527,0x2529,0x252B,0x252D,0x252F,0x2531,0x2533,0x201A,0x2000,0x2000 .dw 0x2000,0x2000,0x2019,0x2534,0x2536,0x2538,0x253A,0x253C,0x253E,0x2540,0x2542,0x2544,0x2546,0x2548,0x254A,0x254C,0x254E,0x2550,0x2552,0x2554,0x2556,0x2558,0x255A,0x255C,0x255E,0x2560,0x2562,0x2564,0x2566,0x201A,0x2000,0x2000 .dw 0x2000,0x2000,0x2019,0x2535,0x2537,0x2539,0x253B,0x253D,0x253F,0x2541,0x2543,0x2545,0x2547,0x2549,0x254B,0x254D,0x254F,0x2551,0x2553,0x2555,0x2557,0x2559,0x255B,0x255D,0x255F,0x2561,0x2563,0x2565,0x2567,0x201A,0x2000,0x2000 .dw 0x2000,0x2000,0x2019,0x2568,0x256A,0x256C,0x256E,0x2570,0x2572,0x2574,0x2576,0x2578,0x257A,0x257C,0x257E,0x2580,0x2582,0x2584,0x2586,0x2588,0x258A,0x258C,0x258E,0x2590,0x2592,0x2594,0x2596,0x2598,0x259A,0x201A,0x2000,0x2000 .dw 0x2000,0x2000,0x2019,0x2569,0x256B,0x256D,0x256F,0x2571,0x2573,0x2575,0x2577,0x2579,0x257B,0x257D,0x257F,0x2581,0x2583,0x2585,0x2587,0x2589,0x258B,0x258D,0x258F,0x2591,0x2593,0x2595,0x2597,0x2599,0x259B,0x201A,0x2000,0x2000 -.dw 0x2000,0x2000,0x2019,0x259C,0x259E,0x25A0,0x25A2,0x25A4,0x25A6,0x25A8,0x25AA,0x25AC,0x25AE,0x25B0,0x25B2,0x25B4,0x25B6,0x25B8,0x25BA,0x25BC,0x25BE,0x25C0,0x25C2,0x25C4,0x25C6,0x25C8,0x25CA,0x25CC,0x25CE,0x201A,0x2000,0x2000 -.dw 0x2000,0x2000,0x2019,0x259D,0x259F,0x25A1,0x25A3,0x25A5,0x25A7,0x25A9,0x25AB,0x25AD,0x25AF,0x25B1,0x25B3,0x25B5,0x25B7,0x25B9,0x25BB,0x25BD,0x25BF,0x25C1,0x25C3,0x25C5,0x25C7,0x25C9,0x25CB,0x25CD,0x25CF,0x201A,0x2000,0x2000 +.dw 0x2000,0x2000,0x2019,0x259C,0x259E,0x25A0,0x25A2,0x25A4,0x25A6,0x25A8,0x25AA,0x25AC,0x25AE,0x25B0,0x25B2,0x25B4,0x25B6,0x25B8,0x25BA,0x25BC,0x25BE,0x25C0,0x25C2,0x25C4,0x25C6,0x25C8,0x25CA,0x25CC,(0x21CE + (last_character_palette << 10)),0x201A,0x2000,0x2000 +.dw 0x2000,0x2000,0x2019,0x259D,0x259F,0x25A1,0x25A3,0x25A5,0x25A7,0x25A9,0x25AB,0x25AD,0x25AF,0x25B1,0x25B3,0x25B5,0x25B7,0x25B9,0x25BB,0x25BD,0x25BF,0x25C1,0x25C3,0x25C5,0x25C7,0x25C9,0x25CB,0x25CD,(0x21CF + (last_character_palette << 10)),0x201A,0x2000,0x2000 } else { .dw 0x2000,0x2000,0x2019,0x2100,0x2102,0x2104,0x2106,0x2108,0x210A,0x210C,0x210E,0x2110,0x2112,0x2114,0x2116,0x2118,0x211A,0x211C,0x211E,0x2120,0x2122,0x2124,0x2126,0x2128,0x212A,0x212C,0x212E,0x2130,0x2132,0x201A,0x2000,0x2000 .dw 0x2000,0x2000,0x2019,0x2101,0x2103,0x2105,0x2107,0x2109,0x210B,0x210D,0x210F,0x2111,0x2113,0x2115,0x2117,0x2119,0x211B,0x211D,0x211F,0x2121,0x2123,0x2125,0x2127,0x2129,0x212B,0x212D,0x212F,0x2131,0x2133,0x201A,0x2000,0x2000 From affde71ca1c95d286a68c39c655cf5ef8b2a5e52 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Wed, 17 Sep 2025 23:24:20 +0200 Subject: [PATCH 39/63] Removes previous attempt at dialog formatting --- utils/vwf_text_formater.py | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 utils/vwf_text_formater.py diff --git a/utils/vwf_text_formater.py b/utils/vwf_text_formater.py deleted file mode 100644 index ca1045f..0000000 --- a/utils/vwf_text_formater.py +++ /dev/null @@ -1,23 +0,0 @@ -# coding: utf-8 -import re - -text = """Cecil: Here we gow -again. -Cain: I love -eating tea. - -Rosa: Ww-hat !? - - -Cecil: Yeah...[end]""" - - -def vwf_text_format(input): - output = re.sub(r'\s+', ' ', input) - output = re.sub(r'((?:\.+)|(?:!\?)|(?:\?!)|(?:!)|(?:\?))\s*', '\g<1>[new]\n', output) - output = re.sub(r'\[new\]\n\[end\]', '[end]', output) - return output - - -if __name__ == '__main__': - print(vwf_text_format(text)) \ No newline at end of file From 25afba39d0a409af2413b33e93ae8fd846087201 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Wed, 17 Sep 2025 23:25:01 +0200 Subject: [PATCH 40/63] Add more dialog action indicator characters. --- fonts/vwf.png | Bin 610 -> 629 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fonts/vwf.png b/fonts/vwf.png index 0ce0208f1824d00da84c39d2b2381fda4c738287..40911e7e7edeac999d63ca486d021a5596e911f4 100644 GIT binary patch delta 586 zcmV-Q0=50(1oZ@vHh(HfL_t(|+U(MSh8#f<#_>WhfC2-r|9{@#rodpZo1ia4eHq%{ zWyot`YfqXCUP|k@j$Io1`=L(+s>rKXh{3h53iR4%@CF?Aq06w{WT;nC9ii06{=_n@ z9%`0OGoasA8LruB1`n?W?5`Q4Vx%?J8l_`DaB5>{iEPuXSM(g!1PDM=F8@IE1j4D? zL$>(55BqK(B7dpVBV>nfM?LBRj*?S_*vn802S+HdJ42meG}smx!HzoDo*~2*r+PXM zp&TkI1){?R{I%E#i4#Ze3?fa_NF%!){g&#zY7A5AT!uzjt*X)j&4Vk`O0c|t1j=x8a|WED@1G1!R^P9? zyml7PVM9YNrMGiX$R)fpc>NTVgl=b`KQ4wsnp?W)lYF>@(7d?>QQPvrx3sjh^mDWa Y0OAusi!J9{CjbBd07*qoM6N<$g0fK-aR2}S delta 567 zcmV-70?7UK1mXmcHh&jML_t(|+U?Q-ha52&#_<coS2) z8NiC~-wLQzz-HJ_uu%*EG92*qxj@7aBYuKU6S(@t!%*PyQ-6m03PW8|A=FJ>-84KD zC}WYwUNmKRFKy#C_Gt)@Lr4TNuzFf`$Sv1N)=z3+#6VnvIwK6bb?(|HJ$ zV5sJaPFMJ!u@w?4mh227ZQDvKhXehQ>Z5A(Q)+F2R#|h#XodDEuT8nWzk)?hwZbT_ z6_mzN#|)h~mDuOH&UYC~mKK3tF{$Icc+aUx-cx%ipnp5n2G*z&afO31Ex@W?ClGG- zF^X5HOdw`&RJ4cM39Ly*tr{p%1t=F_j25uuC3%kC`kn78T$AO|)c^RW%V*)2m%rgn zy?oH(2~R8xCEuY!5xGaeOZEEg3#L9+S=MH^b7SlJCTRz7gYcN002ovPDHLk FV1mAc3+Mm< From cdad74fcf2215196b73a50f7495620e943e4852e Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Thu, 18 Sep 2025 13:39:38 +0200 Subject: [PATCH 41/63] Makes sure we don't use heavily used direct page memory. Only action button should be allowed on waitpad. --- src/minimal_vwf_patches.s | 7 ++++++- src/vwf.s | 17 +++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/minimal_vwf_patches.s b/src/minimal_vwf_patches.s index 195df25..2401162 100644 --- a/src/minimal_vwf_patches.s +++ b/src/minimal_vwf_patches.s @@ -146,4 +146,9 @@ end_of_animation: ; update the text palette used in the intro *=0x8ff04 - .dw 0x0463 \ No newline at end of file + .dw 0x0463 + + +*=0x00B361 + jsr.l wait_for_action_button + nop \ No newline at end of file diff --git a/src/vwf.s b/src/vwf.s index 8111492..f3f75b6 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -1,6 +1,10 @@ .include 'src/definitions.s' .include 'src/kerning.s' +wait_for_action_button: + jsr.w waitpad + rtl + .if ENABLE_BUTTON_DISPLAY { get_action_button_id: lda.w 0x16A9 @@ -134,7 +138,7 @@ vwfstart: STA.W 0x420D ; $04-$4F - var_base = 0x0 + var_base = 0x23 CNTR = var_base CURRENT_C = var_base + 2 BITSLEFT = var_base + 4 @@ -823,18 +827,19 @@ transparent_bg_loop: } wait_key_up: - lda 0x02 + lda.l 0x000602 bne wait_key_up - lda 0x03 + lda.l 0x000603 bne wait_key_up rts wait_key_down: { - lda 0x02 + ACTION_BUTTON := 0x80 + lda.l 0x000602 + bit #ACTION_BUTTON ; Action button bne exit - lda 0x03 - beq wait_key_down + bra wait_key_down exit: rts } From f383bfd82d7304843a98ce251bb747ad2611a1ca Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Thu, 18 Sep 2025 14:06:15 +0200 Subject: [PATCH 42/63] Make display_char_name not use direct page memory. Centralize direct page variable definitions in vwf.s. --- src/dialog.s | 4 ---- src/vwf.s | 22 +++++++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/dialog.s b/src/dialog.s index 38db877..01af1f3 100644 --- a/src/dialog.s +++ b/src/dialog.s @@ -1,8 +1,4 @@ -dialog_ptr=0x20 - - - PointeurBank1de1: REP #0x20 LDA.L assets_bank1_1_ptr,X diff --git a/src/vwf.s b/src/vwf.s index f3f75b6..08629b8 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -146,6 +146,8 @@ vwfstart: nchars = var_base + 9 oldtilepos = var_base + 11 TILEPOS = var_base + 13 + dialog_ptr = 0x20 + no_wait_for_action = 0xcb lda #0 @@ -333,27 +335,29 @@ _loop_B5D2: ;**************** display_character_name: { + JSR.W ChargeLettreInc + xba + lda #0x00 + xba + ASL - STA.B 0x30 + pha ASL CLC - ADC 0x30 - STA.B 0x30 - STZ.B 0x31 - LDX.B 0x30 + ADC 1, s + tax + pla LDY.W #0x0000 - next: - LDX.B 0x30 lda #0x00 xba LDA 0x1500,X STA.B CURRENT_C CMP #0xFF BEQ exit - INX + PHX PHY JSR.W makeptr @@ -363,7 +367,7 @@ next: PLX suite: - INC.B 0x30 + inx INY CPY.W #0x0006 From fbca136c2634d65e5f97a210668310183462817c Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Thu, 18 Sep 2025 14:11:47 +0200 Subject: [PATCH 43/63] Always use the button icon colored arrows are wierd. --- src/vwf.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vwf.s b/src/vwf.s index 08629b8..0ea692c 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -417,7 +417,7 @@ suit3: ; that's where new ends up .if ENABLE_BUTTON_DISPLAY { - lda #0xa2 ; down arrow + lda #0xa4 ;always use the button sta.b CURRENT_C jsr.w draw_ending_symbol } From acdfa1fa8e2f746a68dd13e175fda605db201df6 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Thu, 18 Sep 2025 14:13:00 +0200 Subject: [PATCH 44/63] Updates smallvwf though unused (and can probably replaced by metrics). --- utils/smallvwf.py | 145 ++++++++++++++++++++++++---------------------- 1 file changed, 77 insertions(+), 68 deletions(-) diff --git a/utils/smallvwf.py b/utils/smallvwf.py index 36c62b0..05014e5 100644 --- a/utils/smallvwf.py +++ b/utils/smallvwf.py @@ -12,11 +12,11 @@ def text_to_char(text): data = [] for char in text: - if 'A' <= char <= 'Z': - data.append(ord(char) - ord('A') + 0x42) - elif 'a' <= char <= 'z': - data.append(ord(char) - ord('a') + 0x42 + ord('Z') - ord('A') + 1) - elif char == ' ': + if "A" <= char <= "Z": + data.append(ord(char) - ord("A") + 0x42) + elif "a" <= char <= "z": + data.append(ord(char) - ord("a") + 0x42 + ord("Z") - ord("A") + 1) + elif char == " ": data.append(0xFF) return data @@ -35,7 +35,7 @@ def build_text_image(font_file, text_data): width = 2 else: width = get_max_width(current_char) - culled_char = current_char[0:8, 0:width + 1] + culled_char = current_char[0:8, 0 : width + 1] # print(culled_char) if buffer is not None: buffer = np.concatenate((buffer, culled_char), 1) @@ -48,37 +48,37 @@ def build_text_image(font_file, text_data): classes = [ - 'Chevalier noir ', - 'Chevalier dragon ', - 'Invokeur ', - 'Sage ', - 'Menestrel ', - 'Sorcier Blanc ', - 'Moine ', - 'Sorcier Noir ', - 'Sorcier Blanc ', - 'Paladin ', - 'Ingenieur ', - 'Invoker ', - 'Ninja ', - 'Selenite ' + "Chevalier noir ", + "Chevalier dragon ", + "Invokeur ", + "Sage ", + "Menestrel ", + "Sorcier Blanc ", + "Moine ", + "Sorcier Noir ", + "Sorcier Blanc ", + "Paladin ", + "Ingenieur ", + "Invoker ", + "Ninja ", + "Selenite ", ] character_name = [ - 'Cecil ', - 'Cain ', - 'Rydia ', - 'Tella ', - 'Gilbert', - 'Rosa ', - 'Yang ', - 'Palom ', - 'Porom ', - 'Cid ', - 'Edge ', - 'FuSoYa', - 'Golbez', - 'Anna ' + "Cecil ", + "Cain ", + "Rydia ", + "Tella ", + "Gilbert", + "Rosa ", + "Yang ", + "Palom ", + "Porom ", + "Cid ", + "Edge ", + "FuSoYa", + "Golbez", + "Anna ", ] menu_items = [ @@ -91,20 +91,20 @@ def build_text_image(font_file, text_data): # 'Options', # 'Sauver', # 'Petit Meteore', - 'Chevalier noir', - 'Chevalier dragon', - 'Invokeur', - 'Sage', - 'Menestrel', - 'Sorcier Blanc', - 'Moine', - 'Sorcier Noir', - 'Sorcier Blanc', - 'Paladin', - 'Ingenieur', - 'Invoker', - 'Ninja', - 'Selenite' + "Chevalier noir", + "Chevalier dragon", + "Invokeur", + "Sage", + "Menestrel", + "Sorcier Blanc", + "Moine", + "Sorcier Noir", + "Sorcier Blanc", + "Paladin", + "Ingenieur", + "Invoker", + "Ninja", + "Selenite", ] @@ -120,6 +120,7 @@ def build_text_image(font_file, text_data): # 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)) @@ -137,7 +138,7 @@ def get_char(self, char: int) -> np.ndarray: else: width = get_max_width(current_char) - return current_char[0:8, 0:width + 1] + return current_char[0:8, 0 : width + 1] def render_string(self, string: str) -> np.ndarray | None: buffer: np.ndarray | None = None @@ -168,46 +169,54 @@ def serialize(self) -> bytearray: 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)) + 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]) - + 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 - with open('assets/%s.bin' % prefix, 'wb') as output: - with open('assets/%s.len' % prefix, 'wb') as length_table: - with open('text/%s.tbl' % prefix, 'wt', encoding='utf-8') as table: + with open("assets/%s.bin" % prefix, "wb") as output: + with open("assets/%s.len" % prefix, "wb") as length_table: + with open("text/%s.tbl" % prefix, "wt", encoding="utf-8") as table: if max_tile_length: - line_length = (max_tile_length * 2 * 8) + line_length = max_tile_length * 2 * 8 for string in string_list: if max_tile_length: output.seek(k * line_length) - data = build_text_image('fonts/8x8vwf2p.png', string.strip()) + data = build_text_image("fonts/8x8vwf.png", string.strip()) data_2bpp = write_as_2bpp(data) output.write(data_2bpp) - length_table.write(struct.pack(' Date: Thu, 18 Sep 2025 14:14:13 +0200 Subject: [PATCH 45/63] removes precomputation of small text it is unused. --- build.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build.py b/build.py index c717444..9b5f745 100755 --- a/build.py +++ b/build.py @@ -536,11 +536,6 @@ def build_assets(assets): k += 2 translated_gfx.write_bytes(output_buffer) - small_text = ["Niveau", "Gils"] - - generate_8x8_vwf_asset(small_text, "vwf_precomp", 0x90) - menu_vwf_table = Table("text/vwf_precomp.tbl") - with open("assets/dakuten.bin", "wb") as fd: fd.write(generate_dakutens(menu_table)) From 2db74221b2815e2bb03e4d39ca208e6ef5c04dad Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Thu, 18 Sep 2025 14:15:11 +0200 Subject: [PATCH 46/63] Fixes missing opening brace in messages.s. --- src/battle/message.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle/message.s b/src/battle/message.s index 8c73cbf..80c5330 100644 --- a/src/battle/message.s +++ b/src/battle/message.s @@ -48,6 +48,7 @@ clear_buffer_far: rtl make_pointers: +{ pha ldx.w #0x0000 @@ -235,6 +236,7 @@ coupe: jsr.w tilemap_write bra loopdec } + .if ENABLE_KERNING_MENU { _adjust_bits_left_for_kerning: { From b7d421f731baa282e71e14a93b7677acb951628c Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Thu, 18 Sep 2025 14:18:46 +0200 Subject: [PATCH 47/63] Adds a build date with a version in debug mode. --- src/ingame/free_space.s | 5 ++++- src/menus/start_screen_text.s | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ingame/free_space.s b/src/ingame/free_space.s index f743c6e..51bb2f7 100644 --- a/src/ingame/free_space.s +++ b/src/ingame/free_space.s @@ -41,13 +41,15 @@ draw_vwf_message_pos: jsr.l items_description.draw_trampoline_pos rts +.if 0 { transform_window_trampoline: jmp.l transform_window_far +} copy_text_with_dakuten: jsr.l copy_text_with_dakuten_far rts - +.if DEBUG { display_build_number: { jsr.w 0x8301 ; draw text at position. @@ -58,6 +60,7 @@ display_build_number: jsr.w 0x8798 ; copy text at position. rts } +} { END_OF_FREE_SPACE: .if END_OF_FREE_SPACE > 0x01ffff { diff --git a/src/menus/start_screen_text.s b/src/menus/start_screen_text.s index 69b9ab0..4a63c15 100644 --- a/src/menus/start_screen_text.s +++ b/src/menus/start_screen_text.s @@ -6,6 +6,13 @@ new_game: .text 'Nouvelle partie' .db 0 +.if DEBUG { +build_number: + VERSION := 'v1.0.0a0' + .text '${BUILD_DATE} ${VERSION}' + .db 0 +} + time_load_save: .dw 0x046E + 2 .text 'Temps' From 482b57404ef5b1e520c057f86d0f579da7415642 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 19 Sep 2025 21:02:20 +0200 Subject: [PATCH 48/63] Updated colors draw shadow in a darker shade of the main color, adds select button icon. --- fonts/vwf.png | Bin 629 -> 637 bytes src/vwf.s | 111 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 72 insertions(+), 39 deletions(-) diff --git a/fonts/vwf.png b/fonts/vwf.png index 40911e7e7edeac999d63ca486d021a5596e911f4..f48bc08b85d02410086eced843501801965ef302 100644 GIT binary patch delta 594 zcmV-Y0Hz{+KyVlg4zPbhKrLW^ zF3$N`i-)5T#TE#PIz|43peg|R7vxVEz@W4Q|^(sTP5OaW17rG-$ zzj&xvTFroNZ8F@j)eH_!6R^8s42pr4SZa`#UC*%zz9Aw*7rmgTs3JfB8ngKaqBHQv zb_ZGG^Um+uoqrFcRu7OZz8&))Y=TSvZjpD0`-H`5>sva2o@>T z0)x0(kQ)Xa5;WpeLYrzD-z3Ocx(M_Sld{f>_Z+L}J%82547yUSV2vsf7uXt81FY(G z1mS8Of_R0>2x8VoMO&yH!J25)s(}&}fN}=LU;#^BqUYePU-_oMV{&;kWhfC2-r|9{@#rodpZo1ia4eHq%{ zWyot`YfqXCUP|k@j$Io1`=L(+s>rKXh{3h53iR4%@CF?Aq06w{WT;nC9ii06{=_n@ z9%`0OGoasA8LruB1`n?W?5`Q4Vx%?J8l_`DaB5>{iEPuXSM(g!1PDM=F8@IE1j4D? zL$>(55BqK(B7dpVBV>nfM?LBRj*?S_*vn802S+HdJ42meG}smx!HzoDo*~2*r+PXM zp&TkI1){?R{I%E#i4#Ze3?fa_NF%!){g&#zY7A5AT!uzjt*X)j&4Vk`O0c|t1j=x8a|WED@1G1!R^P9? zyml7PVM9YNrMGiX$R)fpc>NTVgl=b`KQ4wsnp?W)lYF>@(7d?>QQPvrx3sjh^mDWa Y0OAusi!J9{CjbBd07*qoM6N<$g76;}i~s-t diff --git a/src/vwf.s b/src/vwf.s index 0ea692c..f51be0e 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -7,7 +7,7 @@ wait_for_action_button: .if ENABLE_BUTTON_DISPLAY { get_action_button_id: - lda.w 0x16A9 + lda.l 0x0016A9 bne custom_mapping lda.b #0x00 xba @@ -16,10 +16,46 @@ get_action_button_id: custom_mapping: lda.b #0x00 xba - lda 0x1A37 ; action button id location + lda.l 0x001A37 ; action button id location rts } +.macro make_color(r, g, b) { + red := (r >> 3) & 0b11111 + blue := (b >> 3) & 0xb11111 + green := (g >> 3) & 0xb11111 + + .dw (blue << 10) + (green << 5) + red +} + +.macro hex_color(color) { + make_color(color & 0xff, (color >> 8) & 0xff, (color >> 16)) +} + + +button_colors: +; 0 +; A Button + make_color(0xeb, 0x1a, 0x1d) + make_color(120, 10, 12) +; 1 +; B Button + make_color(0xfe, 0xce, 0x15) + make_color(136, 108, 0) +; 2 +; X Button + make_color(0x07, 0x49, 0xb4) + make_color(0, 53, 144) +; 3 +; Y Button + make_color(0x00, 0x8d, 0x45) + make_color(0, 70, 34) +; 4 +; Select Buttons + .dw 0b0011110111101111 + .dw 0b0001110011100111 + + update_palette: ldx.w 0x16AA @@ -27,44 +63,29 @@ update_palette: stx.w 0x0CE5 .if ENABLE_BUTTON_DISPLAY { stx.w 0x0CED + ; black for the shadow but it could be a darker version of the color ldx.w #0x0000 stx.w 0x0CEF - +pha jsr.w get_action_button_id cmp #0x04 bcc _proceed ldx.w #5 _proceed: + asl asl tax - bra select_color - ldx.w #0x0000 -select_color: - jmp.w (color_table, x) - - color_table: - .dw A_button - .dw B_button - .dw X_button - .dw Y_button - .dw white_color - A_button: - ldx.w #0x10DD - bra _store_color - B_button: - ldx.w #0x1BFF - bra _store_color - X_button: - ldx.w #0x5CC4 - bra _store_color - Y_button: - ldx.w #0x0ACA - bra _store_color - white_color: - ldx.w #0x7fff - _store_color: - stx.w 0x0CF1 + + rep #0x20 + lda.l button_colors, x ; color + sta.w 0x0CF1 + lda.l button_colors + 2, x ; shadow color + sta.w 0x0CEF + sep #0x20 + lda #0x00 + xba +pla } rtl @@ -120,6 +141,7 @@ vwfinit: 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) + jsr.w wait_for_vblank ; Sets the BG3 vram pointer to 0x6000 lda 0x210C @@ -143,9 +165,8 @@ vwfstart: CURRENT_C = var_base + 2 BITSLEFT = var_base + 4 font_addr = var_base + 6 ; 7 8 - nchars = var_base + 9 - oldtilepos = var_base + 11 - TILEPOS = var_base + 13 + oldtilepos = var_base + 9 + TILEPOS = var_base + 11 dialog_ptr = 0x20 no_wait_for_action = 0xcb @@ -199,9 +220,7 @@ parse: lda #0x01 sta 0xDE .if ENABLE_BUTTON_DISPLAY { - lda #0xa4 - sta.b CURRENT_C - jsr.w draw_ending_symbol + jsr.w draw_button } JMP.W fin @@ -417,9 +436,7 @@ suit3: ; that's where new ends up .if ENABLE_BUTTON_DISPLAY { - lda #0xa4 ;always use the button - sta.b CURRENT_C - jsr.w draw_ending_symbol + jsr.w draw_button } LDA.B #0x08 sta.b BITSLEFT @@ -433,6 +450,22 @@ end: JMP.W main +draw_button: +{ + jsr.w get_action_button_id + cmp #4 ; select + bne _normal_button + lda #0xa5 + bra _store +_normal_button: + lda #0xa4 +_store: + sta.b CURRENT_C + jsr.w draw_ending_symbol + + rts +} + draw_ending_symbol: pha From a15a31fabd95c68f1b5c82ab1fba420d8fc4a4fc Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 19 Sep 2025 21:04:57 +0200 Subject: [PATCH 49/63] Prevent vwf8 kerning to turn the text into garbage. The kerning is prevented because the previous letter cleared the tile. The proper fix would be to go back 1 tile compute the buffer pointer again and render the second char. --- src/battle/message.s | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/battle/message.s b/src/battle/message.s index 80c5330..fe8fdde 100644 --- a/src/battle/message.s +++ b/src/battle/message.s @@ -255,6 +255,13 @@ _adjustment: lda.b temp clc adc 1,s + cmp #0x8 + bcs _no_overflow + pla + lda #0x08 + pha + bra _no_adjustment +_no_overflow: sta.b temp .if 0 { bpl _no_adjustment From dba3fa4650303e6c2306d56302db656bf6e67cbc Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 19 Sep 2025 21:05:40 +0200 Subject: [PATCH 50/63] Updates the menu font f. --- fonts/8x8vwf.png | Bin 408 -> 408 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/fonts/8x8vwf.png b/fonts/8x8vwf.png index af982811a6f07eea53a06d2a02c48083b631866b..784d9f392a2b274fbc1d803846875aa0ac048ee8 100644 GIT binary patch delta 60 zcmbQiJcD_{W7+Eypg9xMaTg&6kM@lNeh>E_Z*o{l}g+ Qivb8cUHx3vIVCg!0I_!#VgLXD delta 60 zcmbQiJcD_{W7#(+71EUqCoF3}B5^0gR>JHiw;a1b;*$B|H(&mCo5a{6a^Cy9E#FJd Q$qYc?>FVdQ&MBb@0QA=ve*gdg From b2b507a701bfb94b4a297440ffda60e6296f88c2 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 19 Sep 2025 21:06:12 +0200 Subject: [PATCH 51/63] Updates the table to remove 0xC3=.. --- text/ff4_menus.tbl | 1 - 1 file changed, 1 deletion(-) diff --git a/text/ff4_menus.tbl b/text/ff4_menus.tbl index 48af96b..4649826 100644 --- a/text/ff4_menus.tbl +++ b/text/ff4_menus.tbl @@ -68,7 +68,6 @@ C0=, C1=. C2=- -C3=.. C4=! C5=? C6=% From 304ed4c7193e80dd7980ddf0127cd7a9edf902f9 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 19 Sep 2025 21:06:44 +0200 Subject: [PATCH 52/63] Minor script fixes. --- text/fr/bank1-1.xml | 3 +-- text/fr/bank2.xml | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/text/fr/bank1-1.xml b/text/fr/bank1-1.xml index 2af3d78..02051c4 100644 --- a/text/fr/bank1-1.xml +++ b/text/fr/bank1-1.xml @@ -2445,8 +2445,7 @@ quelque chose?[end] [bold]Cecil[normal]: Préparez-vous au combat![end] -[force_wicked] -«Vous êtes de Baron, hein...»[new] +«Vous êtes de Baron, hein...»[new] [bold]Caïn[normal]: Qui est là?[music][0x2d][new] «Partez maintenant et il ne vous fait aucun mal...»[new] diff --git a/text/fr/bank2.xml b/text/fr/bank2.xml index afa3429..3b846b5 100644 --- a/text/fr/bank2.xml +++ b/text/fr/bank2.xml @@ -1038,7 +1038,7 @@ Anna est morte à cause de vous!![new] [bold]Barde[normal]: !?[end] [bold]Edward[normal]: La Lumière du Désert se forme à partir des sécrétions du Fourmilion -quand il pond ses ufs.[new] +quand il pond ses œufs.[new] Sa grotte est à l'est, mais nous devons traverser un plan d'eau peu profond pour y accéder.[new] @@ -1073,7 +1073,7 @@ pas faire ça tout seul![end] aide! Je vais tuer Golbez de mes propres mains![end] -[bold]Tellah[normal]: Tellah a quitté le groupe.[end] +Tellah a quitté le groupe.[end] [bold]Edward[normal]: A... Anna... -sniff-...-snif-...[end] [bold]Rydia[normal]: Pleurnicheur![end] From 6913215d52fe834fe33d5786f7a919ff30a870fb Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 19 Sep 2025 21:07:15 +0200 Subject: [PATCH 53/63] Update battle script for Tellah/Gilbert confrontation. --- text/fr/battle_messages.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/text/fr/battle_messages.xml b/text/fr/battle_messages.xml index d5c2945..c6cd0a4 100644 --- a/text/fr/battle_messages.xml +++ b/text/fr/battle_messages.xml @@ -44,19 +44,19 @@ S'il vous plaît ! Arrêtez tous les deux ![end] -Tella: Toi, comment oses-tu faire du mal à ma fille‥‥[end] +Tella: Toi, comment oses-tu faire du mal à ma fille...[end] -C'est faux ![end] +Barde: C'est faux ![end] Tella: Qu'est-ce qui est faux ?![end] -Veuillez écouter ce que j'ai à dire ![end] +Barde: Veuillez écouter ce que j'ai à dire ![end] Tella: Tais-toi ![end] -Barde:Je vous en prie ![end] +Barde: Je vous en prie ![end] -Tell: Cette douleur, c'est la douleur d'Anna...[end] +Tella: Cette douleur, c'est la douleur d'Anna...[end] Anna... qu'est-ce que...[end] From 37c1958cc5b02562c4f3d03080938a62af443bce Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Fri, 19 Sep 2025 22:19:46 +0200 Subject: [PATCH 54/63] Update build scripts. --- build.py | 2 +- utils/__init__.py | 1 - utils/dakutens.py | 19 ++++++++++--------- utils/font.py | 21 +++++++++++---------- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/build.py b/build.py index 9b5f745..b48b968 100755 --- a/build.py +++ b/build.py @@ -505,7 +505,7 @@ def build_assets(assets): credits_file = Path(f"./text/{lang}/credits.txt") menu_table.parse_table_line("0A=.") - del menu_table.lookup[".."] + # del menu_table.lookup[".."] credits_text = credits_file.read_text() credits_lines = credits_text.split("\n") diff --git a/utils/__init__.py b/utils/__init__.py index cd04ff3..e69de29 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -1 +0,0 @@ -__author__ = 'emmanuel' diff --git a/utils/dakutens.py b/utils/dakutens.py index c85db70..12e6993 100644 --- a/utils/dakutens.py +++ b/utils/dakutens.py @@ -5,16 +5,13 @@ def generate_dakutens(table: Table) -> bytes: - accents = set() - accents_mapping = { - ' ̀': b"\x8a", ' ̈': b"\x8d", ' ̂': b"\x8b", ' ́': b"\x8c" - } + accents_mapping = {" ̀": b"\x8a", " ̈": b"\x8d", " ̂": b"\x8b", " ́": b"\x8c"} dakutens = [b"\x00\00"] * 256 count = 0 - lowest = 0xff + lowest = 0xFF highest = 0 for key in table.lookup.keys(): @@ -22,14 +19,18 @@ def generate_dakutens(table: Table) -> bytes: font_char = table.to_bytes(key)[0] if len(normalized) > len(key): - if normalized[1] == 0xcc and normalized[2] != 0xa7: + if normalized[1] == 0xCC and normalized[2] != 0xA7: print(key) lookup_key = (b"\x20" + normalized[1:]).decode("utf-8") - non_accentuated_char = table.to_bytes(normalized[:1]. decode("utf-8")) + non_accentuated_char = table.to_bytes(normalized[:1].decode("utf-8")) lowest = min(lowest, font_char) highest = max(highest, font_char) - dakutens[font_char] = accents_mapping[lookup_key] + non_accentuated_char + dakutens[font_char] = accents_mapping[lookup_key] + non_accentuated_char count += 1 - return struct.pack(" np.n x_offset = column * char_width y_offset = line * char_height - return image[y_offset:y_offset + char_height, x_offset:x_offset + char_width] + 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: - byte_value = int(''.join(byte.astype(str)).ljust(8, '0'), 2) + byte_value = int("".join(byte.astype(str)).ljust(8, "0"), 2) binary_data.append(byte_value) return bytes(binary_data) @@ -38,7 +38,7 @@ def char_as_1bbp(char): def get_max_width(char: np.ndarray) -> int: max_width = 0 for byte in char: - trimmed = np.trim_zeros(byte, 'b') + trimmed = np.trim_zeros(byte, "b") max_width = max(len(trimmed), max_width) return max_width @@ -51,7 +51,7 @@ def convert_font_to_1bpp(font_file, has_grid=True, char_height=16): char = get_char(image, 0x00, has_grid, 8, char_height) - data = b'' + data = b"" char_index = 1 while len(char) > 0: data += char_as_1bbp(char) @@ -64,6 +64,7 @@ def convert_font_to_1bpp(font_file, has_grid=True, char_height=16): return len_table, data + def convert_font_to_2bpp(font_file, has_grid=True, char_height=16): image = np.array(Image.open(font_file)) @@ -71,7 +72,7 @@ def convert_font_to_2bpp(font_file, has_grid=True, char_height=16): char = get_char(image, 0x00, has_grid, 8, char_height) - data = b'' + data = b"" char_index = 1 while len(char) > 0: data += write_as_2bpp(char) @@ -106,20 +107,20 @@ def remove_grid(font_file): im = Image.fromarray(np.uint8(font * 255)) # output = io.BytesIO() - im.save('/tmp/font.png', format='PNG') + im.save("/tmp/font.png", format="PNG") -if __name__ == '__main__': - remove_grid('/Users/emmanuel/PycharmProjects/ff4/fonts/wicked_vwf.png') +if __name__ == "__main__": + 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] + char = data[0:8, y_value : y_value + 8] for byte in char: - byte_value = int(''.join(byte.astype(str)).ljust(8, '0'), 2) + byte_value = int("".join(byte.astype(str)).ljust(8, "0"), 2) binary_data.append(0xFF) binary_data.append(byte_value) From c1ccf3a3ef27de11a35ddaad953cfdc5fe5ca44c Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 20 Sep 2025 00:26:18 +0200 Subject: [PATCH 55/63] Update ingame menu magic window scrolling position. --- src/ingame/magic.s | 5 +---- src/ingame/main.s | 2 +- src/ingame/windows.s | 10 ++++++++++ src/menus/in_game_text.s | 20 +++++++++----------- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/ingame/magic.s b/src/ingame/magic.s index 491ea55..97f6855 100644 --- a/src/ingame/magic.s +++ b/src/ingame/magic.s @@ -36,7 +36,7 @@ first_column := 0x0248 - 4 ; Grisement des types sorts : 'Blancs' 'Noirs' etc ... *=0x01B419 ldy.w #0x0007 - sta.w 0xC5FF,x + sta.w 0xC5FF + 2,x ; Spells type cursor offset *=0x01B0CE @@ -58,9 +58,6 @@ first_column := 0x0248 - 4 *=0x01dd6d menu_window(8, 0, 22, 26) -; [use spell] Magic name window. -*=0x01dd75 - menu_window(0, 0, 9, 7) ; [use spell] Use spell on whom window. *=0x01dd71 diff --git a/src/ingame/main.s b/src/ingame/main.s index 6abdfc6..7acf8f0 100644 --- a/src/ingame/main.s +++ b/src/ingame/main.s @@ -10,7 +10,7 @@ gil_window: menu_window(22, 23, 8, 3) time_window: menu_window(23, 19, 7, 2) -menu: +menu: ; ptr 0xdb6d menu_window(23, 0, 7, 17) } diff --git a/src/ingame/windows.s b/src/ingame/windows.s index a91df13..90605a0 100644 --- a/src/ingame/windows.s +++ b/src/ingame/windows.s @@ -41,6 +41,16 @@ *=0x01dd69 menu_window(23,2,7,7) +; controls the amount of scroll to apply to bg4 to move the magic window kind window +*=0x01af90 +; 01/AF90: A9 34 LDA #$34 +; 01/AF92: 85 AD STA $AD + lda #0x68 + +; scroll out of the same window. +*=0x01b072 + lda #0x68 + ; status *=0x01de01 menu_window(0,1,29,24) diff --git a/src/menus/in_game_text.s b/src/menus/in_game_text.s index 7254c1d..fecf4a6 100644 --- a/src/menus/in_game_text.s +++ b/src/menus/in_game_text.s @@ -6,7 +6,7 @@ cant_fight: .db 0 menu: ; window - .dw 0x002E, 0x1107 + menu_window(23, 0, 7, 17) ; position .dw 0x0070 .text 'Objets' @@ -43,12 +43,10 @@ time: } .scope items_menu { + items_menu_right: + menu_window(22, 0, 7, 3) item: - .db 2 - .db 0 - .db 7 - .db 3 - + menu_window(0, 0, 7, 3) .dw 0x0044 .text 'Objets' .db 0 @@ -61,23 +59,23 @@ time: .scope spells { white: - .dw 0x00EE + move_to(24, 3) .text 'Magie' .db 0 black: - .dw 0x016E + move_to(24, 5) .text 'Rituel' .db 0 summon: - .dw 0x01EE + move_to(24, 7) .text 'Chimere' .db 0 ninja: - .dw 0x016E + move_to(24, 5) .text 'Ninja ' .db 0 kokan: - .dw 0x0054 + move_to(24, 3) .text 'Echange' .db 0 mp_needed: From 9b9b6797f5b0c668c3734c137521ffbf5d78793a Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sat, 20 Sep 2025 17:36:50 +0200 Subject: [PATCH 56/63] Translates the "gils" part of the inn keeper screen. --- src/libmz.i | 5 ++ src/minimal_vwf_patches.s | 103 +++++++++++++++++++++++++++++++------- src/vwf.s | 48 +++++++++++++++++- 3 files changed, 136 insertions(+), 20 deletions(-) diff --git a/src/libmz.i b/src/libmz.i index 6d30664..5157cb2 100644 --- a/src/libmz.i +++ b/src/libmz.i @@ -130,3 +130,8 @@ return_addr: rep #0x20 } +.macro fill_value(value, count) { + .for k := 0, count { + .dw value + } +} \ No newline at end of file diff --git a/src/minimal_vwf_patches.s b/src/minimal_vwf_patches.s index 2401162..076f427 100644 --- a/src/minimal_vwf_patches.s +++ b/src/minimal_vwf_patches.s @@ -87,42 +87,69 @@ end_of_animation: { ; Oui -*=0x14F66C .table 'text/ff4_menus.tbl' - .text ' ' - .db 0x20 - .text ' ' - .db 0x20 - .text ' ' - .db 0x20 - -*=0x14F67C +*=0x14F656 + .dw 0x2016 + fill_value(0x2017, 5) + .dw 0x2018 + .dw 0x0000 + +*=0x14F666 + .dw 0x2019 + fill_value(0x20ff, 5) + .dw 0x201a + .dw 0x0000 + .dw 0x0000 + +*=0x14f676 + .dw 0x2019 + .dw 0x2014 .text 'O' .db 0x20 .text 'u' .db 0x20 .text 'i' .db 0x20 - + .dw 0x20ff + .dw 0x201a + .dw 0x0000 ; Non -*=0x14F68C - .text ' ' - .db 0x20 - .text ' ' - .db 0x20 - .text ' ' - .db 0x20 +*=0x14F686 + .dw 0x2019 + fill_value(0x20ff, 5) + .dw 0x201a + .dw 0x0000 + .dw 0x0000 -*=0x14F69C +*=0x14F696 + .dw 0x2019 + .dw 0x20ff .text 'N' .db 0x20 .text 'o' .db 0x20 .text 'n' .db 0x20 + .dw 0x20ff + .dw 0x201a + .dw 0x0000 +*=0x14F6A6 + .dw 0x201b + fill_value(0x201c, 5) + .dw 0x201d + .dw 0x0000 + fill_value(0x0000, 8) + + } +; yes/no cursor positions +; 0x28c4 0x2904 +*=0x00ae38 + ldx.w #0x28c4 - 1 +*=0x00ae51 + ldx.w #0x2904 - 1 ; Palette changes for allowing shadows *=0x15c229 @@ -151,4 +178,42 @@ end_of_animation: *=0x00B361 jsr.l wait_for_action_button - nop \ No newline at end of file + nop + +; Make gils window bigger +gils_line_size = 0x18 +*=0x00ad28 + lda.b # gils_window_tilemap_1 >> 16 +;00/AD26: A9 14 LDA #$14 + +*=0x00ad2d + ldx.w #gils_window_tilemap_1 & 0xffff + +*=0x00ad4b + ldx.w #gils_window_tilemap_2 & 0xffff + + +*=0x00ad39 + ldx.w #gils_line_size + +*=0x00ad63 + ldx.w #gils_window_tilemap_3 +*=0x00ad69 + ldx.w #gils_line_size + +*=0x00ad51 + ldx.w #gils_line_size + +*=0x00ad7b + ldx.w #gils_window_tilemap_4 & 0xffff + +*=0x00ad81 + ldx.w #(gils_window_tilemap_4_end - gils_window_tilemap_4) & 0xffff + +; clear up longer gils window +*=0x00addd + ldx.w #0x100 + 0x80 + +; gils value vram position +*=0x00ad8a + ldx.w #0x28d3 + 2 diff --git a/src/vwf.s b/src/vwf.s index f51be0e..4049b71 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -159,7 +159,7 @@ vwfstart: LDA.B #0x01 STA.W 0x420D - ; $04-$4F + ; 0x04-0x4F var_base = 0x23 CNTR = var_base CURRENT_C = var_base + 2 @@ -1028,7 +1028,53 @@ endintromap: +gils_window_size := 10 +gils_window_tilemap_1: + .dw 0, 0 + .db 0x16,0x20 + fill_value(0x2017, gils_window_size - 2) + .db 0x18,0x20 +gils_window_tilemap_2: + .dw 0, 0 + + .db 0x19,0x20 + fill_value(0x20ff, gils_window_size - 2) + .db 0x1a,0x20 + +gils_window_tilemap_3: + .dw 0, 0 + + .db 0x19,0x20 + fill_value(0x20ff, gils_window_size - 2) + .db 0x1a,0x20 + +gils_window_tilemap_4: + .dw 0, 0 + + .db 0x19,0x20 + fill_value(0x20ff, gils_window_size - 2) + .db 0x1a,0x20 + + fill_value(0x0000, 0x16) + + .db 0x19,0x20 + fill_value(0x20ff, gils_window_size - 2 - 4) + .text 'G' + .db 0x20 + .text 'i' + .db 0x20 + .text 'l' + .db 0x20 + .text 's' + .db 0x20 + + .db 0x1a,0x20 ; "gil" + fill_value(0x0000, 0x16) + .db 0x1b,0x20 + fill_value(0x201c, gils_window_size - 2) + .db 0x1d,0x20 +gils_window_tilemap_4_end: From b8457a6214bdc0562fb439bf91dc8de6f8191523 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sun, 21 Sep 2025 13:00:58 +0200 Subject: [PATCH 57/63] Fixes the wait_for_action_button patch in open_dialog_window. --- src/minimal_vwf_patches.s | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/minimal_vwf_patches.s b/src/minimal_vwf_patches.s index 076f427..ce04ab9 100644 --- a/src/minimal_vwf_patches.s +++ b/src/minimal_vwf_patches.s @@ -176,9 +176,10 @@ end_of_animation: .dw 0x0463 -*=0x00B361 +*=0x00B363 jsr.l wait_for_action_button nop + nop ; Make gils window bigger gils_line_size = 0x18 From 9e847c35a46ac5878272864661a5765644b5c058 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Sun, 21 Sep 2025 13:02:49 +0200 Subject: [PATCH 58/63] Check if any button are pressed while drawing vwf8 descriptions, description are rendered when the player is not interacting with the items list. --- src/ingame/free_space.s | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ingame/free_space.s b/src/ingame/free_space.s index 51bb2f7..f61936c 100644 --- a/src/ingame/free_space.s +++ b/src/ingame/free_space.s @@ -2,9 +2,15 @@ draw_window = 0x0180d9 check_if_description_was_rendered: pha + lda.l 0x004218 + ora.l 0x004219 + bne _not_still + pla + pha cmp.l render.last_drawn_text_ptr bne _continue +_not_still: pla rts _continue: @@ -20,6 +26,7 @@ draw_vwf_message: jsr.l items_description.draw_trampoline rts draw_window_and_vwf_message: + jsr.w draw_window ; NOTE: quirks from the hardcore bank switching can be solved by loading the bank in A before the call. pha From 792484a36006aaf7338402130582e94ab0e57a2d Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 6 Oct 2025 13:50:12 +0200 Subject: [PATCH 59/63] =?UTF-8?q?Adds=20=C5=92,=20=C5=93=20to=208x8=20vwf?= =?UTF-8?q?=20font.=20Try=20a=20non-bold=20font=20for=20menus.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fonts/8x8.bin | Bin 4096 -> 4096 bytes fonts/8x8vwf.png | Bin 408 -> 576 bytes text/ff4_menus.tbl | 24 ++++++++++++++++++++++++ text/ff4fr.tbl | 3 ++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/fonts/8x8.bin b/fonts/8x8.bin index 13ef17d410eb8d08b203e17873544720875def42..3a4b5ff6b4ddfc74187f047dfd46b177eff8141b 100644 GIT binary patch literal 4096 zcmeHKUuauZ7(e~99k=OBYk+$h+L4l-#+Z@QJ-Hd#Ku@0@#bZ;FU7J_yZ^ zoO6EX`@Zx2IrrS;FxLD51||o%J;NEABQD26gSR#2v=!TzqGlq;u0^j!4VEy&gG+Xs z6J+!DyiIcgxoAgX~NH8exb2utK#4?7Oz^%?}AH7qRmhKO3~Y6|M*`lvIJ<~CJ$3-JcWy@tM# zfE1jv8=QNA1{Gem!e@%jknzf1N>AA-z~l@OCAI&Y-_gvAX#zTQJqt_ZHK!h`-#h%M zlYq0K>f!D9{Oi)VwH@laU zbI;v+y4YD}+1Z4;S`0?kLgj$dR$~+CupPV|JpHxHv*wIh7%cUbd&(iZ`$0=KH&ZO6 zORrRVb~>FywFZCqY_$`ff+x^N@y(I1x=P3LdZa%xvyV>O1ZC zXG-lm9osD^XRGgBd49bsJF;|=SUFxa3hC7phl(>Vl)m`%{)I;?XCEIyrWKSzG8_A~ zWBWk04Y`8#?5K9^C>5=Q&xai@yfkw*d&01cNn_T?;i!$9T0ZtG_9^BeQ( z>&XkB{XqG);Cji*iOc+~ySWyD$kv|J2VHR@uoy0M7V-XRNKMQWd0=5FguOb#;8bSKxU&0^1h}bV* zK;1}F{?gt=iGr(;{a7PfidyC)JcxM3SVYY*5)ZbkKMX1i^QfeK8fOSpPdZg93}U8~ zA4RA@2DPVQ1Q}&+yBX1XA_JNg@lowan?Usza@r*!kKo$U8~J0dcE-)nzdq$pIw@=k zlwTKqHMa(nC?S1shdf=WPfv_j0rDrKrwECAJ4EYya=AlZHh9)hej2?Fx)AmzuaU@4 z#j1&D`*Al(E^6V`L-I)|a=DD|dzV|dH{Sk8ds!d<4vGCC9}G6&7UE|U zP(zuNlf9S``gP^uQby;}8#6rZ*IiC0S%6_r|0d4k*`*UM_-pVjz8xa)GQ7{{9gCR`xW?~SAe~N2`TPueh>!#LT?l?1;A1;}5gXacwW;owF za;Dl|3z-wu6IJdhlm^S*irwS>iE60Y>o0CJ{$H@brdm!(>W=hASPgB2CN&ew(V3RK zK?p`1_i}Hi)WtMla(FNo%lR3V1aA2-SpeRsOQ*E;s^n%D!R0Teq_Nc4S38upGHdb; zz*j81-{j8?OG@sqHgRi3ny6Y??tP@Z5uCqncGUZ;DM4^K^^)WNj_;1l=hFlj3@oc8 z@OrJ$-FScN^&SFtyVthfNPL*MkiC(;6eri!Sg3Ys;=RP#;r)-z#GlXp?7_A8{_L64 z5~)OFk3=OaauL6o>32R}?pZR$W5fPpITX3nz0_H2ubV^Z-fHN4=%HT+crkx8 zzc5l6TIyfwuJ(PfrC2&zUPxEIu+o3Cr*>PtiC_EFT9158J^~x%ukQVMxUy}=YJflf z)!538iv$1es)lOqk}sAXNxdBV`zI?MH@j|Z0o^R_es%lhaB=UMF=9)Ja&95Ln6ltw z=W~^3fAX&JIBY zJ#9rdVChb~%ZJ0yqN^z1s*vVeJy9;wbw%sU&-w}}KY5H?k#_*Ic1^ry>tAZ(XXS0{ zcLQDdCpl)JY^gocWnmSR25!`v`0_*fg(PJ}Pb|1H(gE;nEsQ*XT+GTg@P)00u>1kG zpG6KFK7dtB9+JDkslCaO{S#YPAx5M0ZtUYN7vP<++Zpf=VEsKALlzn~`#kSF9ga?U z-BJC#N7%vaVRnw{cca6zO?l?ZLCQ)vjJ_tDH11Moi^^3JZ>Lq{Aui)G1sKITD$DX& zP?GW@vJi#`9^OnH@QV55JIlvv#AeUK{sGkEKmfFt0jK6M4_P14h9TwQCeMRLNe4W~ z9`fR0PTF-C9*km#BkPxd1np6W4~XDleZLM`UY^FCviZI$$p!fY9>Tje+9UFNDavo; zPT6YlxZDT5djJXG8gEhxus>$=^P2UP-X4?Z;M+Dt{atxRUXqjYHSqiB)w^U!9s~Xv zXxJgUKvmdn^Kryx<2iW&U06jv?+db1u)X6!CXDEw1ZX|dxSbE8qHUlsmwYIF9P%Fi zJ?In1Kc<+?M_BriS<;j6<~n@w(S1|6x#O@uDi0&JlYnPrx6O4GBOm5F49(-n+IGmW zx}Lm-o14Czw09dT)q}@_rGxSVSo9$IFl6q9?ue}ns}lvrUYM{onZVh*3;xBS)#Yb5 z{2Q{}6GLVv5nTuDx9IG+?bZkGr6K(!;@1A0u(nup#c3;oN_f!cx<@H)oUodBLJ8y} zzw7^9sFC`sbRYC6v}>PokDW*!21A00L6K$>N)KIJz**A2KEE>C#+;EzpS1Dvl4}s zD4<0jhsWaaVuvSl#R6YA6ZTkU^4z}Zvk8|%mO)PcS`jy1EG z0-m)`3um|a;N%HlzFN}CPmfFh%#ZrF4gU4RYvzYL9xC=1tZ7eu)2dOQXHUtb?RmyC z0txL}YOXgWoIM|Jqylz%{#8F~vrE2-6Rh=Z!%61ZWj#yC3LjmOpLJ*L_-<5xlIZ;~ z9(GjS#;GHv98B7~b6Nfc)lb52<9@YEe?t9;(SS}P zrL;O)1B6!%q-k3l1LRW!gb0OL0~O-x*OJ%(HcF`bPb1JT0giwTglBVr!z7%mAW45y z1>JRQ;O*<)Z7Ao#KVJtFS)&jQ>iZ`HCFch6X9k*xmTJO2nFa&6;QJlXI@Ehznha>E zR3&)aV1UL59!Mo;Z(zM^Oq4FCe`E&llg1XI!q*WNVXD zTs4s7X#-SN`_!uTg9d2Isv_|a(Cv)G-vi$h@6FxIsB%H=((@b$X|`4=)*}P)2Y{=i z-{Wog)Ijqhp`_G(I>rwSI1)hh`2N#!Z6?&jG`Vq}3+?xR^F7d3jrB#AWm$ikjb%Kp zQ>gznnE%&I{c2l7{x9HV?N8BzzS5LFWMEdTX9f&Rid6lPl4V(zEAaTl zaLGU^G5p)m62TK5`aijH kJqPYp!LlsNvMkFF6DI@JcW(}*%m4rY07*qoM6N<$f}Y9;L;wH) delta 376 zcmV-;0f+v;1egPm7zqIb0002_@bid~Ar*g3Nklm&!X=p~`3`FA;toSGVmrew42)O`^KNa$RO<~%xE-Q0FRywawZZ3 zX`;j!+*CanHrWdv2M}STpBLHbVPJ|>0qD$T|B-Z;<}>&TV?)OZk4?@6z^R<}mk>ak zn839mfs}MYxR0b4pU^No8@f&ipRQz(^8~6%ag87+8V~^NrD_2~AS`e|G)YZu4B7YL zND(?fmAiDota@L7m9zk=-hl|%YsU4BXOR7{HM;#=4yLi0+gd?;9uHo?{i6J(d-ogD Wi}yYL2X2}G0000Numéro 199 Flamme Brasier -Éclair +Eclair Tonnerre Souffle du Dragon Grande Vague From a0e87498a3a2741fe854f905674db6d6d8f29208 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 6 Oct 2025 13:50:54 +0200 Subject: [PATCH 61/63] Adds monsters long names. --- text/fr/monsters_long.xml | 227 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 text/fr/monsters_long.xml diff --git a/text/fr/monsters_long.xml b/text/fr/monsters_long.xml new file mode 100644 index 0000000..07261ec --- /dev/null +++ b/text/fr/monsters_long.xml @@ -0,0 +1,227 @@ + + +Gobelin +Basilic +Aigle plongeur +Orbe flottant +Insectus +Chauve-visage +Yeux des bois +Rat-épée +Mini-magicien +Sahuagin désert +Œil volant +Jambe-main +Ver des sables +Gigantoad +Coquille à crocs +Zombie +Tue-mouches +Fleur de sang +Crapaud organique +Guimauve rouge +Gelée jaune +Sahuagin +Lacey +Chrysalide +Gobelin casqué +Lézard noir +Tortue d'adamant +Domo Boy +Bavarois violet +Soldat de Baron +Général +Gatling +Petit tueur +Belle de mort +Esprit +Squelette +Cocatrice +Gargouille +Bébé Rudra +Belphegor +Zu +Shiva +Alligator +Éclabousseur +Marine de Baron +Capitaine +Âme +Os sanglant +Goule +Jarre-crâne +Revenant +Dame Dracula +Ahriman +Dragon squelette +Poisson-éclair +Gigantogator +Hydre +Ver d'inondation +Élite de Baron +Lamia +Aiguille infernale +Serpent jumeau +Esprit de foudre +Flagelleur mental +Naga +Ogre +Cait Sith +Chevalier noir +Chevalier centaure +Demoiselle vampire +Marionnettiste +Marionnette +Aile funeste +Filet de mort +Marid +Chevalier diable +Mammouth blindé +Dame gardienne +Chevalier spectral +Naga raja +Méduse +Zombie saurus +Tortue de magma +Diablotin +Cauchemar +Bombe +Mini-bombe +Chimère +Tortue des enfers +Robe de fer +Chien de feu +Gorgone +Golem de pierre +Lilith +Mère lamia +Crapaud servile +Taupes +Rudra +Sorcier +Ogre berserker +Pot fraudeur +Chauve-sang +Alchimiste +Chevalier de feu +Canon mécanique +Bombe soignante +Grenade noire +Fléau +Bras ultime +Coeurl +Dragon mécanique +Alraune +Praticien +Grands-fonds +Ver des abysses +Rouge sanglant +Demoiselle leader +Lézard glacial +Batteur infernal +Tête démoniaque +Bête des vents +Invocateur +Dame sorcière +Porte d'assaut +Sorcière crapaud +Mammon +Cerveau chimère +Virus lunaire +Souffle de Zemus +Mousse blanche +Flan noir +Esprit de Zemus +Golem de mithril +Dragon vert +Princesse flan +Yeux +Soldat mécanique +Soldat géant +Déesse de la lune +Morbol +Dragon d'argent +Dragon jaune +Satan junior +Eucaryote +Phase +Soldat de fer +Soldat démoniaque +Golem d'acier +Ahriman +Lunasaurus +Chercheur +Nécromancien +Bahamut noir +Procaryote +Tiamat +Dragon bleu +Dragon d'or +Dragon de foudre +Dragon blanc +Dragon rouge +Béhémoth +Dragon de brume +Octomammoth +Fourmilion +Mère bombe +Scarmiglione +Scarmiglione +Baigan + Bras droit + Bras gauche +Cagnazzo +Elfe noir +Elfe noir +Dog +Mag +Rag +Golbez +Barbariccia +Calco +Calcabrina +Golbez +Dragon noir +Docteur +Barnabas +Dr. Lugae +Roi d'Eblan +Reine d'Eblan +Rubicante +Odin +Léviathan +Bahamut +Mur des démons +Asura +Quatre archifiends +Quatre archifiends +Dragon noir +Sahuagin +Sys. de contrôle +Sys. de défense +Zemus +Zeromus +Zeromus +Chevalier dragon +Barde lunaire +Moine +Chevalier noir +Petite fille +Titan +Orbe flottant +Zu +Brina +Skulnant +Mecha fusionné +Système d'attaque +Monstre 214 +Higuchi Katsuhisa +Zeromus +Itou Hiroyuki +Matsui Akihiko +Aoki Kazuhiko +Nakada Hiromi +Yoshii Kiyoshi +Takahashi Tetsuya +Mistéleg + \ No newline at end of file From 994546df5927d5141fed77a894838bc1107184b8 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 6 Oct 2025 14:22:47 +0200 Subject: [PATCH 62/63] Use the 8x8vwf for monster names, names and commands. --- build.py | 28 +- ff4.s | 32 ++- src/battle/commands_patches.s | 85 +++--- src/battle/commands_reloc.s | 150 +++++++++++ src/battle/message.s | 433 +++++++++++++++++++++++++++++-- src/battle/monsters_patches.s | 33 +++ src/battle/monsters_reloc.s | 38 +++ src/battle/sram.i | 5 +- src/battle/sram.s | 31 +++ src/battle/sram_patches.s | 116 ++++++++- src/ingame/main.s | 2 +- src/ingame/options.s | 8 +- src/libmz.i | 3 + src/menus/in_game_text.s | 4 +- src/small_vwf/item_description.s | 6 +- src/small_vwf/render.s | 70 ++++- src/vwf.s | 7 +- 17 files changed, 961 insertions(+), 90 deletions(-) create mode 100644 src/battle/commands_reloc.s create mode 100644 src/battle/monsters_patches.s create mode 100644 src/battle/monsters_reloc.s diff --git a/build.py b/build.py index b48b968..165ac95 100755 --- a/build.py +++ b/build.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import io import logging +import math import os import struct from pathlib import Path @@ -139,7 +140,7 @@ def build_fixed_asset(table, input_file, binary_text_file): write_pointers_value_as_binary(pointers, binary_text_file) -def build_fixed_to_ptr_asset(table, input_file, binary_text_file, pointers_file): +def build_fixed_to_ptr_asset(table, input_file, binary_text_file, pointers_file, buffer_width=None): pointers = read_fixed_from_xml( input_file, table, formatter=lambda t: t.strip() + "[end]" ) @@ -152,7 +153,13 @@ def build_fixed_to_ptr_asset(table, input_file, binary_text_file, pointers_file) if ptr_len > max_length: max_ptr = (i, pointer) max_length = ptr_len + + if buffer_width and ptr_len > buffer_width: + text = table.to_text(pointer.value) + print(f"{text} is too long ({ptr_len}px , {math.ceil(ptr_len / 8)} tiles)") + text = table.to_text(max_ptr[1].value) + print(f"{text} is the largest ({max_length}px ({math.ceil(max_length/8)})") write_pointers_value_as_binary(pointers, binary_text_file) write_pointers_addresses_as_binary( @@ -293,6 +300,9 @@ def add_custom_kernings(text: str, advance: int) -> None: add_custom_kernings("tt", 2) else: known_pairs_to_kern = [ + "Ya", + "Pa", + "Po" "Fa", "Fe", "Fo", @@ -302,6 +312,7 @@ def add_custom_kernings(text: str, advance: int) -> None: "To", "Tu", "Tr", + "Ts", "ra", "re", "ro", @@ -466,6 +477,13 @@ def build_assets(assets): os.path.join(text_root, "battle_commands.xml"), "assets/battle_commands.dat", ), + ( + "fixed_to_ptr", + menu_table, + os.path.join(text_root, "battle_commands.xml"), + "assets/battle_commands_nul.dat", + "assets/battle_commands_nul.ptr", + ), ( "fixed_to_ptr", menu_table, @@ -473,6 +491,14 @@ def build_assets(assets): "assets/attack_names.dat", "assets/attack_names.ptr", ), + ( + "fixed_to_ptr", + menu_table, + os.path.join(text_root, "monsters_long.xml"), + "assets/monsters_long.dat", + "assets/monsters_long.ptr", + 80 + ), ( "nullterminated", menu_table, diff --git a/ff4.s b/ff4.s index 499e84a..9e33640 100644 --- a/ff4.s +++ b/ff4.s @@ -1,7 +1,7 @@ ; ---------------- ; Final Fantasy IV the new hack. ; ---------------- - +DEBUG := 1 ; Feature Flips ENABLE_DIALOG_SKIP := 1 ENABLE_INTRO := 1 @@ -11,7 +11,9 @@ MAGIC_ENABLED := 1 ENABLE_KERNING := 1 ENABLE_KERNING_MENU := 0 ENABLE_BUTTON_DISPLAY := 1 - +BATTLE_CMD_VWF := 1 +BATTLE_NAMES_VWF := 1 +BATTLE_MONSTERS_VWF := 1 ; Debug flags TRIGGER_ENDING_CUTSCENE := 0 @@ -27,7 +29,12 @@ TRIGGER_ENDING_CUTSCENE := 0 } .include 'src/battle/message_patches.s' .include 'src/battle/sram_patches.s' + +.if BATTLE_MONSTERS_VWF { + .include 'src/battle/monsters_patches.s' } +} + .include 'src/places_names.s' .include 'src/new_game.s' .include 'src/credits.s' @@ -48,7 +55,7 @@ dialog_bank_ptr_base = 0x218000 *=0xFFD6 .db 0x02 ; Cartridge Type .db 0x0B ; ~ 0BH ROM Size - .db 0x06 ; RAM Size + .db 0x07 ; RAM Size @@ -94,12 +101,11 @@ clear_ram: _loop: sta.l 0x702000, x inx - cpx.w #0x4000 + cpx.w #0x5000 bne _loop } rtl -; .include 'src/libmz.s' .if ENABLE_INTRO { .include 'src/intro.s' @@ -111,9 +117,11 @@ _loop: .include 'src/battle/sram.s' .include 'src/battle/message.s' .include 'src/battle/graphics.s' + .include 'src/battle/monsters_reloc.s' .if MAGIC_ENABLED { .include 'src/battle/magic/reloc.s' } + .include 'src/battle/commands_reloc.s' } .include 'src/dialog.s' .include 'src/places_names_window.s' @@ -121,13 +129,22 @@ _loop: .include 'src/system_menus_text.s' .include 'src/dakuten.s' + .if 1 { ; menu text scopes .include 'src/menus/start_screen_text.s' .include 'src/menus/tools_shop_text.s' .include 'src/menus/in_game_text.s' - +} else { + .include 'src/menus/start_screen_text_en.s' + .include 'src/menus/tools_shop_text_en.s' + .include 'src/menus/in_game_text_en.s' +} .incbin 'assets/attack_names.ptr' .incbin 'assets/attack_names.dat' + .incbin 'assets/monsters_long.ptr' + .incbin 'assets/monsters_long.dat' + .incbin 'assets/battle_commands_nul.ptr' + .incbin 'assets/battle_commands_nul.dat' .incbin 'assets/magic.dat' .incbin 'assets/places_names.dat' .incbin 'assets/classes.ptr' @@ -188,5 +205,4 @@ font_table: lda #0x39 nop } - - +;end diff --git a/src/battle/commands_patches.s b/src/battle/commands_patches.s index 20b9642..3494295 100644 --- a/src/battle/commands_patches.s +++ b/src/battle/commands_patches.s @@ -1,47 +1,60 @@ -command_length = 10 command_buffer_ptr = 0x97a6 + 0x601 ; old spell lists buffers -; move command cursor on the moved window -*=0x2b990 - lda.b #0x18 -{ -*=0x029CD6 - lda.b #command_length +.if BATTLE_CMD_VWF { + command_length = 6 + ; Command window + *=0x16fe5a + 6 * 2 + .db 0x05, 0x00 ,command_length + 2, 0x0d -*=0x029D15 - lda.b #command_length + *=0x2b990 + lda.b #0x18 +8 +} else { + command_length = 10 -*=0x029D42 - cpy.w #command_length + 2 + ; move command cursor on the moved window + *=0x2b990 + lda.b #0x18 + *=0x029CD6 + lda.b #command_length -*=0x029D5A - cpy.w #command_length + 2 + *=0x029D15 + lda.b #command_length -*=0x029D39 - lda.l assets_battle_commands_dat, x + *=0x029D42 + cpy.w #command_length + 2 -*=0x029CE0 - lda.b #command_length * 4 + *=0x029D5A + cpy.w #command_length + 2 -; patches source & length of battle commands used in display attack window. -*=0x02cb49 - lda.b #command_length + *=0x029D39 + lda.l assets_battle_commands_dat, x -*=0x02cb54 - lda.l assets_battle_commands_dat, x + *=0x029CE0 + lda.b #command_length * 4 + + ; patches source & length of battle commands used in display attack window. + *=0x02cb49 + lda.b #command_length + + ; attack window kick for example ends up there + *=0x02cb54 + lda.l assets_battle_commands_dat, x + + *=0x02cb5d + cpy.w #command_length + + ; Command window + *=0x16fe5a + 6 * 2 + .db 0x04, 0x00 ,command_length + 2, 0x0d -*=0x02cb5d - cpy.w #command_length -*=0x16FE54 - .db command_length * 2 - .db 0x0a - .dw command_buffer_ptr ; read address - .dw 0xC1F4 - 4 ; write address } + + { ; ram position of the prebuilt battle windows *=0x16FEAD +CmdTextBufPtrs: battle_data_size = command_length * 4 * 5 .dw command_buffer_ptr .dw command_buffer_ptr + battle_data_size @@ -49,12 +62,20 @@ battle_data_size = command_length * 4 * 5 .dw command_buffer_ptr + battle_data_size * 3 .dw command_buffer_ptr + battle_data_size * 4 +*=0x16FE54 + .db command_length * 2 + .db 0x0a + .dw command_buffer_ptr ; read address +.if BATTLE_CMD_VWF { + .dw 0xC1F4 - 2 ; write address +} else { + .dw 0xC1F4 - 4 ; write address +} + *=0x02999F ldx.w #battle_data_size -; Command window -*=0x16fe5a + 6 * 2 - .db 0x04, 0x00 ,command_length + 2, 0x0d } + diff --git a/src/battle/commands_reloc.s b/src/battle/commands_reloc.s new file mode 100644 index 0000000..e515419 --- /dev/null +++ b/src/battle/commands_reloc.s @@ -0,0 +1,150 @@ +Mult8_far := 0x2855c + +draw_command_list_for_character: +lda 0x1822 ; selected character slot + +sta 0x1816 +phx +jsr.w _draw_command_list_for_character +plx +rtl +_draw_command_list_for_character: +{ + stz.w 0x1817 + ldy #0x74FD ; keep the pointer in Y this will allow to run draw_single_command multiple times + ; to build {tile_flag}cmd1\n{tile_flag}cmd2\n{tile_flag}cmd3\n{tile_flag}cmd4\n{tile_flag}cmd5\0 + ; to issue a single draw text call to the command list region. + lda 0x1817 ; battle command slot + sta 0x26 + lda.b #command_length * 2 + sta 0x28 + jsr.l Mult8_far ; command_id * (command_length * 2) + + + lda 0x1817 ; slot ID + asl + asl + tax + stx 0x00 + + ;lda 0x1816 ; character id + ;asl + ;tax + + ;rep #0x20 + ;ldx.w #command_buffer_ptr - 10 + ;lda.l 0x16fead,x ;CmdTextBufPtrs,x + ;stx 0xef52 ; destination ptr ? + +_loop: + tdc + lda 0x1817 ; slot ID + asl + asl + tax + stx 0x00 + + lda 0x1816 ; character id + + rep #0x20 + asl + tax + lda.l 0x16feb7, x + clc + adc.b 0x00 + tax + sep #0x20 + + jsr.w draw_single_command + inc 0x1817 + lda 0x1817 + cmp #5 + beq _exit + lda #1 + sta.w 0x0000,y + iny + bra _loop +_exit: + + tdc + sta.w 0x0000,y + + sta 0xef55 + + ldx.w #command_buffer_ptr + stx 0xef52 ; destination + + rep #0x20 + +; Fill the window with 0x00ff before rendering + lda.w #command_length * 4 * 5 + sta 0x00 + +_clear_buffer_loop: + lda.w #0x00ff + sta.l 0x7e0000 + command_length * 4 * 5, x + dex + dex + dec 0 + bne _clear_buffer_loop + + sep #0x20 + + ldx #0x74fd ; text buffer + stx 0xef50 + lda.b #command_length ; draw text line length used for newline + sta 0xef54 + + jsr.l messages_vwf.init_commands_list + jsr.l _draw_text_battle_far + rts +} + +draw_single_command: +{ + tdc + sep #0x20 + lda.w 0x0001,x ; 0x3303 + + cmp #0xff + bne _continue + bra _exit +_continue: + asl + tax + tdc + lda.l assets_battle_commands_nul_ptr, x + tax + + lda #0x00 ; white text + and #0x80 + beq _active_command + lda #0x04 ; gray text + +_active_command: + sta.w 0x0001,y + lda #0x0e ; change tile flags + sta.w 0x0000,y + iny + iny + +_battle_command_loop: +{ +_loop: + lda.l assets_battle_commands_nul_dat,x + cmp #0 + beq _exit_command_loop + sta.w 0x0000,y + + inx + iny + bra _loop + +} +_exit_command_loop: +_pad_loop: + + +_exit: + rts +} \ No newline at end of file diff --git a/src/battle/message.s b/src/battle/message.s index fe8fdde..76076b3 100644 --- a/src/battle/message.s +++ b/src/battle/message.s @@ -1,7 +1,138 @@ +.if 0 { +.scope vwf_tile_ring { +; Ring buffer for VWF tile allocation +; Each entry represents 8 consecutive tiles +; VWF system computes addresses from tile_id + +MAX_ENTRIES = 37 ; Number of 8-tile slots (296 tiles / 8 = 37) +TILES_PER_ENTRY = 8 ; Fixed 8 tiles per string + +; Memory layout +tile_ring_head = 0x703FF0 ; Current allocation position (entry index) - byte +tile_ring_count = 0x703FF1 ; Number of active allocations - byte +tile_ring_next_id = 0x703FF2 ; Next ID to assign - word +tile_ring_base_tile = 0x703FF4 ; Base tile ID for ring buffer area - byte + +; A: the base tile id +init: + ; tile_ring_base_tile should be set to your VWF tile area start + ; With 0x128 dynamic + 0x128 immortal = 0x250 (592) tiles total + ; But tile IDs are 1 byte (0-255), so max usable is 0xFF + ; Let's use dynamic area starting at tile 0x00 + + sta.w tile_ring_base_tile + + stz.b tile_ring_head + stz.b tile_ring_count + stz.w tile_ring_next_id + rts + +; Allocate next 8-tile slot +; Returns: A = starting tile_id (byte), X = allocation ID (word) +allocate_tiles: + ; Calculate tile_id: base_tile + (head * TILES_PER_ENTRY) + lda.w tile_ring_head + ; Multiply by 8 (shift left 3 times) + asl + asl + asl + ; Add to base + clc + adc.w tile_ring_base_tile + + ; Get current ID for tracking + ldx.w tile_ring_next_id + + rts + +; Commit the allocation (call after rendering to tiles) +; X = allocation ID +commit_allocation: +{ + ; Advance head pointer + lda.w tile_ring_head + inc + cmp.b #MAX_ENTRIES + bne _ok + lda.b #0 ; Wrap around +_ok: + sta.w tile_ring_head + + ; Increment count (max at MAX_ENTRIES) + lda.w tile_ring_count + cmp.b #MAX_ENTRIES + beq _next + inc + sta.w tile_ring_count +_next: + ; Increment next ID + inc.w tile_ring_next_id + + rts +} +; Get tile_id of a specific allocation by ID +; A = allocation ID (word) +; Returns: A = starting tile_id (byte), Carry = 0 if found, 1 if expired +get_tiles_by_id: +{ + ; Check if ID is still valid (within current range) + sec + lda.w tile_ring_next_id + sbc.w tile_ring_count + cmp.b 1,s ; Compare with requested ID on stack + bcs _not_found ; ID too old + + lda.w tile_ring_next_id + sec + sbc.b 1,s ; buffer_next_id - requested_id + cmp.w tile_ring_count + bcs _not_found ; ID too recent + + ; Calculate which entry index this ID maps to + lda.w tile_ring_head + sec + sbc.w tile_ring_count + clc + adc.b 1,s ; Add offset for this ID + + ; Handle wrap-around +_loop: + cmp.b #MAX_ENTRIES + bcc _ok + sec + sbc.b #MAX_ENTRIES + bra _loop +_ok: + ; Calculate tile_id + ; Multiply by 8 + asl + asl + asl + ; Add to base + clc + adc.w tile_ring_base_tile + + clc ; Found + rts + +_not_found: + sec ; Not found + rts +} +} +} + +; Currently works by region +; 0x00 -> 0x40 messages tiles +; 0x40 -> 0x80 monster names +; 0x80 -> 0xB0 char names +; 0xB0 -> 0xF0 commands ? this one is untested. + .scope battle_render { buffer_ptr = 0x703000 - buffer_size = 8*128*2 - + buffer_size = 8*(128+32)*2 + region_size = 48 + pending_transfer_mask = 0x703c00 bits_left_on_tile = 0xA9 tilemap_offset = bits_left_on_tile + 2 temp = bits_left_on_tile + 4 @@ -9,8 +140,27 @@ prev_char = bits_left_on_tile + 8 current_char = prev_char + 1 font_ptr = assets_menu_font_dat +init_monsters: + lda.b #region_size + bra __init +init_names: + lda.b #region_size * 2 + bra __init +init_commands_list: + lda.b #region_size * 3 +__init: + sta.l pending_transfer_mask + jsr.w render_allocator.init_with_tile_id + bra _internal_init init: +pha +lda #0 + + sta.l pending_transfer_mask +pla + jsr.w render_allocator.init +_internal_init: .if ENABLE_KERNING_MENU { stz.b prev_char } @@ -23,13 +173,22 @@ init: stz.b temp stz.b counter - jsr.w render_allocator.init rts clear_buffer: pha phx - ldx.w #0 + phy + lda.l render_allocator.allocated_tile_id +rep #0x20 + asl + asl + asl + asl + tax + tdc +sep #0x20 + ldy.w #0 _clear_loop: lda.b #0xFF sta.l buffer_ptr, x @@ -37,8 +196,11 @@ _clear_loop: sta.l buffer_ptr + 1, x inx inx - cpx.w #buffer_size + 2 + iny + iny + cpy.w #region_size*16 bne _clear_loop + ply plx pla rts @@ -242,9 +404,6 @@ _adjust_bits_left_for_kerning: { lda.b bits_left_on_tile - cmp #8 - beq _overflow - sta.b temp jsr.w get_kerning_adjustment_linear_search @@ -255,25 +414,17 @@ _adjustment: lda.b temp clc adc 1,s - cmp #0x8 - bcs _no_overflow + cmp #0x9 + bcs __overflow + bra _no_overflow +__overflow: pla lda #0x08 + sta.b temp pha bra _no_adjustment _no_overflow: sta.b temp -.if 0 { - bpl _no_adjustment - - and.b #0x80 - sta.b bits_left_on_tile - sta.b temp - lda.l render_allocator.allocated_tile_id - dec - sta.l render_allocator.allocated_tile_id - jsr.w _refresh_destination_pointer -} _no_adjustment: pla @@ -294,6 +445,7 @@ get_kerning_adjustment_linear_search: phx phy rep #0x20 +; jsr.w _get_kerning_adjustment_binary_search jsr.w _get_kerning_adjustment_linear_search sep #0x20 ply @@ -301,13 +453,120 @@ get_kerning_adjustment_linear_search: rts } +_get_kerning_adjustment_binary_search: +{ + phb + pea.w font_table >> 16 + plb + + kerning_table_offset = 256 * 9 + ldy.w #kerning_table_offset + lda.w font_ptr & 0xffff, y + beq not_found + dec + + ; Setup binary search bounds on stack + ; Stack layout (from top): [high] [low] [target_char] + pha ; Push high bound (count-1) + lda.w #0x0000 ; Low bound = 0 + pha ; Push low bound + lda.b prev_char ; Load target character + pha ; Push target for comparison + +_binary_loop: + ; Check if low > high (search finished) + lda 0x03, s ; Load low bound + cmp 0x05, s ; Compare with high bound + bcs not_found_cleanup ; If low >= high, not found + + ; Calculate mid = (low + high) / 2 + lda 0x03, s ; Load low + clc + adc 0x05, s ; Add high + lsr ; Divide by 2 + tax ; X = mid index + + ; Calculate address: mid * 3 + kerning_table_offset + 2 + ; (each entry is 3 bytes: 2 bytes char pair + 1 byte adjustment) + pha ; Save mid + asl ; mid * 2 + clc + adc 0x01, s ; Add original mid (now mid * 3) + clc + adc.w #kerning_table_offset + 2 + tay ; Y = address of entry + pla ; Restore mid to A + + ; Load char pair at this position + pha ; Save mid again + lda.w font_ptr & 0xffff, y ; Load 16-bit char pair + + ; Compare with target + cmp 0x03, s ; Compare with target_char + beq found_pair_cleanup ; Found exact match! + bcc search_upper_half ; If entry < target, search upper half + + ; Search lower half: high = mid - 1 + pla ; Get mid + dec ; mid - 1 + sta 0x05, s ; Update high bound + bra _binary_loop + +search_upper_half: + ; Search upper half: low = mid + 1 + pla ; Get mid + inc ; mid + 1 + sta 0x03, s ; Update low bound + bra _binary_loop + +found_pair_cleanup: + pla ; Remove mid from stack + + ; Calculate adjustment offset: Y + 2 (skip char pair) + iny + iny + lda.w font_ptr, y ; Load adjustment value (8-bit) - matches original + and.w #0x00ff ; Ensure high byte is clear + + ; Clean up stack + pla ; Remove target_char + pla ; Remove low bound + pla ; Remove high bound + + clc ; Clear carry (success) + plb + plb + rts + +not_found_cleanup: + ; Clean up stack + pla ; Remove target_char + pla ; Remove low bound + pla ; Remove high bound + +not_found: + lda.w #0x0000 + sec ; Set carry (not found) + plb + plb + rts + +found_pair: + ; This label kept for compatibility but shouldn't be reached + ; in binary search version + clc + plb + plb + rts +} + _get_kerning_adjustment_linear_search: { phb pea.w font_table >> 16 plb -kerning_table_offset = 256 * 9 + kerning_table_offset = 256 * 9 ldy.w #kerning_table_offset lda.w font_ptr & 0xffff, y beq not_found @@ -382,6 +641,7 @@ tilemap_write: inc.b tilemap_offset inc.b tilemap_offset sep #0x20 + tdc pla rts } @@ -421,11 +681,28 @@ tilemap_write: jsr.w battle_render.init rtl + init_commands_list: + jsr.l battle_flags.set_vwf_render + jsr.w battle_render.init_commands_list + rtl + init_monsters: + jsr.l battle_flags.set_vwf_render + jsr.w battle_render.init_monsters + rtl + + init_names: + jsr.l battle_flags.set_vwf_render + jsr.w battle_render.init_names + 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. + lda.l battle_render.pending_transfer_mask + ora #1 + sta.l battle_render.pending_transfer_mask rtl _wait_for_vblank: { @@ -437,9 +714,119 @@ tilemap_write: } DMA_TRANSFER: - dma_transfer_to_vram_call(battle_render.buffer_ptr, 0xb000>>1, battle_render.buffer_size, 0x1801) + pha + phx + phy + lda.l battle_render.pending_transfer_mask + bit #1 + beq _no_transfer + and #0xfe +.if SMART { + rep #0x20 + asl + asl + asl + asl + pha + clc + adc.w #0xb000 + lsr + tay + pla + clc + adc.w #battle_render.buffer_ptr + tax + sep #0x20 +} + ldy.w #0xb000 >> 1 + ldx.w #battle_render.buffer_ptr + phx + .if SMART{ + ldx.w #0x400 + } else { + ldx.w #0xc00 + } + stx 0x0e + plx + lda #0x70 + jsr.w _sram_dma_transfer_7 + lda #0x00 + sta.l battle_render.pending_transfer_mask +_no_transfer: + ply + plx + pla jsr.l 0x03fe03 rtl + +_sram_dma_transfer_7: + phb + pha + lda #0x00 + pha + plb + pla + sty 0x2116 + stx 0x4372 + sta 0x4374 + lda #0x01 + sta 0x4370 + lda #0x18 + sta 0x4371 + ldx.b 0x0e + stx 0x4375 + lda #1 << 7 + sta 0x420b + plb + rts + +new_line_escape_code_handler: + ; we might have something of interest in Y we might know where we are in the previous iteration ? + pha + ;jsr.w battle_render.tilemap_write + jsr.w render_allocator.increment + lda #8 + sta.b battle_render.bits_left_on_tile + pla + + lda.w 0xef54 + rep #0x20 + pha + asl + clc + adc 0x32 + sta 0x32 + sta.b render.tilemap_offset + + pla + clc + adc 0x32 + sta 0x34 + + + tdc + + tay + sep #0x20 + + rtl + +; escape code $01: newline +;02/A637: AD 54 EF LDA $EF54 +;02/A63A: C2 20 REP #$20 +;02/A63C: 48 PHA +;02/A63D: 0A ASL +;02/A63E: 18 CLC +;02/A63F: 65 32 ADC $32 +;02/A641: 85 32 STA $32 +;02/A643: 68 PLA +;02/A644: 18 CLC +;02/A645: 65 32 ADC $32 +;02/A647: 85 34 STA $34 +;02/A649: 7B TDC +;02/A64A: A8 TAY +;02/A64B: E2 20 SEP #$20 +;02/A64D: 60 RTS } diff --git a/src/battle/monsters_patches.s b/src/battle/monsters_patches.s new file mode 100644 index 0000000..2dac35f --- /dev/null +++ b/src/battle/monsters_patches.s @@ -0,0 +1,33 @@ +; transform the monster names loading routine from fixed size to pointed. +*=0x02a7d7 +{ +jsr.l load_monster_pointer +_loop: + lda.l assets_monsters_long_dat, x + beq _exit + jsr.w 0xA497 ; draw text + ;jsr.w msg_monster_window_trampoline + inx + bra _loop +_exit: + rts +_end: + .debug '{_end} < 0x02A7F0 ?' +} + + +*=0x02a7c2 + jsr.l initialize_monster_slot + rts + +; escape code 0x05 tab followed by a number of chars +*=0x02A6B3 + jsr.l tab_escape_code + nop + + ; dec 0 + nop + nop + ; bne a6b3 + nop + nop \ No newline at end of file diff --git a/src/battle/monsters_reloc.s b/src/battle/monsters_reloc.s new file mode 100644 index 0000000..f8f6634 --- /dev/null +++ b/src/battle/monsters_reloc.s @@ -0,0 +1,38 @@ +load_monster_pointer: + rep #0x20 + ;lda.w #127 - 3 + asl + tax + lda.l assets_monsters_long_ptr, x + tax + tdc + sep #0x20 + phy + jsr.w initialize_monster_slot_near + ply + rtl + +initialize_monster_slot: + jsr.w initialize_monster_slot_near + rtl +tab_escape_code: + jsr.w draw_spaces + rtl +initialize_monster_slot_near: + + ; clear monster slot with spaces + lda #11 + sta 0x00 +draw_spaces: + lda.b #0xff + sta (0x32), y + sta (0x34), y + iny + lda 0x36 + sta (0x32), y + sta (0x34), y + iny + dec 0x00 + bne draw_spaces + + rts diff --git a/src/battle/sram.i b/src/battle/sram.i index 440be63..81eb706 100644 --- a/src/battle/sram.i +++ b/src/battle/sram.i @@ -19,7 +19,7 @@ sram_base = 0x707000 ply } -BATTLE_FLAGS = 0x7FFFFF +BATTLE_FLAGS = 0x704F00 .macro battle_flags_set(value) { lda.b #value ora.l BATTLE_FLAGS @@ -42,7 +42,10 @@ BATTLE_FLAGS = 0x7FFFFF .macro battle_flag_switch(jump_table) { pha phx + lda #0 + xba lda.l BATTLE_FLAGS + asl tax lda.l jump_table, x diff --git a/src/battle/sram.s b/src/battle/sram.s index 7b39188..7157650 100644 --- a/src/battle/sram.s +++ b/src/battle/sram.s @@ -123,4 +123,35 @@ battle_flags_jump_table: sink: rtl +clear_names_window_buffer: + phx + phy + rep #0x20 + ldy.w #0 + ldx.w 0xef52 + _clear_name_loop: + lda.w #0x00ff + sta.l 0x7e0000, x + sta.l 0x7e0002, x + sta.l 0x7e0004, x + sta.l 0x7e0006, x + sta.l 0x7e0008, x + sta.l 0x7e000a, x + + txa + clc + adc.w #6 *2 + tax + iny + tya + cmp.w # 5 *2 + bne _clear_name_loop + + + sep #0x20 + ply + plx + tdc + sta 0x74FC, y + rtl \ No newline at end of file diff --git a/src/battle/sram_patches.s b/src/battle/sram_patches.s index f3193bc..eb6ab30 100644 --- a/src/battle/sram_patches.s +++ b/src/battle/sram_patches.s @@ -51,11 +51,56 @@ bcs 0x02A4AC *=0x02c99c + 4 .dw attack_names -;; monster names vwf try but being clear at every monster -;; needs a way to have immortal renders and temporary ones (used only for a few instants) -;*=0x02a409 -; jsr.w msg_window_draw_text_trampoline -; + + + + +; disable menu forced update every loop that might be too much +;*=0x028230 +; nop +; nop +; nop +.if BATTLE_MONSTERS_VWF { + ;; monster names vwf try but being clear at every monster + ;; needs a way to have immortal renders and temporary ones (used only for a few instants) + *=0x02a40d + jsr.w msg_monster_window_trampoline + + *=0x029486 + 12 + .dw 0x949a ; noop for monster names +} + + +.if BATTLE_NAMES_VWF { + ; this gets redrawn quite often + ; char names + *=0x02A29D + jsr.w msg_names_window_trampoline + ; wait frame runs a shite load of updates + *=0x029486 + 2 + .dw 0x949a ; noop for char names + + *=0x0296c0 + .dw 0x949a ; noop for periodic names update + + *=0x0296b0 + 16 + .dw 0x949a ; noop for periodic names update + + *=0x02A299 + jsr.l clear_names_window_buffer +} +; that's battle graphics 0xf that's a wait frame +;*=0x028517 +; nop +; nop +; nop +; nop + + +; disable periodic updates +;*=0x0296fa +; rts + ;; render attack names ;*=0x029d63 ; jsr.w msg_window_draw_text_trampoline @@ -64,20 +109,71 @@ bcs 0x02A4AC ;*=0x038229 ; jsr.l render_allocator.init_battle_far +.if BATTLE_NAMES_VWF + BATTLE_MONSTERS_VWF + BATTLE_CMD_VWF > 0 { + ;patches the newline control code handler to clear bitsleft on the current tile, allowing the monster string to be rendered. + *=0x02a637 + jsr.l messages_vwf.new_line_escape_code_handler + rts +} + + +.if BATTLE_CMD_VWF { + *=0x0296b0 + 2 + .dw 0x949a ; noop for periodic cmd window + + ;*=0x029CBF + ; jsr.l draw_command_list_for_character + ; rts + + ; nukes the draw all command list (pre renders all the windows) + *=0x029ca1 + rts + + ; always use the same buffer for all chars command list, + ; the buffer shall be updated if before the window is opened + ; due to those updates being quite costly now, we may want to avoid to re render too often + + *=0x0299f1 + pha + lda #0 + nop + + *=0x029989 + jsr.w draw_window_render_hook + +} + + *=0x02FFC2 -;sram_draw_text: -; jsr.l battle_flags.set_sram_copy -; jsr 0xA455 -; jsr.l battle_flags.clear_sram_copy -; rts +draw_window_render_hook: + jsr.w draw_command_list + ldx.w #0x0340 + rts +draw_command_list: + jsr.l draw_command_list_for_character + rts +msg_monster_window_trampoline: + jsr.l messages_vwf.init_monsters + bra _draw_text_battle +msg_names_window_trampoline: + jsr.l messages_vwf.init_names + bra _draw_text_battle msg_window_draw_text_trampoline: jsr.l messages_vwf.init +_draw_text_battle: jsr 0xA455 jsr.l messages_vwf.deinit rts +_draw_text_battle_far: + jsr.w _draw_text_battle + rtl attack_names: jsr.l messages_vwf.init jsr 0xcb32 jsr.l messages_vwf.deinit rts +{ +_end: +.debug '{_end} < 0x02FFFF ?' +} diff --git a/src/ingame/main.s b/src/ingame/main.s index 7acf8f0..139bc8b 100644 --- a/src/ingame/main.s +++ b/src/ingame/main.s @@ -83,7 +83,7 @@ end: *=0x0189b9 ; Level offset - adc.w #0x0044 + adc.w #0x0044 - 2 *=0x018a03 draw_hp_mp = 0x018a2a diff --git a/src/ingame/options.s b/src/ingame/options.s index 9c8ebb0..9ff6e2e 100644 --- a/src/ingame/options.s +++ b/src/ingame/options.s @@ -20,15 +20,11 @@ *=0x01D1A4 load_system_menu_text_pointer(options.config) - ;jsr.w draw_window_and_vwf_message - ; move controls title window *=0x01E204 - .db 0x50 - .db 0x00 - .db 0x0B - .db 0x02 + menu_window(4, 0, 22, 2) + *=0x01D487 ldy.w #0xE204 diff --git a/src/libmz.i b/src/libmz.i index 5157cb2..bbe88b9 100644 --- a/src/libmz.i +++ b/src/libmz.i @@ -134,4 +134,7 @@ return_addr: .for k := 0, count { .dw value } +} +.macro zero(count) { + fill_value(0, count) } \ No newline at end of file diff --git a/src/menus/in_game_text.s b/src/menus/in_game_text.s index fecf4a6..cc0e771 100644 --- a/src/menus/in_game_text.s +++ b/src/menus/in_game_text.s @@ -237,8 +237,8 @@ config: controls: - .dw 0x0092 - .text 'Personaliser' + move_to(5, 1) + .text 'Contrôles Personalisés' .db 0x01 .dw 0x0204 diff --git a/src/small_vwf/item_description.s b/src/small_vwf/item_description.s index e24f640..dc8ccb7 100644 --- a/src/small_vwf/item_description.s +++ b/src/small_vwf/item_description.s @@ -111,7 +111,9 @@ _reset_render: _transfer_item_description: - jsr.w wait_for_vblank - dma_transfer_to_vram_call(render.buffer_ptr, 0x5000>>1, render.buffer_size, 0x1801) + jsr.w wait_for_vblank + ; we could reduce the transfer size to the size of the string + dma_transfer_to_vram_call(render.buffer_ptr, 0x5000>>1, render.buffer_size, 0x1801) + ; use of the menu engine built in dma transfer in NMI rts } diff --git a/src/small_vwf/render.s b/src/small_vwf/render.s index 325e14c..c3453c4 100644 --- a/src/small_vwf/render.s +++ b/src/small_vwf/render.s @@ -106,6 +106,12 @@ _transfer_to_vram: .scope render_allocator { allocated_tile_id = 0x702F00 + +; tile_id in A +init_with_tile_id: + sta.l allocated_tile_id + rts + init: pha lda.b #0x00 @@ -136,7 +142,7 @@ get: .scope render { ; variables -__var_base = 0x00 +__var_base = 0x63 bits_left_on_tile = __var_base + 0x10 temp = bits_left_on_tile + 1 counter = temp + 1 @@ -263,6 +269,59 @@ _read_8x8_char: xba bra _store +_shift: + ; PPU multiplication is being used by the NMI which wrecks char lines once in a while + phx + lda.l font_ptr, x + ; bne _really_shift + ; inx + ; xba + ; bra _skip_empty_pixel_line +_really_shift: + xba + lda #0x00 + xba + + ; make jump_table_pointer + pha + lda.b bits_left_on_tile + asl + tax + pla + + rep #0x20 + jmp.w (_mul_table, x) +_mul_table: + .dw _mul_0 + .dw _mul_1 + .dw _mul_2 + .dw _mul_3 + .dw _mul_4 + .dw _mul_5 + .dw _mul_6 + .dw _mul_7 + .dw _mul_8 + +_mul_8: +_mul_7: + asl ; 1 +_mul_6: + asl ; 2 +_mul_5: + asl ; 3 +_mul_4: + asl ; 4 +_mul_3: + asl ; 5 +_mul_2: + asl ; 6 +_mul_1: + asl ; 7 +_mul_0: + sep #0x20 + plx + inx +.if 0 { _shift: ; expects bitsleft in A phx @@ -273,7 +332,11 @@ _shift: plx lda.l font_ptr, x - + bne _really_shift + inx + xba + bra _skip_empty_pixel_line +_really_shift: inx sta.l 0x004203 ; MULTIPLICAND @@ -285,7 +348,7 @@ _shift: nop lda.l 0x004216 ; the result is stored in 0x4216-0x4217 sep #0x20 - +} _store: xba @@ -298,6 +361,7 @@ _store: sta.l buffer_ptr + 0x10 + 1, x txy plx +_skip_empty_pixel_line: iny iny dec.b counter diff --git a/src/vwf.s b/src/vwf.s index 4049b71..24a10a0 100644 --- a/src/vwf.s +++ b/src/vwf.s @@ -876,6 +876,7 @@ wait_key_down: lda.l 0x000602 bit #ACTION_BUTTON ; Action button bne exit + wai bra wait_key_down exit: rts @@ -897,7 +898,7 @@ waitpad: nowaitpad: - lda.b #0x20 + lda.b #0x30 { loop: jsr.w wait_for_vblank @@ -983,6 +984,10 @@ window: CMP #0xFF BEQ no_char_wait WAI ;wait for interrupts + lda.b no_wait_for_action ; add extra wait when in "story telling". + beq no_char_wait + jsr.w wait_for_vblank + jsr.w wait_for_vblank no_char_wait: } RTS From bf41e3355952c5da12c30e18f2c90d983546a702 Mon Sep 17 00:00:00 2001 From: Emmanuel Peralta Date: Mon, 6 Oct 2025 14:24:09 +0200 Subject: [PATCH 63/63] Remove english in game text for now. --- ff4.s | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ff4.s b/ff4.s index 9e33640..072786f 100644 --- a/ff4.s +++ b/ff4.s @@ -129,16 +129,11 @@ _loop: .include 'src/system_menus_text.s' .include 'src/dakuten.s' - .if 1 { ; menu text scopes .include 'src/menus/start_screen_text.s' .include 'src/menus/tools_shop_text.s' .include 'src/menus/in_game_text.s' -} else { - .include 'src/menus/start_screen_text_en.s' - .include 'src/menus/tools_shop_text_en.s' - .include 'src/menus/in_game_text_en.s' -} + .incbin 'assets/attack_names.ptr' .incbin 'assets/attack_names.dat' .incbin 'assets/monsters_long.ptr'