fuzzyworld

godot-shooter / asteroids / files / scenes / World.gd

Branch asteroids · default branch · all branches

World.gd

Blame: the commit that last changed each line · file · history

5b18ed86 2023-11-01 Pavel Safronov1extends Node2D
2
93d86765 2023-11-17 Pavel Safronov3const Enemy = preload("res://actors/Enemy.tscn")
4const Bomb = preload("res://weapons/Bomb.tscn")
56cadf84 2023-12-02 Pavel Safronov5const Asteroid = preload("res://items/Asteroid.tscn")
93d86765 2023-11-17 Pavel Safronov6
16938031 2023-11-17 Pavel Safronov7const Utils = preload("res://utils/Utils.gd")
8const Weapons = preload("res://weapons/Weapons.gd")
9const PowerUp = preload("res://items/PowerUp.tscn")
10const Settings = preload("res://utils/Settings.gd")
f3c75ae9 2023-11-15 Pavel Safronov11onready var player: Player = $Player
62151b90 2023-11-29 Pavel Safronov12onready var update_timer = $UpdateTimer
afb9a0a5 2023-11-30 Pavel Safronov13onready var navigation_polygon_instance: NavigationPolygonInstance = $NavigationPolygonInstance
a45831a2 2023-12-01 Pavel Safronov14onready var environment_node = $Environment
4ac09ada 2023-11-09 Pavel Safronov15
44475e04 2023-11-08 Pavel Safronov16var generators = [
6a08f6b2 2023-12-01 Pavel Safronov17 ConstantItemGenerator.new("create_enemy", self, "enemies", 5),
c65ec260 2023-12-01 Pavel Safronov18 ConstantItemGenerator.new("create_health", self, "health", 20),
c2827327 2023-11-10 Pavel Safronov19 ConstantItemGenerator.new("create_weapon", self, "weapon", 10),
93d86765 2023-11-17 Pavel Safronov20 ConstantItemGenerator.new("create_bomb", self, "bombs", 10),
212b7b25 2023-11-08 Pavel Safronov21 LevelItemGenerator.new(5, "create_gold", self, "gold", 5),
56cadf84 2023-12-02 Pavel Safronov22 ConstantItemGenerator.new("create_asteroid", self, "asteroids", 10),
44475e04 2023-11-08 Pavel Safronov23]
212b7b25 2023-11-08 Pavel Safronov24var completed_objectives = 0
f6120dba 2023-11-08 Pavel Safronov25var max_objectives = 5
4cb0d97e 2023-11-10 Pavel Safronov26var item_replacement_distance = 2000
641b63b5 2023-11-10 Pavel Safronov27var is_dragging = false
636e5224 2023-12-01 Pavel Safronov28var is_game_over = false
56eea835 2023-12-02 Pavel Safronov29export var starting_zoom = 1.5
44475e04 2023-11-08 Pavel Safronov30
31func enemy_killed(_position: Vector2):
f3c75ae9 2023-11-15 Pavel Safronov32 player.score += 5
bfa99fb9 2023-12-01 Pavel Safronov33func health_consumed(_power_up):
a45831a2 2023-12-01 Pavel Safronov34 player.heal(20)
6b8f57b9 2023-11-17 Pavel Safronov35 player.score += 1
bfa99fb9 2023-12-01 Pavel Safronov36func gold_consumed(_power_up):
fc5de8ee 2023-11-09 Pavel Safronov37 completed_objectives += 1
f85124dd 2023-11-17 Pavel Safronov38 var points = 5 * (completed_objectives+1)
39 player.score += points
5320761c 2023-11-17 Pavel Safronov40 player.show_message("+%d points" % points)
a45831a2 2023-12-01 Pavel Safronov41 player.health = player.max_health
bfa99fb9 2023-12-01 Pavel Safronov42func weapon_consumed(power_up):
43 var data = power_up.data
8b763d15 2023-11-11 Pavel Safronov44 var weapon: Weapon = data
5be558de 2023-11-17 Pavel Safronov45 var is_same_weapon = player.weapon.name == weapon.name
8b763d15 2023-11-11 Pavel Safronov46 if is_same_weapon && weapon.ammo != INF:
5be558de 2023-11-17 Pavel Safronov47 player.weapon.ammo += player.weapon.reload_size
8b763d15 2023-11-11 Pavel Safronov48 else:
5be558de 2023-11-17 Pavel Safronov49 player.weapon = weapon
bfa99fb9 2023-12-01 Pavel Safronov50func bomb_consumed(power_up):
51 var pos: Vector2 = power_up.global_position
93d86765 2023-11-17 Pavel Safronov52 var bomb = Bomb.instance()
a45831a2 2023-12-01 Pavel Safronov53 environment_node.call_deferred("add_child",bomb)
93d86765 2023-11-17 Pavel Safronov54 bomb.position = pos
8b763d15 2023-11-11 Pavel Safronov55
44475e04 2023-11-08 Pavel Safronov56func create_enemy() -> Enemy:
969fd5af 2023-11-06 Pavel Safronov57 var enemy = Enemy.instance()
6ad40cea 2023-12-01 Pavel Safronov58 enemy.position = get_new_environment_position(1)
969fd5af 2023-11-06 Pavel Safronov59 enemy.connect("enemy_killed", self, "enemy_killed")
44475e04 2023-11-08 Pavel Safronov60 return enemy
61func create_health() -> PowerUp:
11ed9f7a 2023-11-08 Pavel Safronov62 var health = PowerUp.instance()
0d392ff8 2023-11-10 Pavel Safronov63 health.position = get_new_environment_position(randf() + .5)
ddae17d7 2023-11-08 Pavel Safronov64 health.connect("consumed", self, "health_consumed")
11ed9f7a 2023-11-08 Pavel Safronov65 health.label = "+HP"
66 health.color = Color.green
44475e04 2023-11-08 Pavel Safronov67 return health
93d86765 2023-11-17 Pavel Safronov68func create_bomb() -> PowerUp:
69 var bomb = PowerUp.instance()
70 var pos = get_new_environment_position(randf() + .5)
71 bomb.position = pos
72 bomb.connect("consumed", self, "bomb_consumed")
73 bomb.label = "BOMB"
74 bomb.color = Color.purple
75 return bomb
0d392ff8 2023-11-10 Pavel Safronov76func create_gold(pos: Vector2 = get_new_environment_position(1 + randf())) -> PowerUp:
44475e04 2023-11-08 Pavel Safronov77 var gold = PowerUp.instance()
78 gold.position = pos
79 gold.connect("consumed", self, "gold_consumed")
fc5de8ee 2023-11-09 Pavel Safronov80 gold.label = ""
44475e04 2023-11-08 Pavel Safronov81 gold.color = Color.gold
82 return gold
5e4e3a9c 2023-11-08 Pavel Safronov83func create_weapon() -> PowerUp:
8b763d15 2023-11-11 Pavel Safronov84 var weapon: PowerUp = PowerUp.instance()
0d392ff8 2023-11-10 Pavel Safronov85 weapon.position = get_new_environment_position(randf() + .5)
8b763d15 2023-11-11 Pavel Safronov86 var _err = weapon.connect("consumed", self, "weapon_consumed")
87 var r = randf()
c3ac3ece 2023-11-11 Pavel Safronov88 if r < .45:
8b763d15 2023-11-11 Pavel Safronov89 weapon.data = Weapons.create_rocket_gun()
90 weapon.label = "ROC"
91 weapon.color = Color.red
c3ac3ece 2023-11-11 Pavel Safronov92 elif r < .9:
023ec2fb 2023-11-29 Pavel Safronov93 weapon.data = Weapons.create_smg_gun()
8b763d15 2023-11-11 Pavel Safronov94 weapon.label = "SMG"
95 weapon.color = Color.orange
96 else:
97 weapon.data = Weapons.create_basic_gun()
98 weapon.label = "LZR"
99 weapon.color = Color.pink
5e4e3a9c 2023-11-08 Pavel Safronov100 return weapon
56cadf84 2023-12-02 Pavel Safronov101func create_asteroid() -> Asteroid:
102 var asteroid: Asteroid = Asteroid.instance()
103 asteroid.position = get_new_environment_position(randf() * 2)
104 asteroid.spin_rate = randf() * 2 - 1
5d08c5b8 2023-12-21 Pavel Safronov105 asteroid.scale *= (randf() * 2 + .5)
106 asteroid.velocity = Vector2.UP.rotated(randf() * PI * 2) * randf() * 100
56cadf84 2023-12-02 Pavel Safronov107 return asteroid
5b18ed86 2023-11-01 Pavel Safronov108
c1061565 2023-11-07 Pavel Safronov109func get_new_item_pos(dist_ratio: float = 1.0) -> Vector2:
5b18ed86 2023-11-01 Pavel Safronov110 var pos_angle = randi() % 360
111 var unit_vector = Vector2.UP.rotated(pos_angle)
0bfcffe2 2023-11-07 Pavel Safronov112 var size = get_viewport().get_visible_rect().size
113 var max_side = max(size.x, size.y)
da9d123a 2023-11-07 Pavel Safronov114 var screen_radius = max_side + 10
c1061565 2023-11-07 Pavel Safronov115 var enemy_spawn_dist = screen_radius * dist_ratio
5b18ed86 2023-11-01 Pavel Safronov116 var pos = unit_vector * enemy_spawn_dist + $Player.global_position
969fd5af 2023-11-06 Pavel Safronov117 return pos
0d392ff8 2023-11-10 Pavel Safronov118func get_new_environment_position(dist_ratio: float = 1.0) -> Vector2:
119 var potential_pos: Vector2
120 while true:
121 # find the positions of the closest Environment items
a45831a2 2023-12-01 Pavel Safronov122 var items = environment_node.get_children()
0d392ff8 2023-11-10 Pavel Safronov123 potential_pos = get_new_item_pos(dist_ratio)
124 var closest_pos = 10000
125 for i in items:
126 var item: Node2D = i
127 var pos = item.global_position
128 var dist = potential_pos.distance_to(pos)
129 if dist < closest_pos:
130 closest_pos = dist
131 var is_too_close = closest_pos < 50
132 var found_one = !is_too_close
133 if found_one:
134 break
135 return potential_pos
136
7929daa8 2023-11-30 Pavel Safronov137func _ready() -> void:
56eea835 2023-12-02 Pavel Safronov138 player.camera.zoom = Vector2(starting_zoom, starting_zoom)
7929daa8 2023-11-30 Pavel Safronov139 run_generators()
6ad40cea 2023-12-01 Pavel Safronov140# # position first two enemies
141# var enemies = get_tree().get_nodes_in_group("enemies")
142# var enemy1: Enemy = enemies[0]
143# enemy1.position = Vector2(-300, 200)
144# var enemy2: Enemy = enemies[1]
145# enemy2.position = Vector2(300, 200)
7929daa8 2023-11-30 Pavel Safronov146 pass
147
148func run_generators() -> void:
149 for g in generators:
150 var generator = g
151 while true:
152 var is_done = generator.run($Environment)
153 if is_done:
154 break
155 pass
156
641b63b5 2023-11-10 Pavel Safronov157func _input(_event: InputEvent) -> void:
5be558de 2023-11-17 Pavel Safronov158 if player.dead:
1e3c7d1f 2023-11-06 Pavel Safronov159 return
a71b5173 2023-11-02 Pavel Safronov160
8c2ffd3f 2023-11-02 Pavel Safronov161func _process(_delta: float) -> void:
636e5224 2023-12-01 Pavel Safronov162 if is_game_over:
163 return
164
afb9a0a5 2023-11-30 Pavel Safronov165 # move navigation polygon around the player, navigation won't work outside of this polygon
166 var nav_size = Vector2(item_replacement_distance * 2 * 5, item_replacement_distance * 2 * 5)
167 var nav_pos = player.global_position - (nav_size * 0.5)
168 var vertices = PoolVector2Array([
169 nav_pos,
170 nav_pos + Vector2(nav_size.x, 0),
171 nav_pos + nav_size,
172 nav_pos + Vector2(0, nav_size.y)
173 ])
174 var polygon = NavigationPolygon.new()
175 polygon.set_vertices(vertices)
176 var indices = PoolIntArray([0, 1, 2, 3])
177 polygon.add_polygon(indices)
178 navigation_polygon_instance.navpoly = polygon
179
180 # set the objective text
f3c75ae9 2023-11-15 Pavel Safronov181 player.set_objective("%s / %s" % [completed_objectives, max_objectives])
afb9a0a5 2023-11-30 Pavel Safronov182
183 # if all objectives are complete, show the game finished menu
212b7b25 2023-11-08 Pavel Safronov184 var all_done = completed_objectives == max_objectives
185 if all_done:
636e5224 2023-12-01 Pavel Safronov186 is_game_over = true
0d177436 2023-11-15 Pavel Safronov187 var score = player.score
f3c75ae9 2023-11-15 Pavel Safronov188 player.add_high_score(score)
fc5de8ee 2023-11-09 Pavel Safronov189 var final_message = "You won with %s points!" % score
0d177436 2023-11-15 Pavel Safronov190 $Player/UI/GameFinishedMenu.find_node("Label").text = final_message
191 $Player/UI/GameFinishedMenu.show()
636e5224 2023-12-01 Pavel Safronov192 $Player/UI/HUD.is_game_over = true
a45831a2 2023-12-01 Pavel Safronov193 get_tree().paused = true
212b7b25 2023-11-08 Pavel Safronov194 return
195
7929daa8 2023-11-30 Pavel Safronov196 run_generators()
afb9a0a5 2023-11-30 Pavel Safronov197
198 # position the destination
cbc328fb 2023-11-17 Pavel Safronov199 $Destination.visible = player.is_destination_set
200 $Destination.global_position = player.destination
4ac09ada 2023-11-09 Pavel Safronov201
afb9a0a5 2023-11-30 Pavel Safronov202 # clear radar and populate with all items
203 var enemies = get_tree().get_nodes_in_group("enemies")
204 var filteredEnemies = Utils.filter(funcref(self,"filter_invalid_enemies"), enemies)
205 player.clear_radar()
206 player.update_radar(get_tree().get_nodes_in_group("gold"), Color.gold)
207 player.update_radar(filteredEnemies, Color.red)
e96078c1 2023-11-17 Pavel Safronov208 if player.settings.show_items:
209 player.update_radar(get_tree().get_nodes_in_group("health"), Color.gray)
210 player.update_radar(get_tree().get_nodes_in_group("weapons"), Color.white)
93d86765 2023-11-17 Pavel Safronov211 player.update_radar(get_tree().get_nodes_in_group("bombs"), Color.purple)
e96078c1 2023-11-17 Pavel Safronov212
6e5e56fe 2023-11-02 Pavel Safronov213func _on_Destination_body_entered(body: Node) -> void:
5be558de 2023-11-17 Pavel Safronov214 if body == player:
cbc328fb 2023-11-17 Pavel Safronov215 player.clear_destination()
f398dcb9 2023-11-02 Pavel Safronov216
52220002 2023-11-06 Pavel Safronov217func filter_invalid_enemies(enemy: Enemy) -> bool:
218 if enemy.dead:
219 return false
220 return true
f398dcb9 2023-11-02 Pavel Safronov221
222func _on_ShootTimer_timeout() -> void:
5be558de 2023-11-17 Pavel Safronov223 if player.dead:
f398dcb9 2023-11-02 Pavel Safronov224 return
52220002 2023-11-06 Pavel Safronov225
226func _on_Button_pressed() -> void:
227 get_tree().paused = false
04130db8 2023-11-07 Pavel Safronov228 $UI/PauseMenu.hide()
44475e04 2023-11-08 Pavel Safronov229
212b7b25 2023-11-08 Pavel Safronov230func _on_Game_over_button_pressed() -> void:
231 $UI/GameFinishedMenu.hide()
5f3f5126 2023-11-10 Pavel Safronov232 restart()
44475e04 2023-11-08 Pavel Safronov233
5f3f5126 2023-11-10 Pavel Safronov234func restart() -> void:
235 get_tree().paused = false
236 var _err = get_tree().reload_current_scene()
237
f3c75ae9 2023-11-15 Pavel Safronov238func _on_Player_debug() -> void:
0d177436 2023-11-15 Pavel Safronov239# player.score += 1
240# player.kill()
a45831a2 2023-12-01 Pavel Safronov241# player.score = 123
0d177436 2023-11-15 Pavel Safronov242# completed_objectives = max_objectives
0386b89d 2023-11-17 Pavel Safronov243# player.debug()
a45831a2 2023-12-01 Pavel Safronov244# weapon_consumed(Weapons.create_rocket_gun())
245 pass
ede9acdd 2023-11-17 Pavel Safronov246
247func _on_Player_destination_set() -> void:
248 $Destination.visible = player.is_destination_set
249 $Destination.global_position = player.destination
250 pass
62151b90 2023-11-29 Pavel Safronov251
252func _on_UpdateTimer_timeout() -> void:
a45831a2 2023-12-01 Pavel Safronov253 var env_items = environment_node.get_children()
254 for ei in env_items:
255 var item = ei as Node2D
256 var enemy := item as Enemy
3dea036b 2024-12-23 Pavel Safronov257
258# # if item is enemy, have them target the player
259# if enemy:
260# enemy.set_target($Player.position)
261
262 # if the item is too far from the player, teleport it to a closer location
a45831a2 2023-12-01 Pavel Safronov263 var diff = item.global_position - player.global_position
62151b90 2023-11-29 Pavel Safronov264 var dist = diff.length()
265 var is_too_far = dist > item_replacement_distance
266 if is_too_far:
267 var new_pos = get_new_environment_position(1 + randf())
a45831a2 2023-12-01 Pavel Safronov268 Utils.log("moving distant item from", item.global_position, "to", new_pos)
269 if enemy:
270 enemy.teleport(new_pos)
271 else:
272 item.global_position = new_pos