├── .gitattributes ├── README.md └── _SETUP_PROJECT_ ├── project_scripts ├── Bore.gd ├── Cancerball.gd ├── Cutscenes │ ├── Activator.gd │ ├── Camerarotator.gd │ ├── Consumer_Logo.gd │ ├── Endaudio.gd │ ├── Killzone.gd │ ├── lensflare.gd │ ├── screen.gd │ ├── target_finder.gd │ └── zoomcamera.gd ├── Entities │ ├── Alert_Sphere_Big.gd │ ├── Ambience_Emitter.gd │ ├── Bullets │ │ └── Fire_Child.gd │ ├── Creatures │ │ ├── Fish.gd │ │ └── Talker.gd │ ├── Decals │ │ ├── Blooddecal.gd │ │ ├── play_particle.gd │ │ └── random_pitch.gd │ ├── Enemies │ │ ├── Acid_Spray_Weapon.gd │ │ └── remove_sound_dead.gd │ ├── FOV_Setter.gd │ ├── Fish │ │ ├── Fish_Mesh.gd │ │ └── Organ_Mesh.gd │ ├── Game_Manager.gd │ ├── Hope_Eradicator.gd │ ├── Particles │ │ ├── autoplay.gd │ │ └── muzzleflash.gd │ ├── Physics_Objects │ │ ├── Asset_Pickup.gd │ │ ├── Implant_Object.gd │ │ └── coin.gd │ ├── Radio.gd │ ├── Rain_Spawner.gd │ ├── Stock_Handler.gd │ ├── UI │ │ └── UI_Quad.gd │ ├── UI2.gd │ ├── Vehicles │ │ └── Helicopter.gd │ ├── curseface.gd │ ├── soulll.gd │ └── waterdrop.gd ├── Explosion.gd ├── Fire.gd ├── Levels │ ├── Copspawner.gd │ ├── Pseud_Light.gd │ ├── light_controller.gd │ ├── rotation.gd │ ├── sky_rotator.gd │ ├── skybox.gd │ ├── skyboxcamera.gd │ ├── snakearea.gd │ ├── strobe.gd │ └── telepoorter.gd ├── Menu │ ├── Camera_Rotator.gd │ ├── Character_Menu.gd │ ├── Gunshot_Emitter.gd │ ├── Level_Button.gd │ ├── Level_End_Grid.gd │ ├── Level_End_Menu.gd │ ├── Main_Menu.gd │ ├── PanelContainerEffect.gd │ ├── ScrollContainerDynamic.gd │ ├── Settings_Grid.gd │ ├── Speech.gd │ ├── Stock_Menu.gd │ ├── WeaponViewport.gd │ ├── hide.gd │ └── name_override.gd ├── Menu_Test.gd ├── Missile.gd ├── MissileKinematic.gd ├── Player_Manager.gd ├── Radiation.gd ├── Scripts │ ├── Abraxas_Head.gd │ ├── Abraxas_Laser.gd │ ├── Abraxas_Rocket.gd │ ├── Acid.gd │ ├── Acid_Ball.gd │ ├── Alert_Event.gd │ ├── Anim_Autoplay.gd │ ├── Berries.gd │ ├── Car.gd │ ├── Console.gd │ ├── Cutscene.gd │ ├── Destructible.gd │ ├── Destructible_Armored.gd │ ├── Destructible_Static.gd │ ├── Dialogue.gd │ ├── Divine_Door.gd │ ├── Door.gd │ ├── Dynamic_NPC.gd │ ├── E_Civilian_Movement.gd │ ├── E_Grunt_Movement.gd │ ├── E_Grunt_Movement_New.gd │ ├── Elevator.gd │ ├── Elevator_Door.gd │ ├── EnemyHandler.gd │ ├── Enemy_Controller.gd │ ├── Enemy_Melee_Weapon.gd │ ├── Enemy_Movement_Threaded.gd │ ├── Enemy_Torso.gd │ ├── Exit.gd │ ├── Fishing_Hook.gd │ ├── Grenade.gd │ ├── Grill.gd │ ├── Implants.gd │ ├── Item_Slotmachine.gd │ ├── Kinematic_Physics_Object.gd │ ├── Kinematic_Physics_Object_Environment.gd │ ├── Ladder.gd │ ├── Level_Painting.gd │ ├── Locked_Door.gd │ ├── Message_Area.gd │ ├── Navigation.gd │ ├── Night_Cycle.gd │ ├── Pickup.gd │ ├── Player.gd │ ├── Player_Manager.gd │ ├── Profane_Door.gd │ ├── Pushblock.gd │ ├── Random_Mesh.gd │ ├── Random_Spawner.gd │ ├── Randomsound.gd │ ├── Reticle.gd │ ├── Rotator_Y.gd │ ├── Rotator_Y_Spatial.gd │ ├── Scope.gd │ ├── SineTest.gd │ ├── Slotmachine.gd │ ├── Sniper_Ray.gd │ ├── Soul_Restorer.gd │ ├── Special_Destroy.gd │ ├── Special_Pushblock.gd │ ├── Stupid_Civilian.gd │ ├── Toxic_Water.gd │ ├── Tutorial_Exit.gd │ ├── UI.gd │ ├── Water.gd │ ├── Weapon_Pickup.gd │ ├── Weapon_Slotmachine.gd │ ├── abraxas.gd │ ├── crab_anim.gd │ ├── crusher.gd │ ├── deathmodesetter.gd │ ├── down_door.gd │ ├── down_switch_door.gd │ ├── elevator_stopper.gd │ ├── flesh_rat.gd │ ├── garbage_destroyer.gd │ ├── godwall.gd │ ├── key.gd │ ├── make_unlit.gd │ ├── material_randomizer.gd │ ├── new_vehicle.gd │ ├── rainmaker.gd │ ├── remote_destroyer.gd │ ├── scripted_anim.gd │ ├── speech_label.gd │ ├── up_objective_activated_door.gd │ ├── vendingmachine.gd │ ├── weapon.gd │ └── weapon_pickup_new.gd ├── Steam.gd ├── Stocks.gd ├── Switch.gd ├── Terror_Door.gd ├── addons │ ├── BitmapFontCutter │ │ ├── cutter.gd │ │ └── main.gd │ ├── decals │ │ ├── decal.gd │ │ └── plugin.gd │ └── qodot │ │ ├── game-definitions │ │ ├── fgd │ │ │ ├── point_classes │ │ │ │ ├── light.gd │ │ │ │ └── physics_ball.gd │ │ │ └── solid_classes │ │ │ │ ├── button.gd │ │ │ │ ├── mover.gd │ │ │ │ ├── physics.gd │ │ │ │ ├── rotate.gd │ │ │ │ └── trigger.gd │ │ └── worldspawn_layers │ │ │ ├── liquid.gd │ │ │ └── liquid │ │ │ ├── lava.gd │ │ │ ├── slime.gd │ │ │ └── water.gd │ │ └── src │ │ ├── import_plugins │ │ ├── quake_map_import_plugin.gd │ │ ├── quake_palette_import_plugin.gd │ │ └── quake_wad_import_plugin.gd │ │ ├── nodes │ │ ├── qodot_entity.gd │ │ ├── qodot_map.gd │ │ └── qodot_spatial.gd │ │ ├── qodot_plugin.gd │ │ ├── resources │ │ ├── game-definitions │ │ │ ├── fgd │ │ │ │ ├── qodot_fgd_base_class.gd │ │ │ │ ├── qodot_fgd_class.gd │ │ │ │ ├── qodot_fgd_file.gd │ │ │ │ ├── qodot_fgd_point_class.gd │ │ │ │ └── qodot_fgd_solid_class.gd │ │ │ └── trenchbroom │ │ │ │ ├── trenchbroom_face_attrib.gd │ │ │ │ ├── trenchbroom_game_config_file.gd │ │ │ │ ├── trenchbroom_game_config_folder.gd │ │ │ │ └── trenchbroom_tag.gd │ │ ├── quake_map_file.gd │ │ ├── quake_palette_file.gd │ │ ├── quake_wad_file.gd │ │ └── worldspawn_layer.gd │ │ └── util │ │ ├── qodot_dependencies.gd │ │ ├── qodot_texture_loader.gd │ │ └── qodot_util.gd ├── droplet.gd ├── grid_enemy.gd ├── killbox.gd ├── lighttoggle.gd ├── modloader.gd ├── psychocamera.gd ├── snake.gd ├── snakehead.gd └── timed_sound.gd └── setup_scripts.bat /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cruelty Squad Project Setup Tool 2 | 3 | Tool consisting of a batch script and folder of every game script in Cruelty Squad, which strikes a balance between copyright infringement and ease of setup by only automating the most unpleasant part of creating a modding copy of the game. 4 | 5 | It copies scripts that have already been decompiled and fixed, then deletes their .gdc and .gd.remap counterparts. 6 | 7 | Fixes have been applied to: 8 | - Help the intro cutscene play properly 9 | - Improve game performance 10 | - Clean up extraneous whitespace 11 | 12 | ## How to use 13 | 14 | For complete instructions on setting up your own modding copy, take a look at [this guide](https://hackmd.io/@OsM6oUcXSwG3mLNvTlPMZg/rk56jogV_). 15 | 16 | 1. Download the [latest release](https://github.com/crustyrashky/crus-project-setup-tool/releases/download/july-03-2023/crus-project-setup-tool-july-03-2023.zip) 17 | 2. Extract `_SETUP_PROJECT_` folder into project root directory (where your `project.godot`/`project.binary` file is) 18 | 3. Run `setup_scripts.bat` 19 | 20 | ## Credits 21 | 22 | All game scripts outside of the addons folder belong to Consumer Softproducts 23 | BitmapFontCutter addon from https://github.com/nobuyukinyuu/BitmapFontCutter 24 | Screen Space Decals addon from https://github.com/Mr-Slurpy/Screen-Space-Decals 25 | Qodot addon from https://github.com/Shfty/qodot-plugin 26 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Bore.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | 4 | 5 | 6 | 7 | export var speed = 50 8 | export var homing = false 9 | var target 10 | var head_entered = false 11 | var target_found = false 12 | var target_pos 13 | var target_pos_prev 14 | var time = 0 15 | var velocity = Vector3(1, 1, 1) 16 | onready var explosion = preload("res://Entities/Bullets/Explosion.tscn") 17 | onready var BLOOD = preload("res://Entities/Particles/Blood_Particle3.tscn") 18 | 19 | 20 | func _ready(): 21 | 22 | pass 23 | 24 | 25 | 26 | func _physics_process(delta): 27 | time += 1 28 | if speed > 15: 29 | speed *= 0.5 30 | if target != null and homing: 31 | target_pos = target.global_transform.origin + Vector3(0, 0.75, 0) 32 | target_pos_prev = lerp(target_pos_prev, target_pos, 0.1) 33 | look_at(target_pos_prev, Vector3.UP) 34 | rotate_object_local(Vector3(0, 1, 0), 3.14) 35 | 36 | if $Timer.is_stopped() and target != null and head_entered: 37 | var new_explosion = explosion.instance() 38 | get_parent().add_child(new_explosion) 39 | new_explosion.global_transform.origin = global_transform.origin - Vector3(0, 1, 0) 40 | $CollisionShape.disabled = true 41 | queue_free() 42 | 43 | var collision = move_and_collide(transform.basis.z * speed * delta) 44 | if collision: 45 | if collision.collider.has_method("damage") and collision.collider.get("alive_head") != null: 46 | if target != null: 47 | if collision.collider == target: 48 | head_entered = true 49 | if $Timer.is_stopped(): 50 | $Timer.start(1) 51 | var new_blood = BLOOD.instance() 52 | target.add_child(new_blood) 53 | new_blood.global_transform.origin = collision.position 54 | new_blood.look_at(new_blood.global_transform.origin + collision.normal * 8, Vector3.UP) 55 | new_blood.emitting = true 56 | $MeshInstance.hide() 57 | $Blood_Particle2.hide() 58 | else : 59 | queue_free() 60 | 61 | 62 | 63 | func set_velocity(new_velocity, direction): 64 | transform.basis = direction 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | func _on_Area_body_entered(body): 96 | 97 | if body.get("alive_head") != null and not target_found: 98 | if body.alive_head == true: 99 | var space_state = get_world().direct_space_state 100 | var result = space_state.intersect_ray(global_transform.origin, body.global_transform.origin + Vector3(0, 0.75, 0)) 101 | 102 | if result.collider == body: 103 | target_pos_prev = global_transform.origin 104 | target_pos = body.global_transform.origin + Vector3(0, 0.75, 0) 105 | target = body 106 | target_found = true 107 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cancerball.gd: -------------------------------------------------------------------------------- 1 | extends StaticBody 2 | 3 | 4 | 5 | 6 | 7 | 8 | var damaged_count = 0 9 | var wall_hit = false 10 | var count = 0 11 | var health = 25 12 | var dir = Vector3.UP * 0.4 13 | var new_orb 14 | var gib = [preload("res://Entities/Physics_Objects/Chest_Gib.tscn"), 15 | preload("res://Entities/Physics_Objects/Leg_Gib.tscn"), 16 | preload("res://Entities/Physics_Objects/Arm_Gib.tscn"), 17 | preload("res://Entities/Physics_Objects/Head_Gib.tscn")] 18 | onready var mesh = $MeshInstance 19 | 20 | 21 | func _cancer_id(): 22 | pass 23 | func _ready(): 24 | if Engine.get_frames_per_second() > 30: 25 | $Audio.play() 26 | count += 1 27 | damaged_count = count 28 | new_orb = self.duplicate() 29 | 30 | if wall_hit or count > 10: 31 | new_orb.wall_hit = true 32 | return 33 | yield (get_tree(), "idle_frame") 34 | 35 | new_orb.count = count 36 | dir = dir.rotated(Vector3.UP, rand_range( - 0.5, 0.5)) 37 | dir = dir.rotated(Vector3.FORWARD, rand_range( - 0.5, 0.5)) 38 | dir = dir.rotated(Vector3.LEFT, rand_range( - 0.5, 0.5)) 39 | add_child(new_orb) 40 | var v = cos(count) * 0.6 + 2 41 | new_orb.mesh.scale = Vector3(v, v, v) 42 | new_orb.global_transform.origin = global_transform.origin 43 | new_orb.dir = dir 44 | new_orb.global_transform.origin += dir 45 | 46 | 47 | 48 | 49 | 50 | func recursive_search(child): 51 | var d 52 | for c in child.get_children(): 53 | if c.has_method("damage"): 54 | d = recursive_search(c) 55 | if d == null: 56 | return child 57 | 58 | 59 | func damage(damage, n, p, shooterpos): 60 | yield (get_tree(), "idle_frame") 61 | var target 62 | for c in get_children(): 63 | if c.get_class() == "StaticBody": 64 | target = c 65 | if target != null: 66 | target.damaged_count = count 67 | target.damage(100, n, p, shooterpos) 68 | var v = sin(target.count) * 0.2 + 1 69 | target.mesh.scale = Vector3(v, v, v) 70 | else : 71 | if get_parent().has_method("damage") and get_parent().count >= get_parent().damaged_count: 72 | 73 | get_parent().damaged_count = damaged_count 74 | get_parent().damage(100, n, p, shooterpos) 75 | if fmod(count, 3) == 0: 76 | var new_gib = gib[randi() % gib.size()].instance() 77 | var audio = $Audio.duplicate() 78 | Global.player.get_parent().get_parent().get_parent().add_child(audio) 79 | audio.global_transform.origin = global_transform.origin 80 | audio.play() 81 | Global.player.get_parent().get_parent().get_parent().add_child(new_gib) 82 | new_gib.global_transform.origin = global_transform.origin 83 | new_gib.velocity = Vector3(rand_range( - 10, 10), rand_range( - 10, 10), rand_range( - 10, 10)) 84 | queue_free() 85 | func get_type(): 86 | return 0 87 | 88 | func _on_Cancerball_body_entered(body): 89 | if wall_hit: 90 | return 91 | if body.get_collision_layer_bit(0) and not body.has_method("_cancer_id"): 92 | wall_hit = true 93 | queue_free() 94 | 95 | return 96 | elif body.has_method("cancer"): 97 | pass 98 | 99 | 100 | 101 | 102 | func _on_Area_body_entered(body): 103 | pass 104 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cutscenes/Activator.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | 5 | 6 | 7 | export var scene = 5 8 | 9 | 10 | func _ready(): 11 | for child in get_children(): 12 | child.body.set_physics_process(false) 13 | 14 | 15 | 16 | func _physics_process(delta): 17 | if get_parent().current_scene == scene: 18 | for child in get_children(): 19 | child.body.set_physics_process(true) 20 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cutscenes/Camerarotator.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | 8 | export var speed = 0.1 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | func _process(delta): 15 | rotation.y += delta * speed 16 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cutscenes/Consumer_Logo.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | 5 | 6 | 7 | onready var consumer = $Consumer 8 | onready var softprod = $Softproducts 9 | var t = 0 10 | var activated = false 11 | 12 | func _ready(): 13 | 14 | consumer.scale.x = 0 15 | softprod.scale.x = 0 16 | 17 | 18 | 19 | 20 | 21 | func _process(delta): 22 | t += 1 23 | 24 | 25 | consumer.rotation.y = lerp(consumer.rotation.y, deg2rad(360), 0.04) 26 | consumer.scale.x = lerp(consumer.scale.x, 1, 0.03) 27 | if consumer.scale.x > 0.9: 28 | softprod.scale.x = lerp(softprod.scale.x, 1, 0.4) 29 | $OmniLight.translation.x += 1 30 | if softprod.scale.x > 0.9: 31 | get_parent().get_node("MarginContainer/CenterContainer/Authority").modulate = lerp(get_parent().get_node("MarginContainer/CenterContainer/Authority").modulate, Color(1, 1, 1, 1), 0.01) 32 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cutscenes/Endaudio.gd: -------------------------------------------------------------------------------- 1 | extends AudioStreamPlayer 2 | 3 | 4 | 5 | 6 | 7 | export var pitch_slide_speed = 0.01 8 | var t = 0 9 | 10 | func _ready(): 11 | pass 12 | 13 | func _physics_process(delta): 14 | pitch_scale += delta * pitch_slide_speed 15 | t += delta 16 | 17 | $MeshInstance.material_override.set_shader_param("a", AudioServer.get_bus_peak_volume_right_db(0, 0) * 0.001) 18 | $MeshInstance.material_override.set_shader_param("f", AudioServer.get_bus_peak_volume_left_db(0, 0) * 0.001) 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cutscenes/Killzone.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | func _on_Area_body_entered(body): 20 | if body.has_method("damage"): 21 | body.damage(100, (global_transform.origin - body.global_transform.origin).normalized(), body.global_transform.origin, global_transform.origin) 22 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cutscenes/lensflare.gd: -------------------------------------------------------------------------------- 1 | extends Camera 2 | 3 | 4 | 5 | 6 | 7 | var flares:Array 8 | var t = 0 9 | var active = false 10 | 11 | func _ready(): 12 | hide() 13 | $Flare.global_transform.origin = (global_transform.origin - $Sun.global_transform.origin).normalized() * 50 14 | for i in range(20): 15 | var new_flare = $Flare.duplicate() 16 | add_child(new_flare) 17 | new_flare.global_transform.origin = (global_transform.origin - $Sun.global_transform.origin).normalized() * i 18 | flares.append(new_flare) 19 | 20 | active = false 21 | 22 | 23 | func _process(delta): 24 | if not active: 25 | var space = get_world().direct_space_state 26 | var result = space.intersect_ray($Sun.global_transform.origin, global_transform.origin) 27 | if not result: 28 | active = true 29 | if not active: 30 | return 31 | show() 32 | t += 1 33 | $Sun.transform.origin.x += sin(t * 0.01) * 0.01 34 | $Sun.transform.origin.y += sin(t * 0.01) * 0.01 35 | $Flare.global_transform.origin = global_transform.origin - (global_transform.origin - $Sun.global_transform.origin).normalized() * 10 36 | var i = 0 37 | for flare in flares: 38 | i += 1 39 | flare.scale.x = sin(i) 40 | flare.rotation.z = sin(i + t * 0.01) 41 | flare.scale.y = sin(i) 42 | flare.global_transform.origin = global_transform.origin - (global_transform.origin - $Sun.global_transform.origin).normalized() * i 43 | flare.global_transform.origin.x += sin((t + i) * 0.01) * 0.1 44 | flare.global_transform.origin.x += cos((t + i) * 0.01) * 0.1 45 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cutscenes/screen.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | 4 | 5 | 6 | 7 | export (Array, Resource) var images:Array = [] 8 | export var cycle_speed = 1 9 | export var random = false 10 | export var sphere = false 11 | var i = 0 12 | var t = 0 13 | 14 | func _ready(): 15 | material_override.albedo_texture = images[0] 16 | if Global.high_performance: 17 | cycle_speed *= 0.5 18 | 19 | func _physics_process(delta): 20 | t += 1 21 | if sphere: 22 | rotation.y = sin(t * 0.01) * 0.1 23 | if fmod(t, cycle_speed) != 0: 24 | return 25 | i += 1 26 | i = wrapi(i, 0, images.size()) 27 | if random: 28 | i = randi() % images.size() 29 | scale.x = rand_range(0.5, 1) 30 | scale.y = rand_range(0.5, 1) 31 | 32 | material_override.albedo_texture = images[i] 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cutscenes/target_finder.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | var t = 0 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | 18 | func _physics_process(delta): 19 | t += 1 20 | if fmod(t, 200) == 0: 21 | for body in get_overlapping_bodies(): 22 | get_parent().body.player = body 23 | func _on_Area_body_entered(body): 24 | get_parent().body.player = body 25 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Cutscenes/zoomcamera.gd: -------------------------------------------------------------------------------- 1 | extends Camera 2 | 3 | 4 | 5 | 6 | 7 | export var init_fov = 70 8 | export var to_fov = 20 9 | export var zoom_speed = 0.01 10 | export var follow = false 11 | var followed 12 | 13 | 14 | func _ready(): 15 | followed = get_parent().get_parent().get_node("Activator/Office_MG/Body") 16 | 17 | 18 | 19 | func _process(delta): 20 | if current: 21 | if follow: 22 | look_at(followed.global_transform.origin, Vector3.UP) 23 | fov = lerp(fov, to_fov, zoom_speed) 24 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Alert_Sphere_Big.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | connect("body_entered", self, "_on_body_entered") 12 | 13 | func _on_body_entered(body): 14 | if body.has_method("alert"): 15 | body.alert(global_transform.origin) 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Ambience_Emitter.gd: -------------------------------------------------------------------------------- 1 | extends AudioStreamPlayer3D 2 | 3 | 4 | 5 | 6 | 7 | 8 | var music_bus 9 | 10 | 11 | func _ready(): 12 | pass 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Bullets/Fire_Child.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | var lifetime = 200 4 | var t = 0 5 | var player_fire = false 6 | 7 | 8 | 9 | onready var parent = get_parent() 10 | 11 | 12 | func _ready(): 13 | pass 14 | 15 | 16 | 17 | func _physics_process(delta): 18 | t += 1 19 | if lifetime < t: 20 | queue_free() 21 | if fmod(t, 25) != 0: 22 | return 23 | if "soul" in parent and not "random_line" in parent: 24 | if parent.soul.pain_sfx[0].stream != parent.soul.firesound: 25 | parent.soul.pain_sfx[0].stream = parent.soul.firesound 26 | parent.soul.damage(20.6, Vector3.ZERO, global_transform.origin, global_transform.origin) 27 | elif "random_line" in parent: 28 | if not "pain_sfx" in parent.get_parent(): 29 | return 30 | if parent.get_parent().pain_sfx[0].stream != parent.get_parent().firesound: 31 | parent.get_parent().pain_sfx[0].stream = parent.get_parent().firesound 32 | parent.get_parent().damage(5, Vector3.ZERO, global_transform.origin, global_transform.origin) 33 | 34 | else : 35 | if parent.has_method("damage"): 36 | parent.damage(5, Vector3.ZERO, global_transform.origin, global_transform.origin) 37 | 38 | 39 | func _on_Area_body_entered(body): 40 | if body != parent: 41 | 42 | var new_fire_child = self.duplicate() 43 | 44 | if "soul" in body: 45 | if body.soul.on_fire: 46 | return 47 | body.soul.on_fire = true 48 | body.soul.body.add_child(new_fire_child) 49 | new_fire_child.scale.y = 2.0 50 | new_fire_child.global_transform.origin = body.soul.body.global_transform.origin - Vector3.UP * 0.5 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | elif body == Global.player and not player_fire: 59 | body.add_child(new_fire_child) 60 | player_fire = true 61 | new_fire_child.player_fire = true 62 | new_fire_child.scale.y = 2.0 63 | new_fire_child.global_transform.origin = body.global_transform.origin - Vector3.UP * 0.5 64 | 65 | func set_water(value): 66 | queue_free() 67 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Creatures/Fish.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | var speed:float = 1 3 | var time:float = 0 4 | var velocity:Vector3 = Vector3(0, 0, 0) 5 | var type = 0 6 | var gib_flag = false 7 | 8 | var gib = preload("res://Entities/Physics_Objects/Fish_Gib.tscn") 9 | func _ready(): 10 | pass 11 | 12 | func _physics_process(delta): 13 | $AnimationPlayer.play("ArmatureAction") 14 | time += delta 15 | velocity.x = sin(time * speed * 0.5) * speed * 0.5 16 | velocity.z = cos(time * speed) * speed * 0.5 17 | $Armature.look_at(global_transform.origin - velocity, Vector3.UP) 18 | $CollisionShape.transform.basis = $Armature.transform.basis 19 | $CollisionShape.transform.origin = $Armature.transform.origin 20 | translate(velocity * delta) 21 | 22 | 23 | func damage(damage, collision_n, collision_p, shooter_pos): 24 | if gib_flag: 25 | return 26 | gib_flag = true 27 | var new_gib = gib.instance() 28 | get_parent().add_child(new_gib) 29 | new_gib.global_transform.origin = global_transform.origin 30 | new_gib.damage(damage, collision_n, collision_p, shooter_pos) 31 | queue_free() 32 | 33 | func get_type(): 34 | return type; 35 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Creatures/Talker.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | export var line = "Wake up sheeple." 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | func player_use(): 18 | Global.player.UI.message(line, true) 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Decals/Blooddecal.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | 4 | 5 | 6 | 7 | export var blood = true 8 | 9 | 10 | func _ready(): 11 | if blood: 12 | material_override.albedo_color = Global.blood_color 13 | var raycasts = [$RayCast, $RayCast2, $RayCast3, $RayCast4] 14 | yield (get_tree(), "idle_frame") 15 | for raycast in raycasts: 16 | raycast.force_raycast_update() 17 | if not raycast.is_colliding(): 18 | queue_free() 19 | raycast.queue_free() 20 | if blood: 21 | show() 22 | return 23 | scale.z = 0 24 | scale.x = 0 25 | show() 26 | 27 | while scale.x < 0.98: 28 | scale.x = lerp(scale.x, 1, 0.2) 29 | scale.z = lerp(scale.z, 1, 0.2) 30 | yield (get_tree(), "idle_frame") 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Decals/play_particle.gd: -------------------------------------------------------------------------------- 1 | extends Particles 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | emitting = true 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Decals/random_pitch.gd: -------------------------------------------------------------------------------- 1 | extends AudioStreamPlayer3D 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pitch_scale += rand_range( - 0.2, 0.2) 12 | play() 13 | 14 | 15 | 16 | func _process(delta): 17 | if not playing: 18 | queue_free() 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Enemies/Acid_Spray_Weapon.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | var bullet = preload("res://Entities/Bullets/Acid_Ball.tscn") 4 | var time = 0 5 | var reloading = false 6 | var fire_counter = 0 7 | var max_fire = 50 8 | var body 9 | var soul 10 | var rothelp 11 | var has_anim_attack = false 12 | func _ready(): 13 | 14 | body = get_parent().get_parent() 15 | soul = get_parent().get_parent().get_parent() 16 | rothelp = get_parent() 17 | yield (get_tree(), "idle_frame") 18 | has_anim_attack = body.anim_player.has_animation("Attack") 19 | 20 | func _physics_process(delta): 21 | time += delta * 10 22 | 23 | 24 | func AI_shoot(): 25 | 26 | if has_anim_attack: 27 | body.anim_player.play("Attack", - 1, 1) 28 | var new_bullet = bullet.instance() 29 | soul.add_child(new_bullet) 30 | new_bullet.global_transform.origin = global_transform.origin 31 | new_bullet.set_velocity(10, body.transform.basis * rothelp.transform.basis) 32 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Enemies/remove_sound_dead.gd: -------------------------------------------------------------------------------- 1 | extends AudioStreamPlayer3D 2 | 3 | 4 | 5 | 6 | 7 | var body 8 | 9 | 10 | func _ready(): 11 | body = get_parent() 12 | 13 | 14 | 15 | 16 | 17 | func _physics_process(delta): 18 | if body.dead: 19 | queue_free() 20 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/FOV_Setter.gd: -------------------------------------------------------------------------------- 1 | extends Camera 2 | 3 | var current_tick = 0 4 | var prev_p 5 | var current_p 6 | var next_p 7 | 8 | func _ready(): 9 | set_process(true) 10 | 11 | 12 | 13 | func _physics_process(delta): 14 | if far != Global.draw_distance: 15 | far = Global.draw_distance 16 | if fov != Global.FOV: 17 | pass 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Fish/Fish_Mesh.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | onready var FISH = [] 4 | export var menu = false 5 | export var aquarium = false 6 | var t = 0 7 | var aquarium_bounds = 2.5 8 | var tickers:Array 9 | 10 | 11 | 12 | 13 | 14 | 15 | func _ready(): 16 | for fish in Global.STOCKS.stocks: 17 | if fish.asset_type == "fish": 18 | tickers.append(fish.ticker) 19 | print(get_child_count()) 20 | var i = 0 21 | for child in get_children(): 22 | FISH.append(child) 23 | if aquarium: 24 | if Global.STOCKS.FISH_FOUND.find(tickers[i]) != - 1: 25 | child.show() 26 | i += 1 27 | child.transform.origin += Vector3(rand_range( - aquarium_bounds, aquarium_bounds), rand_range( - aquarium_bounds, aquarium_bounds), rand_range( - aquarium_bounds, aquarium_bounds)) 28 | 29 | pass 30 | 31 | 32 | 33 | func _process(delta): 34 | if aquarium: 35 | t += delta 36 | for child in get_children(): 37 | child.transform.origin = lerp(child.transform.origin, child.transform.origin + Vector3(rand_range( - 1, 1), rand_range( - 1, 1), rand_range( - 1, 1)), delta * 0.1) 38 | child.look_at(Global.player.global_transform.origin + Vector3(sin(t), cos(t), sin(t)), Vector3.UP) 39 | child.transform.origin.x = clamp(child.transform.origin.x, - aquarium_bounds, aquarium_bounds) 40 | child.transform.origin.z = clamp(child.transform.origin.z, - aquarium_bounds, aquarium_bounds) 41 | child.transform.origin.y = clamp(child.transform.origin.y, - aquarium_bounds, aquarium_bounds) 42 | if menu: 43 | rotation.y += 2 * delta 44 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Fish/Organ_Mesh.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | 8 | var ORG = [] 9 | 10 | func _ready(): 11 | for child in get_children(): 12 | ORG.append(child) 13 | 14 | 15 | 16 | 17 | 18 | func _process(delta): 19 | rotation.y += delta * 0.7 20 | rotation.z += delta * 0.6 21 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Hope_Eradicator.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | var a = 0.01 8 | var f = 0.05 9 | var t = 0 10 | var material 11 | 12 | 13 | 14 | func _ready(): 15 | if Global.hope_discarded: 16 | queue_free() 17 | material = $MeshInstance.material_override 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | func _process(delta): 26 | t += 1 27 | rotation.y += 0.01 28 | global_transform.origin.y += sin(t * f) * a 29 | material.normal_scale = cos(t * 0.05) + 1 30 | material.emission_energy = sin(t * 0.05) * 0.5 + 1 31 | 32 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Particles/autoplay.gd: -------------------------------------------------------------------------------- 1 | extends Particles 2 | 3 | func _ready(): 4 | emitting = true 5 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Particles/muzzleflash.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | func _physics_process(delta): 18 | if not visible: 19 | return 20 | rotation.x = rand_range( - PI, PI) 21 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Physics_Objects/Asset_Pickup.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | export var value = "Liver" 8 | 9 | 10 | 11 | 12 | 13 | 14 | func player_use(): 15 | Global.player.UI.notify(value + " acquisition complete", Color(1, 1, 0)) 16 | for stock in Global.STOCKS.stocks: 17 | if stock.s_name == value: 18 | stock.owned += 1 19 | if Global.STOCKS.ORGANS_FOUND.find(value) == - 1: 20 | Global.STOCKS.ORGANS_FOUND.append(value) 21 | Global.STOCKS.save_stocks("user://stocks.save") 22 | get_parent().queue_free() 23 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Physics_Objects/Implant_Object.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | export var implant_name = "Hazmat Suit" 8 | 9 | 10 | func _ready(): 11 | if Global.implants.purchased_implants.find(implant_name) == - 1: 12 | for i in Global.implants.IMPLANTS: 13 | if i.i_name == implant_name: 14 | 15 | var new_mat = $implant_object / Cube.mesh.surface_get_material(1).duplicate() 16 | new_mat.albedo_texture = i.texture 17 | $implant_object / Cube.set_surface_material(1, new_mat) 18 | else : 19 | get_parent().queue_free() 20 | 21 | func player_use(): 22 | Global.implants.purchased_implants.append(implant_name) 23 | Global.player.UI.notify(implant_name + " acquired.", Color(0.2, 1, 0)) 24 | Global.save_game() 25 | get_parent().queue_free() 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Physics_Objects/coin.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | export var value = 10 8 | export var id = "N" 9 | 10 | func _ready(): 11 | if Global.MONEY_ITEMS.find(id) != - 1: 12 | get_parent().queue_free() 13 | 14 | 15 | 16 | 17 | 18 | func player_use(): 19 | Global.player.UI.notify("$" + str(value) + " picked up", Color(1, 1, 0)) 20 | Global.money += value 21 | if id != "N": 22 | Global.MONEY_ITEMS.append(id) 23 | Global.save_game() 24 | get_parent().queue_free() 25 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Radio.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | var static_noise = 0 8 | var current_track = 0 9 | 10 | 11 | func _ready(): 12 | current_track = randi() % Global.LEVEL_SONGS.size() 13 | $Radio.stream = Global.LEVEL_SONGS[current_track] 14 | $Radio.play() 15 | 16 | 17 | 18 | func player_use(): 19 | current_track += 1 20 | current_track = wrapi(current_track, 0, Global.LEVEL_SONGS.size()) 21 | $Radio.stream = Global.LEVEL_SONGS[current_track] 22 | $Radio.play() 23 | 24 | 25 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/Rain_Spawner.gd: -------------------------------------------------------------------------------- 1 | extends Position3D 2 | 3 | 4 | 5 | 6 | 7 | var droplet = preload("res://droplet.tscn") 8 | var droplets:Array 9 | 10 | func _ready(): 11 | 12 | queue_free() 13 | 14 | func _physics_process(delta): 15 | if droplets.size() < 100: 16 | var new_droplet = droplet.instance() 17 | Global.player.get_parent().add_child(new_droplet) 18 | new_droplet.spawner = self 19 | new_droplet.global_transform.origin = global_transform.origin + Vector3(rand_range( - 10, 10), 0, rand_range( - 10, 10)) 20 | droplets.append(new_droplet) 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/UI/UI_Quad.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | func _ready(): 4 | pass 5 | 6 | func _physics_process(delta): 7 | 8 | scale.z = - Global.FOV * 0.01 9 | scale.x = - get_viewport().get_visible_rect().size.x / get_viewport().get_visible_rect().size.y 10 | transform.origin.z = - 2.3 + pow(Global.FOV, 2.55) * 1e-05 11 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/UI2.gd: -------------------------------------------------------------------------------- 1 | extends MarginContainer 2 | 3 | func _ready(): 4 | pass 5 | func _draw(): 6 | pass 7 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/curseface.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | var time = 0 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | func _process(delta): 16 | time += delta 17 | scale.x = sin(time) + 1.5 18 | scale.z = cos(time) * 0.5 + 1.1 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/soulll.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | export var soul = true 8 | var gib = preload("res://Entities/Physics_Objects/Chest_Gib.tscn") 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | func player_use(): 18 | if soul: 19 | Global.set_soul() 20 | else : 21 | Global.set_hope() 22 | Global.player.suicide() 23 | Global.save_game() 24 | get_parent().get_node("MeshInstance").hide() 25 | if not soul: 26 | for i in range(10): 27 | var new_gib = gib.instance() 28 | get_parent().get_parent().add_child(new_gib) 29 | new_gib.global_transform.origin = global_transform.origin 30 | new_gib.damage(20, Vector3.FORWARD.rotated(Vector3.UP, rand_range( - PI, PI)), global_transform.origin, global_transform.origin) 31 | get_parent().get_node("AudioStreamPlayer3D").play() 32 | queue_free() 33 | return 34 | get_parent().get_node("Particles").emitting = true 35 | get_parent().get_node("AudioStreamPlayer3D").play() 36 | queue_free() 37 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Entities/waterdrop.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | var gravityy = 22 8 | var max_speed = 5 9 | var velocity:Vector3 = Vector3(0, 0, 0) 10 | 11 | 12 | func _ready(): 13 | pass 14 | 15 | 16 | 17 | 18 | 19 | func _physics_process(delta): 20 | velocity.y -= gravityy * delta 21 | velocity.y = clamp(velocity.y, - max_speed, 0) 22 | translate(velocity) 23 | 24 | 25 | func _on_raindrop_body_entered(body): 26 | queue_free() 27 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Explosion.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | export var damage = 50 4 | export var gas = false 5 | export var sleep = false 6 | export var piercing = true 7 | var c_shape 8 | var particle 9 | 10 | 11 | 12 | var gas_timer = 0 13 | 14 | func _ready(): 15 | particle = $Particle 16 | c_shape = $CollisionShape 17 | particle.emitting = true 18 | 19 | 20 | 21 | 22 | 23 | func _physics_process(delta): 24 | if particle.emitting == false: 25 | if not gas: 26 | c_shape.disabled = true 27 | c_shape.visible = false 28 | 29 | else : 30 | gas_timer += delta 31 | if gas_timer >= 3: 32 | queue_free() 33 | 34 | 35 | 36 | if gas and not sleep: 37 | 38 | 39 | 40 | 41 | for overlap_body in get_overlapping_bodies(): 42 | 43 | 44 | if overlap_body.has_method("damage"): 45 | overlap_body.damage(damage, Vector3.ZERO, overlap_body.global_transform.origin, global_transform.origin) 46 | 47 | func _on_Explosion_area_entered(area): 48 | do_damage(area) 49 | 50 | 51 | func _on_Explosion_body_entered(body): 52 | do_damage(body) 53 | if sleep and body.has_method("tranquilize"): 54 | body.tranquilize(true) 55 | 56 | 57 | func do_damage(body): 58 | if gas: 59 | return 60 | var state = get_world().direct_space_state 61 | var result = state.intersect_ray(global_transform.origin, body.global_transform.origin, [self]) 62 | if result: 63 | if result.collider.get_class() == "StaticBody": 64 | if result.collider.has_method("damage"): 65 | return 66 | if body.has_method("damage"): 67 | if body == Global.player and Global.implants.torso_implant.explosive_shield: 68 | Global.player.player_velocity -= (global_transform.origin - body.global_transform.origin).normalized() * damage * 0.05 69 | return 70 | body.damage(damage, (global_transform.origin - body.global_transform.origin).normalized(), body.global_transform.origin, global_transform.origin) 71 | 72 | 73 | 74 | if body.has_method("piercing_damage") and piercing: 75 | body.piercing_damage(damage, (global_transform.origin - body.global_transform.origin).normalized(), body.global_transform.origin, global_transform.origin) 76 | 77 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Fire.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var velocity = Vector3.ZERO 4 | 5 | 6 | 7 | var f = preload("res://Entities/Bullets/Fire_Child.tscn") 8 | onready var p = $Particles 9 | var wep 10 | 11 | 12 | func _ready(): 13 | pass 14 | 15 | 16 | 17 | func _physics_process(delta): 18 | var col = move_and_collide(velocity * delta) 19 | if col: 20 | var body = col.collider 21 | var new_fire_child = f.instance() 22 | if "soul" in body: 23 | if body.soul.on_fire: 24 | pass 25 | else : 26 | body.soul.on_fire = true 27 | body.add_child(new_fire_child) 28 | new_fire_child.scale.y = 2.0 29 | new_fire_child.global_transform.origin = body.global_transform.origin - Vector3.UP * 0.5 30 | elif "random_line" in body: 31 | if body.get_parent().on_fire: 32 | pass 33 | else : 34 | body.get_parent().on_fire = true 35 | body.add_child(new_fire_child) 36 | new_fire_child.scale.y = 2.0 37 | new_fire_child.global_transform.origin = body.global_transform.origin - Vector3.UP * 0.5 38 | else : 39 | body.add_child(new_fire_child) 40 | new_fire_child.global_transform.origin = global_transform.origin 41 | queue_free() 42 | 43 | velocity.y -= 4 * delta 44 | 45 | velocity *= 0.98 46 | p.scale += Vector3(0.1, 0.1, 0.1) 47 | 48 | if velocity.length() < 6: 49 | queue_free() 50 | 51 | 52 | 53 | func set_water(value): 54 | queue_free() 55 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/Copspawner.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | var copcrew = preload("res://Entities/Props/copcrew.tscn") 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | func _physics_process(delta): 18 | if Global.objective_complete: 19 | var new_cop_crew = copcrew.instance() 20 | get_parent().add_child(new_cop_crew) 21 | new_cop_crew.global_transform.origin = global_transform.origin 22 | queue_free() 23 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/Pseud_Light.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | export var light_color = Color(1, 0, 0) 4 | export var light_energy = 100 5 | var global_light:DirectionalLight 6 | var current_body 7 | var light_on = false 8 | var player 9 | 10 | func _ready(): 11 | global_light = get_parent().get_node("Global_Light") 12 | connect("body_entered", self, "_on_Body_entered") 13 | connect("body_exited", self, "_on_Body_exited") 14 | 15 | func _physics_process(delta): 16 | if light_on: 17 | global_light.light_color = light_color / global_transform.origin.distance_to(player.global_transform.origin) 18 | global_light.light_energy = clamp(light_energy / global_transform.origin.distance_to(player.global_transform.origin), 0, 10) 19 | 20 | 21 | 22 | 23 | 24 | func _on_Body_entered(body): 25 | player = body 26 | light_on = true 27 | 28 | func _on_Body_exited(body): 29 | light_on = false 30 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/light_controller.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | var init_energy 8 | var init_energy_ambient 9 | var init_fog_color 10 | var world:WorldEnvironment 11 | var light:DirectionalLight 12 | onready var musicbus = AudioServer.get_bus_index("Music") 13 | 14 | func _ready(): 15 | world = $WorldEnvironment 16 | light = $Global_Light 17 | init_energy = light.light_energy 18 | init_energy_ambient = world.environment.ambient_light_energy 19 | init_fog_color = world.environment.fog_color 20 | 21 | 22 | func _physics_process(delta): 23 | if Global.player.global_transform.origin.y < - 0.5: 24 | AudioServer.set_bus_volume_db(musicbus, lerp(AudioServer.get_bus_volume_db(musicbus), - 80, 0.05)) 25 | light.light_energy = lerp(light.light_energy, 0, 0.2) 26 | world.environment.ambient_light_energy = lerp(world.environment.ambient_light_energy, 0, 0.2) 27 | world.environment.fog_color = lerp(world.environment.fog_color, Color(0, 0, 0), 0.2) 28 | else : 29 | AudioServer.set_bus_volume_db(musicbus, lerp(AudioServer.get_bus_volume_db(musicbus), Global.music_volume, 0.05)) 30 | light.light_energy = lerp(light.light_energy, init_energy, 0.2) 31 | world.environment.ambient_light_energy = lerp(world.environment.ambient_light_energy, init_energy_ambient, 0.2) 32 | world.environment.fog_color = lerp(world.environment.fog_color, init_fog_color, 0.2) 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/rotation.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | func _ready(): 4 | pass 5 | func _process(delta): 6 | rotation.y += 10 * delta 7 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/sky_rotator.gd: -------------------------------------------------------------------------------- 1 | extends WorldEnvironment 2 | export var rotation_speed = 0.05 3 | export var z = false 4 | 5 | var min_fog_end 6 | var min_fog_begin 7 | var helltexture = preload("res://Textures/sky10.png") 8 | var helltexture2 = preload("res://Textures/sky11.png") 9 | 10 | func _ready(): 11 | if Global.hope_discarded and Global.CURRENT_LEVEL != 18: 12 | environment.background_sky.panorama = helltexture 13 | environment.fog_color = Color(1, 0, 0) 14 | if Global.ending_2: 15 | environment.fog_color = Color(0, 1, 0) 16 | environment.background_sky.panorama = helltexture2 17 | environment.background_color = environment.fog_color 18 | if Global.reflections: 19 | environment.ss_reflections_enabled = true 20 | else : 21 | environment.ss_reflections_enabled = false 22 | min_fog_end = environment.fog_depth_end 23 | min_fog_begin = environment.fog_depth_begin 24 | environment.fog_depth_begin = clamp(Global.draw_distance / 2, 0, min_fog_begin) 25 | environment.fog_depth_end = clamp(Global.draw_distance, 0, min_fog_end) 26 | if Global.draw_distance < 60: 27 | var image:Image = environment.background_sky.panorama.get_data() 28 | image.lock() 29 | var color = image.get_pixel(0, 0) 30 | var size = image.get_size() 31 | for p in range(1000): 32 | color = color.blend(image.get_pixel(rand_range(0, size.x), rand_range(0, size.y))) 33 | environment.fog_color = color 34 | if Global.draw_distance <= 30: 35 | environment.background_mode = 1 36 | environment.background_color = environment.fog_color 37 | func _physics_process(delta): 38 | if z: 39 | environment.background_sky_rotation.x += rotation_speed * delta 40 | return 41 | environment.background_sky_rotation.y += rotation_speed * delta 42 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/skybox.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | 4 | 5 | 6 | 7 | export var offset = 100 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | func _process(delta): 16 | global_transform.origin = Global.player.global_transform.origin + Vector3.UP * offset 17 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/skyboxcamera.gd: -------------------------------------------------------------------------------- 1 | extends Camera 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | func _process(delta): 16 | rotation = Global.player.player_view.rotation 17 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/snakearea.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | var t1 8 | var t2 9 | var t3 10 | 11 | 12 | func _ready(): 13 | yield (get_tree(), "idle_frame") 14 | t1 = get_node_or_null("snake/snake/Armature/Bone/Bone001/Bone002/Bone003/Bone004/Bone005/KinematicBody") 15 | t2 = get_node_or_null("snake2/snake/Armature/Bone/Bone001/Bone002/Bone003/Bone004/Bone005/KinematicBody") 16 | t3 = get_node_or_null("snake3/snake/Armature/Bone/Bone001/Bone002/Bone003/Bone004/Bone005/KinematicBody") 17 | 18 | 19 | 20 | 21 | 22 | func _on_Area_body_entered(body): 23 | if not is_instance_valid(t1): 24 | t1 = null 25 | if not is_instance_valid(t2): 26 | t2 = null 27 | if not is_instance_valid(t3): 28 | t3 = null 29 | if t1 != null: 30 | t1.active = true 31 | if t2 != null: 32 | t2.active = true 33 | if t3 != null: 34 | t3.active = true 35 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/strobe.gd: -------------------------------------------------------------------------------- 1 | extends OmniLight 2 | 3 | 4 | 5 | 6 | 7 | var t = 0 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | func _physics_process(delta): 18 | if global_transform.origin.distance_to(Global.player.global_transform.origin) > 30: 19 | hide() 20 | else : 21 | show() 22 | t += 1 23 | if fmod(t, 6) != 0: 24 | light_negative = true 25 | light_energy = 5 26 | light_color = Color(1, 1, 1) 27 | else : 28 | light_negative = false 29 | light_color = Color(0, 1, 0) 30 | light_energy = 3 + sin(t * 0.01) * 3 31 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Levels/telepoorter.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | func _on_telepoorter_body_entered(body): 20 | 21 | if body == Global.player: 22 | body.player_velocity.y = 100 23 | else : 24 | body.velocity.y = 100 25 | $AudioStreamPlayer.play() 26 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/Camera_Rotator.gd: -------------------------------------------------------------------------------- 1 | extends Position3D 2 | var time = 1 3 | var intro_music = preload("res://Sfx/Music/intro.ogg") 4 | func _ready(): 5 | Global.screenmat.set_shader_param("hit_red", 0) 6 | Global.screenmat.set_shader_param("health_green", 0) 7 | Global.screenmat.set_shader_param("water", false) 8 | Global.screenmat.set_shader_param("holy_mode", false) 9 | Global.screenmat.set_shader_param("nightmare_vision", false) 10 | Global.screenmat.set_shader_param("scope", false) 11 | Global.music.stream = intro_music 12 | Global.music.play() 13 | 14 | func _process(delta): 15 | time += delta 16 | rotation.y = sin(time * 0.2) 17 | $Camera.fov = 75 + sin(time * 0.4) * 35 18 | $Camera / Position3D / MeshInstance / OmniLight3.light_energy = sin(time * 2) * 2 19 | $Camera / Position3D / MeshInstance.transform.origin.y = 0 + sin(time * 0.4) * 0.8 20 | 21 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/Gunshot_Emitter.gd: -------------------------------------------------------------------------------- 1 | extends OmniLight 2 | 3 | var shot_timer:float = 0 4 | var burst_timer:float = 0 5 | var burst_period:float = 100 6 | var fire_period:float = 50 7 | 8 | func _ready(): 9 | pass 10 | 11 | func _physics_process(delta): 12 | light_energy = lerp(light_energy, 0, 0.3) 13 | shot_timer += 1 14 | burst_timer += rand_range(0, 2) 15 | if burst_timer > burst_period: 16 | burst_timer = 0 17 | shot_timer = 0 18 | burst_period = rand_range(100, 500) 19 | fire_period = rand_range(1, 50) 20 | if shot_timer < fire_period and fmod(shot_timer, 5) == 0: 21 | $Sound.play() 22 | light_energy = 1.0 23 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/Level_Button.gd: -------------------------------------------------------------------------------- 1 | extends Button 2 | 3 | func _ready(): 4 | pass 5 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/Level_End_Menu.gd: -------------------------------------------------------------------------------- 1 | extends MarginContainer 2 | var enemy_value = 0 3 | var civ_value = 0 4 | var active = false 5 | var time = 0 6 | var init_timer = 0 7 | 8 | func _physics_process(delta): 9 | time += 1 10 | if Input.is_action_just_pressed("debug_finish_level") and Global.debug: 11 | Global.level_finished() 12 | if active and fmod(time, 3) == 0: 13 | if init_timer < 10: 14 | init_timer += 1 15 | elif enemy_value < Global.enemy_count_total - Global.enemy_count: 16 | enemy_value += 1 17 | $HBoxContainer / VBoxContainer / Level_End_Info / Enemy_HBOX / Enemies_Value.text = str(enemy_value, "/", Global.enemy_count_total) 18 | var color = float(enemy_value) / float(Global.enemy_count_total) 19 | $HBoxContainer / VBoxContainer / Level_End_Info / Enemy_HBOX / Enemies_Value.add_color_override("font_color", Color(1 - color, color, 0)) 20 | elif civ_value < Global.civ_count_total - Global.civ_count: 21 | civ_value += 1 22 | var color = float(civ_value) / float(Global.civ_count_total) 23 | $HBoxContainer / VBoxContainer / Level_End_Info / Civ_HBOX2 / Civ_Value.add_color_override("font_color", Color(1 - color, color, 0)) 24 | $HBoxContainer / VBoxContainer / Level_End_Info / Civ_HBOX2 / Civ_Value.text = str(civ_value, "/", Global.civ_count_total) 25 | else : 26 | active = false 27 | enemy_value = 0 28 | civ_value = 0 29 | $HBoxContainer / VBoxContainer / VBoxContainer.show() 30 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/PanelContainerEffect.gd: -------------------------------------------------------------------------------- 1 | extends PanelContainer 2 | var time = 0 3 | const RANGE_LIMIT = 10.0 4 | const MAGNIFICATION_FACTOR = 50 5 | func _ready(): 6 | pass 7 | func _physics_process(delta): 8 | time += delta 9 | var audio_level = clamp(RANGE_LIMIT + AudioServer.get_bus_peak_volume_left_db(0, 0), 0.0, RANGE_LIMIT) / RANGE_LIMIT * MAGNIFICATION_FACTOR 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/ScrollContainerDynamic.gd: -------------------------------------------------------------------------------- 1 | extends ScrollContainer 2 | var time = 0 3 | const RANGE_LIMIT = 10 4 | const MAGNIFICATION_FACTOR = 40 5 | func _ready(): 6 | pass 7 | func _physics_process(delta): 8 | time += delta 9 | var audio_level = clamp(RANGE_LIMIT + AudioServer.get_bus_peak_volume_left_db(0, 0), 0.0, RANGE_LIMIT) / RANGE_LIMIT * MAGNIFICATION_FACTOR 10 | theme.get_stylebox("bg", "ScrollContainer").corner_radius_bottom_left = audio_level 11 | theme.get_stylebox("bg", "ScrollContainer").corner_radius_bottom_right = 0 12 | theme.get_stylebox("bg", "ScrollContainer").border_width_bottom = clamp(audio_level, 1, 5000) 13 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/Settings_Grid.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | var keylist 3 | export var x_size = 640 4 | func _ready(): 5 | pass 6 | 7 | 8 | func come(): 9 | show() 10 | rect_size.y = 0 11 | rect_size.x = x_size 12 | rect_position.y = 60 13 | while (rect_size.y < 600): 14 | rect_size.y += 50 15 | if (rect_size.y > 600): 16 | rect_size.y = 600 17 | yield (get_tree(), "idle_frame") 18 | func go(): 19 | while (rect_size.y > 600): 20 | rect_size.y -= 50 21 | yield (get_tree(), "idle_frame") 22 | hide() 23 | 24 | 25 | func _on_Punishment_Mode_toggled(button_pressed): 26 | Global.punishment_mode = button_pressed 27 | 28 | 29 | func _on_Chaos_Mode_toggled(value): 30 | Global.chaos_mode = value 31 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/Speech.gd: -------------------------------------------------------------------------------- 1 | extends RichTextLabel 2 | 3 | 4 | var speech_break = false 5 | var mouse_hover = false 6 | var speech_flag = false 7 | var alpha_sound = [preload("res://Sfx/Voice/A.wav"), 8 | preload("res://Sfx/Voice/B.wav"), 9 | preload("res://Sfx/Voice/C.wav"), 10 | preload("res://Sfx/Voice/D.wav"), 11 | preload("res://Sfx/Voice/E.wav"), 12 | preload("res://Sfx/Voice/F.wav"), 13 | preload("res://Sfx/Voice/G.wav"), 14 | preload("res://Sfx/Voice/H.wav"), 15 | preload("res://Sfx/Voice/I.wav"), 16 | preload("res://Sfx/Voice/J.wav"), 17 | preload("res://Sfx/Voice/K.wav"), 18 | preload("res://Sfx/Voice/L.wav"), 19 | preload("res://Sfx/Voice/M.wav"), 20 | preload("res://Sfx/Voice/N.wav"), 21 | preload("res://Sfx/Voice/O.wav"), 22 | preload("res://Sfx/Voice/P.wav"), 23 | preload("res://Sfx/Voice/Q.wav"), 24 | preload("res://Sfx/Voice/R.wav"), 25 | preload("res://Sfx/Voice/S.wav"), 26 | preload("res://Sfx/Voice/T.wav"), 27 | preload("res://Sfx/Voice/U.wav"), 28 | preload("res://Sfx/Voice/V.wav"), 29 | preload("res://Sfx/Voice/W.wav"), 30 | preload("res://Sfx/Voice/X.wav"), 31 | preload("res://Sfx/Voice/Y.wav"), 32 | preload("res://Sfx/Voice/Z.wav")] 33 | signal character_speak 34 | func _ready(): 35 | 36 | 37 | 38 | 39 | 40 | pass 41 | 42 | 43 | 44 | 45 | func list_files_in_directory(path:String, file_type:String)->Array: 46 | var files = [] 47 | var dir = Directory.new() 48 | dir.open(path) 49 | dir.list_dir_begin() 50 | while true: 51 | var file = dir.get_next() 52 | if file == "": 53 | break 54 | elif not file.begins_with(".") and file.get_extension() == file_type: 55 | 56 | files.append(path + "/" + file) 57 | return files 58 | 59 | func skip(): 60 | visible_characters = get_total_character_count() 61 | 62 | func _input(event): 63 | if event is InputEventMouseButton: 64 | if Input.is_action_just_pressed("mouse_1") and mouse_hover: 65 | skip() 66 | speech_break = true 67 | 68 | func speech(): 69 | speech_break = true 70 | 71 | scroll_to_line(0) 72 | visible_characters = 0 73 | for i in range(1): 74 | yield (get_tree(), "physics_frame") 75 | speech_break = false 76 | for c in text: 77 | while get_tree().paused: 78 | yield (get_tree(), "physics_frame") 79 | if speech_break: 80 | return 81 | if Global.high_performance: 82 | visible_characters += 2 83 | else : 84 | visible_characters += 1 85 | if c.ord_at(0) >= 97 and c.ord_at(0) <= 122: 86 | $AudioStreamPlayer.stream = alpha_sound[c.ord_at(0) - 97] 87 | emit_signal("character_speak") 88 | $AudioStreamPlayer.play() 89 | if c.ord_at(0) >= 65 and c.ord_at(0) <= 90: 90 | emit_signal("character_speak") 91 | $AudioStreamPlayer.stream = alpha_sound[c.ord_at(0) - 65] 92 | $AudioStreamPlayer.play() 93 | if c.ord_at(0) == 32: 94 | for i in range(1): 95 | if speech_break: 96 | return 97 | yield (get_tree(), "physics_frame") 98 | 99 | for i in range(1): 100 | if speech_break: 101 | return 102 | yield (get_tree(), "physics_frame") 103 | 104 | 105 | func _on_Description_mouse_entered(): 106 | mouse_hover = true 107 | 108 | set("custom_colors/default_color", Color(0, 1, 0, 1)) 109 | 110 | func _on_Description_mouse_exited(): 111 | set("custom_colors/default_color", Color(1, 0, 0, 1)) 112 | mouse_hover = false 113 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/Stock_Menu.gd: -------------------------------------------------------------------------------- 1 | extends WindowDialog 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | popup_centered() 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/WeaponViewport.gd: -------------------------------------------------------------------------------- 1 | extends Viewport 2 | 3 | 4 | 5 | 6 | 7 | export var offset = 0 8 | 9 | 10 | func _ready(): 11 | $Weapon.rotation.y += deg2rad(offset) 12 | 13 | 14 | 15 | 16 | 17 | func _process(delta): 18 | if not Global.menu.in_game: 19 | $Weapon.rotation.y += 1 * delta 20 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/hide.gd: -------------------------------------------------------------------------------- 1 | extends PanelContainer 2 | 3 | 4 | 5 | 6 | 7 | export var in_game = false 8 | var font:DynamicFont = preload("res://Fonts/mingliutsmall.tres") 9 | 10 | 11 | func _ready(): 12 | if in_game: 13 | rect_size = Vector2(640, 480) 14 | rect_scale = Vector2(Global.resolution[0] / 1280, Global.resolution[1] / 720) 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | func go(): 23 | hide() 24 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Menu/name_override.gd: -------------------------------------------------------------------------------- 1 | extends TextureButton 2 | 3 | 4 | 5 | 6 | 7 | export var override_name = "Button" 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | 18 | func _get_name_override(): 19 | return override_name 20 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Missile.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | var speed = 10 8 | var velocity = Vector3(0, 0, 1) 9 | onready var explosion = preload("res://Entities/Bullets/Explosion.tscn") 10 | 11 | 12 | func _ready(): 13 | 14 | pass 15 | 16 | 17 | 18 | func _physics_process(delta): 19 | if velocity.length() < 100: 20 | velocity *= 1.2 21 | translate(velocity * delta) 22 | 23 | 24 | 25 | func set_velocity(new_velocity, direction): 26 | velocity = new_velocity * velocity 27 | transform.basis = direction 28 | 29 | func _on_Spatial_body_entered(body): 30 | var new_explosion = explosion.instance() 31 | new_explosion.global_transform.origin = global_transform.origin - Vector3(0, 0, 0) 32 | body.add_child(new_explosion) 33 | 34 | $CollisionShape.disabled = true 35 | 36 | 37 | func _on_Spatial_area_entered(area): 38 | var distance = global_transform.origin - area.global_transform.origin 39 | var new_explosion = explosion.instance() 40 | area.add_child(new_explosion) 41 | new_explosion.global_transform.origin = global_transform.origin 42 | new_explosion.global_transform.origin.z = global_transform.origin.z - distance.z * 2 43 | new_explosion.global_transform.origin.x = global_transform.origin.x - distance.x * 2 44 | $CollisionShape.disabled = true 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/MissileKinematic.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | 4 | 5 | 6 | 7 | export var speed = 10 8 | export var homing = false 9 | export var piercing = false 10 | var target 11 | var target_pos 12 | var collisions = 0 13 | var target_pos_prev 14 | var time = 0 15 | var velocity = Vector3(0, 0, 0) 16 | var explosion = preload("res://Entities/Bullets/Explosion.tscn") 17 | var shrapnel = preload("res://Entities/Bullets/Explosive_Grenade_Impact.tscn") 18 | var decal = preload("res://Entities/Decals/BigHole.tscn") 19 | 20 | 21 | 22 | 23 | 24 | 25 | func align_up(node_basis, normal)->Basis: 26 | var result = Basis() 27 | var scale = node_basis.get_scale() 28 | 29 | result.x = normal.cross(node_basis.z) + Vector3(1e-05, 0, 0) 30 | result.y = normal + Vector3(0, 1e-05, 0) 31 | result.z = node_basis.x.cross(normal) + Vector3(0, 0, 1e-05) 32 | 33 | result = result.orthonormalized() 34 | result.x *= scale.x 35 | result.y *= scale.y 36 | result.z *= scale.z 37 | 38 | return result 39 | 40 | func _physics_process(delta): 41 | if piercing: 42 | $MeshInstance.scale = lerp($MeshInstance.scale, Vector3.ONE, 0.8) 43 | time += 1 44 | if speed < 25: 45 | speed *= 1.2 46 | if target != null and homing: 47 | target_pos = target.global_transform.origin + Vector3(0, 0.75, 0) 48 | target_pos_prev = lerp(target_pos_prev, target_pos, 0.1) 49 | look_at(target_pos_prev, Vector3.UP) 50 | rotate_object_local(Vector3(0, 1, 0), 3.14 + sin(time * 0.01) * 1.5) 51 | 52 | var collision = move_and_collide(velocity * delta) 53 | if collision: 54 | if not piercing: 55 | var smokeparticle = $Smoke_Particle 56 | remove_child(smokeparticle) 57 | get_parent().add_child(smokeparticle) 58 | smokeparticle.emitting = false 59 | smokeparticle.get_node("OmniLight").queue_free() 60 | var new_explosion = explosion.instance() 61 | collision.collider.get_parent().add_child(new_explosion) 62 | new_explosion.global_transform.origin = global_transform.origin - Vector3(0, 1, 0) 63 | $CollisionShape.disabled = true 64 | var shrapnel_rotation = Vector3(1, 1, 0).rotated(Vector3.UP, deg2rad(rand_range(0, 180))) 65 | for i in range(4): 66 | shrapnel_rotation = shrapnel_rotation.rotated(Vector3.UP, deg2rad(90)) 67 | var new_shrapnel = shrapnel.instance() 68 | get_parent().add_child(new_shrapnel) 69 | new_shrapnel.shrapnel_flag = true 70 | new_shrapnel.global_transform.origin = global_transform.origin + Vector3.UP 71 | new_shrapnel.set_velocity(rand_range(10, 30), (new_shrapnel.global_transform.origin - (new_shrapnel.global_transform.origin - shrapnel_rotation)).normalized(), global_transform.origin) 72 | queue_free() 73 | else : 74 | collisions += 1 75 | if collisions > 10: 76 | queue_free() 77 | if collision.collider.has_method("piercing_damage"): 78 | collision.collider.piercing_damage(150, (global_transform.origin - collision.position).normalized(), global_transform.origin, global_transform.origin) 79 | if collision.collider.has_method("damage"): 80 | 81 | collision.collider.damage(150, (global_transform.origin - collision.position).normalized(), global_transform.origin, global_transform.origin) 82 | else : 83 | decal(collision.collider, collision.position, collision.normal) 84 | queue_free() 85 | 86 | 87 | 88 | func set_velocity(new_velocity, direction): 89 | transform.basis = direction 90 | 91 | func decal(collider:Spatial, c_point, c_normal)->void : 92 | if not is_instance_valid(collider): 93 | return 94 | if collider.get_collision_layer_bit(0) == true: 95 | var decal_new = decal.instance() 96 | collider.add_child(decal_new) 97 | decal_new.global_transform.basis = align_up(decal_new.global_transform.basis, c_normal) 98 | decal_new.global_transform.origin = c_point + c_normal * 1e-08 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | func _on_Area_body_entered(body): 128 | if body.get("alive_head") != null and target == null: 129 | if body.alive_head == true: 130 | target_pos_prev = body.global_transform.origin + Vector3(0, 0.75, 0) 131 | target_pos = body.global_transform.origin + Vector3(0, 0.75, 0) 132 | target = body 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Player_Manager.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | 8 | onready var player = $Player 9 | onready var cam_pos = $Position3D 10 | 11 | 12 | func _ready(): 13 | if Global.implants.head_implant.shrink: 14 | scale = Vector3(0.1, 0.1, 0.1) 15 | 16 | 17 | 18 | func _process(delta): 19 | 20 | if Input.is_action_just_pressed("Stocks"): 21 | $Stock_Menu.visible = not $Stock_Menu.visible 22 | if $Stock_Menu.visible: 23 | Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) 24 | $Position3D / Rotation_Helper / Weapon.disabled = true 25 | else : 26 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) 27 | $Position3D / Rotation_Helper / Weapon.disabled = false 28 | var offset = Vector3(0, 1.481, 0) 29 | if Global.implants.head_implant.shrink: 30 | offset *= 0.1 31 | if player.max_gravity < 0: 32 | offset = Vector3(0, 0, 0) 33 | if Engine.get_frames_per_second() <= 30: 34 | cam_pos.global_transform.origin = player.global_transform.origin + offset 35 | 36 | else : 37 | cam_pos.global_transform.origin = lerp(cam_pos.global_transform.origin, player.global_transform.origin + offset, clamp(delta * 30, 0, 1)) 38 | 39 | 40 | 41 | cam_pos.rotation.y = player.rotation.y 42 | 43 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Radiation.gd: -------------------------------------------------------------------------------- 1 | extends Particles 2 | 3 | 4 | 5 | 6 | 7 | export var damage = 0.4 8 | 9 | 10 | 11 | func _physics_process(delta): 12 | 13 | for body in $Area.get_overlapping_bodies(): 14 | if body == Global.player and Global.death: 15 | return 16 | if body.has_method("damage"): 17 | body.damage(damage, Vector3.ZERO, body.global_transform.origin, global_transform.origin) 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Abraxas_Head.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var type = 1 4 | var active = false 5 | export var health = 10 6 | var destroyed = false 7 | 8 | func _ready(): 9 | pass 10 | 11 | func damage(dmg, nrml, pos, shoot_pos): 12 | if not active: 13 | return 14 | health -= dmg 15 | if health <= 0: 16 | destroyed = true 17 | get_parent().get_node("Sphere").hide() 18 | get_parent().get_node("Particle").show() 19 | 20 | func get_type(): 21 | return type 22 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Abraxas_Laser.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var type = 1 4 | var laser 5 | var health = 300 6 | var follow_speed = 0.02 7 | var particle 8 | var active = false 9 | var destroyed = false 10 | var look_towards = Vector3.ZERO 11 | var t = 0 12 | var disabled = true 13 | 14 | func _ready(): 15 | look_towards = Global.player.global_transform.origin 16 | laser = $Laser 17 | particle = $Particles 18 | 19 | func _process(delta): 20 | t += 1 21 | if destroyed: 22 | hide() 23 | return 24 | if disabled: 25 | particle.hide() 26 | if laser.scale.z < 3: 27 | hide() 28 | laser.scale.z = lerp(laser.scale.z, 1, 0.2) 29 | return 30 | show() 31 | look_towards = lerp(look_towards, Global.player.global_transform.origin, follow_speed) 32 | var space = get_world().direct_space_state 33 | if not active: 34 | var active_result = space.intersect_ray(global_transform.origin, Global.player.global_transform.origin + Vector3.UP * 0.5, [self]) 35 | if active_result: 36 | if active_result.collider == Global.player: 37 | active = true 38 | else : 39 | return 40 | var result = space.intersect_ray(global_transform.origin, global_transform.origin - (global_transform.origin - look_towards).normalized() * 200, [self]) 41 | if result: 42 | particle.show() 43 | particle.global_transform.origin = result.position 44 | laser.scale.z = lerp(laser.scale.z, global_transform.origin.distance_to(result.position) * 0.5, 0.2) 45 | laser.look_at(result.position, Vector3.UP) 46 | if result.collider == Global.player: 47 | Global.player.damage(20, result.normal, result.position, global_transform.origin) 48 | else : 49 | particle.hide() 50 | laser.scale.z = 400 51 | 52 | func damage(dmg, nrml, pos, shoot_pos): 53 | if not active: 54 | return 55 | health -= dmg 56 | if health <= 0: 57 | destroyed = true 58 | get_parent().get_node("Particle").show() 59 | get_parent().get_node("Sphere002").hide() 60 | 61 | func get_type(): 62 | return type; 63 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Abraxas_Rocket.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var health = 300 4 | var type = 1 5 | var frequency = 50 6 | var destroyed = false 7 | var disabled = true 8 | var BULLETS = preload("res://Entities/Bullets/Homing_Missile.tscn") 9 | var t = 0 10 | var activated = false 11 | 12 | func _ready(): 13 | pass 14 | 15 | func _physics_process(delta): 16 | t += 1 17 | if destroyed: 18 | return 19 | if disabled: 20 | return 21 | show() 22 | if not activated and fmod(t, 50) == 0: 23 | var space = get_world().direct_space_state 24 | var result = space.intersect_ray(global_transform.origin, Global.player.global_transform.origin + Vector3.UP * 0.5, [self]) 25 | if result: 26 | if result.collider == Global.player: 27 | activated = true 28 | if activated: 29 | if fmod(t, frequency) == 0: 30 | for i in range(4): 31 | yield (get_tree(), "idle_frame") 32 | yield (get_tree(), "idle_frame") 33 | yield (get_tree(), "idle_frame") 34 | yield (get_tree(), "idle_frame") 35 | yield (get_tree(), "idle_frame") 36 | yield (get_tree(), "idle_frame") 37 | yield (get_tree(), "idle_frame") 38 | yield (get_tree(), "idle_frame") 39 | rocket_launcher() 40 | 41 | func rocket_launcher()->void : 42 | var missile_new = BULLETS.instance() 43 | get_parent().get_parent().get_parent().add_child(missile_new) 44 | missile_new.add_collision_exception_with(self) 45 | missile_new.global_transform.origin = global_transform.origin 46 | missile_new.set_velocity(30, (global_transform.origin - (Global.player.global_transform.origin + Vector3.UP * 50 + Vector3(0, 0, sin(t * 0.5) * 25))).normalized(), global_transform.origin) 47 | 48 | func damage(dmg, nrml, pos, shoot_pos): 49 | if not activated: 50 | return 51 | health -= dmg 52 | if health <= 0: 53 | destroyed = true 54 | get_parent().get_node("Sphere001").hide() 55 | get_parent().get_node("Particle").show() 56 | 57 | func get_type(): 58 | return type; 59 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Acid.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | var particles 4 | 5 | func _ready(): 6 | particles = get_parent().get_node("Particles") 7 | particles.emitting = true 8 | 9 | func _physics_process(delta): 10 | 11 | for overlap in get_overlapping_bodies(): 12 | if overlap.has_method("damage"): 13 | overlap.damage(1, Vector3.ZERO, global_transform.origin, global_transform.origin) 14 | if particles.emitting == false: 15 | queue_free() 16 | 17 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Acid_Ball.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var velocity = Vector3(1, 1, 1) 4 | var gravity = 22 5 | export var particle = true 6 | export var mass = 1 7 | export var shell = false 8 | export var stay_active = false 9 | var impact_sound:Array 10 | export var sounds = false 11 | var rot_changed = Vector3(0, 0, 0) 12 | var t = 0 13 | var water = false 14 | var finished = false 15 | var acid = preload("res://Entities/Bullets/Acid.tscn") 16 | onready var mesh = $MeshInstance 17 | 18 | func _ready(): 19 | set_collision_layer_bit(6, 1) 20 | set_collision_layer_bit(0, 0) 21 | t += rand_range(0, 10) 22 | if sounds: 23 | impact_sound = [$Sound1, $Sound2, $Sound3] 24 | for sound in impact_sound: 25 | sound.pitch_scale -= mass * 0.1 26 | 27 | func _physics_process(delta): 28 | if water: 29 | gravity = 2 30 | else : 31 | gravity = 5 32 | t += 1 33 | mesh.scale += Vector3.ONE * 0.01 34 | 35 | var collision = move_and_collide(transform.basis.z * - 10 * delta * velocity) 36 | if collision: 37 | if collision.collider.has_method("damage"): 38 | var new_acid = acid.instance() 39 | collision.collider.add_child(new_acid) 40 | new_acid.global_transform.origin = collision.position 41 | queue_free() 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | velocity.y -= gravity * delta 58 | 59 | 60 | 61 | 62 | 63 | 64 | func set_water(a): 65 | water = a 66 | velocity *= 0.5 67 | velocity.y = 0 68 | 69 | func set_velocity(new_velocity, direction): 70 | transform.basis = direction 71 | rotation.x += rand_range(0, 0.5) 72 | rotation.z += rand_range(0, 0.5) 73 | rotation.y += rand_range( - 0.25, 0.25) 74 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Alert_Event.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | func _ready(): 4 | pass 5 | 6 | func _on_Spatial_body_entered(body): 7 | if body == Global.player: 8 | for b in get_overlapping_bodies(): 9 | if b.has_method("alert"): 10 | b.alert(Global.player.global_transform.origin) 11 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Anim_Autoplay.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | func _ready(): 4 | pass 5 | 6 | func _physics_process(delta): 7 | if not $AnimationPlayer.is_playing(): 8 | $AnimationPlayer.play("ArmatureAction") 9 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Berries.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | enum {SPEED, FLOATY, TOXIC, PSYCHOSIS, CANCER, GRAVITY} 4 | 5 | export var pills = false 6 | export var toxic = false 7 | export var healing = false 8 | export var healing_amount = 25 9 | export var kinematic = false 10 | 11 | func _ready(): 12 | pass 13 | 14 | func player_use(): 15 | if pills: 16 | match randi() % 6: 17 | SPEED: 18 | Global.player.drug_speed = 50 19 | FLOATY: 20 | Global.player.drug_slowfall = 150 21 | TOXIC: 22 | Global.player.set_toxic() 23 | PSYCHOSIS: 24 | Global.player.psychocounter = 200 25 | CANCER: 26 | Global.player.cancer_count = 9 27 | Global.player.cancer() 28 | GRAVITY: 29 | Global.player.drug_gravity_flag = true 30 | get_parent().get_node("AudioStreamPlayer3D").play() 31 | get_parent().visible = false 32 | Global.player.UI.notify("You ate pills.", Color(1, 0.0, 1.0)) 33 | queue_free() 34 | if healing: 35 | Global.player.add_health(healing_amount) 36 | if kinematic: 37 | get_parent().queue_free() 38 | queue_free() 39 | if toxic: 40 | Global.player.set_toxic() 41 | queue_free() 42 | else : 43 | Global.player.detox() 44 | queue_free() 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Car.gd: -------------------------------------------------------------------------------- 1 | extends VehicleBody 2 | 3 | export var turn_amount = 0.3 4 | var in_use = false 5 | var init_player_basis 6 | var last_rpm = 0 7 | var time = 0 8 | export var engine = 2000 9 | 10 | func _ready(): 11 | set_collision_layer_bit(8, 1) 12 | 13 | func _physics_process(delta): 14 | if in_use: 15 | Global.player.global_transform.origin = $Car / Player_Pos.global_transform.origin 16 | time += 1 17 | if not $VehicleWheel.is_in_contact(): 18 | last_rpm = lerp(last_rpm, 2000, 0.1) 19 | else : 20 | last_rpm = abs($VehicleWheel.get_rpm()) 21 | if in_use: 22 | if Input.is_action_pressed("movement_forward") or Input.is_action_pressed("movement_backward"): 23 | if fmod(time, 5) == 0 or not $SFX_Engine.playing: 24 | $SFX_Engine.pitch_scale = lerp($SFX_Engine.pitch_scale, last_rpm * 0.001 + 1, 0.2) 25 | $SFX_Engine.play() 26 | else : 27 | $SFX_Engine.pitch_scale = 1 28 | 29 | Global.player.weapon.left_arm_mesh.hide() 30 | Global.player.transform.basis = transform.basis * $Car / Player_Pos.transform.basis 31 | 32 | if Input.is_action_just_pressed("Use"): 33 | Global.player.transform.basis = init_player_basis * $Car / Player_Pos.transform.basis 34 | 35 | Global.player.player_velocity = Vector3.ZERO 36 | Global.player.set_collision_mask_bit(7, true) 37 | $CollisionShape.disabled = true 38 | Global.player.global_transform.origin = $ExitPos.global_transform.origin 39 | 40 | in_use = false 41 | 42 | yield (get_tree(), "idle_frame") 43 | $CollisionShape.disabled = false 44 | Global.player.crush_check.disabled = false 45 | Global.player.weapon.left_arm_mesh.show() 46 | if not Input.is_action_pressed("movement_left") and not Input.is_action_pressed("movement_right"): 47 | steering = lerp(steering, 0, 0.5) 48 | 49 | func use(): 50 | sleeping = false 51 | if not in_use: 52 | init_player_basis = Global.player.transform.basis 53 | Global.player.crush_check.disabled = true 54 | Global.player.set_collision_mask_bit(7, false) 55 | yield (get_tree(), "idle_frame") 56 | in_use = true 57 | 58 | func _input(event): 59 | if event is InputEventKey and in_use: 60 | if Input.is_action_pressed("movement_forward"): 61 | 62 | engine_force = engine 63 | elif Input.is_action_pressed("movement_backward"): 64 | if not $SFX_Engine.playing: 65 | $SFX_Engine.play() 66 | engine_force = - engine 67 | else : 68 | engine_force = 0 69 | if Input.is_action_pressed("movement_left"): 70 | steering = lerp(steering, turn_amount, 0.8) 71 | if Input.is_action_pressed("movement_right"): 72 | steering = lerp(steering, - turn_amount, 0.8) 73 | 74 | if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED and in_use: 75 | 76 | $Car / Player_Pos.rotate_y(deg2rad(event.relative.x * Global.mouse_sensitivity * - 1)) 77 | 78 | func _on_VehicleBody_body_entered(body): 79 | if body.has_method("damage") and body != Global.player: 80 | body.damage(100, (global_transform.origin - body.global_transform.origin).normalized(), body.global_transform.origin, global_transform.origin) 81 | if body.has_method("physics_object"): 82 | body.queue_free() 83 | 84 | func _on_Vehicle_body_entered(body): 85 | if body.has_method("physics_object"): 86 | body.queue_free() 87 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Console.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | func _ready(): 4 | pass 5 | func printc(line): 6 | $Text.text = "~" + str(line) + "\n" + $Text.text 7 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Cutscene.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | export var next_scene = "" 4 | export (Array, String, MULTILINE) var LINES:Array = [""] 5 | export (Array, float) var DURATION:Array = [1] 6 | export (String) var music 7 | export var instant = false 8 | export var line_skip = true 9 | export var introskip = false 10 | var CAMERAS 11 | onready var TIMER = $Timer 12 | onready var SUBTITLE = $MarginContainer / CenterContainer / Subtitle 13 | var current_scene = 0 14 | var t = 0 15 | 16 | func _ready(): 17 | $MarginContainer / CenterContainer / Subtitle.get_font("font").size = 32 * (Global.resolution[0] / 1280) 18 | 19 | Global.menu.hide() 20 | if music != "": 21 | if music == "NO": 22 | Global.music.stop() 23 | else : 24 | Global.music.stream = load(music) 25 | Global.music.play() 26 | Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN) 27 | Global.cutscene = true 28 | Global.border.hide() 29 | CAMERAS = $Cameras.get_children() 30 | if introskip or Global.skip_intro: # originally this "or" is "and", don't know why 31 | Global.cutscene = false 32 | Global.border.show() 33 | Global.goto_scene("res://Menu/Main_Menu.tscn") 34 | 35 | func _process(delta): 36 | if instant: 37 | t += 1 38 | SUBTITLE.modulate = Color((cos(t * 0.01) + 1) * 0.5, 0, 0) 39 | if TIMER.is_stopped() and current_scene != LINES.size(): 40 | 41 | current_scene = clamp(current_scene, 0, LINES.size() - 1) 42 | TIMER.wait_time = DURATION[current_scene] 43 | if CAMERAS.size() > 0: 44 | CAMERAS[current_scene].current = true 45 | SUBTITLE.text = LINES[current_scene] 46 | if not instant: 47 | SUBTITLE.speech() 48 | else : 49 | SUBTITLE.visible_characters = - 1 50 | current_scene += 1 51 | TIMER.start() 52 | if TIMER.is_stopped() and current_scene == LINES.size(): 53 | Global.goto_scene(next_scene) 54 | Global.cutscene = false 55 | Global.border.show() 56 | func _input(event): 57 | if event is InputEventKey: 58 | if Input.is_action_just_pressed("ui_cancel") or Input.is_action_just_pressed("ui_accept"): 59 | Global.goto_scene(next_scene) 60 | Global.cutscene = false 61 | Global.border.show() 62 | if Input.is_action_just_pressed("movement_jump") and line_skip: 63 | 64 | TIMER.stop() 65 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Destructible.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var PARTICLE = preload("res://Entities/Particles/Destruction_Particle.tscn") 4 | 5 | export var door_health = 100 6 | var mesh_instance 7 | var type = 1 8 | var audio_player 9 | 10 | func _ready(): 11 | set_process(false) 12 | for child in get_children(): 13 | if child is MeshInstance: 14 | mesh_instance = child 15 | var t = mesh_instance.transform 16 | audio_player = AudioStreamPlayer3D.new() 17 | get_parent().call_deferred("add_child", audio_player) 18 | yield (get_tree(), "idle_frame") 19 | audio_player.global_transform.origin = global_transform.origin 20 | audio_player.stream = load("res://Sfx/Environment/doorkick.wav") 21 | audio_player.unit_size = 10 22 | audio_player.unit_db = 2 23 | audio_player.max_db = 3 24 | 25 | func destroy(collision_n, collision_p): 26 | damage(200, collision_n, collision_p, Vector3.ZERO) 27 | 28 | func damage(damage, collision_n, collision_p, shooter_pos): 29 | door_health -= damage 30 | if door_health <= 0: 31 | audio_player.global_transform.origin = collision_p 32 | audio_player.play() 33 | var new_particle = PARTICLE.instance() 34 | get_parent().add_child(new_particle) 35 | new_particle.global_transform.origin = collision_p 36 | new_particle.look_at(global_transform.origin + collision_n * 5 + Vector3(1e-06, 0, 0), Vector3.UP) 37 | new_particle.material_override = mesh_instance.mesh.surface_get_material(0) 38 | new_particle.emitting = true 39 | queue_free() 40 | 41 | func get_type(): 42 | return type; 43 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Destructible_Armored.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var PARTICLE = preload("res://Entities/Particles/Destruction_Particle.tscn") 4 | 5 | export var door_health = 100 6 | var mesh_instance 7 | var type = 1 8 | var audio_player 9 | 10 | func _ready(): 11 | for child in get_children(): 12 | if child is MeshInstance: 13 | mesh_instance = child 14 | var t = mesh_instance.transform 15 | audio_player = AudioStreamPlayer3D.new() 16 | get_parent().call_deferred("add_child", audio_player) 17 | yield (get_tree(), "idle_frame") 18 | audio_player.global_transform.origin = global_transform.origin 19 | audio_player.stream = load("res://Sfx/Environment/doorkick.wav") 20 | audio_player.unit_size = 10 21 | audio_player.unit_db = 2 22 | audio_player.max_db = 3 23 | set_collision_layer_bit(8, 1) 24 | 25 | func piercing_damage(damage, collision_n, collision_p, shooter_pos): 26 | door_health -= damage 27 | if door_health <= 0: 28 | audio_player.global_transform.origin = collision_p 29 | audio_player.play() 30 | var new_particle = PARTICLE.instance() 31 | get_parent().add_child(new_particle) 32 | new_particle.global_transform.origin = collision_p 33 | new_particle.look_at(global_transform.origin + collision_n * 5, Vector3.UP) 34 | new_particle.material_override = mesh_instance.mesh.surface_get_material(0) 35 | new_particle.emitting = true 36 | queue_free() 37 | 38 | func player_use(): 39 | Global.player.UI.notify("Small cracks permeate the surface", Color(1, 1, 1)) 40 | 41 | func get_type(): 42 | return type; 43 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Destructible_Static.gd: -------------------------------------------------------------------------------- 1 | extends StaticBody 2 | 3 | var PARTICLE = preload("res://Entities/Particles/Destruction_Particle.tscn") 4 | 5 | export var door_health = 100 6 | var mesh_instance 7 | var type = 1 8 | var audio_player 9 | 10 | func _ready(): 11 | for child in get_children(): 12 | if child is MeshInstance: 13 | mesh_instance = child 14 | var t = mesh_instance.transform 15 | audio_player = AudioStreamPlayer3D.new() 16 | get_parent().call_deferred("add_child", audio_player) 17 | yield (get_tree(), "idle_frame") 18 | audio_player.global_transform.origin = global_transform.origin 19 | audio_player.stream = load("res://Sfx/Environment/doorkick.wav") 20 | audio_player.unit_size = 10 21 | audio_player.unit_db = 2 22 | audio_player.max_db = 3 23 | func destroy(collision_n, collision_p): 24 | damage(200, collision_n, collision_p, Vector3.ZERO) 25 | func damage(damage, collision_n, collision_p, shooter_pos): 26 | door_health -= damage 27 | if door_health <= 0: 28 | audio_player.global_transform.origin = collision_p 29 | audio_player.play() 30 | var new_particle = PARTICLE.instance() 31 | get_parent().add_child(new_particle) 32 | new_particle.global_transform.origin = collision_p 33 | new_particle.look_at(global_transform.origin + collision_n * 5, Vector3.UP) 34 | 35 | 36 | new_particle.material_override = mesh_instance.mesh.surface_get_material(0) 37 | new_particle.emitting = true 38 | queue_free() 39 | 40 | func get_type(): 41 | return type; 42 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Divine_Door.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var PARTICLE = preload("res://Entities/Particles/Destruction_Particle.tscn") 4 | 5 | export var door_health = 100 6 | export var rotation_speed = 2 7 | var open = false 8 | var stop = true 9 | var initrot = rotation 10 | var rotation_counter = 0 11 | var mesh_instance 12 | var collision_shape 13 | var collision = false 14 | var found_overlap 15 | var type = 1 16 | var audio_player 17 | 18 | func _ready(): 19 | set_collision_layer_bit(8, 1) 20 | for child in get_children(): 21 | if child is MeshInstance: 22 | mesh_instance = child 23 | if child is CollisionShape: 24 | collision_shape = child 25 | var t = mesh_instance.transform 26 | 27 | if mesh_instance.get_aabb().size.x > mesh_instance.get_aabb().size.z: 28 | global_transform.origin.x -= mesh_instance.get_aabb().position.x 29 | global_transform.origin.z -= mesh_instance.get_aabb().position.z + mesh_instance.get_aabb().size.z * 0.5 30 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z + mesh_instance.get_aabb().size.z * 0.5)) 31 | else : 32 | global_transform.origin.x -= mesh_instance.get_aabb().position.x + mesh_instance.get_aabb().size.x * 0.5 33 | global_transform.origin.z -= mesh_instance.get_aabb().position.z 34 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x + mesh_instance.get_aabb().size.x * 0.5, 0, mesh_instance.get_aabb().position.z)) 35 | 36 | mesh_instance.transform = t 37 | collision_shape.transform = t 38 | 39 | audio_player = AudioStreamPlayer3D.new() 40 | get_parent().call_deferred("add_child", audio_player) 41 | yield (get_tree(), "idle_frame") 42 | audio_player.global_transform.origin = global_transform.origin 43 | audio_player.stream = load("res://Sfx/Environment/doorkick.wav") 44 | audio_player.unit_size = 10 45 | audio_player.unit_db = 4 46 | audio_player.max_db = 4 47 | audio_player.pitch_scale = 0.6 48 | 49 | func _physics_process(delta): 50 | if not open and not stop: 51 | rotation.y += rotation_speed * delta 52 | rotation_counter += rad2deg(rotation_speed * delta) 53 | if open and not stop: 54 | rotation.y -= rotation_speed * delta 55 | rotation_counter += rad2deg(rotation_speed * delta) 56 | if rotation_counter > 90: 57 | rotation_counter = 0 58 | stop = true 59 | 60 | func get_type(): 61 | return type; 62 | 63 | func player_use(): 64 | if Global.soul_intact: 65 | stop = not stop 66 | open = not open 67 | elif Global.hope_discarded: 68 | Global.player.UI.notify("It hurts.", Color(1, 0, 0)) 69 | Global.player.UI.notify("It hurts.", Color(1, 0, 0)) 70 | Global.player.UI.notify("It hurts.", Color(1, 0, 0)) 71 | Global.player.UI.notify("It hurts.", Color(1, 0, 0)) 72 | else : 73 | Global.player.UI.notify("Feels like something is missing. It won't budge.", Color(0.9, 0.9, 1)) 74 | 75 | 76 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Door.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var PARTICLE = preload("res://Entities/Particles/Destruction_Particle.tscn") 4 | 5 | export var door_health = 100 6 | export var rotation_speed = 2 7 | var open = false 8 | var stop = true 9 | var initrot = rotation 10 | var rotation_counter = 0 11 | var mesh_instance 12 | var collision_shape 13 | var collision = false 14 | var found_overlap 15 | var type = 1 16 | var audio_player 17 | 18 | func _ready(): 19 | set_process(false) 20 | set_collision_layer_bit(8, 1) 21 | for child in get_children(): 22 | if child is MeshInstance: 23 | mesh_instance = child 24 | if child is CollisionShape: 25 | collision_shape = child 26 | var t = mesh_instance.transform 27 | 28 | if mesh_instance.get_aabb().size.x > mesh_instance.get_aabb().size.z: 29 | global_transform.origin.x -= mesh_instance.get_aabb().position.x 30 | global_transform.origin.z -= mesh_instance.get_aabb().position.z + mesh_instance.get_aabb().size.z * 0.5 31 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z + mesh_instance.get_aabb().size.z * 0.5)) 32 | else : 33 | global_transform.origin.x -= mesh_instance.get_aabb().position.x + mesh_instance.get_aabb().size.x * 0.5 34 | global_transform.origin.z -= mesh_instance.get_aabb().position.z 35 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x + mesh_instance.get_aabb().size.x * 0.5, 0, mesh_instance.get_aabb().position.z)) 36 | 37 | mesh_instance.transform = t 38 | collision_shape.transform = t 39 | 40 | audio_player = AudioStreamPlayer3D.new() 41 | get_parent().call_deferred("add_child", audio_player) 42 | yield (get_tree(), "idle_frame") 43 | audio_player.global_transform.origin = global_transform.origin 44 | audio_player.stream = load("res://Sfx/Environment/doorkick.wav") 45 | audio_player.unit_size = 10 46 | audio_player.unit_db = 4 47 | audio_player.max_db = 4 48 | audio_player.pitch_scale = 0.6 49 | 50 | func _physics_process(delta): 51 | if not open and not stop: 52 | rotation.y += rotation_speed * delta 53 | rotation_counter += rad2deg(rotation_speed * delta) 54 | if open and not stop: 55 | rotation.y -= rotation_speed * delta 56 | rotation_counter += rad2deg(rotation_speed * delta) 57 | if rotation_counter > 90: 58 | rotation_counter = 0 59 | stop = true 60 | 61 | func destroy(collision_n, collision_p): 62 | damage(200, collision_n, collision_p, Vector3.ZERO) 63 | 64 | func damage(damage, collision_n, collision_p, shooter_pos): 65 | door_health -= damage 66 | if door_health <= 0: 67 | audio_player.global_transform.origin = collision_p 68 | audio_player.play() 69 | var new_particle = PARTICLE.instance() 70 | get_parent().add_child(new_particle) 71 | new_particle.global_transform.origin = collision_p 72 | new_particle.look_at(global_transform.origin + collision_n * 5 + Vector3(1e-07, 0, 0), Vector3.UP) 73 | new_particle.material_override = mesh_instance.mesh.surface_get_material(0) 74 | new_particle.emitting = true 75 | queue_free() 76 | 77 | func get_type(): 78 | return type; 79 | 80 | func use(): 81 | stop = not stop 82 | open = not open 83 | 84 | 85 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Dynamic_NPC.gd: -------------------------------------------------------------------------------- 1 | extends "res://Scripts/Stupid_Civilian.gd" 2 | 3 | 4 | 5 | export var level_range_min = 2 6 | export var level_range_max = 12 7 | 8 | func _ready(): 9 | print(Global.LEVELS_UNLOCKED) 10 | if level_range_max < Global.LEVELS_UNLOCKED or level_range_min > Global.LEVELS_UNLOCKED: 11 | get_parent().queue_free() 12 | yield (get_tree(), "idle_frame") 13 | if Global.hope_discarded: 14 | get_parent().damage(200, Vector3.ZERO, global_transform.origin, global_transform.origin) 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Elevator.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var stopped = true 4 | var speed = - 2 5 | var initpos = true 6 | var last_pos 7 | var col = false 8 | var mesh_instance:MeshInstance 9 | var collision_area:Area 10 | var collision_object:CollisionShape 11 | var bell_audio:AudioStreamPlayer3D 12 | var move_audio:AudioStreamPlayer3D 13 | 14 | func _ready(): 15 | for child in get_children(): 16 | if child is MeshInstance: 17 | mesh_instance = child 18 | set_collision_mask_bit(9, 1) 19 | set_collision_mask_bit(8, 1) 20 | set_collision_layer_bit(8, 1) 21 | set_collision_mask_bit(0, 0) 22 | bell_audio = AudioStreamPlayer3D.new() 23 | add_child(bell_audio) 24 | bell_audio.unit_size = 10 25 | bell_audio.unit_db = 3 26 | bell_audio.global_transform.origin = global_transform.origin 27 | move_audio = bell_audio.duplicate() 28 | add_child(move_audio) 29 | move_audio.unit_db = 2 30 | bell_audio.stream = load("res://Sfx/Environment/Elevator_Bell.wav") 31 | move_audio.stream = load("res://Sfx/Environment/Elevator_Move.wav") 32 | 33 | func _process(delta): 34 | last_pos = global_transform.origin 35 | if not stopped: 36 | if not move_audio.playing: 37 | move_audio.play() 38 | translate(Vector3(0, speed * delta, 0)) 39 | 40 | func stop(): 41 | stopped = true 42 | initpos = not initpos 43 | speed = - speed 44 | bell_audio.play() 45 | move_audio.stop() 46 | 47 | func use(): 48 | stopped = false 49 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Elevator_Door.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | export var door_health = 100 4 | export var speed = 2 5 | var open = false 6 | var stop = true 7 | var initrot = rotation 8 | var movement_counter = 0 9 | var mesh_instance 10 | var collision_shape 11 | var collision = false 12 | var found_overlap 13 | var sfx = preload("res://Sfx/Environment/door_concrete.wav") 14 | var audio_player:AudioStreamPlayer3D 15 | var timer:Timer 16 | 17 | func _ready(): 18 | timer = Timer.new() 19 | add_child(timer) 20 | timer.wait_time = 5 21 | timer.one_shot = true 22 | timer.connect("timeout", self, "timeout") 23 | set_collision_layer_bit(8, 1) 24 | audio_player = AudioStreamPlayer3D.new() 25 | audio_player.stream = sfx 26 | add_child(audio_player) 27 | for child in get_children(): 28 | if child is MeshInstance: 29 | mesh_instance = child 30 | if child is CollisionShape: 31 | collision_shape = child 32 | var t = mesh_instance.transform 33 | global_transform.origin.x -= mesh_instance.get_aabb().position.x 34 | global_transform.origin.z -= mesh_instance.get_aabb().position.z 35 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z)) 36 | mesh_instance.transform = t 37 | collision_shape.transform = t 38 | 39 | func _physics_process(delta): 40 | if not open and not stop: 41 | if not audio_player.playing: 42 | audio_player.play() 43 | if mesh_instance.get_aabb().size.x > mesh_instance.get_aabb().size.z: 44 | translation.x += speed * delta 45 | elif mesh_instance.get_aabb().size.x < mesh_instance.get_aabb().size.z: 46 | translation.z += speed * delta 47 | else : 48 | translation.z += speed * delta 49 | translation.x += speed * delta 50 | movement_counter += speed * delta 51 | 52 | if open and not stop: 53 | if not audio_player.playing: 54 | audio_player.play() 55 | if mesh_instance.get_aabb().size.x > mesh_instance.get_aabb().size.z: 56 | translation.x -= speed * delta 57 | elif mesh_instance.get_aabb().size.x < mesh_instance.get_aabb().size.z: 58 | translation.z -= speed * delta 59 | else : 60 | translation.z -= speed * delta 61 | translation.x -= speed * delta 62 | movement_counter += speed * delta 63 | 64 | if movement_counter > mesh_instance.get_aabb().size.x + 0.1 and movement_counter > mesh_instance.get_aabb().size.z + 0.1: 65 | audio_player.stop() 66 | movement_counter = 0 67 | stop = true 68 | 69 | func timeout(): 70 | stop = not stop 71 | open = not open 72 | 73 | func use(): 74 | if stop and not open: 75 | open = not open 76 | stop = not stop 77 | timer.start() 78 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Enemy_Melee_Weapon.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | export var damage:float = 75 3 | export var toxic = false 4 | onready var raycast:RayCast = $RayCast 5 | export var velocity_booster = false 6 | 7 | 8 | func AI_shoot()->void : 9 | if raycast.is_colliding(): 10 | if raycast.get_collider().name == "Player": 11 | if velocity_booster: 12 | Global.player.player_velocity -= (global_transform.origin - Vector3.UP * 0.5 - Global.player.global_transform.origin).normalized() * damage 13 | 14 | var collider = raycast.get_collider() 15 | raycast.force_raycast_update() 16 | 17 | if toxic and collider.has_method("set_toxic"): 18 | collider.set_toxic() 19 | 20 | if collider.has_method("damage"): 21 | collider.damage(damage, Vector3(0, 0, 0), Vector3(0, 0, 0), global_transform.origin) 22 | raycast.enabled = false 23 | 24 | if is_instance_valid($Attack_Sound) and not $Attack_Sound.playing: 25 | $Attack_Sound.play() 26 | 27 | get_parent().get_parent().anim_player.play("Attack", - 1, 2) 28 | yield (get_tree().create_timer(0.5), "timeout") 29 | raycast.enabled = true 30 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Exit.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | func _ready(): 4 | connect("body_entered", self, "_on_Body_entered") 5 | 6 | func _on_Body_entered(body): 7 | if body.name == "Player" and $"/root/Global".objective_complete: 8 | Global.level_finished() 9 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Fishing_Hook.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var velocity = Vector3.ZERO 4 | var GRAVITY = 22 5 | var parent_weapon 6 | var active = false 7 | var fish_caught = false 8 | var current_fish 9 | var rand_fish 10 | var toilet = false 11 | var distance 12 | var return_fish = false 13 | var finished = false 14 | var water = false 15 | onready var fishtimer = Timer.new() 16 | onready var catchtimer = Timer.new() 17 | 18 | 19 | 20 | var collided = false 21 | var fish_index = 0 22 | onready var raycast:RayCast = $RayCast 23 | 24 | func _ready(): 25 | fishtimer.connect("timeout", self, "fish_timeout") 26 | catchtimer.connect("timeout", self, "catch_timeout") 27 | catchtimer.one_shot = true 28 | fishtimer.wait_time = 1 29 | add_child(fishtimer) 30 | add_child(catchtimer) 31 | 32 | func _physics_process(delta): 33 | distance = global_transform.origin.distance_to(Global.player.global_transform.origin) 34 | distance = clamp(distance, 0, 50) 35 | if not collided and not return_fish: 36 | velocity.y -= GRAVITY * delta 37 | var collision = move_and_collide(velocity * delta) 38 | if collision: 39 | if collision.collider.get_collision_layer_bit(3): 40 | collision.collider.soul.add_velocity( - 50, (Global.player.global_transform.origin + Vector3(0, 2, 0) - global_transform.origin).normalized()) 41 | if collision.collider.get_collision_layer_bit(2): 42 | collision.collider.remove_weapon() 43 | Global.player.weapon.fishing_hook = null 44 | queue_free() 45 | elif return_fish: 46 | velocity = - (global_transform.origin - (Global.player.global_transform.origin + Vector3.UP * 1.5)).normalized() * (distance + 2) 47 | global_transform.origin += velocity * delta 48 | rotation.y += delta * 10 49 | if global_transform.origin.distance_to(Global.player.global_transform.origin + Vector3.UP * 1.5) < 1 and not finished: 50 | finished = true 51 | 52 | 53 | 54 | 55 | if Global.STOCKS.FISH_FOUND.find(current_fish.ticker) == - 1: 56 | Global.STOCKS.FISH_FOUND.append(current_fish.ticker) 57 | Global.player.UI.notify("Price: $" + str(current_fish.price), Color(1, 1, 0)) 58 | 59 | Global.player.UI.notify(current_fish.s_name + " obtained!", Color(0.8, 0.9, 1)) 60 | Global.STOCKS.save_stocks("user://stocks.save") 61 | current_fish.owned += 1 62 | Global.player.weapon.fishing_hook = null 63 | queue_free() 64 | return 65 | raycast.cast_to.y = velocity.y * delta 66 | raycast.force_raycast_update() 67 | if (raycast.is_colliding() or water) and not return_fish: 68 | if active: 69 | return 70 | if raycast.is_colliding(): 71 | 72 | 73 | global_transform.origin = raycast.get_collision_point() 74 | collided = true 75 | if not active: 76 | fishtimer.start() 77 | active = true 78 | 79 | velocity = Vector3.ZERO 80 | 81 | func catch_timeout(): 82 | if return_fish:return 83 | fish_caught = false 84 | $Fish.FISH[fish_index].hide() 85 | 86 | func set_water(value): 87 | water = value 88 | 89 | func fish_timeout(): 90 | var time = OS.get_time().hour 91 | if fish_caught: 92 | return 93 | fish_index = 0 94 | var index_found = false 95 | if rand_range(0, 100) > 50: 96 | if not toilet: 97 | rand_fish = Global.STOCKS.POSSIBLE_FISH[Global.CURRENT_LEVEL][randi() % Global.STOCKS.POSSIBLE_FISH[Global.CURRENT_LEVEL].size()] 98 | else : 99 | rand_fish = Global.STOCKS.TOILET_FISH[randi() % Global.STOCKS.TOILET_FISH.size()] 100 | toilet = false 101 | for fish in Global.STOCKS.stocks: 102 | if fish.asset_type == "fish": 103 | 104 | if fish.ticker == rand_fish: 105 | current_fish = fish 106 | index_found = true 107 | var chnc = fish.fish_chance + distance * 0.1 108 | if Global.rain: 109 | chnc += 5 110 | if Global.implants.head_implant.fishing_bonus: 111 | chnc += 3.5 112 | if rand_range(0, 100) > chnc: 113 | return 114 | if fish.fish_night and not (time < 6 or time > 21): 115 | return 116 | if fish.fish_rain and not Global.rain: 117 | return 118 | if fish.fish_hell and not Global.hope_discarded: 119 | return 120 | elif fish.ticker != rand_fish and not index_found: 121 | fish_index += 1 122 | fish_caught = true 123 | $Sound2.play() 124 | $Particles.emitting = true 125 | $Fish.FISH[fish_index].show() 126 | catchtimer.start(current_fish.fish_speed + distance * 0.002) 127 | 128 | 129 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Grill.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | func _on_Area_body_entered(body): 20 | if body.has_method("set_grill"): 21 | body.set_grill(true) 22 | 23 | 24 | func _on_Area_body_exited(body): 25 | if body.has_method("set_grill"): 26 | body.set_grill(false) 27 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Item_Slotmachine.gd: -------------------------------------------------------------------------------- 1 | extends StaticBody 2 | 3 | 4 | 5 | 6 | 7 | var rotation_counter = - 1 8 | var coin = preload("res://Entities/Physics_Objects/Coin.tscn") 9 | var junk_items:Array = [preload("res://Entities/Physics_Objects/Chest_Gib.tscn"), 10 | preload("res://Entities/Physics_Objects/Head_Gib.tscn"), 11 | preload("res://Entities/Props/Plant_1.tscn"), 12 | preload("res://Entities/Props/Trashcan.tscn"), 13 | preload("res://Entities/Props/Monitor.tscn")] 14 | 15 | 16 | func _ready(): 17 | pass 18 | 19 | func _physics_process(delta): 20 | if rotation_counter >= 0: 21 | rotation_counter -= 1 22 | if not $Audio.playing: 23 | $Audio.play() 24 | $MeshInstance2.rotation.x += 1 25 | if rotation_counter == 0: 26 | randomize() 27 | if randi() % 1000 == 500: 28 | spawn_item() 29 | elif randi() % 10 == 1: 30 | spawn_item() 31 | elif randi() % 2 == 1: 32 | spawn_item() 33 | else : 34 | Global.player.UI.notify("You lose", Color(1, 0, 0)) 35 | 36 | 37 | 38 | func spawn_item(): 39 | var new_coin = junk_items[randi() % junk_items.size()].instance() 40 | add_child(new_coin) 41 | new_coin.global_transform.origin = $Position3D.global_transform.origin 42 | new_coin.damage(20, (global_transform.origin - ($Forward_Position.global_transform.origin + Vector3(rand_range( - 0.1, 0.1), rand_range( - 0.1, 0.1), rand_range( - 0.1, 0.1)))).normalized(), global_transform.origin, Vector3.ZERO) 43 | func player_use(): 44 | if rotation_counter >= 0: 45 | return 46 | if Global.money < 10: 47 | Global.player.UI.notify("$10 required to play", Color(1, 0, 0)) 48 | return 49 | Global.money -= 10 50 | rotation_counter = 50 51 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Kinematic_Physics_Object_Environment.gd: -------------------------------------------------------------------------------- 1 | extends "res://Scripts/Kinematic_Physics_Object.gd" 2 | 3 | var sound 4 | var no_rotation = true 5 | 6 | func _ready(): 7 | particle = false 8 | collidable = true 9 | rotate_b = false 10 | stay_active = true 11 | mass = 10 12 | set_collision_layer_bit(0, 1) 13 | set_collision_layer_bit(8, 1) 14 | sound = AudioStreamPlayer3D.new() 15 | add_child(sound) 16 | sound.global_transform.origin = global_transform.origin 17 | sound.stream = load("res://Sfx/footstep.wav") 18 | impact_sound = [sound] 19 | sounds = true 20 | set_safe_margin(1e-06) 21 | no_rot = true 22 | func _physics_process(delta): 23 | alerter = false 24 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Ladder.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | func _ready(): 4 | connect("body_entered", self, "_on_Area_body_entered") 5 | connect("body_exited", self, "_on_Area_body_exited") 6 | set_collision_layer_bit(0, 1) 7 | 8 | 9 | func _on_Area_body_entered(body): 10 | if body.has_method("set_ladder"): 11 | body.set_ladder(true) 12 | 13 | func _on_Area_body_exited(body): 14 | if body.has_method("set_ladder"): 15 | body.set_ladder(false) 16 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Level_Painting.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | export var level_index = 13 4 | export var level_name = "Darkworld" 5 | 6 | func _ready(): 7 | var new_mat = $level_painting / Cube.mesh.surface_get_material(1).duplicate() 8 | new_mat.albedo_texture = Global.LEVEL_IMAGES[level_index] 9 | $level_painting / Cube.set_surface_material(1, new_mat) 10 | 11 | func _on_Area_body_entered(body): 12 | if body == Global.player: 13 | if Global.BONUS_UNLOCK.find(level_name) == - 1: 14 | Global.BONUS_UNLOCK.append(level_name) 15 | Global.objectives = 0 16 | Global.objective_complete = false 17 | Global.civ_count = 0 18 | Global.enemy_count = 0 19 | Global.enemy_count_total = 0 20 | Global.civ_count_total = 0 21 | Global.save_game() 22 | Global.CURRENT_LEVEL = level_index 23 | Global.music.stream = Global.LEVEL_SONGS[level_index] 24 | Global.goto_scene(Global.LEVELS[level_index]) 25 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Locked_Door.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var PARTICLE = preload("res://Entities/Particles/Destruction_Particle.tscn") 4 | 5 | export var door_health = 100 6 | export var rotation_speed = 2 7 | var open = false 8 | var stop = true 9 | var initrot = rotation 10 | var rotation_counter = 0 11 | var mesh_instance 12 | var collision_shape 13 | var collision = false 14 | var found_overlap 15 | var type = 1 16 | var audio_player 17 | 18 | func _ready(): 19 | set_collision_layer_bit(8, 1) 20 | for child in get_children(): 21 | if child is MeshInstance: 22 | mesh_instance = child 23 | if child is CollisionShape: 24 | collision_shape = child 25 | var t = mesh_instance.transform 26 | 27 | if mesh_instance.get_aabb().size.x > mesh_instance.get_aabb().size.z: 28 | global_transform.origin.x -= mesh_instance.get_aabb().position.x 29 | global_transform.origin.z -= mesh_instance.get_aabb().position.z + mesh_instance.get_aabb().size.z * 0.5 30 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z + mesh_instance.get_aabb().size.z * 0.5)) 31 | else : 32 | global_transform.origin.x -= mesh_instance.get_aabb().position.x + mesh_instance.get_aabb().size.x * 0.5 33 | global_transform.origin.z -= mesh_instance.get_aabb().position.z 34 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x + mesh_instance.get_aabb().size.x * 0.5, 0, mesh_instance.get_aabb().position.z)) 35 | 36 | 37 | 38 | mesh_instance.transform = t 39 | collision_shape.transform = t 40 | 41 | 42 | 43 | 44 | audio_player = AudioStreamPlayer3D.new() 45 | get_parent().call_deferred("add_child", audio_player) 46 | yield (get_tree(), "idle_frame") 47 | audio_player.global_transform.origin = global_transform.origin 48 | audio_player.stream = load("res://Sfx/Environment/doorkick.wav") 49 | audio_player.unit_size = 10 50 | audio_player.unit_db = 4 51 | audio_player.max_db = 4 52 | audio_player.pitch_scale = 0.6 53 | 54 | func _physics_process(delta): 55 | if not open and not stop: 56 | rotation.y += rotation_speed * delta 57 | rotation_counter += rad2deg(rotation_speed * delta) 58 | if open and not stop: 59 | rotation.y -= rotation_speed * delta 60 | rotation_counter += rad2deg(rotation_speed * delta) 61 | if rotation_counter > 90: 62 | rotation_counter = 0 63 | stop = true 64 | 65 | 66 | 67 | 68 | 69 | func get_type(): 70 | return type; 71 | 72 | func player_use(): 73 | if Global.player.key_found: 74 | stop = not stop 75 | open = not open 76 | else : 77 | Global.player.UI.notify("The door is locked.", Color(0.6, 0.6, 0.6)) 78 | 79 | 80 | func piercing_damage(damage, collision_n, collision_p, shooter_pos): 81 | door_health -= damage 82 | if door_health <= 0: 83 | audio_player.global_transform.origin = collision_p 84 | audio_player.play() 85 | var new_particle = PARTICLE.instance() 86 | get_parent().add_child(new_particle) 87 | new_particle.global_transform.origin = collision_p 88 | new_particle.look_at(global_transform.origin + collision_n * 5, Vector3.UP) 89 | 90 | 91 | new_particle.material_override = mesh_instance.mesh.surface_get_material(0) 92 | new_particle.emitting = true 93 | queue_free() 94 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Message_Area.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | export (String, MULTILINE) var message = "N/A" 4 | export var tutorial = false 5 | func _ready(): 6 | if tutorial and Global.LEVELS_UNLOCKED > 1: 7 | queue_free() 8 | 9 | 10 | func _on_Message_Area_body_entered(body): 11 | body.UI.message(message, false) 12 | queue_free() 13 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Navigation.gd: -------------------------------------------------------------------------------- 1 | extends Navigation 2 | 3 | 4 | 5 | 6 | 7 | var map:RID 8 | 9 | 10 | func _ready(): 11 | Global.nav = setup_navserver(Global.nav) 12 | var region = NavigationServer.region_create() 13 | NavigationServer.region_set_transform(region, get_parent().transform) 14 | NavigationServer.region_set_map(region, Global.nav) 15 | 16 | 17 | var navigation_mesh = NavigationMesh.new() 18 | navigation_mesh = $NavigationMeshInstance.navmesh 19 | NavigationServer.map_set_cell_size(Global.nav, navigation_mesh.cell_size) 20 | NavigationServer.region_set_navmesh(region, navigation_mesh) 21 | 22 | 23 | 24 | 25 | func setup_navserver(gm): 26 | var i = 0 27 | if gm != null: 28 | for r in NavigationServer.map_get_regions(gm): 29 | NavigationServer.free_rid(r) 30 | NavigationServer.free_rid(gm) 31 | 32 | print(NavigationServer.get_maps().size()) 33 | map = NavigationServer.map_create() 34 | NavigationServer.map_set_up(map, Vector3.UP) 35 | NavigationServer.map_set_active(map, true) 36 | return map 37 | 38 | 39 | 40 | yield (get_tree(), "physics_frame") 41 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Night_Cycle.gd: -------------------------------------------------------------------------------- 1 | extends DirectionalLight 2 | 3 | var t = 0 4 | var time = 12 5 | onready var env:WorldEnvironment = get_parent().get_node("WorldEnvironment") 6 | var init_fog = Color(0, 0, 0) 7 | var init_energy = 1 8 | export var min_light:float = 0 9 | var init_energy_ambient:float = 1 10 | onready var audio_player:AudioStreamPlayer = AudioStreamPlayer.new() 11 | 12 | export var darkness = false 13 | 14 | export var permanight = false 15 | var init_sky_color 16 | onready var musicbus = AudioServer.get_bus_index("Music") 17 | 18 | func _ready(): 19 | if rand_range(0, 100) > 90 or Global.implants.head_implant.fishing_bonus: 20 | Global.rain = true 21 | else : 22 | Global.rain = false 23 | add_child(audio_player) 24 | audio_player.stream = load("res://Sfx/sfx100v2_thunder_02.ogg") 25 | 26 | if Global.hope_discarded: 27 | return 28 | init_energy = light_energy 29 | init_energy_ambient = env.environment.ambient_light_energy 30 | if not Global.rain: 31 | init_fog = env.environment.fog_color 32 | init_sky_color = env.environment.background_color 33 | else : 34 | if Global.CURRENT_LEVEL != Global.L_SWAMP: 35 | env.environment.fog_depth_begin = 0 36 | env.environment.fog_depth_end = 100 37 | env.environment.ambient_light_color = Color(0.6, 0.6, 0.6) 38 | init_fog = Color(0.6, 0.6, 0.6) 39 | init_sky_color = Color(0.6, 0.6, 0.6) 40 | env.environment.background_mode = 1 41 | func _physics_process(delta): 42 | if not darkness: 43 | light_energy = lerp(light_energy, init_energy, clamp(delta * 30, 0, 1)) 44 | 45 | 46 | 47 | if Global.hope_discarded: 48 | return 49 | 50 | 51 | if darkness: 52 | if Global.player.global_transform.origin.y < - 0.5: 53 | AudioServer.set_bus_volume_db(musicbus, lerp(AudioServer.get_bus_volume_db(musicbus), - 80, 0.05)) 54 | light_energy = lerp(light_energy, 0, 0.2) 55 | env.environment.ambient_light_energy = lerp(env.environment.ambient_light_energy, 0, 0.2) 56 | env.environment.fog_color = lerp(env.environment.fog_color, Color(0, 0, 0), 0.2) 57 | return 58 | elif not is_equal_approx(env.environment.ambient_light_energy, init_energy_ambient): 59 | AudioServer.set_bus_volume_db(musicbus, lerp(AudioServer.get_bus_volume_db(musicbus), Global.music_volume, 0.05)) 60 | if not Global.rain: 61 | light_energy = lerp(light_energy, init_energy, 0.2) 62 | else : 63 | light_energy = lerp(light_energy, init_energy, delta * 30) 64 | env.environment.ambient_light_energy = lerp(env.environment.ambient_light_energy, init_energy_ambient, 0.2) 65 | env.environment.fog_color = lerp(env.environment.fog_color, init_fog, 0.2) 66 | 67 | if fmod(t, 60) != 0 and t != 0: 68 | t += 1 69 | return 70 | 71 | t += 1 72 | if rand_range(0, 100) > 95 and Global.rain and not darkness: 73 | light_energy = 100 74 | var timer = Timer.new() 75 | add_child(timer) 76 | timer.connect("timeout", self, "thunder") 77 | timer.one_shot = true 78 | timer.start(2) 79 | 80 | 81 | time = OS.get_time().hour 82 | 83 | if time == 0: 84 | time = 24 85 | var t_norm = (time - 0) / (24 - 0) 86 | t_norm = wrapf(t_norm, 0, 1) 87 | var dist:float = abs(12 - time) 88 | var t_norm_light:float = (dist - 0) / (12 - 0) 89 | t_norm_light = clamp(t_norm_light, 0, 0.95) 90 | t_norm_light = 1 - t_norm_light 91 | env.environment.fog_color = Color(init_fog.r * t_norm_light, init_fog.g * t_norm_light, init_fog.b * t_norm_light) 92 | env.environment.background_color = env.environment.fog_color 93 | if not permanight: 94 | env.environment.background_energy = clamp(t_norm_light, min_light, 1) 95 | 96 | t_norm_light = clamp(t_norm_light + 0.5, 0.8, 1) 97 | light_color = Color(t_norm_light, t_norm_light, 1) 98 | 99 | 100 | 101 | 102 | t_norm = wrapf(((t_norm - 0.5) * PI * 2) - PI / 2, - PI, PI) 103 | 104 | 105 | func thunder(): 106 | audio_player.pitch_scale = 0.5 + rand_range(0, 0.5) 107 | if not audio_player.playing: 108 | audio_player.play() 109 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Pickup.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | 4 | 5 | 6 | 7 | var velocity = Vector3(0, 0, 0) 8 | var gravity = 22 9 | export var health_kit = false 10 | export var ammo_box = false 11 | export var health = 50 12 | export var shotgun_ammo = 0 13 | export var pistol_ammo = 0 14 | export var smg_ammo = 0 15 | export var rocket_ammo = 0 16 | export var particle = false 17 | export var mass = 1 18 | export var shell = false 19 | var t = 0 20 | var finished = false 21 | 22 | 23 | func _enter_tree(): 24 | queue_free() 25 | func _ready(): 26 | queue_free() 27 | t += rand_range(0, 10) 28 | 29 | 30 | 31 | func _physics_process(delta): 32 | if finished: 33 | return 34 | if not shell or t < 200: 35 | t += 1 36 | var collision = move_and_collide(velocity * delta) 37 | if collision and t < 200: 38 | velocity = velocity.bounce(collision.normal) * 0.6 39 | elif collision and t >= 200: 40 | 41 | if particle: 42 | $Particle.emitting = false 43 | $Particle.hide() 44 | finished = true 45 | velocity.y -= gravity * delta 46 | 47 | func damage(damage, collision_n, collision_p, shooter_pos): 48 | randomize() 49 | velocity -= collision_n * damage / mass 50 | 51 | 52 | func _on_Area_body_entered(body): 53 | if body.health < 100 and health_kit: 54 | body.add_health(health) 55 | queue_free() 56 | if ammo_box: 57 | body.weapon.add_ammo(pistol_ammo, 0, self) 58 | body.weapon.add_ammo(smg_ammo, 1, self) 59 | body.weapon.add_ammo(shotgun_ammo, 2, self) 60 | body.weapon.add_ammo(rocket_ammo, 3, self) 61 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Player_Manager.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | 8 | onready var player = $Player 9 | onready var cam_pos = $Position3D 10 | 11 | 12 | func _ready(): 13 | if Global.implants.head_implant.shrink: 14 | scale = Vector3(0.1, 0.1, 0.1) 15 | 16 | 17 | 18 | func _process(delta): 19 | 20 | if Input.is_action_just_pressed("Stocks"): 21 | $Stock_Menu.visible = not $Stock_Menu.visible 22 | if $Stock_Menu.visible: 23 | Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) 24 | $Position3D / Rotation_Helper / Weapon.disabled = true 25 | else : 26 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) 27 | $Position3D / Rotation_Helper / Weapon.disabled = false 28 | var offset = Vector3(0, 1.481, 0) 29 | if Global.implants.head_implant.shrink: 30 | offset *= 0.1 31 | if player.max_gravity < 0: 32 | offset = Vector3(0, 0, 0) 33 | if Engine.get_frames_per_second() <= 30: 34 | cam_pos.global_transform.origin = player.global_transform.origin + offset 35 | 36 | else : 37 | cam_pos.global_transform.origin = lerp(cam_pos.global_transform.origin, player.global_transform.origin + offset, clamp(delta * 30, 0, 1)) 38 | 39 | 40 | 41 | cam_pos.rotation.y = player.rotation.y 42 | 43 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Profane_Door.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var PARTICLE = preload("res://Entities/Particles/Destruction_Particle.tscn") 4 | 5 | export var door_health = 100 6 | export var rotation_speed = 2 7 | var open = false 8 | var stop = true 9 | var initrot = rotation 10 | var rotation_counter = 0 11 | var mesh_instance 12 | var collision_shape 13 | var collision = false 14 | var found_overlap 15 | var type = 1 16 | var audio_player 17 | 18 | func _ready(): 19 | set_collision_layer_bit(8, 1) 20 | for child in get_children(): 21 | if child is MeshInstance: 22 | mesh_instance = child 23 | if child is CollisionShape: 24 | collision_shape = child 25 | var t = mesh_instance.transform 26 | 27 | if mesh_instance.get_aabb().size.x > mesh_instance.get_aabb().size.z: 28 | global_transform.origin.x -= mesh_instance.get_aabb().position.x 29 | global_transform.origin.z -= mesh_instance.get_aabb().position.z + mesh_instance.get_aabb().size.z * 0.5 30 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z + mesh_instance.get_aabb().size.z * 0.5)) 31 | else : 32 | global_transform.origin.x -= mesh_instance.get_aabb().position.x + mesh_instance.get_aabb().size.x * 0.5 33 | global_transform.origin.z -= mesh_instance.get_aabb().position.z 34 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x + mesh_instance.get_aabb().size.x * 0.5, 0, mesh_instance.get_aabb().position.z)) 35 | 36 | 37 | 38 | mesh_instance.transform = t 39 | collision_shape.transform = t 40 | 41 | 42 | 43 | 44 | audio_player = AudioStreamPlayer3D.new() 45 | get_parent().call_deferred("add_child", audio_player) 46 | yield (get_tree(), "idle_frame") 47 | audio_player.global_transform.origin = global_transform.origin 48 | audio_player.stream = load("res://Sfx/Environment/doorkick.wav") 49 | audio_player.unit_size = 10 50 | audio_player.unit_db = 4 51 | audio_player.max_db = 4 52 | audio_player.pitch_scale = 0.6 53 | 54 | func _physics_process(delta): 55 | if not open and not stop: 56 | rotation.y += rotation_speed * delta 57 | rotation_counter += rad2deg(rotation_speed * delta) 58 | if open and not stop: 59 | rotation.y -= rotation_speed * delta 60 | rotation_counter += rad2deg(rotation_speed * delta) 61 | if rotation_counter > 90: 62 | rotation_counter = 0 63 | stop = true 64 | 65 | 66 | 67 | 68 | 69 | func get_type(): 70 | return type; 71 | 72 | func player_use(): 73 | if Global.husk_mode: 74 | stop = not stop 75 | open = not open 76 | else : 77 | Global.player.UI.notify("It repulses you.", Color(0.5, 0.5, 0)) 78 | Global.player.player_velocity -= (global_transform.origin - Global.player.global_transform.origin).normalized() * 5 79 | 80 | 81 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Pushblock.gd: -------------------------------------------------------------------------------- 1 | extends StaticBody 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | set_collision_mask_bit(0, 1) 12 | set_collision_mask_bit(1, 1) 13 | set_collision_mask_bit(4, 1) 14 | 15 | func _process(delta): 16 | var space_state = get_world().direct_space_state 17 | var result_down = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.DOWN * 1) 18 | if not result_down: 19 | translate(Vector3.DOWN * 0.1) 20 | if global_transform.origin.distance_to(Global.player.global_transform.origin) > 2: 21 | return 22 | var result_forward = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.FORWARD * 1.1) 23 | var result_back = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.BACK * 1.1) 24 | var result_left = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.LEFT * 1.1) 25 | var result_right = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.RIGHT * 1.1) 26 | 27 | if result_forward and not result_back: 28 | if result_forward.collider == Global.player: 29 | translate(Vector3.BACK * 2) 30 | 31 | if result_back and not result_forward: 32 | if result_back.collider == Global.player: 33 | translate(Vector3.FORWARD * 2) 34 | if result_left and not result_right: 35 | if result_left.collider == Global.player: 36 | translate(Vector3.RIGHT * 2) 37 | 38 | if result_right and not result_left: 39 | if result_right.collider == Global.player: 40 | translate(Vector3.LEFT * 2) 41 | if not result_down: 42 | translate(Vector3.DOWN * 0.1) 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Random_Mesh.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | if randi() % 2 == 0: 12 | get_parent().queue_free() 13 | get_child(randi() % get_child_count()).show() 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Random_Spawner.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | export (Array, String) var entities 8 | 9 | 10 | 11 | 12 | func _ready(): 13 | var new_entity = load(entities[randi() % entities.size()]).instance() 14 | get_parent().call_deferred("add_child", new_entity) 15 | new_entity.global_transform.origin = global_transform.origin 16 | queue_free() 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Randomsound.gd: -------------------------------------------------------------------------------- 1 | extends AudioStreamPlayer3D 2 | 3 | var shot_timer:float = 0 4 | var burst_timer:float = 0 5 | var burst_period:float = 100 6 | var fire_period:float = 50 7 | 8 | 9 | func _ready(): 10 | pass 11 | 12 | func _physics_process(delta): 13 | if randi() % 400 == 1 and not $Voice.playing: 14 | $Voice.play() 15 | shot_timer += 1 16 | burst_timer += rand_range(0, 2) 17 | if burst_timer > burst_period: 18 | burst_timer = 0 19 | shot_timer = 0 20 | burst_period = rand_range(50, 100) 21 | fire_period = rand_range(1, 50) 22 | if shot_timer < fire_period and fmod(shot_timer, 10) == 0: 23 | play() 24 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Reticle.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | var shot_reticle_radius = 5 3 | var min_shot_reticle_radius = 5 4 | var max_shot_reticle_radius = 30 5 | var hit_reticle_radius = 0 6 | var min_hit_reticle_radius = 0 7 | var max_hit_reticle_radius = 50 8 | var shooter_pos = Vector2.ZERO 9 | var shooter_line_length = 0 10 | var reticle_color = Color(1, 0, 0) 11 | func _ready(): 12 | max_shot_reticle_radius = get_viewport().size.y / 20 13 | max_hit_reticle_radius = get_viewport().size.y / 10 14 | 15 | func hit(): 16 | hit_reticle_radius = max_hit_reticle_radius 17 | func shoot(): 18 | shot_reticle_radius = max_shot_reticle_radius 19 | 20 | func set_shooter_pos(shotpos): 21 | shooter_line_length = 50 22 | shooter_pos = Vector2(shotpos.x, shotpos.z) 23 | func shot_line(v): 24 | var screen_center = Vector2(get_viewport().size.x / 2, get_viewport().size.y / 2) 25 | draw_line(screen_center, screen_center + v * shooter_line_length, reticle_color) 26 | 27 | func _physics_process(delta): 28 | if shooter_line_length > 0.05 or shot_reticle_radius > min_shot_reticle_radius + 0.05 or hit_reticle_radius > min_hit_reticle_radius + 0.05: 29 | update() 30 | shooter_line_length = lerp(shooter_line_length, 0, 0.2) 31 | shot_reticle_radius = lerp(shot_reticle_radius, min_shot_reticle_radius, 0.2) 32 | hit_reticle_radius = lerp(hit_reticle_radius, min_hit_reticle_radius, 0.2) 33 | 34 | func _draw(): 35 | draw_reticle() 36 | shot_line(shooter_pos) 37 | 38 | func draw_reticle(): 39 | var viewportsize = get_viewport().size 40 | draw_circle(Vector2(viewportsize.x / 2, viewportsize.y / 2), 2, reticle_color) 41 | draw_empty_circle(Vector2(viewportsize.x / 2, viewportsize.y / 2), Vector2(shot_reticle_radius, shot_reticle_radius), reticle_color, 7, false) 42 | draw_empty_circle(Vector2(viewportsize.x / 2, viewportsize.y / 2), Vector2(0, hit_reticle_radius), Color(0, 1, 0), 2, false) 43 | draw_empty_circle(Vector2(viewportsize.x / 2, viewportsize.y / 2), Vector2(hit_reticle_radius, 0), Color(0, 1, 0), 2, false) 44 | 45 | 46 | 47 | 48 | func draw_empty_circle(circle_center, circle_radius, color, resolution, to_center): 49 | var draw_counter = 1 50 | var line_origin = Vector2() 51 | var line_end = Vector2() 52 | line_origin = circle_center + circle_radius 53 | 54 | for line in range(resolution): 55 | line_end = circle_radius.rotated(deg2rad(draw_counter)) + circle_center 56 | draw_line(line_origin, line_end, color) 57 | if to_center: 58 | draw_line(line_origin, get_viewport().size * 0.5, reticle_color) 59 | draw_counter += 360 / resolution 60 | line_origin = line_end 61 | line_end = circle_radius.rotated(deg2rad(resolution)) + circle_center 62 | line_end = circle_radius.rotated(deg2rad(draw_counter)) + circle_center 63 | draw_line(line_origin, line_end, color) 64 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Rotator_Y.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | export var rotation_speed:float = 1 4 | 5 | func _ready(): 6 | rotation.y += rand_range(0, TAU) 7 | func _physics_process(delta): 8 | 9 | rotation.y -= rotation_speed * delta 10 | 11 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Rotator_Y_Spatial.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | export var rotation_speed = 1 4 | 5 | func _ready(): 6 | rotation.y += rand_range(0, TAU) 7 | func _process(delta): 8 | rotation.y -= rotation_speed * delta 9 | 10 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Scope.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | var time = 0 3 | func _ready(): 4 | pass 5 | func _physics_process(delta): 6 | if not visible: 7 | return 8 | time += 1 9 | update() 10 | 11 | func _draw(): 12 | draw_line(Vector2((sin(time * 0.02) + 1 * 0.5) * get_viewport_rect().size.x, (cos(time * 0.02) + 1 * 0.5) * get_viewport_rect().size.y), Vector2(get_viewport_rect().size.x / 2, get_viewport_rect().size.y / 2), Color(1, 0, 0)) 13 | draw_line(Vector2((cos(time * 0.02) + 1 * 0.5) * get_viewport_rect().size.x, (sin(time * 0.02) + 1 * 0.5) * get_viewport_rect().size.y), Vector2(get_viewport_rect().size.x / 2, get_viewport_rect().size.y / 2), Color(1, 0, 0)) 14 | draw_line(Vector2(0, get_viewport_rect().size.y / 2), Vector2(get_viewport_rect().size.x, get_viewport_rect().size.y / 2), Color(1, 0, 0)) 15 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/SineTest.gd: -------------------------------------------------------------------------------- 1 | extends CanvasLayer 2 | 3 | onready var a = 1 4 | onready var b = 1 5 | onready var c = 1 6 | 7 | func ready(): 8 | update() 9 | 10 | func _draw(): 11 | for i in range(1000): 12 | draw_line(Vector2(a * i, b * sin(c * i)), Vector2(a * (i + 1), b * sin(c * (i + 1))), ColorN("slateblue"), 1) 13 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Slotmachine.gd: -------------------------------------------------------------------------------- 1 | extends StaticBody 2 | 3 | 4 | 5 | 6 | 7 | var rotation_counter = - 1 8 | var coin = preload("res://Entities/Physics_Objects/Coin.tscn") 9 | 10 | 11 | func _ready(): 12 | pass 13 | 14 | func _physics_process(delta): 15 | if rotation_counter >= 0: 16 | rotation_counter -= 1 17 | if not $Audio.playing: 18 | $Audio.play() 19 | $MeshInstance2.rotation.x += 1 20 | if rotation_counter == 0: 21 | randomize() 22 | if randi() % 1000 == 500: 23 | Global.player.UI.notify("You win $1000!", Color(1, 0, 1)) 24 | spawn_coins(100) 25 | elif randi() % 10 == 1: 26 | Global.player.UI.notify("You win $100!", Color(0, 1, 0)) 27 | spawn_coins(10) 28 | elif randi() % 2 == 1: 29 | Global.player.UI.notify("You win $10!", Color(0, 1, 0)) 30 | spawn_coins(1) 31 | else : 32 | Global.player.UI.notify("You lose", Color(1, 0, 0)) 33 | 34 | 35 | 36 | func spawn_coins(amount): 37 | for i in range(amount): 38 | var new_coin = coin.instance() 39 | add_child(new_coin) 40 | new_coin.global_transform.origin = $Position3D.global_transform.origin 41 | new_coin.damage(20, (global_transform.origin - ($Forward_Position.global_transform.origin + Vector3(rand_range( - 0.1, 0.1), rand_range( - 0.1, 0.1), rand_range( - 0.1, 0.1)))).normalized(), global_transform.origin, Vector3.ZERO) 42 | yield (get_tree(), "idle_frame") 43 | yield (get_tree(), "idle_frame") 44 | func player_use(): 45 | if rotation_counter >= 0: 46 | return 47 | if Global.money < 10: 48 | Global.player.UI.notify("$10 required to play", Color(1, 1, 1)) 49 | return 50 | Global.money -= 10 51 | rotation_counter = 50 52 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Sniper_Ray.gd: -------------------------------------------------------------------------------- 1 | extends RayCast 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | func _process(delta): 14 | look_at(Global.player.global_transform.origin + Vector3.UP * 1.2, Vector3.UP) 15 | if is_colliding(): 16 | if get_collider() == Global.player: 17 | $MeshInstance.show() 18 | else : 19 | $MeshInstance.hide() 20 | else : 21 | $MeshInstance.hide() 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Soul_Restorer.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | var a = 0.01 8 | var f = 0.05 9 | var t = 0 10 | var material 11 | 12 | 13 | func _ready(): 14 | if Global.soul_intact: 15 | queue_free() 16 | material = $MeshInstance.material_override 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | func _process(delta): 25 | t += 1 26 | rotation.y += 0.01 27 | global_transform.origin.y += sin(t * f) * a 28 | material.normal_scale = cos(t * 0.05) + 1 29 | material.emission_energy = sin(t * 0.05) * 0.5 + 1 30 | 31 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Special_Destroy.gd: -------------------------------------------------------------------------------- 1 | extends StaticBody 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | func special_destroy(): 18 | queue_free() 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Special_Pushblock.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | set_collision_mask_bit(0, 1) 12 | set_collision_mask_bit(1, 1) 13 | set_safe_margin(0) 14 | func _process(delta): 15 | var space_state = get_world().direct_space_state 16 | var result_forward = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.FORWARD * 1.1) 17 | var result_back = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.BACK * 1.1) 18 | var result_left = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.LEFT * 1.1) 19 | var result_right = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.RIGHT * 1.1) 20 | var result_down = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.DOWN * 1) 21 | if result_forward and not result_back: 22 | if result_forward.collider == Global.player: 23 | translate(Vector3.BACK * 2) 24 | 25 | if result_back and not result_forward: 26 | if result_back.collider == Global.player: 27 | translate(Vector3.FORWARD * 2) 28 | if result_left and not result_right: 29 | if result_left.collider == Global.player: 30 | translate(Vector3.RIGHT * 2) 31 | 32 | if result_right and not result_left: 33 | if result_right.collider == Global.player: 34 | translate(Vector3.LEFT * 2) 35 | if not result_down: 36 | translate(Vector3.DOWN * 0.1) 37 | if result_down: 38 | if result_down.collider.has_method("special_destroy"): 39 | result_down.collider.special_destroy() 40 | queue_free() 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Toxic_Water.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | func _ready(): 4 | connect("body_entered", self, "_on_Area_body_entered") 5 | connect("body_exited", self, "_on_Area_body_exited") 6 | set_collision_layer_bit(5, 1) 7 | set_collision_mask_bit(3, 1) 8 | set_collision_layer_bit(0, 0) 9 | set_collision_mask_bit(6, 1) 10 | 11 | func _on_Area_body_entered(body): 12 | if body.has_method("set_toxic"): 13 | body.set_toxic() 14 | if body.has_method("set_water"): 15 | body.set_water(true) 16 | 17 | func _on_Area_body_exited(body): 18 | if body.has_method("set_water"): 19 | body.set_water(false) 20 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Tutorial_Exit.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | func player_use(): 4 | Global.objectives = 0 5 | Global.objective_complete = false 6 | Global.civ_count = 0 7 | Global.enemy_count = 0 8 | Global.enemy_count_total = 0 9 | Global.civ_count_total = 0 10 | Global.save_game() 11 | Global.menu.in_game = false 12 | Global.goto_scene("res://Menu/Main_Menu.tscn") 13 | Global.menu.show() 14 | Global.menu._on_Start_Button_Pressed(0, Global.menu.menu[0].get_child(0)) 15 | Global.menu.hide_buttons(Global.menu.menu[Global.menu.START], 2, 4) 16 | Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) 17 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Water.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | func _ready(): 4 | 5 | 6 | connect("body_entered", self, "_on_Area_body_entered") 7 | connect("body_exited", self, "_on_Area_body_exited") 8 | connect("area_entered", self, "area_entered") 9 | set_collision_layer_bit(5, 1) 10 | set_collision_mask_bit(3, 1) 11 | set_collision_layer_bit(0, 0) 12 | set_collision_mask_bit(6, 1) 13 | set_collision_mask_bit(10, 1) 14 | yield (get_tree(), "idle_frame") 15 | if Global.hope_discarded: 16 | var toxic_mat = load("res://Maps/textures/swamp/swampwater1.tres") 17 | var meshes:Array 18 | for child in get_children(): 19 | if child.get_class() == "MeshInstance": 20 | meshes.append(child) 21 | if meshes != null: 22 | for mesh in meshes: 23 | mesh.material_override = toxic_mat 24 | 25 | func _on_Area_body_entered(body): 26 | if body.has_method("set_toxic") and Global.hope_discarded: 27 | body.set_toxic() 28 | if body.has_method("set_water"): 29 | body.set_water(true) 30 | 31 | func _on_Area_body_exited(body): 32 | if body.has_method("set_water"): 33 | body.set_water(false) 34 | func area_entered(area): 35 | if area.has_method("set_water"): 36 | area.set_water(true) 37 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Weapon_Pickup.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | export var weapon_index = 1 4 | var gun_pickup = preload("res://Entities/Objects/Gun_Pickup.tscn") 5 | var t = 0 6 | 7 | func _ready(): 8 | queue_free() 9 | 10 | func _physics_process(delta): 11 | t += 1 12 | rotation.y += 3 * delta 13 | transform.origin.y += sin(t * 1.5 * delta) * 0.003 14 | 15 | 16 | func use(): 17 | if Global.player.weapon.current_weapon == weapon_index: 18 | return 19 | var last_weapon = Global.player.weapon.current_weapon 20 | Global.player.weapon.set_weapon(weapon_index) 21 | var new_gun_pickup = gun_pickup.instance() 22 | get_parent().add_child(new_gun_pickup) 23 | new_gun_pickup.global_transform.origin = global_transform.origin + Vector3(0, 0.5, 0) 24 | new_gun_pickup.gun.MESH[new_gun_pickup.gun.current_weapon].hide() 25 | new_gun_pickup.gun.MESH[weapon_index].hide() 26 | new_gun_pickup.gun.current_weapon = last_weapon 27 | new_gun_pickup.gun.MESH[last_weapon].show() 28 | 29 | queue_free() 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/Weapon_Slotmachine.gd: -------------------------------------------------------------------------------- 1 | extends StaticBody 2 | 3 | 4 | 5 | 6 | 7 | var rotation_counter = - 1 8 | var coin = preload("res://Entities/Physics_Objects/Coin.tscn") 9 | var junk_items:Array = [preload("res://Entities/Physics_Objects/Chest_Gib.tscn"), 10 | preload("res://Entities/Physics_Objects/Head_Gib.tscn"), 11 | preload("res://Entities/Props/Plant_1.tscn"), 12 | preload("res://Entities/Props/Trashcan.tscn"), 13 | preload("res://Entities/Props/Monitor.tscn")] 14 | var weapon_drop = preload("res://Entities/Objects/Gun_Pickup.tscn") 15 | var weapon_indexes:Array = [[0, 1, 4, 7, 9], [2, 5, 6, 8, 12, 13, 17], [18]] 16 | var wep = 0 17 | 18 | func _ready(): 19 | pass 20 | 21 | func _physics_process(delta): 22 | if rotation_counter >= 0: 23 | rotation_counter -= 1 24 | if not $Audio.playing: 25 | $Audio.play() 26 | $MeshInstance2.rotation.x += 1 27 | if rotation_counter == 0: 28 | randomize() 29 | if randi() % 500 == 5: 30 | spawn_item() 31 | wep = 2 32 | elif randi() % 10 == 1: 33 | spawn_item() 34 | wep = 1 35 | elif randi() % 2 == 1: 36 | spawn_item() 37 | wep = 0 38 | else : 39 | Global.player.UI.notify("You lose", Color(1, 0, 0)) 40 | 41 | 42 | 43 | func spawn_item(): 44 | var new_weapon_drop = weapon_drop.instance() 45 | get_parent().add_child(new_weapon_drop) 46 | new_weapon_drop.gun.MESH[new_weapon_drop.gun.current_weapon].hide() 47 | new_weapon_drop.gun.current_weapon = weapon_indexes[wep][randi() % weapon_indexes[wep].size()] 48 | new_weapon_drop.gun.ammo = Global.player.weapon.MAX_MAG_AMMO[new_weapon_drop.gun.current_weapon] 49 | new_weapon_drop.gun.MESH[new_weapon_drop.gun.current_weapon].show() 50 | new_weapon_drop.global_transform.origin = $Position3D.global_transform.origin 51 | new_weapon_drop.damage(5, (global_transform.origin - ($Forward_Position.global_transform.origin + Vector3(rand_range( - 0.1, 0.1), rand_range( - 0.1, 0.1), rand_range( - 0.1, 0.1)))).normalized(), global_transform.origin, Vector3.ZERO) 52 | 53 | func player_use(): 54 | if rotation_counter >= 0: 55 | return 56 | if Global.money < 10: 57 | Global.player.UI.notify("$10 required to play", Color(1, 0, 0)) 58 | return 59 | Global.money -= 10 60 | rotation_counter = 50 61 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/abraxas.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | var t = 0 4 | onready var torus = $"Armature/Skeleton/BoneAttachment 2/Torus" 5 | onready var head = $Armature / Skeleton / BoneAttachment / Head 6 | onready var anim = $AnimationPlayer 7 | onready var laser = $"Armature/Skeleton/BoneAttachment 4/Right_Tail" 8 | onready var rocket = $"Armature/Skeleton/BoneAttachment 3/Left_Tail" 9 | const SPAWNS:Array = [preload("res://Entities/Enemies/E_Grunt_Meltdown.tscn"), preload("res://Entities/Enemies/E_Civilian_Meltdown.tscn"), preload("res://Entities/Enemies/E_Knifelord.tscn")] 10 | var head_disabled = false 11 | var enemy_spawn_frequency = 200 12 | var kill_flag = false 13 | var activated = false 14 | 15 | func _ready(): 16 | Global.objectives += 1 17 | 18 | func _process(delta): 19 | torus.rotate_object_local(Vector3.BACK, deg2rad(1)) 20 | 21 | func _physics_process(delta): 22 | t += 1 23 | if not activated and fmod(t, 20) == 0: 24 | var space = get_world().direct_space_state 25 | var result = space.intersect_ray(head.global_transform.origin, Global.player.global_transform.origin + Vector3.UP * 0.5, [self, head]) 26 | if result: 27 | if result.collider == Global.player: 28 | activated = true 29 | head.active = true 30 | return 31 | if not activated: 32 | return 33 | if head.destroyed and laser.destroyed and rocket.destroyed and not kill_flag: 34 | kill_flag = true 35 | anim.play("Die") 36 | Global.remove_objective() 37 | elif not kill_flag: 38 | anim.play("Idle") 39 | 40 | if laser.destroyed or rocket.destroyed: 41 | enemy_spawn_frequency = 150 42 | if laser.destroyed and rocket.destroyed: 43 | enemy_spawn_frequency = 100 44 | if rocket.destroyed or head.destroyed: 45 | laser.disabled = false 46 | if head.destroyed and laser.destroyed: 47 | rocket.frequency = 20 48 | if head.destroyed and rocket.destroyed: 49 | laser.follow_speed = 0.1 50 | elif fmod(t, 200) == 0: 51 | if is_instance_valid(laser): 52 | laser.disabled = not laser.disabled 53 | if laser.destroyed or head.destroyed: 54 | rocket.disabled = false 55 | elif fmod(t, 150) == 0: 56 | if is_instance_valid(rocket): 57 | rocket.disabled = not rocket.disabled 58 | 59 | if fmod(t, enemy_spawn_frequency) == 0: 60 | if head.destroyed: 61 | return 62 | var new_enemy = SPAWNS[randi() % 3].instance() 63 | get_parent().add_child(new_enemy) 64 | new_enemy.global_transform.origin = head.global_transform.origin 65 | yield (get_tree(), "idle_frame") 66 | new_enemy.add_velocity(40, (global_transform.origin - Global.player.global_transform.origin).normalized()) 67 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/crab_anim.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | var t = 0 4 | var arm_l:Array 5 | var claw_l:Array 6 | var arm_r:Array 7 | var claw_r:Array 8 | var legs_1:Array 9 | var legs_2:Array 10 | 11 | func _ready(): 12 | arm_l = [$Arm_L_1, $Arm_L_2, $Arm_L_3, $Arm_L_4, $Arm_L_5] 13 | claw_l = [$Claw_Left_L, $Claw_Left_R] 14 | arm_r = [$Arm_R_1, $Arm_R_2, $Arm_R_3, $Arm_R_4, $Arm_R_5] 15 | claw_r = [$Claw_Right_L, $Claw_Right_R] 16 | legs_1 = [$Leg_L_F, $Leg_R_B] 17 | legs_2 = [$Leg_R_F, $Leg_L_B] 18 | pass 19 | 20 | func _physics_process(delta): 21 | t += 1 22 | for arm in range(arm_l.size()): 23 | arm_l[arm].transform.origin.x = 0.764 + sin((t + arm) * 0.1) * 0.05 * arm - 0.1 24 | for claw in claw_l: 25 | claw.transform.origin.x = 0.764 + sin((t + 6) * 0.1) * 0.05 * 6 - 0.1 26 | for arm in range(arm_r.size()): 27 | arm_r[arm].transform.origin.x = - 0.779 - cos((t + arm) * 0.1) * 0.05 * arm + 0.1 28 | for claw in claw_r: 29 | claw.transform.origin.x = - 0.779 - cos((t + 6) * 0.1) * 0.05 * 6 + 0.1 30 | claw.rotation.y = sin(t * 0.1) * 0.1 31 | for leg in range(legs_1.size()): 32 | legs_1[leg].transform.origin.z = sin(t * 0.2) * 0.3 + leg - 0.6 33 | for leg in range(legs_2.size()): 34 | legs_2[leg].transform.origin.z = cos(t * 0.2) * 0.3 + leg - 0.6 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/crusher.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var t = 0 4 | var a = 1 5 | var mesh:MeshInstance 6 | var glob 7 | 8 | func _ready(): 9 | glob = global_transform.origin 10 | for child in get_children(): 11 | if child.get_class() == "MeshInstance": 12 | mesh = child 13 | a = mesh.get_aabb().size.y 14 | 15 | func _physics_process(delta): 16 | t += delta * 3 17 | global_transform.origin.y = glob.y + sin(t / a) * 0.5 * a 18 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/deathmodesetter.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | func _ready(): 4 | if Global.death: 5 | queue_free() 6 | 7 | func _physics_process(delta): 8 | if Global.death: 9 | scale = scale.linear_interpolate(Vector3.ZERO, 0.2) 10 | 11 | func player_use(): 12 | Global.death = true 13 | Global.player.UI.health_texture.texture = Global.player.UI.DEATH 14 | Global.save_game() 15 | $CollisionShape.disabled = true 16 | $AudioStreamPlayer.play() 17 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/down_door.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | export var door_health = 100 4 | export var speed = 2 5 | var open = false 6 | var stop = true 7 | var initrot = rotation 8 | var movement_counter = 0 9 | var mesh_instance 10 | var collision_shape 11 | var collision = false 12 | var found_overlap 13 | var sfx = preload("res://Sfx/Environment/door_concrete.wav") 14 | var audio_player:AudioStreamPlayer3D 15 | var timer:Timer 16 | func _ready(): 17 | timer = Timer.new() 18 | add_child(timer) 19 | timer.wait_time = 5 20 | timer.one_shot = true 21 | timer.connect("timeout", self, "timeout") 22 | set_collision_layer_bit(8, 1) 23 | audio_player = AudioStreamPlayer3D.new() 24 | audio_player.stream = sfx 25 | add_child(audio_player) 26 | for child in get_children(): 27 | if child is MeshInstance: 28 | mesh_instance = child 29 | if child is CollisionShape: 30 | collision_shape = child 31 | var t = mesh_instance.transform 32 | global_transform.origin.x -= mesh_instance.get_aabb().position.x 33 | global_transform.origin.z -= mesh_instance.get_aabb().position.z 34 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z)) 35 | mesh_instance.transform = t 36 | collision_shape.transform = t 37 | 38 | func _physics_process(delta): 39 | if not open and not stop: 40 | if not audio_player.playing: 41 | audio_player.play() 42 | translation.y += speed * delta 43 | movement_counter += speed * delta 44 | if open and not stop: 45 | if not audio_player.playing: 46 | audio_player.play() 47 | translation.y -= speed * delta 48 | movement_counter += speed * delta 49 | if movement_counter > mesh_instance.get_aabb().size.y + 0.1: 50 | audio_player.stop() 51 | movement_counter = 0 52 | stop = true 53 | 54 | func use(): 55 | if stop and not open: 56 | open = not open 57 | stop = not stop 58 | timer.start() 59 | 60 | func switch_use(): 61 | if stop and not open: 62 | open = not open 63 | stop = not stop 64 | 65 | func timeout(): 66 | stop = not stop 67 | open = not open 68 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/down_switch_door.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | export var door_health = 100 4 | export var speed = 2 5 | var open = false 6 | var stop = true 7 | var initrot = rotation 8 | var movement_counter = 0 9 | var mesh_instance 10 | var collision_shape 11 | var collision = false 12 | var found_overlap 13 | var sfx = preload("res://Sfx/Environment/door_concrete.wav") 14 | var audio_player:AudioStreamPlayer3D 15 | 16 | func _ready(): 17 | audio_player = AudioStreamPlayer3D.new() 18 | audio_player.stream = sfx 19 | add_child(audio_player) 20 | for child in get_children(): 21 | if child is MeshInstance: 22 | mesh_instance = child 23 | if child is CollisionShape: 24 | collision_shape = child 25 | var t = mesh_instance.transform 26 | global_transform.origin.x -= mesh_instance.get_aabb().position.x 27 | global_transform.origin.z -= mesh_instance.get_aabb().position.z 28 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z)) 29 | mesh_instance.transform = t 30 | collision_shape.transform = t 31 | 32 | func _physics_process(delta): 33 | if not open and not stop: 34 | if not audio_player.playing: 35 | audio_player.play() 36 | translation.y += speed * delta 37 | movement_counter += speed * delta 38 | if open and not stop: 39 | if not audio_player.playing: 40 | audio_player.play() 41 | translation.y -= speed * delta 42 | movement_counter += speed * delta 43 | if movement_counter > mesh_instance.get_aabb().size.y + 0.1: 44 | audio_player.stop() 45 | movement_counter = 0 46 | stop = true 47 | 48 | func switch_use(): 49 | if stop and not open: 50 | open = not open 51 | stop = not stop 52 | 53 | 54 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/elevator_stopper.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | func _ready(): 4 | set_collision_layer_bit(9, 1) 5 | set_collision_layer_bit(0, 0) 6 | connect("body_entered", self, "_On_Body_Entered") 7 | 8 | func _On_Body_Entered(body): 9 | if body.has_method("stop"): 10 | body.stop() 11 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/garbage_destroyer.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | var particle_node 8 | var particle = false 9 | 10 | 11 | func _ready(): 12 | connect("body_entered", self, "_on_body_entered") 13 | particle_node = get_node_or_null("Particles") 14 | if is_instance_valid(particle_node): 15 | particle = true 16 | 17 | 18 | 19 | func _on_body_entered(body): 20 | if body == get_parent() or body.get_collision_layer_bit(0) or "sound" in body: 21 | return 22 | if particle: 23 | particle_node.emitting = true 24 | if "soul" in body: 25 | body.soul.queue_free() 26 | else : 27 | body.queue_free() 28 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/godwall.gd: -------------------------------------------------------------------------------- 1 | extends StaticBody 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | if Global.resolution[0] == 640: 12 | queue_free() 13 | 14 | 15 | 16 | func _process(delta): 17 | if Global.resolution[0] == 640 or Global.implants.head_implant.holy: 18 | queue_free() 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/key.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | export var key_name = "Hotel Key" 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | func player_use(): 18 | Global.player.key_found = true 19 | Global.player.UI.notify(key_name + " picked up", Color(0, 1, 0)) 20 | get_parent().queue_free() 21 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/make_unlit.gd: -------------------------------------------------------------------------------- 1 | extends MeshInstance 2 | 3 | func _ready(): 4 | pass 5 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/material_randomizer.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | export (Array, String) var materials 8 | export var head_only = false 9 | export var cutscene = false 10 | onready var anim = $AnimationPlayer 11 | 12 | 13 | func _ready(): 14 | $Armature / Skeleton / Head_Mesh.material_override = load(materials[randi() % materials.size()]) 15 | if head_only: 16 | return 17 | $Armature / Skeleton / Torso_Mesh.material_override = load(materials[randi() % materials.size()]) 18 | 19 | 20 | 21 | func _process(delta): 22 | if not cutscene: 23 | return 24 | translate(Vector3.FORWARD * delta) 25 | anim.play("Walk") 26 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/rainmaker.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | var raindrop = preload("res://Entities/waterdrop.tscn") 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | func _process(delta): 18 | var new_raindrop = raindrop.instance() 19 | get_parent().get_parent().add_child(new_raindrop) 20 | new_raindrop.global_transform.origin = global_transform.origin + Vector3(rand_range( - 20, 20), 0, rand_range(20, 20)) 21 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/remote_destroyer.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | func _ready(): 4 | connect("body_entered", self, "_on_body_entered") 5 | set_collision_layer_bit(0, 0) 6 | set_collision_mask_bit(1, 1) 7 | 8 | func _on_body_entered(body): 9 | if body != Global.player: 10 | return 11 | var overlaps = get_overlapping_bodies() 12 | for overlap in overlaps: 13 | if overlap.has_method("destroy"): 14 | overlap.destroy(Vector3.DOWN, overlap.global_transform.origin) 15 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/scripted_anim.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | var TIMER 8 | var current_scene = 0 9 | export var walk = false 10 | export (Array, String) var ANIMS 11 | onready var anim_player = $AnimationPlayer 12 | 13 | func _ready(): 14 | Global.player = self 15 | TIMER = get_parent().get_node("Timer") 16 | if ANIMS[current_scene] != "Hide": 17 | anim_player.play(ANIMS[current_scene]) 18 | 19 | func _process(delta): 20 | current_scene = get_parent().current_scene - 1 21 | if walk: 22 | translate(Vector3.FORWARD * delta) 23 | if ANIMS.size() > current_scene: 24 | if ANIMS[current_scene] == "Delete": 25 | queue_free() 26 | return 27 | if ANIMS[current_scene] == "Hide": 28 | hide() 29 | return 30 | else : 31 | show() 32 | if ANIMS.size() > current_scene: 33 | anim_player.play(ANIMS[current_scene]) 34 | else : 35 | anim_player.play(ANIMS[ANIMS.size() - 1]) 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/speech_label.gd: -------------------------------------------------------------------------------- 1 | extends Label 2 | 3 | var speech_break = false 4 | var mouse_hover = false 5 | var speech_flag = false 6 | var alpha_sound = [ 7 | preload("res://Sfx/Voice/A.wav"), 8 | preload("res://Sfx/Voice/B.wav"), 9 | preload("res://Sfx/Voice/C.wav"), 10 | preload("res://Sfx/Voice/D.wav"), 11 | preload("res://Sfx/Voice/E.wav"), 12 | preload("res://Sfx/Voice/F.wav"), 13 | preload("res://Sfx/Voice/G.wav"), 14 | preload("res://Sfx/Voice/H.wav"), 15 | preload("res://Sfx/Voice/I.wav"), 16 | preload("res://Sfx/Voice/J.wav"), 17 | preload("res://Sfx/Voice/K.wav"), 18 | preload("res://Sfx/Voice/L.wav"), 19 | preload("res://Sfx/Voice/M.wav"), 20 | preload("res://Sfx/Voice/N.wav"), 21 | preload("res://Sfx/Voice/O.wav"), 22 | preload("res://Sfx/Voice/P.wav"), 23 | preload("res://Sfx/Voice/Q.wav"), 24 | preload("res://Sfx/Voice/R.wav"), 25 | preload("res://Sfx/Voice/S.wav"), 26 | preload("res://Sfx/Voice/T.wav"), 27 | preload("res://Sfx/Voice/U.wav"), 28 | preload("res://Sfx/Voice/V.wav"), 29 | preload("res://Sfx/Voice/W.wav"), 30 | preload("res://Sfx/Voice/X.wav"), 31 | preload("res://Sfx/Voice/Y.wav"), 32 | preload("res://Sfx/Voice/Z.wav") 33 | ] 34 | 35 | signal character_speak 36 | 37 | func _ready(): 38 | pass 39 | 40 | func list_files_in_directory(path:String, file_type:String)->Array: 41 | var files = [] 42 | var dir = Directory.new() 43 | dir.open(path) 44 | dir.list_dir_begin() 45 | while true: 46 | var file = dir.get_next() 47 | if file == "": 48 | break 49 | elif not file.begins_with(".") and file.get_extension() == file_type: 50 | files.append(path + "/" + file) 51 | return files 52 | 53 | func skip(): 54 | visible_characters = get_total_character_count() 55 | 56 | func _input(event): 57 | if event is InputEventMouseButton: 58 | if Input.is_action_just_pressed("mouse_1") and mouse_hover: 59 | skip() 60 | speech_break = true 61 | 62 | func speech(): 63 | speech_break = true 64 | 65 | visible_characters = 0 66 | for i in range(5): 67 | yield (get_tree(), "idle_frame") 68 | speech_break = false 69 | for c in text: 70 | while get_tree().paused: 71 | yield (get_tree(), "idle_frame") 72 | if speech_break: 73 | return 74 | if Global.high_performance: 75 | visible_characters += 2 76 | else : 77 | visible_characters += 1 78 | if c.ord_at(0) >= 97 and c.ord_at(0) <= 122: 79 | $AudioStreamPlayer.stream = alpha_sound[c.ord_at(0) - 97] 80 | emit_signal("character_speak") 81 | $AudioStreamPlayer.play() 82 | if c.ord_at(0) >= 65 and c.ord_at(0) <= 90: 83 | emit_signal("character_speak") 84 | $AudioStreamPlayer.stream = alpha_sound[c.ord_at(0) - 65] 85 | $AudioStreamPlayer.play() 86 | if c.ord_at(0) == 32: 87 | for i in range(3): 88 | yield (get_tree(), "idle_frame") 89 | 90 | for i in range(3): 91 | yield (get_tree(), "idle_frame") 92 | 93 | func _on_Description_mouse_entered(): 94 | mouse_hover = true 95 | 96 | set("custom_colors/default_color", Color(0, 1, 0, 1)) 97 | 98 | func _on_Description_mouse_exited(): 99 | set("custom_colors/default_color", Color(1, 0, 0, 1)) 100 | mouse_hover = false 101 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/up_objective_activated_door.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | export var door_health = 100 4 | export var speed = 2 5 | var open = false 6 | var stop = true 7 | var initrot = rotation 8 | var movement_counter = 0 9 | var mesh_instance 10 | var collision_shape 11 | var collision = false 12 | var found_overlap 13 | var sfx = preload("res://Sfx/Environment/door_concrete.wav") 14 | var audio_player:AudioStreamPlayer3D 15 | 16 | func _ready(): 17 | audio_player = AudioStreamPlayer3D.new() 18 | audio_player.stream = sfx 19 | add_child(audio_player) 20 | for child in get_children(): 21 | if child is MeshInstance: 22 | mesh_instance = child 23 | if child is CollisionShape: 24 | collision_shape = child 25 | var t = mesh_instance.transform 26 | global_transform.origin.x -= mesh_instance.get_aabb().position.x 27 | global_transform.origin.z -= mesh_instance.get_aabb().position.z 28 | t = t.translated(Vector3(mesh_instance.get_aabb().position.x, 0, mesh_instance.get_aabb().position.z)) 29 | mesh_instance.transform = t 30 | collision_shape.transform = t 31 | 32 | 33 | 34 | 35 | 36 | 37 | func _physics_process(delta): 38 | if stop and not open and Global.objective_complete: 39 | open = not open 40 | stop = not stop 41 | if not open and not stop: 42 | if not audio_player.playing: 43 | audio_player.play() 44 | translation.y += speed * delta 45 | movement_counter += speed * delta 46 | if open and not stop: 47 | if not audio_player.playing: 48 | audio_player.play() 49 | translation.y += speed * delta 50 | movement_counter += speed * delta 51 | if movement_counter > mesh_instance.get_aabb().size.y + 0.1: 52 | audio_player.stop() 53 | movement_counter = 0 54 | stop = true 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/vendingmachine.gd: -------------------------------------------------------------------------------- 1 | extends StaticBody 2 | 3 | 4 | 5 | 6 | 7 | var type = 1 8 | var items = [preload("res://Entities/Physics_Objects/can1.tscn"), preload("res://Entities/Physics_Objects/chips1.tscn")] 9 | var item_names = ["Hungry Human Soda", "Super Crunchers"] 10 | export var max_items = 10 11 | var item_count = 0 12 | var broken = false 13 | 14 | 15 | func _ready(): 16 | pass 17 | 18 | func activation(violence): 19 | if broken: 20 | return 21 | if item_count < max_items: 22 | item_count += 1 23 | var rand = randi() % items.size() 24 | var new_item = items[rand].instance() 25 | add_child(new_item) 26 | new_item.global_transform.origin = $Position3D.global_transform.origin 27 | new_item.damage(10, (global_transform.origin - $Position3D.global_transform.origin).normalized(), global_transform.origin, global_transform.origin) 28 | if not violence: 29 | Global.player.UI.notify("Purchased " + str(item_names[rand]) + " for " + "$10", Color(0, 1, 1)) 30 | 31 | 32 | 33 | func player_use(): 34 | if Global.money < 10: 35 | Global.player.UI.notify("You don't have enough money.", Color(1, 0, 0)) 36 | return 37 | if broken: 38 | Global.player.UI.notify("It's broken.", Color(1, 0, 0)) 39 | return 40 | if item_count >= max_items: 41 | Global.player.UI.notify("It's empty.", Color(1, 0, 0)) 42 | return 43 | if Global.money >= 10: 44 | Global.money -= 10 45 | 46 | activation(false) 47 | func damage(a, n, p, sp): 48 | if broken: 49 | return 50 | if randi() % 3 == 0: 51 | broken = true 52 | $AudioStreamPlayer3D.playing = false 53 | activation(true) 54 | func get_type(): 55 | return type 56 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Scripts/weapon_pickup_new.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | enum WEAPON{W_PISTOL, W_SMG, W_TRANQ, W_BLACKJACK, W_SHOTGUN, W_ROCKET_LAUNCHER, W_SNIPER, W_AR, W_SILENCED_SMG, W_NAMBU, W_GAS, W_MG3, W_AUTOSHOTGUN, W_MAUSER, W_BORE, W_MKR, W_RADIATOR, W_FLASHLIGHT, W_ZIPPY, W_AN94, W_VAG72, W_STEYR, W_DNA, W_ROD, W_FLAMETHROWER, W_SKS, W_NAILER, W_SHOCK, W_LIGHT} 3 | onready var MESH = [$Pistol_Mesh, $SMG_Mesh, $Tranq_Mesh, $Baton_Mesh, $Shotgun_Mesh, $RL_Mesh, $Sniper_Mesh, $AR_Mesh, $S_SMG_Mesh, $Nambu_Mesh, $Gas_Mesh, $MG3_Mesh, $Autoshotgun_Mesh, $Mauser_Mesh, $Bore_Mesh, $MKR_Mesh, $Rad_Mesh, $Flashlight_Mesh, $Zippy_Mesh, $AN94_Mesh, $VAG72_Mesh, $Steyr_Mesh, $DNA_Mesh, $Rod_Mesh, $FT_Mesh, $SKS_Mesh, $Nailer_Mesh, $SHOCK_Mesh, $Light_Mesh] 4 | export (WEAPON) var current_weapon = 0 5 | export var menu = false 6 | var ammo = 0 7 | 8 | 9 | func _ready(): 10 | MESH[current_weapon].show() 11 | if not menu: 12 | ammo = Global.player.weapon.MAX_MAG_AMMO[current_weapon] 13 | 14 | func player_use(): 15 | if menu: 16 | return 17 | var rot = rand_range(0, deg2rad(180)) 18 | 19 | get_parent().rotation.y = rot 20 | get_parent().rot_changed.y = rot 21 | 22 | 23 | if Global.player.weapon.current_weapon == current_weapon: 24 | if current_weapon == WEAPON.W_RADIATOR or current_weapon == WEAPON.W_BLACKJACK or current_weapon == WEAPON.W_BORE or current_weapon == WEAPON.W_FLASHLIGHT or current_weapon == WEAPON.W_ROD: 25 | return 26 | Global.player.weapon.add_ammo(ammo, current_weapon, Spatial.new()) 27 | ammo = 0 28 | return 29 | if Global.player.weapon.weapon1 == current_weapon or Global.player.weapon.weapon2 == current_weapon: 30 | return 31 | var last_weapon 32 | var last_ammo 33 | if Global.player.weapon.current_weapon != null: 34 | last_weapon = Global.player.weapon.current_weapon 35 | last_ammo = Global.player.weapon.magazine_ammo[last_weapon] 36 | else : 37 | last_weapon = null 38 | var a = ammo 39 | Global.player.weapon.magazine_ammo[current_weapon] = a 40 | Global.player.weapon.set_weapon(current_weapon) 41 | Global.player.weapon.set_UI_ammo() 42 | Global.player.weapon.player_weapon.show() 43 | MESH[current_weapon].hide() 44 | current_weapon = last_weapon 45 | if current_weapon == null: 46 | queue_free() 47 | return 48 | ammo = last_ammo 49 | MESH[current_weapon].show() 50 | 51 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Steam.gd: -------------------------------------------------------------------------------- 1 | #extends Steam 2 | extends Node 3 | 4 | 5 | 6 | 7 | 8 | func _init(): 9 | #steamInit() 10 | pass 11 | 12 | 13 | func _ready(): 14 | pass 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Switch.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | var button_audio 4 | var error_audio 5 | var overlap_exists = false 6 | 7 | func _ready(): 8 | set_collision_layer_bit(8, 1) 9 | button_audio = AudioStreamPlayer3D.new() 10 | add_child(button_audio) 11 | button_audio.global_transform.origin = global_transform.origin 12 | button_audio.unit_size = 5 13 | button_audio.unit_db = 2 14 | button_audio.pitch_scale = 0.7 15 | button_audio.stream = load("res://Sfx/Environment/Elevator_Bell.wav") 16 | error_audio = AudioStreamPlayer3D.new() 17 | add_child(error_audio) 18 | error_audio.global_transform.origin = global_transform.origin 19 | error_audio.unit_size = 5 20 | error_audio.unit_db = 2 21 | error_audio.stream = load("res://Sfx/UI/UI_selection.wav") 22 | 23 | func use(): 24 | overlap_exists = false 25 | var overlaps = get_overlapping_bodies() 26 | for overlap in overlaps: 27 | if overlap.has_method("use"): 28 | button_audio.play() 29 | overlap.use() 30 | overlap_exists = true 31 | if overlap.has_method("switch_use"): 32 | button_audio.play() 33 | overlap.switch_use() 34 | overlap_exists = true 35 | if not overlap_exists: 36 | error_audio.play() 37 | overlap_exists = false 38 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/Terror_Door.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var GIB = preload("res://Entities/Physics_Objects/Chest_Gib.tscn") 4 | 5 | export var door_health = 100 6 | export var rotation_speed = 2 7 | var open = false 8 | var stop = true 9 | var initrot = rotation 10 | var rotation_counter = 0 11 | var mesh_instance 12 | var collision_shape 13 | var collision = false 14 | var found_overlap 15 | var type = 0 16 | var audio_player 17 | 18 | func _ready(): 19 | set_collision_layer_bit(8, 1) 20 | audio_player = AudioStreamPlayer3D.new() 21 | get_parent().call_deferred("add_child", audio_player) 22 | yield (get_tree(), "idle_frame") 23 | audio_player.global_transform.origin = global_transform.origin 24 | audio_player.stream = load("res://Sfx/Flesh/gibbing_3.wav") 25 | audio_player.unit_size = 10 26 | audio_player.unit_db = 4 27 | audio_player.max_db = 4 28 | audio_player.pitch_scale = 0.6 29 | 30 | 31 | 32 | 33 | func get_type(): 34 | return type; 35 | 36 | func player_use(): 37 | if not Global.hope_discarded: 38 | Global.player.UI.notify("zvhvhivj jidv ijvdkjaeui djvhduhekj vduihkeu", Color(1, 0, 0)) 39 | else : 40 | for i in range(10): 41 | var new_gib = GIB.instance() 42 | 43 | get_parent().add_child(new_gib) 44 | new_gib.global_transform.origin = global_transform.origin 45 | new_gib.velocity = Vector3.FORWARD.rotated(Vector3.UP, rand_range( - PI, PI)) 46 | audio_player.play() 47 | queue_free() 48 | 49 | 50 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/BitmapFontCutter/cutter.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends BitmapFont 3 | 4 | var index = 0 5 | export (Vector2) var GlyphSize = Vector2(8, 8) setget changeGlyphSize 6 | var Separation = Vector2(0, 0) setget changeSeparation 7 | export (Texture) var TextureToCut = null setget changeTexture 8 | var ManualCharacterSet = false 9 | export (int, 255) var StartChar = 32 setget changeStartChar 10 | 11 | 12 | 13 | 14 | 15 | func changeStartChar(value): 16 | StartChar = value 17 | update() 18 | 19 | func changeGlyphSize(value): 20 | GlyphSize = value 21 | height = GlyphSize.y 22 | update() 23 | 24 | func changeSeparation(value): 25 | Separation = value 26 | 27 | func changeTexture(value): 28 | TextureToCut = value 29 | index = 0 30 | if TextureToCut: 31 | update() 32 | pass 33 | 34 | 35 | func update(): 36 | print("cut thing") 37 | if TextureToCut != null: 38 | if GlyphSize.x > 0 and GlyphSize.y > 0: 39 | 40 | var w = TextureToCut.get_width() 41 | var h = TextureToCut.get_height() 42 | var tx = w / GlyphSize.x 43 | var ty = h / GlyphSize.y 44 | 45 | var font = self 46 | var i = 0 47 | 48 | clear() 49 | 50 | 51 | font.add_texture(TextureToCut) 52 | font.height = GlyphSize.y 53 | for y in range(ty): 54 | for x in range(tx): 55 | 56 | 57 | 58 | 59 | var region = Rect2(x * GlyphSize.x, y * GlyphSize.y, GlyphSize.x, GlyphSize.y) 60 | font.add_char(StartChar + i, 0, region) 61 | 62 | i += 1 63 | update_changes() 64 | pass 65 | 66 | 67 | 68 | 69 | func is_empty(texture, x, y, w, h): 70 | var result = true 71 | var image = texture.get_data() 72 | image.lock() 73 | for xx in range(x, x + w): 74 | for yy in range(y, y + h): 75 | 76 | var pixel = image.get_pixel(xx, yy) 77 | if pixel.a != 0: 78 | return false 79 | 80 | image.unlock() 81 | 82 | return result 83 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/BitmapFontCutter/main.gd: -------------------------------------------------------------------------------- 1 | 2 | tool 3 | extends EditorPlugin 4 | 5 | 6 | func _enter_tree(): 7 | add_custom_type("MonospacedBitmapFont", "BitmapFont", preload("cutter.gd"), preload("icon.png")) 8 | 9 | func _exit_tree(): 10 | remove_custom_type("MonospacedBitmapFont") 11 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/decals/decal.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends MeshInstance 3 | 4 | const SHADER = preload("decal.shader") 5 | 6 | export (Texture) var decal setget set_decal 7 | export (Vector2) var uv_offset = Vector2() setget set_uv_offset 8 | export (Vector2) var uv_scale = Vector2(1, 1) setget set_uv_scale 9 | export (bool) var emulate_lighting = true setget set_emulate_lighting 10 | export (float, - 100.0, 100.0) var brightness = 0.0 setget set_brightness 11 | 12 | func _init(): 13 | mesh = CubeMesh.new() 14 | mesh.material = ShaderMaterial.new() 15 | mesh.material.shader = SHADER 16 | 17 | func set_decal(new_decal): 18 | decal = new_decal 19 | mesh.material.set_shader_param("decal", decal) 20 | 21 | func set_uv_offset(new_offset): 22 | uv_offset = new_offset 23 | mesh.material.set_shader_param("offset", uv_offset) 24 | 25 | func set_uv_scale(new_scale): 26 | uv_scale = new_scale 27 | mesh.material.set_shader_param("scale", uv_scale) 28 | 29 | func set_emulate_lighting(new_value): 30 | emulate_lighting = new_value 31 | mesh.material.set_shader_param("emulate_lighting", emulate_lighting) 32 | 33 | func set_brightness(new_brightness): 34 | brightness = new_brightness 35 | mesh.material.set_shader_param("brightness", brightness * 0.01) 36 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/decals/plugin.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends EditorPlugin 3 | 4 | func _enter_tree(): 5 | name = "DecalPlugin" 6 | add_custom_type("Decal", "MeshInstance", preload("decal.gd"), preload("icon_decal.svg")) 7 | print("Decal plugin loaded successfully.") 8 | 9 | func _exit_tree(): 10 | remove_custom_type("Decal") 11 | print("Decal plugin unloaded.") 12 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/fgd/point_classes/light.gd: -------------------------------------------------------------------------------- 1 | class_name QodotLight 2 | extends QodotEntity 3 | tool 4 | 5 | func update_properties(): 6 | for child in get_children(): 7 | remove_child(child) 8 | child.queue_free() 9 | 10 | var light_node = null 11 | 12 | if 'mangle' in properties: 13 | light_node = SpotLight.new() 14 | 15 | var yaw = properties['mangle'].x 16 | var pitch = properties['mangle'].y 17 | light_node.rotate(Vector3.UP, deg2rad(180 + yaw)) 18 | light_node.rotate(light_node.global_transform.basis.x, deg2rad(180 + pitch)) 19 | 20 | if 'angle' in properties: 21 | light_node.set_param(Light.PARAM_SPOT_ANGLE, properties['angle']) 22 | else: 23 | light_node = OmniLight.new() 24 | 25 | var light_brightness = 300 26 | if 'light' in properties: 27 | light_brightness = properties['light'] 28 | light_node.set_param(Light.PARAM_ENERGY, light_brightness / 100.0) 29 | light_node.set_param(Light.PARAM_INDIRECT_ENERGY, light_brightness / 100.0) 30 | 31 | var light_range := 1.0 32 | if 'wait' in properties: 33 | light_range = properties['wait'] 34 | 35 | var normalized_brightness = light_brightness / 300.0 36 | light_node.set_param(Light.PARAM_RANGE, 16.0 * light_range * (normalized_brightness * normalized_brightness)) 37 | 38 | var light_attenuation = 0 39 | if 'delay' in properties: 40 | light_attenuation = properties['delay'] 41 | 42 | var attenuation = 0 43 | match light_attenuation: 44 | 0: 45 | attenuation = 1.0 46 | 1: 47 | attenuation = 0.5 48 | 2: 49 | attenuation = 0.25 50 | 3: 51 | attenuation = 0.15 52 | 4: 53 | attenuation = 0 54 | 5: 55 | attenuation = 0.9 56 | _: 57 | attenuation = 1 58 | 59 | light_node.set_param(Light.PARAM_ATTENUATION, attenuation) 60 | light_node.set_shadow(true) 61 | light_node.set_bake_mode(Light.BAKE_ALL) 62 | 63 | var light_color = Color.white 64 | if '_color' in properties: 65 | light_color = properties['_color'] 66 | 67 | light_node.set_color(light_color) 68 | 69 | add_child(light_node) 70 | 71 | if is_inside_tree(): 72 | var tree = get_tree() 73 | if tree: 74 | var edited_scene_root = tree.get_edited_scene_root() 75 | if edited_scene_root: 76 | light_node.set_owner(edited_scene_root) 77 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/fgd/point_classes/physics_ball.gd: -------------------------------------------------------------------------------- 1 | class_name PhysicsBall 2 | extends PhysicsEntity 3 | tool 4 | 5 | func update_properties(): 6 | .update_properties() 7 | if 'size' in properties: 8 | $MeshInstance.mesh.radius = properties.size * 0.5 9 | $MeshInstance.mesh.height = properties.size 10 | 11 | $CollisionShape.shape.radius = properties.size * 0.5 12 | 13 | 14 | func use(): 15 | bounce() 16 | 17 | func bounce(): 18 | linear_velocity.y = 10 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/fgd/solid_classes/button.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | signal trigger() 4 | signal pressed() 5 | signal released() 6 | 7 | export(Dictionary) var properties setget set_properties 8 | 9 | var pressed = false 10 | var base_translation = Vector3.ZERO 11 | var axis := Vector3.DOWN 12 | var speed := 8.0 13 | var depth := 0.8 14 | var release_delay := 0.0 15 | var trigger_signal_delay := 0.0 16 | var press_signal_delay := 0.0 17 | var release_signal_delay := 0.0 18 | 19 | var overlaps := 0 20 | 21 | func set_properties(new_properties: Dictionary) -> void: 22 | if properties != new_properties: 23 | properties = new_properties 24 | update_properties() 25 | 26 | func update_properties() -> void: 27 | if 'axis' in properties: 28 | axis = properties.axis.normalized() 29 | 30 | if 'speed' in properties: 31 | speed = properties.depth 32 | 33 | if 'depth' in properties: 34 | depth = properties.depth.to_float() 35 | 36 | if 'release_delay' in properties: 37 | release_delay = properties.release_delay 38 | 39 | if 'trigger_signal_delay' in properties: 40 | trigger_signal_delay = properties.trigger_signal_delay 41 | 42 | if 'press_signal_delay' in properties: 43 | press_signal_delay = properties.press_signal_delay 44 | 45 | if 'release_signal_delay' in properties: 46 | release_signal_delay = properties.release_signal_delay 47 | 48 | func _init() -> void: 49 | connect("body_shape_entered", self, "body_shape_entered") 50 | connect("body_shape_exited", self, "body_shape_exited") 51 | 52 | func _enter_tree() -> void: 53 | base_translation = translation 54 | 55 | func _process(delta: float) -> void: 56 | var target_position = base_translation + (axis * (depth if pressed else 0.0)) 57 | translation = translation.linear_interpolate(target_position, speed * delta) 58 | 59 | func body_shape_entered(body_id: int, body: Node, body_shape_idx: int, self_shape_idx: int) -> void: 60 | if body is StaticBody: 61 | return 62 | 63 | if overlaps == 0: 64 | press() 65 | 66 | overlaps += 1 67 | 68 | func body_shape_exited(body_id: int, body: Node, body_shape_idx: int, self_shape_idx: int) -> void: 69 | if body is StaticBody: 70 | return 71 | 72 | overlaps -= 1 73 | if overlaps == 0: 74 | if release_delay == 0: 75 | release() 76 | elif release_delay > 0: 77 | yield(get_tree().create_timer(release_delay), "timeout") 78 | release() 79 | 80 | func press() -> void: 81 | if pressed: 82 | return 83 | 84 | pressed = true 85 | 86 | emit_trigger() 87 | emit_pressed() 88 | 89 | func emit_trigger() -> void: 90 | yield(get_tree().create_timer(trigger_signal_delay), "timeout") 91 | emit_signal("trigger") 92 | 93 | func emit_pressed() -> void: 94 | yield(get_tree().create_timer(press_signal_delay), "timeout") 95 | emit_signal("pressed") 96 | 97 | func release() -> void: 98 | if not pressed: 99 | return 100 | 101 | pressed = false 102 | 103 | yield(get_tree().create_timer(release_signal_delay), "timeout") 104 | emit_signal("released") 105 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/fgd/solid_classes/mover.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | export(Dictionary) var properties setget set_properties 4 | 5 | var base_transform: Transform 6 | var offset_transform: Transform 7 | var target_transform: Transform 8 | 9 | var speed := 1.0 10 | 11 | func set_properties(new_properties: Dictionary) -> void: 12 | if properties != new_properties: 13 | properties = new_properties 14 | update_properties() 15 | 16 | func update_properties() -> void: 17 | if 'translation' in properties: 18 | offset_transform.origin = properties.translation 19 | 20 | if 'rotation' in properties: 21 | offset_transform.basis = offset_transform.basis.rotated(Vector3.RIGHT, properties.rotation.x) 22 | offset_transform.basis = offset_transform.basis.rotated(Vector3.UP, properties.rotation.y) 23 | offset_transform.basis = offset_transform.basis.rotated(Vector3.FORWARD, properties.rotation.z) 24 | 25 | if 'scale' in properties: 26 | offset_transform.basis = offset_transform.basis.scaled(properties.scale) 27 | 28 | if 'speed' in properties: 29 | speed = properties.speed 30 | 31 | func _process(delta: float) -> void: 32 | transform = transform.interpolate_with(target_transform, speed * delta) 33 | 34 | func _init() -> void: 35 | base_transform = transform 36 | target_transform = base_transform 37 | 38 | func use() -> void: 39 | play_motion() 40 | 41 | func play_motion() -> void: 42 | target_transform = base_transform * offset_transform 43 | 44 | func reverse_motion() -> void: 45 | target_transform = base_transform 46 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/fgd/solid_classes/physics.gd: -------------------------------------------------------------------------------- 1 | class_name PhysicsEntity 2 | extends RigidBody 3 | tool 4 | 5 | export(Dictionary) var properties setget set_properties 6 | 7 | func set_properties(new_properties : Dictionary) -> void: 8 | if(properties != new_properties): 9 | properties = new_properties 10 | update_properties() 11 | 12 | func update_properties(): 13 | if 'velocity' in properties: 14 | linear_velocity = properties['velocity'] 15 | 16 | if 'mass' in properties: 17 | mass = properties.mass 18 | 19 | 20 | func use(): 21 | bounce() 22 | 23 | func bounce(): 24 | linear_velocity.y = 10 25 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/fgd/solid_classes/rotate.gd: -------------------------------------------------------------------------------- 1 | class_name QodotRotateEntity 2 | extends KinematicBody 3 | 4 | export(Dictionary) var properties setget set_properties 5 | 6 | var rotate_axis := Vector3.UP 7 | var rotate_speed := 360.0 8 | 9 | func set_properties(new_properties : Dictionary) -> void: 10 | if(properties != new_properties): 11 | properties = new_properties 12 | update_properties() 13 | 14 | func update_properties(): 15 | if 'axis' in properties: 16 | rotate_axis = properties['axis'] 17 | 18 | if 'speed' in properties: 19 | rotate_speed = properties['speed'] 20 | 21 | func _ready() -> void: 22 | update_properties() 23 | 24 | func _process(delta: float) -> void: 25 | rotate(rotate_axis, deg2rad(rotate_speed * delta)) 26 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/fgd/solid_classes/trigger.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | signal trigger() 4 | 5 | func _ready(): 6 | connect("body_entered", self, "handle_body_entered") 7 | 8 | func handle_body_entered(body: Node): 9 | if body is StaticBody: 10 | return 11 | 12 | emit_signal("trigger") 13 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/worldspawn_layers/liquid.gd: -------------------------------------------------------------------------------- 1 | class_name LiquidLayer 2 | extends Area 3 | 4 | export(float) var buoyancy_factor = 10.0 5 | export(float) var lateral_damping_factor = 0.0 6 | export(float) var vertical_damping_factor = 0.0 7 | 8 | var buoyancy_dict := {} 9 | 10 | func _init() -> void: 11 | connect("body_shape_entered", self, "body_shape_entered") 12 | connect("body_shape_exited", self, "body_shape_exited") 13 | 14 | func body_shape_entered(body_id: int, body: Node, body_shape_idx: int, self_shape_idx: int) -> void: 15 | if not body is RigidBody: 16 | return 17 | 18 | var self_collision_shape = shape_owner_get_owner(shape_find_owner(self_shape_idx)) 19 | var body_collision_shape = body.shape_owner_get_owner(body.shape_find_owner(body_shape_idx)) 20 | 21 | var self_shape = self_collision_shape.get_shape() 22 | var body_shape = body_collision_shape.get_shape() 23 | 24 | var self_aabb = create_shape_aabb(self_shape) 25 | var body_aabb = create_shape_aabb(body_shape) 26 | 27 | buoyancy_dict[body] = { 28 | 'entry_point': body.global_transform.origin, 29 | 'self_aabb': self_aabb, 30 | 'body_aabb': body_aabb 31 | } 32 | 33 | func create_shape_aabb(shape: Shape) -> AABB: 34 | if shape is ConvexPolygonShape: 35 | return create_convex_aabb(shape) 36 | elif shape is SphereShape: 37 | return create_sphere_aabb(shape) 38 | 39 | return AABB() 40 | 41 | func create_convex_aabb(convex_shape: ConvexPolygonShape) -> AABB: 42 | var points = convex_shape.get_points() 43 | var aabb = null 44 | 45 | for point in points: 46 | if not aabb: 47 | aabb = AABB(point, Vector3.ZERO) 48 | else: 49 | aabb = aabb.expand(point) 50 | 51 | return aabb 52 | 53 | func create_sphere_aabb(sphere_shape: SphereShape) -> AABB: 54 | return AABB(-Vector3.ONE * sphere_shape.radius, Vector3.ONE * sphere_shape.radius) 55 | 56 | func body_shape_exited(body_id: int, body: Node, body_shape_idx: int, self_shape_idx: int) -> void: 57 | if body in buoyancy_dict: 58 | buoyancy_dict.erase(body) 59 | 60 | func _physics_process(delta: float) -> void: 61 | for body in buoyancy_dict: 62 | var buoyancy_data = buoyancy_dict[body] 63 | 64 | var self_aabb = buoyancy_data['self_aabb'] 65 | self_aabb.position += global_transform.origin 66 | 67 | var body_aabb = buoyancy_data['body_aabb'] 68 | body_aabb.position += body.global_transform.origin 69 | 70 | var displacement = self_aabb.end.y - body_aabb.position.y 71 | body.add_central_force(Vector3.UP * displacement * buoyancy_factor) 72 | body.add_central_force(Vector3(1, 0, 1) * body.get_linear_velocity() * displacement * -lateral_damping_factor) 73 | body.add_central_force(Vector3(0, 1, 0) * body.get_linear_velocity() * -vertical_damping_factor) 74 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/worldspawn_layers/liquid/lava.gd: -------------------------------------------------------------------------------- 1 | class_name LavaLayer 2 | extends LiquidLayer 3 | 4 | func _init().() -> void: 5 | buoyancy_factor = 6.0 6 | vertical_damping_factor = 3.0 7 | lateral_damping_factor = 4.0 8 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/worldspawn_layers/liquid/slime.gd: -------------------------------------------------------------------------------- 1 | class_name SlimeLayer 2 | extends LiquidLayer 3 | 4 | func _init().() -> void: 5 | buoyancy_factor = 6.0 6 | vertical_damping_factor = 3.0 7 | lateral_damping_factor = 0.4 8 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/game-definitions/worldspawn_layers/liquid/water.gd: -------------------------------------------------------------------------------- 1 | class_name WaterLayer 2 | extends LiquidLayer 3 | 4 | func _init().() -> void: 5 | buoyancy_factor = 10.0 6 | vertical_damping_factor = 3.0 7 | lateral_damping_factor = 0.3 8 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/import_plugins/quake_map_import_plugin.gd: -------------------------------------------------------------------------------- 1 | class_name QuakeMapImportPlugin 2 | extends EditorImportPlugin 3 | tool 4 | 5 | # Quake .map import plugin 6 | 7 | func get_importer_name() -> String: 8 | return 'qodot.map' 9 | 10 | func get_visible_name() -> String: 11 | return 'Quake Map' 12 | 13 | func get_resource_type() -> String: 14 | return 'Resource' 15 | 16 | func get_recognized_extensions() -> Array: 17 | return ['map'] 18 | 19 | func get_save_extension() -> String: 20 | return 'tres' 21 | 22 | func get_import_options(preset) -> Array: 23 | return [] 24 | 25 | func get_preset_count() -> int: 26 | return 0 27 | 28 | func import(source_file, save_path, options, r_platform_variants, r_gen_files) -> int: 29 | var save_path_str = '%s.%s' % [save_path, get_save_extension()] 30 | 31 | var map_resource : QuakeMapFile = null 32 | 33 | var existing_resource := load(save_path_str) as QuakeMapFile 34 | if(existing_resource != null): 35 | map_resource = existing_resource 36 | map_resource.revision += 1 37 | else: 38 | map_resource = QuakeMapFile.new() 39 | 40 | return ResourceSaver.save(save_path_str, map_resource) 41 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/import_plugins/quake_palette_import_plugin.gd: -------------------------------------------------------------------------------- 1 | class_name QuakePaletteImportPlugin 2 | extends EditorImportPlugin 3 | tool 4 | 5 | # Quake .map import plugin 6 | 7 | func get_importer_name() -> String: 8 | return 'qodot.palette' 9 | 10 | func get_visible_name() -> String: 11 | return 'Quake Palette' 12 | 13 | func get_resource_type() -> String: 14 | return 'Resource' 15 | 16 | func get_recognized_extensions() -> Array: 17 | return ['lmp'] 18 | 19 | func get_save_extension() -> String: 20 | return 'tres' 21 | 22 | func get_import_options(preset) -> Array: 23 | return [] 24 | 25 | func get_preset_count() -> int: 26 | return 0 27 | 28 | func import(source_file, save_path, options, r_platform_variants, r_gen_files) -> int: 29 | var save_path_str : String = '%s.%s' % [save_path, get_save_extension()] 30 | 31 | var file := File.new() 32 | var err : int = file.open(source_file, File.READ) 33 | 34 | if err != OK: 35 | print(['Error opening .lmp file: ', err]) 36 | return err 37 | 38 | var colors := PoolColorArray() 39 | 40 | while true: 41 | var red : int = file.get_8() 42 | var green : int = file.get_8() 43 | var blue : int = file.get_8() 44 | var color := Color(red / 255.0, green / 255.0, blue / 255.0) 45 | 46 | colors.append(color) 47 | 48 | if file.eof_reached(): 49 | break 50 | 51 | if colors.size() == 256: 52 | break 53 | 54 | var palette_resource := QuakePaletteFile.new(colors) 55 | 56 | return ResourceSaver.save(save_path_str, palette_resource) 57 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/import_plugins/quake_wad_import_plugin.gd: -------------------------------------------------------------------------------- 1 | class_name QuakeWadImportPlugin 2 | extends EditorImportPlugin 3 | tool 4 | 5 | enum WadEntryType { 6 | Palette = 0x40, 7 | SBarPic = 0x42, 8 | MipsTexture = 0x44, 9 | ConsolePic = 0x45 10 | } 11 | 12 | const TEXTURE_NAME_LENGTH := 16 13 | const MAX_MIP_LEVELS := 4 14 | 15 | func get_importer_name() -> String: 16 | return 'qodot.wad' 17 | 18 | func get_visible_name() -> String: 19 | return 'Quake Texture WAD' 20 | 21 | func get_resource_type() -> String: 22 | return 'Resource' 23 | 24 | func get_recognized_extensions() -> Array: 25 | return ['wad'] 26 | 27 | func get_save_extension() -> String: 28 | return 'tres' 29 | 30 | func get_import_options(preset) -> Array: 31 | return [ 32 | { 33 | 'name': 'palette_file', 34 | 'default_value': 'res://addons/qodot/palette.lmp', 35 | 'property_hint': PROPERTY_HINT_FILE, 36 | 'hint_string': '*.lmp' 37 | } 38 | ] 39 | 40 | func get_option_visibility(option: String, options: Dictionary) -> bool: 41 | return true 42 | 43 | func get_preset_count() -> int: 44 | return 0 45 | 46 | func import(source_file, save_path, options, r_platform_variants, r_gen_files) -> int: 47 | var save_path_str : String = '%s.%s' % [save_path, get_save_extension()] 48 | 49 | var file := File.new() 50 | var err : int = file.open(source_file, File.READ) 51 | 52 | if err != OK: 53 | print(['Error opening .wad file: ', err]) 54 | return err 55 | 56 | var palette_path : String = options['palette_file'] 57 | var palette_file : QuakePaletteFile = load(palette_path) as QuakePaletteFile 58 | if not palette_file: 59 | print('Error: Invalid palette file') 60 | return ERR_CANT_ACQUIRE_RESOURCE 61 | 62 | # Read WAD header 63 | var magic : PoolByteArray = file.get_buffer(4) 64 | var magic_string : String = magic.get_string_from_ascii() 65 | 66 | if(magic_string != 'WAD2'): 67 | print('Error: Invalid WAD magic') 68 | return ERR_INVALID_DATA 69 | 70 | var num_entries : int = file.get_32() 71 | var dir_offset : int = file.get_32() 72 | 73 | # Read entry list 74 | file.seek(0) 75 | file.seek(dir_offset) 76 | 77 | var entries : Array = [] 78 | 79 | for entry_idx in range(0, num_entries): 80 | var offset : int = file.get_32() 81 | var in_wad_size : int = file.get_32() 82 | var size : int = file.get_32() 83 | var type : int = file.get_8() 84 | var compression : int = file.get_8() 85 | var unknown : int = file.get_16() 86 | var name : PoolByteArray = file.get_buffer(TEXTURE_NAME_LENGTH) 87 | var name_string : String = name.get_string_from_ascii() 88 | 89 | if type == WadEntryType.MipsTexture: 90 | entries.append([ 91 | offset, 92 | in_wad_size, 93 | size, 94 | type, 95 | compression, 96 | name_string 97 | ]) 98 | 99 | # Read mip textures 100 | var texture_data_array: Array = [] 101 | for entry in entries: 102 | var offset : int = entry[0] 103 | file.seek(0) 104 | file.seek(offset) 105 | 106 | var name : PoolByteArray = file.get_buffer(TEXTURE_NAME_LENGTH) 107 | var name_string : String = name.get_string_from_ascii() 108 | 109 | var width : int = file.get_32() 110 | var height : int = file.get_32() 111 | 112 | var mip_offsets : Array = [] 113 | for idx in range(0, MAX_MIP_LEVELS): 114 | mip_offsets.append(file.get_32()) 115 | 116 | var num_pixels : int = width * height 117 | texture_data_array.append([name_string, width, height, file.get_buffer(num_pixels)]) 118 | 119 | # Create texture resources 120 | var textures : Dictionary = {} 121 | 122 | for texture_data in texture_data_array: 123 | var name : String = texture_data[0] 124 | var width : int = texture_data[1] 125 | var height : int = texture_data[2] 126 | var pixels : PoolByteArray = texture_data[3] 127 | 128 | var pixels_rgb := PoolByteArray() 129 | for palette_color in pixels: 130 | var rgb_color := palette_file.colors[palette_color] as Color 131 | pixels_rgb.append(rgb_color.r8) 132 | pixels_rgb.append(rgb_color.g8) 133 | pixels_rgb.append(rgb_color.b8) 134 | 135 | var texture_image := Image.new() 136 | texture_image.create_from_data(width, height, false, Image.FORMAT_RGB8, pixels_rgb) 137 | 138 | var texture := ImageTexture.new() 139 | texture.create_from_image(texture_image, Texture.FLAG_MIPMAPS | Texture.FLAG_REPEAT | Texture.FLAG_ANISOTROPIC_FILTER) 140 | 141 | textures[name] = texture 142 | 143 | # Save WAD resource 144 | var wad_resource := QuakeWadFile.new(textures) 145 | return ResourceSaver.save(save_path_str, wad_resource) 146 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/nodes/qodot_entity.gd: -------------------------------------------------------------------------------- 1 | class_name QodotEntity 2 | extends QodotSpatial 3 | 4 | export(Dictionary) var properties setget set_properties 5 | 6 | func set_properties(new_properties : Dictionary) -> void: 7 | if(properties != new_properties): 8 | properties = new_properties 9 | update_properties() 10 | 11 | func update_properties() -> void: 12 | pass 13 | 14 | func get_class() -> String: 15 | return 'QodotEntity' 16 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/nodes/qodot_spatial.gd: -------------------------------------------------------------------------------- 1 | class_name QodotSpatial, 'res://addons/qodot/icons/icon_qodot_spatial.svg' 2 | extends Spatial 3 | 4 | func get_class() -> String: 5 | return 'QodotSpatial' 6 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_base_class.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDBaseClass 2 | extends QodotFGDClass 3 | tool 4 | 5 | func _init() -> void: 6 | prefix = "@BaseClass" 7 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_class.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDClass 2 | extends Resource 3 | 4 | var prefix: String = "" 5 | 6 | export(String) var class_options : String = QodotUtil.CATEGORY_STRING 7 | 8 | export(String) var classname := "" 9 | 10 | export(String) var description := "" 11 | 12 | export(bool) var qodot_internal := false 13 | 14 | export(Array, Resource) var base_classes := [] 15 | 16 | export(Dictionary) var class_properties := {} 17 | 18 | export(Dictionary) var class_property_descriptions := {} 19 | 20 | export(Dictionary) var meta_properties := { 21 | "size": AABB(Vector3(-8, -8, -8), Vector3(8, 8, 8)), 22 | "color": Color(0.8, 0.8, 0.8) 23 | } 24 | 25 | export(String) var node_options : String = QodotUtil.CATEGORY_STRING 26 | 27 | export(String) var node_class := "" 28 | 29 | export(bool) var transient_node := false 30 | 31 | func build_def_text() -> String: 32 | # Class prefix 33 | var res : String = prefix 34 | 35 | # Meta properties 36 | var base_str = "" 37 | var meta_props = meta_properties.duplicate() 38 | 39 | for base_class in base_classes: 40 | if not 'classname' in base_class: 41 | continue 42 | 43 | base_str += base_class.classname 44 | 45 | if base_class != base_classes.back(): 46 | base_str += ", " 47 | 48 | if base_str != "": 49 | meta_props['base'] = base_str 50 | 51 | for prop in meta_props: 52 | var value = meta_props[prop] 53 | res += " " + prop + "(" 54 | 55 | if value is AABB: 56 | res += "%s %s %s, %s %s %s" % [ 57 | value.position.x, 58 | value.position.y, 59 | value.position.z, 60 | value.size.x, 61 | value.size.y, 62 | value.size.z 63 | ] 64 | elif value is Color: 65 | res += "%s %s %s" % [ 66 | value.r8, 67 | value.g8, 68 | value.b8 69 | ] 70 | elif value is String: 71 | res += value 72 | 73 | res += ")" 74 | 75 | res += " = " + classname 76 | 77 | var normalized_description = description.replace("\n", " ").strip_edges() 78 | if normalized_description != "": 79 | res += " : \"%s\" " % [normalized_description] 80 | 81 | res += "[" + QodotUtil.newline() 82 | 83 | # Class properties 84 | for prop in class_properties: 85 | var value = class_properties[prop] 86 | 87 | var prop_val = null 88 | var prop_type := "" 89 | var prop_description: String = class_property_descriptions[prop] if prop in class_property_descriptions else "" 90 | 91 | if value is int: 92 | prop_type = "integer" 93 | prop_val = String(value) 94 | elif value is float: 95 | prop_type = "float" 96 | prop_val = String(value) 97 | elif value is String: 98 | prop_type = "string" 99 | prop_val = "\"" + value + "\"" 100 | elif value is Vector3: 101 | prop_type = "string" 102 | prop_val = "\"%s %s %s\"" % [ 103 | value.x, 104 | value.y, 105 | value.z 106 | ] 107 | elif value is Color: 108 | prop_type = "color255" 109 | prop_val = "\"%s %s %s\"" % [ 110 | value.r8, 111 | value.g8, 112 | value.b8 113 | ] 114 | elif value is Dictionary: 115 | prop_type = "choices" 116 | prop_val = "[" + "\n" 117 | for choice in value: 118 | var choice_val = value[choice] 119 | prop_val += "\t\t" + String(choice_val) + " : \"" + choice + "\"\n" 120 | prop_val += "\t]" 121 | elif value is Array: 122 | prop_type = "flags" 123 | prop_val = "[" + "\n" 124 | for arr_val in value: 125 | prop_val += "\t\t" + String(arr_val[1]) + " : \"" + String(arr_val[0]) + "\" : " + ("1" if arr_val[2] else "0") + "\n" 126 | prop_val += "\t]" 127 | elif value is NodePath: 128 | prop_type = "target_destination" 129 | elif value is Object: 130 | prop_type = "target_source" 131 | 132 | if(prop_val): 133 | res += "\t" 134 | res += prop 135 | res += "(" 136 | res += prop_type 137 | res += ")" 138 | 139 | if not value is Array: 140 | res += " : \"" 141 | res += prop_description 142 | res += "\" " 143 | 144 | if value is Dictionary or value is Array: 145 | res += " = " 146 | else: 147 | res += " : " 148 | 149 | res += prop_val 150 | res += QodotUtil.newline() 151 | 152 | res += "]" + QodotUtil.newline() 153 | 154 | return res 155 | 156 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_file.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDFile 2 | extends Resource 3 | tool 4 | 5 | ## A node used to to express a set of entity definitions that can be exproted 6 | 7 | #psuedo-button to export 8 | export(bool) var export_file : bool setget set_export_file 9 | export(String, DIR, GLOBAL) var target_folder : String 10 | export(String) var fgd_name : String = "Qodot" 11 | export(Array, Resource) var base_fgd_files := [] 12 | export(Array, Resource) var entity_definitions := [ 13 | preload("res://addons/qodot/game-definitions/fgd/solid_classes/worldspawn_solid_class.tres"), 14 | preload("res://addons/qodot/game-definitions/fgd/solid_classes/group_solid_class.tres"), 15 | preload("res://addons/qodot/game-definitions/fgd/solid_classes/detail_solid_class.tres"), 16 | preload("res://addons/qodot/game-definitions/fgd/solid_classes/illusionary_solid_class.tres"), 17 | preload("res://addons/qodot/game-definitions/fgd/solid_classes/worldspawn_solid_class.tres"), 18 | preload("res://addons/qodot/game-definitions/fgd/base_classes/light_base_class.tres"), 19 | preload("res://addons/qodot/game-definitions/fgd/point_classes/light_point_class.tres"), 20 | ] 21 | 22 | func set_export_file(new_export_file = true) -> void: 23 | if new_export_file != export_file: 24 | if Engine.is_editor_hint() and get_fgd_classes().size() > 0: 25 | if not target_folder: 26 | print("Skipping export: No target folder") 27 | return 28 | 29 | if fgd_name == "": 30 | print("Skipping export: Empty FGD name") 31 | 32 | var fgd_file = target_folder + "/" + fgd_name + ".fgd" 33 | 34 | print("Exporting FGD to ", fgd_file) 35 | var file_obj := File.new() 36 | file_obj.open(fgd_file, File.WRITE) 37 | file_obj.store_string(build_class_text()) 38 | file_obj.close() 39 | 40 | func build_class_text() -> String: 41 | var res : String = "" 42 | 43 | for base_fgd in base_fgd_files: 44 | res += base_fgd.build_class_text() 45 | 46 | var entities = get_fgd_classes() 47 | for ent in entities: 48 | if ent.qodot_internal: 49 | continue 50 | var ent_text = ent.build_def_text() 51 | res += ent_text 52 | if ent != entities[-1]: 53 | res += "\n" 54 | return res 55 | 56 | #This getter does a little bit of validation. Providing only an array of non-null uniquely-named entity definitions 57 | func get_fgd_classes() -> Array: 58 | var res : Array = [] 59 | for cur_ent_def_ind in range(entity_definitions.size()): 60 | var cur_ent_def = entity_definitions[cur_ent_def_ind] 61 | if cur_ent_def == null: 62 | continue 63 | elif not (cur_ent_def is QodotFGDClass): 64 | printerr("Bad value in entity definition set at position %s! Not an entity defintion." % cur_ent_def_ind) 65 | continue 66 | res.append(cur_ent_def) 67 | return res 68 | 69 | func get_entity_definitions() -> Dictionary: 70 | var res : Dictionary = {} 71 | 72 | for base_fgd in base_fgd_files: 73 | var fgd_res = base_fgd.get_entity_definitions() 74 | for key in fgd_res: 75 | res[key] = fgd_res[key] 76 | 77 | for ent in get_fgd_classes(): 78 | if ent is QodotFGDPointClass or ent is QodotFGDSolidClass: 79 | var entity_def = ent.duplicate() 80 | var meta_properties := {} 81 | var class_properties := {} 82 | var class_property_descriptions := {} 83 | 84 | for base_class in entity_def.base_classes: 85 | for meta_property in base_class.meta_properties: 86 | meta_properties[meta_property] = base_class.meta_properties[meta_property] 87 | 88 | for class_property in base_class.class_properties: 89 | class_properties[class_property] = base_class.class_properties[class_property] 90 | 91 | for class_property_desc in base_class.class_property_descriptions: 92 | class_property_descriptions[class_property_desc] = base_class.class_property_descriptions[class_property_desc] 93 | 94 | for meta_property in entity_def.meta_properties: 95 | meta_properties[meta_property] = entity_def.meta_properties[meta_property] 96 | 97 | for class_property in entity_def.class_properties: 98 | class_properties[class_property] = entity_def.class_properties[class_property] 99 | 100 | for class_property_desc in entity_def.class_property_descriptions: 101 | class_property_descriptions[class_property_desc] = entity_def.class_property_descriptions[class_property_desc] 102 | 103 | entity_def.meta_properties = meta_properties 104 | entity_def.class_properties = class_properties 105 | entity_def.class_property_descriptions = class_property_descriptions 106 | 107 | res[ent.classname] = entity_def 108 | return res 109 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_point_class.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDPointClass 2 | extends QodotFGDClass 3 | tool 4 | 5 | func _init() -> void: 6 | prefix = "@PointClass" 7 | 8 | export(String) var scene : String = QodotUtil.CATEGORY_STRING 9 | 10 | # The scene file to associate with this PointClass 11 | # On building the map, this scene will be instanced into the scene tree 12 | export(PackedScene) var scene_file : PackedScene 13 | 14 | export(String) var scripting : String = QodotUtil.CATEGORY_STRING 15 | 16 | # The script file to associate with this PointClass 17 | # On building the map, this will be attached to any brush entities created 18 | # via this classname if no scene_file is specified 19 | export(Script) var script_class : Script 20 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/game-definitions/fgd/qodot_fgd_solid_class.gd: -------------------------------------------------------------------------------- 1 | class_name QodotFGDSolidClass 2 | extends QodotFGDClass 3 | tool 4 | 5 | enum SpawnType { 6 | WORLDSPAWN = 0, 7 | MERGE_WORLDSPAWN = 1, 8 | ENTITY = 2, 9 | GROUP = 3 10 | } 11 | 12 | enum CollisionShapeType { 13 | NONE, 14 | CONVEX, 15 | CONCAVE 16 | } 17 | 18 | # Controls whether a given SolidClass is the worldspawn, is combined with the worldspawn, 19 | # or is spawned as its own free-standing entity 20 | export(String) var spawn : String = QodotUtil.CATEGORY_STRING 21 | export(SpawnType) var spawn_type : int = SpawnType.ENTITY 22 | 23 | # Controls how visuals are built for this SolidClass 24 | export(String) var visual_build : String = QodotUtil.CATEGORY_STRING 25 | export(bool) var build_visuals := true 26 | 27 | # Controls how collisions are built for this SolidClass 28 | export(String) var collision_build : String = QodotUtil.CATEGORY_STRING 29 | export(CollisionShapeType) var collision_shape_type : int = CollisionShapeType.CONVEX 30 | 31 | # The script file to associate with this SolidClass 32 | # On building the map, this will be attached to any brush entities created 33 | # via this classname 34 | export(String) var scripting : String = QodotUtil.CATEGORY_STRING 35 | export(Script) var script_class : Script 36 | 37 | func _init() -> void: 38 | prefix = "@SolidClass" 39 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_face_attrib.gd: -------------------------------------------------------------------------------- 1 | class_name TrenchBroomFaceAttrib 2 | extends Resource 3 | 4 | export(String) var attrib_name : String 5 | export(String) var attrib_description : String 6 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_game_config_folder.gd: -------------------------------------------------------------------------------- 1 | class_name TrenchBroomGameConfigFolder 2 | extends Resource 3 | tool 4 | 5 | ## A node used to to express a set of entity definitions that can be exproted 6 | 7 | #psuedo-button to export 8 | export(bool) var export_file : bool setget set_export_file 9 | export(String, DIR, GLOBAL) var trenchbroom_games_folder : String 10 | 11 | export(String) var game_name := "Qodot" 12 | export(Texture) var icon : Texture = preload("res://icon.png") 13 | export(Resource) var game_config_file : Resource = preload("res://addons/qodot/game-definitions/trenchbroom/qodot_trenchbroom_config_file.tres") 14 | export(Array, Resource) var fgd_files : Array = [ 15 | preload("res://addons/qodot/game-definitions/fgd/qodot_fgd.tres") 16 | ] 17 | 18 | func set_export_file(new_export_file : bool = true) -> void: 19 | if new_export_file != export_file: 20 | if Engine.is_editor_hint(): 21 | if not trenchbroom_games_folder: 22 | print("Skipping export: No TrenchBroom games folder") 23 | return 24 | 25 | var config_folder = trenchbroom_games_folder + "/" + game_name 26 | var config_dir = Directory.new() 27 | 28 | var err = config_dir.open(config_folder) 29 | if err != OK: 30 | print("Couldn't open directory, creating...") 31 | err = config_dir.make_dir(config_folder) 32 | if err != OK: 33 | print("Skipping export: Failed to create directory") 34 | return 35 | 36 | if not game_config_file: 37 | print("Skipping export: No game config file") 38 | return 39 | 40 | if fgd_files.size() == 0: 41 | print("Skipping export: No FGD files") 42 | return 43 | 44 | print("Exporting TrenchBroom Game Config Folder to ", config_folder) 45 | 46 | var icon_path : String = config_folder + "/Icon.png" 47 | 48 | print("Exporting icon to ", icon_path) 49 | 50 | var export_icon : Image = icon.get_data() 51 | export_icon.resize(32, 32, Image.INTERPOLATE_LANCZOS) 52 | export_icon.save_png(icon_path) 53 | 54 | var export_config_file: TrenchBroomGameConfigFile = game_config_file.duplicate() 55 | export_config_file.game_name = game_name 56 | export_config_file.target_file = config_folder + "/GameConfig.cfg" 57 | 58 | export_config_file.fgd_filenames = [] 59 | for fgd_file in fgd_files: 60 | export_config_file.fgd_filenames.append(fgd_file.fgd_name + ".fgd") 61 | 62 | export_config_file.set_export_file(true) 63 | 64 | for fgd_file in fgd_files: 65 | if not fgd_file is QodotFGDFile: 66 | print("Skipping %s: Not a valid FGD file" % [fgd_file]) 67 | 68 | var export_fgd : QodotFGDFile = fgd_file.duplicate() 69 | export_fgd.target_folder = config_folder 70 | export_fgd.set_export_file(true) 71 | 72 | print("Export complete\n") 73 | 74 | func build_class_text() -> String: 75 | return "" 76 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/game-definitions/trenchbroom/trenchbroom_tag.gd: -------------------------------------------------------------------------------- 1 | class_name TrenchBroomTag 2 | extends Resource 3 | 4 | enum TagMatchType { 5 | TEXTURE, 6 | CONTENT_FLAG, 7 | SURFACE_FLAG, 8 | SURFACE_PARAM, 9 | CLASSNAME 10 | } 11 | 12 | export(String) var tag_name : String 13 | export(Array, String) var tag_attributes : Array 14 | export(TagMatchType) var tag_match_type : int 15 | export(String) var tag_pattern : String 16 | export(String) var texture_name : String 17 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/quake_map_file.gd: -------------------------------------------------------------------------------- 1 | class_name QuakeMapFile 2 | extends Resource 3 | 4 | export(int) var revision := 0 5 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/quake_palette_file.gd: -------------------------------------------------------------------------------- 1 | class_name QuakePaletteFile 2 | extends Resource 3 | 4 | export(PoolColorArray) var colors : PoolColorArray 5 | 6 | func _init(colors) -> void: 7 | self.colors = colors 8 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/quake_wad_file.gd: -------------------------------------------------------------------------------- 1 | class_name QuakeWadFile 2 | extends Resource 3 | 4 | export(Dictionary) var textures : Dictionary 5 | 6 | func _init(textures: Dictionary) -> void: 7 | self.textures = textures 8 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/resources/worldspawn_layer.gd: -------------------------------------------------------------------------------- 1 | class_name QodotWorldspawnLayer 2 | extends Resource 3 | 4 | export(String) var name := "" 5 | export(String) var texture := "" 6 | export(String) var node_class := "" 7 | export(bool) var build_visuals := true 8 | export(QodotFGDSolidClass.CollisionShapeType) var collision_shape_type := QodotFGDSolidClass.CollisionShapeType.CONVEX 9 | export(Script) var script_class = null 10 | 11 | func _init() -> void: 12 | resource_name = "Worldspawn Layer" 13 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/util/qodot_dependencies.gd: -------------------------------------------------------------------------------- 1 | class_name QodotDependencies 2 | 3 | const PROTOCOL := "https" 4 | const GITHUB_DOMAIN := "github.com" 5 | const GIT_USER := "Shfty" 6 | const RELEASE_DOWNLOADS := "releases/download" 7 | const DEPENDENCY_TAG := "v1.7.0" 8 | 9 | static func get_platform_string() -> String: 10 | match OS.get_name(): 11 | "Windows": 12 | return "win64" 13 | "OSX": 14 | return "osx" 15 | "X11": 16 | return "x11" 17 | return "unsupported" 18 | 19 | static func get_platform_library_extension() -> String: 20 | match OS.get_name(): 21 | "Windows": 22 | return "dll" 23 | "OSX": 24 | return "dylib" 25 | "X11": 26 | return "so" 27 | return "unsupported" 28 | 29 | static func format_github_release_download_url(repo: String, artifact: String) -> String: 30 | return "%s://%s/%s/%s/%s/%s/%s" % [PROTOCOL, GITHUB_DOMAIN, GIT_USER, repo, RELEASE_DOWNLOADS, DEPENDENCY_TAG, artifact] 31 | 32 | static func get_dependencies() -> Dictionary: 33 | var platform_string := get_platform_string() 34 | var platform_extension := get_platform_library_extension() 35 | 36 | var libqodot_destination := "res://addons/qodot/bin/%s/libqodot.%s" % [platform_string, platform_extension] 37 | var libmap_destination := "res://addons/qodot/bin/%s/libmap.%s" % [platform_string, platform_extension] 38 | 39 | var libqodot_source := format_github_release_download_url("libqodot", "libqodot.%s" % get_platform_library_extension()) 40 | var libmap_source := format_github_release_download_url("libmap", "libmap.%s" % get_platform_library_extension()) 41 | 42 | return { 43 | libqodot_destination: libqodot_source, 44 | libmap_destination: libmap_source 45 | } 46 | 47 | static func check_dependencies(http_request: HTTPRequest) -> void: 48 | var dependencies = get_dependencies() 49 | for dependency in dependencies: 50 | if not check_dependency(http_request, dependency, dependencies[dependency]): 51 | var result = yield(http_request, "request_completed") 52 | match result[0]: 53 | HTTPRequest.RESULT_SUCCESS: 54 | match result[1]: 55 | 200: 56 | print("Download complete") 57 | _: 58 | print("Download failed") 59 | var dir = Directory.new() 60 | dir.remove(dependency) 61 | HTTPRequest.RESULT_CHUNKED_BODY_SIZE_MISMATCH: 62 | printerr("Error: Chunked body size mismatch") 63 | HTTPRequest.RESULT_CANT_CONNECT: 64 | printerr("Error: Unable to connect") 65 | HTTPRequest.RESULT_CANT_RESOLVE: 66 | printerr("Error: Unable to resolve host") 67 | HTTPRequest.RESULT_CONNECTION_ERROR: 68 | printerr("Error: Connection error") 69 | HTTPRequest.RESULT_SSL_HANDSHAKE_ERROR: 70 | printerr("Error: SSL handshake error") 71 | HTTPRequest.RESULT_NO_RESPONSE: 72 | printerr("Error: No response") 73 | HTTPRequest.RESULT_BODY_SIZE_LIMIT_EXCEEDED: 74 | printerr("Error: Request body size limit exceeded") 75 | HTTPRequest.RESULT_REQUEST_FAILED: 76 | printerr("Error: Request failed") 77 | HTTPRequest.RESULT_DOWNLOAD_FILE_CANT_OPEN: 78 | printerr("Error: Unable to open file") 79 | HTTPRequest.RESULT_DOWNLOAD_FILE_WRITE_ERROR: 80 | printerr("Error: Failed to write file") 81 | HTTPRequest.RESULT_REDIRECT_LIMIT_REACHED: 82 | printerr("Error: Redirect limit reached") 83 | HTTPRequest.RESULT_TIMEOUT: 84 | printerr("Error: Request timed out") 85 | 86 | static func check_dependency(http_request: HTTPRequest, dependency: String, url: String) -> bool: 87 | print("Checking dependency ", dependency) 88 | 89 | var dir = Directory.new() 90 | if dir.file_exists(dependency): 91 | print("Dependency satisfied") 92 | return true 93 | 94 | var dependency_comps = dependency.split("/") 95 | dependency_comps.resize(dependency_comps.size() - 1) 96 | var dependency_dir = dependency_comps.join("/") 97 | 98 | if not dir.dir_exists(dependency_dir): 99 | dir.make_dir_recursive(dependency_dir) 100 | 101 | print("Dependency unsatisfied, downloading from ", url) 102 | http_request.download_file = dependency 103 | var err = http_request.request(url); 104 | 105 | match err: 106 | OK: 107 | print("HTTP request created") 108 | ERR_UNCONFIGURED: 109 | printerr("Error: HTTP request unconfigured") 110 | ERR_BUSY: 111 | printerr("Error: HTTP request busy") 112 | ERR_INVALID_PARAMETER: 113 | printerr("Error: HTTP request invalid parameter") 114 | ERR_CANT_CONNECT: 115 | printerr("Error: HTTP request unable to connect") 116 | 117 | return false 118 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/addons/qodot/src/util/qodot_util.gd: -------------------------------------------------------------------------------- 1 | class_name QodotUtil 2 | 3 | # General-purpose utility functions namespaced to Qodot for compatibility 4 | 5 | const DEBUG := false 6 | 7 | const CATEGORY_STRING := '----------------------------------------------------------------' 8 | 9 | # Const-predicated print function to avoid excess log spam 10 | static func debug_print(msg) -> void: 11 | if(DEBUG): 12 | print(msg) 13 | 14 | static func newline() -> String: 15 | if OS.get_name() == "Windows": 16 | return "\r\n" 17 | else: 18 | return "\n" 19 | 20 | static func category_dict(name: String) -> Dictionary: 21 | return property_dict(name, TYPE_STRING, -1, "", PROPERTY_USAGE_CATEGORY) 22 | 23 | static func property_dict(name: String, type: int, hint: int = -1, hint_string: String = "", usage: int = -1) -> Dictionary: 24 | var dict := { 25 | 'name': name, 26 | 'type': type 27 | } 28 | 29 | if hint != -1: 30 | dict['hint'] = hint 31 | 32 | if hint_string != "": 33 | dict['hint_string'] = hint_string 34 | 35 | if usage != -1: 36 | dict['usage'] = usage 37 | 38 | return dict 39 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/droplet.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | 4 | 5 | 6 | 7 | var velocity = Vector3(0, - 100, 0) 8 | var spawner 9 | var framecounter = 0 10 | var last_audio 11 | 12 | func _ready(): 13 | pass 14 | 15 | 16 | 17 | 18 | 19 | func _physics_process(delta): 20 | return 21 | framecounter += 1 22 | if framecounter < 20: 23 | return 24 | var col = move_and_collide(velocity * delta) 25 | if col or global_transform.origin.y < Global.player.global_transform.origin.y - 10: 26 | if col: 27 | if is_instance_valid(last_audio): 28 | last_audio.queue_free() 29 | var new_audio = $AudioStreamPlayer3D.duplicate() 30 | spawner.add_child(new_audio) 31 | new_audio.play() 32 | last_audio = new_audio 33 | global_transform.origin = spawner.global_transform.origin + Vector3(rand_range( - 20, 20), 0, rand_range( - 20, 20)) 34 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/grid_enemy.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | 4 | 5 | 6 | 7 | enum {FORWARD, RIGHT, BACK, LEFT} 8 | const DIR = [Vector3.FORWARD * 2, Vector3.RIGHT * 2, Vector3.BACK * 2, Vector3.LEFT * 2] 9 | var current_dir = DIR[FORWARD] 10 | var player_dir 11 | var step_count = 59 12 | var step_length = 100 13 | var last_pos 14 | var next_pos 15 | var space_state 16 | var result_forward 17 | var result_back 18 | var result_left 19 | var result_right 20 | var result_current 21 | onready var mesh = $crab 22 | var t = 0 23 | 24 | 25 | func _ready(): 26 | set_collision_mask_bit(1, 1) 27 | set_safe_margin(0) 28 | last_pos = global_transform.origin 29 | next_pos = global_transform.origin + current_dir 30 | func _physics_process(delta): 31 | if global_transform.origin.distance_to(Global.player.global_transform.origin) > 20: 32 | return 33 | look() 34 | func _process(delta): 35 | if global_transform.origin.distance_to(Global.player.global_transform.origin) > 20: 36 | return 37 | step_count += 1 38 | if step_count == 60: 39 | space_state = get_world().direct_space_state 40 | result_forward = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.FORWARD * 1) 41 | result_back = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.BACK * 1) 42 | result_left = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.LEFT * 1) 43 | result_right = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.RIGHT * 1) 44 | result_current = space_state.intersect_ray(global_transform.origin, global_transform.origin + current_dir * 0.5) 45 | if result_current: 46 | 47 | if result_forward and not result_right: 48 | current_dir = DIR[RIGHT] 49 | if result_right and not result_back: 50 | current_dir = DIR[BACK] 51 | if result_back and not result_left: 52 | current_dir = DIR[LEFT] 53 | if result_left and not result_forward: 54 | current_dir = DIR[FORWARD] 55 | if player_dir != null: 56 | if not space_state.intersect_ray(global_transform.origin, global_transform.origin + player_dir * 0.5): 57 | current_dir = player_dir 58 | else : 59 | player_dir = null 60 | 61 | if step_count == 60: 62 | 63 | 64 | 65 | step_count = 0 66 | last_pos = global_transform.origin 67 | next_pos = global_transform.origin + current_dir 68 | mesh.look_at(global_transform.origin - current_dir, Vector3.UP) 69 | else : 70 | if result_back and result_forward and result_left and result_right: 71 | return 72 | global_transform.origin = lerp(global_transform.origin, next_pos, 0.3) 73 | 74 | 75 | 76 | 77 | 78 | 79 | func look(): 80 | var space_state = get_world().direct_space_state 81 | var result_forward = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.FORWARD * 100) 82 | var result_back = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.BACK * 100) 83 | var result_left = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.LEFT * 100) 84 | var result_right = space_state.intersect_ray(global_transform.origin, global_transform.origin + Vector3.RIGHT * 100) 85 | if result_forward: 86 | if result_forward.collider == Global.player or result_forward.collider.has_method("already_dead"): 87 | player_dir = DIR[FORWARD] 88 | if result_back: 89 | if result_back.collider == Global.player or result_back.collider.has_method("already_dead"): 90 | player_dir = DIR[BACK] 91 | if result_right: 92 | if result_right.collider == Global.player or result_right.collider.has_method("already_dead"): 93 | player_dir = DIR[RIGHT] 94 | if result_left: 95 | if result_left.collider == Global.player or result_left.collider.has_method("already_dead"): 96 | player_dir = DIR[LEFT] 97 | 98 | 99 | func _on_Area_area_entered(area): 100 | pass 101 | 102 | 103 | func _on_Area_body_entered(body): 104 | if body.get_collision_layer_bit(0): 105 | return 106 | if body.has_method("damage"): 107 | body.damage(100, current_dir.normalized(), global_transform.origin, global_transform.origin) 108 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/killbox.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | set_collision_mask_bit(0, 0) 12 | set_collision_mask_bit(1, 1) 13 | connect("body_entered", self, "_on_Body_Entered") 14 | 15 | 16 | func _on_Body_Entered(body): 17 | if body.has_method("damage"): 18 | body.damage(1000, Vector3.ZERO, global_transform.origin, global_transform.origin) 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/lighttoggle.gd: -------------------------------------------------------------------------------- 1 | extends OmniLight 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | func _physics_process(delta): 14 | if global_transform.origin.distance_to(Global.player.global_transform.origin) > 20: 15 | hide() 16 | else : 17 | show() 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/modloader.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/psychocamera.gd: -------------------------------------------------------------------------------- 1 | extends Area 2 | 3 | var original_camera 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | 14 | 15 | 16 | 17 | 18 | func _process(delta): 19 | if $Camera.current: 20 | $Camera.look_at(Global.player.global_transform.origin + Vector3.UP, Vector3.UP) 21 | 22 | 23 | func _on_Area_body_entered(body): 24 | $Camera.current = true 25 | $Camera / Weapon.disabled = false 26 | $Camera / Weapon.show() 27 | $Camera / Weapon.current_weapon = 6 28 | $Camera / Weapon.damage[6] = 200 29 | $Camera / Weapon / RayCast.set_collision_mask_bit(1, 1) 30 | Global.player.rotation_helper.hide() 31 | Global.player.weapon.disabled = true 32 | 33 | 34 | func _on_Area_body_exited(body): 35 | $Camera.current = false 36 | $Camera / Weapon.disabled = true 37 | $Camera / Weapon.hide() 38 | $Camera / Weapon / RayCast.set_collision_mask_bit(1, 1) 39 | Global.player.rotation_helper.show() 40 | Global.player.weapon.disabled = false 41 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/snake.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | func _ready(): 11 | pass 12 | 13 | func _physics_process(delta): 14 | $snake / AnimationPlayer.play("Idle", - 1, 0.2) 15 | look_at(Global.player.global_transform.origin, Vector3.UP) 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/snakehead.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | 4 | 5 | 6 | 7 | enum I{GOLEM, WEAPON, MONEY} 8 | export (I) var index = I.GOLEM 9 | var type = 1 10 | var laser 11 | var health = 2500 12 | var death_flag = false 13 | var follow_speed = 0.02 14 | var particle 15 | var active = false 16 | var destroyed = false 17 | var look_towards = Vector3.ZERO 18 | var t = 0 19 | var disabled = false 20 | var gib = preload("res://Entities/Physics_Objects/Snake_Gib.tscn") 21 | export var line = "Triagon 01 is gone. (Golem Exosystem Received)" 22 | export var line2 = "I bestow upon you power." 23 | 24 | 25 | func _ready(): 26 | if Global.DEAD_CIVS.find(line) != - 1: 27 | get_parent().hide() 28 | queue_free() 29 | look_towards = Global.player.global_transform.origin 30 | laser = $Laser 31 | particle = $Particles 32 | 33 | 34 | 35 | func _process(delta): 36 | t += 1 37 | if destroyed: 38 | hide() 39 | return 40 | if disabled: 41 | particle.hide() 42 | if laser.scale.z < 3: 43 | hide() 44 | laser.scale.z = lerp(laser.scale.z, 1, 0.2) 45 | return 46 | show() 47 | look_towards = lerp(look_towards, Global.player.global_transform.origin, follow_speed) 48 | var space = get_world().direct_space_state 49 | if not active: 50 | 51 | 52 | return 53 | var result = space.intersect_ray(global_transform.origin, global_transform.origin - (global_transform.origin - look_towards).normalized() * 1000, [self]) 54 | if result: 55 | particle.show() 56 | particle.global_transform.origin = result.position 57 | laser.scale.z = lerp(laser.scale.z, global_transform.origin.distance_to(result.position) * 0.5, 0.2) 58 | laser.look_at(result.position, Vector3.UP) 59 | if result.collider == Global.player: 60 | Global.player.damage(20, result.normal, result.position, global_transform.origin) 61 | 62 | else : 63 | particle.hide() 64 | laser.scale.z = 400 65 | 66 | 67 | 68 | func damage(dmg, nrml, pos, shoot_pos): 69 | if death_flag: 70 | return 71 | active = true 72 | health -= dmg 73 | if health <= 0: 74 | death_flag = true 75 | if index == I.GOLEM: 76 | Global.implants.purchased_implants.append("CSIJ Level VI Golem Exosystem") 77 | if index == I.MONEY: 78 | Global.money += 1000000 79 | if index == I.WEAPON: 80 | Global.WEAPONS_UNLOCKED[Global.player.weapon.W_SHOCK] = true 81 | var new_gib = gib.instance() 82 | Global.player.get_parent().add_child(new_gib) 83 | new_gib.global_transform.origin = global_transform.origin 84 | Global.player.UI.notify(line, Color(0, 1, 0)) 85 | Global.player.UI.message(line2, true) 86 | Global.DEAD_CIVS.append(line) 87 | Global.save_game() 88 | get_parent().queue_free() 89 | 90 | 91 | func get_type(): 92 | return type; 93 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/project_scripts/timed_sound.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | 4 | 5 | 6 | 7 | export var first_scene = 0 8 | export var last_scene = 2 9 | export var play_once = false 10 | 11 | func _ready(): 12 | pass 13 | func _physics_process(delta): 14 | if get_parent().current_scene >= first_scene and get_parent().current_scene <= last_scene: 15 | if not $AudioStreamPlayer3D.playing: 16 | show() 17 | $AudioStreamPlayer3D.play() 18 | if play_once: 19 | yield (get_tree().create_timer($AudioStreamPlayer3D.stream.get_length()), "timeout") 20 | queue_free() 21 | else : 22 | $AudioStreamPlayer3D.stop() 23 | hide() 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /_SETUP_PROJECT_/setup_scripts.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | set FOLDERGOOD=0 3 | if exist "%~dp0..\project.godot" set FOLDERGOOD=1 4 | if exist "%~dp0..\project.binary" set FOLDERGOOD=1 5 | if %FOLDERGOOD%==1 ( 6 | robocopy /S "%~dp0\project_scripts" "%~dp0\.." 7 | del /S "%~dp0..\*.gdc" 8 | del /S "%~dp0..\*.gd.remap" 9 | echo. 10 | echo Script setup complete 11 | ) else ( 12 | echo|set /p="ERROR: Parent folder doesn't seem to be a Godot project (no project.godot or project.binary)" 13 | ) 14 | echo. 15 | pause --------------------------------------------------------------------------------