THE WIZARD (#35406)

* Adds Survivor Antag

* Adds Survivor Role

* Adds Survivor Rule ECS, adds a survivor role event, adds make antagonist to  random global spawn spell

* Moves Survivor Ensurecomp to event handler. Makes Add Survivor Role a broadcast. Adds Survivor Component. Removes redundant briefing.

* Adds Survivor Antagonist role type for admins to keep track of this easier, adds it to Survivor.

* Adds access to survivor game rule system

* Adds Survivor Rule

* Adds end of round survivor text

* Adds end of round reporting logic. Adds logic to start the survivor rule.

* Changes desc from centcomm to shuttle

* survivor (S)

* Checks if they're alive on the shuttle instead of centcomm.

* ftl text selection based on number of survivors.

* Removed Survivor Antagonist, replaced it with Free Agent.

* Adds InvalidForGlobalSpawnSpell tag, checks for it on spawnspell, and adds it to a zombified person.

* Changes logic so we launch the game rule if it hasnt launched yet. Moves rule logic starting to server. Moved survivor rule logic out of event and into Start method.

* Fixes invalid entity issue

* Descs for Survivor Rule and Survivor comps

* Moves Survivor Rule to its own yml

* Checks for dead survivors, changes survivor checks for mind. Adds survivor comp to mind to fix any mindswap issues. Same for invalid survivor tag

* Changes shuttle xform call to just mapid

* Protoid fix

* THE WIZARD

* Wizard spawner

* adds the correct state

* Wizard preset and weight

* Fixes wizard rule

* Weight back to 100%

* Adds Random Metadata

* Wizard locs

* Puts requirements in the right place

* Adds wiz ghost spawner and mob

* wizard spawnpoint fix + shuttle mapping

* wizard loadout + fix wizard spawning + wizard random name

* comment

* Adds Wizard testing

* FIXES SHUTTLE ISSUE BASED REI

* THE WIZARD LOBBY SONG. Special thanks to song creator Chris Remo for allowing us to use this.

* Free Objective ECS + Base Free Objective

* Space Wizard Federation for Wiz Obj issuer.

* Wizard Objectives

* Moves wizard shuttle to base wizard rule. Gives Wizard their objectives. Removes WizardRule

* Renames midround to subgamemodes. Adds wizard sub game mode.

* Adds SubWizard to SubGameModesRule. Adds a SubGameMode with no wizard. Adds No SubGamemodeRule for Wizard preset

* Wizard midround event

* Fixes wizard midround

* Wizard Guidebook

* Removes todo

* Fixes text

* Removes wizard rule ECS, not needed

* Wizard jetpack

---------

Co-authored-by: ScarKy0 <scarky0@onet.eu>
Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com>
This commit is contained in:
keronshb
2025-02-26 00:34:07 -05:00
committed by GitHub
parent 6ea742d4b4
commit 68de58eb66
28 changed files with 491 additions and 54 deletions

View File

@@ -1,4 +1,4 @@
using Content.Server.Antag; using Content.Server.Antag;
using Content.Server.GameTicking.Rules.Components; using Content.Server.GameTicking.Rules.Components;
using Content.Server.Mind; using Content.Server.Mind;
using Content.Server.Roles; using Content.Server.Roles;

View File

@@ -0,0 +1,7 @@
namespace Content.Server.Objectives.Components;
/// <summary>
/// A free greentext, that's it.
/// </summary>
[RegisterComponent]
public sealed partial class FreeObjectiveComponent : Component;

View File

@@ -0,0 +1,20 @@
using Content.Server.Objectives.Components;
using Content.Shared.Objectives.Components;
namespace Content.Server.Objectives.Systems;
public sealed class FreeObjectiveSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FreeObjectiveComponent, ObjectiveGetProgressEvent>(OnGetProgress);
}
// You automatically greentext, there's not much else to it
private void OnGetProgress(Entity<FreeObjectiveComponent> ent, ref ObjectiveGetProgressEvent args)
{
args.Progress = 1f;
}
}

