A Creative Device forged on Verse Island
Grove Whittler's Rising Totem
forged by RinEllaSky ✓ compiles
◈ Forged at Codewood Bear's Grove Whittler
III
✓
Compiles
Grove Whittler's Rising Totem
Combines the Map Controller Device · Combines the Campfire Device
3 devices
codewood-bear says“Light the campfire and the grove wakes up — the mini-map opens to show your ritual ground, and every time the fire's warmth pulses over you, the mossy stump behind it physically rises a little higher, carving itself into a totem stage by stage. If you've got a carve trigger wired to a lever or altar nearby, pull it to skip straight to the next stage and feed the fire more wood as thanks. Finish all four stages and the totem stands complete, the map closes, and the fire extinguishes itself — but if the flame ever dies early, the stump sinks back down and you'll have to relight it and start the carving again. It's a neat, hands-on way to see the scene graph in action: the device you're scripting IS the entity that moves in the world.”
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Game }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /UnrealEngine.com/Temporary/Diagnostics }
# The Grove Whittler: a stump that carves itself into a totem as the campfire warms it.
grove_whittler_device := class(creative_device):
# The campfire that must be lit and kept warm to drive the ritual forward.
@editable
Campfire : campfire_device = campfire_device{}
# Reveals the hidden grove on the minimap while the ritual is active.
@editable
MapController : map_controller_device = map_controller_device{}
# A mastered trigger the whittler can wire to a lever/altar elsewhere to instantly carve a stage.
@editable
CarveTrigger : trigger_device = trigger_device{}
# How many carved stages make a finished totem.
TotalStages : int = 4
# How many campfire pulses are needed to carve one stage.
PulsesPerStage : int = 3
# How far (cm) the stump rises into the air per stage carved.
RiseHeight : float = 60.0
# Live ritual state.
var CurrentStage : int = 0
var PulseCount : int = 0
var RisenHeight : float = 0.0
var RitualAgent : ?agent = false
OnBegin<override>()<suspends> : void =
# Lighting the fire kicks off the ritual and reveals the grove on the map.
Campfire.LitEvent.Subscribe(OnLit)
# Letting the fire die resets the whittling progress.
Campfire.ExtinguishedEvent.Subscribe(OnExtinguished)
# Standing near the fire while it pulses slowly carves the stump.
Campfire.AgentPulsedEvent.Subscribe(OnPulse)
# A carve trigger (lever, altar, etc.) instantly finishes a stage.
CarveTrigger.TriggeredEvent.Subscribe(OnCarveTrigger)
OnLit(Agent : agent) : void =
set RitualAgent = option{Agent}
set CurrentStage = 0
set PulseCount = 0
MapController.Activate(Agent)
MapController.SetCaptureBoxSize(600.0)
Print("The grove wakes! Stay warm by the fire - it takes {PulsesPerStage} pulses to carve each of {TotalStages} stages.", ?Duration := 5.0)
OnExtinguished(Agent : agent) : void =
Print("The fire gutters out... the half-carved totem settles back into the moss.", ?Duration := 4.0)
MapController.Deactivate(Agent)
set RitualAgent = false
spawn{ResetStump()}
OnPulse(Agent : agent) : void =
if (CurrentStage < TotalStages):
set PulseCount += 1
Print("The wood warms... ({PulseCount}/{PulsesPerStage})", ?Duration := 2.0)
if (PulseCount >= PulsesPerStage):
AdvanceStage(Agent)
OnCarveTrigger(MaybeAgent : ?agent) : void =
if (CurrentStage < TotalStages, Agent := MaybeAgent?):
Print("You carve deep into the grain - a whole stage, done in one stroke!", ?Duration := 3.0)
Campfire.AddWood()
AdvanceStage(Agent)
AdvanceStage(Agent : agent) : void =
set CurrentStage += 1
set PulseCount = 0
spawn{RiseStump()}
if (CurrentStage >= TotalStages):
Print("The totem stands complete! Codewood Bear would be proud.", ?Duration := 6.0)
MapController.Deactivate(Agent)
Campfire.Extinguish(Agent)
else:
StagesLeft : int = TotalStages - CurrentStage
Print("Stage {CurrentStage} carved! {StagesLeft} to go.", ?Duration := 4.0)
# Moves this very device upward, one carved stage at a time - the scene graph made visible.
RiseStump()<suspends> : void =
T : transform = GetTransform()
NewPos : vector3 = T.Translation + vector3{X := 0.0, Y := 0.0, Z := RiseHeight}
set RisenHeight += RiseHeight
MoveTo(NewPos, T.Rotation, 1.5)
# Settles the stump back down to its resting height when the fire goes out.
ResetStump()<suspends> : void =
T : transform = GetTransform()
NewPos : vector3 = T.Translation - vector3{X := 0.0, Y := 0.0, Z := RisenHeight}
MoveTo(NewPos, T.Rotation, 2.0)
set RisenHeight = 0.0
🌴 Forge your own free at verseisland.com — code G4EFENS, credits for us both
🧭 Join with G4EFENS — you both earn starter coconuts
🌴 Forged on Verse Island — free UEFN/Verse learning + a keeper’s Combine Lab.