extends Node2D class_name Seabed ## 탑다운 바다의 바닥. 격자 칸마다 그 자리 구역의 모래색을 조금씩 달리해 깔고, ## 그 위에 아주 옅은 격자선을 얹어 "어디에 놓을 수 있는지"가 보이게 한다. var rect_size := Vector2(1280, 220) ## 위쪽 정보 바 자리. 여기에는 격자를 긋지 않는다. var grid_top := 30.0 const GRID_LINE := Color(0, 0, 0, 0.13) const SPECK := Color(0, 0, 0, 0.06) ## 칸마다 늘 같은 값을 주는 해시. 매번 다른 무늬가 나오면 재배치할 때마다 바닥이 깜빡인다. func _hash(col: int, row: int, salt: int) -> float: var h := (col * 73856093) ^ (row * 19349663) ^ (salt * 83492791) return float(absi(h) % 1000) / 1000.0 func _draw() -> void: var cols := GameState.columns() var rows := GameState.rows() if rect_size.x < 4.0 or cols <= 0 or rows <= 0: return var grid_height := maxf(rect_size.y - grid_top, 1.0) var tw := rect_size.x / cols var th := grid_height / rows for col in cols: var base := Catalog.ramp_color("sand", (col + 0.5) / cols) # 정보 바가 앉는 위쪽 띠. 놓을 수 없는 자리라 조금 어둡게 둔다. draw_rect(Rect2(col * tw, 0.0, tw + 1.0, grid_top + 1.0), base.darkened(0.10)) for row in rows: var shade := (_hash(col, row, 1) - 0.5) * 0.09 var c := base.lightened(shade) if shade > 0.0 else base.darkened(-shade) var y := grid_top + row * th # 칸 경계에 실선이 비지 않도록 1px씩 겹쳐 그린다. draw_rect(Rect2(col * tw, y, tw + 1.0, th + 1.0), c) # 모래알 몇 점. 바닥이 완전히 평평해 보이는 걸 막는다. for s in 2: var px := (col + _hash(col, row, 10 + s)) * tw var py := y + _hash(col, row, 20 + s) * th draw_circle(Vector2(px, py), 1.0 + _hash(col, row, 30 + s), SPECK) for col in range(1, cols): draw_line(Vector2(col * tw, grid_top), Vector2(col * tw, rect_size.y), GRID_LINE, 1.0) for row in rows + 1: var y := grid_top + row * th draw_line(Vector2(0, y), Vector2(rect_size.x, y), GRID_LINE, 1.0)