mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 05:27:01 +01:00
Merge remote-tracking branch 'upstream/master' into updateicons
This commit is contained in:
@@ -276,7 +276,8 @@
|
||||
/obj/effect/landmark/damageturf/New()
|
||||
..()
|
||||
var/turf/simulated/T = get_turf(src)
|
||||
T.break_tile()
|
||||
if(istype(T))
|
||||
T.break_tile()
|
||||
|
||||
/obj/effect/landmark/burnturf
|
||||
icon_state = "burned"
|
||||
|
||||
@@ -127,6 +127,8 @@
|
||||
/obj/item/seeds/ambrosia = 20,
|
||||
/obj/item/clothing/under/color/black = 30,
|
||||
/obj/item/stack/tape_roll = 10,
|
||||
/obj/item/storage/bag/plasticbag = 20,
|
||||
/obj/item/caution = 10,
|
||||
////////////////CONTRABAND STUFF//////////////////
|
||||
/obj/item/grenade/clown_grenade = 3,
|
||||
/obj/item/seeds/ambrosia/cruciatus = 3,
|
||||
@@ -143,7 +145,7 @@
|
||||
/obj/item/storage/backpack/satchel_flat = 2,
|
||||
/obj/item/storage/toolbox/syndicate = 2,
|
||||
/obj/item/storage/backpack/duffel/syndie/surgery_fake = 2,
|
||||
/obj/item/storage/belt/military = 2,
|
||||
/obj/item/storage/belt/military/traitor = 2,
|
||||
/obj/item/storage/box/syndie_kit/space = 2,
|
||||
/obj/item/multitool/ai_detect = 2,
|
||||
/obj/item/implanter/storage = 1,
|
||||
|
||||
@@ -74,12 +74,18 @@
|
||||
if(istype(crayon, /obj/item/toy/crayon/spraycan))
|
||||
var/obj/item/toy/crayon/spraycan/can = crayon
|
||||
if(can.capped)
|
||||
to_chat(user, "<span class='warning'>The cap is on [src] remove it first!</span>")
|
||||
to_chat(user, "<span class='warning'>The cap is on the spray can remove it first!</span>")
|
||||
return
|
||||
if(pushed_over)
|
||||
to_chat(user, "<span class='warning'>Right [src] first!</span>")
|
||||
return
|
||||
var/new_appearance = input(user, "Choose a new appearance for [src].", "26th Century Deception") as null|anything in possible_appearances
|
||||
if(!Adjacent(usr))
|
||||
user.visible_message("<span class='danger'>You need to be closer!</span>")
|
||||
return
|
||||
if(pushed_over)
|
||||
to_chat(user, "<span class='warning'>Right [src] first!</span>")
|
||||
return
|
||||
if(!new_appearance || !crayon)
|
||||
return
|
||||
if(!do_after(user, 10, FALSE, src, TRUE))
|
||||
|
||||
@@ -11,13 +11,17 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
flags = NOBLUDGEON
|
||||
var/mode = WAND_OPEN
|
||||
var/region_access = 1 //See access.dm
|
||||
var/region_access = list()
|
||||
var/additional_access = list()
|
||||
var/obj/item/card/id/ID
|
||||
|
||||
/obj/item/door_remote/New()
|
||||
..()
|
||||
ID = new /obj/item/card/id
|
||||
ID.access = get_region_accesses(region_access)
|
||||
for(var/region in region_access)
|
||||
ID.access += get_region_accesses(region)
|
||||
ID.access += additional_access
|
||||
ID.access = uniquelist(ID.access) //remove duplicates
|
||||
|
||||
/obj/item/door_remote/Destroy()
|
||||
QDEL_NULL(ID)
|
||||
@@ -70,48 +74,71 @@
|
||||
name = "omni door remote"
|
||||
desc = "This control wand can access any door on the station."
|
||||
icon_state = "gangtool-yellow"
|
||||
region_access = REGION_ALL
|
||||
region_access = list(REGION_ALL)
|
||||
|
||||
/obj/item/door_remote/captain
|
||||
name = "command door remote"
|
||||
icon_state = "gangtool-yellow"
|
||||
region_access = REGION_COMMAND
|
||||
region_access = list(REGION_COMMAND)
|
||||
|
||||
/obj/item/door_remote/chief_engineer
|
||||
name = "engineering door remote"
|
||||
icon_state = "gangtool-orange"
|
||||
region_access = REGION_ENGINEERING
|
||||
region_access = list(REGION_ENGINEERING)
|
||||
|
||||
/obj/item/door_remote/research_director
|
||||
name = "research door remote"
|
||||
icon_state = "gangtool-purple"
|
||||
region_access = REGION_RESEARCH
|
||||
region_access = list(REGION_RESEARCH)
|
||||
|
||||
/obj/item/door_remote/head_of_security
|
||||
name = "security door remote"
|
||||
icon_state = "gangtool-red"
|
||||
region_access = REGION_SECURITY
|
||||
region_access = list(REGION_SECURITY)
|
||||
|
||||
/obj/item/door_remote/quartermaster
|
||||
name = "supply door remote"
|
||||
icon_state = "gangtool-green"
|
||||
region_access = REGION_SUPPLY
|
||||
region_access = list(REGION_SUPPLY)
|
||||
|
||||
/obj/item/door_remote/chief_medical_officer
|
||||
name = "medical door remote"
|
||||
icon_state = "gangtool-blue"
|
||||
region_access = REGION_MEDBAY
|
||||
region_access = list(REGION_MEDBAY)
|
||||
|
||||
/obj/item/door_remote/civillian
|
||||
name = "civillian door remote"
|
||||
icon_state = "gangtool-white"
|
||||
region_access = REGION_GENERAL
|
||||
region_access = list(REGION_GENERAL, REGION_SUPPLY)
|
||||
additional_access = list(access_hop)
|
||||
|
||||
/obj/item/door_remote/centcomm
|
||||
name = "centcomm door remote"
|
||||
desc = "High-ranking NT officials only."
|
||||
icon_state = "gangtool-blue"
|
||||
region_access = REGION_CENTCOMM
|
||||
region_access = list(REGION_CENTCOMM)
|
||||
|
||||
/obj/item/door_remote/omni/access_tuner
|
||||
name = "access tuner"
|
||||
desc = "A device used for illegally interfacing with doors."
|
||||
icon_state = "hacktool"
|
||||
item_state = "hacktool"
|
||||
var/hack_speed = 30
|
||||
var/busy = FALSE
|
||||
|
||||
/obj/item/door_remote/omni/access_tuner/afterattack(obj/machinery/door/airlock/D, mob/user)
|
||||
if(!istype(D))
|
||||
return
|
||||
if(busy)
|
||||
to_chat(user, "<span class='warning'>[src] is alreading interfacing with a door!</span>")
|
||||
return
|
||||
icon_state = "hacktool-g"
|
||||
busy = TRUE
|
||||
to_chat(user, "<span class='notice'>[src] is attempting to interface with [D]...</span>")
|
||||
if(do_after(user, hack_speed, target = D))
|
||||
. = ..()
|
||||
busy = FALSE
|
||||
icon_state = "hacktool"
|
||||
|
||||
#undef WAND_OPEN
|
||||
#undef WAND_BOLT
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
slot_flags = SLOT_BELT
|
||||
materials = list(MAT_METAL=50, MAT_GLASS=20)
|
||||
actions_types = list(/datum/action/item_action/toggle_light)
|
||||
var/on = 0
|
||||
var/on = FALSE
|
||||
var/brightness_on = 4 //luminosity when on
|
||||
|
||||
/obj/item/flashlight/Initialize()
|
||||
..()
|
||||
. = ..()
|
||||
if(on)
|
||||
icon_state = "[initial(icon_state)]-on"
|
||||
set_light(brightness_on)
|
||||
@@ -198,9 +198,10 @@ obj/item/flashlight/lamp/bananalamp
|
||||
|
||||
// Usual checks
|
||||
if(!fuel)
|
||||
to_chat(user, "<span class='notice'>It's out of fuel.</span>")
|
||||
to_chat(user, "<span class='notice'>[src] is out of fuel.</span>")
|
||||
return
|
||||
if(on)
|
||||
to_chat(user, "<span class='notice'>[src] is already on.</span>")
|
||||
return
|
||||
|
||||
. = ..()
|
||||
@@ -260,10 +261,11 @@ obj/item/flashlight/lamp/bananalamp
|
||||
|
||||
/obj/item/flashlight/emp/process()
|
||||
charge_tick++
|
||||
if(charge_tick < 10) return 0
|
||||
if(charge_tick < 10)
|
||||
return FALSE
|
||||
charge_tick = 0
|
||||
emp_cur_charges = min(emp_cur_charges+1, emp_max_charges)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/flashlight/emp/attack(mob/living/M as mob, mob/living/user as mob)
|
||||
if(on && user.zone_sel.selecting == "eyes") // call original attack proc only if aiming at the eyes
|
||||
@@ -299,4 +301,101 @@ obj/item/flashlight/lamp/bananalamp
|
||||
anchored = TRUE
|
||||
var/range = null
|
||||
unacidable = TRUE
|
||||
burn_state = LAVA_PROOF
|
||||
burn_state = LAVA_PROOF
|
||||
|
||||
/obj/item/flashlight/glowstick
|
||||
name = "green glowstick"
|
||||
desc = "A military-grade glowstick."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
brightness_on = 4
|
||||
color = LIGHT_COLOR_GREEN
|
||||
icon_state = "glowstick"
|
||||
item_state = "glowstick"
|
||||
var/fuel = 0
|
||||
|
||||
/obj/item/flashlight/glowstick/Initialize()
|
||||
fuel = rand(1600, 2000)
|
||||
light_color = color
|
||||
. = ..()
|
||||
|
||||
/obj/item/flashlight/glowstick/Destroy()
|
||||
processing_objects.Remove(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/flashlight/glowstick/process()
|
||||
fuel = max(fuel - 1, 0)
|
||||
if(!fuel)
|
||||
turn_off()
|
||||
processing_objects.Remove(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/flashlight/glowstick/proc/turn_off()
|
||||
on = FALSE
|
||||
update_icon()
|
||||
|
||||
/obj/item/flashlight/glowstick/update_icon()
|
||||
item_state = "glowstick"
|
||||
cut_overlays()
|
||||
if(!fuel)
|
||||
icon_state = "glowstick-empty"
|
||||
cut_overlays()
|
||||
update_brightness(0)
|
||||
else if(on)
|
||||
var/mutable_appearance/glowstick_overlay = mutable_appearance(icon, "glowstick-glow")
|
||||
glowstick_overlay.color = color
|
||||
add_overlay(glowstick_overlay)
|
||||
item_state = "glowstick-on"
|
||||
update_brightness(brightness_on)
|
||||
else
|
||||
icon_state = "glowstick"
|
||||
cut_overlays()
|
||||
|
||||
/obj/item/flashlight/glowstick/attack_self(mob/user)
|
||||
if(!fuel)
|
||||
to_chat(user, "<span class='notice'>[src] is spent.</span>")
|
||||
return
|
||||
if(on)
|
||||
to_chat(user, "<span class='notice'>[src] is already lit.</span>")
|
||||
return
|
||||
|
||||
. = ..()
|
||||
if(.)
|
||||
user.visible_message("<span class='notice'>[user] cracks and shakes [src].</span>", "<span class='notice'>You crack and shake [src], turning it on!</span>")
|
||||
activate()
|
||||
|
||||
/obj/item/flashlight/glowstick/proc/activate()
|
||||
if(!on)
|
||||
on = TRUE
|
||||
processing_objects.Add(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/flashlight/glowstick/red
|
||||
name = "red glowstick"
|
||||
color = LIGHT_COLOR_RED
|
||||
|
||||
/obj/item/flashlight/glowstick/blue
|
||||
name = "blue glowstick"
|
||||
color = LIGHT_COLOR_BLUE
|
||||
|
||||
/obj/item/flashlight/glowstick/orange
|
||||
name = "orange glowstick"
|
||||
color = LIGHT_COLOR_ORANGE
|
||||
|
||||
/obj/item/flashlight/glowstick/yellow
|
||||
name = "yellow glowstick"
|
||||
color = LIGHT_COLOR_YELLOW
|
||||
|
||||
/obj/item/flashlight/glowstick/pink
|
||||
name = "pink glowstick"
|
||||
color = LIGHT_COLOR_PINK
|
||||
|
||||
/obj/item/flashlight/glowstick/random
|
||||
name = "random colored glowstick"
|
||||
icon_state = "random_glowstick"
|
||||
color = null
|
||||
|
||||
/obj/item/flashlight/glowstick/random/Initialize()
|
||||
..()
|
||||
var/T = pick(typesof(/obj/item/flashlight/glowstick) - /obj/item/flashlight/glowstick/random)
|
||||
new T(loc)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN))
|
||||
if(!message)
|
||||
return
|
||||
message = user.handle_speech_problems(message)[1]
|
||||
message = capitalize(message)
|
||||
if((loc == user && !user.incapacitated()))
|
||||
if(emagged)
|
||||
|
||||
@@ -7,33 +7,44 @@
|
||||
item_state = ""
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
origin_tech = "engineering=2;bluespace=1"
|
||||
var/translate_binary = 0
|
||||
var/translate_hive = 0
|
||||
var/syndie = 0
|
||||
var/translate_binary = FALSE
|
||||
var/translate_hive = FALSE
|
||||
var/syndie = FALSE
|
||||
var/list/channels = list()
|
||||
|
||||
|
||||
/obj/item/encryptionkey/New()
|
||||
|
||||
/obj/item/encryptionkey/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
|
||||
/obj/item/encryptionkey/syndicate
|
||||
icon_state = "cypherkey"
|
||||
channels = list("Syndicate" = 1)
|
||||
origin_tech = "syndicate=1;engineering=3;bluespace=2"
|
||||
syndie = 1 //Signifies that it de-crypts Syndicate transmissions
|
||||
syndie = TRUE //Signifies that it de-crypts Syndicate transmissions
|
||||
var/change_voice = TRUE
|
||||
var/fake_name = "Agent ALERT_A_CODER"
|
||||
var/static/list/fakename_list
|
||||
|
||||
/obj/item/encryptionkey/syndicate/Initialize()
|
||||
if(!LAZYLEN(fakename_list))
|
||||
fakename_list = GLOB.html_colors.Copy()
|
||||
. = ..()
|
||||
if(change_voice)
|
||||
fake_name = "Agent [pick_n_take(fakename_list)]"
|
||||
|
||||
/obj/item/encryptionkey/syndicate/nukeops
|
||||
change_voice = FALSE
|
||||
|
||||
/obj/item/encryptionkey/syndteam
|
||||
icon_state = "cypherkey"
|
||||
channels = list("SyndTeam" = 1, "Syndicate" = 1)
|
||||
origin_tech = "syndicate=4"
|
||||
syndie = 1 //Signifies that it de-crypts Syndicate transmissions
|
||||
syndie = TRUE //Signifies that it de-crypts Syndicate transmissions
|
||||
|
||||
/obj/item/encryptionkey/binary
|
||||
name = "binary translator key"
|
||||
desc = "An encryption key for a radio headset. To access the binary channel, use :b."
|
||||
icon_state = "cypherkey"
|
||||
translate_binary = 1
|
||||
translate_binary = TRUE
|
||||
origin_tech = "syndicate=3;engineering=4;bluespace=3"
|
||||
|
||||
/obj/item/encryptionkey/headset_sec
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
icon_state = "headset"
|
||||
item_state = "headset"
|
||||
materials = list(MAT_METAL=75)
|
||||
subspace_transmission = 1
|
||||
subspace_transmission = TRUE
|
||||
canhear_range = 0 // can't hear headsets from very far away
|
||||
|
||||
slot_flags = SLOT_EARS
|
||||
var/translate_binary = 0
|
||||
var/translate_hive = 0
|
||||
var/translate_binary = FALSE
|
||||
var/translate_hive = FALSE
|
||||
var/obj/item/encryptionkey/keyslot1 = null
|
||||
var/obj/item/encryptionkey/keyslot2 = null
|
||||
|
||||
@@ -26,10 +26,14 @@
|
||||
|
||||
if(ks1type)
|
||||
keyslot1 = new ks1type(src)
|
||||
if(keyslot1.syndie)
|
||||
syndiekey = keyslot1
|
||||
if(ks2type)
|
||||
keyslot2 = new ks2type(src)
|
||||
if(keyslot2.syndie)
|
||||
syndiekey = keyslot2
|
||||
|
||||
recalculateChannels(1)
|
||||
recalculateChannels(TRUE)
|
||||
|
||||
/obj/item/radio/headset/Destroy()
|
||||
QDEL_NULL(keyslot1)
|
||||
@@ -79,8 +83,7 @@
|
||||
|
||||
/obj/item/radio/headset/syndicate
|
||||
origin_tech = "syndicate=3"
|
||||
syndie = 1
|
||||
ks1type = /obj/item/encryptionkey/syndicate
|
||||
ks1type = /obj/item/encryptionkey/syndicate/nukeops
|
||||
|
||||
/obj/item/radio/headset/syndicate/alt //undisguised bowman with flash protection
|
||||
name = "syndicate headset"
|
||||
@@ -349,48 +352,48 @@
|
||||
return
|
||||
|
||||
|
||||
/obj/item/radio/headset/proc/recalculateChannels(var/setDescription = 0)
|
||||
src.channels = list()
|
||||
src.translate_binary = 0
|
||||
src.translate_hive = 0
|
||||
src.syndie = 0
|
||||
/obj/item/radio/headset/proc/recalculateChannels(var/setDescription = FALSE)
|
||||
channels = list()
|
||||
translate_binary = FALSE
|
||||
translate_hive = FALSE
|
||||
syndiekey = null
|
||||
|
||||
if(keyslot1)
|
||||
for(var/ch_name in keyslot1.channels)
|
||||
if(ch_name in src.channels)
|
||||
if(ch_name in channels)
|
||||
continue
|
||||
src.channels += ch_name
|
||||
src.channels[ch_name] = keyslot1.channels[ch_name]
|
||||
channels += ch_name
|
||||
channels[ch_name] = keyslot1.channels[ch_name]
|
||||
|
||||
if(keyslot1.translate_binary)
|
||||
src.translate_binary = 1
|
||||
translate_binary = TRUE
|
||||
|
||||
if(keyslot1.translate_hive)
|
||||
src.translate_hive = 1
|
||||
translate_hive = TRUE
|
||||
|
||||
if(keyslot1.syndie)
|
||||
src.syndie = 1
|
||||
syndiekey = keyslot1
|
||||
|
||||
if(keyslot2)
|
||||
for(var/ch_name in keyslot2.channels)
|
||||
if(ch_name in src.channels)
|
||||
if(ch_name in channels)
|
||||
continue
|
||||
src.channels += ch_name
|
||||
src.channels[ch_name] = keyslot2.channels[ch_name]
|
||||
channels += ch_name
|
||||
channels[ch_name] = keyslot2.channels[ch_name]
|
||||
|
||||
if(keyslot2.translate_binary)
|
||||
src.translate_binary = 1
|
||||
translate_binary = TRUE
|
||||
|
||||
if(keyslot2.translate_hive)
|
||||
src.translate_hive = 1
|
||||
translate_hive = TRUE
|
||||
|
||||
if(keyslot2.syndie)
|
||||
src.syndie = 1
|
||||
syndiekey = keyslot2
|
||||
|
||||
|
||||
for(var/ch_name in channels)
|
||||
if(!radio_controller)
|
||||
src.name = "broken radio headset"
|
||||
name = "broken radio headset"
|
||||
return
|
||||
|
||||
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
|
||||
@@ -414,5 +417,5 @@
|
||||
/obj/item/radio/headset/proc/make_syndie() // Turns normal radios into Syndicate radios!
|
||||
qdel(keyslot1)
|
||||
keyslot1 = new /obj/item/encryptionkey/syndicate
|
||||
syndie = 1
|
||||
syndiekey = keyslot1
|
||||
recalculateChannels()
|
||||
@@ -75,8 +75,8 @@
|
||||
name = "illicit intercom"
|
||||
desc = "Talk through this. Evilly"
|
||||
frequency = SYND_FREQ
|
||||
subspace_transmission = 1
|
||||
syndie = 1
|
||||
subspace_transmission = TRUE
|
||||
syndiekey = new /obj/item/encryptionkey/syndicate/nukeops
|
||||
|
||||
/obj/item/radio/intercom/syndicate/New()
|
||||
..()
|
||||
@@ -129,7 +129,7 @@
|
||||
if(isnull(position) || !(position.z in level))
|
||||
return -1
|
||||
if(freq in ANTAG_FREQS)
|
||||
if(!(src.syndie))
|
||||
if(!(syndiekey))
|
||||
return -1//Prevents broadcast of messages over devices lacking the encryption
|
||||
|
||||
return canhear_range
|
||||
|
||||
@@ -36,7 +36,7 @@ var/global/list/default_medbay_channels = list(
|
||||
var/listening = 1
|
||||
var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h
|
||||
var/subspace_transmission = 0
|
||||
var/syndie = 0//Holder to see if it's a syndicate encrpyed radio
|
||||
var/obj/item/encryptionkey/syndicate/syndiekey = null //Holder for the syndicate encryption key if present
|
||||
var/disable_timer = 0 //How many times this is disabled by EMPs
|
||||
|
||||
var/is_special = 0 //For electropacks mostly, skips Topic() checks
|
||||
@@ -131,7 +131,7 @@ var/global/list/default_medbay_channels = list(
|
||||
data["chan_list"] = chanlist
|
||||
data["chan_list_len"] = chanlist.len
|
||||
|
||||
if(syndie)
|
||||
if(syndiekey)
|
||||
data["useSyndMode"] = 1
|
||||
|
||||
return data
|
||||
@@ -395,8 +395,12 @@ var/global/list/default_medbay_channels = list(
|
||||
if(ishuman(M) && M.GetVoice() != real_name)
|
||||
displayname = M.GetVoice()
|
||||
jobname = "Unknown"
|
||||
voicemask = 1
|
||||
voicemask = TRUE
|
||||
|
||||
if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ)
|
||||
displayname = syndiekey.fake_name
|
||||
jobname = "Unknown"
|
||||
voicemask = TRUE
|
||||
|
||||
|
||||
/* ###### Radio headsets can only broadcast through subspace ###### */
|
||||
@@ -552,7 +556,7 @@ var/global/list/default_medbay_channels = list(
|
||||
if(!position || !(position.z in level))
|
||||
return -1
|
||||
if(freq in ANTAG_FREQS)
|
||||
if(!(syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
||||
if(!(syndiekey))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
||||
return -1
|
||||
if(!freq) //recieved on main frequency
|
||||
if(!listening)
|
||||
@@ -652,7 +656,6 @@ var/global/list/default_medbay_channels = list(
|
||||
subspace_transmission = 1
|
||||
|
||||
/obj/item/radio/borg/syndicate
|
||||
syndie = 1
|
||||
keyslot = new /obj/item/encryptionkey/syndicate
|
||||
|
||||
/obj/item/radio/borg/syndicate/CanUseTopic(mob/user, datum/topic_state/state)
|
||||
@@ -669,6 +672,7 @@ var/global/list/default_medbay_channels = list(
|
||||
|
||||
/obj/item/radio/borg/syndicate/New()
|
||||
..()
|
||||
syndiekey = keyslot
|
||||
set_frequency(SYND_FREQ)
|
||||
|
||||
/obj/item/radio/borg/deathsquad
|
||||
@@ -726,32 +730,32 @@ var/global/list/default_medbay_channels = list(
|
||||
return
|
||||
|
||||
/obj/item/radio/borg/proc/recalculateChannels()
|
||||
src.channels = list()
|
||||
src.syndie = 0
|
||||
channels = list()
|
||||
syndiekey = null
|
||||
|
||||
var/mob/living/silicon/robot/D = src.loc
|
||||
var/mob/living/silicon/robot/D = loc
|
||||
if(D.module)
|
||||
for(var/ch_name in D.module.channels)
|
||||
if(ch_name in src.channels)
|
||||
if(ch_name in channels)
|
||||
continue
|
||||
src.channels += ch_name
|
||||
src.channels[ch_name] += D.module.channels[ch_name]
|
||||
channels += ch_name
|
||||
channels[ch_name] += D.module.channels[ch_name]
|
||||
if(keyslot)
|
||||
for(var/ch_name in keyslot.channels)
|
||||
if(ch_name in src.channels)
|
||||
if(ch_name in channels)
|
||||
continue
|
||||
src.channels += ch_name
|
||||
src.channels[ch_name] += keyslot.channels[ch_name]
|
||||
channels += ch_name
|
||||
channels[ch_name] += keyslot.channels[ch_name]
|
||||
|
||||
if(keyslot.syndie)
|
||||
src.syndie = 1
|
||||
syndiekey = keyslot
|
||||
|
||||
|
||||
for(var/ch_name in src.channels)
|
||||
for(var/ch_name in channels)
|
||||
if(!radio_controller)
|
||||
sleep(30) // Waiting for the radio_controller to be created.
|
||||
if(!radio_controller)
|
||||
src.name = "broken radio"
|
||||
name = "broken radio"
|
||||
return
|
||||
|
||||
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
|
||||
@@ -814,7 +818,7 @@ var/global/list/default_medbay_channels = list(
|
||||
data["chan_list"] = chanlist
|
||||
data["chan_list_len"] = chanlist.len
|
||||
|
||||
if(syndie)
|
||||
if(syndiekey)
|
||||
data["useSyndMode"] = 1
|
||||
|
||||
data["has_loudspeaker"] = 1
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
|
||||
/obj/item/borg/upgrade/syndicate
|
||||
name = "illegal equipment module"
|
||||
desc = "Unlocks the hidden, deadlier functions of a cyborg"
|
||||
desc = "Unlocks the hidden, deadlier functions of a cyborg. Also prevents emag subversion."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
origin_tech = "combat=4;syndicate=1"
|
||||
require_module = 1
|
||||
|
||||
@@ -220,6 +220,7 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \
|
||||
origin_tech = "materials=4"
|
||||
sheettype = "tranquillite"
|
||||
materials = list(MAT_TRANQUILLITE=MINERAL_MATERIAL_AMOUNT)
|
||||
wall_allowed = FALSE //no tranquilite walls in code
|
||||
|
||||
/obj/item/stack/sheet/mineral/tranquillite/New(loc, amount=null)
|
||||
..()
|
||||
|
||||
@@ -174,7 +174,8 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
|
||||
new /datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40),
|
||||
new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),
|
||||
new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),
|
||||
new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15)
|
||||
new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),
|
||||
new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50)
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/wood
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
var/full_window = null //moving the var declaration to here so this can be checked cleaner until someone is willing to make them share a base type properly
|
||||
usesound = 'sound/items/Deconstruct.ogg'
|
||||
toolspeed = 1
|
||||
var/wall_allowed = TRUE //determines if sheet can be used in wall construction or not.
|
||||
|
||||
|
||||
// Since the sheetsnatcher was consolidated into weapon/storage/bag we now use
|
||||
|
||||
@@ -1,7 +1,34 @@
|
||||
/*
|
||||
CONTAINS:
|
||||
RCD
|
||||
RCD // no fucking shit sherlock
|
||||
*/
|
||||
#define RCD_PAGE_MAIN 1
|
||||
#define RCD_PAGE_AIRLOCK 2
|
||||
|
||||
#define RCD_MODE_TURF "Turf"
|
||||
#define RCD_MODE_AIRLOCK "Airlock"
|
||||
#define RCD_MODE_DECON "Deconstruct"
|
||||
#define RCD_MODE_WINDOW "Windows"
|
||||
|
||||
GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
/obj/machinery/door/airlock = "Standard", /obj/machinery/door/airlock/glass = "Standard (Glass)",
|
||||
/obj/machinery/door/airlock/command = "Command", /obj/machinery/door/airlock/command/glass = "Command (Glass)",
|
||||
/obj/machinery/door/airlock/security = "Security", /obj/machinery/door/airlock/security/glass = "Security (Glass)",
|
||||
/obj/machinery/door/airlock/engineering = "Engineering", /obj/machinery/door/airlock/engineering/glass = "Engineering (Glass)",
|
||||
/obj/machinery/door/airlock/medical = "Medical", /obj/machinery/door/airlock/medical/glass = "Medical (Glass)",
|
||||
/obj/machinery/door/airlock/maintenance = "Maintenance", /obj/machinery/door/airlock/maintenance/glass = "Maintenance (Glass)",
|
||||
/obj/machinery/door/airlock/external = "External", /obj/machinery/door/airlock/external/glass = "External (Glass)",
|
||||
/obj/machinery/door/airlock/maintenance/external = "External Maintenance",
|
||||
/obj/machinery/door/airlock/maintenance/external/glass = "External Maintenance (Glass)",
|
||||
/obj/machinery/door/airlock/freezer = "Freezer",
|
||||
/obj/machinery/door/airlock/mining = "Mining", /obj/machinery/door/airlock/mining/glass = "Mining (Glass)",
|
||||
/obj/machinery/door/airlock/research = "Research", /obj/machinery/door/airlock/research/glass = "Research (Glass)",
|
||||
/obj/machinery/door/airlock/atmos = "Atmospherics", /obj/machinery/door/airlock/atmos/glass = "Atmospherics (Glass)",
|
||||
/obj/machinery/door/airlock/science = "Science", /obj/machinery/door/airlock/science/glass = "Science (Glass)",
|
||||
/obj/machinery/door/airlock/hatch = "Airtight Hatch",
|
||||
/obj/machinery/door/airlock/maintenance_hatch = "Maintenance Hatch"
|
||||
))
|
||||
|
||||
/obj/item/rcd
|
||||
name = "rapid-construction-device (RCD)"
|
||||
desc = "A device used to rapidly build and deconstruct walls, floors and airlocks."
|
||||
@@ -21,76 +48,123 @@ RCD
|
||||
toolspeed = 1
|
||||
usesound = 'sound/items/Deconstruct.ogg'
|
||||
flags_2 = NO_MAT_REDEMPTION_2
|
||||
req_access = list(access_engine)
|
||||
|
||||
// Important shit
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
var/max_matter = 100
|
||||
var/matter = 0
|
||||
var/working = 0
|
||||
var/mode = 1
|
||||
var/max_matter = 100
|
||||
var/mode = RCD_MODE_TURF
|
||||
var/canRwall = 0
|
||||
var/menu = 1
|
||||
|
||||
// UI shit
|
||||
var/menu = RCD_PAGE_MAIN
|
||||
var/locked = TRUE
|
||||
var/door_type = /obj/machinery/door/airlock
|
||||
var/door_name = "Airlock"
|
||||
req_access = list(access_engine)
|
||||
var/list/door_accesses = list()
|
||||
var/list/door_accesses_list = list()
|
||||
var/one_access
|
||||
var/locked = 1
|
||||
var/static/list/allowed_door_types = list(
|
||||
/obj/machinery/door/airlock = "Standard", /obj/machinery/door/airlock/glass = "Standard (Glass)",
|
||||
/obj/machinery/door/airlock/command = "Command", /obj/machinery/door/airlock/command/glass = "Command (Glass)",
|
||||
/obj/machinery/door/airlock/security = "Security", /obj/machinery/door/airlock/security/glass = "Security (Glass)",
|
||||
/obj/machinery/door/airlock/engineering = "Engineering", /obj/machinery/door/airlock/engineering/glass = "Engineering (Glass)",
|
||||
/obj/machinery/door/airlock/medical = "Medical", /obj/machinery/door/airlock/medical/glass = "Medical (Glass)",
|
||||
/obj/machinery/door/airlock/maintenance = "Maintenance", /obj/machinery/door/airlock/maintenance/glass = "Maintenance (Glass)",
|
||||
/obj/machinery/door/airlock/external = "External", /obj/machinery/door/airlock/external/glass = "External (Glass)",
|
||||
/obj/machinery/door/airlock/maintenance/external = "External Maintenance", /obj/machinery/door/airlock/maintenance/external/glass = "External Maintenance (Glass)",
|
||||
/obj/machinery/door/airlock/freezer = "Freezer",
|
||||
/obj/machinery/door/airlock/mining = "Mining", /obj/machinery/door/airlock/mining/glass = "Mining (Glass)",
|
||||
/obj/machinery/door/airlock/research = "Research", /obj/machinery/door/airlock/research/glass = "Research (Glass)",
|
||||
/obj/machinery/door/airlock/atmos = "Atmospherics", /obj/machinery/door/airlock/atmos/glass = "Atmospherics (Glass)",
|
||||
/obj/machinery/door/airlock/science = "Science", /obj/machinery/door/airlock/science/glass = "Science (Glass)",
|
||||
/obj/machinery/door/airlock/hatch = "Airtight Hatch",
|
||||
/obj/machinery/door/airlock/maintenance_hatch = "Maintenance Hatch")
|
||||
|
||||
/obj/item/rcd/New()
|
||||
desc = "A RCD. It currently holds [matter]/[max_matter] matter-units."
|
||||
// Stupid shit
|
||||
var/static/allowed_targets = list(/turf, /obj/structure/grille, /obj/structure/window, /obj/structure/lattice, /obj/machinery/door/airlock)
|
||||
|
||||
/obj/item/rcd/Initialize()
|
||||
. = ..()
|
||||
spark_system = new /datum/effect_system/spark_spread
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
GLOB.rcd_list += src
|
||||
|
||||
door_accesses_list = list()
|
||||
for(var/access in get_all_accesses())
|
||||
door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses))
|
||||
return
|
||||
|
||||
/obj/item/rcd/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user, "MATTER: [matter]/[max_matter] matter-units.")
|
||||
to_chat(user, "MODE: [mode].")
|
||||
|
||||
/obj/item/rcd/Destroy()
|
||||
QDEL_NULL(spark_system)
|
||||
GLOB.rcd_list -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/rcd/proc/get_airlock_image(airlock_type)
|
||||
var/obj/machinery/door/airlock/proto = airlock_type
|
||||
var/ic = initial(proto.icon)
|
||||
var/mutable_appearance/MA = mutable_appearance(ic, "closed")
|
||||
if(!initial(proto.glass))
|
||||
MA.overlays += "fill_closed"
|
||||
// Not scaling these down to button size because they look horrible then, instead just bumping up radius.
|
||||
return MA
|
||||
|
||||
/obj/item/rcd/proc/check_menu(mob/living/user)
|
||||
if(!istype(user))
|
||||
return FALSE
|
||||
if(user.incapacitated() || !user.Adjacent(src))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/rcd/attackby(obj/item/W, mob/user, params)
|
||||
..()
|
||||
|
||||
if(istype(W, /obj/item/rcd_ammo))
|
||||
var/obj/item/rcd_ammo/R = W
|
||||
if((matter + R.ammoamt) > max_matter)
|
||||
to_chat(user, "<span class='notice'>The RCD can't hold any more matter-units.</span>")
|
||||
return
|
||||
matter += R.ammoamt
|
||||
user.drop_item()
|
||||
qdel(W)
|
||||
if(!user.unEquip(R))
|
||||
to_chat(user, "<span class='warning'>[R] is stuck to your hand!</span>")
|
||||
return
|
||||
qdel(R)
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>The RCD now holds [matter]/[max_matter] matter-units.</span>")
|
||||
desc = "A RCD. It currently holds [matter]/[max_matter] matter-units."
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
/obj/item/rcd/proc/radial_menu(mob/user)
|
||||
if(!check_menu(user))
|
||||
return
|
||||
var/list/choices = list(
|
||||
RCD_MODE_AIRLOCK = image(icon = 'icons/obj/interface.dmi', icon_state = "airlock"),
|
||||
RCD_MODE_DECON = image(icon = 'icons/obj/interface.dmi', icon_state = "delete"),
|
||||
RCD_MODE_WINDOW = image(icon = 'icons/obj/interface.dmi', icon_state = "grillewindow"),
|
||||
RCD_MODE_TURF = image(icon = 'icons/obj/interface.dmi', icon_state = "wallfloor"),
|
||||
"UI" = image(icon = 'icons/obj/interface.dmi', icon_state = "ui_interact")
|
||||
)
|
||||
if(mode == RCD_MODE_AIRLOCK)
|
||||
choices += list(
|
||||
"Change Access" = image(icon = 'icons/obj/interface.dmi', icon_state = "access"),
|
||||
"Change Airlock Type" = image(icon = 'icons/obj/interface.dmi', icon_state = "airlocktype")
|
||||
)
|
||||
choices -= mode // Get rid of the current mode, clicking it won't do anything.
|
||||
var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user))
|
||||
if(!check_menu(user))
|
||||
return
|
||||
switch(choice)
|
||||
if(RCD_MODE_AIRLOCK, RCD_MODE_DECON, RCD_MODE_WINDOW, RCD_MODE_TURF)
|
||||
mode = choice
|
||||
if("UI")
|
||||
menu = RCD_PAGE_MAIN
|
||||
ui_interact(user)
|
||||
return
|
||||
if("Change Access", "Change Airlock Type")
|
||||
menu = RCD_PAGE_AIRLOCK
|
||||
ui_interact(user)
|
||||
return
|
||||
else
|
||||
return
|
||||
playsound(src, 'sound/effects/pop.ogg', 50, 0)
|
||||
to_chat(user, "<span class='notice'>You change [src]'s mode to '[choice]'.</span>")
|
||||
|
||||
|
||||
/obj/item/rcd/attack_self(mob/user)
|
||||
//Change the mode
|
||||
ui_interact(user)
|
||||
//Change the mode // Oh I thought the UI was just for fucking staring at
|
||||
radial_menu(user)
|
||||
|
||||
/obj/item/rcd/attack_self_tk(mob/user)
|
||||
ui_interact(user)
|
||||
radial_menu(user)
|
||||
|
||||
/obj/item/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
@@ -110,10 +184,10 @@ RCD
|
||||
data["one_access"] = one_access
|
||||
data["locked"] = locked
|
||||
|
||||
if(menu == 2)
|
||||
if(menu == RCD_PAGE_AIRLOCK)
|
||||
var/list/door_types_list = list()
|
||||
for(var/type in allowed_door_types)
|
||||
door_types_list[++door_types_list.len] = list("name" = allowed_door_types[type], "type" = type)
|
||||
for(var/type in GLOB.rcd_door_types)
|
||||
door_types_list[++door_types_list.len] = list("name" = GLOB.rcd_door_types[type], "type" = type)
|
||||
data["allowed_door_types"] = door_types_list
|
||||
|
||||
data["door_accesses"] = door_accesses_list
|
||||
@@ -128,13 +202,13 @@ RCD
|
||||
spark_system.start()
|
||||
|
||||
if(href_list["mode"])
|
||||
mode = text2num(href_list["mode"])
|
||||
mode = href_list["mode"]
|
||||
. = 1
|
||||
|
||||
if(href_list["door_type"])
|
||||
var/new_door_type = text2path(href_list["door_type"])
|
||||
if(!(new_door_type in allowed_door_types))
|
||||
message_admins("RCD HREF exploit attempted by [key_name(usr, usr.client)]!")
|
||||
if(!(new_door_type in GLOB.rcd_door_types))
|
||||
message_admins("RCD Door HREF exploit attempted by [key_name(usr)]!")
|
||||
return
|
||||
door_type = new_door_type
|
||||
. = 1
|
||||
@@ -144,239 +218,229 @@ RCD
|
||||
. = 1
|
||||
|
||||
if(href_list["login"])
|
||||
if(istype(usr,/mob/living/silicon))
|
||||
locked = 0
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/pda))
|
||||
var/obj/item/pda/pda = I
|
||||
I = pda.id
|
||||
var/obj/item/card/id/ID = I
|
||||
if(istype(ID) && ID)
|
||||
if(check_access(ID))
|
||||
locked = 0
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>This ID lacks access.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You can't swipe without your ID in hand.</span>")
|
||||
if(allowed(usr))
|
||||
locked = FALSE
|
||||
. = 1
|
||||
|
||||
if(href_list["logout"])
|
||||
locked = 1
|
||||
locked = TRUE
|
||||
. = 1
|
||||
|
||||
if(href_list["toggle_one_access"] && !locked)
|
||||
one_access = !one_access
|
||||
. = 1
|
||||
if(!locked)
|
||||
if(href_list["toggle_one_access"])
|
||||
one_access = !one_access
|
||||
. = 1
|
||||
|
||||
if(href_list["toggle_access"] && !locked)
|
||||
var/href_access = text2num(href_list["toggle_access"])
|
||||
if(href_access in door_accesses)
|
||||
door_accesses -= href_access
|
||||
else
|
||||
door_accesses += href_access
|
||||
door_accesses_list = list()
|
||||
for(var/access in get_all_accesses())
|
||||
door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses))
|
||||
. = 1
|
||||
if(href_list["toggle_access"])
|
||||
var/href_access = text2num(href_list["toggle_access"])
|
||||
if(href_access in door_accesses)
|
||||
door_accesses -= href_access
|
||||
else
|
||||
door_accesses += href_access
|
||||
door_accesses_list = list()
|
||||
for(var/access in get_all_accesses())
|
||||
door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses))
|
||||
. = 1
|
||||
|
||||
if(href_list["choice"] && !locked)
|
||||
var/temp_t = sanitize(copytext(input("Enter a custom Airlock Name.","Airlock Name"),1,MAX_MESSAGE_LEN))
|
||||
if(temp_t)
|
||||
door_name = temp_t
|
||||
if(href_list["choice"])
|
||||
var/temp_t = sanitize(copytext(input("Enter a custom Airlock Name.", "Airlock Name"), 1, MAX_MESSAGE_LEN))
|
||||
if(temp_t)
|
||||
door_name = temp_t
|
||||
|
||||
/obj/item/rcd/proc/activate()
|
||||
playsound(loc, usesound, 50, 1)
|
||||
/obj/item/rcd/proc/mode_turf(atom/A, mob/user)
|
||||
if(isspaceturf(A) || istype(A, /obj/structure/lattice))
|
||||
if(useResource(1, user))
|
||||
to_chat(user, "Building Floor...")
|
||||
playsound(loc, usesound, 50, 1)
|
||||
var/turf/AT = get_turf(A)
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
if(isfloorturf(A))
|
||||
if(checkResource(3, user))
|
||||
to_chat(user, "Building Wall...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 20 * toolspeed, target = A))
|
||||
if(!useResource(3, user))
|
||||
return FALSE
|
||||
playsound(loc, usesound, 50, 1)
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/wall)
|
||||
return TRUE
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
/obj/item/rcd/proc/mode_airlock(atom/A, mob/user)
|
||||
if(isfloorturf(A) && checkResource(10, user))
|
||||
to_chat(user, "Building Airlock...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = A))
|
||||
if(locate(/obj/machinery/door/airlock) in A.contents)
|
||||
return FALSE
|
||||
if(!useResource(10, user))
|
||||
return FALSE
|
||||
playsound(loc, usesound, 50, 1)
|
||||
var/obj/machinery/door/airlock/T = new door_type(A)
|
||||
T.name = door_name
|
||||
T.autoclose = TRUE
|
||||
if(one_access)
|
||||
T.req_one_access = door_accesses.Copy()
|
||||
else
|
||||
T.req_access = door_accesses.Copy()
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
/obj/item/rcd/proc/mode_decon(atom/A, mob/user)
|
||||
if(iswallturf(A))
|
||||
if(istype(A, /turf/simulated/wall/r_wall) && !canRwall)
|
||||
return FALSE
|
||||
if(checkResource(5, user))
|
||||
to_chat(user, "Deconstructing Wall...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 40 * toolspeed, target = A))
|
||||
if(!useResource(5, user))
|
||||
return FALSE
|
||||
playsound(loc, usesound, 50, 1)
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
if(isfloorturf(A))
|
||||
if(checkResource(5, user))
|
||||
to_chat(user, "Deconstructing Floor...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = A))
|
||||
if(!useResource(5, user))
|
||||
return FALSE
|
||||
playsound(loc, usesound, 50, 1)
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/space)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
if(istype(A, /obj/machinery/door/airlock))
|
||||
if(checkResource(20, user))
|
||||
to_chat(user, "Deconstructing Airlock...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = A))
|
||||
if(!useResource(20, user))
|
||||
return FALSE
|
||||
playsound(loc, usesound, 50, 1)
|
||||
qdel(A)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
if(istype(A, /obj/structure/window)) // You mean the grille of course, do you?
|
||||
A = locate(/obj/structure/grille) in A.loc
|
||||
if(istype(A, /obj/structure/grille))
|
||||
if(!checkResource(2, user))
|
||||
return 0
|
||||
to_chat(user, "Deconstructing window...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(!do_after(user, 20 * toolspeed, target = A))
|
||||
return 0
|
||||
if(!useResource(2, user))
|
||||
return 0
|
||||
playsound(loc, usesound, 50, 1)
|
||||
var/turf/T1 = get_turf(A)
|
||||
QDEL_NULL(A)
|
||||
for(var/obj/structure/window/W in T1.contents)
|
||||
qdel(W)
|
||||
for(var/cdir in cardinal)
|
||||
var/turf/T2 = get_step(T1, cdir)
|
||||
if(locate(/obj/structure/window/full/shuttle) in T2)
|
||||
continue // Shuttle windows? Nah. We don't need extra windows there.
|
||||
if(!(locate(/obj/structure/grille) in T2))
|
||||
continue
|
||||
for(var/obj/structure/window/W in T2)
|
||||
if(W.dir == turn(cdir, 180))
|
||||
qdel(W)
|
||||
var/obj/structure/window/reinforced/W = new(T2)
|
||||
W.dir = turn(cdir, 180)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/rcd/proc/mode_window(atom/A, mob/user)
|
||||
if(isfloorturf(A))
|
||||
if(locate(/obj/structure/grille) in A)
|
||||
return 0 // We already have window
|
||||
if(!checkResource(2, user))
|
||||
return 0
|
||||
to_chat(user, "Constructing window...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(!do_after(user, 20 * toolspeed, target = A))
|
||||
return 0
|
||||
if(locate(/obj/structure/grille) in A)
|
||||
return 0 // We already have window
|
||||
if(!useResource(2, user))
|
||||
return 0
|
||||
playsound(loc, usesound, 50, 1)
|
||||
new /obj/structure/grille(A)
|
||||
for(var/obj/structure/window/W in A)
|
||||
qdel(W)
|
||||
for(var/cdir in cardinal)
|
||||
var/turf/T = get_step(A, cdir)
|
||||
if(locate(/obj/structure/grille) in T)
|
||||
for(var/obj/structure/window/W in T)
|
||||
if(W.dir == turn(cdir, 180))
|
||||
qdel(W)
|
||||
else // Build a window!
|
||||
var/obj/structure/window/reinforced/W = new(A)
|
||||
W.dir = cdir
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating) // Platings go under windows.
|
||||
return 1
|
||||
|
||||
/obj/item/rcd/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity) return
|
||||
if(istype(A,/area/shuttle)||istype(A,/turf/space/transit))
|
||||
return 0
|
||||
if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/window) || istype(A, /obj/structure/lattice)))
|
||||
return 0
|
||||
if(!proximity)
|
||||
return FALSE
|
||||
if(istype(A, /turf/space/transit))
|
||||
return FALSE
|
||||
if(!is_type_in_list(A, allowed_targets))
|
||||
return FALSE
|
||||
|
||||
switch(mode)
|
||||
if(1)
|
||||
if(istype(A, /turf/space) || istype(A, /obj/structure/lattice))
|
||||
if(useResource(1, user))
|
||||
to_chat(user, "Building Floor...")
|
||||
activate()
|
||||
var/turf/AT = get_turf(A)
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
if(istype(A, /turf/simulated/floor))
|
||||
if(checkResource(3, user))
|
||||
to_chat(user, "Building Wall ...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 20 * toolspeed, target = A))
|
||||
if(!useResource(3, user))
|
||||
return 0
|
||||
activate()
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/wall)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
if(2)
|
||||
if(istype(A, /turf/simulated/floor))
|
||||
if(checkResource(10, user))
|
||||
to_chat(user, "Building Airlock...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = A))
|
||||
for(var/obj/machinery/door/airlock/D in A.contents)
|
||||
return 0
|
||||
if(!useResource(10, user))
|
||||
return 0
|
||||
activate()
|
||||
var/obj/machinery/door/airlock/T = new door_type(A)
|
||||
T.name = door_name
|
||||
T.autoclose = 1
|
||||
if(one_access)
|
||||
T.req_one_access = door_accesses.Copy()
|
||||
else
|
||||
T.req_access = door_accesses.Copy()
|
||||
return 1
|
||||
return 0
|
||||
return 0
|
||||
|
||||
if(3)
|
||||
if(istype(A, /turf/simulated/wall))
|
||||
if(istype(A, /turf/simulated/wall/r_wall) && !canRwall)
|
||||
return 0
|
||||
if(checkResource(5, user))
|
||||
to_chat(user, "Deconstructing Wall...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 40 * toolspeed, target = A))
|
||||
if(!useResource(5, user))
|
||||
return 0
|
||||
activate()
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
if(istype(A, /turf/simulated/floor))
|
||||
if(checkResource(5, user))
|
||||
to_chat(user, "Deconstructing Floor...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = A))
|
||||
if(!useResource(5, user))
|
||||
return 0
|
||||
activate()
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/space)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
if(istype(A, /obj/machinery/door/airlock))
|
||||
if(checkResource(20, user))
|
||||
to_chat(user, "Deconstructing Airlock...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = A))
|
||||
if(!useResource(20, user))
|
||||
return 0
|
||||
activate()
|
||||
qdel(A)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
if(istype(A, /obj/structure/window)) // You mean the grille of course, do you?
|
||||
A = locate(/obj/structure/grille) in A.loc
|
||||
|
||||
if(istype(A, /obj/structure/grille))
|
||||
if(!checkResource(2, user))
|
||||
return 0
|
||||
to_chat(user, "Deconstructing window...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(!do_after(user, 20 * toolspeed, target = A))
|
||||
return 0
|
||||
if(locate(/obj/structure/window/full/shuttle) in A.contents)
|
||||
return 0 // Let's not give shuttle-griefers an easy time.
|
||||
if(!useResource(2, user))
|
||||
return 0
|
||||
activate()
|
||||
var/turf/T1 = get_turf(A)
|
||||
QDEL_NULL(A)
|
||||
for(var/obj/structure/window/W in T1.contents)
|
||||
qdel(W)
|
||||
for(var/cdir in cardinal)
|
||||
var/turf/T2 = get_step(T1, cdir)
|
||||
if(locate(/obj/structure/window/full/shuttle) in T2.contents)
|
||||
continue // Shuttle windows? Nah. We don't need extra windows there.
|
||||
if(!(locate(/obj/structure/grille) in T2.contents))
|
||||
continue
|
||||
for(var/obj/structure/window/W in T2.contents)
|
||||
if(W.dir == turn(cdir, 180))
|
||||
qdel(W)
|
||||
var/obj/structure/window/reinforced/W = new(T2)
|
||||
W.dir = turn(cdir, 180)
|
||||
return 1
|
||||
return 0
|
||||
if(4)
|
||||
if(istype(A, /turf/simulated/floor))
|
||||
if(locate(/obj/structure/grille) in contents)
|
||||
return 0 // We already have window
|
||||
if(!checkResource(2, user))
|
||||
return 0
|
||||
to_chat(user, "Constructing window...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(!do_after(user, 20 * toolspeed, target = A))
|
||||
return 0
|
||||
if(locate(/obj/structure/grille) in A.contents)
|
||||
return 0 // We already have window
|
||||
if(!useResource(2, user))
|
||||
return 0
|
||||
activate()
|
||||
new /obj/structure/grille(A)
|
||||
for(var/obj/structure/window/W in contents)
|
||||
qdel(W)
|
||||
for(var/cdir in cardinal)
|
||||
var/turf/T = get_step(A, cdir)
|
||||
if(locate(/obj/structure/grille) in T.contents)
|
||||
for(var/obj/structure/window/W in T.contents)
|
||||
if(W.dir == turn(cdir, 180))
|
||||
qdel(W)
|
||||
else // Build a window!
|
||||
var/obj/structure/window/reinforced/W = new(A)
|
||||
W.dir = cdir
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating) // Platings go under windows.
|
||||
return 1
|
||||
if(RCD_MODE_TURF)
|
||||
. = mode_turf(A, user)
|
||||
if(RCD_MODE_AIRLOCK)
|
||||
. = mode_airlock(A, user)
|
||||
if(RCD_MODE_DECON)
|
||||
. = mode_decon(A, user)
|
||||
if(RCD_MODE_WINDOW)
|
||||
. = mode_window(A, user)
|
||||
else
|
||||
to_chat(user, "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin.")
|
||||
return 0
|
||||
. = 0
|
||||
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
/obj/item/rcd/proc/useResource(var/amount, var/mob/user)
|
||||
/obj/item/rcd/proc/useResource(amount, mob/user)
|
||||
if(matter < amount)
|
||||
return 0
|
||||
matter -= amount
|
||||
desc = "A RCD. It currently holds [matter]/[max_matter] matter-units."
|
||||
SSnanoui.update_uis(src)
|
||||
return 1
|
||||
|
||||
/obj/item/rcd/proc/checkResource(var/amount, var/mob/user)
|
||||
/obj/item/rcd/proc/checkResource(amount, mob/user)
|
||||
return matter >= amount
|
||||
/obj/item/rcd/borg/useResource(var/amount, var/mob/user)
|
||||
|
||||
/obj/item/rcd/borg/useResource(amount, mob/user)
|
||||
if(!isrobot(user))
|
||||
return 0
|
||||
return user:cell:use(amount * 160)
|
||||
var/mob/living/silicon/robot/R = user
|
||||
return R.cell.use(amount * 160)
|
||||
|
||||
/obj/item/rcd/borg/checkResource(var/amount, var/mob/user)
|
||||
/obj/item/rcd/borg/checkResource(amount, mob/user)
|
||||
if(!isrobot(user))
|
||||
return 0
|
||||
return user:cell:charge >= (amount * 160)
|
||||
var/mob/living/silicon/robot/R = user
|
||||
return R.cell.charge >= (amount * 160)
|
||||
|
||||
/obj/item/rcd/borg/New()
|
||||
..()
|
||||
desc = "A device used to rapidly build and deconstruct walls, floors and airlocks."
|
||||
/obj/item/rcd/borg
|
||||
canRwall = 1
|
||||
|
||||
|
||||
/obj/item/rcd/proc/detonate_pulse()
|
||||
audible_message("<span class='danger'><b>[src] begins to vibrate and \
|
||||
buzz loudly!</b></span>","<span class='danger'><b>[src] begins \
|
||||
|
||||
@@ -23,6 +23,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
body_parts_covered = null
|
||||
attack_verb = null
|
||||
container_type = INJECTABLE
|
||||
var/lit = FALSE
|
||||
var/icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
|
||||
var/icon_off = "cigoff"
|
||||
@@ -50,7 +51,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
processing_objects -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/mask/cigarette/attack(var/mob/living/M, var/mob/living/user, def_zone)
|
||||
/obj/item/clothing/mask/cigarette/attack(mob/living/M, mob/living/user, def_zone)
|
||||
if(istype(M) && M.on_fire)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(M)
|
||||
@@ -63,7 +64,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
/obj/item/clothing/mask/cigarette/fire_act()
|
||||
light()
|
||||
|
||||
/obj/item/clothing/mask/cigarette/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
/obj/item/clothing/mask/cigarette/attackby(obj/item/W as obj, mob/user as mob, mob/living/carbon/target, params)
|
||||
..()
|
||||
if(istype(W, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/WT = W
|
||||
@@ -88,7 +89,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
else if(istype(W, /obj/item/melee/energy/sword/saber))
|
||||
var/obj/item/melee/energy/sword/saber/S = W
|
||||
if(S.active)
|
||||
light("<span class='warning'>[user] swings their [W], barely missing their nose. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [name] in the process.</span>")
|
||||
light("<span class='warning'>[user] makes a violent slashing motion, barely missing [user.p_their()] nose as light flashes. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [name] with [W] in the process.</span>")
|
||||
|
||||
else if(istype(W, /obj/item/assembly/igniter))
|
||||
light("<span class='notice'>[user] fiddles with [W], and manages to light [user.p_their()] [name].</span>")
|
||||
@@ -106,6 +107,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
|
||||
//can't think of any other way to update the overlays :<
|
||||
user.update_inv_wear_mask()
|
||||
target.update_inv_wear_mask()
|
||||
user.update_inv_l_hand()
|
||||
user.update_inv_r_hand()
|
||||
return
|
||||
@@ -194,7 +196,8 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
if(reagents && reagents.total_volume) // check if it has any reagents at all
|
||||
if(is_being_smoked) // if it's being smoked, transfer reagents to the mob
|
||||
var/mob/living/carbon/C = loc
|
||||
reagents.trans_to(C, REAGENTS_METABOLISM)
|
||||
for (var/datum/reagent/R in reagents.reagent_list)
|
||||
reagents.trans_to(C, REAGENTS_METABOLISM)
|
||||
if(!reagents.total_volume) // There were reagents, but now they're gone
|
||||
to_chat(C, "<span class='notice'>Your [name] loses its flavor.</span>")
|
||||
else // else just remove some of the reagents
|
||||
@@ -231,7 +234,7 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
throw_speed = 0.5
|
||||
item_state = "spliffoff"
|
||||
smoketime = 180
|
||||
chem_volume = 50
|
||||
chem_volume = 100
|
||||
|
||||
/obj/item/clothing/mask/cigarette/rollie/New()
|
||||
..()
|
||||
@@ -305,6 +308,8 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
|
||||
|
||||
/obj/item/clothing/mask/cigarette/cigar/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/reagent_containers))
|
||||
return
|
||||
if(istype(W, /obj/item/match))
|
||||
..()
|
||||
else
|
||||
@@ -370,6 +375,8 @@ LIGHTERS ARE IN LIGHTERS.DM
|
||||
return
|
||||
|
||||
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/reagent_containers))
|
||||
return
|
||||
if(istype(W, /obj/item/match))
|
||||
..()
|
||||
else
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
if(!iconrotation && P.is_bent_pipe()) //Automatically rotates dispensed pipes if the user selected auto-rotation
|
||||
P.dir = turn(user.dir, 135)
|
||||
else if(!iconrotation && P.pipe_type in list(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_CAP, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_INJECTOR, PIPE_PASV_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction
|
||||
P.flip()
|
||||
P.dir = turn(user.dir, -180)
|
||||
else if(iconrotation && P.is_bent_pipe()) //If user selected a rotation and the pipe is bent
|
||||
P.dir = turn(iconrotation, -45)
|
||||
else if(!iconrotation) //If user selected a rotation
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
origin_tech = "engineering=2"
|
||||
slot_flags = SLOT_BELT | SLOT_POCKET
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
storage_slots = 50
|
||||
storage_slots = 10
|
||||
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
can_hold = list(/obj/item/stack/ore)
|
||||
@@ -168,7 +168,7 @@
|
||||
max_combined_w_class = 100 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
can_hold = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/food/snacks/ash_flora)
|
||||
can_hold = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/food/snacks/grown/ash_flora)
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
/obj/item/storage/bag/plants/portaseeder
|
||||
|
||||
@@ -254,7 +254,7 @@
|
||||
new /obj/item/grenade/flashbang(src)
|
||||
new /obj/item/grenade/flashbang(src)
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/storage/belt/soulstone
|
||||
name = "soul stone belt"
|
||||
desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away"
|
||||
@@ -295,6 +295,13 @@
|
||||
item_state = "military"
|
||||
max_w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/storage/belt/military/traitor
|
||||
name = "tool-belt"
|
||||
desc = "Can hold various tools. This model seems to have additional compartments."
|
||||
icon_state = "utilitybelt"
|
||||
item_state = "utility"
|
||||
use_item_overlays = 1 // So it will still show tools in it in case sec get lazy and just glance at it.
|
||||
|
||||
/obj/item/storage/belt/military/abductor
|
||||
name = "agent belt"
|
||||
desc = "A belt used by abductor agents."
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
if(ishuman(usr)) //so monkeys can take off their backpacks -- Urist
|
||||
var/mob/M = usr
|
||||
|
||||
if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
|
||||
if(istype(M.loc,/obj/mecha) || M.incapacitated(FALSE, TRUE, TRUE)) // Stops inventory actions in a mech as well as while being incapacitated
|
||||
return
|
||||
|
||||
if(over_object == M && Adjacent(M)) // this must come before the screen objects only block
|
||||
|
||||
@@ -31,6 +31,10 @@
|
||||
new /obj/item/flashlight/flare(src)
|
||||
new /obj/item/radio(src)
|
||||
|
||||
/obj/item/storage/toolbox/emergency/old
|
||||
name = "rusty red toolbox"
|
||||
icon_state = "toolbox_red_old"
|
||||
|
||||
/obj/item/storage/toolbox/mechanical
|
||||
name = "mechanical toolbox"
|
||||
icon_state = "blue"
|
||||
@@ -48,6 +52,10 @@
|
||||
/obj/item/storage/toolbox/mechanical/greytide
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/storage/toolbox/mechanical/old
|
||||
name = "rusty blue toolbox"
|
||||
icon_state = "toolbox_blue_old"
|
||||
|
||||
/obj/item/storage/toolbox/electrical
|
||||
name = "electrical toolbox"
|
||||
icon_state = "yellow"
|
||||
|
||||
@@ -87,24 +87,28 @@
|
||||
|
||||
/obj/item/storage/box/syndie_kit/space
|
||||
name = "Boxed Space Suit and Helmet"
|
||||
can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red)
|
||||
can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red, /obj/item/tank/emergency_oxygen/syndi, /obj/item/clothing/mask/gas/syndicate)
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/storage/box/syndie_kit/space/New()
|
||||
..()
|
||||
new /obj/item/clothing/suit/space/syndicate/black/red(src)
|
||||
new /obj/item/clothing/head/helmet/space/syndicate/black/red(src)
|
||||
new /obj/item/clothing/mask/gas/syndicate(src)
|
||||
new /obj/item/tank/emergency_oxygen/syndi(src)
|
||||
return
|
||||
|
||||
/obj/item/storage/box/syndie_kit/hardsuit
|
||||
name = "Boxed Blood Red Suit and Helmet"
|
||||
can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/clothing/head/helmet/space/hardsuit/syndi)
|
||||
can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/clothing/head/helmet/space/hardsuit/syndi, /obj/item/tank/emergency_oxygen/syndi, /obj/item/clothing/mask/gas/syndicate)
|
||||
max_w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/storage/box/syndie_kit/hardsuit/New()
|
||||
..()
|
||||
new /obj/item/clothing/suit/space/hardsuit/syndi(src)
|
||||
new /obj/item/clothing/head/helmet/space/hardsuit/syndi(src)
|
||||
new /obj/item/clothing/mask/gas/syndicate(src)
|
||||
new /obj/item/tank/emergency_oxygen/syndi(src)
|
||||
return
|
||||
|
||||
/obj/item/storage/box/syndie_kit/elite_hardsuit
|
||||
|
||||
@@ -147,6 +147,12 @@
|
||||
icon_state = "emergency_engi"
|
||||
volume = 6
|
||||
|
||||
/obj/item/tank/emergency_oxygen/syndi
|
||||
name = "suspicious emergency oxygen tank"
|
||||
icon_state = "emergency_syndi"
|
||||
desc = "A dark emergency oxygen tank. The label on the back reads \"Original Oxygen Tank Design, Do Not Steal.\""
|
||||
volume = 6
|
||||
|
||||
/obj/item/tank/emergency_oxygen/double
|
||||
name = "double emergency oxygen tank"
|
||||
icon_state = "emergency_double"
|
||||
|
||||
@@ -458,6 +458,9 @@
|
||||
E.heal_damage(rembrute,0,0,1)
|
||||
rembrute = nrembrute
|
||||
user.visible_message("<span class='alert'>\The [user] patches some dents on \the [M]'s [E.name] with \the [src].</span>")
|
||||
if(H.bleed_rate && H.isSynthetic())
|
||||
H.bleed_rate = 0
|
||||
user.visible_message("<span class='alert'>\The [user] patches some leaks on [M] with \the [src].</span>")
|
||||
return 1
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -104,8 +104,8 @@
|
||||
playsound(loc, 'sound/weapons/slash.ogg', 100, 1)
|
||||
|
||||
/obj/attack_animal(mob/living/simple_animal/M)
|
||||
if(!M.melee_damage_upper && !M.obj_damage)
|
||||
M.custom_emote(1, "[M.friendly] [src]")
|
||||
if((M.a_intent == INTENT_HELP && M.ckey) || (!M.melee_damage_upper && !M.obj_damage))
|
||||
M.custom_emote(1, "[M.friendly] [src].")
|
||||
return 0
|
||||
else
|
||||
var/play_soundeffect = 1
|
||||
|
||||
@@ -64,26 +64,26 @@
|
||||
if(C == user)
|
||||
do_climb(user)
|
||||
|
||||
/obj/structure/proc/density_check()
|
||||
for(var/obj/O in orange(0, src))
|
||||
if(O.density && !istype(O, /obj/machinery/door/window)) //Ignores windoors, as those already block climbing, otherwise a windoor on the opposite side of a table would prevent climbing.
|
||||
return O
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.density)
|
||||
return T
|
||||
return null
|
||||
|
||||
/obj/structure/proc/do_climb(var/mob/living/user)
|
||||
|
||||
if(!can_touch(user) || !climbable)
|
||||
return
|
||||
var/blocking_object = density_check()
|
||||
if(blocking_object)
|
||||
to_chat(user, "<span class='warning'>You cannot climb [src], as it is blocked by \a [blocking_object]!</span>")
|
||||
return
|
||||
|
||||
for(var/obj/O in range(0, src))
|
||||
if(O.density == 1 && O != src && !istype(O, /obj/machinery/door/window)) //Ignores windoors, as those already block climbing, otherwise a windoor on the opposite side of a table would prevent climbing.
|
||||
to_chat(user, "<span class='warning'>You cannot climb [src], as it is blocked by \a [O]!</span>")
|
||||
return
|
||||
for(var/turf/T in range(0, src))
|
||||
if(T.density == 1)
|
||||
to_chat(user, "<span class='warning'>You cannot climb [src], as it is blocked by \a [T]!</span>")
|
||||
return
|
||||
var/turf/T = src.loc
|
||||
if(!T || !istype(T)) return
|
||||
|
||||
var/obj/machinery/door/poddoor/shutters/S = locate() in T.contents
|
||||
if(S && S.density) return
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] starts climbing onto \the [src]!</span>")
|
||||
climber = user
|
||||
if(!do_after(user, 50, target = src))
|
||||
@@ -94,11 +94,6 @@
|
||||
climber = null
|
||||
return
|
||||
|
||||
S = locate() in T.contents
|
||||
if(S && S.density)
|
||||
climber = null
|
||||
return
|
||||
|
||||
usr.loc = get_turf(src)
|
||||
if(get_turf(user) == get_turf(src))
|
||||
usr.visible_message("<span class='warning'>[user] climbs onto \the [src]!</span>")
|
||||
|
||||
@@ -191,6 +191,7 @@
|
||||
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
|
||||
new /obj/item/clothing/head/helmet(src)
|
||||
new /obj/item/melee/baton/loaded(src)
|
||||
new /obj/item/clothing/suit/armor/secjacket(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/brigdoc
|
||||
|
||||
@@ -201,6 +201,9 @@
|
||||
return
|
||||
|
||||
var/obj/item/stack/sheet/S = W
|
||||
if(!S.wall_allowed)
|
||||
to_chat(user, "<span class='warning'>You don't think that is good material for a wall!</span>")
|
||||
return
|
||||
|
||||
if(istype(S, /obj/item/stack/sheet/wood))
|
||||
if(state == GIRDER_DISPLACED)
|
||||
|
||||
@@ -296,7 +296,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/piano/Initialize()
|
||||
song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
|
||||
if(song)
|
||||
song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
|
||||
..()
|
||||
|
||||
/obj/structure/piano/attack_hand(mob/user as mob)
|
||||
|
||||
@@ -80,11 +80,12 @@
|
||||
density = TRUE
|
||||
icon_state = "up"
|
||||
M.pixel_y = initial(M.pixel_y)
|
||||
else
|
||||
density = FALSE
|
||||
icon_state = "down"
|
||||
M.pixel_x = M.get_standard_pixel_x_offset(M.lying)
|
||||
M.pixel_y = M.get_standard_pixel_y_offset(M.lying)
|
||||
|
||||
/obj/structure/bed/roller/post_unbuckle_mob(mob/living/M)
|
||||
density = FALSE
|
||||
icon_state = "down"
|
||||
M.pixel_x = M.get_standard_pixel_x_offset(M.lying)
|
||||
M.pixel_y = M.get_standard_pixel_y_offset(M.lying)
|
||||
|
||||
/obj/item/roller
|
||||
name = "roller bed"
|
||||
|
||||
@@ -180,12 +180,16 @@
|
||||
var/obj/item/grab/G = I
|
||||
if(G.affecting.buckled)
|
||||
to_chat(user, "<span class='warning'>[G.affecting] is buckled to [G.affecting.buckled]!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if(G.state < GRAB_AGGRESSIVE)
|
||||
to_chat(user, "<span class='warning'>You need a better grip to do that!</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if(!G.confirm())
|
||||
return 0
|
||||
return FALSE
|
||||
var/blocking_object = density_check()
|
||||
if(blocking_object)
|
||||
to_chat(user, "<span class='warning'>You cannot do this there is \a [blocking_object] in the way!</span>")
|
||||
return FALSE
|
||||
G.affecting.forceMove(get_turf(src))
|
||||
G.affecting.Weaken(2)
|
||||
item_placed(G.affecting)
|
||||
@@ -193,7 +197,7 @@
|
||||
"<span class='userdanger'>[G.assailant] pushes [G.affecting] onto [src].</span>")
|
||||
add_attack_logs(G.assailant, G.affecting, "Pushed onto a table")
|
||||
qdel(I)
|
||||
return 1
|
||||
return TRUE
|
||||
qdel(I)
|
||||
|
||||
/obj/structure/table/attackby(obj/item/I, mob/user, params)
|
||||
@@ -283,6 +287,9 @@
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(!can_touch(usr) || ismouse(usr))
|
||||
return
|
||||
|
||||
if(!unflip())
|
||||
to_chat(usr, "<span class='notice'>It won't budge.</span>")
|
||||
return
|
||||
|
||||
@@ -562,7 +562,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
|
||||
desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof."
|
||||
icon_state = "plasmarwindow"
|
||||
shardtype = /obj/item/shard/plasma
|
||||
glass_type = /obj/item/stack/sheet/plasmaglass
|
||||
glass_type = /obj/item/stack/sheet/plasmarglass
|
||||
reinf = TRUE
|
||||
max_integrity = 160
|
||||
explosion_block = 2
|
||||
@@ -607,10 +607,12 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
|
||||
icon = 'icons/obj/smooth_structures/rplasma_window.dmi'
|
||||
icon_state = "rplasmawindow"
|
||||
shardtype = /obj/item/shard/plasma
|
||||
glass_type = /obj/item/stack/sheet/plasmaglass
|
||||
glass_type = /obj/item/stack/sheet/plasmarglass
|
||||
smooth = SMOOTH_TRUE
|
||||
reinf = TRUE
|
||||
max_integrity = 320
|
||||
explosion_block = 2
|
||||
armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100)
|
||||
|
||||
/obj/structure/window/full/plasmareinforced/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user