feat: cel-shaded look & feel overhaul — real audio, comic UI, themed VFX
Audio (all CC0 — Kenney packs + OpenGameArt, see assets/sounds/SOURCES.md): - Replace every procedural synth WAV with forged sounds (ffmpeg pitch/layer mixes): distinct fire sounds per weapon with 2-3 variations, explosions, footsteps x5, land/jump/dash/vault, knife swing, hit/kill confirms, bullet impacts, reload, flight loops, UI hover/click/confirm/error, match jingles, menu music - AudioManager.stream_for(): AudioStreamRandomizer per sound id — every weapon now gets variation + pitch randomization on each shot - Explosions and bullet impacts play positional audio; landing has its own sound instead of a pitched footstep; ambient wind bed on every map Visuals: - ExplosionVFX: shared cel-shaded burst (white-hot stepped core, ink shockwave ring, star spikes, flat smoke puffs) replaces the orange sphere in both local and remote-replay paths - Comic star muzzle flashes on all weapons; unified cel tracer bolts with ink outlines across hitscan/shotgun/remote paths - Impact decals: hard-stepped ink-splat gradients instead of soft airbrush - Toon shading on first-person view models + arms, third-person weapons, and the procedural humanoid fallback (no hull outlines on FBX weapons — their hard normals tear the inverted hull) - Fix: giant soft "blob" highlight on floors — toon rim/specular disabled on level-geometry materials (pre-existing artifact since the cel commit) - Fix: own third-person weapon rendered into the first-person camera (shadows-only now covers first_person_mode) UI: - UITheme: comic theme on the root window — Bangers display font (OFL), paper panels with thick ink borders + hard drop shadows, papaya accent, themed buttons/inputs/popups; hover/click sounds on all menu buttons - Main menu: tilted comic wordmark, sunset toon diorama, looping menu music - Match HUD: themed scoreboard/killfeed/kill counter Viewports: - 4x MSAA project-wide + viewmodel/diorama viewports (crisp ink lines) - Viewmodel camera near plane 0.01; third-person camera FOV syncs settings - debug/visual_capture.gd: dev tool to screenshot menu + level for review Verified: 11/11 movement tests, spawn smoke test 0 failures, before/after screenshot comparison of menu and level. Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
co-authored by
Claude Fable 5
parent
1358183f98
commit
6c8b0ddd28
@@ -33,6 +33,20 @@ static func add_to(level: Node, sky_variant: String = "day") -> WorldEnvironment
|
||||
fill.light_energy = 0.25
|
||||
fill.shadow_enabled = false
|
||||
level.add_child(fill)
|
||||
|
||||
# Quiet ambient bed so the arena never sits in dead air.
|
||||
if not level.has_node("AmbientBed") and ResourceLoader.exists("res://assets/sounds/wind.wav"):
|
||||
var amb := AudioStreamPlayer.new()
|
||||
amb.name = "AmbientBed"
|
||||
amb.stream = load("res://assets/sounds/wind.wav")
|
||||
if amb.stream is AudioStreamWAV:
|
||||
amb.stream.loop_mode = AudioStreamWAV.LOOP_FORWARD
|
||||
amb.stream.loop_end = amb.stream.data.size() / 2
|
||||
amb.volume_db = -30.0
|
||||
amb.pitch_scale = 0.6
|
||||
amb.bus = "SFX"
|
||||
amb.autoplay = true
|
||||
level.add_child(amb)
|
||||
return env
|
||||
|
||||
|
||||
|
||||
@@ -42,6 +42,11 @@ static func tinted(tint: Color, dark: bool = false) -> Material:
|
||||
# land near the original flat color while keeping the grid contrast.
|
||||
mat.set_shader_parameter("albedo_color", Color(
|
||||
minf(tint.r * 1.9, 1.0), minf(tint.g * 1.9, 1.0), minf(tint.b * 1.9, 1.0)))
|
||||
# Level surfaces are huge; the toon rim/specular reads as a giant soft
|
||||
# "blob" highlight smeared across floors and walls. Keep those effects
|
||||
# for characters/props only.
|
||||
mat.set_shader_parameter("rim_strength", 0.0)
|
||||
mat.set_shader_parameter("specular_strength", 0.0)
|
||||
_cache[key] = mat
|
||||
return mat
|
||||
|
||||
|
||||
@@ -18,7 +18,12 @@ var _debug_ui_panel: PanelContainer
|
||||
func _ready() -> void:
|
||||
# Hide mouse
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
|
||||
|
||||
# Maps that don't ship their own environment get the shared stylized one
|
||||
# (sky gradient, sun+fill, glow, cel color grade, ambient bed).
|
||||
if not has_node("WorldEnvironment"):
|
||||
LevelEnvironment.add_to(self)
|
||||
|
||||
_build_hud()
|
||||
|
||||
# Multiplayer Spawning
|
||||
|
||||
Reference in New Issue
Block a user