Beyond Skyrim: Roscrea - A Large Scale Collaborative Modding Project Releasing An Unofficial Expansion For The Elder Scrolls V: Skyrim

Overview:

During the ongoing production of Beyond Skyrim: Roscrea, I was predominantly a Level Designer who remotely coordinated with a team of lead mod developers, and other level designers to produce an engaging hand-crafted open world and interior levels by implementing what other development teams such as 3D art and Writing produced into a playable world that met the overall project's vision over the course of 5 years. In addition to level design, I also produced a few minor works such as a fully scripted puzzle and the contents of an in-game lorebook.

Platform: PC

Game Engine: Creation (The Elder Scrolls V: Skyrim fork)

Duration: Five Years

Team Size: 50+

Roles:

Project Trailer:

Project Roles:

  • Tasked with creating sections of the open-world exterior & interior dungeon levels that were engaging for players, and aligned with the project’s overall vision as set by the Project Leads.

  • Ensured that every level or exterior section met the needs of the Writing team for quest/narrative implementation, and faithfully represented any in-game descriptions of a location.

  • Maintained cohesion alongside the work of other members of the Level Design team by ensuring that rules regarding the placement of assets did not collide with the work of others, and followed the general rules of the world being built. (where specific types of flora can be placed etc.)

Click for more images.

  • Wrote an in-game lorebook in the form of a tribal folklore story that used animal characters to tie-in the in-game historical content with a mythological origin for behaviors seen in the species of the characters.

  • Ensured the lorebook correctly depicted the in-game history developed by the Writing team.

Click to expand text.

The Fox and Bear

Translated and Written by: St. Cato 3e 277

Compiled and Transcribed by: F. Buccio of Craneshore 4e 82

-

Once, on a warm short-summer's evening, the two companions; Fox and Bear were sunbathing at their favorite spot. Dozing the day away atop a flat rock that sat in a clearing of the forest.

The two had spent the entire morning hunting and fishing, and both had been very successful.

Fox had managed to track a hare back to its den and had eaten the whole lot.

Bear had stood atop a waterfall belonging to a nearby stream and caught five salmon as they tried to jump past him.

Perched atop the highest mountain, Dragon had watched with envy all day at Fox and Bear's good fortune.

Dragon too had spent the morning hunting; but since he felt that anything down below the mountain was beneath him, he had only managed to find and devour three ibex that had been grazing along the mountain slope.

Dragon was still hungry; and after watching Fox and Bear, he was angry.

Flying down from the tops of the mountain, Dragon roared awake the slumbering companions. Fox and Bear were startled to see Dragon hovering above them, petrified by the fear of Dragon’s fiery breath.

"What have we done that has angered you so?" Asked Bear as he looked up at Dragon.

"You both have spent an afternoon of the short-summer sleeping and being slothful with your full bellies!" Answered Dragon. "I have spent the whole day hunting for food and I'm still hungry. Three ibex is not enough!"

"That is because you are so large." Fox chimed from his hiding place beneath Bear.

"That's right. Even just one ibex would sate Fox and I, and if you would come down from the mountain you could find other things to eat besides ibex." Added Bear.

Dragon snarled at the pair's comments, a small puff of flame exiting his flared nostrils.

"Do not insult me! For you know that only the mountains are worthy of me!" Dragon's eyes glaring at Bear and Fox.

"I am the strongest. So why should I have to spend the whole day hunting for myself? That is why from this day forth every kill you make will be left on this rock for me to eat. When I am satisfied you will be able to eat the rest."

Bear's nostrils now too flared with anger at Dragon's unjust proclamation; but before Bear could say something in retort, Fox poked his head out from under Bear and spoke.

"Of course mighty Dragon, we can do this for you."

Dragon bared his maw with a smile. "Good. I'll be here tomorrow for my supper."

The last words but trailing as Dragon lifted off back up to the top of the mountain.

The next day, Fox and Bear had awoken early to get started on their hunts, and it went well. This time Bear managed to catch seven salmon from the waterfall, and Fox had dug out a whole warren of mice. Both placed their catches out on their rock.

Not soon after, Dragon flew down from the mountains and landed on the other end of the flat rock. He inspected the stack of fish and mice before gobbling them all up.

