Merge remote-tracking branch 'origin/main' into c_sharp_setup

# Conflicts:
#	scripts/CSharp/Common/CharacterControls/VesnaBehaviour.cs.uid
#	scripts/CSharp/Common/Farming/FieldService.cs.uid
remotes/checkIfPRContentChanged-1749884192368007736/c_sharp_setup
Katharina Ziolkowski 12 months ago
commit 7e19268847

@ -4,11 +4,12 @@ importer="scene"
importer_version=1 importer_version=1
type="PackedScene" type="PackedScene"
uid="uid://b3kyrsoobmkhp" uid="uid://b3kyrsoobmkhp"
valid=false path="res://.godot/imported/best_house_blender.blend-ac89c74aef2f275bdf4b4baadee17c0c.scn"
[deps] [deps]
source_file="res://art/mockups/3d/best_house_blender.blend" source_file="res://art/mockups/3d/best_house_blender.blend"
dest_files=["res://.godot/imported/best_house_blender.blend-ac89c74aef2f275bdf4b4baadee17c0c.scn"]
[params] [params]

@ -1,6 +1,6 @@
[gd_scene load_steps=5 format=3 uid="uid://cgjc4wurbgimy"] [gd_scene load_steps=5 format=3 uid="uid://cgjc4wurbgimy"]
[ext_resource type="Script" uid="uid://hg7jay2kt441" path="res://scripts/CSharp/Common/Inventory/InventoryUi.cs" id="1_6wusm"] [ext_resource type="Script" uid="uid://b7vlkecrn0t5c" path="res://scripts/CSharp/Common/Inventory/InventoryUi.cs" id="1_6wusm"]
[ext_resource type="Script" uid="uid://b2jhdxcrhtm2d" path="res://scripts/CSharp/Common/Inventory/InventoryTestScript.cs" id="3_exrk4"] [ext_resource type="Script" uid="uid://b2jhdxcrhtm2d" path="res://scripts/CSharp/Common/Inventory/InventoryTestScript.cs" id="3_exrk4"]
[ext_resource type="Resource" uid="uid://datee0flk1e84" path="res://resources/items/pickaxe.tres" id="4_5fdxq"] [ext_resource type="Resource" uid="uid://datee0flk1e84" path="res://resources/items/pickaxe.tres" id="4_5fdxq"]
[ext_resource type="Texture2D" uid="uid://c7wqla0mbu3np" path="res://graphics/ui/babushka_ui_tmp_inventory_select.png" id="4_tiss4"] [ext_resource type="Texture2D" uid="uid://c7wqla0mbu3np" path="res://graphics/ui/babushka_ui_tmp_inventory_select.png" id="4_tiss4"]

@ -41,4 +41,22 @@ label_settings = SubResource("LabelSettings_7emux")
horizontal_alignment = 1 horizontal_alignment = 1
vertical_alignment = 1 vertical_alignment = 1
[node name="AmountLabel" type="Label" parent="."]
layout_mode = 1
anchors_preset = -1
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -409.0
offset_top = -329.0
offset_right = -10.0
offset_bottom = -10.0
grow_horizontal = 0
grow_vertical = 0
theme_override_colors/font_color = Color(0, 0, 0, 1)
text = "999"
horizontal_alignment = 2
vertical_alignment = 2
[connection signal="gui_input" from="." to="." method="_on_gui_input"] [connection signal="gui_input" from="." to="." method="_on_gui_input"]

