Dialogue system; ask user if they want to teleport to next floor

This commit is contained in:
2024-09-08 23:04:27 -07:00
parent 1dfc61f003
commit 07295da93c
61 changed files with 3002 additions and 85 deletions

4
src/items/IEquippable.cs Normal file
View File

@@ -0,0 +1,4 @@
namespace GameJamDungeon
{
public interface IEquippable;
}

View File

@@ -9,6 +9,4 @@ namespace GameJamDungeon
public InventoryItemInfo Info { get; }
}
public interface IEquippable;
}

View File

@@ -15,6 +15,12 @@ namespace GameJamDungeon
[Export]
public PackedScene AccessoryScene { get; set; }
[Export]
public PackedScene ThrowableItemScene { get; set; }
[Export]
public PackedScene ConsumableItemScene { get; set; }
public List<(IInventoryItem Item, float SpawnRate)> Database { get; private set; }
public void SpawnItems()
@@ -23,13 +29,15 @@ namespace GameJamDungeon
var armorResources = DirAccess.GetFilesAt("res://src/items/armor/resources/");
var weaponResources = DirAccess.GetFilesAt("res://src/items/weapons/resources/");
var accessoryResources = DirAccess.GetFilesAt("res://src/items/accessory/resources/");
var throwableResources = DirAccess.GetFilesAt("res://src/items/throwable/resources/");
var consumableResources = DirAccess.GetFilesAt("res://src/items/consumable/resources/");
foreach (var armor in armorResources)
{
var armorInfo = GD.Load<ArmorInfo>($"res://src/items/armor/resources/{armor}");
var armorScene = ArmorScene.Instantiate<Armor>();
armorScene.ArmorInfo = armorInfo;
Database.Add(new(armorScene, 0.75f));
Database.Add(new(armorScene, 0.01f));
}
foreach (var weapon in weaponResources)
@@ -37,7 +45,7 @@ namespace GameJamDungeon
var weaponInfo = GD.Load<WeaponInfo>($"res://src/items/weapons/resources/{weapon}");
var weaponScene = WeaponScene.Instantiate<Weapon>();
weaponScene.WeaponInfo = weaponInfo;
Database.Add(new(weaponScene, 0.75f));
Database.Add(new(weaponScene, 0.01f));
}
foreach (var accessory in accessoryResources)
@@ -45,7 +53,23 @@ namespace GameJamDungeon
var accessoryInfo = GD.Load<AccessoryInfo>($"res://src/items/accessory/resources/{accessory}");
var accessoryScene = AccessoryScene.Instantiate<Accessory>();
accessoryScene.AccessoryInfo = accessoryInfo;
Database.Add(new(accessoryScene, 0.75f));
Database.Add(new(accessoryScene, 0.01f));
}
foreach (var throwable in throwableResources)
{
var throwableItemInfo = GD.Load<ThrowableItemInfo>($"res://src/items/throwable/resources/{throwable}");
var throwableItemScene = ThrowableItemScene.Instantiate<ThrowableItem>();
throwableItemScene.ThrowableItemInfo = throwableItemInfo;
Database.Add(new(throwableItemScene, 0.01f));
}
foreach (var consumable in consumableResources)
{
var consumableItemInfo = GD.Load<ConsumableItemInfo>($"res://src/items/consumable/resources/{consumable}");
var consumableItemScene = ConsumableItemScene.Instantiate<ConsumableItem>();
consumableItemScene.ConsumableItemInfo = consumableItemInfo;
Database.Add(new(consumableItemScene, 0.9f));
}
}
}

View File

