Raging Mages: A Magistake (#9891)

Added a new gamemode, Magistake, where a group of four rookie mages take the skipjack on a joyride to the station.
    Magical staves now show their ammo on the HUD.
    Magic missile no longer targets fellow magic users.

Note to maintainers: This should be added to the server's config after being merged, to allow it to happen in Secret.
This commit is contained in:
Geeves
2020-09-19 12:43:28 +02:00
committed by GitHub
parent 54f83927b4
commit da7bb8392c
21 changed files with 358 additions and 21 deletions

View File

@@ -43,6 +43,7 @@
#define MODE_ERT "ert"
#define MODE_MERCENARY "mercenary"
#define MODE_NINJA "ninja"
#define MODE_RAIDER_MAGE "raider mage"
#define MODE_RAIDER "raider"
#define MODE_BURGLAR "burglar"
#define MODE_WIZARD "wizard"

View File

@@ -19,6 +19,7 @@
var/r_pocket = null
var/suit_store = null
var/accessory = null
var/suit_accessory = null
//The following vars must be paths
var/l_hand = null
@@ -39,6 +40,7 @@
var/list/accessory_contents = list()
var/list/belt_contents = list() //In the list(path=count,otherpath=count) format
var/list/implants = null //A list of implants that should be implanted
var/list/spells = list() // A list of spells to grant
/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for customization depending on client prefs,species etc
@@ -89,7 +91,7 @@
else
H.equip_to_slot_or_del(I, slot)
/datum/outfit/proc/equip_accessory(mob/living/carbon/human/H, visualsOnly = FALSE)
/datum/outfit/proc/equip_uniform_accessory(mob/living/carbon/human/H)
if(!H)
return
@@ -114,6 +116,15 @@
if(W)
holster.holster(W, H)
/datum/outfit/proc/equip_suit_accessory(mob/living/carbon/human/H)
if(!H)
return
var/obj/item/clothing/suit/S = H.get_equipped_item(slot_wear_suit)
if(S)
var/obj/item/clothing/accessory/A = new suit_accessory
S.attach_accessory(H, A)
/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for changing items post equip (such as toggeling internals, ...)
@@ -124,9 +135,11 @@
if(uniform)
equip_item(H, uniform, slot_w_uniform)
if(accessory)
equip_accessory(H)
equip_uniform_accessory(H)
if(suit)
equip_item(H, suit, slot_wear_suit)
if(suit_accessory)
equip_suit_accessory(H)
if(belt)
equip_item(H, belt, slot_belt)
if(gloves)
@@ -199,6 +212,14 @@
affected.implants += I
I.part = affected
if(spells)
for(var/spell in spells)
var/spell/new_spell = new spell
H.add_spell(new_spell)
if(spells[spell] > 1)
for(var/i = 1 to spells[spell])
new_spell.empower_spell()
H.update_body()
return 1

View File

@@ -544,4 +544,81 @@
head = /obj/item/clothing/head/helmet/space/cult
suit = /obj/item/clothing/suit/space/cult
suit_store = /obj/item/gun/energy/rifle/cult
suit_store = /obj/item/gun/energy/rifle/cult
/datum/outfit/admin/syndicate/raider_mage
name = "Raider Mage"
allow_backbag_choice = FALSE
uniform = /obj/item/clothing/under/syndicate/ninja
suit = null
shoes = /obj/item/clothing/shoes/sandal
head = null
back = /obj/item/gun/energy/staff/focus
belt = /obj/item/storage/belt/fannypack/component
gloves = null
l_ear = /obj/item/device/radio/headset/raider
l_pocket = null
r_pocket = null
id = /obj/item/storage/wallet/random
accessory = /obj/item/clothing/accessory/storage/webbing
backpack_contents = list()
/datum/outfit/admin/syndicate/raider_mage/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
var/list/loadouts = list("Nature", "Techno", "Cobra", "Brawler", "Shimmer")
if(H.gender in list(FEMALE, PLURAL, NEUTER))
loadouts += list("Storm", "Sorceress")
switch(pick(loadouts))
if("Nature")
head = /obj/item/clothing/head/wizard/nature
suit = /obj/item/clothing/suit/wizrobe/nature
suit_accessory = /obj/item/clothing/accessory/poncho/nature
spells = list(/spell/targeted/heal_target/major = 2, /spell/targeted/entangle = 2, /spell/aoe_turf/conjure/grove/sanctuary = 2)
if("Techno")
head = /obj/item/clothing/head/wizard/techno
suit = /obj/item/clothing/suit/wizrobe/techno
uniform = /obj/item/clothing/under/techo
shoes = /obj/item/clothing/shoes/techno
spells = list(/spell/aoe_turf/knock = 2, /spell/aoe_turf/conjure/forcewall = 2, /spell/aoe_turf/disable_tech = 2)
if("Cobra")
head = /obj/item/clothing/head/wizard/cobra
suit = /obj/item/clothing/suit/wizrobe/cobra
shoes = /obj/item/clothing/shoes/hitops/red
spells = list(/spell/targeted/mend = 2, /spell/targeted/life_steal = 2, /spell/aoe_turf/conjure/soulstone = 2)
if("Brawler")
head = /obj/item/clothing/head/wizard/brawler
suit = /obj/item/clothing/suit/wizrobe/brawler
shoes = /obj/item/clothing/shoes/caligae
spells = list(/spell/targeted/projectile/dumbfire/passage = 2, /spell/targeted/equip_item/shield = 2, /spell/targeted/torment = 2)
if("Shimmer")
head = /obj/item/clothing/head/wizard/shimmer
suit = /obj/item/clothing/suit/wizrobe/shimmer
spells = list(/spell/radiant_aura = 2, /spell/targeted/projectile/dumbfire/stuncuff = 2, /spell/aoe_turf/conjure/golem = 2)
if("Storm")
head = /obj/item/clothing/head/wizard/storm
suit = /obj/item/clothing/suit/wizrobe/storm
shoes = /obj/item/clothing/shoes/heels
spells = list(/spell/targeted/projectile/magic_missile = 2, /spell/targeted/genetic/blind = 2, /spell/targeted/shapeshift/avian = 2)
if("Sorceress")
head = /obj/item/clothing/head/wizard/sorceress
suit = /obj/item/clothing/suit/wizrobe/sorceress
spells = list(/spell/targeted/projectile/dumbfire/fireball = 2, /spell/aoe_turf/conjure/creature = 2, /spell/shadow_shroud = 2)
return ..()
/datum/outfit/admin/syndicate/raider_mage/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(visualsOnly)
return
if(!H.shoes)
var/fallback_type = pick(/obj/item/clothing/shoes/sandal, /obj/item/clothing/shoes/jackboots/toeless, /obj/item/clothing/shoes/laceup/brown/all_species, /obj/item/clothing/shoes/laceup/all_species)
H.equip_to_slot_or_del(new fallback_type(H), slot_shoes)
var/obj/item/storage/wallet/W = H.wear_id
var/obj/item/card/id/syndicate/raider/passport = new(H.loc)
passport.name = "[H.real_name]'s Passport"
if(W)
W.handle_item_insertion(passport)

View File

@@ -121,6 +121,8 @@
if(ishuman(player))
var/mob/living/carbon/human/H = player
var/datum/language/L = H.default_language
if(!L)
L = all_languages[LANGUAGE_TCB]
H.real_name = L.get_random_name()
H.name = H.real_name
H.dna.real_name = H.real_name

View File

@@ -0,0 +1,63 @@
var/datum/antagonist/raider_mage/raider_mage
/datum/antagonist/raider_mage
id = MODE_RAIDER_MAGE
role_text = "Raider Mage"
role_text_plural = "Raider Mages"
bantype = "raider"
antag_indicator = "magineer"
landmark_id = "voxstart"
welcome_text = "Use :H to talk on your encrypted channel."
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_NO_FLAVORTEXT
antaghud_indicator = "hudmagineer"
required_age = 10
hard_cap = 6
hard_cap_round = 10
initial_spawn_req = 4
initial_spawn_target = 6
faction = "Space Wizard"
id_type = /obj/item/card/id/syndicate/raider
/datum/antagonist/raider_mage/New()
..()
raider_mage = src
/datum/antagonist/raider_mage/update_access(var/mob/living/player)
for(var/obj/item/storage/wallet/W in player.contents)
for(var/obj/item/card/id/id in W.contents)
id.name = "[player.real_name]'s Passport"
id.registered_name = player.real_name
W.name = "[initial(W.name)] ([id.name])"
/datum/antagonist/raider_mage/proc/is_raider_crew_safe()
if(!length(current_antagonists))
return FALSE
for(var/datum/mind/player in current_antagonists)
if(!player.current || get_area(player.current) != locate(/area/antag/raider))
return FALSE
return TRUE
/datum/antagonist/raider_mage/equip(var/mob/living/carbon/human/player)
if(!..())
return FALSE
for(var/obj/item/I in player)
if(istype(I, /obj/item/implant))
continue
player.drop_from_inventory(I)
if(I.loc != player)
qdel(I)
player.preEquipOutfit(/datum/outfit/admin/syndicate/raider_mage, FALSE)
player.equipOutfit(/datum/outfit/admin/syndicate/raider_mage, FALSE)
player.force_update_limbs()
player.update_eyes()
player.regenerate_icons()
return TRUE
/datum/antagonist/raider_mage/get_antag_radio()
return "Raider"

View File

@@ -1,8 +1,3 @@
/*
VOX HEIST ROUNDTYPE
*/
/datum/game_mode/heist
name = "heist"
config_tag = "heist"
@@ -14,3 +9,10 @@ VOX HEIST ROUNDTYPE
for their greedy plans."
end_on_antag_death = 1
antag_tags = list(MODE_RAIDER)
/datum/game_mode/heist/apprentices
name = "magistake"
config_tag = "magistake"
extended_round_description = "The galaxy is a place full of dangers, even the inner colonies are not free of such scourges. \
Some say that the best raiders have a touch of magic to their art of plunder, but that's just hearsay."
antag_tags = list(MODE_RAIDER_MAGE)

View File

@@ -420,6 +420,12 @@
storage_slots = null
max_storage_space = 8
/obj/item/storage/belt/fannypack/component
name = "component pouch"
desc = "A dorky fannypack for keeping small items in. Also stores magickal components!"
starts_with = list(/obj/item/toy/snappop/syndi = 3, /obj/item/reagent_containers/glass/beaker/vial/random/toxin = 2, /obj/item/storage/pill_bottle/dice = 1)
max_storage_space = 14
/obj/item/storage/belt/fannypack/black
name = "black fannypack"
icon_state = "fannypack_black"

View File

@@ -147,15 +147,163 @@
/obj/item/clothing/head/wizard/black
name = "black wizard hat"
desc = "Strange-looking, black, hat-wear that most certainly belongs to a real dark magic user."
icon = 'icons/obj/necromancer.dmi'
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "blackwizardhat"
item_state = "blackwizardhat"
contained_sprite = 1
contained_sprite = TRUE
/obj/item/clothing/suit/wizrobe/black
name = "black wizard robe"
desc = "An unnerving black gem-lined robe that reeks of death and decay."
icon = 'icons/obj/necromancer.dmi'
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "blackwizard"
item_state = "blackwizard"
contained_sprite = 1
contained_sprite = TRUE
// - Kyres and Geeves -
// Storm Outfit
/obj/item/clothing/head/wizard/storm
name = "storm cowl"
desc = "A grey cowl exuding potent magickal energy, or maybe it just hides your identity well."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "storm_cowl"
item_state = "storm_cowl"
contained_sprite = TRUE
/obj/item/clothing/suit/wizrobe/storm
name = "storm robes"
desc = "A fashionable set of robes that makes your hair stand on end. Positively electrifying."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "storm_robes"
item_state = "storm_robes"
contained_sprite = TRUE
// Nature Outfit
/obj/item/clothing/head/wizard/nature
name = "nature crown"
desc = "Simple, sleek, elegant. Smells a bit like honey and aloe."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "nature_crown"
item_state = "nature_crown"
contained_sprite = TRUE
/obj/item/clothing/suit/wizrobe/nature
name = "nature robes"
desc = "A green set of robes that sets the wearer apart from the rest. Doesn't itch! Somehow. Must be magic."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "nature_robes"
item_state = "nature_robes"
contained_sprite = TRUE
/obj/item/clothing/accessory/poncho/nature
name = "nature scarf"
desc = "A beautiful scarf that threatens to puncture the wearer's neck with thorns."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "nature_scarf"
item_state = "nature_scarf"
icon_override = null
contained_sprite = TRUE
// Techno Outfit
/obj/item/clothing/head/wizard/techno
name = "techno headwear"
desc = "A glowing set of eyes on the sides of this helmet makes you positively look like a pillock. On the plus side, you can see a lot."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "techno_headwear"
item_state = "techno_headwear"
contained_sprite = TRUE
/obj/item/clothing/suit/wizrobe/techno
name = "techno robes"
desc = "A heavy set of robes made of some metallic material, who knows really. Comes with a useless LED strapped to the side as well."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "techno_robes"
item_state = "techno_robes"
contained_sprite = TRUE
flags_inv = 0
/obj/item/clothing/under/techo
name = "techno suit"
desc = "A fantastically complex suit with a million moving parts, and it even glows faintly enough to not cast any light. Truly magical."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "techno_suit"
worn_state = "techno_suit"
item_state = "techno_suit"
contained_sprite = TRUE
/obj/item/clothing/shoes/techno
name = "techno shoes"
desc = "Shoes! Nothing special, they just complete the techno look."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "techno_shoes"
item_state = "techno_shoes"
contained_sprite = TRUE
// Cobra Outfit
/obj/item/clothing/head/wizard/cobra
name = "cobra hood"
desc = "A badass red hood, worn by badass people, in badass places, like Skrellpop conventions."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "cobra_hood"
item_state = "cobra_hood"
contained_sprite = TRUE
/obj/item/clothing/suit/wizrobe/cobra
name = "cobra robes"
desc = "A set of red robes that has nothing to do with actual cobras. Looks cool though."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "cobra_robes"
item_state = "cobra_robes"
contained_sprite = TRUE
// Brawler Outfit
/obj/item/clothing/head/wizard/brawler
name = "brawler mask"
desc = "A brawler MASK that goes onto your HEAD. It makes you look like an insane plonker, and that's probably what you want."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "brawler_mask"
item_state = "brawler_mask"
contained_sprite = TRUE
/obj/item/clothing/suit/wizrobe/brawler
name = "brawler robes"
desc = "A set of so-called robes that makes the wearer look like a ruthless gladiatorial warrior. Give them hell."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "brawler_robes"
item_state = "brawler_robes"
contained_sprite = TRUE
// Shimmer Outfit
/obj/item/clothing/head/wizard/shimmer
name = "shimmer helm"
desc = "A cool off-gold helmet that makes the wearer look like they control fate. Wait, do they actually control fate?"
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "shimmer_helm"
item_state = "shimmer_helm"
flags_inv = BLOCKHAIR|BLOCKHEADHAIR
contained_sprite = TRUE
/obj/item/clothing/suit/wizrobe/shimmer
name = "shimmer robes"
desc = "A set of off-gold robes that shimmers in the light, making the wearer to harder and easier see. Must be very well polished."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "shimmer_robes"
item_state = "shimmer_robes"
contained_sprite = TRUE
// Sorceress Outfit
/obj/item/clothing/head/wizard/sorceress
name = "sorceress crown"
desc = "A spikey crown that looks like it came directly off the set of an under-budget over-produced film. Looks great though."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "blackwizardhat"
item_state = "blackwizardhat"
contained_sprite = TRUE
/obj/item/clothing/suit/wizrobe/sorceress
name = "sorceress robes"
desc = "A set of black and red robes, when the director gives up and buys off the New Hai Phong exports list."
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "sorceress_robes"
item_state = "sorceress_robes"
contained_sprite = TRUE

View File

@@ -187,9 +187,9 @@ proc/getsensorlevel(A)
/mob/living/proc/is_wizard(exclude_apprentice = FALSE)
if(exclude_apprentice)
return mind && mind.assigned_role == "Space Wizard"
return mind && (mind.assigned_role == "Space Wizard" || mind.assigned_role == "Raider Mage")
else
return mind && (mind.assigned_role == "Space Wizard" || mind.assigned_role == "Apprentice")
return mind && (mind.assigned_role == "Space Wizard" || mind.assigned_role == "Raider Mage" || mind.assigned_role == "Apprentice")
/mob/proc/is_berserk()
return FALSE

View File

@@ -12,6 +12,7 @@
slot_flags = SLOT_BACK
w_class = ITEMSIZE_LARGE
max_shots = 1
displays_maptext = TRUE
projectile_type = /obj/item/projectile/change
origin_tech = list(TECH_COMBAT = 7, TECH_MAGNET = 5, TECH_BLUESPACE = 7)
self_recharge = 1

View File

@@ -1,10 +1,10 @@
/obj/item/clothing/suit/armor/bone
name = "bone armor"
desc = "A rudimentary armor made of bones of several creatures."
icon = 'icons/obj/necromancer.dmi'
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "bonearmor"
item_state = "bonearmor"
contained_sprite = 1
contained_sprite = TRUE
species_restricted = list(BODYTYPE_SKELETON)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
armor = list(melee = 50, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0)
@@ -12,9 +12,9 @@
/obj/item/clothing/head/helmet/bone
name = "bone helmet"
desc = "A rudimentary helmet made of some dead creature."
icon = 'icons/obj/necromancer.dmi'
icon = 'icons/obj/wizard_gear.dmi'
icon_state = "skull"
item_state = "skull"
contained_sprite = 1
contained_sprite = TRUE
species_restricted = list(BODYTYPE_SKELETON)
armor = list(melee = 50, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0)

View File

@@ -24,6 +24,13 @@
amt_dam_fire = 10
/spell/targeted/projectile/magic_missile/choose_prox_targets(mob/user = usr, var/atom/movable/spell_holder)
var/list/targets = ..()
for(var/mob/living/target in targets)
if(target.is_wizard())
targets -= target
return targets
/spell/targeted/projectile/magic_missile/prox_cast(var/list/targets, atom/spell_holder)
spell_holder.visible_message("<span class='danger'>\The [spell_holder] pops with a flash!</span>")
for(var/mob/living/M in targets)

View File

@@ -1,6 +1,6 @@
/spell/targeted/equip_item/shield
name = "Summon Shield"
desc = "Summons the most holy of shields, the riot shield. Commonly used during wizard riots."
desc = "Summons the most holy of shields, the buckler. Commonly used during wizard riots."
feedback = "SH"
school = "evocation"
invocation = "Sia helda!"

View File

@@ -34,8 +34,7 @@
H.add_spell(spell_to_add)
/mob/proc/add_spell(var/spell/spell_to_add, var/spell_base = "wiz_spell_ready", var/master_type = /obj/screen/movable/spell_master)
if(isobserver(usr)) // we spawned in via ghost spawner, so set our thing to this so we don't screw up
usr = src
usr = src // whoever made screen objects is an asshole and forced me to do this, i regret absolutely nothing
if(!spell_masters)
spell_masters = list()