"Hey! You ate it all! What will we eat?" Asked Bear as he looked at where his fish had once been.

"I am still unsatisfied. Do better tomorrow and you may eat." Replied Dragon uncaringly, before he pushed off the ground with his mighty wings back up to the top of the mountain.

Going to bed hungry that night, Fox and Bear vowed to redouble their efforts, but like the first day, Dragon ate everything that they had brought. So Fox and Bear went to bed very hungry that second night.

The next morning, before even the sun had risen, Bear was awoken by the sound of Fox's words being whispered into one of his ears.

"Wake up Bear. Don't worry, we'll eat tonight. I've got a plan!"

"It's still dark, why do you wake me Fox?" Asked Bear.

"Because, we need to start hunting now, before the sun rises." Answered Fox. "Bring anything you've caught from the stream to me before the sun rises."

"Why? we're supposed to bring anything we catch to the flat rock Fox."

"Ah…" Sounded Fox. "We only have to bring our kills during the day, when Dragon can watch us; but at night when he cannot see us, we can eat what we catch."

From then on Fox and Bear would hunt mostly during the night and morning. A tradition maintained by their descendants to this very day.

  • Designed and scripted a new type of puzzle that wouldn't confuse players by ensuring a similar user-experience with how players interacted with pre-existing puzzles.

  • Scripted the puzzle to be malleable so that other level designers could more easily incorporate it into other dungeons.

  • Ensured that the puzzle gave players positive and negative feedback when a correct or incorrect solution were inputted.

Click to expand text.

  
  Scriptname RosSwordsInStoneManager extends ObjectReference  
{Activator for the 'Sword in the Stone' puzzle in RosSecretAtmoranTempleInt03.}

Weapon property ROSMQ11PuzzleSword01 Auto
{The first listed sword that the player can put into one of the activators.}

Weapon property ROSMQ11PuzzleSword02 Auto
{The second listed sword that the player can put into one of the activators.}

Weapon property ROSMQ11PuzzleSword03 Auto
{The third listed sword that the player can put into one of the activators.}

Weapon property ROSMQ11PuzzleSword04 Auto
{The forth listed sword that the player can put into one of the activators.}

Message property NoSwordMessage Auto
{Message for when there is none of the swords.}

Message property RosSwordsPuzzleSlot1Menu Auto
{Menu for slot 1.}

Message property RosSwordsPuzzleSlot2Menu Auto
{Menu for slot 2.}

Message property RosSwordsPuzzleSlot3Menu Auto
{Menu for slot 3.}

Message property RosSwordsPuzzleSlot4Menu Auto
{Menu for slot 4.}

ObjectReference property RosSwordPuzzleSwordActivator1 Auto
{The invisible box activator.}

ObjectReference property RosSwordPuzzleSwordActivator2 Auto
{The invisible box activator.}

ObjectReference property RosSwordPuzzleSwordActivator3 Auto
{The invisible box activator.}

ObjectReference property RosSwordPuzzleSwordActivator4 Auto
{The invisible box activator.}

ObjectReference property ROSMQ11PuzzleSword01aActivator Auto
{The sword activator for sword 1 in the "RosSwordPuzzleSwordActivator1" slot.}

ObjectReference property ROSMQ11PuzzleSword01bActivator Auto
{The sword activator for sword 2 in the "RosSwordPuzzleSwordActivator1" slot.}

ObjectReference property ROSMQ11PuzzleSword01cActivator Auto
{The sword activator for sword 3 in the "RosSwordPuzzleSwordActivator1" slot.}

ObjectReference property ROSMQ11PuzzleSword01dActivator Auto
{The sword activator for sword 4 in the "RosSwordPuzzleSwordActivator1" slot.}

ObjectReference property ROSMQ11PuzzleSword02aActivator Auto
{The sword activator for sword 1 in the "RosSwordPuzzleSwordActivator2" slot.}

ObjectReference property ROSMQ11PuzzleSword02bActivator Auto
{The sword activator for sword 2 in the "RosSwordPuzzleSwordActivator2" slot.}