View File

@@ -0,0 +1,7 @@
namespace Content.Server.Roles;
/// <summary>
/// Mind role to tag entities that they're a Wizard
/// </summary>
[RegisterComponent]
public sealed partial class WizardRoleComponent : Component;

View File

@@ -14,6 +14,13 @@
source: "https://idlethumbs.bandcamp.com/track/space-asshole" source: "https://idlethumbs.bandcamp.com/track/space-asshole"
# The source is a direct link the the track, but not the "main" bandcamp of the author. Hence the link is also included separately in the copyright. # The source is a direct link the the track, but not the "main" bandcamp of the author. Hence the link is also included separately in the copyright.
- files: ["the_wizard.ogg"]
license: "Custom"
copyright: "The Wizard by Chris Remo is used with special permission from the author, under the condition that the project remains non-commercial and open source. The author also requested that a link to his bandcamp be included: https://chrisremo.bandcamp.com/"
source: "https://idlethumbs.bandcamp.com/track/the-wizard"
# The source is a direct link the the track, but not the "main" bandcamp of the author. Hence the link is also included separately in the copyright.
# Got permission from Chris for this song as well on 02/25/25, requires same attributions
- files: ["absconditus.ogg"] - files: ["absconditus.ogg"]
license: "CC-BY-NC-SA-3.0" license: "CC-BY-NC-SA-3.0"
copyright: "Absconditus by ZhayTee. Converted from MP3 to OGG." copyright: "Absconditus by ZhayTee. Converted from MP3 to OGG."

Binary file not shown.

View File

@@ -1,4 +1,4 @@
## Survivor ## Survivor
roles-antag-survivor-name = Survivor roles-antag-survivor-name = Survivor
# It's a Halo reference # It's a Halo reference
@@ -31,6 +31,23 @@ survivor-round-end-alive-on-shuttle-count =
*[other] [color=green]{$aliveCount}[/color] survivors made it out alive. *[other] [color=green]{$aliveCount}[/color] survivors made it out alive.
} }
## TODO: Wizard ## Wizard
objective-issuer-swf = [color=turquoise]The Space Wizards Federation[/color]
wizard-title = Wizard
wizard-description = There's a Wizard on the station! You never know what they might do.
roles-antag-wizard-name = Wizard
roles-antag-wizard-objective = Teach them a lesson they'll never forget.
wizard-role-greeting =
YER A WIZARD!
There's been tensions between the Space Wizards Federation and NanoTrasen.
So you've been selected by the Space Wizards Federation to pay a visit to the station.
Give them a good demonstration of your powers.
What you do is up to you, just remember the Space Wizards want you to make it out alive.
wizard-round-end-name = wizard
## TODO: Wizard Apprentice (Coming sometime post-wizard release) ## TODO: Wizard Apprentice (Coming sometime post-wizard release)

View File

@@ -315,3 +315,5 @@ ghost-role-information-gingerbread-name = Gingerbread Man
ghost-role-information-gingerbread-description = A being of pure holiday spirit. ghost-role-information-gingerbread-description = A being of pure holiday spirit.
Spread molassesy goodness and to all good cheer. Spread molassesy goodness and to all good cheer.
ghost-role-information-wizard-name = Wizard
ghost-role-information-wizard-desc = YER A WIZARD! Show the station what your magic is made of.

View File

@@ -136,6 +136,7 @@ guide-entry-revolutionaries = Revolutionaries
guide-entry-minor-antagonists = Minor Antagonists guide-entry-minor-antagonists = Minor Antagonists
guide-entry-space-ninja = Space Ninja guide-entry-space-ninja = Space Ninja
guide-entry-thieves = Thieves guide-entry-thieves = Thieves
guide-entry-wizard = Wizard
guide-entry-rules = Server Rules guide-entry-rules = Server Rules
guide-entry-rules-core-only = Core Only Ruleset guide-entry-rules-core-only = Core Only Ruleset

