fuzzyworld

godot-shooter / files / scenes / World.gd

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")
5
16938031 2023-11-17 Pavel Safronov6const Utils = preload("res://utils/Utils.gd")
7const Weapons = preload("res://weapons/Weapons.gd")
8const PowerUp = preload("res://items/PowerUp.tscn")
9const Settings = preload("res://utils/Settings.gd")
f3c75ae9 2023-11-15 Pavel Safronov10onready var player: Player = $Player
62151b90 2023-11-29 Pavel Safronov11onready var update_timer = $UpdateTimer
afb9a0a5 2023-11-30 Pavel Safronov12onready var navigation_polygon_instance: NavigationPolygonInstance = $NavigationPolygonInstance
a45831a2 2023-12-01 Pavel Safronov13onready var environment_node = $Environment
4ac09ada 2023-11-09 Pavel Safronov14
44475e04 2023-11-08 Pavel Safronov15var generators = [
6a08f6b2 2023-12-01 Pavel Safronov16 ConstantItemGenerator.new("create_enemy", self, "enemies", 5),
c65ec260 2023-12-01 Pavel Safronov17 ConstantItemGenerator.new("create_health", self, "health", 20),
c2827327 2023-11-10 Pavel Safronov18 ConstantItemGenerator.new("create_weapon", self, "weapon", 10),
93d86765 2023-11-17 Pavel Safronov19 ConstantItemGenerator.new("create_bomb", self, "bombs", 10),
212b7b25 2023-11-08 Pavel Safronov20 LevelItemGenerator.new(5, "create_gold", self, "gold", 5),
44475e04 2023-11-08 Pavel Safronov21]
212b7b25 2023-11-08 Pavel Safronov22var completed_objectives = 0
f6120dba 2023-11-08 Pavel Safronov23var max_objectives = 5
4cb0d97e 2023-11-10 Pavel Safronov24var item_replacement_distance = 2000
641b63b5 2023-11-10 Pavel Safronov25var is_dragging = false
636e5224 2023-12-01 Pavel Safronov26var is_game_over = false
56eea835 2023-12-02 Pavel Safronov27export var starting_zoom = 1.5
44475e04 2023-11-08 Pavel Safronov28
29func enemy_killed(_position: Vector2):
f3c75ae9 2023-11-15 Pavel Safronov30 player.score += 5
bfa99fb9 2023-12-01 Pavel Safronov31func health_consumed(_power_up):
a45831a2 2023-12-01 Pavel Safronov32 player.heal(20)
6b8f57b9 2023-11-17 Pavel Safronov33 player.score += 1
bfa99fb9 2023-12-01 Pavel Safronov34func gold_consumed(_power_up):
fc5de8ee 2023-11-09 Pavel Safronov35 completed_objectives += 1
f85124dd 2023-11-17 Pavel Safronov36 var points = 5 * (completed_objectives+1)
37 player.score += points
5320761c 2023-11-17 Pavel Safronov38 player.show_message("+%d points" % points)
a45831a2 2023-12-01 Pavel Safronov39 player.health = player.max_health
bfa99fb9 2023-12-01 Pavel Safronov40func weapon_consumed(power_up):
41 var data = power_up.data
8b763d15 2023-11-11 Pavel Safronov42 var weapon: Weapon = data
5be558de 2023-11-17 Pavel Safronov43 var is_same_weapon = player.weapon.name == weapon.name
8b763d15 2023-11-11 Pavel Safronov44 if is_same_weapon && weapon.ammo != INF:
5be558de 2023-11-17 Pavel Safronov45 player.weapon.ammo += player.weapon.reload_size
8b763d15 2023-11-11 Pavel Safronov46 else:
5be558de 2023-11-17 Pavel Safronov47 player.weapon = weapon
bfa99fb9 2023-12-01 Pavel Safronov48func bomb_consumed(power_up):
49 var pos: Vector2 = power_up.global_position
93d86765 2023-11-17 Pavel Safronov50 var bomb = Bomb.instance()
a45831a2 2023-12-01 Pavel Safronov51 environment_node.call_deferred("add_child",bomb)
93d86765 2023-11-17 Pavel Safronov52 bomb.position = pos
8b763d15 2023-11-11 Pavel Safronov53
44475e04 2023-11-08 Pavel Safronov54func create_enemy() -> Enemy:
969fd5af 2023-11-06 Pavel Safronov55 var enemy = Enemy.instance()
6ad40cea 2023-12-01 Pavel Safronov56 enemy.position = get_new_environment_position(1)
969fd5af 2023-11-06 Pavel Safronov57 enemy.connect("enemy_killed", self, "enemy_killed")
44475e04 2023-11-08 Pavel Safronov58 return enemy
59func create_health() -> PowerUp:
11ed9f7a 2023-11-08 Pavel Safronov60 var health = PowerUp.instance()
0d392ff8 2023-11-10 Pavel Safronov61 health.position = get_new_environment_position(randf() + .5)
ddae17d7 2023-11-08 Pavel Safronov62 health.connect("consumed", self, "health_consumed")
11ed9f7a 2023-11-08 Pavel Safronov63 health.label = "+HP"
64 health.color = Color.green
44475e04 2023-11-08 Pavel Safronov65 return health
93d86765 2023-11-17 Pavel Safronov66func create_bomb() -> PowerUp:
67 var bomb = PowerUp.instance()
68 var pos = get_new_environment_position(randf() + .5)
69 bomb.position = pos
70 bomb.connect("consumed", self, "bomb_consumed")
71 bomb.label = "BOMB"
72 bomb.color = Color.purple
73 return bomb
0d392ff8 2023-11-10 Pavel Safronov74func create_gold(pos: Vector2 = get_new_environment_position(1 + randf())) -> PowerUp:
44475e04 2023-11-08 Pavel Safronov75 var gold = PowerUp.instance()
76 gold.position = pos
77 gold.connect("consumed", self, "gold_consumed")
fc5de8ee 2023-11-09 Pavel Safronov78 gold.label = ""
44475e04 2023-11-08 Pavel Safronov79 gold.color = Color.gold
80 return gold
5e4e3a9c 2023-11-08 Pavel Safronov81func create_weapon() -> PowerUp:
8b763d15 2023-11-11 Pavel Safronov82 var weapon: PowerUp = PowerUp.instance()
0d392ff8 2023-11-10 Pavel Safronov83 weapon.position = get_new_environment_position(randf() + .5)
8b763d15 2023-11-11 Pavel Safronov84 var _err = weapon.connect("consumed", self, "weapon_consumed")
85 var r = randf()
c3ac3ece 2023-11-11 Pavel Safronov86 if r < .45:
8b763d15 2023-11-11 Pavel Safronov87 weapon.data = Weapons.create_rocket_gun()
88 weapon.label = "ROC"
89 weapon.color = Color.red
c3ac3ece 2023-11-11 Pavel Safronov90 elif r < .9:
023ec2fb 2023-11-29 Pavel Safronov91 weapon.data = Weapons.create_smg_gun()
8b763d15 2023-11-11 Pavel Safronov92 weapon.label = "SMG"
93 weapon.color = Color.orange
94 else:
95 weapon.data = Weapons.create_basic_gun()
96 weapon.label = "LZR"
97 weapon.color = Color.pink
5e4e3a9c 2023-11-08 Pavel Safronov98 return weapon
5b18ed86 2023-11-01 Pavel Safronov99
c1061565 2023-11-07 Pavel Safronov100func get_new_item_pos(dist_ratio: float = 1.0) -> Vector2:
5b18ed86 2023-11-01 Pavel Safronov101 var pos_angle = randi() % 360
102 var unit_vector = Vector2.UP.rotated(pos_angle)
0bfcffe2 2023-11-07 Pavel Safronov103 var size = get_viewport().get_visible_rect().size
104 var max_side = max(size.x, size.y)
da9d123a 2023-11-07 Pavel Safronov105 var screen_radius = max_side + 10
c1061565 2023-11-07 Pavel Safronov106 var enemy_spawn_dist = screen_radius * dist_ratio
5b18ed86 2023-11-01 Pavel Safronov107 var pos = unit_vector * enemy_spawn_dist + $Player.global_position
969fd5af 2023-11-06 Pavel Safronov108 return pos
0d392ff8 2023-11-10 Pavel Safronov109func get_new_environment_position(dist_ratio: float = 1.0) -> Vector2:
110 var potential_pos: Vector2
111 while true:
112 # find the positions of the closest Environment items
a45831a2 2023-12-01 Pavel Safronov113 var items = environment_node.get_children()
0d392ff8 2023-11-10 Pavel Safronov114 potential_pos = get_new_item_pos(dist_ratio)
115 var closest_pos = 10000
116 for i in items:
117 var item: Node2D = i
118 var pos = item.global_position
119 var dist = potential_pos.distance_to(pos)
120 if dist < closest_pos:
121 closest_pos = dist
122 var is_too_close = closest_pos < 50
123 var found_one = !is_too_close
124 if found_one:
125 break
126 return potential_pos
127
7929daa8 2023-11-30 Pavel Safronov128func _ready() -> void:
56eea835 2023-12-02 Pavel Safronov129 player.camera.zoom = Vector2(starting_zoom, starting_zoom)
7929daa8 2023-11-30 Pavel Safronov130 run_generators()
6ad40cea 2023-12-01 Pavel Safronov131# # position first two enemies
132# var enemies = get_tree().get_nodes_in_group("enemies")
133# var enemy1: Enemy = enemies[0]
134# enemy1.position = Vector2(-300, 200)
135# var enemy2: Enemy = enemies[1]
136# enemy2.position = Vector2(300, 200)
7929daa8 2023-11-30 Pavel Safronov137 pass
138
139func run_generators() -> void:
140 for g in generators:
141 var generator = g
142 while true:
143 var is_done = generator.run($Environment)
144 if is_done:
145 break
146 pass
147
641b63b5 2023-11-10 Pavel Safronov148func _input(_event: InputEvent) -> void:
5be558de 2023-11-17 Pavel Safronov149 if player.dead:
1e3c7d1f 2023-11-06 Pavel Safronov150 return
a71b5173 2023-11-02 Pavel Safronov151
8c2ffd3f 2023-11-02 Pavel Safronov152func _process(_delta: float) -> void:
636e5224 2023-12-01 Pavel Safronov153 if is_game_over:
154 return
155
afb9a0a5 2023-11-30 Pavel Safronov156 # move navigation polygon around the player, navigation won't work outside of this polygon
157 var nav_size = Vector2(item_replacement_distance * 2 * 5, item_replacement_distance * 2 * 5)
158 var nav_pos = player.global_position - (nav_size * 0.5)
159 var vertices = PoolVector2Array([
160 nav_pos,
161 nav_pos + Vector2(nav_size.x, 0),
162 nav_pos + nav_size,
163 nav_pos + Vector2(0, nav_size.y)
164 ])
165 var polygon = NavigationPolygon.new()
166 polygon.set_vertices(vertices)
167 var indices = PoolIntArray([0, 1, 2, 3])
168 polygon.add_polygon(indices)
169 navigation_polygon_instance.navpoly = polygon
170
171 # set the objective text
f3c75ae9 2023-11-15 Pavel Safronov172 player.set_objective("%s / %s" % [completed_objectives, max_objectives])
afb9a0a5 2023-11-30 Pavel Safronov173
174 # if all objectives are complete, show the game finished menu
212b7b25 2023-11-08 Pavel Safronov175 var all_done = completed_objectives == max_objectives
176 if all_done:
636e5224 2023-12-01 Pavel Safronov177 is_game_over = true
0d177436 2023-11-15 Pavel Safronov178 var score = player.score
f3c75ae9 2023-11-15 Pavel Safronov179 player.add_high_score(score)
fc5de8ee 2023-11-09 Pavel Safronov180 var final_message = "You won with %s points!" % score
0d177436 2023-11-15 Pavel Safronov181 $Player/UI/GameFinishedMenu.find_node("Label").text = final_message
182 $Player/UI/GameFinishedMenu.show()
636e5224 2023-12-01 Pavel Safronov183 $Player/UI/HUD.is_game_over = true
a45831a2 2023-12-01 Pavel Safronov184 get_tree().paused = true
212b7b25 2023-11-08 Pavel Safronov185 return
186
7929daa8 2023-11-30 Pavel Safronov187 run_generators()
afb9a0a5 2023-11-30 Pavel Safronov188
189 # position the destination
cbc328fb 2023-11-17 Pavel Safronov190 $Destination.visible = player.is_destination_set
191 $Destination.global_position = player.destination
4ac09ada 2023-11-09 Pavel Safronov192
afb9a0a5 2023-11-30 Pavel Safronov193 # clear radar and populate with all items
194 var enemies = get_tree().get_nodes_in_group("enemies")
195 var filteredEnemies = Utils.filter(funcref(self,"filter_invalid_enemies"), enemies)
196 player.clear_radar()
197 player.update_radar(get_tree().get_nodes_in_group("gold"), Color.gold)
198 player.update_radar(filteredEnemies, Color.red)
e96078c1 2023-11-17 Pavel Safronov199 if player.settings.show_items:
200 player.update_radar(get_tree().get_nodes_in_group("health"), Color.gray)
201 player.update_radar(get_tree().get_nodes_in_group("weapons"), Color.white)
93d86765 2023-11-17 Pavel Safronov202 player.update_radar(get_tree().get_nodes_in_group("bombs"), Color.purple)
e96078c1 2023-11-17 Pavel Safronov203
6e5e56fe 2023-11-02 Pavel Safronov204func _on_Destination_body_entered(body: Node) -> void:
5be558de 2023-11-17 Pavel Safronov205 if body == player:
cbc328fb 2023-11-17 Pavel Safronov206 player.clear_destination()
f398dcb9 2023-11-02 Pavel Safronov207
52220002 2023-11-06 Pavel Safronov208func filter_invalid_enemies(enemy: Enemy) -> bool:
209 if enemy.dead:
210 return false
211 return true
f398dcb9 2023-11-02 Pavel Safronov212
213func _on_ShootTimer_timeout() -> void:
5be558de 2023-11-17 Pavel Safronov214 if player.dead:
f398dcb9 2023-11-02 Pavel Safronov215 return
52220002 2023-11-06 Pavel Safronov216
217func _on_Button_pressed() -> void:
218 get_tree().paused = false
04130db8 2023-11-07 Pavel Safronov219 $UI/PauseMenu.hide()
44475e04 2023-11-08 Pavel Safronov220
212b7b25 2023-11-08 Pavel Safronov221func _on_Game_over_button_pressed() -> void:
222 $UI/GameFinishedMenu.hide()
5f3f5126 2023-11-10 Pavel Safronov223 restart()
44475e04 2023-11-08 Pavel Safronov224
5f3f5126 2023-11-10 Pavel Safronov225func restart() -> void:
226 get_tree().paused = false
227 var _err = get_tree().reload_current_scene()
228
f3c75ae9 2023-11-15 Pavel Safronov229func _on_Player_debug() -> void:
0d177436 2023-11-15 Pavel Safronov230# player.score += 1
231# player.kill()
a45831a2 2023-12-01 Pavel Safronov232# player.score = 123
0d177436 2023-11-15 Pavel Safronov233# completed_objectives = max_objectives
0386b89d 2023-11-17 Pavel Safronov234# player.debug()
a45831a2 2023-12-01 Pavel Safronov235# weapon_consumed(Weapons.create_rocket_gun())
236 pass
ede9acdd 2023-11-17 Pavel Safronov237
238func _on_Player_destination_set() -> void:
239 $Destination.visible = player.is_destination_set
240 $Destination.global_position = player.destination
241 pass
62151b90 2023-11-29 Pavel Safronov242
243func _on_UpdateTimer_timeout() -> void:
a45831a2 2023-12-01 Pavel Safronov244 var env_items = environment_node.get_children()
245 for ei in env_items:
246 var item = ei as Node2D
247 var enemy := item as Enemy
248 if enemy:
249 # if item is enemy, have them target the player
250 enemy.set_target($Player.position)
251
252 var diff = item.global_position - player.global_position
62151b90 2023-11-29 Pavel Safronov253 var dist = diff.length()
254 var is_too_far = dist > item_replacement_distance
255 if is_too_far:
256 var new_pos = get_new_environment_position(1 + randf())
a45831a2 2023-12-01 Pavel Safronov257 Utils.log("moving distant item from", item.global_position, "to", new_pos)
258 if enemy:
259 enemy.teleport(new_pos)
260 else:
261 item.global_position = new_pos