介绍tnpquest

  • 在两年多前,我开始看Warriors。
  • 在大约两年前,我在官网上发现了第一个Warriors相关的游戏,就是这个Flash游戏Warriors The New Prophecy Quest Game,简称tnpquest。这只是一个简单的小游戏,但对于没多少基础的我,还是费了很大的劲才完成了。
  • 在大约一年前,也是暑假,我开启了一个项目,用C++模仿(mimic)这个游戏。一方面在AFO之后练练代码能力,另一方面原来的游戏玩起来太费时间了,因为有很多时间在等待骰子结果。
  • 之后一直弃坑,NOIp2018的时候又写了一点,一直到今年暑假。深受FalconDevelops的鼓舞,我又找到了代码,终于基本写完了。

这些都是根据我的文件修改日期推算的……

GitHub上去下载我重写的CLI版本吧。目前仅为alpha,欢迎大家测试并Issue或PR。

原始游戏

由于官网大更新,原始游戏已经找不到了。还好当初为了离线玩和研究,我已经把有关文件都下载下来了。除了可以用上面的版本,这里还提供完整文件,当然你也可以到archive上去找存档。打开loader.swfGame.swf,或者如果没有Flash Player,打开我自己写的test.html,启用Flash支持。在/src下还有反编译结果,需要至少Flash CS6打开,虽然我还没怎么看懂。

游戏的目的是收集到4颗星,也称为vital item,然后找到月池,获得武士名。

反编译

在尝试反编译前,我想通过统计得出时间概率,但最终放弃了,太麻烦了。不过有时看不懂反编译结果的时候,还是需要到原始游戏去实验。

我用的是流行的开源Flash反编译工具,JPEXS Free Flash Decompiler。去年我还不想碰Flash,于是我导出了所有资源,不过最重要的还是ActionScript。由于有很多文件,一种简单的方法是搜索最大的文件。

C++重新实现

我很懒,也不太会写GUI(我只写过Delphi),于是我决定写CLI。考虑到某种古老的兼容性,我把行宽限制为80,每个格子用3x10个字符表示。第一行显示地形,第二行显示格子里的内容,第三行用于分隔。然而很多地形和内容都很长,于是我造了很多缩写。我怀疑大部分人都猜不到是什么意思,于是我打算写一个缩写对照表。

趣谈

本部分包含游戏内部的细节,阅读后可能会影响体验。

  • 尽管要求找到4颗星,其实一共有5颗星,也许是为了降低难度。在第2行第3列一定有一颗星,因为这是后来SPJ的。有如下实现
1
2
3
4
5
6
cells[10].enemy = 6;
cells[10].injury = -1;
cells[10].events = -1;
cells[10].things = -1;
cells[10].critters = -1;
cells[10].needs = 1;
1
2
3
4
5
6
7
8
9
/**
* place something special as the flash version does
**/
void doSPJ()
{
boards[0].matrix[1][2].starID = 2;
boards[0].matrix[1][2].type = cell_t::Enemy;
boards[0].matrix[1][2].stuffID = 6;
}