爱相随 iM / iR / iN 追加服装解锁

追加服装
在爱相随 iM / iR / iN 的 1.7.5 版本更新中,新增了外出模式(おでかけモード)。
在新模式中,玩家可以与女友一起出行,在成功抵达行程开始前设定的目标点后,游戏会根据此次行程距离进行结算,并奖励对应数量的外出点数(おでかけポイント)。
3000 外出点数可以兑换1 套服装,可解锁的追加服装总数为 15 套。在启用应用服装(コスチュームの適用)选项后,就会在满足条件时随机切换已解锁的追加服装。
由于外出模式所依赖的地图内容已无法正常加载,即使通过虚拟定位等方式抵达目标点,游戏也不会触发结算流程。因此已经无法获得外出点数,也就无法解锁追加服装。
参考资料
解决方法
以下以 爱相随 iR 为例说明操作步骤。
一、准备工作
使用数据线将 iPhone 连接至 PC,通过爱思助手进行文件访问与编辑。
如果设备已越狱,并安装了 Filza 或其他文件管理器,也可以直接在手机端完成修改,无需连接电脑。
二、定位配置文件
首次运行 爱相随 iR 并完成生日日期设置后,系统会在应用程序目录生成以下文件:
/Library/Preferences/jp.konami.loveplus.ar.rinko.plist该文件用于保存用户设置信息。

在使用爱思助手打开后,.plist 文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>setting_vol_sound_effect</key>
<integer>64</integer>
<key>birthsetting_day</key>
<integer>28</integer>
<key>birthsetting_year</key>
<integer>2004</integer>
<key>birthsetting_month</key>
<integer>5</integer>
<key>setting_from_ver01</key>
<true/>
</dict>
</plist>文件内容仅包含生日日期及基础设置数据。若在游戏里调整其他选项,此文件中也会新增对应字段。
三、修改外出点数
在 <dict> 标签内添加以下字段:
<key>setting_rdp</key>
<integer>99999999</integer>该字段对应外出点数(おでかけポイント)。
数值可自行调整,解锁全部 15 套追加服装所需的点数为 15 × 3000 = 45000,因此只需要填写 45000 就足够解锁全部追加服装。
四、解锁全部服装
如果不希望在游戏里逐一解锁追加服装,也可以直接修改服装解锁状态。
在 <dict> 标签内添加以下字段:
<key>setting_costume</key>
<array>
<integer>32767</integer>
</array>就可以解锁全部 15 套追加服装。
为什么是 32767?
游戏使用了位掩码(BitMask)机制。
每一套追加服装的解锁状态对应一个二进制位:
- 已解锁 → 1
- 未解锁 → 0
若要解锁全部 15 套追加服装,则需要:
111111111111111然后将其转换为十进制 integer:
2^15 - 1 = 32767因此填写 32767 即表示解锁全部追加服装。
同理,如果希望只解锁前 8 套追加服装,需要把值改为 2^8 - 1 = 255。

修改完成后务必点击保存。

过程记录
虽然可以推断外出点数与服装解锁状态大概率会和其他设置信息一样,保存在 .plist 文件中,但我们面临以下限制条件:
- 外出点数为 0,且无法获得
- 无法解锁任何追加服装
- 游戏不会主动向
.plist写入未发生修改的字段
因此我们既不知道字段的名称,也不知道数据的类型,自然无从下手修改。
一、寻找服装解锁字符串
在 PC 上通过 SSH 连接已安装 OpenSSH 的 iPhone,使用终端运行 Cycript,然后附加到 爱相随 iR 的进程即可进行动态调试。
为了寻找相关信息,首先在 PC 上使用 Strings 提取可执行文件中的字符串,并筛选包含 Costume 的内容。
发现如下函数名:
+[SettingsCtrl LoadCostumeFlag]
+[SettingsCtrl SaveCostumeFlag:]从命名来看,这显然是负责加载与保存服装解锁标志的函数。
二、验证服装解锁机制
进入游戏的追加服装购买界面,在 Cycript 中调用:
cy# [SettingsCtrl LoadCostumeFlag]
@[]返回了空数组,说明当前没有任何服装解锁标志。
接下来构造一个数组 flag,并调用 SaveCostumeFlag 将它保存:
cy# var flag = [@[] mutableCopy]
cy# [flag addObject:@1]
cy# [SettingsCtrl SaveCostumeFlag:flag]此时 .plist 文件里出现了服装相关的字段,游戏里第一套追加服装也被解锁了。
<key>setting_costume</key>
<array>
<real>1</real>
</array>三、数据结构测试
为了继续确认如何解锁更多追加服装,进行了多次测试。
1️⃣ 多个 1
<key>setting_costume</key>
<array>
<real>1</real>
<real>1</real>
...
<real>1</real>
<real>1</real>
</array>结果:仍然只解锁第一套追加服装。
2️⃣ [1, 2]
<key>setting_costume</key>
<array>
<real>1</real>
<real>2</real>
</array>
结果:仍然只解锁第一套追加服装。
3️⃣ [2, 1]
<key>setting_costume</key>
<array>
<real>2</real>
<real>1</real>
</array>结果:只解锁第二套追加服装。
四、关键推断
通过以上测试可以推断:
- 游戏只读取数组的第一个元素
- 元素的值是一个位掩码(BitMask)
- 每一位二进制位对应一套追加服装的解锁状态
验证:
<key>setting_costume</key>
<array>
<real>255</real>
</array>结果:解锁前 8 套追加服装。
最后将数组内的数据类型改为 integer,与原本游戏写入的 .plist 内容保持一致:
<key>setting_costume</key>
<array>
<integer>32767</integer>
</array>解锁全部 15 套追加服装。
五、寻找外出点数字符串
再次翻看提取出的字符串,发现外出模式相关的函数名称均包含 RealDate 关键词:
+[SettingsCtrl SaveRealDatePoint:]
+[SettingsCtrl LoadRealDatePoint]从命名来看,这显然是负责保存于加载外出点数的函数。
在 Cycript 中执行:
cy# [SettingsCtrl SaveRealDatePoint:@999999]
cy# [SettingsCtrl LoadRealDatePoint]
999999

验证成功。
此时 .plist 文件里出现了新字段:
<key>setting_rdp</key>
<integer>999999</integer>六、结论
至此可以确认:
setting_rdp→ 外出点数setting_costume→ 服装解锁状态
之后即可直接通过修改 .plist 文件的内容完成调整,无需再次进行动态调试。
完成 🎉