From bef423c5a75070d9c227c54f0fcb9b17fa33683c Mon Sep 17 00:00:00 2001 From: Holly Date: Mon, 3 Feb 2025 02:12:15 +0000 Subject: [PATCH] launcher selection list WIP, Player controller :D --- scenes/gui/SelectionList.tscn | 9 ++++ scenes/screens/Launcher.tscn | 12 ++++- scenes/world/DynamicMap.tscn | 11 ++++- scenes/world/Player.tscn | 12 ++++- src/DynamicMap.gd | 20 ++++---- src/Global.gd | 2 +- src/Player.gd | 93 ++++++++++++++++++++++++----------- src/SelectionList.gd | 33 +++++++++++++ src/file_parsers/RMesh.gd | 6 +-- 9 files changed, 154 insertions(+), 44 deletions(-) create mode 100644 scenes/gui/SelectionList.tscn create mode 100644 src/SelectionList.gd diff --git a/scenes/gui/SelectionList.tscn b/scenes/gui/SelectionList.tscn new file mode 100644 index 0000000..b4b4946 --- /dev/null +++ b/scenes/gui/SelectionList.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://0k0j6ct7kxtt"] + +[ext_resource type="Script" path="res://src/SelectionList.gd" id="1_bao2f"] + +[node name="SelectionList" type="Control"] +custom_minimum_size = Vector2(100, 20) +layout_mode = 3 +anchors_preset = 0 +script = ExtResource("1_bao2f") diff --git a/scenes/screens/Launcher.tscn b/scenes/screens/Launcher.tscn index c8a81ad..f86b92b 100644 --- a/scenes/screens/Launcher.tscn +++ b/scenes/screens/Launcher.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=5 format=3 uid="uid://dc8jcyubx5hv7"] +[gd_scene load_steps=6 format=3 uid="uid://dc8jcyubx5hv7"] [ext_resource type="Script" path="res://src/Launcher.gd" id="1_cf26g"] [ext_resource type="Texture2D" uid="uid://d3sh54nbyqqiu" path="res://GFX/menu/launcher.jpg" id="2_6ldjf"] +[ext_resource type="PackedScene" uid="uid://0k0j6ct7kxtt" path="res://scenes/gui/SelectionList.tscn" id="3_1mhbm"] [ext_resource type="PackedScene" uid="uid://5ktmpg8aurb7" path="res://scenes/gui/Button.tscn" id="3_nah2s"] [ext_resource type="FontFile" uid="uid://xe31montgcoo" path="res://GFX/font/cour/Courier New.ttf" id="4_8vkjh"] @@ -15,6 +16,7 @@ grow_vertical = 2 script = ExtResource("1_cf26g") [node name="BG" type="TextureRect" parent="."] +texture_filter = 1 layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -23,6 +25,14 @@ grow_horizontal = 2 grow_vertical = 2 texture = ExtResource("2_6ldjf") +[node name="SelectionList" parent="." instance=ExtResource("3_1mhbm")] +layout_mode = 1 +offset_left = 20.0 +offset_top = 197.0 +offset_right = 450.0 +offset_bottom = 335.0 +selectionList = ["1920x1080", "1680x1050", "1440x900", "1280x800", "1280x720", "1152x864", "1024x768", "800x600", "720x576", "720x480", "640x480"] + [node name="Launch" parent="." instance=ExtResource("3_nah2s")] custom_minimum_size = Vector2(100, 30) offset_left = 520.0 diff --git a/scenes/world/DynamicMap.tscn b/scenes/world/DynamicMap.tscn index ab518bc..8f16174 100644 --- a/scenes/world/DynamicMap.tscn +++ b/scenes/world/DynamicMap.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=6 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_58gow"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_tvhkv"] sky_top_color = Color(0.483795, 0.593484, 0.746094, 1) @@ -22,9 +23,17 @@ 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="DirectionalLight3D" type="DirectionalLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0) + +[node name="Player" parent="." instance=ExtResource("3_58gow")] + +[node name="CSGBox3D" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.97521, -1.86909, -3.06) +use_collision = true +size = Vector3(15.4238, 0.866943, 15.2599) diff --git a/scenes/world/Player.tscn b/scenes/world/Player.tscn index 599fafd..245b5d6 100644 --- a/scenes/world/Player.tscn +++ b/scenes/world/Player.tscn @@ -8,9 +8,19 @@ size = Vector3(1, 2, 1) [node name="Player" type="CharacterBody3D"] script = ExtResource("1_n772d") -[node name="Camera" type="Camera3D" parent="."] +[node name="Head" type="Node3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.75, 0) +[node name="Camera" type="Camera3D" parent="Head"] + [node name="Collision" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) shape = SubResource("BoxShape3D_7hapa") + +[node name="FloorRay" type="RayCast3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0) +target_position = Vector3(0, -0.1, 0) +hit_from_inside = true + +[node name="FloorPick" type="RayCast3D" parent="."] +target_position = Vector3(0, -10, 0) diff --git a/src/DynamicMap.gd b/src/DynamicMap.gd index 5c4840b..4c1bba3 100644 --- a/src/DynamicMap.gd +++ b/src/DynamicMap.gd @@ -3,7 +3,7 @@ extends Node3D var roomTemplatesRaw = Dictionary() func _ready() -> void: - #RMesh.LoadRMesh(self, "GFX\\map\\gatea_opt.rmesh") + RMesh.LoadRMesh(self, "GFX\\map\\gatea_opt.rmesh") #B3D.Load("GFX\\npcs\\106_2.b3d") add_child(B3D.Load("GFX\\apache.b3d")) var rooms = INI.Load("res://Data/rooms.ini") @@ -172,29 +172,31 @@ func CreateMap(): # count the amount of rooms #For y = 1 To MapHeight - 1 - for y1 in range(1, MapHeight - 1): + for y1 in range(MapHeight): zone = GetZone(y) - for x1 in range(1, MapWidth - 1): + for x1 in range(MapWidth): if MapTemp[x1][y1] > 0: temp = min(MapTemp[x1 + 1][y1], 1) + min(MapTemp[x1 - 1][y1], 1) temp = temp + min(MapTemp[x1][y1 + 1], 1) + min(MapTemp[x1][y1 - 1], 1) if MapTemp[x1][y1] < 255: MapTemp[x1][y1] = temp + print(MapTemp[x1][y1]) match MapTemp[x1][y1]: 1: - Room1Amount[zone] = Room1Amount[zone] +1 + Room1Amount[zone] += 1 + print("R1A ", Room1Amount[zone]) 2: if min(MapTemp[x1 + 1][y1], 1) + min(MapTemp[x1 - 1][y1], 1) == 2: - Room2Amount[zone] = Room2Amount[zone] + 1 + Room2Amount[zone] += 1 elif min(MapTemp[x1][y1 + 1], 1) + min(MapTemp[x1][y1 - 1], 1) == 2: - Room2Amount[zone] = Room2Amount[zone] + 1 + Room2Amount[zone] += 1 else: - Room2CAmount[zone] = Room2CAmount[zone] + 1 + Room2CAmount[zone] += 1 3: - Room3Amount[zone] = Room3Amount[zone] + 1 + Room3Amount[zone] += 1 4: - Room4Amount[zone] = Room4Amount[zone] + 1 + Room4Amount[zone] += 1 # force more room1s (if needed) for i in range(0, 2): diff --git a/src/Global.gd b/src/Global.gd index 13be63b..c7d4db5 100644 --- a/src/Global.gd +++ b/src/Global.gd @@ -52,4 +52,4 @@ func _ready(): LoadTexture("GFX/BlinkMeter.jpg") func _process(delta): - FPSfactor = delta + FPSfactor = delta * 1000 diff --git a/src/Player.gd b/src/Player.gd index 2273f11..d606ede 100644 --- a/src/Player.gd +++ b/src/Player.gd @@ -1,9 +1,15 @@ extends CharacterBody3D +var head: Node3D var camera: Camera3D +var floorRay: RayCast3D +var floorPick: RayCast3D func _ready() -> void: - camera = $Camera + head = $Head + camera = $Head/Camera + floorRay = $FloorRay + floorPick = $FloorPick var CurrSpeed: float var CrouchState: float @@ -26,7 +32,7 @@ var PlayerFallingPickDistance: float var NoClipSpeed: float var ForceAngle: float var DropSpeed: float -var ShouldEntitiesFall: bool +var ShouldEntitiesFall: bool = true var Injuries: float @@ -36,6 +42,17 @@ func _physics_process(delta: float) -> void: var Sprint = 1.0 var Speed = 0.018 + if CurrSpeed > 0: + Stamina = min(Stamina + 0.15 * Global.FPSfactor / 1.25, 100.0) + else: + Stamina = min(Stamina + 0.15 * Global.FPSfactor * 1.25, 100.0) + + if StaminaEffectTimer > 0: + StaminaEffectTimer = StaminaEffectTimer - (Global.FPSfactor / 70) + else: + if StaminaEffect != 1.0: + StaminaEffect = 1.0 + if abs(CrouchState - Crouch) < 0.001: CrouchState = Crouch else: @@ -43,9 +60,9 @@ func _physics_process(delta: float) -> void: 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): + 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 + Stamina = Stamina - delta * 0.4 * StaminaEffect if Stamina <= 0: Stamina = -20.0 @@ -69,9 +86,9 @@ func _physics_process(delta: float) -> void: 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") + Shake = fmod((Shake + delta * 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) # @@ -107,7 +124,10 @@ func _physics_process(delta: float) -> void: Sprint = 0.5 if Input.is_action_just_pressed("player_crouch") and Playable: - Crouch = not Crouch + if Crouch == 1: + Crouch = 0 + else: + Crouch = 1 var movementSpeed = (Speed * Sprint) / (1.0 + CrouchState) @@ -119,7 +139,7 @@ func _physics_process(delta: float) -> void: #RotateEntity Collider, WrapAngle(EntityPitch(Camera)), WrapAngle(EntityYaw(Camera)), 0 camera.rotation.x = deg_to_rad(Rotation.x) - rotation.y = deg_to_rad(Rotation.y) + head.rotation.y = deg_to_rad(Rotation.y) movementSpeed = movementSpeed * NoClipSpeed @@ -142,33 +162,24 @@ func _physics_process(delta: float) -> void: 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) + #angle = Utils.WrapAngle(Rotation.y + angle + 90.0) + + var input_dir = Input.get_vector("player_left", "player_right", "player_forwards", "player_backwards") + var direction = (head.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if temp: CurrSpeed = Utils.CurveValue(movementSpeed, CurrSpeed, 20.0) @@ -179,10 +190,28 @@ func _physics_process(delta: float) -> void: 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 + #print(str(cos(angle) * CurrSpeed * 100000 * Global.FPSfactor), " ", str(sin(angle) * CurrSpeed * 100000 * Global.FPSfactor)) + #position.x += cos(angle) * CurrSpeed * 100000 * Global.FPSfactor + #position.z += sin(angle) * CurrSpeed * 100000 * Global.FPSfactor + var movementX = (direction.x * CurrSpeed) * 40 * Global.FPSfactor + var movementZ = (direction.z * CurrSpeed) * 40 * Global.FPSfactor + #print(CurrSpeed, " ", direction.x, " ", direction.z, " ", str(movementX), " ", str(movementZ)) + velocity.x = movementX + velocity.z = movementZ + + var cameraRoll = max(min(sin(Shake / 2) * 2.5 * min(Injuries + 0.25, 3.0), 8.0), -8.0) + var cameraBob = (sin(Shake) / (20.0 + CrouchState * 20.0)) * 0.6 + + camera.rotation.x = deg_to_rad(Rotation.x) + camera.rotation.z = deg_to_rad(cameraRoll) + camera.position.y = cameraBob + head.position.y = 1.15 + 0.6 * (1 - CrouchState) + head.rotation.y = deg_to_rad(Rotation.y) var CollidedFloor = false + if floorRay.is_colliding(): + CollidedFloor = true + #For i = 1 To CountCollisions(Collider) #If CollisionY(Collider, i) < EntityY(Collider) - 0.25 Then CollidedFloor = True #Next @@ -204,7 +233,8 @@ func _physics_process(delta: float) -> void: 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) + floorPick.target_position.y = -PlayerFallingPickDistance + var pick = floorPick.is_colliding()#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: @@ -215,12 +245,19 @@ func _physics_process(delta: float) -> void: if not UnableToMove and ShouldEntitiesFall: #TranslateEntity Collider, 0, DropSpeed * FPSfactor, 0 - position.y += DropSpeed * Global.FPSfactor + velocity.y += DropSpeed * Global.FPSfactor + + if not UnableToMove: + move_and_slide() ForceMove = false func _input(event: InputEvent) -> void: if event is InputEventMouseMotion: - Rotation.y += event.relative.x - Rotation.x += event.relative.y + Rotation.y -= event.relative.x / 2 + Rotation.x -= event.relative.y / 2 + if Rotation.x > 70: + Rotation.x = 70 + if Rotation.x < -70: + Rotation.x = -70 #event.velocity diff --git a/src/SelectionList.gd b/src/SelectionList.gd new file mode 100644 index 0000000..df23ffc --- /dev/null +++ b/src/SelectionList.gd @@ -0,0 +1,33 @@ +extends Control + +@export var selectionList: Array + +var options: Array + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + var font = load("res://GFX/font/cour/Courier New.ttf") + + for column in range(ceil(selectionList.size() / 6.0)): + var why = 0 + for i in range(6 * column, (6 * column) + 6): + if i > selectionList.size() - 1: + continue + + var option = Control.new() + option.position.x = 13 + (100 * column) + option.position.y = 10 + (20 * why) + option.size = Vector2(100, 20) + var label = Label.new() + label.text = selectionList[i] + label.add_theme_font_override("font", font) + label.add_theme_color_override("font_color", Color.BLACK) + label.add_theme_font_size_override("font_size", int(58 * Global.menuScale)) + option.add_child(label) + add_child(option) + why += 1 + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/src/file_parsers/RMesh.gd b/src/file_parsers/RMesh.gd index 6f57b98..9e0d91e 100644 --- a/src/file_parsers/RMesh.gd +++ b/src/file_parsers/RMesh.gd @@ -4,7 +4,7 @@ static func ReadString(reader:BufferStuffReader): var length = reader.readInt() return reader.readBuffer(length).get_string_from_ascii() -const WORLD_SCALE = 0.020 +const WORLD_SCALE = 0.010 static func StripFilename(file: String): var mi = "" @@ -261,7 +261,7 @@ static func LoadRMesh(parentNode: Node3D, file: String): mat.albedo_texture = activeAlbedo mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_DEPTH_PRE_PASS if activeAlbedoHasAlpha else BaseMaterial3D.TRANSPARENCY_DISABLED meshInstance.set_surface_override_material(0, mat) - #meshInstance.create_trimesh_collision() + meshInstance.create_trimesh_collision() scene.add_child(meshInstance) #print("YOYOYO MARKER") @@ -316,7 +316,7 @@ static func LoadRMesh(parentNode: Node3D, file: String): mat.albedo_color = Color.GREEN meshInstance.set_surface_override_material(0, mat) meshInstance.create_trimesh_collision() - meshInstance.visible = false + meshInstance.visible = true scene.add_child(meshInstance) # trigger boxes