@@ -1,12 +1,16 @@
[gd_scene load_steps=5 format=3 uid="uid://twrj4wixcbu7"]
[gd_scene load_steps=7 format=3 uid="uid://twrj4wixcbu7"]
[ext_resource type="Script" path="res://src/items/ItemDatabase.cs" id="1_7b315"]
[ext_resource type="PackedScene" uid="uid://db206brufi83s" path="res://src/items/weapons/Weapon.tscn" id="2_14w53"]
[ext_resource type="PackedScene" uid="uid://dorr7v1tkeiy0" path="res://src/items/armor/Armor.tscn" id="3_p6rkn"]
[ext_resource type="PackedScene" uid="uid://b07srt3lckt4e" path="res://src/items/accessory/Accessory.tscn" id="4_oqm6k"]
[ext_resource type="PackedScene" uid="uid://1fl6s352e2ej" path="res://src/items/throwable/ThrowableItem.tscn" id="5_l0fpl"]
[ext_resource type="PackedScene" uid="uid://c6w7dpk0hurj0" path="res://src/items/consumable/ConsumableItem.tscn" id="6_51k8r"]
[node name="ItemDatabase" type="Node"]
script = ExtResource("1_7b315")
WeaponScene = ExtResource("2_14w53")
ArmorScene = ExtResource("3_p6rkn")
AccessoryScene = ExtResource("4_oqm6k")
ThrowableItemScene = ExtResource("5_l0fpl")
ConsumableItemScene = ExtResource("6_51k8r")

View File

@@ -0,0 +1,39 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using GameJamDungeon;
using Godot;
using System;
using System.Linq;
[Meta(typeof(IAutoNode))]
public partial class ConsumableItem : Node3D, IInventoryItem
{
public override void _Notification(int what) => this.Notify(what);
[Dependency] public IGameRepo GameRepo => this.DependOn<IGameRepo>();
public InventoryItemInfo Info => ConsumableItemInfo;
[Export]
public ConsumableItemInfo ConsumableItemInfo { get; set; }
[Node] public Sprite3D Sprite { get; set; } = default!;
[Node] public Area3D Pickup { get; set; } = default!;
public void OnReady()
{
Sprite.Texture = ConsumableItemInfo.Texture;
Pickup.BodyEntered += OnEntered;
}
public void OnEntered(Node3D body)
{
if (GameRepo.InventoryItems.Value.Count() >= GameRepo.MaxItemSize)
return;
var inventoryList = GameRepo.InventoryItems.Value.Append(this).ToList();
GameRepo.InventoryItems.OnNext(inventoryList);
QueueFree();
}
}

View File

@@ -0,0 +1,34 @@
[gd_scene load_steps=5 format=3 uid="uid://c6w7dpk0hurj0"]
[ext_resource type="Script" path="res://src/items/consumable/ConsumableItem.cs" id="1_26bad"]
[ext_resource type="Script" path="res://src/items/consumable/ConsumableItemInfo.cs" id="2_g3oo3"]
[sub_resource type="Resource" id="Resource_33w5s"]
script = ExtResource("2_g3oo3")
Name = ""
Description = ""
[sub_resource type="BoxShape3D" id="BoxShape3D_7mh0f"]
size = Vector3(0.778381, 0.929947, 0.731567)
[node name="ConsumableItem" type="Node3D"]
script = ExtResource("1_26bad")
ConsumableItemInfo = SubResource("Resource_33w5s")
[node name="Pickup" type="Area3D" parent="."]
unique_name_in_owner = true
collision_layer = 0
collision_mask = 4
[node name="Sprite" type="Sprite3D" parent="Pickup"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0322805, 0)
pixel_size = 0.001
billboard = 2
double_sided = false
alpha_cut = 1
texture_filter = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Pickup"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0600509, 0.26725, 0.180481)
shape = SubResource("BoxShape3D_7mh0f")

View File

@@ -0,0 +1,8 @@
using Godot;
namespace GameJamDungeon;
[GlobalClass]
public partial class ConsumableItemInfo : InventoryItemInfo
{
}

View File

