入夜,徐子游躺在自家床上,看着天花板,脑子里却还在转。
打地鼠、打猎、打鬼子。够用,但不够狠。
cES上那么多大厂,任天堂、索尼、微软、苹果,哪个不是带着重磅产品去的?他一个香港小厂,就靠三款小游戏,凭什么让人记住?
更何况还有一头势必会吸引所有人注意力的猛兽。
床边书桌上摊着他订阅的《电子游戏月刊》,头版就是苏清妍提及的那个俄罗斯方块的北美发行预告,苏联佬的这个方块游戏,去年在欧洲已经卖疯了,这次美国cES电子消费展,它会正式杀进美国市场。
他那三个小游戏,撑死了也只是个小游戏,路过的人停下来玩个三五分钟,转头就忘了。跟俄罗斯方块比,根本不够看。
他需要一个东西,能让客户坐下来就不想走,走之前还非要夸一句“这鼠标不错”。
微软当年,是靠什么把鼠标卖出去的?纸牌游戏。全世界都认识扑克牌。美国人爱打,欧洲人爱打,日本人香港人也爱打。上手零门槛。
靠着那些个纸牌小游戏,微软硬生生把鼠标从没人要的冷门配件,做成了 pc 的标配。
那他能不能搞个更狠的?
徐子游脑子里不由自主冒出来那个 2024 年爆火的小丑牌(balatro)。
后世的独立游戏黑马,一套扑克牌加一堆小丑,卖了五百万份。他上辈子也沉迷过,通关了不知道多少遍。
点鼠标就能玩,继承了纸牌的强上瘾性,还刚好能把他那光电鼠标的优点全给老外展示得明明白白。
但那游戏,他太清楚,优点一大堆,但毛病也不少。
第一,平衡性烂得一批,有的小丑牌强到离谱,有的小丑牌刷新出来弱到送都没人要;
第二,高难度没刷出那几种好通关的构筑基本等于坐牢,前两轮刷不到牌直接暴毙;
第三,牌型平衡问题很大,所有人都在打同花,顺子和同花顺没人玩。同花、对子、高牌等简单牌型收益过高,顺子、同花顺等高难度牌型收益不成正比,导致大多数玩家只打几种固定牌型,其他牌型沦为摆设。
第四,后期关卡数值膨胀过快,大部分流派撑不过几轮。
这些问题,对他来说,都不是问题。
最大的问题是,原版游戏文件他记得没错的话要100来m,他不确定以现有技术复刻这款游戏能不能装进一张标配为1.44mb的软盘里。
技术限制倒逼着他必须精简。这年代c语言虽然已成熟可用,并有实际游戏项目使用?,但并未成为主流游戏开发语言。
第二天一大早,徐子游坐在电脑桌前,细细翻着turbo c 的手册还有 mASm 汇编的参考书,要想做极致的优化,光靠c语言还不够,他还得用汇编啃核心。
他在脑海里,把小丑牌的所有东西,拆成了一个个模块,一个个复刻优化。
首先是引擎。原版用的 Love2d,那玩意本身就占了几十mb,跑起来内存要 1G,目前主流的8086电脑根本跑不动。直接扔了。
他自己写引擎,用c写框架。核心的逻辑,比如扑克判定、小丑效果的计算,全用 8086 汇编写。随机生成,用线性同余法。种子固定,保证每局可复现,方便测试。
这一步就花了他大半天。
他对着汇编手册,一点点抠指令,把那些冗余的跳转全删了,把条件分支预测做到极致,原来 c 语言要几十行的扑克牌型判定,用汇编写,才几十字节,跑起来速度快了三倍,还省了一半的空间。
52张牌,四个花色,十种牌型。高牌、对子、两对、三条、顺子、同花、葫芦、四条、同花顺、皇家同花顺。完美识别!
然后是数据。原版的卡牌数据,用的是 Lua 的脚本,一个小丑的数据就要上百字节,150 个小丑,光数据就几 mb。
他把所有的数据,全压成了位字段。将小丑牌的数据,做成表格。一个小丑的完整数据占八个字节——编号、名称、效果类型、触发条件、数值参数。150 个小丑,全加起来不到2.4Kb。
然后是字符串,那些卡牌的名字、描述,原来每个都存一遍,比如 “筹码”“倍率” 这两个词,几十个卡牌都用到,原来要存几十次,他做了个索引表,把所有重复的文本,只存一次,其他地方用索引指向它,光是这一步,又省了几十Kb。
那些没用的东西,全砍了。
原版的成就系统、云存档、mod 支持、统计面板,全扔了,只留最核心的单机要素,出牌、商城买牌、打盲注,就够了。
代码写完的时候,他看了一眼编译后的大小,512Kb。
图形部分最头疼。原版的像素美术,24 色,还有 cRt 的模糊特效、屏幕抖动的动画,光这些就占了几十 mb。他全砍了。
主流的电脑从4色的cGA到16色的EGA,游戏要想适配,就得把美术压到最简。
为了尽可能压缩游戏大小,徐子游想了个取巧的办法处理美术:程序生成。
不用每个牌都存一个完整的图。每张小丑牌用参数描述:主色、辅色、眼睛形状、帽子类型、嘴巴弧度。程序运行时根据参数实时绘制,拼起来就是不同的小丑,一张牌只占几个字节的配置数据。
类似的办法也用在了扑克牌上。牌面用字符和色块拼,不存图,只存坐标和颜色。
这么一弄,整个美术资源,cGA 版的才 128Kb,EGA 版的也才 256Kb,加起来,还不到原来的零头。
框架搭好,徐子游开始一条条针对原版不足与时代技术所限带来的问题,进行尽可能的优化。
运气太差怎么办?
徐子游优化商店刷新机制,在玩家第一次购买小丑牌时,系统会记录这张小丑牌上描述的关键词,之后商店会适当调高相同关键词的小丑牌出现概率,并且当玩家再次购买此类关键词的小丑牌时,固定此关键词,减弱其他关键词的出现概率。
小丑牌强弱不均怎么办?
重新调数据。强的砍一刀,弱的拉一把,让每张牌都有用。以前玩lol他就老吐槽设计师只会加减1攻击力,毫无想象力,今天他徐子游得给这些b上一课。
牌型不平衡怎么办?
每种牌型均配一两个强力专属小丑,针对同花顺与顺子前期容易暴毙的问题,提升相关牌型低级小丑牌的下限与能力。
数值膨胀怎么办?
重新算公式。把指数增长改成线性增长,难度曲线调平滑,打点最大分数控制在千万级,不溢出。毕竟这年代的电脑算力有限,数值膨胀太快,对cpu压力太大。
比普通纸牌游戏复杂,玩家玩不明白咋办?
增加一把新手引导型的教程局,只在第一次游玩出现。跟着教程提示走,轻松就能上手。
小丑牌卡池越解锁越污染怎么办?
通关一次后开放牌组编辑,不喜欢的牌可以ban掉。
单人打牌有点枯燥,竞技性太弱怎么办?
增加双人模式,分屏操作,徐子游加了双操作支持,可以一人用鼠标,一人用键盘分开玩。和自走棋设定一样,双方开始100固定血量,前几个关卡分别打盲注买小丑发育,中后期除了15、20、25这种逢5关卡依然采用大盲注,其他关卡把盲注调整为另一个玩家,双方比较打分,分数低的扣血,直至一人血量归零。
最后是原版ui问题,徐子游改的简洁明了,所有信息都清清楚楚一目了然。
这些都弄完了,他开始调性能。
为了照顾当下电脑孱弱的运算能力,徐子游必须做好内存管理。
要是一上来就把所有的卡牌数据,全加载进内存,150 个小丑,虽然数据小,但是全加载的话,内存也吃紧。
他改成分段加载,每个盲注,只加载当前需要的卡牌数据,常驻内存才 480Kb,剩下的内存足以留着临时加载。
这样,就算是只有 640Kb 常规内存的老机器,也能跑。
然后是算分,他做了个查表法,把所有可能的牌型,所有的得分系数,全预存到一个表里,出牌的时候,直接查表,可以快速出结果,解决算力不足的问题。
图形的话,没用的功能比如抗锯齿该关的全关,尽可能缓解加载的压力。
优化搞定,他把编译好的程序,跑了一遍试了试。
加载,8 秒。
运行,完全不卡。
内存占用,完美!
主程序 512Kb,图形资源 256Kb,卡牌数据 64Kb,存档配置 4Kb,加起来,836Kb。
经过好几天的奋战,如今万事俱备,只欠音效了!