Revert "12/21 modernizations from TG live"
This commit is contained in:
@@ -28,8 +28,8 @@
|
||||
else
|
||||
temp = new
|
||||
|
||||
var/agent_mind = pick_n_take(candidates)
|
||||
var/scientist_mind = pick_n_take(candidates)
|
||||
var/agent_mind = popleft(candidates)
|
||||
var/scientist_mind = popleft(candidates)
|
||||
|
||||
var/mob/living/carbon/human/agent = makeBody(agent_mind)
|
||||
var/mob/living/carbon/human/scientist = makeBody(scientist_mind)
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
while(spawncount > 0 && vents.len && candidates.len)
|
||||
var/obj/vent = pick_n_take(vents)
|
||||
var/client/C = pick_n_take(candidates)
|
||||
var/client/C = popleft(candidates)
|
||||
|
||||
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
|
||||
new_xeno.key = C.key
|
||||
|
||||
@@ -31,3 +31,13 @@
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/flux(T)
|
||||
|
||||
/datum/round_event/anomaly/tick()
|
||||
if(!newAnomaly)
|
||||
kill()
|
||||
return
|
||||
newAnomaly.anomalyEffect()
|
||||
|
||||
/datum/round_event/anomaly/end()
|
||||
if(newAnomaly)//Kill the anomaly if it still exists at the end.
|
||||
qdel(newAnomaly)
|
||||
@@ -7,6 +7,7 @@
|
||||
/datum/round_event/anomaly/anomaly_bluespace
|
||||
startWhen = 3
|
||||
announceWhen = 10
|
||||
endWhen = 95
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_bluespace/announce()
|
||||
@@ -17,3 +18,57 @@
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/bluespace(T)
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_bluespace/end()
|
||||
if(newAnomaly.loc)//If it hasn't been neutralized, it's time to warp half the station away jeez
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
// Calculate new position (searches through beacons in world)
|
||||
var/obj/item/device/radio/beacon/chosen
|
||||
var/list/possible = list()
|
||||
for(var/obj/item/device/radio/beacon/W in world)
|
||||
possible += W
|
||||
|
||||
if(possible.len > 0)
|
||||
chosen = pick(possible)
|
||||
|
||||
if(chosen)
|
||||
// Calculate previous position for transition
|
||||
|
||||
var/turf/FROM = T // the turf of origin we're travelling FROM
|
||||
var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO
|
||||
|
||||
playsound(TO, 'sound/effects/phasein.ogg', 100, 1)
|
||||
priority_announce("Massive bluespace translocation detected.", "Anomaly Alert")
|
||||
|
||||
var/list/flashers = list()
|
||||
for(var/mob/living/carbon/C in viewers(TO, null))
|
||||
if(C.flash_eyes())
|
||||
flashers += C
|
||||
|
||||
var/y_distance = TO.y - FROM.y
|
||||
var/x_distance = TO.x - FROM.x
|
||||
for (var/atom/movable/A in urange(12, FROM )) // iterate thru list of mobs in the area
|
||||
if(istype(A, /obj/item/device/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid
|
||||
if(A.anchored) continue
|
||||
|
||||
var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place
|
||||
if(!A.Move(newloc) && newloc) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving
|
||||
A.loc = newloc
|
||||
|
||||
spawn()
|
||||
if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect
|
||||
var/mob/M = A
|
||||
if(M.client)
|
||||
var/obj/blueeffect = new /obj(src)
|
||||
blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH"
|
||||
blueeffect.icon = 'icons/effects/effects.dmi'
|
||||
blueeffect.icon_state = "shieldsparkles"
|
||||
blueeffect.layer = FLASH_LAYER
|
||||
blueeffect.mouse_opacity = 0
|
||||
M.client.screen += blueeffect
|
||||
sleep(20)
|
||||
M.client.screen -= blueeffect
|
||||
qdel(blueeffect)
|
||||
qdel(newAnomaly)
|
||||
@@ -9,6 +9,8 @@
|
||||
/datum/round_event/anomaly/anomaly_flux
|
||||
startWhen = 3
|
||||
announceWhen = 20
|
||||
endWhen = 80
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_flux/announce()
|
||||
priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
@@ -18,3 +20,9 @@
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/flux(T)
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_flux/end()
|
||||
if(newAnomaly.loc)//If it hasn't been neutralized, it's time to blow up.
|
||||
explosion(newAnomaly, 1, 4, 16, 18) //Low devastation, but hits a lot of stuff.
|
||||
qdel(newAnomaly)
|
||||
@@ -7,6 +7,8 @@
|
||||
/datum/round_event/anomaly/anomaly_grav
|
||||
startWhen = 3
|
||||
announceWhen = 20
|
||||
endWhen = 120
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_grav/announce()
|
||||
priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
@@ -14,4 +16,4 @@
|
||||
/datum/round_event/anomaly/anomaly_grav/start()
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/grav(T)
|
||||
newAnomaly = new /obj/effect/anomaly/grav(T)
|
||||
@@ -7,6 +7,8 @@
|
||||
/datum/round_event/anomaly/anomaly_pyro
|
||||
startWhen = 10
|
||||
announceWhen = 3
|
||||
endWhen = 85
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_pyro/announce()
|
||||
priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
@@ -15,3 +17,23 @@
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/pyro(T)
|
||||
|
||||
/datum/round_event/anomaly/anomaly_pyro/tick()
|
||||
if(!newAnomaly)
|
||||
kill()
|
||||
return
|
||||
if(IsMultiple(activeFor, 5))
|
||||
newAnomaly.anomalyEffect()
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_pyro/end()
|
||||
if(newAnomaly.loc)
|
||||
var/turf/open/T = get_turf(newAnomaly)
|
||||
if(istype(T))
|
||||
T.atmos_spawn_air("o2=500;plasma=500;TEMP=1000") //Make it hot and burny for the new slime
|
||||
|
||||
var/mob/living/simple_animal/slime/S = new/mob/living/simple_animal/slime(T)
|
||||
S.colour = pick("red", "orange")
|
||||
S.rabid = 1
|
||||
|
||||
qdel(newAnomaly)
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
/datum/round_event/anomaly/anomaly_vortex
|
||||
startWhen = 10
|
||||
announceWhen = 3
|
||||
endWhen = 95
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_vortex/announce()
|
||||
priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
|
||||
@@ -16,4 +18,4 @@
|
||||
/datum/round_event/anomaly/anomaly_vortex/start()
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
newAnomaly = new /obj/effect/anomaly/bhole(T)
|
||||
newAnomaly = new /obj/effect/anomaly/bhole(T)
|
||||
+12
-20
@@ -1,6 +1,6 @@
|
||||
/datum/round_event_control/blob
|
||||
name = "Blob"
|
||||
typepath = /datum/round_event/ghost_role/blob
|
||||
typepath = /datum/round_event/blob
|
||||
weight = 5
|
||||
max_occurrences = 1
|
||||
|
||||
@@ -9,30 +9,22 @@
|
||||
|
||||
gamemode_blacklist = list("blob") //Just in case a blob survives that long
|
||||
|
||||
/datum/round_event/ghost_role/blob
|
||||
/datum/round_event/blob
|
||||
announceWhen = 12
|
||||
role_name = "blob_overmind"
|
||||
endWhen = 120
|
||||
var/new_rate = 2
|
||||
|
||||
/datum/round_event/ghost_role/blob/New(my_processing = TRUE, set_point_rate)
|
||||
/datum/round_event/blob/New(var/strength)
|
||||
..()
|
||||
if(set_point_rate)
|
||||
new_rate = set_point_rate
|
||||
if(strength)
|
||||
new_rate = strength
|
||||
|
||||
/datum/round_event/ghost_role/blob/announce()
|
||||
/datum/round_event/blob/announce()
|
||||
priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg')
|
||||
|
||||
|
||||
/datum/round_event/ghost_role/blob/spawn_role()
|
||||
if(!blobstart.len)
|
||||
return MAP_ERROR
|
||||
var/list/candidates = get_candidates("blob", null, ROLE_BLOB)
|
||||
if(!candidates.len)
|
||||
return NOT_ENOUGH_PLAYERS
|
||||
var/mob/dead/observer/new_blob = pick(candidates)
|
||||
var/obj/structure/blob/core/BC = new/obj/structure/blob/core(pick(blobstart), new_blob.client, new_rate)
|
||||
BC.overmind.blob_points = min(20 + player_list.len, BC.overmind.max_blob_points)
|
||||
spawned_mobs += BC.overmind
|
||||
message_admins("[BC.overmind.key] has been made into a blob overmind by an event.")
|
||||
log_game("[BC.overmind.key] was spawned as a blob overmind by an event.")
|
||||
return SUCCESSFUL_SPAWN
|
||||
/datum/round_event/blob/start()
|
||||
var/turf/T = pick(blobstart)
|
||||
if(!T)
|
||||
return kill()
|
||||
new/obj/effect/blob/core(T, null, new_rate)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
if(!candidates.len)
|
||||
return NOT_ENOUGH_PLAYERS
|
||||
|
||||
var/mob/dead/selected_candidate = pick_n_take(candidates)
|
||||
var/mob/dead/selected_candidate = popleft(candidates)
|
||||
var/key = selected_candidate.key
|
||||
|
||||
var/datum/mind/Mind = create_devil_mind(key)
|
||||
@@ -33,9 +33,7 @@
|
||||
var/mob/living/carbon/human/devil = create_event_devil(spawn_loc)
|
||||
Mind.transfer_to(devil)
|
||||
ticker.mode.finalize_devil(Mind)
|
||||
ticker.mode.add_devil_objectives(src, 2)
|
||||
Mind.announceDevilLaws()
|
||||
Mind.announce_objectives()
|
||||
|
||||
|
||||
spawned_mobs += devil
|
||||
|
||||
+10
-19
@@ -1,30 +1,21 @@
|
||||
/datum/round_event_control/space_dust
|
||||
/datum/round_event_control/meteor_wave/dust
|
||||
name = "Minor Space Dust"
|
||||
typepath = /datum/round_event/space_dust
|
||||
typepath = /datum/round_event/meteor_wave/dust
|
||||
weight = 200
|
||||
max_occurrences = 1000
|
||||
earliest_start = 0
|
||||
alertadmins = 0
|
||||
|
||||
/datum/round_event/space_dust
|
||||
|
||||
/datum/round_event/meteor_wave/dust
|
||||
startWhen = 1
|
||||
endWhen = 2
|
||||
announceWhen = 0
|
||||
|
||||
/datum/round_event/space_dust/start()
|
||||
/datum/round_event/meteor_wave/dust/announce()
|
||||
return
|
||||
|
||||
/datum/round_event/meteor_wave/dust/start()
|
||||
spawn_meteors(1, meteorsC)
|
||||
|
||||
/datum/round_event_control/sandstorm
|
||||
name = "Sandstorm"
|
||||
typepath = /datum/round_event/sandstorm
|
||||
weight = 0
|
||||
max_occurrences = 0
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/sandstorm
|
||||
startWhen = 1
|
||||
endWhen = 150 // ~5 min
|
||||
announceWhen = 0
|
||||
|
||||
/datum/round_event/sandstorm/tick()
|
||||
spawn_meteors(10, meteorsC)
|
||||
/datum/round_event/meteor_wave/dust/tick()
|
||||
return
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define MAX_SPAWN_ATTEMPT 3
|
||||
|
||||
|
||||
/datum/round_event/ghost_role
|
||||
// We expect 0 or more /clients (or things with .key) in this list
|
||||
var/list/priority_candidates = list()
|
||||
@@ -11,24 +8,18 @@
|
||||
/datum/round_event/ghost_role/start()
|
||||
try_spawning()
|
||||
|
||||
/datum/round_event/ghost_role/proc/try_spawning(sanity = 0, retry = 0)
|
||||
/datum/round_event/ghost_role/proc/try_spawning(sanity = 0)
|
||||
// The event does not run until the spawning has been attempted
|
||||
// to prevent us from getting gc'd halfway through
|
||||
processing = FALSE
|
||||
|
||||
var/status = spawn_role()
|
||||
if((status == WAITING_FOR_SOMETHING))
|
||||
if(retry >= MAX_SPAWN_ATTEMPT)
|
||||
message_admins("[role_name] event has exceeded maximum spawn attempts. Aborting and refunding.")
|
||||
if(control && control.occurrences > 0) //Don't refund if it hasn't
|
||||
control.occurrences--
|
||||
return
|
||||
var/waittime = 300 * (2^retry)
|
||||
if(status == WAITING_FOR_SOMETHING)
|
||||
message_admins("The event will not spawn a [role_name] until certain \
|
||||
conditions are met. Waiting [waittime/10]s and then retrying.")
|
||||
spawn(waittime)
|
||||
conditions are met. Waiting 30s and then retrying.")
|
||||
spawn(300)
|
||||
// I hope this doesn't end up running out of stack space
|
||||
try_spawning(0,++retry)
|
||||
try_spawning()
|
||||
return
|
||||
|
||||
if(status == MAP_ERROR)
|
||||
@@ -69,4 +60,3 @@
|
||||
|
||||
return candidates
|
||||
|
||||
#undef MAX_SPAWN_ATTEMPT
|
||||
@@ -1,19 +0,0 @@
|
||||
/datum/round_event_control/grid_check
|
||||
name = "Grid Check"
|
||||
typepath = /datum/round_event/grid_check
|
||||
weight = 10
|
||||
max_occurrences = 3
|
||||
|
||||
/datum/round_event/grid_check
|
||||
announceWhen = 1
|
||||
startWhen = 1
|
||||
|
||||
/datum/round_event/grid_check/announce()
|
||||
priority_announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", 'sound/AI/poweroff.ogg')
|
||||
|
||||
|
||||
/datum/round_event/grid_check/start()
|
||||
for(var/P in apcs_list)
|
||||
var/obj/machinery/power/apc/C = P
|
||||
if(C.cell && C.z == ZLEVEL_STATION)
|
||||
C.energy_fail(rand(30,120))
|
||||
@@ -11,17 +11,13 @@
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
var/obj/item/weapon/storage/backpack/b = locate() in H.contents
|
||||
new /obj/item/weapon/storage/spooky(b)
|
||||
if(ishuman(H) || islizard(H))
|
||||
if(prob(50))
|
||||
H.set_species(/datum/species/skeleton)
|
||||
else
|
||||
H.set_species(/datum/species/zombie)
|
||||
if(prob(50))
|
||||
H.set_species(/datum/species/skeleton)
|
||||
else
|
||||
H.set_species(/datum/species/zombie)
|
||||
|
||||
for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in mob_list)
|
||||
Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian))
|
||||
for(var/mob/living/simple_animal/parrot/Poly/Poly in mob_list)
|
||||
new /mob/living/simple_animal/parrot/Poly/ghost(Poly.loc)
|
||||
qdel(Poly)
|
||||
|
||||
/datum/round_event/spooky/announce()
|
||||
priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE")
|
||||
@@ -54,50 +50,6 @@
|
||||
if(IsMultiple(activeFor, 4))
|
||||
spawn_meteors(3, meteorsSPOOKY) //meteor list types defined in gamemode/meteor/meteors.dm
|
||||
|
||||
//Creepy clown invasion
|
||||
/datum/round_event_control/creepy_clowns
|
||||
name = "Clowns"
|
||||
typepath = /datum/round_event/creepy_clowns
|
||||
holidayID = HALLOWEEN
|
||||
weight = 20
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/creepy_clowns
|
||||
endWhen = 40
|
||||
|
||||
/datum/round_event/creepy_clowns/start()
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
if(!H.client || !istype(H))
|
||||
return
|
||||
H << "<span class='danger'>Honk...</span>"
|
||||
H << 'sound/spookoween/scary_clown_appear.ogg'
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
new /obj/effect/hallucination/simple/clown(T, H, 50)
|
||||
|
||||
/datum/round_event/creepy_clowns/tick()
|
||||
if(IsMultiple(activeFor, 4))
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
if (prob(66))
|
||||
playsound(H.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, 1)
|
||||
if (prob(33))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
new /obj/effect/hallucination/simple/clown(T, H, 25)
|
||||
else if (prob(25))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
new /obj/effect/hallucination/simple/clown/scary(T, H, 25)
|
||||
else if (prob(5))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T)
|
||||
spawn_atom_to_turf(/obj/effect/mob_spawn/human/corpse/clown, H, 1)
|
||||
else if (prob(1))
|
||||
spawn_atom_to_turf(/mob/living/simple_animal/hostile/retaliate/clown, H, 1)
|
||||
|
||||
/datum/round_event/creepy_clowns/announce()
|
||||
priority_announce("Honk... Honk... honk... HONK! HONK! HONKHONKHONKHONKHONK", "HONK!", 'sound/spookoween/scary_horn.ogg')
|
||||
|
||||
//spooky foods (you can't actually make these when it's not halloween)
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sugarcookie/spookyskull
|
||||
name = "skull cookie"
|
||||
@@ -116,7 +68,7 @@
|
||||
|
||||
/obj/item/weapon/storage/spooky
|
||||
name = "trick-o-treat bag"
|
||||
desc = "A pumpkin-shaped bag that holds all sorts of goodies!"
|
||||
desc = "A Pumpkin shaped bag that holds all sorts of goodies!"
|
||||
icon = 'icons/obj/halloween_items.dmi'
|
||||
icon_state = "treatbag"
|
||||
|
||||
@@ -127,12 +79,5 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sugarcookie/spookycoffin,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy_corn,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candy,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/candiedapple,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
|
||||
/obj/item/organ/brain ) // OH GOD THIS ISN'T CANDY!
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
|
||||
new type(src)
|
||||
|
||||
/obj/item/weapon/card/emag/halloween
|
||||
name = "hack-o'-lantern"
|
||||
desc = "It's a pumpkin with a cryptographic sequencer sticking out."
|
||||
icon_state = "hack_o_lantern"
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/datum/round_event/valentines/start()
|
||||
..()
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
H.put_in_hands(new /obj/item/weapon/valentine)
|
||||
var/obj/item/weapon/storage/backpack/b = locate() in H.contents
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/candyheart(b)
|
||||
@@ -28,8 +28,8 @@
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "sc_Ace of Hearts_syndicate" // shut up
|
||||
var/message = "A generic message of love or whatever."
|
||||
resistance_flags = FLAMMABLE
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
burn_state = FLAMMABLE
|
||||
w_class = 1
|
||||
|
||||
/obj/item/weapon/valentine/New()
|
||||
..()
|
||||
@@ -55,6 +55,7 @@
|
||||
"You're always valid to my heart.",
|
||||
"I'd risk the wrath of the gods to bwoink you.",
|
||||
"You look as beautiful now as the last time you were cloned.",
|
||||
"Your love is more valuable than raw plasma ore.",
|
||||
"Someone check the gravitational generator, because I'm only attracted to you.",
|
||||
"If I were the warden I'd always let you into my armory.",
|
||||
"The virologist is rogue, and the only cure is a kiss from you.",
|
||||
@@ -72,9 +73,7 @@
|
||||
"If you had a pickaxe you'd be a shaft FINEr.",
|
||||
"Roses are red, tide is gray, if I were an assistant I'd steal you away.",
|
||||
"Roses are red, text is green, I love you more than cleanbots clean.",
|
||||
"If you were a carp I'd fi-lay you.",
|
||||
"I'm a nuke op, and my pinpointer leads to your heart.",
|
||||
"Wanna slay my megafauna?" )
|
||||
"If you were a carp I'd fi-lay you." )
|
||||
|
||||
/obj/item/weapon/valentine/attackby(obj/item/weapon/W, mob/user, params)
|
||||
..()
|
||||
@@ -124,6 +123,5 @@
|
||||
"A heart-shaped candy that reads: WAG MY TAIL",
|
||||
"A heart-shaped candy that reads: VALIDTINES",
|
||||
"A heart-shaped candy that reads: FACEHUGGER",
|
||||
"A heart-shaped candy that reads: DOMINATOR",
|
||||
"A heart-shaped candy that reads: GET TESLA'D")
|
||||
"A heart-shaped candy that reads: DOMINATOR")
|
||||
icon_state = pick("candyheart", "candyheart2", "candyheart3", "candyheart4")
|
||||
@@ -47,7 +47,7 @@
|
||||
var/cracked = 0
|
||||
|
||||
/obj/item/weapon/toy/xmas_cracker/attack(mob/target, mob/user)
|
||||
if( !cracked && ishuman(target) && (target.stat == CONSCIOUS) && !target.get_active_held_item() )
|
||||
if( !cracked && istype(target,/mob/living/carbon/human) && (target.stat == CONSCIOUS) && !target.get_active_hand() )
|
||||
target.visible_message("[user] and [target] pop \an [src]! *pop*", "<span class='notice'>You pull \an [src] with [target]! *pop*</span>", "<span class='italics'>You hear a pop.</span>")
|
||||
var/obj/item/weapon/paper/Joke = new /obj/item/weapon/paper(user.loc)
|
||||
Joke.name = "[pick("awful","terrible","unfunny")] joke"
|
||||
@@ -78,15 +78,7 @@
|
||||
icon_state = "xmashat"
|
||||
desc = "A crappy paper hat that you are REQUIRED to wear."
|
||||
flags_inv = 0
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0)
|
||||
|
||||
/obj/effect/landmark/xmastree
|
||||
name = "christmas tree spawner"
|
||||
var/tree = /obj/structure/flora/tree/pine/xmas
|
||||
|
||||
/obj/effect/landmark/xmastree/rdrod
|
||||
name = "festivus pole spawner"
|
||||
tree = /obj/structure/festivus
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/datum/round_event_control/santa
|
||||
name = "Santa is coming to town! (Christmas)"
|
||||
|
||||
@@ -26,7 +26,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
new /obj/effect/immovablerod(startT, endT)
|
||||
|
||||
/obj/effect/immovablerod
|
||||
name = "immovable rod"
|
||||
name = "Immovable Rod"
|
||||
desc = "What the fuck is that?"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "immrod"
|
||||
@@ -37,62 +37,38 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
|
||||
var/destination
|
||||
|
||||
/obj/effect/immovablerod/New(atom/start, atom/end)
|
||||
..()
|
||||
if(SSaugury)
|
||||
SSaugury.register_doom(src, 2000)
|
||||
loc = start
|
||||
z_original = z
|
||||
destination = end
|
||||
notify_ghosts("\A [src] is inbound!",
|
||||
enter_link="<a href=?src=\ref[src];orbit=1>(Click to orbit)</a>",
|
||||
source=src, action=NOTIFY_ORBIT)
|
||||
poi_list += src
|
||||
if(end && end.z==z_original)
|
||||
walk_towards(src, destination, 1)
|
||||
|
||||
/obj/effect/immovablerod/Topic(href, href_list)
|
||||
if(href_list["orbit"])
|
||||
var/mob/dead/observer/ghost = usr
|
||||
if(istype(ghost))
|
||||
ghost.ManualFollow(src)
|
||||
|
||||
/obj/effect/immovablerod/Destroy()
|
||||
poi_list -= src
|
||||
. = ..()
|
||||
|
||||
/obj/effect/immovablerod/Move()
|
||||
if((z != z_original) || (loc == destination))
|
||||
if(z != z_original || loc == destination)
|
||||
qdel(src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/immovablerod/ex_act(severity, target)
|
||||
/obj/effect/immovablerod/ex_act(test)
|
||||
return 0
|
||||
|
||||
/obj/effect/immovablerod/Bump(atom/clong)
|
||||
if(prob(10))
|
||||
playsound(src, 'sound/effects/bang.ogg', 50, 1)
|
||||
audible_message("<span class='danger'>You hear a CLANG!</span>")
|
||||
audible_message("CLANG")
|
||||
|
||||
if(clong && prob(25))
|
||||
x = clong.x
|
||||
y = clong.y
|
||||
|
||||
if(isturf(clong) || isobj(clong))
|
||||
if (istype(clong, /turf) || istype(clong, /obj))
|
||||
if(clong.density)
|
||||
clong.ex_act(2)
|
||||
|
||||
else if(ismob(clong))
|
||||
if(ishuman(clong))
|
||||
else if (istype(clong, /mob))
|
||||
if(istype(clong, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = clong
|
||||
H.visible_message("<span class='danger'>[H.name] is penetrated by an immovable rod!</span>" , "<span class='userdanger'>The rod penetrates you!</span>" , "<span class ='danger'>You hear a CLANG!</span>")
|
||||
H.adjustBruteLoss(160)
|
||||
if(clong.density || prob(10))
|
||||
clong.ex_act(2)
|
||||
else if(istype(clong, type))
|
||||
var/obj/effect/immovablerod/other = clong
|
||||
visible_message("<span class='danger'>[src] collides with [other]!\
|
||||
</span>")
|
||||
var/datum/effect_system/smoke_spread/smoke = new
|
||||
smoke.set_up(2, get_turf(src))
|
||||
smoke.start()
|
||||
qdel(src)
|
||||
qdel(other)
|
||||
return
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
var/message = generate_ion_law(ionMessage)
|
||||
if(message)
|
||||
M.add_ion_law(message)
|
||||
log_game("ION law added to [M]: [message]")
|
||||
M << "<br>"
|
||||
M << "<span class='danger'>[message] ...LAWS UPDATED</span>"
|
||||
M << "<br>"
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
/datum/round_event_control/meteor_wave/major_dust
|
||||
name = "Major Space Dust"
|
||||
typepath = /datum/round_event/meteor_wave/major_dust
|
||||
weight = 8
|
||||
|
||||
/datum/round_event/meteor_wave/major_dust
|
||||
wave_name = "space dust"
|
||||
|
||||
/datum/round_event/meteor_wave/major_dust/announce()
|
||||
var/reason = pick(
|
||||
"The station is passing through a debris cloud, expect minor damage \
|
||||
to external fittings and fixtures.",
|
||||
"Nanotrasen Superweapons Division is testing a new prototype \
|
||||
[pick("field","projection","nova","super-colliding","reactive")] \
|
||||
[pick("cannon","artillery","tank","cruiser","\[REDACTED\]")], \
|
||||
some mild debris is expected.",
|
||||
"A neighbouring station is throwing rocks at you. (Perhaps they've \
|
||||
grown tired of your messages.)")
|
||||
priority_announce(pick(reason), "Collision Alert")
|
||||
@@ -1,11 +1,12 @@
|
||||
/datum/round_event_control/meteor_wave/meaty
|
||||
name = "Meteor Wave: Meaty"
|
||||
name = "Meaty Ore Wave"
|
||||
typepath = /datum/round_event/meteor_wave/meaty
|
||||
weight = 2
|
||||
weight = 1
|
||||
max_occurrences = 1
|
||||
|
||||
/datum/round_event/meteor_wave/meaty
|
||||
wave_name = "meaty"
|
||||
|
||||
/datum/round_event/meteor_wave/meaty/announce()
|
||||
priority_announce("Meaty ores have been detected on collision course with the station.", "Oh crap, get the mop.",'sound/AI/meteors.ogg')
|
||||
|
||||
/datum/round_event/meteor_wave/meaty/tick()
|
||||
if(IsMultiple(activeFor, 3))
|
||||
spawn_meteors(5, meteorsB) //meteor list types defined in gamemode/meteor/meteors.dm
|
||||
@@ -1,9 +1,7 @@
|
||||
// Normal strength
|
||||
|
||||
/datum/round_event_control/meteor_wave
|
||||
name = "Meteor Wave: Normal"
|
||||
name = "Meteor Wave"
|
||||
typepath = /datum/round_event/meteor_wave
|
||||
weight = 4
|
||||
weight = 5
|
||||
min_players = 5
|
||||
max_occurrences = 3
|
||||
|
||||
@@ -12,57 +10,25 @@
|
||||
endWhen = 66
|
||||
announceWhen = 1
|
||||
var/list/wave_type
|
||||
var/wave_name = "normal"
|
||||
|
||||
/datum/round_event/meteor_wave/New()
|
||||
..()
|
||||
if(!wave_type)
|
||||
determine_wave_type()
|
||||
random_wave_type()
|
||||
|
||||
/datum/round_event/meteor_wave/proc/determine_wave_type()
|
||||
if(!wave_name)
|
||||
wave_name = pickweight(list(
|
||||
"normal" = 50,
|
||||
"threatening" = 40,
|
||||
"catastrophic" = 10))
|
||||
switch(wave_name)
|
||||
/datum/round_event/meteor_wave/proc/random_wave_type()
|
||||
var/picked_wave = pickweight(list("normal" = 50, "threatening" = 40, "catastrophic" = 10))
|
||||
switch(picked_wave)
|
||||
if("normal")
|
||||
wave_type = meteors_normal
|
||||
if("threatening")
|
||||
wave_type = meteors_threatening
|
||||
if("catastrophic")
|
||||
wave_type = meteors_catastrophic
|
||||
if("meaty")
|
||||
wave_type = meteorsB
|
||||
if("space dust")
|
||||
wave_type = meteorsC
|
||||
else
|
||||
WARNING("Wave name of [wave_name] not recognised.")
|
||||
kill()
|
||||
|
||||
/datum/round_event/meteor_wave/announce()
|
||||
priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/AI/meteors.ogg')
|
||||
|
||||
|
||||
/datum/round_event/meteor_wave/tick()
|
||||
if(IsMultiple(activeFor, 3))
|
||||
spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm
|
||||
|
||||
/datum/round_event_control/meteor_wave/threatening
|
||||
name = "Meteor Wave: Threatening"
|
||||
typepath = /datum/round_event/meteor_wave/threatening
|
||||
weight = 2
|
||||
min_players = 5
|
||||
max_occurrences = 3
|
||||
|
||||
/datum/round_event/meteor_wave/threatening
|
||||
wave_name = "threatening"
|
||||
|
||||
/datum/round_event_control/meteor_wave/catastrophic
|
||||
name = "Meteor Wave: Catastrophic"
|
||||
typepath = /datum/round_event/meteor_wave/catastrophic
|
||||
weight = 1
|
||||
min_players = 5
|
||||
max_occurrences = 3
|
||||
|
||||
/datum/round_event/meteor_wave/catastrophic
|
||||
wave_name = "catastrophic"
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
/datum/round_event_control/mice_migration
|
||||
name = "Mice Migration"
|
||||
typepath = /datum/round_event/mice_migration
|
||||
weight = 10
|
||||
|
||||
/datum/round_event/mice_migration
|
||||
announceWhen = 0
|
||||
var/minimum_mice = 5
|
||||
var/maximum_mice = 15
|
||||
|
||||
/datum/round_event/mice_migration/announce()
|
||||
var/cause = pick("space-winter", "budget-cuts", "Ragnarok",
|
||||
"space being cold", "\[REDACTED\]", "climate change",
|
||||
"bad luck")
|
||||
var/plural = pick("a number of", "a horde of", "a pack of", "a swarm of",
|
||||
"a whoop of", "not more than [maximum_mice]")
|
||||
var/name = pick("rodents", "mice", "squeaking things",
|
||||
"wire eating mammals", "\[REDACTED\]", "energy draining parasites")
|
||||
var/movement = pick("migrated", "swarmed", "stampeded", "descended")
|
||||
var/location = pick("maintenance tunnels", "maintenance areas",
|
||||
"\[REDACTED\]", "place with all those juicy wires")
|
||||
|
||||
priority_announce("Due to [cause], [plural] [name] have [movement] \
|
||||
into the [location].", "Migration Alert",
|
||||
'sound/effects/mousesqueek.ogg', 100, 1)
|
||||
|
||||
/datum/round_event/mice_migration/start()
|
||||
SSsqueak.trigger_migration(rand(minimum_mice, maximum_mice))
|
||||
@@ -13,7 +13,7 @@
|
||||
if(!candidates.len)
|
||||
return NOT_ENOUGH_PLAYERS
|
||||
|
||||
var/mob/dead/selected = pick_n_take(candidates)
|
||||
var/mob/dead/selected = popleft(candidates)
|
||||
|
||||
var/list/spawn_locs = list()
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
@@ -39,7 +39,7 @@
|
||||
if(nuke)
|
||||
var/nuke_code
|
||||
if(!nuke.r_code || nuke.r_code == "ADMIN")
|
||||
nuke_code = random_nukecode()
|
||||
nuke_code = "[rand(10000, 99999)]"
|
||||
nuke.r_code = nuke_code
|
||||
else
|
||||
nuke_code = nuke.r_code
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/datum/round_event_control/sentience
|
||||
name = "Random Human-level Intelligence"
|
||||
typepath = /datum/round_event/ghost_role/sentience
|
||||
weight = 5
|
||||
|
||||
/datum/round_event/ghost_role/sentience
|
||||
minimum_required = 1
|
||||
role_name = "random animal"
|
||||
|
||||
/datum/round_event/ghost_role/sentience/spawn_role()
|
||||
var/list/mob/dead/observer/candidates
|
||||
candidates = get_candidates(ROLE_ALIEN, null, ROLE_ALIEN)
|
||||
|
||||
// find our chosen mob to breathe life into
|
||||
// Mobs have to be simple animals, mindless and on station
|
||||
var/list/potential = list()
|
||||
for(var/mob/living/simple_animal/L in living_mob_list)
|
||||
var/turf/T = get_turf(L)
|
||||
if(T.z != ZLEVEL_STATION)
|
||||
continue
|
||||
if(!(L in player_list) && !L.mind)
|
||||
potential += L
|
||||
|
||||
var/mob/living/simple_animal/SA = pick(potential)
|
||||
var/mob/dead/observer/SG = pick(candidates)
|
||||
|
||||
if(!SA || !SG)
|
||||
return FALSE
|
||||
|
||||
SA.key = SG.key
|
||||
SA.languages_spoken |= HUMAN
|
||||
SA.languages_understood |= HUMAN
|
||||
SA.sentience_act()
|
||||
|
||||
SA.maxHealth = max(SA.maxHealth, 200)
|
||||
SA.health = SA.maxHealth
|
||||
SA.del_on_death = FALSE
|
||||
|
||||
SA << "<span class='userdanger'>Hello world!</span>"
|
||||
SA << "<span class='warning'>Due to freak radiation and/or chemicals \
|
||||
and/or lucky chance, you have gained human level intelligence \
|
||||
and the ability to speak and understand human language!</span>"
|
||||
@@ -3,7 +3,6 @@
|
||||
#define SPIDER_GIFT 3
|
||||
#define DEPARTMENT_RESUPPLY 4
|
||||
#define ANTIDOTE_NEEDED 5
|
||||
#define PIZZA_DELIVERY 6
|
||||
|
||||
|
||||
/datum/round_event_control/shuttle_loan
|
||||
@@ -21,7 +20,7 @@
|
||||
var/thanks_msg = "The cargo shuttle should return in five minutes. Have some supply points for your trouble."
|
||||
|
||||
/datum/round_event/shuttle_loan/start()
|
||||
dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED, PIZZA_DELIVERY)
|
||||
dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED)
|
||||
|
||||
/datum/round_event/shuttle_loan/announce()
|
||||
SSshuttle.shuttle_loan = src
|
||||
@@ -38,8 +37,6 @@
|
||||
bonus_points = 0
|
||||
if(ANTIDOTE_NEEDED)
|
||||
priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "Centcom Research Initiatives")
|
||||
if (PIZZA_DELIVERY)
|
||||
priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead", "Centcom Spacepizza Division")
|
||||
|
||||
/datum/round_event/shuttle_loan/proc/loan_shuttle()
|
||||
priority_announce(thanks_msg, "Cargo shuttle commandeered by Centcom.")
|
||||
@@ -48,8 +45,13 @@
|
||||
SSshuttle.points += bonus_points
|
||||
endWhen = activeFor + 1
|
||||
|
||||
SSshuttle.supply.mode = SHUTTLE_CALL
|
||||
SSshuttle.supply.destination = SSshuttle.getDock("supply_home")
|
||||
SSshuttle.supply.sell()
|
||||
SSshuttle.supply.enterTransit()
|
||||
if(SSshuttle.supply.z != ZLEVEL_STATION)
|
||||
SSshuttle.supply.mode = SHUTTLE_CALL
|
||||
SSshuttle.supply.destination = SSshuttle.getDock("supply_home")
|
||||
else
|
||||
SSshuttle.supply.mode = SHUTTLE_RECALL
|
||||
SSshuttle.supply.setTimer(3000)
|
||||
|
||||
switch(dispatch_type)
|
||||
@@ -63,8 +65,6 @@
|
||||
SSshuttle.centcom_message += "Department resupply incoming."
|
||||
if(ANTIDOTE_NEEDED)
|
||||
SSshuttle.centcom_message += "Virus samples incoming."
|
||||
if(PIZZA_DELIVERY)
|
||||
SSshuttle.centcom_message += "Pizza delivery for [station_name()]"
|
||||
|
||||
/datum/round_event/shuttle_loan/tick()
|
||||
if(dispatched)
|
||||
@@ -105,11 +105,11 @@
|
||||
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian)
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian/ranged) //drops a mateba
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear/russian)
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear)
|
||||
if(prob(75))
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/russian)
|
||||
if(prob(50))
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear/russian)
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear)
|
||||
|
||||
if(SPIDER_GIFT)
|
||||
var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/emergency/specialops]
|
||||
@@ -121,18 +121,26 @@
|
||||
if(prob(50))
|
||||
shuttle_spawns.Add(/mob/living/simple_animal/hostile/poison/giant_spider/hunter)
|
||||
|
||||
var/turf/T = pick_n_take(empty_shuttle_turfs)
|
||||
var/turf/T = pick(empty_shuttle_turfs)
|
||||
empty_shuttle_turfs.Remove(T)
|
||||
|
||||
new /obj/effect/decal/remains/human(T)
|
||||
new /obj/item/clothing/shoes/space_ninja(T)
|
||||
new /obj/item/clothing/mask/balaclava(T)
|
||||
|
||||
for(var/i in 1 to 5)
|
||||
T = pick_n_take(empty_shuttle_turfs)
|
||||
new /obj/structure/spider/stickyweb(T)
|
||||
T = pick(empty_shuttle_turfs)
|
||||
new /obj/effect/spider/stickyweb(T)
|
||||
T = pick(empty_shuttle_turfs)
|
||||
new /obj/effect/spider/stickyweb(T)
|
||||
T = pick(empty_shuttle_turfs)
|
||||
new /obj/effect/spider/stickyweb(T)
|
||||
T = pick(empty_shuttle_turfs)
|
||||
new /obj/effect/spider/stickyweb(T)
|
||||
T = pick(empty_shuttle_turfs)
|
||||
new /obj/effect/spider/stickyweb(T)
|
||||
|
||||
if(ANTIDOTE_NEEDED)
|
||||
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/fluspanish)
|
||||
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/fluspanish, /datum/disease/transformation/xeno)
|
||||
var/turf/T
|
||||
for(var/i=0, i<10, i++)
|
||||
if(prob(15))
|
||||
@@ -170,16 +178,6 @@
|
||||
for(var/i in 1 to 5)
|
||||
var/decal = pick(/obj/effect/decal/cleanable/flour, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/oil)
|
||||
new decal(pick_n_take(empty_shuttle_turfs))
|
||||
if(PIZZA_DELIVERY)
|
||||
shuttle_spawns.Add(/obj/item/pizzabox/margherita)
|
||||
shuttle_spawns.Add(/obj/item/pizzabox/margherita)
|
||||
shuttle_spawns.Add(/obj/item/pizzabox/meat)
|
||||
shuttle_spawns.Add(/obj/item/pizzabox/meat)
|
||||
shuttle_spawns.Add(/obj/item/pizzabox/vegetable)
|
||||
if(prob(10))
|
||||
shuttle_spawns.Add(/obj/item/pizzabox/bomb)
|
||||
else
|
||||
shuttle_spawns.Add(/obj/item/pizzabox/margherita)
|
||||
|
||||
var/false_positive = 0
|
||||
while(shuttle_spawns.len && empty_shuttle_turfs.len)
|
||||
@@ -195,5 +193,4 @@
|
||||
#undef RUSKY_PARTY
|
||||
#undef SPIDER_GIFT
|
||||
#undef DEPARTMENT_RESUPPLY
|
||||
#undef ANTIDOTE_NEEDED
|
||||
#undef PIZZA_DELIVERY
|
||||
#undef ANTIDOTE_NEEDED
|
||||
+171
-186
@@ -8,7 +8,7 @@
|
||||
/datum/round_event/spacevine/start()
|
||||
var/list/turfs = list() //list of all the empty floor turfs in the hallway areas
|
||||
|
||||
var/obj/structure/spacevine/SV = new()
|
||||
var/obj/effect/spacevine/SV = new()
|
||||
|
||||
for(var/area/hallway/A in world)
|
||||
for(var/turf/F in A)
|
||||
@@ -28,44 +28,40 @@
|
||||
var/hue
|
||||
var/quality
|
||||
|
||||
/datum/spacevine_mutation/proc/add_mutation_to_vinepiece(obj/structure/spacevine/holder)
|
||||
holder.mutations |= src
|
||||
holder.add_atom_colour(hue, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/datum/spacevine_mutation/proc/process_mutation(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/proc/process_mutation(obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/process_temperature(obj/structure/spacevine/holder, temp, volume)
|
||||
/datum/spacevine_mutation/proc/process_temperature(obj/effect/spacevine/holder, temp, volume)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_birth(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/proc/on_birth(obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_grow(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/proc/on_grow(obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_death(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/proc/on_death(obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
|
||||
/datum/spacevine_mutation/proc/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
|
||||
. = expected_damage
|
||||
|
||||
/datum/spacevine_mutation/proc/on_cross(obj/structure/spacevine/holder, mob/crosser)
|
||||
/datum/spacevine_mutation/proc/on_cross(obj/effect/spacevine/holder, mob/crosser)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_chem(obj/structure/spacevine/holder, datum/reagent/R)
|
||||
/datum/spacevine_mutation/proc/on_chem(obj/effect/spacevine/holder, datum/reagent/R)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_eat(obj/structure/spacevine/holder, mob/living/eater)
|
||||
/datum/spacevine_mutation/proc/on_eat(obj/effect/spacevine/holder, mob/living/eater)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_spread(obj/structure/spacevine/holder, turf/target)
|
||||
/datum/spacevine_mutation/proc/on_spread(obj/effect/spacevine/holder, turf/target)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_buckle(obj/structure/spacevine/holder, mob/living/buckled)
|
||||
/datum/spacevine_mutation/proc/on_buckle(obj/effect/spacevine/holder, mob/living/buckled)
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/proc/on_explosion(severity, target, obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/proc/on_explosion(severity, target, obj/effect/spacevine/holder)
|
||||
return
|
||||
|
||||
|
||||
@@ -74,41 +70,70 @@
|
||||
hue = "#aa77aa"
|
||||
quality = POSITIVE
|
||||
|
||||
/datum/spacevine_mutation/space_covering
|
||||
var/static/list/coverable_turfs
|
||||
/turf/open/floor/vines
|
||||
color = "#aa77aa"
|
||||
icon_state = "vinefloor"
|
||||
broken_states = list()
|
||||
|
||||
/datum/spacevine_mutation/space_covering/New()
|
||||
. = ..()
|
||||
if(!coverable_turfs)
|
||||
coverable_turfs = typecacheof(list(
|
||||
/turf/open/space
|
||||
))
|
||||
coverable_turfs -= typecacheof(list(
|
||||
/turf/open/space/transit
|
||||
))
|
||||
|
||||
/datum/spacevine_mutation/space_covering/on_grow(obj/structure/spacevine/holder)
|
||||
process_mutation(holder)
|
||||
//All of this shit is useless for vines
|
||||
|
||||
/datum/spacevine_mutation/space_covering/process_mutation(obj/structure/spacevine/holder)
|
||||
var/turf/T = get_turf(holder)
|
||||
if(is_type_in_typecache(T, coverable_turfs))
|
||||
var/currtype = T.type
|
||||
T.ChangeTurf(/turf/open/floor/vines)
|
||||
T.baseturf = currtype
|
||||
/turf/open/floor/vines/attackby()
|
||||
return
|
||||
|
||||
/datum/spacevine_mutation/space_covering/on_death(obj/structure/spacevine/holder)
|
||||
var/turf/T = get_turf(holder)
|
||||
if(istype(T, /turf/open/floor/vines))
|
||||
T.ChangeTurf(T.baseturf)
|
||||
/turf/open/floor/vines/burn_tile()
|
||||
return
|
||||
|
||||
/turf/open/floor/vines/break_tile()
|
||||
return
|
||||
|
||||
/turf/open/floor/vines/make_plating()
|
||||
return
|
||||
|
||||
/turf/open/floor/vines/break_tile_to_plating()
|
||||
return
|
||||
|
||||
/turf/open/floor/vines/ex_act(severity, target)
|
||||
if(severity < 3 || target == src)
|
||||
ChangeTurf(src.baseturf)
|
||||
|
||||
/turf/open/floor/vines/narsie_act()
|
||||
if(prob(20))
|
||||
ChangeTurf(src.baseturf) //nar sie eats this shit
|
||||
|
||||
/turf/open/floor/vines/singularity_pull(S, current_size)
|
||||
if(current_size >= STAGE_FIVE)
|
||||
if(prob(50))
|
||||
ChangeTurf(src.baseturf)
|
||||
|
||||
/turf/open/floor/vines/ChangeTurf(turf/open/floor/T)
|
||||
for(var/obj/effect/spacevine/SV in src)
|
||||
qdel(SV)
|
||||
..()
|
||||
reconsider_lights()
|
||||
|
||||
/datum/spacevine_mutation/space_covering/on_grow(obj/effect/spacevine/holder)
|
||||
if(istype(holder.loc, /turf/open/space))
|
||||
var/turf/open/spaceturf = holder.loc
|
||||
spaceturf.ChangeTurf(/turf/open/floor/vines)
|
||||
|
||||
/datum/spacevine_mutation/space_covering/process_mutation(obj/effect/spacevine/holder)
|
||||
if(istype(holder.loc, /turf/open/space))
|
||||
var/turf/open/spaceturf = holder.loc
|
||||
spaceturf.ChangeTurf(/turf/open/floor/vines)
|
||||
|
||||
/datum/spacevine_mutation/space_covering/on_death(obj/effect/spacevine/holder)
|
||||
if(istype(holder.loc, /turf/open/floor/vines))
|
||||
var/turf/open/spaceturf = holder.loc
|
||||
spaceturf.ChangeTurf(/turf/open/space)
|
||||
|
||||
/datum/spacevine_mutation/bluespace
|
||||
name = "bluespace"
|
||||
hue = "#3333ff"
|
||||
quality = MINOR_NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/bluespace/on_spread(obj/structure/spacevine/holder, turf/target)
|
||||
if(holder.energy > 1 && !locate(/obj/structure/spacevine) in target)
|
||||
/datum/spacevine_mutation/bluespace/on_spread(obj/effect/spacevine/holder, turf/target)
|
||||
if(holder.energy > 1 && !locate(/obj/effect/spacevine) in target)
|
||||
holder.master.spawn_spacevine_piece(target, holder)
|
||||
|
||||
/datum/spacevine_mutation/light
|
||||
@@ -117,9 +142,9 @@
|
||||
quality = POSITIVE
|
||||
severity = 4
|
||||
|
||||
/datum/spacevine_mutation/light/on_grow(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/light/on_grow(obj/effect/spacevine/holder)
|
||||
if(holder.energy)
|
||||
holder.SetLuminosity(severity, 3)
|
||||
holder.set_light(severity, 3)
|
||||
|
||||
/datum/spacevine_mutation/toxicity
|
||||
name = "toxic"
|
||||
@@ -127,16 +152,15 @@
|
||||
severity = 10
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/toxicity/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
|
||||
/datum/spacevine_mutation/toxicity/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
|
||||
if(issilicon(crosser))
|
||||
return
|
||||
if(prob(severity) && istype(crosser) && !isvineimmune(crosser))
|
||||
if(prob(severity) && istype(crosser))
|
||||
crosser << "<span class='alert'>You accidently touch the vine and feel a strange sensation.</span>"
|
||||
crosser.adjustToxLoss(5)
|
||||
|
||||
/datum/spacevine_mutation/toxicity/on_eat(obj/structure/spacevine/holder, mob/living/eater)
|
||||
if(!isvineimmune(eater))
|
||||
eater.adjustToxLoss(5)
|
||||
/datum/spacevine_mutation/toxicity/on_eat(obj/effect/spacevine/holder, mob/living/eater)
|
||||
eater.adjustToxLoss(5)
|
||||
|
||||
/datum/spacevine_mutation/explosive //OH SHIT IT CAN CHAINREACT RUN!!!
|
||||
name = "explosive"
|
||||
@@ -144,14 +168,15 @@
|
||||
quality = NEGATIVE
|
||||
severity = 2
|
||||
|
||||
/datum/spacevine_mutation/explosive/on_explosion(explosion_severity, target, obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/explosive/on_explosion(explosion_severity, target, obj/effect/spacevine/holder)
|
||||
if(explosion_severity < 3)
|
||||
qdel(src)
|
||||
else
|
||||
. = 1
|
||||
QDEL_IN(src, 5)
|
||||
spawn(5)
|
||||
qdel(src)
|
||||
|
||||
/datum/spacevine_mutation/explosive/on_death(obj/structure/spacevine/holder, mob/hitter, obj/item/I)
|
||||
/datum/spacevine_mutation/explosive/on_death(obj/effect/spacevine/holder, mob/hitter, obj/item/I)
|
||||
explosion(holder.loc, 0, 0, severity, 0, 0)
|
||||
|
||||
/datum/spacevine_mutation/fire_proof
|
||||
@@ -159,22 +184,20 @@
|
||||
hue = "#ff8888"
|
||||
quality = MINOR_NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/fire_proof/process_temperature(obj/structure/spacevine/holder, temp, volume)
|
||||
/datum/spacevine_mutation/fire_proof/process_temperature(obj/effect/spacevine/holder, temp, volume)
|
||||
return 1
|
||||
|
||||
/datum/spacevine_mutation/fire_proof/on_hit(obj/structure/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
|
||||
/datum/spacevine_mutation/fire_proof/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
|
||||
if(I && I.damtype == "fire")
|
||||
. = 0
|
||||
else
|
||||
. = expected_damage
|
||||
|
||||
/datum/spacevine_mutation/vine_eating
|
||||
name = "vine eating"
|
||||
hue = "#ff7700"
|
||||
quality = MINOR_NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/vine_eating/on_spread(obj/structure/spacevine/holder, turf/target)
|
||||
var/obj/structure/spacevine/prey = locate() in target
|
||||
/datum/spacevine_mutation/vine_eating/on_spread(obj/effect/spacevine/holder, turf/target)
|
||||
var/obj/effect/spacevine/prey = locate() in target
|
||||
if(prey && !prey.mutations.Find(src)) //Eat all vines that are not of the same origin
|
||||
qdel(prey)
|
||||
|
||||
@@ -184,19 +207,19 @@
|
||||
severity = 3
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/aggressive_spread/on_spread(obj/structure/spacevine/holder, turf/target)
|
||||
target.ex_act(severity, null, src) // vine immunity handled at /mob/ex_act
|
||||
/datum/spacevine_mutation/aggressive_spread/on_spread(obj/effect/spacevine/holder, turf/target)
|
||||
target.ex_act(severity, src)
|
||||
|
||||
/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/structure/spacevine/holder, mob/living/buckled)
|
||||
buckled.ex_act(severity, null, src)
|
||||
/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/effect/spacevine/holder, mob/living/buckled)
|
||||
buckled.ex_act(severity)
|
||||
|
||||
/datum/spacevine_mutation/transparency
|
||||
name = "transparent"
|
||||
hue = ""
|
||||
quality = POSITIVE
|
||||
|
||||
/datum/spacevine_mutation/transparency/on_grow(obj/structure/spacevine/holder)
|
||||
holder.SetOpacity(0)
|
||||
/datum/spacevine_mutation/transparency/on_grow(obj/effect/spacevine/holder)
|
||||
holder.set_opacity(0)
|
||||
holder.alpha = 125
|
||||
|
||||
/datum/spacevine_mutation/oxy_eater
|
||||
@@ -205,7 +228,7 @@
|
||||
severity = 3
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/oxy_eater/process_mutation(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/oxy_eater/process_mutation(obj/effect/spacevine/holder)
|
||||
var/turf/open/floor/T = holder.loc
|
||||
if(istype(T))
|
||||
var/datum/gas_mixture/GM = T.air
|
||||
@@ -220,7 +243,7 @@
|
||||
severity = 3
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/nitro_eater/process_mutation(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/nitro_eater/process_mutation(obj/effect/spacevine/holder)
|
||||
var/turf/open/floor/T = holder.loc
|
||||
if(istype(T))
|
||||
var/datum/gas_mixture/GM = T.air
|
||||
@@ -235,7 +258,7 @@
|
||||
severity = 3
|
||||
quality = POSITIVE
|
||||
|
||||
/datum/spacevine_mutation/carbondioxide_eater/process_mutation(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/carbondioxide_eater/process_mutation(obj/effect/spacevine/holder)
|
||||
var/turf/open/floor/T = holder.loc
|
||||
if(istype(T))
|
||||
var/datum/gas_mixture/GM = T.air
|
||||
@@ -250,7 +273,7 @@
|
||||
severity = 3
|
||||
quality = POSITIVE
|
||||
|
||||
/datum/spacevine_mutation/plasma_eater/process_mutation(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/plasma_eater/process_mutation(obj/effect/spacevine/holder)
|
||||
var/turf/open/floor/T = holder.loc
|
||||
if(istype(T))
|
||||
var/datum/gas_mixture/GM = T.air
|
||||
@@ -265,35 +288,35 @@
|
||||
severity = 10
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/thorns/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
|
||||
if(prob(severity) && istype(crosser) && !isvineimmune(holder))
|
||||
/datum/spacevine_mutation/thorns/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
|
||||
if(prob(severity) && istype(crosser))
|
||||
var/mob/living/M = crosser
|
||||
M.adjustBruteLoss(5)
|
||||
M << "<span class='alert'>You cut yourself on the thorny vines.</span>"
|
||||
|
||||
/datum/spacevine_mutation/thorns/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
|
||||
if(prob(severity) && istype(hitter) && !isvineimmune(holder))
|
||||
/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, mob/living/hitter)
|
||||
if(prob(severity) && istype(hitter))
|
||||
var/mob/living/M = hitter
|
||||
M.adjustBruteLoss(5)
|
||||
M << "<span class='alert'>You cut yourself on the thorny vines.</span>"
|
||||
. = expected_damage
|
||||
|
||||
/datum/spacevine_mutation/woodening
|
||||
name = "hardened"
|
||||
hue = "#997700"
|
||||
quality = NEGATIVE
|
||||
|
||||
/datum/spacevine_mutation/woodening/on_grow(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/woodening/on_grow(obj/effect/spacevine/holder)
|
||||
if(holder.energy)
|
||||
holder.density = 1
|
||||
holder.max_integrity = 100
|
||||
holder.obj_integrity = holder.max_integrity
|
||||
|
||||
/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
|
||||
if(I.is_sharp())
|
||||
. = expected_damage * 0.5
|
||||
else
|
||||
. = expected_damage
|
||||
/datum/spacevine_mutation/woodening/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
|
||||
if(!expected_damage)
|
||||
return
|
||||
if(hitter)
|
||||
if(I)
|
||||
. = I.force * 2
|
||||
else
|
||||
. = 8
|
||||
|
||||
/datum/spacevine_mutation/flowering
|
||||
name = "flowering"
|
||||
@@ -301,17 +324,16 @@
|
||||
quality = NEGATIVE
|
||||
severity = 10
|
||||
|
||||
/datum/spacevine_mutation/flowering/on_grow(obj/structure/spacevine/holder)
|
||||
/datum/spacevine_mutation/flowering/on_grow(obj/effect/spacevine/holder)
|
||||
if(holder.energy == 2 && prob(severity) && !locate(/obj/structure/alien/resin/flower_bud_enemy) in range(5,holder))
|
||||
new/obj/structure/alien/resin/flower_bud_enemy(get_turf(holder))
|
||||
|
||||
/datum/spacevine_mutation/flowering/on_cross(obj/structure/spacevine/holder, mob/living/crosser)
|
||||
if(prob(25))
|
||||
holder.entangle(crosser)
|
||||
/datum/spacevine_mutation/flowering/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
|
||||
holder.entangle(crosser)
|
||||
|
||||
|
||||
// SPACE VINES (Note that this code is very similar to Biomass code)
|
||||
/obj/structure/spacevine
|
||||
/obj/effect/spacevine
|
||||
name = "space vines"
|
||||
desc = "An extremely expansionistic species of vine."
|
||||
icon = 'icons/effects/spacevines.dmi'
|
||||
@@ -321,29 +343,11 @@
|
||||
layer = SPACEVINE_LAYER
|
||||
mouse_opacity = 2 //Clicking anywhere on the turf is good enough
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
obj_integrity = 50
|
||||
max_integrity = 50
|
||||
var/energy = 0
|
||||
var/obj/effect/spacevine_controller/master = null
|
||||
var/list/mutations = list()
|
||||
|
||||
/obj/structure/spacevine/New()
|
||||
..()
|
||||
add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/obj/structure/spacevine/examine(mob/user)
|
||||
..()
|
||||
var/text = "This one is a"
|
||||
if(mutations.len)
|
||||
for(var/A in mutations)
|
||||
var/datum/spacevine_mutation/SM = A
|
||||
text += " [SM.name]"
|
||||
else
|
||||
text += " normal"
|
||||
text += " vine."
|
||||
user << text
|
||||
|
||||
/obj/structure/spacevine/Destroy()
|
||||
/obj/effect/spacevine/Destroy()
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_death(src)
|
||||
if(master)
|
||||
@@ -352,15 +356,15 @@
|
||||
if(!master.vines.len)
|
||||
var/obj/item/seeds/kudzu/KZ = new(loc)
|
||||
KZ.mutations |= mutations
|
||||
KZ.potency = min(100, master.mutativeness * 10)
|
||||
KZ.potency = min(100, master.mutativness * 10)
|
||||
KZ.production = (master.spread_cap / initial(master.spread_cap)) * 50
|
||||
mutations = list()
|
||||
SetOpacity(0)
|
||||
set_opacity(0)
|
||||
if(has_buckled_mobs())
|
||||
unbuckle_all_mobs(force=1)
|
||||
return ..()
|
||||
|
||||
/obj/structure/spacevine/proc/on_chem_effect(datum/reagent/R)
|
||||
/obj/effect/spacevine/proc/on_chem_effect(datum/reagent/R)
|
||||
var/override = 0
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
override += SM.on_chem(src, R)
|
||||
@@ -368,7 +372,7 @@
|
||||
if(prob(50))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/spacevine/proc/eat(mob/eater)
|
||||
/obj/effect/spacevine/proc/eat(mob/eater)
|
||||
var/override = 0
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
override += SM.on_eat(src, eater)
|
||||
@@ -377,77 +381,68 @@
|
||||
eater.say("Nom")
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/spacevine/attackby(obj/item/weapon/W, mob/user, params)
|
||||
|
||||
if(istype(W, /obj/item/weapon/scythe))
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
for(var/obj/structure/spacevine/B in orange(1,src))
|
||||
B.take_damage(W.force * 4, BRUTE, "melee", 1)
|
||||
/obj/effect/spacevine/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if (!W || !user || !W.type)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
|
||||
/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user)
|
||||
var/damage_dealt = I.force
|
||||
if(I.is_sharp())
|
||||
damage_dealt *= 4
|
||||
if(I.damtype == BURN)
|
||||
damage_dealt *= 4
|
||||
var/override = W.force
|
||||
if(W.is_sharp())
|
||||
override = 100
|
||||
if(istype(W, /obj/item/weapon/scythe))
|
||||
var/local_override = override
|
||||
for(var/obj/effect/spacevine/B in orange(1,src))
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
local_override = SM.on_hit(src, user, W, local_override)
|
||||
if(prob(local_override))
|
||||
qdel(B)
|
||||
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
damage_dealt = SM.on_hit(src, user, I, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
|
||||
take_damage(damage_dealt, I.damtype, "melee", 1)
|
||||
override = SM.on_hit(src, user, W, override) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
|
||||
|
||||
/obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(damage_amount)
|
||||
playsound(src, 'sound/weapons/slash.ogg', 50, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/tap.ogg', 50, 1)
|
||||
if(BURN)
|
||||
playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
|
||||
if(prob(override))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/spacevine/Crossed(mob/crosser)
|
||||
..()
|
||||
|
||||
/obj/effect/spacevine/Crossed(mob/crosser)
|
||||
if(isliving(crosser))
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_cross(src, crosser)
|
||||
|
||||
/obj/structure/spacevine/attack_hand(mob/user)
|
||||
/obj/effect/spacevine/attack_hand(mob/user)
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_hit(src, user)
|
||||
user_unbuckle_mob(user, user)
|
||||
|
||||
|
||||
/obj/structure/spacevine/attack_paw(mob/living/user)
|
||||
/obj/effect/spacevine/attack_paw(mob/living/user)
|
||||
user.do_attack_animation(src)
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_hit(src, user)
|
||||
user_unbuckle_mob(user,user)
|
||||
|
||||
/obj/structure/spacevine/attack_alien(mob/living/user)
|
||||
/obj/effect/spacevine/attack_alien(mob/living/user)
|
||||
eat(user)
|
||||
|
||||
/obj/effect/spacevine_controller
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
var/list/obj/structure/spacevine/vines = list()
|
||||
var/list/obj/effect/spacevine/vines = list()
|
||||
var/list/growth_queue = list()
|
||||
var/spread_multiplier = 5
|
||||
var/spread_cap = 30
|
||||
var/list/mutations_list = list()
|
||||
var/mutativeness = 1
|
||||
var/mutativness = 1
|
||||
|
||||
/obj/effect/spacevine_controller/New(loc, list/muts, potency, production)
|
||||
add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY)
|
||||
/obj/effect/spacevine_controller/New(loc, list/muts, mttv, spreading)
|
||||
spawn_spacevine_piece(loc, , muts)
|
||||
START_PROCESSING(SSobj, src)
|
||||
init_subtypes(/datum/spacevine_mutation/, mutations_list)
|
||||
if(potency != null)
|
||||
mutativeness = potency / 10
|
||||
if(production != null)
|
||||
spread_cap *= production / 5
|
||||
spread_multiplier /= production / 5
|
||||
..()
|
||||
if(mttv != null)
|
||||
mutativness = mttv / 10
|
||||
if(spreading != null)
|
||||
spread_cap *= spreading / 50
|
||||
spread_multiplier /= spreading / 50
|
||||
|
||||
/obj/effect/spacevine_controller/ex_act() //only killing all vines will end this suffering
|
||||
return
|
||||
@@ -462,29 +457,32 @@
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/structure/spacevine/parent, list/muts)
|
||||
var/obj/structure/spacevine/SV = new(location)
|
||||
/obj/effect/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/effect/spacevine/parent, list/muts)
|
||||
var/obj/effect/spacevine/SV = new(location)
|
||||
growth_queue += SV
|
||||
vines += SV
|
||||
SV.master = src
|
||||
if(muts && muts.len)
|
||||
for(var/datum/spacevine_mutation/M in muts)
|
||||
M.add_mutation_to_vinepiece(SV)
|
||||
return
|
||||
SV.mutations |= muts
|
||||
if(parent)
|
||||
SV.mutations |= parent.mutations
|
||||
var/parentcolor = parent.atom_colours[FIXED_COLOUR_PRIORITY]
|
||||
SV.add_atom_colour(parentcolor, FIXED_COLOUR_PRIORITY)
|
||||
if(prob(mutativeness))
|
||||
var/datum/spacevine_mutation/randmut = pick(mutations_list - SV.mutations)
|
||||
randmut.add_mutation_to_vinepiece(SV)
|
||||
SV.color = parent.color
|
||||
SV.desc = parent.desc
|
||||
if(prob(mutativness))
|
||||
SV.mutations |= pick(mutations_list)
|
||||
var/datum/spacevine_mutation/randmut = pick(SV.mutations)
|
||||
SV.color = randmut.hue
|
||||
SV.desc = "An extremely expansionistic species of vine. These are "
|
||||
for(var/datum/spacevine_mutation/M in SV.mutations)
|
||||
SV.desc += "[M.name] "
|
||||
SV.desc += "vines."
|
||||
|
||||
for(var/datum/spacevine_mutation/SM in SV.mutations)
|
||||
SM.on_birth(SV)
|
||||
|
||||
/obj/effect/spacevine_controller/process()
|
||||
if(!vines)
|
||||
qdel(src) //space vines exterminated. Remove the controller
|
||||
qdel(src) //space vines exterminated. Remove the controller
|
||||
return
|
||||
if(!growth_queue)
|
||||
qdel(src) //Sanity check
|
||||
@@ -494,9 +492,9 @@
|
||||
|
||||
length = min( spread_cap , max( 1 , vines.len / spread_multiplier ) )
|
||||
var/i = 0
|
||||
var/list/obj/structure/spacevine/queue_end = list()
|
||||
var/list/obj/effect/spacevine/queue_end = list()
|
||||
|
||||
for(var/obj/structure/spacevine/SV in growth_queue)
|
||||
for( var/obj/effect/spacevine/SV in growth_queue )
|
||||
if(qdeleted(SV))
|
||||
continue
|
||||
i++
|
||||
@@ -517,11 +515,11 @@
|
||||
|
||||
growth_queue = growth_queue + queue_end
|
||||
|
||||
/obj/structure/spacevine/proc/grow()
|
||||
/obj/effect/spacevine/proc/grow()
|
||||
if(!energy)
|
||||
src.icon_state = pick("Med1", "Med2", "Med3")
|
||||
energy = 1
|
||||
SetOpacity(1)
|
||||
set_opacity(1)
|
||||
else
|
||||
src.icon_state = pick("Hvy1", "Hvy2", "Hvy3")
|
||||
energy = 2
|
||||
@@ -529,35 +527,35 @@
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_grow(src)
|
||||
|
||||
/obj/structure/spacevine/proc/entangle_mob()
|
||||
/obj/effect/spacevine/proc/entangle_mob()
|
||||
if(!has_buckled_mobs() && prob(25))
|
||||
for(var/mob/living/V in src.loc)
|
||||
entangle(V)
|
||||
if(has_buckled_mobs())
|
||||
if(buckled_mobs.len)
|
||||
break //only capture one mob at a time
|
||||
|
||||
|
||||
/obj/structure/spacevine/proc/entangle(mob/living/V)
|
||||
if(!V || isvineimmune(V))
|
||||
/obj/effect/spacevine/proc/entangle(mob/living/V)
|
||||
if(!V)
|
||||
return
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_buckle(src, V)
|
||||
if((V.stat != DEAD) && (V.buckled != src)) //not dead or captured
|
||||
V << "<span class='danger'>The vines [pick("wind", "tangle", "tighten")] around you!</span>"
|
||||
buckle_mob(V, 1)
|
||||
buckle_mob(V)
|
||||
|
||||
/obj/structure/spacevine/proc/spread()
|
||||
/obj/effect/spacevine/proc/spread()
|
||||
var/direction = pick(cardinal)
|
||||
var/turf/stepturf = get_step(src,direction)
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
SM.on_spread(src, stepturf)
|
||||
stepturf = get_step(src,direction) //in case turf changes, to make sure no runtimes happen
|
||||
if(!locate(/obj/structure/spacevine, stepturf))
|
||||
if(!locate(/obj/effect/spacevine, stepturf))
|
||||
if(stepturf.Enter(src))
|
||||
if(master)
|
||||
master.spawn_spacevine_piece(stepturf, src)
|
||||
|
||||
/obj/structure/spacevine/ex_act(severity, target)
|
||||
/obj/effect/spacevine/ex_act(severity, target)
|
||||
if(istype(target, type)) //if its agressive spread vine dont do anything
|
||||
return
|
||||
var/i
|
||||
@@ -566,22 +564,9 @@
|
||||
if(!i && prob(100/severity))
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/spacevine/temperature_expose(null, temp, volume)
|
||||
/obj/effect/spacevine/temperature_expose(null, temp, volume)
|
||||
var/override = 0
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
override += SM.process_temperature(src, temp, volume)
|
||||
if(!override)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/spacevine/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
if(isvineimmune(mover))
|
||||
. = TRUE
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/proc/isvineimmune(atom/A)
|
||||
. = FALSE
|
||||
if(isliving(A))
|
||||
var/mob/living/M = A
|
||||
if(("vines" in M.faction) || ("plants" in M.faction))
|
||||
. = TRUE
|
||||
|
||||
@@ -29,9 +29,8 @@
|
||||
|
||||
while((spawncount >= 1) && vents.len)
|
||||
var/obj/vent = pick(vents)
|
||||
var/spawn_type = /obj/structure/spider/spiderling
|
||||
var/obj/effect/spider/spiderling/S = new(vent.loc)
|
||||
if(prob(66))
|
||||
spawn_type = /obj/structure/spider/spiderling/nurse
|
||||
spawn_atom_to_turf(spawn_type, vent, 1, FALSE)
|
||||
S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse
|
||||
vents -= vent
|
||||
spawncount--
|
||||
spawncount--
|
||||
@@ -10,7 +10,7 @@
|
||||
var/interval = 2
|
||||
var/list/vents = list()
|
||||
var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","mushroomhallucinogen","lube",
|
||||
"plantbgone","banana","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","sacid")
|
||||
"plantbgone","banana","charcoal","space_drugs","morphine","holywater","ethanol","hot_coco","facid")
|
||||
|
||||
/datum/round_event/vent_clog/announce()
|
||||
priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.", "Atmospherics alert")
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/datum/round_event_control/wizard/robelesscasting //EI NUDTH!
|
||||
name = "Robeless Casting"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/robelesscasting
|
||||
typepath = /datum/round_event/wizard/robelesscasting/
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
/datum/round_event_control/wizard/improvedcasting //blink x5 disintergrate x5 here I come!
|
||||
name = "Improved Casting"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/improvedcasting
|
||||
typepath = /datum/round_event/wizard/improvedcasting/
|
||||
max_occurrences = 4 //because that'd be max level spells
|
||||
earliest_start = 0
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/round_event_control/wizard/blobies //avast!
|
||||
name = "Zombie Outbreak"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/blobies
|
||||
typepath = /datum/round_event/wizard/blobies/
|
||||
max_occurrences = 3
|
||||
earliest_start = 12000 // 20 minutes (gotta get some bodies made!)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/round_event_control/wizard/cursed_items //fashion disasters
|
||||
name = "Cursed Items"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/cursed_items
|
||||
typepath = /datum/round_event/wizard/cursed_items/
|
||||
max_occurrences = 3
|
||||
earliest_start = 0
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/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_gloves, slot_ears)
|
||||
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
|
||||
@@ -19,12 +19,12 @@
|
||||
|
||||
switch(item_set)
|
||||
if("wizardmimic")
|
||||
loadout = list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/shoes/sandal/magic, /obj/item/clothing/head/wizard)
|
||||
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
|
||||
loadout[4] = /obj/item/clothing/mask/cigarette/rollie/trippy/
|
||||
ruins_spaceworthiness = 1
|
||||
if("boxing")
|
||||
loadout[4] = /obj/item/clothing/mask/luchador
|
||||
@@ -38,14 +38,14 @@
|
||||
ruins_wizard_loadout = 1
|
||||
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
if(ruins_spaceworthiness && (H.z != 1 || isspaceturf(H.loc) || isplasmaman(H)))
|
||||
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.gloves, H.ears) //add new slots as needed to back
|
||||
for(var/i in 1 to loadout.len)
|
||||
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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/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
|
||||
typepath = /datum/round_event/wizard/deprevolt/
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/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
|
||||
typepath = /datum/round_event/wizard/fake_explosion/
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/round_event_control/wizard/ghost //The spook is real
|
||||
name = "G-G-G-Ghosts!"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/ghost
|
||||
typepath = /datum/round_event/wizard/ghost/
|
||||
max_occurrences = 5
|
||||
earliest_start = 0
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/round_event_control/wizard/greentext //Gotta have it!
|
||||
name = "Greentext"
|
||||
weight = 4
|
||||
typepath = /datum/round_event/wizard/greentext
|
||||
typepath = /datum/round_event/wizard/greentext/
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
@@ -22,13 +22,13 @@
|
||||
/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 = WEIGHT_CLASS_BULKY
|
||||
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()
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
burn_state = FIRE_PROOF
|
||||
var/quiet = FALSE
|
||||
|
||||
/obj/item/weapon/greentext/New()
|
||||
@@ -44,14 +44,14 @@
|
||||
last_holder = user
|
||||
if(!(user in color_altered_mobs))
|
||||
color_altered_mobs += user
|
||||
user.add_atom_colour("#00FF00", ADMIN_COLOUR_PRIORITY)
|
||||
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.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY) //ya blew it
|
||||
user.color = "#FF0000" //ya blew it
|
||||
last_holder = null
|
||||
new_holder = null
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
@@ -69,16 +69,16 @@
|
||||
new_holder.mind.objectives += O
|
||||
new_holder.attack_log += "\[[time_stamp()]\] <font color='green'>Won with greentext!!!</font>"
|
||||
color_altered_mobs -= new_holder
|
||||
resistance_flags |= ON_FIRE
|
||||
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.add_atom_colour("#FF0000", ADMIN_COLOUR_PRIORITY)
|
||||
last_holder.color = "#FF0000"
|
||||
last_holder = new_holder //long live the king
|
||||
|
||||
/obj/item/weapon/greentext/Destroy(force)
|
||||
if(!(resistance_flags & ON_FIRE) && !force)
|
||||
if((burn_state != ON_FIRE) && (!force))
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
. = ..()
|
||||
@@ -87,8 +87,7 @@
|
||||
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)
|
||||
M.color = initial(M.color)
|
||||
message += "...</span>"
|
||||
// can't skip the mob check as it also does the decolouring
|
||||
if(!quiet)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/round_event_control/wizard/imposter //Mirror Mania
|
||||
name = "Imposter Wizard"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/imposter
|
||||
typepath = /datum/round_event/wizard/imposter/
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/round_event_control/wizard/invincible //Boolet Proof
|
||||
name = "Invincibility"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/invincible
|
||||
typepath = /datum/round_event/wizard/invincible/
|
||||
max_occurrences = 5
|
||||
earliest_start = 0
|
||||
|
||||
|
||||
@@ -1,15 +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
|
||||
typepath = /datum/round_event/wizard/lava/
|
||||
max_occurrences = 3
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/wizard/lava
|
||||
/datum/round_event/wizard/lava/
|
||||
endWhen = 0
|
||||
var/started = FALSE
|
||||
|
||||
/datum/round_event/wizard/lava/start()
|
||||
if(!started)
|
||||
started = TRUE
|
||||
SSweather.run_weather("the floor is lava")
|
||||
SSweather.run_weather("the floor is lava")
|
||||
@@ -1,11 +1,11 @@
|
||||
/datum/round_event_control/wizard/magicarp //these fish is loaded
|
||||
name = "Magicarp"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/magicarp
|
||||
typepath = /datum/round_event/wizard/magicarp/
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/wizard/magicarp
|
||||
/datum/round_event/wizard/magicarp/
|
||||
announceWhen = 3
|
||||
startWhen = 50
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/datum/round_event_control/wizard/petsplosion //the horror
|
||||
name = "Petsplosion"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/petsplosion
|
||||
typepath = /datum/round_event/wizard/petsplosion/
|
||||
max_occurrences = 1 //Exponential growth is nothing to sneeze at!
|
||||
earliest_start = 0
|
||||
|
||||
/datum/round_event/wizard/petsplosion
|
||||
/datum/round_event/wizard/petsplosion/
|
||||
endWhen = 61 //1 minute (+1 tick for endWhen not to interfere with tick)
|
||||
var/countdown = 0
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
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(!ishostile(F))
|
||||
if(!istype(F, /mob/living/simple_animal/hostile))
|
||||
new F.type(F.loc)
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/round_event_control/wizard/race //Lizard Wizard? Lizard Wizard.
|
||||
name = "Race Swap"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/race
|
||||
typepath = /datum/round_event/wizard/race/
|
||||
max_occurrences = 5
|
||||
earliest_start = 0
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/round_event_control/wizard/rpgloot //its time to minmax your shit
|
||||
name = "RPG Loot"
|
||||
weight = 3
|
||||
typepath = /datum/round_event/wizard/rpgloot
|
||||
typepath = /datum/round_event/wizard/rpgloot/
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
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 && !S.invisibility)
|
||||
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)
|
||||
@@ -41,7 +41,7 @@
|
||||
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
|
||||
w_class = 1
|
||||
|
||||
/obj/item/upgradescroll/afterattack(obj/item/target, mob/user , proximity)
|
||||
if(!proximity || !istype(target))
|
||||
@@ -49,9 +49,8 @@
|
||||
var/quality = target.force - initial(target.force)
|
||||
if(quality > 9 && prob((quality - 9)*10))
|
||||
user << "<span class='danger'>[target] catches fire!</span>"
|
||||
if(target.resistance_flags & (LAVA_PROOF|FIRE_PROOF))
|
||||
target.resistance_flags &= ~(LAVA_PROOF|FIRE_PROOF)
|
||||
target.resistance_flags |= FLAMMABLE
|
||||
if(target.burn_state == -1)
|
||||
target.burn_state = 0
|
||||
target.fire_act()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
/datum/round_event_control/wizard/shuffleloc //Somewhere an AI is crying
|
||||
name = "Change Places!"
|
||||
weight = 2
|
||||
typepath = /datum/round_event/wizard/shuffleloc
|
||||
typepath = /datum/round_event/wizard/shuffleloc/
|
||||
max_occurrences = 5
|
||||
earliest_start = 0
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
/datum/round_event_control/wizard/shufflenames //Face/off joke
|
||||
name = "Change Faces!"
|
||||
weight = 4
|
||||
typepath = /datum/round_event/wizard/shufflenames
|
||||
typepath = /datum/round_event/wizard/shufflenames/
|
||||
max_occurrences = 5
|
||||
earliest_start = 0
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
/datum/round_event_control/wizard/shuffleminds //Basically Mass Ranged Mindswap
|
||||
name = "Change Minds!"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/shuffleminds
|
||||
typepath = /datum/round_event/wizard/shuffleminds/
|
||||
max_occurrences = 3
|
||||
earliest_start = 0
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
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))
|
||||
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
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
|
||||
shuffle(mobs)
|
||||
|
||||
var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new /obj/effect/proc_holder/spell/targeted/mind_transfer
|
||||
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
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/round_event_control/wizard/summonguns //The Classic
|
||||
name = "Summon Guns"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/summonguns
|
||||
typepath = /datum/round_event/wizard/summonguns/
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/datum/round_event_control/wizard/summonmagic //The Somewhat Less Classic
|
||||
name = "Summon Magic"
|
||||
weight = 1
|
||||
typepath = /datum/round_event/wizard/summonmagic
|
||||
typepath = /datum/round_event/wizard/summonmagic/
|
||||
max_occurrences = 1
|
||||
earliest_start = 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user