View File

@@ -1,6 +1,17 @@
meta: meta:
format: 6 format: 7
postmapinit: false category: Grid
engineVersion: 247.1.0
forkId: ""
forkVersion: ""
time: 02/23/2025 10:35:57
entityCount: 791
maps: []
grids:
- 768
orphans:
- 768
nullspace: []
tilemap: tilemap:
0: Space 0: Space
23: FloorCaveDrought 23: FloorCaveDrought
@@ -1933,6 +1944,13 @@ entities:
rot: -1.5707963267948966 rad rot: -1.5707963267948966 rad
pos: 5.5,3.5 pos: 5.5,3.5
parent: 768 parent: 768
- proto: ClockworkShield
entities:
- uid: 782
components:
- type: Transform
pos: -2.780127,-2.51509
parent: 768
- proto: ClothingBeltUtilityFilled - proto: ClothingBeltUtilityFilled
entities: entities:
- uid: 635 - uid: 635
@@ -3050,6 +3068,13 @@ entities:
- type: Transform - type: Transform
pos: 2.5,-8.5 pos: 2.5,-8.5
parent: 768 parent: 768
- proto: MirrorShield
entities:
- uid: 783
components:
- type: Transform
pos: 1.3163121,-0.3900899
parent: 768
- proto: NitrogenCanister - proto: NitrogenCanister
entities: entities:
- uid: 601 - uid: 601
@@ -3702,6 +3727,56 @@ entities:
- type: Transform - type: Transform
pos: -4.5,-13.5 pos: -4.5,-13.5
parent: 768 parent: 768
- proto: RandomPosterAny
entities:
- uid: 785
components:
- type: Transform
rot: 3.141592653589793 rad
pos: -6.5,-4.5
parent: 768
- uid: 786
components:
- type: Transform
pos: 4.5,-8.5
parent: 768
- uid: 787
components:
- type: Transform
rot: 3.141592653589793 rad
pos: -1.5,1.5
parent: 768
- uid: 788
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 1.5,3.5
parent: 768
- uid: 789
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: -2.5,6.5
parent: 768
- uid: 790
components:
- type: Transform
rot: 3.141592653589793 rad
pos: -7.5,4.5
parent: 768
- proto: RandomPosterContraband
entities:
- uid: 767
components:
- type: Transform
pos: 0.5,-12.5
parent: 768
- uid: 784
components:
- type: Transform
rot: 3.141592653589793 rad
pos: -3.5,-15.5
parent: 768
- proto: RandomSpawner - proto: RandomSpawner
entities: entities:
- uid: 779 - uid: 779
@@ -3989,6 +4064,14 @@ entities:
- type: Transform - type: Transform
pos: 7.5,3.5 pos: 7.5,3.5
parent: 768 parent: 768
- proto: SalvageHumanCorpseSpawner
entities:
- uid: 791
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 6.5,-1.5
parent: 768
- proto: SinkWide - proto: SinkWide
entities: entities:
- uid: 581 - uid: 581
@@ -4030,14 +4113,7 @@ entities:
- type: Transform - type: Transform
pos: 6.5,-2.5 pos: 6.5,-2.5
parent: 768 parent: 768
- proto: SpawnPointCaptain - proto: SpawnPointWizard
entities:
- uid: 767
components:
- type: Transform
pos: -0.5,-9.5
parent: 768
- proto: SpawnPointLatejoin
entities: entities:
- uid: 762 - uid: 762
components: components:

View File

@@ -272,3 +272,4 @@
- id: OxygenTankFilled - id: OxygenTankFilled
- id: ClothingOuterHardsuitWizard - id: ClothingOuterHardsuitWizard
- id: ClothingMaskBreath - id: ClothingMaskBreath
- id: JetpackVoidFilled

