Skip to content

Latest commit

 

History

32 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Null Pointer

《Null Pointer》是一款基于 Godot 4.6 引擎开发、深受《杀戮尖塔》(Slay the Spire)启发的 Roguelike 牌组构建(Deckbuilder)游戏。本作基于巨佬 DesirePathGames 的 Slay-The-Robot 框架 深度定制与重构开发。或者说,这是一个披着卡牌游戏外衣的代码实验室。

📸 游戏预览

大厅界面 游戏战斗界面

脚本图鉴 外设图鉴

🎮 怎么跑起来?

不需要繁琐的构建步骤,如果你头铁,甚至可以不用看文档:

  1. 请下载 Godot 4.6(对,就是那个让你告别编译等待的引擎)。
  2. 将这堆代码导入编辑器。
  3. 找到 res://scenes/Root.tscn,深吸一口气,按下 F5,然后看着赛博卡牌在屏幕上飞舞。

✨ 游戏核心特色与架构:硬核解耦的强迫症福音

这不是简单的 demo,而是一个在架构上近乎有“代码洁癖”的强健框架。我们信奉“数据驱动一切”,如果一段逻辑能用数据表达,就绝不在代码里硬编码。

🃏 数据驱动的“赛博骇客”卡池

所有卡牌不是手捏的独立场景,而是纯粹的 CardData 模板。借助高度动态的 API,你可以轻松搓出一张诸如“逻辑炸弹”、“零日漏洞”的骇客卡牌。不仅如此,游戏内置的卡牌修饰器(Decorator)系统能像病毒一样动态感染你的卡牌,为它们打上各种“后门”或“提权”的离谱效果。

🗂️ 内容池打包管理 (Content Packs)

随着进程推进,通过底层的 CardFilterArtifactFilter 缓存机制,不同卡牌和外设会被平滑地注入商店或战利品堆。这让整个游戏极其容易扩展——你要做一整套新卡牌?加个 Pack 就行,底层逻辑对你微笑并表示毫无压力。

⚔️ 万物皆 Action,没有什么是入栈解决不了的

我们摒弃了杂乱无章的硬编码函数调用。任何交互(抽牌、攻击、购物、甚至上个 Buff)都由 ActionHandler 单例接管并压入 Action 栈。底层甚至允许你用纯数据写简单的 for 循环和 if/else 嵌套。在这里,代码就是卡牌的结算咒语,且绝对不会死锁(大概吧)。

📜 拦截器 (Interceptors) 与文本接管 (TextParser)

还觉得结算不够复杂?游戏的 动作拦截器(Action Interceptors) 能在任何动作生效前横插一脚。无论是玩家的外设还是敌人的状态,都可以无情“劫持”伤害判定并肆意篡改。

而在 UI 层,你的噩梦结束了:所有的富文本(包括卡牌伤害、意图、甚至动态状态与卡牌名称染色)全被全局单例 TextParser 强制接管。如果卡牌显示它能打出 5 点伤害,那它的底层运算一定就是 5 点。再也不会有“文案写着加 10 血,实战只回 5 血”这种令人吐血的 Bug。UI 和底层共享同一个数据流,文案和数值达到了真正的“知行合一”。

🎵🎞️ 视听表现与特效

谁说开源项目就没有特效?内置的 CombatVFXAnimationsAudioConstants 提供了一整套视听轰炸。挥砍、重击、电子魔法,甚至是卡牌出手的随机音效,皆有统一的数组接口调度。配合满屏的战斗浮动数字(Combat Floats),打击感不仅扎实,甚至还有点上头。

🎲 薛定谔也会流泪的确定性随机数 (Deterministic RNG)

作为一款严谨的策略游戏,我们绝不容忍“洗牌污染掉宝率”的低级错误。所有随机操作皆被划分到独立的确定性随机数(Deterministic RNG)轨道中,并受玩家种子(Seed)死死控住。这就意味着:SL 大法(存档重开)是无法逆天改命的,你的非酋命运从游戏开始的那一刻就已经被写死了。

💾 JSON 级自动存档与无缝读档

由于核心数据均继承自强大的 SerializableData,游戏拥有近乎黑魔法般的存档能力。你的一切操作、多层嵌套的对象、甚至极客状态钩子,都会在后台被无情地序列化成一个 JSON 文件。想停就停,读档秒连。

⚙️ 天生就是为了 Mod 存在的

得益于极致的解耦和序列化设计,《Null Pointer》天生就是一个 Mod 游乐场。只要你在 external/ 目录下丢几张图,写几个 JSON,甚至挂载自己的 GDScript,你就能篡改游戏的内核行径。我们甚至内置了专门针对资产覆盖的动态加载劫持机制(FileLoader 回退)。去吧,把这个游戏改得面目全非吧。


📂 项目目录结构:让强迫症极度舒适

  • autoload/:包含统领全局的 Singleton 大佬们(Global.gd, ActionHandler.gd 等),掌控核心状态与数据生成。
  • data/:绝对的内核数据层。所有资源皆由 SerializableData 衍生,区分为只读的原型模板(prototype)和运行时可变状态(mutable)。
  • scripts/:游戏底层的纯逻辑控制区。包含 actions/(动作系统)、action_interceptors/(拦截器)、combatants/(战斗实体)等,边界极其清晰。
  • scenes/:所有的 .tscn 场景文件,与 scripts/ 的结构保持了不可思议的高度一致。
  • external/:外部资源与 Mod 的法外之地。受 .gdignore 庇护,引擎不会乱扫。外置的图、音效和数据全丢这里。
  • sprites/ & sounds/:引擎内置导入的“官方”贴图与音效,与外部挂载严格区分。
  • addons/:Godot 编辑器插件(比如 sound_manager 等强力外援)。
  • themes/, animations/ & misc/:负责表面功夫的 UI 主题、战斗动画和贝塞尔曲线等杂项配置。

🙏 特别鸣谢 (Acknowledgments)

本作的底层核心框架源自开源项目 Slay-The-Robot。在此特别鸣谢 DesirePathGames 大佬!他的底层架构不仅提供了极度强健的数据驱动机制,更为《Null Pointer》能够实现极端的代码解耦奠定了不可磨灭的基石。没有这位巨佬的无私开源,就不会有这个赛博世界的诞生。


⚖️ 开源协议:加入这场赛博狂欢

本游戏自行创作的源代码与游戏数据采用 GNU GPL v3 开源协议。你可以在遵守 GPL v3 的前提下修改和分发这些内容。音乐、音效、美术、商标及其他资产不因代码采用 GPL v3 而自动获得相同授权,除非对应资产另有明确许可说明。

注:本作底层依赖的 Slay-The-Robot 框架部分代码版权归原作者 DesirePathGames 所有,并遵循其原本的 MIT License。完整的第三方版权与许可声明见 LICENSES/。在遵循各自协议的前提下,欢迎任何赛博漫游者克隆代码,我们在这片代码废墟里等你!

About

基于 Godot 4.6 开发的 Roguelike 卡牌构建游戏。采用纯数据驱动、Action 栈结算与确定性随机数,提供高度解耦的 Slay the Spire 级底层框架。

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages