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

追加服装

爱相随 iM / iR / iN1.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 文件的内容完成调整,无需再次进行动态调试。

完成 🎉