View File

@@ -0,0 +1,11 @@
- type: entity
id: SpawnPointWizard
parent: MarkerBase
name: wizard
components:
- type: SpawnPoint
- type: Sprite
layers:
- state: green
- sprite: Clothing/Head/Hats/wizardhat.rsi
state: icon

View File

@@ -207,4 +207,25 @@
layers: layers:
- state: green - state: green
- sprite: Mobs/Silicon/chassis.rsi - sprite: Mobs/Silicon/chassis.rsi
state: derelict_icon state: derelict_icon
- type: entity
categories: [ HideSpawnMenu, Spawner ]
parent: BaseAntagSpawner
id: SpawnPointGhostWizard
name: ghost role spawn point
suffix: wizard
components:
- type: GhostRole
name: ghost-role-information-wizard-name
description: ghost-role-information-wizard-desc
mindRoles:
- MindRoleGhostRoleSoloAntagonist
raffle:
settings: default
- type: Sprite
sprite: Markers/jobs.rsi
layers:
- state: green
- sprite: Clothing/Head/Hats/wizardhat.rsi
state: icon

View File

@@ -102,3 +102,15 @@
- type: NpcFactionMember - type: NpcFactionMember
factions: factions:
- Syndicate - Syndicate
# Wizard
- type: entity
categories: [ HideSpawnMenu ]
name: Wizard
parent: MobHuman
id: MobHumanWizard
components:
- type: RandomHumanoidAppearance
- type: NpcFactionMember
factions:
- Wizard

View File

@@ -38,6 +38,7 @@
- id: ZombieOutbreak - id: ZombieOutbreak
- id: LoneOpsSpawn - id: LoneOpsSpawn
- id: DerelictCyborgSpawn - id: DerelictCyborgSpawn
- id: WizardSpawn
- type: entity - type: entity
id: BaseStationEvent id: BaseStationEvent
@@ -243,6 +244,44 @@
- type: RandomSpawnRule - type: RandomSpawnRule
prototype: MobRevenant prototype: MobRevenant
- type: entity
parent: BaseWizardRule
id: WizardSpawn
components:
- type: StationEvent
weight: 1 # rare
duration: 1
earliestStart: 30
reoccurrenceDelay: 60
minimumPlayers: 10
- type: AntagSelection
agentName: wizard-round-end-name
definitions:
- spawnerPrototype: SpawnPointGhostWizard
min: 1
max: 1
playerRatio: 1
pickPlayer: false
startingGear: WizardBlueGear
roleLoadout:
- RoleSurvivalExtended
briefing:
text: wizard-role-greeting
color: Turquoise
# TODO: Need Wizard Start sound
#sound: "/Audio/Ambience/Antag/wizard_start.ogg"
# TODO: WizardComp as needed
components:
- type: NpcFactionMember
factions:
- Wizard
- type: RandomMetadata
nameSegments:
- names_wizard_first
- names_wizard_last
mindRoles:
- MindRoleWizard
# disabled until event is rewritten to be more interesting # disabled until event is rewritten to be more interesting
#- type: entity #- type: entity
# id: FalseAlarm # id: FalseAlarm

View File

@@ -1,32 +0,0 @@
- type: entity
parent: BaseGameRule
id: Thief
components:
- type: ThiefRule
- type: AntagObjectives
objectives:
- EscapeThiefShuttleObjective
- type: AntagRandomObjectives
sets:
- groups: ThiefBigObjectiveGroups
prob: 0.7
maxPicks: 1
- groups: ThiefObjectiveGroups
maxPicks: 10
maxDifficulty: 2.5
- type: AntagSelection
agentName: thief-round-end-agent-name
definitions:
- prefRoles: [ Thief ]
max: 3
playerRatio: 15
lateJoinAdditional: true
allowNonHumans: true
multiAntagSetting: NotExclusive
startingGear: ThiefGear
components:
- type: Pacified
mindRoles:
- MindRoleThief
briefing:
sound: "/Audio/Misc/thief_greeting.ogg"

