Bolt Storm (PC/Xbox One)
Published 7 months ago
In development
Xbox One; Xbox 360; Windows; Mac; Linux
Bolt Storm is a game I worked on at university in a 25+ man team. My job involved mainly involved gameplay programming (mainly in C++) and UI (in blueprints).
Boltstorm is a university project we made with a large team (25+ members) in Unreal Engine 4. It’s a dungeon crawler RPG that procedurally generates dungeons from premade rooms. The player is the king, he can fight himself and also use his army by giving them commands.
In terms on gameplay I worked on stuff such as: items & looting, army barracks (where the king can buy new units), dungeon loading, item shop. we mainly used C++ for the gameplay.
Small code snippet:
void UBsUtils::GotoDungeon(AActor* anyActor) { if (BS_INVALID(anyActor)) { printError("UBsUtils::GotoDungeon: Invalid anyActor."); return; } UBsGameInstance* instance = Cast(anyActor->GetWorld()->GetGameInstance()); UBsDungeonConfig* config = GetDungeonConfig(anyActor); if (config->mDungeons.Num() == 0) { printError("UBsUtils::GotoDungeon: Failed to load dungeon -> No dungeons found in dungeon config."); return; } for (int32 i = 0; i < config->mDungeons.Num(); i++) { FBsDungeonInfo dungeon = config->mDungeons[i]; FString levelName = UGameplayStatics::GetCurrentLevelName(anyActor); // Determines whether or not the current level is the same as this dungeons camp level if (dungeon.mCampName.ToString().Compare(levelName) == 0) { instance->WipeGroupArrays(); OpenLevelAndWipeGroupsArrays(anyActor, dungeon.mStartLevelName, true); return; } } printWarning("UBsUtils::GotoDungeon: Not currently in a camp -> loading first dungeon..."); OpenLevelAndWipeGroupsArrays(anyActor, config->mDungeons[0].mStartLevelName, true); }
For UI, I created a centralized UI managment system (in C++). There are 3 different types of UI elements in this system; windows, popups and tooltips. I created this system in such a way that it easy to create new UI and that UI is safely managed. This means that windows will spawn on top of existing windows and popups will spawn on top too, but windows are not allowed to be created on top of popups (popups on top of popups are fine). We then have to call PopUI with a given depth to remove the UI (support for transition animations included).
Small code snippet:
void ABsUIManager::PopUI(int32 aDepth) { for (int i = 0; i < aDepth; i++) { if (mUIObjectStack.Num() <= 1) { printWarning("Failed to pop UI: only 1 ui object left on the stack (the hud)"); return; } UBsUIObjectBase* tPopped = mUIObjectStack.Pop(); if (tPopped->IsA<UBsUIWindow>()) { mCurrentWindowLayer--; if (mHudHiders.Contains(tPopped)) { mHudHiders.Remove(tPopped); if (mHudHiders.Num() == 0) { mHud->SetVisibility(ESlateVisibility::HitTestInvisible); } } } else if (tPopped->IsA<UBsUIPopup>()) { mCurrentPopupLayer--; } tPopped->OnUIClosed.Broadcast(); tPopped->OnUIClose(); OnPreDestructUI(tPopped); } if(mUIObjectStack.Num() <= 1) { mPlayer->DisableCharacterInput(false); mPlayerController->ResetActionBindings(); } }

Supported Platforms
Xbox One; Xbox 360; Windows; Mac; Linux