重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
godot-genre-roguelike by thedivergentai/gd-agentic-skills
npx skills add https://github.com/thedivergentai/gd-agentic-skills --skill godot-genre-roguelike关于平衡挑战、进程和可重玩性的 Roguelike 游戏专家蓝图。
RandomNumberGenerator,以支持每日挑战/调试。@GlobalScope.randi() 进行关键逻辑;必须使用本地随机数生成器实例,以防止全局状态污染。Array.pick_random() 来掉落关键内容;必须使用洗牌袋来防止统计上不公平的连续出现。WorkerThreadPool.add_task() 或 add_group_task() 将生成任务分配到多个核心,防止帧冻结。广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
RunManager 和 MetaManager 使用独立的单例或资源。duplicate(true);不进行深度复制会导致所有实体共享同一个生命值实例。.tscn 文件中;必须序列化到 user:// 目录下的 JSON 或二进制文件,以防止文件臃肿。SceneTree 作为网格逻辑的唯一真相来源;必须在单独的 Dictionary 或 Array 中维护网格数据。NavigationRegion2D。AStarGrid2D 并设置 jumping_enabled = true(跳跃点搜索),以实现 O(1) 复杂度的查询和在开阔区域的高性能寻路。AStarGrid2D 的 update() 方法;必须确保寻路查询不是过时的。Vector2)表示离散的网格坐标;必须使用 Vector2i 以防止精度漂移。HEURISTIC_CHEBYSHEV 或 HEURISTIC_OCTILE。get_used_cells() 进行优化的图块访问。free() 来清除程序化关卡;必须使用 queue_free() 以避免在帧中发生段错误。call_deferred() 或 call_group_flags 来避免回合转换期间的帧率峰值。ColorRect 和一个通过 RenderingServer.texture_2d_update() 更新的 ImageTexture 来使用 GPU 着色器遮罩。meta_progression_resource.gd)。dungeon_generator_walker.gd),获取临时能力提升。astar_grid_handler.gd)在日益困难的遭遇中生存下来。meta_progression_resource.gd)。| 阶段 | 技能 | 目的 |
|---|---|---|
| 1. 架构 | state-machines, autoloads | 管理游戏运行状态与元状态 |
| 2. 世界生成 | godot-procedural-generation, tilemap, noise | 每次游戏创建独特的关卡 |
| 3. 战斗 | godot-combat-system, enemy-ai | 快节奏、高风险遭遇战 |
| 4. 进程 | loot-tables, godot-inventory-system | 管理游戏过程特定的物品/遗物 |
| 5. 持久化 | save-system, resources | 在游戏过程之间保存元进程 |
Roguelike 游戏需要严格分离游戏运行状态(临时)和元状态(持久)。
处理单次游戏过程的生命周期。死亡后完全重置。
# run_manager.gd
extends Node
signal run_started
signal run_ended(victory: bool)
signal floor_changed(new_floor: int)
var current_seed: int
var current_floor: int = 1
var player_stats: Dictionary = {}
var inventory: Array[Resource] = []
var rng: RandomNumberGenerator
func start_run(seed_val: int = -1) -> void:
rng = RandomNumberGenerator.new()
if seed_val == -1:
rng.randomize()
current_seed = rng.seed
else:
current_seed = seed_val
rng.seed = current_seed
current_floor = 1
_reset_run_state()
run_started.emit()
func _reset_run_state() -> void:
player_stats = { "hp": 100, "gold": 0 }
inventory.clear()
func next_floor() -> void:
current_floor += 1
floor_changed.emit(current_floor)
func end_run(victory: bool) -> void:
run_ended.emit(victory)
# 在此处触发元进程保存
存储永久解锁内容。
# meta_progression.gd
class_name MetaProgression
extends Resource
@export var total_runs: int = 0
@export var unlocked_weapons: Array[String] = ["sword_basic"]
@export var currency: int = 0
@export var skill_tree_nodes: Dictionary = {} # node_id: level
func save() -> void:
ResourceSaver.save(self, "user://meta_progression.tres")
static func load_or_create() -> MetaProgression:
if ResourceLoader.exists("user://meta_progression.tres"):
return ResourceLoader.load("user://meta_progression.tres")
return MetaProgression.new()
醉汉步法:适用于有机的、洞穴状或连接房间的布局。
二叉空间分割:最适合矩形、连接房间和走廊的地牢。
波函数坍缩:适用于高度详细、基于规则的图块环境和模块化房间组装。
extends Node
@export var map_width: int = 50 @export var map_height: int = 50 @export var max_walkers: int = 5 @export var max_steps: int = 500
func generate_dungeon(tilemap: TileMapLayer, rng: RandomNumberGenerator) -> void: tilemap.clear() var walkers: Array[Vector2i] = [Vector2i(map_width/2, map_height/2)] var floor_tiles: Array[Vector2i] = []
for step in max_steps:
var new_walkers: Array[Vector2i] = []
for walker in walkers:
floor_tiles.append(walker)
# 25% 概率销毁步行者,25% 概率生成新的步行者
if rng.randf() < 0.25 and walkers.size() > 1:
continue # 销毁
if rng.randf() < 0.25 and walkers.size() < max_walkers:
new_walkers.append(walker) # 生成
# 移动步行者
var direction = [Vector2i.UP, Vector2i.DOWN, Vector2i.LEFT, Vector2i.RIGHT].pick_random()
new_walkers.append(walker + direction)
walkers = new_walkers
# 设置图块
for pos in floor_tiles:
tilemap.set_cell(pos, 0, Vector2i(0,0)) # 假设 source_id 0 是地板
# 后处理:添加墙壁、生成点等。
遗物修改属性或添加行为。
# relic.gd
class_name Relic
extends Resource
@export var id: String
@export var name: String
@export var icon: Texture2D
@export_multiline var description: String
# 用于复杂交互的钩子系统
func on_pickup(player: Node) -> void:
pass
func on_damage_dealt(player: Node, target: Node, damage: int) -> int:
return damage # 返回修改后的伤害值
func on_kill(player: Node, target: Node) -> void:
pass
# example_relic_vampirism.gd
extends Relic
func on_kill(player: Node, target: Node) -> void:
player.heal(5)
print("Vampirism triggered!")
RandomNumberGenerator。这允许玩家分享特定的游戏过程布局。ResourceSaver 处理元进程,但要小心深层嵌套资源中的循环引用。Room1.tscn、Room2.tscn),并将它们实例化到生成的布局中,以在程序化布局中实现手工制作的质量。NavigationRegion2D。fire、projectile、companion),并检查标签组合以创建涌现式的能力提升。每周安装次数
71
代码仓库
GitHub 星标数
59
首次出现
2026年2月10日
安全审计
安装于
opencode68
codex66
gemini-cli65
kimi-cli64
amp64
github-copilot64
Expert blueprint for roguelikes balancing challenge, progression, and replayability.
RandomNumberGenerator with a predictable seed for daily runs/debugging.@GlobalScope.randi() for critical logic; strictly use local RNG instances to prevent global state pollution.Array.pick_random() for critical content drops; strictly use a Shuffle Bag to prevent statistically unfair streaks.WorkerThreadPool.add_task() or add_group_task() to distribute generation across cores and prevent frame freezes.RunManager and MetaManager.duplicate(true) on base stat Resources; failing to deep-duplicate causes all entities to share a single health instance..tscn files; strictly serialize to JSON or binary in user:// to prevent bloat.SceneTree as the source of truth for grid logic; strictly maintain grid data in a separate Dictionary or Array.NavigationRegion2D AFTER procedural tiles are placed.AStarGrid2D with jumping_enabled = true (Jump Point Search) for O(1) queries and high-performance pathing across open areas.update() on AStarGrid2D after modifying states; strictly ensures pathfinding queries aren't stale.Vector2) for discrete grid coordinates; strictly use Vector2i to prevent precision drift.HEURISTIC_CHEBYSHEV or HEURISTIC_OCTILE.meta_progression_resource.gd).dungeon_generator_walker.gd), acquire temporary power-ups.astar_grid_handler.gd).meta_progression_resource.gd).| Phase | Skills | Purpose |
|---|---|---|
| 1. Architecture | state-machines, autoloads | Managing Run State vs Meta State |
| 2. World Gen | godot-procedural-generation, tilemap, noise | Creating unique levels every run |
| 3. Combat | godot-combat-system, enemy-ai |
Roguelikes require a strict separation between Run State (temporary) and Meta State (persistent).
Handles the lifespan of a single run. Resets completely on death.
# run_manager.gd
extends Node
signal run_started
signal run_ended(victory: bool)
signal floor_changed(new_floor: int)
var current_seed: int
var current_floor: int = 1
var player_stats: Dictionary = {}
var inventory: Array[Resource] = []
var rng: RandomNumberGenerator
func start_run(seed_val: int = -1) -> void:
rng = RandomNumberGenerator.new()
if seed_val == -1:
rng.randomize()
current_seed = rng.seed
else:
current_seed = seed_val
rng.seed = current_seed
current_floor = 1
_reset_run_state()
run_started.emit()
func _reset_run_state() -> void:
player_stats = { "hp": 100, "gold": 0 }
inventory.clear()
func next_floor() -> void:
current_floor += 1
floor_changed.emit(current_floor)
func end_run(victory: bool) -> void:
run_ended.emit(victory)
# Trigger meta-progression save here
Stores permanent unlocks.
# meta_progression.gd
class_name MetaProgression
extends Resource
@export var total_runs: int = 0
@export var unlocked_weapons: Array[String] = ["sword_basic"]
@export var currency: int = 0
@export var skill_tree_nodes: Dictionary = {} # node_id: level
func save() -> void:
ResourceSaver.save(self, "user://meta_progression.tres")
static func load_or_create() -> MetaProgression:
if ResourceLoader.exists("user://meta_progression.tres"):
return ResourceLoader.load("user://meta_progression.tres")
return MetaProgression.new()
Drunkard's Walk (Walker) : Ideal for organic, cave-like or connected room layouts.
Binary Space Partitioning (BSP) : Best for rectangular, connected room-and-hallway dungeons.
Wave Function Collapse (WFC) : For highly detailed, rule-based tile environments and modular room assembly.
extends Node
@export var map_width: int = 50 @export var map_height: int = 50 @export var max_walkers: int = 5 @export var max_steps: int = 500
func generate_dungeon(tilemap: TileMapLayer, rng: RandomNumberGenerator) -> void: tilemap.clear() var walkers: Array[Vector2i] = [Vector2i(map_width/2, map_height/2)] var floor_tiles: Array[Vector2i] = []
for step in max_steps:
var new_walkers: Array[Vector2i] = []
for walker in walkers:
floor_tiles.append(walker)
# 25% chance to destroy walker, 25% to spawn new one
if rng.randf() < 0.25 and walkers.size() > 1:
continue # Destroy
if rng.randf() < 0.25 and walkers.size() < max_walkers:
new_walkers.append(walker) # Spawn
# Move walker
var direction = [Vector2i.UP, Vector2i.DOWN, Vector2i.LEFT, Vector2i.RIGHT].pick_random()
new_walkers.append(walker + direction)
walkers = new_walkers
# Set tiles
for pos in floor_tiles:
tilemap.set_cell(pos, 0, Vector2i(0,0)) # Assuming source_id 0 is floor
# Post-process: Add walls, spawn points, etc.
Relics modify stats or add behavior.
# relic.gd
class_name Relic
extends Resource
@export var id: String
@export var name: String
@export var icon: Texture2D
@export_multiline var description: String
# Hook system for complex interactions
func on_pickup(player: Node) -> void:
pass
func on_damage_dealt(player: Node, target: Node, damage: int) -> int:
return damage # Return modified damage
func on_kill(player: Node, target: Node) -> void:
pass
# example_relic_vampirism.gd
extends Relic
func on_kill(player: Node, target: Node) -> void:
player.heal(5)
print("Vampirism triggered!")
RandomNumberGenerator with a seed. This allows players to share specific run layouts.ResourceSaver for meta-progression, but be careful with cyclical references in deeply nested resources.Room1.tscn, Room2.tscn) and instance them into the generated layout for handcrafted quality within procedural layouts.NavigationRegion2D at runtime after generating the dungeon layout if using 2D navigation.fire, projectile, companion) and check for tag combinations to create emergent power-ups.Weekly Installs
71
Repository
GitHub Stars
59
First Seen
Feb 10, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode68
codex66
gemini-cli65
kimi-cli64
amp64
github-copilot64
GSAP 框架集成指南:Vue、Svelte 等框架中 GSAP 动画最佳实践
3,400 周安装
Azure 工作负载自动升级评估工具 - 支持 Functions、App Service 计划与 SKU 迁移
303 周安装
Tauri 跨平台桌面应用开发指南:TypeScript + Rust 全栈实战教程
306 周安装
Fastify OAuth 2.0/2.1 实现与调试指南:授权码+PKCE流程详解
301 周安装
FastAPI专家技能:高性能异步API开发、微服务架构与生产部署指南
306 周安装
移动端响应式设计指南:CSS断点、Tailwind与触摸交互实现移动优先Web应用
302 周安装
GitHub 问题自动创建与优化工具 - 支持 Bug、功能、用户故事和任务
336 周安装
get_used_cells() for optimized tile access.free(); strictly use queue_free() to avoid mid-frame segmentation faults.call_deferred() or call_group_flags to avoid frame spikes during turn transitions.ColorRect and an ImageTexture updated via RenderingServer.texture_2d_update().| Fast-paced, high-stakes encounters |
| 4. Progression | loot-tables, godot-inventory-system | Managing run-specific items/relics |
| 5. Persistence | save-system, resources | Saving meta-progress between runs |