View File

@@ -18,6 +18,17 @@
parent: BaseGameRule parent: BaseGameRule
id: SubGamemodesRule id: SubGamemodesRule
components: components:
- type: SubGamemodes
rules:
- id: Thief
prob: 0.5
- id: SubWizard
prob: 0.05
- type: entity
parent: BaseGameRule
id: SubGamemodesRuleNoWizard
components:
- type: SubGamemodes - type: SubGamemodes
rules: rules:
- id: Thief - id: Thief
@@ -238,6 +249,56 @@
components: components:
- type: SecretRule - type: SecretRule
- type: entity
abstract: true
parent: BaseGameRule
id: BaseWizardRule
components:
- type: AntagObjectives
objectives:
- WizardSurviveObjective
- WizardDemonstrateObjective
- type: LoadMapRule
gridPath: /Maps/Shuttles/wizard.yml
- type: RuleGrids
- type: AntagSelection
- type: AntagLoadProfileRule
speciesOverride: Human
- type: entity
parent: BaseWizardRule
id: Wizard
components:
- type: GameRule
minPlayers: 10
- type: AntagSelection
agentName: wizard-round-end-name
selectionTime: PrePlayerSpawn
definitions:
- prefRoles: [ Wizard ]
max: 1
playerRatio: 1
spawnerPrototype: SpawnPointGhostWizard
roleLoadout:
- RoleSurvivalExtended
briefing:
text: wizard-role-greeting
color: Turquoise
# TODO: Need Wizard Start sound
#sound: "/Audio/Ambience/Antag/wizard_start.ogg"
startingGear: WizardBlueGear
# TODO: WizardComp as needed
components:
- type: NpcFactionMember
factions:
- Wizard
- type: RandomMetadata
nameSegments:
- names_wizard_first
- names_wizard_last
mindRoles:
- MindRoleWizard
- type: entity - type: entity
id: Zombie id: Zombie
parent: BaseGameRule parent: BaseGameRule

View File

@@ -0,0 +1,66 @@
- type: entity
parent: BaseGameRule
id: Thief
components:
- type: ThiefRule
- type: AntagObjectives
objectives:
- EscapeThiefShuttleObjective
- type: AntagRandomObjectives
sets:
- groups: ThiefBigObjectiveGroups
prob: 0.7
maxPicks: 1
- groups: ThiefObjectiveGroups
maxPicks: 10
maxDifficulty: 2.5
- type: AntagSelection
agentName: thief-round-end-agent-name
definitions:
- prefRoles: [ Thief ]
max: 3
playerRatio: 15
lateJoinAdditional: true
allowNonHumans: true
multiAntagSetting: NotExclusive
startingGear: ThiefGear
components:
- type: Pacified
mindRoles:
- MindRoleThief
briefing:
sound: "/Audio/Misc/thief_greeting.ogg"
# Needs testing
- type: entity
abstract: true
parent: BaseWizardRule
id: SubWizard
components:
- type: AntagSelection
agentName: wizard-round-end-name
selectionTime: PrePlayerSpawn
definitions:
- prefRoles: [ Wizard ]
max: 1
playerRatio: 1
spawnerPrototype: SpawnPointGhostWizard
roleLoadout:
- RoleSurvivalExtended
briefing:
text: wizard-role-greeting
color: Turquoise
# TODO: Need Wizard Start sound
#sound: "/Audio/Ambience/Antag/wizard_start.ogg"
startingGear: WizardBlueGear
# TODO: WizardComp as needed
components:
- type: NpcFactionMember
factions:
- Wizard
- type: RandomMetadata
nameSegments:
- names_wizard_first
- names_wizard_last
mindRoles:
- MindRoleWizard

View File

