Sean W. Anderson — Game Design Portfolio

Sean W. Anderson

Deirge Cathedral

This mod was officially featured on Bethesda’s community channels on October 2020.

Summary

A mass of stone and stained glass, Deirge Cathedral lies off of the coast of Skyrim’s northern shore. The area is incredibly dark, and the player must rely on torches or magical sources of light to navigate around. Within the vampire-infested building that has been neglected for far too long is a nave that acts as the main hub for my dungeon mod, Red Flame. It is here, encased by pillars and a vaulted ceiling, that the climax of the dungeon and the final encounter with two horrors from Oblivion take place.

Coming out from the narthex, the player is greeted by the vastness of the stone structure. Housed inside the nave is an organ, rows upon rows of pews, an altar, two baptismal fonts, and two confession rooms. Directly ahead, down the center aisle, is a mysterious circle of candles with blood splattered all about the marble tiles. Pews have been haphazardly pushed aside to make way for the ritualistic circle.

Figures 1-1 through 1-6 show different angles of the nave in topographic and isometric views.

Exploring the center of the cathedral, the player ascends the back of the nave and up into the organ gallery. The organ is essential to this dungeon and is used to spawn the bosses. At the moment, the player lacks what is needed. By examining the organs parts and fiddling with the draw knobs, the player gets a cryptic clue about what needs to be found to spring the organ to life: a hymn book.

The first thing the player might do is examine the keyboard. When it is initiated, a script is run.

ScriptName REDOrganMusicScript extends ObjectReference

Book Property HymnBook Auto
{The book item.}
Message Property HymnBookMissingMessage Auto
{The message to display to the player to tell them that they are missing something.}
ObjectReference Property HymnBookContainer Auto
{The container hidden under the floor.}
ObjectReference Property HymnBookStaticRef Auto
{The static version of the book that is placed above the keyboard.}

Event OnActivate()
  if (HymnBookContainer.GetItemCount(HymnBook) < 1) && (Game.GetPlayer().GetItemCount(HymnBook) < 1)
    HymnBookMissingMessage.Show()
  else
    Game.GetPlayer().RemoveItem(HymnBook, 1, false, HymnBookContainer)
    HymnBookStaticRef.Enable(true)
    Disable()
    Delete()
  endif
EndEvent

The script immediately checks for two things: one, whether the player has the hymn book in their inventory, and two, whether a container hidden out of sight has the hymn book within it. This container is located under the floor of the organ and unreachable by the player. If the book does not exist in both of these inventories, a message pops up telling the player that they are missing something. If, however, the check returns false, the hymn book is removed from the player’s inventory and passes into the container. This acts as another level of security for the script as we can check the container at any time for the book. Never underestimate a player’s orneriness or ability to break a game.

Next, the script enables a static version of the book upon the organ’s book rest. The last thing that happens is the script disables and deletes the trigger box as it is no longer needed.

Figure 2-1 shows the trigger box as a salmon-colored primitive surrounding the keyboard. Figure 2-2 shows HymnBookContainer under the organ.

When the hymn book has been removed from the player’s inventory and into the container, the organ can now be initiated by turning the red valve nestled on the right side among draw knobs. Another script is run much like the keyboard’s script.

ScriptName REDOrganSwitchScript extends ObjectReference

Book Property HymnBook Auto
{The same book from the previous script.}
Explosion Property BossExplosion Auto
{The explosion effect that plays when the bosses appear.}
ObjectReference Property BurnedBookRef Auto
{The book that is enabled when HymnBookStaticRef is disabled.}
ObjectReference Property DisableLightsMarker Auto
{Marker to disable things that are enabled.}
ObjectReference Property EnableBossMarker Auto
{Marker to enable swords and bosses.}
ObjectReference Property EnableLightsMarker Auto
{Marker to enable things that are disabled.}
ObjectReference Property ExplosionRef Auto
{The location in 3D space where BossExplosion plays.}
ObjectReference Property FireEffectRef Auto
{The animated object that "burns" HymnBookStaticRef.}
ObjectReference Property HymnBookContainer Auto
{The same container from the previous script.}
ObjectReference Property HymnBookStaticRef Auto
{The same static from the previous script.}
ObjectReference Property OrganMusicRef Auto
{The location in 3D space where the music will play from.}
Message Property HymnBookMissingMessage Auto
{The same message from the previous script.}
Message Property OrganUnresponsiveMessage Auto
{The message that is displayed when trying to reactivate the organ.}
Sound Property OrganMusic Auto
{The music sound effect.}

