Init commit

This commit is contained in:
Benjamin Morgan 2025-10-19 20:04:59 -06:00
commit a4452b69c4
59 changed files with 1259 additions and 0 deletions

84
Scripts/spawner.gd Normal file
View file

@ -0,0 +1,84 @@
extends Node2D
var timer: Timer
var asteroids := [
preload('res://Enemies/Scenes/asteroidTiny.tscn'),
preload('res://Enemies/Scenes/asteroidSm.tscn'),
preload('res://Enemies/Scenes/asteroid.tscn'),
preload('res://Enemies/Scenes/asteroidBig.tscn')
]
var screen_size: Vector2
func _ready():
Game.spawner = self
screen_size = get_viewport_rect().size
# Call spawn_enemy() every spawn_interval seconds
timer = Timer.new()
timer.wait_time = spawn_time_from_score(Game.score)
timer.timeout.connect(spawn_enemy)
add_child(timer)
func spawn_time_from_score(score: int) -> float:
var min_time = 0.3
var max_time = 2.0
var max_score = 50000.0
# Clamp score so it doesnt overshoot
var clamped_score = clamp(score, 0, max_score)
# Normalized value [0..1]
var t = float(clamped_score) / max_score
# Logarithmic easing (slows down progression)
# Use log10 but you can tweak the base for different curves
var curved_t = log(1.0 + 9.0 * t) / log(10.0) # maps 0..1 to 0..1, but with log shape
# Interpolate between max_time and min_time
return lerp(max_time, min_time, curved_t)
func spawn_enemy():
var enemy = asteroids[randi_range(0, 3)].instantiate()
var pos = get_random_edge_position()
enemy.position = pos
# Direction vector toward center
var center = screen_size * 0.5
var dir = (center - pos).normalized()
# Add some randomness so it's not always perfect
var angle_variation = randf_range(-0.5, 0.5) # radians (~±14 degrees)
dir = dir.rotated(angle_variation)
# Apply starting velocity
enemy.rot_velocity = randf_range(0, PI)
enemy.velocity = dir * randf_range(50, 200)
enemy.rotation = randf_range(0, PI)
var scl = randi_range(1, 5)
enemy.scale = Vector2(scl, scl)
enemy.add_to_group("enemies")
add_child(enemy)
timer.wait_time = spawn_time_from_score(Game.score)
func get_random_edge_position() -> Vector2:
# Pick which edge (0=top,1=bottom,2=left,3=right)
var edge = randi() % 4
match edge:
0: # top
return Vector2(randf() * screen_size.x, 0)
1: # bottom
return Vector2(randf() * screen_size.x, screen_size.y)
2: # left
return Vector2(0, randf() * screen_size.y)
3: # right
return Vector2(screen_size.x, randf() * screen_size.y)
return Vector2.ZERO
func stop():
timer.stop()
func start():
timer.start()