mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-31 07:57:47 +01:00
Merge remote-tracking branch 'upstream/master' into I-guess-I-port-stuff-now-huh
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]°C ([H.bodytemperature*1.8-459.67]°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>")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
Reference in New Issue
Block a user