about generex
7v7 Dynamite Action MOBA title developed by Farman dedvalab that each character has 7 different abilities and storylines which each of character’s storylines connected together into the Cosmo Vertexera, the universe of Generex. Each of the character gameplay and mechanics Are very different which gives a different experience during the gameplay. This is the battle of revolution of merging the broken universe that was once. Now the Gerixes of Syrina and revera must fight each other in a war for destroying the Delta Core in order to take Cosmo Vertexera back but All of their enemy souls must be taken in order for the Syrex tree to be destroyed and give up its power to merge Syrina and Revera back into Cosmo Vertexera.
Phase's HyperFlux
One of the fancy and complex abilities. Upon casting, all overlapped enemies will be telekinesis up in the air, disabling gravity, slowing their movement and attack speed. after a short duration, chaotic rain will fall from the sky dealing magical damage to all the telekinesis enemies based on their magic resistance for 5 times before restoring its gravity, move and attack speed back to how much each they had before the telekinesis is being done. Below is the sample source code of how it has been done.
UPhaseHyperFluxAbility::UPhaseHyperFluxAbility()
{
InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
FGameplayTag AbilitySecondaryTag = FGameplayTag::RequestGameplayTag(FName("Ability.Skill.Ability4"));
AbilityTags.AddTag(AbilitySecondaryTag);
ActivationOwnedTags.AddTag(AbilitySecondaryTag);
ActivationBlockedTags.AddTag(FGameplayTag::RequestGameplayTag(FName("Ability.Skill")));
}
void UPhaseHyperFluxAbility::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData)
{
Phase = Cast<APlayerCharacterBase>(GetAvatarActorFromActorInfo());
CurrentAbilityLevel = Phase->UltimateAbilityLevel;
if (!CommitAbility(Handle, ActorInfo, ActivationInfo))
{
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, true);
}
Phase->GetCharacterMovement()->StopMovementImmediately();
Phase->DisableInput(nullptr);
Phase->GetCapsuleComponent()->SetCollisionObjectType(ECollisionChannel::ECC_WorldDynamic);
UAnimMontage* MontageToPlay = HyperFluxMontage;
UAbilityTask_PlayMontageAndWaitForEvent* Task = UAbilityTask_PlayMontageAndWaitForEvent::PlayMontageAndWaitForEvent(this, NAME_None, MontageToPlay, FGameplayTagContainer(), 1.0f, NAME_None, false, 1.0f);
Task->OnCompleted.AddDynamic(this, &UPhaseHyperFluxAbility::OnCompleted);
Task->EventReceived.AddDynamic(this, &UPhaseHyperFluxAbility::EventReceived);
Task->ReadyForActivation();
FActorSpawnParameters SpawnParams;
SpawnParams.Instigator = Phase;
GetWorld()->SpawnActor<AActor>(PhaseHyperFluxClass, Phase->GetActorLocation(), Phase->GetActorRotation(), SpawnParams);
Portal = GetWorld()->SpawnActor<AActor>(PhaseHyperFluxPortalClass, Phase->GetActorLocation(), Phase->GetActorRotation(), SpawnParams);
GetWorld()->SpawnActor<AActor>(PhaseHyperFluxShotRainStartClass, Phase->GetActorLocation(), Phase->GetActorRotation(), SpawnParams);
}
void UPhaseHyperFluxAbility::OnCompleted(FGameplayTag EventTag, FGameplayEventData EventData)
{
Phase->EnableInput(nullptr);
Portal->Destroy();
Phase->GetCapsuleComponent()->SetCollisionObjectType(ECollisionChannel::ECC_Pawn);
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, false);
}
void UPhaseHyperFluxAbility::EventReceived(FGameplayTag EventTag, FGameplayEventData EventData)
{
if (EventTag == FGameplayTag::RequestGameplayTag(FName("Event.Montage.EndAbility")))
{
Phase->EnableInput(nullptr);
Portal->Destroy();
Phase->GetCapsuleComponent()->SetCollisionObjectType(ECollisionChannel::ECC_Pawn);
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, false);
return;
}
if (GetOwningActorFromActorInfo()->GetLocalRole() == ROLE_Authority && EventTag == FGameplayTag::RequestGameplayTag(FName("Event.Montage.Ability4")))
{
if (!Phase)
{
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, true);
}
FString* DamageValue;
FString AbilityName = FString("Damage");
DamageValue = &AbilityName;
FGameplayEffectSpecHandle DamageEffectSpecHandle = MakeOutgoingGameplayEffectSpec(DamageGameplayEffect, CurrentAbilityLevel);
if (Phase->SoulOrbLevel >= 4)
{
DamageEffectSpecHandle.Data.Get()->SetSetByCallerMagnitude(FGameplayTag::RequestGameplayTag(FName("Data.NaturalDamage")), Damage.GetValueAtLevel(CurrentAbilityLevel, DamageValue));
}
else
{
DamageEffectSpecHandle.Data.Get()->SetSetByCallerMagnitude(FGameplayTag::RequestGameplayTag(FName("Data.MagicalDamage")), Damage.GetValueAtLevel(CurrentAbilityLevel, DamageValue));
}
if (Phase->GetSpellLifesteal() > 0)
{
DamageEffectSpecHandle.Data.Get()->SetSetByCallerMagnitude(FGameplayTag::RequestGameplayTag(FName("Effect.Damage.CanSpellLifesteal")), Phase->GetSpellLifesteal() / 100);
}
FActorSpawnParameters SpawnParameters;
SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
ACollidingActorBase* HyperFluxRain = GetWorld()->SpawnActorDeferred<ACollidingActorBase>(PhaseHyperFluxRainClass, Phase->GetActorTransform(), GetOwningActorFromActorInfo(),
Phase, ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
HyperFluxRain->DamageEffectSpecHandle = DamageEffectSpecHandle;
HyperFluxRain->FinishSpawning(Phase->GetActorTransform());
}
}
Turret SWitching
In each laning phase, there will be 2 types of turrets. one will fire to kill minions for lane clearance and the other will freeze the victim being shot for 2 seconds for challenging push.
Upon destroying one turret from one tier, the other tier turret opposite from the destroyed turret will unlock allow the player to switch and change turret position to suit their desire during the defensive time to backup the game and fights.
ITem Drop
Upon killing jungle buff in mid-zone of the battlefield, it will drop a temporary item that can be used only once and will clear the slot to empty to pick up another. each buff drop item is different and works differently upon casting.
There are 3 different types of drops as follows, provide bonus damage for a duration, 100% evasion for the duration Evading physical attack from enemies, and instantly restore health and mana to full.
XP, Leveling and ability leveling
XP can be earned from killing their enemies, after they got enough XP, they will level up allow the player to level up one of their abilities in each level, and reset the XP back. not every ability can be level up per level, some abilities like the Finale can be level up at the 10th of their level. The first 3 abilities can be level up to level 5, ultimate to level 4, Finale to level 3, support, and passive ability to level 4. Moreover, each player can reach the max level of level 30.
Item to purchase
when the player collecting soul stacks from killing enemies, they can be used to purchase items to upgrade themselves to suit their battle style. every player can purchase the item for up to 6 slots and each item can be upgraded, up to level 5 for each item. Below is the sample source code of how the purchase and upgrades are being held.
void APlayerCharacterBase::PurchaseItem_Implementation(TSubclassOf<UItemAbilityBase> ItemToPurchase)
{
if (ItemToPurchase && GetSoulStack() >= ItemToPurchase.GetDefaultObject()->SoulStackCost && (!bAttributesModifierApplied[0] || ItemOfSlot[0] == ItemToPurchase))
{
if (!bAttributesModifierApplied[0])
{
ItemOfSlot[0] = ItemToPurchase;
PaySoulStack(ItemOfSlot[0].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[0].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[0].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
if (ItemOfSlot[0].GetDefaultObject()->ItemAbilityType == EItemAbilityType::IAT_Passive)
{
GetAbilitySystemComponent()->TryActivateAbilityByClass(ItemOfSlot[0]);
}
if (ItemOfSlot[0].GetDefaultObject()->ItemPassiveEffect)
{
PassiveEffectOfItemOfSlot[0] = ItemOfSlot[0].GetDefaultObject()->ItemPassiveEffect;
}
bAttributesModifierApplied[0] = true;
LevelOfItemOfSlot[0]++;
return;
}
else if (ItemOfSlot[0] && LevelOfItemOfSlot[0] < 5)
{
PaySoulStack(ItemOfSlot[0].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[0].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[0].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
LevelOfItemOfSlot[0]++;
return;
}
}
else if (ItemToPurchase && GetSoulStack() >= ItemToPurchase.GetDefaultObject()->SoulStackCost && (!bAttributesModifierApplied[1] || ItemOfSlot[1] == ItemToPurchase))
{
if (!bAttributesModifierApplied[1])
{
ItemOfSlot[1] = ItemToPurchase;
PaySoulStack(ItemOfSlot[1].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[1].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[1].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
if (ItemOfSlot[1].GetDefaultObject()->ItemAbilityType == EItemAbilityType::IAT_Passive)
{
GetAbilitySystemComponent()->TryActivateAbilityByClass(ItemOfSlot[1]);
}
if (ItemOfSlot[1].GetDefaultObject()->ItemPassiveEffect)
{
PassiveEffectOfItemOfSlot[1] = ItemOfSlot[1].GetDefaultObject()->ItemPassiveEffect;
}
bAttributesModifierApplied[1] = true;
LevelOfItemOfSlot[1]++;
return;
}
else if (ItemOfSlot[1] && LevelOfItemOfSlot[1] < 5)
{
PaySoulStack(ItemOfSlot[1].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[1].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[1].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
LevelOfItemOfSlot[1]++;
return;
}
}
else if (ItemToPurchase && GetSoulStack() >= ItemToPurchase.GetDefaultObject()->SoulStackCost && (!bAttributesModifierApplied[2] || ItemOfSlot[2] == ItemToPurchase))
{
if (!bAttributesModifierApplied[2])
{
ItemOfSlot[2] = ItemToPurchase;
PaySoulStack(ItemOfSlot[2].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[2].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[2].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
if (ItemOfSlot[2].GetDefaultObject()->ItemAbilityType == EItemAbilityType::IAT_Passive)
{
GetAbilitySystemComponent()->TryActivateAbilityByClass(ItemOfSlot[2]);
}
if (ItemOfSlot[2].GetDefaultObject()->ItemPassiveEffect)
{
PassiveEffectOfItemOfSlot[2] = ItemOfSlot[2].GetDefaultObject()->ItemPassiveEffect;
}
bAttributesModifierApplied[2] = true;
LevelOfItemOfSlot[2]++;
return;
}
else if (ItemOfSlot[2] && LevelOfItemOfSlot[2] < 5)
{
PaySoulStack(ItemOfSlot[2].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[2].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[2].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
LevelOfItemOfSlot[2]++;
return;
}
}
else if (ItemToPurchase && GetSoulStack() >= ItemToPurchase.GetDefaultObject()->SoulStackCost && (!bAttributesModifierApplied[3] || ItemOfSlot[3] == ItemToPurchase))
{
if (!bAttributesModifierApplied[3])
{
ItemOfSlot[3] = ItemToPurchase;
PaySoulStack(ItemOfSlot[3].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[3].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[3].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
if (ItemOfSlot[3].GetDefaultObject()->ItemAbilityType == EItemAbilityType::IAT_Passive)
{
GetAbilitySystemComponent()->TryActivateAbilityByClass(ItemOfSlot[3]);
}
if (ItemOfSlot[3].GetDefaultObject()->ItemPassiveEffect)
{
PassiveEffectOfItemOfSlot[3] = ItemOfSlot[3].GetDefaultObject()->ItemPassiveEffect;
}
bAttributesModifierApplied[3] = true;
LevelOfItemOfSlot[3]++;
return;
}
else if (ItemOfSlot[3] && LevelOfItemOfSlot[3] < 5)
{
PaySoulStack(ItemOfSlot[3].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[3].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[3].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
LevelOfItemOfSlot[3]++;
return;
}
}
else if (ItemToPurchase && GetSoulStack() >= ItemToPurchase.GetDefaultObject()->SoulStackCost && (!bAttributesModifierApplied[4] || ItemOfSlot[4] == ItemToPurchase))
{
if (!bAttributesModifierApplied[4])
{
ItemOfSlot[4] = ItemToPurchase;
PaySoulStack(ItemOfSlot[4].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[4].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[4].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
if (ItemOfSlot[4].GetDefaultObject()->ItemAbilityType == EItemAbilityType::IAT_Passive)
{
GetAbilitySystemComponent()->TryActivateAbilityByClass(ItemOfSlot[4]);
}
if (ItemOfSlot[4].GetDefaultObject()->ItemPassiveEffect)
{
PassiveEffectOfItemOfSlot[4] = ItemOfSlot[4].GetDefaultObject()->ItemPassiveEffect;
}
bAttributesModifierApplied[4] = true;
LevelOfItemOfSlot[4]++;
return;
}
else if (ItemOfSlot[4] && LevelOfItemOfSlot[4] < 5)
{
PaySoulStack(ItemOfSlot[4].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[4].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[4].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
LevelOfItemOfSlot[4]++;
return;
}
}
else if (ItemToPurchase && GetSoulStack() >= ItemToPurchase.GetDefaultObject()->SoulStackCost && (!bAttributesModifierApplied[5] || ItemOfSlot[5] == ItemToPurchase))
{
if (!bAttributesModifierApplied[5])
{
ItemOfSlot[5] = ItemToPurchase;
PaySoulStack(ItemOfSlot[5].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[5].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[5].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
if (ItemOfSlot[5].GetDefaultObject()->ItemAbilityType == EItemAbilityType::IAT_Passive)
{
GetAbilitySystemComponent()->TryActivateAbilityByClass(ItemOfSlot[5]);
}
if (ItemOfSlot[5].GetDefaultObject()->ItemPassiveEffect)
{
PassiveEffectOfItemOfSlot[5] = ItemOfSlot[5].GetDefaultObject()->ItemPassiveEffect;
}
bAttributesModifierApplied[5] = true;
LevelOfItemOfSlot[5]++;
return;
}
else if (ItemOfSlot[5] && LevelOfItemOfSlot[5] < 5)
{
PaySoulStack(ItemOfSlot[5].GetDefaultObject()->SoulStackCost);
ClientPlaySound2D(BoughtItemSound);
if (ItemOfSlot[5].GetDefaultObject()->BonusAttributesModifier)
{
FGameplayEffectSpecHandle GameplayEffectSpecHandle = GetAbilitySystemComponent()->MakeOutgoingSpec(ItemOfSlot[5].GetDefaultObject()->BonusAttributesModifier, 1.f, GetAbilitySystemComponent()->MakeEffectContext());
GetAbilitySystemComponent()->BP_ApplyGameplayEffectSpecToSelf(GameplayEffectSpecHandle);
}
LevelOfItemOfSlot[5]++;
return;
}
}
}
Soulorb Upgrade
Every player can upgrade their 5 main abilities not just through leveling but through purchasing soulorb from the store. What's different is that soulorb will add one more level to the ability they purchased for and change the ability for the better on how each character ability they chose to upgrade has been programmed.
Desera spinal
one player of each team can carry a spinal to pant it in their enemy base to change the turret destiny by attacking the same team. this way, it'll make the game have a turnaround and back up the fight for the team.
In order to restore their turret destiny, their team needs to plant their desera spinal in their enemy base to turn it back.
Traps
Players can also purchase traps from stores to trap their enemies through baiting.
there are 3 types of traps. heavy damage proximity mine, Root Compound, and the freezing ice blast.
Shrine System
Each team battle arena has 6 different teleportation portals to teleport to other team's battle arena. in order for them to be able to teleport, 4 shrines in the mid-zone (realm of syrex) must be captured inorder to be able to teleport.