diff --git a/scenes/world/DynamicMap.tscn b/scenes/world/DynamicMap.tscn index ef66d85..d3f02ed 100644 --- a/scenes/world/DynamicMap.tscn +++ b/scenes/world/DynamicMap.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=8 format=3 uid="uid://bw0tk6ml7gayq"] +[gd_scene load_steps=7 format=3 uid="uid://bw0tk6ml7gayq"] [ext_resource type="Script" path="res://src/DynamicMap.gd" id="1_mytgt"] [ext_resource type="Script" path="res://src/TempDebugCamera.gd" id="2_co6fy"] +[ext_resource type="PackedScene" uid="uid://dm33ofcbh8sht" path="res://scenes/world/Player.tscn" id="3_43xjf"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_tvhkv"] @@ -12,11 +13,6 @@ sky_material = SubResource("ProceduralSkyMaterial_tvhkv") background_mode = 2 sky = SubResource("Sky_qyldw") -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4n34s"] - -[sub_resource type="CapsuleMesh" id="CapsuleMesh_e2e2m"] -material = SubResource("StandardMaterial3D_4n34s") - [node name="DynamicMap" type="Node3D"] script = ExtResource("1_mytgt") @@ -24,13 +20,10 @@ script = ExtResource("1_mytgt") environment = SubResource("Environment_d5g72") [node name="CameraPivot" type="Node3D" parent="."] +visible = false [node name="Camera3D" type="Camera3D" parent="CameraPivot"] script = ExtResource("2_co6fy") -[node name="MeshInstance3D" type="MeshInstance3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.49283, 0, -4.85357) -mesh = SubResource("CapsuleMesh_e2e2m") - -[node name="OmniLight3D" type="OmniLight3D" parent="."] -visible = false +[node name="Player" parent="." instance=ExtResource("3_43xjf")] +transform = Transform3D(0.999178, 0, 0.0405503, 0, 1, 0, -0.0405503, 0, 0.999178, 0, 0, 0) diff --git a/scenes/world/Player.tscn b/scenes/world/Player.tscn new file mode 100644 index 0000000..599fafd --- /dev/null +++ b/scenes/world/Player.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=3 uid="uid://dm33ofcbh8sht"] + +[ext_resource type="Script" path="res://src/Player.gd" id="1_n772d"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_7hapa"] +size = Vector3(1, 2, 1) + +[node name="Player" type="CharacterBody3D"] +script = ExtResource("1_n772d") + +[node name="Camera" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.75, 0) + +[node name="Collision" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_7hapa") diff --git a/shaders/ScreenPosRepeat.gdshader b/shaders/ScreenPosRepeat.gdshader index 2bf0030..187fa40 100644 --- a/shaders/ScreenPosRepeat.gdshader +++ b/shaders/ScreenPosRepeat.gdshader @@ -8,7 +8,7 @@ void vertex() { void fragment() { vec4 silly = texture(loop_texture, SCREEN_UV); - + COLOR = silly; } diff --git a/src/Global.gd b/src/Global.gd index 573f356..977afd8 100644 --- a/src/Global.gd +++ b/src/Global.gd @@ -6,6 +6,8 @@ var textureCache: Dictionary var videoToPlay: String var clickSound: AudioStreamPlayer +var FPSfactor: float + func GetTextureFromCache(name:String): var fixedName = name.replace("\\", "/") if textureCache.has(fixedName): @@ -21,9 +23,6 @@ func _ready(): clickSound.stream = load("res://SFX/Interact/Button.ogg") clickSound.max_polyphony = 5 add_child(clickSound) - #displaySize = DisplayServer.screen_get_size() - #menuScale = (displaySize.y / 1024.0) -#func _process(delta): - #displaySize = DisplayServer.screen_get_size() - #menuScale = (displaySize.y / 1024.0) +func _process(delta): + FPSfactor = delta diff --git a/src/Player.gd b/src/Player.gd new file mode 100644 index 0000000..2273f11 --- /dev/null +++ b/src/Player.gd @@ -0,0 +1,226 @@ +extends CharacterBody3D + +var camera: Camera3D + +func _ready() -> void: + camera = $Camera + +var CurrSpeed: float +var CrouchState: float +var Crouch: float +var NoClip: bool +var Playable: bool = true +var UnableToMove: bool +var ForceMove: float + +var Stamina: float +var StaminaEffect:float = 1.0 +var StaminaEffectTimer: float + +var IsZombie : bool +var Shake: float + +var KillTimer: float + +var PlayerFallingPickDistance: float +var NoClipSpeed: float +var ForceAngle: float +var DropSpeed: float +var ShouldEntitiesFall: bool + +var Injuries: float + +var Rotation: Vector3 = Vector3() + +func _physics_process(delta: float) -> void: + var Sprint = 1.0 + var Speed = 0.018 + + if abs(CrouchState - Crouch) < 0.001: + CrouchState = Crouch + else: + CrouchState = Utils.CurveValue(Crouch, CrouchState, 10.0) + + if not NoClip: + if ((Input.is_action_pressed("player_backwards") or Input.is_action_pressed("player_forwards")) or (Input.is_action_pressed("player_right") or Input.is_action_pressed("player_left")) and Playable) or ForceMove > 0: + if Crouch == 0 and (Input.is_action_pressed("player_sprint")) and Stamina > 0.0 and (not IsZombie): + Sprint = 2.5 + Stamina = Stamina - Global.FPSfactor * 0.4 * StaminaEffect + if Stamina <= 0: + Stamina = -20.0 + + #If PlayerRoom\RoomTemplate\Name = "pocketdimension" Then + #If EntityY(Collider)<2000*RoomScale Or EntityY(Collider)>2608*RoomScale Then + #Stamina = 0 + #Speed = 0.015 + #Sprint = 1.0 + #EndIf + #EndIf + + if ForceMove > 0: + Speed = Speed * ForceMove + + #if SelectedItem != null: + #If SelectedItem\itemtemplate\tempname = "firstaid" Or SelectedItem\itemtemplate\tempname = "finefirstaid" Or SelectedItem\itemtemplate\tempname = "firstaid2" Then + #Sprint = 0 + #EndIf + #EndIf + + var shake = fmod(Shake, 360) + #Local tempchn% + if not UnableToMove: + Shake = fmod((Shake + Global.FPSfactor * min(Sprint, 1.5) * 7), 720) + if shake < 180 and fmod(Shake, 360) >= 180 and KillTimer >= 0: + print("step sound") + #if CurrStepSFX == 0: + #temp = GetStepSound(Collider) + # + #If Sprint = 1.0 Then + #PlayerSoundVolume = Max(4.0,PlayerSoundVolume) + #tempchn% = PlaySound_Strict(StepSFX(temp, 0, Rand(0, 7))) + #ChannelVolume tempchn, (1.0-(Crouch*0.6))*SFXVolume# + #Else + #PlayerSoundVolume = Max(2.5-(Crouch*0.6),PlayerSoundVolume) + #tempchn% = PlaySound_Strict(StepSFX(temp, 1, Rand(0, 7))) + #ChannelVolume tempchn, (1.0-(Crouch*0.6))*SFXVolume# + #End If + #ElseIf CurrStepSFX=1 + #tempchn% = PlaySound_Strict(Step2SFX(Rand(0, 2))) + #ChannelVolume tempchn, (1.0-(Crouch*0.4))*SFXVolume# + #ElseIf CurrStepSFX=2 + #tempchn% = PlaySound_Strict(Step2SFX(Rand(3,5))) + #ChannelVolume tempchn, (1.0-(Crouch*0.4))*SFXVolume# + #ElseIf CurrStepSFX=3 + #If Sprint = 1.0 Then + #PlayerSoundVolume = Max(4.0,PlayerSoundVolume) + #tempchn% = PlaySound_Strict(StepSFX(0, 0, Rand(0, 7))) + #ChannelVolume tempchn, (1.0-(Crouch*0.6))*SFXVolume# + #Else + #PlayerSoundVolume = Max(2.5-(Crouch*0.6),PlayerSoundVolume) + #tempchn% = PlaySound_Strict(StepSFX(0, 1, Rand(0, 7))) + #ChannelVolume tempchn, (1.0-(Crouch*0.6))*SFXVolume# + #End If + else: # noclip on + if Input.is_action_pressed("player_sprint"): + Sprint = 2.5 + elif Input.is_action_pressed("player_crouch"): + Sprint = 0.5 + + if Input.is_action_just_pressed("player_crouch") and Playable: + Crouch = not Crouch + + var movementSpeed = (Speed * Sprint) / (1.0 + CrouchState) + + if NoClip: + Shake = 0 + CurrSpeed = 0 + CrouchState = 0 + Crouch = 0 + + #RotateEntity Collider, WrapAngle(EntityPitch(Camera)), WrapAngle(EntityYaw(Camera)), 0 + camera.rotation.x = deg_to_rad(Rotation.x) + rotation.y = deg_to_rad(Rotation.y) + + movementSpeed = movementSpeed * NoClipSpeed + + if Input.is_action_pressed("player_backwards"): + position.z += -movementSpeed * Global.FPSfactor + if Input.is_action_pressed("player_forwards"): + position.z += movementSpeed * Global.FPSfactor + + if Input.is_action_pressed("player_left"): + position.x += -movementSpeed * Global.FPSfactor + if Input.is_action_pressed("ui_right"): + position.x += movementSpeed * Global.FPSfactor + else: + movementSpeed = movementSpeed / max((Injuries + 3.0) / 3.0, 1.0) + if Injuries > 0.5: + movementSpeed = movementSpeed * min((sin(Shake / 2) + 1.2), 1.0) + + var temp = false + var angle: float = 0 + if not IsZombie: + if Input.is_action_pressed("player_backwards") and Playable: + temp = true + angle = 180 + if Input.is_action_pressed("player_left"): + angle = 135 + if Input.is_action_pressed("player_right"): + angle = -135 + elif Input.is_action_pressed("player_forwards") and Playable: # Or ForceMove>0 + temp = true + angle = 0 + if Input.is_action_pressed("player_left"): + angle = 45 + if Input.is_action_pressed("player_right"): + angle = -45 + elif ForceMove > 0: + temp = true + angle = ForceAngle + elif Playable: + if Input.is_action_pressed("player_left"): + angle = 90 + temp = true + if Input.is_action_pressed("player_right"): + angle = -90 + temp = true + else: + temp = true + angle = ForceAngle + + angle = Utils.WrapAngle(Rotation.y + angle + 90.0) + + if temp: + CurrSpeed = Utils.CurveValue(movementSpeed, CurrSpeed, 20.0) + else: + CurrSpeed = max(Utils.CurveValue(0.0, CurrSpeed - 0.1, 1.0), 0.0) + + #print(str("movementSpeed:", movementSpeed, " angle:", angle, " CurrSpeed:", CurrSpeed)) + + if not UnableToMove: + #TranslateEntity Collider, Cos(angle)*CurrSpeed * FPSfactor, 0, Sin(angle)*CurrSpeed * FPSfactor, True + position.x += cos(angle) * CurrSpeed * 1000 * Global.FPSfactor + position.z += sin(angle) * CurrSpeed * 1000 * Global.FPSfactor + + var CollidedFloor = false + #For i = 1 To CountCollisions(Collider) + #If CollisionY(Collider, i) < EntityY(Collider) - 0.25 Then CollidedFloor = True + #Next + + if CollidedFloor: + #If DropSpeed# < - 0.07 Then + #If CurrStepSFX=0 Then + #PlaySound_Strict(StepSFX(GetStepSound(Collider), 0, Rand(0, 7))) + #ElseIf CurrStepSFX=1 + #PlaySound_Strict(Step2SFX(Rand(0, 2))) + #ElseIf CurrStepSFX=2 + #PlaySound_Strict(Step2SFX(Rand(3, 5))) + #ElseIf CurrStepSFX=3 + #PlaySound_Strict(StepSFX(0, 0, Rand(0, 7))) + #EndIf + #PlayerSoundVolume = Max(3.0,PlayerSoundVolume) + #EndIf + DropSpeed = 0 + else: + DropSpeed = min(max(DropSpeed - 0.006 * Global.FPSfactor, -2.0), 0.0) + if PlayerFallingPickDistance != 0: + var pick = true#LinePick(EntityX(Collider),EntityY(Collider),EntityZ(Collider),0,-PlayerFallingPickDistance,0) + if pick: + DropSpeed = min(max(DropSpeed - 0.006 * Global.FPSfactor, -2.0), 0.0) + else: + DropSpeed = 0 + else: + DropSpeed = min(max(DropSpeed - 0.006 * Global.FPSfactor, -2.0), 0.0) + PlayerFallingPickDistance = 10.0 + + if not UnableToMove and ShouldEntitiesFall: + #TranslateEntity Collider, 0, DropSpeed * FPSfactor, 0 + position.y += DropSpeed * Global.FPSfactor + + ForceMove = false + +func _input(event: InputEvent) -> void: + if event is InputEventMouseMotion: + Rotation.y += event.relative.x + Rotation.x += event.relative.y + #event.velocity diff --git a/src/Startup.gd b/src/Startup.gd index 3106937..b5ff9cf 100644 --- a/src/Startup.gd +++ b/src/Startup.gd @@ -1,6 +1,6 @@ extends Control -var skipIntro = true +var skipIntro = false func _ready() -> void: if skipIntro: diff --git a/src/TempDebugCamera.gd b/src/TempDebugCamera.gd index 10ec7c0..74c2c03 100644 --- a/src/TempDebugCamera.gd +++ b/src/TempDebugCamera.gd @@ -3,10 +3,17 @@ extends Camera3D var cameraPivot: Node3D func _ready() -> void: - Input.mouse_mode = Input.MOUSE_MODE_CAPTURED cameraPivot = get_parent() + if not cameraPivot.visible: + cameraPivot.queue_free() + + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + func _process(delta: float) -> void: + if not cameraPivot.visible: + return + if Input.is_action_just_pressed("pause"): if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: Input.mouse_mode = Input.MOUSE_MODE_VISIBLE @@ -15,6 +22,9 @@ func _process(delta: float) -> void: # Called every frame. 'delta' is the elapsed time since the previous frame. func _physics_process(delta: float) -> void: + if not cameraPivot.visible: + return + var input_dir = Input.get_vector("player_left", "player_right", "player_forwards", "player_backwards") var direction = (cameraPivot.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() @@ -28,6 +38,9 @@ func _physics_process(delta: float) -> void: func _input(event: InputEvent) -> void: + if not cameraPivot.visible: + return + if event is InputEventMouseMotion and Input.mouse_mode == Input.MOUSE_MODE_CAPTURED: rotation.x -= event.relative.y / 360 cameraPivot.rotation.y -= event.relative.x / 360 diff --git a/src/Utils.gd b/src/Utils.gd new file mode 100644 index 0000000..3fcda42 --- /dev/null +++ b/src/Utils.gd @@ -0,0 +1,19 @@ +class_name Utils + +static func CurveValue(number, old, smooth): + if Global.FPSfactor == 0: + return old + + if number < old: + return max(old + (number - old) * (1.0 / smooth * Global.FPSfactor), number) + else: + return min(old + (number - old) * (1.0 / smooth * Global.FPSfactor), number) + +static func WrapAngle(angle): + if angle == INF: + return 0.0 + while angle < 0: + angle = angle + 360 + while angle >= 360: + angle = angle - 360 + return angle