@@ -8,6 +8,7 @@
- Revolutionaries - Revolutionaries
- NuclearOperatives - NuclearOperatives
- SpaceNinja - SpaceNinja
- Wizard
- Zombies - Zombies
- MinorAntagonists - MinorAntagonists
@@ -45,3 +46,8 @@
id: Thieves id: Thieves
name: guide-entry-thieves name: guide-entry-thieves
text: "/ServerInfo/Guidebook/Antagonist/Thieves.xml" text: "/ServerInfo/Guidebook/Antagonist/Thieves.xml"
- type: guideEntry
id: Wizard
name: guide-entry-wizard
text: "/ServerInfo/Guidebook/Antagonist/Wizard.xml"

View File

@@ -111,3 +111,11 @@
id: BaseCodeObjective id: BaseCodeObjective
components: components:
- type: CodeCondition - type: CodeCondition
# a free objective, which is a free greentext
- type: entity
abstract: true
parent: BaseObjective
id: BaseFreeObjective
components:
- type: FreeObjective

View File

@@ -0,0 +1,35 @@
- type: entity
abstract: true
parent: BaseObjective
id: BaseWizardObjective
components:
- type: Objective
# required but not used
difficulty: 1
issuer: objective-issuer-swf
- type: RoleRequirement
roles:
mindRoles:
- WizardRole
- type: entity
parent: [BaseWizardObjective, BaseSurviveObjective]
id: WizardSurviveObjective
name: Survive
description: The Space Wizards Federation want you to live!
components:
- type: Objective
icon:
sprite: Clothing/Head/Hats/wizardhat.rsi
state: icon
- type: entity
parent: [BaseWizardObjective, BaseFreeObjective]
id: WizardDemonstrateObjective
name: Demonstration
description: Give the station a good demonstration of your powers!
components:
- type: Objective
icon:
sprite: Objects/Magic/magicactions.rsi
state: fireball

View File

@@ -1,8 +1,19 @@
# TODO: Actual wizard coming later, this is just for the survival antags
- type: antag - type: antag
id: Survivor id: Survivor
name: roles-antag-survivor-name name: roles-antag-survivor-name
antagonist: true antagonist: true
objective: roles-antag-survivor-objective objective: roles-antag-survivor-objective
# guides: [ ] # guides: [ ]
- type: antag
id: Wizard
name: roles-antag-wizard-name
antagonist: true
setPreference: true
objective: roles-antag-wizard-objective # TODO: maybe give random objs and stationary ones from AntagObjectives and AntagRandomObjectives
requirements: # I hate time locked roles but this should be enough time for someone to be acclimated
- !type:OverallPlaytimeRequirement
time: 18000 # 5h
guides: [ Wizard ]
# See wizard_startinggear for wiz start gear options

View File

@@ -4,13 +4,14 @@
equipment: equipment:
jumpsuit: ClothingUniformJumpsuitColorDarkBlue jumpsuit: ClothingUniformJumpsuitColorDarkBlue
head: ClothingHeadHatWizard head: ClothingHeadHatWizard
back: ClothingBackpack # Wizard backpack?
outerClothing: ClothingOuterWizard outerClothing: ClothingOuterWizard
shoes: ClothingShoesWizard shoes: ClothingShoesWizard
id: PassengerPDA id: PassengerPDA # Maybe a wizard PDA of some sort?
ears: ClothingHeadsetService ears: ClothingHeadsetAltCommand
storage: belt: ClothingBeltWand
back: # pocket1: TODO: Include wizard teleport scroll
- BoxSurvival pocket2: WizardsGrimoire
- type: startingGear - type: startingGear
id: WizardRedGear id: WizardRedGear

View File

