Add rover game and such

This commit is contained in:
Daniel Snider 2022-08-19 05:38:23 -07:00
parent e80cd37534
commit 373838d3e7
37 changed files with 1558 additions and 35 deletions

Binary file not shown.

View File

@ -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://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] [sub_resource type="CylinderShape" id=1]
height = 6.30212 height = 6.30212
radius = 2.14679 radius = 2.14679
[node name="Level" instance=ExtResource( 1 )] [node name="Level" instance=ExtResource( 1 )]
script = ExtResource( 2 )
[node name="RTG" type="StaticBody" parent="." index="81"] [node name="RTG" type="StaticBody" parent="." index="81"]

BIN
assets/level/Rock.material Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View 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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -70,6 +70,11 @@ _global_script_classes=[ {
"path": "res://addons/dialogic/Example Assets/History/HistoryRow.gd" "path": "res://addons/dialogic/Example Assets/History/HistoryRow.gd"
}, { }, {
"base": "Resource", "base": "Resource",
"class": "Interface",
"language": "GDScript",
"path": "res://scripts/Interface.gd"
}, {
"base": "Resource",
"class": "ItemType", "class": "ItemType",
"language": "GDScript", "language": "GDScript",
"path": "res://scripts/ItemType.gd" "path": "res://scripts/ItemType.gd"
@ -97,6 +102,7 @@ _global_script_class_icons={
"DialogicResources": "", "DialogicResources": "",
"DialogicUtil": "", "DialogicUtil": "",
"HistoryRow": "", "HistoryRow": "",
"Interface": "",
"ItemType": "", "ItemType": "",
"Recipe": "", "Recipe": "",
"RecipeDB": "" "RecipeDB": ""
@ -108,6 +114,10 @@ config/name="project-dung"
run/main_scene="res://scenes/main.tscn" run/main_scene="res://scenes/main.tscn"
config/icon="res://icon.png" config/icon="res://icon.png"
[autoload]
InterfaceChecker="*res://scripts/interface_checker.gd"
[display] [display]
window/size/width=1920 window/size/width=1920

View File

@ -2,7 +2,7 @@
[ext_resource path="res://scripts/game_manager.gd" type="Script" id=1] [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 ) script = ExtResource( 1 )
[node name="UI" type="Control" parent="."] [node name="UI" type="Control" parent="."]

View File

@ -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://assets/level/Level.tscn" type="PackedScene" id=1]
[ext_resource path="res://scripts/cameras.gd" type="Script" id=2] [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://scenes/cheat_menu.tscn" type="PackedScene" id=18]
[ext_resource path="res://item_types/ore.tres" type="Resource" id=19] [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://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] [sub_resource type="CylinderShape" id=1]
height = 5.22615 height = 5.22615
@ -375,6 +376,11 @@ text = "Communications"
[node name="comm_station" parent="Communications" instance=ExtResource( 13 )] [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 ) 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="CanvasLayer" type="CanvasLayer" parent="."]
[node name="cheat_menu" parent="CanvasLayer" instance=ExtResource( 18 )] [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_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_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"] [connection signal="player_exited" from="cameras/camera_hydroponics" to="cameras" method="_on_camera_room_player_exited"]
[editable path="Level"]

View File

@ -714,7 +714,7 @@ mesh = SubResource( 1 )
skin = SubResource( 2 ) skin = SubResource( 2 )
[node name="head_bone" type="BoneAttachment" parent="model_transform/DungMan/Armature/Skeleton" index="1"] [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" bone_name = "Item"
[node name="ItemSpawn" type="Spatial" parent="model_transform/DungMan/Armature/Skeleton/head_bone"] [node name="ItemSpawn" type="Spatial" parent="model_transform/DungMan/Armature/Skeleton/head_bone"]

View File

@ -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://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] [sub_resource type="CylinderShape" id=13]
radius = 2.98085 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] [sub_resource type="BoxShape" id=9]
extents = Vector3( 2.90757, 1, 2.12399 ) 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 ) shape = SubResource( 13 )
[node name="visual" type="Spatial" parent="."] [node name="visual" type="Spatial" parent="."]
transform = Transform( -1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0 )
[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 )
[node name="interact_box" type="Area" parent="visual"] [node name="interact_box" type="Area" parent="visual"]
unique_name_in_owner = true 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_layer = 4
collision_mask = 8 collision_mask = 8
[node name="CollisionShape" type="CollisionShape" parent="visual/interact_box"] [node name="CollisionShape" type="CollisionShape" parent="visual/interact_box"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.39215 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.39215 )
shape = SubResource( 9 ) 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 )

View File

@ -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://scenes/rover.tscn" type="PackedScene" id=1]
[ext_resource path="res://assets/rover_level/RoverGame.glb" type="PackedScene" id=4] [ext_resource path="res://assets/rover_level/RoverGame.glb" type="PackedScene" id=4]
@ -8,14 +8,10 @@
[sub_resource type="BoxShape" id=7] [sub_resource type="BoxShape" id=7]
extents = Vector3( 21.7976, 4.38074, 5.34608 ) 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] [sub_resource type="Environment" id=5]
background_mode = 2 background_mode = 2
background_sky = SubResource( 6 )
background_color = Color( 0.752941, 0.752941, 0.752941, 1 ) 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_enabled = true
ssao_radius = 15.99 ssao_radius = 15.99
ssao_intensity = 3.14 ssao_intensity = 3.14
@ -29,13 +25,20 @@ extents = Vector3( 100, 1, 400 )
script = ExtResource( 6 ) script = ExtResource( 6 )
[node name="RoverGame" parent="." instance=ExtResource( 4 )] [node name="RoverGame" parent="." instance=ExtResource( 4 )]
__meta__ = {
"_edit_group_": true
}
[node name="rover" parent="." instance=ExtResource( 1 )] [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 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="."] [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 current = true
script = ExtResource( 5 ) 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 ) shape = SubResource( 8 )
[node name="Timer" type="Timer" parent="."] [node name="Timer" type="Timer" parent="."]
wait_time = 60.0
one_shot = true one_shot = true
autostart = 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"]] [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 ) 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="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="RoverGame"]
[editable path="rover"]

53
scenes/rover_station.tscn Normal file
View 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
View 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
View 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
View 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")

View File

@ -0,0 +1,4 @@
extends Node
func _init():
Interface.check_all_scripts("res://scripts")

View File

@ -5,6 +5,7 @@ signal starved_to_death
const StateDefault = preload("res://scripts/player/state/default.gd") const StateDefault = preload("res://scripts/player/state/default.gd")
const StateInteracting = preload("res://scripts/player/state/interacting.gd") const StateInteracting = preload("res://scripts/player/state/interacting.gd")
const StateSleeping = preload("res://scripts/player/state/sleeping.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 SPEED = 10.0
const MAX_HEALTH = 4 const MAX_HEALTH = 4
@ -133,3 +134,8 @@ func _on_blink_timer_timeout():
func sleep(made_it_to_bed: bool, hop_position: Spatial): func sleep(made_it_to_bed: bool, hop_position: Spatial):
state.on_sleep(made_it_to_bed, hop_position) 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()

View File

@ -1,5 +1,6 @@
extends Reference extends Reference
const INTERFACES = [preload("res://scripts/player/state/state_interface.tres")]
const NAME = "default" const NAME = "default"
const EPSILON = 0.0001 const EPSILON = 0.0001
@ -7,9 +8,6 @@ var ctx = null
var anim_tree: AnimationTree var anim_tree: AnimationTree
var move_playback var move_playback
func _init():
pass
func enter_from(state): func enter_from(state):
anim_tree = ctx.get_node("model_transform/DungMan/AnimationTree") anim_tree = ctx.get_node("model_transform/DungMan/AnimationTree")
move_playback = anim_tree["parameters/Move/playback"] 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): func on_sleep(made_it_to_bed: bool, hop_position: Spatial):
ctx.change_state(ctx.StateSleeping.new(made_it_to_bed, hop_position)) 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")

View File

@ -1,5 +1,6 @@
extends Reference extends Reference
const INTERFACES = [preload("res://scripts/player/state/state_interface.tres")]
const NAME = "interacting" const NAME = "interacting"
var ctx: KinematicBody = null var ctx: KinematicBody = null
@ -17,7 +18,8 @@ func enter_from(state):
timer.connect("timeout", self, "_on_timeout", [], CONNECT_ONESHOT) timer.connect("timeout", self, "_on_timeout", [], CONNECT_ONESHOT)
func exit_to(state): func exit_to(state):
pass if timer.is_connected("timeout", self, "_on_timeout"):
timer.disconnect("timeout", self, "_on_timeout")
func physics_process(delta): func physics_process(delta):
pass pass
@ -50,5 +52,10 @@ func try_trigger_interact(area) -> bool:
return true return true
func on_sleep(made_it_to_bed: bool, hop_position: Spatial): 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)) 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")

