Add rover game and such
This commit is contained in:
parent
e80cd37534
commit
373838d3e7
Binary file not shown.
@ -1,12 +1,14 @@
|
||||
[gd_scene load_steps=3 format=2]
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://assets/level/Level.glb" type="PackedScene" id=1]
|
||||
[ext_resource path="res://scripts/Level.gd" type="Script" id=2]
|
||||
|
||||
[sub_resource type="CylinderShape" id=1]
|
||||
height = 6.30212
|
||||
radius = 2.14679
|
||||
|
||||
[node name="Level" instance=ExtResource( 1 )]
|
||||
script = ExtResource( 2 )
|
||||
|
||||
[node name="RTG" type="StaticBody" parent="." index="81"]
|
||||
|
||||
|
BIN
assets/level/Rock.material
Normal file
BIN
assets/level/Rock.material
Normal file
Binary file not shown.
BIN
assets/level/blinn1_002.material
Normal file
BIN
assets/level/blinn1_002.material
Normal file
Binary file not shown.
BIN
assets/moon_buggy/Beetle IX.glb
Normal file
BIN
assets/moon_buggy/Beetle IX.glb
Normal file
Binary file not shown.
1065
assets/moon_buggy/Beetle IX.glb.import
Normal file
1065
assets/moon_buggy/Beetle IX.glb.import
Normal file
File diff suppressed because it is too large
Load Diff
68
assets/moon_buggy/Beetle IX.tscn
Normal file
68
assets/moon_buggy/Beetle IX.tscn
Normal file
@ -0,0 +1,68 @@
|
||||
[gd_scene load_steps=16 format=2]
|
||||
|
||||
[ext_resource path="res://assets/moon_buggy/Beetle IX.glb" type="PackedScene" id=1]
|
||||
[ext_resource path="res://scripts/Beetle IX.gd" type="Script" id=2]
|
||||
|
||||
[sub_resource type="AnimationNodeAdd2" id=1]
|
||||
filter_enabled = true
|
||||
filters = [ "Armature/Skeleton:Back Wheel.L", "Armature/Skeleton:Back Wheel.R", "Armature/Skeleton:Front Wheel.L", "Armature/Skeleton:Front Wheel.R", "Armature/Skeleton:Middle Wheel.L", "Armature/Skeleton:Middle Wheel.R" ]
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=2]
|
||||
animation = "Wheel Turn-loop"
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=3]
|
||||
animation = "Driving-loop"
|
||||
|
||||
[sub_resource type="AnimationNodeBlendTree" id=4]
|
||||
nodes/Add2/node = SubResource( 1 )
|
||||
nodes/Add2/position = Vector2( 546.667, 80 )
|
||||
nodes/Animation/node = SubResource( 3 )
|
||||
nodes/Animation/position = Vector2( 213.333, 66.6667 )
|
||||
"nodes/Animation 2/node" = SubResource( 2 )
|
||||
"nodes/Animation 2/position" = Vector2( 160, 200 )
|
||||
nodes/output/position = Vector2( 813.333, 133.333 )
|
||||
node_connections = [ "Add2", 0, "Animation", "Add2", 1, "Animation 2", "output", 0, "Add2" ]
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=5]
|
||||
animation = "Idle-loop"
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=6]
|
||||
animation = "Reset"
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=7]
|
||||
animation = "Startup"
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id=8]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id=9]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id=10]
|
||||
xfade_time = 1.3
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id=11]
|
||||
xfade_time = 0.1
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachine" id=12]
|
||||
states/driving/node = SubResource( 4 )
|
||||
states/driving/position = Vector2( 647.667, 97.6173 )
|
||||
states/idle/node = SubResource( 5 )
|
||||
states/idle/position = Vector2( 284.333, 83.8258 )
|
||||
states/reset/node = SubResource( 6 )
|
||||
states/reset/position = Vector2( 171, 180.523 )
|
||||
states/startup/node = SubResource( 7 )
|
||||
states/startup/position = Vector2( 457.667, 34.9054 )
|
||||
transitions = [ "reset", "idle", SubResource( 8 ), "idle", "startup", SubResource( 9 ), "startup", "driving", SubResource( 10 ), "driving", "idle", SubResource( 11 ) ]
|
||||
start_node = "reset"
|
||||
graph_offset = Vector2( -163, -60 )
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachinePlayback" id=13]
|
||||
|
||||
[node name="Beetle IX" instance=ExtResource( 1 )]
|
||||
script = ExtResource( 2 )
|
||||
|
||||
[node name="AnimationTree" type="AnimationTree" parent="." index="2"]
|
||||
tree_root = SubResource( 12 )
|
||||
anim_player = NodePath("../AnimationPlayer")
|
||||
active = true
|
||||
parameters/playback = SubResource( 13 )
|
||||
parameters/driving/Add2/add_amount = 1.0
|
BIN
assets/moon_buggy/Material.material
Normal file
BIN
assets/moon_buggy/Material.material
Normal file
Binary file not shown.
BIN
assets/moon_buggy/Material_001.material
Normal file
BIN
assets/moon_buggy/Material_001.material
Normal file
Binary file not shown.
BIN
assets/moon_buggy/Material_002.material
Normal file
BIN
assets/moon_buggy/Material_002.material
Normal file
Binary file not shown.
BIN
assets/moon_buggy/Solar Panels.material
Normal file
BIN
assets/moon_buggy/Solar Panels.material
Normal file
Binary file not shown.
Binary file not shown.
@ -70,6 +70,11 @@ _global_script_classes=[ {
|
||||
"path": "res://addons/dialogic/Example Assets/History/HistoryRow.gd"
|
||||
}, {
|
||||
"base": "Resource",
|
||||
"class": "Interface",
|
||||
"language": "GDScript",
|
||||
"path": "res://scripts/Interface.gd"
|
||||
}, {
|
||||
"base": "Resource",
|
||||
"class": "ItemType",
|
||||
"language": "GDScript",
|
||||
"path": "res://scripts/ItemType.gd"
|
||||
@ -97,6 +102,7 @@ _global_script_class_icons={
|
||||
"DialogicResources": "",
|
||||
"DialogicUtil": "",
|
||||
"HistoryRow": "",
|
||||
"Interface": "",
|
||||
"ItemType": "",
|
||||
"Recipe": "",
|
||||
"RecipeDB": ""
|
||||
@ -108,6 +114,10 @@ config/name="project-dung"
|
||||
run/main_scene="res://scenes/main.tscn"
|
||||
config/icon="res://icon.png"
|
||||
|
||||
[autoload]
|
||||
|
||||
InterfaceChecker="*res://scripts/interface_checker.gd"
|
||||
|
||||
[display]
|
||||
|
||||
window/size/width=1920
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
[ext_resource path="res://scripts/game_manager.gd" type="Script" id=1]
|
||||
|
||||
[node name="game_manager" type="Node" groups=["game_manager"]]
|
||||
[node name="game_manager" type="CanvasLayer" groups=["game_manager"]]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="UI" type="Control" parent="."]
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=28 format=2]
|
||||
[gd_scene load_steps=29 format=2]
|
||||
|
||||
[ext_resource path="res://assets/level/Level.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://scripts/cameras.gd" type="Script" id=2]
|
||||
@ -20,6 +20,7 @@
|
||||
[ext_resource path="res://scenes/cheat_menu.tscn" type="PackedScene" id=18]
|
||||
[ext_resource path="res://item_types/ore.tres" type="Resource" id=19]
|
||||
[ext_resource path="res://recipes/all_recipes.tres" type="Resource" id=20]
|
||||
[ext_resource path="res://scenes/rover_station.tscn" type="PackedScene" id=21]
|
||||
|
||||
[sub_resource type="CylinderShape" id=1]
|
||||
height = 5.22615
|
||||
@ -375,6 +376,11 @@ text = "Communications"
|
||||
[node name="comm_station" parent="Communications" instance=ExtResource( 13 )]
|
||||
transform = Transform( 1, 3.49246e-10, -2.23517e-08, -3.49246e-10, 1, 1.60071e-10, 2.23517e-08, 1.78261e-10, 1, 0.664039, 5.58794e-09, -7.58252 )
|
||||
|
||||
[node name="Rover_Room" type="Spatial" parent="."]
|
||||
transform = Transform( -0.707107, 0, 0.707107, 0, 1, 0, -0.707107, 0, -0.707107, -11, 0, 11 )
|
||||
|
||||
[node name="rover_station" parent="Rover_Room" instance=ExtResource( 21 )]
|
||||
|
||||
[node name="CanvasLayer" type="CanvasLayer" parent="."]
|
||||
|
||||
[node name="cheat_menu" parent="CanvasLayer" instance=ExtResource( 18 )]
|
||||
@ -405,3 +411,5 @@ transform = Transform( 1, 3.49246e-10, -2.23517e-08, -3.49246e-10, 1, 1.60071e-1
|
||||
[connection signal="player_exited" from="cameras/camera_comms" to="cameras" method="_on_camera_room_player_exited"]
|
||||
[connection signal="player_entered" from="cameras/camera_hydroponics" to="cameras" method="_on_camera_room_player_entered"]
|
||||
[connection signal="player_exited" from="cameras/camera_hydroponics" to="cameras" method="_on_camera_room_player_exited"]
|
||||
|
||||
[editable path="Level"]
|
||||
|
@ -714,7 +714,7 @@ mesh = SubResource( 1 )
|
||||
skin = SubResource( 2 )
|
||||
|
||||
[node name="head_bone" type="BoneAttachment" parent="model_transform/DungMan/Armature/Skeleton" index="1"]
|
||||
transform = Transform( 1, -2.21988e-16, 5.59982e-18, -6.93938e-20, 0.0249053, 0.99969, -2.22059e-16, -0.99969, 0.0249053, -3.32446e-16, -0.0244905, -1.49896 )
|
||||
transform = Transform( 1, -2.22045e-16, 5.12852e-23, 1.32349e-23, 2.83122e-07, 1, -2.22045e-16, -1, 2.83122e-07, -3.33067e-16, 5.21541e-08, -1.5 )
|
||||
bone_name = "Item"
|
||||
|
||||
[node name="ItemSpawn" type="Spatial" parent="model_transform/DungMan/Armature/Skeleton/head_bone"]
|
||||
|
@ -1,16 +1,11 @@
|
||||
[gd_scene load_steps=6 format=2]
|
||||
[gd_scene load_steps=5 format=2]
|
||||
|
||||
[ext_resource path="res://scripts/rover.gd" type="Script" id=1]
|
||||
[ext_resource path="res://assets/moon_buggy/Beetle IX.tscn" type="PackedScene" id=2]
|
||||
|
||||
[sub_resource type="CylinderShape" id=13]
|
||||
radius = 2.98085
|
||||
|
||||
[sub_resource type="CubeMesh" id=2]
|
||||
size = Vector3( 6, 2, 6 )
|
||||
|
||||
[sub_resource type="SpatialMaterial" id=12]
|
||||
albedo_color = Color( 0.627451, 0.156863, 0.156863, 1 )
|
||||
|
||||
[sub_resource type="BoxShape" id=9]
|
||||
extents = Vector3( 2.90757, 1, 2.12399 )
|
||||
|
||||
@ -29,19 +24,17 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0 )
|
||||
shape = SubResource( 13 )
|
||||
|
||||
[node name="visual" type="Spatial" parent="."]
|
||||
|
||||
[node name="MeshInstance" type="MeshInstance" parent="visual"]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0 )
|
||||
mesh = SubResource( 2 )
|
||||
skeleton = NodePath("../../..")
|
||||
material/0 = SubResource( 12 )
|
||||
transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0 )
|
||||
|
||||
[node name="interact_box" type="Area" parent="visual"]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -3.96067 )
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -5.15549 )
|
||||
collision_layer = 4
|
||||
collision_mask = 8
|
||||
|
||||
[node name="CollisionShape" type="CollisionShape" parent="visual/interact_box"]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.39215 )
|
||||
shape = SubResource( 9 )
|
||||
|
||||
[node name="BeetleIX" parent="visual" instance=ExtResource( 2 )]
|
||||
transform = Transform( 2.3073, 0, 0, 0, 2.3073, 0, 0, 0, 2.3073, 0, 0, 0 )
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=9 format=2]
|
||||
[gd_scene load_steps=8 format=2]
|
||||
|
||||
[ext_resource path="res://scenes/rover.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://assets/rover_level/RoverGame.glb" type="PackedScene" id=4]
|
||||
@ -8,14 +8,10 @@
|
||||
[sub_resource type="BoxShape" id=7]
|
||||
extents = Vector3( 21.7976, 4.38074, 5.34608 )
|
||||
|
||||
[sub_resource type="ProceduralSky" id=6]
|
||||
sky_top_color = Color( 1, 1, 1, 1 )
|
||||
sky_horizon_color = Color( 0.721569, 0.721569, 0.721569, 1 )
|
||||
|
||||
[sub_resource type="Environment" id=5]
|
||||
background_mode = 2
|
||||
background_sky = SubResource( 6 )
|
||||
background_color = Color( 0.752941, 0.752941, 0.752941, 1 )
|
||||
ambient_light_color = Color( 0.32549, 0.32549, 0.32549, 1 )
|
||||
ssao_enabled = true
|
||||
ssao_radius = 15.99
|
||||
ssao_intensity = 3.14
|
||||
@ -29,13 +25,20 @@ extents = Vector3( 100, 1, 400 )
|
||||
script = ExtResource( 6 )
|
||||
|
||||
[node name="RoverGame" parent="." instance=ExtResource( 4 )]
|
||||
__meta__ = {
|
||||
"_edit_group_": true
|
||||
}
|
||||
|
||||
[node name="rover" parent="." instance=ExtResource( 1 )]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.04923, 50 )
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0511061, 50 )
|
||||
mass = 2.0
|
||||
|
||||
[node name="Camera" type="Camera" parent="rover/visual" index="2"]
|
||||
transform = Transform( 1.19422e-07, 0.5, -0.866025, -4.37114e-08, 0.866025, 0.5, 1, -2.18557e-08, 1.25278e-07, -13.15, 6.519, 0.386 )
|
||||
far = 300.0
|
||||
|
||||
[node name="rover_camera" type="Camera" parent="."]
|
||||
transform = Transform( -4.37114e-08, 0.866025, -0.5, 0, 0.5, 0.866025, 1, 3.78552e-08, -2.18557e-08, -34.343, 66.514, 50 )
|
||||
transform = Transform( -4.37114e-08, 0.707106, -0.707106, 0, 0.707106, 0.707106, 1, 3.09086e-08, -3.09086e-08, -26.657, 23.188, 50 )
|
||||
current = true
|
||||
script = ExtResource( 5 )
|
||||
|
||||
@ -59,7 +62,6 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.172523, 0.157974, 349.242 )
|
||||
shape = SubResource( 8 )
|
||||
|
||||
[node name="Timer" type="Timer" parent="."]
|
||||
wait_time = 60.0
|
||||
one_shot = true
|
||||
autostart = true
|
||||
|
||||
@ -209,6 +211,12 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 15.0132, 0, 664.688 )
|
||||
[node name="spawn_location42" type="Position3D" parent="spawn locations" groups=["rock_spawn_location"]]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 17.4828, 0, 603.399 )
|
||||
|
||||
[node name="DirectionalLight" type="DirectionalLight" parent="."]
|
||||
transform = Transform( 0.866025, 2.18557e-08, -0.5, 0.5, -3.78552e-08, 0.866025, 0, -1, -4.37114e-08, 0, 87.952, 53 )
|
||||
shadow_enabled = true
|
||||
|
||||
[connection signal="area_entered" from="collection_area" to="." method="_on_collection_area_area_entered"]
|
||||
[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
|
||||
|
||||
[editable path="RoverGame"]
|
||||
[editable path="rover"]
|
||||
|
53
scenes/rover_station.tscn
Normal file
53
scenes/rover_station.tscn
Normal file
@ -0,0 +1,53 @@
|
||||
[gd_scene load_steps=7 format=2]
|
||||
|
||||
[ext_resource path="res://scenes/status_light.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://scenes/item_holder.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://scenes/coin_machine.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://scenes/item_dump.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://scripts/rover_station/rover_station.gd" type="Script" id=6]
|
||||
[ext_resource path="res://item_types/repair_kit.tres" type="Resource" id=11]
|
||||
|
||||
[node name="rover_station" type="Spatial" groups=["on_player_sleep_listener"]]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.173937, 0, -3.56739 )
|
||||
script = ExtResource( 6 )
|
||||
|
||||
[node name="status_light" parent="." instance=ExtResource( 1 )]
|
||||
transform = Transform( 0.999404, 0, 0.0345158, 0, 1, 0, -0.0345158, 0, 0.999404, 0.0140028, -0.0739165, 1.81011 )
|
||||
omni_range = 2.3706
|
||||
|
||||
[node name="coin_machine" parent="." instance=ExtResource( 3 )]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.02357, 0.126143 )
|
||||
|
||||
[node name="item_holder" parent="." instance=ExtResource( 2 )]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2.26269, 0.778543, -0.31761 )
|
||||
|
||||
[node name="item_dump" parent="." instance=ExtResource( 4 )]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 9.53674e-07, 0.993049, 0.0943546 )
|
||||
item_type_0 = ExtResource( 11 )
|
||||
item_count_0 = 1
|
||||
|
||||
[node name="game_canvas" type="CanvasLayer" parent="."]
|
||||
layer = 0
|
||||
visible = false
|
||||
|
||||
[node name="ViewportContainer" type="ViewportContainer" parent="game_canvas"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
stretch = true
|
||||
|
||||
[node name="rover_game_viewport" type="Viewport" parent="game_canvas/ViewportContainer"]
|
||||
unique_name_in_owner = true
|
||||
size = Vector2( 1920, 1080 )
|
||||
own_world = true
|
||||
handle_input_locally = false
|
||||
msaa = 1
|
||||
render_target_update_mode = 0
|
||||
shadow_atlas_size = 4096
|
||||
|
||||
[node name="rover_game" parent="game_canvas/ViewportContainer/rover_game_viewport" instance_placeholder="res://scenes/rover_game.tscn"]
|
||||
unique_name_in_owner = true
|
||||
play_time = 40.0
|
||||
|
||||
[connection signal="coin_requirement_met" from="coin_machine" to="." method="_on_coin_machine_coin_requirement_met"]
|
||||
[connection signal="item_changed" from="item_holder" to="." method="_on_item_holder_item_changed"]
|
||||
[connection signal="item_dump_completed" from="item_dump" to="." method="_on_item_dump_completed"]
|
9
scripts/Beetle IX.gd
Normal file
9
scripts/Beetle IX.gd
Normal file
@ -0,0 +1,9 @@
|
||||
extends Spatial
|
||||
|
||||
onready var playback = $AnimationTree["parameters/playback"]
|
||||
|
||||
func idle():
|
||||
playback.travel("idle")
|
||||
|
||||
func drive():
|
||||
playback.travel("driving")
|
40
scripts/Interface.gd
Normal file
40
scripts/Interface.gd
Normal file
@ -0,0 +1,40 @@
|
||||
extends Resource
|
||||
class_name Interface
|
||||
|
||||
export(Array, String) var method_names
|
||||
|
||||
func assert_implemented_by(script):
|
||||
if !(script is Script):
|
||||
script = script.get_script()
|
||||
var methods = {}
|
||||
for method in script.get_script_method_list():
|
||||
methods[method.name] = method
|
||||
|
||||
for method_name in method_names:
|
||||
assert(methods.has(method_name), "`%s` does not implement `%s` from interface `%s`" % [script.resource_path, method_name, resource_path])
|
||||
|
||||
static func check_script(path: String):
|
||||
var script: Script = load(path)
|
||||
var interfaces = script.get("INTERFACES")
|
||||
if interfaces == null:
|
||||
return
|
||||
for interface in interfaces:
|
||||
interface.assert_implemented_by(script)
|
||||
|
||||
static func check_all_scripts(path: String):
|
||||
if not OS.is_debug_build():
|
||||
return
|
||||
var dir = Directory.new()
|
||||
if dir.open(path) == OK:
|
||||
dir.list_dir_begin()
|
||||
var file_name = dir.get_next()
|
||||
while file_name != "":
|
||||
if dir.current_is_dir():
|
||||
if not file_name.begins_with("."):
|
||||
check_all_scripts(path + "/" + file_name)
|
||||
else:
|
||||
if file_name.ends_with(".gd"):
|
||||
check_script(path + "/" + file_name)
|
||||
file_name = dir.get_next()
|
||||
else:
|
||||
print("An error occurred when trying to access the path.")
|
11
scripts/Level.gd
Normal file
11
scripts/Level.gd
Normal file
@ -0,0 +1,11 @@
|
||||
extends Spatial
|
||||
|
||||
|
||||
func _ready():
|
||||
pass
|
||||
|
||||
func start_drill():
|
||||
$AnimationPlayer.play("Excavator Running-loop")
|
||||
|
||||
func stop_drill():
|
||||
$AnimationPlayer.play("Excavator Reset")
|
4
scripts/interface_checker.gd
Normal file
4
scripts/interface_checker.gd
Normal file
@ -0,0 +1,4 @@
|
||||
extends Node
|
||||
|
||||
func _init():
|
||||
Interface.check_all_scripts("res://scripts")
|
@ -5,6 +5,7 @@ signal starved_to_death
|
||||
const StateDefault = preload("res://scripts/player/state/default.gd")
|
||||
const StateInteracting = preload("res://scripts/player/state/interacting.gd")
|
||||
const StateSleeping = preload("res://scripts/player/state/sleeping.gd")
|
||||
const StatePlayingRoverGame = preload("res://scripts/player/state/playing_rover_game.gd")
|
||||
|
||||
const SPEED = 10.0
|
||||
const MAX_HEALTH = 4
|
||||
@ -133,3 +134,8 @@ func _on_blink_timer_timeout():
|
||||
func sleep(made_it_to_bed: bool, hop_position: Spatial):
|
||||
state.on_sleep(made_it_to_bed, hop_position)
|
||||
|
||||
func start_playing_rover_game():
|
||||
state.on_start_playing_rover_game()
|
||||
|
||||
func stop_playing_rover_game():
|
||||
state.on_stop_playing_rover_game()
|
||||
|
@ -1,5 +1,6 @@
|
||||
extends Reference
|
||||
|
||||
const INTERFACES = [preload("res://scripts/player/state/state_interface.tres")]
|
||||
const NAME = "default"
|
||||
const EPSILON = 0.0001
|
||||
|
||||
@ -7,9 +8,6 @@ var ctx = null
|
||||
var anim_tree: AnimationTree
|
||||
var move_playback
|
||||
|
||||
func _init():
|
||||
pass
|
||||
|
||||
func enter_from(state):
|
||||
anim_tree = ctx.get_node("model_transform/DungMan/AnimationTree")
|
||||
move_playback = anim_tree["parameters/Move/playback"]
|
||||
@ -34,3 +32,10 @@ func unhandled_input(event):
|
||||
|
||||
func on_sleep(made_it_to_bed: bool, hop_position: Spatial):
|
||||
ctx.change_state(ctx.StateSleeping.new(made_it_to_bed, hop_position))
|
||||
|
||||
func on_start_playing_rover_game():
|
||||
ctx.change_state(ctx.StatePlayingRoverGame.new())
|
||||
|
||||
func on_stop_playing_rover_game():
|
||||
assert(false, "invalid state")
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
extends Reference
|
||||
|
||||
const INTERFACES = [preload("res://scripts/player/state/state_interface.tres")]
|
||||
const NAME = "interacting"
|
||||
|
||||
var ctx: KinematicBody = null
|
||||
@ -17,7 +18,8 @@ func enter_from(state):
|
||||
timer.connect("timeout", self, "_on_timeout", [], CONNECT_ONESHOT)
|
||||
|
||||
func exit_to(state):
|
||||
pass
|
||||
if timer.is_connected("timeout", self, "_on_timeout"):
|
||||
timer.disconnect("timeout", self, "_on_timeout")
|
||||
|
||||
func physics_process(delta):
|
||||
pass
|
||||
@ -50,5 +52,10 @@ func try_trigger_interact(area) -> bool:
|
||||
return true
|
||||
|
||||
func on_sleep(made_it_to_bed: bool, hop_position: Spatial):
|
||||
timer.disconnect("timeout", self, "_on_timeout")
|
||||
ctx.change_state(ctx.StateSleeping.new(made_it_to_bed, hop_position))
|
||||
|
||||
func on_start_playing_rover_game():
|
||||
ctx.change_state(ctx.StatePlayingRoverGame.new())
|
||||
|
||||
func on_stop_playing_rover_game():
|
||||
assert(false, "invalid state")
|
||||
|
29
scripts/player/state/playing_rover_game.gd
Normal file
29
scripts/player/state/playing_rover_game.gd
Normal file
@ -0,0 +1,29 @@
|
||||
extends Reference
|
||||
|
||||
const INTERFACES = [preload("res://scripts/player/state/state_interface.tres")]
|
||||
const NAME = "playing_rover_game"
|
||||
|
||||
var ctx: KinematicBody = null
|
||||
|
||||
func enter_from(state):
|
||||
var anim_tree: AnimationTree = ctx.get_node("model_transform/DungMan/AnimationTree")
|
||||
var move_playback: AnimationNodeStateMachinePlayback = anim_tree["parameters/Move/playback"]
|
||||
move_playback.travel("idle")
|
||||
|
||||
func exit_to(state):
|
||||
pass
|
||||
|
||||
func physics_process(delta):
|
||||
pass
|
||||
|
||||
func unhandled_input(event: InputEvent):
|
||||
pass
|
||||
|
||||
func on_sleep(made_it_to_bed: bool, hop_position: Spatial):
|
||||
ctx.change_state(ctx.StateSleeping.new(made_it_to_bed, hop_position))
|
||||
|
||||
func on_start_playing_rover_game():
|
||||
assert(false, "invalid state")
|
||||
|
||||
func on_stop_playing_rover_game():
|
||||
ctx.change_state(ctx.StateDefault.new())
|
@ -1,5 +1,6 @@
|
||||
extends Reference
|
||||
|
||||
const INTERFACES = [preload("res://scripts/player/state/state_interface.tres")]
|
||||
const NAME = "sleeping"
|
||||
|
||||
var ctx: KinematicBody = null
|
||||
@ -16,6 +17,7 @@ func _init(p_made_it_to_bed: bool, p_hop_position: Spatial = null):
|
||||
made_it_to_bed = p_made_it_to_bed
|
||||
|
||||
func enter_from(state):
|
||||
ctx.get_tree().call_group("on_player_sleep_listener", "on_player_sleep")
|
||||
hop_position = hop_position if hop_position else ctx.get_tree().get_nodes_in_group("bed_hop_position")[0]
|
||||
model_transform = ctx.get_node("model_transform")
|
||||
anim_player = ctx.get_node("model_transform/node_animations")
|
||||
@ -97,3 +99,9 @@ func unhandled_input(event: InputEvent):
|
||||
|
||||
func on_sleep(made_it_to_bed: bool, hop_position: Spatial):
|
||||
assert(false, "shouldn't be able to sleep while sleeping")
|
||||
|
||||
func on_start_playing_rover_game():
|
||||
assert(false, "invalid state")
|
||||
|
||||
func on_stop_playing_rover_game():
|
||||
pass
|
||||
|
7
scripts/player/state/state_interface.tres
Normal file
7
scripts/player/state/state_interface.tres
Normal file
@ -0,0 +1,7 @@
|
||||
[gd_resource type="Resource" load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://scripts/Interface.gd" type="Script" id=1]
|
||||
|
||||
[resource]
|
||||
script = ExtResource( 1 )
|
||||
method_names = [ "enter_from", "exit_to", "physics_process", "unhandled_input", "on_sleep", "on_start_playing_rover_game", "on_stop_playing_rover_game" ]
|
@ -1,5 +1,6 @@
|
||||
extends RigidBody
|
||||
|
||||
export var treasure: Resource
|
||||
|
||||
func _ready():
|
||||
$hit_box.set_meta("owner", self)
|
||||
|
@ -1,11 +1,17 @@
|
||||
extends RigidBody
|
||||
|
||||
const EPSILON = 0.0001
|
||||
const SPEED = 300.0
|
||||
const TURN = 2.5
|
||||
var heading := Vector3.FORWARD
|
||||
var heading := Vector3.BACK
|
||||
|
||||
func _physics_process(delta):
|
||||
heading = heading.rotated(Vector3.UP, Input.get_axis("right", "left") * TURN * delta).normalized()
|
||||
var input = Vector3(Input.get_axis("right", "left"), 0.0, Input.get_axis("down", "up"))
|
||||
if input.length_squared() > EPSILON:
|
||||
$visual/BeetleIX.drive()
|
||||
else:
|
||||
$visual/BeetleIX.idle()
|
||||
heading = heading.rotated(Vector3.UP, input.x * TURN * delta).normalized()
|
||||
$visual.global_transform = $visual.global_transform.looking_at($visual.global_transform.origin + heading, Vector3.UP)
|
||||
|
||||
func _integrate_forces(state):
|
||||
|
@ -1,6 +1,19 @@
|
||||
extends Spatial
|
||||
|
||||
signal game_over
|
||||
signal got_treasure(item_type)
|
||||
|
||||
export var play_time: float = 20.0
|
||||
|
||||
const loot_table = {
|
||||
#preload("res://")
|
||||
}
|
||||
|
||||
var main: Node
|
||||
var treasure := [] # is array of item_types
|
||||
|
||||
func _ready():
|
||||
$Timer.start(play_time)
|
||||
spawn_rocks(10)
|
||||
|
||||
func spawn_rocks(count: int):
|
||||
@ -10,12 +23,17 @@ func spawn_rocks(count: int):
|
||||
var location = locations[i]
|
||||
var rock = preload("res://scenes/rock.tscn").instance()
|
||||
location.add_child(rock)
|
||||
|
||||
|
||||
func _on_collection_area_area_entered(area):
|
||||
if area.has_meta("owner"):
|
||||
area = area.get_meta("owner")
|
||||
area.queue_free()
|
||||
emit_signal("got_treasure", preload("res://item_types/ore.tres"))
|
||||
|
||||
func _process(delta):
|
||||
$"%progress_bar".value = $Timer.time_left * 100.0 / $Timer.wait_time
|
||||
|
||||
func _on_Timer_timeout():
|
||||
emit_signal("game_over")
|
||||
|
||||
|
||||
|
41
scripts/rover_station/rover_station.gd
Normal file
41
scripts/rover_station/rover_station.gd
Normal file
@ -0,0 +1,41 @@
|
||||
extends Damageable
|
||||
|
||||
const StateIdle = preload("res://scripts/rover_station/state/idle.gd")
|
||||
const StateBroken = preload("res://scripts/rover_station/state/broken.gd")
|
||||
const StatePlaying = preload("res://scripts/rover_station/state/playing.gd")
|
||||
|
||||
var state = null
|
||||
var treasure := [] # array of ItemTypes
|
||||
|
||||
func _ready():
|
||||
state = StateBroken.new() if start_broken else StateIdle.new()
|
||||
state.ctx = self
|
||||
state.enter_from(null)
|
||||
print("rover_station: NULL -> ", state.NAME)
|
||||
|
||||
func change_state(new_state):
|
||||
print("rover_station: ", state.NAME, " -> ", new_state.NAME)
|
||||
new_state.ctx = self
|
||||
state.exit_to(new_state)
|
||||
new_state.enter_from(state)
|
||||
state = new_state
|
||||
|
||||
func _on_coin_machine_coin_requirement_met(player):
|
||||
state.on_coin_machine_coin_requirement_met(player)
|
||||
|
||||
func _on_item_dump_completed():
|
||||
state.on_item_dump_completed()
|
||||
|
||||
func on_player_sleep():
|
||||
state.on_player_sleep()
|
||||
|
||||
func add_treasure(item_type: Resource):
|
||||
if $item_holder.item_in_hold == null:
|
||||
$item_holder.add_item(item_type.spawn_node())
|
||||
else:
|
||||
treasure.push_back(item_type)
|
||||
|
||||
func _on_item_holder_item_changed(item):
|
||||
if item == null and not treasure.empty():
|
||||
$item_holder.add_item(treasure.pop_front().spawn_node())
|
||||
|
33
scripts/rover_station/state/broken.gd
Normal file
33
scripts/rover_station/state/broken.gd
Normal file
@ -0,0 +1,33 @@
|
||||
extends Reference
|
||||
|
||||
const INTERFACES = [preload("res://scripts/rover_station/state/state_interface.tres")]
|
||||
const NAME = "broken"
|
||||
|
||||
var ctx = null
|
||||
|
||||
func _init():
|
||||
pass
|
||||
|
||||
func enter_from(state):
|
||||
ctx.get_node("item_dump").enabled = true
|
||||
ctx.get_node("item_dump").reset()
|
||||
ctx.get_node("coin_machine").enabled = false
|
||||
ctx.get_node("item_holder").add_enabled = true
|
||||
ctx.get_node("item_holder").remove_enabled = true
|
||||
ctx.get_node("status_light").fail()
|
||||
|
||||
func exit_to(state):
|
||||
assert(state.NAME != "broken")
|
||||
|
||||
func on_coin_machine_coin_requirement_met(player):
|
||||
assert(false, "should be impossible while broken")
|
||||
|
||||
func on_item_dump_completed():
|
||||
ctx.full_heal()
|
||||
ctx.change_state(ctx.StateIdle.new())
|
||||
|
||||
func on_damage_taken():
|
||||
assert(false, "should be impossible while broken")
|
||||
|
||||
func on_player_sleep():
|
||||
ctx.treasure.clear()
|
32
scripts/rover_station/state/idle.gd
Normal file
32
scripts/rover_station/state/idle.gd
Normal file
@ -0,0 +1,32 @@
|
||||
extends Reference
|
||||
|
||||
const INTERFACES = [preload("res://scripts/rover_station/state/state_interface.tres")]
|
||||
const NAME = "idle"
|
||||
|
||||
var ctx = null
|
||||
|
||||
func _init():
|
||||
pass
|
||||
|
||||
func enter_from(state):
|
||||
ctx.get_node("item_dump").enabled = false
|
||||
ctx.get_node("coin_machine").enabled = true
|
||||
ctx.get_node("item_holder").add_enabled = true
|
||||
ctx.get_node("item_holder").remove_enabled = true
|
||||
ctx.get_node("status_light").idle()
|
||||
|
||||
func exit_to(state):
|
||||
pass
|
||||
|
||||
func on_coin_machine_coin_requirement_met(player):
|
||||
ctx.change_state(ctx.StatePlaying.new(player))
|
||||
|
||||
func on_item_dump_completed():
|
||||
assert(false, "item dump should be disabled")
|
||||
|
||||
func on_damage_taken():
|
||||
if ctx.hp <= 0:
|
||||
ctx.change_state(ctx.StateBroken.new())
|
||||
|
||||
func on_player_sleep():
|
||||
ctx.treasure.clear()
|
52
scripts/rover_station/state/playing.gd
Normal file
52
scripts/rover_station/state/playing.gd
Normal file
@ -0,0 +1,52 @@
|
||||
extends Reference
|
||||
|
||||
const INTERFACES = [preload("res://scripts/rover_station/state/state_interface.tres")]
|
||||
const NAME = "playing"
|
||||
|
||||
var ctx: Spatial = null
|
||||
var game: Node
|
||||
var player: Node
|
||||
|
||||
func _init(p_player: Node):
|
||||
player = p_player
|
||||
|
||||
func enter_from(state):
|
||||
ctx.get_node("item_dump").enabled = false
|
||||
ctx.get_node("coin_machine").enabled = false
|
||||
ctx.get_node("item_holder").add_enabled = false
|
||||
ctx.get_node("item_holder").remove_enabled = false
|
||||
ctx.get_node("status_light").activate()
|
||||
# START THE GAME
|
||||
game = ctx.get_node("%rover_game").create_instance()
|
||||
game.connect("got_treasure", self, "on_got_treasure")
|
||||
game.connect("game_over", self, "on_game_over")
|
||||
ctx.get_node("game_canvas").visible = true
|
||||
player.start_playing_rover_game()
|
||||
|
||||
func exit_to(state):
|
||||
# END THE GAME
|
||||
player.stop_playing_rover_game()
|
||||
ctx.get_node("game_canvas").visible = false
|
||||
if game:
|
||||
game.queue_free()
|
||||
game = null
|
||||
|
||||
func on_coin_machine_coin_requirement_met(player):
|
||||
assert(false, "coin machine should be disabled while playing")
|
||||
|
||||
func on_item_dump_completed():
|
||||
assert(false, "item dump should be disabled while playing")
|
||||
|
||||
func on_damage_taken():
|
||||
if ctx.hp <= 0:
|
||||
ctx.change_state(ctx.StateBroken.new())
|
||||
|
||||
func on_got_treasure(treasure: Resource):
|
||||
ctx.add_treasure(treasure)
|
||||
|
||||
func on_game_over():
|
||||
ctx.change_state(ctx.StateIdle.new())
|
||||
|
||||
func on_player_sleep():
|
||||
ctx.treasure.clear()
|
||||
ctx.change_state(ctx.StateIdle.new())
|
7
scripts/rover_station/state/state_interface.tres
Normal file
7
scripts/rover_station/state/state_interface.tres
Normal file
@ -0,0 +1,7 @@
|
||||
[gd_resource type="Resource" load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://scripts/Interface.gd" type="Script" id=1]
|
||||
|
||||
[resource]
|
||||
script = ExtResource( 1 )
|
||||
method_names = [ "enter_from", "exit_to", "on_coin_machine_coin_requirement_met", "on_item_dump_completed", "on_player_sleep" ]
|
Loading…
x
Reference in New Issue
Block a user