More intro stuff, input icon fixes, enemy export var improvements, CHECKPOINTS
|
|
@ -22,7 +22,9 @@ static var button_dictionary = {
|
|||
JOY_BUTTON_LEFT_SHOULDER: "left_shoulder",
|
||||
JOY_BUTTON_RIGHT_SHOULDER: "left_shoulder",
|
||||
JOY_BUTTON_PADDLE1: "left_shoulder",
|
||||
JOY_BUTTON_BACK: "back"
|
||||
JOY_BUTTON_BACK: "back",
|
||||
JOY_BUTTON_LEFT_STICK: "left_stick",
|
||||
JOY_BUTTON_RIGHT_STICK: "right_stick",
|
||||
}
|
||||
|
||||
static var mouse_button_dictionary = {
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 508 B After Width: | Height: | Size: 508 B |
|
|
@ -3,15 +3,15 @@
|
|||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://c6sh4c72e10ws"
|
||||
path="res://.godot/imported/xbox_stick_side_l.png-9b2e6474d68e522ac5c74d5b2ae135cd.ctex"
|
||||
path="res://.godot/imported/left_stick.png-b6fd8c2882bba6bbb1bf517e0c2b20b2.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/super_awesome_input_icons/textures/generic/xbox_stick_side_l.png"
|
||||
dest_files=["res://.godot/imported/xbox_stick_side_l.png-9b2e6474d68e522ac5c74d5b2ae135cd.ctex"]
|
||||
source_file="res://addons/super_awesome_input_icons/textures/generic/left_stick.png"
|
||||
dest_files=["res://.godot/imported/left_stick.png-b6fd8c2882bba6bbb1bf517e0c2b20b2.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
|
Before Width: | Height: | Size: 585 B After Width: | Height: | Size: 585 B |
|
|
@ -3,15 +3,15 @@
|
|||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://h435fkxc3v6g"
|
||||
path="res://.godot/imported/xbox_stick_side_r.png-902b85f39a099dfd98c9b55995248612.ctex"
|
||||
path="res://.godot/imported/right_stick.png-30fad7bf49d37f7e890b3dc790811c08.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/super_awesome_input_icons/textures/generic/xbox_stick_side_r.png"
|
||||
dest_files=["res://.godot/imported/xbox_stick_side_r.png-902b85f39a099dfd98c9b55995248612.ctex"]
|
||||
source_file="res://addons/super_awesome_input_icons/textures/generic/right_stick.png"
|
||||
dest_files=["res://.godot/imported/right_stick.png-30fad7bf49d37f7e890b3dc790811c08.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
|
|
@ -225,6 +225,12 @@ aim_down={
|
|||
"events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null)
|
||||
]
|
||||
}
|
||||
toggle_holster={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194329,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
|
||||
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":8,"pressure":0.0,"pressed":true,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[physics]
|
||||
|
||||
|
|
|
|||
133
scenes/enemy_ground.tscn
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
[gd_scene load_steps=14 format=3 uid="uid://dh3psx6ilrtql"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bv7ymrwe6ciax" path="res://scripts/enemy_ground.gd" id="1_hqfmb"]
|
||||
[ext_resource type="AudioStream" uid="uid://dpkn65kpftlmr" path="res://sounds/alerted.mp3" id="2_egpqw"]
|
||||
[ext_resource type="AudioStream" uid="uid://boiv2kfau8gop" path="res://sounds/detecting.mp3" id="3_6bsrn"]
|
||||
[ext_resource type="Texture2D" uid="uid://c0cyhybh30ogt" path="res://textures/player-ground-sheet.png" id="4_tcxjb"]
|
||||
[ext_resource type="Texture2D" uid="uid://csrlh1sbdroud" path="res://textures/pistol.png" id="5_k5k1o"]
|
||||
[ext_resource type="AudioStream" uid="uid://5x8fl2mk082h" path="res://sounds/gunshot_1.mp3" id="6_sh8im"]
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_jo68p"]
|
||||
atlas = ExtResource("4_tcxjb")
|
||||
region = Rect2(0, 0, 64, 64)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_6gpfv"]
|
||||
atlas = ExtResource("4_tcxjb")
|
||||
region = Rect2(64, 0, 64, 64)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_fd1o3"]
|
||||
atlas = ExtResource("4_tcxjb")
|
||||
region = Rect2(192, 0, 64, 64)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_yqhs4"]
|
||||
atlas = ExtResource("4_tcxjb")
|
||||
region = Rect2(128, 0, 64, 64)
|
||||
|
||||
[sub_resource type="SpriteFrames" id="SpriteFrames_vmpfq"]
|
||||
animations = [{
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_jo68p")
|
||||
}, {
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_6gpfv")
|
||||
}, {
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_fd1o3")
|
||||
}, {
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_yqhs4")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"default",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_jo68p")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"idle",
|
||||
"speed": 5.0
|
||||
}, {
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_6gpfv")
|
||||
}, {
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_jo68p")
|
||||
}, {
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_fd1o3")
|
||||
}, {
|
||||
"duration": 1.0,
|
||||
"texture": SubResource("AtlasTexture_yqhs4")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"walk",
|
||||
"speed": 7.0
|
||||
}]
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_jxmby"]
|
||||
radius = 21.0
|
||||
height = 48.0
|
||||
|
||||
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_tvsp8"]
|
||||
radius = 25.0
|
||||
height = 148.0
|
||||
|
||||
[node name="Enemy" type="CharacterBody2D"]
|
||||
script = ExtResource("1_hqfmb")
|
||||
|
||||
[node name="Alerted" type="AudioStreamPlayer2D" parent="."]
|
||||
stream = ExtResource("2_egpqw")
|
||||
volume_db = 8.0
|
||||
bus = &"Sound Effects"
|
||||
|
||||
[node name="Detecting" type="AudioStreamPlayer2D" parent="."]
|
||||
stream = ExtResource("3_6bsrn")
|
||||
bus = &"Sound Effects"
|
||||
parameters/looping = true
|
||||
|
||||
[node name="Sprite" type="AnimatedSprite2D" parent="."]
|
||||
scale = Vector2(2, 2)
|
||||
sprite_frames = SubResource("SpriteFrames_vmpfq")
|
||||
|
||||
[node name="CollisionShape" type="CollisionShape2D" parent="."]
|
||||
position = Vector2(0, 40)
|
||||
shape = SubResource("CapsuleShape2D_jxmby")
|
||||
|
||||
[node name="LineOfSight" type="RayCast2D" parent="."]
|
||||
target_position = Vector2(2048, 0)
|
||||
collision_mask = 2
|
||||
collide_with_areas = true
|
||||
|
||||
[node name="HeldItem" type="Node2D" parent="."]
|
||||
|
||||
[node name="Cast" type="RayCast2D" parent="HeldItem"]
|
||||
position = Vector2(64, 0)
|
||||
target_position = Vector2(2048, 0)
|
||||
collision_mask = 2
|
||||
collide_with_areas = true
|
||||
|
||||
[node name="Sprite" type="Sprite2D" parent="HeldItem"]
|
||||
position = Vector2(56, 0)
|
||||
texture = ExtResource("5_k5k1o")
|
||||
|
||||
[node name="Gunshot" type="AudioStreamPlayer2D" parent="HeldItem"]
|
||||
stream = ExtResource("6_sh8im")
|
||||
bus = &"Sound Effects"
|
||||
|
||||
[node name="Hitbox" type="Area2D" parent="."]
|
||||
collision_layer = 2
|
||||
collision_mask = 2
|
||||
|
||||
[node name="CollisionShape" type="CollisionShape2D" parent="Hitbox"]
|
||||
shape = SubResource("CapsuleShape2D_tvsp8")
|
||||
debug_color = Color(1, 0, 0, 0.41960785)
|
||||
|
||||
[node name="Navagent" type="NavigationAgent2D" parent="."]
|
||||
path_desired_distance = 34.0
|
||||
target_desired_distance = 34.0
|
||||
path_postprocessing = 1
|
||||
avoidance_enabled = true
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
[gd_scene load_steps=31 format=3 uid="uid://by43ihcec8e8q"]
|
||||
[gd_scene load_steps=32 format=3 uid="uid://by43ihcec8e8q"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://b2sw6ymaf4t0s" path="res://scripts/game_ground.gd" id="1_6ra5r"]
|
||||
[ext_resource type="Script" uid="uid://dowu512otgyyf" path="res://scripts/player_ground.gd" id="3_8gbjj"]
|
||||
|
|
@ -109,6 +109,11 @@ font_size = 48
|
|||
outline_size = 4
|
||||
outline_color = Color(0, 0, 0, 1)
|
||||
|
||||
[sub_resource type="LabelSettings" id="LabelSettings_176r3"]
|
||||
font_size = 32
|
||||
outline_size = 4
|
||||
outline_color = Color(0, 0, 0, 1)
|
||||
|
||||
[sub_resource type="AtlasTexture" id="AtlasTexture_vuhkc"]
|
||||
atlas = ExtResource("13_176r3")
|
||||
region = Rect2(0, 0, 16, 16)
|
||||
|
|
@ -282,6 +287,155 @@ layout_mode = 2
|
|||
text = "TO INTERACT"
|
||||
label_settings = SubResource("LabelSettings_c2suo")
|
||||
|
||||
[node name="MoveTutorial" type="HFlowContainer" parent="UI/Control"]
|
||||
visible = false
|
||||
modulate = Color(1, 1, 1, 0.53333336)
|
||||
layout_mode = 1
|
||||
anchors_preset = -1
|
||||
anchor_top = 0.5
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 0.5
|
||||
offset_bottom = -245.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="End2" type="Label" parent="UI/Control/MoveTutorial"]
|
||||
layout_mode = 2
|
||||
text = "MOVE"
|
||||
label_settings = SubResource("LabelSettings_176r3")
|
||||
|
||||
[node name="InputIconTextureRect" type="TextureRect" parent="UI/Control/MoveTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "ground_up"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="InputIconTextureRect2" type="TextureRect" parent="UI/Control/MoveTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "ground_down"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="InputIconTextureRect3" type="TextureRect" parent="UI/Control/MoveTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "ground_left"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="InputIconTextureRect4" type="TextureRect" parent="UI/Control/MoveTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "ground_right"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="UnholsterTutorial" type="HFlowContainer" parent="UI/Control"]
|
||||
visible = false
|
||||
modulate = Color(1, 1, 1, 0.53333336)
|
||||
layout_mode = 1
|
||||
anchors_preset = -1
|
||||
anchor_top = 0.5
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 0.5
|
||||
offset_bottom = -245.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="End2" type="Label" parent="UI/Control/UnholsterTutorial"]
|
||||
layout_mode = 2
|
||||
text = "TOGGLE WEAPON"
|
||||
label_settings = SubResource("LabelSettings_176r3")
|
||||
|
||||
[node name="InputIconTextureRect" type="TextureRect" parent="UI/Control/UnholsterTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "toggle_holster"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="GunTutorial" type="HFlowContainer" parent="UI/Control"]
|
||||
visible = false
|
||||
modulate = Color(1, 1, 1, 0.53333336)
|
||||
layout_mode = 1
|
||||
anchors_preset = -1
|
||||
anchor_top = 0.5
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 0.5
|
||||
offset_bottom = -245.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="End2" type="Label" parent="UI/Control/GunTutorial"]
|
||||
layout_mode = 2
|
||||
text = "FIRE"
|
||||
label_settings = SubResource("LabelSettings_176r3")
|
||||
|
||||
[node name="InputIconTextureRect" type="TextureRect" parent="UI/Control/GunTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "fire"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="End3" type="Label" parent="UI/Control/GunTutorial"]
|
||||
layout_mode = 2
|
||||
text = " | AIM"
|
||||
label_settings = SubResource("LabelSettings_176r3")
|
||||
|
||||
[node name="InputIconTextureRect5" type="TextureRect" parent="UI/Control/GunTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "aim_up"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="InputIconTextureRect6" type="TextureRect" parent="UI/Control/GunTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "aim_down"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="InputIconTextureRect7" type="TextureRect" parent="UI/Control/GunTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "aim_left"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="InputIconTextureRect8" type="TextureRect" parent="UI/Control/GunTutorial"]
|
||||
custom_minimum_size = Vector2(64, 64)
|
||||
layout_mode = 2
|
||||
texture = ExtResource("16_e3s4u")
|
||||
expand_mode = 1
|
||||
script = ExtResource("16_hby33")
|
||||
action_name = "aim_right"
|
||||
metadata/_custom_type_script = "uid://b2maxk5g6yb0i"
|
||||
|
||||
[node name="DialogueOptions" type="VBoxContainer" parent="UI/Control"]
|
||||
visible = false
|
||||
custom_minimum_size = Vector2(128, 0)
|
||||
|
|
@ -345,7 +499,7 @@ position = Vector2(32, 32)
|
|||
scale = Vector2(4, 4)
|
||||
sprite_frames = SubResource("SpriteFrames_257nh")
|
||||
autoplay = "default"
|
||||
frame_progress = 0.42345548
|
||||
frame_progress = 0.6029871
|
||||
|
||||
[node name="Shader" type="ColorRect" parent="UI"]
|
||||
material = SubResource("ShaderMaterial_ypt7u")
|
||||
|
|
|
|||
|
|
@ -17,11 +17,32 @@ var sprinting = false
|
|||
var equipped_ground_gun = "pistol"
|
||||
var ammo_in_mag = 12
|
||||
|
||||
func set_ground_gun(value: String):
|
||||
func set_ground_gun(value):
|
||||
equipped_ground_gun = value
|
||||
|
||||
if value:
|
||||
$HeldItem/Sprite.texture = load("res://textures/" + equipped_ground_gun + ".png")
|
||||
ammo_in_mag = global.ground_guns
|
||||
|
||||
func navigate_to(goal: Vector2):
|
||||
if has_node("Navagent"):
|
||||
$Navagent.target_position = goal
|
||||
|
||||
while !$Navagent.is_navigation_finished():
|
||||
var next_position = $Navagent.get_next_path_position()
|
||||
next_position.y -= 32
|
||||
|
||||
var axes = global_position.direction_to(next_position)
|
||||
|
||||
horizontial_movement = axes.x
|
||||
vertical_movement = axes.y
|
||||
|
||||
# This is a bad way to do this, to be honest. However, I am lazy
|
||||
await get_tree().create_timer(0.05).timeout
|
||||
|
||||
horizontial_movement = 0
|
||||
vertical_movement = 0
|
||||
|
||||
func _ready() -> void:
|
||||
$Sprite.play()
|
||||
|
||||
|
|
@ -36,7 +57,7 @@ func _process(delta: float) -> void:
|
|||
$Sprite.position.y = 64
|
||||
$Sprite.animation = "idle"
|
||||
|
||||
$HeldItem.visible = false
|
||||
if has_node("HeldItem"): $HeldItem.visible = false
|
||||
|
||||
return
|
||||
|
||||
|
|
@ -74,8 +95,14 @@ func _process(delta: float) -> void:
|
|||
$Sprite.animation = "idle"
|
||||
|
||||
fire_delay -= delta
|
||||
if has_node("HeldItem"):
|
||||
if !equipped_ground_gun:
|
||||
$HeldItem.visible = false
|
||||
else:
|
||||
$HeldItem.visible = true
|
||||
|
||||
if firing and (fire_delay < 0):
|
||||
if has_node("HeldItem") and (equipped_ground_gun != null):
|
||||
|
||||
$HeldItem/Cast.force_raycast_update()
|
||||
|
||||
var hit_target = $HeldItem/Cast.get_collider()
|
||||
|
|
@ -102,6 +129,6 @@ func _process(delta: float) -> void:
|
|||
|
||||
$HeldItem/Gunshot.play()
|
||||
|
||||
fire_delay = 0.5
|
||||
fire_delay = global.ground_guns[equipped_ground_gun].fire_rate
|
||||
|
||||
move_and_slide()
|
||||
|
|
|
|||
147
scripts/doctor.gd
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
extends "res://scripts/character_ground.gd"
|
||||
|
||||
@onready var game = get_parent()
|
||||
|
||||
func _ready() -> void:
|
||||
super()
|
||||
|
||||
health = 50
|
||||
|
||||
func _interact(player: Node2D) -> void:
|
||||
player.get_node("Camera").enabled = false
|
||||
$Camera.enabled = true
|
||||
$InteractArea.monitoring = false
|
||||
|
||||
player.busy = true
|
||||
|
||||
await game.dialogue("Ready to leave?", "doctor", false)
|
||||
|
||||
var option = await game.make_choice({
|
||||
"yes": "Yes",
|
||||
"no": "No"
|
||||
})
|
||||
|
||||
if option == "yes":
|
||||
await game.dialogue("Alrighty!", "doctor")
|
||||
|
||||
await game.dialogue("We have your stuff back here, let me go grab it real quick...", "doctor")
|
||||
|
||||
|
||||
await game.dialogue("Here's your bag.", "doctor")
|
||||
|
||||
await game.dialogue("Should have everything - tablet, ship keys, a pistol...", "doctor")
|
||||
|
||||
game.get_node("DistantGunshots1").play()
|
||||
|
||||
await get_tree().create_timer(2).timeout
|
||||
|
||||
await game.dialogue("...the hell?", "doctor", false)
|
||||
|
||||
await get_tree().create_timer(1.5).timeout
|
||||
|
||||
game.get_node("IntrusionAlarm").play()
|
||||
|
||||
game.get_node("Map").modulate = Color(0.5, 0.35, 0.35)
|
||||
|
||||
await get_tree().create_timer(1).timeout
|
||||
|
||||
await game.dialogue("Oh, no.", "doctor", true)
|
||||
|
||||
await get_tree().create_timer(0.5).timeout
|
||||
|
||||
await game.dialogue("We need to leave. Now.", "doctor", true)
|
||||
|
||||
await get_tree().create_timer(0.5).timeout
|
||||
|
||||
$Camera.enabled = false
|
||||
player.get_node("Camera").enabled = true
|
||||
|
||||
player.busy = false
|
||||
|
||||
await game.dialogue("Follow me.", "doctor", false)
|
||||
|
||||
await navigate_to(game.get_node("DoctorEscapeWaypoint1").position)
|
||||
|
||||
while !game.get_node("DoctorEscapeWaypoint1/Area").get_overlapping_bodies().has(player): await get_tree().create_timer(0.2).timeout
|
||||
|
||||
player.busy = true
|
||||
|
||||
await game.dialogue("You good with that gun?", "doctor", true)
|
||||
|
||||
var option_2 = await game.make_choice({
|
||||
"yes": "Yes",
|
||||
"no": "No"
|
||||
})
|
||||
|
||||
if option_2 == "yes": await game.dialogue("Good to know.", "doctor", true)
|
||||
else: await game.dialogue("Well, you're still probably better than I would be.", "doctor", true)
|
||||
|
||||
global.stats.story_progress = 2
|
||||
|
||||
game.save_game()
|
||||
|
||||
checkpoint_1()
|
||||
|
||||
elif option == "no":
|
||||
await game.dialogue("Well, I'm here whenever you need me.", "doctor")
|
||||
|
||||
|
||||
player.get_node("Camera").enabled = true
|
||||
$Camera.enabled = false
|
||||
$InteractArea.monitoring = true
|
||||
|
||||
player.busy = false
|
||||
|
||||
return
|
||||
|
||||
|
||||
func checkpoint_1():
|
||||
var player = game.get_node("PlayerGround")
|
||||
|
||||
await game.dialogue("You should probably get it out.", "doctor", false)
|
||||
|
||||
player.busy = false
|
||||
|
||||
global.stats.equipped_ground_gun = "pistol"
|
||||
|
||||
game.get_node("UI/Control/UnholsterTutorial").visible = true
|
||||
|
||||
while global.stats.gun_holstered: await get_tree().create_timer(0.2).timeout
|
||||
|
||||
game.get_node("UI/Control/UnholsterTutorial").visible = false
|
||||
|
||||
await game.dialogue("Let's go.", "doctor", false)
|
||||
|
||||
game.checkpoint()
|
||||
|
||||
await navigate_to(game.get_node("DoctorEscapeWaypoint2").position)
|
||||
|
||||
while !game.get_node("DoctorEscapeWaypoint2/Area").get_overlapping_bodies().has(player): await get_tree().create_timer(0.2).timeout
|
||||
|
||||
await game.dialogue("RUN!", "doctor", false)
|
||||
|
||||
game.get_node("MedbayDoorLargeVertical").free()
|
||||
|
||||
vertical_movement = 0.1
|
||||
|
||||
game.get_node("Camper1/HeldItem").look_at(global_position)
|
||||
game.get_node("Camper2/HeldItem").look_at(global_position)
|
||||
|
||||
game.get_node("Camper1").firing = true
|
||||
await get_tree().create_timer(0.06).timeout
|
||||
game.get_node("Camper2").firing = true
|
||||
|
||||
while health > 0: await get_tree().create_timer(0.2).timeout
|
||||
|
||||
await game.end_dialogue()
|
||||
|
||||
game.get_node("Camper1").firing = false
|
||||
await get_tree().create_timer(0.06).timeout
|
||||
game.get_node("Camper2").firing = false
|
||||
|
||||
await get_tree().create_timer(0.333).timeout
|
||||
|
||||
game.get_node("Camper1").concious = true
|
||||
game.get_node("Camper2").concious = true
|
||||
|
||||
game.get_node("Camper3").global_position = game.get_node("CamperSpawn1").global_position
|
||||
1
scripts/doctor.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://mmptv0l2ahhh
|
||||
|
|
@ -5,7 +5,6 @@ var alerted = false
|
|||
|
||||
var inaccuracy = 15
|
||||
|
||||
var reaction_time = 0.35
|
||||
var reaction_halve_distance = 720
|
||||
var reaction_timer = 0
|
||||
|
||||
|
|
@ -29,9 +28,16 @@ var last_seen_player_position = null
|
|||
@onready var player = null
|
||||
var game = null
|
||||
|
||||
## The enemy's starting gun. Leave blank for no weapon
|
||||
@export var starting_gun: String = &"pistol"
|
||||
|
||||
## The enemy's starting health.
|
||||
@export var starting_health: int = 50
|
||||
## Is the enemy's AI enabled?
|
||||
@export var concious: bool = true
|
||||
## Will the enemy always chase the player?
|
||||
@export var always_sees_player: bool = false
|
||||
## The time it takes for an enemy to start shooting / notice the player.
|
||||
@export var reaction_time: float = 0.35
|
||||
|
||||
func _ready() -> void:
|
||||
super()
|
||||
|
|
@ -47,15 +53,23 @@ func _process(delta: float) -> void:
|
|||
$Detecting.stop()
|
||||
return
|
||||
|
||||
if !concious:
|
||||
$Detecting.stop()
|
||||
return
|
||||
|
||||
if !player:
|
||||
if game:
|
||||
player = game.get_node("PlayerGround")
|
||||
else: return
|
||||
|
||||
if always_sees_player:
|
||||
ai_mode = AI_MODE_ATTACK
|
||||
last_seen_player_position = player.global_position
|
||||
|
||||
if ai_mode == AI_MODE_IDLE:
|
||||
$LineOfSight.look_at(player.global_position)
|
||||
|
||||
if player.is_ancestor_of($LineOfSight.get_collider()):
|
||||
if $LineOfSight.get_collider() && player.is_ancestor_of($LineOfSight.get_collider()):
|
||||
var divider = clamp((player.global_position - global_position).length() / reaction_halve_distance, 1, 8) * 1.5
|
||||
reaction_timer += delta / divider
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,15 @@ func save_game() -> void:
|
|||
|
||||
$UI/Control/SaveIndicator.visible = false
|
||||
|
||||
func checkpoint() -> void:
|
||||
var packed_scene = PackedScene.new()
|
||||
packed_scene.pack(get_tree().get_current_scene())
|
||||
|
||||
if global.checkpoint:
|
||||
global.checkpoint.free()
|
||||
|
||||
global.checkpoint = packed_scene
|
||||
|
||||
func _ready() -> void:
|
||||
$UI/Control/Dialogue.visible = false
|
||||
|
||||
|
|
@ -93,7 +102,7 @@ func dialogue(text: String, type: String = "generic", allow_input: bool = true)
|
|||
|
||||
$Dialogue.play()
|
||||
|
||||
await get_tree().create_timer(speed).timeout
|
||||
#await get_tree().create_timer(speed).timeout
|
||||
|
||||
i += 1
|
||||
|
||||
|
|
|
|||
|
|
@ -31,13 +31,26 @@ var orbit_zones = [
|
|||
var ground_guns = {
|
||||
"pistol": {
|
||||
"name": "Oni",
|
||||
"type": "energy",
|
||||
"type": "kinetic",
|
||||
"damage": 10,
|
||||
"magazine_size": 12,
|
||||
"fire_rate": 0.3
|
||||
},
|
||||
"smg": {
|
||||
"name": "Ripper",
|
||||
"type": "energy",
|
||||
"damage": 8,
|
||||
"magazine_size": 24,
|
||||
"fire_rate": 1.0/6.0
|
||||
}
|
||||
}
|
||||
|
||||
var checkpoint = null
|
||||
|
||||
func load_checkpoint():
|
||||
if checkpoint:
|
||||
get_tree().change_scene_to_packed(checkpoint)
|
||||
|
||||
func generate_save():
|
||||
var save_dict = {
|
||||
"stats": stats
|
||||
|
|
@ -105,12 +118,13 @@ var default_stats = {
|
|||
"speed": 512,
|
||||
"boost_tank_size": 1,
|
||||
"marks": 200,
|
||||
"location": "space",
|
||||
"location": "space_station_1",
|
||||
"position": Vector2(),
|
||||
"rotation": 0,
|
||||
"story_progress": 1,
|
||||
"story_progress": 0,
|
||||
"navigation_goal": null,
|
||||
"equipped_ground_gun": "pistol"
|
||||
"equipped_ground_gun": null,
|
||||
"gun_holstered": true,
|
||||
}
|
||||
|
||||
var stats = default_stats.duplicate_deep()
|
||||
|
|
|
|||
|
|
@ -4,9 +4,13 @@ extends Area2D
|
|||
var game = null
|
||||
|
||||
func _on_body_entered(body: Node2D) -> void:
|
||||
if body.get_name() == "PlayerGround":
|
||||
if !game: return
|
||||
|
||||
if (body.get_name() == "PlayerGround") or (game.get_node("PlayerGround").is_ancestor_of(body)):
|
||||
game.current_interaction_area = self
|
||||
|
||||
func _on_body_exited(body: Node2D) -> void:
|
||||
if body.get_name() == "PlayerGround":
|
||||
if !game: return
|
||||
|
||||
if (body.get_name() == "PlayerGround") or (game.get_node("PlayerGround").is_ancestor_of(body)):
|
||||
if game.current_interaction_area == self: game.current_interaction_area = null
|
||||
|
|
|
|||
|
|
@ -5,11 +5,19 @@ var last_aim_direction = Vector2(0, 0)
|
|||
func _ready() -> void:
|
||||
super()
|
||||
|
||||
if global.stats.gun_holstered:
|
||||
set_ground_gun(null)
|
||||
else:
|
||||
set_ground_gun(global.stats.equipped_ground_gun)
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
super(delta)
|
||||
|
||||
if dead:
|
||||
if global.checkpoint:
|
||||
global.load_game()
|
||||
get_tree().change_scene_to_file("res://scenes/ground.tscn")
|
||||
|
||||
if input_icon.using_gamepad:
|
||||
if !((Input.get_axis("aim_left", "aim_right") == 0) and (Input.get_axis("aim_up", "aim_down") == 0)):
|
||||
$HeldItem.rotation = Vector2(
|
||||
|
|
@ -37,4 +45,13 @@ func _process(delta: float) -> void:
|
|||
$HeldItem/Crosshair.visible = false
|
||||
$HeldItem/Line.visible = false
|
||||
|
||||
if Input.is_action_just_pressed("toggle_holster"):
|
||||
global.stats.gun_holstered = !global.stats.gun_holstered
|
||||
|
||||
if global.stats.gun_holstered:
|
||||
set_ground_gun(null)
|
||||
else:
|
||||
set_ground_gun(global.stats.equipped_ground_gun)
|
||||
|
||||
|
||||
firing = Input.is_action_pressed("fire")
|
||||
|
|
|
|||
|
|
@ -188,6 +188,10 @@ func _ground_ready() -> void:
|
|||
|
||||
await game.dialogue("When you're feeling ready, I'll be at the end of the hall.", "doctor_1")
|
||||
|
||||
await game.get_node("Doctor").navigate_to(game.get_node("DoctorHallWaypoint").position)
|
||||
|
||||
game.get_node("Doctor").global_position = game.get_node("DoctorDeskWaypoint").position
|
||||
|
||||
global.stats.story_progress = 1
|
||||
|
||||
player.busy = false
|
||||
|
|
@ -198,5 +202,32 @@ func _ground_ready() -> void:
|
|||
game.set_vignette_parameter("softness", i * 0.04)
|
||||
|
||||
i += 2
|
||||
|
||||
game.get_node("UI/Control/MoveTutorial").visible = true
|
||||
|
||||
while player.velocity.length() == 0:
|
||||
await get_tree().create_timer(0.1).timeout
|
||||
|
||||
await get_tree().create_timer(1).timeout
|
||||
|
||||
print("end")
|
||||
|
||||
game.get_node("UI/Control/MoveTutorial").visible = false
|
||||
|
||||
elif global.stats.story_progress == 1:
|
||||
pass
|
||||
elif global.stats.story_progress == 2:
|
||||
game.get_node("Uglyburger").stop()
|
||||
|
||||
game.get_node("IntrusionAlarm").play()
|
||||
|
||||
game.get_node("Map").modulate = Color(0.5, 0.35, 0.35)
|
||||
|
||||
game.get_node("Doctor/InteractArea").monitoring = false
|
||||
|
||||
player.global_position = game.get_node("Checkpoint1PlayerSpawn").global_position
|
||||
game.get_node("Doctor").global_position = game.get_node("Checkpoint1DoctorSpawn").global_position
|
||||
|
||||
game.get_node("Doctor").checkpoint_1()
|
||||
else:
|
||||
game.save_game()
|
||||
|
|
|
|||
BIN
sounds/background_gunshots.mp3
Normal file
19
sounds/background_gunshots.mp3.import
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
[remap]
|
||||
|
||||
importer="mp3"
|
||||
type="AudioStreamMP3"
|
||||
uid="uid://f6l56kvndidj"
|
||||
path="res://.godot/imported/background_gunshots.mp3-9d148338da2f4c84e6a101a6a8dec405.mp3str"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://sounds/background_gunshots.mp3"
|
||||
dest_files=["res://.godot/imported/background_gunshots.mp3-9d148338da2f4c84e6a101a6a8dec405.mp3str"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
BIN
sounds/intrusion_alarm.mp3
Normal file
19
sounds/intrusion_alarm.mp3.import
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
[remap]
|
||||
|
||||
importer="mp3"
|
||||
type="AudioStreamMP3"
|
||||
uid="uid://c13fyse8fxmio"
|
||||
path="res://.godot/imported/intrusion_alarm.mp3-9e530e5459da68390295ed718d582217.mp3str"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://sounds/intrusion_alarm.mp3"
|
||||
dest_files=["res://.godot/imported/intrusion_alarm.mp3-9e530e5459da68390295ed718d582217.mp3str"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
BIN
textures/desk.png
Normal file
|
After Width: | Height: | Size: 237 B |
40
textures/desk.png.import
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bahp733iqv2us"
|
||||
path="res://.godot/imported/desk.png-569ac858ccfa866c549921982f2d651c.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://textures/desk.png"
|
||||
dest_files=["res://.godot/imported/desk.png-569ac858ccfa866c549921982f2d651c.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
textures/door_large_horizontial.png
Normal file
|
After Width: | Height: | Size: 284 B |
40
textures/door_large_horizontial.png.import
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://iim42wat824h"
|
||||
path="res://.godot/imported/door_large_horizontial.png-be3fcc0a643e3e0a242a5070b84d40a0.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://textures/door_large_horizontial.png"
|
||||
dest_files=["res://.godot/imported/door_large_horizontial.png-be3fcc0a643e3e0a242a5070b84d40a0.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
textures/door_large_vertical.png
Normal file
|
After Width: | Height: | Size: 208 B |
40
textures/door_large_vertical.png.import
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b0c5hws6ki8p5"
|
||||
path="res://.godot/imported/door_large_vertical.png-63c570800cfc026639fdfc69bb1882e3.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://textures/door_large_vertical.png"
|
||||
dest_files=["res://.godot/imported/door_large_vertical.png-63c570800cfc026639fdfc69bb1882e3.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
textures/locker.png
Normal file
|
After Width: | Height: | Size: 215 B |
40
textures/locker.png.import
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bgui3ranlk441"
|
||||
path="res://.godot/imported/locker.png-291655332e65b890583d6d9343e4a2f5.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://textures/locker.png"
|
||||
dest_files=["res://.godot/imported/locker.png-291655332e65b890583d6d9343e4a2f5.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
textures/smg.png
Normal file
|
After Width: | Height: | Size: 481 B |
40
textures/smg.png.import
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dk5ctkygv2n0i"
|
||||
path="res://.godot/imported/smg.png-6e5b1b02de92e8359738de08c577925f.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://textures/smg.png"
|
||||
dest_files=["res://.godot/imported/smg.png-6e5b1b02de92e8359738de08c577925f.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||