ObjectReference property ROSMQ11PuzzleSword02cActivator Auto
{The sword activator for sword 3 in the "RosSwordPuzzleSwordActivator2" slot.}

ObjectReference property ROSMQ11PuzzleSword02dActivator Auto
{The sword activator for sword 4 in the "RosSwordPuzzleSwordActivator2" slot.}

ObjectReference property ROSMQ11PuzzleSword03aActivator Auto
{The sword activator for sword 1 in the "RosSwordPuzzleSwordActivator3" slot.}

ObjectReference property ROSMQ11PuzzleSword03bActivator Auto
{The sword activator for sword 2 in the "RosSwordPuzzleSwordActivator3" slot.}

ObjectReference property ROSMQ11PuzzleSword03cActivator Auto
{The sword activator for sword 3 in the "RosSwordPuzzleSwordActivator3" slot.}

ObjectReference property ROSMQ11PuzzleSword03dActivator Auto
{The sword activator for sword 4 in the "RosSwordPuzzleSwordActivator3" slot.}

ObjectReference property ROSMQ11PuzzleSword04aActivator Auto
{The sword activator for sword 1 in the "RosSwordPuzzleSwordActivator4" slot.}

ObjectReference property ROSMQ11PuzzleSword04bActivator Auto
{The sword activator for sword 2 in the "RosSwordPuzzleSwordActivator4" slot.}

ObjectReference property ROSMQ11PuzzleSword04cActivator Auto
{The sword activator for sword 3 in the "RosSwordPuzzleSwordActivator4" slot.}

ObjectReference property ROSMQ11PuzzleSword04dActivator Auto
{The sword activator for sword 4 in the "RosSwordPuzzleSwordActivator4" slot.}

ObjectReference property LeadPole1 Auto
{The "PortGatePole" that is opened by the trap linker for sword 1.}

ObjectReference property LeadPole2 Auto
{The "PortGatePole" that is opened by the trap linker for sword 2.}

ObjectReference property LeadPole3 Auto
{The "PortGatePole" that is opened by the trap linker for sword 3.}

ObjectReference property LeadPole4 Auto
{The "PortGatePole" that is opened by the trap linker for sword 4.}

ObjectReference property LeadPoleFinal Auto
{The "PortGatePole" that is opened when all 4 swords are placed properly.}

ObjectReference property Trap1 Auto
{The trap that is activated by the trap linker when the wrong sword is placed within sword 1 slot.}

ObjectReference property Trap2 Auto
{The trap that is activated by the trap linker when the wrong sword is placed within sword 2 slot.}

ObjectReference property Trap3 Auto
{The trap that is activated by the trap linker when the wrong sword is placed within sword 3 slot.}

ObjectReference property Trap4 Auto
{The trap that is activated by the trap linker when the wrong sword is placed within sword 4 slot.}

ObjectReference property dustDropFX Auto
{Activates dust drop effects.}

Sound property rumbleSFX Auto
{Sound for the lead poles opening.}

int property sword1State = 0 auto hidden

int property sword2State = 0 auto hidden

int property sword3State = 0 auto hidden

int property sword4State = 0 auto hidden

int property puzzleState = 0 auto hidden

bool oneTimeDustDropCounter = False

Auto State Active
	Event OnActivate(ObjectReference triggerRef)
		gotoState("Busy")
		if (triggerRef == RosSwordPuzzleSwordActivator1)
			ActivateBox1()
		ElseIf (triggerRef == ROSMQ11PuzzleSword01aActivator || triggerRef == ROSMQ11PuzzleSword01bActivator || triggerRef == ROSMQ11PuzzleSword01cActivator || triggerRef == ROSMQ11PuzzleSword01dActivator)
			ActivateSword1(triggerRef)
		ElseIf (triggerRef == RosSwordPuzzleSwordActivator2)
			ActivateBox2()
		ElseIf (triggerRef == ROSMQ11PuzzleSword02aActivator || triggerRef == ROSMQ11PuzzleSword02bActivator || triggerRef == ROSMQ11PuzzleSword02cActivator || triggerRef == ROSMQ11PuzzleSword02dActivator)
			ActivateSword2(triggerRef)
		ElseIf (triggerRef == RosSwordPuzzleSwordActivator3)
			ActivateBox3()
		ElseIf (triggerRef == ROSMQ11PuzzleSword03aActivator || triggerRef == ROSMQ11PuzzleSword03bActivator || triggerRef == ROSMQ11PuzzleSword03cActivator || triggerRef == ROSMQ11PuzzleSword03dActivator)
			ActivateSword3(triggerRef)
		ElseIf (triggerRef == RosSwordPuzzleSwordActivator4)
			ActivateBox4()
		ElseIf (triggerRef == ROSMQ11PuzzleSword04aActivator || triggerRef == ROSMQ11PuzzleSword04bActivator || triggerRef == ROSMQ11PuzzleSword04cActivator || triggerRef == ROSMQ11PuzzleSword04dActivator)
			ActivateSword4(triggerRef)
		EndIf
		gotoState("Active")
	EndEvent
