From d0f45f30094b7c67fd600da30d06f6547743e96f Mon Sep 17 00:00:00 2001 From: Sascha Date: Sat, 19 Jul 2025 16:14:11 +0200 Subject: [PATCH] aiming and shooting possible --- .vscode/settings.json | 2 +- packed-scenes/knight.tscn | 90 ++--- packed-scenes/projectile.tscn | 17 +- packed-scenes/rogue.tscn | 89 +++-- packed-scenes/target.tscn | 10 +- packed-scenes/ui.tscn | 23 +- resources/images/crosshairs.tres | 7 + .../images/crosshairs_tilesheet_white.png | Bin 0 -> 39440 bytes .../crosshairs_tilesheet_white.png.import | 40 ++ resources/images/crosshairs_vector.svg | 349 ++++++++++++++++++ resources/images/crosshairs_vector.svg.import | 43 +++ scenes/game.tscn | 2 +- scripts/hitbox.gd | 2 +- scripts/hurtbox.gd | 15 +- scripts/player.gd | 19 +- scripts/projectile.gd | 35 +- scripts/rogue.gd | 14 +- scripts/target.gd | 18 +- scripts/ui.gd | 9 + 19 files changed, 646 insertions(+), 138 deletions(-) create mode 100644 resources/images/crosshairs.tres create mode 100644 resources/images/crosshairs_tilesheet_white.png create mode 100644 resources/images/crosshairs_tilesheet_white.png.import create mode 100644 resources/images/crosshairs_vector.svg create mode 100644 resources/images/crosshairs_vector.svg.import diff --git a/.vscode/settings.json b/.vscode/settings.json index d2fc71b..c22e3c7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "godotTools.editorPath.godot4": "/home/sascha/Godot/Godot_v4.5-beta1_linux.x86_64", + "godotTools.editorPath.godot4": "/home/sascha/Godot/Godot_v4.5-beta3_linux.x86_64", "git.alwaysShowStagedChangesResourceGroup": false, "git.enableCommitSigning": true } \ No newline at end of file diff --git a/packed-scenes/knight.tscn b/packed-scenes/knight.tscn index 908a4d8..cf20b46 100644 --- a/packed-scenes/knight.tscn +++ b/packed-scenes/knight.tscn @@ -31728,43 +31728,43 @@ bones/0/name = "root" bones/0/parent = -1 bones/0/rest = Transform3D(1, 0, 2.38419e-07, 0, 1, 0, -2.38419e-07, 0, 1, 0, 0, 0) bones/0/enabled = true -bones/0/position = Vector3(0, 0.00051125773, 0) +bones/0/position = Vector3(0, 0.00014053543, 0) bones/0/rotation = Quaternion(-2.1973744e-11, -0.000638415, -3.8059562e-11, 0.9999998) bones/0/scale = Vector3(1, 1, 1) bones/1/name = "hips" bones/1/parent = 0 bones/1/rest = Transform3D(1, 0, -2.38419e-07, 0, 1, 0, 2.38419e-07, 0, 1, 0, 0.405663, 0) bones/1/enabled = true -bones/1/position = Vector3(1.0831419e-18, 0.3830444, 2.58241e-25) -bones/1/rotation = Quaternion(0.0021013343, 0.042223815, -3.819298e-06, 0.99910605) +bones/1/position = Vector3(3.6406747e-19, 0.38125348, 1.4381516e-18) +bones/1/rotation = Quaternion(0.002150177, 0.042223994, -5.894737e-06, 0.9991059) bones/1/scale = Vector3(1, 1, 1) bones/2/name = "spine" bones/2/parent = 1 bones/2/rest = Transform3D(1, 0, 1.42109e-14, 0, 1, 0, -1.42109e-14, 0, 1, 0, 0.191978, 0) bones/2/enabled = true bones/2/position = Vector3(0, 0.191978, 0) -bones/2/rotation = Quaternion(0.0025025683, -0.0015096358, 7.607508e-05, 0.9999957) +bones/2/rotation = Quaternion(0.0025062335, -0.00060442404, 1.4894359e-06, 0.9999967) bones/2/scale = Vector3(1, 1, 1) bones/3/name = "chest" bones/3/parent = 2 bones/3/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.374988, 0) bones/3/enabled = true bones/3/position = Vector3(0, 0.374988, 0) -bones/3/rotation = Quaternion(0.00095853594, 0.00016158301, -0.00023410548, 0.9999995) +bones/3/rotation = Quaternion(0.0009533176, 0.00017604706, -0.00015982457, 0.9999995) bones/3/scale = Vector3(1, 1, 1) bones/4/name = "upperarm.l" bones/4/parent = 3 bones/4/rest = Transform3D(0.0572842, 0.998357, -3.57628e-07, -3.57628e-07, 4.76837e-07, 1, 0.998357, -0.0572841, 4.76837e-07, 0.212007, 0.134132, 8.40246e-08) bones/4/enabled = true -bones/4/position = Vector3(0.21155712, 0.1336984, -0.0009502411) -bones/4/rotation = Quaternion(-0.5632811, -0.060399666, -0.6336199, 0.52687013) +bones/4/position = Vector3(0.21164604, 0.13374294, -0.000974262) +bones/4/rotation = Quaternion(-0.559113, -0.065407015, -0.6520691, 0.5078587) bones/4/scale = Vector3(0.999999, 0.999999, 1) bones/5/name = "lowerarm.l" bones/5/parent = 4 bones/5/rest = Transform3D(0.993887, 0.110402, -1.19007e-07, -0.110402, 0.993887, 3.28831e-09, 1.18643e-07, 9.87045e-09, 1, -3.21966e-09, 0.241897, -1.19406e-07) bones/5/enabled = true bones/5/position = Vector3(-3.21966e-09, 0.241897, -1.19406e-07) -bones/5/rotation = Quaternion(3.7021298e-08, -5.071121e-08, -0.5068316, 0.8620452) +bones/5/rotation = Quaternion(2.9125124e-08, -5.490448e-08, -0.47540045, 0.8797696) bones/5/scale = Vector3(1, 1, 1) bones/6/name = "wrist.l" bones/6/parent = 5 @@ -31778,14 +31778,14 @@ bones/7/parent = 6 bones/7/rest = Transform3D(1, 1.09104e-05, 2.66204e-07, -1.09104e-05, 1, -2.40181e-09, -2.66204e-07, 2.39891e-09, 1, 9.08162e-13, 0.0738258, 2.22045e-16) bones/7/enabled = true bones/7/position = Vector3(9.08162e-13, 0.0738258, 2.22045e-16) -bones/7/rotation = Quaternion(-0.3153584, -0.33485505, 0.14072372, 0.8767086) +bones/7/rotation = Quaternion(-0.30997488, -0.33169147, 0.12663393, 0.8819638) bones/7/scale = Vector3(1, 1, 1) bones/8/name = "handslot.l" bones/8/parent = 7 bones/8/rest = Transform3D(-1.19209e-07, 1, -2.22045e-16, -1, -1.19209e-07, -4.55307e-09, -4.55307e-09, -2.22045e-16, 1, 8.34815e-10, 0.0961251, -0.0575001) bones/8/enabled = true bones/8/position = Vector3(-1.695765e-09, 0.0961252, -0.0575) -bones/8/rotation = Quaternion(-0.00088720076, 0.0013334863, -0.70235723, 0.7118229) +bones/8/rotation = Quaternion(0.00037105524, 0.0025946489, -0.6976476, 0.7164363) bones/8/scale = Vector3(1, 1, 1) bones/9/name = "1H_Sword_Offhand" bones/9/parent = 8 @@ -31826,15 +31826,15 @@ bones/14/name = "upperarm.r" bones/14/parent = 3 bones/14/rest = Transform3D(0.0572841, -0.998357, 4.47035e-07, 5.06639e-07, 4.17232e-07, 1, -0.998357, -0.0572842, 4.76837e-07, -0.212007, 0.134132, 8.40246e-08) bones/14/enabled = true -bones/14/position = Vector3(-0.21189721, 0.13386868, -0.0010420948) -bones/14/rotation = Quaternion(-0.6192182, 0.08141826, 0.6118496, 0.48536584) +bones/14/position = Vector3(-0.21180826, 0.13382415, -0.0010180731) +bones/14/rotation = Quaternion(-0.61663836, 0.085415535, 0.62646276, 0.46904776) bones/14/scale = Vector3(0.999999, 0.999999, 1) bones/15/name = "lowerarm.r" bones/15/parent = 14 bones/15/rest = Transform3D(0.993887, -0.110402, 1.19007e-07, 0.110402, 0.993887, 3.28831e-09, -1.18643e-07, 9.87045e-09, 1, -7.12186e-11, 0.241897, -1.19406e-07) bones/15/enabled = true bones/15/position = Vector3(-7.12186e-11, 0.241897, -1.19406e-07) -bones/15/rotation = Quaternion(3.852633e-08, 5.6858802e-08, 0.53054243, 0.8476584) +bones/15/rotation = Quaternion(-9.942978e-11, 5.7771533e-08, 0.49996057, 0.86604816) bones/15/scale = Vector3(1, 1, 1) bones/16/name = "wrist.r" bones/16/parent = 15 @@ -31848,14 +31848,14 @@ bones/17/parent = 16 bones/17/rest = Transform3D(1, -1.09104e-05, -1.78637e-07, 1.09104e-05, 1, -2.40084e-09, 1.78637e-07, 2.39889e-09, 1, 1.33227e-15, 0.0738258, 2.22045e-16) bones/17/enabled = true bones/17/position = Vector3(1.33227e-15, 0.0738258, 2.22045e-16) -bones/17/rotation = Quaternion(-0.31285167, 0.31003007, -0.22333848, 0.8695546) +bones/17/rotation = Quaternion(-0.30761233, 0.30569842, -0.2079677, 0.87673986) bones/17/scale = Vector3(1, 1, 1) bones/18/name = "handslot.r" bones/18/parent = 17 bones/18/rest = Transform3D(-1.19209e-07, -1, 2.22045e-16, 1, -1.19209e-07, -4.55301e-09, 4.55301e-09, -2.22045e-16, 1, -8.34815e-10, 0.0961251, -0.0575001) bones/18/enabled = true bones/18/position = Vector3(-1.4181621e-08, 0.0961251, -0.0575) -bones/18/rotation = Quaternion(-0.00015401734, -2.3545876e-05, 0.70263493, 0.7115506) +bones/18/rotation = Quaternion(0.00288088, 0.003609095, 0.6994344, 0.7146819) bones/18/scale = Vector3(1, 1, 1) bones/19/name = "1H_Sword" bones/19/parent = 18 @@ -31876,7 +31876,7 @@ bones/21/parent = 3 bones/21/rest = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.268797, 0) bones/21/enabled = true bones/21/position = Vector3(0, 0.268797, 0) -bones/21/rotation = Quaternion(-0.0028369161, -0.029370032, -0.00024617545, 0.9995645) +bones/21/rotation = Quaternion(-0.0028465556, -0.030465301, -0.00017991973, 0.9995318) bones/21/scale = Vector3(1, 1, 1) bones/22/name = "Knight_Helmet" bones/22/parent = 21 @@ -31896,71 +31896,71 @@ bones/24/name = "upperleg.l" bones/24/parent = 1 bones/24/rest = Transform3D(1, -1.42215e-07, -2.65602e-08, -1.43052e-07, -0.999396, -0.0347412, -2.16035e-08, 0.0347411, -0.999398, 0.170945, 0.113587, 1.39233e-08) bones/24/enabled = true -bones/24/position = Vector3(0.170945, 0.113587, -0.0008175167) -bones/24/rotation = Quaternion(0.99253446, 0.08113696, 0.07482224, 0.051901277) +bones/24/position = Vector3(0.170945, 0.113587, 0.00057042035) +bones/24/rotation = Quaternion(0.99204415, 0.08068581, 0.07546906, 0.0603542) bones/24/scale = Vector3(1, 1, 1) bones/25/name = "lowerleg.l" bones/25/parent = 24 bones/25/rest = Transform3D(1, 1.6129e-07, 1.20856e-07, -1.3212e-07, 0.977433, -0.211248, -1.52201e-07, 0.211248, 0.977433, 3.57982e-09, 0.227077, -6.13986e-09) bones/25/enabled = true bones/25/position = Vector3(3.57982e-09, 0.227077, -6.13986e-09) -bones/25/rotation = Quaternion(0.31100962, 6.48454e-08, -2.1855239e-07, 0.95040685) +bones/25/rotation = Quaternion(0.32404235, 6.3634864e-08, -2.2536847e-07, 0.9460426) bones/25/scale = Vector3(1, 1, 1) bones/26/name = "foot.l" bones/26/parent = 25 bones/26/rest = Transform3D(1, 4.64335e-08, 6.01239e-08, -7.59277e-08, 0.585515, 0.810661, 2.4383e-09, -0.810662, 0.585514, 1.83222e-10, 0.149437, 9.66537e-10) bones/26/enabled = true bones/26/position = Vector3(1.83222e-10, 0.149437, 9.66537e-10) -bones/26/rotation = Quaternion(-0.56677693, -0.20118403, 0.059413362, 0.79671764) +bones/26/rotation = Quaternion(-0.5754419, -0.20132868, 0.05900708, 0.79047567) bones/26/scale = Vector3(1, 1, 0.999999) bones/27/name = "toes.l" bones/27/parent = 26 bones/27/rest = Transform3D(-1, -1.75424e-09, 1.51741e-07, -1.10452e-07, 0.694106, -0.719873, -1.04062e-07, -0.719873, -0.694106, -2.1306e-10, 0.16565, 5.17174e-09) bones/27/enabled = true bones/27/position = Vector3(-2.1306e-10, 0.16565, 5.17174e-09) -bones/27/rotation = Quaternion(-1.0197146e-08, 0.9203551, -0.39108407, 7.8119825e-08) +bones/27/rotation = Quaternion(-1.0198054e-08, 0.9203551, -0.39108407, 7.81167e-08) bones/27/scale = Vector3(1, 1, 1) bones/28/name = "upperleg.r" bones/28/parent = 1 bones/28/rest = Transform3D(1, 1.49611e-07, -6.08626e-08, 1.47406e-07, -0.999396, -0.0347412, -6.60234e-08, 0.0347411, -0.999398, -0.170945, 0.113587, 1.39233e-08) bones/28/enabled = true -bones/28/position = Vector3(-0.170945, 0.113587, 0.0008175475) -bones/28/rotation = Quaternion(0.9945792, -0.030799989, 0.029842721, 0.09472563) +bones/28/position = Vector3(-0.170945, 0.113587, -0.00057038915) +bones/28/rotation = Quaternion(0.99463373, -0.030836096, 0.029874805, 0.09412949) bones/28/scale = Vector3(1, 1, 1) bones/29/name = "lowerleg.r" bones/29/parent = 28 bones/29/rest = Transform3D(1, -1.6129e-07, -1.20856e-07, 1.3212e-07, 0.977433, -0.211248, 1.52201e-07, 0.211248, 0.977433, -3.57982e-09, 0.227077, -6.13986e-09) bones/29/enabled = true bones/29/position = Vector3(-3.57982e-09, 0.227077, -6.13986e-09) -bones/29/rotation = Quaternion(0.3526237, -6.2438666e-08, 2.4504394e-07, 0.9357652) +bones/29/rotation = Quaternion(0.3606838, -6.1874765e-08, 2.5102509e-07, 0.93268824) bones/29/scale = Vector3(1, 1, 1) bones/30/name = "foot.r" bones/30/parent = 29 bones/30/rest = Transform3D(1, -1.55132e-07, 2.93521e-07, -1.47115e-07, 0.585515, 0.810661, -2.97621e-07, -0.810662, 0.585514, -1.83221e-10, 0.149437, 9.66542e-10) bones/30/enabled = true bones/30/position = Vector3(-1.83221e-10, 0.149437, 9.66542e-10) -bones/30/rotation = Quaternion(-0.600817, 0.11135964, -0.015075144, 0.79144853) +bones/30/rotation = Quaternion(-0.60487497, 0.11134049, -0.015335035, 0.7883493) bones/30/scale = Vector3(1, 1, 0.999999) bones/31/name = "toes.r" bones/31/parent = 30 bones/31/rest = Transform3D(-1, 1.75425e-09, -1.51741e-07, 1.10452e-07, 0.694106, -0.719873, 1.04062e-07, -0.719873, -0.694106, 2.13058e-10, 0.16565, 5.17174e-09) bones/31/enabled = true bones/31/position = Vector3(2.13058e-10, 0.16565, 5.17174e-09) -bones/31/rotation = Quaternion(3.036192e-08, 0.9203551, -0.39108407, -6.953354e-08) +bones/31/rotation = Quaternion(2.9855265e-08, 0.91963625, -0.39277142, -6.948212e-08) bones/31/scale = Vector3(1, 1, 1) bones/32/name = "kneeIK.l" bones/32/parent = 0 bones/32/rest = Transform3D(1, -2.59151e-07, -3.89414e-07, -3.89414e-07, 0, -1, 2.59151e-07, 1, 0, 0.170945, 0.29231, 0.575812) bones/32/enabled = true -bones/32/position = Vector3(0.170945, 0.2933799, 0.5768819) +bones/32/position = Vector3(0.170945, 0.29417834, 0.57768035) bones/32/rotation = Quaternion(0.7071068, -2.2930195e-07, -4.605519e-08, 0.7071068) bones/32/scale = Vector3(1, 1, 1) bones/33/name = "control-toe-roll.l" bones/33/parent = 0 bones/33/rest = Transform3D(1, 1.99485e-07, -3.55271e-14, 3.55271e-14, 0, 1, 1.99485e-07, -1, 0, 0.170945, 0.0259903, 0.245789) bones/33/enabled = true -bones/33/position = Vector3(0.20149983, 0.027762832, 0.19321045) -bones/33/rotation = Quaternion(-0.69282955, -7.178747e-08, -6.925056e-08, 0.7211014) +bones/33/position = Vector3(0.20149983, 0.02648736, 0.2002749) +bones/33/rotation = Quaternion(-0.6969236, -7.1386694e-08, -6.966377e-08, 0.7171454) bones/33/scale = Vector3(1, 1, 1) bones/34/name = "control-heel-roll.l" bones/34/parent = 33 @@ -32001,15 +32001,15 @@ bones/39/name = "kneeIK.r" bones/39/parent = 0 bones/39/rest = Transform3D(1, -2.59151e-07, 1.50996e-07, 1.50996e-07, 0, -1, 2.59151e-07, 1, 0, -0.170945, 0.29231, 0.575812) bones/39/enabled = true -bones/39/position = Vector3(-0.170945, 0.2933799, 0.5768818) +bones/39/position = Vector3(-0.170945, 0.29417834, 0.57768035) bones/39/rotation = Quaternion(0.7071068, -3.823849e-08, 1.4500897e-07, 0.7071068) bones/39/scale = Vector3(1, 1, 1) bones/40/name = "control-toe-roll.r" bones/40/parent = 0 bones/40/rest = Transform3D(1, 1.99485e-07, 0, 0, 0, 1, 1.99485e-07, -1, 0, -0.170945, 0.0259903, 0.245789) bones/40/enabled = true -bones/40/position = Vector3(-0.170945, 0.02783467, 0.24941792) -bones/40/rotation = Quaternion(-0.70904064, -7.0396325e-08, -7.066399e-08, 0.70516765) +bones/40/position = Vector3(-0.170945, 0.025172958, 0.24447253) +bones/40/rotation = Quaternion(-0.70611846, -7.062541e-08, -7.04294e-08, 0.70809376) bones/40/scale = Vector3(1, 1, 1) bones/41/name = "control-heel-roll.r" bones/41/parent = 40 @@ -32057,8 +32057,8 @@ bones/47/name = "handIK.l" bones/47/parent = 0 bones/47/rest = Transform3D(-2.38419e-07, 1, 0, 0, 0, 1, 1, 2.38419e-07, 0, 0.713181, 1.10676, 2.54914e-07) bones/47/enabled = true -bones/47/position = Vector3(0.52067727, 0.7841314, -0.05339924) -bones/47/rotation = Quaternion(0.799423, 0.010695671, 0.60067123, 0.0016434311) +bones/47/position = Vector3(0.52067727, 0.7694862, -0.052982565) +bones/47/rotation = Quaternion(0.7997721, 0.011139648, 0.60019785, 0.0017665469) bones/47/scale = Vector3(1, 1, 1) bones/48/name = "elbowIK.r" bones/48/parent = 0 @@ -32071,12 +32071,12 @@ bones/49/name = "handIK.r" bones/49/parent = 0 bones/49/rest = Transform3D(1.19209e-07, -1, -1.19209e-07, 0, -1.19209e-07, 1, -1, -1.19209e-07, 0, -0.713182, 1.10676, -8.51573e-08) bones/49/enabled = true -bones/49/position = Vector3(-0.5107404, 0.7841314, 0.0620955) -bones/49/rotation = Quaternion(0.76388174, -0.010068458, -0.6452746, 0.0020175208) +bones/49/position = Vector3(-0.5107404, 0.7694862, 0.06251216) +bones/49/rotation = Quaternion(0.7642572, -0.010505465, -0.64482236, 0.002165003) bones/49/scale = Vector3(1, 1, 1) [node name="1H_Sword_Offhand" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(-0.016497025, 0.26816204, 0.9632318, 0.9998554, 0.008290631, 0.014817096, -0.00401205, 0.9633371, -0.26825967, 0.51675445, 0.6351288, 0.0034316517) +transform = Transform3D(-0.015049586, 0.2677652, 0.96336627, 0.99983937, -0.0052937283, 0.017091671, 0.009676961, 0.96346873, -0.26764208, 0.5156648, 0.6181228, 0.0015728083) visible = false bone_name = "1H_Sword_Offhand" bone_idx = 9 @@ -32086,7 +32086,7 @@ mesh = SubResource("ArrayMesh_rvosg") skeleton = NodePath("") [node name="Badge_Shield" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(-0.016496988, 0.2681619, 0.96323186, 0.9998554, 0.008288093, 0.014817766, -0.004009429, 0.9633372, -0.26825947, 0.66690785, 0.63743865, -0.038386006) +transform = Transform3D(-0.015049551, 0.26776502, 0.9633663, 0.99983937, -0.0052962666, 0.017092336, 0.009679582, 0.9634688, -0.26764187, 0.6658392, 0.6207872, -0.04014858) visible = false bone_name = "Badge_Shield" bone_idx = 10 @@ -32096,7 +32096,7 @@ mesh = SubResource("ArrayMesh_0xags") skeleton = NodePath("") [node name="Rectangle_Shield" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(-0.016496988, 0.2681619, 0.96323186, 0.9998554, 0.008288093, 0.014817766, -0.004009429, 0.9633372, -0.26825947, 0.66690785, 0.63743865, -0.038386006) +transform = Transform3D(-0.015049551, 0.26776502, 0.9633663, 0.99983937, -0.0052962666, 0.017092336, 0.009679582, 0.9634688, -0.26764187, 0.6658392, 0.6207872, -0.04014858) visible = false bone_name = "Rectangle_Shield" bone_idx = 11 @@ -32106,7 +32106,7 @@ mesh = SubResource("ArrayMesh_qr44s") skeleton = NodePath("") [node name="Round_Shield" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(-0.016496988, 0.2681619, 0.96323186, 0.9998554, 0.008288093, 0.014817766, -0.004009429, 0.9633372, -0.26825947, 0.66690785, 0.63743865, -0.038386006) +transform = Transform3D(-0.015049551, 0.26776502, 0.9633663, 0.99983937, -0.0052962666, 0.017092336, 0.009679582, 0.9634688, -0.26764187, 0.6658392, 0.6207872, -0.04014858) bone_name = "Round_Shield" bone_idx = 12 @@ -32115,7 +32115,7 @@ mesh = SubResource("ArrayMesh_bb24p") skeleton = NodePath("") [node name="Spike_Shield" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(-0.016496988, 0.2681619, 0.96323186, 0.9998554, 0.008288093, 0.014817766, -0.004009429, 0.9633372, -0.26825947, 0.66690785, 0.63743865, -0.038386006) +transform = Transform3D(-0.015049551, 0.26776502, 0.9633663, 0.99983937, -0.0052962666, 0.017092336, 0.009679582, 0.9634688, -0.26764187, 0.6658392, 0.6207872, -0.04014858) bone_name = "Spike_Shield" bone_idx = 13 @@ -32124,7 +32124,7 @@ mesh = SubResource("ArrayMesh_jnwr3") skeleton = NodePath("") [node name="1H_Sword" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(0.0126273045, -0.1607346, 0.98691624, 0.9998864, 0.010089995, -0.011151015, -0.008165288, 0.9869452, 0.16084322, -0.4988582, 0.6385482, 0.14292471) +transform = Transform3D(0.011193838, -0.17062251, 0.9852722, 0.9999358, 0.00048182314, -0.011278062, 0.001449997, 0.98533547, 0.17061667, -0.49953735, 0.62163496, 0.14066279) bone_name = "1H_Sword" bone_idx = 19 @@ -32143,7 +32143,7 @@ shape = SubResource("CapsuleShape3D_nge0l") disabled = true [node name="2H_Sword" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(0.01262729, -0.1607346, 0.98691624, 0.9998864, 0.01008998, -0.011151002, -0.008165275, 0.9869452, 0.16084322, -0.4988582, 0.6385482, 0.14292471) +transform = Transform3D(0.011193823, -0.17062251, 0.9852722, 0.9999358, 0.0004818084, -0.011278049, 0.0014500092, 0.98533547, 0.17061667, -0.49953735, 0.62163496, 0.14066279) bone_name = "2H_Sword" bone_idx = 20 @@ -32152,7 +32152,7 @@ mesh = SubResource("ArrayMesh_ys2n7") skeleton = NodePath("") [node name="Knight_Helmet" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(0.9997625, 0.0012587747, 0.021752767, -0.0011413982, 0.99998474, -0.0054075094, -0.021759253, 0.005381396, 0.9997486, 0.00045063088, 1.1937505, 0.0070946123) +transform = Transform3D(0.99977034, 0.0011376548, 0.021400176, -0.0010204955, 0.9999845, -0.005484817, -0.02140607, 0.0054617194, 0.99975586, 0.0005204348, 1.1915882, 0.0071707955) bone_name = "Knight_Helmet" bone_idx = 22 @@ -32171,7 +32171,7 @@ transform = Transform3D(-0.999711, 2.27778e-05, 0.024046, 5.34939e-07, 1, -0.000 shape = SubResource("CapsuleShape3D_i3cyd") [node name="Knight_Cape" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(0.9967612, 0.001057018, 0.08040971, -0.00016317016, 0.99993813, -0.011121927, -0.0804165, 0.011072785, 0.9966997, 0.00045529613, 1.193751, 0.006949257) +transform = Transform3D(0.9966117, 0.0010734616, 0.08224274, -0.00015146508, 0.9999371, -0.011216093, -0.0822496, 0.011165633, 0.9965491, 0.0005215872, 1.1915886, 0.007025121) visible = false bone_name = "Knight_Cape" bone_idx = 23 diff --git a/packed-scenes/projectile.tscn b/packed-scenes/projectile.tscn index b2e19e1..388a531 100644 --- a/packed-scenes/projectile.tscn +++ b/packed-scenes/projectile.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=7 format=4 uid="uid://ct5l65uyr6ah4"] +[gd_scene load_steps=6 format=4 uid="uid://ct5l65uyr6ah4"] [ext_resource type="Script" uid="uid://bp0km7yaf1acs" path="res://scripts/projectile.gd" id="1_82dr7"] [ext_resource type="Texture2D" uid="uid://dp7oiixx3lh8m" path="res://resources/models/adventures/rogue_texture.png" id="2_s7p1a"] @@ -43,20 +43,15 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_55kdo") -[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_82dr7"] -points = PackedVector3Array(0.04128374, 0.3626984, -0.01389911, -0.061556876, 0.2713009, -0.036756866, -0.032973632, -0.30004406, -0.025322676, -0.0044026896, 0.28842872, 0.071804196, 0.04128374, -0.30572873, 0.008958648, 0.064145416, 0.2769856, -0.036756866, -0.02725206, -0.30572873, 0.03179515, 0.024143642, -0.30572873, -0.036756866, 0.024143642, -0.30572873, 0.037501622, -0.04440447, 0.3626984, -0.025322676, 0.0070035383, 0.2713009, 0.06607647, -0.0041874964, -0.37151226, -0.0017098819, -0.0044026896, 0.36845687, 0.04894644, -0.0386952, -0.30004406, 0.014675744, -0.021542793, -0.30572873, -0.036756866, 0.064145416, 0.28274405, -0.03103977, 0.04128374, -0.30572873, -0.008182013, -0.021542793, -0.30572873, 0.037501622, -0.055823, 0.31699964, -0.025322676, -0.0386952, -0.31141338, -0.008182013, 0.04128374, 0.36845687, -0.01960558, 0.03557448, -0.30004406, 0.02036096, 0.058423847, 0.29987186, -0.036756866, 0.0070035383, 0.3626984, 0.043218717, -0.055823, 0.29987186, -0.036756866, -0.0386952, 0.36845687, -0.01389911, 0.0067091268, -0.36631048, -0.0014341609, -0.0044026896, 0.2769856, 0.071804196, 0.058423847, 0.3055565, -0.025322676, -0.0386952, -0.31141338, 0.008958648, -0.0386952, -0.30004406, -0.01389911, 0.03557448, -0.30004406, -0.01960558) - -[node name="Projectile" type="Area3D"] +[node name="Projectile" type="Node3D"] transform = Transform3D(-4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0, 0, 1, 0, 0, 0) -collision_layer = 8 -collision_mask = 31 script = ExtResource("1_82dr7") [node name="arrow" type="MeshInstance3D" parent="."] mesh = SubResource("ArrayMesh_wk71i") skeleton = NodePath("") -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("ConvexPolygonShape3D_82dr7") - -[connection signal="body_entered" from="." to="." method="_on_body_entered"] +[node name="RayCast3D" type="RayCast3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.4671554e-08, 0.33564603, 0) +enabled = false +collision_mask = 31 diff --git a/packed-scenes/rogue.tscn b/packed-scenes/rogue.tscn index 0feb156..d5c60f4 100644 --- a/packed-scenes/rogue.tscn +++ b/packed-scenes/rogue.tscn @@ -31225,13 +31225,22 @@ transitions = ["Start", "IWR", SubResource("AnimationNodeStateMachineTransition_ graph_offset = Vector2(-341, -183.186) [node name="Rogue" type="CharacterBody3D" node_paths=PackedStringArray("spring_arm", "model") groups=["player"]] -transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0, 0) +transform = Transform3D(0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0) collision_layer = 4 collision_mask = 25 script = ExtResource("1_neebp") arrow_scene = ExtResource("2_7uuak") loaded = true spring_arm = NodePath("SpringArm3D") +maximum_health = 20 +maximum_stamina = 100 +stamina_regeneration_rate = 3 +speed = 5.0 +acceleration = 5.0 +jump_speed = 20.0 +jump_cost = 10 +attack_cost = 20 +damage = 2 model = NodePath("Rig") [node name="Navigation_CollisionShape" type="CollisionShape3D" parent="."] @@ -31246,43 +31255,43 @@ bones/0/name = "root" bones/0/parent = -1 bones/0/rest = Transform3D(1, 0, 2.3841855e-07, 0, 1, 0, -2.3841855e-07, 0, 1, 0, 0, 0) bones/0/enabled = true -bones/0/position = Vector3(0, 4.5906527e-05, 0) +bones/0/position = Vector3(0, 0.00010280854, 0) bones/0/rotation = Quaternion(-1.0940686e-11, 0.00031804445, 1.8949824e-11, 1) bones/0/scale = Vector3(1, 1, 1) bones/1/name = "hips" bones/1/parent = 0 bones/1/rest = Transform3D(1, 0, -2.3841855e-07, 0, 1, 0, 2.3841855e-07, 0, 1, 0, 0.40566343, 0) bones/1/enabled = true -bones/1/position = Vector3(-5.212698e-19, 0.3882999, 1.8025374e-20) -bones/1/rotation = Quaternion(0.00040030995, 0.042972893, -5.9514656e-05, 0.99907625) +bones/1/position = Vector3(-1.784468e-25, 0.3915765, 7.4846016e-19) +bones/1/rotation = Quaternion(0.0004177531, 0.042972714, -6.0253275e-05, 0.99907625) bones/1/scale = Vector3(1, 1, 1) bones/2/name = "spine" bones/2/parent = 1 bones/2/rest = Transform3D(1, 0, 1.4210855e-14, 0, 1, 0, -1.4210855e-14, 0, 1, 0, 0.1919775, 0) bones/2/enabled = true bones/2/position = Vector3(0, 0.1919775, 0) -bones/2/rotation = Quaternion(0.00048730045, 0.00017892211, 1.0855466e-05, 0.99999994) +bones/2/rotation = Quaternion(0.00048991624, -0.00051837345, 6.333066e-05, 0.9999998) bones/2/scale = Vector3(1, 1, 1) bones/3/name = "chest" bones/3/parent = 2 bones/3/rest = Transform3D(1, 0, 0, 0, 0.99999994, 0, 0, 0, 1, 0, 0.37498796, 0) bones/3/enabled = true bones/3/position = Vector3(0, 0.37498796, 0) -bones/3/rotation = Quaternion(0.00018717925, -8.950797e-05, 6.9886235e-05, 1) +bones/3/rotation = Quaternion(0.00019600886, -0.000101350095, 8.938414e-06, 1) bones/3/scale = Vector3(1, 0.99999994, 1) bones/4/name = "upperarm.l" bones/4/parent = 3 bones/4/rest = Transform3D(0.057284202, 0.9983573, -4.5386042e-07, -3.8742996e-07, 4.768369e-07, 0.99999976, 0.9983573, -0.057284202, 4.1410917e-07, 0.21200737, 0.13413215, 8.402462e-08) bones/4/enabled = true -bones/4/position = Vector3(0.2119793, 0.134078, -0.00019805766) -bones/4/rotation = Quaternion(-0.55976903, -0.060519774, -0.64145243, 0.52109) +bones/4/position = Vector3(0.21191402, 0.1340453, -0.00018042425) +bones/4/rotation = Quaternion(-0.56101793, -0.06095207, -0.6422821, 0.518669) bones/4/scale = Vector3(0.99999934, 0.99999934, 0.99999976) bones/5/name = "lowerarm.l" bones/5/parent = 4 bones/5/rest = Transform3D(0.99388725, 0.11040192, -1.1900745e-07, -0.110401966, 0.9938869, 3.2883107e-09, 1.1864304e-07, 9.870443e-09, 0.99999994, -3.219665e-09, 0.2418973, -1.1940561e-07) bones/5/enabled = true bones/5/position = Vector3(-3.219665e-09, 0.2418973, -1.1940561e-07) -bones/5/rotation = Quaternion(3.5936797e-08, -5.8841795e-08, -0.500242, 0.8658856) +bones/5/rotation = Quaternion(1.0993076e-08, -4.433788e-08, -0.49550137, 0.8686072) bones/5/scale = Vector3(1.0000002, 0.9999999, 0.99999994) bones/6/name = "wrist.l" bones/6/parent = 5 @@ -31296,28 +31305,28 @@ bones/7/parent = 6 bones/7/rest = Transform3D(1, 1.091039e-05, 2.662036e-07, -1.0910391e-05, 0.99999994, -2.4018103e-09, -2.6620367e-07, 2.398906e-09, 0.99999994, 9.0816243e-13, 0.073825836, 2.220446e-16) bones/7/enabled = true bones/7/position = Vector3(9.0816243e-13, 0.073825836, 2.220446e-16) -bones/7/rotation = Quaternion(-0.31996244, -0.32821146, 0.14618346, 0.87665945) +bones/7/rotation = Quaternion(-0.31997746, -0.32657832, 0.1445881, 0.877528) bones/7/scale = Vector3(1, 0.99999994, 0.99999994) bones/8/name = "handslot.l" bones/8/parent = 7 bones/8/rest = Transform3D(-1.1920929e-07, 1, -3.2072357e-16, -0.99999994, -1.192093e-07, -4.553069e-09, -4.553069e-09, -2.2204463e-16, 0.99999994, 8.348149e-10, 0.09612507, -0.057500124) bones/8/enabled = true bones/8/position = Vector3(4.437712e-10, 0.096125185, -0.057500035) -bones/8/rotation = Quaternion(-5.7563728e-05, 0.0003969183, -0.7058323, 0.7083789) +bones/8/rotation = Quaternion(-0.00016770068, 0.00030877706, -0.7062343, 0.7079782) bones/8/scale = Vector3(0.99999994, 1, 0.99999994) bones/9/name = "upperarm.r" bones/9/parent = 3 bones/9/rest = Transform3D(0.05728419, -0.99835724, 4.4361707e-07, 5.6624367e-07, 4.7683673e-07, 0.99999976, -0.99835724, -0.05728419, 5.9262936e-07, -0.21200737, 0.13413215, 8.402462e-08) bones/9/enabled = true -bones/9/position = Vector3(-0.21192801, 0.1340523, -0.00018419232) -bones/9/rotation = Quaternion(-0.6179149, 0.080209725, 0.61564386, 0.4824212) +bones/9/position = Vector3(-0.21199329, 0.134085, -0.00020182574) +bones/9/rotation = Quaternion(-0.61880493, 0.0813487, 0.61738425, 0.47885242) bones/9/scale = Vector3(0.9999993, 0.9999993, 0.99999976) bones/10/name = "lowerarm.r" bones/10/parent = 9 bones/10/rest = Transform3D(0.99388725, -0.11040192, 1.1900747e-07, 0.110401966, 0.9938869, 3.288313e-09, -1.1864305e-07, 9.870443e-09, 0.99999994, -7.1218566e-11, 0.24189733, -1.1940561e-07) bones/10/enabled = true bones/10/position = Vector3(-7.1218566e-11, 0.24189733, -1.1940561e-07) -bones/10/rotation = Quaternion(2.1509576e-08, 4.6948106e-08, 0.5227685, 0.85247475) +bones/10/rotation = Quaternion(2.9678166e-08, 4.7537355e-08, 0.5185106, 0.85507125) bones/10/scale = Vector3(1.0000002, 0.9999999, 0.99999994) bones/11/name = "wrist.r" bones/11/parent = 10 @@ -31331,91 +31340,91 @@ bones/12/parent = 11 bones/12/rest = Transform3D(1, -1.091039e-05, -1.7863715e-07, 1.0910391e-05, 0.99999994, -2.4008375e-09, 1.786372e-07, 2.3988884e-09, 0.99999994, 1.3322676e-15, 0.073825836, 2.220446e-16) bones/12/enabled = true bones/12/position = Vector3(1.3322676e-15, 0.073825836, 2.220446e-16) -bones/12/rotation = Quaternion(-0.31838337, 0.30401933, -0.2271529, 0.8686806) +bones/12/rotation = Quaternion(-0.31800085, 0.30155295, -0.22607405, 0.86996084) bones/12/scale = Vector3(1, 0.99999994, 0.99999994) bones/13/name = "handslot.r" bones/13/parent = 12 bones/13/rest = Transform3D(-1.1920929e-07, -1, 3.207168e-16, 0.99999994, -1.192093e-07, -4.553012e-09, 4.553012e-09, -2.2204463e-16, 0.99999994, -8.348149e-10, 0.09612507, -0.057500124) bones/13/enabled = true bones/13/position = Vector3(-1.5459904e-08, 0.096125126, -0.057499975) -bones/13/rotation = Quaternion(0.00019804666, 0.00039927734, 0.7058896, 0.7083218) +bones/13/rotation = Quaternion(-8.6894266e-05, 4.1088664e-05, 0.7061989, 0.7080136) bones/13/scale = Vector3(0.99999994, 1, 0.99999994) bones/14/name = "head" bones/14/parent = 3 bones/14/rest = Transform3D(1, 0, 2.3841854e-07, 0, 1, 0, -2.3841854e-07, 0, 1, 0, 0.26879656, 0) bones/14/enabled = true bones/14/position = Vector3(0, 0.26879656, 0) -bones/14/rotation = Quaternion(-0.0005539667, -0.031366378, 3.2605156e-05, 0.99950784) +bones/14/rotation = Quaternion(-0.0005416243, -0.03074002, -5.4097804e-06, 0.99952734) bones/14/scale = Vector3(1, 1, 1) bones/15/name = "upperleg.l" bones/15/parent = 1 bones/15/rest = Transform3D(1, -1.4221531e-07, -2.6560238e-08, -1.4305222e-07, -0.9993962, -0.034741182, -2.160345e-08, 0.034741133, -0.9993976, 0.17094506, 0.11358726, 1.3923272e-08) bones/15/enabled = true -bones/15/position = Vector3(0.17094508, 0.1135872, -2.7399055e-06) -bones/15/rotation = Quaternion(0.9933333, 0.08293795, 0.074531496, 0.029245652) +bones/15/position = Vector3(0.17094508, 0.1135872, -0.00040050622) +bones/15/rotation = Quaternion(0.9937241, 0.08330146, 0.073393986, 0.013664369) bones/15/scale = Vector3(1, 0.9999998, 1.0000012) bones/16/name = "lowerleg.l" bones/16/parent = 15 bones/16/rest = Transform3D(1, 1.6129098e-07, 1.208564e-07, -1.3212028e-07, 0.9774329, -0.21124826, -1.5220138e-07, 0.21124834, 0.97743255, 3.5797574e-09, 0.2270775, -6.140325e-09) bones/16/enabled = true bones/16/position = Vector3(3.5797574e-09, 0.2270775, -6.140325e-09) -bones/16/rotation = Quaternion(0.24147674, 6.342827e-08, -1.6912848e-07, 0.9704066) +bones/16/rotation = Quaternion(0.20449843, 6.370045e-08, -1.3522428e-07, 0.9788669) bones/16/scale = Vector3(1, 1.0000005, 1.0000001) bones/17/name = "foot.l" bones/17/parent = 16 bones/17/rest = Transform3D(1, 4.6433247e-08, 6.012356e-08, -7.592726e-08, 0.5855154, 0.8106606, 2.4383358e-09, -0.81066227, 0.5855142, 1.8334093e-10, 0.14943703, 9.660811e-10) bones/17/enabled = true bones/17/position = Vector3(1.8334093e-10, 0.14943703, 9.660811e-10) -bones/17/rotation = Quaternion(-0.54130316, -0.2072299, 0.050382406, 0.8133316) +bones/17/rotation = Quaternion(-0.51999766, -0.20842338, 0.044675738, 0.82714343) bones/17/scale = Vector3(1, 1.0000008, 0.99999875) bones/18/name = "toes.l" bones/18/parent = 17 bones/18/rest = Transform3D(-1, -1.7553674e-09, 1.5174173e-07, -1.1045316e-07, 0.69410586, -0.719873, -1.0406117e-07, -0.7198729, -0.694106, -2.131959e-10, 0.16565003, 5.1714744e-09) bones/18/enabled = true bones/18/position = Vector3(-2.131959e-10, 0.16565003, 5.1714744e-09) -bones/18/rotation = Quaternion(-9.829811e-09, 0.9203513, -0.39109263, 7.826989e-08) +bones/18/rotation = Quaternion(-9.572115e-09, 0.92017806, -0.3915002, 7.8214086e-08) bones/18/scale = Vector3(1, 0.99999994, 1.0000001) bones/19/name = "upperleg.r" bones/19/parent = 1 bones/19/rest = Transform3D(1, 1.4961141e-07, -6.08626e-08, 1.4740668e-07, -0.9993962, -0.034741182, -6.6023446e-08, 0.034741133, -0.9993976, -0.17094506, 0.11358726, 1.3923272e-08) bones/19/enabled = true -bones/19/position = Vector3(-0.17094508, 0.11358732, 2.771481e-06) -bones/19/rotation = Quaternion(0.9963822, -0.03007052, 0.031022659, 0.07318414) +bones/19/position = Vector3(-0.17094508, 0.11358732, 0.0004005379) +bones/19/rotation = Quaternion(0.9970729, -0.029483221, 0.031287275, 0.063227035) bones/19/scale = Vector3(1, 0.9999998, 1.0000012) bones/20/name = "lowerleg.r" bones/20/parent = 19 bones/20/rest = Transform3D(1, -1.61291e-07, -1.2085643e-07, 1.3212028e-07, 0.9774329, -0.21124826, 1.5220141e-07, 0.21124834, 0.97743255, -3.5797574e-09, 0.2270775, -6.140325e-09) bones/20/enabled = true bones/20/position = Vector3(-3.5797574e-09, 0.2270775, -6.140325e-09) -bones/20/rotation = Quaternion(0.3114344, -6.389704e-08, 2.1655013e-07, 0.95026773) +bones/20/rotation = Quaternion(0.2798373, -6.346644e-08, 1.960073e-07, 0.96004754) bones/20/scale = Vector3(1, 1.0000005, 1.0000001) bones/21/name = "foot.r" bones/21/parent = 20 bones/21/rest = Transform3D(1, -1.5513157e-07, 2.9352182e-07, -1.4711539e-07, 0.5855154, 0.8106606, -2.9762074e-07, -0.81066227, 0.5855142, -1.8333904e-10, 0.14943703, 9.660859e-10) bones/21/enabled = true bones/21/position = Vector3(-1.8333904e-10, 0.14943703, 9.660859e-10) -bones/21/rotation = Quaternion(-0.57692945, 0.11376536, -0.011446258, 0.8087514) +bones/21/rotation = Quaternion(-0.5619069, 0.11402076, -0.008900544, 0.8192562) bones/21/scale = Vector3(1, 1.0000008, 0.99999875) bones/22/name = "toes.r" bones/22/parent = 21 bones/22/rest = Transform3D(-1, 1.7553639e-09, -1.5174174e-07, 1.1045316e-07, 0.69410586, -0.719873, 1.0406118e-07, -0.7198729, -0.694106, 2.1319319e-10, 0.16565003, 5.171479e-09) bones/22/enabled = true bones/22/position = Vector3(2.1319319e-10, 0.16565003, 5.171479e-09) -bones/22/rotation = Quaternion(3.0355896e-08, 0.9203548, -0.39108446, -6.9535375e-08) +bones/22/rotation = Quaternion(3.0355423e-08, 0.9203548, -0.39108446, -6.953561e-08) bones/22/scale = Vector3(1, 0.99999994, 1.0000001) bones/23/name = "kneeIK.l" bones/23/parent = 0 bones/23/rest = Transform3D(1, -2.5915057e-07, -3.8941417e-07, -3.8941423e-07, 0, -0.9999999, 2.591506e-07, 0.9999999, -1.00916915e-13, 0.17094491, 0.29231027, 0.57581246) bones/23/enabled = true -bones/23/position = Vector3(0.17094491, 0.29260758, 0.57610977) +bones/23/position = Vector3(0.17094491, 0.29247516, 0.5759774) bones/23/rotation = Quaternion(0.7071068, -2.2930868e-07, -4.604875e-08, 0.7071068) bones/23/scale = Vector3(1, 0.9999999, 0.9999999) bones/24/name = "control-toe-roll.l" bones/24/parent = 0 bones/24/rest = Transform3D(1, 1.994847e-07, -2.1316282e-14, 2.1316282e-14, 0, 1, 1.994847e-07, -1, 0, 0.17094497, 0.025990263, 0.24578938) bones/24/enabled = true -bones/24/position = Vector3(0.20205116, 0.025962915, 0.20550987) -bones/24/rotation = Quaternion(-0.70710206, -7.0529005e-08, -7.052802e-08, 0.7071116) +bones/24/position = Vector3(0.20205116, 0.026394421, 0.20250753) +bones/24/rotation = Quaternion(-0.7043244, -7.079499e-08, -7.026215e-08, 0.70987827) bones/24/scale = Vector3(1, 1, 1) bones/25/name = "control-heel-roll.l" bones/25/parent = 24 @@ -31456,15 +31465,15 @@ bones/30/name = "kneeIK.r" bones/30/parent = 0 bones/30/rest = Transform3D(1, -2.5915057e-07, 1.5099583e-07, 1.5099585e-07, 0, -0.9999999, 2.591506e-07, 0.9999999, 3.913066e-14, -0.17094518, 0.29231027, 0.57581234) bones/30/enabled = true -bones/30/position = Vector3(-0.17094518, 0.29260758, 0.57610965) +bones/30/position = Vector3(-0.17094518, 0.29247516, 0.57597727) bones/30/rotation = Quaternion(0.7071068, -3.824488e-08, 1.4501506e-07, 0.7071068) bones/30/scale = Vector3(1, 0.9999999, 0.9999999) bones/31/name = "control-toe-roll.r" bones/31/parent = 0 bones/31/rest = Transform3D(1, 1.9948473e-07, -7.1054274e-15, 7.1054274e-15, 0, 1, 1.9948473e-07, -1, 0, -0.1709451, 0.025990263, 0.24578929) bones/31/enabled = true -bones/31/position = Vector3(-0.1709451, 0.026196871, 0.24401468) -bones/31/rotation = Quaternion(-0.7047171, -7.079057e-08, -7.026141e-08, 0.70948845) +bones/31/position = Vector3(-0.1709451, 0.027152533, 0.24722822) +bones/31/rotation = Quaternion(-0.7079277, -7.047974e-08, -7.058945e-08, 0.7062849) bones/31/scale = Vector3(1, 1, 1) bones/32/name = "control-heel-roll.r" bones/32/parent = 31 @@ -31512,8 +31521,8 @@ bones/38/name = "handIK.l" bones/38/parent = 0 bones/38/rest = Transform3D(-2.3841855e-07, 0.99999976, -1.4210854e-14, -5.9604638e-08, -3.5527128e-15, 0.99999994, 0.9999999, 2.3841852e-07, 5.960464e-08, 0.7131815, 1.1067611, 2.5491414e-07) bones/38/enabled = true -bones/38/position = Vector3(0.52073157, 0.7866498, -0.05650429) -bones/38/rotation = Quaternion(0.7955404, 0.0021493314, 0.6058966, 0.0004758062) +bones/38/position = Vector3(0.52073157, 0.7878952, -0.056568243) +bones/38/rotation = Quaternion(0.79548514, 0.0020823404, 0.60596925, 0.00045760418) bones/38/scale = Vector3(0.9999999, 0.99999976, 0.99999994) bones/39/name = "elbowIK.r" bones/39/parent = 0 @@ -31526,17 +31535,17 @@ bones/40/name = "handIK.r" bones/40/parent = 0 bones/40/rest = Transform3D(1.1920929e-07, -1, -5.9604645e-08, 5.9604645e-08, -1.1920929e-07, 1, -1, -1.7881393e-07, 0, -0.71318156, 1.1067611, -8.515731e-08) bones/40/enabled = true -bones/40/position = Vector3(-0.51085526, 0.78664976, 0.060037628) -bones/40/rotation = Quaternion(-0.75944823, 0.0019048174, 0.65056497, -0.00023018353) +bones/40/position = Vector3(-0.51085526, 0.7878951, 0.059973676) +bones/40/rotation = Quaternion(-0.759389, 0.0018389486, 0.6506344, -0.00020818613) bones/40/scale = Vector3(1, 1, 1) [node name="handslot_l" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(-0.0028749027, 0.2638365, 0.96456254, 0.9999952, 0.00046218684, 0.0028542918, 0.00030752388, 0.9645669, -0.26383683, 0.50828844, 0.6353663, -0.017329717) +transform = Transform3D(-0.0035132607, 0.26502588, 0.96423423, 0.9999931, 0.00092311215, 0.0033901404, 8.6892505e-06, 0.96424025, -0.2650275, 0.5088632, 0.6371081, -0.017986983) bone_name = "handslot.l" bone_idx = 8 [node name="handslot_r" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(-0.002340604, -0.15286726, -0.9882433, -0.9999963, 0.00074513373, 0.0022535678, 0.00039146826, 0.9882458, -0.15286875, -0.49159816, 0.63963985, 0.10765835) +transform = Transform3D(-0.0021781807, -0.15201536, -0.9883751, -0.99999595, 0.0016329561, 0.0019529517, 0.0013167905, 0.9883763, -0.15201856, -0.49161294, 0.6409366, 0.10730599) bone_name = "handslot.r" bone_idx = 13 @@ -31549,7 +31558,7 @@ skeleton = NodePath("") transform = Transform3D(1, 2.7939677e-09, 7.450581e-09, 0, 1.0000008, 1.033186e-09, -1.3038516e-08, -1.5279511e-09, 1.0000008, 0.56380576, 0.16657025, -0.003502518) [node name="chest" type="BoneAttachment3D" parent="Rig/Skeleton3D"] -transform = Transform3D(0.9962365, 0.000109913904, 0.086677976, 7.707911e-05, 0.9999977, -0.0021539808, -0.08667801, 0.002152555, 0.9962342, 0.00011078319, 0.9553106, 0.00081534253) +transform = Transform3D(0.9963584, 0.00013053692, 0.085264646, 5.8259513e-05, 0.9999975, -0.0022117489, -0.08526474, 0.0022086618, 0.99635595, 7.3187184e-05, 0.95864403, 0.0008404212) bone_name = "chest" bone_idx = 3 diff --git a/packed-scenes/target.tscn b/packed-scenes/target.tscn index 801d153..3dde39a 100644 --- a/packed-scenes/target.tscn +++ b/packed-scenes/target.tscn @@ -41,10 +41,10 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_0n375") -[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_d8tpd"] -points = PackedVector3Array(0.049990214, 0, 0.17, 0.050000004, 0.17, 0, 0.049990214, 0.12017815, 0.12017815, -0.050000004, 0, 0.17, 0.049990214, -0.12021144, 0.12017815, -0.050000004, 0.17, 0, 0.050000004, 0, -0.17, 0.050000004, 0.12017815, -0.12021144, -0.050000004, 0.12017815, 0.12017815, -0.050000004, -0.12021144, 0.12017815, 0.049990214, -0.17, 0, -0.050000004, 0.12017815, -0.12021144, 0.049990214, -0.12021144, -0.12021144, -0.050000004, 0, -0.17, -0.050000004, -0.17, 0, -0.050000004, -0.12021144, -0.12021144) +[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_ikhwp"] +points = PackedVector3Array(-0.049999997, -0.010245939, -0.16406348, 0.049999997, 0.009738399, 0.15593648, 0.049999997, 0.03409966, 0.14616756, -0.049999997, 0.035876844, 0.15378544, -0.049999997, -0.16406348, 0.010245939, 0.049999997, -0.1120679, -0.1120679, 0.048056543, 0.12476997, -0.10916965, -0.049999997, 0.16406348, 0.010245939, 0.049999997, -0.1120679, 0.1120679, 0.04830738, 0.12019999, 0.12019999, -0.049999997, -0.11790859, 0.11790859, -0.049999997, 0.11790859, -0.11790859, 0.047874413, -0.010348912, -0.16571234, -0.049999997, -0.11790859, -0.11790859, 0.049999997, -0.15593648, -0.009738399, 0.049999997, 0.15593648, 0.009738399, -0.049999997, 0.11790859, 0.11790859, 0.047874413, -0.010348912, 0.16571234, -0.049999997, -0.010245939, 0.16406348, 0.04830738, 0.12019999, -0.12019999, -0.049999997, 0.010245939, -0.16406348, -0.049999997, 0.16406348, -0.010245939, -0.049999997, -0.16406348, -0.010245939, 0.049999997, -0.15593648, 0.009738399, 0.049999997, 0.15593648, -0.009738399, 0.049999997, 0.009738399, -0.15593648, -0.049999997, 0.010245939, 0.16406348, 0.04778016, -0.036164127, 0.15501685, 0.04778016, -0.036164127, -0.15501685, -0.049999997, -0.12815452, -0.097384594, -0.049999997, -0.12815452, 0.097384594, -0.049999997, -0.097384594, -0.12815452) -[node name="Target" type="Area3D"] +[node name="Target" type="RigidBody3D"] script = ExtResource("1_ikhwp") [node name="target-large" type="MeshInstance3D" parent="."] @@ -52,6 +52,4 @@ mesh = SubResource("ArrayMesh_2f4dd") skeleton = NodePath("") [node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("ConvexPolygonShape3D_d8tpd") - -[connection signal="body_entered" from="." to="." method="_on_body_entered"] +shape = SubResource("ConvexPolygonShape3D_ikhwp") diff --git a/packed-scenes/ui.tscn b/packed-scenes/ui.tscn index 69c8992..3d85538 100644 --- a/packed-scenes/ui.tscn +++ b/packed-scenes/ui.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=3 uid="uid://d1vowjv6aed2s"] +[gd_scene load_steps=17 format=3 uid="uid://d1vowjv6aed2s"] [ext_resource type="Script" uid="uid://q8x02edi74ew" path="res://scripts/ui.gd" id="1_ccvhj"] [ext_resource type="Theme" uid="uid://b3faaa6kmpthu" path="res://resources/themes/standard_theme.tres" id="2_idm21"] @@ -12,6 +12,7 @@ [ext_resource type="Texture2D" uid="uid://cvdadrdudg5t4" path="res://resources/images/UI Adventure Pack/arrowSilver_right.png" id="11_oen8p"] [ext_resource type="Texture2D" uid="uid://7bb3euq2fgiw" path="res://resources/images/UI Adventure Pack/uipack_rpg_vector.svg" id="12_hm7ey"] [ext_resource type="Texture2D" uid="uid://ca3i2uc1tplhs" path="res://resources/ui_atlas_texture.tres" id="13_8sxqo"] +[ext_resource type="Texture2D" uid="uid://d1lbwoyq7fkxr" path="res://resources/images/crosshairs.tres" id="13_gvkng"] [sub_resource type="AtlasTexture" id="AtlasTexture_7ucui"] atlas = ExtResource("12_hm7ey") @@ -209,3 +210,23 @@ size_flags_vertical = 4 texture_normal = ExtResource("13_8sxqo") texture_hover = SubResource("AtlasTexture_kin0h") stretch_mode = 3 + +[node name="CrossHair" type="BoxContainer" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -32.0 +offset_top = -32.0 +offset_right = 32.0 +offset_bottom = 32.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TextureRect" type="TextureRect" parent="CrossHair"] +layout_mode = 2 +texture = ExtResource("13_gvkng") +metadata/_edit_use_anchors_ = true diff --git a/resources/images/crosshairs.tres b/resources/images/crosshairs.tres new file mode 100644 index 0000000..e263cd8 --- /dev/null +++ b/resources/images/crosshairs.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://d1lbwoyq7fkxr"] + +[ext_resource type="Texture2D" uid="uid://bgbghh7pdfkqj" path="res://resources/images/crosshairs_tilesheet_white.png" id="1_7xu4w"] + +[resource] +atlas = ExtResource("1_7xu4w") +region = Rect2(483, 0, 64, 64) diff --git a/resources/images/crosshairs_tilesheet_white.png b/resources/images/crosshairs_tilesheet_white.png new file mode 100644 index 0000000000000000000000000000000000000000..3fac20b438e85e4b824f74180f681f40d16be3b6 GIT binary patch literal 39440 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/crosshairs_vector.svg.import b/resources/images/crosshairs_vector.svg.import new file mode 100644 index 0000000..25d49b5 --- /dev/null +++ b/resources/images/crosshairs_vector.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b27aer2klxdin" +path="res://.godot/imported/crosshairs_vector.svg-7f9aa4331d14146b06ed91dc862dd79e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resources/images/crosshairs_vector.svg" +dest_files=["res://.godot/imported/crosshairs_vector.svg-7f9aa4331d14146b06ed91dc862dd79e.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/scenes/game.tscn b/scenes/game.tscn index 16c5b47..8ddd61b 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1263,4 +1263,4 @@ grow_horizontal = 0 transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 23, 6, 20) [node name="Target" parent="." instance=ExtResource("36_twgab")] -transform = Transform3D(-2.1855695e-07, 0, 5, 0, 5, 0, -5, 0, -2.1855695e-07, 24, 6.5, 12) +transform = Transform3D(-2.1855695e-07, 0, 5, 0, 5, 0, -5, 0, -2.1855695e-07, 24, 6, 12) diff --git a/scripts/hitbox.gd b/scripts/hitbox.gd index f4204b5..d873e0e 100644 --- a/scripts/hitbox.gd +++ b/scripts/hitbox.gd @@ -2,7 +2,7 @@ class_name HitBox extends Area3D func _init() -> void: collision_layer = 2 - collision_mask = 0 + collision_mask = 2 func get_damage() -> int: return owner.damage diff --git a/scripts/hurtbox.gd b/scripts/hurtbox.gd index 7765a66..426141a 100644 --- a/scripts/hurtbox.gd +++ b/scripts/hurtbox.gd @@ -9,13 +9,23 @@ func _init() -> void: func _ready() -> void: connect("area_entered", Callable(self, "_on_area_entered")) + monitoring = true + func _on_area_entered(hitbox) -> void: + if not can_take_damage: + return + if not hitbox is HitBox: print("Unexpected type:", hitbox) return - if hitbox == null or hitbox.owner == owner: + if hitbox.owner == owner: + print("Hitbox owner is the same as hurtbox owner, ignoring hit.") + return + + if hitbox == null or not hitbox is HitBox: + print("Unexpected or null hitbox:", hitbox) return if owner.has_method("take_damage"): @@ -26,6 +36,3 @@ func start_cooldown() -> void: can_take_damage = false await get_tree().create_timer(cooldown_time).timeout can_take_damage = true - -# set_deferred("monitor", false) -# queue_free() diff --git a/scripts/player.gd b/scripts/player.gd index 32cf768..5ef223a 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -2,7 +2,7 @@ class_name Player extends Unit @export var mouse_sensitivity := 0.006 @export var rotation_speed := 24.0 -@export var joypad_sensitivity := 0.1 +@export var joypad_sensitivity := 2 @export var spring_arm: SpringArm3D var gold := 0: @@ -29,6 +29,15 @@ func _physics_process(delta: float) -> void: if velocity.length() > 1.0: model.rotation.y = lerp_angle(model.rotation.y, spring_arm.rotation.y, rotation_speed * delta) + move_camera_joypad(delta) + +func move_camera_joypad(delta: float) -> void: + var x_axis = Input.get_joy_axis(0, JOY_AXIS_RIGHT_X) + var y_axis = Input.get_joy_axis(0, JOY_AXIS_RIGHT_Y) + spring_arm.rotation.y -= x_axis * joypad_sensitivity * delta + spring_arm.rotation.x -= y_axis * joypad_sensitivity * delta + spring_arm.rotation_degrees.x = clamp(spring_arm.rotation_degrees.x, -90.0, 30.0) + func player_game_over(): GameManager.game_over() queue_free() @@ -39,14 +48,6 @@ func _input(event: InputEvent) -> void: spring_arm.rotation.x -= event.relative.y * mouse_sensitivity spring_arm.rotation_degrees.x = clamp(spring_arm.rotation_degrees.x, -90.0, 30.0) spring_arm.rotation.y -= event.relative.x * mouse_sensitivity - - # Move camera via joypad - if event is InputEventJoypadMotion: - if event.axis == JOY_AXIS_RIGHT_X: - spring_arm.rotation.y -= event.axis_value * joypad_sensitivity - elif event.axis == JOY_AXIS_RIGHT_Y: - spring_arm.rotation.x -= event.axis_value * joypad_sensitivity - spring_arm.rotation_degrees.x = clamp(spring_arm.rotation_degrees.x, -90.0, 30.0) # Jump if is_on_floor() and Input.is_action_just_pressed("jump"): diff --git a/scripts/projectile.gd b/scripts/projectile.gd index 5546680..62a1180 100644 --- a/scripts/projectile.gd +++ b/scripts/projectile.gd @@ -1,17 +1,30 @@ -extends Area3D +class_name Projectile extends Node3D var speed: float = 0.0 +var damage_amount: float = 3 +@onready var ray_cast: RayCast3D = $RayCast3D func _physics_process(delta): - translate(-transform.basis.x * speed * delta) - #translate(Vector3.FORWARD * speed * delta) + if speed > 0.0: + translate(-transform.basis.x * speed * delta) + #translate(Vector3.FORWARD * speed * delta) + if ray_cast.is_colliding(): + var collider = ray_cast.get_collider() -func shoot() -> void: - speed = 30 - #var timer = get_tree().create_timer(3.0) # 3 seconds lifetime - #timer.timeout.connect(queue_free) + #Stuck in collider + print("Arrow hits ", collider) + speed = 0 + ray_cast.enabled = false + # var timer = get_tree().create_timer(3.0) # 3 seconds lifetime + # print("Arrow will be removed in 3 seconds") + # timer.timeout.connect(queue_free) + + #Trigger damage + if collider.has_method("take_damage"): + collider.call("take_damage", damage_amount) + -func _on_body_entered(body: Node) -> void: - print("Projectile hits " + body.name + "...") - #TODO: Add damage to hit body - queue_free() +func shoot() -> void: + print("Shooting arrow...") + speed = 20 + ray_cast.enabled = true diff --git a/scripts/rogue.gd b/scripts/rogue.gd index 4b09292..b301c2d 100644 --- a/scripts/rogue.gd +++ b/scripts/rogue.gd @@ -14,11 +14,12 @@ var footsteps := [ @onready var shoot_point: Node3D = $Rig/Skeleton3D/handslot_r/ShootPoint @export var loaded: bool -var current_arrow: Area3D +var current_arrow: Node3D func _ready() -> void: if loaded == true: arrow_loaded() + print("Current arrow: " + str(current_arrow)) func _input(event: InputEvent) -> void: # Shoot @@ -44,7 +45,11 @@ func _input(event: InputEvent) -> void: if Input.is_action_just_released("block"): state = States.idle anim_tree.set("parameters/conditions/aiming", state == States.aiming) anim_tree.set("parameters/conditions/not_aiming", state != States.aiming) - + #Camera + spring_arm.get_child(0).fov = 40 if state == States.aiming else 70 + spring_arm.transform.origin.x = 0.5 # Shoulder offset + spring_arm.spring_length = 3.0 + # Calls the _input() from player.gd super._input(event) @@ -54,7 +59,6 @@ func shoot_arrow() -> void: func arrow_loaded() -> void: print("Arrow loaded...") - var new_arrow = arrow_scene.instantiate() + current_arrow = arrow_scene.instantiate() #new_arrow.global_transform = shoot_point.global_transform - shoot_point.add_child(new_arrow) - current_arrow = new_arrow + shoot_point.add_child(current_arrow) diff --git a/scripts/target.gd b/scripts/target.gd index 050b4ca..854af4d 100644 --- a/scripts/target.gd +++ b/scripts/target.gd @@ -1,4 +1,16 @@ -extends Area3D +class_name Target extends RigidBody3D +var health: int = 10 -func _on_body_entered(body: Node3D) -> void: - print(body.name + " hits the target...") +signal damaged(amount) +signal died() + +func take_damage(damage_amount: int) -> void: + health -= damage_amount + emit_signal("damaged", damage_amount) + if health <= 0: + emit_signal("died") + die() + +func die() -> void: + # Optional: spawn explosion, play animation/sound, then remove + queue_free() diff --git a/scripts/ui.gd b/scripts/ui.gd index d7cd49c..e972d16 100644 --- a/scripts/ui.gd +++ b/scripts/ui.gd @@ -4,12 +4,15 @@ extends Control @export var stamina_bar: TextureProgressBar @export var gold_label: Label @onready var player: Player = get_tree().get_first_node_in_group("player") +@onready var cross_hair: BoxContainer = $CrossHair func _ready() -> void: player.health_changed.connect(update_health_bar) player.stamina_changed.connect(update_stamina_bar) player.gold_changed.connect(update_gold_text) player.player_loaded.connect(_on_player_loaded) + var unit = player as Unit + unit.connect("state_changed", Callable(self, "_on_state_changed")) func update_health_bar(current_health: int, maximum_health: int) -> void: health_bar.value = (100.0 / maximum_health) * current_health @@ -24,3 +27,9 @@ func _on_player_loaded() -> void: update_health_bar(player.health, player.maximum_health) update_stamina_bar(player.stamina, player.maximum_stamina) update_gold_text(player.gold) + +func _on_state_changed(old_state: Unit.States, new_state: Unit.States): + if player.state == Unit.States.aiming: + cross_hair.visible = true + else: + cross_hair.visible = false