Merge remote-tracking branch 'ParadiseSS13/master' into id_computer_demote_terminate_freejob

This commit is contained in:
Kyep
2020-05-25 16:09:55 -07:00
449 changed files with 19866 additions and 102474 deletions
@@ -112,7 +112,8 @@ GLOBAL_LIST_EMPTY(splatter_cache)
/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose
name = "blood"
icon_state = "ltrails_1"
icon = 'icons/effects/effects.dmi'
icon_state = "nothing"
desc = "Your instincts say you shouldn't be following these."
gender = PLURAL
density = FALSE
@@ -289,7 +289,6 @@
/obj/item/clothing/glasses/thermal = 1,
/obj/item/chameleon = 1,
/obj/item/reagent_containers/hypospray/autoinjector/stimulants = 1,
/obj/item/storage/box/syndie_kit/atmosn2ogrenades = 1,
/obj/item/grenade/plastic/x4 = 1)
@@ -304,11 +303,6 @@
/turf/simulated/wall/mineral/plastitanium/nodiagonal = 2,
/obj/structure/falsewall/plastitanium = 2)
/obj/effect/spawner/random_spawners/syndicate/layout/door/secret
name = "50pc falsewall 50pc wall"
result = list(/turf/simulated/wall/mineral/plastitanium/nodiagonal = 1,
/obj/structure/falsewall/plastitanium = 1)
/obj/effect/spawner/random_spawners/syndicate/layout/door/vault
name = "80pc vaultdoor 20pc wall"
result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 4,
-1
View File
@@ -59,7 +59,6 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
var/put_on_delay = DEFAULT_ITEM_PUTON_DELAY
var/breakouttime = 0
var/flags_cover = 0 //for flags such as GLASSESCOVERSEYES
var/flags_size = 0 //flag, primarily used for clothing to determine if a fatty can wear something or not.
var/block_chance = 0
var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom
+2
View File
@@ -328,3 +328,5 @@
desc = "A digital copy of the station blueprints stored in your memory."
fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station."
/obj/item/areaeditor/blueprints/ce
@@ -14,8 +14,12 @@
var/list/list_enginebeacons = list()
var/isactive = FALSE
/obj/item/enginepicker/Destroy()
list_enginebeacons.Cut()
return ..()
/obj/item/enginepicker/attack_self(mob/living/carbon/user)
if(usr.stat || !usr.canmove || usr.restrained())
if(user.incapacitated())
return
if(!isactive)
+22 -20
View File
@@ -84,27 +84,29 @@
/obj/item/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, targeted = 1)
add_attack_logs(user, M, "Flashed with [src]")
if(user && targeted)
if(M.weakeyes)
M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash
if(M.flash_eyes(1, 1))
M.AdjustConfused(power)
terrible_conversion_proc(M, user)
M.Stun(1)
visible_message("<span class='disarm'>[user] blinds [M] with the flash!</span>")
to_chat(user, "<span class='danger'>You blind [M] with the flash!</span>")
to_chat(M, "<span class='userdanger'>[user] blinds you with the flash!</span>")
if(user)
add_attack_logs(user, M, "Flashed with [src]")
if(targeted)
if(M.weakeyes)
M.Stun(2)
M.visible_message("<span class='disarm'>[M] gasps and shields [M.p_their()] eyes!</span>", "<span class='userdanger'>You gasp and shields your eyes!</span>")
else
visible_message("<span class='disarm'>[user] fails to blind [M] with the flash!</span>")
to_chat(user, "<span class='warning'>You fail to blind [M] with the flash!</span>")
to_chat(M, "<span class='danger'>[user] fails to blind you with the flash!</span>")
else
if(M.flash_eyes())
M.AdjustConfused(power)
M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash
if(M.flash_eyes(1, 1))
M.AdjustConfused(power)
terrible_conversion_proc(M, user)
M.Stun(1)
visible_message("<span class='disarm'>[user] blinds [M] with the flash!</span>")
to_chat(user, "<span class='danger'>You blind [M] with the flash!</span>")
to_chat(M, "<span class='userdanger'>[user] blinds you with the flash!</span>")
if(M.weakeyes)
M.Stun(2)
M.visible_message("<span class='disarm'>[M] gasps and shields [M.p_their()] eyes!</span>", "<span class='userdanger'>You gasp and shield your eyes!</span>")
else
visible_message("<span class='disarm'>[user] fails to blind [M] with the flash!</span>")
to_chat(user, "<span class='warning'>You fail to blind [M] with the flash!</span>")
to_chat(M, "<span class='danger'>[user] fails to blind you with the flash!</span>")
return
if(M.flash_eyes())
M.AdjustConfused(power)
/obj/item/flash/attack(mob/living/M, mob/user)
if(!try_use_flash(user))
@@ -69,8 +69,8 @@
to_chat(user, "<span class='notice'>Locked In</span>")
new /obj/machinery/power/singularity_beacon/syndicate( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
user.drop_item()
qdel(src)
return
/obj/item/radio/beacon/syndicate/bomb
name = "suspicious beacon"
@@ -82,16 +82,21 @@
to_chat(user, "<span class='notice'>Locked In</span>")
new /obj/machinery/syndicatebomb( user.loc )
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
user.drop_item()
qdel(src)
return
/obj/item/radio/beacon/engine
desc = "A label on it reads: <i>Warning: This device is used for transportation of high-density objects used for high-yield power generation. Stay away!</i>."
anchored = 1 //Let's not move these around. Some folk might get the idea to use these for assassinations
var/list/enginetype = list()
/obj/item/radio/beacon/engine/Initialize()
/obj/item/radio/beacon/engine/Initialize(mapload)
LAZYADD(GLOB.engine_beacon_list, src)
return ..()
/obj/item/radio/beacon/engine/Destroy()
GLOB.engine_beacon_list -= src
return ..()
/obj/item/radio/beacon/engine/tesling
name = "Engine Beacon for Tesla and Singularity"
@@ -21,6 +21,7 @@
var/ks1type = null
var/ks2type = null
dog_fashion = null
requires_tcomms = TRUE
/obj/item/radio/headset/New()
..()
@@ -88,6 +89,8 @@
/obj/item/radio/headset/syndicate
origin_tech = "syndicate=3"
ks1type = /obj/item/encryptionkey/syndicate/nukeops
requires_tcomms = FALSE
instant = TRUE // Work instantly if there are no comms
/obj/item/radio/headset/syndicate/alt //undisguised bowman with flash protection
name = "syndicate headset"
+81 -155
View File
@@ -58,6 +58,9 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
var/datum/radio_frequency/radio_connection
var/list/datum/radio_frequency/secure_radio_connections = new
var/requires_tcomms = FALSE // Does this device require tcomms to work.If TRUE it wont function at all without tcomms. If FALSE, it will work without tcomms, just slowly
var/instant = FALSE // Should this device instantly communicate if there isnt tcomms
/obj/item/radio/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
@@ -233,7 +236,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
add_fingerprint(usr)
/obj/item/radio/proc/autosay(var/message, var/from, var/channel, var/zlevel = config.contact_levels, var/role = "Unknown") //BS12 EDIT
/obj/item/radio/proc/autosay(message, from, channel, role = "Unknown") //BS12 EDIT
var/datum/radio_frequency/connection = null
if(channel && channels && channels.len > 0)
if(channel == "department")
@@ -258,10 +261,29 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
if(jammed)
message = Gibberish(message, 100)
var/list/message_pieces = message_to_multilingual(message)
Broadcast_Message(connection, A,
0, "*garbled automated announcement*", src,
message_pieces, from, "Automated Announcement", from, "synthesized voice",
4, 0, zlevel, connection.frequency, follow_target = follow_target)
// Make us a message datum!
var/datum/tcomms_message/tcm = new
tcm.connection = connection
tcm.sender = A
tcm.radio = src
tcm.sender_name = from
tcm.message_pieces = message_pieces
tcm.sender_job = "Automated Announcement"
tcm.vname = "synthesized voice"
tcm.data = SIGNALTYPE_AINOTRACK
// Datum radios dont have a location (obviously
if(loc && loc.z)
tcm.source_level = loc.z // For anyone that reads this: This used to pull from a LIST from the CONFIG DATUM. WHYYYYYYYYY!!!!!!!! -aa
else
tcm.source_level = 1 // Assume Z1 if we dont have an actual Z level available to us.
tcm.freq = connection.frequency
tcm.follow_target = follow_target
// Now put that through the stuff
for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
C.handle_message(tcm)
qdel(tcm) // Delete the message datum
qdel(A)
// Just a dummy mob used for making announcements, so we don't create AIs to do this
@@ -318,48 +340,32 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
if(!M.IsVocal())
return 0
/* Quick introduction:
This new radio system uses a very robust FTL signaling technology unoriginally
dubbed "subspace" which is somewhat similar to 'blue-space' but can't
actually transmit large mass. Headsets are the only radio devices capable
of sending subspace transmissions to the Communications Satellite.
A headset sends a signal to a subspace listener/receiver elsewhere in space,
the signal gets processed and logged, and an audible transmission gets sent
to each individual headset.
*/
//#### Grab the connection datum ####//
var/message_mode = handle_message_mode(M, message_pieces, channel)
switch(message_mode) //special cases
if(RADIO_CONNECTION_FAIL)
return 0
if(RADIO_CONNECTION_NON_SUBSPACE)
return 1
if(!istype(message_mode, /datum/radio_frequency)) //if not a special case, it should be returning a radio connection
return 0
var/datum/radio_frequency/connection = message_mode
var/turf/position = get_turf(src)
var/jammed = FALSE
for(var/obj/item/jammer/jammer in GLOB.active_jammers)
var/turf/position = get_turf(src)
for(var/J in GLOB.active_jammers)
var/obj/item/jammer/jammer = J
if(get_dist(position, get_turf(jammer)) < jammer.range)
jammed = TRUE
break
//#### Tagging the signal with all appropriate identity values ####//
var/message_mode = handle_message_mode(M, message_pieces, channel)
switch(message_mode) //special cases
// This is if the connection fails
if(RADIO_CONNECTION_FAIL)
return 0
// This is if were using either a binary key, or a hivemind through a headset somehow. Dont ask.
if(RADIO_CONNECTION_NON_SUBSPACE)
return 1
if(!istype(message_mode, /datum/radio_frequency)) //if not a special case, it should be returning a radio connection
return
var/datum/radio_frequency/connection = message_mode
// ||-- The mob's name identity --||
var/displayname = M.name // grab the display name (name you get when you hover over someone's icon)
var/real_name = M.real_name // mob's real name
var/mobkey = "none" // player key associated with mob
var/voicemask = 0 // the speaker is wearing a voice mask
if(M.client)
mobkey = M.key // assign the mob's key
var/jobname // the mob's "job"
if(jammed)
@@ -397,7 +403,7 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
if(ishuman(M))
var/mob/living/carbon/human/H = M
displayname = H.voice
if(H.voice != real_name)
if(H.voice != M.real_name)
voicemask = TRUE
if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ)
@@ -405,124 +411,44 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
jobname = "Unknown"
voicemask = TRUE
// Make us a message datum!
var/datum/tcomms_message/tcm = new
tcm.sender_name = displayname
tcm.sender_job = jobname
tcm.message_pieces = message_pieces
tcm.source_level = position.z
tcm.freq = connection.frequency
tcm.vmask = voicemask
tcm.needs_tcomms = requires_tcomms
tcm.connection = connection
tcm.vname = M.voice_name
tcm.sender = M
// Now put that through the stuff
var/handled = FALSE
if(connection)
for(var/obj/machinery/tcomms/core/C in GLOB.tcomms_machines)
if(C.handle_message(tcm))
handled = TRUE
qdel(tcm) // Delete the message datum
return TRUE
/* ###### Radio headsets can only broadcast through subspace ###### */
// If we dont need tcomms and we have no connection
if(!requires_tcomms && !handled)
// If they dont need tcomms for their signal, set the type to intercoms
tcm.data = SIGNALTYPE_INTERCOM_SBR
tcm.zlevels = list(position.z)
if(!instant)
// Simulate two seconds of lag
addtimer(CALLBACK(GLOBAL_PROC, .proc/broadcast_message, tcm), 20)
else
// Nukeops + Deathsquad headsets are instant and should work the same, whether there is comms or not
broadcast_message(tcm)
qdel(tcm) // Delete the message datum
return TRUE
if(subspace_transmission)
// First, we want to generate a new radio signal
var/datum/signal/signal = new
signal.transmission_method = 2 // 2 would be a subspace transmission.
// transmission_method could probably be enumerated through #define. Would be neater.
// --- Finally, tag the actual signal with the appropriate values ---
signal.data = list(
// Identity-associated tags:
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"race" = signal.get_race(M),
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
"key" = mobkey, // the mob's key
"vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
"vname" = M.voice_name, // the name to display if the voice wasn't understood
"vmask" = voicemask, // 1 if the mob is using a voice gas mask
// We store things that would otherwise be kept in the actual mob
// so that they can be logged even AFTER the mob is deleted or something
// Other tags:
"compression" = rand(45,50), // compressed radio signal
"message" = message_pieces, // the actual sent message
"connection" = connection, // the radio connection to use
"radio" = src, // stores the radio used for transmission
"slow" = 0, // how much to sleep() before broadcasting - simulates net lag
"traffic" = 0, // dictates the total traffic sum that the signal went through
"type" = 0, // determines what type of radio input it is: normal broadcast
"server" = null, // the last server to log this signal
"reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
"level" = position.z, // The source's z level
"verb" = verb
)
signal.frequency = connection.frequency // Quick frequency set
//#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in GLOB.telecomms_list)
spawn(0)
R.receive_signal(signal)
// Allinone can act as receivers.
for(var/obj/machinery/telecomms/allinone/R in GLOB.telecomms_list)
spawn(0)
R.receive_signal(signal)
// Receiving code can be located in Telecommunications.dm
return signal.data["done"] && (position.z in signal.data["level"])
/* ###### Intercoms and station-bounced radios ###### */
var/filter_type = 2
/* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */
if(istype(src, /obj/item/radio/intercom))
filter_type = 1
var/datum/signal/signal = new
signal.transmission_method = 2
/* --- Try to send a normal subspace broadcast first */
signal.data = list(
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"race" = signal.get_race(M), // text to show next to mob in comms log console
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
"key" = mobkey, // the mob's key
"vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
"vname" = M.voice_name, // the name to display if the voice wasn't understood
"vmask" = voicemask, // 1 if the mob is using a voice gas mas
"compression" = 0, // uncompressed radio signal
"message" = message_pieces, // the actual sent message
"connection" = connection, // the radio connection to use
"radio" = src, // stores the radio used for transmission
"slow" = 0,
"traffic" = 0,
"type" = 0,
"server" = null,
"reject" = 0,
"level" = position.z,
"verb" = verb
)
signal.frequency = connection.frequency // Quick frequency set
for(var/obj/machinery/telecomms/receiver/R in GLOB.telecomms_list)
spawn(0)
R.receive_signal(signal)
sleep(rand(10,25)) // wait a little...
if(signal.data["done"] && (position.z in signal.data["level"]))
// we're done here.
return 1
// Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
// Send a mundane broadcast with limited targets:
//THIS IS TEMPORARY. YEAH RIGHT
if(!connection) return 0 //~Carn
return Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message_pieces, displayname, jobname, real_name, M.voice_name,
filter_type, signal.data["compression"], list(position.z), connection.frequency,verb)
// If we didnt get here, oh fuck
qdel(tcm) // Delete the message datum
return FALSE
/obj/item/radio/hear_talk(mob/M as mob, list/message_pieces, var/verb = "says")
@@ -4,6 +4,7 @@
desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery."
icon = 'icons/obj/nanopaste.dmi'
icon_state = "tube"
w_class = WEIGHT_CLASS_TINY
origin_tech = "materials=2;engineering=3"
amount = 6
max_amount = 6
@@ -10,8 +10,8 @@
icon_state = "sheet-hide"
GLOBAL_LIST_INIT(human_recipes, list( \
new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/bloated_human, 5, on_floor = 1), \
new/datum/stack_recipe("bloated human costume head", /obj/item/clothing/head/human_head, 5, on_floor = 1), \
new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/bloated_human, 5, on_floor = TRUE), \
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)
@@ -48,6 +48,14 @@ GLOBAL_LIST_INIT(human_recipes, list( \
singular_name = "lizard skin piece"
icon_state = "sheet-lizard"
GLOBAL_LIST_INIT(lizard_recipes, list( \
new/datum/stack_recipe("lizard skin handbag", /obj/item/storage/backpack/satchel/lizard, 5, on_floor = TRUE), \
))
/obj/item/stack/sheet/animalhide/lizard/Initialize(mapload, new_amount, merge = TRUE)
recipes = GLOB.lizard_recipes
return ..()
/obj/item/stack/sheet/animalhide/xeno
name = "alien hide"
desc = "The skin of a terrible creature."
@@ -298,13 +298,13 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT)
point_value = 20
var/global/list/datum/stack_recipe/titanium_recipes = list (
GLOBAL_LIST_INIT(titanium_recipes, list(
new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20),
new/datum/stack_recipe("surgical tray", /obj/structure/table/tray, 2, one_per_turf = 1, on_floor = 1),
)
))
/obj/item/stack/sheet/mineral/titanium/New(loc, amount=null)
recipes = titanium_recipes
recipes = GLOB.titanium_recipes
..()
/obj/item/stack/sheet/mineral/titanium/fifty
@@ -328,12 +328,12 @@ var/global/list/datum/stack_recipe/titanium_recipes = list (
materials = list(MAT_TITANIUM=2000, MAT_PLASMA=2000)
point_value = 45
var/global/list/datum/stack_recipe/plastitanium_recipes = list (
GLOBAL_LIST_INIT(plastitanium_recipes, list(
new/datum/stack_recipe("plas-titanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20),
)
))
/obj/item/stack/sheet/mineral/plastitanium/New(loc, amount=null)
recipes = plastitanium_recipes
recipes = GLOB.plastitanium_recipes
..()
/obj/item/stack/sheet/mineral/enruranium
+6 -4
View File
@@ -27,10 +27,12 @@
throwforce = 2.0
w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
var/next_gavel_hit
/obj/item/gavelblock/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/gavelhammer))
playsound(loc, 'sound/items/gavel.ogg', 100, 1)
user.visible_message("<span class='warning'>[user] strikes \the [src] with \the [I].</span>")
else
if(!istype(I, /obj/item/gavelhammer))
return
if(world.time > next_gavel_hit)
playsound(loc, 'sound/items/gavel.ogg', 100, 1)
next_gavel_hit = world.time + 5 SECONDS
user.visible_message("<span class='warning'>[user] strikes \the [src] with \the [I].</span>")
@@ -37,6 +37,9 @@
cuff(C, user)
/obj/item/restraints/handcuffs/proc/cuff(mob/living/carbon/C, mob/user, remove_src = TRUE)
if(!istype(C)) // Shouldn't be able to cuff anything but carbons.
return
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(!(H.has_left_hand() || H.has_right_hand()))
@@ -20,6 +20,10 @@
..()
storage = new /obj/item/storage/hidden/implant(src)
/obj/item/implant/storage/emp_act(severity)
..()
storage.emp_act(severity)
/obj/item/implant/storage/activate()
storage.MouseDrop(imp_in)
@@ -40,14 +40,13 @@
L.adjustBrainLoss(20)
removed(mindslave_target)
qdel(src)
return -1
return -1
if(ismindshielded(mindslave_target))
mindslave_target.visible_message("<span class='warning'>[mindslave_target] seems to resist the implant!</span>", "<span class='warning'>You feel a strange sensation in your head that quickly dissipates.</span>")
removed(mindslave_target)
qdel(src)
return -1
mindslave_target.implanting = 1
to_chat(mindslave_target, "<span class='danger'>You feel completely loyal to [user.name].</span>")
if(!(user.mind in SSticker.mode.implanter))
SSticker.mode.implanter[user.mind] = list()
@@ -56,7 +55,7 @@
SSticker.mode.implanted.Add(mindslave_target.mind)
SSticker.mode.implanted[mindslave_target.mind] = user.mind
SSticker.mode.implanter[user.mind] = implanters
to_chat(mindslave_target, "<span class='danger'><B>You're now completely loyal to [user.name]!</B> You now must lay down your life to protect [user.p_them()] and assist in [user.p_their()] goals at any cost.</span>")
var/datum/objective/protect/mindslave/MS = new
+82 -60
View File
@@ -1,29 +1,19 @@
/////////
//ZIPPO//
/////////
// Basic lighters
/obj/item/lighter
name = "cheap lighter"
desc = "A cheap-as-free lighter."
icon = 'icons/obj/items.dmi'
icon_state = "lighter-g"
item_state = "lighter-g"
var/icon_on = "lighter-g-on"
var/icon_off = "lighter-g"
w_class = WEIGHT_CLASS_TINY
throwforce = 4
flags = CONDUCT
slot_flags = SLOT_BELT
attack_verb = null
resistance_flags = FIRE_PROOF
var/lit = 0
/obj/item/lighter/zippo
name = "zippo lighter"
desc = "The zippo."
icon_state = "zippo"
item_state = "zippo"
icon_on = "zippoon"
icon_off = "zippo"
var/lit = FALSE
var/icon_on = "lighter-g-on"
var/icon_off = "lighter-g"
/obj/item/lighter/random/New()
..()
@@ -33,54 +23,51 @@
icon_state = icon_off
/obj/item/lighter/attack_self(mob/living/user)
if(user.r_hand == src || user.l_hand == src || isrobot(user))
if(!lit)
lit = 1
w_class = WEIGHT_CLASS_BULKY
icon_state = icon_on
item_state = icon_on
force = 5
damtype = "fire"
hitsound = 'sound/items/welder.ogg'
attack_verb = list("burnt", "singed")
if(istype(src, /obj/item/lighter/zippo) )
user.visible_message("<span class='rose'>Without even breaking stride, [user] flips open and lights [src] in one smooth movement.</span>")
playsound(src.loc, 'sound/items/zippolight.ogg', 25, 1)
else
if(prob(75))
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src].</span>")
else
to_chat(user, "<span class='warning'>You burn yourself while lighting the lighter.</span>")
var/mob/living/M = user
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
if(affecting.receive_damage( 0, 5 )) //INFERNO
H.UpdateDamageIcon()
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src], [user.p_they()] however burn[user.p_s()] [user.p_their()] finger in the process.</span>")
set_light(2)
START_PROCESSING(SSobj, src)
else
lit = 0
w_class = WEIGHT_CLASS_TINY
icon_state = icon_off
item_state = icon_off
hitsound = "swing_hit"
force = 0
attack_verb = null //human_defense.dm takes care of it
if(istype(src, /obj/item/lighter/zippo) )
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow.")
playsound(src.loc, 'sound/items/zippoclose.ogg', 25, 1)
else
user.visible_message("<span class='notice'>[user] quietly shuts off the [src].")
set_light(0)
STOP_PROCESSING(SSobj, src)
. = ..()
if(!lit)
turn_on_lighter(user)
else
return ..()
return
turn_off_lighter(user)
/obj/item/lighter/proc/turn_on_lighter(mob/living/user)
lit = TRUE
w_class = WEIGHT_CLASS_BULKY
icon_state = icon_on
item_state = icon_on
force = 5
damtype = BURN
hitsound = 'sound/items/welder.ogg'
attack_verb = list("burnt", "singed")
attempt_light(user)
set_light(2)
START_PROCESSING(SSobj, src)
/obj/item/lighter/proc/attempt_light(mob/living/user)
if(prob(75) || issilicon(user)) // Robots can never burn themselves trying to light it.
to_chat(user, "<span class='notice'>You light [src].</span>")
else
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
if(affecting.receive_damage( 0, 5 )) //INFERNO
H.UpdateDamageIcon()
to_chat(user,"<span class='notice'>You light [src], but you burn your hand in the process.</span>")
/obj/item/lighter/proc/turn_off_lighter(mob/living/user)
lit = FALSE
w_class = WEIGHT_CLASS_TINY
icon_state = icon_off
item_state = icon_off
hitsound = "swing_hit"
force = 0
attack_verb = null //human_defense.dm takes care of it
show_off_message(user)
set_light(0)
STOP_PROCESSING(SSobj, src)
/obj/item/lighter/proc/show_off_message(mob/living/user)
to_chat(user, "<span class='notice'>You shut off [src].")
/obj/item/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!isliving(M))
@@ -108,6 +95,41 @@
location.hotspot_expose(700, 5)
return
// Zippo lighters
/obj/item/lighter/zippo
name = "zippo lighter"
desc = "The zippo."
icon_state = "zippo"
item_state = "zippo"
icon_on = "zippoon"
icon_off = "zippo"
var/next_on_message
var/next_off_message
/obj/item/lighter/zippo/turn_on_lighter(mob/living/user)
. = ..()
if(world.time > next_on_message)
user.visible_message("<span class='rose'>Without even breaking stride, [user] flips open and lights [src] in one smooth movement.</span>")
playsound(src.loc, 'sound/items/zippolight.ogg', 25, 1)
next_on_message = world.time + 5 SECONDS
else
to_chat(user, "<span class='notice'>You light [src].</span>")
/obj/item/lighter/zippo/turn_off_lighter(mob/living/user)
. = ..()
if(world.time > next_off_message)
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow.")
playsound(src.loc, 'sound/items/zippoclose.ogg', 25, 1)
next_off_message = world.time + 5 SECONDS
else
to_chat(user, "<span class='notice'>You shut off [src].")
/obj/item/lighter/zippo/show_off_message(mob/living/user)
return
/obj/item/lighter/zippo/attempt_light(mob/living/user)
return
//EXTRA LIGHTERS
/obj/item/lighter/zippo/nt_rep
name = "gold engraved zippo"
+4
View File
@@ -77,6 +77,10 @@
item_state = "gift"
w_class = WEIGHT_CLASS_BULKY
/obj/item/gift/emp_act(severity)
..()
gift.emp_act(severity)
/obj/item/kidanglobe
name = "Kidan homeworld globe"
icon = 'icons/obj/decorations.dmi'
+3 -2
View File
@@ -60,7 +60,7 @@
return
if(thearea.tele_proof && !istype(thearea, /area/wizard_station))
to_chat(user, "A mysterious force disrupts your arcane spell matrix, and you remain where you are.")
to_chat(user, "<span class='warning'>A mysterious force disrupts your arcane spell matrix, and you remain where you are.</span>")
return
var/datum/effect_system/smoke_spread/smoke = new
@@ -79,7 +79,7 @@
L+=T
if(!L.len)
to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.")
to_chat(user, "<span class='warning'>The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.</span>")
return
if(user && user.buckled)
@@ -104,3 +104,4 @@
smoke.start()
src.uses -= 1
user.update_action_buttons_icon() //Update action buttons as some spells might now be castable
@@ -235,57 +235,6 @@
rating = 4
materials = list(MAT_METAL=80)
// Subspace stock parts
/obj/item/stock_parts/subspace/ansible
name = "subspace ansible"
icon_state = "subspace_ansible"
desc = "A compact module capable of sensing extradimensional activity."
origin_tech = "programming=2;magnets=2;materials=2;bluespace=1"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/filter
name = "hyperwave filter"
icon_state = "hyperwave_filter"
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
origin_tech = "programming=2;magnets=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/amplifier
name = "subspace amplifier"
icon_state = "subspace_amplifier"
desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/treatment
name = "subspace treatment disk"
icon_state = "treatment_disk"
desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/analyzer
name = "subspace wavelength analyzer"
icon_state = "wavelength_analyzer"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
origin_tech = "programming=2;magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/crystal
name = "ansible crystal"
icon_state = "ansible_crystal"
desc = "A crystal made from pure glass used to transmit laser databursts to subspace."
origin_tech = "magnets=2;materials=2;bluespace=2;plasmatech=2"
materials = list(MAT_GLASS=50)
/obj/item/stock_parts/subspace/transmitter
name = "subspace transmitter"
icon_state = "subspace_transmitter"
desc = "A large piece of equipment used to open a window into the subspace dimension."
origin_tech = "magnets=2;materials=2;bluespace=2"
materials = list(MAT_METAL=50)
/obj/item/research//Makes testing much less of a pain -Sieve
name = "research"
icon = 'icons/obj/stock_parts.dmi'
@@ -230,6 +230,11 @@
desc = "An NT Deluxe satchel, with the finest quality leather and the company logo in a thin gold stitch"
icon_state = "nt_deluxe"
/obj/item/storage/backpack/satchel/lizard
name = "lizard skin handbag"
desc = "A handbag made out of what appears to be supple green Unathi skin. A face can be vaguely seen on the front."
icon_state = "satchel-lizard"
/obj/item/storage/backpack/satchel/withwallet/New()
..()
new /obj/item/storage/wallet/random(src)
@@ -134,7 +134,8 @@
/obj/item/rad_laser,
/obj/item/sensor_device,
/obj/item/wrench/medical,
/obj/item/handheld_defibrillator
/obj/item/handheld_defibrillator,
/obj/item/reagent_containers/applicator
)
/obj/item/storage/belt/medical/surgery
@@ -1124,6 +1124,11 @@
playsound(loc, "rustle", 50, 1, -5)
user.visible_message("<span class='notice'>[user] hugs \the [src].</span>","<span class='notice'>You hug \the [src].</span>")
/obj/item/storage/box/wizard
name = "magical box"
desc = "It's just an ordinary magical box."
icon_state = "box_wizard"
#undef NODESIGN
#undef NANOTRASEN
#undef SYNDI
@@ -14,7 +14,7 @@
icon_state = "firstaid"
throw_speed = 2
throw_range = 8
var/empty = 0
var/empty = FALSE
req_one_access =list(ACCESS_MEDICAL, ACCESS_ROBOTICS) //Access and treatment are utilized for medbots.
var/treatment_brute = "salglu_solution"
var/treatment_oxy = "salbutamol"
@@ -33,39 +33,51 @@
item_state = "firstaid-ointment"
med_bot_skin = "ointment"
New()
..()
if(empty) return
icon_state = pick("ointment","firefirstaid")
new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
new /obj/item/healthanalyzer( src )
new /obj/item/reagent_containers/hypospray/autoinjector( src )
new /obj/item/reagent_containers/food/pill/salicylic( src )
/obj/item/storage/firstaid/fire/New()
..()
if(empty)
return
icon_state = pick("ointment", "firefirstaid")
new /obj/item/reagent_containers/applicator/burn(src)
new /obj/item/reagent_containers/food/pill/patch/silver_sulf/small(src)
new /obj/item/healthanalyzer(src)
new /obj/item/reagent_containers/hypospray/autoinjector(src)
new /obj/item/reagent_containers/food/pill/salicylic(src)
/obj/item/storage/firstaid/fire/empty
empty = 1
empty = TRUE
/obj/item/storage/firstaid/regular
desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer"
icon_state = "firstaid"
New()
..()
if(empty) return
new /obj/item/reagent_containers/food/pill/patch/styptic( src )
new /obj/item/reagent_containers/food/pill/patch/styptic( src )
new /obj/item/reagent_containers/food/pill/salicylic( src )
new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
new /obj/item/reagent_containers/food/pill/patch/silver_sulf( src )
new /obj/item/healthanalyzer( src )
new /obj/item/reagent_containers/hypospray/autoinjector( src )
/obj/item/storage/firstaid/regular/New()
..()
if(empty)
return
new /obj/item/reagent_containers/food/pill/patch/styptic(src)
new /obj/item/reagent_containers/food/pill/patch/styptic(src)
new /obj/item/reagent_containers/food/pill/salicylic(src)
new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src)
new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src)
new /obj/item/healthanalyzer(src)
new /obj/item/reagent_containers/hypospray/autoinjector(src)
/obj/item/storage/firstaid/doctor
desc = "A general medical kit that contains medical patches for both brute damage and burn damage. Also contains an epinephrine syringe for emergency use and a health analyzer"
icon_state = "firstaid"
/obj/item/storage/firstaid/doctor/New()
..()
if(empty)
return
new /obj/item/reagent_containers/applicator/brute(src)
new /obj/item/reagent_containers/applicator/burn(src)
new /obj/item/reagent_containers/food/pill/patch/styptic(src)
new /obj/item/reagent_containers/food/pill/patch/silver_sulf(src)
new /obj/item/reagent_containers/food/pill/salicylic(src)
new /obj/item/healthanalyzer/advanced(src)
new /obj/item/reagent_containers/hypospray/autoinjector(src)
/obj/item/storage/firstaid/toxin
name = "toxin first aid kit"
@@ -74,23 +86,21 @@
item_state = "firstaid-toxin"
med_bot_skin = "tox"
New()
..()
if(empty) return
icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3")
new /obj/item/reagent_containers/syringe/charcoal( src )
new /obj/item/reagent_containers/syringe/charcoal( src )
new /obj/item/reagent_containers/syringe/charcoal( src )
new /obj/item/reagent_containers/food/pill/charcoal( src )
new /obj/item/reagent_containers/food/pill/charcoal( src )
new /obj/item/reagent_containers/food/pill/charcoal( src )
new /obj/item/healthanalyzer( src )
/obj/item/storage/firstaid/toxin/New()
..()
if(empty)
return
icon_state = pick("antitoxin", "antitoxfirstaid", "antitoxfirstaid2", "antitoxfirstaid3")
new /obj/item/reagent_containers/syringe/charcoal(src)
new /obj/item/reagent_containers/syringe/charcoal(src)
new /obj/item/reagent_containers/syringe/charcoal(src)
new /obj/item/reagent_containers/food/pill/charcoal(src)
new /obj/item/reagent_containers/food/pill/charcoal(src)
new /obj/item/reagent_containers/food/pill/charcoal(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/toxin/empty
empty = 1
empty = TRUE
/obj/item/storage/firstaid/o2
name = "oxygen deprivation first aid kit"
@@ -99,18 +109,18 @@
item_state = "firstaid-o2"
med_bot_skin = "o2"
New()
..()
if(empty) return
new /obj/item/reagent_containers/food/pill/salbutamol( src )
new /obj/item/reagent_containers/food/pill/salbutamol( src )
new /obj/item/reagent_containers/food/pill/salbutamol( src )
new /obj/item/reagent_containers/food/pill/salbutamol( src )
new /obj/item/healthanalyzer( src )
/obj/item/storage/firstaid/o2/New()
..()
if(empty)
return
new /obj/item/reagent_containers/food/pill/salbutamol(src)
new /obj/item/reagent_containers/food/pill/salbutamol(src)
new /obj/item/reagent_containers/food/pill/salbutamol(src)
new /obj/item/reagent_containers/food/pill/salbutamol(src)
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/o2/empty
empty = 1
empty = TRUE
/obj/item/storage/firstaid/brute
name = "brute trauma treatment kit"
@@ -119,23 +129,19 @@
item_state = "firstaid-brute"
med_bot_skin = "brute"
New()
..()
if(empty) return
icon_state = pick("brute","brute2")
new /obj/item/reagent_containers/food/pill/patch/styptic(src)
new /obj/item/reagent_containers/food/pill/patch/styptic(src)
new /obj/item/reagent_containers/food/pill/patch/styptic(src)
new /obj/item/reagent_containers/food/pill/patch/styptic(src)
new /obj/item/healthanalyzer(src)
new /obj/item/reagent_containers/hypospray/autoinjector(src)
new /obj/item/stack/medical/bruise_pack(src)
/obj/item/storage/firstaid/brute/New()
..()
if(empty)
return
icon_state = pick("brute", "brute2")
new /obj/item/reagent_containers/applicator/brute(src)
new /obj/item/reagent_containers/food/pill/patch/styptic/small(src)
new /obj/item/healthanalyzer(src)
new /obj/item/reagent_containers/hypospray/autoinjector(src)
new /obj/item/stack/medical/bruise_pack(src)
/obj/item/storage/firstaid/brute/empty
empty = 1
empty = TRUE
/obj/item/storage/firstaid/adv
name = "advanced first-aid kit"
@@ -157,7 +163,7 @@
new /obj/item/healthanalyzer(src)
/obj/item/storage/firstaid/adv/empty
empty = 1
empty = TRUE
/obj/item/storage/firstaid/machine
name = "machine repair kit"
@@ -178,7 +184,7 @@
new /obj/item/robotanalyzer(src)
/obj/item/storage/firstaid/machine/empty
empty = 1
empty = TRUE
/obj/item/storage/firstaid/tactical
@@ -196,18 +202,15 @@
/obj/item/storage/firstaid/tactical/New()
..()
if(empty) return
if(empty)
return
new /obj/item/reagent_containers/hypospray/combat(src)
new /obj/item/reagent_containers/food/pill/patch/synthflesh(src) // Because you ain't got no time to look at what damage dey taking yo
new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
new /obj/item/reagent_containers/applicator/dual(src) // Because you ain't got no time to look at what damage dey taking yo
new /obj/item/defibrillator/compact/combat/loaded(src)
new /obj/item/clothing/glasses/hud/health/night(src)
return
/obj/item/storage/firstaid/tactical/empty
empty =1
empty = TRUE
/obj/item/storage/firstaid/surgery
name = "field surgery kit"
@@ -347,15 +350,15 @@
desc = "Contains pills used to counter toxins."
wrapper_color = COLOR_GREEN
New()
..()
new /obj/item/reagent_containers/food/pill/charcoal( src )
new /obj/item/reagent_containers/food/pill/charcoal( src )
new /obj/item/reagent_containers/food/pill/charcoal( src )
new /obj/item/reagent_containers/food/pill/charcoal( src )
new /obj/item/reagent_containers/food/pill/charcoal( src )
new /obj/item/reagent_containers/food/pill/charcoal( src )
new /obj/item/reagent_containers/food/pill/charcoal( src )
/obj/item/storage/pill_bottle/charcoal/New()
..()
new /obj/item/reagent_containers/food/pill/charcoal(src)
new /obj/item/reagent_containers/food/pill/charcoal(src)
new /obj/item/reagent_containers/food/pill/charcoal(src)
new /obj/item/reagent_containers/food/pill/charcoal(src)
new /obj/item/reagent_containers/food/pill/charcoal(src)
new /obj/item/reagent_containers/food/pill/charcoal(src)
new /obj/item/reagent_containers/food/pill/charcoal(src)
/obj/item/storage/pill_bottle/painkillers
name = "Pill Bottle (Salicylic Acid)"
@@ -481,10 +481,10 @@
return ..()
/obj/item/storage/emp_act(severity)
if(!istype(loc, /mob/living))
for(var/obj/O in contents)
O.emp_act(severity)
..()
for(var/i in contents)
var/atom/A = i
A.emp_act(severity)
/obj/item/storage/hear_talk(mob/living/M as mob, list/message_pieces)
..()
@@ -179,6 +179,7 @@
slot_flags = SLOT_BACK
force_unwielded = 5
force_wielded = 24
toolspeed = 0.25
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
usesound = 'sound/items/crowbar.ogg'
@@ -542,6 +543,7 @@
w_class = WEIGHT_CLASS_BULKY // can't fit in backpacks
force_unwielded = 15 //still pretty robust
force_wielded = 40 //you'll gouge their eye out! Or a limb...maybe even their entire body!
hitsound = null // Handled in the snowflaked attack proc
wieldsound = 'sound/weapons/chainsawstart.ogg'
hitsound = null
armour_penetration = 35
+1 -3
View File
@@ -251,9 +251,7 @@ a {
if(P)
if(P.buffer)
var/id = null
if(istype(P.buffer, /obj/machinery/telecomms))
id=P.buffer:id
else if("id_tag" in P.buffer.vars)
if("id_tag" in P.buffer.vars)
id=P.buffer:id_tag
dat += "<p><b>MULTITOOL BUFFER:</b> [P.buffer] [id ? "([id])" : ""]"
@@ -16,7 +16,7 @@
new /obj/item/storage/backpack/satchel_eng(src)
new /obj/item/storage/backpack/duffel/engineering(src)
new /obj/item/clothing/head/beret/ce(src)
new /obj/item/areaeditor/blueprints(src)
new /obj/item/areaeditor/blueprints/ce(src)
new /obj/item/storage/box/permits(src)
new /obj/item/clothing/under/rank/chief_engineer(src)
new /obj/item/clothing/under/rank/chief_engineer/skirt(src)
@@ -1,23 +0,0 @@
/obj/structure/decor/machinery/telecomms/processor
name = "Processor Unit"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "processor"
desc = "This machine is used to process large quantities of information."
/obj/structure/decor/machinery/telecomms/hub
name = "Telecommunication Hub"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "hub"
desc = "A mighty piece of hardware used to send/receive massive amounts of data."
/obj/structure/decor/machinery/telecomms/server
name = "Telecommunication Server"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "comm_server"
desc = "A machine used to store data and network statistics."
/obj/structure/decor/machinery/telecomms/relay
name = "Telecommunication Relay"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "relay"
desc = "A mighty piece of hardware used to send massive amounts of data far away."
-5
View File
@@ -79,7 +79,6 @@
var/beepsound = 'sound/items/timer.ogg'
var/deliberate = FALSE
var/max_cycles = 10
var/max_fire_range = 9
var/area/syndicate_depot/core/depotarea
/obj/effect/overload/New()
@@ -101,10 +100,6 @@
if(!deliberate)
playsound(loc, beepsound, 50, 0)
cycles++
var/fire_range = min(cycles, max_fire_range)
for(var/turf/simulated/turf in range(fire_range, T))
new /obj/effect/hotspot(turf)
return
if(!istype(depotarea))
+3 -1
View File
@@ -131,7 +131,7 @@
AC.ui_interact(user)
if("Voice")
var/voice_choice = input(user, "Perhaps...", "Voice effects") as null|anything in list("Comic Sans", "Wingdings", "Swedish", "Chav")
var/voice_choice = input(user, "Perhaps...", "Voice effects") as null|anything in list("Comic Sans", "Wingdings", "Swedish", "Chav", "Mute")
var/voice_mutation
switch(voice_choice)
if("Comic Sans")
@@ -142,6 +142,8 @@
voice_mutation = GLOB.swedeblock
if("Chav")
voice_mutation = GLOB.chavblock
if("Mute")
voice_mutation = GLOB.muteblock
if(voice_mutation)
if(H.dna.GetSEState(voice_mutation))
H.dna.SetSEState(voice_mutation, FALSE)