]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
THE WIZARD (#35406)
authorkeronshb <54602815+keronshb@users.noreply.github.com>
Wed, 26 Feb 2025 05:34:07 +0000 (00:34 -0500)
committerGitHub <noreply@github.com>
Wed, 26 Feb 2025 05:34:07 +0000 (22:34 -0700)
* 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>
28 files changed:
Content.Server/GameTicking/Rules/SurvivorRuleSystem.cs
Content.Server/Objectives/Components/FreeObjectiveComponent.cs [new file with mode: 0644]
Content.Server/Objectives/Systems/FreeObjectiveSystem.cs [new file with mode: 0644]
Content.Server/Roles/WizardRoleComponent.cs [new file with mode: 0644]
Resources/Audio/Lobby/attributions.yml
Resources/Audio/Lobby/the_wizard.ogg [new file with mode: 0644]
Resources/Locale/en-US/game-ticking/game-presets/preset-wizard.ftl
Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl
Resources/Locale/en-US/guidebook/guides.ftl
Resources/Maps/Shuttles/wizard.yml
Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml
Resources/Prototypes/Entities/Markers/Spawners/Conditional/wizard.yml [new file with mode: 0644]
Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml
Resources/Prototypes/Entities/Mobs/Player/human.yml
Resources/Prototypes/GameRules/events.yml
Resources/Prototypes/GameRules/midround.yml [deleted file]
Resources/Prototypes/GameRules/roundstart.yml
Resources/Prototypes/GameRules/subgamemodes.yml [new file with mode: 0644]
Resources/Prototypes/Guidebook/antagonist.yml
Resources/Prototypes/Objectives/base_objectives.yml
Resources/Prototypes/Objectives/wizard.yml [new file with mode: 0644]
Resources/Prototypes/Roles/Antags/wizard.yml
Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml
Resources/Prototypes/Roles/MindRoles/mind_roles.yml
Resources/Prototypes/SoundCollections/lobby.yml
Resources/Prototypes/game_presets.yml
Resources/Prototypes/secret_weights.yml
Resources/ServerInfo/Guidebook/Antagonist/Wizard.xml [new file with mode: 0644]

index 00f652b6c6359fad17eed054826c27e367f7833e..81ad2b1be7933f73aa2256f30e4581aa4da8db8c 100644 (file)
@@ -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 (file)
index 0000000..ae5070d
--- /dev/null
@@ -0,0 +1,7 @@
+namespace Content.Server.Objectives.Components;
+
+/// <summary>
+///     A free greentext, that's it.
+/// </summary>
+[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 (file)
index 0000000..ae1753b
--- /dev/null
@@ -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;
+    }
+}
diff --git a/Content.Server/Roles/WizardRoleComponent.cs b/Content.Server/Roles/WizardRoleComponent.cs
new file mode 100644 (file)
index 0000000..72a89ee
--- /dev/null
@@ -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;
index 657d018861cd754b8fae2c8611fc35e3db8b0698..722f70731afb381c616d3dd5eb5a44077007d91d 100644 (file)
   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 (file)
index 0000000..f101df5
Binary files /dev/null and b/Resources/Audio/Lobby/the_wizard.ogg differ
index c355f4b9b0091ac5cd3f7cfece548ababbf779be..722db5fb466f4484ab16d3b59e9d6cd4d6cc9598 100644 (file)
@@ -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)
index ccf78c703f9839de8a13100d0989050c29d43186..b2f0932787676527f985acb38cb854e0da34e61f 100644 (file)
@@ -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.
index 0e7bdc8db0ced7f932583096b6f81d87c2ffa702..004b6b39a587c8513c7aebe5f66c528c3880e846 100644 (file)
@@ -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
index fee421124e2d79d4ae12cc4d1a558fb7d052bc00..2151d3fcd3e178b9c258cb5735d518ef9f0d2549 100644 (file)
@@ -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:
index 41a11561e80b42e9f09f3d32d05c70fdff8f3f70..f33474702437bc1e3f75324f8e0d40a780dabc27 100644 (file)
         - 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 (file)
index 0000000..bf7dc4e
--- /dev/null
@@ -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
index 0e38cd266d30244922740cbff46a60097bc65a21..bd3c76cd84c5e9f30001da91f5f2508f0c65e3b3 100644 (file)
     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
index 7fc8bf7d6c99c0879622c81d3d6ce8d6bcf44553..a3b9a0a88a6025907e30c181f67a32f605aff7f2 100644 (file)
   - type: NpcFactionMember
     factions:
     - Syndicate
+
+# Wizard
+- type: entity
+  categories: [ HideSpawnMenu ]
+  name: Wizard
+  parent: MobHuman
+  id: MobHumanWizard
+  components:
+  - type: RandomHumanoidAppearance
+  - type: NpcFactionMember
+    factions:
+    - Wizard
index 9a4ca97210b4a0c142441300065c560a90e995f8..346d21e4c740366807cdce7746c42344dd77ea2d 100644 (file)
@@ -38,6 +38,7 @@
     - id: ZombieOutbreak
     - id: LoneOpsSpawn
     - id: DerelictCyborgSpawn
+    - id: WizardSpawn
 
 - type: entity
   id: BaseStationEvent
   - 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 (file)
index 6cc53a3..0000000
+++ /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"
index 611b3b6abde06882aa728c51ea76f0b5d034424e..8353deb17c9905932ccc451cae8ca45847bebba5 100644 (file)
   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
   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 (file)
index 0000000..70090f0
--- /dev/null
@@ -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
index 3f42287c47977dfe4ae86a16e302dd721de57728..4548bb292b0388f3d32e72b739a4a67feb69fb02 100644 (file)
@@ -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"
index 1fbd23dfce22c2338d33db796620faf8e4f9d95a..1abbe74f3ad7ebcf894ca25a3c3a6479def261d7 100644 (file)
   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 (file)
index 0000000..03bcd64
--- /dev/null
@@ -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
index e8ffe649e76863208399006f161f39fa06bae51b..0ddf90ef2b003397a94e4d5a23f2b4bcfab308d1 100644 (file)
@@ -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
index a4e5e3c3ab89246641de65eec312bf9c335d202f..3e9ea6360ae6e2737179225c70135f30e66a4b8f 100644 (file)
@@ -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
index ded64895f092618526bbf47012188e8931fe5b8a..ea6780eb50742826fc4f2c4f30c4b81de66475f9 100644 (file)
     - 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
index f85a8b22af28745250be0836c39c544e26db4384..bf0c27064c1813ed47755b2066b78eff7a37169d 100644 (file)
@@ -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
index 317912e07a0cc36fae02913eec0686d8742b657e..0fbc63c197225a7711159616af5f55f80a582f3d 100644 (file)
     - 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:
index 7af610af6c7d6c39b6b57ad37b373ecc59c01546..fae71c8eea1e911699d157b0eda718bb35ccd021 100644 (file)
@@ -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 (file)
index 0000000..2fc56e0
--- /dev/null
@@ -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>