diff --git a/Content/Art/T_Start.uasset b/Content/Art/T_Start.uasset new file mode 100644 index 0000000..25fc22f --- /dev/null +++ b/Content/Art/T_Start.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f814936c9f7cb30462efb322a5b94e2ded486324a861897f3e3fa1f7186485c9 +size 47308 diff --git a/Content/DT_SkillTree.uasset b/Content/DT_SkillTree.uasset index 42fd6c5..2828426 100644 --- a/Content/DT_SkillTree.uasset +++ b/Content/DT_SkillTree.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2e40babcfa42c54b98391fc871069307bddcbfee80c5d508460acd0f82128268 -size 11528 +oid sha256:3ed4f0f405c22731185078e074bf685deb9e715c946b31f5b8e4da1a4365037d +size 12368 diff --git a/Content/UI/WBP_SkillNode.uasset b/Content/UI/WBP_SkillNode.uasset index 90ccf61..32054e1 100644 --- a/Content/UI/WBP_SkillNode.uasset +++ b/Content/UI/WBP_SkillNode.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:940fcd35de10296d51d8584bc0c6ed566e53733e1c67fa1d32f63b549b6c46af -size 283698 +oid sha256:a02fedd238a631c17704c9e1076c0bc8ad062d7bbf5984359388c754c722ae50 +size 308923 diff --git a/Content/UI/WBP_SkillNodeTooltip.uasset b/Content/UI/WBP_SkillNodeTooltip.uasset index 415844b..a51e9ea 100644 --- a/Content/UI/WBP_SkillNodeTooltip.uasset +++ b/Content/UI/WBP_SkillNodeTooltip.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d6c524c6185b53e0f6d5b12d2f7832da81c9dbc2f6cc170f79c6f88ad801cd86 -size 77780 +oid sha256:d9ba10fed7d5bf86eae3417e054cb4cf59581ea2a1fe31aedb9a4a25b483c591 +size 102383 diff --git a/Content/UI/WBP_SkillTree.uasset b/Content/UI/WBP_SkillTree.uasset index baf0545..19648b5 100644 --- a/Content/UI/WBP_SkillTree.uasset +++ b/Content/UI/WBP_SkillTree.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b90a26d5344102955f9da4ac7074e098914708a6950d6edba0b0da55364088f -size 336111 +oid sha256:316de6a3d14e659d7a2800a37f040a7db8ec00d7040efeda96e88e4d3bc891fd +size 422557 diff --git a/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp b/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp index c0afa0f..dbc255a 100644 --- a/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp +++ b/Source/UTAD_UI/SkillTree/SkillTreeComponent.cpp @@ -19,6 +19,7 @@ void USkillTreeComponent::BeginPlay() void USkillTreeComponent::InitializeSkillTree() { AllSkills.Empty(); + PurchasedSkills.Empty(); if (!SkillDataTable) { @@ -44,10 +45,33 @@ void USkillTreeComponent::InitializeSkillTree() } } + // Auto-purchase starting skills (these don't cost skill points) + for (auto& Pair : AllSkills) + { + const FName& SkillID = Pair.Key; + FSkillNodeRuntime& SkillNode = Pair.Value; + + if (SkillNode.NodeData.bStartingSkill) + { + // Mark as purchased + SkillNode.CurrentState = ESkillNodeState::Purchased; + PurchasedSkills.Add(SkillID); + + // Apply skill effects + ApplySkillEffects(SkillNode.NodeData); + + // Broadcast purchase event + OnSkillPurchased.Broadcast(SkillID); + + UE_LOG(LogTemp, Log, TEXT("SkillTreeComponent: Auto-purchased starting skill: %s"), + *SkillNode.NodeData.DisplayName.ToString()); + } + } + UpdateSkillStates(); - UE_LOG(LogTemp, Log, TEXT("SkillTreeComponent: Initialized with %d skills"), - AllSkills.Num()); + UE_LOG(LogTemp, Log, TEXT("SkillTreeComponent: Initialized with %d skills (%d starting)"), + AllSkills.Num(), PurchasedSkills.Num()); } void USkillTreeComponent::AddSkillPoints(int32 Amount) @@ -414,14 +438,20 @@ float USkillTreeComponent::GetTotalSpeedBonusPercent() const void USkillTreeComponent::ResetAllSkills() { - // Refund all skill points + // Refund skill points (but not for starting skills) int32 RefundAmount = 0; for (const FName& SkillID : PurchasedSkills) { if (const FSkillNodeRuntime* SkillNode = AllSkills.Find(SkillID)) { - RefundAmount += SkillNode->NodeData.Cost; + // Remove skill effects for all purchased skills RemoveSkillEffects(SkillNode->NodeData); + + // Only refund cost for non-starting skills + if (!SkillNode->NodeData.bStartingSkill) + { + RefundAmount += SkillNode->NodeData.Cost; + } } } @@ -437,13 +467,39 @@ void USkillTreeComponent::ResetAllSkills() CurrentSelectionCost = 0; // Add refunded points - AddSkillPoints(RefundAmount); + if (RefundAmount > 0) + { + AddSkillPoints(RefundAmount); + } + + // Re-purchase starting skills + for (auto& Pair : AllSkills) + { + const FName& SkillID = Pair.Key; + FSkillNodeRuntime& SkillNode = Pair.Value; + + if (SkillNode.NodeData.bStartingSkill) + { + // Mark as purchased + SkillNode.CurrentState = ESkillNodeState::Purchased; + PurchasedSkills.Add(SkillID); + + // Apply skill effects + ApplySkillEffects(SkillNode.NodeData); + + // Broadcast purchase event + OnSkillPurchased.Broadcast(SkillID); + } + } // Update states UpdateSkillStates(); // Broadcast events OnSkillSelectionChanged.Broadcast(CurrentSelectionCost); + + UE_LOG(LogTemp, Log, TEXT("SkillTreeComponent: Reset all skills. Refunded %d points. Re-purchased %d starting skills."), + RefundAmount, PurchasedSkills.Num()); } void USkillTreeComponent::UpdateSkillStates() diff --git a/Source/UTAD_UI/SkillTree/SkillTreeTypes.h b/Source/UTAD_UI/SkillTree/SkillTreeTypes.h index 79f2454..203694c 100644 --- a/Source/UTAD_UI/SkillTree/SkillTreeTypes.h +++ b/Source/UTAD_UI/SkillTree/SkillTreeTypes.h @@ -50,6 +50,10 @@ struct FSkillNodeData : public FTableRowBase UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") int32 PurchaseOrder; + // Is this a starting skill? (automatically purchased at initialization) + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") + bool bStartingSkill; + // Prerequisites - must have these skills first UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Skill") TArray Prerequisites; @@ -76,6 +80,7 @@ struct FSkillNodeData : public FTableRowBase Icon = nullptr; Cost = 1; PurchaseOrder = 0; + bStartingSkill = false; HealthBonus = 0.0f; DamageBonus = 0.0f; SpeedBonus = 0.0f;