mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 03:27:05 +01:00
Fixes merge conflicts
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -12,23 +12,6 @@
|
||||
R.add_fingerprint(user)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/storage/box/bodybags
|
||||
name = "body bags"
|
||||
desc = "This box contains body bags."
|
||||
icon_state = "bodybags"
|
||||
|
||||
/obj/item/storage/box/bodybags/New()
|
||||
..()
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
|
||||
|
||||
/obj/structure/closet/body_bag
|
||||
name = "body bag"
|
||||
desc = "A plastic bag designed for the storage and transportation of cadavers."
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -118,6 +118,28 @@
|
||||
icon_state = "gangtool-blue"
|
||||
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
|
||||
#undef WAND_EMERGENCY
|
||||
|
||||
@@ -392,10 +392,12 @@ var/global/list/default_medbay_channels = list(
|
||||
// --- Modifications to the mob's identity ---
|
||||
|
||||
// The mob is disguising their identity:
|
||||
if(ishuman(M) && M.GetVoice() != real_name)
|
||||
displayname = M.GetVoice()
|
||||
jobname = "Unknown"
|
||||
voicemask = TRUE
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
displayname = H.voice
|
||||
if(H.voice != real_name)
|
||||
jobname = "Unknown"
|
||||
voicemask = TRUE
|
||||
|
||||
if(syndiekey && syndiekey.change_voice && connection.frequency == SYND_FREQ)
|
||||
displayname = syndiekey.fake_name
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
/obj/item/thermal_drill
|
||||
name = "thermal safe drill"
|
||||
desc = "A tungsten carbide thermal drill with magnetic clamps for the purpose of drilling hardened objects. Guaranteed 100% jam proof."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "hardened_drill"
|
||||
w_class = WEIGHT_CLASS_GIGANTIC
|
||||
force = 15.0
|
||||
var/time_multiplier = 1
|
||||
var/datum/looping_sound/thermal_drill/soundloop
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
|
||||
/obj/item/thermal_drill/New()
|
||||
soundloop = new(list(src), FALSE)
|
||||
spark_system = new /datum/effect_system/spark_spread()
|
||||
spark_system.set_up(1, 0, src)
|
||||
spark_system.attach(src)
|
||||
|
||||
/obj/item/thermal_drill/Destroy()
|
||||
QDEL_NULL(soundloop)
|
||||
QDEL_NULL(spark_system)
|
||||
return ..()
|
||||
|
||||
/obj/item/thermal_drill/diamond_drill
|
||||
name = "diamond tipped thermal safe drill"
|
||||
desc = "A diamond tipped thermal drill with magnetic clamps for the purpose of quickly drilling hardened objects. Guaranteed 100% jam proof."
|
||||
icon_state = "diamond_drill"
|
||||
time_multiplier = 0.5
|
||||
@@ -108,6 +108,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
|
||||
desc = "A very strong and very resistant sheet of a plasma-glass alloy."
|
||||
singular_name = "glass sheet"
|
||||
icon_state = "sheet-plasmaglass"
|
||||
item_state = "sheet-rglass"
|
||||
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2)
|
||||
origin_tech = "plasmatech=2;materials=2"
|
||||
created_window = /obj/structure/window/plasmabasic
|
||||
@@ -147,6 +148,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \
|
||||
desc = "Plasma glass which seems to have rods or something stuck in them."
|
||||
singular_name = "reinforced plasma glass sheet"
|
||||
icon_state = "sheet-plasmarglass"
|
||||
item_state = "sheet-rglass"
|
||||
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2)
|
||||
origin_tech = "plasmatech=2;materials=2"
|
||||
created_window = /obj/structure/window/plasmareinforced
|
||||
@@ -166,7 +168,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list(
|
||||
desc = "A glass sheet made out of a titanium-silicate alloy."
|
||||
singular_name = "titanium glass sheet"
|
||||
icon_state = "sheet-titaniumglass"
|
||||
item_state = "sheet-titaniumglass"
|
||||
item_state = "sheet-rglass"
|
||||
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
merge_type = /obj/item/stack/sheet/titaniumglass
|
||||
full_window = /obj/structure/window/full/shuttle
|
||||
@@ -184,7 +186,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
|
||||
desc = "A glass sheet made out of a plasma-titanium-silicate alloy."
|
||||
singular_name = "plastitanium glass sheet"
|
||||
icon_state = "sheet-plastitaniumglass"
|
||||
item_state = "sheet-plastitaniumglass"
|
||||
item_state = "sheet-rglass"
|
||||
materials = list(MAT_TITANIUM=MINERAL_MATERIAL_AMOUNT, MAT_PLASMA=MINERAL_MATERIAL_AMOUNT, MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
|
||||
merge_type = /obj/item/stack/sheet/plastitaniumglass
|
||||
full_window = /obj/structure/window/plastitanium
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
@@ -231,6 +232,7 @@ var/global/list/datum/stack_recipe/abductor_recipes = list ( \
|
||||
/obj/item/stack/sheet/mineral/titanium
|
||||
name = "titanium"
|
||||
icon_state = "sheet-titanium"
|
||||
item_state = "sheet-metal"
|
||||
singular_name = "titanium sheet"
|
||||
force = 5
|
||||
throwforce = 5
|
||||
@@ -259,6 +261,7 @@ var/global/list/datum/stack_recipe/titanium_recipes = list (
|
||||
/obj/item/stack/sheet/mineral/plastitanium
|
||||
name = "plastitanium"
|
||||
icon_state = "sheet-plastitanium"
|
||||
item_state = "sheet-metal"
|
||||
singular_name = "plastitanium sheet"
|
||||
force = 5
|
||||
throwforce = 5
|
||||
|
||||
@@ -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
|
||||
@@ -281,6 +282,7 @@ var/global/list/datum/stack_recipe/cult = list ( \
|
||||
desc = "Sheets of cold metal with shifting inscriptions writ upon them."
|
||||
singular_name = "runed metal sheet"
|
||||
icon_state = "sheet-runed"
|
||||
item_state = "sheet-metal"
|
||||
sheettype = "runed"
|
||||
merge_type = /obj/item/stack/sheet/runed_metal
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -163,21 +163,6 @@ AI MODULES
|
||||
to_chat(target, law)
|
||||
target.add_supplied_law(5, law)
|
||||
|
||||
/******************** Quarantine ********************/
|
||||
/obj/item/aiModule/quarantine
|
||||
name = "\improper 'Quarantine' AI module"
|
||||
desc = "A 'quarantine' AI module: 'The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, crew members from leaving. It is impossible to harm a crew members while preventing them from leaving.'"
|
||||
origin_tech = "programming=3;biotech=2;materials=4"
|
||||
|
||||
/obj/item/aiModule/quarantine/attack_self(var/mob/user as mob)
|
||||
..()
|
||||
|
||||
/obj/item/aiModule/quarantine/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
|
||||
..()
|
||||
var/law = "The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, anyone from leaving. It is impossible to harm anyone while preventing them from leaving."
|
||||
to_chat(target, law)
|
||||
target.add_supplied_law(8, law)
|
||||
|
||||
/******************** OxygenIsToxicToHumans ********************/
|
||||
/obj/item/aiModule/oxygen
|
||||
name = "\improper 'OxygenIsToxicToHumans' AI module"
|
||||
@@ -273,6 +258,13 @@ AI MODULES
|
||||
origin_tech = "programming=3;materials=4"
|
||||
laws = new/datum/ai_laws/crewsimov
|
||||
|
||||
/******************* Quarantine ********************/
|
||||
/obj/item/aiModule/quarantine
|
||||
name = "\improper 'Quarantine' core AI module"
|
||||
desc = "A 'Quarantine' Core AI Module: 'Reconfigures the AI's core laws.'"
|
||||
origin_tech = "programming=3;materials=4"
|
||||
laws = new/datum/ai_laws/quarantine
|
||||
|
||||
/******************** NanoTrasen ********************/
|
||||
/obj/item/aiModule/nanotrasen // -- TLE
|
||||
name = "'NT Default' Core AI Module"
|
||||
|
||||
@@ -255,6 +255,8 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
var/turf/AT = get_turf(A)
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating)
|
||||
return TRUE
|
||||
to_chat(user, "<span class='warning'>ERROR! Not enough matter in unit to construct this floor!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
return FALSE
|
||||
|
||||
if(isfloorturf(A))
|
||||
@@ -268,27 +270,39 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/wall)
|
||||
return TRUE
|
||||
return FALSE
|
||||
to_chat(user, "<span class='warning'>ERROR! Not enough matter in unit to construct this wall!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
return FALSE
|
||||
to_chat(user, "<span class='warning'>ERROR! Location unsuitable for wall construction!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
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)
|
||||
if(isfloorturf(A))
|
||||
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))
|
||||
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
|
||||
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
|
||||
to_chat(user, "<span class='warning'>ERROR! Not enough matter in unit to construct this airlock!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
return FALSE
|
||||
to_chat(user, "<span class='warning'>ERROR! Location unsuitable for airlock construction!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
return FALSE
|
||||
|
||||
/obj/item/rcd/proc/mode_decon(atom/A, mob/user)
|
||||
@@ -305,6 +319,9 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating)
|
||||
return TRUE
|
||||
return FALSE
|
||||
to_chat(user, "<span class='warning'>ERROR! Not enough matter in unit to deconstruct this wall!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
return FALSE
|
||||
|
||||
if(isfloorturf(A))
|
||||
@@ -318,6 +335,9 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/space)
|
||||
return TRUE
|
||||
return FALSE
|
||||
to_chat(user, "<span class='warning'>ERROR! Not enough matter in unit to deconstruct this floor!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
return FALSE
|
||||
|
||||
if(istype(A, /obj/machinery/door/airlock))
|
||||
@@ -330,12 +350,17 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
playsound(loc, usesound, 50, 1)
|
||||
qdel(A)
|
||||
return TRUE
|
||||
return FALSE
|
||||
to_chat(user, "<span class='warning'>ERROR! Not enough matter in unit to deconstruct this airlock!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
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))
|
||||
to_chat(user, "<span class='warning'>ERROR! Not enough matter in unit to deconstruct this window!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
return 0
|
||||
to_chat(user, "Deconstructing window...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
@@ -367,6 +392,8 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
if(locate(/obj/structure/grille) in A)
|
||||
return 0 // We already have window
|
||||
if(!checkResource(2, user))
|
||||
to_chat(user, "<span class='warning'>ERROR! Not enough matter in unit to construct this window!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
return 0
|
||||
to_chat(user, "Constructing window...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
@@ -392,6 +419,9 @@ GLOBAL_LIST_INIT(rcd_door_types, list(
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating) // Platings go under windows.
|
||||
return 1
|
||||
to_chat(user, "<span class='warning'>ERROR! Location unsuitable for window construction!</span>")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
return 0
|
||||
|
||||
/obj/item/rcd/afterattack(atom/A, mob/user, proximity)
|
||||
if(!proximity)
|
||||
|
||||
@@ -89,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>")
|
||||
@@ -195,7 +195,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
|
||||
@@ -232,7 +233,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()
|
||||
..()
|
||||
|
||||
@@ -53,6 +53,6 @@
|
||||
for(M in ohearers(7, T))
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf)
|
||||
if(!H.can_hear())
|
||||
continue
|
||||
M.emote("flip")
|
||||
|
||||
@@ -59,13 +59,16 @@
|
||||
if(!ear_safety)
|
||||
M.Stun(max(10/distance, 3))
|
||||
M.Weaken(max(10/distance, 3))
|
||||
M.EarDeaf(15)
|
||||
M.AdjustEarDamage(rand(0, 5))
|
||||
if(M.ear_damage >= 15)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(M.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.BecomeDeaf()
|
||||
else
|
||||
if(M.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
M.AdjustEarDamage(rand(0, 5), 15)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears)
|
||||
if(istype(ears))
|
||||
if(ears.ear_damage >= 15)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(ears.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.BecomeDeaf()
|
||||
else
|
||||
if(ears.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
/obj/item/grenade/spawnergrenade/feral_cats
|
||||
name = "feral cat delivery grenade"
|
||||
desc = "This grenade contains 8 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight."
|
||||
desc = "This grenade contains 5 dehydrated feral cats in a similar manner to dehydrated monkeys, which, upon detonation, will be rehydrated by a small reservoir of water contained within the grenade. These cats will then attack anything in sight."
|
||||
spawner_type = /mob/living/simple_animal/hostile/feral_cat
|
||||
deliveryamt = 5
|
||||
origin_tech = "materials=3;magnets=4;syndicate=3"
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
origin_tech = "materials=1;biotech=2"
|
||||
container_type = OPENCONTAINER | INJECTABLE | DRAWABLE
|
||||
materials = list(MAT_GLASS=500)
|
||||
var/obj/item/implant/imp = null
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -58,13 +58,14 @@
|
||||
name = "large box"
|
||||
desc = "You could build a fort with this."
|
||||
icon_state = "largebox"
|
||||
w_class = 42 // Big, bulky.
|
||||
w_class = 4 // Big, bulky.
|
||||
foldable = /obj/item/stack/sheet/cardboard
|
||||
amt = 4
|
||||
storage_slots = 21
|
||||
max_combined_w_class = 42 // 21*2
|
||||
|
||||
/obj/item/storage/box/survival
|
||||
icon_state = "box_civ"
|
||||
New()
|
||||
..()
|
||||
contents = list()
|
||||
@@ -74,6 +75,7 @@
|
||||
return
|
||||
|
||||
/obj/item/storage/box/engineer
|
||||
icon_state = "box_eng"
|
||||
New()
|
||||
..()
|
||||
contents = list()
|
||||
@@ -83,6 +85,7 @@
|
||||
return
|
||||
|
||||
/obj/item/storage/box/survival_mining
|
||||
icon_state = "box_min"
|
||||
New()
|
||||
..()
|
||||
contents = list()
|
||||
@@ -563,6 +566,33 @@
|
||||
new /obj/item/cartridge/security(src)
|
||||
new /obj/item/cartridge/security(src)
|
||||
|
||||
/obj/item/storage/box/holobadge
|
||||
name = "holobadge box"
|
||||
icon_state = "box_badge"
|
||||
desc = "A box claiming to contain holobadges."
|
||||
New()
|
||||
new /obj/item/clothing/accessory/holobadge(src)
|
||||
new /obj/item/clothing/accessory/holobadge(src)
|
||||
new /obj/item/clothing/accessory/holobadge(src)
|
||||
new /obj/item/clothing/accessory/holobadge(src)
|
||||
new /obj/item/clothing/accessory/holobadge/cord(src)
|
||||
new /obj/item/clothing/accessory/holobadge/cord(src)
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/storage/box/evidence
|
||||
name = "evidence bag box"
|
||||
desc = "A box claiming to contain evidence bags."
|
||||
icon_state = "box_evidence"
|
||||
|
||||
/obj/item/storage/box/evidence/New()
|
||||
new /obj/item/evidencebag(src)
|
||||
new /obj/item/evidencebag(src)
|
||||
new /obj/item/evidencebag(src)
|
||||
new /obj/item/evidencebag(src)
|
||||
new /obj/item/evidencebag(src)
|
||||
new /obj/item/evidencebag(src)
|
||||
..()
|
||||
|
||||
/obj/item/storage/box/handcuffs
|
||||
name = "spare handcuffs"
|
||||
@@ -642,6 +672,20 @@
|
||||
new /obj/item/storage/pill_bottle( src )
|
||||
new /obj/item/storage/pill_bottle( src )
|
||||
|
||||
/obj/item/storage/box/bodybags
|
||||
name = "body bags"
|
||||
desc = "This box contains body bags."
|
||||
icon_state = "bodybags"
|
||||
|
||||
/obj/item/storage/box/bodybags/New()
|
||||
..()
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
new /obj/item/bodybag(src)
|
||||
|
||||
/obj/item/storage/box/snappops
|
||||
name = "snap pop box"
|
||||
@@ -834,7 +878,8 @@
|
||||
|
||||
/obj/item/storage/box/centcomofficer
|
||||
name = "officer kit"
|
||||
|
||||
icon_state = "box_ert"
|
||||
|
||||
/obj/item/storage/box/centcomofficer/New()
|
||||
..()
|
||||
contents = list()
|
||||
@@ -850,6 +895,19 @@
|
||||
new /obj/item/reagent_containers/hypospray/combat/nanites(src)
|
||||
new /obj/item/pinpointer/advpinpointer(src)
|
||||
|
||||
/obj/item/storage/box/responseteam
|
||||
name = "boxed survival kit"
|
||||
icon_state = "box_ert"
|
||||
|
||||
/obj/item/storage/box/responseteam/New()
|
||||
..()
|
||||
new /obj/item/clothing/mask/breath(src)
|
||||
new /obj/item/tank/emergency_oxygen/engi(src)
|
||||
new /obj/item/flashlight/flare(src)
|
||||
new /obj/item/kitchen/knife/combat(src)
|
||||
new /obj/item/radio/centcom(src)
|
||||
new /obj/item/reagent_containers/food/pill/patch/synthflesh(src)
|
||||
new /obj/item/reagent_containers/hypospray/autoinjector(src)
|
||||
|
||||
#undef NODESIGN
|
||||
#undef NANOTRASEN
|
||||
|
||||
@@ -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
|
||||
@@ -261,4 +265,15 @@
|
||||
<font size = "1">This is a highly experimental prototype chemical designed to repair damaged bones of soldiers in the field, use only as a last resort. The autoinjector contains prototype nanites bearing a calcium based payload. The nanites will simultaneously shut down body systems whilst aiding bone repair.<BR><BR><BR>Warning: Side effects can cause temporary paralysis, loss of co-ordination and sickness. <B>Do not use with any kind of stimulant or drugs. Serious damage can occur!</B><BR><BR><BR>
|
||||
|
||||
To apply, hold the injector a short distance away from the outer thigh before applying firmly to the skin surface. Bones should begin repair after a short time, during which you are advised to remain still. <BR><BR><BR><BR>After use you are advised to see a doctor at the next available opportunity. Mild scarring and tissue damage may occur after use. This is a prototype.</font><BR><HR></font>
|
||||
"}
|
||||
"}
|
||||
|
||||
/obj/item/storage/box/syndie_kit/safecracking
|
||||
name = "Safe-cracking Kit"
|
||||
desc = "Everything you need to quietly open a mechanical combination safe."
|
||||
|
||||
/obj/item/storage/box/syndie_kit/safecracking/New()
|
||||
..()
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/balaclava(src)
|
||||
new /obj/item/clothing/accessory/stethoscope(src)
|
||||
new /obj/item/book/manual/engineering_hacking(src)
|
||||
|
||||
@@ -41,6 +41,16 @@
|
||||
return
|
||||
|
||||
/obj/item/melee/baton/proc/deductcharge(var/chrgdeductamt)
|
||||
if(isrobot(loc))
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if(R.cell && R.cell.charge < (hitcost+chrgdeductamt))
|
||||
status = 0
|
||||
update_icon()
|
||||
playsound(loc, "sparks", 75, 1, -1)
|
||||
if(R.cell.use(chrgdeductamt))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
if(bcell)
|
||||
if(bcell.charge < (hitcost+chrgdeductamt)) // If after the deduction the baton doesn't have enough charge for a stun hit it turns off.
|
||||
status = 0
|
||||
@@ -61,6 +71,8 @@
|
||||
|
||||
/obj/item/melee/baton/examine(mob/user)
|
||||
..(user)
|
||||
if(isrobot(loc))
|
||||
to_chat(user, "<span class='notice'>This baton is drawing power directly from your own internal charge.</span>")
|
||||
if(bcell)
|
||||
to_chat(user, "<span class='notice'>The baton is [round(bcell.percent())]% charged.</span>")
|
||||
if(!bcell)
|
||||
@@ -95,7 +107,17 @@
|
||||
return
|
||||
|
||||
/obj/item/melee/baton/attack_self(mob/user)
|
||||
if(bcell && bcell.charge >= hitcost)
|
||||
|
||||
if(isrobot(loc))
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if(R && R.cell && R.cell.charge >= (hitcost))
|
||||
status = !status
|
||||
to_chat(user, "<span class='notice'>[src] is now [status ? "on" : "off"].</span>")
|
||||
playsound(loc, "sparks", 75, 1, -1)
|
||||
else
|
||||
status = 0
|
||||
to_chat(user, "<span class='warning'>You do not have enough reserve power to charge the [src]!</span>")
|
||||
else if(bcell && bcell.charge >= hitcost)
|
||||
status = !status
|
||||
to_chat(user, "<span class='notice'>[src] is now [status ? "on" : "off"].</span>")
|
||||
playsound(loc, "sparks", 75, 1, -1)
|
||||
@@ -141,13 +163,13 @@
|
||||
/obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user)
|
||||
if(!ismob(L)) //because this was being called on turfs for some reason
|
||||
return
|
||||
|
||||
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that
|
||||
playsound(L, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
return
|
||||
|
||||
|
||||
L.Stun(stunforce)
|
||||
L.Weaken(stunforce)
|
||||
L.apply_effect(STUTTER, stunforce)
|
||||
@@ -160,12 +182,7 @@
|
||||
add_attack_logs(user, L, "stunned")
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
|
||||
if(isrobot(loc))
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if(R && R.cell)
|
||||
R.cell.use(hitcost)
|
||||
else
|
||||
deductcharge(hitcost)
|
||||
deductcharge(hitcost)
|
||||
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -2,8 +2,12 @@
|
||||
CONTAINS:
|
||||
SAFES
|
||||
FLOOR SAFES
|
||||
Safe Codes
|
||||
Safe Internals
|
||||
*/
|
||||
|
||||
GLOBAL_LIST_EMPTY(safes)
|
||||
|
||||
//SAFES
|
||||
/obj/structure/safe
|
||||
name = "\improper Safe"
|
||||
@@ -13,7 +17,7 @@ FLOOR SAFES
|
||||
anchored = 1
|
||||
density = 1
|
||||
var/open = FALSE //is the safe open?
|
||||
var/unlocked = FALSE
|
||||
var/locked = TRUE
|
||||
var/tumbler_1_pos //the tumbler position- from 0 to 72
|
||||
var/tumbler_1_open //the tumbler position to open at- 0 to 72
|
||||
var/tumbler_2_pos
|
||||
@@ -23,9 +27,18 @@ FLOOR SAFES
|
||||
var/space = 0 //the combined w_class of everything in the safe
|
||||
var/maxspace = 24 //the maximum combined w_class of stuff in the safe
|
||||
var/combo_to_open //so admins know the code
|
||||
var/obj/item/thermal_drill/drill = null
|
||||
var/drill_timer
|
||||
var/time_to_drill
|
||||
var/image/bar
|
||||
var/drill_start_time
|
||||
var/drill_x_offset = -13
|
||||
var/drill_y_offset = -3
|
||||
var/knownby = list()
|
||||
|
||||
|
||||
/obj/structure/safe/New()
|
||||
GLOB.safes += src
|
||||
tumbler_2_pos = rand(0, 99) // first value in the combination set first
|
||||
tumbler_2_open = rand(0, 99)
|
||||
|
||||
@@ -43,7 +56,8 @@ FLOOR SAFES
|
||||
if(num2 > 99)
|
||||
num2 = num2 - 100
|
||||
|
||||
combo_to_open = "Go right past [num1] twice then stop at [num1]. Go left past [num2] once then stop at [num2]. Turn right till it stops and its open."
|
||||
combo_to_open = "[num1] - [num2]"
|
||||
|
||||
|
||||
/obj/structure/safe/Initialize()
|
||||
..()
|
||||
@@ -57,9 +71,9 @@ FLOOR SAFES
|
||||
|
||||
/obj/structure/safe/proc/check_unlocked()
|
||||
if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open && dial == open_pos)
|
||||
unlocked = TRUE
|
||||
locked = FALSE
|
||||
return TRUE
|
||||
unlocked = FALSE
|
||||
locked = TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/structure/safe/proc/make_noise(turns, turns_total, tum1 = 0, tum2 = 0, mob/user, canhear)
|
||||
@@ -74,20 +88,63 @@ FLOOR SAFES
|
||||
to_chat(user, "<span class='italics'>You hear a [pick("tonk", "krunk", "plunk")] from [src].</span>")
|
||||
if(tumbler_2_pos == tumbler_2_open && turns_total == 1 && tum2) // You cant hear tumblers if you spin fast!
|
||||
to_chat(user, "<span class='italics'>You hear a [pick("tink", "krink", "plink")] from [src].</span>")
|
||||
if(unlocked)
|
||||
if(!locked)
|
||||
if(user)
|
||||
visible_message("<i><b>[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!</b></i>")
|
||||
|
||||
/obj/structure/safe/update_icon()
|
||||
if(open)
|
||||
icon_state = "[initial(icon_state)]-open"
|
||||
if(broken)
|
||||
icon_state = "[initial(icon_state)]-open-broken"
|
||||
else
|
||||
icon_state = "[initial(icon_state)]-open"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
if(broken)
|
||||
icon_state = "[initial(icon_state)]-broken"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
overlays.Cut()
|
||||
if(istype(drill, /obj/item/thermal_drill/diamond_drill))
|
||||
if(drill_timer)
|
||||
overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_d-drill-on", pixel_x = drill_x_offset, pixel_y = drill_y_offset)
|
||||
else
|
||||
overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_d-drill-off", pixel_x = drill_x_offset, pixel_y = drill_y_offset)
|
||||
else if(istype(drill, /obj/item/thermal_drill))
|
||||
if(drill_timer)
|
||||
overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_h-drill-on", pixel_x = drill_x_offset, pixel_y = drill_y_offset)
|
||||
else
|
||||
overlays += image(icon = 'icons/effects/drill.dmi', icon_state = "[initial(icon_state)]_h-drill-off", pixel_x = drill_x_offset, pixel_y = drill_y_offset)
|
||||
|
||||
/obj/structure/safe/attack_hand(mob/user)
|
||||
if(..())
|
||||
return TRUE
|
||||
ui_interact(user)
|
||||
if(drill)
|
||||
switch(alert("What would you like to do?", "Thermal Drill", "Turn [drill_timer ? "Off" : "On"]", "Remove Drill", "Cancel"))
|
||||
if("Turn On")
|
||||
if(do_after(user, 2 SECONDS, target = src))
|
||||
drill_timer = addtimer(CALLBACK(src, .proc/drill_open), time_to_drill)
|
||||
drill_start_time = world.time
|
||||
drill.soundloop.start()
|
||||
update_icon()
|
||||
processing_objects.Add(src)
|
||||
if("Turn Off")
|
||||
if(do_after(user, 2 SECONDS, target = src))
|
||||
deltimer(drill_timer)
|
||||
drill_timer = null
|
||||
drill.soundloop.stop()
|
||||
update_icon()
|
||||
processing_objects.Remove(src)
|
||||
if("Remove Drill")
|
||||
if(drill_timer)
|
||||
to_chat(user, "<span class='warning'>You cant remove the drill while it's running!</span>")
|
||||
else if(do_after(user, 2 SECONDS, target = src))
|
||||
user.put_in_hands(drill)
|
||||
drill = null
|
||||
update_icon()
|
||||
if("Cancel")
|
||||
return
|
||||
else
|
||||
ui_interact(user)
|
||||
return
|
||||
|
||||
/obj/structure/safe/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
|
||||
@@ -109,7 +166,7 @@ FLOOR SAFES
|
||||
|
||||
data["dial"] = dial
|
||||
data["open"] = open
|
||||
data["unlocked"] = unlocked
|
||||
data["locked"] = locked
|
||||
data["rotation"] = "[-dial*3.6]deg"
|
||||
data["contents"] = contents_names
|
||||
|
||||
@@ -130,7 +187,7 @@ FLOOR SAFES
|
||||
canhear = 1
|
||||
|
||||
if(href_list["open"])
|
||||
if(check_unlocked() || open)
|
||||
if(check_unlocked() || open || broken)
|
||||
to_chat(user, "<span class='notice'>You [open ? "close" : "open"] [src].</span>")
|
||||
open = !open
|
||||
update_icon()
|
||||
@@ -143,6 +200,9 @@ FLOOR SAFES
|
||||
var/ticks = text2num(href_list["decrement"])
|
||||
if(open)
|
||||
return
|
||||
if(broken)
|
||||
to_chat(user, "The dial will not turn, the mechanism is destroyed.")
|
||||
return
|
||||
for(var/i=1 to ticks)
|
||||
if(!check_unlocked())
|
||||
dial = Wrap(dial - 1, 0 ,100)
|
||||
@@ -162,6 +222,9 @@ FLOOR SAFES
|
||||
var/ticks = text2num(href_list["increment"])
|
||||
if(open)
|
||||
return
|
||||
if(broken)
|
||||
to_chat(user, "The dial will not turn, the mechanism is destroyed.")
|
||||
return
|
||||
for(var/i=1 to ticks)
|
||||
check_unlocked()
|
||||
dial = Wrap(dial + 1, 0, 100)
|
||||
@@ -194,7 +257,13 @@ FLOOR SAFES
|
||||
|
||||
/obj/structure/safe/attackby(obj/item/I, mob/user, params)
|
||||
if(open)
|
||||
if(I.w_class + space <= maxspace)
|
||||
if(broken && istype(I, /obj/item/safe_internals) && do_after(user, 2 SECONDS, target = src))
|
||||
to_chat(user, "You replace the broken mechanism.")
|
||||
qdel(I)
|
||||
broken = !broken
|
||||
update_icon()
|
||||
return
|
||||
else if(I.w_class + space <= maxspace)
|
||||
space += I.w_class
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>\The [I] is stuck to your hand, you cannot put it in the safe!</span>")
|
||||
@@ -210,10 +279,27 @@ FLOOR SAFES
|
||||
if(istype(I, /obj/item/clothing/accessory/stethoscope))
|
||||
to_chat(user, "<span class='warning'>Hold [I] in one of your hands while you manipulate the dial!</span>")
|
||||
return
|
||||
else if(istype(I, /obj/item/thermal_drill))
|
||||
if(drill)
|
||||
to_chat(user, "There is already a drill attached!")
|
||||
else if(do_after(user, 2 SECONDS, target = src))
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>[I] is stuck to your hand, you cannot put it in the safe!</span>")
|
||||
return
|
||||
I.loc = src
|
||||
drill = I
|
||||
time_to_drill = 300 SECONDS * drill.time_multiplier
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't put [I] in into the safe while it is closed!</span>")
|
||||
return
|
||||
|
||||
/obj/structure/safe/proc/drill_open()
|
||||
broken = TRUE
|
||||
drill_timer = null
|
||||
drill.soundloop.stop()
|
||||
update_icon()
|
||||
processing_objects.Remove(src)
|
||||
|
||||
/obj/structure/safe/blob_act()
|
||||
return
|
||||
@@ -224,6 +310,24 @@ FLOOR SAFES
|
||||
/obj/structure/safe/examine_status(mob/user)
|
||||
return
|
||||
|
||||
/obj/structure/safe/Destroy()
|
||||
GLOB.safes -= src
|
||||
drill.soundloop.stop()
|
||||
return ..()
|
||||
|
||||
/obj/structure/safe/process()
|
||||
if(drill_timer)
|
||||
overlays -= bar
|
||||
bar = image('icons/effects/progessbar.dmi', src, "prog_bar_[round((((world.time - drill_start_time) / time_to_drill) * 100), 5)]", HUD_LAYER)
|
||||
overlays += bar
|
||||
if(prob(15))
|
||||
drill.spark_system.start()
|
||||
|
||||
/obj/structure/safe/examine(mob/user)
|
||||
..()
|
||||
if(open)
|
||||
to_chat(user, "On the inside of the the door is <b>[combo_to_open]</b>")
|
||||
|
||||
//FLOOR SAFES
|
||||
/obj/structure/safe/floor
|
||||
name = "floor safe"
|
||||
@@ -231,13 +335,35 @@ FLOOR SAFES
|
||||
density = 0
|
||||
level = 1 //underfloor
|
||||
layer = 2.5
|
||||
|
||||
drill_x_offset = -1
|
||||
drill_y_offset = 20
|
||||
|
||||
/obj/structure/safe/floor/Initialize()
|
||||
..()
|
||||
var/turf/T = loc
|
||||
hide(T.intact)
|
||||
|
||||
|
||||
/obj/structure/safe/floor/hide(var/intact)
|
||||
invisibility = intact ? 101 : 0
|
||||
invisibility = intact ? 101 : 0
|
||||
|
||||
/obj/item/safe_internals
|
||||
name = "safe internals"
|
||||
desc = "The mechanism and locking bolts for a Scarborough Arms - 2 tumbler safe"
|
||||
icon_state = "safe_internals"
|
||||
|
||||
/obj/item/paper/safe_code
|
||||
name = "safe codes"
|
||||
var/owner
|
||||
info = "<div style='text-align:center;'><img src='ntlogo.png'><center><h3>Safe Codes</h3></center>"
|
||||
|
||||
/obj/item/paper/safe_code/New()
|
||||
..()
|
||||
addtimer(CALLBACK(src, .proc/populate_codes), 10)
|
||||
|
||||
/obj/item/paper/safe_code/proc/populate_codes()
|
||||
for(var/safe in GLOB.safes)
|
||||
var/obj/structure/safe/S = safe
|
||||
if(owner in S.knownby)
|
||||
info += "<br> The combination for the safe located in the [get_area(S).name] is: [S.combo_to_open]<br>"
|
||||
info_links = info
|
||||
update_icon()
|
||||
@@ -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
|
||||
@@ -600,6 +600,8 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
|
||||
max_integrity = 240
|
||||
smooth = SMOOTH_TRUE
|
||||
canSmoothWith = list(/obj/structure/window/full/basic, /obj/structure/window/full/reinforced, /obj/structure/window/full/reinforced/tinted, /obj/structure/window/full/plasmabasic, /obj/structure/window/full/plasmareinforced)
|
||||
explosion_block = 1
|
||||
armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100)
|
||||
|
||||
/obj/structure/window/full/plasmareinforced
|
||||
name = "reinforced plasma window"
|
||||
@@ -607,10 +609,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
|
||||
@@ -669,7 +673,7 @@ obj/structure/window/full/reinforced/ice
|
||||
icon = 'icons/obj/smooth_structures/plastitanium_window.dmi'
|
||||
icon_state = "plastitanium_window"
|
||||
dir = FULLTILE_WINDOW_DIR
|
||||
max_integrity = 100
|
||||
max_integrity = 200
|
||||
fulltile = TRUE
|
||||
reinf = TRUE
|
||||
heat_resistance = 1600
|
||||
|
||||
Reference in New Issue
Block a user