EndState

State Busy
	Event OnActivate(ObjectReference triggerRef)
		
	EndEvent
EndState

;If the player has activated the invisible trigger box1, handle that activation.
Function ActivateBox1(Bool swordMenu1 = False, Int aiButton = 0)
	;Does the player have one of the swords we're looking for?
	bool hasSword = (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword01) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword02) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword03) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword04) > 0)
	if (!hasSword)
		NoSwordMessage.Show()
	Else
		swordMenu1 = True
	EndIf
	While swordMenu1
		If aiButton != -1	
			aiButton = RosSwordsPuzzleSlot1Menu.Show()
			swordMenu1 = False
			If aiButton == 0 ; Sword1
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword01) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword01, 1, True)
					RosSwordPuzzleSwordActivator1.Disable()
					ROSMQ11PuzzleSword01aActivator.Enable()
				EndIf
				LeadPole1.Activate(Self)
				sword1State = 1
			ElseIf aiButton == 1 ; Sword2
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword02) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword02, 1, True)
					RosSwordPuzzleSwordActivator1.Disable()
					ROSMQ11PuzzleSword01bActivator.Enable()
				EndIf
				Trap1.Activate(Self)
			ElseIf aiButton == 2 ; Sword3
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword03) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword03, 1, True)
					RosSwordPuzzleSwordActivator1.Disable()
					ROSMQ11PuzzleSword01cActivator.Enable()
				EndIf
				Trap1.Activate(Self)
			ElseIf aiButton == 3 ; Sword4
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword04) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword04, 1, True)
					RosSwordPuzzleSwordActivator1.Disable()
					ROSMQ11PuzzleSword01dActivator.Enable()
				EndIf
				Trap1.Activate(Self)
			ElseIf aiButton == 4 ; None
				swordMenu1 = False
			EndIf
		EndIf
	EndWhile
	If (sword1State == 1 && sword2State == 1 && sword3State == 1 && sword4State == 1)
		puzzleState = 1
		Utility.Wait(1)
		rumbleSFX.Play(LeadPoleFinal)
		If (!oneTimeDustDropCounter)
			dustDropFX.Activate(Self)
			oneTimeDustDropCounter = True
		EndIf
		Utility.Wait(2.5)
		LeadPoleFinal.Activate(Self)
	EndIf
EndFunction

