Revert "Manual update"

This reverts commit 7aa67928b3.
This commit is contained in:
Aurorablade
2015-05-06 20:57:37 -04:00
parent 55c2ad3941
commit 56ea5311a9
106 changed files with 672 additions and 2494 deletions
+1 -8
View File
@@ -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)
@@ -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()
+1 -2
View File
@@ -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
+1 -71
View File
@@ -312,25 +312,6 @@ datum/mind
sections["traitor"] = text
/** SHADOWLING **/
text = "shadowling"
if(ticker.mode.config_tag == "shadowling")
text = uppertext(text)
text = "<i><b>[text]</b></i>: "
if(src in ticker.mode.shadows)
text += "<b>SHADOWLING</b>|thrall|<a href='?src=\ref[src];shadowling=clear'>human</a>"
else if(src in ticker.mode.shadowling_thralls)
text += "Shadowling|<b>THRALL</b>|<a href='?src=\ref[src];shadowling=clear'>human</a>"
else
text += "<a href='?src=\ref[src];shadowling=shadowling'>shadowling</a>|<a href='?src=\ref[src];shadowling=thrall'>thrall</a>|<b>HUMAN</b>"
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 << "<span class='userdanger'>Your powers have been quenched! You are no longer a shadowling!</span>"
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 << "<span class='userdanger'>You have been brainwashed! You are no longer a thrall!</span>"
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 << "<span class='warning'>This only works on humans!</span>"
return
ticker.mode.shadows += src
special_role = "shadowling"
current << "<span class='deadsay'><b>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.</b></span>"
ticker.mode.finalize_shadowling(src)
ticker.mode.update_shadow_icons_added(src)
if("thrall")
if(!ishuman(current))
usr << "<span class='warning'>This only works on humans!</span>"
return
ticker.mode.add_thrall(src)
special_role = "thrall"
current << "<span class='deadsay'>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 <b>eating</b>. Their children, the Shadowlings, are to be obeyed and protected at all costs.</span>"
current << "<span class='danger'>You may use the Hivemind Commune ability to communicate with your fellow enlightened ones.</span>"
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")
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
@@ -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()
@@ -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 << "<b>The current game mode is - Shadowling!</b>"
world << "<b>There are alien <span class='deadsay'>shadowlings</span> on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding.</b>"
/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 << "<br>"
shadow.current << "<span class='deadsay'><b><font size=3>You are a shadowling!</font></b></span>"
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 << "<b>Currently, you are disguised as an employee aboard [world.name].</b>"
shadow.current << "<b>In your limited state, you have three abilities: Enthrall, Hatch, and Shadowling Hivemind (:8).</b>"
shadow.current << "<b>Any other shadowlings are your allies. You must assist them as they shall assist you.</b>"
shadow.current << "<b>If you are new to shadowling, or want to read about abilities, check the wiki page at http://nanotrasen.se/wiki/index.php/Shadowling</b><br>"
/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 += "<b>Objective #1</b>: [objective_explanation]"
shadow_mind.current << "<b>Objective #1</b>: [objective_explanation]<br>"
/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 << "<span class='notice'>Your alien nature has allowed you to overcome your clownishness.</span>"
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()]\] <span class='danger'>Became a thrall</span>"
new_thrall_mind.memory += "<b>The Shadowlings' Objectives:</b> 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 << "<b>The objectives of your shadowlings:</b>: 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 << "<span class='greentext'><b>The shadowlings have ascended and taken over the station!</b></span>"
else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round
world << "<span class='redtext'><b>The shadowlings have been killed by the crew!</b></span>"
else if(!check_shadow_victory() && emergency_shuttle.returned())
world << "<span class='redtext'><b>The crew has escaped the station before the shadowlings could ascend!</b></span>"
..()
return 1
/datum/game_mode/proc/auto_declare_completion_shadowling()
var/text = ""
if(shadows.len)
text += "<br><span class='big'><b>The shadowlings were:</b></span>"
for(var/datum/mind/shadow in shadows)
text += "<br>[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 <b>[shadow.current.real_name]</b>"
else
text += "body destroyed"
text += ")"
text += "<br>"
if(shadowling_thralls.len)
text += "<br><span class='big'><b>The thralls were:</b></span>"
for(var/datum/mind/thrall in shadowling_thralls)
text += "<br>[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 <b>[thrall.current.real_name]</b>"
else
text += "body destroyed"
text += "<br>"
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)
@@ -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 << "<span class='danger'>You don't see why you would want to paralyze an ally.</span>"
charge_counter = charge_max
return
usr.visible_message("<span class='warning'><b>[usr]'s eyes flash a blinding red!</b></span>")
target.visible_message("<span class='danger'>[target] freezes in place, their eyes glazing over...</span>")
if(in_range(target, usr))
target << "<span class='userdanger'>Your gaze is forcibly drawn into [usr]'s eyes, and you are mesmerized by the heavenly lights...</span>"
else //Only alludes to the shadowling if the target is close by
target << "<span class='userdanger'>Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...</span>"
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 << "<span class='deadsay'>You silently disable all nearby lights.</span>"
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("<span class='danger'>[F] goes slightly dim for a moment.</span>")
return
F.on = 0
F.visible_message("<span class='danger'>[F] gutters and falls dark.</span>")
F.update_brightness()
for(var/obj/machinery/light/L in T.contents)
L.on = 0
L.visible_message("<span class='danger'>[L] flickers and falls dark.</span>")
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("<span class='warning'>\The [G] withers away!</span>")
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("<span class='danger'>[F] goes slightly dim for a moment.</span>")
return
F.on = 0
F.visible_message("<span class='danger'>[F] gutters and falls dark.</span>")
F.update_brightness()
for(var/obj/item/device/pda/P in H)
P.fon = 0
P.SetLuminosity(0) //failsafe
if(H != usr)
H << "<span class='boldannounce'>You feel a chill and are plunged into darkness.</span>"
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("<span class='danger'>[user] vanishes into thin air!</span>", "<span class='deadsay'>You enter the space between worlds as a passageway.</span>")
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("<span class='danger'>[user] appears out of nowhere!</span>", "<span class='deadsay'>The pressure becomes too much and you vacate the interdimensional darkness.</span>")
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 << "<span class='deadsay'>You freeze the nearby air.</span>"
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 << "<span class='danger'>You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!</span>"
continue
target << "<span class='userdanger'>You are hit by a blast of paralyzingly cold air and feel goosebumps break out across your body!</span>"
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 << "<span class='warning'>You need to be closer to enthrall [target].</span>"
charge_counter = charge_max
return
if(!target.ckey)
usr << "<span class='warning'>The target has no mind.</span>"
charge_counter = charge_max
return
if(target.stat)
usr << "<span class='warning'>The target must be conscious.</span>"
charge_counter = charge_max
return
if(is_shadow_or_thrall(target))
usr << "<span class='warning'>You can not enthrall allies.</span>"
charge_counter = charge_max
return
if(!ishuman(target))
usr << "<span class='warning'>You can only enthrall humans.</span>"
charge_counter = charge_max
return
if(enthralling)
usr << "<span class='danger'>You are already enthralling!</span>"
charge_counter = charge_max
return
enthralling = 1
usr << "<span class='danger'>This target is valid. You begin the enthralling.</span>"
target << "<span class='userdanger'>[usr] focuses in concentration. Your head begins to ache.</span>"
for(var/progress = 0, progress <= 3, progress++)
switch(progress)
if(1)
usr << "<span class='notice'>You begin allocating energy for the enthralling.</span>"
usr.visible_message("<span class='danger'>[usr]'s eyes begin to throb a piercing red.</span>")
if(2)
usr << "<span class='notice'>You begin the enthralling of [target].</span>"
usr.visible_message("<span class='danger'>[usr] leans over [target], their eyes glowing a deep crimson, and stares into their face.</span>")
target << "<span class='danger'>Your gaze is forcibly drawn into a blinding red light. You fall to the floor as conscious thought is wiped away.</span>"
target.Weaken(12)
sleep(20)
if(isloyal(target))
usr << "<span class='notice'>They are enslaved by Nanotrasen. You begin to shut down the nanobot implant - this will take some time.</span>"
usr.visible_message("<span class='danger'>[usr] halts for a moment, then begins passing its hand over [target]'s body.</span>")
target << "<span class='danger'>You feel your loyalties begin to weaken!</span>"
sleep(150) //15 seconds - not spawn() so the enthralling takes longer
usr << "<span class='notice'>The nanobots composing the loyalty implant have been rendered inert. Now to continue.</span>"
usr.visible_message("<span class='danger'>[usr] halts thier hand and resumes staring into [target]'s face.</span>")
for(var/obj/item/weapon/implant/loyalty/L in target)
if(L && L.implanted)
qdel(L)
target << "<span class='danger'>Your unwavering loyalty to Nanotrasen falters, dims, dies.</span>"
if(3)
usr << "<span class='notice'>You begin rearranging [target]'s memories.</span>"
usr.visible_message("<span class='danger'>[usr]'s eyes flare brightly, and a horrible grin begins to spread across [target]'s face...</span>")
target << "<span class='danger'>Your head cries out. The veil of reality begins to crumple and something evil bleeds through.</span>" //Ow the edge
if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant
usr << "<span class='danger'>The enthralling has been interrupted - your target's mind returns to its previous state.</span>"
target << "<span class='warning'>Your thoughts become coherent once more. Already you can barely remember what's happened to you.</span>"
enthralling = 0
return
enthralling = 0
usr << "<span class='notice'>You have enthralled <b>[target]</b>!</span>"
target << "<span class='deadsay'><b>You see the Truth. Reality has been torn away and you realize what a fool you've been.</b></span>"
target << "<span class='deadsay'><b>The shadowlings are your masters.</b> Serve them above all else and ensure they complete their goals.</span>"
target << "<span class='deadsay'>You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.</span>"
target << "<span class='deadsay'>You can communicate with the other enlightened ones by using the Hivemind Commune ability.</span>"
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 << "<span class='shadowling'><b>You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.</b></span>"
for(M in living_mob_list)
if(is_thrall(M))
thralls++
M << "<span class='deadsay'>You feel hooks sink into your mind and pull.</span>"
if(!do_after(user, 30))
user << "<span class='warning'>Your concentration has been broken. The mental hooks you have sent out now retract into your mind.</span>"
return
if(thralls >= 3 && !blind_smoke_acquired)
blind_smoke_acquired = 1
user << "<span class='shadowling'><i>The power of your thralls has granted you the <b>Blinding Smoke</b> ability. It will create a choking cloud that will blind any non-thralls who enter. \
</i></span>"
user.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/blindness_smoke
if(thralls >= 5 && !drain_thrall_acquired)
drain_thrall_acquired = 1
user << "<span class='shadowling'><i>The power of your thralls has granted you the <b>Drain Thrall</b> ability. You can now drain nearby thralls to heal yourself.</i></span>"
user.spell_list += new /obj/effect/proc_holder/spell/wizard/aoe_turf/drain_thralls
if(thralls >= 7 && !screech_acquired)
screech_acquired = 1
user << "<span class='shadowling'><i>The power of your thralls has granted you the <b>Sonic Screech</b> ability. This ability will shatter nearby windows and deafen enemies.</span>"
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 << "<span class='shadowling'><i>The power of your thralls has granted you the <b>Spatial Relocation</b> ability. This will, allow you to instantly swap places with one of your thralls in \
addition to shattering nearby lights.</i></span>"
user.spell_list += new /obj/effect/proc_holder/spell/wizard/targeted/spatial_relocation
if(thralls < victory_threshold)
user << "<span class='shadowling'>You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.</span>"
else if(thralls >= victory_threshold)
usr << "<span class='shadowling'><b>You are now powerful enough to ascend. Use the Ascendance ability when you are ready. <i>This will kill all of your thralls.</i></span>"
usr << "<span class='shadowling'><b>You may find Ascendance in the Shadowling Evolution tab.</b></span>"
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 << "<span class='shadowling'><b>[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend.</span>" //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("<span class='warning'>[user] suddenly bends over and coughs out a cloud of black smoke, which begins to spread rapidly!</span>")
user << "<span class='deadsay'>You regurgitate a vast cloud of blinding smoke.</span>"
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 << "<span class='warning'><b>You breathe in the black smoke, and your eyes burn horribly!</b></span>"
M.eye_blind = 5
if(prob(25))
M.visible_message("<b>[M]</b> screams and claws at their eyes!")
M.Stun(2)
else
M << "<span class='notice'><b>You breathe in the black smoke, and you feel revitalized!</b></span>"
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("<span class='warning'><b>[usr] lets out a horrible scream!</b></span>")
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 << "<span class='danger'><b>A spike of pain drives into your head and scrambles your thoughts!</b></span>"
M.Weaken(2)
M.confused += 10
M.ear_damage += 3
else if(issilicon(target))
var/mob/living/silicon/S = target
S << "<span class='warning'><b>ERROR $!(@ ERROR )#^! SENSOR INTERFERENCE DETECTED</b></span>"
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 << "<span class='warning'>You feel a curious draining sensation and a wave of exhaustion washes over you.</span>"
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 << "<span class='deadsay'>You draw the life from [M] to heal your wounds.</span>"
if(thralls_drained)
var/mob/living/carbon/U = usr
U.heal_organ_damage(25, 25)
else
charge_counter = charge_max
usr << "<span class='warning'>There were no nearby thralls for you to drain.</span>"
/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("<span class='danger'>[thrall_to_swap] suddenly vanishes in a puff of black smoke!</span>")
thrall_to_swap << "<span class='warning'><b>You feel a brief sense of nausea before finding yourself in an entirely new place!</b></span>"
usr.visible_message("<span class='danger'>[usr] suddenly goes transparent and vanishes!</span>")
usr << "<span class='deadsay'>You experience vertigo as you swap your location with [thrall_to_swap]'s.</span>"
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 << "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>"
charge_counter = charge_max
return
for(var/mob/living/carbon/human/boom in targets)
if(is_shadow_or_thrall(boom))
usr << "<span class='warning'>Making an ally explode seems unwise.<span>"
charge_counter = charge_max
return
usr.visible_message("<span class='danger'>[usr]'s eyes flare as they gesture at [boom]!</span>", \
"<span class='shadowling'>You direct a lance of telekinetic energy at [boom].</span>")
boom << "<span class='userdanger'><font size=3>You feel an immense pressure building all across your body!</span></font>"
boom.Stun(10)
boom.audible_message("<b>[boom]</b> screams!")
sleep(20)
playsound(boom, 'sound/effects/splat.ogg', 100, 1)
boom.visible_message("<span class='userdanger'>[boom] explodes!</span>")
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 << "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>"
return
for(var/mob/living/carbon/human/target in targets)
if(is_shadow_or_thrall(target))
usr << "<span class='warning'>You cannot enthrall an ally.<span>"
charge_counter = charge_max
return
if(!target.ckey)
usr << "<span class='warning'>The target has no mind.</span>"
charge_counter = charge_max
return
if(target.stat)
usr << "<span class='warning'>The target must be conscious.</span>"
charge_counter = charge_max
return
if(!ishuman(target))
usr << "<span class='warning'>You can only enthrall humans.</span>"
charge_counter = charge_max
return
usr << "<span class='shadowling'>You instantly rearrange <b>[target]</b>'s memories, hyptonitizing them into a thrall.</span>"
target << "<span class='userdanger'><font size=3>An agonizing spike of pain drives into your mind, and--</font></span>"
target << "<span class='deadsay'><b>And you see the Truth. Reality has been torn away and you realize what a fool you've been.</b></span>"
target << "<span class='deadsay'><b>The shadowlings are your masters.</b> Serve them above all else and ensure they complete their goals.</span>"
target << "<span class='deadsay'>You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.</span>"
target << "<span class='deadsay'>You can communicate with the other enlightened ones by using the Shadowling Hivemind (:8).</span>"
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("<span class='danger'>[SHA] suddenly vanishes!</span>", \
"<span class='shadowling'>You begin phasing through planes of existence. Use the ability again to return.</span>")
SHA.incorporeal_move = 1
SHA.alpha = 0
else
SHA.visible_message("<span class='danger'>[SHA] suddenly appears from nowhere!</span>", \
"<span class='shadowling'>You return from the space between worlds.</span>")
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 << "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>"
return
usr << "<span class='deadsay'>You freeze the nearby air.</span>"
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 << "<span class='danger'>You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!</span>"
continue
target << "<span class='userdanger'>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!</span>"
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 << "<span class='warning'>You are not in the same plane of existence. Unphase first.</span>"
return
for(SHA in targets)
SHA.visible_message("<span class='userdanger'>[SHA] raises their arms upward as the markings on their body flare a blinding red!</span>", \
"<span class='shadowling'>You tear open a rift to the black space between worlds. <b><font size=3>It would be wise to avoid it.</font></b></span>")
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 = "<font size=3>[text]</font>"
for(var/mob/M in mob_list)
if(is_shadow_or_thrall(M) || (M in dead_mob_list))
M << "<span class='shadowling'><b>\[Hive Chat\]<i> [usr.real_name] (ASCENDANT)</i>: [text]</b></span>" //Bigger text for ascendants.
@@ -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("<span class='warning'><b>\The [src] lets out a dismaying screech as dimensional barriers are torn apart!</span>")
playsound(loc, 'sound/effects/eleczap.ogg', 100, 1)
sleep(100)
qdel(src)
/obj/structure/shadow_vortex/Crossed(var/td)
..()
if(ismob(td))
td << "<span class='userdanger'><font size=3>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.</font></span>" //A bit of spooking before they die
playsound(loc, 'sound/effects/EMPulse.ogg', 25, 1)
qdel(td)
@@ -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 << "<span class='warning'>You decide against hatching for now."
usr.verbs += /mob/living/carbon/human/proc/shadowling_hatch
return
if("Yes")
usr.notransform = 1
usr.visible_message("<span class='warning'>[usr]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!</span>", \
"<span class='shadowling'>You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.</span>")
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("<span class='warning'>A chrysalis forms around [usr], sealing them inside.</span>", \
"<span class='shadowling'>You create your chrysalis and begin to contort within.</span>")
usr.Weaken(30)
sleep(100)
usr.visible_message("<span class='warning'><b>The skin on [usr]'s back begins to split apart. Black spines slowly emerge from the divide.</b></span>", \
"<span class='shadowling'>Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.</span>")
sleep(90)
usr.visible_message("<span class='warning'><b>[usr], now no longer recognizable as human, begins clawing at the resin walls around them.</b></span>", \
"<span class='shadowling'>Your false skin slips away. You begin tearing at the fragile membrane protecting you.</span>")
sleep(80)
playsound(usr.loc, 'sound/weapons/slash.ogg', 25, 1)
usr << "<i><b>You rip and slice.</b></i>"
sleep(10)
playsound(usr.loc, 'sound/weapons/slashmiss.ogg', 25, 1)
usr << "<i><b>The chrysalis falls like water before you.</b></i>"
sleep(10)
playsound(usr.loc, 'sound/weapons/slice.ogg', 25, 1)
usr << "<i><b>You are free!</b></i>"
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 << "<i><b><font size=3>YOU LIVE!!!</i></b></font>"
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("<span class='warning'>The chrysalis explodes in a shower of purple flesh and fluid!</span>")
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 << "<span class='shadowling'><b><i>Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.</b></i></span>"
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 << "<span class='warning'>You decide against ascending for now."
usr.verbs += /mob/living/carbon/human/proc/shadowling_ascendance
return
if("Yes")
usr.notransform = 1
usr.visible_message("<span class='warning'>[usr] rapidly bends and contorts, their eyes flaring a deep crimson!</span>", \
"<span class='shadowling'>You begin unlocking the genetic vault within you and prepare yourself for the power to come.</span>")
sleep(30)
usr.visible_message("<span class='danger'>[usr] suddenly shoots up a few inches in the air and begins hovering there, still twisting.</span>", \
"<span class='shadowling'>You hover into the air to make room for your new form.</span>")
sleep(60)
usr.visible_message("<span class='danger'>[usr]'s skin begins to pulse red in sync with their eyes. Their form slowly expands outward.</span>", \
"<span class='shadowling'>You feel yourself beginning to mutate.</span>")
sleep(20)
if(!ticker.mode.shadowling_ascended)
usr << "<span class='shadowling'>It isn't enough. Time to draw upon your thralls.</span>"
else
usr << "<span class='shadowling'>After some telepathic searching, you find the reservoir of life energy from the thralls and tap into it.</span>"
sleep(50)
for(var/mob/M in mob_list)
if(is_thrall(M) && !ticker.mode.shadowling_ascended)
M.visible_message("<span class='userdanger'>[M] trembles minutely as their form turns to ash, black smoke pouring from their disintegrating face.</span>", \
"<span class='userdanger'><font size=3>It's time! Your masters are ascending! Your last thoughts are happy as your body is drained of life.</span>")
ticker.mode.thralls -= M.mind //To prevent message spam
M.death(0)
M.dust()
usr << "<span class='userdanger'>Drawing upon your thralls, you find the strength needed to finish and rend apart the final barriers to godhood.</b></span>"
sleep(40)
for(var/mob/living/M in orange(7, src))
M.Weaken(10)
M << "<span class='userdanger'>An immense pressure slams you onto the ground!</span>"
usr << "<font size=3.5><span class='shadowling'>YOU LIVE!!!</font></span>"
world << "<br><br><font size=4><span class='shadowling'><b>A horrible wail echoes in your mind as the world plunges into blackness.</font></span><br><br>"
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)
+3 -6
View File
@@ -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()
+1 -1
View File
@@ -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)
+4 -3
View File
@@ -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()
-6
View File
@@ -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."
+21 -112
View File
@@ -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 << "<span class='notice'>You cut out the intercoms wiring and disconnect its electronics.</span>"
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 << "<span class='notice'>You secure the electronics!</span>"
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 << "<span class='warning'>You need more cable for this!</span>"
return
if(do_after(user, 10))
coil.use(5)
user << "<span class='notice'>You wire \the [src]!</span>"
buildstage = 2
return 1
if(iscrowbar(W))
user << "<span class='notice'>You begin removing the electronics...</span>"
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 << "<span class='notice'>The circuitboard pops out!</span>"
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 << "<span class='notice'>You insert \the [W] into \the [src]!</span>"
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 << "<span class='warning'>You're out of welding fuel.</span>"
return 1
if(do_after(user, 10))
user << "<span class='notice'>You cut the intercom frame from the wall!</span>"
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
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"
@@ -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)
@@ -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, \
)
@@ -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("<span class='notice'>[user] calmly drops and treads on the lit [src], putting it out instantly.</span>")
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 << "<span class='notice'>Your [name] loses its flavor.</span>"
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("<span class='notice'>[user] calmly drops and treads on the lit [src], putting it out instantly.</span>")
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("<span class='notice'>[user] puts out [src].</span>")
lit = 0
icon_state = icon_off
@@ -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 << "<span class='notice'>You take a cigarette out of the pack.</span>"
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
@@ -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
@@ -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
-5
View File
@@ -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."
-4
View File
@@ -82,10 +82,6 @@ var/can_call_ert
usr << "<span class='warning'>This role is not yet available to you. You need to wait another [player_age_check] days.</span>"
return
if(src.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
usr << "\blue <B>Upon using the antagHUD you forfeited the ability to join the round.</B>"
return
if(response_team_members.len > 6)
usr << "The emergency response team is already full!"
return
-3
View File
@@ -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
-3
View File
@@ -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)
+3
View File
@@ -572,6 +572,9 @@ var/global/nologevent = 0
<A href='?src=\ref[src];quick_create_object=1'>Quick Create Object</A><br>
<A href='?src=\ref[src];create_turf=1'>Create Turf</A><br>
<A href='?src=\ref[src];create_mob=1'>Create Mob</A><br>
<br><A href='?src=\ref[src];vsc=airflow'>Edit Airflow Settings</A><br>
<A href='?src=\ref[src];vsc=plasma'>Edit Plasma Settings</A><br>
<A href='?src=\ref[src];vsc=default'>Choose a default ZAS setting</A><br>
"}
usr << browse(dat, "window=admin2;size=210x280")
-6
View File
@@ -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)
+2 -2
View File
@@ -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 << "<font color='#960018'><span class='ooc'><span class='prefix'>AOOC:</span> <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>"
log_ooc("(ANTAG) [key] : [msg]")
log_ooc("(ANTAG) [key] : [msg]")
+1 -1
View File
@@ -23,7 +23,7 @@
///////////////
//SOUND STUFF//
///////////////
var/ambience_playing = 0
var/ambience_playing= null
var/played = 0
////////////
+1 -3
View File
@@ -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,
-1
View File
@@ -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'
-97
View File
@@ -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 << "<span class='notice'>The [src] already has a gem.</span>"
else
if(D.amount >= 1)
D.use(1)
stud = 1
update_icon()
usr << "<span class='notice'>You socket the diamond into the [src].</span>"
// 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"
-5
View File
@@ -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"
+4 -5
View File
@@ -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
-13
View File
@@ -101,19 +101,6 @@
overlays = list()
string_attached = null
user << "<span class='notice'>You detach the string from the coin.</span>"
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)
+2 -2
View File
@@ -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
+3 -3
View File
@@ -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
-8
View File
@@ -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)
@@ -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")
@@ -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
@@ -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("<span class='warning'>[M] has grabbed [src] passively!</span>")
if ("harm")
M.do_attack_animation(src)
@@ -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)
@@ -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)]"
@@ -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
@@ -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
..()
+35 -51
View File
@@ -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 <B>[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 <B>[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))
@@ -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
+1 -24
View File
@@ -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 = "<b>[src]</b> snaps \his fingers."
playsound(src.loc, 'sound/effects/fingersnap.ogg', 50, 1, -3)
else
message = "<span class='danger'><b>[src]</b> snaps \his fingers right off!</span>"
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
// Needed for M_TOXIC_FART
if("fart")
@@ -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
@@ -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")
+3 -18
View File
@@ -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 << "<span class='userdanger'>The light burns you!</span>"
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.
@@ -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)
@@ -9,7 +9,7 @@
set invisibility = 0
//set background = 1
if (src.notransform)
if (src.monkeyizing)
return
..()
@@ -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
@@ -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)
+1 -2
View File
@@ -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()
+234 -304
View File
@@ -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 <B>You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).</B>"
B.host << "\red <B>You feel the captive mind of [src] begin to resist your control.</B>"
spawn(rand(350,450)+B.host.brainloss)
if(!B || !B.controlling)
return
B.host.adjustBrainLoss(rand(5,10))
H << "\red <B>With an immense exertion of will, you regain control of your body!</B>"
B.host << "\red <B>You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.</b>"
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 <B>[] resists!</B>", 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 <B>[usr] attempts to unbuckle themself!</B>", 1)
spawn(0)
if(do_after(usr, 1200))
if(!C.buckled)
return
for(var/mob/O in viewers(C))
O.show_message("\red <B>[usr] manages to unbuckle themself!</B>", 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 <B>The [L.loc] begins to shake violently!</B>", 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 <B>\the [usr] successfully broke out of \the [SC]!</B>", 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 <B>\the [usr] successfully broke out of \the [C]!</B>", 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 <B>You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).</B>"
B.host << "\red <B>You feel the captive mind of [src] begin to resist your control.</B>"
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("<span class='danger'>[CM] rolls on the floor, trying to put themselves out!</span>", \
"<span class='notice'>You stop, drop, and roll!</span>")
sleep(30)
if(fire_stacks <= 0)
CM.visible_message("<span class='danger'>[CM] has successfully extinguished themselves!</span>", \
"<span class='notice'>You extinguish yourself.</span>")
ExtinguishMob()
return
B.host.adjustBrainLoss(rand(5,10))
H << "\red <B>With an immense exertion of will, you regain control of your body!</B>"
B.host << "\red <B>You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.</b>"
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 <B>[] is trying to break the handcuffs!</B>", 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 <B>[] manages to break the handcuffs!</B>", 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 <B>[usr] attempts to remove \the [HC]!</B>", 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 <B>[CM] manages to remove the handcuffs!</B>", 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 <B>[] resists!</B>", 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)</span>"
for(var/mob/O in viewers(L))
O.show_message("\red <B>[usr] attempts to unbuckle themself!</B>", 1)
spawn(0)
if(do_after(usr, 1200))
if(!C.buckled)
return
for(var/mob/O in viewers(C))
O.show_message("\red <B>[usr] manages to unbuckle themself!</B>", 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 <B>The [L.loc] begins to shake violently!</B>", 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 <B>[] is trying to break the legcuffs!</B>", 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 <B>[] manages to break the legcuffs!</B>", 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 <B>\the [usr] successfully broke out of \the [SC]!</B>", 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 <B>\the [usr] successfully broke out of \the [C]!</B>", 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("<span class='danger'>[CM] rolls on the floor, trying to put themselves out!</span>", \
"<span class='notice'>You stop, drop, and roll!</span>")
sleep(30)
if(fire_stacks <= 0)
CM.visible_message("<span class='danger'>[CM] has successfully extinguished themselves!</span>", \
"<span class='notice'>You extinguish yourself.</span>")
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 <B>[usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!</B>", 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 <B>[CM] manages to [hulklien ? "break" : "remove"] the handcuffs!</B>", 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 <B>[usr] attempts to [hulklien ? "break" : "remove"] \the [HC]!</B>", 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 <B>[CM] manages to [hulklien ? "break" : "remove"] the legcuffs!</B>", 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 <B>[usr] attempts to remove \the [HC]!</B>", 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 <B>[CM] manages to remove the legcuffs!</B>", 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()
-8
View File
@@ -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 .
+1
View File
@@ -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,
+2 -2
View File
@@ -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
@@ -2,7 +2,7 @@
set invisibility = 0
set background = 1
if (src.notransform)
if (src.monkeyizing)
return
@@ -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
@@ -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))
@@ -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
@@ -2,7 +2,7 @@
set invisibility = 0
//set background = 1
if (src.notransform)
if (src.monkeyizing)
return
src.blinded = null
@@ -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] <B>:</B> [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] <B>:</B> [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 << "<b>Obey these laws:</b>"
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)
@@ -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()
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+9 -46
View File
@@ -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("<span class='danger'>[user] is attempting to devour \the [affecting]!</span>")
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("<span class='danger'>[user] devours \the [affecting]!</span>")
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
+1 -1
View File
@@ -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
+15 -15
View File
@@ -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
+3 -4
View File
@@ -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
-8
View File
@@ -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()
+10 -91
View File
@@ -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"
@@ -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
///////////////////////////////////////////////////////////
@@ -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)
@@ -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
*/
@@ -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)
-2
View File
@@ -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 << "<span class='danger'>The muzzle flash would cause damage to your form!</span>"
add_fingerprint(user)
+1 -2
View File
@@ -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))
@@ -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()
+2 -2
View File
@@ -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()
+1 -1
View File
@@ -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++
+2 -2
View File
@@ -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()
@@ -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 << "<span class='notice'>You open the drink with an audible pop!</span>"
canopened = 1
flags |= OPENCONTAINER
else
return
@@ -18,19 +13,117 @@
if (canopened == 0)
user << "<span class='notice'>You need to open the drink!</span>"
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 << "<span class='notice'>You need to open the drink!</span>"
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()]\] <font color='orange'>Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Fed [M.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]</font>")
msg_admin_attack("[key_name(user)][isAntag(user) ? "(ANTAG)" : ""] fed [key_name(M)] with [src.name] Reagents: [reagentlist(src)] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
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 << "<span class='notice'>You need to open the drink!</span>"
return
else if(target.is_open_container() && (canopened == 0))
user << "<span class='notice'>You need to open the drink!</span>"
return
else
return ..(target, user, proximity)
if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if (canopened == 0)
user << "<span class='notice'>You need to open the drink!</span>"
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 << "<span class='notice'>You need to open the drink!</span>"
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 << "<span class='notice'>You need to open the drink you want to pour into!</span>"
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()
@@ -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 << "<span class='notice'>You need to open the drink you want to pour into!</span>"
return
if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(!target.reagents.total_volume)
@@ -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 << "<span class='warning'>The syringe is full!</span>"
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
@@ -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"
@@ -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
+1 -2
View File
@@ -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
+1 -6
View File
@@ -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;}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 911 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 KiB

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 199 KiB

Some files were not shown because too many files have changed in this diff Show More