mirror of
https://github.com/KabKebab/GS13.git
synced 2026-08-30 08:30:08 +01:00
Uploading all files.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
//in this file: Various events that directly aid the wizard. This is the "lets entice the wizard to use summon events!" file.
|
||||
|
||||
/datum/round_event_control/wizard/robelesscasting //EI NUDTH!
|
||||
name = "Robeless Casting"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/robelesscasting
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/robelesscasting/start()
|
||||
|
||||
for(var/i in GLOB.mob_living_list) //Hey if a corgi has magic missle he should get the same benifit as anyone
|
||||
var/mob/living/L = i
|
||||
if(L.mind && L.mind.spell_list.len != 0)
|
||||
var/spell_improved = FALSE
|
||||
for(var/obj/effect/proc_holder/spell/S in L.mind.spell_list)
|
||||
if(S.clothes_req)
|
||||
S.clothes_req = 0
|
||||
spell_improved = TRUE
|
||||
if(spell_improved)
|
||||
to_chat(L, "<span class='notice'>You suddenly feel like you never needed those garish robes in the first place...</span>")
|
||||
|
||||
//--//
|
||||
|
||||
/datum/round_event_control/wizard/improvedcasting //blink x5 disintergrate x5 here I come!
|
||||
name = "Improved Casting"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/improvedcasting
|
||||
max_occurrences = 4 //because that'd be max level spells
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/improvedcasting/start()
|
||||
for(var/i in GLOB.mob_living_list)
|
||||
var/mob/living/L = i
|
||||
if(L.mind && L.mind.spell_list.len != 0)
|
||||
for(var/obj/effect/proc_holder/spell/S in L.mind.spell_list)
|
||||
S.name = initial(S.name)
|
||||
S.spell_level++
|
||||
if(S.spell_level >= 6 || S.charge_max <= 0) //Badmin checks, these should never be a problem in normal play
|
||||
continue
|
||||
if(S.level_max <= 0)
|
||||
continue
|
||||
S.charge_max = round(initial(S.charge_max) - S.spell_level * (initial(S.charge_max) - S.cooldown_min) / S.level_max)
|
||||
if(S.charge_max < S.charge_counter)
|
||||
S.charge_counter = S.charge_max
|
||||
switch(S.spell_level)
|
||||
if(1)
|
||||
S.name = "Efficient [S.name]"
|
||||
if(2)
|
||||
S.name = "Quickened [S.name]"
|
||||
if(3)
|
||||
S.name = "Free [S.name]"
|
||||
if(4)
|
||||
S.name = "Instant [S.name]"
|
||||
if(5)
|
||||
S.name = "Ludicrous [S.name]"
|
||||
|
||||
to_chat(L, "<span class='notice'>You suddenly feel more competent with your casting!</span>")
|
||||
@@ -0,0 +1,10 @@
|
||||
/datum/round_event_control/wizard/blobies //avast!
|
||||
name = "Zombie Outbreak"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/blobies
|
||||
max_occurrences = 3
|
||||
|
||||
/datum/round_event/wizard/blobies/start()
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.dead_mob_list)
|
||||
new /mob/living/simple_animal/hostile/blob/blobspore(H.loc)
|
||||
@@ -0,0 +1,60 @@
|
||||
/datum/round_event_control/wizard/cursed_items //fashion disasters
|
||||
name = "Cursed Items"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/cursed_items
|
||||
max_occurrences = 3
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
//Note about adding items to this: Because of how NODROP_1 works if an item spawned to the hands can also be equiped to a slot
|
||||
//it will be able to be put into that slot from the hand, but then get stuck there. To avoid this make a new subtype of any
|
||||
//item you want to equip to the hand, and set its slots_flags = null. Only items equiped to hands need do this.
|
||||
|
||||
/datum/round_event/wizard/cursed_items/start()
|
||||
var/item_set = pick("wizardmimic", "swords", "bigfatdoobie", "boxing", "voicemodulators", "catgirls2015")
|
||||
var/list/loadout[SLOTS_AMT]
|
||||
var/ruins_spaceworthiness
|
||||
var/ruins_wizard_loadout
|
||||
|
||||
switch(item_set)
|
||||
if("wizardmimic")
|
||||
loadout[SLOT_WEAR_SUIT] = /obj/item/clothing/suit/wizrobe
|
||||
loadout[SLOT_SHOES] = /obj/item/clothing/shoes/sandal/magic
|
||||
loadout[SLOT_HEAD] = /obj/item/clothing/head/wizard
|
||||
ruins_spaceworthiness = 1
|
||||
if("swords")
|
||||
loadout[SLOT_HANDS] = /obj/item/katana/cursed
|
||||
if("bigfatdoobie")
|
||||
loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/cigarette/rollie/trippy
|
||||
ruins_spaceworthiness = 1
|
||||
if("boxing")
|
||||
loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/luchador
|
||||
loadout[SLOT_GLOVES] = /obj/item/clothing/gloves/boxing
|
||||
ruins_spaceworthiness = 1
|
||||
if("voicemodulators")
|
||||
loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/chameleon
|
||||
if("catgirls2015")
|
||||
loadout[SLOT_HEAD] = /obj/item/clothing/head/kitty
|
||||
ruins_spaceworthiness = 1
|
||||
ruins_wizard_loadout = 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
if(ruins_spaceworthiness && !is_station_level(H.z) || isspaceturf(H.loc) || isplasmaman(H))
|
||||
continue //#savetheminers
|
||||
if(ruins_wizard_loadout && iswizard(H))
|
||||
continue
|
||||
if(item_set == "catgirls2015") //Wizard code means never having to say you're sorry
|
||||
H.gender = FEMALE
|
||||
for(var/i in 1 to loadout.len)
|
||||
if(loadout[i])
|
||||
var/obj/item/J = loadout[i]
|
||||
var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list
|
||||
H.dropItemToGround(H.get_item_by_slot(i), TRUE)
|
||||
H.equip_to_slot_or_del(I, i)
|
||||
ADD_TRAIT(I, TRAIT_NODROP, CURSED_ITEM_TRAIT)
|
||||
I.item_flags |= DROPDEL
|
||||
I.name = "cursed " + I.name
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
var/datum/effect_system/smoke_spread/smoke = new
|
||||
smoke.set_up(0, H.loc)
|
||||
smoke.start()
|
||||
@@ -0,0 +1,55 @@
|
||||
/datum/round_event_control/wizard/deprevolt //stationwide!
|
||||
name = "Departmental Uprising"
|
||||
weight = 0 //An order that requires order in a round of chaos was maybe not the best idea. Requiescat in pace departmental uprising August 2014 - March 2015
|
||||
typepath = /datum/round_event/wizard/deprevolt
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/deprevolt/start()
|
||||
|
||||
var/list/tidecolor
|
||||
var/list/jobs_to_revolt = list()
|
||||
var/nation_name
|
||||
var/list/citizens = list()
|
||||
|
||||
tidecolor = pick("grey", "white", "yellow", "purple", "brown", "whatevercolorrepresentstheservicepeople")
|
||||
switch(tidecolor)
|
||||
if("grey") //God help you
|
||||
jobs_to_revolt = list("Assistant")
|
||||
nation_name = pick("Assa", "Mainte", "Tunnel", "Gris", "Grey", "Liath", "Grigio", "Ass", "Assi")
|
||||
if("white")
|
||||
jobs_to_revolt = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist")
|
||||
nation_name = pick("Mede", "Healtha", "Recova", "Chemi", "Geneti", "Viro", "Psych")
|
||||
if("yellow")
|
||||
jobs_to_revolt = list("Chief Engineer", "Station Engineer", "Atmospheric Technician")
|
||||
nation_name = pick("Atomo", "Engino", "Power", "Teleco")
|
||||
if("purple")
|
||||
jobs_to_revolt = list("Research Director","Scientist", "Roboticist")
|
||||
nation_name = pick("Sci", "Griffa", "Explosi", "Mecha", "Xeno")
|
||||
if("brown")
|
||||
jobs_to_revolt = list("Quartermaster", "Cargo Technician", "Shaft Miner")
|
||||
nation_name = pick("Cargo", "Guna", "Suppli", "Mule", "Crate", "Ore", "Mini", "Shaf")
|
||||
if("whatevercolorrepresentstheservicepeople") //the few, the proud, the technically aligned
|
||||
jobs_to_revolt = list("Bartender", "Cook", "Botanist", "Clown", "Mime", "Janitor", "Chaplain")
|
||||
nation_name = pick("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi")
|
||||
|
||||
nation_name += pick("stan", "topia", "land", "nia", "ca", "tova", "dor", "ador", "tia", "sia", "ano", "tica", "tide", "cis", "marea", "co", "taoide", "slavia", "stotzka")
|
||||
|
||||
var/datum/team/nation/nation = new
|
||||
nation.name = nation_name
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.carbon_list)
|
||||
if(H.mind)
|
||||
var/datum/mind/M = H.mind
|
||||
if(M.assigned_role && !(M.has_antag_datum(/datum/antagonist)))
|
||||
for(var/job in jobs_to_revolt)
|
||||
if(M.assigned_role == job)
|
||||
citizens += H
|
||||
M.add_antag_datum(/datum/antagonist/separatist,nation)
|
||||
H.log_message("Was made into a separatist, long live [nation_name]!", LOG_ATTACK, color="red")
|
||||
|
||||
if(citizens.len)
|
||||
var/message
|
||||
for(var/job in jobs_to_revolt)
|
||||
message += "[job],"
|
||||
message_admins("The nation of [nation_name] has been formed. Affected jobs are [message]")
|
||||
@@ -0,0 +1,11 @@
|
||||
/datum/round_event_control/wizard/fake_explosion //Oh no the station is gone!
|
||||
name = "Fake Nuclear Explosion"
|
||||
weight = 0 //Badmin exclusive now because once it's expected its not funny
|
||||
typepath = /datum/round_event/wizard/fake_explosion
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/fake_explosion/start()
|
||||
sound_to_playing_players('sound/machines/alarm.ogg')
|
||||
sleep(100)
|
||||
Cinematic(CINEMATIC_NUKE_FAKE,world)
|
||||
@@ -0,0 +1,26 @@
|
||||
/datum/round_event_control/wizard/ghost //The spook is real
|
||||
name = "G-G-G-Ghosts!"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/ghost
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/ghost/start()
|
||||
var/msg = "<span class='warning'>You suddenly feel extremely obvious...</span>"
|
||||
set_observer_default_invisibility(0, msg)
|
||||
|
||||
|
||||
//--//
|
||||
|
||||
/datum/round_event_control/wizard/possession //Oh shit
|
||||
name = "Possessing G-G-G-Ghosts!"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/possession
|
||||
max_occurrences = 5
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/possession/start()
|
||||
for(var/mob/dead/observer/G in GLOB.player_list)
|
||||
G.verbs += /mob/dead/observer/verb/boo
|
||||
G.verbs += /mob/dead/observer/verb/possess
|
||||
to_chat(G, "You suddenly feel a welling of new spooky powers...")
|
||||
@@ -0,0 +1,101 @@
|
||||
/datum/round_event_control/wizard/greentext //Gotta have it!
|
||||
name = "Greentext"
|
||||
weight = 4
|
||||
typepath = /datum/round_event/wizard/greentext
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/greentext/start()
|
||||
|
||||
var/list/holder_canadates = GLOB.player_list.Copy()
|
||||
for(var/mob/M in holder_canadates)
|
||||
if(!ishuman(M))
|
||||
holder_canadates -= M
|
||||
if(!holder_canadates) //Very unlikely, but just in case
|
||||
return 0
|
||||
|
||||
var/mob/living/carbon/human/H = pick(holder_canadates)
|
||||
new /obj/item/greentext(H.loc)
|
||||
to_chat(H, "<font color='green'>The mythical greentext appear at your feet! Pick it up if you dare...</font>")
|
||||
|
||||
|
||||
/obj/item/greentext
|
||||
name = "greentext"
|
||||
desc = "No one knows what this massive tome does, but it feels <i><font color='green'>desirable</font></i> all the same..."
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "greentext"
|
||||
var/mob/living/last_holder
|
||||
var/mob/living/new_holder
|
||||
var/list/color_altered_mobs = list()
|
||||
var/datum/callback/roundend_callback
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
var/quiet = FALSE
|
||||
|
||||
/obj/item/greentext/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.poi_list |= src
|
||||
roundend_callback = CALLBACK(src,.proc/check_winner)
|
||||
SSticker.OnRoundend(roundend_callback)
|
||||
|
||||
/obj/item/greentext/equipped(mob/living/user as mob)
|
||||
to_chat(user, "<font color='green'>So long as you leave this place with greentext in hand you know will be happy...</font>")
|
||||
if(user.mind && user.mind.objectives.len > 0)
|
||||
to_chat(user, "<span class='warning'>... so long as you still perform your other objectives that is!</span>")
|
||||
new_holder = user
|
||||
if(!last_holder)
|
||||
last_holder = user
|
||||
if(!(user in color_altered_mobs))
|
||||
color_altered_mobs += user
|
||||
user.add_atom_colour("#00FF00", ADMIN_COLOUR_PRIORITY)
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/greentext/dropped(mob/living/user as mob)
|
||||
if(user in color_altered_mobs)
|
||||
to_chat(user, "<span class='warning'>A sudden wave of failure washes over you...</span>")
|
||||
user.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) //ya blew it
|
||||
last_holder = null
|
||||
new_holder = null
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/greentext/proc/check_winner()
|
||||
if(!new_holder)
|
||||
return
|
||||
|
||||
if(is_centcom_level(new_holder.z))//you're winner!
|
||||
to_chat(new_holder, "<font color='green'>At last it feels like victory is assured!</font>")
|
||||
new_holder.mind.add_antag_datum(/datum/antagonist/greentext)
|
||||
new_holder.log_message("won with greentext!!!", LOG_ATTACK, color="green")
|
||||
color_altered_mobs -= new_holder
|
||||
resistance_flags |= ON_FIRE
|
||||
qdel(src)
|
||||
|
||||
/obj/item/greentext/process()
|
||||
if(last_holder && last_holder != new_holder) //Somehow it was swiped without ever getting dropped
|
||||
to_chat(last_holder, "<span class='warning'>A sudden wave of failure washes over you...</span>")
|
||||
last_holder.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY)
|
||||
last_holder = new_holder //long live the king
|
||||
|
||||
/obj/item/greentext/Destroy(force)
|
||||
if(!(resistance_flags & ON_FIRE) && !force)
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
SSticker.round_end_events -= roundend_callback
|
||||
GLOB.poi_list.Remove(src)
|
||||
for(var/i in GLOB.player_list)
|
||||
var/mob/M = i
|
||||
var/message = "<span class='warning'>A dark temptation has passed from this world"
|
||||
if(M in color_altered_mobs)
|
||||
message += " and you're finally able to forgive yourself"
|
||||
if(M.color == "#FF0000" || M.color == "#00FF00")
|
||||
M.remove_atom_colour(ADMIN_COLOUR_PRIORITY)
|
||||
message += "...</span>"
|
||||
// can't skip the mob check as it also does the decolouring
|
||||
if(!quiet)
|
||||
to_chat(M, message)
|
||||
. = ..()
|
||||
|
||||
/obj/item/greentext/quiet
|
||||
quiet = TRUE
|
||||
@@ -0,0 +1,40 @@
|
||||
/datum/round_event_control/wizard/imposter //Mirror Mania
|
||||
name = "Imposter Wizard"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/imposter
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/imposter/start()
|
||||
for(var/datum/mind/M in SSticker.mode.wizards)
|
||||
if(!ishuman(M.current))
|
||||
continue
|
||||
var/mob/living/carbon/human/W = M.current
|
||||
var/list/candidates = pollGhostCandidates("Would you like to be an imposter wizard?", ROLE_WIZARD)
|
||||
if(!candidates)
|
||||
return //Sad Trombone
|
||||
var/mob/dead/observer/C = pick(candidates)
|
||||
|
||||
new /obj/effect/particle_effect/smoke(W.loc)
|
||||
|
||||
var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc)
|
||||
W.dna.transfer_identity(I, transfer_SE=1)
|
||||
I.real_name = I.dna.real_name
|
||||
I.name = I.dna.real_name
|
||||
I.updateappearance(mutcolor_update=1)
|
||||
I.domutcheck()
|
||||
I.key = C.key
|
||||
var/datum/antagonist/wizard/master = M.has_antag_datum(/datum/antagonist/wizard)
|
||||
if(!master.wiz_team)
|
||||
master.create_wiz_team()
|
||||
var/datum/antagonist/wizard/apprentice/imposter/imposter = new()
|
||||
imposter.master = M
|
||||
imposter.wiz_team = master.wiz_team
|
||||
master.wiz_team.add_member(imposter)
|
||||
I.mind.add_antag_datum(imposter)
|
||||
//Remove if possible
|
||||
SSticker.mode.apprentices += I.mind
|
||||
I.mind.special_role = "imposter"
|
||||
//
|
||||
I.log_message("is an imposter!", LOG_ATTACK, color="red") //?
|
||||
SEND_SOUND(I, sound('sound/effects/magic.ogg'))
|
||||
@@ -0,0 +1,12 @@
|
||||
/datum/round_event_control/wizard/invincible //Boolet Proof
|
||||
name = "Invincibility"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/invincible
|
||||
max_occurrences = 5
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/invincible/start()
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
H.reagents.add_reagent("adminordrazine", 40) //100 ticks of absolute invinciblity (barring gibs)
|
||||
to_chat(H, "<span class='notice'>You feel invincible, nothing can hurt you!</span>")
|
||||
@@ -0,0 +1,15 @@
|
||||
/datum/round_event_control/wizard/lava //THE LEGEND NEVER DIES
|
||||
name = "The Floor Is LAVA!"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/lava
|
||||
max_occurrences = 3
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/lava
|
||||
endWhen = 0
|
||||
var/started = FALSE
|
||||
|
||||
/datum/round_event/wizard/lava/start()
|
||||
if(!started)
|
||||
started = TRUE
|
||||
SSweather.run_weather(/datum/weather/floor_is_lava)
|
||||
@@ -0,0 +1,56 @@
|
||||
/datum/round_event_control/wizard/magicarp //these fish is loaded
|
||||
name = "Magicarp"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/magicarp
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/magicarp
|
||||
announceWhen = 3
|
||||
startWhen = 50
|
||||
|
||||
/datum/round_event/wizard/magicarp/setup()
|
||||
startWhen = rand(40, 60)
|
||||
|
||||
/datum/round_event/wizard/magicarp/announce(fake)
|
||||
priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
|
||||
/datum/round_event/wizard/magicarp/start()
|
||||
for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list)
|
||||
if(prob(5))
|
||||
new /mob/living/simple_animal/hostile/carp/ranged/chaos(C.loc)
|
||||
else
|
||||
new /mob/living/simple_animal/hostile/carp/ranged(C.loc)
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/ranged
|
||||
name = "magicarp"
|
||||
desc = "50% magic, 50% carp, 100% horrible."
|
||||
icon_state = "magicarp"
|
||||
icon_living = "magicarp"
|
||||
icon_dead = "magicarp_dead"
|
||||
icon_gib = "magicarp_gib"
|
||||
ranged = 1
|
||||
retreat_distance = 2
|
||||
minimum_distance = 0 //Between shots they can and will close in to nash
|
||||
projectiletype = /obj/item/projectile/magic
|
||||
projectilesound = 'sound/weapons/emitter.ogg'
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
var/allowed_projectile_types = list(/obj/item/projectile/magic/change, /obj/item/projectile/magic/animate, /obj/item/projectile/magic/resurrection,
|
||||
/obj/item/projectile/magic/death, /obj/item/projectile/magic/teleport, /obj/item/projectile/magic/door, /obj/item/projectile/magic/aoe/fireball,
|
||||
/obj/item/projectile/magic/spellblade, /obj/item/projectile/magic/arcane_barrage)
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/ranged/Initialize()
|
||||
projectiletype = pick(allowed_projectile_types)
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/ranged/chaos
|
||||
name = "chaos magicarp"
|
||||
desc = "50% carp, 100% magic, 150% horrible."
|
||||
color = "#00FFFF"
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot()
|
||||
projectiletype = pick(allowed_projectile_types)
|
||||
..()
|
||||
@@ -0,0 +1,32 @@
|
||||
/datum/round_event_control/wizard/petsplosion //the horror
|
||||
name = "Petsplosion"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/petsplosion
|
||||
max_occurrences = 1 //Exponential growth is nothing to sneeze at!
|
||||
earliest_start = 0 MINUTES
|
||||
var/mobs_to_dupe = 0
|
||||
|
||||
/datum/round_event_control/wizard/petsplosion/preRunEvent()
|
||||
for(var/mob/living/simple_animal/F in GLOB.alive_mob_list)
|
||||
if(!ishostile(F) && is_station_level(F.z))
|
||||
mobs_to_dupe++
|
||||
if(mobs_to_dupe > 100 || !mobs_to_dupe)
|
||||
return EVENT_CANT_RUN
|
||||
|
||||
..()
|
||||
|
||||
/datum/round_event/wizard/petsplosion
|
||||
endWhen = 61 //1 minute (+1 tick for endWhen not to interfere with tick)
|
||||
var/countdown = 0
|
||||
var/mobs_duped = 0
|
||||
|
||||
/datum/round_event/wizard/petsplosion/tick()
|
||||
if(activeFor >= 30 * countdown) // 0 seconds : 2 animals | 30 seconds : 4 animals | 1 minute : 8 animals
|
||||
countdown += 1
|
||||
for(var/mob/living/simple_animal/F in GLOB.alive_mob_list) //If you cull the heard before the next replication, things will be easier for you
|
||||
if(!ishostile(F) && is_station_level(F.z))
|
||||
new F.type(F.loc)
|
||||
mobs_duped++
|
||||
if(mobs_duped > 400)
|
||||
kill()
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/datum/round_event_control/wizard/race //Lizard Wizard? Lizard Wizard.
|
||||
name = "Race Swap"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/race
|
||||
max_occurrences = 5
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/race
|
||||
var/list/stored_name
|
||||
var/list/stored_species
|
||||
var/list/stored_dna
|
||||
|
||||
/datum/round_event/wizard/race/setup()
|
||||
stored_name = list()
|
||||
stored_species = list()
|
||||
stored_dna = list()
|
||||
endWhen = rand(600,1200) //10 to 20 minutes
|
||||
..()
|
||||
|
||||
/datum/round_event/wizard/race/start()
|
||||
|
||||
var/all_the_same = 0
|
||||
var/all_species = list()
|
||||
|
||||
for(var/speciestype in subtypesof(/datum/species))
|
||||
var/datum/species/S = new speciestype()
|
||||
if(!S.dangerous_existence && !S.blacklisted && !S.nojumpsuit) //Dangerous Species, Blacklisted Species, and Species who can't wear jumpsuits are blacklisted.
|
||||
all_species += speciestype
|
||||
|
||||
var/datum/species/new_species = pick(all_species)
|
||||
|
||||
if(prob(75))
|
||||
all_the_same = 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.carbon_list)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
continue
|
||||
if(!is_station_level(T.z))
|
||||
continue
|
||||
stored_name[H] = H.real_name
|
||||
stored_species[H] = H.dna.species
|
||||
stored_dna[H] = H.dna.unique_enzymes
|
||||
H.set_species(new_species)
|
||||
H.real_name = H.dna.species.random_name(H.gender,1)
|
||||
H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
|
||||
to_chat(H, "<span class='notice'>You feel somehow... different?</span>")
|
||||
if(!all_the_same)
|
||||
new_species = pick(all_species)
|
||||
|
||||
/datum/round_event/wizard/race/end()
|
||||
for(var/mob/living/carbon/human/H in GLOB.carbon_list)
|
||||
if(!(stored_name[H] && stored_species[H] && stored_dna[H]))
|
||||
continue
|
||||
H.set_species(stored_species[H])
|
||||
H.real_name = stored_name[H]
|
||||
H.dna.unique_enzymes = stored_dna[H]
|
||||
to_chat(H, "<span class='notice'>You feel back to your normal self again.</span>")
|
||||
@@ -0,0 +1,116 @@
|
||||
/datum/round_event_control/wizard/rpgloot //its time to minmax your shit
|
||||
name = "RPG Loot"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/rpgloot
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/rpgloot/start()
|
||||
var/upgrade_scroll_chance = 0
|
||||
for(var/obj/item/I in world)
|
||||
if(!istype(I.rpg_loot))
|
||||
I.rpg_loot = new(I)
|
||||
|
||||
if(istype(I, /obj/item/storage))
|
||||
var/obj/item/storage/S = I
|
||||
GET_COMPONENT_FROM(STR, /datum/component/storage, S)
|
||||
if(prob(upgrade_scroll_chance) && S.contents.len < STR.max_items && !S.invisibility)
|
||||
var/obj/item/upgradescroll/scroll = new
|
||||
SEND_SIGNAL(S, COMSIG_TRY_STORAGE_INSERT, scroll, null, TRUE, TRUE)
|
||||
upgrade_scroll_chance = max(0,upgrade_scroll_chance-100)
|
||||
upgrade_scroll_chance += 25
|
||||
|
||||
GLOB.rpg_loot_items = TRUE
|
||||
|
||||
/obj/item/upgradescroll
|
||||
name = "item fortification scroll"
|
||||
desc = "Somehow, this piece of paper can be applied to items to make them \"better\". Apparently there's a risk of losing the item if it's already \"too good\". <i>This all feels so arbitrary...</i>"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "scroll"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
var/upgrade_amount = 1
|
||||
var/can_backfire = TRUE
|
||||
var/one_use = TRUE
|
||||
|
||||
/obj/item/upgradescroll/afterattack(obj/item/target, mob/user , proximity)
|
||||
. = ..()
|
||||
if(!proximity || !istype(target))
|
||||
return
|
||||
|
||||
var/datum/rpg_loot/rpg_loot_datum = target.rpg_loot
|
||||
if(!istype(rpg_loot_datum))
|
||||
target.rpg_loot = rpg_loot_datum = new /datum/rpg_loot(target)
|
||||
|
||||
var/quality = rpg_loot_datum.quality
|
||||
|
||||
if(can_backfire && (quality > 9 && prob((quality - 9)*10)))
|
||||
to_chat(user, "<span class='danger'>[target] violently glows blue for a while, then evaporates.</span>")
|
||||
target.burn()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[target] glows blue and seems vaguely \"better\"!</span>")
|
||||
rpg_loot_datum.modify(upgrade_amount)
|
||||
|
||||
if(one_use)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/upgradescroll/unlimited
|
||||
name = "unlimited foolproof item fortification scroll"
|
||||
desc = "Somehow, this piece of paper can be applied to items to make them \"better\". This scroll is made from the tongues of dead paper wizards, and can be used an unlimited number of times, with no drawbacks."
|
||||
one_use = FALSE
|
||||
can_backfire = FALSE
|
||||
|
||||
/datum/rpg_loot
|
||||
var/positive_prefix = "okay"
|
||||
var/negative_prefix = "weak"
|
||||
var/suffix = "something profound"
|
||||
var/quality = 0
|
||||
|
||||
var/obj/item/attached
|
||||
var/original_name
|
||||
|
||||
/datum/rpg_loot/New(attached_item=null)
|
||||
attached = attached_item
|
||||
|
||||
randomise()
|
||||
|
||||
/datum/rpg_loot/Destroy()
|
||||
attached = null
|
||||
|
||||
/datum/rpg_loot/proc/randomise()
|
||||
var/static/list/prefixespositive = list("greater", "major", "blessed", "superior", "empowered", "honed", "true", "glorious", "robust")
|
||||
var/static/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped")
|
||||
var/static/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day")
|
||||
|
||||
var/new_quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
|
||||
|
||||
suffix = pick(suffixes)
|
||||
positive_prefix = pick(prefixespositive)
|
||||
negative_prefix = pick(prefixesnegative)
|
||||
|
||||
if(prob(50))
|
||||
new_quality = -new_quality
|
||||
|
||||
modify(new_quality)
|
||||
|
||||
/datum/rpg_loot/proc/rename()
|
||||
var/obj/item/I = attached
|
||||
if(!original_name)
|
||||
original_name = I.name
|
||||
if(quality < 0)
|
||||
I.name = "[negative_prefix] [original_name] of [suffix] [quality]"
|
||||
else if(quality == 0)
|
||||
I.name = "[original_name] of [suffix]"
|
||||
else if(quality > 0)
|
||||
I.name = "[positive_prefix] [original_name] of [suffix] +[quality]"
|
||||
|
||||
/datum/rpg_loot/proc/modify(quality_mod)
|
||||
var/obj/item/I = attached
|
||||
quality += quality_mod
|
||||
|
||||
I.force = max(0,I.force + quality_mod)
|
||||
I.throwforce = max(0,I.throwforce + quality_mod)
|
||||
|
||||
I.armor = I.armor.modifyAllRatings(quality)
|
||||
|
||||
rename()
|
||||
@@ -0,0 +1,104 @@
|
||||
/datum/round_event/wizard/shuffle/start()
|
||||
|
||||
|
||||
/datum/round_event_control/wizard/shuffleloc //Somewhere an AI is crying
|
||||
name = "Change Places!"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/shuffleloc
|
||||
max_occurrences = 5
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/shuffleloc/start()
|
||||
var/list/moblocs = list()
|
||||
var/list/mobs = list()
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
if(!is_station_level(H.z))
|
||||
continue //lets not try to strand people in space or stuck in the wizards den
|
||||
moblocs += H.loc
|
||||
mobs += H
|
||||
|
||||
if(!mobs)
|
||||
return
|
||||
|
||||
shuffle_inplace(moblocs)
|
||||
shuffle_inplace(mobs)
|
||||
|
||||
for(var/mob/living/carbon/human/H in mobs)
|
||||
if(!moblocs)
|
||||
break //locs aren't always unique, so this may come into play
|
||||
do_teleport(H, moblocs[moblocs.len], channel = TELEPORT_CHANNEL_MAGIC)
|
||||
moblocs.len -= 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
var/datum/effect_system/smoke_spread/smoke = new
|
||||
smoke.set_up(0, H.loc)
|
||||
smoke.start()
|
||||
|
||||
//---//
|
||||
|
||||
/datum/round_event_control/wizard/shufflenames //Face/off joke
|
||||
name = "Change Faces!"
|
||||
weight = 4
|
||||
typepath = /datum/round_event/wizard/shufflenames
|
||||
max_occurrences = 5
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/shufflenames/start()
|
||||
var/list/mobnames = list()
|
||||
var/list/mobs = list()
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
mobnames += H.real_name
|
||||
mobs += H
|
||||
|
||||
if(!mobs)
|
||||
return
|
||||
|
||||
shuffle_inplace(mobnames)
|
||||
shuffle_inplace(mobs)
|
||||
|
||||
for(var/mob/living/carbon/human/H in mobs)
|
||||
if(!mobnames)
|
||||
break
|
||||
H.real_name = mobnames[mobnames.len]
|
||||
mobnames.len -= 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
var/datum/effect_system/smoke_spread/smoke = new
|
||||
smoke.set_up(0, H.loc)
|
||||
smoke.start()
|
||||
|
||||
//---//
|
||||
|
||||
/datum/round_event_control/wizard/shuffleminds //Basically Mass Ranged Mindswap
|
||||
name = "Change Minds!"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/shuffleminds
|
||||
max_occurrences = 3
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event/wizard/shuffleminds/start()
|
||||
var/list/mobs = list()
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
if(H.stat || !H.mind || iswizard(H))
|
||||
continue //the wizard(s) are spared on this one
|
||||
mobs += H
|
||||
|
||||
if(!mobs)
|
||||
return
|
||||
|
||||
shuffle_inplace(mobs)
|
||||
|
||||
var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new /obj/effect/proc_holder/spell/targeted/mind_transfer
|
||||
while(mobs.len > 1)
|
||||
var/mob/living/carbon/human/H = pick(mobs)
|
||||
mobs -= H
|
||||
swapper.cast(list(H), mobs[mobs.len], 1)
|
||||
mobs -= mobs[mobs.len]
|
||||
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
var/datum/effect_system/smoke_spread/smoke = new
|
||||
smoke.set_up(0, H.loc)
|
||||
smoke.start()
|
||||
@@ -0,0 +1,29 @@
|
||||
/datum/round_event_control/wizard/summonguns //The Classic
|
||||
name = "Summon Guns"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/summonguns
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event_control/wizard/summonguns/New()
|
||||
if(CONFIG_GET(flag/no_summon_guns))
|
||||
weight = 0
|
||||
..()
|
||||
|
||||
/datum/round_event/wizard/summonguns/start()
|
||||
rightandwrong(SUMMON_GUNS, null, 10)
|
||||
|
||||
/datum/round_event_control/wizard/summonmagic //The Somewhat Less Classic
|
||||
name = "Summon Magic"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/summonmagic
|
||||
max_occurrences = 1
|
||||
earliest_start = 0 MINUTES
|
||||
|
||||
/datum/round_event_control/wizard/summonmagic/New()
|
||||
if(CONFIG_GET(flag/no_summon_magic))
|
||||
weight = 0
|
||||
..()
|
||||
|
||||
/datum/round_event/wizard/summonmagic/start()
|
||||
rightandwrong(SUMMON_MAGIC, null, 10)
|
||||
Reference in New Issue
Block a user