Function ActivateBox2(Bool swordMenu2 = False, Int aiButton = 0)
	;Does the player have one of the swords we're looking for?
	bool hasSword = (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword01) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword02) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword03) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword04) > 0)
	if (!hasSword)
		NoSwordMessage.Show()
	Else
		swordMenu2 = True
	EndIf
	While swordMenu2
		If aiButton != -1	
			aiButton = RosSwordsPuzzleSlot2Menu.Show()
			swordMenu2 = False
			If aiButton == 0 ; Sword1
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword01) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword01, 1, True)
					RosSwordPuzzleSwordActivator2.Disable()
					ROSMQ11PuzzleSword02aActivator.Enable()
				EndIf
				Trap2.Activate(Self)
			ElseIf aiButton == 1 ; Sword2
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword02) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword02, 1, True)
					RosSwordPuzzleSwordActivator2.Disable()
					ROSMQ11PuzzleSword02bActivator.Enable()
				EndIf
				LeadPole2.Activate(Self)
				sword2State = 1
			ElseIf aiButton == 2 ; Sword3
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword03) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword03, 1, True)
					RosSwordPuzzleSwordActivator2.Disable()
					ROSMQ11PuzzleSword02cActivator.Enable()
				EndIf
				Trap2.Activate(Self)
			ElseIf aiButton == 3 ; Sword4
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword04) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword04, 1, True)
					RosSwordPuzzleSwordActivator2.Disable()
					ROSMQ11PuzzleSword02dActivator.Enable()
				EndIf
				Trap2.Activate(Self)
			ElseIf aiButton == 4 ; None
				swordMenu2 = False
			EndIf
		EndIf
	EndWhile
	If (sword1State == 1 && sword2State == 1 && sword3State == 1 && sword4State == 1)
		puzzleState = 1
		Utility.Wait(1)
		rumbleSFX.Play(LeadPoleFinal)
		If (!oneTimeDustDropCounter)
			dustDropFX.Activate(Self)
			oneTimeDustDropCounter = True
		EndIf
		Utility.Wait(2.5)
		LeadPoleFinal.Activate(Self)
	EndIf
EndFunction

Function ActivateBox3(Bool swordMenu3 = False, Int aiButton = 0)
	;Does the player have one of the swords we're looking for?
	bool hasSword = (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword01) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword02) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword03) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword04) > 0)
	if (!hasSword)
		NoSwordMessage.Show()
	Else
		swordMenu3 = True
	EndIf
	While swordMenu3
		If aiButton != -1	
			aiButton = RosSwordsPuzzleSlot3Menu.Show()
			swordMenu3 = False
			If aiButton == 0 ; Sword1
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword01) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword01, 1, True)
					RosSwordPuzzleSwordActivator3.Disable()
					ROSMQ11PuzzleSword03aActivator.Enable()
				EndIf
				Trap3.Activate(Self)
			ElseIf aiButton == 1 ; Sword2
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword02) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword02, 1, True)
					RosSwordPuzzleSwordActivator3.Disable()
					ROSMQ11PuzzleSword03bActivator.Enable()
				EndIf
				Trap3.Activate(Self)
			ElseIf aiButton == 2 ; Sword3
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword03) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword03, 1, True)
					RosSwordPuzzleSwordActivator3.Disable()
					ROSMQ11PuzzleSword03cActivator.Enable()
				EndIf
				LeadPole3.Activate(Self)
				sword3State = 1
			ElseIf aiButton == 3 ; Sword4
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword04) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword04, 1, True)
					RosSwordPuzzleSwordActivator3.Disable()
					ROSMQ11PuzzleSword03dActivator.Enable()
				EndIf
				Trap3.Activate(Self)
			ElseIf aiButton == 4 ; None
				swordMenu3 = False
			EndIf
		EndIf
	EndWhile
	If (sword1State == 1 && sword2State == 1 && sword3State == 1 && sword4State == 1)
		puzzleState = 1
		Utility.Wait(1)
		rumbleSFX.Play(LeadPoleFinal)
		If (!oneTimeDustDropCounter)
			dustDropFX.Activate(Self)
			oneTimeDustDropCounter = True
		EndIf
		Utility.Wait(2.5)
		LeadPoleFinal.Activate(Self)
	EndIf
EndFunction