@@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="ConsumableItemInfo" load_steps=3 format=3 uid="uid://75fpkwfp0t0k"]
[ext_resource type="Script" path="res://src/items/consumable/ConsumableItemInfo.cs" id="1_f8ogj"]
[ext_resource type="Texture2D" uid="uid://dbl5v5i1s3m2u" path="res://src/items/consumable/textures/stelo fragment.PNG" id="1_ic5xm"]
[resource]
script = ExtResource("1_f8ogj")
Name = "Stelo Fragment"
Description = "A small gathered piece of the former heavens.
Restores 30 VT. If VT full, raises MAX VT by 10."
Texture = ExtResource("1_ic5xm")

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dbl5v5i1s3m2u"
path.s3tc="res://.godot/imported/stelo fragment.PNG-87ebe2402340a8a359426101165d22a0.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://src/items/consumable/textures/stelo fragment.PNG"
dest_files=["res://.godot/imported/stelo fragment.PNG-87ebe2402340a8a359426101165d22a0.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
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=0

View File

@@ -1,26 +1,46 @@
using Chickensoft.AutoInject;
using Chickensoft.GodotNodeInterfaces;
using Chickensoft.Introspection;
using GameJamDungeon;
using Godot;
public interface IThrowableItem : INode3D
{
public IAnimationPlayer AnimationPlayer { get; set; }
}
using System.Linq;
[Meta(typeof(IAutoNode))]
public partial class ThrowableItem : Node3D, IThrowableItem
public partial class ThrowableItem : Node3D, IInventoryItem
{
public override void _Notification(int what) => this.Notify(what);
[Dependency] public IGameRepo GameRepo => this.DependOn<IGameRepo>();
[Node] public IAnimationPlayer AnimationPlayer { get; set; } = default!;
[Node] public IHitbox Hitbox { get; set; } = default!;
public void Setup()
public InventoryItemInfo Info => ThrowableItemInfo;
[Export]
public ThrowableItemInfo ThrowableItemInfo { get; set; }
[Node] public Sprite3D Sprite { get; set; } = default!;
[Node] public Area3D Pickup { get; set; } = default!;
public void OnReady()
{
AnimationPlayer.AnimationFinished += OnAnimationFinished;
Hitbox.Damage = 5;
Sprite.Texture = ThrowableItemInfo.Texture;
Pickup.BodyEntered += OnEntered;
}
public void OnEntered(Node3D body)
{
if (GameRepo.InventoryItems.Value.Count() >= GameRepo.MaxItemSize)
return;
var inventoryList = GameRepo.InventoryItems.Value.Append(this).ToList();
GameRepo.InventoryItems.OnNext(inventoryList);
QueueFree();
}
private void OnAnimationFinished(StringName animName)
@@ -28,30 +48,3 @@ public partial class ThrowableItem : Node3D, IThrowableItem
QueueFree();
}
}
public enum ThrowableItemTag
{
InflictTelluricDamage,
InflictAeolicDamage,
InflictHydricDamage,
InflictIgneousDamage,
InflictFerrumDamage,
DoubleEXP,
RandomWarp,
LowerTargetTo1HP,
IdentifyAllItemsCostHP,
WarpToExitIfFound,
RandomNewItem,
BasicItem,
SwapHPandVTWithEntitiesInRoom,
TeleportAllEnemiesToRoom,
TurnAllEnemiesIntoHealingItem,
KillHalfEnemiesInRoom,
AbsorbHPFromAllEnemiesInRoom,
HealsAllInRoomToMaxHP,
RandomEffect,
Add1ATK,
Add1DEF,
RaiseLevelBy1,
BriefImmunity
}

View File

