2026-03-11 14:49:58
soluna 集成了 lua 虚拟机,但默认构建方式是将 lua 库静态链接到唯一的执行文件中。这将导致无法以动态库的形式外挂 Lua 的 C 扩展。
这是因为,如果独立编译 Lua 的 C 扩展库,通常需要链接 Lua 的 C API 。标准的方法是动态链接 lua 实现,如果静态链接 liblua.a ,会导致进程中有多份 lua 的实现。在 Lua 的历史版本中,这将导致运行期错误。
这是因为,Lua 的实现中有一个静态的“空”对象,所有的 nil 都指向这个对象。如果进程空间中有多份 Lua 实现,就会出现多个空对象。运行时的数据结构中会引用这个空对象,而不同副本的实现将“空”和自身保留的“空”对象引用做比较时,就会出现错误的判断。
在更早期的版本,出现这种链接出现的项目,bug 会隐藏得很深。所以后来 Lua 增加了 luaL_checkversion() ,倡议在外部库初始化时调用,除了检查版本号,还会检查当前执行的 lua 实现是否和虚拟机创建时用的实现是同一个副本。
但不知道怎样正确链接 lua 的项目(保证进程中只有一份 Lua 实现)还是太多,从 Lua 5.4 以后,这个“空”对象就被移入了 lua_State 这个运行期结构。以牺牲一点运行时的代价,挽救那些似乎永远也搞不懂“加载和链接”的程序员。终于,错误的链接 Lua 也能不出错了。
但我还是认为,在同一进程中置入多份 Lua 实现是不好的。
注:这也是 Windows 动态库的一个独有问题。因为 Windows 的 DLL 不允许有未完成的符号,必须在编译链接时指定所有符号(Lua C API)的来源;如果是 Linux ,可以不链接 Lua C API 的库,在运行时加载动态库,加载器就能把进程内的对应符号装载起来。
回到题头的问题:soluna 静态链接了 Lua ,并未导出 C API ,要用 C 写额外的库怎么办?
曾经在 Ant Engine 中,我采用了一个方法:提供一个假的代理动态库,提供所有 Lua C API 的符号。外部库可以动态链接它,而它将所有 Lua C API 调用转发到 engine 内部链接的 Lua 实现中。
这样做的好处是,即使是预编译好的 Lua C 库,只要它正确的以动态链接形式链接了 Lua ,就能直接被 Ant Engine 加载。如果不需要外部库,这个代理库也可以不发布。
今天,我想给 soluna 加上类似的特性,但尝试了新的方案:外部库在构建时额外实现一个简单的入口函数,它不依赖真的 Lua 实现,而是链接 soluna 项目中的 extlua/extlua.c 这个 Lua API 代理实现。再由 soluna 的定制加载器来加载这个外部库。
比如,我有一个叫做 foobar 的外部库,原本的实现是这样的:
static int
lhello(lua_State *L) {
lua_pushstring(L, "Hello World");
return 1;
}
extern int
luaopen_foobar(lua_State *L) {
luaL_Reg l[] = {
{ "hello", lhello },
{ NULL, NULL },
};
luaL_newlib(L, l);
return 1;
}
当我们编译成动态库时,导出的 luaopen_foobar() 是库的入口。lua 的 require 可以正确的导入它。但这个实现依赖若干 lua C APIs ,例如 lua_pushstring() 等。
如何在 soluna 里正确加载它呢?我们需要在调用 luaopen_foobar() 这个入口函数前,将进程中的 Lua C APIs 注入这个动态库。
在这个方案中,只需要链接 soluna 项目中的 extlua/extlua.c 单个文件,然后导出一个额外的库入口函数:
extern int
extlua_init(lua_State *L) {
luaapi_init(L);
luaL_Reg l[] = {
{ "ext.foobar", luaopen_foobar },
{ NULL, NULL },
};
luaL_newlib(L, l);
return 1;
}
这个函数的第一行需要调用 luaapi_init(L) ,它的实现在 extlua.c 中。然后用 luaL_newlib() 注入原有的模块入口函数即可。
luaapi_init(L) 并不依赖任何 Lua 的内部实现,只依赖 Lua 的一个官方宏 lua_getextraspace() 完成了注入 Lua C APIs 的魔法。
这是个有趣的技巧:
lua_getextraspace(L) 的官方定义是这样的:
#define lua_getextraspace(L) ((void *)((char *)(L) - LUA_EXTRASPACE))
每个 Lua_State 结构前都保留有一个指针的空间,可以用来传递数据。soluna.external.load 会构建一个空的 Lua 虚拟机,并把所有 Lua C APIs 的引用放在它的 extraspace 。因为上面的 extlua_init() 是一个标准的 lua_CFunction ,所以可以用标准函数 package.loadlib 读出。传入这个带 C APIs 的空 Lua 虚拟机,luaapi_init() 就能正确的导入所有 API 了。随后的 luaL_newlib() 会把所有真正的入口函数放在这个空虚拟机中。当然,只是一些字符串(入口名)和 C 函数指针。
接下来,soluna.external.load 再从这个虚拟机中把整个入口函数表复制到当前虚拟机,并销毁掉这个临时虚拟机,就完成了整个外部模块的动态加载。
soluna.extlib(name) 的实现是这样的:
function soluna.extlib(name)
local extlua = require "soluna.extlua"
local filename = assert(package.searchpath(name, package.cpath))
settings = settings and soluna.settings()
local entry = assert(package.loadlib(filename, settings.extlua_entry))
return extlua.load(entry)
end
要使用上面例子中的放在 sample.dll 中的库 ext.foobar 只需要这样:
local libs = soluna.extlib "sample" local foobar = require "ext.foobar" assert(libs["ext.foobar"] == foobar)
即使要静态链接 sample 模块(iOS 不支持动态库,可能必须静态链接),只需要采用以下编译方案即可正确工作:
luaapi_init() 定义为一个空函数extlua_init() 这个入口函数导入2026-03-01 19:24:54
今年过年,我沉迷于 Star Trek : Captain's Chair 这款 2025 年的桌游。暂时还没有中文版,如果直译的话,名为《星际迷航:船长之椅》。这是一款以卡牌构筑为核心玩法的桌游,在游戏过程中,不断完善自己的牌堆,构筑一个高效的得分引擎。如果能比对手获得更多的 VP 就可以获得游戏胜利,但也要避免突然死亡。这是一款新游戏,但作者 Nigel Buckle 和 David Turczi 之前已经用类似的系统出过 Imperium (帝国)三部曲。其中《帝国:经典版》和《帝国:传奇版》有中文版,在淘宝上就可以买到。btw, 前段时间我玩过的 VoidFall 也是他们的作品。
这个游戏的规则还是挺复杂的,在 BGG 上的 weight 评级达到了 4.06 。注:游戏的重度(weight)是由玩家评分综合而来,最高为 5 。它指的是规则的繁杂程度,而并非游戏的策略深度(通常有相关性)。例如围棋虽然策略深度几乎达到了桌游的天花板,但它的 weight 就不到 4 。而 bgg 上 weight 超过 4 的游戏并不多见,大部分超过 3 的桌游,一般就被归为重度游戏了。我大概花了 10 多个小时试玩,看了几个小时的教学视频,才感觉学会了游戏的基本规则。不过一旦理解了游戏的设计逻辑,玩起来还颇为流畅,规则书以及规则助记版都非常符合直觉,简单好认。重度游戏大多不太讨人喜欢,但设计良好的重度游戏也能带来更多乐趣。
我认为 ST:CC 是我这些年玩过的所有卡牌构筑类桌游中机制、策略和局势变化最丰富的。它提供了及其丰富的机制让玩家控制牌组的构成,这也是“构筑”这个机制的核心玩点。和最早的《Dominion 领土》作比较:这类游戏的基本玩法就是从市场购买新卡,构建一个得分引擎。分往往也体现在牌组中,但会稀释行动牌的价值(通常分卡在游戏过程中没有收益),让玩家在构筑过程中做出权衡。Dominion 每局游戏的后期通常会面对厚厚的牌堆,行动会变得越来越不可预测。后来的同类游戏逐步加入了更丰富的机制来帮助卡组瘦身,提供给玩家更多确定性,更好的控制自己的行动。
ST:CC 以及它的前身 Imperium 提供了非常丰富的卡组瘦身机制:
可以把卡堆里的牌 LOG 起来:和早期卡牌构筑游戏不同,得分卡并不是专门的卡,而是每张卡本身就带有 VP 。这更像银河竞逐这样的引擎构建游戏。收集的卡越多得分越高。LOG 可以把当局游戏不再用的卡从当前卡堆里移除,但得分依旧保留。
可以把卡片 deploy 到桌面:放在桌面的卡可以提供持久的被动能力,也可以有限的提供主动能力或响应能力。同时,活动卡组也得到的瘦身。根据卡片属性不同,提供有差异的回收规则。船员卡可以常驻一张,新的船员卡晋升后 dismiss 旧的;飞船卡则在占领星球后自动 dismiss ;事件卡则每张有不同的回收前置行动(不回收会在游戏结束结算时计为负分)。
卡片可以 beam 到飞船或星球上:这可以对卡组作更灵活的临时瘦身。几乎所有的飞船都有主动能力可以 beam 手牌,但反向回到手牌的 recall 操作却比较稀少。不过,beam 在飞船上的卡也可以随飞船 dismiss 而一同回到弃牌堆。
永久(不可逆)和临时(可收回)的卡牌瘦身操作,可以让玩家在游戏过程中动态的调整卡组,让游戏的确定性更高,而不会在抽牌堆太大时,过于依赖抽卡的手气。就我这几天玩的数盘游戏体验,通常我的活动牌组(抽牌堆加上弃牌堆和手牌)在整局游戏里也很少超过 20 张。
ST:CC 在游戏过程中的卡组升级也有新意。
首先,和大多数卡牌构筑游戏一样,初始卡组是 10 张左右,每轮抽 5 张。这样可以保证前两轮可以作一个轮回,让随机性限制在 10 张卡的不同组合上。但和之前的很多游戏不同,它的 10 张卡是完全不同的,每张都特别设计过。甚至游戏带了 6 套风格迥异的初始牌组。而传统上的设计更偏好在初始卡组中放上雷同的初始能力卡,加上很少量的特殊卡。如果没玩过桌游的话,可以对比杀戮尖塔这样受桌游启发的电子游戏:一开始的初始卡组中只有一张特殊能力卡加上普通的打击和防御。
而和一般的卡牌构筑游戏的升级流程不同,它会为每个初始牌组设计 5 张左右的固定补充卡堆和 8 张左右的高级补充卡,以固定节奏补充进来:每次抽牌堆抽空都会自动触发这个补充操作,加入一张额外的补充卡。基本的补充卡的随机性在于每局游戏的进入次序是打乱的,而高级卡则需要用不同资源购买,但可以让玩家指定(没有抽卡的随机环节)。这样熟练牌组的玩家可以预先学习好每个角色牌组的策略,再实际玩的时候又不至于形成太固定的套路。
因为补充卡是通过卡组循环进入抽卡堆的,添加新的补充卡可以带来更多的组合,相当于卡组升级。所以调节抽卡堆的消耗速度就相当于控制玩家卡组升级速度。ST:CC 在主动控制牌堆轮转这一点上设计得比大多数卡牌构筑前辈出色。
1.抽牌能力。这是一个常规设计,不仅用来补充当前回合的行动选择,同时加快了抽牌堆的轮转。
弃掉抽牌堆顶的牌。这在《Dominion》中多以攻击效果出现,说明早期这种设计更多强调的是其负面影响:让玩家暂时失去潜在的行动能力。但由于卡组瘦身很容易,它也出现了有益的一面:加快牌堆轮转。
在回合结束时,玩家可以任意保留手牌。这给玩家了选择:确保下一回合能做的行动,但减缓了牌堆轮转速度。
从市场获取新牌后,可以自由选择放入弃牌堆还是放入抽牌堆。前者加快了牌堆轮转,后者提供了确定性:可用抽牌能力立刻获取,或确保下一轮可以抽到。
由于有大量从弃牌堆抽牌的能力。这极大的丰富了获取行动卡的途径。抽牌堆抽卡是随机的,弃牌堆抽卡是确定的(挑选),牌堆轮转加快固然是好事,但弃牌堆清空也是需要考虑的问题。
除了固定补充卡升级,游戏还提供公共市场和供双方争夺的中立地点卡。但很多传统的市场机制是用资源从市场买卡,而 SC:CC 并不通过积累资源购买市场卡,而是改为用特定行动卡片直接获取。市场被分为了四类:船员、货物、飞船、盟友,分别对应不同的行动卡去获取。根据选择的初始牌组不同,获取这些市场卡的行动卡使用方式也不一样。由于行动力有限,规划行动的分配获取市场卡就变成了卡片 combo 重要的一环。玩家很难积累获取市场卡的能力,抢夺地点卡更是这样:规则限制了每个回合最多只能获得一个中立地点。整局游戏中不会获得太多的额外卡片,且每张公共卡都是单独设计的,这让引入每张卡到自己的卡组都需要仔细规划。
ST:CC 的卡片被设计成一卡多用。卡片处于不同位置:从手牌打出或桌面上激活会有不同的能力。而即使是同一种方式使用它,一般也有多种能力供选择,只能选其一使用。虽然每种使用方式大多有前置条件或副作用,但本身的多种选择让每张卡片在不同场景下都有用。
因为卡片的位置非常丰富:除了传统的抽牌堆、弃牌堆、手牌外,还有桌面区、市场区、当前市场、市场库存、中立地、废牌堆、附着在其它卡片上、LOG 区、升级区、事件区等等。就我主要玩的 PICARD 牌阵来说,大量的行动就是将卡在这些这些区域之间调度。所以在玩的时候,有一点工人分配游戏的感觉。不仅提供了丰富的卡牌策略,还非常好的契合了星际迷航那种驾驶飞船探索宇宙的主题。
为了让游戏不限于千篇一律的构建得分引擎循环,游戏给每个牌组都设计了不同主题的任务。任务不同于很多引擎构建游戏的终局任务卡,那个在 ST:CC 里也有,被设计为 Encouter 卡片,通常可以提供大笔的 VP 。任务就是固定在每个初始卡组上的,像是堆每组不同风格的牌作一个游戏引导,引导在游戏过程中侧重某种玩法。例如,PICARD 的基本任务就是获得三张同盟卡,并把他们都 beam 到同一艘飞船上,且获得至少 4 点科技点和 4 点影响力,就可以完成。
这个设计不会让玩家(熟悉后)玩游戏时不会走一步看一步,每步寻找当下行动的利益最大化。玩家必须作一个长远规划:因为任务必不可少的需要分成很多步骤,同步相当多的行动在好几个回合才可能达成。以我玩的经验来看,基本任务一般在游戏中后期才可以达成,而以开始不作计划的话,常常忙到快结束时还差上一点点。
由于只靠固定牌组很难有效的完成任务,随机出现的公共牌加入卡组都能带来意想不到的高效组合,所以每局游戏的过程都会差异很大。我用 PICARD 玩了 3,4 局游戏,都选的 KOLOTH 这个 bot ,但每局游戏体验完全不同。更别说换掉对手会有完全不同的局面。游戏为每个舰长的 bot 定制了不同的自动化策略来模拟人类玩家选择不同舰长会出现的不一样的打牌倾向。
这是一个两人对战游戏,但也可以用设计好的自动化规则来模拟一个对手。但在 BGG 上,大多数玩家认为这个单人对抗 bot 的玩法更好玩。游戏的教学作的不错,提供了一个更存粹没有对手的单人模式,通常用于熟悉牌组。这个教学模式就是无干扰的刷分,刷够足够的分就胜利了。通过玩这个模式,可以体验不同舰长牌风格迥异的 combo 策略。通常建议把 6 个舰长都刷够分,这样在对战时既能知道自己应该怎么玩,还能熟知对手的策略。
正式的单人模式是对抗固定规则的对手。采用的是不对称规则:玩家和 bot 的行动法则是不一样的。我没有玩过对战模式,但据 BGG 论坛玩家的反馈,预设规则把和真人玩家的对抗时会产生的交互:争夺市场卡片、抢占中立地点等模拟的很好。一开始玩的时候,操作 bot 很容易出错,但玩过一盘之后就非常顺畅了,bot 每个回合一两分钟就能操作完,反之自己这边的行动每个回合会花很长时间。可想而之,和人对战应该会有极大的 downtime ,怪不得大多数人都选择了单人 solo 。
但我觉得,如果有个人类对手和自己一样玩过很多盘 solo 的话,再在一起对战应该也是非常有趣的。
官方还为单人模式设计了一个长线的五年计划规则。让玩家可以连着玩 5~10 盘游戏,在每盘游戏间加入了牌组升级:每次胜利都可以加入当局游戏终局时的某张市场卡进入初始牌组,或是 boost 一些初始能力。由于游戏设计了 6 组不同的牌,这相当于需要击败 5 个不同的对手(自动化 bot ),想来不会有太多重复感。我打算熟悉玩所有卡组后就尝试一下这个长线任务,应该会很有趣。
很想买一套实体版,但在淘宝上找不到代购,甚至目前美国那边也缺货等着重印。我这几天都是在桌面模拟器上玩的(有玩家制作的 mod )。我的感觉是,由于电子版缺少触感,细节更容易玩错。即使很熟悉后,游戏效率还是比不上实体。这点和版图游戏颇为不同,这个几乎全部用卡牌作道具,假若是实体牌的话,电子版只在洗牌时会便利一点,打牌及查看牌面要麻烦很多。而很多版图游戏,电子模拟器在 setup 以及游戏过程中的摆放都会更方便。
作为 solo 游戏,实体版最方便的地方在于易于反悔。只要没有信息揭示环节(例如抽牌后查看),大多数行动你都可以方便的在牌桌上 undo ,尝试各种不同的组合。电子模拟器上的 undo 操作一不小心就把桌面状态弄乱了。毕竟桌游除了桌面,人脑里还有一整套游戏状态,缺少实体会让大脑负荷要重得多。
谈点体外话。由于这款游戏规则相对繁杂,我尝试用 AI 辅助学习游戏规则,使用的 Gemini 。可惜这个游戏还太新,网上资料太少。导致 Gemini 对游戏规则细节知之甚少。但它又表现得很懂,对话中自信满满。我问了很多规则细节结果都是错的,即使我让它指出细节出至规则书上具体哪里,也全是幻觉。甚至引用论坛网友的讨论也能理解错误。最后,我还是得自己推敲规则书,或是用传统的搜索方法找到 bgg 论坛规则讨论版面的帖子,研读作者写的 FAQ 等等。和 AI 的问答阅读起来固然舒服,针对性很强(不像规则书读起来那么累),但我实在没有能力鉴别 AI 的错误。毕竟我原本就是因为不懂规则才去问的呀。
有些错误还是能看出来。毕竟我玩的游戏很多,可以从作者的游戏设计思路角度去考虑。玩的过程中有疑问去问 AI 。对反直觉(感觉游戏不应该这样设计)的答案有所警惕,可继续追问。但有些真看不出来。
比如我在和 bot 对战时,触发了一条 bot 需要 log 一艘飞船,我不知道该如何处理。(特地用英文术语)问了下 AI 。AI 告诉我应该把最近 bot 部署的 ship 卡 log 起来,并将同一地区的所有外派部队收回。但后一条是 AI 自己编的规则,我在规则书中怎么都找不到对应的文字。反复询问,AI 都表现的信誓旦旦。让我去查规则书某个章节(其实不存在)。它还引用了 BGG 论坛的帖子。而我仔细研读了大篇的帖子后,确定是 AI 混淆了 log 和 dismiss 的处理方法。
再有一例:游戏的舰长面板分 A/B 两面,供玩家选择。A 面只有一个任务,B 面有三个任务,其中一个和 A 面任务完全相同。完成 B 面的任务还有额外的 VP 奖励。我一开始非常不解,初看起来,A 面没有任何优势,因为 B 面不仅提供了 A 面的选择,有额外 VP ,还可以有更多选项。我在规则书上也没有找到选择 B 面的惩罚。带着这个问题我询问了 gemini ,它在搜索了 bgg 论坛后,又胡扯了一堆什么 A 面让玩家更专注,完成难度和行动奖励不同(实际完全一致的)。但实际上,核心差别其实是:B 面的科技/军事/影响力等导轨设计不同(我一开始没注意到,规则书里也没提这个差异),而 BGG 论坛里针对这点讨论的帖子中,下面好几条回复都强调了这一点,gemini 恁是在查看帖子后,把这条最重要的信息忽略掉了没告诉我。
结果,我和 AI 的这些对话并没有帮我节省理解规则的时间。不仅自己重新反复研究规则书,还花了更多时间去论坛看帖(当然这不是坏事)。我想,如果我让一个人类游戏玩家教我,若是自己没怎么玩这个游戏的话,都不会表现的如此自信吧。如何辨别 LLM 提供的信息中哪些确有价值会变得更加重要。LLM 的语言表达能力越来越强,也会变得越来越有欺骗性。
2026-02-16 13:23:19
最近一年闲下来,我重新挖掘了读书的乐趣,尤其是读小说。
读小说真的需要时间和心境,因为进入心流状态更慢。如果长时间无法进入状态,很容易就读不下去;但一旦读进去了,比玩游戏(互动形式)或看影视剧(多媒体形式)更让人沉浸和回味。你可以对精彩处反复斟酌体会其中的情感,也更容易停下来脑补作者在情节上的留白。阅读节奏完全由自己控制,可快可慢。鉴于制作成本,小说的多样性远超其它媒介,提供的选择就更为宽泛。
我最近尝试使用 AI 来提升我的阅读体验。首先发现的是 AI 非常适合荐书。我使用的主要是 Gemini ,免费的版本就足够了。我可以先列举一些我很喜欢的书,让它帮我推荐更多。在初选的名单中,再通过对话了解书的特色。为了避免自己总是阅读类似的书,也会让 AI 推荐一些我之前没有尝试过的类型。当然,小说本身还是人创作的,通过推荐作者比推荐书本身更有效率。
这两个月我想读点太空歌剧类的小说,但老一点的名著基本都看过了,所以转向近十年的新作。另一方面的原因是大多数科幻小说本身就有时效性,这些年人类现实中的科技发展很快,文学家的幻想很容易随着时间和现实脱节。
但我很快就发现,想读新一点科幻小说最大的问题是中文版的翻译速度完全跟不上。AI 推荐的书 90% 都没有中译版。即使把时间放宽一点,十年前的长篇,往往也只翻译了开头。这很好理解:如果出版了第一本销量不如意,可想而知后续会更不理想。这在经济上是绝对理性的行为,可对粉丝来说颇有点难受。
题外话,桌游领域也有点类似。桌面游戏通常也是由单个人设计,受者也非大众。即使设计者想好了出一个系列,若前作卖得不够好,扩展包也就难以发行。我最喜欢的桌游设计师 Thomas Lehmann 解释过 Res Arcana 的第三个扩展 Res Arcana Duo 为什么作为一个(看似简化过的)独立游戏发行而不延续扩展包的形式:必须想点办法扩大这个系列的玩家群,否则扩展包的销量只会越来越少。作为中文用户,我对 Res Arcana Duo 至今没能出中文版还是有点伤心的。希望今年的新作 Dark Pact (2026) 黑暗契约可以出中文版。看完介绍,我对这个纯粹的卡牌构筑游戏颇感兴趣。
我是 Old Man's War 系列的忠实粉丝,很喜欢 John Scalzi 。他的书读起来一点也不累,那种书中遍处可见的程式员式的冷幽默颇对我胃口。我前段时间在京东上买了一本互惠帝国系列的第一本《崩塌的帝国》。收到书时是一个暖日的下午五点,晚上十点就合上了书页,中间除了正常吃了个晚饭,别的时间都在读书。读这本书的另一个动机是我想多看看关于太空旅行的不同设定(以给设计我那个关于太空航行的游戏提供灵感)。读完了这本书后,除了很满意书里的科幻设定外,还很期待后续的故事发展。
可惜这套三部曲的后两本一直都没有翻译成中文版。
我觉得我近些年的英文阅读水平提升了不少,要不尝试一下直接读英文吧。试了一下,离享受读书还是颇有距离。阅读小说需要一个流畅的体验过程,无法顺势进入心流,阅读就变成了一个苦差事。文学类作品和技术类文章差异很大,能顺利阅读技术类英文,不等于读小说也没问题。我想还需要更多的阅读练习,而学习必然辛苦,这不是我目前想要的。
隔了两天,我尝试了另一个方法,这是我发现 AI 能提供给我的另一项重要帮助:翻译阅读。
我觉得,技术类文章和文学类创作最大的不同是:前者追求用精炼准确表达知识,后者需要在描述作者构思的情节之外传达情感。理解一本小说,需要基于对小说中人物和故事的理解;正如翻译一本技术书,你得理解其中的技术原理。这也是为何机器的逐句翻译无法做到准确的原因。大语言模型应该能改善翻译,但我一开始尝试的还是直接的 google translate 和装在本地 ollama 中的 translategemma 本地模型,对小说直译。
用不同方法,经过几个章节的体验,我发现最适合我的是让机器完全对译,不做任何针对中文语境的加工,并以中英对照的形式一段段话展示供我阅读。我主要还是针对中文阅读,虽然语言感觉有点蹩脚,但因为我知道信息原本是英文的,而我又有相当的英文语法知识,所以大脑很快就能适应,在阅读过程中自动转换为合适的中文理解。由于是机械直译,反而不会缺失信息。当觉得句子难以理解时,迅速跳转到英文原文处,通常就明了了。读到精彩的对话,往往回味一下英文原句更有感触。
有些句子颇难理解。这时可以打开一个 Gemini 对话,提供它足够多的上下文,然后贴上原文,Gemini 可以解释得非常清楚。毕竟这是 10 年前的小说了,我估计小说的原文本身(甚至第一卷的中译本)就是大模型的训练材料。比如这次我就学到一个知识:在英文语境中,皇帝会自称 We/Our 而不是 I/My ,用来指代个人和背后皇权的双重身份,这和中文背景下,皇帝自称“朕”颇有共通之处。第一次读英文直译时,我会对翻译器输出的“我们”有所疑惑,但随即和 AI 讨论就学到了这个。第一卷的中译本中,译者恰如其分的选择了“朕”来翻译 We ,google translate 这种直译显然是做不到的,但 Gemini 有了上下文就能选择这种译法。我很怀疑它受了训练语料的影响(被中译版的文本训练过)。
我用这个方法读完了第二本《the consuming fire》,大约花了 2-3 倍第一本的时间,阅读速度的下降是很明显的,但可以接受。我觉得稍加训练就可以改善到完全不影响阅读心流的状态。然后我读了第三本《The Last Emperox》,居然和读第一本一样的时长。但我觉得倒不是我快速适应了这些新的阅读方法,而是这个系列三本书的故事结构其实是类似的,读到了后面,跟上书的节奏越来越容易了。阅读长篇小说的过程有点像是在在脑子里逐步搭建作者构建的世界,然后一点点填上细节,最艰难的部分在最前面,后面就是顺理成章的活。
即使情节上有点雷同,我还是很喜欢这套三部曲。
这两天在补《The Expanse》小说的最后三卷,不需要等美剧了 :)
2026-02-11 17:28:25
我大概是去年 4 月左右开始跑步的。离上次的记录已过了半年。
最近坚持的还不错,每周可以保证至少 3 次跑步。现在的心肺能力明显好了很多。去年刚跑步时,每跑 5-10 分钟就需要步行几分钟缓缓,不然心率很容易超过 140 (我给自己定的心率上限)。现在差不多可以保持心率在 140 以下连续跑完 4 km 了。大约花费 30 分钟。这差不多是 8km/h 的平均速度,前半程会更快一点,后半程为了保持心率需要降一点速度。
我觉得另一方面的原因是在冬季,跑起来不那么热。现在会挑选中午有太阳的时候跑,晒晒太阳更舒适。跑完后也没特别累的感觉,只是在最后 10 分钟有一点点难受,希望快点结束。但每次还是坚持跑满 30 分钟。
我家附近 500 米处开了家抱石馆。在两个月前,我带可可去了一次,她莫名其妙的喜欢上了抱石。去了两次后就让我给她办张月卡。我说,次卡每次 95 ,月卡 750 ,一个月要去 8 次以上才划算。她说没问题,几乎天天晚上让我带她去。虽然有一半的动力是去岩馆撸那只胖猫,但看得出来是真的喜欢。我之前也带云豆出去攀岩,从小到大爬过上百次,谈不上讨厌,但始终爱不起来,我也没逼他。后来可可长大了一点,去过两次明显没有兴趣,我干脆就不带她去了。这次莫名其妙的爱上抱石,我是没想到的。
一开始,她只能爬 v0/v1 的线路。但进步非常快,她有从小练起的舞蹈基本功打底,身体的柔韧性特别好,尤其在爬平衡线上特别有优势。在岩馆中超过很多大人(新手)也颇为得意。在第二张月卡时,几乎可以完成所有的 V2 线路,并勉强可以挑战 V3 了。毕竟身高臂展上有劣势,一些成人可以顺利完成的 V2 线路,她需要多做几个动作,无形中提高了难度。
我跟着她也办了月卡,但不会每天爬,有时就是看着教一下,但也比过去勤快了许多。水平也跟着上升。现在可以爬一些 V4-V5 的线路了,而上次在这个水平还是小孩没出生前,体重在 75kg 以下的时候。
现在体重保持在 83kg-84kg 之间,已经很久没有降低了。比半年前再减了大约 2 kg ,比开始跑步前最重 93kg 时几乎减了 10 kg 。考虑到力量(肌肉?)也有所增长,还算满意。身边很多人都说我前两年日益见长的肚子又消失了。希望未来一年可以把体重降到 80kg 以下。
体能的上升对爬高墙的帮助特别明显。去年时,我去岩馆爬高墙,差不多 3-4 条线后就需要躺下休息。现在可以爬满两个小时。最近开始恢复爬先锋(比顶绳更消耗体力,我已经有 10 年没爬过了),发现自己又可以比较轻松的完成 5.10c/d 左右的先锋线路了。去年野外去了多次英西,一次阳朔,一次六盘水。野外先锋还没怎么爬,明年应该可以逐步恢复。
另,痛风未再来过。但尿酸水平并未降低,也没有更高。
还有一个身体的小问题值得注意:有次在去阳朔的车上和同车的岩友聊天。我说我的指关节常年疼痛,是不是大部分攀岩者都是这样。他们的水平都比我高一大截,说并不是这样,这种现象只在部分超高水平的岩友中听过,并建议我保护好指关节,减少抱石中那些指力线路。
我回头和 gemini 讨论了一下,建议是差不多的。另外可以做一些反向的力量训练,我买了一根套在指头上外撑的橡皮筋每日练习。也正是这个原因,我现在没有跟着可可一起每天抱石,并在刻意减少了需要做 Crimps 的线路。目前恢复的还不错,至少日常不爬的时候关节不疼了。
可可还拉了一个同班的小女孩一起抱石,我意外的发现她爸爸的爱好是跑马拉松。我请教了他许多长跑的问题,他说下次带我跑一次 8km 再加到 10km 。据说他从高中开始长跑,一直停留在每次 5km 的量,直到有人带着跑才越过这个坎。虽然他真的很爱长跑,但说每次跑马拉松,跑到最后也是非常难受的,全靠意志力坚持下来。
虽然云豆对和我攀岩兴趣不大,却意外的愿意和我一起跑步。部分原因是他意识到自己体重有点超标了。目前是六年级的寒假,身高 1.74m ,体重最重时有 77kg 。我说你还是跟我跑步吧,我能减下来,你也可以。
寒假第一次跟我跑了 4 km 累得不行,后来我便随着他减到 3km 一次。毕竟是小孩,慢慢的就适应了。和他一起跑步,也帮我把速度提了起来。他嫌我跑得太慢(一开始我跑 4km 需要 35 分钟),父子俩跑了几次后便在半小时之内了。这跑步的兴趣也来得莫名其妙,最近一周就跑了 5 次。(体重还真减了一些,75kg)
今天跑完我告诫他,切忌一时热情,锻炼身体是个长期的过程,贵在坚持。每次跑到最后,总会有点难受的,需要一些意志力说服自己坚持下来。有个伴当然最好,可以相互督促。养成习惯后,日后住校,也能有自驱力。
ps. 教育子女真的是个长期的活。我琢磨着儿子愿意跟我跑步还有一部分原因是最近两个月每晚带着妹妹攀岩有点懈怠了他,或许是有点吃醋:过去我总是陪他比妹妹多一点的。而妹妹似乎不愿意跑步…… 结果,我也被动的增加了颇多的运动量,何尝不是件好事。
2026-01-24 21:08:25
上个月我花了不少时间在 dotAge 这个游戏中。我很喜欢这种通过精算规划应对确定风险的感觉。由于 dotAge 有很强的欧式桌游的设计感,所以我在桌游中尝试了一些有类似设计元素的单人游戏。
我感觉体验比较接近的有 Voidfall (2023) 和 Spirit Island (2017) 。因为灵魂岛(spirit island )更早一些,而且 steam 上有官方的电子版,bgg 上总体排名也更高,所以我在上面花的时间最多。
这两个游戏的特点都是确定性战斗机制,即在战斗时完全没有投骰这类随机元素介入。在开战之前,玩家就能完全确定战斗结果。战斗只是规划的一环,考虑的是该支付多少成本或许多大的收益。而且灵魂岛作为一款卡牌驱动的游戏,完全排除了抽牌的随机性,只在从市场上加入新牌(新能力)时有一点随机性。一旦进入玩家牌组,什么时候什么卡牌可以使用,完全是在玩家规划之内的。这非常接近 dotAge 中规划应对危机时的体验。
灵魂岛的背景像极了电影 Avatar :岛的灵魂通过原住民发挥神力赶走了外来殖民者。每个回合,把神力的成长、发威(玩家行动)和殖民者(系统危机)的入侵、成长和破坏以固定次序循环。其中,殖民者的入侵在版图上的地点有轻微的随机性,但随后的两个回合就在固定规则下,在同一地点地成长和破坏(玩家需要处理的危机)。扮演岛之灵魂的玩家可以选择到破坏之刻去那个地块消除危机,在此之前玩家有两个回合可以准备;也可以提前在殖民者成长之前将其消灭在萌芽之中,但这给玩家的准备时间更少,却往往意味着更小的消耗;还可以暂时承受损失,集中力量于它处或更快的发展神力。游戏提供给玩家的策略选择着实丰富。
法术卡并不多,每个神灵只有几张专属的固定初始能力卡,其它所有的能力都是所有神灵共用,让玩家自由组合的。每当玩家选择成长时,可以随机 4 选 1 。不像卡牌构筑类游戏会有很多卡片,这个游戏总体卡片不多,每张都有决定性作用。每个回合通常也只能打出一两张 张,待到可以一回合可以打出三张甚至四张(很少见)时,已经进入游戏后期在贯彻通关计划了。法力点数用来支付每张卡的打出费用这个设计粗看和卡牌构筑游戏类似,但实际玩下来感觉有挺大的不同。灵魂岛每个回合未用完的法力点并不会清零,而会留置到下回合使用且没有上限。从玩家规划角度看,更像是需要玩家去规划整局游戏的法力点分配。精确的打出每个回合的很少的几张卡片。因为抽回打过的法术卡并不随机,玩家便要在法力成长和法术重置上做明确选择。挑选法术序列变成了精密规划的一环。
在 dotAge 中,版图是需要规划的,玩家需要取舍每个格子上到底放什么建筑以达到连锁功效最大化。而在灵魂岛中,每张法术会提供一些元素,同一回合激活的元素组合可以给法术本身效果加成。我觉得这两个设定有异曲同工之秒。我在思考游戏设计时,受 dotAge 和 Dawnmaker 的影响,总觉得需要在版图的位置上做文章才好体现出建筑的组合,玩过灵魂岛才发现,其实单靠卡牌不考虑版图布局其实也能实现类似的体验:几张特定的法术卡组合在同一回合打出会对单一法术有额外加成,而这种组合可以非常丰富。去掉随机抽卡机制,让玩家可以 100% 控制自己牌库中的组合选择;而且总牌量很少,每个回合出牌数及其有限(受单回合出牌数及法力点双重限制),让发牌组合必须有所取舍。这像极了我在 dotAge 的狭小地图空间中布局建筑的体验,这个格子放了这个,那个建筑就得不到加成。
但受限于桌游,灵魂岛的游戏体验和 dotAge 差别还是很大的。我玩了(并击败了)多级难度的灵魂岛,难度越高差异越明显。桌游必须要求短回合快节奏,这让游戏规划的容错性大大降低。dotAge 一局游戏可以玩一整天,即使是超高难度,也允许玩家犯点小错误。由于电子游戏可以把元素做得更多,让机器负责运转规则,单点的数值关系就可以更简单直白。而灵魂岛这种需要在很少的行动中体现复杂计划的多样性,那些法术的真正功效就显得过于晦涩:虽然法术字面上的解释并不负责,但理解每个法术背后的设计逻辑,在游戏中做出准确的决策要难得多。
我在标准难度下,玩了十几盘才真正胜利过一次灵魂岛。之后每增加一点难度,感觉挑战就大了不少;反观 dotAge 我在第二盘就领会了游戏得玩法而通关,困难难度也并未带来太大的挫折感。但现在往上加难度玩灵魂岛,我还是心有余悸,不太把握得住。而且直到现在我都没敢尝试 2 个神灵以上的组合玩法,那真是太烧脑了。难怪实体版桌游都是多人合作,而不是 1 控 2 去玩。
Voidfall 从游戏结构上更接近 dotAge 一点。它完全没有战斗,就是纯跑分。只要你跑分速度超过了系统规则,就胜利了。dotAge 几乎就是这个框架:玩家需要在疾病、恐惧、温度和自然四个领域积累积分抵抗系统产生的四类危机。在每次危机来领前做好准备,也就是积累产生对应领域积分的能力。
但无论是 spirit island 还是 voidfall 都没有 dotAge 中最重要的工人分配机制。从游戏机制角度看,dotAge 更像是电子化的 Agricola (2007) 农场主。因为农场主在桌游玩家中太经典,几乎所有桌游玩家都玩过,这里就不多作介绍了。虚空陨落(voidfall)则是一个比较新的游戏,值得简单讲一下。它没有官方电子版,但在 Tabletop Simulator 中有 mod 可以玩。
和 dotAge 的四个领域有点类似,voidfall 中玩家有军事、经济、科技、政治四个方向的议程可以选择。获得对应的议程卡后,就可以大致确定一个得分路线。不同的路线同时影响着玩家当局游戏的游戏过程。
桌游的流程不会设计的太长,在 voidfall 中只设计了三个阶段,每个阶段有一张事件卡,引导玩家的得分手段。这些事件的效果是可预测的,这和 dotAge 的预言很像。三个阶段也和 dotAge 的季节交替末日来临类似:用规则控制游戏节奏,明确的区分游戏不同阶段要作的事情。一开始生产建设、然后扩张战斗、最后将得分最大化。
我没有特别仔细的玩这个游戏,但从粗浅的游戏体验看,还是颇为喜欢的。过几天会多试试。
我对“确定性战斗机制”这点其实没有特别的偏爱。基于骰子的风险管理机制也很喜欢。
前两年就特别关注过 ISS Vanguard (2022) 这个游戏。最近又(在 Tabletop Simulator 上)玩了一下 Robinson Crusoe: Adventures on the Cursed Island (2012) 和 Civolution (2024) 。这几个游戏都特别重,几句话比较难说清楚,而且我游戏时长也不多,这里就不展开了。
顺便说一句,同样是鲁宾逊的荒岛求生题材的单人桌游 Friday (2011) 是一个非常不错的轻量游戏。如果不想花太多时间在重度游戏上,它非常值得一玩。这是一款及其特别的卡牌构筑类游戏,整个游戏机制不多见的把重点放在卡组瘦身上:即玩家更多考虑的是如何有效的把初始卡组中效率低效的卡精简掉。
游戏上手容易,大约花 5 分钟就能读完规则;设置成本极低,只使用一组卡片;但却颇有难度,我差不多在玩了 20 盘之后才找到胜利的诀窍。淘宝上就可以买到中文版(中文名:星期五),推荐一试。
2026-01-15 16:05:08
最近一段时间和 AI 聊游戏设计比较多。我主要用的是 google 首页上的 AI 模式,也试过 twitter 上的 grok 。
去年也和朋友聊过很多,但对理清楚自己的想法帮助有限。因为和人聊容易陷入不断的细节解释当中,一些天马行空的想法更容易被质疑,一旦陷入辩论就不太容易跳出来。而且每个人的时间并不固定,很容易造成时间和精力的浪费。和 AI 聊要轻松得多,AI 毕竟见多识广,随便提到的点都能接得上话。不想聊下去尽可以中断,不用担心浪费时间。即使怀疑 AI 出现幻觉,也可以随时暂停下来通过搜索核实。
不过,我觉得和 AI 讨论也有另一方面的问题。那就是太容易顺着你的思路夸大其词。它更像是一个貌似领域知识渊博但只是想讨好你的同好,不断的放出一些华丽的辞藻却在逻辑上经不起推敲。分析起游戏来头头是道,直到谈到我真的玩过上百小时的游戏时,对游戏的细节错误百出。如果我没有这些游戏的真实体验,几乎不可能分辨真伪。一开始我还会想和真人讨论时一样指出它的错误,让它修正后重新发表观点。后来就渐渐放弃了从 AI 那里直接获得真知。把它当成一个比搜索引擎更方便的信息获取入口就够了。
但我依然偶尔被 AI 的总结惊艳到。比如说有一场主题为模拟类型游戏的话题,聊到最后 AI 总结:
成功的模拟游戏本质上是“熵增模拟器”。设计师的任务是制造一个不断趋向于“热寂”和“混乱”的世界(交通拥堵、热量堆积、资源耗尽、情感崩溃),而玩家的乐趣在于投入自己的脑力作为“负熵”,去建立一个脆弱但精密的秩序。
所以,在设计时,不要害怕设计“笨拙”的规则(如巡逻员、有体积的货车、会变质的食物)。这些“物理摩擦力”正是通往成就感的阶梯。如果没有这些混乱,游戏就只是一张算好了答案的报表。
要让玩家感到“战胜了混乱”而不是“被垃圾规则恶心”,需要遵循以下原则:确定性的混乱:混乱的原因必须是可回溯的。 提供“高级工具”来解决“基础问题”:游戏初期给玩家简单的工具去面对混乱,中后期给玩家更高级的逻辑工具。从“点”到“面”的连锁反应:混乱不应是孤立的错误,而应该是系统性的连锁反应。
我觉得在这种形而上的话题上,它讲得还是蛮有道理的。但我依然不觉得这些总结真的可以成为游戏设计的指导工具。
当然,让 AI 说什么依然极度依赖你对它说了什么。大多数时候 AI 会信誓旦旦的帮忙做一些具体设计(当我想设计卡牌驱动的游戏时),可我真的实体化这些卡片试玩后,完全玩不下去。我实在没信心再和它讨论这些卡片设计上的具体细节:真的不如我自己从零设计高效。但有时候,AI 也会对设计游戏这件事情有所畏缩,一旦强调我应该先用卡纸或在桌面模拟器中自己尝试做个原型试试。总之,让我感觉本质上它还是在跟着我的情绪走。完全没有独立思考的痕迹。
意识到这点,我现在更想把今天的 AI 当成一种更高级的知识搜索引擎。从这个角度看,这段时间 AI 的确给我推荐了不少不错的游戏。虽然我仔细玩过之后,这些游戏给我的体验并非完全符合 AI 的描述,我还是感谢 AI 让我挖掘出了它们。
尤其值得一提的是 AI 极力向我推荐的 dotAGE 这个游戏。我一口气玩了接近 160 小时。
其实它刚上 steam 的时候我就玩过 demo ,当时只是觉得还不错,但没有深入。前几天 AI 反复督促我要仔细玩一下,我才沉浸了进去。这是款回合制没有战斗的城市建设游戏。随机元素很少,几乎所有要面对的灾难,都在游戏规则下提前预示给玩家。玩家要做的就是提前规划每个回合的行动,通过精算赢得游戏。值得一提的是,游戏推荐的难度和最高难度给我的几乎是截然不同的游戏体验。在默认难度下,即使对游戏规则不甚了解,不需要精确规划,也能通过运气赢得游戏胜利。那种“Push Your Luck”机制驱动带来的胜利是一种相当刺激的游戏体验;但在最高难度下,游戏变得无法通过运气获胜,转而必须精密规划。而这种精算带来的又是另一种成就感。
在玩游戏之余,我又阅读了作者在游戏发售前夕于 reddit 上写的两篇文章,方才了解到这个游戏几乎是作者一人在攻读完游戏设计专业的博士学位后,独自花了 9 年时间制作出来的,颇为震撼。怪不得我在玩的时候感觉这个游戏要深度有深度要广度有广度,完全不像是能短期做出来的。只能说,设计出好的游戏真的很难。