Function ActivateBox4(Bool swordMenu4 = False, Int aiButton = 0)
	;Does the player have one of the swords we're looking for?
	bool hasSword = (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword01) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword02) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword03) > 0 || Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword04) > 0)
	if (!hasSword)
		NoSwordMessage.Show()
	Else
		swordMenu4 = True
	EndIf
	While swordMenu4
		If aiButton != -1	
			aiButton = RosSwordsPuzzleSlot4Menu.Show()
			swordMenu4 = False
			If aiButton == 0 ; Sword1
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword01) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword01, 1, True)
					RosSwordPuzzleSwordActivator4.Disable()
					ROSMQ11PuzzleSword04aActivator.Enable()
				EndIf
				Trap4.Activate(Self)
			ElseIf aiButton == 1 ; Sword2
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword02) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword02, 1, True)
					RosSwordPuzzleSwordActivator4.Disable()
					ROSMQ11PuzzleSword04bActivator.Enable()
				EndIf
				Trap4.Activate(Self)
			ElseIf aiButton == 2 ; Sword3
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword03) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword03, 1, True)
					RosSwordPuzzleSwordActivator4.Disable()
					ROSMQ11PuzzleSword04cActivator.Enable()
				EndIf
				Trap4.Activate(Self)
			ElseIf aiButton == 3 ; Sword4
				if (Game.GetPlayer().GetItemCount(ROSMQ11PuzzleSword04) > 0)
					Game.GetPlayer().RemoveItem(ROSMQ11PuzzleSword04, 1, True)
					RosSwordPuzzleSwordActivator4.Disable()
					ROSMQ11PuzzleSword04dActivator.Enable()
				EndIf
				LeadPole4.Activate(Self)
				sword4State = 1
			ElseIf aiButton == 4 ; None
				swordMenu4 = False
			EndIf
		EndIf
	EndWhile
	If (sword1State == 1 && sword2State == 1 && sword3State == 1 && sword4State == 1)
		puzzleState = 1
		Utility.Wait(1)
		rumbleSFX.Play(LeadPoleFinal)
		If (!oneTimeDustDropCounter)
			dustDropFX.Activate(Self)
			oneTimeDustDropCounter = True
		EndIf
		Utility.Wait(2.5)
		LeadPoleFinal.Activate(Self)
	EndIf
EndFunction

Function ActivateSword1(ObjectReference triggerRef)
; 	;Debug.Trace("Activating sword. " + triggerRef + " " + LeadPole1.GetOpenState())
	If (!(LeadPole1.GetOpenState() == 2 || LeadPole1.GetOpenState() == 4))
		if (triggerRef == ROSMQ11PuzzleSword01aActivator)
			If (sword1State == 1 && sword2State == 1 && sword3State == 1 && sword4State == 1)
				LeadPoleFinal.Activate(Self)
				puzzleState = 0
			EndIf
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword01, 1, False)
			RosSwordPuzzleSwordActivator1.Enable()
			ROSMQ11PuzzleSword01aActivator.Disable()
			LeadPole1.Activate(Self)
			sword1State = 0
		ElseIf (triggerRef == ROSMQ11PuzzleSword01bActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword02, 1, False)
			RosSwordPuzzleSwordActivator1.Enable()
			ROSMQ11PuzzleSword01bActivator.Disable()
		ElseIf (triggerRef == ROSMQ11PuzzleSword01cActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword03, 1, False)
			RosSwordPuzzleSwordActivator1.Enable()
			ROSMQ11PuzzleSword01cActivator.Disable()
		ElseIf (triggerRef == ROSMQ11PuzzleSword01dActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword04, 1, False)
			RosSwordPuzzleSwordActivator1.Enable()
			ROSMQ11PuzzleSword01dActivator.Disable()
		EndIf
	EndIf
EndFunction

Function ActivateSword2(ObjectReference triggerRef)
; 	;Debug.Trace("Activating sword. " + triggerRef + " " + LeadPole2.GetOpenState())
	If (!(LeadPole2.GetOpenState() == 2 || LeadPole2.GetOpenState() == 4))
		if (triggerRef == ROSMQ11PuzzleSword02aActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword01, 1, False)
			RosSwordPuzzleSwordActivator2.Enable()
			ROSMQ11PuzzleSword02aActivator.Disable()
		ElseIf (triggerRef == ROSMQ11PuzzleSword02bActivator)
			If (sword1State == 1 && sword2State == 1 && sword3State == 1 && sword4State == 1)
				LeadPoleFinal.Activate(Self)
				puzzleState = 0
			EndIf
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword02, 1, False)
			RosSwordPuzzleSwordActivator2.Enable()
			ROSMQ11PuzzleSword02bActivator.Disable()
			LeadPole2.Activate(Self)
			sword2State = 0
		ElseIf (triggerRef == ROSMQ11PuzzleSword02cActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword03, 1, False)
			RosSwordPuzzleSwordActivator2.Enable()
			ROSMQ11PuzzleSword02cActivator.Disable()
		ElseIf (triggerRef == ROSMQ11PuzzleSword02dActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword04, 1, False)
			RosSwordPuzzleSwordActivator2.Enable()
			ROSMQ11PuzzleSword02dActivator.Disable()
		EndIf
	EndIf
