游戏

我们就以《猎人的生存日记》(Orion Sandbox)这款游戏来分析。

下载链接

FlashStart打开Orion Sandbox 1.swf

我们需要反复进入游戏,可以先打开一次游戏,以此进行:文件 \(\rightarrow\)游戏路径\Orion Sandbox 1.swf

工具

  • 可以看16进制的软件(我用的是HxD

数字

因为这是个本地游戏,所以在本地要有个储存的位置。

这个位置一般在C:\Users\UserName\AppData\Roaming\Macromedia\Flash Player#SharedObjects\一串英文#localWithNet\游戏文件夹名

在这里面有\(3\)个文件:

  • player.sol 玩家数据
  • world.sol 地图数据(世界数据)
  • settings.sol 一些设置

我们主要看 player.sol 这个文件。

修改血量

从 player.sol 里找到health这串字符。为什么修改血量要找这字符,因为\(health\)是血量的意思。

68 65 61 6C 74 68 04 64
h e a l t h

如果你的血量是\(100\)的话就可以找到以上数据。

前\(5\)个是health的ASCII码。

04是什么知不道,只能猜,它是字符串的结束,或是整型数字的开始。

64很明显,就是血量。(\(64_{(16)}=100_{(10)}\))

我们将64改成63,然后保存一下。

我建议更改的时候备份一下。

重进游戏:血量变成\(99\)。修改成功。

修改经验值

还是从 player.sol 里找,找experience这串字符。experience n. 经验 vt. 体验。

65 78 70 65 72 69 65 6E 63 65 04 00
e x p e r i e n c e UK

UK 表示未知。(unknow)

00 表示经验是\(0\)。

经验达到\(127\)时,数据中表示7F

exp = 127
65 78 70 65 72 69 65 6E 63 65 04 7F
e x p e r i e n c e UK 127

但经验达到\(128\)时,数据中表示81 00

exp = 128:
65 78 70 65 72 69 65 6E 63 65 04 81 00
e x p e r i e n c e UK 128

81改为82后经验变为\(256\)。

所以\(2\)位数字的范围为\([0, 16383]\),\([00\space00, FF\space7F]\)。

\[(FFh-80h)\times80h+7Fh=3FFFh=16383_{(10)}
\]

\(3\)位数字:\(16384\)表示81 80 00

所以,公式就是:

\[a_0+\sum^{l-1}_{i=1}{2^{7i}(a_i-80h)}
\]

\(l\)是\(a\)的长度。

\(a_0\)是最低位。

C++ 代码:

template<class intT>
intT flashint_to(unsigned char* fints) {
intT res = 0;
size_t l = 0;
intT expr = 1;
while(fints[l++] >= 0x80);
for(size_t i = l - 2;; i--)
{
res += (fints[i] - 0x80) * (expr *= 128);
if(i == 0)
break;
}
res += fints[l - 1];
return res;
} // test
void test() {
::std::cout << flashint_to<int>("\x81\x01"); // 输出 129
}

根据上面的规律,我们也可以逆回去:

\[x\to a_i=\cases{
x\mod 128 & ,i=1 \\
\lfloor x \div2^{7i} \rfloor+80h &,i>1
}
\]

C++ 代码:

template<class intT>
size_t to_flashint(intT x, unsigned char* fints) {
size_t l = 0;
while(x)
{
fints[l++] = x % 128 + 0x80;
x /= 128;
}
for(int i = 0; i < l / 2; i++)
{
fints[i] ^= fints[l - i - 1];
fints[l - i - 1] ^= fints[i];
fints[i] ^= fints[l - i - 1];
}
fints[l - 1] -= 0x80;
return l;
} // test
void test() {
unsigned char buf[10];
int x = 129;
int l = to_flashint(x, buf);
for(int i = 0; i < l; i++)
printf("%x ", buf[i]);
// 输出 81 01
}

有了这两个函数就好办了

flash 游戏分析 - 1的更多相关文章

  1. 第1章 游戏之乐——NIM(2)“拈”游戏分析

    NIM(2)“拈”游戏分析 1. 问题 有N块石头和两个玩家A和B,玩家A先将石头分成若干堆,然后按照BABA……的顺序不断轮流取石头,能将剩下的石头一次取光的玩家获胜.每次取石头时,每个玩家只能从若 ...

  2. Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述

    Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述 Overview 本章的主要的内容是贪吃蛇小游戏的分析和实现,关于实现的具体代码可以在,文章底部的github的链接中找到. 整个游戏通 ...

  3. Java太阳系小游戏分析和源代码

    Java太阳系小游戏分析和源代码 -20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载 ...

  4. 2048游戏分析、讨论与扩展 - Part I - 游戏分析与讨论

    2048这个游戏从刚出開始就风靡整个世界. 本技术博客的目的是想对2048涉及到相关的全部问题进行仔细的分析与讨论,得到一些大家能够接受而且理解的结果. 在这基础上,扩展2048的游戏性,使其变得更好 ...

  5. flash逆向练习:以逆向的方式通关flash游戏《谈判专家》

    一.缘起 无聊想玩搜个游戏玩,看到一个帖子引起了我的好奇: 但是作者分享的游戏链接已经挂掉了,于是就搜索了一下: 选了7k7k上的一个在线玩,链接:http://www.7k7k.com/swf/15 ...

  6. 植物大战僵尸中文第二版和年度版 游戏分析及delphi源码

    00413184 |. E8 77E30100   |CALL PlantsVs.00431500                  ; 地上的物品00413189 |. 8D7424 10     ...

  7. Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  8. 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...

  9. flash游戏服务器安全策略

     在网页游戏开发中,绝大多数即时通信游戏采用flash+socket 模式来作为消息数据传递.在开发过程中大多数开发者在开发过程中本地没有问题,但是一旦部署到了网络,就存在连接上socket服务器.究 ...

  10. u-boot分析(九)----nand flash初始化|nand flash读写分析

    u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们 ...

随机推荐

  1. 快速上手Linux核心命令(九):文件备份与压缩

    目录 tar 打包备份 gzip 压缩或解压文件 zip 打包和压缩文件 unzip 解压zip文件 scp 远程文件复制 rsync 文件同步工具 这期呢主要说一说Linux中文件备份与压缩命令,一 ...

  2. python轻量级性能工具-Locust

    Locust基于python的协程机制,打破了线程进程的限制,可以能够在一台测试机上跑高并发 性能测试基础 1.快慢:衡量系统的处理效率:响应时间 2.多少:衡量系统的处理能力:单位时间内能处理多少个 ...

  3. 基于.Net开发的数据库导入导出的开源项目

    在项目开发过程中,我们经常碰到从数据库导入导出的需求,虽然这样的功能不是很复杂,但是往往我们都会碰到一些问题. 比如导入的Excel格式问题.Excetl中图片导入问题,导出的需求为了方便客户查看,会 ...

  4. JavaScript中的四种枚举方式

    字符串和数字具有无数个值,而其他类型如布尔值则是有限的集合. 一周的日子(星期一,星期二,...,星期日),一年的季节(冬季,春季,夏季,秋季)和基本方向(北,东,南,西)都是具有有限值集合的例子. ...

  5. JavaFx 关键字高亮文本实现

    原文地址:JavaFx 关键字高亮文本实现 - Stars-One的杂货小窝 整蓝奏云批量下载器里的搜索功能想到的一个关键字高亮功能,借助textflow组件来实现,记录一下 本文基于TornadoF ...

  6. 2021-12-27:给定一个字符串str,和一个正数k, str子序列的字符种数必须是k种,返回有多少子序列满足这个条件。 已知str中都是小写字母, 原始是取mod, 本节在尝试上,最难的, 搞出

    2021-12-27:给定一个字符串str,和一个正数k, str子序列的字符种数必须是k种,返回有多少子序列满足这个条件. 已知str中都是小写字母, 原始是取mod, 本节在尝试上,最难的, 搞出 ...

  7. vue工程内下载路由

    一.路由Router Vue Router 是Vue.js官方的路由管理器.它和Vue.js的核心深度集成,加速构建单页面应用.包含功能有: 1 嵌套的路由/视图表 2 模块化的.基于组件的路由配置 ...

  8. c#优雅高效的读取字节数组——不安全代码(1)

    在开发上位机的经历中,会有很多需要和下位机交互通信的场景,大多数都会定义一个和硬件的通信协议,最终在上位机代码中的形式其实就是符合通信协议的字节数组. 目录 场景 如何解析字节数组到类或结构体中 建立 ...

  9. 快速上手kettle(二)小试牛刀

    目录 一 .前言 二 .两个小目标 三. kettle核心概念介绍 3.1 转换 3.1.1 步骤(Step) 3.1.2 跳(Hop) 3.1.3 元素据 3.1.4 数据类型 3.1.5 并发执行 ...

  10. 适用于Linux命令的10个R函数

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 这篇文章将介绍 10 个不同的 Linux 命令及其 R 实现方法. 如果您有兴趣学习更多 R ...