@ -0,0 +1,26 @@
[gd_scene load_steps=5 format=3 uid="uid://5hltxpdxmqcq"]
[ext_resource type="Script" uid="uid://udhigottc8rg" path="res://scripts/CSharp/Common/Inventory/ItemOnGround.cs" id="1_mnomu"]
[ext_resource type="PackedScene" uid="uid://ob04y3syvo0e" path="res://prefabs/interaction_area.tscn" id="2_ue6ub"]
[ext_resource type="Script" uid="uid://c8suoi3i6kqai" path="res://scripts/CSharp/Common/Inventory/ItemOnGroundSpawnWith.cs" id="3_ue6ub"]
[ext_resource type="Resource" uid="uid://c7viddcd3kywp" path="res://resources/items/axe.tres" id="4_sfad0"]
[node name="GenericItemOnGround" type="Node3D"]
script = ExtResource("1_mnomu")
[node name="InteractionArea" parent="." instance=ExtResource("2_ue6ub")]
[node name="SpawnWithItem" type="Node" parent="."]
script = ExtResource("3_ue6ub")
_blueprint = ExtResource("4_sfad0")
[node name="ItemLabel" type="Label3D" parent="."]
offset = Vector2(0, 55.64)
billboard = 1
text = "test"
[node name="PickupErrorLabel" type="Label3D" parent="."]
offset = Vector2(0, 150)
billboard = 1
[connection signal="Interacted" from="InteractionArea" to="." method="TryPickUp"]

@ -11,7 +11,7 @@ config_version=5
[application] [application]
config/name="Babushka" config/name="Babushka"
run/main_scene="uid://br7yq757cawts" run/main_scene="uid://dbxy2y85r1d8x"
config/features=PackedStringArray("4.4", "C#", "Forward Plus") config/features=PackedStringArray("4.4", "C#", "Forward Plus")
config/icon="res://icon.svg" config/icon="res://icon.svg"

@ -6,4 +6,5 @@
script = ExtResource("1_t485b") script = ExtResource("1_t485b")
name = "Axe Deo" name = "Axe Deo"
color = Color(0.643898, 0.4587, 0.294335, 1) color = Color(0.643898, 0.4587, 0.294335, 1)
maxStack = 1
metadata/_custom_type_script = "uid://cbskymrxs6ksu" metadata/_custom_type_script = "uid://cbskymrxs6ksu"

@ -6,4 +6,5 @@
script = ExtResource("1_8k5aa") script = ExtResource("1_8k5aa")
name = "Buck the Bucket" name = "Buck the Bucket"
color = Color(0.336269, 0.489145, 0.825324, 1) color = Color(0.336269, 0.489145, 0.825324, 1)
maxStack = 1
metadata/_custom_type_script = "uid://cbskymrxs6ksu" metadata/_custom_type_script = "uid://cbskymrxs6ksu"

@ -6,4 +6,5 @@
script = ExtResource("1_06nef") script = ExtResource("1_06nef")
name = "Your Mom" name = "Your Mom"
color = Color(0.751421, 0.329615, 0.570911, 1) color = Color(0.751421, 0.329615, 0.570911, 1)
maxStack = 1
metadata/_custom_type_script = "uid://cbskymrxs6ksu" metadata/_custom_type_script = "uid://cbskymrxs6ksu"

@ -6,4 +6,5 @@
script = ExtResource("1_07aya") script = ExtResource("1_07aya")
name = "Pick Axe" name = "Pick Axe"
color = Color(0.589014, 0.823353, 0.998475, 1) color = Color(0.589014, 0.823353, 0.998475, 1)
maxStack = 1
metadata/_custom_type_script = "uid://cbskymrxs6ksu" metadata/_custom_type_script = "uid://cbskymrxs6ksu"

@ -0,0 +1,10 @@
[gd_resource type="Resource" script_class="ItemResource" load_steps=2 format=3 uid="uid://d1uuxp1lp4aro"]
[ext_resource type="Script" uid="uid://cbskymrxs6ksu" path="res://scripts/CSharp/Common/Inventory/ItemResource.cs" id="1_dustj"]
[resource]
script = ExtResource("1_dustj")
name = "Tomato Seed"
color = Color(0.135039, 0.307214, 0.333128, 1)
maxStack = 20
metadata/_custom_type_script = "uid://cbskymrxs6ksu"

