diff --git a/assets/bottle_1_pieces.tscn b/assets/bottle_1_pieces.tscn index d0c42fc..3e9f2ce 100644 --- a/assets/bottle_1_pieces.tscn +++ b/assets/bottle_1_pieces.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=19 format=4 uid="uid://bdy5isxqwbjq8"] +[gd_scene load_steps=20 format=4 uid="uid://bdy5isxqwbjq8"] [ext_resource type="Script" path="res://scripts/broken_object_spawn.gd" id="1_3nyc3"] [ext_resource type="AudioStream" uid="uid://bn4y63ws8jscs" path="res://assets/Audio/glass-break-two-thick-glasses-SBA-300121605.wav" id="1_vmlqu"] +[ext_resource type="Script" path="res://scripts/rigidbody_generic.gd" id="2_hod7s"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3phni"] resource_name = "bottle1" @@ -202,6 +203,7 @@ sound = NodePath("Piece 1/BrokenSound") [node name="Piece 1" type="RigidBody3D" parent="." groups=["scene_rigidbody"]] collision_layer = 32 collision_mask = 125 +script = ExtResource("2_hod7s") [node name="bottle1_broken_cell" type="MeshInstance3D" parent="Piece 1" groups=["scene_rigidbody"]] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.066139, 0.324223, -0.067418) @@ -218,6 +220,7 @@ stream = ExtResource("1_vmlqu") [node name="Piece 2" type="RigidBody3D" parent="." groups=["scene_rigidbody"]] collision_layer = 32 collision_mask = 125 +script = ExtResource("2_hod7s") [node name="bottle1_broken_cell_001" type="MeshInstance3D" parent="Piece 2" groups=["scene_rigidbody"]] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00347066, -0.310987, 0.106893) @@ -231,6 +234,7 @@ shape = SubResource("ConvexPolygonShape3D_2ytqg") [node name="Piece 3" type="RigidBody3D" parent="." groups=["scene_rigidbody"]] collision_layer = 32 collision_mask = 125 +script = ExtResource("2_hod7s") [node name="bottle1_broken_cell_002" type="MeshInstance3D" parent="Piece 3" groups=["scene_rigidbody"]] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0177096, 0.440996, 0.0680487) @@ -244,6 +248,7 @@ shape = SubResource("ConvexPolygonShape3D_78sq8") [node name="Piece 4" type="RigidBody3D" parent="." groups=["scene_rigidbody"]] collision_layer = 32 collision_mask = 125 +script = ExtResource("2_hod7s") [node name="bottle1_broken_cell_003" type="MeshInstance3D" parent="Piece 4" groups=["scene_rigidbody"]] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.000561402, -0.247355, -0.010017) @@ -257,6 +262,7 @@ shape = SubResource("ConvexPolygonShape3D_xqauf") [node name="Piece 5" type="RigidBody3D" parent="." groups=["scene_rigidbody"]] collision_layer = 32 collision_mask = 125 +script = ExtResource("2_hod7s") [node name="bottle1_broken_cell_004" type="MeshInstance3D" parent="Piece 5" groups=["scene_rigidbody"]] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.030646, 0.558282, -0.0404844) diff --git a/assets/crate1.tscn b/assets/crate1.tscn index d87eee7..23f594b 100644 --- a/assets/crate1.tscn +++ b/assets/crate1.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=7 format=4 uid="uid://cnfc8rtk6l1d8"] +[gd_scene load_steps=8 format=4 uid="uid://cnfc8rtk6l1d8"] [ext_resource type="Texture2D" uid="uid://dup2kiijwp087" path="res://assets/Models/crate1.albedo.png" id="1_adbv4"] +[ext_resource type="Script" path="res://scripts/rigidbody_generic.gd" id="1_mp68k"] [ext_resource type="Texture2D" uid="uid://b3m0ogfmynqxk" path="res://assets/Models/crate1.roughness.png" id="2_0ckk5"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_uc7fl"] @@ -48,10 +49,11 @@ shadow_mesh = SubResource("ArrayMesh_1l8qq") [sub_resource type="BoxShape3D" id="BoxShape3D_rhc2e"] size = Vector3(2.20142, 2.09351, 2.20142) -[node name="Crate1" type="RigidBody3D" groups=["moveable", "scene_rigidbody", "weight"]] +[node name="Crate1" type="RigidBody3D" groups=["moveable", "persist", "scene_rigidbody", "weight"]] collision_layer = 33 collision_mask = 125 continuous_cd = true +script = ExtResource("1_mp68k") [node name="Crate1" type="MeshInstance3D" parent="."] transform = Transform3D(0.102752, 0, 0, 0, 0.997525, 0, 0, 0, 0.102752, -0.000747025, -0.00163035, 7.72476e-05) diff --git a/assets/crown.tscn b/assets/crown.tscn index 2d78a66..32fc7ea 100644 --- a/assets/crown.tscn +++ b/assets/crown.tscn @@ -108,7 +108,7 @@ _data = { [sub_resource type="SphereShape3D" id="SphereShape3D_8rss4"] radius = 2.0 -[node name="Crown" type="Node3D"] +[node name="Crown" type="Node3D" groups=["persist"]] script = ExtResource("1_imbjk") [node name="Cylinder" type="MeshInstance3D" parent="."] diff --git a/assets/spider2.tscn b/assets/spider2.tscn index c1f5f71..8b9a09e 100644 --- a/assets/spider2.tscn +++ b/assets/spider2.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=75 format=4 uid="uid://djr7vnr1hcx82"] +[gd_scene load_steps=76 format=4 uid="uid://djr7vnr1hcx82"] [ext_resource type="Script" path="res://scripts/spider.gd" id="1_7e7fe"] [ext_resource type="Texture2D" uid="uid://dmyn4eq2r12ue" path="res://assets/Models/spider1.albedoRAW.png" id="1_di6b8"] @@ -816,7 +816,10 @@ _surfaces = [{ [sub_resource type="BoxShape3D" id="BoxShape3D_xxx55"] size = Vector3(0.816284, 0.725159, 0.75531) -[node name="spider" type="CharacterBody3D" groups=["enemy"]] +[sub_resource type="SphereShape3D" id="SphereShape3D_v8dp4"] +radius = 0.201 + +[node name="spider" type="CharacterBody3D" groups=["enemy", "persist"]] collision_layer = 8 collision_mask = 9 script = ExtResource("1_7e7fe") @@ -1010,6 +1013,10 @@ mesh = SubResource("ArrayMesh_v85cv") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0258179, 1.03281, 0.00894165) shape = SubResource("BoxShape3D_xxx55") +[node name="CollisionShape3D2" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.33052, 0.429336) +shape = SubResource("SphereShape3D_v8dp4") + [node name="NavigationAgent3D" type="NavigationAgent3D" parent="."] path_height_offset = 0.5 avoidance_enabled = true diff --git a/assets/table1.tscn b/assets/table1.tscn index 1e5e56d..c49ee88 100644 --- a/assets/table1.tscn +++ b/assets/table1.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=16 format=4 uid="uid://dvlpc0mrx16l"] +[gd_scene load_steps=17 format=4 uid="uid://dvlpc0mrx16l"] [ext_resource type="Texture2D" uid="uid://kifw7xxhd1ea" path="res://assets/Models/table1.albedo.png" id="1_25ol0"] +[ext_resource type="Script" path="res://scripts/rigidbody_generic.gd" id="1_ui0ym"] [ext_resource type="Texture2D" uid="uid://ch7bb23jijoyv" path="res://assets/Models/table1.roughness.png" id="2_fwfch"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1dbtg"] @@ -81,6 +82,7 @@ points = PackedVector3Array(0.531746, 0.031746, 0.0951418, -0.515873, -0.031746, collision_layer = 32 collision_mask = 125 mass = 15.0 +script = ExtResource("1_ui0ym") [node name="Table1" type="MeshInstance3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) diff --git a/project.godot b/project.godot index 4b4c61c..cb40f02 100644 --- a/project.godot +++ b/project.godot @@ -20,6 +20,7 @@ config/icon="res://icon.svg" SaveLoad="*res://scripts/save_load.gd" SignalBus="*res://scripts/signal_bus.gd" SwitchBasic="*res://scripts/switch_basic.gd" +RigidbodyGeneric="*res://scripts/rigidbody_generic.gd" [display] @@ -46,6 +47,7 @@ hud="" moveable="" door="" spawned="" +persist="" [input] diff --git a/scripts/LevelManager.gd b/scripts/LevelManager.gd index 10a9c64..14dfe9b 100644 --- a/scripts/LevelManager.gd +++ b/scripts/LevelManager.gd @@ -43,6 +43,7 @@ var engine_time_scale_cache : float = 1.0 # Called when the node enters the scene tree for the first time. func _ready(): + #refresh_scene() ##LOAD DATA SaveLoad.load_persistent_data() SaveLoad.load_save_game_data() @@ -54,7 +55,9 @@ func _ready(): var crown_spawn = crown.instantiate() if SaveLoad.last_hit_path: var crown_target = get_node(SaveLoad.last_hit_path) - crown_target.add_child(crown_spawn) + if crown_target: + crown_target.add_child(crown_spawn) + crown_spawn.position = Vector3(0,2,0) else: get_tree().get_root().add_child(crown_spawn) #global randomize function diff --git a/scripts/blunderbus.gd b/scripts/blunderbus.gd index d8d3763..c4db572 100644 --- a/scripts/blunderbus.gd +++ b/scripts/blunderbus.gd @@ -103,6 +103,7 @@ func fire(): player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,10) player.recoil.add_gun_recoil(recoil_amount.x) player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount) + SaveLoad.shots_fired += 1 func reload(): if level_control.ammo_current[gun_index] < max_ammo and player.gun.anim_player.get_current_animation() != "reload" and level_control.ammo_reserve[gun_index] > 0: @@ -115,12 +116,6 @@ func reload(): else: level_control.ammo_current[gun_index] = 1 -#func spawn_mag(): - #var instance_mag = mag.instantiate() - #instance_mag.position = mag_ejector.global_position - #instance_mag.transform.basis = mag_ejector.global_transform.basis - #get_tree().get_root().add_child(instance_mag) - func pellet_spawn(): var pellets_remaining = pellets_per_shot while pellets_remaining > 0: diff --git a/scripts/breakable.gd b/scripts/breakable.gd index 2313889..6da060f 100644 --- a/scripts/breakable.gd +++ b/scripts/breakable.gd @@ -1,4 +1,4 @@ -extends RigidBody3D +extends RigidbodyGeneric @export var broken_object : Resource @export var break_velocity : float = 10 diff --git a/scripts/crown.gd b/scripts/crown.gd index 637f5b7..9e2322b 100644 --- a/scripts/crown.gd +++ b/scripts/crown.gd @@ -10,7 +10,18 @@ func _process(delta: float) -> void: pass func target_change(): - var target = get_node(SaveLoad.last_hit_path) - if target: - global_rotation = Vector3(0,0,0) - global_transform.origin = target.global_position + Vector3(0,2,0) + pass + + +func save(): + var save_dict = { + "filename" : get_scene_file_path(), + "parent" : get_parent().get_path(), + "pos_x" : position.x, + "pos_y" : position.y, + "pos_z" : position.z, + "rot_x" : rotation.x, + "rot_y" : rotation.y, + "rot_z" : rotation.z, + } + return save_dict diff --git a/scripts/gun.gd b/scripts/gun.gd index 79594e9..3ed26f6 100644 --- a/scripts/gun.gd +++ b/scripts/gun.gd @@ -96,6 +96,7 @@ func shoot(delta): player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,10) player.recoil.add_gun_recoil(recoil_amount.x) #player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount) + SaveLoad.shots_fired += 1 if fire_mode != 0: cycle_count -= 1 @@ -118,6 +119,7 @@ func spawn_mag(): var instance_mag = mag.instantiate() instance_mag.position = mag_ejector.global_position instance_mag.transform.basis = mag_ejector.global_transform.basis + instance_mag.linear_velocity += transform.basis * Vector3(0, -20, 0) + player.velocity get_tree().get_root().add_child(instance_mag) func spawn_casing(): diff --git a/scripts/item_pickup.gd b/scripts/item_pickup.gd index d25d559..2e04fce 100644 --- a/scripts/item_pickup.gd +++ b/scripts/item_pickup.gd @@ -18,6 +18,7 @@ var player func _ready(): add_to_group("pickup") add_to_group("spawned") + add_to_group("persist") #find player player = level_control.player rand_amt = randi_range(25,100) @@ -69,3 +70,16 @@ func _on_timer_timeout() -> void: collision_shape.disabled = true await get_tree().create_timer(1).timeout self.queue_free() + +func save(): + var save_dict = { + "filename" : get_scene_file_path(), + "parent" : get_parent().get_path(), + "pos_x" : position.x, + "pos_y" : position.y, + "pos_z" : position.z, + "rot_x" : rotation.x, + "rot_y" : rotation.y, + "rot_z" : rotation.z + } + return save_dict diff --git a/scripts/mag1.gd b/scripts/mag1.gd index 9ae9eea..3241b24 100644 --- a/scripts/mag1.gd +++ b/scripts/mag1.gd @@ -4,7 +4,7 @@ extends RigidBody3D # Called when the node enters the scene tree for the first time. func _ready(): - linear_velocity += transform.basis * Vector3(0, -20, 0) + pass # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): diff --git a/scripts/player.gd b/scripts/player.gd index 6aac4d8..83b22f8 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -487,3 +487,17 @@ func hit(damage, fired_by, target_type): health_indicator.color = Color(0.471, 0, 0, .25) await get_tree().create_timer(.15).timeout health_indicator.color = Color(0.471, 0, 0, 0) + +func save(): + var save_dict = { + "filename" : get_scene_file_path(), + "parent" : get_parent().get_path(), + "pos_x" : position.x, + "pos_y" : position.y, + "pos_z" : position.z, + "rot_x" : rotation.x, + "rot_y" : rotation.y, + "rot_z" : rotation.z, + "health" : level_control.health + } + return save_dict diff --git a/scripts/revolver_1.gd b/scripts/revolver_1.gd index 0fb4230..c3af378 100644 --- a/scripts/revolver_1.gd +++ b/scripts/revolver_1.gd @@ -129,7 +129,7 @@ func shoot(delta): audio_fire.pitch_scale = 1 + rng.randf_range(-fire_pitch_scale_amt,fire_pitch_scale_amt) audio_fire.play() anim_player.play("shoot") #actual bullet spawn triggered by animation - #knocks player back, use on bigger guns player.velocity += player.bullet_ray.global_basis * Vector3(0,0, kick_amount) + SaveLoad.shots_fired += 1 if fire_mode != 0: cycle_count -= 1 diff --git a/scripts/rigidbody_generic.gd b/scripts/rigidbody_generic.gd new file mode 100644 index 0000000..e22d3a5 --- /dev/null +++ b/scripts/rigidbody_generic.gd @@ -0,0 +1,24 @@ +extends RigidBody3D + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + add_to_group("persist") + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass + +func save(): + var save_dict = { + "filename" : get_scene_file_path(), + "parent" : get_parent().get_path(), + "pos_x" : position.x, + "pos_y" : position.y, + "pos_z" : position.z, + "rot_x" : rotation.x, + "rot_y" : rotation.y, + "rot_z" : rotation.z, + } + return save_dict diff --git a/scripts/rocket_launcher.gd b/scripts/rocket_launcher.gd index 52d80ac..02259b7 100644 --- a/scripts/rocket_launcher.gd +++ b/scripts/rocket_launcher.gd @@ -95,6 +95,7 @@ func shoot(delta): instance_bullet.player_position = player.global_position get_tree().get_root().add_child(instance_bullet) player.recoil.add_recoil(recoil_amount,10,10) + SaveLoad.shots_fired += 1 if fire_mode != 0: cycle_count -= 1 diff --git a/scripts/room_manager.gd b/scripts/room_manager.gd index 7d93780..3315d44 100644 --- a/scripts/room_manager.gd +++ b/scripts/room_manager.gd @@ -66,6 +66,8 @@ func _process(delta): for i in enemies: i.loot_amount = 20 #assign loot to the last enemy drop from this section i.last_enemy = true + else: + enemy_in_room_killed() func enemy_in_room_killed(): var enemy_count = 0 diff --git a/scripts/save_load.gd b/scripts/save_load.gd index 85c1bd4..c0b830a 100644 --- a/scripts/save_load.gd +++ b/scripts/save_load.gd @@ -3,8 +3,9 @@ extends Node ## SAVE DATA #PERSISTENT DATA var last_hit_path -var player_deaths -var enemies_killed +var player_deaths = 0 +var enemies_killed = 0 +var shots_fired = 0 #GAME DATA var data_cleared @@ -34,9 +35,8 @@ func save_persistent_data(): print("LAST HIT PATH " + str(last_hit_path)) file.store_var(last_hit_path) file.store_var(player_deaths) - print("SAVING PLAYER DEATHS " + str(player_deaths)) file.store_var(enemies_killed) - print("SAVING ENEMIES KILLED " + str(enemies_killed)) + file.store_var(shots_fired) file.close() @@ -49,6 +49,8 @@ func load_persistent_data(): print("PLAYER DEATHS : " + str(player_deaths)) enemies_killed = file.get_var() print("ENEMIES KILLED : " + str(enemies_killed)) + shots_fired = file.get_var() + print("SHOTS FIRED ",shots_fired) file.close() else: @@ -84,7 +86,20 @@ func save_game_data(): file.store_var(current_gun) file.store_var(current_ammo) file.store_var(reserve_ammo) - file.store_var(enemies) + + #save enemies + var objects = get_tree().get_nodes_in_group("persist") + for object in objects: + if object.scene_file_path.is_empty(): + print("persistent node '%s' is not an instanced scene, skipped" % object.name) + continue + # Check the node has a save function. + if !object.has_method("save"): + print("persistent node '%s' is missing a save() function, skipped" % object.name) + continue + var object_data = object.call("save") + var json_string = JSON.stringify(object_data) + file.store_line(json_string) file.close() @@ -122,7 +137,32 @@ func load_save_game_data(): current_gun = file.get_var() current_ammo = file.get_var() reserve_ammo = file.get_var() - enemies = file.get_var() + var current_nodes = get_tree().get_nodes_in_group("persist") + for i in current_nodes: + if i.get_class() == "CharacterBody3D": + i.die() + else: + i.queue_free() + + while file.get_position() < file.get_length(): + var json_string = file.get_line() + var json = JSON.new() + var parse_result = json.parse(json_string) + if not parse_result == OK: + print("JSON Parse Error: ",json.get_error_message()," in ",json_string, " at line ", json.get_error_line()) + continue + var node_data = json.data + var new_object = load(node_data["filename"]).instantiate() + get_node(node_data["parent"]).add_child(new_object) + print("NEW OBJECT : ",new_object) + new_object.position = Vector3(node_data["pos_x"],node_data["pos_y"],node_data["pos_z"]) + new_object.rotation = Vector3(node_data["rot_x"],node_data["rot_y"],node_data["rot_z"]) + print("NEW OBJECT PLACED AT ", new_object.position) + for i in node_data.keys(): + if i == "filename" or i == "pos_x" or i == "pos_y" or i == "pos_z": + continue + new_object.set(i,node_data[i]) + #APPLY DATA player.global_position = player_loc @@ -146,12 +186,14 @@ func data_validate(file,variable): else: return null -func persistent_data_calc(variable,amount): +func null_data_check(variable,amount): #checks if value is null, adds the number to variable + print("VARIABLE ", variable) if variable == null: variable = amount - print(str(variable) +" "+ str(amount)) else: variable += amount + + return variable func load_data(): load_persistent_data() diff --git a/scripts/spider.gd b/scripts/spider.gd index 2b2e168..2fb57a4 100644 --- a/scripts/spider.gd +++ b/scripts/spider.gd @@ -220,5 +220,20 @@ func drop_loot(number_of_drops): can_die = true + +func save(): + var save_dict = { + "filename" : get_scene_file_path(), + "parent" : get_parent().get_path(), + "pos_x" : position.x, + "pos_y" : position.y, + "pos_z" : position.z, + "rot_x" : rotation.x, + "rot_y" : rotation.y, + "rot_z" : rotation.z, + "health" : health + } + return save_dict + func _on_area_3d_body_entered(body: Node3D) -> void: pass # Replace with function body. diff --git a/scripts/trackerGun.gd b/scripts/trackerGun.gd index 0fbbf5a..8b30eda 100644 --- a/scripts/trackerGun.gd +++ b/scripts/trackerGun.gd @@ -119,6 +119,7 @@ func fire(): spawn_casing() player.recoil.add_recoil(Vector3(0,recoil_amount.y,recoil_amount.z),10,10) player.recoil.add_gun_recoil(recoil_amount.x) + SaveLoad.shots_fired += 1 if fire_mode != 0: cycle_count -= 1 diff --git a/scripts/weapon_pickup.gd b/scripts/weapon_pickup.gd index 1db84a9..27a42ce 100644 --- a/scripts/weapon_pickup.gd +++ b/scripts/weapon_pickup.gd @@ -11,7 +11,7 @@ var gun_already_held = false # Called when the node enters the scene tree for the first time. func _ready(): - pass # Replace with function body. + add_to_group("persist") # Called every frame. 'delta' is the elapsed time since the previous frame. @@ -32,3 +32,16 @@ func picked_up(): level_control.player.gun.anim_player.play("swap_out") level_control.gun_spawn(weapon_id) queue_free() + +func save(): + var save_dict = { + "filename" : get_scene_file_path(), + "parent" : get_parent().get_path(), + "pos_x" : position.x, + "pos_y" : position.y, + "pos_z" : position.z, + "rot_x" : rotation.x, + "rot_y" : rotation.y, + "rot_z" : rotation.z, + } + return save_dict