diff --git a/Content.Server/GameTicking/Rules/SurvivorRuleSystem.cs b/Content.Server/GameTicking/Rules/SurvivorRuleSystem.cs
index 00f652b6c6..81ad2b1be7 100644
--- a/Content.Server/GameTicking/Rules/SurvivorRuleSystem.cs
+++ b/Content.Server/GameTicking/Rules/SurvivorRuleSystem.cs
@@ -1,4 +1,4 @@
-using Content.Server.Antag;
+using Content.Server.Antag;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Mind;
using Content.Server.Roles;
diff --git a/Content.Server/Objectives/Components/FreeObjectiveComponent.cs b/Content.Server/Objectives/Components/FreeObjectiveComponent.cs
new file mode 100644
index 0000000000..ae5070ddf7
--- /dev/null
+++ b/Content.Server/Objectives/Components/FreeObjectiveComponent.cs
@@ -0,0 +1,7 @@
+namespace Content.Server.Objectives.Components;
+
+///
+/// A free greentext, that's it.
+///
+[RegisterComponent]
+public sealed partial class FreeObjectiveComponent : Component;
diff --git a/Content.Server/Objectives/Systems/FreeObjectiveSystem.cs b/Content.Server/Objectives/Systems/FreeObjectiveSystem.cs
new file mode 100644
index 0000000000..ae1753b5c4
--- /dev/null
+++ b/Content.Server/Objectives/Systems/FreeObjectiveSystem.cs
@@ -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(OnGetProgress);
+ }
+
+ // You automatically greentext, there's not much else to it
+ private void OnGetProgress(Entity ent, ref ObjectiveGetProgressEvent args)
+ {
+ args.Progress = 1f;
+ }
+}
diff --git a/Content.Server/Roles/WizardRoleComponent.cs b/Content.Server/Roles/WizardRoleComponent.cs
new file mode 100644
index 0000000000..72a89ee2ca
--- /dev/null
+++ b/Content.Server/Roles/WizardRoleComponent.cs
@@ -0,0 +1,7 @@
+namespace Content.Server.Roles;
+
+///
+/// Mind role to tag entities that they're a Wizard
+///
+[RegisterComponent]
+public sealed partial class WizardRoleComponent : Component;
diff --git a/Resources/Audio/Lobby/attributions.yml b/Resources/Audio/Lobby/attributions.yml
index 657d018861..722f70731a 100644
--- a/Resources/Audio/Lobby/attributions.yml
+++ b/Resources/Audio/Lobby/attributions.yml
@@ -14,6 +14,13 @@
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.
+- 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"]
license: "CC-BY-NC-SA-3.0"
copyright: "Absconditus by ZhayTee. Converted from MP3 to OGG."
diff --git a/Resources/Audio/Lobby/the_wizard.ogg b/Resources/Audio/Lobby/the_wizard.ogg
new file mode 100644
index 0000000000..f101df5f18
Binary files /dev/null and b/Resources/Audio/Lobby/the_wizard.ogg differ
diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-wizard.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-wizard.ftl
index c355f4b9b0..722db5fb46 100644
--- a/Resources/Locale/en-US/game-ticking/game-presets/preset-wizard.ftl
+++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-wizard.ftl
@@ -1,4 +1,4 @@
-## Survivor
+## Survivor
roles-antag-survivor-name = Survivor
# 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.
}
-## 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)
diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl
index ccf78c703f..b2f0932787 100644
--- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl
+++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl
@@ -315,3 +315,5 @@ ghost-role-information-gingerbread-name = Gingerbread Man
ghost-role-information-gingerbread-description = A being of pure holiday spirit.
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.
diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl
index 0e7bdc8db0..004b6b39a5 100644
--- a/Resources/Locale/en-US/guidebook/guides.ftl
+++ b/Resources/Locale/en-US/guidebook/guides.ftl
@@ -136,6 +136,7 @@ guide-entry-revolutionaries = Revolutionaries
guide-entry-minor-antagonists = Minor Antagonists
guide-entry-space-ninja = Space Ninja
guide-entry-thieves = Thieves
+guide-entry-wizard = Wizard
guide-entry-rules = Server Rules
guide-entry-rules-core-only = Core Only Ruleset
diff --git a/Resources/Maps/Shuttles/wizard.yml b/Resources/Maps/Shuttles/wizard.yml
index fee421124e..2151d3fcd3 100644
--- a/Resources/Maps/Shuttles/wizard.yml
+++ b/Resources/Maps/Shuttles/wizard.yml
@@ -1,6 +1,17 @@
meta:
- format: 6
- postmapinit: false
+ format: 7
+ category: Grid
+ engineVersion: 247.1.0
+ forkId: ""
+ forkVersion: ""
+ time: 02/23/2025 10:35:57
+ entityCount: 791
+maps: []
+grids:
+- 768
+orphans:
+- 768
+nullspace: []
tilemap:
0: Space
23: FloorCaveDrought
@@ -1933,6 +1944,13 @@ entities:
rot: -1.5707963267948966 rad
pos: 5.5,3.5
parent: 768
+- proto: ClockworkShield
+ entities:
+ - uid: 782
+ components:
+ - type: Transform
+ pos: -2.780127,-2.51509
+ parent: 768
- proto: ClothingBeltUtilityFilled
entities:
- uid: 635
@@ -3050,6 +3068,13 @@ entities:
- type: Transform
pos: 2.5,-8.5
parent: 768
+- proto: MirrorShield
+ entities:
+ - uid: 783
+ components:
+ - type: Transform
+ pos: 1.3163121,-0.3900899
+ parent: 768
- proto: NitrogenCanister
entities:
- uid: 601
@@ -3702,6 +3727,56 @@ entities:
- type: Transform
pos: -4.5,-13.5
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
entities:
- uid: 779
@@ -3989,6 +4064,14 @@ entities:
- type: Transform
pos: 7.5,3.5
parent: 768
+- proto: SalvageHumanCorpseSpawner
+ entities:
+ - uid: 791
+ components:
+ - type: Transform
+ rot: 3.141592653589793 rad
+ pos: 6.5,-1.5
+ parent: 768
- proto: SinkWide
entities:
- uid: 581
@@ -4030,14 +4113,7 @@ entities:
- type: Transform
pos: 6.5,-2.5
parent: 768
-- proto: SpawnPointCaptain
- entities:
- - uid: 767
- components:
- - type: Transform
- pos: -0.5,-9.5
- parent: 768
-- proto: SpawnPointLatejoin
+- proto: SpawnPointWizard
entities:
- uid: 762
components:
diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml b/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml
index 41a11561e8..f334747024 100644
--- a/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml
+++ b/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml
@@ -272,3 +272,4 @@
- id: OxygenTankFilled
- id: ClothingOuterHardsuitWizard
- id: ClothingMaskBreath
+ - id: JetpackVoidFilled
diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Conditional/wizard.yml b/Resources/Prototypes/Entities/Markers/Spawners/Conditional/wizard.yml
new file mode 100644
index 0000000000..bf7dc4e632
--- /dev/null
+++ b/Resources/Prototypes/Entities/Markers/Spawners/Conditional/wizard.yml
@@ -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
diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml
index 0e38cd266d..bd3c76cd84 100644
--- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml
+++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml
@@ -207,4 +207,25 @@
layers:
- state: green
- sprite: Mobs/Silicon/chassis.rsi
- state: derelict_icon
\ No newline at end of file
+ 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
diff --git a/Resources/Prototypes/Entities/Mobs/Player/human.yml b/Resources/Prototypes/Entities/Mobs/Player/human.yml
index 7fc8bf7d6c..a3b9a0a88a 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/human.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/human.yml
@@ -102,3 +102,15 @@
- type: NpcFactionMember
factions:
- Syndicate
+
+# Wizard
+- type: entity
+ categories: [ HideSpawnMenu ]
+ name: Wizard
+ parent: MobHuman
+ id: MobHumanWizard
+ components:
+ - type: RandomHumanoidAppearance
+ - type: NpcFactionMember
+ factions:
+ - Wizard
diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml
index 9a4ca97210..346d21e4c7 100644
--- a/Resources/Prototypes/GameRules/events.yml
+++ b/Resources/Prototypes/GameRules/events.yml
@@ -38,6 +38,7 @@
- id: ZombieOutbreak
- id: LoneOpsSpawn
- id: DerelictCyborgSpawn
+ - id: WizardSpawn
- type: entity
id: BaseStationEvent
@@ -243,6 +244,44 @@
- type: RandomSpawnRule
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
#- type: entity
# id: FalseAlarm
diff --git a/Resources/Prototypes/GameRules/midround.yml b/Resources/Prototypes/GameRules/midround.yml
deleted file mode 100644
index 6cc53a3d10..0000000000
--- a/Resources/Prototypes/GameRules/midround.yml
+++ /dev/null
@@ -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"
diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml
index 611b3b6abd..8353deb17c 100644
--- a/Resources/Prototypes/GameRules/roundstart.yml
+++ b/Resources/Prototypes/GameRules/roundstart.yml
@@ -18,6 +18,17 @@
parent: BaseGameRule
id: SubGamemodesRule
components:
+ - type: SubGamemodes
+ rules:
+ - id: Thief
+ prob: 0.5
+ - id: SubWizard
+ prob: 0.05
+
+- type: entity
+ parent: BaseGameRule
+ id: SubGamemodesRuleNoWizard
+ components:
- type: SubGamemodes
rules:
- id: Thief
@@ -238,6 +249,56 @@
components:
- 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
id: Zombie
parent: BaseGameRule
diff --git a/Resources/Prototypes/GameRules/subgamemodes.yml b/Resources/Prototypes/GameRules/subgamemodes.yml
new file mode 100644
index 0000000000..70090f0e44
--- /dev/null
+++ b/Resources/Prototypes/GameRules/subgamemodes.yml
@@ -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
diff --git a/Resources/Prototypes/Guidebook/antagonist.yml b/Resources/Prototypes/Guidebook/antagonist.yml
index 3f42287c47..4548bb292b 100644
--- a/Resources/Prototypes/Guidebook/antagonist.yml
+++ b/Resources/Prototypes/Guidebook/antagonist.yml
@@ -8,6 +8,7 @@
- Revolutionaries
- NuclearOperatives
- SpaceNinja
+ - Wizard
- Zombies
- MinorAntagonists
@@ -45,3 +46,8 @@
id: Thieves
name: guide-entry-thieves
text: "/ServerInfo/Guidebook/Antagonist/Thieves.xml"
+
+- type: guideEntry
+ id: Wizard
+ name: guide-entry-wizard
+ text: "/ServerInfo/Guidebook/Antagonist/Wizard.xml"
diff --git a/Resources/Prototypes/Objectives/base_objectives.yml b/Resources/Prototypes/Objectives/base_objectives.yml
index 1fbd23dfce..1abbe74f3a 100644
--- a/Resources/Prototypes/Objectives/base_objectives.yml
+++ b/Resources/Prototypes/Objectives/base_objectives.yml
@@ -111,3 +111,11 @@
id: BaseCodeObjective
components:
- type: CodeCondition
+
+# a free objective, which is a free greentext
+- type: entity
+ abstract: true
+ parent: BaseObjective
+ id: BaseFreeObjective
+ components:
+ - type: FreeObjective
diff --git a/Resources/Prototypes/Objectives/wizard.yml b/Resources/Prototypes/Objectives/wizard.yml
new file mode 100644
index 0000000000..03bcd64e71
--- /dev/null
+++ b/Resources/Prototypes/Objectives/wizard.yml
@@ -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
diff --git a/Resources/Prototypes/Roles/Antags/wizard.yml b/Resources/Prototypes/Roles/Antags/wizard.yml
index e8ffe649e7..0ddf90ef2b 100644
--- a/Resources/Prototypes/Roles/Antags/wizard.yml
+++ b/Resources/Prototypes/Roles/Antags/wizard.yml
@@ -1,8 +1,19 @@
-# TODO: Actual wizard coming later, this is just for the survival antags
-
- type: antag
id: Survivor
name: roles-antag-survivor-name
antagonist: true
objective: roles-antag-survivor-objective
# 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
diff --git a/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml
index a4e5e3c3ab..3e9ea6360a 100644
--- a/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml
+++ b/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml
@@ -4,13 +4,14 @@
equipment:
jumpsuit: ClothingUniformJumpsuitColorDarkBlue
head: ClothingHeadHatWizard
+ back: ClothingBackpack # Wizard backpack?
outerClothing: ClothingOuterWizard
shoes: ClothingShoesWizard
- id: PassengerPDA
- ears: ClothingHeadsetService
- storage:
- back:
- - BoxSurvival
+ id: PassengerPDA # Maybe a wizard PDA of some sort?
+ ears: ClothingHeadsetAltCommand
+ belt: ClothingBeltWand
+ # pocket1: TODO: Include wizard teleport scroll
+ pocket2: WizardsGrimoire
- type: startingGear
id: WizardRedGear
diff --git a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml
index ded64895f0..ea6780eb50 100644
--- a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml
+++ b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml
@@ -250,6 +250,19 @@
- type: MindRole
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
- type: entity
parent: BaseMindRoleAntag
diff --git a/Resources/Prototypes/SoundCollections/lobby.yml b/Resources/Prototypes/SoundCollections/lobby.yml
index f85a8b22af..bf0c27064c 100644
--- a/Resources/Prototypes/SoundCollections/lobby.yml
+++ b/Resources/Prototypes/SoundCollections/lobby.yml
@@ -4,6 +4,7 @@
- /Audio/Lobby/thunderdome.ogg
- /Audio/Lobby/absconditus.ogg
- /Audio/Lobby/space_asshole.ogg
+ - /Audio/Lobby/the_wizard.ogg
- /Audio/Lobby/endless_space.ogg
- /Audio/Lobby/singuloose.ogg
- /Audio/Lobby/comet_haley.ogg
diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml
index 317912e07a..0fbc63c197 100644
--- a/Resources/Prototypes/game_presets.yml
+++ b/Resources/Prototypes/game_presets.yml
@@ -201,6 +201,21 @@
- SpaceTrafficControlEventScheduler
- 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
id: Zombie
alias:
diff --git a/Resources/Prototypes/secret_weights.yml b/Resources/Prototypes/secret_weights.yml
index 7af610af6c..fae71c8eea 100644
--- a/Resources/Prototypes/secret_weights.yml
+++ b/Resources/Prototypes/secret_weights.yml
@@ -2,7 +2,8 @@
id: Secret
weights:
Nukeops: 0.20
- Traitor: 0.60
+ Traitor: 0.55
Zombie: 0.05
Survival: 0.10
Revolutionary: 0.05
+ Wizard: 0.05 # Why not, should probably be lower
diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Wizard.xml b/Resources/ServerInfo/Guidebook/Antagonist/Wizard.xml
new file mode 100644
index 0000000000..2fc56e0d80
--- /dev/null
+++ b/Resources/ServerInfo/Guidebook/Antagonist/Wizard.xml
@@ -0,0 +1,30 @@
+
+ # The Wizard
+
+
+ [color=#457573][italic]IT'S WIZARD TIME MOTHERF-...[italic][/color]
+
+
+
+
+ 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
+
+
+
+
+ [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!
+
+
+
+
+
+ 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].
+
+