View 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())

View File

@ -1,5 +1,6 @@
extends Reference extends Reference
const INTERFACES = [preload("res://scripts/player/state/state_interface.tres")]
const NAME = "sleeping" const NAME = "sleeping"
var ctx: KinematicBody = null 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 made_it_to_bed = p_made_it_to_bed
func enter_from(state): 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] 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") model_transform = ctx.get_node("model_transform")
anim_player = ctx.get_node("model_transform/node_animations") 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): func on_sleep(made_it_to_bed: bool, hop_position: Spatial):
assert(false, "shouldn't be able to sleep while sleeping") 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

View 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" ]

View File

@ -1,5 +1,6 @@
extends RigidBody extends RigidBody
export var treasure: Resource
func _ready(): func _ready():
$hit_box.set_meta("owner", self) $hit_box.set_meta("owner", self)

View File

@ -1,11 +1,17 @@
extends RigidBody extends RigidBody
const EPSILON = 0.0001
const SPEED = 300.0 const SPEED = 300.0
const TURN = 2.5 const TURN = 2.5
var heading := Vector3.FORWARD var heading := Vector3.BACK
func _physics_process(delta): 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) $visual.global_transform = $visual.global_transform.looking_at($visual.global_transform.origin + heading, Vector3.UP)
func _integrate_forces(state): func _integrate_forces(state):

View File

@ -1,6 +1,19 @@
extends Spatial 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(): func _ready():
$Timer.start(play_time)
spawn_rocks(10) spawn_rocks(10)
func spawn_rocks(count: int): func spawn_rocks(count: int):
@ -10,12 +23,17 @@ func spawn_rocks(count: int):
var location = locations[i] var location = locations[i]
var rock = preload("res://scenes/rock.tscn").instance() var rock = preload("res://scenes/rock.tscn").instance()
location.add_child(rock) location.add_child(rock)
func _on_collection_area_area_entered(area): func _on_collection_area_area_entered(area):
if area.has_meta("owner"): if area.has_meta("owner"):
area = area.get_meta("owner") area = area.get_meta("owner")
area.queue_free() area.queue_free()
emit_signal("got_treasure", preload("res://item_types/ore.tres"))
func _process(delta): func _process(delta):
$"%progress_bar".value = $Timer.time_left * 100.0 / $Timer.wait_time $"%progress_bar".value = $Timer.time_left * 100.0 / $Timer.wait_time
func _on_Timer_timeout():
emit_signal("game_over")

View 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())

View 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()

View 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()

View 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())

View 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" ]