initial commit - cross reference with 5th port - obviously has compile errors
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
/datum/round_event_control/wizard/darkness
|
||||
name = "Advanced Darkness"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/darkness
|
||||
max_occurrences = 2
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/wizard/darkness
|
||||
endWhen = 0
|
||||
var/started = FALSE
|
||||
|
||||
|
||||
/datum/round_event/wizard/darkness/start()
|
||||
if(!started)
|
||||
started = TRUE
|
||||
var/datum/weather/advanced_darkness/darkness = new
|
||||
darkness.weather_start_up()
|
||||
@@ -0,0 +1,56 @@
|
||||
//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
|
||||
|
||||
/datum/round_event/wizard/robelesscasting/start()
|
||||
|
||||
for(var/mob/living/L in mob_list) //Hey if a corgi has magic missle he should get the same benifit as anyone
|
||||
if(L.mind && L.mind.spell_list.len != 0)
|
||||
var/spell_improved = 0
|
||||
for(var/obj/effect/proc_holder/spell/S in L.mind.spell_list)
|
||||
if(S.clothes_req)
|
||||
S.clothes_req = 0
|
||||
spell_improved = 1
|
||||
if(spell_improved)
|
||||
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
|
||||
|
||||
/datum/round_event/wizard/improvedcasting/start()
|
||||
for(var/mob/living/L in mob_list)
|
||||
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]"
|
||||
|
||||
L << "<span class='notice'>You suddenly feel more competent with your casting!</span>"
|
||||
@@ -0,0 +1,11 @@
|
||||
/datum/round_event_control/wizard/blobies //avast!
|
||||
name = "Zombie Outbreak"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/blobies/
|
||||
max_occurrences = 3
|
||||
earliest_start = 12000 // 20 minutes (gotta get some bodies made!)
|
||||
|
||||
/datum/round_event/wizard/blobies/start()
|
||||
|
||||
for(var/mob/living/carbon/human/H in 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
|
||||
|
||||
//Note about adding items to this: Because of how NODROP 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/wearslots = list(slot_wear_suit, slot_shoes, slot_head, slot_wear_mask, slot_r_hand, slot_gloves, slot_ears)
|
||||
var/list/loadout = list()
|
||||
var/ruins_spaceworthiness
|
||||
var/ruins_wizard_loadout
|
||||
loadout.len = 7
|
||||
|
||||
switch(item_set)
|
||||
if("wizardmimic")
|
||||
loadout = list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/shoes/sandal, /obj/item/clothing/head/wizard)
|
||||
ruins_spaceworthiness = 1
|
||||
if("swords")
|
||||
loadout[5] = /obj/item/weapon/katana/cursed
|
||||
if("bigfatdoobie")
|
||||
loadout[4] = /obj/item/clothing/mask/cigarette/rollie/trippy/
|
||||
ruins_spaceworthiness = 1
|
||||
if("boxing")
|
||||
loadout[4] = /obj/item/clothing/mask/luchador
|
||||
loadout[6] = /obj/item/clothing/gloves/boxing
|
||||
ruins_spaceworthiness = 1
|
||||
if("voicemodulators")
|
||||
loadout[4] = /obj/item/clothing/mask/chameleon
|
||||
if("catgirls2015")
|
||||
loadout[3] = /obj/item/clothing/head/kitty
|
||||
ruins_spaceworthiness = 1
|
||||
ruins_wizard_loadout = 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
if(ruins_spaceworthiness && (H.z != 1 || istype(H.loc, /turf/open/space)))
|
||||
continue //#savetheminers
|
||||
if(ruins_wizard_loadout && H.mind && ((H.mind in ticker.mode.wizards) || (H.mind in ticker.mode.apprentices)))
|
||||
continue
|
||||
if(item_set == "catgirls2015") //Wizard code means never having to say you're sorry
|
||||
H.gender = FEMALE
|
||||
var/list/slots = list(H.wear_suit, H.shoes, H.head, H.wear_mask, H.r_hand, H.gloves, H.ears) //add new slots as needed to back
|
||||
for(var/i = 1, i <= loadout.len, i++)
|
||||
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.unEquip(slots[i])
|
||||
H.equip_to_slot_or_del(I, wearslots[i])
|
||||
I.flags |= NODROP
|
||||
I.name = "cursed " + I.name
|
||||
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
var/datum/effect_system/smoke_spread/smoke = new
|
||||
smoke.set_up(0, H.loc)
|
||||
smoke.start()
|
||||
@@ -0,0 +1,53 @@
|
||||
/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
|
||||
|
||||
/datum/round_event/wizard/deprevolt/start()
|
||||
|
||||
var/list/tidecolor
|
||||
var/list/jobs_to_revolt = list()
|
||||
var/nation
|
||||
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 = 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 = pick("Mede", "Healtha", "Recova", "Chemi", "Geneti", "Viro", "Psych")
|
||||
if("yellow")
|
||||
jobs_to_revolt = list("Chief Engineer", "Station Engineer", "Atmospheric Technician")
|
||||
nation = pick("Atomo", "Engino", "Power", "Teleco")
|
||||
if("purple")
|
||||
jobs_to_revolt = list("Research Director","Scientist", "Roboticist")
|
||||
nation = pick("Sci", "Griffa", "Explosi", "Mecha", "Xeno")
|
||||
if("brown")
|
||||
jobs_to_revolt = list("Quartermaster", "Cargo Technician", "Shaft Miner")
|
||||
nation = 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 = pick("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi")
|
||||
|
||||
nation += pick("stan", "topia", "land", "nia", "ca", "tova", "dor", "ador", "tia", "sia", "ano", "tica", "tide", "cis", "marea", "co", "taoide", "slavia", "stotzka")
|
||||
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.mind)
|
||||
var/datum/mind/M = H.mind
|
||||
if(M.assigned_role && !(M in ticker.mode.traitors))
|
||||
for(var/job in jobs_to_revolt)
|
||||
if(M.assigned_role == job)
|
||||
citizens += H
|
||||
ticker.mode.traitors += M
|
||||
M.special_role = "separatist"
|
||||
H.attack_log += "\[[time_stamp()]\] <font color='red'>Was made into a separatist, long live [nation]!</font>"
|
||||
H << "<B>You are a separatist! [nation] forever! Protect the soverignty of your newfound land with your comrades in arms!</B>"
|
||||
if(citizens.len)
|
||||
var/message
|
||||
for(var/job in jobs_to_revolt)
|
||||
message += "[job],"
|
||||
message_admins("The nation of [nation] has been formed. Affected jobs are [message]")
|
||||
@@ -0,0 +1,12 @@
|
||||
/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
|
||||
|
||||
/datum/round_event/wizard/fake_explosion/start()
|
||||
for(var/mob/M in player_list)
|
||||
M << 'sound/machines/Alarm.ogg'
|
||||
spawn(100)
|
||||
ticker.station_explosion_cinematic(1,"fake") //:o)
|
||||
@@ -0,0 +1,27 @@
|
||||
/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 = 5
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/wizard/ghost/start()
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
G.invisibility = 0
|
||||
G << "You suddenly feel extremely obvious..."
|
||||
|
||||
|
||||
//--//
|
||||
|
||||
/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
|
||||
|
||||
/datum/round_event/wizard/possession/start()
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
G.verbs += /mob/dead/observer/verb/boo
|
||||
G.verbs += /mob/dead/observer/verb/possess
|
||||
G << "You suddenly feel a welling of new spooky powers..."
|
||||
@@ -0,0 +1,97 @@
|
||||
/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
|
||||
|
||||
/datum/round_event/wizard/greentext/start()
|
||||
|
||||
var/list/holder_canadates = 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/weapon/greentext(H.loc)
|
||||
H << "<font color='green'>The mythical greentext appear at your feet! Pick it up if you dare...</font>"
|
||||
|
||||
|
||||
/obj/item/weapon/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 = 4
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "greentext"
|
||||
var/mob/living/last_holder
|
||||
var/mob/living/new_holder
|
||||
var/list/color_altered_mobs = list()
|
||||
burn_state = FIRE_PROOF
|
||||
var/quiet = FALSE
|
||||
|
||||
/obj/item/weapon/greentext/New()
|
||||
..()
|
||||
poi_list |= src
|
||||
|
||||
/obj/item/weapon/greentext/equipped(mob/living/user as mob)
|
||||
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)
|
||||
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.color = "#00FF00"
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/greentext/dropped(mob/living/user as mob)
|
||||
if(user in color_altered_mobs)
|
||||
user << "<span class='warning'>A sudden wave of failure washes over you...</span>"
|
||||
user.color = "#FF0000" //ya blew it
|
||||
last_holder = null
|
||||
new_holder = null
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/greentext/process()
|
||||
if(new_holder && new_holder.z == ZLEVEL_CENTCOM)//you're winner!
|
||||
new_holder << "<font color='green'>At last it feels like victory is assured!</font>"
|
||||
if(!(new_holder in ticker.mode.traitors))
|
||||
ticker.mode.traitors += new_holder.mind
|
||||
new_holder.mind.special_role = "winner"
|
||||
var/datum/objective/O = new /datum/objective("Succeed")
|
||||
O.completed = 1 //YES!
|
||||
O.owner = new_holder.mind
|
||||
new_holder.mind.objectives += O
|
||||
new_holder.attack_log += "\[[time_stamp()]\] <font color='green'>Won with greentext!!!</font>"
|
||||
color_altered_mobs -= new_holder
|
||||
burn_state = ON_FIRE
|
||||
qdel(src)
|
||||
|
||||
if(last_holder && last_holder != new_holder) //Somehow it was swiped without ever getting dropped
|
||||
last_holder << "<span class='warning'>A sudden wave of failure washes over you...</span>"
|
||||
last_holder.color = "#FF0000"
|
||||
last_holder = new_holder //long live the king
|
||||
|
||||
/obj/item/weapon/greentext/Destroy(force)
|
||||
if((burn_state != ON_FIRE) && (!force))
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
. = ..()
|
||||
poi_list.Remove(src)
|
||||
for(var/mob/M in mob_list)
|
||||
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"
|
||||
M.color = initial(M.color)
|
||||
message += "...</span>"
|
||||
// can't skip the mob check as it also does the decolouring
|
||||
if(!quiet)
|
||||
M << message
|
||||
|
||||
/obj/item/weapon/greentext/quiet
|
||||
quiet = TRUE
|
||||
@@ -0,0 +1,58 @@
|
||||
/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
|
||||
|
||||
/datum/round_event/wizard/imposter/start()
|
||||
|
||||
for(var/datum/mind/M in ticker.mode.wizards)
|
||||
if(!ishuman(M.current))
|
||||
continue
|
||||
var/mob/living/carbon/human/W = M.current
|
||||
var/list/candidates = get_candidates(ROLE_WIZARD)
|
||||
if(!candidates)
|
||||
return //Sad Trombone
|
||||
var/client/C = pick(candidates)
|
||||
|
||||
PoolOrNew(/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()
|
||||
if(W.ears)
|
||||
I.equip_to_slot_or_del(new W.ears.type, slot_ears)
|
||||
if(W.w_uniform)
|
||||
I.equip_to_slot_or_del(new W.w_uniform.type , slot_w_uniform)
|
||||
if(W.shoes)
|
||||
I.equip_to_slot_or_del(new W.shoes.type, slot_shoes)
|
||||
if(W.wear_suit)
|
||||
I.equip_to_slot_or_del(new W.wear_suit.type, slot_wear_suit)
|
||||
if(W.head)
|
||||
I.equip_to_slot_or_del(new W.head.type, slot_head)
|
||||
if(W.back)
|
||||
I.equip_to_slot_or_del(new W.back.type, slot_back)
|
||||
I.key = C.key
|
||||
|
||||
//Operation: Fuck off and scare people
|
||||
I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
|
||||
I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
|
||||
I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
|
||||
|
||||
ticker.mode.apprentices += I.mind
|
||||
I.mind.special_role = "imposter"
|
||||
|
||||
var/datum/objective/protect/protect_objective = new /datum/objective/protect
|
||||
protect_objective.owner = I.mind
|
||||
protect_objective.target = W.mind
|
||||
protect_objective.explanation_text = "Protect [W.real_name], the wizard."
|
||||
I.mind.objectives += protect_objective
|
||||
ticker.mode.update_wiz_icons_added(I.mind)
|
||||
|
||||
I.attack_log += "\[[time_stamp()]\] <font color='red'>Is an imposter!</font>"
|
||||
I << "<B>You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!</B>"
|
||||
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
|
||||
|
||||
/datum/round_event/wizard/invincible/start()
|
||||
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
H.reagents.add_reagent("adminordrazine", 40) //100 ticks of absolute invinciblity (barring gibs)
|
||||
H << "<span class='notice'>You feel invincible, nothing can hurt you!</span>"
|
||||
@@ -0,0 +1,16 @@
|
||||
/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
|
||||
|
||||
/datum/round_event/wizard/lava/
|
||||
endWhen = 0
|
||||
var/started = FALSE
|
||||
|
||||
/datum/round_event/wizard/lava/start()
|
||||
if(!started)
|
||||
started = TRUE
|
||||
var/datum/weather/floor_is_lava/LAVA = new /datum/weather/floor_is_lava
|
||||
LAVA.weather_start_up()
|
||||
@@ -0,0 +1,54 @@
|
||||
/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
|
||||
|
||||
/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()
|
||||
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/C in landmarks_list)
|
||||
if(C.name == "carpspawn")
|
||||
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
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/ranged/New()
|
||||
projectiletype = pick(typesof(initial(projectiletype)))
|
||||
..()
|
||||
|
||||
/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(typesof(initial(projectiletype)))
|
||||
..()
|
||||
@@ -0,0 +1,17 @@
|
||||
/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
|
||||
|
||||
/datum/round_event/wizard/petsplosion/
|
||||
endWhen = 61 //1 minute (+1 tick for endWhen not to interfere with tick)
|
||||
var/countdown = 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 living_mob_list) //If you cull the heard before the next replication, things will be easier for you
|
||||
if(!istype(F, /mob/living/simple_animal/hostile))
|
||||
new F.type(F.loc)
|
||||
@@ -0,0 +1,29 @@
|
||||
/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
|
||||
|
||||
/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)
|
||||
all_species += speciestype
|
||||
|
||||
var/datum/species/new_species = pick(all_species)
|
||||
|
||||
if(prob(50))
|
||||
all_the_same = 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in mob_list) //yes, even the dead
|
||||
H.set_species(new_species)
|
||||
H.real_name = new_species.random_name(H.gender,1)
|
||||
H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
|
||||
H << "<span class='notice'>You feel somehow... different?</span>"
|
||||
if(!all_the_same)
|
||||
new_species = pick(all_species)
|
||||
@@ -0,0 +1,62 @@
|
||||
/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
|
||||
|
||||
/datum/round_event/wizard/rpgloot/start()
|
||||
var/list/prefixespositive = list("greater", "major", "blessed", "superior", "enpowered", "honed", "true", "glorious", "robust")
|
||||
var/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped")
|
||||
var/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/upgrade_scroll_chance = 0
|
||||
for(var/obj/item/I in world)
|
||||
if(istype(I,/obj/item/organ/))
|
||||
continue
|
||||
var/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)
|
||||
if(prob(50))
|
||||
quality = -quality
|
||||
if(quality > 0)
|
||||
I.name = "[pick(prefixespositive)] [I.name] of [pick(suffixes)] +[quality]"
|
||||
else if(quality < 0)
|
||||
I.name = "[pick(prefixesnegative)] [I.name] of [pick(suffixes)] [quality]"
|
||||
else
|
||||
I.name = "[I.name] of [pick(suffixes)]"
|
||||
|
||||
I.force = max(0,I.force + quality)
|
||||
I.throwforce = max(0,I.throwforce + quality)
|
||||
for(var/value in I.armor)
|
||||
I.armor[value] += quality
|
||||
|
||||
if(istype(I,/obj/item/weapon/storage))
|
||||
var/obj/item/weapon/storage/S = I
|
||||
if(prob(upgrade_scroll_chance) && S.contents.len < S.storage_slots)
|
||||
var/obj/item/upgradescroll/scroll = new
|
||||
S.handle_item_insertion(scroll,1)
|
||||
upgrade_scroll_chance = max(0,upgrade_scroll_chance-100)
|
||||
upgrade_scroll_chance += 25
|
||||
|
||||
/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 = 1
|
||||
|
||||
/obj/item/upgradescroll/afterattack(obj/item/target, mob/user , proximity)
|
||||
if(!proximity || !istype(target))
|
||||
return
|
||||
var/quality = target.force - initial(target.force)
|
||||
if(quality > 9 && prob((quality - 9)*10))
|
||||
user << "<span class='danger'>[target] catches fire!</span>"
|
||||
if(target.burn_state == -1)
|
||||
target.burn_state = 0
|
||||
target.fire_act()
|
||||
qdel(src)
|
||||
return
|
||||
target.force += 1
|
||||
target.throwforce += 1
|
||||
for(var/value in target.armor)
|
||||
target.armor[value] += 1
|
||||
user << "<span class='notice'>[target] glows blue and seems vaguely \"better\"!</span>"
|
||||
qdel(src)
|
||||
@@ -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
|
||||
|
||||
/datum/round_event/wizard/shuffleloc/start()
|
||||
var/list/moblocs = list()
|
||||
var/list/mobs = list()
|
||||
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
if(H.z != 1)
|
||||
continue //lets not try to strand people in space or stuck in the wizards den
|
||||
moblocs += H.loc
|
||||
mobs += H
|
||||
|
||||
if(!mobs)
|
||||
return
|
||||
|
||||
shuffle(moblocs)
|
||||
shuffle(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])
|
||||
moblocs.len -= 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in living_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
|
||||
|
||||
/datum/round_event/wizard/shufflenames/start()
|
||||
var/list/mobnames = list()
|
||||
var/list/mobs = list()
|
||||
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
mobnames += H.real_name
|
||||
mobs += H
|
||||
|
||||
if(!mobs)
|
||||
return
|
||||
|
||||
shuffle(mobnames)
|
||||
shuffle(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 living_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
|
||||
|
||||
/datum/round_event/wizard/shuffleminds/start()
|
||||
var/list/mobs = list()
|
||||
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
if(!H.stat || !H.mind || (H.mind in ticker.mode.wizards) || (H.mind in ticker.mode.apprentices))
|
||||
continue //the wizard(s) are spared on this one
|
||||
mobs += H
|
||||
|
||||
if(!mobs)
|
||||
return
|
||||
|
||||
shuffle(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 living_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
|
||||
|
||||
/datum/round_event_control/wizard/summonguns/New()
|
||||
if(config.no_summon_guns)
|
||||
weight = 0
|
||||
..()
|
||||
|
||||
/datum/round_event/wizard/summonguns/start()
|
||||
rightandwrong(0,,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
|
||||
|
||||
/datum/round_event_control/wizard/summonmagic/New()
|
||||
if(config.no_summon_magic)
|
||||
weight = 0
|
||||
..()
|
||||
|
||||
/datum/round_event/wizard/summonmagic/start()
|
||||
rightandwrong(1,,10)
|
||||
Reference in New Issue
Block a user