HAxis sos

This commit is contained in:
guus
2018-08-11 16:46:35 +02:00
commit 510654f8a1
480 changed files with 54126 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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:
};

View 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.");
}
}

View 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;
};

View File

@@ -0,0 +1,5 @@
// Project Lab - NHTV Igad
#include "UnrealProject.h"
#include "CharacterDependentSubMenus.h"

View 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"));
}

View 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;
};

View File

@@ -0,0 +1,5 @@
// Project Lab - NHTV Igad
#include "UnrealProject.h"
#include "CharacterDependentSubMenus.h"