《哈迪斯》自带的Lua解释器是哪个版本?

玩过《哈迪斯》(英文名:Hades)吗?最近在研究怎么给这款游戏做MOD,想把它的振动体验升级到更高品质的RichTap。N站下载了一些别人做的MOD,发现很多都基于相同的格式,均是对游戏.sjon文件或.lua文件的修改。我们也可以在游戏的安装目录 {installation_path}\Content下看到,Game子目录里有很多.sjon文件,Scripts子目录里有很多.lua文件。很显然,这款游戏支持Lua脚本。如果我要给游戏扩展功能,势必也要写Lua脚本代码。Lua有很多历史版本,需要考虑新写代码的兼容性。那么,《哈迪斯》自带的Lua解释器到底是哪个版本呢?这便是本文标题的由来。

于是,我到Lua.org官网查看了它的版本历史,发现Lua 最近几个版本的发布时间分别是:

  1. Lua 5.4:2020年6月。最新版5.4.6发布于2023年5月。
  2. Lua 5.3:2015年1月。
  3. Lua 5.2:2011年12月。
  4. Lua 5.1:2006年2月。
  5. Lua 5.0:2003年4月。

而《哈迪斯》最早是在2018年12月发布的。猜测它用的Lua不是5.3就是5.2吧。我需要再去验证一下。

我在N站下载了一个叫“Multiplier Config”的MOD,它能在战斗场景下动态调整给主角或敌人带来的伤害数值。按照网站上的指示安装好MOD。然后,我需要修改其中的MultiplierConfig.lua。我本想加一行print(_VERSION)来打印Lua的版本号。问题是,我到哪里能看到这个打印信息呢?

我有个想法。因为RichTap Windows SDK是以DLL的形式提供的,我在Lua代码里识别游戏场景后是需要调用这个DLL来触发高品质振动的。我何不在这个DLL里实现一个ShowMsg函数,让它把收到的内容以Windows MessageBox的方式弹出来呢。经过一番研究,发现能被Lua代码调用的DLL是需要特殊定制的,那我就重新开发一个最简单的“转发器”DLL吧,这篇文章介绍了关键点,美中不足的是作者没有提供拿来即用的源代码工程。于是我在GitHub找了一个,是一个叫swerg的俄罗斯哥们开发的。swerg维护了QUIK工具包,他的simple-lua-c-dll工程也依赖那个工具环境,具体来说是他自己编译的Lua解释器qlua.dll。通过Dependency Walker也能确认这一点:

我想尽可能减少依赖!看来我还不得不自己编译Lua源代码呀!感谢faybull的这篇文章:“Windows下lua的编译与环境搭建”,写得很清晰,看完一遍就懂了!不过我下载的是Lua 5.2.4的源代码,代码工程上传到GitHub了,我编译出了自己的lua.exe、lua52.dll和lua52.lib!然后我从swerg的simple-lua-c-dll fork了一个版本出来,再把我编出来的库文件以及相应的头文件用到我fork出来的simple-lua-c-dll工程,稍作修改后便顺利编译通过了。写了最简单的测试脚本test1.lua:

print(_VERSION)
print("Hello World")

然后在控制台运行:lua.exe {path}\test1.lua,顺利通过!

接下来,我就要给simple-lua-c-dll实现ShowMsg函数了:

