diff --git a/graphics/slot_machine/menu.png b/graphics/slot_machine/menu.png index acb7700992..46103b1748 100644 Binary files a/graphics/slot_machine/menu.png and b/graphics/slot_machine/menu.png differ diff --git a/include/config/overworld.h b/include/config/overworld.h index 35a90407b9..da83a50b93 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -54,7 +54,7 @@ // 16x32, 32x32, 64x64 etc are fine #define OW_MON_WANDER_WALK TRUE // If true, OW pokemon with MOVEMENT_TYPE_WANDER will walk-in-place in between steps. // Follower Pokémon -#define OW_FOLLOWERS_ENABLED FALSE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! +#define OW_FOLLOWERS_ENABLED TRUE // Enables follower Pokémon, HGSS style. Requires OW_POKEMON_OBJECT_EVENTS. Note that additional scripting may be required for them to be fully supported! #define OW_FOLLOWERS_BOBBING TRUE // If TRUE, follower Pokémon will bob up and down during their idle & walking animations #define OW_FOLLOWERS_POKEBALLS TRUE // If TRUE, follower Pokémon will emerge from the Poké Ball they are stored in, instead of a normal Poké Ball #define OW_FOLLOWERS_WEATHER_FORMS FALSE // If TRUE, Castform and Cherrim gain FORM_CHANGE_OVERWORLD_WEATHER, which will make them transform in the overworld based on the weather. diff --git a/python_tools/log.txt b/python_tools/log.txt index daceabc442..9caea6d349 100644 --- a/python_tools/log.txt +++ b/python_tools/log.txt @@ -898,3 +898,11 @@ ❌ 未找到 MOVE_SendWhichMonToPC,跳过 ❌ 未找到 MOVE_MenuDexNav,跳过 ❌ 未找到 MOVE_CannotSendMonToBoxHM,跳过 +❌ 未找到 MOVE_ReturnToVar1,跳过 +❌ 未找到 MOVE_SendWhichMonToPC,跳过 +❌ 未找到 MOVE_MenuDexNav,跳过 +❌ 未找到 MOVE_CannotSendMonToBoxHM,跳过 +❌ 未找到 MOVE_ReturnToVar1,跳过 +❌ 未找到 MOVE_SendWhichMonToPC,跳过 +❌ 未找到 MOVE_MenuDexNav,跳过 +❌ 未找到 MOVE_CannotSendMonToBoxHM,跳过 diff --git a/python_tools/src/文本.xlsx b/python_tools/src/文本.xlsx index fcaf5817c1..1650c85a77 100644 Binary files a/python_tools/src/文本.xlsx and b/python_tools/src/文本.xlsx differ diff --git a/python_tools/src/精灵跟随.xlsx b/python_tools/src/精灵跟随.xlsx new file mode 100644 index 0000000000..e9fa9fcfbd Binary files /dev/null and b/python_tools/src/精灵跟随.xlsx differ diff --git a/python_tools/test_follow.py b/python_tools/test_follow.py new file mode 100644 index 0000000000..d981b1f696 --- /dev/null +++ b/python_tools/test_follow.py @@ -0,0 +1,42 @@ +import openpyxl +import re + +# 文件路径 +excel_path = r"c:\Users\Nox\Documents\GitHub\pokeemerald-expansion-Chinese\python_tools\src\精灵跟随.xlsx" +c_file_path = r"c:\Users\Nox\Documents\GitHub\pokeemerald-expansion-Chinese\src\follower_helper.c" + +# 读取 Excel 文件 +wb = openpyxl.load_workbook(excel_path) +sheet = wb.active + +# 提取 Excel 数据(第一列和第三列) +replacement_map = {} +for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row, min_col=1, max_col=3): + variable_name = row[0].value # 第一列 + replacement_text = row[2].value # 第三列 + if variable_name and replacement_text: + # 将 \n 转义为 \\n,确保在代码中保持原样 + replacement_map[variable_name] = replacement_text.replace("\\", "\\\\").replace("\n", "\\n") + +# 读取 C 文件内容 +with open(c_file_path, "r", encoding="utf-8") as file: + c_code = file.read() + +# 替换变量对应的字符串 +for variable, new_text in replacement_map.items(): + # 匹配变量对应的字符串定义 + pattern = rf'static const u8 {variable}\[\] = _\(".*?"\);' + replacement = rf'static const u8 {variable}[] = _("{new_text}");' + c_code, num_replacements = re.subn(pattern, replacement, c_code, flags=re.DOTALL) + + # 输出调试信息 + if num_replacements == 0: + print(f"未匹配到变量: {variable}") + else: + print(f"替换成功: {variable} -> {new_text}") + +# 保存修改后的 C 文件 +with open(c_file_path, "w", encoding="utf-8") as file: + file.write(c_code) + +print("替换完成!") \ No newline at end of file diff --git a/src/follower_helper.c b/src/follower_helper.c index 02b39902eb..1d52592bb6 100644 --- a/src/follower_helper.c +++ b/src/follower_helper.c @@ -13,59 +13,59 @@ #define TYPE_NOT_TYPE1 NUMBER_OF_MON_TYPES // difficult conditional messages follow -static const u8 sCondMsg00[] = _("{STR_VAR_1} danced happily."); -static const u8 sCondMsg01[] = _("{STR_VAR_1} danced beautifully."); +static const u8 sCondMsg00[] = _("{STR_VAR_1}开心地\n摇摆着身体。"); +static const u8 sCondMsg01[] = _("{STR_VAR_1}优雅地\n摇摆着身体。"); static const u8* const sCelebiTexts[] = {sCondMsg00, sCondMsg01, NULL}; -static const u8 sCondMsg02[] = _("{STR_VAR_1} emitted fire and shouted."); -static const u8 sCondMsg03[] = _("{STR_VAR_1} is vigorously producing\nfire!"); -static const u8 sCondMsg04[] = _("{STR_VAR_1} spat fire!"); -static const u8 sCondMsg05[] = _("{STR_VAR_1} is vigorously breathing\nfire!"); +static const u8 sCondMsg02[] = _("{STR_VAR_1}发出火焰并\n大声地吼叫了起来"); +static const u8 sCondMsg03[] = _("{STR_VAR_1}猛地发出了\n火焰!"); +static const u8 sCondMsg04[] = _("{STR_VAR_1}突然发出了\n火焰!"); +static const u8 sCondMsg05[] = _("{STR_VAR_1}猛地放出了\n火焰!"); static const u8* const sFireTexts[] = {sCondMsg02, sCondMsg03, sCondMsg04, sCondMsg05, NULL}; -static const u8 sCondMsg06[] = _("{STR_VAR_1} is staring straight at\nthe POKéMON LEAGUE."); -static const u8 sCondMsg07[] = _("Your POKéMON is staring intently at\nthe mountain peak."); -static const u8 sCondMsg08[] = _("Sniff sniff, something smells good!"); -static const u8 sCondMsg09[] = _("Your POKéMON is surveying the\nshelves restlessly."); -static const u8 sCondMsg10[] = _("{STR_VAR_1} is staring intently at\nthe shelves."); +static const u8 sCondMsg06[] = _("{STR_VAR_1}一直在盯着\n宝可梦联盟"); +static const u8 sCondMsg07[] = _("它一直在\n凝望着山峰。"); +static const u8 sCondMsg08[] = _("传来了一股很香的气味。"); +static const u8 sCondMsg09[] = _("它正在观察货架。"); +static const u8 sCondMsg10[] = _("{STR_VAR_1}正盯着\n货架。"); static const u8* const sShopTexts[] = {sCondMsg09, sCondMsg10, NULL}; -static const u8 sCondMsg11[] = _("{STR_VAR_1} focused with a sharp\ngaze!"); -static const u8 sCondMsg12[] = _("{STR_VAR_1} seems very interested in\nthe bicycles."); -static const u8 sCondMsg13[] = _("{STR_VAR_1} seems to want to touch\nthe machines!"); -static const u8 sCondMsg14[] = _("{STR_VAR_1} is swaying with the\nboat!"); -static const u8 sCondMsg15[] = _("{STR_VAR_1} is dancing along with\nthe rolling of the ship."); -static const u8 sCondMsg16[] = _("{STR_VAR_1} doesn't want to get off\nthe boat yet!"); +static const u8 sCondMsg11[] = _("{STR_VAR_1} 的眼神\n变得坚定了起来! "); +static const u8 sCondMsg12[] = _("{STR_VAR_1}很喜欢自行车。"); +static const u8 sCondMsg13[] = _("{STR_VAR_1}想摸这个\n机器!"); +static const u8 sCondMsg14[] = _("{STR_VAR_1}随着船身摇晃\n 动了起来!"); +static const u8 sCondMsg15[] = _("{STR_VAR_1}随着船身摇晃\n摇摆着身体。"); +static const u8 sCondMsg16[] = _("{STR_VAR_1}好像还\n不想下船。"); static const u8* const sBoatTexts[] = {sCondMsg14, sCondMsg15, sCondMsg16, NULL}; -static const u8 sCondMsg17[] = _("{STR_VAR_1} is listening to the\nsound of the machines."); +static const u8 sCondMsg17[] = _("{STR_VAR_1} 用心地听着\n机器的声音!"); static const u8* const sMachineTexts[] = {sCondMsg13, sCondMsg17, NULL}; -static const u8 sCondMsg18[] = _("Waah! your POKéMON suddenly splashed\nwater!"); -static const u8 sCondMsg19[] = _("Your POKéMON is blowing sand in the\nair!"); -static const u8 sCondMsg20[] = _("{STR_VAR_1} is playing around,\nplucking bits of grass."); -static const u8 sCondMsg21[] = _("Your POKéMON is happily looking at\nyour footprints!"); -static const u8 sCondMsg22[] = _("{STR_VAR_1} is feeling nervous and a\ntouch claustrophobic."); -static const u8 sCondMsg23[] = _("{STR_VAR_1} is cautious about the\nconfined area!"); +static const u8 sCondMsg18[] = _("哇!它突然向外泼水!"); +static const u8 sCondMsg19[] = _("它在吹着空中的沙子!"); +static const u8 sCondMsg20[] = _("{STR_VAR_1}正在盯着地面\n拔草玩。"); +static const u8 sCondMsg21[] = _("它正盯着你的脚印。"); +static const u8 sCondMsg22[] = _("{STR_VAR_1}看起来好像,\n有点紧张还有点恐惧。"); +static const u8 sCondMsg23[] = _("{STR_VAR_1}对这个地方\n正保持着警惕!"); static const u8* const sElevatorTexts[] = {sCondMsg22, sCondMsg23, NULL}; -static const u8 sCondMsg24[] = _("A cold wind suddenly blew by!"); -static const u8 sCondMsg25[] = _("Your POKéMON almost slipped and fell\nover!"); -static const u8 sCondMsg26[] = _("Your POKéMON seems surprised to\ntouch ice."); +static const u8 sCondMsg24[] = _("它感受到了一股凉\n冰冰的冷气。 "); +static const u8 sCondMsg25[] = _("它差点滑倒。"); +static const u8 sCondMsg26[] = _("它摸到冰块\n后吓了一跳!"); static const u8* const sColdTexts[] = {sCondMsg24, sCondMsg25, sCondMsg26, NULL}; -static const u8 sCondMsg27[] = _("Your POKéMON has a flower petal on\nits face!"); -static const u8 sCondMsg28[] = _("{STR_VAR_1} is growling softly."); -static const u8 sCondMsg29[] = _("{STR_VAR_1} is trembling with fear."); -static const u8 sCondMsg30[] = _("{STR_VAR_1} seems somehow sad…"); +static const u8 sCondMsg27[] = _("它的脸颊上\n有一片花瓣!"); +static const u8 sCondMsg28[] = _("{STR_VAR_1}突然发出了低吼!"); +static const u8 sCondMsg29[] = _("{STR_VAR_1}在瑟瑟发抖!"); +static const u8 sCondMsg30[] = _("{STR_VAR_1}好像有点不开心了。"); static const u8* const sFearTexts[] = {sCondMsg29, sCondMsg30, NULL}; -static const u8 sCondMsg31[] = _("{STR_VAR_1} is taking shelter in the\ngrass from the rain."); -static const u8 sCondMsg32[] = _("{STR_VAR_1} seems very cold."); -static const u8 sCondMsg33[] = _("{STR_VAR_1} is staring at the sea."); -static const u8 sCondMsg34[] = _("Your POKéMON is staring intently at\nthe sea!"); -static const u8 sCondMsg35[] = _("{STR_VAR_1} is looking at the\nsurging sea."); +static const u8 sCondMsg31[] = _("{STR_VAR_1}躲到草丛\n里面避雨。"); +static const u8 sCondMsg32[] = _("{STR_VAR_1}感觉很冷,\n向你身上靠了过来!"); +static const u8 sCondMsg33[] = _("{STR_VAR_1}开始盯着\n大海。"); +static const u8 sCondMsg34[] = _("你的宝可梦正用心\n地盯着大海!"); +static const u8 sCondMsg35[] = _("{STR_VAR_1}盯着大海\n发呆。"); static const u8* const sSeaTexts[] = {sCondMsg33, sCondMsg34, sCondMsg35, NULL}; -static const u8 sCondMsg36[] = _("{STR_VAR_1} is listening to the\nsound of the waterfall."); -static const u8 sCondMsg37[] = _("{STR_VAR_1} seems to be happy about\nthe rain!"); -static const u8 sCondMsg38[] = _("{STR_VAR_1} is staring at its\nreflection in the water."); -static const u8 sCondMsg39[] = _("{STR_VAR_1} seems to relax as it\nhears the sound of rustling leaves…"); -static const u8 sCondMsg40[] = _("{STR_VAR_1} is gnawing at the ice."); -static const u8 sCondMsg41[] = _("{STR_VAR_1} is touching the ice."); +static const u8 sCondMsg36[] = _("{STR_VAR_1}用心的听着\n瀑布的声音。"); +static const u8 sCondMsg37[] = _("{STR_VAR_1}因为下雨\n看上去很开心!"); +static const u8 sCondMsg38[] = _("{STR_VAR_1}正盯着水中地\n倒影发呆。"); +static const u8 sCondMsg39[] = _("{STR_VAR_1}听着落叶\n沙沙作响的声音\n非常放松。"); +static const u8 sCondMsg40[] = _("{STR_VAR_1}正啃咬冰块。"); +static const u8 sCondMsg41[] = _("{STR_VAR_1}正摸着冰块。"); static const u8* const sIceTexts[] = {sCondMsg26, sCondMsg40, sCondMsg41, NULL}; -static const u8 sCondMsg42[] = _("{STR_VAR_1}'s burn looks painful!"); +static const u8 sCondMsg42[] = _("{STR_VAR_1}被烧伤了,\n好像很疼!"); // See the struct definition in follower_helper.h for more info const struct FollowerMsgInfoExtended gFollowerConditionalMessages[COND_MSG_COUNT] = diff --git a/src/strings.c b/src/strings.c index bd6706ac8d..21c75dd809 100644 --- a/src/strings.c +++ b/src/strings.c @@ -882,11 +882,11 @@ const u8 gText_BerryPickingResults[] = _("公布摘树果结果!"); const u8 gText_10P30P50P50P[] = _("{CLEAR_TO 0x03}10P{CLEAR_TO 0x2B}30P{CLEAR_TO 0x53}50P{CLEAR_TO 0x77}{EMOJI_MINUS}50P"); const u8 gText_AnnouncingRankings[] = _("宣布名次!"); const u8 gText_AnnouncingPrizes[] = _("宣布奖品!"); -const u8 gText_1Colon[] = _("0.041666666666666664"); -const u8 gText_2Colon[] = _("0.08333333333333333"); -const u8 gText_3Colon[] = _("0.125"); -const u8 gText_4Colon[] = _("0.166666666666667"); -const u8 gText_5Colon[] = _("0.208333333333334"); +const u8 gText_1Colon[] = _("1:00"); +const u8 gText_2Colon[] = _("2:00"); +const u8 gText_3Colon[] = _("3:00"); +const u8 gText_4Colon[] = _("4:00"); +const u8 gText_5Colon[] = _("5:00"); const u8 gText_FirstPlacePrize[] = _("第一名获得\n这个{DYNAMIC 0}!"); const u8 gText_CantHoldAnyMore[] = _("你不能携带更多了!"); const u8 gText_FilledStorageSpace[] = _("存储空间已经满了。"); @@ -1217,11 +1217,11 @@ const u8 gText_QuitTheGame[] = _("退出游戏?"); const u8 gText_YouveGot9999Coins[] = _("你已经有9,999枚代币。"); const u8 gText_YouveRunOutOfCoins[] = _("你用光了所有的代币。\n游戏结束!"); const u8 gText_YouDontHaveThreeCoins[] = _("你没有3枚代币。"); -const u8 gText_ReelTimeHelp[] = _("旋转时间\n现在是你瞄准目标,\n创造纪录的机会!\n旋转时间将会持续奖励的圈数。\n当大奖励出现时才会停止。"); -const u8 gDaycareText_GetAlongVeryWell[] = _("The two seem to get along\nvery well."); -const u8 gDaycareText_GetAlong[] = _("The two seem to get along."); -const u8 gDaycareText_DontLikeOther[] = _("The two don't seem to like\neach other much."); -const u8 gDaycareText_PlayOther[] = _("The two prefer to play with other\nPOKéMON than each other."); +const u8 gText_ReelTimeHelp[] = _("奖励时间\n属于你的高光时刻来了!\n持续期间内,机器转动速度\n将逐渐减缓。瞄准目标吧!\n轮数耗尽或中超级大奖后,\n奖励时间将会结束。"); +const u8 gDaycareText_GetAlongVeryWell[] = _("这2只的关系\n好像挺好的!"); +const u8 gDaycareText_GetAlong[] = _("这2只的关系\n感觉还不错啊。"); +const u8 gDaycareText_DontLikeOther[] = _("这2只的关系\n似乎不太好啊。"); +const u8 gDaycareText_PlayOther[] = _("这2只各自跑去\n和其他宝可梦玩了……"); const u8 gText_NewLine2[] = _("\n"); const u8 gText_Exit4[] = _("退出"); const u8 gText_Lv[] = _("{LV}");