Recover pt quest/script files lost in the #55 flip - #61
Conversation
The in-place flip's RemoveAbsorbedSourceFiles deleted pt's questdescription_*/ scriptquest_* fragments even though pt has no combined questdescription_final.json/ scriptquest.json to replace them (the bug fixed in #60), so the data was lost. Restores the 29 files from 3b7ec8a (last commit before #55): ~5,864 quest entries, of which 4,755 are real Portuguese translations. Verified: they parse as valid XML, and with the #60 fix in place a full json-to-xml-all no longer deletes them (pt has no combined output). verify-all passes. Other locales (en/cn/jp/kr) are not affected — their fragments were correctly absorbed into the committed combined outputs, so their data is preserved. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (29)
👮 Files not reviewed due to content moderation or server errors (1)
📝 WalkthroughWalkthroughAdds Portuguese XML localization resources for quest descriptions and scripted dialogue across daily, epic, event, FameContents, guild, world, guide, item, tutorial, and related content categories. ChangesPortuguese quest descriptions
Portuguese scripted dialogue
Estimated code review effort: 5 (Critical) | ~120 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 11
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Xml/string/pt/questdescription_famecontents.xml`:
- Line 125: Correct the dynamic IDs in the quest entries: update quest
91000520’s descFameUI to use $npcName:23000301$, and update the dungeonTitle
reference on line 139 from $dungeonTitle:230410031$ to $dungeonTitle:23041003$
to match the corresponding objectives.
In `@Xml/string/pt/questdescription_guide.xml`:
- Line 77: Update the desc attribute of quest 90000442 to reference NPC
11001629, matching the existing manual and complete objectives; leave all other
quest attributes unchanged.
In `@Xml/string/pt/questdescription_guild.xml`:
- Around line 4-5: Close every encoded bold tag in the affected quest
descriptions by adding the matching </b> after each requirement text
beginning with <b>, including quest entries 73000002 and 73000003 and all
similarly affected neighboring rows. Preserve the existing Portuguese text and
XML encoding.
In `@Xml/string/pt/questdescription_tutorial.xml`:
- Line 25: Correct the malformed item token in quest 10001330’s desc attribute
by adding the missing opening dollar sign before item:30000054$, preserving the
rest of the quest text unchanged.
In `@Xml/string/pt/questdescription_world.xml`:
- Line 509: Update quest 30000032’s references to match its objectives: change
the description’s target NPC from 23100006 to 23000006, and change the map
reference at the related entry around line 582 from 02000347 to 02000348,
preserving the existing quest text and formatting.
- Line 709: In the quest entry identified by questID 40001820, correct the
inline markup in the desc attribute by replacing the mismatched closing font tag
after “seis” with the matching italic closing tag, while preserving the
surrounding text.
- Around line 293-294: Update the manual attribute of quest 20001001 to use item
placeholder ID 20000055 instead of 020000055, matching the item ID used in the
quest description and the surrounding quest chain.
In `@Xml/string/pt/scriptquest_famemission.xml`:
- Line 4653: Update the embedded font markup in key 1228173721028574 so the
color value uses the same quoted attribute format as sibling notices, preserving
the existing `#909090` color and message text.
In `@Xml/string/pt/scriptquest_guide.xml`:
- Around line 411-412: Correct the Portuguese sentence in both entries
identified by keys 1204024704000421 and 1124232104000373 by adding the missing
subject after “Mesmo que”, while keeping the remainder of the dialogue
unchanged.
- Line 220: Update the affected dialogue name attributes identified by keys at
lines 220, 472, 1024, and 1111: replace the invalid `#pp2` color token with the
intended valid color token, and remove stray closing </font> or </b> markup from
the attribute values while preserving the intended inline formatting and XML
validity.
In `@Xml/string/pt/scriptquest_world.xml`:
- Line 2107: Clean up the specified restored PT dialogue entries in the string
data: fix the mismatched closing tag for 0831175903000320, remove the editorial
prefix from 0831175903000891, remove orphan or misplaced italic markup in
1228034903001929 and 1228034903002016, and correct the malformed bold markup in
0831175903000124. Preserve the intended dialogue text while ensuring all
rendered rich-text tags are valid and balanced.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: aa27d2d7-e3d3-4662-9b8b-65b326768b79
📒 Files selected for processing (29)
Xml/string/pt/questdescription_dailymission.xmlXml/string/pt/questdescription_epic.xmlXml/string/pt/questdescription_eventcn.xmlXml/string/pt/questdescription_eventcommon.xmlXml/string/pt/questdescription_eventkr.xmlXml/string/pt/questdescription_eventna.xmlXml/string/pt/questdescription_famecontents.xmlXml/string/pt/questdescription_famefield .xmlXml/string/pt/questdescription_famemission.xmlXml/string/pt/questdescription_field.xmlXml/string/pt/questdescription_guide.xmlXml/string/pt/questdescription_guild.xmlXml/string/pt/questdescription_item.xmlXml/string/pt/questdescription_levelguide.xmlXml/string/pt/questdescription_mentoring.xmlXml/string/pt/questdescription_tutorial.xmlXml/string/pt/questdescription_wedding.xmlXml/string/pt/questdescription_world.xmlXml/string/pt/scriptquest_epic.xmlXml/string/pt/scriptquest_eventcommon.xmlXml/string/pt/scriptquest_eventna.xmlXml/string/pt/scriptquest_famecontents.xmlXml/string/pt/scriptquest_famefield.xmlXml/string/pt/scriptquest_famemission.xmlXml/string/pt/scriptquest_guide.xmlXml/string/pt/scriptquest_guild.xmlXml/string/pt/scriptquest_item.xmlXml/string/pt/scriptquest_tutorial.xmlXml/string/pt/scriptquest_world.xml
👮 Files not reviewed due to content moderation or server errors (1)
- Xml/string/pt/scriptquest_epic.xml
| <quest questID="91000490" name="Vendo Fantasmas" desc="Até você descobrir quais são as habilidades do seu novo inimigo, é muito arriscado enfrentá-lo. Volte ao QG da Aliança para definir qual será a sua próxima missão." manual="" complete="Fale com o $npcName:11004316$ em $map:02020041$" count="" feature="Kritias_2018_12" locale="" locking="0" descFameUI="Volte a $map:02020041$ para ver quais são suas opções" /> | ||
| <quest questID="91000500" name="O Preço do Poder" desc="O $npcName:11004316$ fala que invocou o Olho do Destino para descobrir a localização do $npcName:23000301$. 

Parece que você deve ir para a $map:02020032$." manual="" complete='Aperte o botão "Encerrar"' count="" feature="Kritias_2018_12" locale="" locking="0" descFameUI="O $npcName:11004316$ fala que invocou o Olho do Destino para descobrir a localização do $npcName:23000301$. 

Parece que você deve ir para a $map:02020032$." /> | ||
| <quest questID="91000510" name="O Preço do Poder" desc='Você levou o "Detector de Ondas das Trevas" da Nairin para a $map:02020032$ com a esperança de conseguir rastrear o $npcName:23000301$, mas parece que o aparelho quebrou. Enquanto espera os reparos, diminua o Exército Daemon.

Derrote os $npcNamePlural:25020701$, os $npcNamePlural:25020702$ e os $npcNamePlural:25020703$ na $map:02020032$.' manual="Derrote os $npcNamePlural:25020701$, os $npcNamePlural:25020702$ e os $npcNamePlural:25020703$." complete='Aperte o botão "Encerrar"' count="1" feature="Kritias_2018_12" locale="" locking="0" descFameUI="Enquanto espera notícias do $npcName:11004316$, diminua o número dos Soldados dos Daemons na região." /> | ||
| <quest questID="91000520" name="O Preço do Poder" desc="Como não é possível consertar o Detector de Ondas das Trevas, o $npcName:11004316$ invocou mais uma vez o Olho do Destino para encontrar o $npcName:23000301$. 

Parece que o seu próximo destino é o $map:02020016$." manual="" complete='Aperte o botão "Encerrar"' count="" feature="Kritias_2018_12" locale="" locking="0" descFameUI="O $npcName:23000130$ foi localizado no $map:02020016$. Vá para lá imediatamente." /> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Correct the inconsistent dynamic IDs.
- Line 125 references
$npcName:23000130$indescFameUI, while the quest description and surrounding chain use$npcName:23000301$. - Line 139 uses
$dungeonTitle:230410031$, but the corresponding objectives use$dungeonTitle:23041003$.
Proposed fixes
- $npcName:23000130$ foi localizado
+ $npcName:23000301$ foi localizado
- $dungeonTitle:230410031$
+ $dungeonTitle:23041003$Also applies to: 139-139
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Xml/string/pt/questdescription_famecontents.xml` at line 125, Correct the
dynamic IDs in the quest entries: update quest 91000520’s descFameUI to use
$npcName:23000301$, and update the dungeonTitle reference on line 139 from
$dungeonTitle:230410031$ to $dungeonTitle:23041003$ to match the corresponding
objectives.
| <quest questID="90000439" name="Uma Lição sobre Confiança" desc="Após desmaiar no meio da sua luta, você aprende da pior maneira que aceitar bebidas de pessoas suspeitas, como o chefe do crime $npc:11001629$, pode não ser uma boa ideia.

Volte para o $map:63000019$ e confronte $npc:11001629$." manual="Fale com $npc:11001629$ no $map:63000019$" complete="Confronte $npc:11001629$ no $map:63000019$" count="0" feature="Striker" locale="" locking="0" /> | ||
| <quest questID="90000440" name="O que é Justo é Justo" desc="Não está claro como as coisas chegaram a esse ponto, mas você acabou tendo que trabalhar para o seu pior inimigo, $npc:11001629$. Ele tem um serviço para você, que envolve a Imperatriz e $map:02000001$.

Para mais informações sobre o serviço, fale com seus encarregados no $map:63000023$." manual="Viaje até o $map:63000023$" complete="Fale com seus encarregados no $map:63000023$" count="0" feature="Striker" locale="" locking="0" /> | ||
| <quest questID="90000441" name="Porto de Lith" desc="Acabou que seus novos encarregados são $npc:11001545$ e $npc:11001546$, que você conheceu na sede da Estrela Negra.

De acordo com $npcName:11001631$, a organização está planejando vender mercadorias no evento da Imperatriz por muito dinheiro e é seu trabalho defender o carregamento.

Você não gosta de ajudar bandidos, mas agora está difícil enxergar outra opção. Entre no carro e viaje até o $map:02000062$." manual="Viaje até o $map:02000062$" complete="Fale com $npcName:11003180$" count="0" feature="Striker" locale="" locking="0" /> | ||
| <quest questID="90000442" name="Suco ou Algo do Tipo" desc="Você tomou a bebida que pegou com a $npc:11001624$. É melhor falar com $npc:11001623$." manual="Diga a $npc:11001629$ o que achou da bebida" complete="Diga a $npc:11001629$ o que achou da bebida" count="0" feature="Striker" locale="" locking="0" /> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Locate and inspect the referenced XML file and matching quest object.
fd -a 'questdescription_guide.xml' . || true
if [ -f "Xml/string/pt/questdescription_guide.xml" ]; then
echo '--- target line ---'
nl -ba "Xml/string/pt/questdescription_guide.xml" | sed -n '70,82p'
echo '--- quest references ---'
rg -n 'questID="90000442"|<quest questID="90000442"|1100162(3|4|9)|Suco ou Algo do Tipo' "Xml/string/pt/questdescription_guide.xml" "Xml" || true
fiRepository: MS2Community/MapleStory2-XML
Length of output: 346
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo '--- target line and surrounding context ---'
awk 'NR>=70 && NR<=82 { printf "%6d\t%s\n", NR, $0 }' "Xml/string/pt/questdescription_guide.xml"
echo '--- quest and NPC references in target file ---'
grep -nE 'questID="90000442"|1100162(3|4|9)|Suco ou Algo do Tipo' "Xml/string/pt/questdescription_guide.xml" || true
echo '--- matching quest definition in quest files ---'
find Xml -type f \( -name '*.xml' \) -exec grep -l '90000442' {} \; | while read -r f; do
echo "### $f"
grep -nE '90000442|1100162(3|4|9)|Suco ou Algo do Tipo|Sucos ou Algo do Tipo' "$f" || true
doneRepository: MS2Community/MapleStory2-XML
Length of output: 158
🏁 Script executed:
#!/bin/bash
set -u
shopt -s nullglob
echo '--- target file line count ---'
wc -l "Xml/string/pt/questdescription_guide.xml"
echo '--- target line and surrounding context ---'
awk 'NR>=70 && NR<=82 { printf "%6d\t%s\n", NR, $0 }' "Xml/string/pt/questdescription_guide.xml"
echo '--- quest/objective NPC references in target file ---'
grep -n -E 'questID="90000442"|npc:1100162(3|4|9)|Suco ou Algo do Tipo' "Xml/string/pt/questdescription_guide.xml" || true
echo '--- files mentioning quest 90000442 ---'
mapfile -t files < <(grep -Rl -E '90000442' Xml 2>/dev/null | head -50)
for f in "${files[@]}"; do
echo "### $f"
grep -n -E '90000442|npc:1100162(3|4|9)|Suco ou Algo do Tipo' "$f" || true
doneRepository: MS2Community/MapleStory2-XML
Length of output: 7659
Align the description with the reported NPC.
Quest 90000442’s objectives are to tell $npc:11001629$ how the drink was, but desc currently sends the player to $npc:11001623$. Update the description to match the objective NPC.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Xml/string/pt/questdescription_guide.xml` at line 77, Update the desc
attribute of quest 90000442 to reference NPC 11001629, matching the existing
manual and complete objectives; leave all other quest attributes unchanged.
| <quest questID="73000002" name="Mundo Maple em Harmonia!" desc="Derrote monstros mecânicos <b>(Requer pelo menos 3 membros da guilda)

$npcName:11200005$ lhe deu uma missão de guilda. Forme uma equipe com pelo menos 3 membros da guilda e derrote monstros mecânicos." manual="Derrote inimigos do tipo máquina junto com membros de sua guilda" complete="Fale com $npcName:11200005$ na sede de sua guilda" count="1" feature="Season1" locale="" locking="0" /> | ||
| <quest questID="73000003" name="Mundo Maple em Harmonia!" desc="Derrote monstros insetos <b>(Requer pelo menos 3 membros da guilda)

$npcName:11200005$ lhe deu uma missão de guilda. Forme uma equipe com pelo menos 3 membros da guilda e derrote monstros insetos." manual="Derrote monstros insetos junto com membros de sua guilda" complete="Fale com $npcName:11200005$ na sede de sua guilda" count="1" feature="Season1" locale="" locking="0" /> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Close the encoded <b> tags in these descriptions.
These rows contain <b> without the matching </b>, unlike the neighboring entries. After decoding, the requirement text may leave the rest of the quest description bold or produce inconsistent rich-text rendering.
Proposed fix pattern
- ... <b>(Requer pelo menos 3 membros da guilda)&`#x0A`;
+ ... <b>(Requer pelo menos 3 membros da guilda)</b>&`#x0A`;Also applies to: 8-11, 13-13, 15-22, 24-25, 28-31, 33-33, 35-42
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Xml/string/pt/questdescription_guild.xml` around lines 4 - 5, Close every
encoded bold tag in the affected quest descriptions by adding the matching
</b> after each requirement text beginning with <b>, including quest
entries 73000002 and 73000003 and all similarly affected neighboring rows.
Preserve the existing Portuguese text and XML encoding.
| <quest questID="10001121" name="Unusual Circumstances" desc="Poor $npc:11000118$…
She needs some assistance after injuring her hand. Someone needs to help her harvest the clams that hold pearls in $map:63000002$!
Start searching for $item:30000008$!" manual="Collect $item:30000008$ in $map:63000002$" complete="Meet $npc:11000118$ at $map:63000002$" count="1" locale="" locking="1" /> | ||
| <quest questID="10001130" name="O Turtle! My Turtle!" desc="$npc:11000053$ made a request to bring $item:20000013$, which is located at Turtle Hill where $npc:22300149$ appears.
It's not going to be easy...but nothing worthwhile ever is, right?" manual="Save $item:20000013$ in $map:63000002$" complete="Meet $npc:11000053$ at $map:63000002$" count="1" locale="" locking="1" /> | ||
| <quest questID="10001140" name="Leaving Lith Harbor" desc="Are there not enough ships because so many people are trying to go to $map:02000062$? 
If that's the case, it'll probably be best to go to $map:63000002$ port and speak with $npc:11000016$ personally to see if a ship is available." manual="" complete="Meet $npc:11000016$ the oarsman at $map:63000002$" count="" locale="" locking="1" /> | ||
| <quest questID="10001330" name="The Fates That Bind Us" desc="I met $npc:11000110$ again in Victoria Island and he made another request. I don't hesitate to help those who I've only met once, so there's no reason why I can't help someone I've known since Maple Island.
Let's defeat the monsters in the grass underneath the $map:02000114$ bridge, and find item:30000054$ that $npc:11000110$ lost." manual="Defeat the monsters in $map:02000114$ and recover $item:30000054$" complete="Meet $npc:11000110$ at $map:02000114$" count="1" locale="" locking="1" /> |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Fix the malformed item token.
item:30000054$ is missing the opening $, so the item reference cannot be resolved.
Proposed fix
- ... find item:30000054$ that ...
+ ... find $item:30000054$ that ...📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <quest questID="10001330" name="The Fates That Bind Us" desc="I met $npc:11000110$ again in Victoria Island and he made another request. I don't hesitate to help those who I've only met once, so there's no reason why I can't help someone I've known since Maple Island.
Let's defeat the monsters in the grass underneath the $map:02000114$ bridge, and find item:30000054$ that $npc:11000110$ lost." manual="Defeat the monsters in $map:02000114$ and recover $item:30000054$" complete="Meet $npc:11000110$ at $map:02000114$" count="1" locale="" locking="1" /> | |
| <quest questID="10001330" name="The Fates That Bind Us" desc="I met $npc:11000110$ again in Victoria Island and he made another request. I don't hesitate to help those who I've only met once, so there's no reason why I can't help someone I've known since Maple Island.&`#x0A`;Let's defeat the monsters in the grass underneath the $map:02000114$ bridge, and find $item:30000054$ that $npc:11000110$ lost." manual="Defeat the monsters in $map:02000114$ and recover $item:30000054$" complete="Meet $npc:11000110$ at $map:02000114$" count="1" locale="" locking="1" /> |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Xml/string/pt/questdescription_tutorial.xml` at line 25, Correct the
malformed item token in quest 10001330’s desc attribute by adding the missing
opening dollar sign before item:30000054$, preserving the rest of the quest text
unchanged.
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 11
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Xml/string/pt/questdescription_famecontents.xml`:
- Line 125: Correct the dynamic IDs in the quest entries: update quest
91000520’s descFameUI to use $npcName:23000301$, and update the dungeonTitle
reference on line 139 from $dungeonTitle:230410031$ to $dungeonTitle:23041003$
to match the corresponding objectives.
In `@Xml/string/pt/questdescription_guide.xml`:
- Line 77: Update the desc attribute of quest 90000442 to reference NPC
11001629, matching the existing manual and complete objectives; leave all other
quest attributes unchanged.
In `@Xml/string/pt/questdescription_guild.xml`:
- Around line 4-5: Close every encoded bold tag in the affected quest
descriptions by adding the matching </b> after each requirement text
beginning with <b>, including quest entries 73000002 and 73000003 and all
similarly affected neighboring rows. Preserve the existing Portuguese text and
XML encoding.
In `@Xml/string/pt/questdescription_tutorial.xml`:
- Line 25: Correct the malformed item token in quest 10001330’s desc attribute
by adding the missing opening dollar sign before item:30000054$, preserving the
rest of the quest text unchanged.
In `@Xml/string/pt/questdescription_world.xml`:
- Line 509: Update quest 30000032’s references to match its objectives: change
the description’s target NPC from 23100006 to 23000006, and change the map
reference at the related entry around line 582 from 02000347 to 02000348,
preserving the existing quest text and formatting.
- Line 709: In the quest entry identified by questID 40001820, correct the
inline markup in the desc attribute by replacing the mismatched closing font tag
after “seis” with the matching italic closing tag, while preserving the
surrounding text.
- Around line 293-294: Update the manual attribute of quest 20001001 to use item
placeholder ID 20000055 instead of 020000055, matching the item ID used in the
quest description and the surrounding quest chain.
In `@Xml/string/pt/scriptquest_famemission.xml`:
- Line 4653: Update the embedded font markup in key 1228173721028574 so the
color value uses the same quoted attribute format as sibling notices, preserving
the existing `#909090` color and message text.
In `@Xml/string/pt/scriptquest_guide.xml`:
- Around line 411-412: Correct the Portuguese sentence in both entries
identified by keys 1204024704000421 and 1124232104000373 by adding the missing
subject after “Mesmo que”, while keeping the remainder of the dialogue
unchanged.
- Line 220: Update the affected dialogue name attributes identified by keys at
lines 220, 472, 1024, and 1111: replace the invalid `#pp2` color token with the
intended valid color token, and remove stray closing </font> or </b> markup from
the attribute values while preserving the intended inline formatting and XML
validity.
In `@Xml/string/pt/scriptquest_world.xml`:
- Line 2107: Clean up the specified restored PT dialogue entries in the string
data: fix the mismatched closing tag for 0831175903000320, remove the editorial
prefix from 0831175903000891, remove orphan or misplaced italic markup in
1228034903001929 and 1228034903002016, and correct the malformed bold markup in
0831175903000124. Preserve the intended dialogue text while ensuring all
rendered rich-text tags are valid and balanced.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: aa27d2d7-e3d3-4662-9b8b-65b326768b79
📒 Files selected for processing (29)
Xml/string/pt/questdescription_dailymission.xmlXml/string/pt/questdescription_epic.xmlXml/string/pt/questdescription_eventcn.xmlXml/string/pt/questdescription_eventcommon.xmlXml/string/pt/questdescription_eventkr.xmlXml/string/pt/questdescription_eventna.xmlXml/string/pt/questdescription_famecontents.xmlXml/string/pt/questdescription_famefield .xmlXml/string/pt/questdescription_famemission.xmlXml/string/pt/questdescription_field.xmlXml/string/pt/questdescription_guide.xmlXml/string/pt/questdescription_guild.xmlXml/string/pt/questdescription_item.xmlXml/string/pt/questdescription_levelguide.xmlXml/string/pt/questdescription_mentoring.xmlXml/string/pt/questdescription_tutorial.xmlXml/string/pt/questdescription_wedding.xmlXml/string/pt/questdescription_world.xmlXml/string/pt/scriptquest_epic.xmlXml/string/pt/scriptquest_eventcommon.xmlXml/string/pt/scriptquest_eventna.xmlXml/string/pt/scriptquest_famecontents.xmlXml/string/pt/scriptquest_famefield.xmlXml/string/pt/scriptquest_famemission.xmlXml/string/pt/scriptquest_guide.xmlXml/string/pt/scriptquest_guild.xmlXml/string/pt/scriptquest_item.xmlXml/string/pt/scriptquest_tutorial.xmlXml/string/pt/scriptquest_world.xml
👮 Files not reviewed due to content moderation or server errors (1)
- Xml/string/pt/scriptquest_epic.xml
🛑 Comments failed to post (7)
Xml/string/pt/questdescription_world.xml (3)
293-294: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Use the correct item placeholder ID.
020000055has an extra leading zero; the same quest chain uses20000055on Lines 291-292. Keep the item ID consistent so the item reference resolves correctly.Proposed fix
- $item:020000055$ + $item:20000055$ - $itemPlural:020000055$ + $itemPlural:20000055$🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Xml/string/pt/questdescription_world.xml` around lines 293 - 294, Update the manual attribute of quest 20001001 to use item placeholder ID 20000055 instead of 020000055, matching the item ID used in the quest description and the surrounding quest chain.
509-509: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Keep quest references consistent with their objectives.
- Line 509 uses
$npc:23100006$in the description but$npc:23000006$incomplete.- Line 582 points to
$map:02000347$, while the quest title/manual reference$map:02000348$.Proposed fixes
- complete="Find $npc:23000006$'s tracks at $map:02000183$" + complete="Find $npc:23100006$'s tracks at $map:02000183$" - ... go to $map:02000347$ ... + ... go to $map:02000348$ ...Also applies to: 582-582
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Xml/string/pt/questdescription_world.xml` at line 509, Update quest 30000032’s references to match its objectives: change the description’s target NPC from 23100006 to 23000006, and change the map reference at the related entry around line 582 from 02000347 to 02000348, preserving the existing quest text and formatting.
709-709: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Close the inline tag with the matching element.
The text uses
<i>seis</font>; close it with</i>instead.Proposed fix
- <i>seis</font> + <i>seis</i>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.<quest questID="40001820" name="As Ruas desta Cidade" desc="Ao viajar com os Allicari, $npcName:11001181$ teve muitas experiências e viu um monte de coisas estranhas desde muito jovem. Ele diz que perder seu rumo em uma cidade pode apagar suas frustrações e tristezas. Imagine o quão efetivo seria perder seu rumo em <i>seis</i> cidades!" manual="Visite $map:02000001$ |Visite a $map:02000100$ |Visite a $map:02000076$ |Visite a $map:02000023$ |Visite a $map:02000051$ |Visite a $map:02000270$ " complete="Fale com $npcName:11001181$ na $map:02000064$ " count="1|1|1|1|1|1" locale="" locking="1" />🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Xml/string/pt/questdescription_world.xml` at line 709, In the quest entry identified by questID 40001820, correct the inline markup in the desc attribute by replacing the mismatched closing font tag after “seis” with the matching italic closing tag, while preserving the surrounding text.Xml/string/pt/scriptquest_famemission.xml (1)
4653-4653: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Unquoted
colorattribute inside embedded markup, inconsistent with sibling notices.
<font color=#909090>is missing quotes around the color value. Several nearly-identical "missão semanal ... [Especial]" notice strings elsewhere in this same file (e.g. the Primeira/Segunda Legião and Batalha de Legião notices) consistently use<font color="#909090">. This one entry is the outlier and may not render the intended text color in-game.🎨 Proposed fix
- <key id="1228173721028574" feature="Kritias_2018_12" locale="" npc="블리체" name="Detenha aquele monstro antes que cause ainda mais danos!&`#x0A`;<font color=`#909090`>(Assim que você aceitar essa missão, não poderá começar nenhuma outra missão semanal da Gigântica [Especial] até o início da semana seguinte.)</font>" /> + <key id="1228173721028574" feature="Kritias_2018_12" locale="" npc="블리체" name="Detenha aquele monstro antes que cause ainda mais danos!&`#x0A`;<font color="`#909090`">(Assim que você aceitar essa missão, não poderá começar nenhuma outra missão semanal da Gigântica [Especial] até o início da semana seguinte.)</font>" />📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.<key id="1228173721028574" feature="Kritias_2018_12" locale="" npc="블리체" name="Detenha aquele monstro antes que cause ainda mais danos!&`#x0A`;<font color="`#909090`">(Assim que você aceitar essa missão, não poderá começar nenhuma outra missão semanal da Gigântica [Especial] até o início da semana seguinte.)</font>" />🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Xml/string/pt/scriptquest_famemission.xml` at line 4653, Update the embedded font markup in key 1228173721028574 so the color value uses the same quoted attribute format as sibling notices, preserving the existing `#909090` color and message text.Xml/string/pt/scriptquest_guide.xml (2)
220-220: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -euo pipefail echo "== location/context ==" sed -n '210,225p' Xml/string/pt/scriptquest_guide.xml 2>/dev/null || true sed -n '468,478p' Xml/string/pt/scriptquest_guide.xml 2>/dev/null || true sed -n '1020,1028p' Xml/string/pt/scriptquest_guide.xml 2>/dev/null || true sed -n '1106,1116p' Xml/string/pt/scriptquest_guide.xml 2>/dev/null || true echo "== occurrences of potentially invalid close/formattings ==" python3 - <<'PY' import re, xml.etree.ElementTree as ET from pathlib import Path path = Path("Xml/string/pt/scriptquest_guide.xml") text = path.read_text(encoding="utf-8") print("invalid-looking close tags in text:", re.findall(r'</(?:font|b)>', text)) print("color invalid-looking tokens:", re.findall(r'color=[^\\>]*#[A-Za-z0-9_#%]+', text)) # check XML validity without external deps; report first mismatch if parse available try: ET.fromstring(text) print("xml.etree parsed document as well-formed XML") except Exception as e: print("xml.etree parse error:", repr(e)) for i, line in enumerate(text.splitlines(), 1): if 220 in {i} or 472 <= i <= 475 or 1024 <= i <= 1024 or 1111 <= i <= 1111: print(f"line {i}: {line.strip()}") PY echo "== search for `#pp2/formattings` usage ==" rg -n 'color="[^"]*`#pp2`"|color=\'[^\'#]*`#pp2`\'|`#pp2`|</font>|</b>' Xml/string -SRepository: MS2Community/MapleStory2-XML
Length of output: 46450
Balance the inline formatting markup.
Line [220] uses the invalid color token
#pp2, while Lines [472], [1024], and [1111] contain stray</font>/</b>tags insidenameattribute values. These pass XML validation but likely render badly in-game.Proposed cleanup
- ...<font color="`#pp2`">$skill:10400011$</font>... + ...<font color="`#ffd200`">$skill:10400011$</font>... - ...$npc:11001545[gender:0]$</font>... + ...$npc:11001545[gender:0]$... - name="Quê</b>?" + name="Quê?" - ...$item:40400001$</font>... + ...$item:40400001$...Also applies to: 472, 1024, 1111.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Xml/string/pt/scriptquest_guide.xml` at line 220, Update the affected dialogue name attributes identified by keys at lines 220, 472, 1024, and 1111: replace the invalid `#pp2` color token with the intended valid color token, and remove stray closing </font> or </b> markup from the attribute values while preserving the intended inline formatting and XML validity.
411-412: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Fix the incomplete Portuguese sentence.
Lines [411]-[412] say
Mesmo que o atrase um pouco, which is missing the subject. For example:Mesmo que isso o atrase um pouco...🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Xml/string/pt/scriptquest_guide.xml` around lines 411 - 412, Correct the Portuguese sentence in both entries identified by keys 1204024704000421 and 1124232104000373 by adding the missing subject after “Mesmo que”, while keeping the remainder of the dialogue unchanged.Xml/string/pt/scriptquest_world.xml (1)
2107-2107: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash # Check for imbalanced inline rich-text tags (<i>, <b>, <font>) per line in restored pt fragments fd -e xml . Xml/string/pt --exec awk ' { i_open = gsub(/<i>/, "<i>"); i_close = gsub(/<\/i>/, "<\/i>"); b_open = gsub(/<b>/, "<b>"); b_close = gsub(/<\/b>/, "<\/b>"); if (i_open != i_close || b_open != b_close) print FILENAME":"FNR": "$0 }' {}Repository: MS2Community/MapleStory2-XML
Length of output: 45814
🏁 Script executed:
#!/bin/bash set -u python3 - <<'PY' from pathlib import Path import xml.etree.ElementTree as ET base = Path("Xml/string/pt") files = sorted(base.glob("*.xml")) mappings = set() imbalanced = [] bad_entity_patterns = [] for path in files: try: tree = ET.parse(path) except ET.ParseError as exc: print(path, "XML_PARSE_ERROR", exc) continue for key in ("0831175903000320", "0831175903000891", "1228034903001929", "1228034903002016", "0831175903000124"): elem = tree.find(f'.//*[`@id`="{key}"]') if elem is not None: print(f"{path}:{elem.sourceline}: {key}: {elem.get('name', elem.get('value', 'key'))}") # Count unescaped < and > within the file text and attribute values for this file for e in tree.iter(): for attr in ("name", "value", "desc", "manual", "complete"): val = e.get(attr) if val is None: continue if len(val) - len(val.replace("<", "")) > 0 or len(val) - len(val.replace(">", "")) > 0: bad_entity_patterns.append((str(path), e.sourceline, attr, val[:200])) # Lightweight line-level malformed markup scan for the three exact patterns plus variant b/i closing artifact text = path.read_text() for i, line in enumerate(text.splitlines(), 1): if ("<i>Vamos lá, você consegue.</b>" in line or "</i>lt;/i</i>gt;" in line or "<b/>cruciais</b>lt;/b</b>gt;" in line or "<i>lt;i<i>gt;" in line): imbalanced.append((str(path), i, line[:240])) print("bad_entity_pattern_count", len(bad_entity_patterns)) for path, linenum, attr, val in bad_entity_patterns[:10]: print("ENTITY:", path, linenum, attr, repr(val[:120])) for path, linenum, line in imbalanced: print("MATCH:", path, linenum, line[:240]) PYRepository: MS2Community/MapleStory2-XML
Length of output: 325
🏁 Script executed:
#!/bin/bash set -u python3 - <<'PY' from pathlib import Path import xml.etree.ElementTree as ET import re base = Path("Xml/string/pt") for path in sorted(base.glob("*.xml")): try: tree = ET.parse(path) except ET.ParseError as exc: print(path, "XML_PARSE_ERROR", exc) continue # Target specific IDs target_keys = ["0831175903000320", "0831175903000891", "1228034903001929", "1228034903002016", "0831175903000124"] xml = base.joinpath("scriptquest_world.xml").read_text(encoding="utf-8").splitlines() for key in target_keys: for lineno, line in enumerate(xml, 1): if f'id="{key}"' in line: print(f"scriptquest_world.xml:{lineno}: {key}: {line.strip()}") # Lightweight text-level scan for the exact problematic patterns. mismatches = [] for path in sorted(base.glob("*.xml")): text = path.read_text(encoding="utf-8") for i, line in enumerate(text.splitlines(), 1): if ("<i>Vamos lá, você consegue.</b>" in line or "</i>lt;/i</i>gt;" in line or "<b/>cruciais</b>lt;/b</b>gt;" in line or "<i>lt;i<i>gt;" in line or "<b>lt;b<b>gt;" in line or "I'll change to O pessoal daqui" in line or "lt;<g>" in line or "<I>Fomos capazes de confirmar que alguns indivíduos receberam poderes incomuns por meio do uso de lapentitas. Ao analisar esses poderes, chegamos a uma conclusão.</i>lt;/i</i>gt;" in line): mismatches.append((str(path), i, line[:220]+("..." if len(line) > 220 else ""))) for m in mismatches: print("MISMATCH:", m[0], m[1], m[2]) # Count malformed closing markup across text; avoid relying on XML parser source lines. count = 0 for path in sorted(base.glob("*.xml")): text = path.read_text(encoding="utf-8") for pat in [r"</i>lt;/i</i>gt;", r"</b>lt;/b</b>gt;", r"<b/>"]: count += len(re.findall(pat, text)) count += text.count(r"lt;<g>") count += text.count(r"lt;/<g>gt;") count += len(re.findall(r"<(i|b|/i|/b)>lt;(?:/?(?:i|b))<(?:/?(?:i|b))>gt;", text)) print("TOTAL_MISMATCH_COUNT", count) PYRepository: MS2Community/MapleStory2-XML
Length of output: 1724
🏁 Script executed:
#!/bin/bash set -u python3 - <<'PY' from pathlib import Path import re for path in sorted(Path("Xml/string/pt").glob("*.xml")): text = path.read_text(encoding="utf-8") for pat in [r"</i>lt;/i</i>gt;", r"</b>lt;/b</b>gt;", r"<b/>"]: count = len(re.findall(pat, text)) if count: print(path, pat, count) PYRepository: MS2Community/MapleStory2-XML
Length of output: 215
Clean up malformed rich-text markup in the restored PT strings.
The targeted entries need fixes, with additional related artifacts in
Xml/string/pt/scriptquest_world.xml:
0831175903000320closes<i>with</b>.0831175903000891leaves the editorial prefixI’ll change toin the dialogue.1228034903001929has an orphan</i>before normal text.1228034903002016endsE entãowith</i>before text.0831175903000124uses stray<b/>cruciais</b>markup.Correct the actual rendered tags in these strings so the text is not left with leftover editor markup or invalid rich-text tokens.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Xml/string/pt/scriptquest_world.xml` at line 2107, Clean up the specified restored PT dialogue entries in the string data: fix the mismatched closing tag for 0831175903000320, remove the editorial prefix from 0831175903000891, remove orphan or misplaced italic markup in 1228034903001929 and 1228034903002016, and correct the malformed bold markup in 0831175903000124. Preserve the intended dialogue text while ensuring all rendered rich-text tags are valid and balanced.
Follow-up to #60. That PR stopped further loss; this restores what was already gone.
The in-place flip (#55) deleted
pt'squestdescription_*/scriptquest_*fragments even thoughpthas no combinedquestdescription_final.json/scriptquest.jsonto replace them — the bug #60 fixed. Sopt's quest data was lost entirely.Restores the 29 files from
3b7ec8a3(last commit before #55): 5,864 quest entries, 4,755 of them real Portuguese translations (the rest are KMS placeholders).Verified:
json-to-xml-allno longer deletes them (pt has no combined output → they're left in place). Confirmed before=after=29.verify-allpasses.Scope:
ptonly.en/cn/jp/krare unaffected — their fragments were correctly absorbed into the committed combined outputs, so restoring their individuals would duplicate and re-introduce untranslated-source overrides.🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.Summary by CodeRabbit