Merge remote-tracking branch 'upstream/master' into I-guess-I-port-stuff-now-huh

This commit is contained in:
Qwertytoforty
2021-05-16 09:19:08 -04:00
908 changed files with 17189 additions and 18371 deletions
+7 -8
View File
@@ -169,7 +169,7 @@
return A
/obj/item/areaeditor/proc/get_area_type(var/area/A = get_area())
/obj/item/areaeditor/proc/get_area_type(area/A = get_area())
if(A.outdoors)
return AREA_SPACE
var/list/SPECIALS = list(
@@ -228,8 +228,8 @@
FD.CalculateAffectingAreas()
interact()
message_admins("A new room was made by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_VERBOSEJMP(src)] with the name [str]")
log_game("A new room was made by [key_name(usr)] at [AREACOORD(src)] with the name [str]")
message_admins("A new room was made by [key_name_admin(usr)] at [ADMIN_VERBOSEJMP(usr)] with the name [str]")
log_game("A new room was made by [key_name(usr)] at [AREACOORD(usr)] with the name [str]")
area_created = TRUE
return area_created
@@ -250,12 +250,12 @@
FD.CalculateAffectingAreas()
to_chat(usr, "<span class='notice'>You rename the '[prevname]' to '[str]'.</span>")
interact()
message_admins("A room was renamed by [ADMIN_LOOKUPFLW(usr)] at [ADMIN_VERBOSEJMP(usr)] changing the name from [prevname] to [str]")
message_admins("A room was renamed by [key_name_admin(usr)] at [ADMIN_VERBOSEJMP(usr)] changing the name from [prevname] to [str]")
log_game("A room was renamed by [key_name(usr)] at [AREACOORD(usr)] changing the name from [prevname] to [str] ")
return 1
/obj/item/areaeditor/proc/set_area_machinery_title(var/area/A,var/title,var/oldtitle)
/obj/item/areaeditor/proc/set_area_machinery_title(area/A, title, oldtitle)
if(!oldtitle) // or replacetext goes to infinite loop
return
for(var/obj/machinery/alarm/M in A)
@@ -270,7 +270,7 @@
M.name = replacetext(M.name,oldtitle,title)
//TODO: much much more. Unnamed airlocks, cameras, etc.
/obj/item/areaeditor/proc/check_tile_is_border(var/turf/T2,var/dir)
/obj/item/areaeditor/proc/check_tile_is_border(turf/T2, dir)
if(istype(T2, /turf/space))
return BORDER_SPACE //omg hull breach we all going to die here
if(get_area_type(T2.loc)!=AREA_SPACE)
@@ -298,7 +298,7 @@
return BORDER_NONE
/obj/item/areaeditor/proc/detect_room(var/turf/first)
/obj/item/areaeditor/proc/detect_room(turf/first)
var/list/turf/found = new
var/list/turf/pending = list(first)
while(pending.len)
@@ -341,4 +341,3 @@
fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station."
/obj/item/areaeditor/blueprints/ce
+1 -1
View File
@@ -4,7 +4,7 @@
icon = 'icons/obj/artifacts.dmi'
icon_state = "changerock"
/obj/item/changestone/attack_hand(var/mob/user as mob)
/obj/item/changestone/attack_hand(mob/user as mob)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if(!H.gloves)
+4
View File
@@ -41,6 +41,10 @@
to_chat(user, "<span class='notice'>Now in mode: [mode].</span>")
/obj/item/door_remote/examine(mob/user)
. = ..()
. += "<span class='notice'>It's current mode is: [mode]</span>"
/obj/item/door_remote/afterattack(obj/machinery/door/airlock/D, mob/user)
if(!istype(D))
return
+5
View File
@@ -174,6 +174,11 @@
colourName = "purple"
..()
/obj/item/toy/crayon/black
icon_state = "crayonblack"
colour = "#000000"
colourName = "black"
/obj/item/toy/crayon/white
icon_state = "crayonwhite"
colour = "#FFFFFF"
@@ -66,7 +66,7 @@
spawn(8)
qdel(T)
/obj/item/chameleon/proc/disrupt(var/delete_dummy = 1)
/obj/item/chameleon/proc/disrupt(delete_dummy = 1)
if(active_dummy)
do_sparks(5, 0, src)
eject_all()
@@ -91,7 +91,7 @@
var/can_move = 1
var/obj/item/chameleon/master = null
/obj/effect/dummy/chameleon/proc/activate(var/obj/O, var/mob/M, new_icon, new_iconstate, new_overlays, new_underlays, var/obj/item/chameleon/C)
/obj/effect/dummy/chameleon/proc/activate(obj/O, mob/M, new_icon, new_iconstate, new_overlays, new_underlays, obj/item/chameleon/C)
name = O.name
desc = O.desc
icon = new_icon
@@ -135,7 +135,7 @@
..()
master.disrupt()
/obj/effect/dummy/chameleon/relaymove(var/mob/user, direction)
/obj/effect/dummy/chameleon/relaymove(mob/user, direction)
if(istype(loc, /turf/space) || !direction)
return //No magical space movement!
@@ -44,7 +44,7 @@
list_enginebeacons += B
//Spawns and logs / announces the appropriate engine based on the choice made
/obj/item/enginepicker/proc/processchoice(var/obj/item/radio/beacon/engine/choice, mob/living/carbon/user)
/obj/item/enginepicker/proc/processchoice(obj/item/radio/beacon/engine/choice, mob/living/carbon/user)
var/issuccessful = FALSE //Check for a successful choice
var/engtype //Engine type
var/G //Generator that will be spawned
@@ -90,7 +90,7 @@
return
//Deletes objects and mobs from the beacon's turf.
/obj/item/enginepicker/proc/clearturf(var/turf/T)
/obj/item/enginepicker/proc/clearturf(turf/T)
for(var/obj/item/I in T)
I.visible_message("\The [I] gets crushed to dust!")
qdel(I)
+2 -2
View File
@@ -54,7 +54,7 @@
visible_message("<span class='notice'>The [src.name] burns out!</span>")
/obj/item/flash/proc/flash_recharge(var/mob/user)
/obj/item/flash/proc/flash_recharge(mob/user)
if(prob(times_used * 2)) //if you use it 5 times in a minute it has a 10% chance to break!
burn_out()
return 0
@@ -85,7 +85,7 @@
return TRUE
/obj/item/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, targeted = 1)
/obj/item/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 5, targeted = 1)
if(user)
add_attack_logs(user, M, "Flashed with [src]")
if(targeted)
@@ -22,7 +22,7 @@
icon_state = initial(icon_state)
set_light(0)
/obj/item/flashlight/proc/update_brightness(var/mob/user = null)
/obj/item/flashlight/proc/update_brightness(mob/user = null)
if(on)
icon_state = "[initial(icon_state)]-on"
set_light(brightness_on)
@@ -199,7 +199,7 @@
else
update_brightness(null)
/obj/item/flashlight/flare/update_brightness(var/mob/user = null)
/obj/item/flashlight/flare/update_brightness(mob/user = null)
..()
if(on)
item_state = "[initial(item_state)]-on"
@@ -27,7 +27,7 @@
"whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
"yellowcorner", "yellowcornersiding", "yellowsiding")
/obj/item/floor_painter/afterattack(var/atom/A, var/mob/user, proximity, params)
/obj/item/floor_painter/afterattack(atom/A, mob/user, proximity, params)
if(!proximity)
return
@@ -46,7 +46,7 @@
F.icon_regular_floor = floor_state
F.dir = floor_dir
/obj/item/floor_painter/attack_self(var/mob/user)
/obj/item/floor_painter/attack_self(mob/user)
if(!user)
return 0
user.set_machine(src)
@@ -65,12 +65,12 @@
..()
return
/obj/item/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params)
/obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params)
if(flag) //we're placing the object on a table or in backpack
return
laser_act(target, user, params)
/obj/item/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user, var/params)
/obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, params)
if( !(user in (viewers(7,target))) )
return
if(!diode)
@@ -179,7 +179,7 @@
playsound(loc, 'sound/machines/ding.ogg', 50, TRUE)
return new_bulbs
/obj/item/lightreplacer/proc/Charge(var/mob/user)
/obj/item/lightreplacer/proc/Charge(mob/user)
charge += 1
if(charge > 3)
AddUses(1)
+1 -1
View File
@@ -303,7 +303,7 @@
/obj/item/paicard
var/current_emotion = 1
/obj/item/paicard/proc/setEmotion(var/emotion)
/obj/item/paicard/proc/setEmotion(emotion)
if(pai)
overlays.Cut()
switch(emotion)
@@ -57,7 +57,7 @@
explosion(src.loc,1,2,4,flame_range = 2) //Identical to a minibomb
qdel(src)
/obj/item/pizza_bomb/attackby(var/obj/item/I, var/mob/user, params)
/obj/item/pizza_bomb/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/wirecutters) && primed)
to_chat(user, "<span class='danger'>Oh God, what wire do you cut?!</span>")
var/chosen_wire = input(user, "OH GOD OH GOD", "WHAT WIRE?!") in wires
+1 -1
View File
@@ -88,7 +88,7 @@
/obj/item/powersink/attack_ai()
return
/obj/item/powersink/attack_hand(var/mob/user)
/obj/item/powersink/attack_hand(mob/user)
switch(mode)
if(DISCONNECTED)
..()
@@ -103,10 +103,10 @@
/obj/item/radio/headset/syndicate/alt/syndteam
ks1type = /obj/item/encryptionkey/syndteam
/obj/item/radio/headset/syndicate/alt/lavaland
name = "syndicate lavaland headset"
/obj/item/radio/headset/syndicate/alt/nocommon
name = "syndicate researcher headset"
/obj/item/radio/headset/syndicate/alt/lavaland/New()
/obj/item/radio/headset/syndicate/alt/nocommon/New()
. = ..()
set_frequency(SYND_FREQ)
@@ -190,14 +190,14 @@
ks2type = /obj/item/encryptionkey/heads/captain
/obj/item/radio/headset/heads/captain/alt
name = "\proper the captain's bowman headset"
name = "captain's bowman headset"
desc = "The headset of the boss. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
item_state = "com_headset_alt"
/obj/item/radio/headset/heads/rd
name = "Research Director's headset"
name = "research director's headset"
desc = "Headset of the researching God."
icon_state = "com_headset"
item_state = "headset"
@@ -211,7 +211,7 @@
ks2type = /obj/item/encryptionkey/heads/hos
/obj/item/radio/headset/heads/hos/alt
name = "\proper the head of security's bowman headset"
name = "head of security's bowman headset"
desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
@@ -272,7 +272,7 @@
ks2type = /obj/item/encryptionkey/heads/magistrate
/obj/item/radio/headset/heads/magistrate/alt
name = "\proper magistrate's bowman headset"
name = "magistrate's bowman headset"
desc = "The headset of the Magistrate. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
@@ -286,7 +286,7 @@
ks2type = /obj/item/encryptionkey/heads/blueshield
/obj/item/radio/headset/heads/blueshield/alt
name = "\proper blueshield's bowman headset"
name = "blueshield's bowman headset"
desc = "The headset of the Blueshield. Protects ears from flashbangs."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
@@ -314,7 +314,7 @@
instant = TRUE
/obj/item/radio/headset/centcom
name = "\proper centcom officer's bowman headset"
name = "centcom officer's bowman headset"
desc = "The headset of final authority. Protects ears from flashbangs. Can transmit even if telecomms are down."
flags = EARBANGPROTECT
icon_state = "com_headset_alt"
@@ -236,15 +236,15 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
return user.has_internal_radio_channel_access(user, internal_channels[freq])
/mob/proc/has_internal_radio_channel_access(var/mob/user, var/list/req_one_accesses)
/mob/proc/has_internal_radio_channel_access(mob/user, list/req_one_accesses)
var/obj/item/card/id/I = user.get_id_card()
return has_access(list(), req_one_accesses, I ? I.GetAccess() : list())
/mob/living/silicon/has_internal_radio_channel_access(var/mob/user, var/list/req_one_accesses)
/mob/living/silicon/has_internal_radio_channel_access(mob/user, list/req_one_accesses)
var/list/access = get_all_accesses()
return has_access(list(), req_one_accesses, access)
/mob/dead/observer/has_internal_radio_channel_access(var/mob/user, var/list/req_one_accesses)
/mob/dead/observer/has_internal_radio_channel_access(mob/user, list/req_one_accesses)
return can_admin_interact()
/obj/item/radio/proc/ToggleBroadcast()
@@ -475,7 +475,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
return FALSE
/obj/item/radio/hear_talk(mob/M as mob, list/message_pieces, var/verb = "says")
/obj/item/radio/hear_talk(mob/M as mob, list/message_pieces, verb = "says")
if(broadcasting)
if(get_dist(src, M) <= canhear_range)
talk_into(M, message_pieces, null, verb)
+23 -12
View File
@@ -100,9 +100,9 @@ REAGENT SCANNER
/obj/item/healthanalyzer/attack(mob/living/M, mob/living/user)
if((HAS_TRAIT(user, TRAIT_CLUMSY) || user.getBrainLoss() >= 60) && prob(50))
user.visible_message("<span class='warning'>[user] analyzes the floor's vitals!</span>", "<span class='notice'>You stupidly try to analyze the floor's vitals!</span>")
to_chat(user, "<span class='info'>Analyzing results for The floor:\n\tOverall status: <b>Healthy</b></span>")
to_chat(user, "<span class='info'>Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FF8000'>Burn</font>/<font color='red'>Brute</font></span>")
to_chat(user, "<span class='info'>\tDamage specifics: <font color='blue'>0</font>-<font color='green'>0</font>-<font color='#FF8000'>0</font>-<font color='red'>0</font></span>")
to_chat(user, "<span class='info'>Analyzing results for The floor:\n\tOverall status: Healthy</span>")
to_chat(user, "<span class='info'>Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burn</font>/<font color='red'>Brute</font></span>")
to_chat(user, "<span class='info'>\tDamage specifics: <font color='blue'>0</font> - <font color='green'>0</font> - <font color='#FFA500'>0</font> - <font color='red'>0</font></span>")
to_chat(user, "<span class='info'>Body temperature: ???</span>")
return
@@ -130,19 +130,30 @@ REAGENT SCANNER
var/TX = H.getToxLoss() > 50 ? "<b>[H.getToxLoss()]</b>" : H.getToxLoss()
var/BU = H.getFireLoss() > 50 ? "<b>[H.getFireLoss()]</b>" : H.getFireLoss()
var/BR = H.getBruteLoss() > 50 ? "<b>[H.getBruteLoss()]</b>" : H.getBruteLoss()
if(HAS_TRAIT(H, TRAIT_FAKEDEATH))
OX = fake_oxy > 50 ? "<b>[fake_oxy]</b>" : fake_oxy
to_chat(user, "<span class='notice'>Analyzing Results for [H]:\n\t Overall Status: dead</span>")
else
to_chat(user, "<span class='notice'>Analyzing Results for [H]:\n\t Overall Status: [H.stat > 1 ? "dead" : "[H.health]% healthy"]</span>")
var/status = "<font color='red'>Dead</font>" // Dead by default to make it simpler
var/mob/dead/observer/ghost = H.get_ghost(TRUE)
var/DNR = (ghost && !ghost.can_reenter_corpse)
if(H.stat == DEAD)
if(DNR)
status = "<font color='red'>Dead <b>\[DNR]</b></font>"
else // Alive or unconscious
if(HAS_TRAIT(H, TRAIT_FAKEDEATH)) // status still shows as "Dead"
OX = fake_oxy > 50 ? "<b>[fake_oxy]</b>" : fake_oxy
else
status = "[H.health]% Healthy"
to_chat(user, "<span class='notice'>Analyzing Results for [H]:\n\t Overall Status: [status]")
to_chat(user, "\t Key: <font color='blue'>Suffocation</font>/<font color='green'>Toxin</font>/<font color='#FFA500'>Burns</font>/<font color='red'>Brute</font>")
to_chat(user, "\t Damage Specifics: <font color='blue'>[OX]</font> - <font color='green'>[TX]</font> - <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
to_chat(user, "<span class='notice'>Body Temperature: [H.bodytemperature-T0C]&deg;C ([H.bodytemperature*1.8-459.67]&deg;F)</span>")
if(H.timeofdeath && (H.stat == DEAD || (HAS_TRAIT(H, TRAIT_FAKEDEATH))))
to_chat(user, "<span class='notice'>Time of Death: [station_time_timestamp("hh:mm:ss", H.timeofdeath)]</span>")
var/tdelta = round(world.time - H.timeofdeath)
if(tdelta < DEFIB_TIME_LIMIT)
if(tdelta < DEFIB_TIME_LIMIT && !DNR)
to_chat(user, "<span class='danger'>Subject died [DisplayTimeText(tdelta)] ago, defibrillation may be possible!</span>")
else
to_chat(user, "<font color='red'>Subject died [DisplayTimeText(tdelta)] ago.</font>")
if(mode == 1)
var/list/damaged = H.get_damaged_organs(1,1)
@@ -239,9 +250,9 @@ REAGENT SCANNER
to_chat(user, "<span class='notice'>Subject's pulse: <font color='[H.pulse == PULSE_THREADY || H.pulse == PULSE_NONE ? "red" : "blue"]'>[H.get_pulse(GETPULSE_TOOL)] bpm.</font></span>")
var/implant_detect
for(var/obj/item/organ/internal/cyberimp/CI in H.internal_organs)
if(CI.is_robotic())
implant_detect += "[H.name] is modified with a [CI.name].<br>"
for(var/obj/item/organ/internal/O in H.internal_organs)
if(O.is_robotic())
implant_detect += "[H.name] is modified with a [O.name].<br>"
if(implant_detect)
to_chat(user, "<span class='notice'>Detected cybernetic modifications:</span>")
to_chat(user, "<span class='notice'>[implant_detect]</span>")
+2 -2
View File
@@ -79,7 +79,7 @@ GLOBAL_LIST_EMPTY(world_uplinks)
return pick(random_items)
/obj/item/uplink/proc/buy(var/datum/uplink_item/UI, var/reference)
/obj/item/uplink/proc/buy(datum/uplink_item/UI, reference)
if(is_jammed)
to_chat(usr, "<span class='warning'>[src] seems to be jammed - it cannot be used here!</span>")
return
@@ -149,7 +149,7 @@ GLOBAL_LIST_EMPTY(world_uplinks)
// Checks to see if the value meets the target. Like a frequency being a traitor_frequency, in order to unlock a headset.
// If true, it accesses trigger() and returns 1. If it fails, it returns false. Use this to see if you need to close the
// current item's menu.
/obj/item/uplink/hidden/proc/check_trigger(mob/user, var/value, var/target)
/obj/item/uplink/hidden/proc/check_trigger(mob/user, value, target)
if(is_jammed)
to_chat(user, "<span class='warning'>[src] seems to be jammed - it cannot be used here!</span>")
return
+8 -5
View File
@@ -1,3 +1,6 @@
#define USE_COOLDOWN 2 SECONDS
/obj/item/hailer
name = "hailer"
desc = "Used by obese officers to save their breath for running."
@@ -6,11 +9,11 @@
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
w_class = WEIGHT_CLASS_TINY
flags = CONDUCT
var/next_use_time
var/spamcheck = 0
/obj/item/hailer/attack_self(mob/living/carbon/user as mob)
if(spamcheck)
if(world.time < next_use_time)
return
if(emagged)
@@ -20,11 +23,11 @@
playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0)
user.visible_message("<span class='warning'>[user]'s [name] rasps, \"Halt! Security!\"</span>")
spamcheck = 1
spawn(20)
spamcheck = 0
next_use_time = world.time + USE_COOLDOWN
/obj/item/hailer/emag_act(user as mob)
if(!emagged)
to_chat(user, "<span class='warning'>You overload \the [src]'s voice synthesizer.</span>")
emagged = 1
#undef USE_COOLDOWN
+116
View File
@@ -0,0 +1,116 @@
/obj/item/slapper
name = "slapper"
desc = "This is how real men fight."
icon_state = "latexballon"
item_state = "nothing"
force = 0
throwforce = 0
flags = DROPDEL | ABSTRACT
attack_verb = list("slaps")
hitsound = 'sound/weapons/slap.ogg'
/// How many smaller table smacks we can do before we're out
var/table_smacks_left = 3
/obj/item/slapper/attack(mob/M, mob/living/carbon/human/user)
user.do_attack_animation(M)
playsound(M, hitsound, 50, TRUE, -1)
user.visible_message("<span class='danger'>[user] slaps [M]!</span>", "<span class='notice'>You slap [M]!</span>", "<span class='hear'>You hear a slap.</span>")
/obj/item/slapper/attack_obj(obj/O, mob/living/user, params)
if(!istype(O, /obj/structure/table))
return ..()
var/obj/structure/table/the_table = O
if(user.a_intent == INTENT_HARM && table_smacks_left == initial(table_smacks_left)) // so you can't do 2 weak slaps followed by a big slam
transform = transform.Scale(1.5) // BIG slap
if(HAS_TRAIT(user, TRAIT_HULK))
transform = transform.Scale(2)
color = COLOR_GREEN
user.do_attack_animation(the_table)
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
if(istype(human_user.shoes, /obj/item/clothing/shoes/cowboy))
human_user.say(pick("Hot damn!", "Hoo-wee!", "Got-dang!"))
playsound(get_turf(the_table), 'sound/effects/tableslam.ogg', 110, TRUE)
user.visible_message("<b><span class='danger'>[user] slams [user.p_their()] fist down on [the_table]!</span></b>", "<b><span class='danger'>You slam your fist down on [the_table]!</span></b>")
qdel(src)
else
user.do_attack_animation(the_table)
playsound(get_turf(the_table), 'sound/effects/tableslam.ogg', 40, TRUE)
user.visible_message("<span class='notice'>[user] slaps [user.p_their()] hand on [the_table].</span>", "<span class='notice'>You slap your hand on [the_table].</span>")
table_smacks_left--
if(table_smacks_left <= 0)
qdel(src)
/obj/item/kisser
name = "kiss"
desc = "I want you all to know, everyone and anyone, to seal it with a kiss."
icon = 'icons/mob/animal.dmi'
icon_state = "heart"
item_state = "nothing"
force = 0
throwforce = 0
flags = DROPDEL | ABSTRACT
/// The kind of projectile this version of the kiss blower fires
var/kiss_type = /obj/item/projectile/kiss
/obj/item/kisser/afterattack(atom/target, mob/user, flag, params)
var/turf/user_turf = get_turf(user)
var/obj/item/projectile/blown_kiss = new kiss_type(user_turf)
user.visible_message("<b>[user]</b> blows \a [blown_kiss] at [target]!", "<span class='notice'>You blow \a [blown_kiss] at [target]!</span>")
//Shooting Code:
blown_kiss.spread = 0
blown_kiss.original = target
blown_kiss.firer = user // don't hit ourself that would be really annoying
blown_kiss.preparePixelProjectile(target, user_turf, user, params)
blown_kiss.fire()
qdel(src)
/obj/item/kisser/death
name = "kiss of death"
desc = "If looks could kill, they'd be this."
color = COLOR_BLACK
kiss_type = /obj/item/projectile/kiss/death
/obj/item/projectile/kiss
name = "kiss"
icon = 'icons/mob/animal.dmi'
icon_state = "heart"
hitsound = 'sound/effects/kiss.ogg'
hitsound_wall = 'sound/effects/kiss.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
speed = 1.6
damage_type = BRUTE
damage = 0
nodamage = TRUE // love can't actually hurt you
armour_penetration = 100 // but if it could, it would cut through even the thickest plate
flag = "magic" // and most importantly, love is magic~
/obj/item/projectile/kiss/fire(angle)
if(firer)
name = "[name] blown by [firer]"
return ..()
/obj/item/projectile/kiss/on_hit(atom/target, blocked, hit_zone)
def_zone = BODY_ZONE_HEAD // let's keep it PG, people
. = ..()
/obj/item/projectile/kiss/death
name = "kiss of death"
nodamage = FALSE // okay i kinda lied about love not being able to hurt you
damage = 35
sharp = TRUE
color = COLOR_BLACK
/obj/item/projectile/kiss/death/on_hit(atom/target, blocked, pierce_hit)
. = ..()
if(!iscarbon(target))
return
var/mob/living/carbon/heartbreakee = target
var/obj/item/organ/internal/heart/dont_go_breakin_my_heart = heartbreakee.get_organ_slot("heart")
if(dont_go_breakin_my_heart)
dont_go_breakin_my_heart.receive_damage(999)
else // You're probably a snowflakey species or Xenomorph
heartbreakee.adjustFireLoss(1000) // the sickest of burns
@@ -2,7 +2,7 @@
var/list/buildon_types = list(/turf/simulated/wall)
/obj/item/mounted/afterattack(var/atom/A, mob/user, proximity_flag)
/obj/item/mounted/afterattack(atom/A, mob/user, proximity_flag)
var/found_type = 0
for(var/turf_type in src.buildon_types)
if(istype(A, turf_type))
@@ -44,7 +44,7 @@
/obj/item/borg/upgrade/rename/attack_self(mob/user)
heldname = stripped_input(user, "Enter new robot name", "Cyborg Reclassification", heldname, MAX_NAME_LEN)
/obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R)
/obj/item/borg/upgrade/rename/action(mob/living/silicon/robot/R)
if(..())
return
if(!R.allow_rename)
@@ -88,7 +88,7 @@
require_module = TRUE
origin_tech = "engineering=4;materials=5;programming=4"
/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
/obj/item/borg/upgrade/vtec/action(mob/living/silicon/robot/R)
if(..())
return
if(R.speed < 0)
@@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \
new/datum/stack_recipe("bloated human costume head", /obj/item/clothing/head/human_head, 5, on_floor = TRUE), \
))
/obj/item/stack/sheet/animalhide/human/New(var/loc, var/amount=null)
/obj/item/stack/sheet/animalhide/human/New(loc, amount=null)
recipes = GLOB.human_recipes
return ..()
@@ -144,7 +144,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
new/datum/stack_recipe("sinew restraints", /obj/item/restraints/handcuffs/sinew, 1, on_floor = 1), \
))
/obj/item/stack/sheet/sinew/New(var/loc, var/amount=null)
/obj/item/stack/sheet/sinew/New(loc, amount=null)
recipes = GLOB.sinew_recipes
return ..()
@@ -13,7 +13,7 @@
flags = CONDUCT
max_amount = 60
/obj/item/stack/light_w/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
/obj/item/stack/light_w/attackby(obj/item/O as obj, mob/user as mob, params)
..()
if(istype(O,/obj/item/wirecutters))
var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
@@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(metal_recipes, list(
new /obj/item/stack/sheet/runed_metal(loc, amount)
qdel(src)
/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
/obj/item/stack/sheet/metal/New(loc, amount=null)
recipes = GLOB.metal_recipes
return ..()
@@ -158,7 +158,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list(
merge_type = /obj/item/stack/sheet/plasteel
point_value = 23
/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
/obj/item/stack/sheet/plasteel/New(loc, amount=null)
recipes = GLOB.plasteel_recipes
return ..()
@@ -202,7 +202,7 @@ GLOBAL_LIST_INIT(wood_recipes, list(
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
merge_type = /obj/item/stack/sheet/wood
/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
/obj/item/stack/sheet/wood/New(loc, amount=null)
recipes = GLOB.wood_recipes
return ..()
@@ -341,7 +341,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list (
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/cardboard
/obj/item/stack/sheet/cardboard/New(var/loc, var/amt = null)
/obj/item/stack/sheet/cardboard/New(loc, amt = null)
recipes = GLOB.cardboard_recipes
return ..()
@@ -402,7 +402,7 @@ GLOBAL_LIST_INIT(cult_recipes, list ( \
/obj/item/stack/sheet/runed_metal/fifty
amount = 50
/obj/item/stack/sheet/runed_metal/New(var/loc, var/amount=null)
/obj/item/stack/sheet/runed_metal/New(loc, amount=null)
recipes = GLOB.cult_recipes
return ..()
@@ -106,8 +106,8 @@
name = "light tiles"
gender = PLURAL
singular_name = "light floor tile"
desc = "A floor tile, made out off glass. Use a multitool on it to change its color."
icon_state = "tile_light blue"
desc = "A floor tile made of glass, with an integrated light. Use a multitool on it to change its color."
icon_state = "tile_white"
force = 3
throwforce = 5
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
+1 -1
View File
@@ -12,7 +12,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "multitool"
flags = CONDUCT
force = 5.0
force = 0
w_class = WEIGHT_CLASS_SMALL
throwforce = 0
throw_range = 7
+1 -1
View File
@@ -32,7 +32,7 @@
user.visible_message("<span class='suicide'>[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return BRUTELOSS
/obj/item/screwdriver/New(loc, var/param_color = null)
/obj/item/screwdriver/New(loc, param_color = null)
..()
if(random_color)
if(!param_color)
+7 -15
View File
@@ -271,7 +271,7 @@
w_class = WEIGHT_CLASS_TINY
var/ash_type = /obj/effect/decal/cleanable/ash
/obj/item/toy/snappop/proc/pop_burst(var/n=3, var/c=1)
/obj/item/toy/snappop/proc/pop_burst(n=3, c=1)
do_sparks(n, c, src)
new ash_type(loc)
visible_message("<span class='warning'>[src] explodes!</span>",
@@ -1226,6 +1226,7 @@
icon = 'icons/obj/library.dmi'
icon_state = "demonomicon"
w_class = WEIGHT_CLASS_SMALL
var/list/messages = list("You must challenge the devil to a dance-off!", "The devils true name is Ian", "The devil hates salt!", "Would you like infinite power?", "Would you like infinite wisdom?", " Would you like infinite healing?")
var/cooldown = FALSE
/obj/item/toy/codex_gigas/attack_self(mob/user)
@@ -1234,21 +1235,12 @@
"<span class='notice'>[user] presses the button on \the [src].</span>",
"<span class='notice'>You press the button on \the [src].</span>",
"<span class='notice'>You hear a soft click.</span>")
var/list/messages = list()
var/datum/devilinfo/devil = randomDevilInfo()
messages += "Some fun facts about: [devil.truename]"
messages += "[GLOB.lawlorify[LORE][devil.bane]]"
messages += "[GLOB.lawlorify[LORE][devil.obligation]]"
messages += "[GLOB.lawlorify[LORE][devil.ban]]"
messages += "[GLOB.lawlorify[LORE][devil.banish]]"
playsound(loc, 'sound/machines/click.ogg', 20, 1)
playsound(loc, 'sound/machines/click.ogg', 20, TRUE)
cooldown = TRUE
for(var/message in messages)
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 60)
for(var/message in pick(messages))
user.loc.visible_message("<span class='danger'>[bicon(src)] [message]</span>")
sleep(10)
spawn(20)
cooldown = FALSE
return
/obj/item/toy/owl
name = "owl action figure"
@@ -1372,7 +1364,7 @@
var/cooldown = 0
var/obj/stored_minature = null
/obj/item/toy/minigibber/attack_self(var/mob/user)
/obj/item/toy/minigibber/attack_self(mob/user)
if(stored_minature)
to_chat(user, "<span class='danger'>\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!</span>")
@@ -1385,7 +1377,7 @@
playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1)
cooldown = world.time
/obj/item/toy/minigibber/attackby(var/obj/O, var/mob/user, params)
/obj/item/toy/minigibber/attackby(obj/O, mob/user, params)
if(istype(O,/obj/item/toy/character) && O.loc == user)
to_chat(user, "<span class='notice'>You start feeding \the [O] [bicon(O)] into \the [src]'s mini-input.</span>")
if(do_after(user, 10, target = src))
+2 -2
View File
@@ -52,12 +52,12 @@
icon_state = "waffles"
/obj/item/trash/plate
name = "Plate"
name = "plate"
icon_state = "plate"
resistance_flags = NONE
/obj/item/trash/snack_bowl
name = "Snack bowl"
name = "snack bowl"
icon_state = "snack_bowl"
/obj/item/trash/fried_vox
+26 -26
View File
@@ -22,7 +22,7 @@ AI MODULES
materials = list(MAT_GOLD=50)
var/datum/ai_laws/laws = null
/obj/item/aiModule/proc/install(var/obj/machinery/computer/C)
/obj/item/aiModule/proc/install(obj/machinery/computer/C)
if(istype(C, /obj/machinery/computer/aiupload))
var/obj/machinery/computer/aiupload/comp = C
if(comp.stat & NOPOWER)
@@ -72,7 +72,7 @@ AI MODULES
to_chat(usr, "<span class='notice'>Upload complete. The robot's laws have been modified.</span>")
/obj/item/aiModule/proc/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/proc/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
log_law_changes(target, sender)
if(laws)
@@ -82,12 +82,12 @@ AI MODULES
to_chat(target, "[sender] has uploaded a change to the laws you must follow, using \an [src]. From now on: ")
target.show_laws()
/obj/item/aiModule/proc/log_law_changes(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/proc/log_law_changes(mob/living/silicon/ai/target, mob/sender)
var/time = time2text(world.realtime,"hh:mm:ss")
GLOB.lawchanges.Add("[time] <B>:</B> [sender.name]([sender.key]) used [src.name] on [target.name]([target.key])")
log_and_message_admins("used [src.name] on [target.name]([target.key])")
/obj/item/aiModule/proc/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/proc/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
/******************** Safeguard ********************/
@@ -97,19 +97,19 @@ AI MODULES
desc = "A 'safeguard' AI module: 'Safeguard <name>. Individuals that threaten <name> are not crew and must be eliminated.'"
origin_tech = "programming=3;materials=3"
/obj/item/aiModule/safeguard/attack_self(var/mob/user as mob)
/obj/item/aiModule/safeguard/attack_self(mob/user as mob)
..()
var/targName = stripped_input(usr, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name)
targetName = targName
desc = text("A 'safeguard' AI module: 'Safeguard []. Individuals that threaten [] are not crew and must be eliminated.'", targetName, targetName)
/obj/item/aiModule/safeguard/install(var/obj/machinery/computer/C)
/obj/item/aiModule/safeguard/install(obj/machinery/computer/C)
if(!targetName)
to_chat(usr, "No name detected on module, please enter one.")
return 0
..()
/obj/item/aiModule/safeguard/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/safeguard/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = text("Safeguard []. Individuals that threaten [] are not crew and must be eliminated.'", targetName, targetName)
to_chat(target, law)
@@ -123,19 +123,19 @@ AI MODULES
desc = "A 'one human' AI module: 'Only <name> is crew.'"
origin_tech = "programming=4;materials=4"
/obj/item/aiModule/oneCrewMember/attack_self(var/mob/user as mob)
/obj/item/aiModule/oneCrewMember/attack_self(mob/user as mob)
..()
var/targName = stripped_input(usr, "Please enter the name of the person who is the only crew.", "Who?", user.real_name)
targetName = targName
desc = text("A 'one human' AI module: 'Only [] is crew.'", targetName)
/obj/item/aiModule/oneCrewMember/install(var/obj/machinery/computer/C)
/obj/item/aiModule/oneCrewMember/install(obj/machinery/computer/C)
if(!targetName)
to_chat(usr, "No name detected on module, please enter one.")
return 0
..()
/obj/item/aiModule/oneCrewMember/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/oneCrewMember/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "Only [targetName] is crew."
if(!is_special_character(target)) // Makes sure the AI isn't a traitor before changing their law 0. --NeoFite
@@ -153,10 +153,10 @@ AI MODULES
desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized.'"
origin_tech = "programming=4;materials=4" //made of gold
/obj/item/aiModule/protectStation/attack_self(var/mob/user as mob)
/obj/item/aiModule/protectStation/attack_self(mob/user as mob)
..()
/obj/item/aiModule/protectStation/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/protectStation/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "Protect the space station against damage. Anyone you see harming the station is to be no longer considered crew, and is a threat to the station which must be neutralized."
to_chat(target, law)
@@ -168,10 +168,10 @@ AI MODULES
desc = "A 'OxygenIsToxicToHumans' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'"
origin_tech = "programming=4;biotech=2;materials=4"
/obj/item/aiModule/oxygen/attack_self(var/mob/user as mob)
/obj/item/aiModule/oxygen/attack_self(mob/user as mob)
..()
/obj/item/aiModule/oxygen/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/oxygen/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member."
to_chat(target, law)
@@ -185,7 +185,7 @@ AI MODULES
desc = "A 'freeform' AI module: '<freeform>'"
origin_tech = "programming=4;materials=4"
/obj/item/aiModule/freeform/attack_self(var/mob/user as mob)
/obj/item/aiModule/freeform/attack_self(mob/user as mob)
..()
var/new_lawpos = input("Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) as num
if(new_lawpos < MIN_SUPPLIED_LAW_NUMBER) return
@@ -195,7 +195,7 @@ AI MODULES
newFreeFormLaw = targName
desc = "A 'freeform' AI module: ([lawpos]) '[newFreeFormLaw]'"
/obj/item/aiModule/freeform/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/freeform/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "[newFreeFormLaw]"
to_chat(target, law)
@@ -204,7 +204,7 @@ AI MODULES
target.add_supplied_law(lawpos, law)
GLOB.lawchanges.Add("The law was '[newFreeFormLaw]'")
/obj/item/aiModule/freeform/install(var/obj/machinery/computer/C)
/obj/item/aiModule/freeform/install(obj/machinery/computer/C)
if(!newFreeFormLaw)
to_chat(usr, "No law detected on module, please create one.")
return 0
@@ -217,7 +217,7 @@ AI MODULES
desc = "A 'reset' AI module: 'Clears all laws except for the core laws.'"
origin_tech = "programming=3;materials=2"
/obj/item/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/reset/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
log_law_changes(target, sender)
if(!is_special_character(target))
@@ -234,7 +234,7 @@ AI MODULES
desc = "A 'purge' AI Module: 'Purges all laws.'"
origin_tech = "programming=5;materials=4"
/obj/item/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/purge/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
..()
if(!is_special_character(target))
target.clear_zeroth_law()
@@ -320,20 +320,20 @@ AI MODULES
desc = "A 'freeform' Core AI module: '<freeform>'"
origin_tech = "programming=5;materials=4"
/obj/item/aiModule/freeformcore/attack_self(var/mob/user as mob)
/obj/item/aiModule/freeformcore/attack_self(mob/user as mob)
..()
var/newlaw = ""
var/targName = stripped_input(usr, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw)
newFreeFormLaw = targName
desc = "A 'freeform' Core AI module: '[newFreeFormLaw]'"
/obj/item/aiModule/freeformcore/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/freeformcore/addAdditionalLaws(mob/living/silicon/ai/target, mob/sender)
..()
var/law = "[newFreeFormLaw]"
target.add_inherent_law(law)
GLOB.lawchanges.Add("The law is '[newFreeFormLaw]'")
/obj/item/aiModule/freeformcore/install(var/obj/machinery/computer/C)
/obj/item/aiModule/freeformcore/install(obj/machinery/computer/C)
if(!newFreeFormLaw)
to_chat(usr, "No law detected on module, please create one.")
return 0
@@ -346,14 +346,14 @@ AI MODULES
desc = "A hacked AI law module: '<freeform>'"
origin_tech = "programming=5;materials=5;syndicate=5"
/obj/item/aiModule/syndicate/attack_self(var/mob/user as mob)
/obj/item/aiModule/syndicate/attack_self(mob/user as mob)
..()
var/newlaw = ""
var/targName = stripped_input(usr, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw,MAX_MESSAGE_LEN)
newFreeFormLaw = targName
desc = "A hacked AI law module: '[newFreeFormLaw]'"
/obj/item/aiModule/syndicate/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/syndicate/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
// ..() //We don't want this module reporting to the AI who dun it. --NEO
log_law_changes(target, sender)
@@ -363,7 +363,7 @@ AI MODULES
target.add_ion_law(law)
target.show_laws()
/obj/item/aiModule/syndicate/install(var/obj/machinery/computer/C)
/obj/item/aiModule/syndicate/install(obj/machinery/computer/C)
if(!newFreeFormLaw)
to_chat(usr, "No law detected on module, please create one.")
return 0
@@ -378,7 +378,7 @@ AI MODULES
origin_tech = "programming=6;materials=5;syndicate=6"
laws = list("")
/obj/item/aiModule/toyAI/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
/obj/item/aiModule/toyAI/transmitInstructions(mob/living/silicon/ai/target, mob/sender)
//..()
to_chat(target, "<span class='warning'>KRZZZT</span>")
target.add_ion_law(laws[1])
+11 -10
View File
@@ -157,7 +157,7 @@
/obj/item/card/id/proc/UpdateName()
name = "[src.registered_name]'s ID Card ([src.assignment])"
/obj/item/card/id/proc/SetOwnerInfo(var/mob/living/carbon/human/H)
/obj/item/card/id/proc/SetOwnerInfo(mob/living/carbon/human/H)
if(!H || !H.dna)
return
@@ -332,11 +332,12 @@
var/list/initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_EXTERNAL_AIRLOCKS)
origin_tech = "syndicate=1"
var/registered_user = null
untrackable = 1
var/anyone = FALSE //Can anyone forge the ID or just syndicate?
untrackable = TRUE
/obj/item/card/id/syndicate/anyone
anyone = TRUE
/obj/item/card/id/syndicate/researcher
initial_access = list(ACCESS_SYNDICATE)
assignment = "Syndicate Researcher"
icon_state = "syndie"
/obj/item/card/id/syndicate/New()
access = initial_access.Copy()
@@ -350,19 +351,19 @@
initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS)
icon_state = "commander"
/obj/item/card/id/syndicate/afterattack(var/obj/item/O as obj, mob/user as mob, proximity)
/obj/item/card/id/syndicate/afterattack(obj/item/O as obj, mob/user as mob, proximity)
if(!proximity)
return
if(istype(O, /obj/item/card/id))
var/obj/item/card/id/I = O
if(istype(user, /mob/living) && user.mind)
if(user.mind.special_role || anyone)
if(user.mind.special_role)
to_chat(usr, "<span class='notice'>The card's microscanners activate as you pass it over \the [I], copying its access.</span>")
src.access |= I.access //Don't copy access if user isn't an antag -- to prevent metagaming
/obj/item/card/id/syndicate/attack_self(mob/user as mob)
if(!src.registered_name)
var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name))
var/t = reject_bad_name(input(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name), TRUE)
if(!t)
to_chat(user, "<span class='warning'>Invalid name.</span>")
return
@@ -601,7 +602,7 @@
registered_name = "Syndicate"
icon_state = "syndie"
assignment = "Syndicate Overlord"
untrackable = 1
untrackable = TRUE
access = list(ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS)
/obj/item/card/id/captains_spare
@@ -623,7 +624,7 @@
item_state = "gold_id"
registered_name = "Admin"
assignment = "Testing Shit"
untrackable = 1
untrackable = TRUE
/obj/item/card/id/admin/New()
access = get_absolutely_all_accesses()
@@ -13,7 +13,7 @@
var/obj/item/gun/energy/chrono_gun/PA = null
var/list/erased_minds = list() //a collection of minds from the dead
/obj/item/chrono_eraser/proc/pass_mind(var/datum/mind/M)
/obj/item/chrono_eraser/proc/pass_mind(datum/mind/M)
erased_minds += M
/obj/item/chrono_eraser/dropped()
@@ -113,7 +113,7 @@
field_disconnect(F)
return 0
/obj/item/gun/energy/chrono_gun/proc/pass_mind(var/datum/mind/M)
/obj/item/gun/energy/chrono_gun/proc/pass_mind(datum/mind/M)
if(TED)
TED.pass_mind(M)
+13 -10
View File
@@ -187,7 +187,7 @@
QDEL_NULL(cell)
return ..()
/obj/item/defibrillator/proc/deductcharge(var/chrgdeductamt)
/obj/item/defibrillator/proc/deductcharge(chrgdeductamt)
if(cell)
if(cell.charge < (paddles.revivecost+chrgdeductamt))
powered = FALSE
@@ -199,7 +199,7 @@
update_icon()
return FALSE
/obj/item/defibrillator/proc/cooldowncheck(var/mob/user)
/obj/item/defibrillator/proc/cooldowncheck(mob/user)
spawn(50)
if(cell)
if(cell.charge >= paddles.revivecost)
@@ -310,7 +310,7 @@
if(!t.Adjacent(user))
defib.remove_paddles(user)
/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O)
/obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, mob/living/carbon/human/M, obj/O)
if(!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns
M.unEquip(O)
qdel(O)
@@ -363,7 +363,7 @@
if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("<span class='notice'>[user] places [src] on [M.name]'s chest.</span>", "<span class='warning'>You place [src] on [M.name]'s chest.</span>")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
var/mob/dead/observer/ghost = H.get_ghost(TRUE)
if(ghost && !ghost.client)
// In case the ghost's not getting deleted for some reason
H.key = ghost.key
@@ -420,7 +420,7 @@
for(var/obj/item/organ/external/O in H.bodyparts)
total_brute += O.brute_dam
total_burn += O.burn_dam
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK) && !HAS_TRAIT(H, TRAIT_BADDNA) && (H.mind && H.mind.is_revivable()) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime)))
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK) && !HAS_TRAIT(H, TRAIT_BADDNA) && (H.get_int_organ(/obj/item/organ/internal/heart) || H.get_int_organ(/obj/item/organ/internal/brain/slime)))
tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
H.adjustOxyLoss(tobehealed)
@@ -446,10 +446,13 @@
else if(total_burn >= 180 || total_brute >= 180)
user.visible_message("<span class='boldnotice'>[defib] buzzes: Resuscitation failed - Severe tissue damage detected.</span>")
else if(ghost)
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
if(!ghost.can_reenter_corpse) // DNR or AntagHUD
user.visible_message("<span class='notice'>[defib] buzzes: Resucitation failed: No electrical brain activity detected.</span>")
else
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed: Patient's brain is unresponsive. Further attempts may succeed.</span>")
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
ghost << sound('sound/effects/genetics.ogg')
else
user.visible_message("<span class='notice'>[defib] buzzes: Resuscitation failed.</span>")
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
@@ -539,7 +542,7 @@
for(var/obj/item/organ/external/O in H.bodyparts)
total_brute += O.brute_dam
total_burn += O.burn_dam
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK) && (H.mind && H.mind.is_revivable()))
if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !HAS_TRAIT(H, TRAIT_HUSK))
tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
H.adjustOxyLoss(tobehealed)
@@ -37,7 +37,7 @@
else
to_chat(user, "<span class='warning'>You failed to inject [M].</span>")
/obj/item/dnascrambler/proc/injected(var/mob/living/carbon/human/target, var/mob/living/carbon/user)
/obj/item/dnascrambler/proc/injected(mob/living/carbon/human/target, mob/living/carbon/user)
if(istype(target))
var/mob/living/carbon/human/H = target
scramble(1, H, 100)
@@ -109,8 +109,6 @@
message_say = "FOR THE REVOLOUTION!"
else if(role == "death commando" || role == ROLE_ERT)
message_say = "FOR NANOTRASEN!"
else if(role == ROLE_DEVIL)
message_say = "FOR INFERNO!"
user.say(message_say)
target = user
sleep(10)
@@ -57,7 +57,7 @@
to_chat(user, "The safety is [safety ? "on" : "off"].")
return
/obj/item/extinguisher/attack_obj(obj/O, mob/living/user)
/obj/item/extinguisher/attack_obj(obj/O, mob/living/user, params)
if(AttemptRefill(O, user))
refilling = TRUE
return FALSE
@@ -37,7 +37,7 @@
var/fillamt = 0
/obj/item/grenade/bananade/casing/attackby(var/obj/item/I, mob/user as mob, params)
/obj/item/grenade/bananade/casing/attackby(obj/item/I, mob/user as mob, params)
if(istype(I, /obj/item/grown/bananapeel))
if(fillamt < 9)
to_chat(usr, "<span class='notice'>You add another banana peel to the assembly.</span>")
@@ -304,7 +304,7 @@
qdel(src)
/obj/item/grenade/chem_grenade/proc/CreateDefaultTrigger(var/typekey)
/obj/item/grenade/chem_grenade/proc/CreateDefaultTrigger(typekey)
if(ispath(typekey,/obj/item/assembly))
nadeassembly = new(src)
if(nadeassembly.has_prox_sensors())
@@ -457,7 +457,7 @@
/obj/item/grenade/chem_grenade/firefighting
payload_name = "fire fighting grenade"
payload_name = "fire fighting"
desc = "Can help to put out dangerous fires from a distance."
stage = READY
@@ -37,7 +37,7 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "clusterbang_segment"
/obj/item/grenade/clusterbuster/segment/New(var/loc, var/payload_type = /obj/item/grenade/flashbang/cluster)
/obj/item/grenade/clusterbuster/segment/New(loc, payload_type = /obj/item/grenade/flashbang/cluster)
..()
icon_state = "clusterbang_segment_active"
payload = payload_type
@@ -58,7 +58,7 @@
//////////////////////////////////
//The payload spawner effect
/////////////////////////////////
/obj/effect/payload_spawner/New(var/turf/newloc,var/type, var/numspawned as num)
/obj/effect/payload_spawner/New(turf/newloc, type, numspawned as num)
. = ..()
for(var/loop = numspawned ,loop > 0, loop--)
var/obj/item/grenade/P = new type(loc)
@@ -21,7 +21,7 @@
if(!QDELETED(src))
qdel(src)
/obj/item/grenade/proc/clown_check(var/mob/living/user)
/obj/item/grenade/proc/clown_check(mob/living/user)
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
to_chat(user, "<span class='warning'>Huh? How does this thing work?</span>")
active = 1
+6 -1
View File
@@ -145,7 +145,7 @@
desc = "Use this to keep prisoners in line. Or you know, your significant other."
icon_state = "pinkcuffs"
/obj/item/restraints/handcuffs/cable/attackby(var/obj/item/I, mob/user as mob, params)
/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user as mob, params)
..()
if(istype(I, /obj/item/stack/rods))
var/obj/item/stack/rods/R = I
@@ -192,5 +192,10 @@
desc = "A pair of broken zipties."
icon_state = "cuff_white_used"
/obj/item/restraints/handcuffs/cable/zipties/used/decompile_act(obj/item/matter_decompiler/C, mob/user)
C.stored_comms["glass"] += 1
qdel(src)
return TRUE
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
return
@@ -39,7 +39,7 @@
if(ishuman(M) && M.mind?.vampire)
if(!M.mind.vampire.get_ability(/datum/vampire_passive/full))
to_chat(M, "<span class='warning'>The nullrod's power interferes with your own!</span>")
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
M.mind.vampire.adjust_nullification(5, 2)
/obj/item/nullrod/pickup(mob/living/user)
. = ..()
@@ -471,12 +471,12 @@
if(target.mind)
if(iscultist(target))
SSticker.mode.remove_cultist(target.mind) // This proc will handle message generation.
SSticker.mode.remove_cultist(target.mind, TRUE, TRUE) // This proc will handle message generation.
praying = FALSE
return
if(target.mind.vampire && !target.mind.vampire.get_ability(/datum/vampire_passive/full)) // Getting a full prayer off on a vampire will interrupt their powers for a large duration.
target.mind.vampire.nullified = max(120, target.mind.vampire.nullified + 120)
target.mind.vampire.adjust_nullification(120, 50)
to_chat(target, "<span class='userdanger'>[user]'s prayer to [SSticker.Bible_deity_name] has interfered with your power!</span>")
praying = FALSE
return
@@ -500,7 +500,7 @@
if(holder.l_hand == src || holder.r_hand == src) // Holding this in your hand will
for(var/mob/living/carbon/human/H in range(5, loc))
if(H.mind && H.mind.vampire && !H.mind.vampire.get_ability(/datum/vampire_passive/full))
H.mind.vampire.nullified = max(5, H.mind.vampire.nullified + 2)
H.mind.vampire.adjust_nullification(5, 2)
if(prob(10))
to_chat(H, "<span class='userdanger'>Being in the presence of [holder]'s [src] is interfering with your powers!</span>")
@@ -28,7 +28,7 @@
//return 1 if the implant injects
//return -1 if the implant fails to inject
//return 0 if there is no room for implant
/obj/item/implant/proc/implant(var/mob/source, var/mob/user)
/obj/item/implant/proc/implant(mob/source, mob/user)
var/obj/item/implant/imp_e = locate(src.type) in source
if(!allow_multiple && imp_e && imp_e != src)
if(imp_e.uses < initial(imp_e.uses)*2)
@@ -58,7 +58,7 @@
return 1
/obj/item/implant/proc/removed(var/mob/source)
/obj/item/implant/proc/removed(mob/source)
src.loc = null
imp_in = null
implanted = 0
@@ -38,7 +38,7 @@
home = console.pad
return 1
/obj/item/implant/abductor/proc/get_team_console(var/team)
/obj/item/implant/abductor/proc/get_team_console(team)
var/obj/machinery/abductor/console/console
for(var/obj/machinery/abductor/console/c in GLOB.abductor_equipment)
if(c.team == team)
@@ -31,7 +31,7 @@
else if(M.stat == DEAD)
activate("death")
/obj/item/implant/death_alarm/activate(var/cause)
/obj/item/implant/death_alarm/activate(cause)
var/mob/M = imp_in
var/area/t = get_area(M)
@@ -3,6 +3,7 @@
desc = "And boom goes the weasel."
icon_state = "explosive"
origin_tech = "materials=2;combat=3;biotech=4;syndicate=4"
actions_types = list(/datum/action/item_action/hands_free/activate/always)
var/weak = 2
var/medium = 0.8
var/heavy = 0.4
@@ -135,6 +136,7 @@
desc = "An alarm which monitors host vital signs, transmitting a radio message and dusting the corpse on death."
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
actions_types = list(/datum/action/item_action/hands_free/activate/always)
/obj/item/implant/dust/get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
@@ -33,7 +33,7 @@
return 1
return 0
/obj/item/implant/mindshield/removed(mob/target, var/silent = 0)
/obj/item/implant/mindshield/removed(mob/target, silent = 0)
if(..())
if(target.stat != DEAD && !silent)
to_chat(target, "<span class='boldnotice'>You feel a sense of liberation as Nanotrasen's grip on your mind fades away.</span>")
+1 -1
View File
@@ -838,7 +838,7 @@
/obj/item/book/manual/chef_recipes
name = "Chef Recipes"
icon_state = "cooked_book"
icon_state = "cook_book"
author = "NanoTrasen"
title = "Chef Recipes"
dat = {"
@@ -133,7 +133,7 @@
/obj/item/melee/energy/sword/cyborg
var/hitcost = 50
/obj/item/melee/energy/sword/cyborg/attack(mob/M, var/mob/living/silicon/robot/R)
/obj/item/melee/energy/sword/cyborg/attack(mob/M, mob/living/silicon/robot/R)
if(R.cell)
var/obj/item/stock_parts/cell/C = R.cell
if(active && !(C.use(hitcost)))
@@ -88,7 +88,7 @@
Fire(user, target)
/obj/item/pneumatic_cannon/proc/Fire(var/mob/living/carbon/human/user, var/atom/target)
/obj/item/pneumatic_cannon/proc/Fire(mob/living/carbon/human/user, atom/target)
if(!istype(user) && !target)
return
var/discharge = 0
@@ -137,7 +137,7 @@
/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
name = "Pneumatic Cannon"
result = /obj/item/pneumatic_cannon/ghetto
result = list(/obj/item/pneumatic_cannon/ghetto)
tools = list(TOOL_WELDER, TOOL_WRENCH)
reqs = list(/obj/item/stack/sheet/metal = 4,
/obj/item/stack/packageWrap = 8,
+1 -1
View File
@@ -86,7 +86,7 @@
if(delay)
lastused = world.time
/obj/item/rpd/proc/can_dispense_pipe(var/pipe_id, var/pipe_type) //Returns TRUE if this is a legit pipe we can dispense, otherwise returns FALSE
/obj/item/rpd/proc/can_dispense_pipe(pipe_id, pipe_type) //Returns TRUE if this is a legit pipe we can dispense, otherwise returns FALSE
for(var/list/L in GLOB.rpd_pipe_list)
if(pipe_type != L["pipe_type"]) //Sometimes pipes in different categories have the same pipe_id, so we need to skip anything not in the category we want
continue
+1 -1
View File
@@ -43,7 +43,7 @@
attack_self(H)
return
/obj/item/teleportation_scroll/proc/teleportscroll(var/mob/user)
/obj/item/teleportation_scroll/proc/teleportscroll(mob/user)
var/A
+1 -1
View File
@@ -38,7 +38,7 @@
/datum/crafting_recipe/picket_sign
name = "Picket Sign"
result = /obj/item/picket_sign
result = list(/obj/item/picket_sign)
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/cardboard = 2)
time = 80
+6 -1
View File
@@ -43,7 +43,7 @@
if(wielded)
to_chat(user, "<span class='notice'>You hold \the [src] between your legs.</span>")
/obj/item/twohanded/staff/broom/attackby(var/obj/O, mob/user)
/obj/item/twohanded/staff/broom/attackby(obj/O, mob/user)
if(istype(O, /obj/item/clothing/mask/horsehead))
new/obj/item/twohanded/staff/broom/horsebroom(get_turf(src))
user.unEquip(O)
@@ -52,6 +52,11 @@
return
..()
/obj/item/twohanded/staff/broom/dropped(mob/user)
if((user.mind in SSticker.mode.wizards) && user.flying)
user.flying = FALSE
..()
/obj/item/twohanded/staff/broom/horsebroom
name = "broomstick horse"
desc = "Saddle up!"
@@ -54,7 +54,7 @@
//Sorts stock parts inside an RPED by their rating.
//Only use /obj/item/stock_parts/ with this sort proc!
/proc/cmp_rped_sort(var/obj/item/stock_parts/A, var/obj/item/stock_parts/B)
/proc/cmp_rped_sort(obj/item/stock_parts/A, obj/item/stock_parts/B)
return B.rating - A.rating
/obj/item/stock_parts
@@ -366,6 +366,22 @@
item_state = "assault"
storage_slots = 6
/obj/item/storage/belt/military/assault/marines/full/populate_contents()
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m45(src)
new /obj/item/ammo_box/magazine/m45(src)
update_icon()
/obj/item/storage/belt/military/assault/marines/elite/full/populate_contents()
new /obj/item/ammo_box/magazine/m556/arg(src)
new /obj/item/ammo_box/magazine/m556/arg(src)
new /obj/item/ammo_box/magazine/m556/arg(src)
new /obj/item/ammo_box/magazine/m45(src)
new /obj/item/ammo_box/magazine/m45(src)
update_icon()
/obj/item/storage/belt/janitor
name = "janibelt"
desc = "A belt used to hold most janitorial supplies."
@@ -121,19 +121,21 @@
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonbox"
w_class = WEIGHT_CLASS_SMALL
storage_slots = 6
storage_slots = 8
icon_type = "crayon"
can_hold = list(
/obj/item/toy/crayon
)
/obj/item/storage/fancy/crayons/populate_contents()
new /obj/item/toy/crayon/white(src)
new /obj/item/toy/crayon/red(src)
new /obj/item/toy/crayon/orange(src)
new /obj/item/toy/crayon/yellow(src)
new /obj/item/toy/crayon/green(src)
new /obj/item/toy/crayon/blue(src)
new /obj/item/toy/crayon/purple(src)
new /obj/item/toy/crayon/black(src)
update_icon()
/obj/item/storage/fancy/crayons/update_icon()
@@ -76,6 +76,10 @@
if(!cell)
return
cell.use(amount)
if(cell.rigged)
cell = null
turned_on = FALSE
update_icon()
if(cell.charge < (hitcost)) // If after the deduction the baton doesn't have enough charge for a stun hit it turns off.
turned_on = FALSE
update_icon()
@@ -141,7 +141,7 @@
/obj/item/reagent_containers/spray/mister/attack_self()
return
/proc/check_tank_exists(parent_tank, var/mob/living/carbon/human/M, var/obj/O)
/proc/check_tank_exists(parent_tank, mob/living/carbon/human/M, obj/O)
if(!parent_tank || !istype(parent_tank, /obj/item/watertank)) //To avoid weird issues from admin spawns
M.unEquip(O)
qdel(0)
@@ -182,7 +182,7 @@
/obj/item/watertank/janitor/make_noz()
return new /obj/item/reagent_containers/spray/mister/janitor(src)
/obj/item/reagent_containers/spray/mister/janitor/attack_self(var/mob/user)
/obj/item/reagent_containers/spray/mister/janitor/attack_self(mob/user)
amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10)
to_chat(user, "<span class='notice'>You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.</span>")
+1 -1
View File
@@ -8,7 +8,7 @@
amount = 25
max_amount = 25
/obj/item/stack/tape_roll/New(var/loc, var/amount=null)
/obj/item/stack/tape_roll/New(loc, amount=null)
..()
update_icon()
+2 -75
View File
@@ -638,7 +638,7 @@
/obj/item/twohanded/singularityhammer
name = "singularity hammer"
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
icon_state = "mjollnir0"
icon_state = "singulohammer0"
flags = CONDUCT
slot_flags = SLOT_BACK
force = 5
@@ -665,7 +665,7 @@
charged++
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "mjollnir[wielded]"
icon_state = "singulohammer[wielded]"
..()
/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
@@ -806,76 +806,3 @@
Z.ex_act(2)
charged = 3
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
/obj/item/twohanded/pitchfork
icon_state = "pitchfork0"
name = "pitchfork"
desc = "A simple tool used for moving hay."
force = 7
throwforce = 15
w_class = WEIGHT_CLASS_BULKY
force_unwielded = 7
force_wielded = 15
attack_verb = list("attacked", "impaled", "pierced")
hitsound = 'sound/weapons/bladeslice.ogg'
max_integrity = 200
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30)
resistance_flags = FIRE_PROOF
/obj/item/twohanded/pitchfork/demonic
name = "demonic pitchfork"
desc = "A red pitchfork, it looks like the work of the devil."
force = 19
throwforce = 24
force_unwielded = 19
force_wielded = 25
/obj/item/twohanded/pitchfork/demonic/greater
force = 24
throwforce = 50
force_unwielded = 24
force_wielded = 34
/obj/item/twohanded/pitchfork/demonic/ascended
force = 100
throwforce = 100
force_unwielded = 100
force_wielded = 500000 // Kills you DEAD.
/obj/item/twohanded/pitchfork/update_icon()
icon_state = "pitchfork[wielded]"
/obj/item/twohanded/pitchfork/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] impales \himself in \his abdomen with [src]! It looks like \he's trying to commit suicide...</span>")
return BRUTELOSS
/obj/item/twohanded/pitchfork/demonic/pickup(mob/user)
. = ..()
if(istype(user, /mob/living))
var/mob/living/U = user
if(U.mind && !U.mind.devilinfo && (U.mind.soulOwner == U.mind)) //Burn hands unless they are a devil or have sold their soul
U.visible_message("<span class='warning'>As [U] picks [src] up, [U]'s arms briefly catch fire.</span>", \
"<span class='warning'>\"As you pick up the [src] your arms ignite, reminding you of all your past sins.\"</span>")
if(ishuman(U))
var/mob/living/carbon/human/H = U
H.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
else
U.adjustFireLoss(rand(force/2,force))
/obj/item/twohanded/pitchfork/demonic/attack(mob/target, mob/living/carbon/human/user)
if(user.mind && !user.mind.devilinfo && (user.mind.soulOwner != user.mind))
to_chat(user, "<span class ='warning'>The [src] burns in your hands.</span>")
user.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
..()
// It's no fun being the lord of all hell if you can't get out of a simple room
/obj/item/twohanded/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity)
if(!proximity || !wielded)
return
if(istype(target, /turf/simulated/wall))
var/turf/simulated/wall/W = target
user.visible_message("<span class='danger'>[user] blasts \the [target] with \the [src]!</span>")
playsound(target, 'sound/magic/Disintegrate.ogg', 100, 1)
W.devastate_wall(TRUE)
return 1
..()