diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index dbd10396c83..c212e3132c5 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -25,16 +25,12 @@ Pipelines + Other Objects -> Pipe network
var/initialize_directions = 0
var/pipe_color
- var/image/pipe_image
-
var/global/datum/pipe_icon_manager/icon_manager
/obj/machinery/atmospherics/Destroy()
for(var/mob/living/M in src) //ventcrawling is serious business
M.remove_ventcrawl()
- M.forceMove(src.loc)
- if(pipe_image)
- del(pipe_image) //we have to del it, or it might keep a ref somewhere else
+ M.loc = src.loc
..()
// Find a connecting /obj/machinery/atmospherics in specified direction.
@@ -167,9 +163,6 @@ obj/machinery/atmospherics/proc/check_connect_types_construction(obj/machinery/a
user.forceMove(target_move.loc) //handles entering and so on
user.visible_message("You hear something squeezing through the ducts.", "You climb out the ventilation system.")
else if(target_move.can_crawl_through())
- if(target_move.return_network(target_move) != return_network(src))
- user.remove_ventcrawl()
- user.add_ventcrawl(target_move)
user.loc = target_move
user.client.eye = target_move //if we don't do this, Byond only updates the eye every tick - required for smooth movement
if(world.time - user.last_played_vent > VENT_SOUND_DELAY)
diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm
index 46b6ee9a708..c1a01996343 100644
--- a/code/ATMOSPHERICS/components/unary/unary_base.dm
+++ b/code/ATMOSPHERICS/components/unary/unary_base.dm
@@ -66,7 +66,7 @@
return_network(obj/machinery/atmospherics/reference)
build_network()
- if(reference == node || reference == src)
+ if(reference==node)
return network
return null
@@ -89,7 +89,7 @@
if(reference==node)
del(network)
node = null
-
+
update_icon()
update_underlays()
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 34082be122e..32bd4f9a823 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -62,8 +62,7 @@ var/global/list/blocked_mobs = list(/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/carp/holocarp,
/mob/living/simple_animal/hostile/mining_drone,
/mob/living/simple_animal/hostile/spaceWorm,
- /mob/living/simple_animal/hostile/spaceWorm/wormHead,
- /mob/living/simple_animal/ascendant_shadowling
+ /mob/living/simple_animal/hostile/spaceWorm/wormHead
)
//Preferences stuff
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 5db7e620325..9114acbf2dc 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -312,25 +312,6 @@ datum/mind
sections["traitor"] = text
- /** SHADOWLING **/
- text = "shadowling"
- if(ticker.mode.config_tag == "shadowling")
- text = uppertext(text)
- text = "[text]: "
- if(src in ticker.mode.shadows)
- text += "SHADOWLING|thrall|human"
- else if(src in ticker.mode.shadowling_thralls)
- text += "Shadowling|THRALL|human"
- else
- text += "shadowling|thrall|HUMAN"
-
- if(current && current.client && current.client.prefs.be_special & BE_SHADOWLING)
- text += "|Enabled in Prefs"
- else
- text += "|Disabled in Prefs"
-
- sections["shadowling"] = text
-
/** MONKEY ***/
if (istype(current, /mob/living/carbon))
text = "monkey"
@@ -962,60 +943,9 @@ datum/mind
ticker.mode.forge_traitor_objectives(src)
usr << "\blue The objectives for traitor [key] have been generated. You can edit them and anounce manually."
- else if(href_list["shadowling"])
- switch(href_list["shadowling"])
- if("clear")
- ticker.mode.update_shadow_icons_removed(src)
- current.spell_list.Cut()
- if(src in ticker.mode.shadows)
- ticker.mode.shadows -= src
- special_role = null
- current << "Your powers have been quenched! You are no longer a shadowling!"
- current.spell_list.Cut()
- message_admins("[key_name_admin(usr)] has de-shadowling'ed [current].")
- log_admin("[key_name(usr)] has de-shadowling'ed [current].")
- current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch
- current.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance
- if(current.languages)
- for(var/datum/language/L in current.languages)
- if(L.name == "Shadowling Hivemind")
- del(L)
- else if(src in ticker.mode.shadowling_thralls)
- ticker.mode.shadowling_thralls -= src
- special_role = null
- if(current.languages)
- for(var/datum/language/L in current.languages)
- if(L.name == "Shadowling Hivemind")
- del(L)
- current << "You have been brainwashed! You are no longer a thrall!"
- message_admins("[key_name_admin(usr)] has de-thrall'ed [current].")
- log_admin("[key_name(usr)] has de-thrall'ed [current].")
- if("shadowling")
- if(!ishuman(current))
- usr << "This only works on humans!"
- return
- ticker.mode.shadows += src
- special_role = "shadowling"
- current << "You notice a brightening around you. No, it isn't that. The shadows grow, darken, swirl. The darkness has a new welcome for you, and you realize with a \
- start that you can't be human. No, you are a shadowling, a harbringer of the shadows! Your alien abilities have been unlocked from within, and you may both commune with your allies and use \
- a chrysalis to reveal your true form. You are to ascend at all costs."
- ticker.mode.finalize_shadowling(src)
- ticker.mode.update_shadow_icons_added(src)
- if("thrall")
- if(!ishuman(current))
- usr << "This only works on humans!"
- return
- ticker.mode.add_thrall(src)
- special_role = "thrall"
- current << "All at once it becomes clear to you. Where others see darkness, you see an ally. You realize that the shadows are not dead and dark as one would think, but \
- living, and breathing, and eating. Their children, the Shadowlings, are to be obeyed and protected at all costs."
- current << "You may use the Hivemind Commune ability to communicate with your fellow enlightened ones."
- message_admins("[key_name_admin(usr)] has thrall'ed [current].")
- log_admin("[key_name(usr)] has thrall'ed [current].")
-
else if (href_list["monkey"])
var/mob/living/L = current
- if (L.notransform)
+ if (L.monkeyizing)
return
switch(href_list["monkey"])
if("healthy")
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 8ba5f8677d5..1db0e95da0d 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -543,7 +543,7 @@ var/list/uplink_items = list()
/datum/uplink_item/badass/syndiecigs
name = "Syndicate Smokes"
- desc = "Strong flavor, dense smoke, infused with omnizine."
+ desc = "Strong flavor, dense smoke, infused with Doctor's Delight."
item = /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate
cost = 4
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index a5e9b3876eb..2115b5e68e6 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -385,7 +385,7 @@
thunk(L)
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
- if(L && L.client && !L.client.ambience_playing && (L.client.prefs.sound & SOUND_BUZZ)) //split off the white noise from the rest of the ambience because of annoyance complaints - Kluys
+ if(!L.client.ambience_playing && L && L.client && (L.client.prefs.sound & SOUND_BUZZ)) //split off the white noise from the rest of the ambience because of annoyance complaints - Kluys
L.client.ambience_playing = 1
L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)
else if (L && L.client && !(L.client.prefs.sound & SOUND_BUZZ)) L.client.ambience_playing = 0
diff --git a/code/game/dna/dna_misc.dm b/code/game/dna/dna_misc.dm
index bc2098d77a6..bda19278266 100644
--- a/code/game/dna/dna_misc.dm
+++ b/code/game/dna/dna_misc.dm
@@ -402,7 +402,7 @@
if (isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && istype(M, /mob/living/carbon/human))
// human > monkey
var/mob/living/carbon/human/H = M
- H.notransform = 1
+ H.monkeyizing = 1
var/list/implants = list() //Try to preserve implants.
for(var/obj/item/weapon/implant/W in H)
implants += W
@@ -413,7 +413,7 @@
if (W==H.w_uniform) // will be teared
continue
H.unEquip(W)
- M.notransform = 1
+ M.monkeyizing = 1
M.canmove = 0
M.icon = null
M.invisibility = 101
@@ -478,7 +478,7 @@
if (!isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && !istype(M, /mob/living/carbon/human))
// monkey > human,
var/mob/living/carbon/monkey/Mo = M
- Mo.notransform = 1
+ Mo.monkeyizing = 1
var/list/implants = list() //Still preserving implants
for(var/obj/item/weapon/implant/W in Mo)
implants += W
@@ -486,7 +486,7 @@
if(!connected)
for(var/obj/item/W in (Mo.contents-implants))
Mo.unEquip(W)
- M.notransform = 1
+ M.monkeyizing = 1
M.canmove = 0
M.icon = null
M.invisibility = 101
diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm
index c10178b285a..03ca9880c2c 100644
--- a/code/game/dna/genes/monkey.dm
+++ b/code/game/dna/genes/monkey.dm
@@ -12,7 +12,7 @@
// testing("Cannot monkey-ify [M], type is [M.type].")
return
var/mob/living/carbon/human/H = M
- H.notransform = 1
+ H.monkeyizing = 1
var/list/implants = list() //Try to preserve implants.
for(var/obj/item/weapon/implant/W in H)
implants += W
@@ -23,7 +23,7 @@
if (W==H.w_uniform) // will be teared
continue
H.unEquip(W)
- M.notransform = 1
+ M.monkeyizing = 1
M.canmove = 0
M.icon = null
M.invisibility = 101
@@ -86,7 +86,7 @@
testing("Cannot humanize [M], type is [M.type].")
return
var/mob/living/carbon/monkey/Mo = M
- Mo.notransform = 1
+ Mo.monkeyizing = 1
var/list/implants = list() //Still preserving implants
for(var/obj/item/weapon/implant/W in Mo)
implants += W
@@ -94,7 +94,7 @@
if(!connected)
for(var/obj/item/W in (Mo.contents-implants))
Mo.unEquip(W)
- M.notransform = 1
+ M.monkeyizing = 1
M.canmove = 0
M.icon = null
M.invisibility = 101
diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm
index 09751412a30..a769ee47bd0 100644
--- a/code/game/gamemodes/changeling/powers/lesserform.dm
+++ b/code/game/gamemodes/changeling/powers/lesserform.dm
@@ -23,7 +23,7 @@
for(var/obj/item/weapon/implant/W in C)
implants += W
- C.notransform = 1
+ C.monkeyizing = 1
C.canmove = 0
C.icon = null
C.overlays.Cut()
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
deleted file mode 100644
index 51cf619fb12..00000000000
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
-
-SHADOWLING: A gamemode based on previously-run events
-
-Aliens called shadowlings are on the station.
-These shadowlings can 'enthrall' crew members and enslave them.
-They also burn in the light but heal rapidly whilst in the dark.
-The game will end under two conditions:
- 1. The shadowlings die
- 2. The emergency shuttle docks at CentCom
-
-Shadowling strengths:
- - The dark
- - Hard vacuum (They are not affected by it)
- - Their thralls who are not harmed by the light
- - Stealth
-
-Shadowling weaknesses:
- - The light
- - Fire
- - Enemy numbers
- - Lasers (Lasers are concentrated light and do more damage)
- - Flashbangs (High stun and high burn damage; if the light stuns humans, you bet your ass it'll hurt the shadowling very much!)
-
-Shadowlings start off disguised as normal crew members, and they only have two abilities: Hatch and Enthrall.
-They can still enthrall and perhaps complete their objectives in this form.
-Hatch will, after a short time, cast off the human disguise and assume the shadowling's true identity.
-They will then assume the normal shadowling form and gain their abilities.
-
-The shadowling will seem OP, and that's because it kinda is. Being restricted to the dark while being alone most of the time is extremely difficult and as such the shadowling needs powerful abilities.
-Made by Xhuis
-
-*/
-
-
-
-/*
- GAMEMODE
-*/
-
-
-/datum/game_mode
- var/list/datum/mind/shadows = list()
- var/list/datum/mind/shadowling_thralls = list()
- var/list/shadow_objectives = list()
- var/required_thralls = 15 //How many thralls are needed (hardcoded for now)
- var/shadowling_ascended = 0 //If at least one shadowling has ascended
- var/shadowling_dead = 0 //is shadowling kill
-
-
-/proc/is_thrall(var/mob/living/M)
- return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadowling_thralls)
-
-
-/proc/is_shadow_or_thrall(var/mob/living/M)
- return istype(M) && M.mind && ticker && ticker.mode && ((M.mind in ticker.mode.shadowling_thralls) || (M.mind in ticker.mode.shadows))
-
-
-/proc/is_shadow(var/mob/living/M)
- return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.shadows)
-
-
-/datum/game_mode/shadowling
- name = "shadowling"
- config_tag = "shadowling"
- required_players = 30
- required_enemies = 2
- recommended_enemies = 2
- restricted_jobs = list("AI", "Cyborg")
- protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")
-
-/datum/game_mode/shadowling/announce()
- world << "The current game mode is - Shadowling!"
- world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding."
-
-/datum/game_mode/shadowling/pre_setup()
- if(config.protect_roles_from_antagonist)
- restricted_jobs += protected_jobs
-
- var/list/datum/mind/possible_shadowlings = get_players_for_role(BE_SHADOWLING)
-
- if(!possible_shadowlings.len)
- return 0
-
- for(var/datum/mind/player in possible_shadowlings)
- for(var/job in restricted_jobs)
- if(player.assigned_role == job)
- possible_shadowlings -= player
-
- var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2
-
- while(shadowlings)
- var/datum/mind/shadow = pick(possible_shadowlings)
- shadows += shadow
- possible_shadowlings -= shadow
- modePlayer += shadow
- shadow.special_role = "Shadowling"
- shadowlings--
- return 1
-
-
-/datum/game_mode/shadowling/post_setup()
- for(var/datum/mind/shadow in shadows)
- log_game("[shadow.key] (ckey) has been selected as a Shadowling.")
- sleep(10)
- shadow.current << "
"
- shadow.current << "You are a shadowling!"
- greet_shadow(shadow)
- finalize_shadowling(shadow)
- process_shadow_objectives(shadow)
- //give_shadowling_abilities(shadow)
- ..()
- return
-
-/datum/game_mode/proc/greet_shadow(var/datum/mind/shadow)
- shadow.current << "Currently, you are disguised as an employee aboard [world.name]."
- shadow.current << "In your limited state, you have three abilities: Enthrall, Hatch, and Shadowling Hivemind (:8)."
- shadow.current << "Any other shadowlings are your allies. You must assist them as they shall assist you."
- shadow.current << "If you are new to shadowling, or want to read about abilities, check the wiki page at http://nanotrasen.se/wiki/index.php/Shadowling
"
-
-
-/datum/game_mode/proc/process_shadow_objectives(var/datum/mind/shadow_mind)
- var/objective = "enthrall" //may be devour later, but for now it seems murderbone-y
-
- if(objective == "enthrall")
- var/objective_explanation = "Ascend to your true form by use of the Ascendance ability. This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability."
- shadow_objectives += "enthrall"
- shadow_mind.memory += "Objective #1: [objective_explanation]"
- shadow_mind.current << "Objective #1: [objective_explanation]
"
-
-
-/datum/game_mode/proc/finalize_shadowling(var/datum/mind/shadow_mind)
- var/mob/living/carbon/human/S = shadow_mind.current
- shadow_mind.current.verbs += /mob/living/carbon/human/proc/shadowling_hatch
- S.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/enthrall
- spawn(0)
- shadow_mind.current.add_language("Shadowling Hivemind")
- update_shadow_icons_added(shadow_mind)
- if(shadow_mind.assigned_role == "Clown")
- S << "Your alien nature has allowed you to overcome your clownishness."
- S.mutations.Remove(CLUMSY)
-
-/datum/game_mode/proc/add_thrall(datum/mind/new_thrall_mind)
- if (!istype(new_thrall_mind))
- return 0
- if(!(new_thrall_mind in shadowling_thralls))
- shadowling_thralls += new_thrall_mind
- update_shadow_icons_added(new_thrall_mind)
- new_thrall_mind.current.attack_log += "\[[time_stamp()]\] Became a thrall"
- new_thrall_mind.memory += "The Shadowlings' Objectives: Ascend to your true form by use of the Ascendance ability. \
- This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability."
- new_thrall_mind.current << "The objectives of your shadowlings:: Ascend to your true form by use of the Ascendance ability. \
- This may only be used with [required_thralls] collective thralls, while hatched, and is unlocked with the Collective Mind ability."
- new_thrall_mind.current.add_language("Shadowling Hivemind")
- return 1
-
-
-
-/*
- GAME FINISH CHECKS
-*/
-
-
-/datum/game_mode/shadowling/check_finished()
- var/shadows_alive = 0 //and then shadowling was kill
- for(var/datum/mind/shadow in shadows) //but what if shadowling was not kill?
- if(!istype(shadow.current,/mob/living/carbon/human) && !istype(shadow.current,/mob/living/simple_animal/ascendant_shadowling))
- continue
- if(shadow.current.stat == DEAD)
- continue
- shadows_alive++
- if(shadows_alive)
- return ..()
- else
- shadowling_dead = 1 //but shadowling was kill :(
- return 1
-
-
-/datum/game_mode/shadowling/proc/check_shadow_victory()
- var/success = 0 //Did they win?
- if(shadow_objectives.Find("enthrall"))
- success = shadowling_ascended
- return success
-
-
-/datum/game_mode/shadowling/declare_completion()
- if(check_shadow_victory() && emergency_shuttle.returned()) //Doesn't end instantly - this is hacky and I don't know of a better way ~X
- world << "The shadowlings have ascended and taken over the station!"
- else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round
- world << "The shadowlings have been killed by the crew!"
- else if(!check_shadow_victory() && emergency_shuttle.returned())
- world << "The crew has escaped the station before the shadowlings could ascend!"
- ..()
- return 1
-
-
-/datum/game_mode/proc/auto_declare_completion_shadowling()
- var/text = ""
- if(shadows.len)
- text += "
The shadowlings were:"
- for(var/datum/mind/shadow in shadows)
- text += "
[shadow.key] was [shadow.name] ("
- if(shadow.current)
- if(shadow.current.stat == DEAD)
- text += "died"
- else
- text += "survived"
- if(shadow.current.real_name != shadow.name)
- text += " as [shadow.current.real_name]"
- else
- text += "body destroyed"
- text += ")"
- text += "
"
- if(shadowling_thralls.len)
- text += "
The thralls were:"
- for(var/datum/mind/thrall in shadowling_thralls)
- text += "
[thrall.key] was [thrall.name] ("
- if(thrall.current)
- if(thrall.current.stat == DEAD)
- text += "died"
- else
- text += "survived"
- if(thrall.current.real_name != thrall.name)
- text += " as [thrall.current.real_name]"
- else
- text += "body destroyed"
- text += "
"
- world << text
-
-
-/*
- MISCELLANEOUS
-*/
-
-
-/datum/species/shadow/ling
- //Normal shadowpeople but with enhanced effects
- name = "Shadowling"
-
- icobase = 'icons/mob/human_races/r_shadowling.dmi'
- deform = 'icons/mob/human_races/r_shadowling.dmi'
-
- light_effect_amp = 1
- blood_color = "#555555"
- flesh_color = "#222222"
-
- flags = NO_BLOOD | NO_BREATHE | NO_SCAN | NO_INTORGANS
- burn_mod = 2 //2x burn damage
-
-/datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind)
- spawn(0)
- for(var/datum/mind/shadowling in shadows)
- if(shadowling.current && shadowling != shadow_mind)
- if(shadowling.current.client)
- var/I = image('icons/mob/mob.dmi', loc = shadow_mind.current, icon_state = "thrall")
- shadowling.current.client.images += I
- if(shadow_mind.current)
- if(shadow_mind.current.client)
- var/image/J = image('icons/mob/mob.dmi', loc = shadowling.current, icon_state = "shadowling")
- shadow_mind.current.client.images += J
- for(var/datum/mind/thrall in shadowling_thralls)
- if(thrall.current)
- if(thrall.current.client)
- var/I = image('icons/mob/mob.dmi', loc = shadow_mind.current, icon_state = "thrall")
- thrall.current.client.images += I
- if(shadow_mind.current)
- if(shadow_mind.current.client)
- var/image/J = image('icons/mob/mob.dmi', loc = thrall.current, icon_state = "thrall")
- shadow_mind.current.client.images += J
-
-/datum/game_mode/proc/update_shadow_icons_removed(datum/mind/shadow_mind)
- spawn(0)
- for(var/datum/mind/shadowling in shadows)
- if(shadowling.current)
- if(shadowling.current.client)
- for(var/image/I in shadowling.current.client.images)
- if((I.icon_state == "thrall" || I.icon_state == "shadowling") && I.loc == shadow_mind.current)
- del(I)
-
- for(var/datum/mind/thrall in thralls)
- if(thrall.current)
- if(thrall.current.client)
- for(var/image/I in thrall.current.client.images)
- if((I.icon_state == "thrall" || I.icon_state == "shadowling") && I.loc == shadow_mind.current)
- del(I)
-
- if(shadow_mind.current)
- if(shadow_mind.current.client)
- for(var/image/I in shadow_mind.current.client.images)
- if(I.icon_state == "thrall" || I.icon_state == "shadowling")
- del(I)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
deleted file mode 100644
index 3260d8e5245..00000000000
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ /dev/null
@@ -1,617 +0,0 @@
-/obj/effect/proc_holder/spell/wizard/targeted/glare
- name = "Glare"
- desc = "Stuns and mutes a target for a decent duration."
- panel = "Shadowling Abilities"
- charge_max = 300
- clothes_req = 0
-
-/obj/effect/proc_holder/spell/wizard/targeted/glare/cast(list/targets)
- for(var/mob/living/carbon/human/target in targets)
- if(!ishuman(target))
- charge_counter = charge_max
- return
- if(target.stat)
- charge_counter = charge_max
- return
- if(is_shadow_or_thrall(target))
- usr << "You don't see why you would want to paralyze an ally."
- charge_counter = charge_max
- return
-
- usr.visible_message("[usr]'s eyes flash a blinding red!")
- target.visible_message("[target] freezes in place, their eyes glazing over...")
- if(in_range(target, usr))
- target << "Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights..."
- else //Only alludes to the shadowling if the target is close by
- target << "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights..."
- target.Stun(10)
- if(target.reagents)
- target.reagents.add_reagent("capulettium_plus", 4) //This is really bad but it's the only way it works.
-
-
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/veil
- name = "Veil"
- desc = "Extinguishes all electronic lights in a decent radius."
- panel = "Shadowling Abilities"
- charge_max = 250 //Short cooldown because people can just turn the lights back on
- clothes_req = 0
- range = 5
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/veil/cast(list/targets)
- usr << "You silently disable all nearby lights."
- var/list/blacklisted_lights = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/slime)
- for(var/turf/T in targets)
- for(var/obj/item/device/flashlight/F in T.contents)
- if(is_type_in_list(F, blacklisted_lights))
- F.visible_message("[F] goes slightly dim for a moment.")
- return
- F.on = 0
- F.visible_message("[F] gutters and falls dark.")
- F.update_brightness()
- for(var/obj/machinery/light/L in T.contents)
- L.on = 0
- L.visible_message("[L] flickers and falls dark.")
- L.update(0)
- for(var/obj/item/device/pda/P in T.contents)
- P.fon = 0
- P.SetLuminosity(0)
- for(var/obj/effect/glowshroom/G in orange(2, usr)) //Very small radius
- G.visible_message("\The [G] withers away!")
- qdel(G)
- for(var/mob/living/carbon/human/H in T.contents)
- for(var/obj/item/device/flashlight/F in H)
- if(is_type_in_list(F, blacklisted_lights))
- F.visible_message("[F] goes slightly dim for a moment.")
- return
- F.on = 0
- F.visible_message("[F] gutters and falls dark.")
- F.update_brightness()
- for(var/obj/item/device/pda/P in H)
- P.fon = 0
- P.SetLuminosity(0) //failsafe
- if(H != usr)
- H << "You feel a chill and are plunged into darkness."
- H.luminosity = 0 //This might not be required, but it just acts as another failsafe.
-
-
-
-/obj/effect/proc_holder/spell/wizard/targeted/shadow_walk
- name = "Shadow Walk"
- desc = "Phases you into the space between worlds for a short time, allowing movement through walls and invisbility."
- panel = "Shadowling Abilities"
- charge_max = 600
- clothes_req = 0
- range = -1
- include_user = 1
-
-/obj/effect/proc_holder/spell/wizard/targeted/shadow_walk/cast(list/targets)
- for(var/mob/living/user in targets)
- playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1)
- user.visible_message("[user] vanishes into thin air!", "You enter the space between worlds as a passageway.")
- user.SetStunned(0)
- user.SetWeakened(0)
- user.incorporeal_move = 1
- user.alpha = 0
- if(user.buckled)
- user.buckled.unbuckle()
- sleep(40) //4 seconds
- user.visible_message("[user] appears out of nowhere!", "The pressure becomes too much and you vacate the interdimensional darkness.")
- user.incorporeal_move = 0
- user.alpha = 255
-
-
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze
- name = "Flash Freeze"
- desc = "Instantly freezes the blood of nearby people, stunning them and causing burn damage."
- panel = "Shadowling Abilities"
- range = 5
- charge_max = 1200
- clothes_req = 0
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze/cast(list/targets)
- usr << "You freeze the nearby air."
- playsound(usr.loc, 'sound/effects/ghost2.ogg', 50, 1)
-
- for(var/turf/T in targets)
- for(var/mob/living/carbon/human/target in T.contents)
- if(is_shadow_or_thrall(target))
- if(target == usr) //No message for the user, of course
- continue
- else
- target << "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!"
- continue
- target << "You are hit by a blast of paralyzingly cold air and feel goosebumps break out across your body!"
- target.Stun(2)
- if(target.bodytemperature)
- target.bodytemperature -= 200 //Extreme amount of initial cold
- if(target.reagents)
- target.reagents.add_reagent("frostoil", 15) //Half of a cryosting
-
-
-
-//Enthrall is the single most important spell
-/obj/effect/proc_holder/spell/wizard/targeted/enthrall
- name = "Enthrall"
- desc = "Allows you to enslave a conscious, non-braindead, non-catatonic human to your will. This takes some time to cast."
- panel = "Shadowling Abilities"
- charge_max = 450
- clothes_req = 0
- range = 1 //Adjacent to user
- var/enthralling = 0
-
-/obj/effect/proc_holder/spell/wizard/targeted/enthrall/cast(list/targets)
- for(var/mob/living/carbon/human/target in targets)
- if(!in_range(usr, target))
- usr << "You need to be closer to enthrall [target]."
- charge_counter = charge_max
- return
- if(!target.ckey)
- usr << "The target has no mind."
- charge_counter = charge_max
- return
- if(target.stat)
- usr << "The target must be conscious."
- charge_counter = charge_max
- return
- if(is_shadow_or_thrall(target))
- usr << "You can not enthrall allies."
- charge_counter = charge_max
- return
- if(!ishuman(target))
- usr << "You can only enthrall humans."
- charge_counter = charge_max
- return
- if(enthralling)
- usr << "You are already enthralling!"
- charge_counter = charge_max
- return
- enthralling = 1
- usr << "This target is valid. You begin the enthralling."
- target << "[usr] focuses in concentration. Your head begins to ache."
-
- for(var/progress = 0, progress <= 3, progress++)
- switch(progress)
- if(1)
- usr << "You begin allocating energy for the enthralling."
- usr.visible_message("[usr]'s eyes begin to throb a piercing red.")
- if(2)
- usr << "You begin the enthralling of [target]."
- usr.visible_message("[usr] leans over [target], their eyes glowing a deep crimson, and stares into their face.")
- target << "Your gaze is forcibly drawn into a blinding red light. You fall to the floor as conscious thought is wiped away."
- target.Weaken(12)
- sleep(20)
- if(isloyal(target))
- usr << "They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time."
- usr.visible_message("[usr] halts for a moment, then begins passing its hand over [target]'s body.")
- target << "You feel your loyalties begin to weaken!"
- sleep(150) //15 seconds - not spawn() so the enthralling takes longer
- usr << "The nanobots composing the loyalty implant have been rendered inert. Now to continue."
- usr.visible_message("[usr] halts thier hand and resumes staring into [target]'s face.")
- for(var/obj/item/weapon/implant/loyalty/L in target)
- if(L && L.implanted)
- qdel(L)
- target << "Your unwavering loyalty to Nanotrasen falters, dims, dies."
- if(3)
- usr << "You begin rearranging [target]'s memories."
- usr.visible_message("[usr]'s eyes flare brightly, and a horrible grin begins to spread across [target]'s face...")
- target << "Your head cries out. The veil of reality begins to crumple and something evil bleeds through." //Ow the edge
- if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant
- usr << "The enthralling has been interrupted - your target's mind returns to its previous state."
- target << "Your thoughts become coherent once more. Already you can barely remember what's happened to you."
- enthralling = 0
- return
-
- enthralling = 0
- usr << "You have enthralled [target]!"
- target << "You see the Truth. Reality has been torn away and you realize what a fool you've been."
- target << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals."
- target << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls."
- target << "You can communicate with the other enlightened ones by using the Hivemind Commune ability."
- target.adjustOxyLoss(-200) //In case the shadowling was choking them out
- ticker.mode.add_thrall(target.mind)
- target.mind.special_role = "Thrall"
-
-/obj/effect/proc_holder/spell/wizard/targeted/collective_mind
- name = "Collective Hivemind"
- desc = "Gathers the power of all of your thralls and compares it to what is needed for ascendance. Also gains you new abilities."
- panel = "Shadowling Abilities"
- charge_max = 300 //30 second cooldown to prevent spam
- clothes_req = 0
- range = -1
- include_user = 1
- var/blind_smoke_acquired
- var/screech_acquired
- var/drain_thrall_acquired
- var/thrall_swap_acquired
-
-/obj/effect/proc_holder/spell/wizard/targeted/collective_mind/cast(list/targets)
- for(var/mob/living/user in targets)
- var/thralls = 0
- var/victory_threshold = 15
- var/mob/M
-
- user << "You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls."
-
- for(M in living_mob_list)
- if(is_thrall(M))
- thralls++
- M << "You feel hooks sink into your mind and pull."
-
- if(!do_after(user, 30))
- user << "Your concentration has been broken. The mental hooks you have sent out now retract into your mind."
- return
-
- if(thralls >= 3 && !blind_smoke_acquired)
- blind_smoke_acquired = 1
- user << "The power of your thralls has granted you the Blinding Smoke ability. It will create a choking cloud that will blind any non-thralls who enter. \
- "
- user.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke
-
- if(thralls >= 5 && !drain_thrall_acquired)
- drain_thrall_acquired = 1
- user << "The power of your thralls has granted you the Drain Thrall ability. You can now drain nearby thralls to heal yourself."
- user.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls
-
- if(thralls >= 7 && !screech_acquired)
- screech_acquired = 1
- user << "The power of your thralls has granted you the Sonic Screech ability. This ability will shatter nearby windows and deafen enemies."
- user.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech
-
- if(thralls >= 9 && !thrall_swap_acquired)
- thrall_swap_acquired = 1
- user << "The power of your thralls has granted you the Spatial Relocation ability. This will, allow you to instantly swap places with one of your thralls in \
- addition to shattering nearby lights."
- user.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation
-
- if(thralls < victory_threshold)
- user << "You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present."
-
- else if(thralls >= victory_threshold)
- usr << "You are now powerful enough to ascend. Use the Ascendance ability when you are ready. This will kill all of your thralls."
- usr << "You may find Ascendance in the Shadowling Evolution tab."
- for(M in living_mob_list)
- if(is_shadow(M))
- M.mind.current.spell_list -= /obj/effect/proc_holder/spell/wizard/targeted/collective_mind
- M.mind.current.verbs -= /mob/living/carbon/human/proc/shadowling_hatch //In case a shadowling hasn't hatched
- M.mind.current.verbs += /mob/living/carbon/human/proc/shadowling_ascendance
- if(M == usr)
- return
- M << "[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend." //Tells all the other shadowlings
-
-
-
-/obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke
- name = "Blindness Smoke"
- desc = "Spews a cloud of smoke which will blind enemies."
- panel = "Shadowling Abilities"
- charge_max = 600
- clothes_req = 0
- range = -1
- include_user = 1
-
-/obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke/cast(list/targets) //Extremely hacky
- for(var/mob/living/user in targets)
- user.visible_message("[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!")
- user << "You regurgitate a vast cloud of blinding smoke."
- playsound(user, 'sound/effects/bamf.ogg', 50, 1)
- var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new /obj/item/weapon/reagent_containers/glass/beaker/large(user.loc)
- B.reagents.clear_reagents() //Just in case!
- B.icon_state = null //Invisible
- B.reagents.add_reagent("blindness_smoke", 10)
- var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
- S.attach(B)
- if(S)
- S.set_up(B.reagents, 10, 0, B.loc)
- S.start()
- sleep(10)
- S.start()
- qdel(B)
-
-datum/reagent/shadowling_blindness_smoke //Blinds non-shadowlings, heals shadowlings/thralls
- name = "!(%@ ERROR )!@$"
- id = "blindness_smoke"
- description = "<::ERROR::> CANNOT ANALYZE REAGENT <::ERROR::>"
- color = "#000000" //Complete black (RGB: 0, 0, 0)
- metabolization_rate = 100 //lel
-
-datum/reagent/shadowling_blindness_smoke/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!is_shadow_or_thrall(M))
- M << "You breathe in the black smoke, and your eyes burn horribly!"
- M.eye_blind = 5
- if(prob(25))
- M.visible_message("[M] screams and claws at their eyes!")
- M.Stun(2)
- else
- M << "You breathe in the black smoke, and you feel revitalized!"
- M.heal_organ_damage(2,2)
- M.adjustOxyLoss(-2)
- M.adjustToxLoss(-2)
- ..()
- return
-
-
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech
- name = "Sonic Screech"
- desc = "Deafens, stuns, and confuses nearby people. Also shatters windows."
- panel = "Shadowling Abilities"
- range = 7
- charge_max = 300
- clothes_req = 0
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/unearthly_screech/cast(list/targets)
- usr.audible_message("[usr] lets out a horrible scream!")
- playsound(usr.loc, 'sound/effects/screech.ogg', 100, 1)
-
- for(var/turf/T in targets)
- for(var/mob/target in T.contents)
- if(is_shadow_or_thrall(target))
- if(target == usr) //No message for the user, of course
- continue
- else
- continue
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- M << "A spike of pain drives into your head and scrambles your thoughts!"
- M.Weaken(2)
- M.confused += 10
- M.ear_damage += 3
- else if(issilicon(target))
- var/mob/living/silicon/S = target
- S << "ERROR $!(@ ERROR )#^! SENSOR INTERFERENCE DETECTED"
- S << 'sound/misc/interference.ogg'
- playsound(S, 'sound/machines/warning-buzzer.ogg', 50, 1)
- var/datum/effect/effect/system/spark_spread/sp = new /datum/effect/effect/system/spark_spread
- sp.set_up(5, 1, S)
- sp.start()
- S.Weaken(6)
- for(var/obj/structure/window/W in T.contents)
- W.hit(rand(50,100))
-
-
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls
- name = "Drain Thralls"
- desc = "Damages nearby thralls, draining their life and healing yourself."
- panel = "Shadowling Abilities"
- range = 3
- charge_max = 100
- clothes_req = 0
- var/thralls_drained = 0
- var/list/nearby_thralls = list()
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls/cast(list/targets)
- thralls_drained = 0
- nearby_thralls = list()
- for(var/turf/T in targets)
- for(var/mob/living/carbon/M in T.contents)
- if(is_thrall(M))
- thralls_drained++
- nearby_thralls.Add(M)
- M << "You feel a curious draining sensation and a wave of exhaustion washes over you."
- for(var/mob/living/carbon/M in nearby_thralls)
- nearby_thralls.Remove(M) //To prevent someone dying like a zillion times
- M.take_organ_damage(25/thralls_drained,25/thralls_drained) //For every nearby thrall, the damage to each is reduced - 1 thrall = 50 for him, 2 thralls = 25 for each, etc.
- usr << "You draw the life from [M] to heal your wounds."
- if(thralls_drained)
- var/mob/living/carbon/U = usr
- U.heal_organ_damage(25, 25)
- else
- charge_counter = charge_max
- usr << "There were no nearby thralls for you to drain."
-
-
-
-/obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation
- name = "Spatial Relocation"
- desc = "Swaps places with a thrall and breaks nearby lights."
- panel = "Shadowling Abilities"
- range = -1
- charge_max = 3000
- clothes_req = 0
- include_user = 1
- var/list/thralls_in_world = list()
-
-/obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation/cast(list/targets, distanceoverride)
- for(var/mob/living/carbon/human/M in world)
- if(is_thrall(M))
- thralls_in_world += M
- if(!thralls_in_world)
- charge_counter = charge_max
- return
- var/mob/living/carbon/thrall_to_swap = input("Who do you wish to swap places with?", "Available Thralls") as null|anything in (thralls_in_world)
- var/turf/shadowturf = get_turf(usr)
- var/turf/thrallturf = get_turf(thrall_to_swap)
- thrall_to_swap.visible_message("[thrall_to_swap] suddenly vanishes in a puff of black smoke!")
- thrall_to_swap << "You feel a brief sense of nausea before finding yourself in an entirely new place!"
- usr.visible_message("[usr] suddenly goes transparent and vanishes!")
- usr << "You experience vertigo as you swap your location with [thrall_to_swap]'s."
- thrall_to_swap.loc = shadowturf
- usr.loc = thrallturf
- thrall_to_swap.Weaken(4)
- usr.Weaken(4)
- usr.regenerate_icons()
- thrall_to_swap.regenerate_icons()
-
-// ASCENDANT ABILITIES BEYOND THIS POINT //
-
-/obj/effect/proc_holder/spell/wizard/targeted/annihilate
- name = "Annihilate"
- desc = "Gibs a human after a short time."
- panel = "Ascendant"
- range = 7
- charge_max = 300
- clothes_req = 0
-
-/obj/effect/proc_holder/spell/wizard/targeted/annihilate/cast(list/targets)
- var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
- if(SHA.phasing)
- usr << "You are not in the same plane of existence. Unphase first."
- charge_counter = charge_max
- return
-
- for(var/mob/living/carbon/human/boom in targets)
- if(is_shadow_or_thrall(boom))
- usr << "Making an ally explode seems unwise."
- charge_counter = charge_max
- return
- usr.visible_message("[usr]'s eyes flare as they gesture at [boom]!", \
- "You direct a lance of telekinetic energy at [boom].")
- boom << "You feel an immense pressure building all across your body!"
- boom.Stun(10)
- boom.audible_message("[boom] screams!")
- sleep(20)
- playsound(boom, 'sound/effects/splat.ogg', 100, 1)
- boom.visible_message("[boom] explodes!")
- boom.gib()
-
-
-
-/obj/effect/proc_holder/spell/wizard/targeted/hypnosis
- name = "Hypnosis"
- desc = "Instantly enthralls a human."
- panel = "Ascendant"
- range = 7
- charge_max = 450
- clothes_req = 0
-
-/obj/effect/proc_holder/spell/wizard/targeted/hypnosis/cast(list/targets)
- var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
- if(SHA.phasing)
- charge_counter = charge_max
- usr << "You are not in the same plane of existence. Unphase first."
- return
-
- for(var/mob/living/carbon/human/target in targets)
- if(is_shadow_or_thrall(target))
- usr << "You cannot enthrall an ally."
- charge_counter = charge_max
- return
- if(!target.ckey)
- usr << "The target has no mind."
- charge_counter = charge_max
- return
- if(target.stat)
- usr << "The target must be conscious."
- charge_counter = charge_max
- return
- if(!ishuman(target))
- usr << "You can only enthrall humans."
- charge_counter = charge_max
- return
-
- usr << "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall."
- target << "An agonizing spike of pain drives into your mind, and--"
- target << "And you see the Truth. Reality has been torn away and you realize what a fool you've been."
- target << "The shadowlings are your masters. Serve them above all else and ensure they complete their goals."
- target << "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls."
- target << "You can communicate with the other enlightened ones by using the Shadowling Hivemind (:8)."
- ticker.mode.add_thrall(target.mind)
- target.mind.special_role = "Thrall"
- target.add_language("Shadowling Hivemind")
-
-
-
-/obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift
- name = "Phase Shift"
- desc = "Phases you into the space between worlds at will, allowing you to move through walls and become invisible."
- panel = "Ascendant"
- range = -1
- include_user = 1
- charge_max = 15
- clothes_req = 0
-
-/obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift/cast(list/targets)
- var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
- for(SHA in targets)
- SHA.phasing = !SHA.phasing
- if(SHA.phasing)
- SHA.visible_message("[SHA] suddenly vanishes!", \
- "You begin phasing through planes of existence. Use the ability again to return.")
- SHA.incorporeal_move = 1
- SHA.alpha = 0
- else
- SHA.visible_message("[SHA] suddenly appears from nowhere!", \
- "You return from the space between worlds.")
- SHA.incorporeal_move = 0
- SHA.alpha = 255
-
-
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast
- name = "Glacial Blast"
- desc = "Extremely empowered version of Flash Freeze."
- panel = "Ascendant"
- range = 5
- charge_max = 600
- clothes_req = 0
-
-/obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast/cast(list/targets)
- var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
- if(SHA.phasing)
- usr << "You are not in the same plane of existence. Unphase first."
- return
-
- usr << "You freeze the nearby air."
- playsound(usr.loc, 'sound/effects/ghost2.ogg', 100, 1)
-
- for(var/turf/T in targets)
- for(var/mob/living/carbon/human/target in T.contents)
- if(is_shadow_or_thrall(target))
- if(target == usr) //No message for the user, of course
- continue
- else
- target << "You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!"
- continue
- target << "You are hit by a blast of cold unlike anything you have ever felt. Your limbs instantly lock in place and you feel ice burns across your body!"
- target.Weaken(15)
- if(target.bodytemperature)
- target.bodytemperature -= INFINITY //:^)
- target.take_organ_damage(0,80)
-
-
-
-/obj/effect/proc_holder/spell/wizard/targeted/vortex
- name = "Vortex"
- desc = "Tears open a hole in reality. Anyone, INCLUDING YOU, walking through it will be trapped there for eternity."
- panel = "Ascendant"
- range = -1
- include_user = 1
- charge_max = 1200
- clothes_req = 0
-
-/obj/effect/proc_holder/spell/wizard/targeted/vortex/cast(list/targets)
- var/mob/living/simple_animal/ascendant_shadowling/SHA = usr
- if(SHA.phasing)
- usr << "You are not in the same plane of existence. Unphase first."
- return
-
- for(SHA in targets)
- SHA.visible_message("[SHA] raises their arms upward as the markings on their body flare a blinding red!", \
- "You tear open a rift to the black space between worlds. It would be wise to avoid it.")
-
- new /obj/structure/shadow_vortex(SHA.loc)
-
-
-
-/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind_ascendant
- name = "Ascendant Commune"
- desc = "Allows you to silently communicate with all other shadowlings and thralls."
- panel = "Ascendant"
- charge_max = 20
- clothes_req = 0
- range = -1
- include_user = 1
-
-/obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind_ascendant/cast(list/targets)
- for(var/mob/living/user in targets)
- var/text = stripped_input(user, "What do you want to say to fellow thralls and shadowlings?.", "Hive Chat", "")
- if(!text)
- return
- text = "[text]"
- for(var/mob/M in mob_list)
- if(is_shadow_or_thrall(M) || (M in dead_mob_list))
- M << "\[Hive Chat\] [usr.real_name] (ASCENDANT): [text]" //Bigger text for ascendants.
diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm
deleted file mode 100644
index fcb84062c5e..00000000000
--- a/code/game/gamemodes/shadowling/shadowling_items.dm
+++ /dev/null
@@ -1,103 +0,0 @@
-/obj/item/clothing/under/shadowling
- name = "blackened flesh"
- desc = "Black, chitonous skin."
- item_state = "golem"
- origin_tech = null
- icon_state = "golem"
- _color = "golem"
- flags = ABSTRACT | NODROP
- has_sensor = 0
- unacidable = 1
-
-
-/obj/item/clothing/suit/space/shadowling
- name = "chitin shell"
- desc = "Dark, semi-transparent shell. Protects against vacuum, but not against the light of the stars." //Still takes damage from spacewalking but is immune to space itself
- icon_state = "golem"
- item_state = "golem"
- body_parts_covered = FULL_BODY //Shadowlings are immune to space
- cold_protection = FULL_BODY
- min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
- flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
- flags = ABSTRACT | NODROP | THICKMATERIAL
- slowdown = 0
- unacidable = 1
- heat_protection = null //You didn't expect a light-sensitive creature to have heat resistance, did you?
- max_heat_protection_temperature = null
-
-
-/obj/item/clothing/shoes/shadowling
- name = "chitin feet"
- desc = "Charred-looking feet. They have minature hooks that latch onto flooring."
- icon_state = "golem"
- unacidable = 1
- flags = NOSLIP | ABSTRACT | NODROP
-
-
-/obj/item/clothing/mask/gas/shadowling
- name = "chitin mask"
- desc = "A mask-like formation with slots for facial features. A red film covers the eyes."
- icon_state = "golem"
- item_state = "golem"
- origin_tech = null
- siemens_coefficient = 0
- unacidable = 1
- flags = ABSTRACT | NODROP
-
-
-/obj/item/clothing/gloves/shadowling
- name = "chitin hands"
- desc = "An electricity-resistant covering of the hands."
- icon_state = "golem"
- item_state = null
- origin_tech = null
- siemens_coefficient = 0
- unacidable = 1
- flags = ABSTRACT | NODROP
-
-
-/obj/item/clothing/head/shadowling
- name = "chitin helm"
- desc = "A helmet-like enclosure of the head."
- icon_state = "golem"
- item_state = null
- origin_tech = null
- unacidable = 1
- flags = ABSTRACT | NODROP
-
-
-/obj/item/clothing/glasses/night/shadowling
- name = "crimson eyes"
- desc = "A shadowling's eyes. Very light-sensitive and can detect body heat through walls."
- icon = null
- icon_state = null
- item_state = null
- origin_tech = null
- vision_flags = SEE_MOBS
- darkness_view = 3
- invisa_view = 2
- unacidable = 1
- flash_protect = -1
- flags = ABSTRACT | NODROP
-
-/obj/structure/shadow_vortex
- name = "vortex"
- desc = "A swirling hole in the fabric of reality. Eye-watering chimes sound from its depths."
- density = 0
- anchored = 1
- icon = 'icons/effects/genetics.dmi'
- icon_state = "shadow_portal"
-
-/obj/structure/shadow_vortex/New()
- src.audible_message("\The [src] lets out a dismaying screech as dimensional barriers are torn apart!")
- playsound(loc, 'sound/effects/eleczap.ogg', 100, 1)
- sleep(100)
- qdel(src)
-
-/obj/structure/shadow_vortex/Crossed(var/td)
- ..()
- if(ismob(td))
- td << "You enter the rift. Sickening chimes begin to jangle in your ears. \
- All around you is endless blackness. After you see something moving, you realize it isn't entirely lifeless." //A bit of spooking before they die
- playsound(loc, 'sound/effects/EMPulse.ogg', 25, 1)
- qdel(td)
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
deleted file mode 100644
index 4dd5ff26b68..00000000000
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ /dev/null
@@ -1,166 +0,0 @@
-//In here: Hatch and Ascendance
-
-/mob/living/carbon/human/proc/shadowling_hatch()
- set category = "Shadowling Evolution"
- set name = "Hatch"
-
- if(usr.stat)
- return
- usr.verbs -= /mob/living/carbon/human/proc/shadowling_hatch
- switch(alert("Are you sure you want to hatch? You cannot undo this!",,"Yes","No"))
- if("No")
- usr << "You decide against hatching for now."
- usr.verbs += /mob/living/carbon/human/proc/shadowling_hatch
- return
- if("Yes")
- usr.notransform = 1
- usr.visible_message("[usr]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!", \
- "You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.")
-
- for(var/obj/item/I in usr) //drops all items
- usr.unEquip(I)
- if(istype(I, /obj/item/organ) && (I in src.internal_organs)) //Shadowlings only have a brain, the other organs would drop otherwise.
- qdel(I)
-
- sleep(50)
- var/turf/simulated/floor/F
- var/turf/shadowturf = get_turf(usr)
- for(F in orange(1, usr))
- new /obj/structure/alien/resin/wall/shadowling(F)
- for(var/obj/structure/alien/resin/wall/shadowling/R in shadowturf) //extremely hacky
- qdel(R)
- new /obj/structure/alien/weeds/node(shadowturf) //Dim lighting in the chrysalis -- removes itself with the chrysalis
-
- usr.visible_message("A chrysalis forms around [usr], sealing them inside.", \
- "You create your chrysalis and begin to contort within.")
- usr.Weaken(30)
- sleep(100)
- usr.visible_message("The skin on [usr]'s back begins to split apart. Black spines slowly emerge from the divide.", \
- "Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.")
-
- sleep(90)
- usr.visible_message("[usr], now no longer recognizable as human, begins clawing at the resin walls around them.", \
- "Your false skin slips away. You begin tearing at the fragile membrane protecting you.")
-
- sleep(80)
- playsound(usr.loc, 'sound/weapons/slash.ogg', 25, 1)
- usr << "You rip and slice."
- sleep(10)
- playsound(usr.loc, 'sound/weapons/slashmiss.ogg', 25, 1)
- usr << "The chrysalis falls like water before you."
- sleep(10)
- playsound(usr.loc, 'sound/weapons/slice.ogg', 25, 1)
- usr << "You are free!"
-
- sleep(10)
- playsound(usr.loc, 'sound/effects/ghost.ogg', 100, 1)
- usr.real_name = "Shadowling ([rand(1,1000)])"
- usr.name = usr.real_name
- usr.notransform = 0
- usr << "YOU LIVE!!!"
-
- for(var/obj/structure/alien/resin/wall/shadowling/W in orange(usr, 1))
- playsound(W, 'sound/effects/splat.ogg', 50, 1)
- qdel(W)
- for(var/obj/structure/alien/weeds/node/N in shadowturf)
- qdel(N)
- usr.visible_message("The chrysalis explodes in a shower of purple flesh and fluid!")
- var/mob/living/carbon/human/M = usr
- M.underwear = "None"
- M.undershirt = "None"
- M.faction |= "faithless"
-
- usr.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform)
- usr.equip_to_slot_or_del(new /obj/item/clothing/shoes/shadowling(usr), slot_shoes)
- usr.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(usr), slot_wear_suit)
- usr.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(usr), slot_head)
- usr.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves)
- usr.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask)
- usr.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses)
- set_species("Shadowling")
-
- sleep(10)
- usr << "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies."
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/glare
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/veil
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadow_walk
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/flashfreeze
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/collective_mind
-
-
-
-/mob/living/carbon/human/proc/shadowling_ascendance()
- set category = "Shadowling Evolution"
- set name = "Ascendance"
-
- if(usr.stat)
- return
- usr.verbs -= /mob/living/carbon/human/proc/shadowling_ascendance
- switch(alert("It is time to ascend. Are you completely sure about this? You cannot undo this!",,"Yes","No"))
- if("No")
- usr << "You decide against ascending for now."
- usr.verbs += /mob/living/carbon/human/proc/shadowling_ascendance
- return
- if("Yes")
- usr.notransform = 1
- usr.visible_message("[usr] rapidly bends and contorts, their eyes flaring a deep crimson!", \
- "You begin unlocking the genetic vault within you and prepare yourself for the power to come.")
-
- sleep(30)
- usr.visible_message("[usr] suddenly shoots up a few inches in the air and begins hovering there, still twisting.", \
- "You hover into the air to make room for your new form.")
-
- sleep(60)
- usr.visible_message("[usr]'s skin begins to pulse red in sync with their eyes. Their form slowly expands outward.", \
- "You feel yourself beginning to mutate.")
-
- sleep(20)
- if(!ticker.mode.shadowling_ascended)
- usr << "It isn't enough. Time to draw upon your thralls."
- else
- usr << "After some telepathic searching, you find the reservoir of life energy from the thralls and tap into it."
-
- sleep(50)
- for(var/mob/M in mob_list)
- if(is_thrall(M) && !ticker.mode.shadowling_ascended)
- M.visible_message("[M] trembles minutely as their form turns to ash, black smoke pouring from their disintegrating face.", \
- "It's time! Your masters are ascending! Your last thoughts are happy as your body is drained of life.")
-
- ticker.mode.thralls -= M.mind //To prevent message spam
- M.death(0)
- M.dust()
-
- usr << "Drawing upon your thralls, you find the strength needed to finish and rend apart the final barriers to godhood."
-
- sleep(40)
- for(var/mob/living/M in orange(7, src))
- M.Weaken(10)
- M << "An immense pressure slams you onto the ground!"
- usr << "YOU LIVE!!!"
- world << "
A horrible wail echoes in your mind as the world plunges into blackness.
"
- world << 'sound/hallucinations/veryfar_noise.ogg'
- for(var/obj/machinery/power/apc/A in world)
- A.overload_lighting()
- var/mob/A = new /mob/living/simple_animal/ascendant_shadowling(usr.loc)
- usr.spell_list = list()
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/annihilate
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/hypnosis
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_phase_shift
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/glacial_blast
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/vortex
- usr.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/shadowling_hivemind_ascendant
- usr.mind.transfer_to(A)
- A.spell_list = usr.spell_list
- A.name = usr.real_name
- if(A.real_name)
- A.real_name = usr.real_name
- usr.alpha = 0 //This is pretty bad, but is also necessary for the shuttle call to function properly
- usr.flags |= GODMODE
- usr.notransform = 1
- sleep(50)
- if(!ticker.mode.shadowling_ascended)
- if(emergency_shuttle && emergency_shuttle.can_call())
- emergency_shuttle.call_evac()
- emergency_shuttle.launch_time = 0 // Cannot recall
- ticker.mode.shadowling_ascended = 1
- qdel(usr)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index a1a1e5f5f49..43311ce8eb7 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -201,11 +201,6 @@
break
return 0
- if(biomass >= CLONE_BIOMASS)
- src.biomass -= CLONE_BIOMASS
- else
- return 0
-
src.attempting = 1 //One at a time!!
src.locked = 1
@@ -447,10 +442,12 @@
src.occupant.loc = src.loc
src.icon_state = "pod_0"
src.eject_wait = 0 //If it's still set somehow.
- domutcheck(src.occupant) //Waiting until they're out before possible notransform.
+ domutcheck(src.occupant) //Waiting until they're out before possible monkeyizing.
src.occupant.add_side_effect("Bad Stomach") // Give them an extra side-effect for free.
src.occupant = null
+ src.biomass -= CLONE_BIOMASS
+
return
/obj/machinery/clonepod/proc/malfunction()
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index d818d5fd574..bf28014c6e9 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -144,7 +144,7 @@
if(pod1 && pod1.biomass >= CLONE_BIOMASS)
data["enoughbiomass"] = 1
else
- data["enoughbiomass"] = 0
+ data["enougbiomass"] = 0
// Set up the Nano UI
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 8449c006cb0..cb00c9cacc0 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -60,9 +60,10 @@
/obj/machinery/atmospherics/unary/cryo_cell/initialize()
if(node) return
- for(var/cdir in cardinal)
- node = findConnecting(cdir)
- if(node)
+ var/node_connect = dir
+ for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node = target
break
/obj/machinery/atmospherics/unary/cryo_cell/Destroy()
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index cb94f416ff7..cca19e50a98 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -49,12 +49,6 @@
relativewall_neighbours()
..()
-/obj/structure/alien/resin/wall/shadowling //For chrysalis
- name = "chrysalis wall"
- desc = "Some sort of purple substance in an egglike shape. It pulses and throbs from within and seems impenetrable."
- health = INFINITY
- icon_state = "wall0"
-
/obj/structure/alien/resin/membrane
name = "resin membrane"
desc = "Resin just thin enough to let light pass through."
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index a76d8c1cdeb..1b28a7b707e 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -8,43 +8,27 @@
flags = CONDUCT | NOBLOODY
var/number = 0
var/anyai = 1
- var/circuitry_installed=1
var/mob/living/silicon/ai/ai = list()
var/last_tick //used to delay the powercheck
- var/buildstage = 0
-/obj/item/device/radio/intercom/universe/New()
- tag = "UNIVERSE"
- return ..()
-
-/obj/item/device/radio/intercom/New(turf/loc, var/ndir = 0, var/building = 3)
+/obj/item/device/radio/intercom/New()
..()
- buildstage = building
- if(buildstage)
- processing_objects.Add(src)
- else
- pixel_x = (ndir & 3)? 0 : (ndir == 4 ? 28 : -28)
- pixel_y = (ndir & 3)? (ndir ==1 ? 28 : -28) : 0
- dir=ndir
- b_stat=1
- on = 0
- update_icon()
+ processing_objects += src
-/obj/item/device/radio/intercom/Destroy()
- processing_objects.Remove(src)
+/obj/item/device/radio/intercom/Del()
+ processing_objects -= src
..()
/obj/item/device/radio/intercom/attack_ai(mob/user as mob)
- add_hiddenprint(user)
- add_fingerprint(user)
+ src.add_fingerprint(user)
spawn (0)
attack_self(user)
-
+
/obj/item/device/radio/intercom/attack_paw(mob/user as mob)
- return attack_hand(user)
+ return src.attack_hand(user)
/obj/item/device/radio/intercom/attack_hand(mob/user as mob)
- add_fingerprint(user)
+ src.add_fingerprint(user)
spawn (0)
attack_self(user)
@@ -69,95 +53,20 @@
return
..()
-/obj/item/device/radio/intercom/attackby(obj/item/weapon/W as obj, mob/user as mob)
- switch(buildstage)
- if(3)
- if(iswirecutter(W) && b_stat && wires.IsAllCut())
- user << "You cut out the intercoms wiring and disconnect its electronics."
- playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1)
- if(do_after(user, 10))
- new /obj/item/stack/cable_coil(get_turf(src),5)
- on = 0
- b_stat = 1
- buildstage = 1
- update_icon()
- processing_objects.Remove(src)
- return 1
- else return ..()
- if(2)
- if(isscrewdriver(W))
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 10))
- update_icon()
- on = 1
- b_stat = 0
- buildstage = 3
- user << "You secure the electronics!"
- update_icon()
- processing_objects.Add(src)
- for(var/i, i<= 5, i++)
- wires.UpdateCut(i,1)
- return 1
- if(1)
- if(iscoil(W))
- var/obj/item/stack/cable_coil/coil = W
- if(coil.amount < 5)
- user << "You need more cable for this!"
- return
- if(do_after(user, 10))
- coil.use(5)
- user << "You wire \the [src]!"
- buildstage = 2
- return 1
- if(iscrowbar(W))
- user << "You begin removing the electronics..."
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 10))
- new /obj/item/weapon/intercom_electronics(get_turf(src))
- user << "The circuitboard pops out!"
- buildstage = 0
- return 1
- if(0)
- if(istype(W,/obj/item/weapon/intercom_electronics))
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 10))
- qdel(W)
- user << "You insert \the [W] into \the [src]!"
- buildstage = 1
- return 1
- if(iswelder(W))
- var/obj/item/weapon/weldingtool/WT=W
- playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
- if(!WT.remove_fuel(3, user))
- user << "You're out of welding fuel."
- return 1
- if(do_after(user, 10))
- user << "You cut the intercom frame from the wall!"
- new /obj/item/mounted/frame/intercom(get_turf(src))
- qdel(src)
- return 1
-
-/obj/item/device/radio/intercom/update_icon()
- if(!circuitry_installed)
- icon_state="intercom-frame"
- return
- icon_state = "intercom[!on?"-p":""][b_stat ? "-open":""]"
-
/obj/item/device/radio/intercom/process()
if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0))
last_tick = world.timeofday
- if(!areaMaster)
- on = 0
- update_icon()
- return
- on = areaMaster.powered(EQUIP) // set "on" to the power status
- update_icon()
-/obj/item/weapon/intercom_electronics
- name = "intercom electronics"
- icon = 'icons/obj/doors/door_assembly.dmi'
- icon_state = "door_electronics"
- desc = "Looks like a circuit. Probably is."
- w_class = 2.0
- m_amt = 50
- g_amt = 50
\ No newline at end of file
+ if(!src.loc)
+ on = 0
+ else
+ var/area/A = src.loc.loc
+ if(!A || !isarea(A) || !A.master)
+ on = 0
+ else
+ on = A.master.powered(EQUIP) // set "on" to the power status
+
+ if(!on)
+ icon_state = "intercom-p"
+ else
+ icon_state = "intercom"
diff --git a/code/game/objects/items/mountable_frames/intercom.dm b/code/game/objects/items/mountable_frames/intercom.dm
deleted file mode 100644
index 3b0f95f927a..00000000000
--- a/code/game/objects/items/mountable_frames/intercom.dm
+++ /dev/null
@@ -1,10 +0,0 @@
-/obj/item/mounted/frame/intercom
- name = "Intercom Frame"
- desc = "Used for building intercoms"
- icon = 'icons/obj/monitors.dmi'
- icon_state = "intercom_f"
- mount_reqs = list("simfloor", "nospace")
-
-/obj/item/mounted/frame/intercom/do_build(turf/on_wall, mob/user)
- new /obj/item/device/radio/intercom(get_turf(src), get_dir(on_wall, user), 0)
- qdel(src)
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 26daef3e3fa..3914207e538 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -74,7 +74,6 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("apc frame", /obj/item/mounted/frame/apc_frame, 2), \
new/datum/stack_recipe("air alarm frame", /obj/item/mounted/frame/alarm_frame, 2), \
new/datum/stack_recipe("fire alarm frame", /obj/item/mounted/frame/firealarm, 2), \
- new/datum/stack_recipe("intercom frame", /obj/item/mounted/frame/intercom, 2), \
null, \
)
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index aacdc9c6e37..27e3b00b489 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -67,12 +67,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/type_butt = /obj/item/weapon/cigbutt
var/lastHolder = null
var/smoketime = 300
- var/chem_volume = 30
+ var/chem_volume = 15
/obj/item/clothing/mask/cigarette/New()
..()
flags |= NOREACT // so it doesn't react until you light it
- create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 30
+ create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15
+ reagents.add_reagent("nicotine", 15)
/obj/item/clothing/mask/cigarette/Destroy()
..()
@@ -161,6 +162,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/process()
+ var/turf/location = get_turf(src)
var/mob/living/M = loc
if(isliving(loc))
M.IgniteMob()
@@ -168,39 +170,29 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(smoketime < 1)
die()
return
- smoke()
- return
-
-
-/obj/item/clothing/mask/cigarette/attack_self(mob/user as mob)
- if(lit)
- user.visible_message("[user] calmly drops and treads on the lit [src], putting it out instantly.")
- die()
- return ..()
-
-/obj/item/clothing/mask/cigarette/proc/smoke()
- var/turf/location = get_turf(src)
- var/is_being_smoked = 0
- // Check whether this is actually in a mouth, being smoked
- if(iscarbon(loc))
- var/mob/living/carbon/C = loc
- if(src == C.wear_mask)
- // There used to be a species check here, but synthetics can smoke now
- is_being_smoked = 1
if(location)
location.hotspot_expose(700, 5)
if(reagents && reagents.total_volume) // check if it has any reagents at all
- if(is_being_smoked) // if it's being smoked, transfer reagents to the mob
+ if(iscarbon(loc) && (src == loc:wear_mask)) // if it's in the human/monkey mouth, transfer reagents to the mob
+ if(istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = loc
+ if(H.species.flags & IS_SYNTHETIC)
+ return
var/mob/living/carbon/C = loc
if(prob(15)) // so it's not an instarape in case of acid
reagents.reaction(C, INGEST)
reagents.trans_to(C, REAGENTS_METABOLISM)
- if(!reagents.total_volume) // There were reagents, but now they're gone
- C << "Your [name] loses its flavor."
else // else just remove some of the reagents
reagents.remove_any(REAGENTS_METABOLISM)
return
+
+/obj/item/clothing/mask/cigarette/attack_self(mob/user as mob)
+ if(lit == 1)
+ user.visible_message("[user] calmly drops and treads on the lit [src], putting it out instantly.")
+ die()
+ return ..()
+
/obj/item/clothing/mask/cigarette/proc/die()
var/turf/T = get_turf(src)
var/obj/item/butt = new type_butt(T)
@@ -258,11 +250,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
throw_speed = 0.5
item_state = "cigaroff"
smoketime = 1500
- chem_volume = 40
-
-/obj/item/clothing/mask/cigarette/cigar/New()
- ..()
- reagents.add_reagent("nicotine", chem_volume/2)
+ chem_volume = 20
/obj/item/clothing/mask/cigarette/cigar/cohiba
name = "Cohiba Robusto Cigar"
@@ -278,7 +266,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
icon_on = "cigar2on"
icon_off = "cigar2off"
smoketime = 7200
- chem_volume = 60
+ chem_volume = 30
/obj/item/weapon/cigbutt
name = "cigarette butt"
@@ -319,10 +307,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
smoketime = 1000
chem_volume = 50
-/obj/item/clothing/mask/cigarette/pipe/New()
- ..()
- reagents.add_reagent("nicotine", chem_volume)
-
/obj/item/clothing/mask/cigarette/pipe/light(var/flavor_text = "[usr] lights the [name].")
if(!src.lit)
src.lit = 1
@@ -347,11 +331,24 @@ CIGARETTE PACKETS ARE IN FANCY.DM
M.update_inv_wear_mask(0)
processing_objects.Remove(src)
return
- smoke()
+ if(location)
+ location.hotspot_expose(700, 5)
+ if(reagents && reagents.total_volume) // check if it has any reagents at all
+ if(iscarbon(loc) && (src == loc:wear_mask)) // if it's in the human/monkey mouth, transfer reagents to the mob
+ if(istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = loc
+ if(H.species.flags & IS_SYNTHETIC)
+ return
+ var/mob/living/carbon/C = loc
+ if(prob(15)) // so it's not an instarape in case of acid
+ reagents.reaction(C, INGEST)
+ reagents.trans_to(C, REAGENTS_METABOLISM)
+ else // else just remove some of the reagents
+ reagents.remove_any(REAGENTS_METABOLISM)
return
/obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user as mob) //Refills the pipe. Can be changed to an attackby later, if loose tobacco is added to vendors or something.
- if(lit)
+ if(lit == 1)
user.visible_message("[user] puts out [src].")
lit = 0
icon_state = icon_off
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 94db07084a2..3dc18e532ca 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -154,22 +154,14 @@
slot_flags = SLOT_BELT
storage_slots = 6
can_hold = list("/obj/item/clothing/mask/cigarette")
- cant_hold = list("/obj/item/clothing/mask/cigarette/cigar",
- "/obj/item/clothing/mask/cigarette/pipe")
icon_type = "cigarette"
- var/list/unlaced_cigarettes = list() // Cigarettes that haven't received reagents yet
- var/default_reagents = list("nicotine" = 15) // List of reagents to pre-generate for each cigarette
/obj/item/weapon/storage/fancy/cigarettes/New()
..()
flags |= NOREACT
- create_reagents(30 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one
for(var/i = 1 to storage_slots)
- var/obj/item/clothing/mask/cigarette/C = new /obj/item/clothing/mask/cigarette(src)
- unlaced_cigarettes += C
- for(var/R in default_reagents)
- reagents.add_reagent(R, default_reagents[R])
-
+ new /obj/item/clothing/mask/cigarette(src)
+ create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one
/obj/item/weapon/storage/fancy/cigarettes/Destroy()
del(reagents)
@@ -181,25 +173,22 @@
desc = "There are [contents.len] cig\s left!"
return
-/obj/item/weapon/storage/fancy/cigarettes/proc/lace_cigarette(var/obj/item/clothing/mask/cigarette/C as obj)
- if(istype(C) && (C in unlaced_cigarettes)) // Only transfer reagents to each cigarette once
- reagents.trans_to(C, (reagents.total_volume/unlaced_cigarettes.len))
- unlaced_cigarettes -= C
- reagents.maximum_volume = 30 * unlaced_cigarettes.len
-
/obj/item/weapon/storage/fancy/cigarettes/remove_from_storage(obj/item/W as obj, atom/new_location)
- lace_cigarette(W)
- ..()
+ var/obj/item/clothing/mask/cigarette/C = W
+ if(!istype(C)) return // what
+ reagents.trans_to(C, (reagents.total_volume/contents.len))
+ ..()
/obj/item/weapon/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
- if(istype(M) && M == user && user.zone_sel.selecting == "mouth" && contents.len > 0 && !user.wear_mask)
- var/obj/item/clothing/mask/cigarette/C = contents[contents.len]
- if(!istype(C)) return
- lace_cigarette(C)
- user.equip_to_slot_if_possible(C, slot_wear_mask)
+ if(M == user && user.zone_sel.selecting == "mouth" && contents.len > 0 && !user.wear_mask)
+ var/obj/item/clothing/mask/cigarette/W = new /obj/item/clothing/mask/cigarette(user)
+ reagents.trans_to(W, (reagents.total_volume/contents.len))
+ user.equip_to_slot_if_possible(W, slot_wear_mask)
+ reagents.maximum_volume = 15 * contents.len
+ contents.len--
user << "You take a cigarette out of the pack."
update_icon()
else
@@ -228,7 +217,11 @@
desc = "An obscure brand of cigarettes."
icon_state = "syndiepacket"
item_state = "cigpacket"
- default_reagents = list("nicotine" = 15, "omnizine" = 15)
+
+/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate/New()
+ ..()
+ for(var/i = 1 to storage_slots)
+ reagents.add_reagent("omnizine",15)
/obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift
name = "\improper Uplift Smooth packet"
@@ -247,7 +240,11 @@
desc = "Smoked by the truly robust."
icon_state = "robustgpacket"
item_state = "cigpacket"
- default_reagents = list("nicotine" = 15, "gold" = 1)
+
+/obj/item/weapon/storage/fancy/cigarettes/cigpack_robustgold/New()
+ ..()
+ for(var/i = 1 to storage_slots)
+ reagents.add_reagent("gold",1)
/obj/item/weapon/storage/fancy/cigarettes/cigpack_carp
name = "\improper Carp Classic packet"
@@ -266,11 +263,14 @@
desc = "Is your weight slowing you down? Having trouble running away from gravitational singularities? Can't stop stuffing your mouth? Smoke Shady Jim's Super Slims and watch all that fat burn away. Guaranteed results!"
icon_state = "shadyjimpacket"
item_state = "cigpacket"
- default_reagents = list("nicotine" = 15,
- "lipolicide" = 7.5,
- "ammonia" = 2,
- "atrazine" = 1,
- "toxin" = 1.5)
+
+/obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims/New()
+ ..()
+ for(var/i = 1 to storage_slots)
+ reagents.add_reagent("lipolicide",4)
+ reagents.add_reagent("ammonia",2)
+ reagents.add_reagent("atrazine",1)
+ reagents.add_reagent("toxin",1.5)
/*
* Vial Box
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 3f9b54be569..74967aebc56 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -7,7 +7,7 @@
icon_opened = "secureceopen"
icon_broken = "securecebroken"
icon_off = "secureceoff"
-
+
New()
..()
sleep(2)
@@ -31,8 +31,7 @@
new /obj/item/device/multitool(src)
new /obj/item/device/flash(src)
new /obj/item/taperoll/engineering(src)
- new /obj/item/clothing/head/beret/eng(src)
- return
+ return
/obj/structure/closet/secure_closet/engineering_electrical
name = "Electrical Supplies"
@@ -59,7 +58,6 @@
new /obj/item/device/multitool(src)
new /obj/item/device/multitool(src)
new /obj/item/device/multitool(src)
- new /obj/item/clothing/head/beret/eng
return
@@ -115,7 +113,6 @@
new /obj/item/clothing/glasses/meson(src)
new /obj/item/weapon/cartridge/engineering(src)
new /obj/item/taperoll/engineering(src)
- new /obj/item/clothing/head/beret/eng(src)
return
/obj/structure/closet/secure_closet/atmos_personal
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 549bee20fcd..fcead78a565 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -105,10 +105,6 @@
new /obj/item/weapon/storage/backpack/cultpack (src)
new /obj/item/weapon/storage/fancy/candle_box(src)
new /obj/item/weapon/storage/fancy/candle_box(src)
- new /obj/item/clothing/gloves/ring/silver(src)
- new /obj/item/clothing/gloves/ring/silver(src)
- new /obj/item/clothing/gloves/ring/gold(src)
- new /obj/item/clothing/gloves/ring/gold(src)
return
@@ -186,9 +182,9 @@
new /obj/item/clothing/head/hardhat/red(src)
new /obj/item/clothing/head/hardhat/red(src)
new /obj/item/clothing/head/hardhat/red(src)
- new /obj/item/clothing/head/beret/atmos(src)
- new /obj/item/clothing/head/beret/atmos(src)
- new /obj/item/clothing/head/beret/atmos(src)
+ new /obj/item/clothing/head/beret/eng(src)
+ new /obj/item/clothing/head/beret/eng(src)
+ new /obj/item/clothing/head/beret/eng(src)
return
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 4bcadcb265d..f0f4c9855f3 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -417,8 +417,6 @@ var/global/wcColored
hit(round(exposed_volume / 1000), 0)
..()
-/obj/structure/window/plasmabasic/BlockSuperconductivity()
- return 1
/obj/structure/window/plasmareinforced
name = "reinforced plasma window"
@@ -444,9 +442,6 @@ var/global/wcColored
/obj/structure/window/plasmareinforced/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
-/obj/structure/window/plasmareinforced/BlockSuperconductivity()
- return 1 //okay this SHOULD MAKE THE TOXINS CHAMBER WORK
-
/obj/structure/window/reinforced
name = "reinforced window"
desc = "It looks rather strong. Might take a few good hits to shatter it."
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index 9be2b5815bc..6acdc12dea0 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -82,10 +82,6 @@ var/can_call_ert
usr << "This role is not yet available to you. You need to wait another [player_age_check] days."
return
- if(src.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
- usr << "\blue Upon using the antagHUD you forfeited the ability to join the round."
- return
-
if(response_team_members.len > 6)
usr << "The emergency response team is already full!"
return
diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm
index f0d0544bd45..6bd631e88f3 100644
--- a/code/game/shuttle_engines.dm
+++ b/code/game/shuttle_engines.dm
@@ -14,9 +14,6 @@
if(!height || air_group) return 0
else return ..()
- CanAtmosPass(turf/T)
- return !density
-
/obj/structure/shuttle/engine
name = "engine"
density = 1
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 7dbaa7b2492..4dd7d14d460 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -475,9 +475,6 @@
P.loc = src
P.level = 2
return
- // The magnetic gripper does a separate attackby, so bail from this one
- else if(istype(W, /obj/item/weapon/gripper))
- return
else
return attack_hand(user)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 1ea81011406..51edf9a4cdf 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -572,6 +572,9 @@ var/global/nologevent = 0
Quick Create Object
Create Turf
Create Mob
+
Edit Airflow Settings
+ Edit Plasma Settings
+ Choose a default ZAS setting
"}
usr << browse(dat, "window=admin2;size=210x280")
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index a3d862afce6..3fba23576b5 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -501,12 +501,6 @@
if(ticker.mode.traitors.len)
dat += check_role_table("Traitors", ticker.mode.traitors, src)
- if(ticker.mode.shadows.len)
- dat += check_role_table("Shadowlings", ticker.mode.shadows, src)
-
- if(ticker.mode.thralls.len)
- dat += check_role_table("Shadowling Thralls", ticker.mode.thralls, src)
-
if(ticker.mode.vampires.len)
dat += check_role_table("Vampires", ticker.mode.vampires, src)
diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm
index 400c60b2dea..12064823184 100644
--- a/code/modules/admin/verbs/antag-ooc.dm
+++ b/code/modules/admin/verbs/antag-ooc.dm
@@ -13,8 +13,8 @@
display_name = holder.fakekey
for(var/mob/M in mob_list)
- if((M.mind && M.mind.special_role && M.client) || (M.client && M.client.holder && (M.client.holder.rights & R_ADMIN)) )
+ if((M.mind && M.mind.special_role && M.client) || (M.client && M.client.holder))
M << "AOOC: [display_name]: [msg]"
- log_ooc("(ANTAG) [key] : [msg]")
+ log_ooc("(ANTAG) [key] : [msg]")
\ No newline at end of file
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 0dfa00ca8cf..3e5dea3cacc 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -23,7 +23,7 @@
///////////////
//SOUND STUFF//
///////////////
- var/ambience_playing = 0
+ var/ambience_playing= null
var/played = 0
////////////
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 77e005c0422..0f737fba217 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -17,14 +17,12 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"raider" = IS_MODE_COMPILED("heist"), // 1024 / 11
"vampire" = IS_MODE_COMPILED("vampire"), // 2048 / 12
"mutineer" = IS_MODE_COMPILED("mutiny"), // 4096 / 13
- "blob" = IS_MODE_COMPILED("blob"), // 8192 / 14
- "shadowling" = IS_MODE_COMPILED("shadowling") //16384 / 15
+ "blob" = IS_MODE_COMPILED("blob") // 8192 / 14
)
var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles
num2text(BE_PAI) = 0,
num2text(BE_TRAITOR) = 7,
num2text(BE_CHANGELING) = 14,
- num2text(BE_SHADOWLING) = 14,
num2text(BE_WIZARD) = 14,
num2text(BE_REV) = 14,
num2text(BE_VAMPIRE) = 14,
diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm
index ee3e0849d80..f9638c18bce 100644
--- a/code/modules/clothing/gloves/boxing.dm
+++ b/code/modules/clothing/gloves/boxing.dm
@@ -3,7 +3,6 @@
desc = "Because you really needed another excuse to punch your crewmates."
icon_state = "boxing"
item_state = "boxing"
- species_restricted = null
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
diff --git a/code/modules/clothing/gloves/rings.dm b/code/modules/clothing/gloves/rings.dm
deleted file mode 100644
index 90b012d0580..00000000000
--- a/code/modules/clothing/gloves/rings.dm
+++ /dev/null
@@ -1,97 +0,0 @@
-/obj/item/clothing/gloves/ring
- name = "iron ring"
- desc = "A band that goes around your finger. It's considered gauche to wear more than one."
- gender = "neuter" // not plural anymore
- transfer_prints = TRUE
- icon_state = "ironring"
- item_state = ""
- icon = 'icons/obj/clothing/rings.dmi'
- var/material = "iron"
- var/stud = 0
- species_restricted = null
-
- New()
- ..()
- update_icon()
-
- update_icon()
- if(stud)
- icon_state = "d_[initial(icon_state)]"
- else
- icon_state = initial(icon_state)
- examine()
- ..()
- usr << "This one is made of [material]."
- if(stud)
- usr << "It is adorned with a single gem."
-
-/obj/item/clothing/gloves/ring/attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/stack/sheet/mineral/diamond))
- var/obj/item/stack/sheet/mineral/diamond/D = I
- if(stud)
- usr << "The [src] already has a gem."
- else
- if(D.amount >= 1)
- D.use(1)
- stud = 1
- update_icon()
- usr << "You socket the diamond into the [src]."
-
-// s'pensive
-/obj/item/clothing/gloves/ring/silver
- name = "silver ring"
- icon_state = "silverring"
- material = "silver"
-
-/obj/item/clothing/gloves/ring/silver/blessed // todo
- name = "blessed silver ring"
-
-/obj/item/clothing/gloves/ring/gold
- name = "gold ring"
- icon_state = "goldring"
- material = "gold"
-
-/obj/item/clothing/gloves/ring/gold/blessed
- name = "wedding band"
-
-// cheap
-/obj/item/clothing/gloves/ring/plastic
- name = "white plastic ring"
- icon_state = "whitering"
- material = "plastic"
-
-/obj/item/clothing/gloves/ring/plastic/blue
- name = "blue plastic ring"
- icon_state = "bluering"
-
-/obj/item/clothing/gloves/ring/plastic/red
- name = "red plastic ring"
- icon_state = "redring"
-
-/obj/item/clothing/gloves/ring/plastic/random
- New()
- var/c = pick("white","blue","red")
- name = "[c] plastic ring"
- icon_state = "[c]ring"
-
-// weird
-/obj/item/clothing/gloves/ring/glass
- name = "glass ring"
- icon_state = "whitering"
- material = "glass"
-
-/obj/item/clothing/gloves/ring/plasma
- name = "plasma ring"
- icon_state = "plasmaring"
- material = "plasma"
-
-/obj/item/clothing/gloves/ring/uranium
- name = "uranium ring"
- icon_state = "uraniumring"
- material = "uranium"
-
-// cultish
-/obj/item/clothing/gloves/ring/shadow
- name = "shadow ring"
- icon_state = "shadowring"
- material = "shadows"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 7eedccf7345..da07efd0c9c 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -117,11 +117,6 @@
desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety."
icon_state = "e_beret_badge"
-/obj/item/clothing/head/beret/atmos
- name = "atmospherics beret"
- desc = "A beret for those who have shown immaculate proficienty in piping. Or plumbing."
- icon_state = "a_beret_badge"
-
//Medical
/obj/item/clothing/head/surgery
name = "surgical cap"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index eec5317fc6a..3b9874b9a4a 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -140,13 +140,12 @@
desc = "it's a cybernetically enhanced jumpsuit used for administrative duties."
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
- cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
+ cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
- heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
- max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
- slowdown = -10
+ heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+ max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0
/obj/item/clothing/under/johnny
diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm
index 16c4f90fde1..cc1e966ff46 100644
--- a/code/modules/mining/coins.dm
+++ b/code/modules/mining/coins.dm
@@ -101,19 +101,6 @@
overlays = list()
string_attached = null
user << "You detach the string from the coin."
- else if(istype(W,/obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.welding && WT.remove_fuel(0, user))
- var/typelist = list("iron" = /obj/item/clothing/gloves/ring,
- "silver" = /obj/item/clothing/gloves/ring/silver,
- "gold" = /obj/item/clothing/gloves/ring/gold,
- "plasma" = /obj/item/clothing/gloves/ring/plasma,
- "uranium" = /obj/item/clothing/gloves/ring/uranium)
- var/typekey = typelist[cmineral]
- if(ispath(typekey))
- user << "\blue You make [src] into a ring."
- new typekey(get_turf(loc))
- qdel(src)
else ..()
/obj/item/weapon/coin/attack_self(mob/user as mob)
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 533c47a253d..8ab42b7ae1c 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -9,7 +9,7 @@
opacity = 1
density = 1
blocks_air = 1
- temperature = TCMB
+ temperature = T0C
var/mineral/mineral
var/mined_ore = 0
var/last_act = 0
@@ -392,7 +392,7 @@
icon_state = "asteroid"
oxygen = 0.01
nitrogen = 0.01
- temperature = TCMB
+ temperature = T0C
icon_plating = "asteroid"
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
has_resources = 1
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index e6107b4cca2..cb72116b04a 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -3,7 +3,7 @@
/mob/proc/gib()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -31,7 +31,7 @@
/mob/proc/dust()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -54,7 +54,7 @@
/mob/proc/melt()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index af41d20b7ad..80761679cba 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -356,14 +356,6 @@
key = "g"
flags = RESTRICTED | HIVEMIND
-/datum/language/shadowling
- name = "Shadowling Hivemind"
- desc = "Shadowlings and their thralls are capable of communicating over a psychic hivemind."
- speech_verb = "says"
- colour = "shadowling"
- key = "8"
- flags = RESTRICTED | HIVEMIND
-
/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
if(speaker.mind && speaker.mind.changeling)
diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm
index 16b7a17721c..95ed75f18a0 100644
--- a/code/modules/mob/living/carbon/alien/alien_defenses.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm
@@ -49,8 +49,6 @@ In all, this is a lot like the monkey code. /N
/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M as mob)
if(..()) //to allow surgery to return properly.
return 0
- if(istype(src,/mob/living/carbon/alien/humanoid))
- return 0 //this is horrible but 100% necessary
switch(M.a_intent)
if("help")
diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm
index c72220790d1..1ae09f9f161 100644
--- a/code/modules/mob/living/carbon/alien/death.dm
+++ b/code/modules/mob/living/carbon/alien/death.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/alien/gib()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -22,7 +22,7 @@
/mob/living/carbon/alien/dust()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index c054f766dac..3d346f83941 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -254,7 +254,18 @@
help_shake_act(M)
if ("grab")
- grabbedby(M)
+ if (M == src || anchored)
+ return
+ var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src)
+
+ M.put_in_active_hand(G)
+
+ G.synch()
+
+ LAssailant = M
+
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ visible_message("[M] has grabbed [src] passively!")
if ("harm")
M.do_attack_animation(src)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index e9e4fd88608..0c218c81204 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -53,7 +53,7 @@
/mob/living/carbon/alien/humanoid/regenerate_icons()
..()
- if (notransform) return
+ if (monkeyizing) return
update_inv_head(0,0)
update_inv_wear_suit(0,0)
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 5ad58df488f..18b440e538a 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -23,8 +23,8 @@
/obj/item/organ/brain/New()
..()
spawn(5)
- for(var/mob/living/carbon/brain/bmob in src) //I'm going to hell for this, but there's no other way to stop these runtimes.
- bmob.client.screen.len = null //clear the hud
+ if(brainmob && brainmob.client)
+ brainmob.client.screen.len = null //clear the hud
/obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H)
name = "\the [H]'s [initial(src.name)]"
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index 24b900a7a2d..897b03c8a14 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -19,7 +19,7 @@
/mob/living/carbon/brain/gib()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 8540507d057..0b080d19738 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -169,17 +169,17 @@
..()
/obj/item/device/mmi/posibrain/New()
- for(var/mob/living/carbon/brain/bmob in src) //Also going to hell for this, but this should fix the runtimes.
- bmob = new /mob/living/carbon/brain(src)
- bmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
- bmob.real_name = src.brainmob.name
- bmob.loc = src
- bmob.container = src
- bmob.robot_talk_understand = 1
- bmob.stat = 0
- bmob.silent = 0
- bmob.brain_op_stage = 4.0
- dead_mob_list -= bmob
+
+ src.brainmob = new(src)
+ src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
+ src.brainmob.real_name = src.brainmob.name
+ src.brainmob.loc = src
+ src.brainmob.container = src
+ src.brainmob.robot_talk_understand = 1
+ src.brainmob.stat = 0
+ src.brainmob.silent = 0
+ src.brainmob.brain_op_stage = 4.0
+ dead_mob_list -= src.brainmob
..()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 683228e97e8..925636dbba5 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -27,47 +27,34 @@ mob/living
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
germ_level++
-#define STOMACH_ATTACK_DELAY 4
-
-/mob/living/carbon/var/last_stomach_attack //defining this here because no one would look in carbon_defines for it
-
/mob/living/carbon/relaymove(var/mob/user, direction)
if(user in src.stomach_contents)
- if(last_stomach_attack + STOMACH_ATTACK_DELAY > world.time) return
-
- last_stomach_attack = world.time
- for(var/mob/M in hearers(4, src))
- if(M.client)
- M.show_message(text("\red You hear something rumbling inside [src]'s stomach..."), 2)
-
- var/obj/item/I = user.get_active_hand()
- if(I && I.force)
- var/d = rand(round(I.force / 4), I.force)
-
- if(istype(src, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = src
- var/obj/item/organ/external/organ = H.get_organ("chest")
- if (istype(organ))
- if(organ.take_damage(d, 0))
- H.UpdateDamageIcon()
-
- H.updatehealth()
-
- else
- src.take_organ_damage(d)
-
- for(var/mob/M in viewers(user, null))
+ if(prob(40))
+ for(var/mob/M in hearers(4, src))
if(M.client)
- M.show_message(text("\red [user] attacks [src]'s stomach wall with the [I.name]!"), 2)
- playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1)
+ M.show_message(text("\red You hear something rumbling inside [src]'s stomach..."), 2)
+ var/obj/item/I = user.get_active_hand()
+ if(I && I.force)
+ var/d = rand(round(I.force / 4), I.force)
+ if(istype(src, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = src
+ var/obj/item/organ/external/organ = H.get_organ("chest")
+ if (istype(organ))
+ if(organ.take_damage(d, 0))
+ H.UpdateDamageIcon()
+ H.updatehealth()
+ else
+ src.take_organ_damage(d)
+ for(var/mob/M in viewers(user, null))
+ if(M.client)
+ M.show_message(text("\red [user] attacks [src]'s stomach wall with the [I.name]!"), 2)
+ playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1)
- if(prob(src.getBruteLoss() - 50))
- for(var/atom/movable/A in stomach_contents)
- A.loc = loc
- stomach_contents.Remove(A)
- src.gib()
-
-#undef STOMACH_ATTACK_DELAY
+ if(prob(src.getBruteLoss() - 50))
+ for(var/atom/movable/A in stomach_contents)
+ A.loc = loc
+ stomach_contents.Remove(A)
+ src.gib()
/mob/living/carbon/gib()
for(var/mob/M in src)
@@ -334,25 +321,22 @@ mob/living
src << "You must be conscious to do this!"
return
-/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/starting_machine)
- var/datum/pipe_network/network = starting_machine.return_network(starting_machine)
- if(!network)
- return
- for(var/datum/pipeline/pipeline in network.line_members)
- for(var/obj/machinery/atmospherics/A in (pipeline.members || pipeline.edges))
- if(!A.pipe_image)
- A.pipe_image = image(A, A.loc, layer = 20, dir = A.dir) //the 20 puts it above Byond's darkness (not its opacity view)
- pipes_shown += A.pipe_image
- client.images += A.pipe_image
+/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/unary/starting_machine)
+ for(var/datum/pipeline/pipeline in starting_machine.network.line_members)
+ for(var/atom/A in (pipeline.members || pipeline.edges))
+ var/image/new_image = image(A, A.loc, dir = A.dir)
+ pipes_shown += new_image
+ client.images += new_image
/mob/living/proc/remove_ventcrawl()
- if(client)
- for(var/image/current_image in pipes_shown)
- client.images -= current_image
- client.eye = src
+ for(var/image/current_image in pipes_shown)
+ client.images -= current_image
pipes_shown.len = 0
+ if(client)
+ client.eye = src
+
/mob/living/carbon/clean_blood()
. = ..()
if(ishuman(src))
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index d37cec20e60..078af523c0f 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/human/gib()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -42,7 +42,7 @@
/mob/living/carbon/human/dust()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -62,7 +62,7 @@
/mob/living/carbon/human/melt()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index da2f516375b..809844ea3b7 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -36,7 +36,7 @@
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
else //Everyone else fails, skip the emote attempt
return
- if("scream", "fart", "flip", "snap")
+ if("scream", "fart", "flip")
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
//Everything else, including typos of the above emotes
else
@@ -720,29 +720,6 @@
m_type = 2
- if ("snap")
- if(prob(95))
- m_type = 2
- var/mob/living/carbon/human/H = src
- var/obj/item/organ/external/L = H.get_organ("l_hand")
- var/obj/item/organ/external/R = H.get_organ("r_hand")
- var/left_hand_good = 0
- var/right_hand_good = 0
- if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN)))
- left_hand_good = 1
- if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN)))
- right_hand_good = 1
-
- if (!left_hand_good && !right_hand_good)
- usr << "You need at least one hand in good working order to snap your fingers."
- return
-
- message = "[src] snaps \his fingers."
- playsound(src.loc, 'sound/effects/fingersnap.ogg', 50, 1, -3)
- else
- message = "[src] snaps \his fingers right off!"
- playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
-
// Needed for M_TOXIC_FART
if("fart")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b3f2b7d8afc..11342b903ca 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -247,7 +247,7 @@
while(limbs_affected != 0)
processing_dismember = pick(organs)
- if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
+ if(processing_dismember.name != "chest" && processing_dismember.name != "head" && processing_dismember.name != "groin")
processing_dismember.droplimb(1,pick(0,1,2),0,1)
limbs_affected -= 1
@@ -271,7 +271,7 @@
while(limbs_affected != 0)
processing_dismember = pick(organs)
- if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
+ if(processing_dismember.name != "chest" && processing_dismember.name != "head" && processing_dismember.name != "groin")
processing_dismember.droplimb(1,pick(0,2),0,1)
limbs_affected -= 1
@@ -281,7 +281,7 @@
while(limbs_affected != 0)
processing_dismember = pick(organs)
- if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
+ if(processing_dismember.name != "chest" && processing_dismember.name != "head" && processing_dismember.name != "groin")
processing_dismember.droplimb(1,pick(0,2),0,1)
limbs_affected -= 1
@@ -303,7 +303,7 @@
while(limbs_affected != 0)
processing_dismember = pick(organs)
- if(processing_dismember.limb_name != "chest" && processing_dismember.limb_name != "head" && processing_dismember.limb_name != "groin")
+ if(processing_dismember.name != "chest" && processing_dismember.name != "head" && processing_dismember.name != "groin")
processing_dismember.droplimb(1,1,0,1)
limbs_affected -= 1
@@ -316,7 +316,7 @@
var/update = 0
var/weapon_message = "Explosive Blast"
for(var/obj/item/organ/external/temp in organs)
- switch(temp.limb_name)
+ switch(temp.name)
if("head")
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
if("chest")
@@ -1400,8 +1400,6 @@
regenerate_icons()
fixblood()
- UpdateAppearance()
-
if(species)
return 1
else
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index f23657da497..241bebd1178 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -91,7 +91,7 @@
stance_damage = 0
// standing is poor
- if(stance_damage >= 4)
+ if(stance_damage >= 4 || (stance_damage >= 2 && prob(5)))
if(!(lying || resting))
if(species && !(species.flags & NO_PAIN))
emote("scream")
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index d7220974175..5b7f9b708b1 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -46,7 +46,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
set invisibility = 0
//set background = 1
- if (notransform) return
+ if (monkeyizing) return
if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE
..()
@@ -760,24 +760,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount
else light_amount = 10
if(light_amount > species.light_dam) //if there's enough light, start dying
- if(species.light_effect_amp)
- adjustFireLoss(5) //This gets doubled by Shadowling's innate fire weakness, so it ends up being 10.
- else
- adjustFireLoss(1)
- adjustBruteLoss(1)
- src << "The light burns you!"
- src << 'sound/weapons/sear.ogg'
+ take_overall_damage(1,1)
else //heal in the dark
- if(species.light_effect_amp)
- adjustFireLoss(-5)
- adjustBruteLoss(-5)
- adjustBrainLoss(-25) //gibbering shadowlings are hilarious but also bad to have
- adjustCloneLoss(-1)
- SetWeakened(0)
- SetStunned(0)
- else
- adjustFireLoss(-1)
- adjustBruteLoss(-1)
+ heal_overall_damage(1,1)
//The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered.
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 8b3be53b8c6..3621f44c8e6 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -471,10 +471,8 @@ proc/get_damage_icon_part(damage_state, body_part)
//For legacy support.
/mob/living/carbon/human/regenerate_icons()
..()
- if(notransform) return
+ if(monkeyizing) return
update_mutations(0)
- update_body(0)
- update_hair(0)
update_mutantrace(0)
update_inv_w_uniform(0,0)
update_inv_wear_id(0)
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index 8b11c8a1b2f..55b6f5c4d69 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -9,7 +9,7 @@
set invisibility = 0
//set background = 1
- if (src.notransform)
+ if (src.monkeyizing)
return
..()
diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm
index 0c3ef632cca..8e982eb9356 100644
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ b/code/modules/mob/living/carbon/monkey/death.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/monkey/gib()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -21,7 +21,7 @@
/mob/living/carbon/monkey/dust()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 1a3bfc3f05a..65a5f5b14e6 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -12,7 +12,7 @@
/mob/living/carbon/monkey/Life()
set invisibility = 0
//set background = 1
- if (notransform) return
+ if (monkeyizing) return
if (update_muts)
update_muts=0
domutcheck(src,null,MUTCHK_FORCED)
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index b709f1f5b8b..cc25d319842 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -41,8 +41,7 @@
var/brute_mod = null // Physical damage reduction/malus.
var/burn_mod = null // Burn damage reduction/malus.
- var/light_dam //Light level above which species takes damage, and below which it heals.
- var/light_effect_amp //If 0, takes/heals 1 burn and brute per tick. Otherwise, both healing and damage effects are amplified.
+ var/light_dam
var/max_hurt_damage = 9 // Max melee damage dealt + 5 if hulk
var/list/default_genes = list()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 86eae591aff..b1900ffa39b 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1,7 +1,7 @@
/mob/living/Life()
..()
- if (notransform) return
+ if (monkeyizing) return
if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE
if(mind)
if(mind in ticker.mode.implanted)
@@ -460,9 +460,6 @@
for(var/mob/living/carbon/slime/M in view(1,src))
M.UpdateFeed(src)
-/*//////////////////////
- START RESIST PROCS
-*///////////////////////
/mob/living/verb/resist()
set name = "Resist"
@@ -476,327 +473,260 @@
//Getting out of someone's inventory.
if(istype(src.loc,/obj/item/weapon/holder))
- resist_holder()
+ var/obj/item/weapon/holder/H = src.loc //Get our item holder.
+ var/mob/M = H.loc //Get our mob holder (if any).
+
+ if(istype(M))
+ M.unEquip(H)
+ M << "[H] wriggles out of your grip!"
+ src << "You wriggle out of [M]'s grip!"
+ else if(istype(H.loc,/obj/item))
+ src << "You struggle free of [H.loc]."
+ H.loc = get_turf(H)
+
+ if(istype(M))
+ for(var/atom/A in M.contents)
+ if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
+ return
+
+ M.status_flags &= ~PASSEMOTES
+ return
//Resisting control by an alien mind.
if(istype(src.loc,/mob/living/simple_animal/borer))
- resist_borer()
+ var/mob/living/simple_animal/borer/B = src.loc
+ var/mob/living/captive_brain/H = src
+
+ H << "\red You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)."
+ B.host << "\red You feel the captive mind of [src] begin to resist your control."
+
+ spawn(rand(350,450)+B.host.brainloss)
+
+ if(!B || !B.controlling)
+ return
+
+ B.host.adjustBrainLoss(rand(5,10))
+ H << "\red With an immense exertion of will, you regain control of your body!"
+ B.host << "\red You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you."
+
+ B.detatch()
+
+ verbs -= /mob/living/carbon/proc/release_control
+ verbs -= /mob/living/carbon/proc/punish_host
+ verbs -= /mob/living/carbon/proc/spawn_larvae
+
+ return
//resisting grabs (as if it helps anyone...)
- if ((!(L.stat) && !(L.restrained())))
- resist_grab(L) //this passes L because the proc requires a typecasted mob/living instead of just 'src'
+ if ((!( L.stat ) && !( L.restrained() )))
+ var/resisting = 0
+ for(var/obj/O in L.requests)
+ L.requests.Remove(O)
+ del(O)
+ resisting++
+ for(var/obj/item/weapon/grab/G in usr.grabbed_by)
+ resisting++
+ if (G.state == 1)
+ del(G)
+ else
+ if (G.state == 2)
+ if (prob(25))
+ for(var/mob/O in viewers(L, null))
+ O.show_message(text("\red [] has broken free of []'s grip!", L, G.assailant), 1)
+ del(G)
+ else
+ if (G.state == 3)
+ if (prob(5))
+ for(var/mob/O in viewers(usr, null))
+ O.show_message(text("\red [] has broken free of []'s headlock!", L, G.assailant), 1)
+ del(G)
+ if(resisting)
+ for(var/mob/O in viewers(usr, null))
+ O.show_message(text("\red [] resists!", L), 1)
//unbuckling yourself
if(L.buckled && (L.last_special <= world.time) )
- resist_buckle(L) //this passes L because the proc requires a typecasted mob/living instead of just 'src'
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ if( C.handcuffed )
+ C.changeNext_move(CLICK_CD_BREAKOUT)
+ C.last_special = world.time + CLICK_CD_BREAKOUT
+ C << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)"
+ for(var/mob/O in viewers(L))
+ O.show_message("\red [usr] attempts to unbuckle themself!", 1)
+ spawn(0)
+ if(do_after(usr, 1200))
+ if(!C.buckled)
+ return
+ for(var/mob/O in viewers(C))
+ O.show_message("\red [usr] manages to unbuckle themself!", 1)
+ C << "\blue You successfully unbuckle yourself."
+ C.buckled.manual_unbuckle(C)
+ else
+ L.buckled.manual_unbuckle(L)
//Breaking out of a locker?
- else if(src.loc && (istype(src.loc, /obj/structure/closet)))
- resist_closet()
+ else if( src.loc && (istype(src.loc, /obj/structure/closet)) )
+ var/breakout_time = 2 //2 minutes by default
+
+ var/obj/structure/closet/C = L.loc
+ if(C.opened)
+ return //Door's open... wait, why are you in it's contents then?
+ if(istype(L.loc, /obj/structure/closet/secure_closet))
+ var/obj/structure/closet/secure_closet/SC = L.loc
+ if(!SC.locked && !SC.welded)
+ return //It's a secure closet, but isn't locked. Easily escapable from, no need to 'resist'
+ else
+ if(!C.welded)
+ return //closed but not welded...
+ // else Meh, lets just keep it at 2 minutes for now
+ // breakout_time++ //Harder to get out of welded lockers than locked lockers
+
+ //okay, so the closet is either welded or locked... resist!!!
+ L.changeNext_move(CLICK_CD_BREAKOUT)
+ L.last_special = world.time + CLICK_CD_BREAKOUT
+ L << "\red You lean on the back of \the [C] and start pushing the door open. (this will take about [breakout_time] minutes)"
+ for(var/mob/O in viewers(usr.loc))
+ O.show_message("\red The [L.loc] begins to shake violently!", 1)
+
+
+ spawn(0)
+ if(do_after(usr,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds
+ if(!C || !L || L.stat != CONSCIOUS || L.loc != C || C.opened) //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened
+ return
+
+ //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'...
+ if(istype(L.loc, /obj/structure/closet/secure_closet))
+ var/obj/structure/closet/secure_closet/SC = L.loc
+ if(!SC.locked && !SC.welded)
+ return
+ else
+ if(!C.welded)
+ return
+
+ //Well then break it!
+ if(istype(usr.loc, /obj/structure/closet/secure_closet))
+ var/obj/structure/closet/secure_closet/SC = L.loc
+ SC.desc = "It appears to be broken."
+ SC.icon_state = SC.icon_off
+ flick(SC.icon_broken, SC)
+ sleep(10)
+ flick(SC.icon_broken, SC)
+ sleep(10)
+ SC.broken = 1
+ SC.locked = 0
+ SC.update_icon()
+ usr << "\red You successfully break out!"
+ for(var/mob/O in viewers(L.loc))
+ O.show_message("\red \the [usr] successfully broke out of \the [SC]!", 1)
+ if(istype(SC.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace)
+ var/obj/structure/bigDelivery/BD = SC.loc
+ BD.attack_hand(usr)
+ SC.open()
+ else
+ C.welded = 0
+ C.update_icon()
+ usr << "\red You successfully break out!"
+ for(var/mob/O in viewers(L.loc))
+ O.show_message("\red \the [usr] successfully broke out of \the [C]!", 1)
+ if(istype(C.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above
+ var/obj/structure/bigDelivery/BD = C.loc
+ BD.attack_hand(usr)
+ C.open()
//breaking out of handcuffs
else if(iscarbon(L))
var/mob/living/carbon/CM = L
if(CM.on_fire && CM.canmove)
- resist_stop_drop_roll(CM) //this passes CM because the proc requires a typecasted mob/living/carbon instead of just 'src'
-
- if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time))//this passes CM because the proc requires a typecasted mob/living/carbon instead of just 'src'
- resist_handcuffs(CM)
-
- else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time)) //this passes CM because the proc requires a typecasted mob/living/carbon instead of just 'src'
- resist_legcuffs(CM)
-
-/*////////////////////
- RESIST SUBPROCS
-*/////////////////////
-
-/* resist_holder allows small mobs that can be picked up to get out of their holder, so they aren't stuck forever.
-*/////
-/mob/living/proc/resist_holder()
- var/obj/item/weapon/holder/H = src.loc //Get our item holder.
- var/mob/M = H.loc //Get our mob holder (if any).
-
- if(istype(M))
- M.unEquip(H)
- M << "[H] wriggles out of your grip!"
- src << "You wriggle out of [M]'s grip!"
- else if(istype(H.loc,/obj/item))
- src << "You struggle free of [H.loc]."
- H.loc = get_turf(H)
-
- if(istype(M))
- for(var/atom/A in M.contents)
- if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
- return
-
- M.status_flags &= ~PASSEMOTES
- return
-
-/* resist_borer allows a mob to regain control of their body after a borer has assumed control.
-*/////
-/mob/living/proc/resist_borer()
- var/mob/living/simple_animal/borer/B = src.loc
- var/mob/living/captive_brain/H = src
-
- H << "\red You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)."
- B.host << "\red You feel the captive mind of [src] begin to resist your control."
-
- spawn(rand(350,450)+B.host.brainloss)
-
- if(!B || !B.controlling)
+ CM.fire_stacks -= 5
+ CM.weakened = max(CM.weakened, 3)//We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy.
+ CM.update_canmove()
+ CM.spin(32,2)
+ CM.visible_message("[CM] rolls on the floor, trying to put themselves out!", \
+ "You stop, drop, and roll!")
+ sleep(30)
+ if(fire_stacks <= 0)
+ CM.visible_message("[CM] has successfully extinguished themselves!", \
+ "You extinguish yourself.")
+ ExtinguishMob()
return
- B.host.adjustBrainLoss(rand(5,10))
- H << "\red With an immense exertion of will, you regain control of your body!"
- B.host << "\red You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you."
-
- B.detatch()
-
- verbs -= /mob/living/carbon/proc/release_control
- verbs -= /mob/living/carbon/proc/punish_host
- verbs -= /mob/living/carbon/proc/spawn_larvae
-
- return
-
-/* resist_grab allows a mob to resist a grab from another mob when disarming is not an option/neckgrabbed.
-*/////
-/mob/living/proc/resist_grab(var/mob/living/L)
- var/resisting = 0
-
- for(var/obj/O in L.requests)
- L.requests.Remove(O)
- del(O)
- resisting++
-
- for(var/obj/item/weapon/grab/G in usr.grabbed_by)
- resisting++
- if (G.state == 1)
- del(G)
-
- else
- if(G.state == 2)
- if(prob(25))
- for(var/mob/O in viewers(L, null))
- O.show_message(text("\red [] has broken free of []'s grip!", L, G.assailant), 1)
- del(G)
-
+ if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time))
+ CM.changeNext_move(CLICK_CD_BREAKOUT)
+ CM.last_special = world.time + CLICK_CD_BREAKOUT
+ if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here.
+ usr << "\red You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)"
+ for(var/mob/O in viewers(CM))
+ O.show_message(text("\red [] is trying to break the handcuffs!", CM), 1)
+ spawn(0)
+ if(do_after(CM, 50))
+ if(!CM.handcuffed || CM.buckled)
+ return
+ for(var/mob/O in viewers(CM))
+ O.show_message(text("\red [] manages to break the handcuffs!", CM), 1)
+ CM << "\red You successfully break your handcuffs."
+ CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ del(CM.handcuffed)
+ CM.handcuffed = null
+ CM.update_inv_handcuffed()
else
- if(G.state == 3)
- if(prob(5))
- for(var/mob/O in viewers(usr, null))
- O.show_message(text("\red [] has broken free of []'s headlock!", L, G.assailant), 1)
- del(G)
+ var/obj/item/weapon/restraints/handcuffs/HC = CM.handcuffed
+ var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/restraints/handcuffs type
+ var/displaytime = 2 //Minutes to display in the "this will take X minutes."
+ if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future...
+ breakouttime = HC.breakouttime
+ displaytime = breakouttime / 600 //Minutes
+ CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)"
+ for(var/mob/O in viewers(CM))
+ O.show_message( "\red [usr] attempts to remove \the [HC]!", 1)
+ spawn(0)
+ if(do_after(CM, breakouttime))
+ if(!CM.handcuffed || CM.buckled)
+ return // time leniency for lag which also might make this whole thing pointless but the server
+ for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink
+ O.show_message("\red [CM] manages to remove the handcuffs!", 1)
+ CM << "\blue You successfully remove \the [CM.handcuffed]."
+ CM.unEquip(CM.handcuffed)
- if(resisting)
- for(var/mob/O in viewers(usr, null))
- O.show_message(text("\red [] resists!", L), 1)
-
-/* resist_buckle allows a mob that is bucklecuffed to break free of the chair/bed/whatever
-*/////
-/mob/living/proc/resist_buckle(var/mob/living/L)
- if(iscarbon(L))
- var/mob/living/carbon/C = L
-
- if(C.handcuffed)
- C.changeNext_move(CLICK_CD_BREAKOUT)
- C.last_special = world.time + CLICK_CD_BREAKOUT
-
- C << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stay still)"
- for(var/mob/O in viewers(L))
- O.show_message("\red [usr] attempts to unbuckle themself!", 1)
-
- spawn(0)
- if(do_after(usr, 1200))
- if(!C.buckled)
- return
- for(var/mob/O in viewers(C))
- O.show_message("\red [usr] manages to unbuckle themself!", 1)
- C << "\blue You successfully unbuckle yourself."
- C.buckled.manual_unbuckle(C)
-
- else
- L.buckled.manual_unbuckle(L)
-
-/* resist_closet() allows a mob to break out of a welded/locked closet
-*/////
-/mob/living/proc/resist_closet()
- var/breakout_time = 2 //2 minutes by default
- var/mob/living/L = src
- var/obj/structure/closet/C = L.loc
- if(C.opened)
- return //Door's open... wait, why are you in it's contents then?
- if(istype(L.loc, /obj/structure/closet/secure_closet))
- var/obj/structure/closet/secure_closet/SC = L.loc
- if(!SC.locked && !SC.welded)
- return //It's a secure closet, but isn't locked. Easily escapable from, no need to 'resist'
- else
- if(!C.welded)
- return //closed but not welded...
- // else Meh, lets just keep it at 2 minutes for now
- // breakout_time++ //Harder to get out of welded lockers than locked lockers
-
- //okay, so the closet is either welded or locked... resist!!!
- L.changeNext_move(CLICK_CD_BREAKOUT)
- L.last_special = world.time + CLICK_CD_BREAKOUT
- L << "\red You lean on the back of \the [C] and start pushing the door open. (this will take about [breakout_time] minutes)"
- for(var/mob/O in viewers(usr.loc))
- O.show_message("\red The [L.loc] begins to shake violently!", 1)
-
-
- spawn(0)
- if(do_after(usr,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds
- if(!C || !L || L.stat != CONSCIOUS || L.loc != C || C.opened) //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened
- return
-
- //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'...
- if(istype(L.loc, /obj/structure/closet/secure_closet))
- var/obj/structure/closet/secure_closet/SC = L.loc
- if(!SC.locked && !SC.welded)
- return
+ else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time))
+ CM.changeNext_move(CLICK_CD_BREAKOUT)
+ CM.last_special = world.time + CLICK_CD_BREAKOUT
+ if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here.
+ usr << "\red You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)"
+ for(var/mob/O in viewers(CM))
+ O.show_message(text("\red [] is trying to break the legcuffs!", CM), 1)
+ spawn(0)
+ if(do_after(CM, 50))
+ if(!CM.legcuffed || CM.buckled)
+ return
+ for(var/mob/O in viewers(CM))
+ O.show_message(text("\red [] manages to break the legcuffs!", CM), 1)
+ CM << "\red You successfully break your legcuffs."
+ CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ del(CM.legcuffed)
+ CM.legcuffed = null
+ CM.update_inv_legcuffed()
else
- if(!C.welded)
- return
-
- //Well then break it!
- if(istype(usr.loc, /obj/structure/closet/secure_closet))
- var/obj/structure/closet/secure_closet/SC = L.loc
- SC.desc = "It appears to be broken."
- SC.icon_state = SC.icon_off
- flick(SC.icon_broken, SC)
- sleep(10)
- flick(SC.icon_broken, SC)
- sleep(10)
- SC.broken = 1
- SC.locked = 0
- SC.update_icon()
- usr << "\red You successfully break out!"
- for(var/mob/O in viewers(L.loc))
- O.show_message("\red \the [usr] successfully broke out of \the [SC]!", 1)
- if(istype(SC.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace)
- var/obj/structure/bigDelivery/BD = SC.loc
- BD.attack_hand(usr)
- SC.open()
- else
- C.welded = 0
- C.update_icon()
- usr << "\red You successfully break out!"
- for(var/mob/O in viewers(L.loc))
- O.show_message("\red \the [usr] successfully broke out of \the [C]!", 1)
- if(istype(C.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above
- var/obj/structure/bigDelivery/BD = C.loc
- BD.attack_hand(usr)
- C.open()
-
-/* resist_stop_drop_roll allows a mob to stop, drop, and roll in order to put out a fire burning on them.
-*/////
-/mob/living/proc/resist_stop_drop_roll(var/mob/living/carbon/CM)
- CM.fire_stacks -= 5
- CM.weakened = max(CM.weakened, 3)//We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy.
- CM.update_canmove()
- CM.spin(32,2)
- CM.visible_message("[CM] rolls on the floor, trying to put themselves out!", \
- "You stop, drop, and roll!")
- sleep(30)
- if(fire_stacks <= 0)
- CM.visible_message("[CM] has successfully extinguished themselves!", \
- "You extinguish yourself.")
- ExtinguishMob()
- return
-
-/* resist_handcuffs allows a mob to break/remove their handcuffs after a delay
-*/////
-/mob/living/proc/resist_handcuffs(var/mob/living/carbon/CM)
- CM.changeNext_move(CLICK_CD_BREAKOUT)
- CM.last_special = world.time + CLICK_CD_BREAKOUT
- var/obj/item/weapon/restraints/handcuffs/HC = CM.handcuffed
-
- var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/restraints/handcuffs type
- var/displaytime = 2 //Minutes to display in the "this will take X minutes."
-
- var/hulklien = 0 //variable used to define if someone is a hulk or alien
-
- if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future...
- breakouttime = HC.breakouttime
- displaytime = breakouttime / 600 //Minutes
-
- if(isalienadult(CM) || (HULK in usr.mutations))
- hulklien = 1
- breakouttime = 50
- displaytime = 5
-
- CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)"
- for(var/mob/O in viewers(CM))
- O.show_message( "\red [usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!", 1)
- spawn(0)
- if(do_after(CM, breakouttime))
- if(!CM.handcuffed || CM.buckled)
- return // time leniency for lag which also might make this whole thing pointless but the server
-
- for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink
- O.show_message("\red [CM] manages to [hulklien ? "break" : "remove"] the handcuffs!", 1)
-
- CM << "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.handcuffed]."
-
- if(hulklien)
- CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- del(CM.handcuffed)
- CM.handcuffed = null
- CM.update_inv_handcuffed()
- return
-
- CM.unEquip(CM.handcuffed)
-
-/* resist_legcuffs allows a mob to break/remove their legcuffs after a delay
-*/////
-/mob/living/proc/resist_legcuffs(var/mob/living/carbon/CM)
- var/obj/item/weapon/restraints/legcuffs/HC = CM.legcuffed
-
- var/breakouttime = 1200 //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type
- var/displaytime = 2 //Minutes to display in the "this will take X minutes."
-
- var/hulklien = 0 //variable used to define if someone is a hulk or alien
-
- if(istype(HC)) //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future...
- breakouttime = HC.breakouttime
- displaytime = breakouttime / 600 //Minutes
-
- if(isalienadult(CM) || (HULK in usr.mutations))
- hulklien = 1
- breakouttime = 50
- displaytime = 5
-
- CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] [hulklien ? "seconds" : "minute[displaytime==1 ? "" : "s"]"] and you need to stand still)"
-
- for(var/mob/O in viewers(CM))
- O.show_message( "\red [usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!", 1)
-
- spawn(0)
- if(do_after(CM, breakouttime))
- if(!CM.legcuffed || CM.buckled)
- return // time leniency for lag which also might make this whole thing pointless but the server
- for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink
- O.show_message("\red [CM] manages to [hulklien ? "break" : "remove"] the legcuffs!", 1)
-
- CM << "\blue You successfully [hulklien ? "break" : "remove"] \the [CM.legcuffed]."
-
- if(!hulklien)
- CM.unEquip(CM.legcuffed)
-
- if(hulklien)
- CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- qdel(CM.legcuffed)
-
- CM.legcuffed = null
- CM.update_inv_legcuffed()
-
-/*//////////////////////
- END RESIST PROCS
-*///////////////////////
-
-
-
-
+ var/obj/item/weapon/restraints/legcuffs/HC = CM.legcuffed
+ var/breakouttime = 1200 //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type
+ var/displaytime = 2 //Minutes to display in the "this will take X minutes."
+ if(istype(HC)) //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future...
+ breakouttime = HC.breakouttime
+ displaytime = breakouttime / 600 //Minutes
+ CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)"
+ for(var/mob/O in viewers(CM))
+ O.show_message( "\red [usr] attempts to remove \the [HC]!", 1)
+ spawn(0)
+ if(do_after(CM, breakouttime))
+ if(!CM.legcuffed || CM.buckled)
+ return // time leniency for lag which also might make this whole thing pointless but the server
+ for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink
+ O.show_message("\red [CM] manages to remove the legcuffs!", 1)
+ CM << "\blue You successfully remove \the [CM.legcuffed]."
+ CM.unEquip(CM.legcuffed)
+ CM.legcuffed = null
+ CM.update_inv_legcuffed()
/mob/living/carbon/proc/spin(spintime, speed)
spawn()
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index f487188ac80..b349e3b15f7 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -7,11 +7,6 @@
//If they're SSD, remove it so they can wake back up.
player_logged = 0
- //login during ventcrawl
- if(istype(loc, /obj/machinery/atmospherics)) //attach us back into the pipes
- remove_ventcrawl()
- add_ventcrawl(loc)
-
//Round specific stuff like hud updates
if(ticker && ticker.mode)
var/ref = "\ref[mind]"
@@ -32,7 +27,4 @@
if("vampire")
if((ref in ticker.mode.thralls) || (mind in ticker.mode.enthralled))
ticker.mode.update_vampire_icons_added(mind)
- if("shadowling")
- if((mind in ticker.mode.shadowling_thralls) || (mind in ticker.mode.shadows))
- ticker.mode.update_shadow_icons_added(src.mind)
return .
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 15a08aaea8d..9ffbc114f4d 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -6,6 +6,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/ai_alerts,
/mob/living/silicon/ai/proc/announcement,
/mob/living/silicon/ai/proc/ai_call_shuttle,
+ /mob/living/silicon/ai/proc/ai_cancel_call,
/mob/living/silicon/ai/proc/ai_camera_track,
/mob/living/silicon/ai/proc/ai_camera_list,
/mob/living/silicon/ai/proc/ai_goto_location,
diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm
index c8c7e41d94e..45b0268437d 100644
--- a/code/modules/mob/living/silicon/death.dm
+++ b/code/modules/mob/living/silicon/death.dm
@@ -1,7 +1,7 @@
/mob/living/silicon/gib()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -22,7 +22,7 @@
/mob/living/silicon/dust()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
diff --git a/code/modules/mob/living/silicon/mommi/life.dm b/code/modules/mob/living/silicon/mommi/life.dm
index 04ab3871af6..eb7aa1dd700 100644
--- a/code/modules/mob/living/silicon/mommi/life.dm
+++ b/code/modules/mob/living/silicon/mommi/life.dm
@@ -2,7 +2,7 @@
set invisibility = 0
set background = 1
- if (src.notransform)
+ if (src.monkeyizing)
return
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index c73bf68f1ab..fef353eec6d 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -1,7 +1,7 @@
/mob/living/silicon/robot/gib()
//robots don't die when gibbed. instead they drop their MMI'd brain
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -23,7 +23,7 @@
/mob/living/silicon/robot/dust()
death(1)
var/atom/movable/overlay/animation = null
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 571beea1048..199720a1e0e 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -18,8 +18,6 @@
/obj/item/mounted/frame/apc_frame,
/obj/item/mounted/frame/alarm_frame,
/obj/item/mounted/frame/firealarm,
- /obj/item/mounted/frame/newscaster_frame,
- /obj/item/mounted/frame/intercom,
/obj/item/weapon/table_parts,
/obj/item/weapon/rack_parts,
/obj/item/weapon/camera_assembly,
@@ -88,10 +86,7 @@
wrapped.loc = user
//Pass the attack on to the target. This might delete/relocate wrapped.
- if(!target.attackby(wrapped, user, params) && target && wrapped)
- // If the attackby didn't resolve or delete the target or wrapped, afterattack
- // (Certain things, such as mountable frames, rely on afterattack)
- wrapped.afterattack(target, user, 1, params)
+ target.attackby(wrapped,user, params)
//If wrapped did neither get deleted nor put into target, put it back into the gripper.
if(wrapped && user && (wrapped.loc == user))
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 0b481630513..d22976509b1 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -193,17 +193,16 @@
var/slot_num
if(slot_start == 0)
- slot_num = 0
- slot_start = 3
+ slot_num = 1
+ slot_start = 2
else
- slot_num = slot_start
+ slot_num = slot_start + 1
- do
- slot_num++
- if(slot_num > 3) slot_num = 1 //Wrap around.
+ while(slot_start != slot_num) //If we wrap around without finding any free slots, just give up.
if(module_active(slot_num))
select_module(slot_num)
return
- while(slot_start != slot_num) //If we wrap around without finding any free slots, just give up.
+ slot_num++
+ if(slot_num > 3) slot_num = 1 //Wrap around.
return
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 7f713c8a2c3..976708e4e1d 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -2,7 +2,7 @@
set invisibility = 0
//set background = 1
- if (src.notransform)
+ if (src.monkeyizing)
return
src.blinded = null
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index bcef5aee0b7..7d9c71f337d 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -10,7 +10,7 @@ var/list/robot_verbs_default = list(
icon_state = "robot"
maxHealth = 100
health = 100
- universal_understand = 1
+ universal_speak = 1
var/sight_mode = 0
var/custom_name = ""
@@ -819,9 +819,9 @@ var/list/robot_verbs_default = list(
return ..()
/mob/living/silicon/robot/emag_act(user as mob)
- if(!ishuman(user) && !issilicon(user))
+ if(!ishuman(user))
return
- var/mob/living/M = user
+ var/mob/living/carbon/human/H = user
if(!opened)//Cover is closed
if(locked)
if(prob(90))
@@ -844,8 +844,8 @@ var/list/robot_verbs_default = list(
sleep(6)
if(prob(50))
emagged = 1
- if(src.hud_used)
- src.hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open.
+ if(H.hud_used)
+ H.hud_used.update_robot_modules_display() //Shows/hides the emag item if the inventory screen is already open.
lawupdate = 0
connected_ai = null
user << "You emag [src]'s interface."
@@ -855,8 +855,8 @@ var/list/robot_verbs_default = list(
clear_inherent_laws()
laws = new /datum/ai_laws/syndicate_override
var/time = time2text(world.realtime,"hh:mm:ss")
- lawchanges.Add("[time] : [M.name]([M.key]) emagged [name]([key])")
- set_zeroth_law("Only [M.real_name] and people he designates as being such are Syndicate Agents.")
+ lawchanges.Add("[time] : [H.name]([H.key]) emagged [name]([key])")
+ set_zeroth_law("Only [H.real_name] and people he designates as being such are Syndicate Agents.")
src << "\red ALERT: Foreign software detected."
sleep(5)
src << "\red Initiating diagnostics..."
@@ -872,7 +872,7 @@ var/list/robot_verbs_default = list(
src << "\red ERRORERRORERROR"
src << "Obey these laws:"
laws.show_laws(src)
- src << "\red \b ALERT: [M.real_name] is your new master. Obey your new laws and his commands."
+ src << "\red \b ALERT: [H.real_name] is your new master. Obey your new laws and his commands."
if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner))
for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules)
del(D)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index d615122c356..4f256f2a003 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -142,7 +142,7 @@
/obj/item/stack/sheet/metal = 50,
/obj/item/stack/sheet/glass = 50,
/obj/item/stack/sheet/rglass = 50,
- /obj/item/stack/cable_coil/cyborg = 50,
+ /obj/item/stack/cable_coil = 50,
/obj/item/stack/rods = 15,
/obj/item/stack/tile/plasteel = 15
)
@@ -179,7 +179,7 @@
G.amount = 50
src.modules += G
- var/obj/item/stack/cable_coil/cyborg/W = new /obj/item/stack/cable_coil/cyborg(src)
+ var/obj/item/stack/cable_coil/W = new /obj/item/stack/cable_coil(src)
W.amount = 50
src.modules += W
@@ -389,7 +389,7 @@
/obj/item/stack/tile/plasteel = 15,
/obj/item/stack/sheet/metal = 20,
/obj/item/stack/sheet/glass = 20,
- /obj/item/stack/cable_coil/cyborg = 30
+ /obj/item/stack/cable_coil = 30
)
New()
diff --git a/code/modules/mob/living/simple_animal/ascendant_shadowling.dm b/code/modules/mob/living/simple_animal/ascendant_shadowling.dm
deleted file mode 100644
index 9445db7592c..00000000000
--- a/code/modules/mob/living/simple_animal/ascendant_shadowling.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-/mob/living/simple_animal/ascendant_shadowling
- name = "Ascendant Shadowling"
- desc = "A large, floating eldritch horror. It has pulsing markings all about its body and large horns. It seems to be floating without any form of support."
- icon = 'icons/mob/mob.dmi'
- icon_state = "shadowling_ascended"
- icon_living = "shadowling_ascended"
- speak_emote = list("telepathically thunders", "telepathically booms")
- force_threshold = INFINITY //Can't die by normal means
- health = 100000
- maxHealth = 100000
- speed = 0
- var/phasing = 0
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_MINIMUM
-
- response_help = "stares at"
- response_disarm = "flails at"
- response_harm = "flails at"
-
- harm_intent_damage = 0
- melee_damage_lower = 35
- melee_damage_upper = 35
- attacktext = "claws at"
- attack_sound = 'sound/weapons/slash.ogg'
-
- minbodytemp = 0
- maxbodytemp = INFINITY
- environment_smash = 2
-
- faction = list("faithless")
-
-/mob/living/simple_animal/ascendant_shadowling/Process_Spacemove(var/movement_dir = 0)
- return 1 //copypasta from carp code
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index ac726058103..3af5be404dc 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1023,7 +1023,7 @@ var/list/slot_equipment_priority = list( \
if(world.time < client.move_delay) return 0
if(stat==2) return 0
if(anchored) return 0
- if(notransform) return 0
+ if(monkeyizing) return 0
if(restrained()) return 0
return 1
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index f43759f4279..f26d26d2470 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -57,7 +57,7 @@
var/disabilities = 0 //Carbon
var/atom/movable/pulling = null
var/next_move = null
- var/notransform = null //Carbon
+ var/monkeyizing = null //Carbon
var/other = 0.0
var/hand = null
var/eye_blind = null //Carbon
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 1a7360185ef..b04c0832350 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -1,13 +1,6 @@
#define UPGRADE_COOLDOWN 40
#define UPGRADE_KILL_TIMER 100
-//times it takes for a mob to eat
-#define EAT_TIME_XENO 30
-#define EAT_TIME_FAT 100
-
-//time it takes for a mob to be eaten (in deciseconds) (overrides mob eat time)
-#define EAT_TIME_MOUSE 30
-
/obj/item/weapon/grab
name = "grab"
flags = NOBLUDGEON | ABSTRACT
@@ -194,47 +187,22 @@
if(!affecting)
return
- if(M == affecting) //what the actual fuck is this
+ if(M == affecting)
s_click(hud)
return
-
- if(M == assailant && state >= GRAB_AGGRESSIVE) //no eatin unless you have an agressive grab
- if(checkvalid(user, affecting)) //wut
+ if(M == assailant && state >= GRAB_AGGRESSIVE)
+ if( (ishuman(user) && (FAT in user.mutations) && iscarbon(affecting) ) || ( isalien(user) && iscarbon(affecting) ) || ( istype(user,/mob/living/carbon/human/kidan) && istype(affecting,/mob/living/carbon/monkey/diona) ) || ( ishuman(user) && user.get_species() == "Tajaran" && istype(affecting,/mob/living/simple_animal/mouse) ) )
var/mob/living/carbon/attacker = user
user.visible_message("[user] is attempting to devour \the [affecting]!")
-
- if(!do_mob(user, affecting) || !do_after(user, checktime(user, affecting))) return
-
+ if(istype(user, /mob/living/carbon/alien/humanoid/hunter) || istype(affecting, /mob/living/simple_animal/mouse)) //mice are easy to eat
+ if(!do_mob(user, affecting)||!do_after(user, 30)) return
+ else
+ if(!do_mob(user, affecting)||!do_after(user, 100)) return
user.visible_message("[user] devours \the [affecting]!")
-
- affecting.loc = user //add the mob to the user
- attacker.stomach_contents.Add(affecting) //list keeping
-
+ affecting.loc = user
+ attacker.stomach_contents.Add(affecting)
del(src)
-/obj/item/weapon/grab/proc/checkvalid(var/mob/attacker, var/mob/prey) //does all the checking for the attack proc to see if a mob can eat another with the grab
- if(ishuman(attacker) && (FAT in attacker.mutations) && iscarbon(prey) && !isalien(prey)) //Fat people eating carbon mobs but not xenos
- return 1
-
- if(isalien(attacker) && iscarbon(prey)) //Xenomorphs eating carbon mobs
- return 1
-
- if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/carbon/monkey/diona)) //Kidan eating nymphs
- return 1
-
- if(ishuman(attacker) && attacker.get_species() == "Tajaran" && istype(prey,/mob/living/simple_animal/mouse)) //Tajaran eating mice. Meow!
- return 1
-
- return 0
-
-/obj/item/weapon/grab/proc/checktime(var/mob/attacker, var/mob/prey) //Returns the time the attacker has to wait before they eat the prey
- if(isalien(attacker))
- return EAT_TIME_XENO //xenos get a speed boost
-
- if(istype(prey,/mob/living/simple_animal/mouse)) //mice get eaten at xeno-eating-speed regardless
- return EAT_TIME_MOUSE
-
- return EAT_TIME_FAT //if it doesn't fit into the above, it's probably a fat guy, take EAT_TIME_FAT to do it
/obj/item/weapon/grab/dropped()
del(src)
@@ -243,8 +211,3 @@
/obj/item/weapon/grab/Destroy()
del(hud)
..()
-
-#undef EAT_TIME_XENO
-#undef EAT_TIME_FAT
-
-#undef EAT_TIME_MOUSE
\ No newline at end of file
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index a50d948dc3b..784ae01d668 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -190,7 +190,7 @@
if(isAI(mob))
return AIMove(n,direct,mob)
- if(mob.notransform) return//This is sota the goto stop mobs from moving var
+ if(mob.monkeyizing) return//This is sota the goto stop mobs from moving var
if(isliving(mob))
var/mob/living/L = mob
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 4c708c8e92e..aaee5a723f6 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -5,14 +5,14 @@
/*
/mob/living/carbon/human/proc/monkeyize()
- if (notransform)
+ if (monkeyizing)
return
for(var/obj/item/W in src)
if (W==w_uniform) // will be torn
continue
unEquip(W)
regenerate_icons()
- notransform = 1
+ monkeyizing = 1
canmove = 0
stunned = 1
icon = null
@@ -62,7 +62,7 @@
return ..()
/mob/living/carbon/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb
- if (notransform)
+ if (monkeyizing)
return
for(var/t in organs)
del(t)
@@ -70,11 +70,11 @@
return ..(move)
/mob/living/carbon/AIize()
- if (notransform)
+ if (monkeyizing)
return
for(var/obj/item/W in src)
unEquip(W)
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -178,12 +178,12 @@
//human -> robot
/mob/living/carbon/human/proc/Robotize()
- if (notransform)
+ if (monkeyizing)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -236,12 +236,12 @@
//human -> alien
/mob/living/carbon/human/proc/Alienize()
- if (notransform)
+ if (monkeyizing)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -267,12 +267,12 @@
return
/mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num)
- if (notransform)
+ if (monkeyizing)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -302,12 +302,12 @@
return
/mob/living/carbon/human/proc/corgize()
- if (notransform)
+ if (monkeyizing)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
@@ -332,13 +332,13 @@
usr << "\red Sorry but this mob type is currently unavailable."
return
- if(notransform)
+ if(monkeyizing)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
- notransform = 1
+ monkeyizing = 1
canmove = 0
icon = null
invisibility = 101
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index ea1a8289472..997cf8b9e08 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -210,11 +210,11 @@
if(owner && loc == owner)
if(!cannot_amputate && config.limbs_can_break && (brute_dam + burn_dam) >= (max_damage * config.organ_health_multiplier))
var/dropped
- if(burn >= 20 && prob(burn / 2))
+ if(burn >= 20 && prob(burn))
if(body_part == HEAD) return
dropped = 1
droplimb(0,DROPLIMB_BURN)
- if(!dropped && prob(brute / 2))
+ if(!dropped && prob(brute))
if(edge)
droplimb(0,DROPLIMB_EDGE)
else
@@ -664,7 +664,6 @@ Note that amputating the affected organ does in fact remove the infection from t
return
if(DROPLIMB_BURN)
new /obj/effect/decal/cleanable/ash(get_turf(victim))
- qdel(src)
if(DROPLIMB_BLUNT)
var/obj/effect/decal/cleanable/blood/gibs/gore = new victim.species.single_gib_type(get_turf(victim))
if(victim.species.flesh_color)
@@ -678,8 +677,8 @@ Note that amputating the affected organ does in fact remove the infection from t
I.removed()
if(istype(loc,/turf))
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
- qdel(src)
+ del(src)
/****************************************************
HELPERS
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index b66644e9179..93d50a56611 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -635,11 +635,3 @@ obj/structure/cable/proc/cableColor(var/colorC)
else
return ..()
-
-/obj/item/stack/cable_coil/cyborg
- name = "cyborg cable coil"
-
-/obj/item/stack/cable_coil/cyborg/attack_self(mob/user)
- var/cable_color = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white")
- _color = cable_color
- update_icon()
\ No newline at end of file
diff --git a/code/modules/procedural mapping/mapGenerator.dm b/code/modules/procedural mapping/mapGenerator.dm
index 887ddfc40a4..9a304e5c57a 100644
--- a/code/modules/procedural mapping/mapGenerator.dm
+++ b/code/modules/procedural mapping/mapGenerator.dm
@@ -1,27 +1,10 @@
-//clusterCheckFlags defines
-//All based on clusterMin and clusterMax as guides
-
-//Individual defines
-#define CLUSTER_CHECK_NONE 0 //No checks are done, cluster as much as possible
-#define CLUSTER_CHECK_DIFFERENT_TURFS 2 //Don't let turfs of DIFFERENT types cluster
-#define CLUSTER_CHECK_DIFFERENT_ATOMS 4 //Don't let atoms of DIFFERENT types cluster
-#define CLUSTER_CHECK_SAME_TURFS 8 //Don't let turfs of the SAME type cluster
-#define CLUSTER_CHECK_SAME_ATOMS 16 //Don't let atoms of the SAME type cluster
-
-//Combined defines
-#define CLUSTER_CHECK_SAMES 24 //Don't let any of the same type cluster
-#define CLUSTER_CHECK_DIFFERENTS 6 //Don't let any of different types cluster
-#define CLUSTER_CHECK_ALL_TURFS 10 //Don't let ANY turfs cluster same and different types
-#define CLUSTER_CHECK_ALL_ATOMS 20 //Don't let ANY atoms cluster same and different types
-
-//All
-#define CLUSTER_CHECK_ALL 30 //Don't let anything cluster, like, at all
-
/datum/mapGenerator
//Map information
var/list/map = list()
+ var/turf/bottomLeft = null
+ var/turf/topRight = null
//mapGeneratorModule information
var/list/modules = list()
@@ -30,62 +13,21 @@
..()
initialiseModules()
-//Defines the region the map represents, sets map
+//Defines the region the map represents, sets map, bottomLeft, topRight
//Returns the map
-/datum/mapGenerator/proc/defineRegion(var/turf/Start, var/turf/End, var/replace = 0)
+/datum/mapGenerator/proc/defineRegion(var/turf/Start, var/turf/End)
if(!checkRegion(Start, End))
return 0
- if(replace)
- undefineRegion()
-
- map |= block(Start,End)
- return map
-
-
-//Defines the region the map represents, as a CIRCLE!, sets map
-//Returns the map
-/datum/mapGenerator/proc/defineCircularRegion(var/turf/Start, var/turf/End, var/replace = 0)
- if(!checkRegion(Start, End))
+ if(!Start || !End)
return 0
+ bottomLeft = Start
+ topRight = End
- var/centerX = abs(max(End.x-Start.x,1))
- var/centerY = abs(max(End.y-Start.y,1))
-
-
- var/lilZ = min(Start.z,End.z)
- var/bigZ = max(Start.z,End.z)
-
- var/centerZ = max(abs(bigZ-(lilZ/2)),1) //Spherical maps! woo!
-
- var/radius = abs(max(centerX,centerY)) //take the biggest displacement as the radius
-
- if(replace)
- undefineRegion()
-
- //Sphere mode engage
- var/evenCheckZ = 0
- if(max(bigZ,lilZ) % 2 == 0)
- evenCheckZ = centerZ+1
-
- for(var/i = lilZ, i <= bigZ, i++)
- var/theRadius = radius
- if(i != centerZ)
- if(i != evenCheckZ)
- theRadius = max(radius/max((2*abs(centerZ-i)),1),1)
-
-
- map |= circlerange(locate(centerX,centerY,i),theRadius)
-
-
+ map = block(bottomLeft,topRight)
return map
-//Empties the map list, he's dead jim.
-/datum/mapGenerator/proc/undefineRegion()
- map = list() //bai bai
-
-
//Checks for and Rejects bad region coordinates
//Returns 1/0
/datum/mapGenerator/proc/checkRegion(var/turf/Start, var/turf/End)
@@ -110,8 +52,7 @@
if(!modules || !modules.len)
return
for(var/datum/mapGeneratorModule/mod in modules)
- spawn(0)
- mod.generate()
+ mod.generate()
//Requests the mapGeneratorModule(s) to (re)generate this one turf
@@ -122,8 +63,7 @@
if(!modules || !modules.len)
return
for(var/datum/mapGeneratorModule/mod in modules)
- spawn(0)
- mod.place(T)
+ mod.place(T)
//Replaces all paths in the module list with actual module datums
@@ -174,27 +114,6 @@
src << "End Coords: [endCoords[1]] - [endCoords[2]] - [endCoords[3]]"
return
- var/list/clusters = list("None"=CLUSTER_CHECK_NONE,"All"=CLUSTER_CHECK_ALL,"Sames"=CLUSTER_CHECK_SAMES,"Differents"=CLUSTER_CHECK_DIFFERENTS, \
- "Same turfs"=CLUSTER_CHECK_SAME_TURFS, "Same atoms"=CLUSTER_CHECK_SAME_ATOMS, "Different turfs"=CLUSTER_CHECK_DIFFERENT_TURFS, \
- "Different atoms"=CLUSTER_CHECK_DIFFERENT_ATOMS, "All turfs"=CLUSTER_CHECK_ALL_TURFS,"All atoms"=CLUSTER_CHECK_ALL_ATOMS)
-
- var/moduleClusters = input("Cluster Flags (Cancel to leave unchanged from defaults)","Map Gen Settings") as null|anything in clusters
- //null for default
-
- var/theCluster = 0
- if(moduleClusters != "None")
- if(!clusters[moduleClusters])
- src << "Invalid Cluster Flags"
- return
- theCluster = clusters[moduleClusters]
- else
- theCluster = CLUSTER_CHECK_NONE
-
- if(theCluster)
- for(var/datum/mapGeneratorModule/M in N.modules)
- M.clusterCheckFlags = theCluster
-
-
src << "Defining Region"
N.defineRegion(Start, End)
src << "Region Defined"
diff --git a/code/modules/procedural mapping/mapGeneratorModule.dm b/code/modules/procedural mapping/mapGeneratorModule.dm
index da08a540ef3..458f11cd969 100644
--- a/code/modules/procedural mapping/mapGeneratorModule.dm
+++ b/code/modules/procedural mapping/mapGeneratorModule.dm
@@ -1,12 +1,16 @@
+#define CLUSTER_CHECK_NONE 0 //No checks are done, cluster as much as possible
+#define CLUSTER_CHECK_ATOMS 2 //Don't let atoms cluster, based on clusterMin and clusterMax as guides
+#define CLUSTER_CHECK_TURFS 4 //Don't let turfs cluster, based on clusterMin and clusterMax as guides
+#define CLUSTER_CHECK_ALL 6 //Don't let anything cluster, based on clusterMind and clusterMax as guides
+
/datum/mapGeneratorModule
var/datum/mapGenerator/mother = null
var/list/spawnableAtoms = list()
var/list/spawnableTurfs = list()
var/clusterMax = 5
var/clusterMin = 1
- var/clusterCheckFlags = CLUSTER_CHECK_SAME_ATOMS
- var/allowAtomsOnSpace = FALSE
+ var/clusterCheckFlags = CLUSTER_CHECK_ALL
//Syncs the module up with it's mother
@@ -31,74 +35,27 @@
return 0
var/clustering = 0
- var/skipLoopIteration = FALSE
//Turfs don't care whether atoms can be placed here
for(var/turfPath in spawnableTurfs)
-
- //Clustering!
- if(clusterMax && clusterMin)
-
- //You're the same as me? I hate you I'm going home
- if(clusterCheckFlags & CLUSTER_CHECK_SAME_TURFS)
+ if(clusterCheckFlags & CLUSTER_CHECK_TURFS)
+ if(clusterMax && clusterMin)
clustering = rand(clusterMin,clusterMax)
- for(var/turf/F in trange(clustering,T))
- if(istype(F,turfPath))
- skipLoopIteration = TRUE
- break
- if(skipLoopIteration)
- skipLoopIteration = FALSE
+ if(locate(/atom/movable) in range(clustering, T))
continue
-
- //You're DIFFERENT to me? I hate you I'm going home
- if(clusterCheckFlags & CLUSTER_CHECK_DIFFERENT_TURFS)
- clustering = rand(clusterMin,clusterMax)
- for(var/turf/F in trange(clustering,T))
- if(!(istype(F,turfPath)))
- skipLoopIteration = TRUE
- break
- if(skipLoopIteration)
- skipLoopIteration = FALSE
- continue
-
- //Success!
if(prob(spawnableTurfs[turfPath]))
T.ChangeTurf(turfPath)
-
//Atoms DO care whether atoms can be placed here
if(checkPlaceAtom(T))
-
for(var/atomPath in spawnableAtoms)
-
- //Clustering!
- if(clusterMax && clusterMin)
-
- //You're the same as me? I hate you I'm going home
- if(clusterCheckFlags & CLUSTER_CHECK_SAME_ATOMS)
- clustering = rand(clusterMin, clusterMax)
- for(var/atom/movable/M in range(clustering,T))
- if(istype(M,atomPath))
- skipLoopIteration = TRUE
- break
- if(skipLoopIteration)
- skipLoopIteration = FALSE
+ if(clusterCheckFlags & CLUSTER_CHECK_ATOMS)
+ if(clusterMax && clusterMin)
+ clustering = rand(clusterMin,clusterMax)
+ if(locate(/atom/movable) in range(clustering, T))
continue
-
- //You're DIFFERENT from me? I hate you I'm going home
- if(clusterCheckFlags & CLUSTER_CHECK_DIFFERENT_ATOMS)
- clustering = rand(clusterMin, clusterMax)
- for(var/atom/movable/M in range(clustering,T))
- if(!(istype(M,atomPath)))
- skipLoopIteration = TRUE
- break
- if(skipLoopIteration)
- skipLoopIteration = FALSE
- continue
-
- //Success!
if(prob(spawnableAtoms[atomPath]))
- new atomPath(T)
+ new atomPath (T)
. = 1
@@ -114,8 +71,6 @@
if(A.density)
. = 0
break
- if(!allowAtomsOnSpace && (istype(T,/turf/space)))
- . = 0
///////////////////////////////////////////////////////////
diff --git a/code/modules/procedural mapping/mapGeneratorModules/nature.dm b/code/modules/procedural mapping/mapGeneratorModules/nature.dm
index 09ca84574b1..742141f6fdf 100644
--- a/code/modules/procedural mapping/mapGeneratorModules/nature.dm
+++ b/code/modules/procedural mapping/mapGeneratorModules/nature.dm
@@ -34,4 +34,4 @@
//Grass tufts with a high spawn chance
/datum/mapGeneratorModule/denseLayer/grassTufts
spawnableTurfs = list()
- spawnableAtoms = list(/obj/structure/flora/ausbushes/grassybush = 75)
+ spawnableAtoms = list(/obj/structure/flora/ausbushes/grassybush = 75)
\ No newline at end of file
diff --git a/code/modules/procedural mapping/mapGeneratorReadme.dm b/code/modules/procedural mapping/mapGeneratorReadme.dm
index ae656b5b30b..95fa449624e 100644
--- a/code/modules/procedural mapping/mapGeneratorReadme.dm
+++ b/code/modules/procedural mapping/mapGeneratorReadme.dm
@@ -11,22 +11,14 @@ mapGenerator:
Desc: a mapGenerator is a master datum that collects
and syncs all mapGeneratorModules in it's modules list
- defineRegion(var/turf/Start, var/turf/End, var/replace = 0)
- Example: defineRegion(locate(1,1,1),locate(5,5,5),0)
+ defineRegion(var/list/startList, var/list/endList)
+ Example: defineRegion(locate(1,1,1),locate(5,5,5))
Desc: Sets the bounds of the mapGenerator's "map"
- defineCircularRegion(var/turf/Start, var/turf/End, var/replace = 0)
- Example: defineCircularRegion(locate(1,1,1),locate(5,5,5),0)
- Desc: Sets the mapGenerator's "map" as a circle, with center in the middle of Start and End's X,Y,Z coordinates
-
- undefineRegion()
- Example: undefineRegion()
- Desc: Empties the map generator list
-
checkRegion(var/turf/Start, var/turf/End)
Example: checkRegion(locate(1,1,1), locate(5,5,5))
Desc: Checks if a rectangle between Start's coords and End's coords is valid
- Existing Calls: mapGenerator/defineRegion(), mapGenerator/defineCircularRegion()
+ Existing Calls: mapGenerator/defineRegion()
generate()
Example: generate()
@@ -116,6 +108,8 @@ Variable Breakdown (For Mappers):
mapGenerator
map - INTERNAL, do not touch
+ bottomLeft - INTERNAL, do not touch
+ topRight - INTERNAL, do not touch
modules - A list of typepaths of mapGeneratorModules
mapGeneratorModule
@@ -124,23 +118,13 @@ Variable Breakdown (For Mappers):
spawnableTurfs - A list of typepaths and their probability to spawn, eg: spawnableTurfs = list(/turf/unsimulated/floor/grass = 100)
clusterMax - The max range to check for something being "too close" for this atom/turf to spawn, the true value is random between clusterMin and clusterMax
clusterMin - The min range to check for something being "too close" for this atom/turf to spawn, the true value is random between clusterMin and clusterMax
- clusterCheckFlags - A Bitfield that controls how the cluster checks work, All based on clusterMin and clusterMax guides
- allowAtomsOnSpace - A Boolean for if we allow atoms to spawn on space tiles
+ clusterCheckFlags - A Bitfield that controls how the cluster checks work.
clusterCheckFlags flags:
- CLUSTER_CHECK_NONE 0 //No checks are done, cluster as much as possible
- CLUSTER_CHECK_DIFFERENT_TURFS 2 //Don't let turfs of DIFFERENT types cluster
- CLUSTER_CHECK_DIFFERENT_ATOMS 4 //Don't let atoms of DIFFERENT types cluster
- CLUSTER_CHECK_SAME_TURFS 8 //Don't let turfs of the SAME type cluster
- CLUSTER_CHECK_SAME_ATOMS 16 //Don't let atoms of the SAME type cluster
-
- CLUSTER_CHECK_SAMES 24 //Don't let any of the same type cluster
- CLUSTER_CHECK_DIFFERENTS 6 //Don't let any different types cluster
- CLUSTER_CHECK_ALL_TURFS 10 //Don't let ANY turfs cluster same and different types
- CLUSTER_CHECK_ALL_ATOMS 20 //Don't let ANY atoms cluster same and different types
-
- CLUSTER_CHECK_ALL 30 //Don't let anything cluster, like, at all
-
+ CLUSTER_CHECK_NONE 0 //No checks are done, cluster as much as possible
+ CLUSTER_CHECK_ATOMS 2 //Don't let atoms cluster, based on clusterMin and clusterMax as guides
+ CLUSTER_CHECK_TURFS 4 //Don't let turfs cluster, based on clusterMin and clusterMax as guides
+ CLUSTER_CHECK_ALL 6 //Don't let anything cluster, based on clusterMind and clusterMax as guides
*/
\ No newline at end of file
diff --git a/code/modules/procedural mapping/mapGenerators/nature.dm b/code/modules/procedural mapping/mapGenerators/nature.dm
index 7254e576ba4..0300de38211 100644
--- a/code/modules/procedural mapping/mapGenerators/nature.dm
+++ b/code/modules/procedural mapping/mapGenerators/nature.dm
@@ -2,9 +2,9 @@
//Exists primarily as a test type.
/datum/mapGenerator/nature
- modules = list(/datum/mapGeneratorModule/bottomLayer/grassTurfs, \
- /datum/mapGeneratorModule/pineTrees, \
+ modules = list(/datum/mapGeneratorModule/pineTrees, \
/datum/mapGeneratorModule/deadTrees, \
/datum/mapGeneratorModule/randBushes, \
/datum/mapGeneratorModule/randRocks, \
+ /datum/mapGeneratorModule/bottomLayer/grassTurfs, \
/datum/mapGeneratorModule/denseLayer/grassTufts)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index a9ef5784dcc..430418dfaa8 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -108,8 +108,6 @@
if(H.species.name == "Golem")
user << "\red Your metal fingers don't fit in the trigger guard!"
return
- if(user.dna && user.dna.species == "Shadowling")
- user << "The muzzle flash would cause damage to your form!"
add_fingerprint(user)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 8424fb54b69..ccd0aae93d5 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -45,7 +45,6 @@
var/weaken = 0
var/paralyze = 0
var/irradiate = 0
- var/slur = 0
var/stutter = 0
var/eyeblur = 0
var/drowsy = 0
@@ -80,7 +79,7 @@
if(!isliving(target)) return 0
if(isanimal(target)) return 0
var/mob/living/L = target
- return L.apply_effects(stun, weaken, paralyze, irradiate, slur, stutter, eyeblur, drowsy, agony, blocked, stamina, jitter)
+ return L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked, stamina, jitter)
proc/check_fire(var/mob/living/target as mob, var/mob/living/user as mob) //Checks if you can hit them or not.
if(!istype(target) || !istype(user))
diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm
index 23f44bf19da..a0b96353d4e 100644
--- a/code/modules/projectiles/projectile/change.dm
+++ b/code/modules/projectiles/projectile/change.dm
@@ -12,8 +12,8 @@
/obj/item/projectile/change/proc/wabbajack (mob/M as mob in living_mob_list)
if(istype(M, /mob/living) && M.stat != DEAD)
- if(M.notransform) return
- M.notransform = 1
+ if(M.monkeyizing) return
+ M.monkeyizing = 1
M.canmove = 0
M.icon = null
M.overlays.Cut()
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index e6fc21e672f..127557cd3b5 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -127,8 +127,8 @@
proc/wabbajack(mob/living/M)
if(istype(M))
if(istype(M, /mob/living) && M.stat != DEAD)
- if(M.notransform) return
- M.notransform = 1
+ if(M.monkeyizing) return
+ M.monkeyizing = 1
M.canmove = 0
M.icon = null
M.overlays.Cut()
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index e0064fec12e..5c05909becd 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -63,7 +63,7 @@ datum
if(current_list_element > reagent_list.len) current_list_element = 1
var/datum/reagent/current_reagent = reagent_list[current_list_element]
- src.remove_reagent(current_reagent.id, min(1, amount - total_transfered))
+ src.remove_reagent(current_reagent.id, 1)
current_list_element++
total_transfered++
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 8766271a170..6201723c6ec 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -393,8 +393,8 @@ datum
if(!M) M = holder.my_atom
if(istype(M, /mob/living/carbon) && M.stat != DEAD)
M << "\red Your flesh rapidly mutates!"
- if(M.notransform) return
- M.notransform = 1
+ if(M.monkeyizing) return
+ M.monkeyizing = 1
M.canmove = 0
M.icon = null
M.overlays.Cut()
diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm
index 04e0be6f9d4..cc265f9b1fe 100644
--- a/code/modules/reagents/reagent_containers/food/cans.dm
+++ b/code/modules/reagents/reagent_containers/food/cans.dm
@@ -1,16 +1,11 @@
/obj/item/weapon/reagent_containers/food/drinks/cans
var canopened = 0
- New()
- ..()
- flags ^= OPENCONTAINER
-
attack_self(mob/user as mob)
if (canopened == 0)
playsound(src.loc,'sound/effects/canopen.ogg', rand(10,50), 1)
user << "You open the drink with an audible pop!"
canopened = 1
- flags |= OPENCONTAINER
else
return
@@ -18,19 +13,117 @@
if (canopened == 0)
user << "You need to open the drink!"
return
- return ..(M, user, def_zone)
+ var/datum/reagents/R = src.reagents
+ var/fillevel = gulp_size
+
+ if(!R.total_volume || !R)
+ user << "\red None of [src] left, oh no!"
+ return 0
+
+ if(M == user)
+ M << "\blue You swallow a gulp of [src]."
+ if(reagents.total_volume)
+ reagents.trans_to_ingest(M, gulp_size)
+ reagents.reaction(M, INGEST)
+ spawn(5)
+ reagents.trans_to(M, gulp_size)
+
+ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ return 1
+ else if( istype(M, /mob/living/carbon/human) )
+ if (canopened == 0)
+ user << "You need to open the drink!"
+ return
+
+ else if (canopened == 1)
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message("\red [user] attempts to feed [M] [src].", 1)
+ if(!do_mob(user, M)) return
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message("\red [user] feeds [M] [src].", 1)
+
+ M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]")
+ user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]")
+ msg_admin_attack("[key_name(user)][isAntag(user) ? "(ANTAG)" : ""] fed [key_name(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)]) (JMP)")
+
+ if(reagents.total_volume)
+ reagents.trans_to_ingest(M, gulp_size)
+
+ if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
+ var/mob/living/silicon/robot/bro = user
+ bro.cell.use(30)
+ var/refill = R.get_master_reagent_id()
+ spawn(600)
+ R.add_reagent(refill, fillevel)
+
+ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ return 1
+
+ return 0
afterattack(obj/target, mob/user, proximity)
if(!proximity) return
- if(istype(target, /obj/structure/reagent_dispensers) && (canopened == 0))
- user << "You need to open the drink!"
- return
- else if(target.is_open_container() && (canopened == 0))
- user << "You need to open the drink!"
- return
- else
- return ..(target, user, proximity)
+
+ if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
+ if (canopened == 0)
+ user << "You need to open the drink!"
+ return
+
+ if(!target.reagents.total_volume)
+ user << "\red [target] is empty."
+ return
+
+ if(reagents.total_volume >= reagents.maximum_volume)
+ user << "\red [src] is full."
+ return
+
+ var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this)
+ user << "\blue You fill [src] with [trans] units of the contents of [target]."
+
+
+ else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it.
+ if (canopened == 0)
+ user << "You need to open the drink!"
+ return
+
+ if (istype(target, /obj/item/weapon/reagent_containers/food/drinks/cans))
+ var/obj/item/weapon/reagent_containers/food/drinks/cans/cantarget = target
+ if(cantarget.canopened == 0)
+ user << "You need to open the drink you want to pour into!"
+ return
+
+ if(!reagents.total_volume)
+ user << "\red [src] is empty."
+ return
+
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ user << "\red [target] is full."
+ return
+
+
+
+ var/datum/reagent/refill
+ var/datum/reagent/refillName
+ if(isrobot(user))
+ refill = reagents.get_master_reagent_id()
+ refillName = reagents.get_master_reagent_name()
+
+ var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
+ user << "\blue You transfer [trans] units of the solution to [target]."
+
+ if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
+ var/mob/living/silicon/robot/bro = user
+ var/chargeAmount = max(30,4*trans)
+ bro.cell.use(chargeAmount)
+ user << "Now synthesizing [trans] units of [refillName]..."
+
+
+ spawn(300)
+ reagents.add_reagent(refill, trans)
+ user << "Cyborg [src] refilled."
+
+ return
/* examine()
set src in view()
diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm
index 8034ef5a956..b2e6c9d7970 100644
--- a/code/modules/reagents/reagent_containers/food/drinks.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks.dm
@@ -46,7 +46,7 @@
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
- user << "\red They have a monitor for a head, where do you think you're going to put that?"
+ H << "\red They have a monitor for a head, where do you think you're going to put that?"
return
for(var/mob/O in viewers(world.view, user))
@@ -84,13 +84,6 @@
afterattack(obj/target, mob/user, proximity)
if(!proximity) return
- // Moved from the can code; not necessary since closed cans aren't open containers now, but, eh.
- if (istype(target, /obj/item/weapon/reagent_containers/food/drinks/cans))
- var/obj/item/weapon/reagent_containers/food/drinks/cans/cantarget = target
- if(cantarget.canopened == 0)
- user << "You need to open the drink you want to pour into!"
- return
-
if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(!target.reagents.total_volume)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 564207dacca..1235ad4d1c7 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -86,6 +86,7 @@
user << "\red There is already a blood sample in this syringe"
return
if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea.
+ var/amount = src.reagents.maximum_volume - src.reagents.total_volume
var/mob/living/carbon/T = target
if(!T.dna)
usr << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)"
@@ -111,11 +112,6 @@
if(!do_mob(user, target, time))
return
- var/amount = src.reagents.maximum_volume - src.reagents.total_volume
- if(amount == 0)
- usr << "The syringe is full!"
- return
-
var/datum/reagent/B
if(istype(T,/mob/living/carbon/human))
var/mob/living/carbon/human/H = T
@@ -162,11 +158,6 @@
if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes))
user << "\red You cannot directly fill this object."
return
- if(istype(target, /obj/item/clothing/mask/cigarette))
- var/obj/item/clothing/mask/cigarette/C = target
- if(istype(C.loc, /obj/item/weapon/storage/fancy/cigarettes))
- user << "\red You cannot inject a cigarette while it's still in the pack."
- return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
user << "\red [target] is full."
return
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 970f0b139f9..b3efb13975a 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -122,14 +122,6 @@
build_path = /obj/item/weapon/airlock_electronics
category = list("initial", "Electronics")
-/datum/design/intercom_electronics
- name = "Intercom Electronics"
- id = "intercom_electronics"
- build_type = AUTOLATHE
- materials = list("$metal" = 50, "$glass" = 50)
- build_path = /obj/item/weapon/intercom_electronics
- category = list("initial", "Electronics")
-
/datum/design/console_screen
name = "Console Screen"
id = "console_screen"
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
index 3d2ec6c32c1..7daa0a665aa 100644
--- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
+++ b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
@@ -92,14 +92,13 @@
reconnect_scanner()
if(owned_scanner)
var/artifact_in_use = 0
- scanned_object = null
for(var/obj/O in owned_scanner.loc)
if(O == owned_scanner)
continue
if(O.invisibility)
continue
- if(istype(O, /obj/machinery/artifact))
- var/obj/machinery/artifact/A = O
+ if(istype(scanned_object, /obj/machinery/artifact))
+ var/obj/machinery/artifact/A = scanned_object
if(A.being_used)
artifact_in_use = 1
else
diff --git a/code/setup.dm b/code/setup.dm
index f629ab3b14f..393de3e9723 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -739,7 +739,6 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define BE_VAMPIRE 2048
#define BE_MUTINEER 4096
#define BE_BLOB 8192
-#define BE_SHADOWLING 16384
var/list/be_special_flags = list(
"traitor" = BE_TRAITOR,
@@ -820,7 +819,7 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse
#define IS_SLOW 4
#define RAD_ABSORB 8
#define NO_SCAN 16
-#define NO_PAIN 32
+#define NO_PAIN 32
#define REQUIRE_LIGHT 64
#define IS_WHITELISTED 128
#define HAS_LIPS 512
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 82a6d814154..7d5ba8127a0 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -62,6 +62,7 @@ h1.alert, h2.alert {color: #000000;}
.boldnotice {color: #000099; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
+
.newscaster {color: #800000;}
.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
@@ -83,7 +84,6 @@ h1.alert, h2.alert {color: #000000;}
.kidan {color: #664205;}
.slime {color: #0077AA;}
.clown {color: #ff0000;}
-.shadowling {color: #311648;}
.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
.say_quote {font-family: Georgia, Verdana, sans-serif;}
.sans {font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
@@ -91,11 +91,6 @@ h1.alert, h2.alert {color: #000000;}
.say_quote {font-family: Georgia, Verdana, sans-serif;}
.interface {color: #330033;}
-
-.big {font-size: 3;}
-.greentext {color: #00FF00; font-size: 3;}
-.redtext {color: #FF0000; font-size: 3;}
-
BIG IMG.icon {width: 32px; height: 32px;}
diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi
index 1b7635129d3..a885e76d549 100644
Binary files a/icons/misc/buildmode.dmi and b/icons/misc/buildmode.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index c1eb1966043..0fa9ecf7f43 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_races/r_shadowling.dmi b/icons/mob/human_races/r_shadowling.dmi
deleted file mode 100644
index 6add64458a0..00000000000
Binary files a/icons/mob/human_races/r_shadowling.dmi and /dev/null differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 2a003edd4f0..44b9b3a3043 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index b808cde1bc3..f197a06ae79 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/rings.dmi b/icons/obj/clothing/rings.dmi
deleted file mode 100644
index d378c34e04e..00000000000
Binary files a/icons/obj/clothing/rings.dmi and /dev/null differ
diff --git a/interface/interface.dm b/interface/interface.dm
index cc370f2d626..267dfdfaca8 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -13,7 +13,7 @@
src << "The wiki URL is not set in the server configuration."
return
-#define CHANGELOG "https://github.com/ParadiseSS13/Paradise/pulls?q=is%3Apr+is%3Amerged+sort%3Aupdated-desc"
+#define CHANGELOG "https://github.com/ParadiseSS13/Paradise/issues?q=is%3Apr+is%3Aclosed"
/client/verb/changes()
set name = "Changelog"
set desc = "Visit Github to check out the commits."
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 77ceece1e9b..0c3b2571879 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -2991,7 +2991,7 @@
"bfA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/hallway/primary/starboard/east)
"bfB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard/east)
"bfC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/hallway/primary/starboard/east)
-"bfD" = (/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/carpet,/area/library)
+"bfD" = (/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/library)
"bfE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet,/area/library)
"bfF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/library)
"bfG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/library)
@@ -3074,7 +3074,7 @@
"bhf" = (/turf/simulated/floor{desc = "\"This is a plaque in honour of those who died in the great space lube airlock incident.\" Scratched in beneath that is a crude image of a clown and a spaceman. The spaceman is slipping. The clown is laughing."; dir = 4; icon_state = "plaque"; name = "Memorial Plaque"; nitrogen = 30; oxygen = 70; temperature = 80},/area/hallway/secondary/exit)
"bhg" = (/obj/structure/bush,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/grass,/area/hallway/secondary/exit)
"bhh" = (/turf/space,/area/xenos_station/east)
-"bhi" = (/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/obj/machinery/door/firedoor,/turf/simulated/floor/carpet,/area/library)
+"bhi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Library"; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/library)
"bhj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bhk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
"bhl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/wood,/area/security/vacantoffice)
@@ -4612,9 +4612,9 @@
"bKJ" = (/turf/simulated/wall/r_wall,/area/toxins/server)
"bKK" = (/obj/machinery/r_n_d/server/robotics,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
"bKL" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 140; on = 1; pressure_checks = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
-"bKM" = (/obj/structure/stool/bed/chair/office/light,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
-"bKN" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
-"bKO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/server)
+"bKM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
+"bKN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/toxins/server)
+"bKO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bKP" = (/obj/machinery/camera{c_tag = "Research Server Room"; dir = 2; network = list("Research","SS13"); pixel_x = 22},/obj/machinery/power/apc{dir = 1; name = "Server Room APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bKQ" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{current_temperature = 80; dir = 2; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bKR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/area_atmos,/obj/effect/decal/warning_stripes/yellow/hollow,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage)
@@ -4685,8 +4685,8 @@
"bMe" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
"bMf" = (/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
"bMg" = (/obj/machinery/door/firedoor{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/command{name = "Server Room"; req_access = null; req_access_txt = "30"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
-"bMh" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
-"bMi" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
+"bMh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
+"bMi" = (/obj/structure/stool/bed/chair/office/light,/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bMj" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bMk" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage)
"bMl" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/storage)
@@ -4758,8 +4758,8 @@
"bNz" = (/obj/machinery/computer/scan_consolenew,/obj/structure/window/reinforced,/turf/simulated/floor{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"bNA" = (/obj/machinery/r_n_d/server/core,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
"bNB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 140; icon_state = "in"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
-"bNC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/server)
-"bND" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
+"bNC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/toxins/server)
+"bND" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bNE" = (/obj/machinery/computer/rdservercontrol,/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bNF" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bNG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/toxins/storage)
@@ -13312,9 +13312,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUby
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvIbvIbvIbvIbvIbvIbvIbClbCdbClbFbbFcbFdbudbudbudbFcbudbsybuebCfbFebhBbFfbkebuhbzfbkebolbFgbkebkebFhbzkbxMbpFbFieLCbFkeKpbFlbFmeHrbFobFpeLjbFqbFrbFsbHsbFubFvbFweLDaaaaaaaaaeKSbFxbFybFzbFzbFAbFBbFCeKSbFDbFEbzIbFFbFGbFHbFIbFJbHPbFLbFMbCLeLEbFNbFObFPbFQeLEbCKbEzbFRbFSbFTbFUbFVbKHeLrbFXbFYbFZeLubGabGbbGcbKIbGebGfbIlbDBbIobEJbEJbGibGjbEJbGkbGlbGmbGnbGobEJbGpbGqbGreLHeLGeLJeLIeLKeLIeLIeLIbBXeKIeKIeKZeLbeKIbGvbGwbGxbrVbGzbGAbGBbIpaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvIbvIbvIbvIbvIbvIbvIbIqbGEbIqbGFbGGbGHbGHbGHbGHbGHbGIbGJbGKbCfbGLbhBbGMbGNbGObGPbGQeLNeLMeLPeLObIybIybGUbpFbGVbIrbAReKpbGXbGYbGZbDYbHaeLjbHbbHcbHdeLQbHebzybHfeLDaaaaaaaaaeKSbHgbHhbHibHjbFAbFBbFCeKSbHkbHlbHmbHnbHobHpbHqbHrbIsbHtbHubHveLoeLoeLRbHxeLoeLobCKbEzbHybHzbHAbHBbHCbHDeLrbHEbHFbHGeLSbHIbHJbHKbHKbHLbHMbItbHObIubDwbDwbHQbDwbHRbDwbHSbDwbHTbHUbHUbHVbHWbHXeLUbJobJhbIbbIcbIdbIeeLIbIfeLVaaaaaaaaaeKIbIhbIibIjbIkbIvbImbIneKIaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvIbvIbvIbvIbvIbvIbvIbIxbIIbIFbhBbhBbIJbzhbzhbzhbIMbhBbhBbIRbJjbJibhBbIwbIwbIwbJLbIwbIybIzbIAbIBbICbIybxMbpFbIDbvXbvXeKpeKpeKpeKpeKpbIEeLjeLgeLeeLXeLWeLYbJNeLDeLDczkczkczkeKSeKTeKSeKSeKSeKSeKSeKSeKSbIGbpFbIHeLZbUcbKdbKrbUcbUccjIbIKbILbKwbINbIObIPbIQbLIbFMbISbITbIUbIVbIWbIXbIYbIZbJabJbbJceMabJebJfbJgbGcbHZeLteLtbKJbKJbKJbKJbMgbKJbKJbKJeMbbMOeMceMcbJkbJlbJmbJneLUbIabJpbJqbJrbJsbJteLIbIfeMdaaaaaaaaaeKIbJvbJweKIbDPeKIeKIbDPeKIaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvIbvIbvIbvIbvIbvIbvIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJxaabaaaaaaaaaaaabIwbJybJzbJAbJBbIybJCbJDbJEbJFbIybxMbpFbJGbJHbJIbJJbJKbMQbJMbNabJObJPbJQbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbNcbKebozbKfbpFbKgbKhbKibpFbKjbUcbKkbKlbKmbKnbKobCKbKpbKqbNWbKsbKtbKubKvbNXbKxbKybKzeLpbKAbHBbKBbKCeMebKEbKFbKGeLubGdbGcbGcbGcbFWeLtbKJbKKbKLbMhbNCbNDbKPbKQbKJbKRbKSbKTeMceMcbKUbJmbKVeMfbAwbKYbKZbLabLbbLceLIbLdcDsaaaaaaaaaeKIeKIeKIeKIaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvIbvIbvIbvIbvIbvIbvIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIwbLebLfbLgbLhbLibLjbLkbLlbLmbIybxMbLnbLobpFbpFbzIbLpbozbKebNcbLqbLrbLqbLsbLtbLtbLubLvbLwbLtbLtbLxbLtbLybLtbNcbKebozbLzbLAbLBbLCbLDbLEbpFbUcbLFbKlbLGbLHbNYbCKbLJbLKeMheMgeMibLOeMkeMjbCKbLRbLSeLpbLTbLUbLUbLVeMlbLWbLXbLYeLubLZbMabGcbMbbMceLtbKJbMdbMebMfbOrbKNbKMbMjbKJbMkbKSbMlbMleMcbMmbMnbMobMpbMqbMrbMsbMtbMubMveLIbIfcDsbMwaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvIbvIbvIbvIbvIaaaaaaaaaaaaaaaaaaaaaaaabMxbMybMzbMybMAaaaaaaaaabIwbIwbMBbMCbLgbMDbMEbMFbJEbMGbMHbIybxMbMIbMJbMKbMLbMMbMNbOvbMPbOwbMRbMSbMTbMUbMVbMVbMWbMXbMXbMXbMXbMXbMXbMYbMZbOybNbbOzbNdbMLbNebNfbNgbNhbNibUcbNjbKlbKmbNkbNYbCKbLJbLKeMmbNmbNnbNobNpeMnbCSbNrbNseLpeLpeMoeMpeLpeMleLreMreMqeLubNvbNwbNxbNybNzeLtbKJbNAbNBbMhbKObMibNEbNFbKJbNGbKSbMlbMleMcbNHbNIbNJeMsbNKbtcbtgbNNbNObNPeLIbIfeMteMueMteMweMveMweMweMwaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvIbvIbvIbvIbvIbvIbvIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJxaabaaaaaaaaaaaabIwbJybJzbJAbJBbIybJCbJDbJEbJFbIybxMbpFbJGbJHbJIbJJbJKbMQbJMbNabJObJPbJQbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbNcbKebozbKfbpFbKgbKhbKibpFbKjbUcbKkbKlbKmbKnbKobCKbKpbKqbNWbKsbKtbKubKvbNXbKxbKybKzeLpbKAbHBbKBbKCeMebKEbKFbKGeLubGdbGcbGcbGcbFWeLtbKJbKKbKLbKMbKNbKObKPbKQbKJbKRbKSbKTeMceMcbKUbJmbKVeMfbAwbKYbKZbLabLbbLceLIbLdcDsaaaaaaaaaeKIeKIeKIeKIaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvIbvIbvIbvIbvIbvIbvIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIwbLebLfbLgbLhbLibLjbLkbLlbLmbIybxMbLnbLobpFbpFbzIbLpbozbKebNcbLqbLrbLqbLsbLtbLtbLubLvbLwbLtbLtbLxbLtbLybLtbNcbKebozbLzbLAbLBbLCbLDbLEbpFbUcbLFbKlbLGbLHbNYbCKbLJbLKeMheMgeMibLOeMkeMjbCKbLRbLSeLpbLTbLUbLUbLVeMlbLWbLXbLYeLubLZbMabGcbMbbMceLtbKJbMdbMebMfbOrbMhbMibMjbKJbMkbKSbMlbMleMcbMmbMnbMobMpbMqbMrbMsbMtbMubMveLIbIfcDsbMwaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvIbvIbvIbvIbvIaaaaaaaaaaaaaaaaaaaaaaaabMxbMybMzbMybMAaaaaaaaaabIwbIwbMBbMCbLgbMDbMEbMFbJEbMGbMHbIybxMbMIbMJbMKbMLbMMbMNbOvbMPbOwbMRbMSbMTbMUbMVbMVbMWbMXbMXbMXbMXbMXbMXbMYbMZbOybNbbOzbNdbMLbNebNfbNgbNhbNibUcbNjbKlbKmbNkbNYbCKbLJbLKeMmbNmbNnbNobNpeMnbCSbNrbNseLpeLpeMoeMpeLpeMleLreMreMqeLubNvbNwbNxbNybNzeLtbKJbNAbNBbKMbNCbNDbNEbNFbKJbNGbKSbMlbMleMcbNHbNIbNJeMsbNKbtcbtgbNNbNObNPeLIbIfeMteMueMteMweMveMweMweMwaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNSbNTbNUbNVbNSbOZbPkbPabIwbNZbOabObbOcbOdbOebOfbOgbOgbOhbIybOibOjbOkbXibXibOlbOmbOnbXicblcblbOobOpbOqcblcblbPZbNcbNceMxeMyeMyeMyeMzbOteMyeMyeMAbOueMBeMBbRpeMBbRqeMCeMBeMDbRrbREbUceMEbOBbLJbOCeMFbODbOEbOFbOGeMFbCKbLRbOHeMGbOIbOJbOKbOLbOMbONeMHbOObOPbOQbORbOSbOTbOUeLtbKJbKJbKJbKJbKJbKJbKJbKJbKJbOVbOWbOXbOXeMcbSlbUdbTLeLIeLIeLIeLIeLIeLIeLIeLIbIfeMtbPbbPceMIbPebPebPfeMwaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeMKeMJeMJeMLeMMeMMbQZbQZbQZbQZeMNaabaabaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMzbPibPjbPibMzbUebPlbPmbPnbPobPpbPqbPrbPsbIybPtbPubPvbPwbIybOjbOjbPxbXibPybPzbPAbPBbPCcblbPDbPEbPFbPGbPHcblbPIbPJbPKeMybPLbPMbPNbPObPPbPQbPReMObPTeMPbPUbPVbPWbPXbPYbUfbQabQbbQcbQdbQebQfbQgbLKbQhbQibQjbQkbQlbQmbCSbQnbQobQpbQqbOKbQrbQrbQsbQteLubQubQvbQwbQxbQybQzbQAeLtbQBbQCbQDbQEbQDbQDbQFeMReMQbQGbQHbQIbQJeMcbQKbQLbJneKIbsabQMbQNbQObQObQNbQObQPeMtbQQbQReMIbPebQSbQTeMwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeMSbQVbQWbQVeMMbQZbQZbQXbQYbQXbQZbQZaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyUbyUbyUbyUbyUbyUbyUbyUbyUaaaaaaaaaaaaaaaaaaaaabyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVbyVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNSbPibPibPibRabRbbMCbRcbRdbRebMCbPqbRfbRgbIybIybIybIybIybIybRhbOjbRicbXbRmbRkbRkbRkbRocbldrybRnbRnbRnduveMTbUJbUCbUNeMUbRsbRtbRubRvbRwbRxeMyeMAbRyeMBbRzbRAbRBbRCbRDeMBbLFbKmbLGbLHbVmbRFbRGbRHeMVbRIbwrbvwbuKeMFbRMbRNbROeMWbRPbRQbRRbRSbRTbRUeLueLueLueLueLueMXeMZeMYeLtbRVbQDbQDbRWbQDbRXbRYeNbeNabRZbKSbSabSaeMcbJlbSbbJneKIeMtbcZeMteMteMteMteMteMteMtbSdbSeeMwbSfbSgbSheMwaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbSibQVbQVbSjbQZbQZbQXbQXbSkbQXbQXbQZbQZaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/paradise.dme b/paradise.dme
index b15100499bf..c67c19c9dac 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -316,10 +316,6 @@
#include "code\game\gamemodes\nuclear\pinpointer.dm"
#include "code\game\gamemodes\revolution\revolution.dm"
#include "code\game\gamemodes\revolution\rp_revolution.dm"
-#include "code\game\gamemodes\shadowling\shadowling.dm"
-#include "code\game\gamemodes\shadowling\shadowling_abilities.dm"
-#include "code\game\gamemodes\shadowling\shadowling_items.dm"
-#include "code\game\gamemodes\shadowling\special_shadowling_abilities.dm"
#include "code\game\gamemodes\traitor\traitor.dm"
#include "code\game\gamemodes\vampire\hud.dm"
#include "code\game\gamemodes\vampire\vampire.dm"
@@ -621,7 +617,6 @@
#include "code\game\objects\items\mountable_frames\apc_frame.dm"
#include "code\game\objects\items\mountable_frames\fire_alarm.dm"
#include "code\game\objects\items\mountable_frames\frames.dm"
-#include "code\game\objects\items\mountable_frames\intercom.dm"
#include "code\game\objects\items\mountable_frames\lights.dm"
#include "code\game\objects\items\mountable_frames\mountables.dm"
#include "code\game\objects\items\mountable_frames\newscaster_frame.dm"
@@ -923,7 +918,6 @@
#include "code\modules\clothing\gloves\boxing.dm"
#include "code\modules\clothing\gloves\color.dm"
#include "code\modules\clothing\gloves\miscellaneous.dm"
-#include "code\modules\clothing\gloves\rings.dm"
#include "code\modules\clothing\head\collectable.dm"
#include "code\modules\clothing\head\hardhat.dm"
#include "code\modules\clothing\head\helmet.dm"
@@ -1315,7 +1309,6 @@
#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm"
-#include "code\modules\mob\living\simple_animal\ascendant_shadowling.dm"
#include "code\modules\mob\living\simple_animal\bees.dm"
#include "code\modules\mob\living\simple_animal\borer.dm"
#include "code\modules\mob\living\simple_animal\constructs.dm"
diff --git a/sound/effects/fingersnap.ogg b/sound/effects/fingersnap.ogg
deleted file mode 100644
index f7046403513..00000000000
Binary files a/sound/effects/fingersnap.ogg and /dev/null differ