89 lines
4.2 KiB
GDScript
89 lines
4.2 KiB
GDScript
extends Node2D
|
||
|
||
const WORLD_SIZE := Vector2(5200.0, 3600.0)
|
||
const GRID_STEP := 320
|
||
|
||
func _draw() -> void:
|
||
var half_size := WORLD_SIZE * 0.5
|
||
draw_rect(Rect2(-half_size, WORLD_SIZE), Color("050b18"), true)
|
||
_draw_grid(half_size)
|
||
_draw_stars(half_size)
|
||
_draw_landmarks()
|
||
_draw_world_border(half_size)
|
||
|
||
func _draw_grid(half_size: Vector2) -> void:
|
||
for x in range(-2600, 2601, GRID_STEP):
|
||
var major := x % (GRID_STEP * 4) == 0
|
||
var color := Color(0.16, 0.28, 0.42, 0.2 if major else 0.075)
|
||
draw_line(Vector2(x, -half_size.y), Vector2(x, half_size.y), color, 1.0)
|
||
for y in range(-1800, 1801, GRID_STEP):
|
||
var major := y % (GRID_STEP * 4) == 0
|
||
var color := Color(0.16, 0.28, 0.42, 0.2 if major else 0.075)
|
||
draw_line(Vector2(-half_size.x, y), Vector2(half_size.x, y), color, 1.0)
|
||
|
||
func _draw_stars(half_size: Vector2) -> void:
|
||
var rng := RandomNumberGenerator.new()
|
||
rng.seed = 640_118
|
||
for index in 420:
|
||
var point := Vector2(
|
||
rng.randf_range(-half_size.x + 35.0, half_size.x - 35.0),
|
||
rng.randf_range(-half_size.y + 35.0, half_size.y - 35.0)
|
||
)
|
||
var radius := rng.randf_range(0.7, 2.0)
|
||
var alpha := rng.randf_range(0.2, 0.72)
|
||
var color := Color(0.58, 0.76, 1.0, alpha)
|
||
if index % 9 == 0:
|
||
color = Color(0.35, 0.88, 0.94, alpha)
|
||
draw_circle(point, radius, color)
|
||
|
||
func _draw_landmarks() -> void:
|
||
# Safe starting area around the spawn point.
|
||
draw_circle(Vector2.ZERO, 300.0, Color(0.08, 0.65, 0.72, 0.035))
|
||
draw_arc(Vector2.ZERO, 300.0, 0.0, TAU, 96, Color(0.16, 0.78, 0.84, 0.32), 2.0)
|
||
_draw_label(Vector2(28, -316), "STREFA STARTOWA", Color(0.38, 0.81, 0.87, 0.78))
|
||
|
||
_draw_planet(Vector2(-1420, -760), 150.0, Color("e9904e"), "HELION")
|
||
_draw_planet(Vector2(1420, -940), 112.0, Color("397fa9"), "NEREIDA")
|
||
_draw_planet(Vector2(1110, 1170), 86.0, Color("8d6cbb"), "VESPER")
|
||
_draw_planet(Vector2(-1580, 1120), 72.0, Color("72a58b"), "TUBYLCY")
|
||
_draw_asteroid_field(Vector2(420, 160), 400.0, 34, 9_183)
|
||
_draw_asteroid_field(Vector2(-930, 460), 270.0, 22, 3_277)
|
||
_draw_navigation_beacon(Vector2(520, -190))
|
||
|
||
func _draw_navigation_beacon(center: Vector2) -> void:
|
||
draw_circle(center, 58.0, Color(0.1, 0.72, 0.86, 0.07))
|
||
draw_arc(center, 44.0, 0.0, TAU, 64, Color(0.25, 0.82, 0.9, 0.75), 2.0)
|
||
draw_arc(center, 31.0, 0.0, TAU, 64, Color(0.25, 0.82, 0.9, 0.4), 1.0)
|
||
draw_line(center + Vector2(-54, 0), center + Vector2(54, 0), Color(0.25, 0.82, 0.9, 0.6), 1.0)
|
||
draw_line(center + Vector2(0, -54), center + Vector2(0, 54), Color(0.25, 0.82, 0.9, 0.6), 1.0)
|
||
draw_circle(center, 12.0, Color(0.35, 0.92, 1.0, 0.9))
|
||
_draw_label(center + Vector2(-88, 78), "BOJA NAWIGACYJNA", Color(0.45, 0.83, 0.9, 0.82))
|
||
|
||
func _draw_planet(center: Vector2, radius: float, color: Color, label: String) -> void:
|
||
draw_circle(center, radius * 1.55, Color(color.r, color.g, color.b, 0.055))
|
||
draw_arc(center, radius * 1.42, 0.0, TAU, 96, Color(color.r, color.g, color.b, 0.2), 2.0)
|
||
draw_circle(center, radius, color.darkened(0.48))
|
||
draw_circle(center + Vector2(-radius * 0.22, -radius * 0.24), radius * 0.68, color.darkened(0.15))
|
||
draw_arc(center, radius * 1.26, deg_to_rad(-18), deg_to_rad(205), 64, Color(0.64, 0.79, 0.91, 0.55), 5.0)
|
||
_draw_label(center + Vector2(-radius, radius + 34.0), label, Color(0.77, 0.85, 0.95, 0.76))
|
||
|
||
func _draw_asteroid_field(center: Vector2, spread: float, count: int, seed_value: int) -> void:
|
||
var rng := RandomNumberGenerator.new()
|
||
rng.seed = seed_value
|
||
for index in count:
|
||
var angle := rng.randf_range(0.0, TAU)
|
||
var distance := sqrt(rng.randf()) * spread
|
||
var point := center + Vector2.RIGHT.rotated(angle) * distance
|
||
var size := rng.randf_range(5.0, 15.0)
|
||
var color := Color(0.42, 0.53, 0.65, rng.randf_range(0.35, 0.75))
|
||
draw_circle(point, size, color)
|
||
draw_circle(point + Vector2(-size * 0.25, -size * 0.25), size * 0.55, color.lightened(0.18))
|
||
|
||
func _draw_world_border(half_size: Vector2) -> void:
|
||
var bounds := Rect2(-half_size, WORLD_SIZE)
|
||
draw_rect(bounds, Color(0.12, 0.52, 0.68, 0.48), false, 3.0)
|
||
_draw_label(Vector2(-half_size.x + 22.0, -half_size.y + 38.0), "SEKTOR TESTOWY 01 / 5200 × 3600", Color(0.4, 0.7, 0.8, 0.7))
|
||
|
||
func _draw_label(position: Vector2, text: String, color: Color) -> void:
|
||
draw_string(ThemeDB.fallback_font, position, text, HORIZONTAL_ALIGNMENT_LEFT, -1.0, 18, color)
|