MrGerwant

DefaultGameMode

Jan 1st, 2025
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.94 KB | Source Code | 0 0
  1. //DefaultGameMode.h
  2. #include "CoreMinimal.h"
  3. #include "GameFramework/GameMode.h"
  4. #include "GameMechanics/GameModes/GameModes.h"
  5. #include "DefaultGameMode.generated.h"
  6.  
  7. #pragma once
  8.  
  9. class ACombatCharacter;
  10. class AAlly;
  11. class AMainCharacter;
  12. class AEnemy;
  13. class UItem;
  14. class AFightEncounter;
  15. class AQuest;
  16. class ACharacterSpawnPoint;
  17. class UDataTable;
  18. class UDefaultGameInstance;
  19. struct FCharacterStatData;
  20. struct FSkillData;
  21.  
  22. UCLASS()
  23. class WIRSPRAWIEDLIWOSCI_API ADefaultGameMode : public AGameMode
  24. {
  25.     GENERATED_BODY()
  26. public:
  27.     void InitializeCharacter(ACombatCharacter* Character, FCharacterStatData* CharacterData);
  28.     void InitializeAllySkills(AAlly* Character);
  29.     void InitializeEnemySkills(ACombatCharacter* Character, int32 Level);
  30.     void InitializeQuests();
  31.     FCharacterStatData* FindAlly(ACombatCharacter* Character);
  32.     FCharacterStatData* FindEnemy(ACombatCharacter* Character);
  33.     FSkillData* FindSkill(FString SkillName, int32 Level);
  34.     void AddToParty(AAlly* Ally, int32 Rank);
  35.    
  36.     TArray<UItem*> GetAllFoodItems();
  37.  
  38.     UFUNCTION(BlueprintCallable)
  39.     void UpdateAlliesLocation();
  40.  
  41.     UFUNCTION(BlueprintCallable)
  42.     void RemoveAlly(FString AllyName, bool bRemovePermanently);
  43.  
  44.     UDefaultGameInstance* CurrentInstance;
  45.  
  46.     UPROPERTY(EditAnywhere)
  47.     UDataTable* AllyStatData;
  48.  
  49.     UPROPERTY(EditAnywhere)
  50.     UDataTable* EnemyStatData;
  51.  
  52.     UPROPERTY(EditAnywhere)
  53.     UDataTable* SkillData;
  54.  
  55.     UPROPERTY(BlueprintReadOnly)
  56.     TArray<AAlly*> AvailableAllies;
  57.  
  58.     UPROPERTY(BlueprintReadWrite)
  59.     TArray<AAlly*> AlliedParty;
  60.  
  61.     UPROPERTY(BlueprintReadOnly)
  62.     TArray<UItem*> Inventory;
  63.  
  64.     UPROPERTY()
  65.     TArray<AQuest*> Quests;
  66.  
  67.     UPROPERTY(EditAnywhere)
  68.     TSubclassOf<AQuest> QuestBaseClass;
  69.  
  70.     UPROPERTY(BlueprintReadWrite)
  71.     float Money;
  72.  
  73.     UPROPERTY(EditAnywhere, BlueprintReadWrite)
  74.     ECurrentMode CurrentMode;
  75.  
  76.     //bool bCanChooseTargets;
  77.  
  78.     //UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
  79.     //FName CurrentMapName;
  80.  
  81.     UPROPERTY(EditAnywhere)
  82.     TArray<ACharacterSpawnPoint*> AllySpawnPoints;
  83.  
  84.     int32 FreeSpawnPointIndex = 0;
  85. protected:
  86.     virtual void BeginPlay() override;
  87.    
  88.     void InitializeAlliesFromTable(AMainCharacter* MainCharacter);
  89.     void InitializeCharacterStats(ACombatCharacter* Character, FCharacterStatData* CharacterData);
  90.     void InitializeCharacterResistances(ACombatCharacter* Character, FCharacterStatData* CharacterData);
  91.     void SetCharacterHealthAndMana(ACombatCharacter* Character, FCharacterStatData* CharacterData);
  92.     void SetCharacterExp(ACombatCharacter* Character, FCharacterStatData* CharacterData);
  93. };
  94.  
  95. //DefaultGameMode.cpp
  96.  
  97. #include "GameMechanics/GameModes/DefaultGameMode.h"
  98. #include "GameMechanics/GameModes/DefaultGameInstance.h"
  99. #include "GameMechanics/AttributeComponent.h"
  100. #include "GameMechanics/CharacterSpawnPoint.h"
  101. #include "GameMechanics/Quests/Quest.h"
  102. #include "GameMechanics/Skill.h"
  103. #include "GameMechanics/Effect.h"
  104. #include "Characters/MainCharacter.h"
  105. #include "Kismet/GameplayStatics.h"
  106. #include "DataStructures/CharacterStatData.h"
  107. #include "DataStructures/SkillData.h"
  108. #include "AIController.h"
  109. #include "Items/Item.h"
  110. #include "UI/DefaultHUD.h"
  111.  
  112. void ADefaultGameMode::BeginPlay()
  113. {
  114.     Super::BeginPlay();
  115.     CurrentInstance = Cast<UDefaultGameInstance>(UGameplayStatics::GetGameInstance(this));
  116.     if (!CurrentInstance) return;
  117.     AMainCharacter* MainCharacter = Cast<AMainCharacter>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
  118.     if (UGameplayStatics::DoesSaveGameExist(TEXT("Save00"), 0))
  119.     {
  120.         CurrentInstance->LoadGame();
  121.     }
  122.     else
  123.     {
  124.         if (MainCharacter == nullptr) return;
  125.         InitializeCharacter(MainCharacter, FindAlly(MainCharacter));
  126.         InitializeAllySkills(MainCharacter);
  127.         AvailableAllies.AddUnique(MainCharacter);
  128.         AlliedParty.AddUnique(MainCharacter);
  129.         InitializeAlliesFromTable(MainCharacter);
  130.     }
  131.     //InitializeQuests();
  132. }
  133.  
  134. FCharacterStatData* ADefaultGameMode::FindAlly(ACombatCharacter* Character)
  135. {
  136.     if (Character && !Character->CharacterName.IsEmpty() && Character->Attributes && AllyStatData)
  137.     {
  138.         FString NameWithoutSpaces = Character->CharacterName;
  139.         NameWithoutSpaces.RemoveSpacesInline();
  140.         FName CompositeKey(NameWithoutSpaces + TEXT("_") + FString::FromInt(Character->Attributes->GetLevel()));
  141.         FCharacterStatData* CharacterData = AllyStatData->FindRow<FCharacterStatData>(CompositeKey, TEXT("Character Data Lookup"), true);
  142.         return CharacterData;
  143.     }
  144.     return nullptr;
  145. }
  146.  
  147. FCharacterStatData* ADefaultGameMode::FindEnemy(ACombatCharacter* Character)
  148. {
  149.     if (Character && !Character->CharacterName.IsEmpty() && Character->Attributes && EnemyStatData)
  150.     {
  151.         FString NameWithoutSpaces = Character->CharacterName;
  152.         NameWithoutSpaces.RemoveSpacesInline();
  153.         FName CompositeKey(NameWithoutSpaces + TEXT("_") + FString::FromInt(Character->Attributes->GetLevel()));
  154.         FCharacterStatData* CharacterData = EnemyStatData->FindRow<FCharacterStatData>(CompositeKey, TEXT("Character Data Lookup"), true);
  155.         return CharacterData;
  156.     }
  157.     return nullptr;
  158. }
  159.  
  160. FSkillData* ADefaultGameMode::FindSkill(FString SkillName, int32 Level)
  161. {
  162.     FName CompositeKey(SkillName + TEXT("_") + FString::FromInt(Level));
  163.     FSkillData* SkillRow = SkillData->FindRow<FSkillData>(CompositeKey, TEXT("Skill Data Lookup"), true);
  164.     return SkillRow;
  165. }
  166.  
  167. void ADefaultGameMode::InitializeAlliesFromTable(AMainCharacter* MainCharacter)
  168. {
  169.     UWorld* World = GetWorld();
  170.     if (!World || !MainCharacter) return;
  171.     TArray<FCharacterStatData*> CharacterRows;
  172.     AllyStatData->GetAllRows<FCharacterStatData>(TEXT("Character Data Lookup"), CharacterRows);
  173.     for (FCharacterStatData* CharacterRow : CharacterRows)
  174.     {
  175.         if (CharacterRow->CharacterName == MainCharacter->CharacterName) continue; //pomijamy Janusza i nieodblokowanych sojusznikow (rank -1 oznacza, ze go nie odblokowalismy; rank 0, ze nie w druzynie a rank 1-4 to druzyna)
  176.         FVector SpawnLocation;
  177.         FRotator SpawnRotation = MainCharacter->GetActorRotation();
  178.         if (CharacterRow->Rank > 0)
  179.         {
  180.             SpawnLocation = MainCharacter->GetActorLocation();
  181.             SpawnLocation.X -= (CharacterRow->Rank - 1) * 80.f; //jesli w druzynie to spawnujemy za Januszem
  182.         }
  183.         else
  184.         {
  185.             if(FreeSpawnPointIndex < AllySpawnPoints.Num())
  186.             {
  187.                 SpawnLocation = AllySpawnPoints[FreeSpawnPointIndex]->GetActorLocation(); // jesli nie w druzynie to spawnujemy pod mapa, zeby miec dostep
  188.                 FreeSpawnPointIndex++;
  189.             }
  190.         }
  191.         AAlly* NewAlly = World->SpawnActor<AAlly>(CharacterRow->CharacterClass, SpawnLocation, SpawnRotation);
  192.         InitializeCharacter(NewAlly, CharacterRow);
  193.         InitializeAllySkills(NewAlly);
  194.         if (CharacterRow->Rank >= 0)
  195.         {
  196.             AvailableAllies.AddUnique(NewAlly);
  197.         }
  198.         if(CharacterRow->Rank>0)
  199.         {
  200.             AlliedParty.AddUnique(NewAlly);
  201.         }
  202.         NewAlly->Rank = CharacterRow->Rank;
  203.         AAIController* NewAIController = GetWorld()->SpawnActor<AAIController>(AAIController::StaticClass(), SpawnLocation, SpawnRotation);
  204.         NewAIController->Possess(NewAlly);
  205.         NewAlly->AIController = NewAIController;
  206.     }
  207. }
  208.  
  209. void ADefaultGameMode::InitializeCharacter(ACombatCharacter* Character, FCharacterStatData* CharacterData)
  210. {
  211.     if (Character && CharacterData)
  212.     {
  213.         InitializeCharacterStats(Character, CharacterData);
  214.  
  215.         InitializeCharacterResistances(Character, CharacterData);
  216.  
  217.         SetCharacterHealthAndMana(Character, CharacterData);
  218.  
  219.         SetCharacterExp(Character, CharacterData);
  220.     }
  221. }
  222.  
  223. void ADefaultGameMode::InitializeAllySkills(AAlly* Character)
  224. {
  225.     if (Character && !Character->SkillNames.IsEmpty() && SkillData)
  226.     {
  227.         for (FString SkillName : Character->SkillNames)
  228.         {
  229.             for (int i = 1; i <= 5; i++)
  230.             {
  231.                 FSkillData* SkillRow = FindSkill(SkillName, i);
  232.                 if (SkillRow == nullptr) continue;
  233.                 USkill* NewSkill = NewObject<USkill>(Character, SkillRow->SkillClass);
  234.                 NewSkill->Level = i;
  235.                 NewSkill->SkillName = SkillRow->SkillName;
  236.                 NewSkill->MinValue = SkillRow->MinValue;
  237.                 NewSkill->MaxValue = SkillRow->MaxValue;
  238.                 NewSkill->BaseAccuracy = SkillRow->BaseAccuracy;
  239.                 NewSkill->BaseCritRate = SkillRow->BaseCritRate;
  240.                 NewSkill->StunRate = SkillRow->StunRate;
  241.                 NewSkill->SelfHeal = SkillRow->SelfHeal;
  242.                 NewSkill->SelfDamage = SkillRow->SelfDamage;
  243.                 NewSkill->ManaCost = SkillRow->ManaCost;
  244.                 NewSkill->bUnlocked = SkillRow->bUnlocked;
  245.                
  246.                 if(SkillRow->InflictedEffectClass)
  247.                 {
  248.                     UEffect* InflictedEffect = NewObject<UEffect>(NewSkill, SkillRow->InflictedEffectClass);
  249.                     InflictedEffect->SetValue(SkillRow->InflictedEffectValue);
  250.                     InflictedEffect->SetDuration(SkillRow->InflictedEffectDuration);
  251.                     NewSkill->SetInflictedEffect(InflictedEffect);
  252.                 }
  253.                 TArray<UEffect*> SelfEffects;
  254.                 if(SkillRow->SelfEffect1Class)
  255.                 {
  256.                     UEffect* SelfEffect = NewObject<UEffect>(NewSkill, SkillRow->SelfEffect1Class);
  257.                     SelfEffect->SetValue(SkillRow->SelfEffect1Value);
  258.                     SelfEffect->SetDuration(SkillRow->SelfEffect1Duration);
  259.                     SelfEffects.Add(SelfEffect);
  260.                 }
  261.                 if (SkillRow->SelfEffect2Class)
  262.                 {
  263.                     UEffect* SelfEffect = NewObject<UEffect>(NewSkill, SkillRow->SelfEffect2Class);
  264.                     SelfEffect->SetValue(SkillRow->SelfEffect2Value);
  265.                     SelfEffect->SetDuration(SkillRow->SelfEffect2Duration);
  266.                     SelfEffects.Add(SelfEffect);
  267.                 }
  268.                 if(!SelfEffects.IsEmpty())
  269.                 {
  270.                     NewSkill->SetSelfEffects(SelfEffects);
  271.                 }
  272.                 NewSkill->BuildDescription();
  273.                 Character->Skills.Add(NewSkill);
  274.                 if (SkillRow->bEquipped)
  275.                 {
  276.                     if (NewSkill->SkillType == ESkillType::EST_UltAttack || NewSkill->SkillType == ESkillType::EST_UltSupport)
  277.                     {
  278.                         Character->Ult = NewSkill;
  279.                     }
  280.                     else
  281.                     {
  282.                         Character->EquippedSkills.Add(NewSkill);
  283.                     }
  284.                 }
  285.             }
  286.         }
  287.     }
  288. }
  289.  
  290. void ADefaultGameMode::InitializeEnemySkills(ACombatCharacter* Character, int32 Level)
  291. {
  292.     if (Character && !Character->SkillNames.IsEmpty() && SkillData)
  293.     {
  294.         for (FString SkillName : Character->SkillNames)
  295.         {
  296.             int32 SkillLevel = Level % 2 == 0 ? (Level / 2) : (Level+1)/2;
  297.             FSkillData* SkillRow = FindSkill(SkillName, SkillLevel);
  298.             if (SkillRow == nullptr || SkillRow->SkillClass == nullptr) continue;
  299.             USkill* NewSkill = NewObject<USkill>(Character, SkillRow->SkillClass);
  300.             NewSkill->Level = SkillLevel;
  301.             NewSkill->SkillName = SkillRow->SkillName;
  302.             NewSkill->MinValue = SkillRow->MinValue;
  303.             NewSkill->MaxValue = SkillRow->MaxValue;
  304.             NewSkill->BaseAccuracy = SkillRow->BaseAccuracy;
  305.             NewSkill->BaseCritRate = SkillRow->BaseCritRate;
  306.             NewSkill->StunRate = SkillRow->StunRate;
  307.             NewSkill->SelfHeal = NewSkill->SelfHeal;
  308.             NewSkill->SelfDamage = SkillRow->SelfDamage;
  309.             NewSkill->ManaCost = SkillRow->ManaCost;
  310.             NewSkill->bUnlocked = SkillRow->bUnlocked;
  311.  
  312.             if (SkillRow->InflictedEffectClass)
  313.             {
  314.                 UEffect* InflictedEffect = NewObject<UEffect>(NewSkill, SkillRow->InflictedEffectClass);
  315.                 InflictedEffect->SetValue(SkillRow->InflictedEffectValue);
  316.                 InflictedEffect->SetDuration(SkillRow->InflictedEffectDuration);
  317.                 NewSkill->SetInflictedEffect(InflictedEffect);
  318.             }
  319.             TArray<UEffect*> SelfEffects;
  320.             if (SkillRow->SelfEffect1Class)
  321.             {
  322.                 UEffect* SelfEffect = NewObject<UEffect>(NewSkill, SkillRow->SelfEffect1Class);
  323.                 SelfEffect->SetValue(SkillRow->SelfEffect1Value);
  324.                 SelfEffect->SetDuration(SkillRow->SelfEffect1Duration);
  325.                 SelfEffects.Add(SelfEffect);
  326.             }
  327.             if (SkillRow->SelfEffect2Class)
  328.             {
  329.                 UEffect* SelfEffect = NewObject<UEffect>(NewSkill, SkillRow->SelfEffect2Class);
  330.                 SelfEffect->SetValue(SkillRow->SelfEffect2Value);
  331.                 SelfEffect->SetDuration(SkillRow->SelfEffect2Duration);
  332.                 SelfEffects.Add(SelfEffect);
  333.             }
  334.             if (!SelfEffects.IsEmpty())
  335.             {
  336.                 NewSkill->SetSelfEffects(SelfEffects);
  337.             }
  338.             NewSkill->BuildDescription();
  339.             Character->EquippedSkills.Add(NewSkill);
  340.         }
  341.     }
  342. }
  343.  
  344. void ADefaultGameMode::InitializeQuests()
  345. {
  346.     TArray<AActor*> QuestActors;
  347.     if(QuestBaseClass)
  348.     {
  349.         UGameplayStatics::GetAllActorsOfClass(this, QuestBaseClass, QuestActors);
  350.         for (AActor* QuestActor : QuestActors)
  351.         {
  352.             AQuest* Quest = Cast<AQuest>(QuestActor);
  353.             if (Quest)
  354.             {
  355.                 Quests.AddUnique(Quest);
  356.             }
  357.         }
  358.     }
  359. }
  360.  
  361. void ADefaultGameMode::InitializeCharacterStats(ACombatCharacter* Character, FCharacterStatData* CharacterData)
  362. {
  363.     Character->Attributes->Stats.Add(TEXT("Witalno\u015b\u0107"), CharacterData->Vitality);
  364.     Character->Attributes->Stats.Add(TEXT("Magia"), CharacterData->Magic);
  365.     Character->Attributes->Stats.Add(TEXT("Zdolno\u015b\u0107 do Ludob\u00f3jstwa"), CharacterData->CapacityForGenocide);
  366.     Character->Attributes->Stats.Add(TEXT("Bieg\u0142o\u015b\u0107 Lecznicza"), CharacterData->HealingProficiency);
  367.     Character->Attributes->Stats.Add(TEXT("Obrona"), CharacterData->Defence);
  368.     Character->Attributes->Stats.Add(TEXT("Narwano\u015b\u0107"), CharacterData->Speed);
  369.     Character->Attributes->Stats.Add(TEXT("Unik"), CharacterData->Dodge);
  370.     Character->Attributes->Stats.Add(TEXT("Szcz\u0119\u015bcie"), CharacterData->Luck);
  371.     Character->Attributes->Stats.Add(TEXT("Celno\u015b\u0107"), CharacterData->Accuracy);
  372. }
  373.  
  374. void ADefaultGameMode::InitializeCharacterResistances(ACombatCharacter* Character, FCharacterStatData* CharacterData)
  375. {
  376.     Character->Attributes->Resistances.Add(TEXT("Og\u0142uszenie"), CharacterData->StunResistance);
  377.     Character->Attributes->Resistances.Add(TEXT("Ciemi\u0119\u017cenie"), CharacterData->OppressionResistance);
  378.     Character->Attributes->Resistances.Add(TEXT("Smrud"), CharacterData->StinkResistance);
  379.     Character->Attributes->Resistances.Add(TEXT("\u017byczenie \u015amierci"), CharacterData->DeathwishResistance);
  380.     Character->Attributes->Resistances.Add(TEXT("Zamulenie"), CharacterData->TiredResistance);
  381.     Character->Attributes->Resistances.Add(TEXT("Najebanie"), CharacterData->DrunkResistance);
  382.     Character->Attributes->Resistances.Add(TEXT("Kompromitacja Cwela"), CharacterData->DisgraceResistance);
  383. }
  384.  
  385. void ADefaultGameMode::SetCharacterHealthAndMana(ACombatCharacter* Character, FCharacterStatData* CharacterData)
  386. {
  387.     Character->Attributes->SetMaxHealth(10.f + (CharacterData->Vitality - 5.f));
  388.     Character->Attributes->SetHealth(10.f + (CharacterData->Vitality - 5.f));
  389.     Character->Attributes->SetMaxMana(10.f + (CharacterData->Magic - 5.f));
  390.     Character->Attributes->SetMana(10.f + (CharacterData->Magic - 5.f));
  391. }
  392.  
  393. void ADefaultGameMode::SetCharacterExp(ACombatCharacter* Character, FCharacterStatData* CharacterData)
  394. {
  395.     Character->SetExpToNextLevel(CharacterData->ExpToNextLevel);
  396.     Character->Attributes->SetLevel(CharacterData->Level);
  397.     Character->SetExperience(CharacterData->Experience);
  398.     Character->Rank = CharacterData->Rank;
  399. }
  400.  
  401. void ADefaultGameMode::AddToParty(AAlly* Ally, int32 Rank)
  402. {
  403.     if (Rank <= 0 || Rank>4) return;
  404.     if(Ally)
  405.     {
  406.         AlliedParty.Insert(Ally, Rank - 1);
  407.     }
  408. }
  409.  
  410. TArray<UItem*> ADefaultGameMode::GetAllFoodItems()
  411. {
  412.     TArray<UItem*> FoodItems;
  413.     for (UItem* Item : Inventory)
  414.     {
  415.         if (Item->ItemType == EItemType::EIT_Food)
  416.         {
  417.             FoodItems.Add(Item);
  418.         }
  419.     }
  420.     return FoodItems;
  421. }
  422.  
  423. void ADefaultGameMode::UpdateAlliesLocation()
  424. {
  425.     AMainCharacter* MainCharacter = Cast<AMainCharacter>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
  426.     if (MainCharacter == nullptr) return;
  427.     FVector Location = MainCharacter->GetActorLocation();
  428.     for (int i = 1; i < AlliedParty.Num(); i++)
  429.     {
  430.         AlliedParty[i]->Rank = i + 1;
  431.         Location.X -= 80.f;
  432.         AlliedParty[i]->SetActorLocation(Location);
  433.     }
  434. }
  435.  
  436. void ADefaultGameMode::RemoveAlly(FString AllyName, bool bRemovePermanently)
  437. {
  438.     APlayerController* Controller = UGameplayStatics::GetPlayerController(this, 0);
  439.     if (Controller == nullptr || Controller->GetHUD()==nullptr) return;
  440.     ADefaultHUD* HUD = Cast<ADefaultHUD>(Controller->GetHUD());
  441.     if (HUD == nullptr) return;
  442.     for (AAlly* Ally : AvailableAllies)
  443.     {
  444.         if (Ally->CharacterName.Equals(AllyName))
  445.         {
  446.             if (AlliedParty.Contains(Ally))
  447.             {
  448.                 AlliedParty.Remove(Ally);
  449.             }
  450.             if (bRemovePermanently)
  451.             {
  452.                 AvailableAllies.Remove(Ally);
  453.                 if (FreeSpawnPointIndex < AllySpawnPoints.Num())
  454.                 {
  455.                     Ally->SetActorLocation(AllySpawnPoints[FreeSpawnPointIndex]->GetActorLocation());
  456.                 }
  457.             }
  458.             if (HUD)
  459.             {
  460.                 HUD->UpdateOverlays();
  461.             }
  462.             break;
  463.         }
  464.     }
  465. }
  466.  
  467.  
Tags: C++ ue5
Advertisement
Add Comment
Please, Sign In to add comment