EndFunction

Function ActivateSword3(ObjectReference triggerRef)
; 	;Debug.Trace("Activating sword. " + triggerRef + " " + LeadPole3.GetOpenState())
	If (!(LeadPole3.GetOpenState() == 2 || LeadPole3.GetOpenState() == 4))
		if (triggerRef == ROSMQ11PuzzleSword03aActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword01, 1, False)
			RosSwordPuzzleSwordActivator3.Enable()
			ROSMQ11PuzzleSword03aActivator.Disable()
		ElseIf (triggerRef == ROSMQ11PuzzleSword03bActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword02, 1, False)
			RosSwordPuzzleSwordActivator3.Enable()
			ROSMQ11PuzzleSword03bActivator.Disable()
		ElseIf (triggerRef == ROSMQ11PuzzleSword03cActivator)
			If (sword1State == 1 && sword2State == 1 && sword3State == 1 && sword4State == 1)
				LeadPoleFinal.Activate(Self)
				puzzleState = 0
			EndIf
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword03, 1, False)
			RosSwordPuzzleSwordActivator3.Enable()
			ROSMQ11PuzzleSword03cActivator.Disable()
			LeadPole3.Activate(Self)
			sword3State = 0
		ElseIf (triggerRef == ROSMQ11PuzzleSword03dActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword04, 1, False)
			RosSwordPuzzleSwordActivator3.Enable()
			ROSMQ11PuzzleSword03dActivator.Disable()
		EndIf
	EndIf
EndFunction

Function ActivateSword4(ObjectReference triggerRef)
; 	;Debug.Trace("Activating sword. " + triggerRef + " " + LeadPole4.GetOpenState())
	If (!(LeadPole4.GetOpenState() == 2 || LeadPole4.GetOpenState() == 4))
		if (triggerRef == ROSMQ11PuzzleSword04aActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword01, 1, False)
			RosSwordPuzzleSwordActivator4.Enable()
			ROSMQ11PuzzleSword04aActivator.Disable()
		ElseIf (triggerRef == ROSMQ11PuzzleSword04bActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword02, 1, False)
			RosSwordPuzzleSwordActivator4.Enable()
			ROSMQ11PuzzleSword04bActivator.Disable()
		ElseIf (triggerRef == ROSMQ11PuzzleSword04cActivator)
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword03, 1, False)
			RosSwordPuzzleSwordActivator4.Enable()
			ROSMQ11PuzzleSword04cActivator.Disable()
		ElseIf (triggerRef == ROSMQ11PuzzleSword04dActivator)
			If (sword1State == 1 && sword2State == 1 && sword3State == 1 && sword4State == 1)
				LeadPoleFinal.Activate(Self)
				puzzleState = 0
			EndIf
			Game.GetPlayer().AddItem(ROSMQ11PuzzleSword04, 1, False)
			RosSwordPuzzleSwordActivator4.Enable()
			ROSMQ11PuzzleSword04dActivator.Disable()
			LeadPole4.Activate(Self)
			sword4State = 0
		EndIf
	EndIf
EndFunction



  

Post-Mortem:

I gained a lot of experience from working on the Beyond Skyrim: Roscrea project. The large size and remote nature of the development team was something that my education had not fully prepared me for. I initially found the various discipline teams to be rather isolated from each other, rarely communicating with other developers outside their own disciplinary bubble. When issues would arise, and completed work needed to be edited or redone, I attributed those failures to the lack of cross-communication between the teams.

Before joining the Roscrea team I had never worked on a project with a team of more than 8 members strong, where everybody participated in meetings regardless of whether it was relevant to their discipline or not. Everyone got a say, and everyone was kept up to date on any changes being made. Later on into development I became more accustomed to working within a larger production, I began to recognize that my previous experience with a “communal” style of productions would not work for the Roscrea project and it's larger and fully remote development team.

Note: All screenshots and the video reflect the work of the entire team (Programming, Art, Design, FX, SFX, etc).