@@ -1,12 +1,14 @@
[gd_scene load_steps=8 format=3 uid="uid://1fl6s352e2ej"]
[ext_resource type="Script" path="res://src/items/throwable/ThrowableItem.cs" id="1_nac2l"]
[ext_resource type="Texture2D" uid="uid://dr8mjn3wahdvp" path="res://src/inventory_menu/cursor.png" id="2_mojlk"]
[ext_resource type="Script" path="res://src/hitbox/Hitbox.cs" id="3_qpunu"]
[sub_resource type="BoxShape3D" id="BoxShape3D_qihtb"]
size = Vector3(0.371643, 0.289612, 0.286743)
[sub_resource type="BoxShape3D" id="BoxShape3D_03cqg"]
size = Vector3(0.778381, 0.929947, 0.731567)
[sub_resource type="Animation" id="Animation_d22ed"]
length = 0.001
tracks/0/type = "value"
@@ -45,7 +47,6 @@ _data = {
}
[node name="ThrowableItem" type="Node3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.535839)
script = ExtResource("1_nac2l")
[node name="Hitbox" type="Area3D" parent="."]
@@ -55,13 +56,23 @@ collision_layer = 16
collision_mask = 16
script = ExtResource("3_qpunu")
[node name="Sprite3D" type="Sprite3D" parent="Hitbox"]
[node name="Sprite" type="Sprite3D" parent="Hitbox"]
unique_name_in_owner = true
pixel_size = 0.0005
billboard = 2
texture = ExtResource("2_mojlk")
[node name="CollisionShape3D" type="CollisionShape3D" parent="Hitbox"]
shape = SubResource("BoxShape3D_qihtb")
[node name="Pickup" type="Area3D" parent="Hitbox"]
unique_name_in_owner = true
collision_layer = 0
collision_mask = 4
[node name="CollisionShape3D" type="CollisionShape3D" parent="Hitbox/Pickup"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0600509, 0.26725, 0.180481)
shape = SubResource("BoxShape3D_03cqg")
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
unique_name_in_owner = true
libraries = {

View File

@@ -2,8 +2,9 @@
namespace GameJamDungeon;
[GlobalClass]
public partial class ThrowableItemInfo : InventoryItemInfo
{
[Export]
public Godot.Collections.Array<ThrowableItemTag> ThrowableItemTags { get; set; }
public Godot.Collections.Array<ThrowableItemTag> ThrowableItemTags { get; set; } = new Godot.Collections.Array<ThrowableItemTag>();
}

View File

@@ -0,0 +1,26 @@
public enum ThrowableItemTag
{
InflictTelluricDamage,
InflictAeolicDamage,
InflictHydricDamage,
InflictIgneousDamage,
InflictFerrumDamage,
DoubleEXP,
RandomWarp,
LowerTargetTo1HP,
IdentifyAllItemsCostHP,
WarpToExitIfFound,
RandomNewItem,
BasicItem,
SwapHPandVTWithEntitiesInRoom,
TeleportAllEnemiesToRoom,
TurnAllEnemiesIntoHealingItem,
KillHalfEnemiesInRoom,
AbsorbHPFromAllEnemiesInRoom,
HealsAllInRoomToMaxHP,
RandomEffect,
Add1ATK,
Add1DEF,
RaiseLevelBy1,
BriefImmunity
}

View File

@@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="ThrowableItemInfo" load_steps=3 format=3 uid="uid://bph8c6by4s047"]
[ext_resource type="Script" path="res://src/items/throwable/ThrowableItemInfo.cs" id="1_ewck5"]
[ext_resource type="Texture2D" uid="uid://mi70lolgtf3n" path="res://src/items/throwable/textures/GEOMANCER-DICE.png" id="1_jhits"]
[resource]
script = ExtResource("1_ewck5")
ThrowableItemTags = []
Name = "Geomantic Dice"
Description = "Inflicts Affinity damage when thrown."
Texture = ExtResource("1_jhits")

View File

@@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="ThrowableItemInfo" load_steps=3 format=3 uid="uid://qqg0gdcb8fwg"]
[ext_resource type="Texture2D" uid="uid://dhfn51smm818x" path="res://src/items/throwable/textures/spell sign - luck.PNG" id="1_3605p"]
[ext_resource type="Script" path="res://src/items/throwable/ThrowableItemInfo.cs" id="1_s3pq7"]
[resource]
script = ExtResource("1_s3pq7")
ThrowableItemTags = []
Name = "Spell Sign: Knowledge"
Description = "Doubles experience points earned. Effect is temporary."
Texture = ExtResource("1_3605p")

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://mi70lolgtf3n"
path.s3tc="res://.godot/imported/GEOMANCER-DICE.png-29575eb9771a13eb2cd0b8f4bb92f76c.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://src/items/throwable/textures/GEOMANCER-DICE.png"
dest_files=["res://.godot/imported/GEOMANCER-DICE.png-29575eb9771a13eb2cd0b8f4bb92f76c.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dhfn51smm818x"
path.s3tc="res://.godot/imported/spell sign - luck.PNG-f0fcf0db4cd4291911c8889eda080fdc.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://src/items/throwable/textures/spell sign - luck.PNG"
dest_files=["res://.godot/imported/spell sign - luck.PNG-f0fcf0db4cd4291911c8889eda080fdc.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
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=0