Fixes merge conflicts

This commit is contained in:
variableundefined
2018-11-14 09:21:21 +08:00
297 changed files with 7017 additions and 5404 deletions
@@ -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,
-17
View File
@@ -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."
+7 -1
View File
@@ -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))
+22
View File
@@ -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
+7 -15
View File
@@ -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"
+45 -15
View File
@@ -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)
+4 -3
View File
@@ -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)
+26 -9
View File
@@ -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"
+3
View File
@@ -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)
+140 -14
View File
@@ -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()
+7 -3
View File
@@ -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