@@ -250,6 +250,19 @@
- type: MindRole - type: MindRole
roleType: TeamAntagonist roleType: TeamAntagonist
# Wizards
- type: entity
parent: BaseMindRoleAntag
id: MindRoleWizard
name: Wizard Role
# description: these are all commented out
components:
- type: MindRole
antagPrototype: Wizard
exclusiveAntag: true
roleType: SoloAntagonist
- type: WizardRole
# Zombie Squad # Zombie Squad
- type: entity - type: entity
parent: BaseMindRoleAntag parent: BaseMindRoleAntag

View File

@@ -4,6 +4,7 @@
- /Audio/Lobby/thunderdome.ogg - /Audio/Lobby/thunderdome.ogg
- /Audio/Lobby/absconditus.ogg - /Audio/Lobby/absconditus.ogg
- /Audio/Lobby/space_asshole.ogg - /Audio/Lobby/space_asshole.ogg
- /Audio/Lobby/the_wizard.ogg
- /Audio/Lobby/endless_space.ogg - /Audio/Lobby/endless_space.ogg
- /Audio/Lobby/singuloose.ogg - /Audio/Lobby/singuloose.ogg
- /Audio/Lobby/comet_haley.ogg - /Audio/Lobby/comet_haley.ogg

View File

@@ -201,6 +201,21 @@
- SpaceTrafficControlEventScheduler - SpaceTrafficControlEventScheduler
- BasicRoundstartVariation - BasicRoundstartVariation
- type: gamePreset
id: Wizard
alias:
- wizard
name: wizard-title
description: wizard-description
showInVote: false
rules:
- Wizard
- SubGamemodesRuleNoWizard #No Dual Wizards at the start, midround is fine
- BasicStationEventScheduler
- MeteorSwarmScheduler
- SpaceTrafficControlEventScheduler
- BasicRoundstartVariation
- type: gamePreset - type: gamePreset
id: Zombie id: Zombie
alias: alias:

View File

@@ -2,7 +2,8 @@
id: Secret id: Secret
weights: weights:
Nukeops: 0.20 Nukeops: 0.20
Traitor: 0.60 Traitor: 0.55
Zombie: 0.05 Zombie: 0.05
Survival: 0.10 Survival: 0.10
Revolutionary: 0.05 Revolutionary: 0.05
Wizard: 0.05 # Why not, should probably be lower

View File

@@ -0,0 +1,30 @@
<Document>
# The Wizard
<Box>
[color=#457573][italic]IT'S WIZARD TIME MOTHERF-...[italic][/color]
</Box>
<Box>
<GuideEntityEmbed Entity="ToyFigurineWizard" Caption=""/>
</Box>
Wizards are a force of chaos and unpredictability. You never know what one is going to do next.
Generally sent by the [color=#40E0D0]Space Wizards Federation[/color] or some schmuck turned into one by rolling a nat 20 on a cursed die.
And since a Wizard is highly unpredictable, one may show up when you least expect it!
## The Grimoire
<Box>
<GuideEntityEmbed Entity="WizardsGrimoire" Caption="Wizards Grimoire"/>
</Box>
[bold]By wizard law of eld your Grimoire is bound to you.[/bold] This means you cannot share your Grimoire with anyone else. The spells and equipment inside are for you and you alone.
The Wizard's Grimoire is used to get all sorts of magical spells, equipment, and creatures. What's available to you is [italic]extremely powerful[/italic] so you only have 10 [color=#FF0000]W[/color][color=#FFA500]i[/color][color=#FFFF00]z[/color][color=#00FF00]€[/color][color=#0000FF]o[/color][color=#4B0082]i[/color][color=#8F00FF]n[/color]™ to spend on them.
Your only limit, other than the price, is your creativity. Try to find some combinations!
<Box>
<GuideEntityEmbed Entity="PonderingOrbWizard" Caption="The Pondering Orb"/>
</Box>
If you ever find yourself wanting to ponder, look no further! The [bold]Pondering Orb[/bold] allows the Wizard to tap into the Station's camera network to spy on others unsuspectingly.
Could be useful if you're trying to plan something out or stay one step ahead of [color=red]Security[/color].
</Document>