HAxis sos
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
#include "UnrealProject.h"
|
||||
#include "CharacterDependentSubMenus.h"
|
||||
#include "DefaultGameInstance.h"
|
||||
#include "CharacterSubMenu.h"
|
||||
#include "CharacterCarousel.h"
|
||||
#include "EffectSelector.h"
|
||||
#include "SkillWidget.h"
|
||||
|
||||
void UCharacterDependentSubMenu::OnEnter(class UMenuScreenBase* screen)
|
||||
{
|
||||
// Find character menu
|
||||
auto submenus = screen->GetSubMenus();
|
||||
for(int32 i = submenus.Num() - 1; i >= 0; i--)
|
||||
{
|
||||
if(submenus[i]->IsA<UCharacterSubMenu>())
|
||||
{
|
||||
characterSubMenu = Cast<UCharacterSubMenu>(submenus[i]);
|
||||
characterCarousel = characterSubMenu->GetCarousel();
|
||||
displayCharacter = characterCarousel->GetCharacterModel(characterCarousel->selectedCharacterIndex);
|
||||
}
|
||||
}
|
||||
|
||||
Super::OnEnter(screen);
|
||||
}
|
||||
|
||||
void UCharacterDependentSubMenu::OnSuspend(USubMenu* newSubMenu, bool loseFocus)
|
||||
{
|
||||
USkillWidget* sw = Cast<USkillWidget>(newSubMenu);
|
||||
UEffectSelector* es = Cast<UEffectSelector>(newSubMenu);
|
||||
if(es || sw)
|
||||
USubMenu::OnSuspend(newSubMenu, loseFocus); // Prevent menu panel animations
|
||||
else
|
||||
Super::OnSuspend(newSubMenu, loseFocus);
|
||||
}
|
||||
void UCharacterDependentSubMenu::OnRestore(USubMenu* removedMenu)
|
||||
{
|
||||
USkillWidget* sw = Cast<USkillWidget>(removedMenu);
|
||||
UEffectSelector* es = Cast<UEffectSelector>(removedMenu);
|
||||
if(es || sw)
|
||||
USubMenu::OnRestore(removedMenu); // Prevent menu panel animations
|
||||
else
|
||||
Super::OnRestore(removedMenu);
|
||||
}
|
||||
|
||||
FCharacterSave UCharacterDependentSubMenu::GetCharacterSave() const
|
||||
{
|
||||
static FCharacterSave dummy;
|
||||
if(!characterCarousel)
|
||||
return dummy;
|
||||
UDefaultGameInstance* inst = Cast<UDefaultGameInstance>(GetGameInstance());
|
||||
UCharacterSettings* settings = inst->GetCharacterSettings();
|
||||
return settings->characterSaves[characterCarousel->selectedCharacterIndex];
|
||||
}
|
||||
void UCharacterDependentSubMenu::SetCharacterSave(const FCharacterSave& save)
|
||||
{
|
||||
if(!characterCarousel)
|
||||
return;
|
||||
UDefaultGameInstance* inst = Cast<UDefaultGameInstance>(GetGameInstance());
|
||||
UCharacterSettings* settings = inst->GetCharacterSettings();
|
||||
settings->characterSaves[characterCarousel->selectedCharacterIndex] = save;
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
// Project Lab - NHTV Igad
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "MenuScreen.h"
|
||||
#include "CharacterSettings.h"
|
||||
#include "CharacterDependentSubMenus.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class UCharacterDependentSubMenu : public UMenuPanel
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
virtual void OnEnter(class UMenuScreenBase* screen) override;
|
||||
|
||||
virtual void OnSuspend(USubMenu* newSubMenu, bool loseFocus) override;
|
||||
virtual void OnRestore(USubMenu* removedMenu) override;
|
||||
|
||||
UPROPERTY(BlueprintReadOnly, Category = "Skill Tree Sub Menu")
|
||||
class UCharacterSubMenu* characterSubMenu;
|
||||
UPROPERTY(BlueprintReadOnly, Category = "Skill Tree Sub Menu")
|
||||
class ACharacterCarousel* characterCarousel;
|
||||
// Curently displayed character in the menu
|
||||
UPROPERTY(BlueprintReadOnly, Category = "Skill Tree Sub Menu")
|
||||
class ACharacterBase* displayCharacter;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Skill Tree Sub Menu")
|
||||
FCharacterSave GetCharacterSave() const;
|
||||
UFUNCTION(BlueprintCallable, Category = "Skill Tree Sub Menu")
|
||||
void SetCharacterSave(const FCharacterSave& save);
|
||||
};
|
||||
|
||||
UCLASS()
|
||||
class UCustomizationSubMenu : public UCharacterDependentSubMenu
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
};
|
||||
UCLASS()
|
||||
class USkillTreeSubMenu : public UCharacterDependentSubMenu
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
};
|
||||
UCLASS()
|
||||
class USkillSelectByAbilitySubMenu : public UCharacterDependentSubMenu
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
};
|
||||
164
Source/UnrealProject/GUI/Submenus/CharacterSubMenu.cpp
Normal file
164
Source/UnrealProject/GUI/Submenus/CharacterSubMenu.cpp
Normal file
@@ -0,0 +1,164 @@
|
||||
// Project Lab - NHTV Igad
|
||||
|
||||
#include "UnrealProject.h"
|
||||
#include "CharacterSubMenu.h"
|
||||
#include "MenuButton.h"
|
||||
#include "CharacterCarousel.h"
|
||||
#include "MenuController.h"
|
||||
#include "DefaultGameInstance.h"
|
||||
#include "CharacterSettings.h"
|
||||
#include "SkillTreeWidget.h"
|
||||
#include "CharacterBase.h"
|
||||
|
||||
TSubclassOf<ACharacterCarousel> carouselClass;
|
||||
|
||||
UCharacterSubMenu::UCharacterSubMenu(const FObjectInitializer& init)
|
||||
{
|
||||
carouselClass = ConstructorHelpers::FClassFinder<ACharacterCarousel>(L"/Game/Assets/Blueprints/CharacterCarousel/BP_CharacterCarousel").Class;
|
||||
}
|
||||
|
||||
void UCharacterSubMenu::NativeConstruct()
|
||||
{
|
||||
// Get carousel spawn pos
|
||||
FTransform carouselSpawnTransform;
|
||||
for(TActorIterator<APlayerStart> it(GetWorld()); it; ++it)
|
||||
{
|
||||
if((*it)->PlayerStartTag == "Carousel")
|
||||
carouselSpawnTransform = (*it)->GetTransform();
|
||||
}
|
||||
|
||||
m_carousel = GetWorld()->SpawnActor<ACharacterCarousel>(carouselClass, carouselSpawnTransform);
|
||||
|
||||
// Initialize the characters
|
||||
for(int32 i = 0; i < m_carousel->GetCharacterNum(); i++)
|
||||
m_UpdateCharacter(i);
|
||||
|
||||
Super::NativeConstruct();
|
||||
|
||||
m_nextButton = AddButton("Next");
|
||||
m_nextButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Next);
|
||||
m_prevButton = AddButton("Previous");
|
||||
m_prevButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Prev);
|
||||
m_editButton = AddButton("Edit");
|
||||
m_editButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Edit);
|
||||
m_newButton = AddButton("New");
|
||||
m_newButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_New);
|
||||
m_deleteButton = AddButton("Delete");
|
||||
m_deleteButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Delete);
|
||||
m_backButton = AddButton("Back");
|
||||
m_backButton->onPressed.AddDynamic(this, &UCharacterSubMenu::m_Back);
|
||||
SetBackButton(m_backButton);
|
||||
}
|
||||
|
||||
void UCharacterSubMenu::NativeDestruct()
|
||||
{
|
||||
Super::NativeDestruct();
|
||||
m_carousel->Destroy();
|
||||
}
|
||||
|
||||
void UCharacterSubMenu::UpdateCurrentCharacter()
|
||||
{
|
||||
if(m_carousel)
|
||||
{
|
||||
m_UpdateCharacter(m_carousel->selectedCharacterIndex);
|
||||
}
|
||||
}
|
||||
|
||||
FCharacterClassProperty UCharacterClassPropertySet::GetCharacterClass(int32 classID) const
|
||||
{
|
||||
static FCharacterClassProperty dummy;
|
||||
if(classes.Num() > 0)
|
||||
{
|
||||
return classes[FMath::Clamp(classID, 0, classes.Num() - 1)];
|
||||
}
|
||||
return dummy;
|
||||
}
|
||||
|
||||
FCharacterClassProperty UCharacterSubMenu::GetCharacterClass(int32 classID) const
|
||||
{
|
||||
return characterClassProperties->GetCharacterClass(classID);
|
||||
}
|
||||
|
||||
TArray<class UAbilityInfo*> UCharacterSubMenu::GetClassAbilities() const
|
||||
{
|
||||
TArray<class UAbilityInfo*> res;
|
||||
if(characterClassProperties)
|
||||
{
|
||||
for(auto cls : characterClassProperties->classes)
|
||||
{
|
||||
res.Add(cls.basicAttack);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
void UCharacterSubMenu::m_Next()
|
||||
{
|
||||
m_carousel->Next();
|
||||
}
|
||||
void UCharacterSubMenu::m_Prev()
|
||||
{
|
||||
m_carousel->Previous();
|
||||
}
|
||||
void UCharacterSubMenu::m_New()
|
||||
{
|
||||
m_carousel->CreateNewCharacter(FString("New Character ") + FString::FromInt(m_carousel->GetCharacterNum()+1));
|
||||
m_UpdateCharacter(m_carousel->GetCharacterNum() - 1);
|
||||
}
|
||||
void UCharacterSubMenu::m_Delete()
|
||||
{
|
||||
if(m_carousel->GetCharacterNum() > 0)
|
||||
m_carousel->DeleteCharacter(m_carousel->selectedCharacterIndex);
|
||||
}
|
||||
void UCharacterSubMenu::m_Edit()
|
||||
{
|
||||
TArray<FString> options; options.Add("OK");
|
||||
if(m_carousel->GetCharacterNum() > 0)
|
||||
{
|
||||
// Make this the active character
|
||||
AMenuController* controller = Cast<AMenuController>(GetOwningPlayer());
|
||||
UDefaultGameInstance* inst = Cast<UDefaultGameInstance>(GetGameInstance());
|
||||
|
||||
// Get save game
|
||||
FCharacterSave& save = inst->GetCharacterSettings()->characterSaves[m_carousel->selectedCharacterIndex];
|
||||
controller->skillTree->BuildFromState(save.skillTreeState);
|
||||
|
||||
OnEditCharacter();
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowMessageBox(FOverlayItemClosed(), "Error", "There are no characters", options, "");
|
||||
}
|
||||
}
|
||||
void UCharacterSubMenu::m_Back()
|
||||
{
|
||||
CloseSubMenu();
|
||||
}
|
||||
|
||||
void UCharacterSubMenu::m_UpdateCharacter(int32 index)
|
||||
{
|
||||
// Make this the active character
|
||||
AMenuController* controller = Cast<AMenuController>(GetOwningPlayer());
|
||||
UDefaultGameInstance* inst = Cast<UDefaultGameInstance>(GetGameInstance());
|
||||
|
||||
// Get save game
|
||||
FCharacterSave& save = inst->GetCharacterSettings()->characterSaves[index];
|
||||
|
||||
ACharacterBase* character = m_carousel->GetCharacterModel(index);
|
||||
if(character)
|
||||
{
|
||||
character->SetCustomizations(save.characterCustomization);
|
||||
character->EquipSkillsFromSkillTreeState(save.skillTreeState);
|
||||
|
||||
// Set class specific equipment
|
||||
if(characterClassProperties)
|
||||
{
|
||||
FCharacterClassProperty properties = characterClassProperties->GetCharacterClass(save.characterClass);
|
||||
character->EquipItems(properties.classItems);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GERROR("Can't update character " + index + ", it does not have a character model.");
|
||||
}
|
||||
}
|
||||
65
Source/UnrealProject/GUI/Submenus/CharacterSubMenu.h
Normal file
65
Source/UnrealProject/GUI/Submenus/CharacterSubMenu.h
Normal file
@@ -0,0 +1,65 @@
|
||||
// Project Lab - NHTV Igad
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "GUI/Menu/MenuScreen.h"
|
||||
#include "PlayerSetupState.h"
|
||||
#include "CharacterSubMenu.generated.h"
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
class UNREALPROJECT_API UCharacterSubMenu : public UMenuPanel
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
UCharacterSubMenu(const FObjectInitializer& init);
|
||||
virtual void NativeConstruct() override;
|
||||
virtual void NativeDestruct() override;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Character Sub Menu")
|
||||
void UpdateCharacter(int32 charIndex) { m_UpdateCharacter(index); }
|
||||
UFUNCTION(BlueprintCallable, Category = "Character Sub Menu")
|
||||
void UpdateCurrentCharacter();
|
||||
|
||||
UFUNCTION(BlueprintImplementableEvent, Category = "Character Sub Menu")
|
||||
void OnEditCharacter();
|
||||
|
||||
UPROPERTY(BlueprintReadOnly, EditDefaultsOnly, Category = "Character Sub Menu")
|
||||
class UCharacterClassPropertySet* characterClassProperties;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Character Class")
|
||||
FCharacterClassProperty GetCharacterClass(int32 classID) const;
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Character Class")
|
||||
TArray<class UAbilityInfo*> GetClassAbilities() const;
|
||||
|
||||
class ACharacterCarousel* GetCarousel() const { return m_carousel; }
|
||||
|
||||
private:
|
||||
UFUNCTION()
|
||||
void m_Next();
|
||||
UFUNCTION()
|
||||
void m_Prev();
|
||||
UFUNCTION()
|
||||
void m_New();
|
||||
UFUNCTION()
|
||||
void m_Delete();
|
||||
UFUNCTION()
|
||||
void m_Back();
|
||||
UFUNCTION()
|
||||
void m_Edit();
|
||||
|
||||
void m_UpdateCharacter(int32 index);
|
||||
|
||||
class UMenuButton* m_nextButton;
|
||||
class UMenuButton* m_prevButton;
|
||||
class UMenuButton* m_newButton;
|
||||
class UMenuButton* m_deleteButton;
|
||||
class UMenuButton* m_backButton;
|
||||
class UMenuButton* m_editButton;
|
||||
|
||||
class ACharacterCarousel* m_carousel;
|
||||
};
|
||||
@@ -0,0 +1,5 @@
|
||||
// Project Lab - NHTV Igad
|
||||
|
||||
#include "UnrealProject.h"
|
||||
#include "CharacterDependentSubMenus.h"
|
||||
|
||||
114
Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.cpp
Normal file
114
Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.cpp
Normal file
@@ -0,0 +1,114 @@
|
||||
// Project Lab - NHTV Igad
|
||||
|
||||
#include "UnrealProject.h"
|
||||
#include "SkillBrowserSubMenu.h"
|
||||
#include "MenuController.h"
|
||||
#include "SkillTreeWidget.h"
|
||||
#include "SkillTreeObject.h"
|
||||
#include "BaseSkillObject.h"
|
||||
#include "SkillWidget.h"
|
||||
|
||||
void USkillBrowserItem::NativeConstruct()
|
||||
{
|
||||
Super::NativeConstruct();
|
||||
}
|
||||
|
||||
void USkillBrowserItem::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)
|
||||
{
|
||||
Super::NativeTick(MyGeometry, InDeltaTime);
|
||||
|
||||
if(skillTree->IsUsingSkill(skillObject))
|
||||
{
|
||||
this->SetIsEnabled(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->SetIsEnabled(true);
|
||||
}
|
||||
}
|
||||
void USkillBrowserItem::Init(UAbilityInfo* info)
|
||||
{
|
||||
ability = info;
|
||||
OnInit();
|
||||
}
|
||||
|
||||
void USkillBrowserItem::NativeOnSelectionChanged(bool selected, bool controller)
|
||||
{
|
||||
Super::NativeOnSelectionChanged(selected, controller);
|
||||
if(selected && category && controller)
|
||||
{
|
||||
UScrollBox* sb = Cast<UScrollBox>(category->Slot->Parent);
|
||||
if(sb)
|
||||
{
|
||||
sb->ScrollWidgetIntoView(category);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void USkillBrowserItem::NativeOnPressed(bool controllerInput)
|
||||
{
|
||||
Super::NativeOnPressed(controllerInput);
|
||||
|
||||
if(!GetIsEnabled())
|
||||
return;
|
||||
|
||||
USkillWidget* wdg = skillTree->NewSkillFromAsset(skillObject, controllerInput);
|
||||
wdg->SetSelectedEffect(skillObject->abilityEffects.IndexOfByKey(ability));
|
||||
if(controllerInput)
|
||||
GetSubMenu()->GetScreen()->OpenSubMenu(wdg);
|
||||
}
|
||||
|
||||
void USkillBrowserSubMenu::NativeConstruct()
|
||||
{
|
||||
m_skillItemContainer = Cast<UPanelWidget>(WidgetTree->FindWidget("ItemContainer"));
|
||||
AMenuController* menuController = Cast<AMenuController>(GetOwningPlayer());
|
||||
USkillTreeWidget* skillTree = menuController->skillTree;
|
||||
USkillTreeObject* skObject = skillTree->skillTreeAsset;
|
||||
|
||||
for(int32 i = 0; i < skObject->skills.Num(); i++)
|
||||
{
|
||||
UBaseSkillObject* skill = skObject->skills[i]->GetDefaultObject<UBaseSkillObject>();
|
||||
|
||||
// Create a category item
|
||||
USkillBrowserItemCategory* categoryItem = CreateWidget<USkillBrowserItemCategory>(GetWorld(), itemCategoryClass);
|
||||
if(!categoryItem)
|
||||
{
|
||||
GERROR("Failed to create skill browser item category");
|
||||
continue;
|
||||
}
|
||||
|
||||
m_skillItemContainer->AddChild(categoryItem);
|
||||
categoryItem->skillObject = skill;
|
||||
|
||||
// Add all the abilities to this category
|
||||
for(int32 j = 0; j < skill->abilityEffects.Num(); j++)
|
||||
{
|
||||
UAbilityInfo* effect = skill->abilityEffects[j];
|
||||
if(!effect)
|
||||
continue;
|
||||
USkillBrowserItem* item = CreateWidget<USkillBrowserItem>(GetWorld(), itemClass);
|
||||
if(!item)
|
||||
{
|
||||
GERROR("Failed to create skill browser item");
|
||||
continue;
|
||||
}
|
||||
item->skillObject = skill;
|
||||
item->skillTree = skillTree;
|
||||
item->category = categoryItem;
|
||||
categoryItem->itemContainer->AddChild(item);
|
||||
|
||||
// Call init on ability item
|
||||
item->Init(effect);
|
||||
}
|
||||
|
||||
// Call init on category
|
||||
categoryItem->OnInit();
|
||||
}
|
||||
|
||||
Super::NativeConstruct();
|
||||
}
|
||||
|
||||
void USkillBrowserItemCategory::NativeConstruct()
|
||||
{
|
||||
itemContainer = Cast<UPanelWidget>(WidgetTree->FindWidget("ItemContainer"));
|
||||
}
|
||||
67
Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.h
Normal file
67
Source/UnrealProject/GUI/Submenus/SkillBrowserSubMenu.h
Normal file
@@ -0,0 +1,67 @@
|
||||
// Project Lab - NHTV Igad
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CharacterDependentSubMenus.h"
|
||||
#include "MenuButton.h"
|
||||
#include "SkillBrowserSubMenu.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class UNREALPROJECT_API USkillBrowserItemCategory : public UPanelUserWidget
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
void NativeConstruct() override;
|
||||
|
||||
UFUNCTION(BlueprintImplementableEvent)
|
||||
void OnInit();
|
||||
|
||||
UPROPERTY(BlueprintReadOnly)
|
||||
class UBaseSkillObject* skillObject;
|
||||
|
||||
UPanelWidget* itemContainer;
|
||||
};
|
||||
|
||||
UCLASS()
|
||||
class UNREALPROJECT_API USkillBrowserItem : public UMenuButton
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
void NativeConstruct() override;
|
||||
void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;
|
||||
void Init(UAbilityInfo* info);
|
||||
void NativeOnSelectionChanged(bool selected, bool controller) override;
|
||||
|
||||
virtual void NativeOnPressed(bool controllerInput) override;
|
||||
|
||||
UFUNCTION(BlueprintImplementableEvent)
|
||||
void OnInit();
|
||||
|
||||
UPROPERTY(BlueprintReadOnly)
|
||||
class USkillBrowserItemCategory* category;
|
||||
UPROPERTY(BlueprintReadOnly)
|
||||
class USkillTreeWidget* skillTree;
|
||||
UPROPERTY(BlueprintReadOnly)
|
||||
class UAbilityInfo* ability;
|
||||
UPROPERTY(BlueprintReadOnly)
|
||||
class UBaseSkillObject* skillObject;
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
UCLASS()
|
||||
class UNREALPROJECT_API USkillBrowserSubMenu : public UCharacterDependentSubMenu
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
void NativeConstruct() override;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly)
|
||||
TSubclassOf<USkillBrowserItem> itemClass;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly)
|
||||
TSubclassOf<USkillBrowserItemCategory> itemCategoryClass;
|
||||
|
||||
private:
|
||||
UPanelWidget* m_skillItemContainer;
|
||||
};
|
||||
5
Source/UnrealProject/GUI/Submenus/SkillTreeSubMenu.cpp
Normal file
5
Source/UnrealProject/GUI/Submenus/SkillTreeSubMenu.cpp
Normal file
@@ -0,0 +1,5 @@
|
||||
// Project Lab - NHTV Igad
|
||||
|
||||
#include "UnrealProject.h"
|
||||
#include "CharacterDependentSubMenus.h"
|
||||
|
||||
Reference in New Issue
Block a user