Scoring System

 avatar
unknown
plain_text
10 months ago
5.3 kB
5
Indexable
extends Node2D

@export var floor_scene: PackedScene = null
@export var player_scene: PackedScene = null
@export var platform_scene: PackedScene = null
@export var moving_scene: PackedScene = null
@export var teleportation_scene: PackedScene = null
@export var cactus_scene: PackedScene = null
@export var enemy_scene: PackedScene = null
@export var projectile_scene: PackedScene = null

const platform_increment = 5
const platform_y_increment = 25
const level_width = 250
const floor_space = 10
const door_space = 20
const player_death_y = 100

var floor = null
var player = null
var door = null
var platforms = []
var cacti = []
var players_in_door = []
var enemies = []
var projectiles = []

var enemy_shoot_range = 150
var enemy_shoot_interval = 1

var num_platforms = 0

var day_night_cycle_duration = 120

var player_score = 0
var high_score = 0

func _ready():
	self.create_floor()
	self.create_player()
	self.create_door()
	self.reset_game()

func reset_game():
	highScoreChange()
	player_score = 0
	self.reset_player()
	for platform in self.platforms:
		if is_instance_valid(platform):
			platform.queue_free()
	self.platforms = []
	for cact in self.cacti:
		if is_instance_valid(cact):
			cact.queue_free()
	self.cacti = []
	self.enemies = []
	for projectile in self.projectiles:
		if is_instance_valid(projectile):
			projectile.queue_free()
	self.projectiles = []
	self.next_level()
	
func create_floor():
	self.floor = self.floor_scene.instantiate()
	self.add_child(floor)

func create_player():
	self.player = self.player_scene.instantiate()
	self.add_child(player)

func create_door():
	self.door = get_node("Door")

func reset_player():
	self.player.health = 100
	self.player.freeze_time -= self.player.freeze_cooldown
	self.player.position = Vector2(-self.floor_space - self.level_width / 2, -self.floor_space)
	self.player.linear_velocity = Vector2(0, 0)
	self.player.angular_velocity = 0

func next_level():
	add_score()
	self.num_platforms += self.platform_increment
	self.generate_platforms()
	
func generate_platforms():
	var prev_y = 0
	var prev_x = 0
	var same_direction_remaining = randi_range(3,5)
	var direction = 1
	
	for i in self.num_platforms:
		# Godot y axis is flipped
		prev_y -= platform_y_increment
		var new_platform
		var new_cactus
		var created=false
		var platform_type = randi_range(1,10)
		var generate_moving_platform = platform_type <= 2 # 20% chance
		for j in 1 if generate_moving_platform else 2:
			# Choose between the three types randomly
			if generate_moving_platform:
				new_platform = self.moving_scene.instantiate()
			elif platform_type == 3: # 10% chance
				new_platform = self.teleportation_scene.instantiate()
			else: #70% chance
				new_platform = self.platform_scene.instantiate()
				var random_float = randf_range(1,10)
				if random_float >= 2 and random_float < 4: # 20% chance
					created=true
					new_cactus = self.enemy_scene.instantiate()
					self.enemies.append(new_cactus)
				elif random_float >= 4 and random_float < 6: # 20% chance
					created=true
					new_cactus=self.cactus_scene.instantiate()
			
			prev_x += randf_range(30,80) * direction;
			same_direction_remaining -= 1
			if same_direction_remaining == 0:
				direction = -direction
				same_direction_remaining = randi_range(3,5)

			new_platform.position = Vector2(prev_x, prev_y)
			if created:
				var offset = randf_range(-7.5,7.5)
				new_cactus.position = Vector2(prev_x+offset, prev_y-7.5)
			created=false
			if new_platform:
				self.platforms.append(new_platform)
				self.add_child(new_platform)
			if new_cactus:
				self.cacti.append(new_cactus)
				self.add_child(new_cactus)
		if i == self.num_platforms - 1:
			self.door.position.x = new_platform.position.x
			self.door.position.y = prev_y - self.door_space

func _physics_process(delta):
	var x = float(Time.get_ticks_msec())/1000.0
	var brightness = 0.4 * cos((2.0*PI*x)/self.day_night_cycle_duration) - 0.4
	$Sun.energy = brightness
	if player != null and player.position.y >= player_death_y:
		self.reset_player()
	if players_in_door.size() >= 1:
		self.reset_game()
	if player.health<=0:
		self.reset_player()
	if player != null:
		for enemy in self.enemies:
			if !enemy.frozen:
				if enemy.position.distance_to(player.position) <= enemy_shoot_range:
					var now = Time.get_unix_time_from_system()
					if now - enemy.last_fired < enemy_shoot_interval:
						continue
						
					var projectile = self.projectile_scene.instantiate()
					projectile.position = enemy.position
					var direction = projectile.position.direction_to(self.player.position)
					projectile.bullet_direction = direction
					projectile.rotation = direction.angle()
					projectile.start_time = Time.get_ticks_msec()
					self.add_child(projectile)
					self.projectiles.append(projectile)
					
					enemy.last_fired = now
	

func _on_door_body_entered(body):
	if body.is_in_group("players"):
		self.players_in_door.append(body)

func _on_door_body_exited(body):
	self.players_in_door.erase(body)

func add_score():
	player_score += player.health
	highScoreChange()

func highScoreChange():
	high_score = max(player_score, high_score)
Editor is loading...
Leave a Comment