@ -0,0 +1,75 @@
[gd_scene load_steps=12 format=3 uid="uid://dbxy2y85r1d8x"]
[ext_resource type="PackedScene" uid="uid://dbd1niu3tp8y5" path="res://prefabs/Player3D.tscn" id="1_pdc5e"]
[ext_resource type="PackedScene" uid="uid://biwd3jj65qrlh" path="res://prefabs/farming/base_field.tscn" id="2_741gk"]
[ext_resource type="PackedScene" uid="uid://5hltxpdxmqcq" path="res://prefabs/interactions/generic_item_on_ground.tscn" id="5_sjt6k"]
[ext_resource type="PackedScene" uid="uid://cgjc4wurbgimy" path="res://prefabs/UI/Inventory/Inventory.tscn" id="6_876p1"]
[ext_resource type="Resource" uid="uid://cndd64batns31" path="res://resources/items/bucket.tres" id="6_nvnpb"]
[ext_resource type="Script" uid="uid://d17si23dtlg72" path="res://scripts/CSharp/Common/Farming/FieldService.cs" id="7_3rkjv"]
[ext_resource type="Resource" uid="uid://c5yg3lx756v4v" path="res://resources/items/hoe.tres" id="7_hv2km"]
[ext_resource type="Resource" uid="uid://d1uuxp1lp4aro" path="res://resources/items/tomato_seed.tres" id="8_hv2km"]
[sub_resource type="PlaneMesh" id="PlaneMesh_8yprl"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_8tgff"]
albedo_color = Color(0.505882, 0.588235, 0.494118, 1)
[sub_resource type="BoxShape3D" id="BoxShape3D_t58di"]
size = Vector3(2.01563, 0.160522, 2.00824)
[node name="SceneFarmVesna" type="Node3D"]
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0)
mesh = SubResource("PlaneMesh_8yprl")
skeleton = NodePath("")
surface_material_override/0 = SubResource("StandardMaterial3D_8tgff")
[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D"]
[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/StaticBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.000976563, -0.0739136, -0.00112915)
shape = SubResource("BoxShape3D_t58di")
[node name="Player3d" parent="." node_paths=PackedStringArray("_fieldParent") instance=ExtResource("1_pdc5e")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.51633, 0.725631, 3.57249)
_fieldParent = NodePath("../FieldService")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.618408, 0.785857, 0, -0.785857, 0.618408, -0.802612, 0, 4.73262)
[node name="BaseField" parent="." instance=ExtResource("2_741gk")]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0.0574723, 0)
visible = false
[node name="Inventory" parent="." instance=ExtResource("6_876p1")]
[node name="FieldService" type="Node3D" parent="."]
script = ExtResource("7_3rkjv")
[node name="GenericItemOnGround" parent="." instance=ExtResource("5_sjt6k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.53971, -4.76837e-07, -3.81996)
[node name="SpawnWithItem" parent="GenericItemOnGround" index="1"]
_blueprint = ExtResource("6_nvnpb")
[node name="GenericItemOnGround2" parent="." instance=ExtResource("5_sjt6k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.73646, -9.53674e-07, -3.96783)
[node name="GenericItemOnGround3" parent="." instance=ExtResource("5_sjt6k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.43861, -4.76837e-07, -3.93506)
[node name="SpawnWithItem" parent="GenericItemOnGround3" index="1"]
_blueprint = ExtResource("7_hv2km")
[node name="GenericItemOnGround4" parent="." instance=ExtResource("5_sjt6k")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.1678, -4.76837e-07, -3.94977)
_infiniteSupply = true
[node name="SpawnWithItem" parent="GenericItemOnGround4" index="1"]
_blueprint = ExtResource("8_hv2km")
[editable path="GenericItemOnGround"]
[editable path="GenericItemOnGround2"]
[editable path="GenericItemOnGround3"]
[editable path="GenericItemOnGround4"]

@ -12,6 +12,7 @@ public partial class InventoryInstance : Node
[Signal] [Signal]
public delegate void SlotAmountChangedEventHandler(); public delegate void SlotAmountChangedEventHandler();
[Signal] [Signal]
public delegate void InventoryContentsChangedEventHandler(); public delegate void InventoryContentsChangedEventHandler();
@ -32,33 +33,65 @@ public partial class InventoryInstance : Node
_slots.Add(new InventorySlot()); _slots.Add(new InventorySlot());
} }
} }
EmitSignal(SignalName.SlotAmountChanged); EmitSignal(SignalName.SlotAmountChanged);
} }
} }
public InventoryActionResult AddItem(ItemInstance newItem, int inventorySlot = -1) public InventoryActionResult AddItem(ItemInstance newItem)
{ {
if (inventorySlot < 0) var result = AddItemAndStackRecursive(newItem, 0);
EmitSignal(SignalName.InventoryContentsChanged);
return result;
}
private InventoryActionResult AddItemAndStackRecursive(ItemInstance newItem, int slotSearch)
{
if (newItem.blueprint == null || newItem.amount == 0)
return InventoryActionResult.SourceDoesNotExists;
var slotIndex = -1;
// find stackable slot
for (var i = slotSearch; i < _slots.Count; i++)
{ {
inventorySlot = _slots.FindIndex(slot => slot.IsEmpty()); if (_slots[i].itemInstance?.blueprint == newItem.blueprint)
{
slotIndex = i;
break;
}
} }
if (inventorySlot < 0 || !_slots[inventorySlot].IsEmpty()) if (slotIndex < 0)
{ {
return InventoryActionResult.DestinationFull; // find empty slot
for (var i = slotSearch; i < _slots.Count; i++)
{
if (_slots[i].IsEmpty())
{
slotIndex = i;
break;
}
}
} }
if (inventorySlot >= _slots.Count) if (slotIndex < 0)
{ {
return InventoryActionResult.DestinationDoesNotExists; return InventoryActionResult.DestinationFull;
} }
_slots[inventorySlot].itemInstance = newItem; var itemInstance = _slots[slotIndex].itemInstance ?? new ItemInstance { blueprint = newItem.blueprint, amount = 0 };
EmitSignal(SignalName.InventoryContentsChanged); var maxStack = itemInstance!.blueprint.maxStack;
return InventoryActionResult.Success; var freeOnStack = maxStack - itemInstance.amount;
var moveAmount = Math.Min(freeOnStack, newItem.amount);
itemInstance.amount += moveAmount;
newItem.amount -= moveAmount;
_slots[slotIndex].itemInstance = itemInstance;
return newItem.amount <= 0
? InventoryActionResult.Success
: AddItemAndStackRecursive(newItem, slotIndex + 1);
} }
public InventoryActionResult RemoveItem(int inventorySlot, out ItemInstance? itemInstance ) public InventoryActionResult RemoveItem(int inventorySlot, out ItemInstance? itemInstance)
{ {
if (inventorySlot < 0 || inventorySlot >= _slots.Count) if (inventorySlot < 0 || inventorySlot >= _slots.Count)
{ {
@ -82,4 +115,17 @@ public partial class InventoryInstance : Node
{ {
return RemoveItem(inventorySlot, out _); return RemoveItem(inventorySlot, out _);
} }
public InventoryActionResult AddItemToSlot(ItemInstance itemInstance, int destinationSlot)
{
if (destinationSlot < 0 || destinationSlot >= _slots.Count)
return InventoryActionResult.DestinationDoesNotExists;
if (!_slots[destinationSlot].IsEmpty())
return InventoryActionResult.DestinationFull;
_slots[destinationSlot].itemInstance = itemInstance;
EmitSignal(SignalName.InventoryContentsChanged);
return InventoryActionResult.Success;
}
} }

@ -23,11 +23,13 @@ public partial class InventoryManager : Node
public InventoryActionResult CreateItem( public InventoryActionResult CreateItem(
ItemResource itemBlueprint, ItemResource itemBlueprint,
InventoryInstance inventory, InventoryInstance inventory,
int amount = 1,
int inventorySlot = -1) int inventorySlot = -1)
{ {
var newItem = new ItemInstance { blueprint = itemBlueprint }; var newItem = new ItemInstance { blueprint = itemBlueprint, amount = amount };
var addResult = inventory.AddItem(newItem, inventorySlot); return inventorySlot < 0
return addResult; ? inventory.AddItem(newItem)
: inventory.AddItemToSlot(newItem, inventorySlot);
} }
public InventoryActionResult MoveItem( public InventoryActionResult MoveItem(
@ -39,10 +41,11 @@ public partial class InventoryManager : Node
var remResult = sourceInventory.RemoveItem(sourceSlot, out var item); var remResult = sourceInventory.RemoveItem(sourceSlot, out var item);
if (remResult != InventoryActionResult.Success) return remResult; if (remResult != InventoryActionResult.Success) return remResult;
var addResult = destinationInventory.AddItem(item!, destinationSlot); var addResult = destinationInventory.AddItemToSlot(item!, destinationSlot);
if(addResult == InventoryActionResult.Success) return InventoryActionResult.Success; if (addResult == InventoryActionResult.Success) return InventoryActionResult.Success;
sourceInventory.AddItem(item!, sourceSlot); // can not fail ... in theory // if adding in the destination failed, re-add the item into the source
sourceInventory.AddItemToSlot(item!, sourceSlot); // can not fail ... in theory
return addResult; return addResult;
} }
@ -60,4 +63,9 @@ public partial class InventoryManager : Node
{ {
return inventory.RemoveItem(inventorySlot); return inventory.RemoveItem(inventorySlot);
} }
public InventoryActionResult CollectItem(ItemInstance itemInstance)
{
return playerInventory.AddItem(itemInstance);
}
} }