Bool bDoOnce = false

Event OnActivate()
  if (HymnBookContainer.GetItemCount(HymnBook) > 0) && bDoOnce == true
    OrganUnresponsiveMessage.Show()
  elseif (HymnBookContainer.GetItemCount(HymnBook) < 1)
    HymnBookMissingMessage.Show()
  elseif (HymnBookContainer.GetItemCount(HymnBook) > 0) && bDoOnce == false
    Game.DisablePlayerControls(0, 0, 0, 0, 0, 1, 1)
    bDoOnce = true
    PlayOrgan()
  endif
EndEvent

Function PlayOrgan()
  if OrganMusic.PlayAndWait(OrganMusicRef)
    Debug.Trace("Organ has finished playing!")
    FireEffectRef.Enable()
    Utility.Wait(2.0)
    HymnBookStaticRef.Disable()
    HymnBookStaticRef.Delete()
    BurnedBookRef.Enable()
    FireEffectRef.Disable()
    FireEffectRef.Delete()
    DisableLightsMarker.Disable()
    EnableLightsMarker.Enable()
    ExplosionRef.PlaceAtMe(BossExplosion)
    EnableBossMarker.Enable()
    Game.EnablePlayerControls()
    GotoState("Done")
  else
    Debug.Trace("Organ failed to play!")
  endif
EndFunction

State Done
EndState

Rather than check for the hymn book not existing in the container and the player’s inventory, the script first checks for the existence of the book within the container and if a boolean variable bDoOnce is true. If it all returns true, this means that the script has already run to completion, and the player has finished the dungeon. If it is false, another check is made to see if the book is in HymnBookContainer. If it is not, this means either the player does not have it or has not activated the keyboard with the book in hand. If the book is inside the container and the variable bDoOnce is false, the boss encounter begins: some player controls are disabled, bDoOnce is set to true, and the function PlayOrgan is called.

Within PlayOrgan, a chain of enabling and disabling occurs after the organ music finishes playing. It first activates a flaming effect on top of the static hymn book, and this can be seen by the orange square in Figure 2-1. After two seconds of time passes, the static hymn book is removed from the game and replaced with a non-static burned book item. The flame effect is the removed as well. Next, all candle lights are disabled and replaced by a sinister red glow as unlit braziers mysteriously burst into flame. A loud explosion happens at the ritual site under the transept, and the bosses are summoned from Oblivion.

Figure 3-1 highlights EnableLightsMarker, Figure 3-2 is DisableLightsMarker, and Figure 3-3 is EnableBossMarker. The blue lines coming out from them represent what the markers govern and what is enabled or disabled. Figure 3-4 is the site of the bosses.

The reward for solving the puzzle and defeating the bosses are three different weapons sticking out of the embers of the sconce where the bosses first appeared. The player must be careful while trying to grab them, for the ground is still aflame. The salmon-colored sphere in Figure 3-4 is a hazard trigger that lights the player on fire and does damage over time. For difficulty’s sake, the bosses are immune to this damage.

Design

  • Research cathedral architecture and implement traditional characteristics into the levels.

  • Use the Volkihar Keep and Falmer kits to make the cathedral and the Falmer ruins.

  • Place lights sparingly and use thematically appropriate colors to keep the level dusty and dark.

  • Create custom ambient cell lighting and distance fog.

  • Set the cathedral’s music to the Dungeon preset and the acoustic space to the Stone preset.

  • Add appropriate clutter to give off the impression of a lived area and Falmer encroachments.

  • Place animated objects like flames, drips, and flowing water with corresponding sound effects.

  • Retexture and resize NetImmerse model files to create unique and original pieces.

Story

  • Write all books and supplemental material that flesh out the mod.

  • Edit vampire and Falmer AI packages so that they interact with the environment.

Encounters

  • Create navmesh, designate preferred AI paths, and link teleport markers from the previous cells.

  • Stat the final bosses and give them unique spells and abilities.

  • Adjust the AI behavior of the bosses so that they attacks on sight, have a large aggro radius, and will never flee.

Scripts

  • Create original scripts that run throughout the levels and progress to the final confrontation.

  • Reuse on-enter triggers from Skyrim such as changing acoustic space and applying ambient noise, adding first- and third-person camera effects, and playing audio cues.

Playtests

  • Look for spiderwebbing or seams into the void and remedy them.

  • Fix any Z-fighting by adjusting positions of static objects and sub-kits.

  • Install and test on computers with different hardware to check consistency.

  • Receive and integrate feedback from players knowledgeable in the RPG genre.

Download Links