static int forLua_ShowMsg(lua_State* L) {const int n = lua_gettop(L);if (n > 0) {int type = lua_type(L, 1); // 只处理第一个输入参数if (type == LUA_TNUMBER) {char strMsg[100] = { 0 };sprintf(strMsg, "The number is %.2f", lua_tonumber(L, 1));MessageBox(NULL, strMsg, _T("QM"), MB_OK);}else if (type == LUA_TSTRING) {const char* pStr = lua_tostring(L, 1);if (pStr) {MessageBox(NULL, pStr, _T("QM"), MB_OK);}}}return(1);
}

将编译出来的luacdll.dll拷贝到游戏安装目录的{installation_path}\x86下,也即把它跟主程序Hades.exe放在一起。修改MOD的MultiplierConfig.lua脚本如下:

ModUtil.WrapBaseFunction("Damage",function(baseFunc, victim, triggerArgs)local multiplier = MultiplierConfig.Config.Multiplier-- My codes beginluacdll = require("luacdll")if luacdll ~= nil thenluacdll.ShowMsg(_VERSION)end-- My codes endif victim ~= nil thenif victim == CurrentRun.Hero thentriggerArgs.DamageAmount = triggerArgs.DamageAmount * multiplier.DamageTakenelsetriggerArgs.DamageAmount = triggerArgs.DamageAmount * multiplier.Damageendendreturn baseFunc(victim, triggerArgs)end
)

见证奇迹的时刻到了!运行游戏。在进入战斗场景后,很快就会看到弹出这样的消息框:

完美!!!然后……然后……我在游戏主程序所在的目录下看到了lua52.dll😂 好吧,这不重要了。我在整个过程中学到了很多。而且,我所做的工作在未来是可复用的✌

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/809383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习Rust的第二天:Cargo

We dive into Cargo, the powerful and convenient build system and package manager for Rust. 基于Steve Klabnik的《The Rust Programming Language》一书,我们深入了解Cargo,这是Rust强大而方便的构建系统和包管理器。 Cargo is a robust and effic…

oracle 数据库错误信息

7 ASMCMD-08001 至 ASMCMD-09604 ASMCMD-08001:“磁盘组”string不存在或未安装 原因:操作失败,因为指定的磁盘组不存在或未被当前Oracle自动存储管理(Oracle ASM)实例挂载。 操作:验证指定的磁盘组名称是否…

5G-A有何能耐?5G-A三载波聚合技术介绍

2024年被称作5G-A元年。5G-A作为5G下一阶段的演进技术,到底有何能耐呢? 三载波聚合(3CC)被认为是首个大规模商用的5G-A技术,将带来手机网速的大幅提升。 █ 什么是3CC 3CC,全称叫3 Component Carriers…

纯小白蓝桥杯备赛笔记--DAY14(计算几何)

文章目录 计算几何基础平面几何距离圆的周长和面积圆与圆之间的关系:海伦公式计算三角形面积点到直线的距离 点积和叉积例题: 点和线的关系点的表示形式和代码判断点在直线的那边点到线的垂足点到线的距离例题-1242例题-1240升级--点到线段的距离--1285 …

突破编程_C++_网络编程(Windows 套接字(处理 TCP 粘包问题))

1 TCP 协议与粘包问题概述 1.1 TCP 粘包的产生原因 TCP粘包问题的产生原因涉及多个方面,主要的原因如下: 首先,发送方在发送数据时,由于TCP协议为提高传输效率而采用的Nagle算法,可能会将多个小数据包合并成一个大数…

玩机进阶教程------手机定制机 定制系统 解除系统安装软件限制的一些步骤解析

定制机 在于各工作室与商家合作定制rom中有一些定制机。限制用户私自安装第三方软件。或者限制解锁 。无法如正常机登陆账号等等。定制机一般用于固定行业或者一些部门。专机专用。例如很多巴枪扫描机型等等。或者一些小牌机型。对于没有官方包的机型首先要导出各个分区来制作…

R语言绘制一次和二次相关性热图

在数据探索的过程中,我们往往会对数据与数据的相关性进行分析,例如我们常用的corrplot包,或者psych包中的corr.test函数,对两两变量间的相关性进行分析。我们常常会看到这样的相关性热图: 但有时变量间的关系并非线性…

python 最简单的网页爬虫

import requests url"https://news.ifeng.com/c/8OZc7eV01sM" rrequests.get(url) print(r.status_code) print(r.iter_lines()) # 获取响应的内容 content r.text# 打印网页内容 print(content) # responser.json() # print(response) 爬虫知识讲解: …

在线课程平台LearnDash评测 – 最佳 WordPress LMS插件

在我的LearnDash评测中,我探索了流行的 WordPress LMS 插件,该插件以其用户友好的拖放课程构建器而闻名。我深入研究了各种功能,包括课程创建、测验、作业、滴灌内容、焦点模式、报告、分析和管理工具。 我的评测还讨论了套餐和定价选项&…

​Python:闭包

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 什么是闭包(Closure)? 在Python中,闭包是一个非常强大的概念。闭包,简而言之&#x…

Flink命令行启动Job任务

Flink非交互式运行Job任务 Flink命令行启动Job任务 具体命令 flink 参数说明 -c,--class <classname> -d,--detached 后台运行 -p,--parallelism 并行度[testxxx ~]$ flink run -d -c class_name Job -p 3 ./flink-statics-1.0.jar -zookeeper "10.130.41.51…

Python+Django+Html网页版人脸识别考勤打卡系统

程序示例精选 PythonDjangoHtml人脸识别考勤打卡系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoHtml网页版人脸识别考勤打卡系统》编写代码&#xff0c;代码整洁&#xf…

详解小度Wi-Fi内部芯片及电路原理图分析

小度随身WiFi是一款便携式USB路由器&#xff0c;它实现了用户跨终端联网&#xff0c;随身携带&#xff0c;可以在室内实现免费WiFi覆盖。外形美观&#xff0c;小巧便携。 这一款小度WiFi采用的主芯片是MT7601UN&#xff0c;一款高度集成的Wi-Fi单芯片&#xff0c;支持150 Mbp…

蓝桥杯——玩具蛇

题目 小蓝有—条玩具蛇&#xff0c;一共有16节&#xff0c;上面标着数字1至16。每—节都是一个正方形的形状。相邻的两节可以成直线或者成90度角。 小蓝还有一个44的方格盒子&#xff0c;用于存放玩具蛇&#xff0c;盒子的方格上依次标着字母A到Р共16个字母。 小蓝可以折叠自…

力扣HOT100 - 240. 搜索二维矩阵 II

解题思路&#xff1a; 从左下角开始&#xff0c;根据条件删除行和列。 class Solution {public boolean searchMatrix(int[][] matrix, int target) {int row matrix.length - 1;int col matrix[0].length - 1;int l 0;while (row > 0 && l < col) {if (targ…

【1】C++设计模式之【单例模式】

单例模式在C中的实现方式有以下几种&#xff1a; 懒汉式&#xff08;线程不安全&#xff09;饿汉式&#xff08;线程安全&#xff09;双检锁/双重校验锁&#xff08;DCL&#xff0c;线程安全&#xff09;静态局部变量&#xff08;线程安全&#xff09;C11版本&#xff08;线程…

【JavaScript】DOM编程-什么是事件

今天几号 实现效果&#xff1a; 在这个示例中我们的事件三要素都是什么呢&#xff1f; &#xff08;1&#xff09;事件源&#xff0c;事件被触发的对象 谁&#xff1a;按钮 &#xff08;2&#xff09;事件类型&#xff0c;如何触发&#xff0c;什么事件&#xff0c;比如鼠标…

python+requests+pytest+allure自动化框架

1.核心库 requests request请求 openpyxl excel文件操作 loggin 日志 smtplib 发送邮件 configparser unittest.mock mock服务 2.目录结构 base utils testDatas conf testCases testReport logs 其他 2.1base base_path.py 存放绝对路径,dos命令或Jenkins执行…

数据仓库的ELT/ETL

ETL 和 ELT 有很多共同点&#xff0c;从本质上讲&#xff0c;每种集成方法都可以将数据从源端抽取到数据仓库中&#xff0c;两者的区别在于数据在哪里进行转换。 01 ETL ETL – 抽取、转换、加载 从不同的数据源抽取信息&#xff0c;将其转换为根据业务定义的格式&#xff0…

ansible使用shell模块的环境变量问题

在本机写了一个shell脚本&#xff0c;关于操作mysql的&#xff0c;在本机执行脚本可以正常操作数据库&#xff0c;脚本运行正常。 但是使用ansible ansible -i ./hosts test_teledb -m copy -a "src/etc/ansible/scripts/check.sh dest/tmp"ansible -i ./hosts test…