@ -25,6 +25,7 @@ public partial class InventoryUi : Control
PopulateSlots(); PopulateSlots();
SetSlotContent(); SetSlotContent();
SetSlotSelectPosition(); SetSlotSelectPosition();
InventoryManager.Instance.playerInventory.InventoryContentsChanged += SetSlotContent;
} }
public override void _ExitTree() public override void _ExitTree()
@ -42,6 +43,12 @@ public partial class InventoryUi : Control
uiSlot!.nameLabel.Text = inventorySlot.itemInstance?.blueprint.name ?? ""; uiSlot!.nameLabel.Text = inventorySlot.itemInstance?.blueprint.name ?? "";
uiSlot!.nameLabel.LabelSettings = uiSlot!.nameLabel.LabelSettings.Duplicate() as LabelSettings; uiSlot!.nameLabel.LabelSettings = uiSlot!.nameLabel.LabelSettings.Duplicate() as LabelSettings;
uiSlot!.nameLabel.LabelSettings!.FontColor = inventorySlot.itemInstance?.blueprint.color ?? Colors.White; uiSlot!.nameLabel.LabelSettings!.FontColor = inventorySlot.itemInstance?.blueprint.color ?? Colors.White;
var amountText = inventorySlot.itemInstance != null &&
inventorySlot.itemInstance.amount != 1
? inventorySlot.itemInstance.amount.ToString()
: "";
uiSlot!.amountLabel.Text = amountText;
} }
} }
@ -88,7 +95,7 @@ public partial class InventoryUi : Control
var destinationSlot = index; var destinationSlot = index;
InventoryManager.Instance.MoveItem(_playerInventory, sourceSlot, _playerInventory, destinationSlot); InventoryManager.Instance.MoveItem(_playerInventory, sourceSlot, _playerInventory, destinationSlot);
_slotOnMouse = null; _slotOnMouse = null;
SetSlotContent(); //SetSlotContent();
} }
} }
@ -98,6 +105,7 @@ public partial class InventoryUi : Control
{ {
InputInventoryOpenClose(); InputInventoryOpenClose();
} }
if (Input.IsActionJustPressed("ui_inventory_disadvance")) if (Input.IsActionJustPressed("ui_inventory_disadvance"))
{ {
_selectedSlot++; _selectedSlot++;
@ -105,7 +113,8 @@ public partial class InventoryUi : Control
_selectedSlot = 0; _selectedSlot = 0;
SetSlotSelectPosition(); SetSlotSelectPosition();
} }
if(Input.IsActionJustPressed("ui_inventory_advance"))
if (Input.IsActionJustPressed("ui_inventory_advance"))
{ {
_selectedSlot--; _selectedSlot--;
if (_selectedSlot < 0) if (_selectedSlot < 0)

@ -3,4 +3,14 @@
public class ItemInstance public class ItemInstance
{ {
public ItemResource blueprint; public ItemResource blueprint;
public int amount = 1;
public ItemInstance Clone()
{
return new ItemInstance
{
blueprint = blueprint,
amount = amount
};
}
} }

@ -0,0 +1,49 @@
using Godot;
namespace Babushka.scripts.CSharp.Common.Inventory;
public partial class ItemOnGround : Node3D
{
private ItemInstance _itemInstance;
[Export]
private bool _infiniteSupply = false;
private Label3D _itemLabel => GetNode<Label3D>("ItemLabel");
private Label3D _pickupErrorLabel => GetNode<Label3D>("PickupErrorLabel");
public ItemInstance itemInstance
{
get => _itemInstance;
set
{
_itemInstance = value;
UpdateVisuals();
}
}
public void TryPickUp()
{
GD.Print("Trying to pick up item");
var result = InventoryManager.Instance.CollectItem(itemInstance.Clone());
if (result == InventoryActionResult.Success)
{
if (!_infiniteSupply)
{
QueueFree();
}
}
else
{
_pickupErrorLabel.Text = "Inventory Full";
var tween = GetTree().CreateTween();
tween.TweenInterval(2);
tween.TweenCallback(Callable.From(() => _pickupErrorLabel.Text = ""));
}
}
public void UpdateVisuals()
{
_itemLabel.Text = itemInstance.blueprint?.name ?? "Error Item";
}
}

@ -0,0 +1,16 @@
#nullable enable
using Godot;
namespace Babushka.scripts.CSharp.Common.Inventory;
public partial class ItemOnGroundSpawnWith : Node
{
[Export] private ItemResource? _blueprint = null;
public override void _EnterTree()
{
if(_blueprint == null) return;
var parent = GetParent<ItemOnGround>();
parent.itemInstance = new ItemInstance { blueprint = _blueprint };
}
}

@ -2,7 +2,7 @@
namespace Babushka.scripts.CSharp.Common.Inventory; namespace Babushka.scripts.CSharp.Common.Inventory;
[GlobalClass] [GlobalClass]
public partial class ItemResource: Resource public partial class ItemResource : Resource
{ {
[Export] [Export]
public string name; public string name;
@ -10,9 +10,13 @@ public partial class ItemResource: Resource
[Export] [Export]
public Color color; public Color color;
[Export]
public int maxStack;
public ItemResource() public ItemResource()
{ {
name = ""; name = "";
color = Colors.Red; color = Colors.Red;
maxStack = 1;
} }
} }

@ -7,12 +7,14 @@ public partial class SlotUi : Control
{ {
public Label nameLabel; public Label nameLabel;
public int index; public int index;
public Label amountLabel;
[Signal] public delegate void ClickedEventHandler(int index); [Signal] public delegate void ClickedEventHandler(int index);
public override void _EnterTree() public override void _EnterTree()
{ {
nameLabel = GetNode<Label>("NameLabel"); nameLabel = GetNode<Label>("NameLabel");
amountLabel = GetNode<Label>("AmountLabel");
} }
public void _on_gui_input(InputEvent ev) public void _on_gui_input(InputEvent ev)

Loading…
Cancel
Save