188 lines
6.2 KiB
GDScript
188 lines
6.2 KiB
GDScript
extends Node2D
|
|
|
|
onready var wall_res = preload("res://Wall_Obstacle.tscn")
|
|
onready var laser_e_res = preload("res://Laser_enemy.tscn")
|
|
onready var laser_res = preload("res://Laser_obj.tscn")
|
|
onready var laser_p_res = preload("res://laser_particle.tscn")
|
|
onready var screenSize = get_viewport().get_visible_rect().size
|
|
onready var diffInfo = get_node("DifficultyInfo")
|
|
|
|
# class member variables go here, for example:
|
|
var wall_move = false
|
|
var current_mode = 0
|
|
export var starting_wall_diff = 1
|
|
export var starting_laser_diff = 1
|
|
export var input_map_seed = -1
|
|
|
|
func _ready():
|
|
# Called when the node is added to the scene for the first time.
|
|
# Initialization here
|
|
Global.diff_level = Global.start_level
|
|
Global.wall_difficulty = starting_wall_diff
|
|
Global.laser_difficulty = starting_laser_diff
|
|
display_difficulty()
|
|
randomize()
|
|
if input_map_seed < 0:
|
|
var map_seed = randi()
|
|
seed(map_seed)
|
|
print("Seed: ", map_seed)
|
|
else:
|
|
seed(input_map_seed)
|
|
print("Seed: ", input_map_seed)
|
|
|
|
$Wall_Spawner.toggle_spawner(true,false, false)
|
|
|
|
func _process(delta):
|
|
# ScreenShake
|
|
if wall_move:
|
|
screenshake(16,0.2)
|
|
|
|
# Scrolling background
|
|
var bg_rect = $bg.get_region_rect()
|
|
bg_rect.position.x += 5 * delta
|
|
if bg_rect.position.x > 900:
|
|
bg_rect.position.x = -900
|
|
$bg.set_region_rect(bg_rect)
|
|
|
|
$Effects/WallOfDeath/sfx.set_volume_db(min(3.0,
|
|
10 * log(60/max(1,$Player.position.x - $Effects/WallOfDeath.position.x))))
|
|
|
|
func despawn_ent(ent):
|
|
# Dequeue a given entity/object
|
|
#get_node(".").remove_child(ent)
|
|
#get_tree().queue_delete(ent)
|
|
pass
|
|
|
|
func shoot_laser(laser_en, n_lasers):
|
|
# Spawn the laser itself
|
|
var l = laser_res.instance()
|
|
get_node(".").add_child(l)
|
|
l.position = Vector2(0,laser_en.position.y)
|
|
l.connect("kill_zone",self,"check_laser_target")
|
|
#despawn_ent(laser_en)
|
|
screenshake(32,0.4)
|
|
|
|
# Spawn the laser particles (which has the sound lol)
|
|
# Maybe consider grouping the lasers???????
|
|
var l_p = laser_p_res.instance()
|
|
get_node(".").add_child(l_p)
|
|
l_p.position = Vector2(550,laser_en.position.y)
|
|
l_p.laser_sound.set_volume_db(10*log(min(0.7,0.3 + 0.1*n_lasers)/n_lasers))
|
|
|
|
func check_laser_target(body):
|
|
# Kill player
|
|
OS.delay_msec(30)
|
|
$Player.on_dead()
|
|
|
|
func _on_Player_dead_player():
|
|
$Effects.sweep = true
|
|
|
|
func _on_Player_gameover():
|
|
# Reset the game variable
|
|
if $Player.score>Global.high_score:
|
|
Global.high_score = $Player.score
|
|
Global.return_to_menu = true
|
|
Global.playable = false
|
|
# Return to Main Menu
|
|
get_tree().change_scene("res://mainmenu.tscn")
|
|
|
|
func _on_Wall_Spawner_wall_spawned(gap_pos, gap_size, true_pos):
|
|
# Spawn the wall obstacle
|
|
var wall_obs = wall_res.instance()
|
|
wall_obs.gap_pos = gap_pos
|
|
wall_obs.gap_size = gap_size
|
|
wall_obs.true_pos = true_pos
|
|
wall_obs.hspeed.x = -math.calc_wall_speed($Wall_Spawner.wall_density)
|
|
wall_obs.tracking_player = weakref($Player)
|
|
get_node(".").add_child(wall_obs)
|
|
#wall_obs.connect("out_of_bound", self, "despawn_ent")
|
|
wall_obs.connect("moving", self, "toggle_screenshake")
|
|
wall_obs.connect("out_of_bound", $Wall_Spawner, "dequeue_wall")
|
|
$Wall_Spawner.queue_wall(wall_obs)
|
|
|
|
|
|
func _on_Wall_Spawner_query_player(callback):
|
|
callback.call_func($Player)
|
|
|
|
func _on_Wall_Spawner_laser_spawned(pos,n_lasers):
|
|
# Spawn the laser enemy
|
|
var l_enemy = laser_e_res.instance()
|
|
get_node(".").add_child(l_enemy)
|
|
l_enemy.connect("shoot",self,"shoot_laser")
|
|
l_enemy.position = Vector2(screenSize.x-32, pos*Global.GRID_SIZE)
|
|
l_enemy.place_obj(screenSize.x,screenSize.x-32,0.2)
|
|
l_enemy.n_lasers = n_lasers
|
|
l_enemy.spawn_sound.set_volume_db(10*log(min(0.7,0.3 + 0.1*n_lasers)/n_lasers))
|
|
|
|
func toggle_screenshake(state):
|
|
wall_move = state
|
|
|
|
func screenshake(off,mag):
|
|
$cam.set_offset(Vector2( \
|
|
rand_range(-off,off) * mag, \
|
|
rand_range(-off,off) * mag ))
|
|
|
|
func _on_leveltimer_timeout():
|
|
# If wall is spawning, let the wall finish moving then toggle difficulty via signal
|
|
# Otherwise immediately increase difficulty
|
|
if not $Wall_Spawner.spawning_walls:
|
|
increase_difficulty()
|
|
else:
|
|
$Wall_Spawner.toggle_spawner(false,false,false)
|
|
|
|
func increase_difficulty():
|
|
# Up the difficulty
|
|
# Three factor that can be amp up:
|
|
# Laser density, wall density, which one to toggle
|
|
# Laser can be ordered or contiguous
|
|
|
|
Global.diff_level = min(Global.diff_level+1,10)
|
|
if Global.diff_level == 2:
|
|
$Wall_Spawner.set_ordered_laser(false)
|
|
$Wall_Spawner.toggle_spawner(false,true,false)
|
|
current_mode = 1
|
|
elif Global.diff_level == 3:
|
|
$Wall_Spawner.wall_density /= 2
|
|
$Wall_Spawner.set_ordered_laser(true)
|
|
$Wall_Spawner.toggle_spawner(true,true,false)
|
|
current_mode = 2
|
|
else:
|
|
$leveltimer.set_wait_time(math.randint(5,8))
|
|
var mode = (current_mode + math.randint(1,2))%3
|
|
var mean
|
|
if mode==0:
|
|
Global.wall_difficulty = min(Global.wall_difficulty+0.5,10)
|
|
Global.laser_difficulty = min(Global.wall_difficulty+0.5,10)
|
|
mean = 0.8 + Global.wall_difficulty *0.25 + rand_range(-1, 1)
|
|
$Wall_Spawner.shift_probability = 1 - exp(-Global.wall_difficulty/8)
|
|
if math.rng_check(0.1):
|
|
$Wall_Spawner.set_wall_density(mean*1.5,0.1)
|
|
else:
|
|
$Wall_Spawner.set_wall_density(mean*rand_range(0.7, 0.9),0.1)
|
|
$Wall_Spawner.set_ordered_laser(true)
|
|
$Wall_Spawner.toggle_spawner(true,true,false)
|
|
elif mode==1:
|
|
Global.wall_difficulty = min(Global.wall_difficulty+1,10)
|
|
mean = 1 + Global.wall_difficulty * 0.1
|
|
$Wall_Spawner.shift_probability = 1 - exp(-Global.wall_difficulty/5)
|
|
|
|
if math.rng_check(0.15):
|
|
$Wall_Spawner.set_wall_density(mean*2,0.1)
|
|
else:
|
|
$Wall_Spawner.set_wall_density(mean*rand_range(0.8, 0.9),rand_range(0.1,0.3))
|
|
$Wall_Spawner.toggle_spawner(true,false,false)
|
|
else:
|
|
Global.laser_difficulty = min(Global.laser_difficulty+0.5,10)
|
|
mean = 0.5 + Global.laser_difficulty *0.2 + rand_range(-0.5,0.5)
|
|
$Wall_Spawner.set_laser_density(mean, math.inv_negexp(1, randf()*0.2 + 0.1))
|
|
$Wall_Spawner.set_ordered_laser(math.flip_coin())
|
|
$Wall_Spawner.toggle_spawner(false,true,false)
|
|
current_mode = mode
|
|
|
|
display_difficulty()
|
|
$leveltimer.start()
|
|
|
|
func display_difficulty():
|
|
diffInfo.get_node("Wall_diff_label").set_text("Wall Difficulty: " + str(Global.wall_difficulty) + "\nDensity: " + str($Wall_Spawner.wall_density))
|
|
diffInfo.get_node("Laser_diff_label").set_text("Laser Difficulty: " + str(Global.laser_difficulty) + "\nDensity: " + str($Wall_Spawner.laser_density))
|