From 96dea6e1a35096e89b3c11802dc67b936ff17f4f Mon Sep 17 00:00:00 2001 From: bquan0 Date: Wed, 10 Jan 2024 22:17:13 -0600 Subject: [PATCH 1/6] make the game look prettier --- .gitignore | 4 +- default_env.tres | 1 + fonts/TitilliumWeb/OFL.txt | 93 +++ fonts/TitilliumWeb/TitilliumWeb-Bold.ttf | Bin 0 -> 53896 bytes fonts/TitilliumWeb/TitilliumWeb-Regular.ttf | Bin 0 -> 57392 bytes project.godot | 21 +- scenes/GeigerCounter.tscn | 167 +++--- scenes/Instructions1.tscn | 34 ++ scenes/Level1.tscn | 75 +++ scenes/LevelSelect.tscn | 132 +++++ scenes/LoadingScreen.tscn | 39 ++ scenes/LvlCompleteScreen.tscn | 177 ++++++ scenes/Main.tscn | 20 - scenes/MainMenu.tscn | 623 ++++++++++++++++++++ scenes/ObjNotif.tscn | 75 +++ scenes/Objectives1.tscn | 50 ++ scenes/PauseScreen.tscn | 73 +++ scenes/Player.tscn | 4 +- scenes/RadioactiveRoom.tscn | 551 ++++++++++++++++- scenes/Wall.tscn | 64 ++ scripts/CameraJoint.gd | 12 +- scripts/ClickSound.gd | 1 - scripts/GeigerViewport.gd | 6 - scripts/Global.gd | 82 +++ scripts/Level1.gd | 145 +++++ scripts/LevelSelect.gd | 10 + scripts/LvlCompleteScreen.gd | 31 + scripts/MCNPMesh.gd | 19 +- scripts/Main.gd | 49 -- scripts/MainMenu.gd | 21 + scripts/ObjNotif.gd | 33 ++ scripts/PauseScreen.gd | 39 ++ scripts/Player.gd | 22 +- scripts/TabScreen.gd | 8 +- text_theme.tres | 23 + 35 files changed, 2516 insertions(+), 188 deletions(-) create mode 100644 fonts/TitilliumWeb/OFL.txt create mode 100644 fonts/TitilliumWeb/TitilliumWeb-Bold.ttf create mode 100644 fonts/TitilliumWeb/TitilliumWeb-Regular.ttf create mode 100644 scenes/Instructions1.tscn create mode 100644 scenes/Level1.tscn create mode 100644 scenes/LevelSelect.tscn create mode 100644 scenes/LoadingScreen.tscn create mode 100644 scenes/LvlCompleteScreen.tscn delete mode 100644 scenes/Main.tscn create mode 100644 scenes/MainMenu.tscn create mode 100644 scenes/ObjNotif.tscn create mode 100644 scenes/Objectives1.tscn create mode 100644 scenes/PauseScreen.tscn create mode 100644 scenes/Wall.tscn delete mode 100644 scripts/GeigerViewport.gd create mode 100644 scripts/Global.gd create mode 100644 scripts/Level1.gd create mode 100644 scripts/LevelSelect.gd create mode 100644 scripts/LvlCompleteScreen.gd delete mode 100644 scripts/Main.gd create mode 100644 scripts/MainMenu.gd create mode 100644 scripts/ObjNotif.gd create mode 100644 scripts/PauseScreen.gd create mode 100644 text_theme.tres diff --git a/.gitignore b/.gitignore index 7c1510c..24b84c3 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,6 @@ mono_crash.*.json # ignore potentially large filetypes *.csv *.obj -*.ogg \ No newline at end of file +*.ogg +*.png +*.jpg diff --git a/default_env.tres b/default_env.tres index 20207a4..605c703 100644 --- a/default_env.tres +++ b/default_env.tres @@ -5,3 +5,4 @@ [resource] background_mode = 2 background_sky = SubResource( 1 ) +ss_reflections_enabled = true diff --git a/fonts/TitilliumWeb/OFL.txt b/fonts/TitilliumWeb/OFL.txt new file mode 100644 index 0000000..bbaa23a --- /dev/null +++ b/fonts/TitilliumWeb/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino and students of MA course of Visual design. Some rights reserved. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/TitilliumWeb/TitilliumWeb-Bold.ttf b/fonts/TitilliumWeb/TitilliumWeb-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b3d8c34f7930aee35b50617c781b502f50a688d5 GIT binary patch literal 53896 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 X)(&e`= (-1) * half_camera_fov: + # make sure the objective cannot be completed more than once + saw_cylinder = true + # check off the objective + SeeCylinderObj.pressed = true + # show a notification for the objective that was completed + $ObjNotif.add_notification(SeeCylinderObj.text) + + +func _on_EndZone_body_entered(body): + if body == Player: + # show the CompLvlText prompt + CompLvlText.visible = true + if !reached_end_zone: + # make sure the objective cannot be completed more than once + reached_end_zone = true + # check off the objective + ReachEndZoneObj.pressed = true + # show a notification for the objective that was completed + $ObjNotif.add_notification(ReachEndZoneObj.text) + + +func _on_EndZone_body_exited(body): + if body == Player: + # hide the CompLvlText prompt + CompLvlText.visible = false diff --git a/scripts/LevelSelect.gd b/scripts/LevelSelect.gd new file mode 100644 index 0000000..accc1c8 --- /dev/null +++ b/scripts/LevelSelect.gd @@ -0,0 +1,10 @@ +extends Panel + +func _on_LevelButton1_pressed(): + Global.load_scene("res://scenes/Level1.tscn") + +func _on_LevelButton1_mouse_entered(): + $HBoxContainer/ColorRect/TextureRect1.visible = true + +func _on_LevelButton1_mouse_exited(): + $HBoxContainer/ColorRect/TextureRect1.visible = false diff --git a/scripts/LvlCompleteScreen.gd b/scripts/LvlCompleteScreen.gd new file mode 100644 index 0000000..06ed4ea --- /dev/null +++ b/scripts/LvlCompleteScreen.gd @@ -0,0 +1,31 @@ +extends Panel + +var next_level # number of the next level + +# Called when the node enters the scene tree for the first time. +func _ready(): + # hide the level complete screen on startup + visible = false + $CanvasLayer.visible = false + modulate.a = 0 + +func _notification(what): + if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST: + get_tree().quit() # default behavior to quit game + +func _on_LevelSelectButton_pressed(): + # change scene to Level Select scene + Global.go_to_scene("res://scenes/LevelSelect.tscn") + +func _on_QuitButton_pressed(): + # send notification to quit game + get_tree().notification(MainLoop.NOTIFICATION_WM_QUIT_REQUEST) + +func _on_ContinueButton_pressed(): + # go to next level + Global.load_scene("res://scenes/Level%s.tscn" % next_level) + +func show(): + visible = true + $CanvasLayer.visible = true + $AnimationPlayer.play("FadeIn") diff --git a/scripts/MCNPMesh.gd b/scripts/MCNPMesh.gd index ec0588c..8b120fd 100644 --- a/scripts/MCNPMesh.gd +++ b/scripts/MCNPMesh.gd @@ -26,6 +26,9 @@ var y_is_up = true # bool for whether to show the current voxel mesh var show_voxel = false +# paths to nodes to improve performance +onready var CurrentVoxel = $CurrentVoxel + # Used to get the x,y,z boundaries of the voxels in the radiation map # units is the units of the boundaries. (Ex. if boundaries are in cm, units # would be 1/100) @@ -91,7 +94,7 @@ func initialize(csv_file_name, y_is_up_IN, units_IN): max_index = radiation_map.size() # hide the current voxel mesh on startup - $CurrentVoxel.visible = show_voxel + CurrentVoxel.visible = show_voxel # returns the index of the largest value in the array that is still smaller @@ -137,7 +140,7 @@ func get_radiation(x, y, z): # return early if any indices are -1 (indicates player is not in radiation map) if x_index == -1 or y_index == -1 or z_index == -1: - $CurrentVoxel.visible = false + CurrentVoxel.visible = false return [value, centroid] # calculate index of voxel that the player is in @@ -160,18 +163,18 @@ func get_radiation(x, y, z): # only update and show the voxel if we want it shown if index != prev_index and show_voxel: # set mesh's position to voxel's centroid - $CurrentVoxel.translation = centroid + CurrentVoxel.translation = centroid # set size of mesh - $CurrentVoxel.scale.x = bounds_x[x_index + 1] - bounds_x[x_index] - $CurrentVoxel.scale.y = bounds_y[y_index + 1] - bounds_y[y_index] - $CurrentVoxel.scale.z = bounds_z[z_index + 1] - bounds_z[z_index] + CurrentVoxel.scale.x = bounds_x[x_index + 1] - bounds_x[x_index] + CurrentVoxel.scale.y = bounds_y[y_index + 1] - bounds_y[y_index] + CurrentVoxel.scale.z = bounds_z[z_index + 1] - bounds_z[z_index] # update prev_index to latest index queried prev_index = index # show the mesh - $CurrentVoxel.visible = true + CurrentVoxel.visible = true # return an array with the radiation value and the voxel position return [value, centroid] @@ -179,4 +182,4 @@ func get_radiation(x, y, z): # toggles whether the current voxel mesh is shown or not func toggle_show_voxel(): show_voxel = !show_voxel - $CurrentVoxel.visible = show_voxel + CurrentVoxel.visible = show_voxel diff --git a/scripts/Main.gd b/scripts/Main.gd deleted file mode 100644 index 67dd61c..0000000 --- a/scripts/Main.gd +++ /dev/null @@ -1,49 +0,0 @@ -extends Node - -var sources # all the radioactive sources in the scene -var accumulated_radiation # total radiation accumulated over time - -# Called when the node enters the scene tree for the first time. -func _ready(): - sources = get_tree().get_nodes_in_group("sources") - accumulated_radiation = 0.0 - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - var player_pos = $Player/CameraJoint/Camera/GeigerCounter.global_transform.origin - - var voxel_text = "" - var total_radiation = 0 - var index = 1 - # iterate through all sources - for source in sources: - var radiation = source.get_radiation(player_pos.x, player_pos.y, player_pos.z) - total_radiation += radiation[0] - - # add text for the voxel position the player is in - voxel_text += "\n%s. %s [%s, %s, %s] %s" % [index, source.name, radiation[1].x, \ - radiation[1].y, radiation[1].z, radiation[0]] - - # increment index - index += 1 - - accumulated_radiation += total_radiation * delta - - # set the label's text with total radiation and voxel positions - $TabScreen/RadiationText.text = "Accumulated Radiation: %s\n" % accumulated_radiation - $TabScreen/RadiationText.text += "Total Radiation: %s" % total_radiation - $TabScreen/RadiationText.text += voxel_text - - # set value on GeigerCounter - $Player.set_GeigerCounter_value(total_radiation) - - # set timeout on ClickTimer for the click sound - $Player.GC_click_sound.set_radiation(total_radiation) - - # toggle whether current voxels in the MCNPMeshes are shown if v is pressed. - if Input.is_action_just_pressed("toggle_debug"): - for source in sources: - source.toggle_show_voxel() - - diff --git a/scripts/MainMenu.gd b/scripts/MainMenu.gd new file mode 100644 index 0000000..5cc4ed6 --- /dev/null +++ b/scripts/MainMenu.gd @@ -0,0 +1,21 @@ +extends Panel + +onready var animation = 0 + +func _process(delta): + if !$AnimationPlayer.is_playing(): + $AnimationPlayer.play("Move%s" % animation) + animation = (animation + 1) % 4 + + +func _notification(what): + if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST: + get_tree().quit() # default behavior to quit game + +func _on_StartButton_pressed(): + # change scene to Level Select scene + Global.go_to_scene("res://scenes/LevelSelect.tscn") + +func _on_QuitButton_pressed(): + # send notification to quit game + get_tree().notification(MainLoop.NOTIFICATION_WM_QUIT_REQUEST) diff --git a/scripts/ObjNotif.gd b/scripts/ObjNotif.gd new file mode 100644 index 0000000..45402a1 --- /dev/null +++ b/scripts/ObjNotif.gd @@ -0,0 +1,33 @@ +extends Panel + +# create an array as a queue for objectives +var objectives = [] +# only show a new notification if we aren't showing one now +onready var showing_notification = false + +func _ready(): + visible = false + modulate.a = 0 + +func _process(delta): + if objectives and !showing_notification: + show_notification(objectives.pop_front()) + +func add_notification(objective): + objectives.push_back(objective) + +func show_notification(objective): + showing_notification = true + visible = true + $Label.text = "Objective Complete: %s" % objective + # play the fade in and fade out animation + $AnimationPlayer.play("Fade") + # hide the notification after 3s + $Timer.start(3.0) + +func _on_Timer_timeout(): + # hide the notification + visible = false + # allow the next notification to be shown + showing_notification = false + diff --git a/scripts/PauseScreen.gd b/scripts/PauseScreen.gd new file mode 100644 index 0000000..adb4adb --- /dev/null +++ b/scripts/PauseScreen.gd @@ -0,0 +1,39 @@ +extends Control + +var show_pause # whether the pause screen is visible or not +var InstObj # reference to the InstObj of this level + +func _ready(): + show_pause = false + visible = false; + $CanvasLayer.visible = false + $CanvasLayer2.visible = false + +func _notification(what): + if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST: + get_tree().quit() # default behavior to quit game + +func _on_LevelSelectButton_pressed(): + # change scene to Level Select scene + Global.go_to_scene("res://scenes/LevelSelect.tscn") + # unpause the game + get_tree().paused = false + # allow player to move mouse around + Input.call_deferred("set_mouse_mode", Input.MOUSE_MODE_VISIBLE) + +func _on_QuitButton_pressed(): + # send notification to quit game + get_tree().notification(MainLoop.NOTIFICATION_WM_QUIT_REQUEST) + +func _unhandled_key_input(event): + if event.is_action_pressed("esc"): + show_pause = !show_pause + visible = show_pause + $CanvasLayer.visible = show_pause + $CanvasLayer2.visible = show_pause + InstObj.visible = show_pause + get_tree().paused = show_pause + if show_pause: + # let player move mouse (in case he is fully zoomed in) + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + diff --git a/scripts/Player.gd b/scripts/Player.gd index 8be7869..8c534d9 100644 --- a/scripts/Player.gd +++ b/scripts/Player.gd @@ -1,14 +1,11 @@ extends KinematicBody - export var speed = 2 var velocity = Vector3.ZERO -onready var GC_click_sound = $CameraJoint/Camera/GeigerCounter/ClickSound - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. +# paths to nodes to improve performance +onready var CameraJoint = $CameraJoint +onready var GC_ValueLabel = $CameraJoint/Camera/GeigerCounter/ValueLabel func _physics_process(delta): var direction = Vector3.ZERO @@ -25,15 +22,20 @@ func _physics_process(delta): direction += Vector3.UP if Input.is_action_pressed("move_down"): direction += Vector3.DOWN + # allow player to sprint by pressing shift + if Input.is_action_pressed("sprint"): + speed = 4 + else: + speed = 2 # change rotation of the player based on movement if direction != Vector3.ZERO: # rotate the direction of motion so it's relative to the camera's position - direction = direction.rotated(Vector3.UP, $CameraJoint.rotation.y).normalized() + direction = direction.rotated(Vector3.UP, CameraJoint.rotation.y).normalized() # make the player look in the direction of motion # this changes the model's orientation # only do this if we're not zoomed in (1st person mode) - if ($CameraJoint.spring_length != 0): + if (CameraJoint.spring_length != 0): var look_direction = Vector2(direction.z, direction.x) rotation.y = look_direction.angle() @@ -42,8 +44,8 @@ func _physics_process(delta): velocity = move_and_slide(velocity, Vector3.UP) # move the camera with the player - $CameraJoint.translation = translation + CameraJoint.translation = translation func set_GeigerCounter_value(value): - $CameraJoint/Camera/GeigerCounter/Sprite3D2/GeigerViewport/Label.text = "%.7f" % value + GC_ValueLabel.text = "%.7f" % value diff --git a/scripts/TabScreen.gd b/scripts/TabScreen.gd index 0a5a397..fa58cf2 100644 --- a/scripts/TabScreen.gd +++ b/scripts/TabScreen.gd @@ -1,9 +1,13 @@ extends Control +onready var lvl_complete = false + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): - # if TAB is pressed, display the TabScreen - visible = Input.is_action_pressed("ui_focus_next") + # display the TabScreen when TAB is pressed, but only when we haven't + # completed the level + if !lvl_complete: + visible = Input.is_action_pressed("ui_focus_next") func set_RadiationText(text): $RadiationText.text = text diff --git a/text_theme.tres b/text_theme.tres new file mode 100644 index 0000000..72fcbe9 --- /dev/null +++ b/text_theme.tres @@ -0,0 +1,23 @@ +[gd_resource type="Theme" load_steps=5 format=2] + +[ext_resource path="res://fonts/TitilliumWeb/TitilliumWeb-Bold.ttf" type="DynamicFontData" id=1] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.337255, 0.0352941, 0.0352941, 1 ) + +[sub_resource type="StyleBoxFlat" id=2] +bg_color = Color( 0.596078, 0.101961, 0.101961, 1 ) + +[sub_resource type="DynamicFont" id=3] +size = 37 +font_data = ExtResource( 1 ) + +[resource] +default_font = SubResource( 3 ) +Button/colors/font_color = Color( 1, 1, 1, 1 ) +Button/colors/font_color_disabled = Color( 1, 1, 1, 1 ) +Button/colors/font_color_focus = Color( 1, 1, 1, 1 ) +Button/colors/font_color_hover = Color( 0.580392, 0.580392, 0.580392, 1 ) +Button/colors/font_color_pressed = Color( 0.364706, 0.364706, 0.364706, 1 ) +Button/styles/hover = SubResource( 1 ) +Button/styles/normal = SubResource( 2 ) From 47ca080039c10da5bf029fc4fbf34288024e9634 Mon Sep 17 00:00:00 2001 From: bquan0 Date: Thu, 11 Jan 2024 10:49:48 -0600 Subject: [PATCH 2/6] remove Wall.tscn and simplify PauseScreen hierarchy --- scenes/PauseScreen.tscn | 38 ++++++++++++------------ scenes/Wall.tscn | 64 ----------------------------------------- scripts/PauseScreen.gd | 9 ++---- 3 files changed, 21 insertions(+), 90 deletions(-) delete mode 100644 scenes/Wall.tscn diff --git a/scenes/PauseScreen.tscn b/scenes/PauseScreen.tscn index 019c73c..8407ed6 100644 --- a/scenes/PauseScreen.tscn +++ b/scenes/PauseScreen.tscn @@ -1,8 +1,14 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=9 format=2] [ext_resource path="res://fonts/TitilliumWeb/TitilliumWeb-Bold.ttf" type="DynamicFontData" id=1] [ext_resource path="res://scripts/PauseScreen.gd" type="Script" id=2] +[sub_resource type="StyleBoxFlat" id=15] +bg_color = Color( 0.0117647, 0.188235, 0.282353, 0.603922 ) + +[sub_resource type="Theme" id=16] +Panel/styles/panel = SubResource( 15 ) + [sub_resource type="StyleBoxFlat" id=12] bg_color = Color( 0.196078, 0.196078, 0.196078, 1 ) @@ -20,23 +26,23 @@ Button/styles/hover = SubResource( 12 ) size = 70 font_data = ExtResource( 1 ) -[node name="PauseScreen" type="Control"] +[node name="PauseScreen" type="Panel"] pause_mode = 2 anchor_right = 1.0 anchor_bottom = 1.0 +theme = SubResource( 16 ) script = ExtResource( 2 ) [node name="CanvasLayer" type="CanvasLayer" parent="."] +layer = 3 [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] -margin_right = 1024.0 -margin_bottom = 600.0 -color = Color( 0.0117647, 0.188235, 0.282353, 0.603922 ) - -[node name="CanvasLayer2" type="CanvasLayer" parent="."] -layer = 3 +margin_top = 90.0 +margin_right = 1020.0 +margin_bottom = 490.0 +color = Color( 1, 1, 1, 0 ) -[node name="QuitButton" type="Button" parent="CanvasLayer2"] +[node name="QuitButton" type="Button" parent="."] margin_left = 637.0 margin_top = 501.0 margin_right = 899.0 @@ -44,7 +50,7 @@ margin_bottom = 578.0 theme = SubResource( 14 ) text = "Quit" -[node name="LevelSelectButton" type="Button" parent="CanvasLayer2"] +[node name="LevelSelectButton" type="Button" parent="."] margin_left = 125.0 margin_top = 500.0 margin_right = 387.0 @@ -52,7 +58,7 @@ margin_bottom = 577.0 theme = SubResource( 14 ) text = "Level Select" -[node name="Title" type="Label" parent="CanvasLayer2"] +[node name="Title" type="Label" parent="."] margin_top = 3.0 margin_right = 1024.0 margin_bottom = 111.0 @@ -63,11 +69,5 @@ __meta__ = { "_edit_use_anchors_": true } -[node name="ColorRect" type="ColorRect" parent="CanvasLayer2"] -margin_top = 90.0 -margin_right = 1020.0 -margin_bottom = 490.0 -color = Color( 1, 1, 1, 0 ) - -[connection signal="pressed" from="CanvasLayer2/QuitButton" to="." method="_on_QuitButton_pressed"] -[connection signal="pressed" from="CanvasLayer2/LevelSelectButton" to="." method="_on_LevelSelectButton_pressed"] +[connection signal="pressed" from="QuitButton" to="." method="_on_QuitButton_pressed"] +[connection signal="pressed" from="LevelSelectButton" to="." method="_on_LevelSelectButton_pressed"] diff --git a/scenes/Wall.tscn b/scenes/Wall.tscn deleted file mode 100644 index ff3a825..0000000 --- a/scenes/Wall.tscn +++ /dev/null @@ -1,64 +0,0 @@ -[gd_scene load_steps=14 format=2] - -[ext_resource path="res://textures/WhitePlaster/Plaster001_1K-JPG_NormalGL.jpg" type="Texture" id=1] -[ext_resource path="res://textures/WhitePlaster/Plaster001_1K-JPG_Displacement.jpg" type="Texture" id=2] -[ext_resource path="res://textures/WhitePlaster/Plaster001_1K-JPG_Color.jpg" type="Texture" id=3] -[ext_resource path="res://textures/WhitePlaster/Plaster001_1K-JPG_Roughness.jpg" type="Texture" id=4] -[ext_resource path="res://textures/Wood2/Wood058_1K-JPG_Color.jpg" type="Texture" id=5] -[ext_resource path="res://textures/Wood2/Wood058_1K-JPG_NormalGL.jpg" type="Texture" id=6] -[ext_resource path="res://textures/Wood2/Wood058_1K-JPG_Roughness.jpg" type="Texture" id=7] -[ext_resource path="res://textures/Wood2/Wood058_1K-JPG_Displacement.jpg" type="Texture" id=8] - -[sub_resource type="CubeMesh" id=2] -size = Vector3( 1, 1, 1 ) - -[sub_resource type="SpatialMaterial" id=1] -albedo_texture = ExtResource( 3 ) -roughness_texture = ExtResource( 4 ) -normal_enabled = true -normal_scale = -1.0 -normal_texture = ExtResource( 1 ) -depth_enabled = true -depth_scale = -0.05 -depth_deep_parallax = false -depth_flip_tangent = false -depth_flip_binormal = false -depth_texture = ExtResource( 2 ) -uv1_triplanar = true - -[sub_resource type="BoxShape" id=3] - -[sub_resource type="CubeMesh" id=4] -size = Vector3( 1, 1, 1 ) - -[sub_resource type="SpatialMaterial" id=5] -albedo_texture = ExtResource( 5 ) -roughness_texture = ExtResource( 7 ) -normal_enabled = true -normal_scale = -1.0 -normal_texture = ExtResource( 6 ) -depth_enabled = true -depth_scale = -0.01 -depth_deep_parallax = false -depth_flip_tangent = false -depth_flip_binormal = false -depth_texture = ExtResource( 8 ) -uv1_triplanar = true - -[node name="Wall" type="StaticBody"] - -[node name="MeshInstance" type="MeshInstance" parent="."] -transform = Transform( 0.25, 0, 0, 0, 1.25, 0, 0, 0, 1, 0, 0, 0 ) -mesh = SubResource( 2 ) -material/0 = SubResource( 1 ) - -[node name="CollisionShape" type="CollisionShape" parent="."] -shape = SubResource( 3 ) - -[node name="MeshInstance2" type="MeshInstance" parent="."] -transform = Transform( 0.005, 0, 0, 0, -4.37114e-08, -0.05, 0, 1, -2.18557e-09, 0.127, -0.6, 0 ) -mesh = SubResource( 4 ) -material/0 = SubResource( 5 ) - -[node name="DirectionalLight" type="DirectionalLight" parent="."] -transform = Transform( 1, 0, 0, 0, 0.0913452, 0.995819, 0, -0.995819, 0.0913452, 0, 2.07489e-07, 4.87504 ) diff --git a/scripts/PauseScreen.gd b/scripts/PauseScreen.gd index adb4adb..0cb0086 100644 --- a/scripts/PauseScreen.gd +++ b/scripts/PauseScreen.gd @@ -1,4 +1,4 @@ -extends Control +extends Panel var show_pause # whether the pause screen is visible or not var InstObj # reference to the InstObj of this level @@ -7,7 +7,6 @@ func _ready(): show_pause = false visible = false; $CanvasLayer.visible = false - $CanvasLayer2.visible = false func _notification(what): if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST: @@ -16,10 +15,6 @@ func _notification(what): func _on_LevelSelectButton_pressed(): # change scene to Level Select scene Global.go_to_scene("res://scenes/LevelSelect.tscn") - # unpause the game - get_tree().paused = false - # allow player to move mouse around - Input.call_deferred("set_mouse_mode", Input.MOUSE_MODE_VISIBLE) func _on_QuitButton_pressed(): # send notification to quit game @@ -27,10 +22,10 @@ func _on_QuitButton_pressed(): func _unhandled_key_input(event): if event.is_action_pressed("esc"): + # toggle whether the game is paused or not show_pause = !show_pause visible = show_pause $CanvasLayer.visible = show_pause - $CanvasLayer2.visible = show_pause InstObj.visible = show_pause get_tree().paused = show_pause if show_pause: From 2038ae9ab80ed1fdf84c09bbbf576e9b9f0f9e69 Mon Sep 17 00:00:00 2001 From: bquan0 Date: Thu, 11 Jan 2024 13:30:34 -0600 Subject: [PATCH 3/6] add functions for readability and reusability --- scripts/Global.gd | 23 ++++++++++++++- scripts/Level1.gd | 72 ++++++++++++++++++----------------------------- 2 files changed, 49 insertions(+), 46 deletions(-) diff --git a/scripts/Global.gd b/scripts/Global.gd index c5bcefb..dd2bbc9 100644 --- a/scripts/Global.gd +++ b/scripts/Global.gd @@ -28,13 +28,14 @@ func load_scene(next_scene): # load next scene using poll() # poll() needs to be in a loop because it loads data in chunks + var loader_stage_mult = 100.0 / loader.get_stage_count() while true: var status = loader.poll() # a chunk of data was loaded if status == OK: # update progress bar according to amount of data loaded var progress_bar = loading_scene_instance.get_node("./CanvasLayer2/ProgressBar") - progress_bar.value = float(loader.get_stage()) / loader.get_stage_count() * 100 + progress_bar.value = float(loader.get_stage()) * loader_stage_mult # finished loading next scene elif status == ERR_FILE_EOF: @@ -80,3 +81,23 @@ func make_game_playable(): get_tree().paused = false # let player move mouse Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + +# raycasts from the camera to the object to see if there are no objects between them +# ignore: array of objects to ignore in the raycast +# returns true if there are no objects between them, false otherwise +func camera_sees_object(camera, object, ignore): + # get fov of the camera + var half_camera_fov = camera.fov / 2.0 + # raycast from camera to object + var space = get_viewport().world.direct_space_state + var obj_between = space.intersect_ray(camera.global_transform.origin, object.global_transform.origin, ignore) + # check if there's nothing between camera and object + if obj_between and obj_between.collider == object: + # check if the object is in the camera's FOV (using dot product and angles) + var cam_vector = -1 * camera.get_global_transform().basis.z + var cam_to_obj_vector = object.global_transform.origin - camera.global_transform.origin + var dot_product = cam_vector.dot(cam_to_obj_vector) + var angle = acos(dot_product / (cam_vector.length() * cam_to_obj_vector.length())) + var angle_deg = rad2deg(angle) + # camera saw the object if the object is in Camera's FOV + return (angle_deg <= half_camera_fov and angle_deg >= (-1) * half_camera_fov) diff --git a/scripts/Level1.gd b/scripts/Level1.gd index 7895bc0..1a1f028 100644 --- a/scripts/Level1.gd +++ b/scripts/Level1.gd @@ -2,7 +2,6 @@ extends Node var sources # all the radioactive sources in the scene var accumulated_radiation # total radiation accumulated over time -var half_camera_fov # half the FOV of the player's camera # bools for objectives onready var saw_cylinder = false # whether the player has seen the cylinder @@ -33,7 +32,6 @@ func _ready(): $InstObj1.visible = false # hide the CompLvlText prompt when player isn't in EndZone CompLvlText.visible = false - half_camera_fov = PlayerCamera.fov / 2.0 # set the next level LvlCompleteScreen.next_level = 1 # TODO change this to 2 @@ -76,55 +74,39 @@ func _process(delta): source.toggle_show_voxel() if !saw_cylinder: - check_cylinder_objective() - - # show LvlCompleteScreen if the player presses "f" in the EndZone - if CompLvlText.visible and Input.is_action_pressed("interact") and !lvl_complete: - # prevent this from happening more than once - lvl_complete = true - # remove PauseScreen to prevent player from pressing "esc" to open it - $PauseScreen.queue_free() - # prevent TabScreen from being opened - $TabScreen.lvl_complete = true - # reparent Objectives node (getchild, removechild, addchild) - var objectives = $InstObj1/VBoxContainer/Objectives1 - $InstObj1/VBoxContainer.remove_child(objectives) - LvlCompleteScreen.add_child(objectives) - # move objectives to a better position - objectives.rect_position = RadiationReceived.rect_position - objectives.rect_position.y += RadiationReceived.rect_size.y + 20 - - # pause the game - get_tree().paused = true - # let player move mouse (in case he is fully zoomed in) - Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) - - # show the screen - LvlCompleteScreen.show() - - - -func check_cylinder_objective(): - # raycast from player's camera to cylinder (and ignore the glass wall) - var space = get_viewport().world.direct_space_state - var obj_between = space.intersect_ray(PlayerCamera.global_transform.origin, Cylinder.global_transform.origin, [GlassWall]) - # check if there's nothing between Camera and Cylinder - if obj_between and obj_between.collider == Cylinder: - # check if the Cylinder is in the Camera's FOV (using dot product and angles) - var cam_vector = -1 * PlayerCamera.get_global_transform().basis.z - var cam_to_cylnd_vector = Cylinder.global_transform.origin - PlayerCamera.global_transform.origin - var dot_product = cam_vector.dot(cam_to_cylnd_vector) - var angle = acos(dot_product / (cam_vector.length() * cam_to_cylnd_vector.length())) - var angle_deg = rad2deg(angle) - # player saw the Cylinder if the Cylinder is in Camera's FOV - if angle_deg <= half_camera_fov and angle_deg >= (-1) * half_camera_fov: + if Global.camera_sees_object(PlayerCamera, Cylinder, [GlassWall]): # make sure the objective cannot be completed more than once saw_cylinder = true # check off the objective SeeCylinderObj.pressed = true # show a notification for the objective that was completed $ObjNotif.add_notification(SeeCylinderObj.text) - + + # show LvlCompleteScreen if the player presses "f" in the EndZone + if CompLvlText.visible and Input.is_action_pressed("interact") and !lvl_complete: + # prevent this from happening more than once + lvl_complete = true + complete_level() + + +func complete_level(): + # remove PauseScreen to prevent player from pressing "esc" to open it + $PauseScreen.queue_free() + # prevent TabScreen from being opened + $TabScreen.lvl_complete = true + # reparent Objectives node as child of LvlCompleteScreen + var objectives = $InstObj1/VBoxContainer/Objectives1 + $InstObj1/VBoxContainer.remove_child(objectives) + LvlCompleteScreen.add_child(objectives) + # move objectives to a better position + objectives.rect_position = RadiationReceived.rect_position + objectives.rect_position.y += RadiationReceived.rect_size.y + 20 + + # unpause and show mouse + Global.make_game_playable() + + # show the screen + LvlCompleteScreen.show() func _on_EndZone_body_entered(body): if body == Player: From 6a76c3a808586667f40bb76577d6e33e5bce23c5 Mon Sep 17 00:00:00 2001 From: bquan0 Date: Thu, 11 Jan 2024 14:52:11 -0600 Subject: [PATCH 4/6] fix bugs with LvlCompleteScreen --- scripts/Level1.gd | 12 +++++++++--- scripts/LvlCompleteScreen.gd | 3 +++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/scripts/Level1.gd b/scripts/Level1.gd index 1a1f028..12f6f79 100644 --- a/scripts/Level1.gd +++ b/scripts/Level1.gd @@ -89,7 +89,7 @@ func _process(delta): complete_level() -func complete_level(): +func complete_level(): # remove PauseScreen to prevent player from pressing "esc" to open it $PauseScreen.queue_free() # prevent TabScreen from being opened @@ -101,12 +101,18 @@ func complete_level(): # move objectives to a better position objectives.rect_position = RadiationReceived.rect_position objectives.rect_position.y += RadiationReceived.rect_size.y + 20 + # set the total radiation received + LvlCompleteScreen.set_RadiationReceived(accumulated_radiation) - # unpause and show mouse - Global.make_game_playable() + # pause the game + get_tree().paused = true + # let player move mouse + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) # show the screen LvlCompleteScreen.show() + + func _on_EndZone_body_entered(body): if body == Player: diff --git a/scripts/LvlCompleteScreen.gd b/scripts/LvlCompleteScreen.gd index 06ed4ea..388cf5c 100644 --- a/scripts/LvlCompleteScreen.gd +++ b/scripts/LvlCompleteScreen.gd @@ -29,3 +29,6 @@ func show(): visible = true $CanvasLayer.visible = true $AnimationPlayer.play("FadeIn") + +func set_RadiationReceived(value): + $RadiationReceived/Number.text = "%f" % value From 5d8dd4cb793bdb5e8ae9ac8b83aab88884b10ef1 Mon Sep 17 00:00:00 2001 From: bquan0 Date: Sun, 29 Dec 2024 19:04:19 -0600 Subject: [PATCH 5/6] add README.md, geigercounter.ogg, HowToPlayScreen --- .gitignore | 2 + README.md | 15 + geigercounter.ogg | Bin 0 -> 6026 bytes points.csv | 6860 ----------------------------------- points.csv.import | 3 - scenes/HowToPlayScreen.tscn | 164 + scenes/LevelSelect.tscn | 17 +- scenes/MainMenu.tscn | 33 +- scenes/RadioactiveRoom.tscn | 12 +- scripts/HowToPlayScreen.gd | 4 + scripts/LevelSelect.gd | 3 + scripts/MainMenu.gd | 5 + scripts/RadioactiveRod.gd | 2 +- scripts/RadioactiveRoom.gd | 2 +- scripts/RadioactiveTank.gd | 2 +- 15 files changed, 240 insertions(+), 6884 deletions(-) create mode 100644 README.md create mode 100644 geigercounter.ogg delete mode 100644 points.csv delete mode 100644 points.csv.import create mode 100644 scenes/HowToPlayScreen.tscn create mode 100644 scripts/HowToPlayScreen.gd diff --git a/.gitignore b/.gitignore index 24b84c3..5117869 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ mono_crash.*.json *.ogg *.png *.jpg +*.glb +*.mtl diff --git a/README.md b/README.md new file mode 100644 index 0000000..cb1277d --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# voxel-test +This repo provides a Godot project to visualize radiation geometries and simulate radiation detection with a Geiger counter. + +## Resources needed to run this project +* [Godot v3.5.1 download](https://godotengine.org/download/archive/3.5.1-stable/). The project will not work on Godot v4 and above since Godot v4 changed a lot of things. +* "Other resources" zip folder. + +## Setup +1. Install [Godot v3.5.1](https://godotengine.org/download/archive/3.5.1-stable/). This project won't work on Godot v4 and above since Godot v4 changed a lot of things. +2. Fork the repo, then clone your fork. +3. Download the "Other resources" zip folder. Extract the folder and place its 3 folders (models, textures, radiationData) in the folder of your cloned repo. +4. Open Godot and click "Import". Select the + +## Features +Start by running the \ No newline at end of file diff --git a/geigercounter.ogg b/geigercounter.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6370a9cdd7387e7c79c5bc4e361016e3d70d969f GIT binary patch literal 6026 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 Date: Sun, 29 Dec 2024 20:17:28 -0600 Subject: [PATCH 6/6] add resources to README.md --- README.md | 48 ++++++++++--- scenes/HowToPlayScreen.tscn | 139 ++++++++++++++++++++---------------- scripts/ClickSound.gd | 1 - 3 files changed, 118 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index cb1277d..faa2fb8 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,45 @@ # voxel-test -This repo provides a Godot project to visualize radiation geometries and simulate radiation detection with a Geiger counter. - -## Resources needed to run this project -* [Godot v3.5.1 download](https://godotengine.org/download/archive/3.5.1-stable/). The project will not work on Godot v4 and above since Godot v4 changed a lot of things. -* "Other resources" zip folder. +This repo is a Godot project to visualize radiation geometries and simulate radiation detection with a Geiger counter. ## Setup 1. Install [Godot v3.5.1](https://godotengine.org/download/archive/3.5.1-stable/). This project won't work on Godot v4 and above since Godot v4 changed a lot of things. 2. Fork the repo, then clone your fork. -3. Download the "Other resources" zip folder. Extract the folder and place its 3 folders (models, textures, radiationData) in the folder of your cloned repo. -4. Open Godot and click "Import". Select the +3. Download the [3 "resources" folders](https://drive.google.com/drive/folders/10QSwU5U0PyNMef77HWv0K5GObslwSkSL?usp=sharing), extract them if they download as zip folders, and place them in the folder of your cloned repo. Currently, these folders are only available to those with a UW-Madison Google account. +4. Open Godot and click "Import". Navigate to your cloned repo and select `project.godot`, then "Open" and "Import & Edit". Afterwards, Godot will take roughly 2 minutes to import all the textures and models. +5. Now that you've entered the project editor, click on the `geigercounter.ogg` file and "Import" in the top left corner. Make sure that "Loop" is unchecked (off) and press "Reimport". + +## Playing the Game +To play, press the "play" triangle at the top right of the project editor. + +You can also press the "clap board with play triangle" at the top right to play the current scene that's open. + +## Resources +Here are a few resources I used when making this game. They may help with understanding the code in the repo. + +### Godot Documentation +NOTE: when looking at Godot Documentation, make sure you're looking at the 3.5 version! +* [Singletons (information used by multiple scenes)](https://docs.godotengine.org/en/3.5/tutorials/scripting/singletons_autoload.html) +* [Canvas layers: change which 2D objects appear above other 2D objects](https://docs.godotengine.org/en/stable/tutorials/2d/canvas_layers.html) +* [Quit Button code](https://docs.godotengine.org/en/3.5/tutorials/inputs/handling_quit_requests.html) +* [Pausing the game](https://docs.godotengine.org/en/3.5/tutorials/scripting/pausing_games.html) +* [Containers for UI](https://docs.godotengine.org/en/3.5/tutorials/ui/gui_containers.html) + + + +### YouTube Tutorials +* [Loading screen tutorial](https://www.youtube.com/watch?v=5aV_GSAE1kM) +* [Soap Bar Blender Tutorial](https://www.youtube.com/watch?v=utshgGVkxKQ): I used this to learn Blender to make the Geiger counter model. +* [Intro to 3D PBR material in Godot](https://www.youtube.com/watch?v=LXnW6WL7cSE): helpful for understanding PBR textures and how to use them in Godot. +* [Notification popup](https://www.youtube.com/watch?v=c4oq8eOa9CA): I used this to make the "Objective Completed" popup. + +### Raycasting +One of the objectives I implemented in `Level1.tscn` was "See the Radioactive Cylinder", which requires raycasting. It's a slightly more advanced topic, so I concentrated all the relevant resources here. +* [YT video: Raycasting in Godot](https://www.youtube.com/watch?v=DuyAHbznRx0) +* [intersect_ray() method](https://docs.godotengine.org/en/3.5/classes/class_physics2ddirectspacestate.html#class-physics2ddirectspacestate-method-intersect-ray) +* [Godot raycasting tutorial](https://docs.godotengine.org/en/3.5/tutorials/physics/ray-casting.html) + -## Features -Start by running the \ No newline at end of file +### Miscellaneous +* [Free PBR (physics based rendering) textures](https://ambientcg.com/) +* [Google Fonts](https://fonts.google.com/): I got the monospaced font for the Geiger Counter here. +* [Freesound.org](https://freesound.org/): I got the Geiger counter click sound here. \ No newline at end of file diff --git a/scenes/HowToPlayScreen.tscn b/scenes/HowToPlayScreen.tscn index 8bc5ebc..3a3d8e4 100644 --- a/scenes/HowToPlayScreen.tscn +++ b/scenes/HowToPlayScreen.tscn @@ -11,13 +11,15 @@ bg_color = Color( 0.784314, 0.231373, 0.231373, 1 ) Panel/styles/panel = SubResource( 2 ) [sub_resource type="DynamicFont" id=4] -size = 70 +size = 56 +outline_size = 4 +outline_color = Color( 0.411765, 0, 0, 1 ) font_data = ExtResource( 1 ) [sub_resource type="Theme" id=5] [sub_resource type="DynamicFont" id=6] -size = 34 +size = 30 font_data = ExtResource( 1 ) [node name="HowToPlayScreen" type="Panel"] @@ -27,125 +29,142 @@ theme = SubResource( 3 ) script = ExtResource( 2 ) [node name="Title" type="Label" parent="."] -margin_left = 332.0 -margin_top = 10.0 -margin_right = 691.0 -margin_bottom = 118.0 +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -149.5 +margin_right = 149.5 +margin_bottom = 86.0 custom_fonts/font = SubResource( 4 ) text = "How To Play" -__meta__ = { -"_edit_use_anchors_": true -} [node name="GridContainer" type="GridContainer" parent="."] -margin_left = 93.0 -margin_top = 111.0 -margin_right = 933.0 -margin_bottom = 511.0 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -376.5 +margin_top = -198.0 +margin_right = 376.5 +margin_bottom = 198.0 theme = SubResource( 5 ) custom_constants/hseparation = 40 columns = 2 [node name="Label" type="Label" parent="GridContainer"] -margin_right = 437.0 -margin_bottom = 53.0 +margin_right = 389.0 +margin_bottom = 46.0 custom_fonts/font = SubResource( 6 ) text = "Movement" [node name="Label4" type="Label" parent="GridContainer"] -margin_left = 477.0 -margin_right = 840.0 -margin_bottom = 53.0 +margin_left = 429.0 +margin_right = 753.0 +margin_bottom = 46.0 custom_fonts/font = SubResource( 6 ) text = "WASD" [node name="Label11" type="Label" parent="GridContainer"] -margin_top = 57.0 -margin_right = 437.0 -margin_bottom = 110.0 +margin_top = 50.0 +margin_right = 389.0 +margin_bottom = 96.0 custom_fonts/font = SubResource( 6 ) text = "Move up" [node name="Label12" type="Label" parent="GridContainer"] -margin_left = 477.0 -margin_top = 57.0 -margin_right = 840.0 -margin_bottom = 110.0 +margin_left = 429.0 +margin_top = 50.0 +margin_right = 753.0 +margin_bottom = 96.0 custom_fonts/font = SubResource( 6 ) text = "E" [node name="Label13" type="Label" parent="GridContainer"] -margin_top = 114.0 -margin_right = 437.0 -margin_bottom = 167.0 +margin_top = 100.0 +margin_right = 389.0 +margin_bottom = 146.0 custom_fonts/font = SubResource( 6 ) text = "Move Down" [node name="Label14" type="Label" parent="GridContainer"] -margin_left = 477.0 -margin_top = 114.0 -margin_right = 840.0 -margin_bottom = 167.0 +margin_left = 429.0 +margin_top = 100.0 +margin_right = 753.0 +margin_bottom = 146.0 custom_fonts/font = SubResource( 6 ) text = "Q" +[node name="Label15" type="Label" parent="GridContainer"] +margin_top = 150.0 +margin_right = 389.0 +margin_bottom = 196.0 +custom_fonts/font = SubResource( 6 ) +text = "Sprint" + +[node name="Label16" type="Label" parent="GridContainer"] +margin_left = 429.0 +margin_top = 150.0 +margin_right = 753.0 +margin_bottom = 196.0 +custom_fonts/font = SubResource( 6 ) +text = "Left Shift" + [node name="Label2" type="Label" parent="GridContainer"] -margin_top = 171.0 -margin_right = 437.0 -margin_bottom = 224.0 +margin_top = 200.0 +margin_right = 389.0 +margin_bottom = 246.0 custom_fonts/font = SubResource( 6 ) text = "Stats" [node name="Label5" type="Label" parent="GridContainer"] -margin_left = 477.0 -margin_top = 171.0 -margin_right = 840.0 -margin_bottom = 224.0 +margin_left = 429.0 +margin_top = 200.0 +margin_right = 753.0 +margin_bottom = 246.0 custom_fonts/font = SubResource( 6 ) text = "TAB" [node name="Label3" type="Label" parent="GridContainer"] -margin_top = 228.0 -margin_right = 437.0 -margin_bottom = 281.0 +margin_top = 250.0 +margin_right = 389.0 +margin_bottom = 296.0 custom_fonts/font = SubResource( 6 ) text = "Pause" [node name="Label6" type="Label" parent="GridContainer"] -margin_left = 477.0 -margin_top = 228.0 -margin_right = 840.0 -margin_bottom = 281.0 +margin_left = 429.0 +margin_top = 250.0 +margin_right = 753.0 +margin_bottom = 296.0 custom_fonts/font = SubResource( 6 ) text = "ESC" [node name="Label7" type="Label" parent="GridContainer"] -margin_top = 285.0 -margin_right = 437.0 -margin_bottom = 338.0 +margin_top = 300.0 +margin_right = 389.0 +margin_bottom = 346.0 custom_fonts/font = SubResource( 6 ) text = "Zoom" [node name="Label8" type="Label" parent="GridContainer"] -margin_left = 477.0 -margin_top = 285.0 -margin_right = 840.0 -margin_bottom = 338.0 +margin_left = 429.0 +margin_top = 300.0 +margin_right = 753.0 +margin_bottom = 346.0 custom_fonts/font = SubResource( 6 ) text = "Scroll" [node name="Label9" type="Label" parent="GridContainer"] -margin_top = 342.0 -margin_right = 437.0 -margin_bottom = 395.0 +margin_top = 350.0 +margin_right = 389.0 +margin_bottom = 396.0 custom_fonts/font = SubResource( 6 ) text = "Pan camera while zoomed out" [node name="Label10" type="Label" parent="GridContainer"] -margin_left = 477.0 -margin_top = 342.0 -margin_right = 840.0 -margin_bottom = 395.0 +margin_left = 429.0 +margin_top = 350.0 +margin_right = 753.0 +margin_bottom = 396.0 custom_fonts/font = SubResource( 6 ) text = "Hold Right Click + Mouse" diff --git a/scripts/ClickSound.gd b/scripts/ClickSound.gd index c7bd6e9..7052d57 100644 --- a/scripts/ClickSound.gd +++ b/scripts/ClickSound.gd @@ -13,6 +13,5 @@ func _process(delta): if random < radiation: play(SOUND_START) -# set the timer's timeout based on how much radiation there is func set_radiation(value): radiation = value