diff --git a/scripts/levels/chapter_layout.gd b/scripts/levels/chapter_layout.gd index 317ae22..1e62aff 100644 --- a/scripts/levels/chapter_layout.gd +++ b/scripts/levels/chapter_layout.gd @@ -53,6 +53,16 @@ const DECOR := { "altar": "res://assets/env/bg_altar.png", # 祭坛墙板(背景,接地) "window": "res://assets/env/bg_wall_window.png", # 尖窗墙板(背景,接地) "skull_column": "res://assets/env/bg_column_skulls.png", # 骷髅柱(背景,接地) + # 工业/熔炉:Kenney Request pack + 干石渣(避免苔拱/教堂柱串味) + "beam": "res://assets/external/kenney/Art (5190 files)/Platformer assets (1330 assets)/Request pack (100 assets)/PNG/beam.png", + "beam_bolts": "res://assets/external/kenney/Art (5190 files)/Platformer assets (1330 assets)/Request pack (100 assets)/PNG/beamBolts.png", + "beam_narrow": "res://assets/external/kenney/Art (5190 files)/Platformer assets (1330 assets)/Request pack (100 assets)/PNG/beamNarrow.png", + "metal_panel": "res://assets/external/kenney/Art (5190 files)/Platformer assets (1330 assets)/Request pack (100 assets)/PNG/metal.png", + "rubble_dry": "res://assets/env/rubble_a.png", + "rubble_dry_b": "res://assets/env/rubble_b.png", + "rubble_dry_c": "res://assets/env/rubble_c.png", + "slab": "res://assets/env/slab_a.png", + "plate": "res://assets/env/plate_stone.png", "statue": "res://assets/env/statue_keeper.png", # 守墓者石像,接地 "grave_cross": "res://assets/env/grave_cross.png", # 十字墓碑,接地 "door_arch": "res://assets/env/door_arch.png", # 32×64 石门洞(装饰),接地 diff --git a/scripts/levels/chapters/level05_layout.gd b/scripts/levels/chapters/level05_layout.gd index 43071e9..795359f 100644 --- a/scripts/levels/chapters/level05_layout.gd +++ b/scripts/levels/chapters/level05_layout.gd @@ -222,27 +222,27 @@ func _build_enemies(host: Node2D) -> void: ## -------------------------------------------------------------------- decor -- func _build_decor(host: Node2D) -> void: - # A 入口车间:来路的门洞、壁炬、碎石。 - prop(host, "door_arch", Vector2(96, FLOOR_Y)) + # A 入口车间:金属梁、壁炬、干石渣(不再用苔门拱/教堂柱)。 + prop(host, "beam_bolts", Vector2(96, FLOOR_Y), 1.0, Color(0.75, 0.7, 0.65)) torch(host, 440.0, FLOOR_Y, TORCH_TINT) - prop(host, "rubble", Vector2(456, FLOOR_Y)) - # B 淬火槽:坑沿石栏,走道下的壁炬(火焰在走道底下 16px),台阶靠着一根大柱。 - prop(host, "balustrade", Vector2(728, FLOOR_Y)) + prop(host, "rubble_dry", Vector2(456, FLOOR_Y)) + # B 淬火槽:坑沿钢板,走道栏改短梁;支柱用带螺栓的工字梁。 + prop(host, "plate", Vector2(728, FLOOR_Y), 1.0, Color(0.7, 0.62, 0.55)) torch(host, 760.0, FLOOR_Y, TORCH_TINT) - prop(host, "balustrade", Vector2(840, WALK_Y)) - prop(host, "rubble", Vector2(900, FLOOR_Y)) - prop(host, "column", Vector2(990, FLOOR_Y)) - # D 压板塔:巢边壁炬、盲门洞、碎石;压板台上一段石栏;走廊尽头一根大柱。 + prop(host, "beam_narrow", Vector2(840, WALK_Y), 1.0, Color(0.72, 0.66, 0.58)) + prop(host, "rubble_dry_b", Vector2(900, FLOOR_Y)) + prop(host, "beam", Vector2(990, FLOOR_Y), 1.15, Color(0.68, 0.58, 0.5)) + # D 压板塔:巢边壁炬、金属门板、干渣;走廊尽头工字梁。 torch(host, 1688.0, FLOOR_Y, TORCH_TINT) - prop(host, "balustrade", Vector2(1736, DECK_Y)) - prop(host, "door_arch", Vector2(1760, FLOOR_Y)) - prop(host, "rubble", Vector2(1808, FLOOR_Y)) - prop(host, "column", Vector2(1990, FLOOR_Y)) - # F 锈门与运渣道:落点碎石、台阶靠柱、走道西端石栏、锈门前壁炬。 - prop(host, "rubble", Vector2(2536, FLOOR_Y)) - prop(host, "column", Vector2(2672, FLOOR_Y)) - prop(host, "balustrade", Vector2(2856, WALK_Y)) + prop(host, "beam_narrow", Vector2(1736, DECK_Y), 1.0, Color(0.72, 0.66, 0.58)) + prop(host, "metal_panel", Vector2(1760, FLOOR_Y), 1.2, Color(0.7, 0.6, 0.52)) + prop(host, "rubble_dry_c", Vector2(1808, FLOOR_Y)) + prop(host, "beam_bolts", Vector2(1990, FLOOR_Y), 1.1, Color(0.68, 0.58, 0.5)) + # F 锈门与运渣道。 + prop(host, "rubble_dry", Vector2(2536, FLOOR_Y)) + prop(host, "beam", Vector2(2672, FLOOR_Y), 1.15, Color(0.68, 0.58, 0.5)) + prop(host, "plate", Vector2(2856, WALK_Y), 1.0, Color(0.7, 0.62, 0.55)) torch(host, 2832.0, FLOOR_Y, TORCH_TINT) - # 顶板垂下的旧缆:少量,避开吊台链子扫过的范围。 - for x in [300.0, 600.0, 1560.0, 2090.0, 2596.0]: + # 顶板垂下的旧缆:仍用窄藤条资源,但染成锈缆色,数量更少。 + for x in [300.0, 1560.0, 2596.0]: hanging(host, "vine", Vector2(x, 0), CABLE_TINT) diff --git a/scripts/levels/chapters/level08_layout.gd b/scripts/levels/chapters/level08_layout.gd index e4ab87b..719f9d4 100644 --- a/scripts/levels/chapters/level08_layout.gd +++ b/scripts/levels/chapters/level08_layout.gd @@ -164,16 +164,16 @@ func _build_terrain(host: Node2D) -> void: for f in FLOORS: var x0: float = f[1] var x1: float = f[2] - floor_strip(host, String(f[0]), x0, x1, "moss", x0 > 0.0, x1 < float(EAST_LIMIT), FLOOR_Y, GROUND_TONE) + floor_strip(host, String(f[0]), x0, x1, "stone", x0 > 0.0, x1 < float(EAST_LIMIT), FLOOR_Y, GROUND_TONE) for p in PITS: _slag_pit(host, String(p[0]), p[1], p[2]) for s in STEPS: - step(host, String(s[0]), s[1], s[2], "moss_float", GROUND_TONE) - platform(host, "SlagPillar", PILLAR_POS, PILLAR_SIZE, "moss", true, true, GROUND_TONE) + step(host, String(s[0]), s[1], s[2], "floating", GROUND_TONE) + platform(host, "SlagPillar", PILLAR_POS, PILLAR_SIZE, "stone", true, true, GROUND_TONE) for g in GEARS: var octagon := gear(host, String(g[0]), g[1], g[2]) octagon.modulate = LIFT_TONE - enclose(host, "moss", CEILING_Y, -1.0, 0.0, GROUND_TONE) + enclose(host, "stone", CEILING_Y, -1.0, 0.0, GROUND_TONE) var lift_a := lift(host, "LiftA", LIFT_A_POS, LIFT_A_TRAVEL, LIFT_PERIOD, LIFT_WIDTH, 0.0) lift_a.modulate = LIFT_TONE var lift_b := lift(host, "LiftB", LIFT_B_POS, LIFT_B_TRAVEL, LIFT_PERIOD, LIFT_WIDTH, LIFT_B_PHASE) @@ -185,7 +185,7 @@ func _build_terrain(host: Node2D) -> void: func _slag_pit(host: Node2D, pit_name: String, x0: float, x1: float) -> ToxinPool: var bed_y := FLOOR_Y + PIT_DEPTH platform(host, pit_name + "Bed", Vector2(x0, bed_y), Vector2(x1 - x0, FLOOR_Y + 80.0 - bed_y), - "moss", false, false, GROUND_TONE) + "stone", false, false, GROUND_TONE) return toxin(host, pit_name + "Pool", Vector2(x0, bed_y - 16.0), Vector2(x1 - x0, 32.0), SLAG_TINT) @@ -210,11 +210,17 @@ func _build_enemies(host: Node2D) -> void: func _build_decor(host: Node2D) -> void: for x in TORCHES: torch(host, x, FLOOR_Y, TORCH_TINT) - for x in VINES: + # 旧缆减半,染成炉渣锈色;地面用干石/石板,支柱用工字梁。 + var cable_xs: Array = [] + for i in range(VINES.size()): + if i % 2 == 0: + cable_xs.append(VINES[i]) + for x in cable_xs: hanging(host, "vine", Vector2(x, CEILING_Y + 32.0), VINE_TINT) for x in ARCHES: - prop(host, "arch", Vector2(x, FLOOR_Y), 1.0, ARCH_TINT) - for x in RUBBLE: - prop(host, "rubble", Vector2(x, FLOOR_Y), 1.0, RUBBLE_TINT) + prop(host, "slab", Vector2(x, FLOOR_Y), 1.15, ARCH_TINT) + var rubble_keys := ["rubble_dry", "rubble_dry_b", "rubble_dry_c"] + for i in range(RUBBLE.size()): + prop(host, rubble_keys[i % rubble_keys.size()], Vector2(RUBBLE[i], FLOOR_Y), 1.0, RUBBLE_TINT) for x in COLUMNS: - prop(host, "column", Vector2(x, FLOOR_Y), 1.0, COLUMN_TINT) + prop(host, "beam_bolts", Vector2(x, FLOOR_Y), 1.2, COLUMN_TINT) diff --git a/scripts/levels/chapters/level10_layout.gd b/scripts/levels/chapters/level10_layout.gd index 2588acc..84b3c55 100644 --- a/scripts/levels/chapters/level10_layout.gd +++ b/scripts/levels/chapters/level10_layout.gd @@ -116,18 +116,18 @@ func build(host: Node2D) -> void: func _build_terrain(host: Node2D) -> void: - floor_strip(host, "FloorEntry", 0.0, SLAG_X0, "moss", false, true, FLOOR_Y, TONE) + floor_strip(host, "FloorEntry", 0.0, SLAG_X0, "stone", false, true, FLOOR_Y, TONE) # 熔渣河手工铺(toxin_pit 不吃 tone,坑底会露出一截青苔色)。 platform(host, "SlagBed", Vector2(SLAG_X0, SLAG_BED_Y), - Vector2(SLAG_X1 - SLAG_X0, FLOOR_Y + 80.0 - SLAG_BED_Y), "moss", false, false, TONE) + Vector2(SLAG_X1 - SLAG_X0, FLOOR_Y + 80.0 - SLAG_BED_Y), "stone", false, false, TONE) toxin(host, "SlagPool", Vector2(SLAG_X0, SLAG_BED_Y - 16.0), Vector2(SLAG_X1 - SLAG_X0, 32.0), SLAG_TINT) for s in SLAG_STONES: - step(host, String(s[0]), s[1], float(s[2]), "moss_float", STONE_TONE) + step(host, String(s[0]), s[1], float(s[2]), "floating", STONE_TONE) # 门前厅 + 竞技场 + 终局门共用一块地:竞技场必须是连续平地,Boss 来回冲锋。 - floor_strip(host, "FloorHall", SLAG_X1, float(EAST_LIMIT), "moss", true, false, FLOOR_Y, TONE) - platform(host, "PerchWest", PERCH_WEST_POS, PERCH_SIZE, "moss", true, true, STONE_TONE) - platform(host, "PerchEast", PERCH_EAST_POS, PERCH_SIZE, "moss", true, true, STONE_TONE) - enclose(host, "moss", CEILING_Y, -1.0, 0.0, TONE) + floor_strip(host, "FloorHall", SLAG_X1, float(EAST_LIMIT), "stone", true, false, FLOOR_Y, TONE) + platform(host, "PerchWest", PERCH_WEST_POS, PERCH_SIZE, "stone", true, true, STONE_TONE) + platform(host, "PerchEast", PERCH_EAST_POS, PERCH_SIZE, "stone", true, true, STONE_TONE) + enclose(host, "stone", CEILING_Y, -1.0, 0.0, TONE) func _build_props(host: Node2D) -> void: @@ -155,12 +155,14 @@ func _build_enemies(host: Node2D) -> void: func _build_decor(host: Node2D) -> void: for x in TORCHES: torch(host, float(x), FLOOR_Y, TORCH_TINT) + # 炉心支柱改工字梁;骷髅柱与祭坛保留作为终关符号。 for x in COLUMNS: - prop(host, "column", Vector2(float(x), FLOOR_Y), 1.0, PLATE_TINT) + prop(host, "beam", Vector2(float(x), FLOOR_Y), 1.25, PLATE_TINT) prop(host, "skull_column", Vector2(SKULL_COLUMN_X, FLOOR_Y), 1.0, PLATE_TINT) _altar(host, ALTAR_FEET, ALTAR_TINT) - for x in RUBBLE: - prop(host, "rubble", Vector2(float(x), FLOOR_Y), 1.0, TONE) + var rubble_keys := ["rubble_dry", "rubble_dry_b", "rubble_dry_c"] + for i in range(RUBBLE.size()): + prop(host, rubble_keys[i % rubble_keys.size()], Vector2(float(RUBBLE[i]), FLOOR_Y), 1.0, TONE) ## 炉心祭坛:终局门旁的背景墙板,残芯的所在。顶 64px 是素墙,走 RuinPlate 塌成残垣, diff --git a/scripts/levels/theme_backdrop.gd b/scripts/levels/theme_backdrop.gd index 6f7317c..a49399d 100644 --- a/scripts/levels/theme_backdrop.gd +++ b/scripts/levels/theme_backdrop.gd @@ -23,14 +23,16 @@ const THEMES := { {"path": COLUMN_PATH, "scroll": Vector2(0.66, 0.3), "pos": Vector2(96, 336 - 171), "scale": 0.9, "tint": Color(0.16, 0.24, 0.25, 0.9), "repeat": 352.0}, ], }, - # 熔炉:同一套地窟墙,压成琥珀色;底色偏赭。 + # 熔炉:工业剪影压成琥珀色(不再用城堡尖窗内景,避免和圣殿撞脸)。 "forge": { "indoors": true, "void": Color(0.09, 0.04, 0.025), "mood": Color(0.95, 0.74, 0.56), "layers": [ - {"path": CASTLE_INTERIOR, "scroll": Vector2(0.42, 0.18), "pos": Vector2(0, 48), "scale": 1.0, "tint": Color(1.0, 0.78, 0.6)}, - {"path": COLUMN_PATH, "scroll": Vector2(0.66, 0.3), "pos": Vector2(96, 336 - 171), "scale": 0.9, "tint": Color(0.28, 0.16, 0.1, 0.9), "repeat": 352.0}, + {"path": INDUSTRIAL_DIR + "skill-desc_0003_bg.png", "scroll": Vector2(0.04, 0.02), "pos": Vector2(0, 0), "scale": 2.25, "tint": Color(1.0, 0.78, 0.62)}, + {"path": INDUSTRIAL_DIR + "skill-desc_0002_far-buildings.png", "scroll": Vector2(0.18, 0.06), "pos": Vector2(0, 40), "scale": 2.25, "tint": Color(0.92, 0.62, 0.48)}, + {"path": INDUSTRIAL_DIR + "skill-desc_0001_buildings.png", "scroll": Vector2(0.4, 0.1), "pos": Vector2(0, 8), "scale": 2.25, "tint": Color(0.78, 0.48, 0.36)}, + {"path": INDUSTRIAL_DIR + "skill-desc_0000_foreground.png", "scroll": Vector2(0.62, 0.14), "pos": Vector2(0, 120), "scale": 2.1, "tint": Color(0.55, 0.28, 0.18, 0.85)}, ], }, # 圣殿:哥特城堡大厅面板(楼梯、尖窗、石像鬼、烛龛)拼成一条重复的殿墙。