Tool overhaul (usesound & toolspeed), wire descriptions/ghost interaction, add additional tools, refactor can(t)_hold

This commit is contained in:
Markolie
2017-03-05 19:53:20 +01:00
parent 74931d3934
commit 9d9e957df1
71 changed files with 1190 additions and 462 deletions
+67 -25
View File
@@ -1,3 +1,7 @@
#define PROXIMITY_NONE ""
#define PROXIMITY_ON_SCREEN "_red"
#define PROXIMITY_NEAR "_yellow"
/**
* Multitool -- A multitool is used for hacking electronic devices.
* TO-DO -- Using it as a power measurement tool for cables etc. Nannek.
@@ -10,13 +14,15 @@
icon_state = "multitool"
flags = CONDUCT
force = 5.0
w_class = 2
throwforce = 5.0
throw_range = 15
w_class = WEIGHT_CLASS_SMALL
throwforce = 0
throw_range = 7
throw_speed = 3
desc = "You can use this on airlocks or APCs to try to hack them without cutting wires."
materials = list(MAT_METAL=50, MAT_GLASS=20)
origin_tech = "magnets=1;engineering=1"
origin_tech = "magnets=1;engineering=2"
toolspeed = 1
hitsound = 'sound/weapons/tap.ogg'
var/shows_wire_information = FALSE // shows what a wire does if set to TRUE
var/obj/machinery/buffer // simple machine buffer for device linkage
/obj/item/device/multitool/proc/IsBufferA(var/typepath)
@@ -28,38 +34,74 @@
/obj/item/device/multitool/ai_detect
var/track_delay = 0
var/track_cooldown = 0
var/track_delay = 10 //How often it checks for proximity
var/detect_state = PROXIMITY_NONE
var/rangealert = 8 //Glows red when inside
var/rangewarning = 20 //Glows yellow when inside
origin_tech = "magnets=1;engineering=2;syndicate=1"
/obj/item/device/multitool/ai_detect/New()
..()
processing_objects += src
/obj/item/device/multitool/ai_detect/Destroy()
processing_objects -= src
return ..()
/obj/item/device/multitool/ai_detect/process()
if(track_delay > world.time)
if(track_cooldown > world.time)
return
var/found_eye = 0
for(var/mob/camera/aiEye/A in living_mob_list)
var/turf/our_turf = get_turf(src)
var/turf/eye_turf = get_turf(A)
if(get_dist(our_turf, eye_turf) < 9)
found_eye = 1
detect_state = PROXIMITY_NONE
multitool_detect()
icon_state = "[initial(icon_state)][detect_state]"
track_cooldown = world.time + track_delay
/obj/item/device/multitool/ai_detect/proc/multitool_detect()
var/turf/our_turf = get_turf(src)
for(var/mob/living/silicon/ai/AI in ai_list)
if(AI.cameraFollow == src)
detect_state = PROXIMITY_ON_SCREEN
break
if(found_eye)
icon_state = "[initial(icon_state)]_red"
else
icon_state = initial(icon_state)
if(!detect_state && cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
var/datum/camerachunk/chunk = cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
if(chunk)
if(chunk.seenby.len)
for(var/mob/camera/aiEye/A in chunk.seenby)
var/turf/detect_turf = get_turf(A)
if(get_dist(our_turf, detect_turf) < rangealert)
detect_state = PROXIMITY_ON_SCREEN
break
if(get_dist(our_turf, detect_turf) < rangewarning)
detect_state = PROXIMITY_NEAR
break
/obj/item/device/multitool/ai_detect/admin
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item?
track_delay = 5
shows_wire_information = TRUE
track_delay = world.time + 10 // 1 second
return
/obj/item/device/multitool/ai_detect/admin/multitool_detect()
var/turf/our_turf = get_turf(src)
for(var/mob/J in urange(rangewarning,our_turf))
if(check_rights(R_ADMIN, 0, J))
detect_state = PROXIMITY_NEAR
var/turf/detect_turf = get_turf(J)
if(get_dist(our_turf, detect_turf) < rangealert)
detect_state = PROXIMITY_ON_SCREEN
break
/obj/item/device/multitool/cyborg
name = "multitool"
desc = "Optimised and stripped-down version of a regular multitool."
toolspeed = 0.5
/obj/item/device/multitool/abductor
name = "alien multitool"
desc = "An omni-technological interface."
icon = 'icons/obj/abductor.dmi'
icon_state = "multitool"
toolspeed = 0.1
origin_tech = "magnets=5;engineering=5;abductor=3"
shows_wire_information = TRUE
@@ -94,7 +94,7 @@ var/global/list/default_medbay_channels = list(
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
/obj/item/device/radio/attack_ghost(mob/user)
return ui_interact(user)
return interact(user)
/obj/item/device/radio/attack_self(mob/user as mob)
user.set_machine(src)
@@ -6,7 +6,7 @@
icon_state = "RPED"
item_state = "RPED"
w_class = 5
can_hold = list("/obj/item/weapon/stock_parts")
can_hold = list(/obj/item/weapon/stock_parts)
storage_slots = 50
use_to_pickup = 1
allow_quick_gather = 1
@@ -37,7 +37,7 @@
max_w_class = 2
storage_slots = 30
can_hold = list() // any
cant_hold = list("/obj/item/weapon/disk/nuclear")
cant_hold = list(/obj/item/weapon/disk/nuclear)
/obj/item/weapon/storage/bag/trash/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] puts the [src.name] over their head and starts chomping at the insides! Disgusting!</span>")
@@ -93,7 +93,7 @@
storage_slots = 7
display_contents_with_number = 0 //or else this will lead to stupid behavior.
can_hold = list() // any
cant_hold = list("/obj/item/weapon/disk/nuclear")
cant_hold = list(/obj/item/weapon/disk/nuclear)
/obj/item/weapon/storage/bag/plasticbag/mob_can_equip(M as mob, slot)
@@ -136,7 +136,7 @@
storage_slots = 50
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 = 3
can_hold = list("/obj/item/weapon/ore")
can_hold = list(/obj/item/weapon/ore)
/obj/item/weapon/storage/bag/ore/cyborg
name = "cyborg mining satchel"
@@ -166,7 +166,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 = 3
w_class = 1
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown","/obj/item/weapon/reagent_containers/food/snacks/ash_flora")
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/food/snacks/ash_flora)
burn_state = FLAMMABLE
/obj/item/weapon/storage/bag/plants/portaseeder
@@ -346,7 +346,7 @@
max_w_class = 3
w_class = 1
can_hold = list("/obj/item/weapon/coin","/obj/item/weapon/spacecash")
can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash)
// -----------------------------
// Book bag
@@ -362,7 +362,7 @@
max_combined_w_class = 21
max_w_class = 3
w_class = 4 //Bigger than a book because physics
can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/storage/bible", "/obj/item/weapon/tome", "/obj/item/weapon/spellbook")
can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/bible, /obj/item/weapon/tome, /obj/item/weapon/spellbook)
burn_state = FLAMMABLE
/*
@@ -471,7 +471,7 @@
storage_slots = 50
max_combined_w_class = 200
w_class = 1
can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle")
can_hold = list(/obj/item/weapon/reagent_containers/food/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle)
burn_state = FLAMMABLE
/*
* Biowaste bag (mostly for xenobiologists)
@@ -485,5 +485,5 @@
storage_slots = 25
max_combined_w_class = 200
w_class = 1
can_hold = list("/obj/item/slime_extract","/obj/item/weapon/reagent_containers/food/snacks/monkeycube","/obj/item/weapon/reagent_containers/syringe","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle","/obj/item/weapon/reagent_containers/blood","/obj/item/weapon/reagent_containers/hypospray/autoinjector")
can_hold = list(/obj/item/slime_extract,/obj/item/weapon/reagent_containers/food/snacks/monkeycube,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/blood,/obj/item/weapon/reagent_containers/hypospray/autoinjector)
burn_state = FLAMMABLE
+108 -120
View File
@@ -48,19 +48,18 @@
item_state = "utility"
use_item_overlays = 1
can_hold = list(
"/obj/item/weapon/crowbar",
"/obj/item/weapon/screwdriver",
"/obj/item/weapon/weldingtool",
"/obj/item/weapon/wirecutters",
"/obj/item/weapon/wrench",
"/obj/item/device/multitool",
"/obj/item/device/flashlight",
"/obj/item/stack/cable_coil",
"/obj/item/device/t_scanner",
"/obj/item/device/analyzer",
"/obj/item/taperoll/engineering",
"/obj/item/weapon/extinguisher/mini")
/obj/item/weapon/crowbar,
/obj/item/weapon/screwdriver,
/obj/item/weapon/weldingtool,
/obj/item/weapon/wirecutters,
/obj/item/weapon/wrench,
/obj/item/device/multitool,
/obj/item/device/flashlight,
/obj/item/stack/cable_coil,
/obj/item/device/t_scanner,
/obj/item/device/analyzer,
/obj/item/taperoll/engineering,
/obj/item/weapon/extinguisher/mini)
/obj/item/weapon/storage/belt/utility/full/New()
..()
@@ -69,7 +68,7 @@
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
new /obj/item/stack/cable_coil(src, 30, pick("red","yellow","orange"))
update_icon()
/obj/item/weapon/storage/belt/utility/full/multitool/New()
@@ -88,7 +87,23 @@
new /obj/item/weapon/extinguisher/mini(src)
update_icon()
/obj/item/weapon/storage/belt/utility/chief
name = "Chief Engineer's toolbelt"
desc = "Holds tools, looks snazzy"
icon_state = "utilitybelt_ce"
item_state = "utility_ce"
/obj/item/weapon/storage/belt/utility/chief/New()
..()
new /obj/item/weapon/screwdriver/power(src)
new /obj/item/weapon/crowbar/power(src)
new /obj/item/weapon/weldingtool/experimental(src)//This can be changed if this is too much
new /obj/item/device/multitool(src)
new /obj/item/stack/cable_coil(src, 30, pick("red","yellow","orange"))
new /obj/item/weapon/extinguisher/mini(src)
new /obj/item/device/analyzer(src)
update_icon()
//much roomier now that we've managed to remove two tools
/obj/item/weapon/storage/belt/medical
use_to_pickup = 1 //Allow medical belt to pick up medicine
@@ -98,24 +113,24 @@
item_state = "medical"
use_item_overlays = 1
can_hold = list(
"/obj/item/device/healthanalyzer",
"/obj/item/weapon/dnainjector",
"/obj/item/weapon/reagent_containers/dropper",
"/obj/item/weapon/reagent_containers/glass/beaker",
"/obj/item/weapon/reagent_containers/glass/bottle",
"/obj/item/weapon/reagent_containers/food/pill",
"/obj/item/weapon/reagent_containers/syringe",
"/obj/item/weapon/reagent_containers/glass/dispenser",
"/obj/item/weapon/lighter/zippo",
"/obj/item/weapon/storage/fancy/cigarettes",
"/obj/item/weapon/storage/pill_bottle",
"/obj/item/stack/medical",
"/obj/item/device/flashlight/pen",
"/obj/item/clothing/mask/surgical",
"/obj/item/clothing/gloves/color/latex",
"/obj/item/weapon/reagent_containers/hypospray/autoinjector",
"/obj/item/device/rad_laser",
"/obj/item/device/sensor_device"
/obj/item/device/healthanalyzer,
/obj/item/weapon/dnainjector,
/obj/item/weapon/reagent_containers/dropper,
/obj/item/weapon/reagent_containers/glass/beaker,
/obj/item/weapon/reagent_containers/glass/bottle,
/obj/item/weapon/reagent_containers/food/pill,
/obj/item/weapon/reagent_containers/syringe,
/obj/item/weapon/lighter/zippo,
/obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/pill_bottle,
/obj/item/stack/medical,
/obj/item/device/flashlight/pen,
/obj/item/clothing/mask/surgical,
/obj/item/clothing/gloves/color/latex,
/obj/item/weapon/reagent_containers/hypospray/autoinjector,
/obj/item/device/rad_laser,
/obj/item/device/sensor_device,
/obj/item/weapon/wrench/medical,
)
/obj/item/weapon/storage/belt/medical/response_team
@@ -139,22 +154,19 @@
item_state = "botany"
use_item_overlays = 1
can_hold = list(
"/obj/item/device/plant_analyzer",
"/obj/item/weapon/cultivator",
"/obj/item/weapon/hatchet",
"/obj/item/weapon/reagent_containers/glass/bottle",
"/obj/item/weapon/plantspray",
// "/obj/item/weapon/reagent_containers/syringe",
// "/obj/item/weapon/reagent_containers/glass/beaker",
"/obj/item/weapon/lighter/zippo",
"/obj/item/weapon/storage/fancy/cigarettes",
"obj/item/weapon/rollingpaperpack",
"/obj/item/weapon/shovel/spade",
"/obj/item/device/flashlight/pen",
"/obj/item/seeds",
"/obj/item/weapon/wirecutters",
"/obj/item/weapon/wrench",
"/obj/item/weapon/disk/botany",
/obj/item/device/plant_analyzer,
/obj/item/weapon/cultivator,
/obj/item/weapon/hatchet,
/obj/item/weapon/reagent_containers/glass/bottle,
// /obj/item/weapon/reagent_containers/syringe,
// /obj/item/weapon/reagent_containers/glass/beaker,
/obj/item/weapon/lighter/zippo,
/obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/shovel/spade,
/obj/item/device/flashlight/pen,
/obj/item/seeds,
/obj/item/weapon/wirecutters,
/obj/item/weapon/wrench,
)
@@ -167,22 +179,22 @@
max_w_class = 3
use_item_overlays = 1
can_hold = list(
"/obj/item/weapon/grenade/flashbang",
"/obj/item/weapon/grenade/chem_grenade/teargas",
"/obj/item/weapon/reagent_containers/spray/pepper",
"/obj/item/weapon/restraints/handcuffs",
"/obj/item/device/flash",
"/obj/item/clothing/glasses",
"/obj/item/ammo_casing/shotgun",
"/obj/item/ammo_box",
"/obj/item/weapon/reagent_containers/food/snacks/donut",
"/obj/item/weapon/kitchen/knife/combat",
"/obj/item/weapon/melee/baton",
"/obj/item/weapon/melee/classic_baton",
"/obj/item/device/flashlight/seclite",
"/obj/item/taperoll/police",
"/obj/item/weapon/melee/classic_baton/telescopic",
"/obj/item/weapon/restraints/legcuffs/bola")
/obj/item/weapon/grenade/flashbang,
/obj/item/weapon/grenade/chem_grenade/teargas,
/obj/item/weapon/reagent_containers/spray/pepper,
/obj/item/weapon/restraints/handcuffs,
/obj/item/device/flash,
/obj/item/clothing/glasses,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_box,
/obj/item/weapon/reagent_containers/food/snacks/donut,
/obj/item/weapon/kitchen/knife/combat,
/obj/item/weapon/melee/baton,
/obj/item/weapon/melee/classic_baton,
/obj/item/device/flashlight/seclite,
/obj/item/taperoll/police,
/obj/item/weapon/melee/classic_baton/telescopic,
/obj/item/weapon/restraints/legcuffs/bola)
/obj/item/weapon/storage/belt/security/sec/New()
..()
@@ -236,6 +248,24 @@
desc = "A syndicate belt designed to be used by boarding parties. Its style is modelled after the hardsuits they wear."
icon_state = "militarybelt"
item_state = "military"
max_w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/storage/belt/military/abductor
name = "agent belt"
desc = "A belt used by abductor agents."
icon = 'icons/obj/abductor.dmi'
icon_state = "belt"
item_state = "security"
/obj/item/weapon/storage/belt/military/abductor/full/New()
..()
new /obj/item/weapon/screwdriver/abductor(src)
new /obj/item/weapon/wrench/abductor(src)
new /obj/item/weapon/weldingtool/abductor(src)
new /obj/item/weapon/crowbar/abductor(src)
new /obj/item/weapon/wirecutters/abductor(src)
new /obj/item/device/multitool/abductor(src)
new /obj/item/stack/cable_coil(src, 30, "white")
/obj/item/weapon/storage/belt/military/assault
name = "assault belt"
@@ -253,12 +283,12 @@
max_w_class = 4 // Set to this so the light replacer can fit.
use_item_overlays = 1
can_hold = list(
"/obj/item/weapon/grenade/chem_grenade/cleaner",
"/obj/item/device/lightreplacer",
"/obj/item/device/flashlight",
"/obj/item/weapon/reagent_containers/spray",
"/obj/item/weapon/soap",
"/obj/item/weapon/holosign_creator"
/obj/item/weapon/grenade/chem_grenade/cleaner,
/obj/item/device/lightreplacer,
/obj/item/device/flashlight,
/obj/item/weapon/reagent_containers/spray,
/obj/item/weapon/soap,
/obj/item/weapon/holosign_creator
)
/obj/item/weapon/storage/belt/janitor/full/New()
@@ -280,7 +310,7 @@
max_w_class = 1
max_combined_w_class = 6
storage_slots = 6
can_hold = list("/obj/item/device/mobcapsule")
can_hold = list(/obj/item/device/mobcapsule)
/obj/item/weapon/storage/belt/lazarus/New()
..()
@@ -309,7 +339,7 @@
item_state = "bandolier"
storage_slots = 8
can_hold = list(
"/obj/item/ammo_casing/shotgun"
/obj/item/ammo_casing/shotgun
)
/obj/item/weapon/storage/belt/bandolier/New()
@@ -351,8 +381,8 @@
storage_slots = 1
max_w_class = 3
can_hold = list(
"/obj/item/weapon/gun/projectile/automatic/pistol",
"/obj/item/weapon/gun/projectile/revolver/detective"
/obj/item/weapon/gun/projectile/automatic/pistol,
/obj/item/weapon/gun/projectile/revolver/detective
)
/obj/item/weapon/storage/belt/wands
@@ -363,7 +393,7 @@
storage_slots = 6
use_item_overlays = 1
can_hold = list(
"/obj/item/weapon/gun/magic/wand"
/obj/item/weapon/gun/magic/wand
)
/obj/item/weapon/storage/belt/wands/full/New()
@@ -447,7 +477,7 @@
storage_slots = 1
w_class = 4
max_w_class = 4
can_hold = list("/obj/item/weapon/melee/rapier")
can_hold = list(/obj/item/weapon/melee/rapier)
/obj/item/weapon/storage/belt/rapier/update_icon()
icon_state = "[initial(icon_state)]"
@@ -505,8 +535,8 @@
origin_tech = "bluespace=4;syndicate=2"
allow_quick_empty = 1
can_hold = list(
"/obj/item/weapon/grenade/smokebomb",
"/obj/item/weapon/restraints/legcuffs/bola"
/obj/item/weapon/grenade/smokebomb,
/obj/item/weapon/restraints/legcuffs/bola
)
flags = NODROP
@@ -554,48 +584,6 @@
if(H.s_active && H.s_active == src)
H.s_active.show_to(H)
/* DEPRECATED DUE TO SUPERHERO CODE AND NODROP
// As a last resort, the belt can be used as a plastic explosive with a fixed timer (15 seconds). Naturally, you'll lose all your gear...
// Of course, it could be worse. It could spawn a singularity!
/obj/item/weapon/storage/belt/bluespace/owlman/afterattack(atom/target as obj|turf, mob/user as mob, flag)
if(!flag)
return
if(istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/structure/table) || istype(target, /obj/structure/closet))
return
to_chat(user, "Planting explosives...")
user.visible_message("[user.name] is fiddling with their toolbelt.")
if(ismob(target))
user.create_attack_log("<font color='red'> [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])</font>")
log_attack("<font color='red'> [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])</font>")
user.visible_message("\red [user.name] is trying to strap a belt to [target.name]!")
if(do_after(user, 50, target = target) && in_range(user, target))
user.drop_item()
target = target
loc = null
var/location
if(isturf(target)) location = target
if(ismob(target))
target:create_attack_log("<font color='orange'> Had the [name] planted on them by [user.real_name] ([user.ckey])</font>")
user.visible_message("\red [user.name] finished planting an explosive on [target.name]!")
target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2")
to_chat(user, "You sacrifice your belt for the sake of justice. Timer counting down from 15.")
spawn(150)
if(target)
if(ismob(target) || isobj(target))
location = target.loc // These things can move
explosion(location, -1, -1, 2, 3)
if(istype(target, /turf/simulated/wall)) target:dismantle_wall(1)
else target.ex_act(1)
if(isobj(target))
if(target)
qdel(target)
if(src)
qdel(src)
*/
/obj/item/weapon/storage/belt/bluespace/attack(mob/M as mob, mob/user as mob, def_zone)
return
@@ -390,7 +390,7 @@
icon = 'icons/obj/food/food.dmi'
icon_state = "monkeycubebox"
storage_slots = 7
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube")
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube)
var/monkey_cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube
/obj/item/weapon/storage/box/monkeycubes/New()
@@ -561,7 +561,7 @@
icon = 'icons/obj/toy.dmi'
icon_state = "spbox"
storage_slots = 8
can_hold = list("/obj/item/toy/snappop")
can_hold = list(/obj/item/toy/snappop)
New()
..()
for(var/i=1; i <= storage_slots; i++)
@@ -621,7 +621,7 @@
item_state = "syringe_kit"
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
storage_slots=21
can_hold = list("/obj/item/weapon/light/tube", "/obj/item/weapon/light/bulb")
can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb)
max_combined_w_class = 21
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
@@ -48,7 +48,7 @@
icon_type = "donut"
name = "donut box"
storage_slots = 6
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/donut")
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut)
/obj/item/weapon/storage/fancy/donut_box/New()
@@ -66,7 +66,7 @@
icon_type = "egg"
name = "egg box"
storage_slots = 12
can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/egg")
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/egg)
/obj/item/weapon/storage/fancy/egg_box/New()
..()
@@ -119,7 +119,7 @@
storage_slots = 6
icon_type = "crayon"
can_hold = list(
"/obj/item/toy/crayon"
/obj/item/toy/crayon
)
/obj/item/weapon/storage/fancy/crayons/New()
@@ -163,12 +163,12 @@
slot_flags = SLOT_BELT
storage_slots = 6
max_combined_w_class = 6
can_hold = list("/obj/item/clothing/mask/cigarette",
"/obj/item/weapon/lighter",
"/obj/item/weapon/match")
cant_hold = list("/obj/item/clothing/mask/cigarette/cigar",
"/obj/item/clothing/mask/cigarette/pipe",
"/obj/item/weapon/lighter/zippo")
can_hold = list(/obj/item/clothing/mask/cigarette,
/obj/item/weapon/lighter,
/obj/item/weapon/match)
cant_hold = list(/obj/item/clothing/mask/cigarette/cigar,
/obj/item/clothing/mask/cigarette/pipe,
/obj/item/weapon/lighter/zippo)
icon_type = "cigarette"
var/list/unlaced_cigarettes = list() // Cigarettes that haven't received reagents yet
var/default_reagents = list("nicotine" = 15) // List of reagents to pre-generate for each cigarette
@@ -323,7 +323,7 @@
icon_state = "cig_paper_pack"
storage_slots = 10
icon_type = "rolling paper"
can_hold = list("/obj/item/weapon/rollingpaper")
can_hold = list(/obj/item/weapon/rollingpaper)
/obj/item/weapon/storage/fancy/rollingpapers/New()
..()
@@ -345,7 +345,7 @@
icon_type = "vial"
name = "vial storage box"
storage_slots = 6
can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial")
can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
/obj/item/weapon/storage/fancy/vials/New()
@@ -361,7 +361,7 @@
icon_state = "vialbox0"
item_state = "syringe_kit"
max_w_class = 3
can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial")
can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item.
storage_slots = 6
req_access = list(access_virology)
@@ -184,8 +184,8 @@
max_w_class = 4
max_combined_w_class = 21
storage_slots = 10
can_hold = list("/obj/item/roller","/obj/item/weapon/bonesetter","/obj/item/weapon/bonegel", "/obj/item/weapon/scalpel", "/obj/item/weapon/hemostat",
"/obj/item/weapon/cautery", "/obj/item/weapon/retractor", "/obj/item/weapon/FixOVein", "/obj/item/weapon/surgicaldrill", "/obj/item/weapon/circular_saw")
can_hold = list(/obj/item/roller,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel, /obj/item/weapon/scalpel, /obj/item/weapon/hemostat,
/obj/item/weapon/cautery, /obj/item/weapon/retractor, /obj/item/weapon/FixOVein, /obj/item/weapon/surgicaldrill, /obj/item/weapon/circular_saw)
/obj/item/weapon/storage/firstaid/surgery/New()
..()
@@ -210,7 +210,7 @@
icon = 'icons/obj/chemical.dmi'
item_state = "contsolid"
w_class = 2
can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/dice","/obj/item/weapon/paper")
can_hold = list(/obj/item/weapon/reagent_containers/food/pill, /obj/item/weapon/dice, /obj/item/weapon/paper)
allow_quick_gather = 1
use_to_pickup = 1
storage_slots = 14
@@ -232,7 +232,7 @@
max_w_class = 8
anchored = 1
density = 0
cant_hold = list("/obj/item/weapon/storage/secure/briefcase")
cant_hold = list(/obj/item/weapon/storage/secure/briefcase)
/obj/item/weapon/storage/secure/safe/New()
..()
@@ -242,23 +242,15 @@
return 0 //Storage item is full
if(can_hold.len)
var/ok = 0
for(var/A in can_hold)
if(istype(W, text2path(A) ))
ok = 1
break
if(!ok)
if(!is_type_in_typecache(W, can_hold))
if(!stop_messages)
if(istype(W, /obj/item/weapon/hand_labeler))
return 0
to_chat(usr, "<span class='notice'>[src] cannot hold [W].</span>")
return 0
for(var/A in cant_hold) //Check for specific items which this container can't hold.
if(istype(W, text2path(A) ))
if(!stop_messages)
to_chat(usr, "<span class='notice'>[src] cannot hold [W].</span>")
return 0
if(is_type_in_typecache(W, cant_hold)) //Check for specific items which this container can't hold.
if(!stop_messages)
to_chat(usr, "<span class='notice'>[src] cannot hold [W].</span>")
return 0
if(W.w_class > max_w_class)
if(!stop_messages)
@@ -432,6 +424,8 @@
remove_from_storage(I, T)
/obj/item/weapon/storage/New()
can_hold = typecacheof(can_hold)
cant_hold = typecacheof(cant_hold)
if(allow_quick_empty)
verbs += /obj/item/weapon/storage/verb/quick_empty
@@ -455,7 +449,6 @@
src.closer.layer = 20
src.closer.plane = HUD_PLANE
orient2hud()
return
/obj/item/weapon/storage/Destroy()
for(var/obj/O in contents)
@@ -15,41 +15,35 @@
attack_verb = list("robusted")
hitsound = 'sound/weapons/smash.ogg'
New()
..()
if(src.type == /obj/item/weapon/storage/toolbox)
to_chat(world, "BAD: [src] ([src.type]) spawned at [src.x] [src.y] [src.z]")
qdel(src)
/obj/item/weapon/storage/toolbox/emergency
name = "emergency toolbox"
icon_state = "red"
item_state = "toolbox_red"
New()
..()
new /obj/item/weapon/crowbar/red(src)
new /obj/item/weapon/weldingtool/mini(src)
new /obj/item/weapon/extinguisher/mini(src)
if(prob(50))
new /obj/item/device/flashlight(src)
else
new /obj/item/device/flashlight/flare(src)
new /obj/item/device/radio(src)
/obj/item/weapon/storage/toolbox/emergency/New()
..()
new /obj/item/weapon/crowbar/red(src)
new /obj/item/weapon/weldingtool/mini(src)
new /obj/item/weapon/extinguisher/mini(src)
if(prob(50))
new /obj/item/device/flashlight(src)
else
new /obj/item/device/flashlight/flare(src)
new /obj/item/device/radio(src)
/obj/item/weapon/storage/toolbox/mechanical
name = "mechanical toolbox"
icon_state = "blue"
item_state = "toolbox_blue"
New()
..()
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/device/analyzer(src)
new /obj/item/weapon/wirecutters(src)
/obj/item/weapon/storage/toolbox/mechanical/New()
..()
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/device/analyzer(src)
new /obj/item/weapon/wirecutters(src)
/obj/item/weapon/storage/toolbox/mechanical/greytide
flags = NODROP
@@ -59,19 +53,19 @@
icon_state = "yellow"
item_state = "toolbox_yellow"
New()
..()
var/color = pick("red","yellow","green","blue","pink","orange","cyan","white")
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/t_scanner(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/stack/cable_coil(src,30,color)
new /obj/item/stack/cable_coil(src,30,color)
if(prob(5))
new /obj/item/clothing/gloves/color/yellow(src)
else
new /obj/item/stack/cable_coil(src,30,color)
/obj/item/weapon/storage/toolbox/electrical/New()
..()
var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white")
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/t_scanner(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/stack/cable_coil(src, 30, pickedcolor)
new /obj/item/stack/cable_coil(src, 30, pickedcolor)
if(prob(5))
new /obj/item/clothing/gloves/color/yellow(src)
else
new /obj/item/stack/cable_coil(src, 30, pickedcolor)
/obj/item/weapon/storage/toolbox/syndicate
name = "suspicious looking toolbox"
@@ -82,12 +76,47 @@
force = 15.0
throwforce = 18.0
New()
..()
new /obj/item/weapon/screwdriver(src, "red")
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool/largetank(src)
new /obj/item/weapon/crowbar/red(src)
new /obj/item/weapon/wirecutters(src, "red")
new /obj/item/device/multitool(src)
new /obj/item/clothing/gloves/combat(src)
/obj/item/weapon/storage/toolbox/syndicate/New()
..()
new /obj/item/weapon/screwdriver(src, "red")
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool/largetank(src)
new /obj/item/weapon/crowbar/red(src)
new /obj/item/weapon/wirecutters(src, "red")
new /obj/item/device/multitool(src)
new /obj/item/clothing/gloves/combat(src)
/obj/item/weapon/storage/toolbox/drone
name = "mechanical toolbox"
icon_state = "blue"
item_state = "toolbox_blue"
/obj/item/weapon/storage/toolbox/drone/New()
..()
var/pickedcolor = pick("red","yellow","green","blue","pink","orange","cyan","white")
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/stack/cable_coil(src, 30, pickedcolor)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/multitool(src)
/obj/item/weapon/storage/toolbox/brass
name = "brass box"
desc = "A huge brass box with several indentations in its surface."
icon_state = "brassbox"
item_state = null
w_class = WEIGHT_CLASS_HUGE
max_w_class = WEIGHT_CLASS_NORMAL
max_combined_w_class = 28
storage_slots = 28
attack_verb = list("robusted", "crushed", "smashed")
/obj/item/weapon/storage/toolbox/brass/prefilled/New()
..()
new /obj/item/weapon/screwdriver/brass(src)
new /obj/item/weapon/wirecutters/brass(src)
new /obj/item/weapon/wrench/brass(src)
new /obj/item/weapon/crowbar/brass(src)
new /obj/item/weapon/weldingtool/experimental/brass(src)
@@ -88,7 +88,7 @@
/obj/item/weapon/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)
max_w_class = 3
/obj/item/weapon/storage/box/syndie_kit/space/New()
@@ -99,7 +99,7 @@
/obj/item/weapon/storage/box/syndie_kit/hardsuit
name = "Boxed Blood Red Suit and Helmet"
can_hold = list("/obj/item/clothing/suit/space/rig/syndi", "/obj/item/clothing/head/helmet/space/rig/syndi")
can_hold = list(/obj/item/clothing/suit/space/rig/syndi, /obj/item/clothing/head/helmet/space/rig/syndi)
max_w_class = 3
/obj/item/weapon/storage/box/syndie_kit/hardsuit/New()
@@ -110,7 +110,7 @@
/obj/item/weapon/storage/box/syndie_kit/elite_hardsuit
name = "Boxed Elite Syndicate Hardsuit and Helmet"
can_hold = list("/obj/item/clothing/suit/space/rig/syndi/elite", "/obj/item/clothing/head/helmet/space/rig/syndi/elite")
can_hold = list(/obj/item/clothing/suit/space/rig/syndi/elite, /obj/item/clothing/head/helmet/space/rig/syndi/elite)
max_w_class = 3
/obj/item/weapon/storage/box/syndie_kit/elite_hardsuit/New()
@@ -120,7 +120,7 @@
/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit
name = "Boxed Shielded Syndicate Hardsuit and Helmet"
can_hold = list("/obj/item/clothing/suit/space/rig/shielded/syndi", "/obj/item/clothing/head/helmet/space/rig/shielded/syndi")
can_hold = list(/obj/item/clothing/suit/space/rig/shielded/syndi, /obj/item/clothing/head/helmet/space/rig/shielded/syndi)
max_w_class = 4
/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit/New()
@@ -7,25 +7,25 @@
w_class = 2
burn_state = FLAMMABLE
can_hold = list(
"/obj/item/weapon/spacecash",
"/obj/item/weapon/card",
"/obj/item/clothing/mask/cigarette",
"/obj/item/device/flashlight/pen",
"/obj/item/seeds",
"/obj/item/stack/medical",
"/obj/item/toy/crayon",
"/obj/item/weapon/coin",
"/obj/item/weapon/dice",
"/obj/item/weapon/disk",
"/obj/item/weapon/implanter",
"/obj/item/weapon/lighter",
"/obj/item/weapon/match",
"/obj/item/weapon/paper",
"/obj/item/weapon/pen",
"/obj/item/weapon/photo",
"/obj/item/weapon/reagent_containers/dropper",
"/obj/item/weapon/screwdriver",
"/obj/item/weapon/stamp")
/obj/item/weapon/spacecash,
/obj/item/weapon/card,
/obj/item/clothing/mask/cigarette,
/obj/item/device/flashlight/pen,
/obj/item/seeds,
/obj/item/stack/medical,
/obj/item/toy/crayon,
/obj/item/weapon/coin,
/obj/item/weapon/dice,
/obj/item/weapon/disk,
/obj/item/weapon/implanter,
/obj/item/weapon/lighter,
/obj/item/weapon/match,
/obj/item/weapon/paper,
/obj/item/weapon/pen,
/obj/item/weapon/photo,
/obj/item/weapon/reagent_containers/dropper,
/obj/item/weapon/screwdriver,
/obj/item/weapon/stamp)
slot_flags = SLOT_ID
var/obj/item/weapon/card/id/front_id = null
+362 -100
View File
@@ -22,60 +22,137 @@
slot_flags = SLOT_BELT
force = 5
throwforce = 7
w_class = 2
usesound = 'sound/items/Ratchet.ogg'
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=150)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
toolspeed = 1
/obj/item/weapon/wrench/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is beating themself to death with [src]! It looks like they're trying to commit suicide!</span>")
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
return (BRUTELOSS)
/obj/item/weapon/wrench/cyborg
name = "automatic wrench"
desc = "An advanced robotic wrench. Can be found in construction cyborgs."
toolspeed = 0.5
/obj/item/weapon/wrench/brass
name = "brass wrench"
desc = "A brass wrench. It's faintly warm to the touch."
icon_state = "wrench_brass"
toolspeed = 0.5
/obj/item/weapon/wrench/abductor
name = "alien wrench"
desc = "A polarized wrench. It causes anything placed between the jaws to turn."
icon = 'icons/obj/abductor.dmi'
icon_state = "wrench"
usesound = 'sound/effects/EMPulse.ogg'
toolspeed = 0.1
origin_tech = "materials=5;engineering=5;abductor=3"
/obj/item/weapon/wrench/power
name = "Hand Drill"
desc = "A simple powered drill with a bolt bit"
icon_state = "drill_bolt"
item_state = "drill"
usesound = 'sound/items/drill_use.ogg'
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
force = 8 //might or might not be too high, subject to change
throwforce = 8
attack_verb = list("drilled", "screwed", "jabbed")
toolspeed = 0.25
/obj/item/weapon/wrench/power/attack_self(mob/user)
playsound(get_turf(user),'sound/items/change_drill.ogg', 50, 1)
var/obj/item/weapon/wirecutters/power/s_drill = new /obj/item/weapon/screwdriver/power
to_chat(user, "<span class='notice'>You attach the screw driver bit to [src].</span>")
qdel(src)
user.put_in_active_hand(s_drill)
/obj/item/weapon/wrench/power/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is pressing [src] against their head! It looks like they're trying to commit suicide!")
return (BRUTELOSS)
/obj/item/weapon/wrench/medical
name = "medical wrench"
desc = "A medical wrench with common (medical?) uses. Can be found in your hand."
icon_state = "wrench_medical"
force = 2 //MEDICAL
throwforce = 4
origin_tech = "materials=1;engineering=1;biotech=3"
attack_verb = list("wrenched", "medicaled", "tapped", "jabbed", "whacked")
/obj/item/weapon/wrench/medical/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is praying to the medical wrench to take their soul. It looks like they're trying to commit suicide!</span>")
// TODO Make them glow with the power of the M E D I C A L W R E N C H
// during their ascension
// Stun stops them from wandering off
user.Stun(5)
playsound(loc, 'sound/effects/pray.ogg', 50, 1, -1)
// Let the sound effect finish playing
sleep(20)
if(!user)
return
for(var/obj/item/W in user)
user.unEquip(W)
var/obj/item/weapon/wrench/medical/W = new /obj/item/weapon/wrench/medical(loc)
W.add_fingerprint(user)
W.desc += " For some reason, it reminds you of [user.name]."
if(!user)
return
user.dust()
return OXYLOSS
//Screwdriver
/obj/item/weapon/screwdriver
name = "screwdriver"
desc = "You can be totally screwy with this."
icon = 'icons/obj/tools.dmi'
icon_state = "screwdriver"
icon_state = null
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5
w_class = 1
w_class = WEIGHT_CLASS_TINY
throwforce = 5
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=75)
attack_verb = list("stabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
usesound = 'sound/items/Screwdriver.ogg'
toolspeed = 1
/obj/item/weapon/screwdriver/nuke
name = "screwdriver"
desc = "A screwdriver with an ultra thin tip."
icon_state = "screwdriver_nuke"
toolspeed = 0.5
/obj/item/weapon/screwdriver/suicide_act(mob/user)
to_chat(viewers(user), pick("<span class='suicide'>[user] is stabbing the [name] into \his temple! It looks like \he's trying to commit suicide.</span>", \
"<span class='suicide'>[user] is stabbing the [name] into \his heart! It looks like \he's trying to commit suicide.</span>"))
user.visible_message("<span class='suicide'>[user] is stabbing [src] into their [pick("temple", "heart")]! It looks like they're trying to commit suicide!</span>")
return(BRUTELOSS)
/obj/item/weapon/screwdriver/New()
switch(pick("red","blue","purple","brown","green","cyan","yellow"))
if("red")
icon_state = "screwdriver2"
item_state = "screwdriver"
if("blue")
icon_state = "screwdriver"
item_state = "screwdriver_blue"
if("purple")
icon_state = "screwdriver3"
item_state = "screwdriver_purple"
if("brown")
icon_state = "screwdriver4"
item_state = "screwdriver_brown"
if("green")
icon_state = "screwdriver5"
item_state = "screwdriver_green"
if("cyan")
icon_state = "screwdriver6"
item_state = "screwdriver_cyan"
if("yellow")
icon_state = "screwdriver7"
item_state = "screwdriver_yellow"
/obj/item/weapon/screwdriver/New(loc, var/param_color = null)
..()
if(!icon_state)
if(!param_color)
param_color = pick("red","blue","pink","brown","green","cyan","yellow")
icon_state = "screwdriver_[param_color]"
if(prob(75))
if (prob(75))
src.pixel_y = rand(0, 16)
return
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M) || user.a_intent == I_HELP)
@@ -85,49 +162,150 @@
if((CLUMSY in user.mutations) && prob(50))
M = user
return eyestab(M,user)
/obj/item/weapon/screwdriver/brass
name = "brass screwdriver"
desc = "A screwdriver made of brass. The handle feels freezing cold."
icon_state = "screwdriver_brass"
toolspeed = 0.5
/obj/item/weapon/screwdriver/abductor
name = "alien screwdriver"
desc = "An ultrasonic screwdriver."
icon = 'icons/obj/abductor.dmi'
icon_state = "screwdriver"
usesound = 'sound/items/PSHOOM.ogg'
toolspeed = 0.1
/obj/item/weapon/screwdriver/power
name = "Hand Drill"
desc = "A simple hand drill with a screwdriver bit attached."
icon_state = "drill_screw"
item_state = "drill"
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
force = 8 //might or might not be too high, subject to change
throwforce = 8
throw_speed = 2
throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far
attack_verb = list("drilled", "screwed", "jabbed","whacked")
hitsound = 'sound/items/drill_hit.ogg'
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.25
/obj/item/weapon/screwdriver/power/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is putting [src] to their temple. It looks like they're trying to commit suicide!</span>")
return(BRUTELOSS)
/obj/item/weapon/screwdriver/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1)
var/obj/item/weapon/wrench/power/b_drill = new /obj/item/weapon/wrench/power
user << "<span class='notice'>You attach the bolt driver bit to [src].</span>"
qdel(src)
user.put_in_active_hand(b_drill)
/obj/item/weapon/screwdriver/cyborg
name = "powered screwdriver"
desc = "An electrical screwdriver, designed to be both precise and quick."
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.5
//Wirecutters
/obj/item/weapon/wirecutters
name = "wirecutters"
desc = "This cuts wires."
icon = 'icons/obj/tools.dmi'
icon_state = "cutters"
icon_state = null
flags = CONDUCT
slot_flags = SLOT_BELT
force = 6
throw_speed = 3
throw_range = 7
w_class = 2
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=80)
origin_tech = "materials=1;engineering=1"
attack_verb = list("pinched", "nipped")
hitsound = 'sound/items/Wirecutter.ogg'
usesound = 'sound/items/Wirecutter.ogg'
sharp = 1
edge = 1
toolspeed = 1
/obj/item/weapon/wirecutters/New(loc, param_color = null)
..()
if((!param_color && prob(50)) || param_color == "yellow")
icon_state = "cutters-y"
item_state = "cutters_yellow"
if(!icon_state)
if(!param_color)
param_color = pick("yellow", "red")
icon_state = "cutters_[param_color]"
/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/H, mob/user)
if(istype(H) && H.handcuffed)
if(istype(H.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
usr.visible_message("\The [usr] cuts \the [H]'s restraints with \the [src]!",\
"You cut \the [H]'s restraints with \the [src]!",\
"You hear cable being cut.")
H.handcuffed = null
if(H.buckled && H.buckled.buckle_requires_restraints)
H.buckled.unbuckle_mob()
H.update_handcuffed()
return
/obj/item/weapon/wirecutters/attack(mob/living/carbon/C, mob/user)
if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
user.visible_message("<span class='notice'>[user] cuts [C]'s restraints with [src]!</span>")
qdel(C.handcuffed)
C.handcuffed = null
if(C.buckled && C.buckled.buckle_requires_restraints)
C.buckled.unbuckle_mob(C)
C.update_handcuffed()
return
else
..()
/obj/item/weapon/wirecutters/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is cutting at their arteries with [src]! It looks like they're trying to commit suicide!</span>")
playsound(loc, usesound, 50, 1, -1)
return (BRUTELOSS)
/obj/item/weapon/wirecutters/brass
name = "brass wirecutters"
desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch."
icon_state = "cutters_brass"
toolspeed = 0.5
/obj/item/weapon/wirecutters/abductor
name = "alien wirecutters"
desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
icon = 'icons/obj/abductor.dmi'
icon_state = "cutters"
toolspeed = 0.1
origin_tech = "materials=5;engineering=4;abductor=3"
/obj/item/weapon/wirecutters/cyborg
name = "wirecutters"
desc = "This cuts wires."
toolspeed = 0.5
/obj/item/weapon/wirecutters/power
name = "Jaws of Life"
desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a cutting head."
icon_state = "jaws_cutter"
item_state = "jawsoflife"
origin_tech = "materials=2;engineering=2"
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
usesound = 'sound/items/jaws_cut.ogg'
toolspeed = 0.25
/obj/item/weapon/wirecutters/power/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is wrapping \the [src] around their neck. It looks like they're trying to rip their head off!</span>")
playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1)
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/head/head = H.organs_by_name["head"]
if(head)
head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE)
playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
return (BRUTELOSS)
/obj/item/weapon/wirecutters/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/weapon/crowbar/power/pryjaws = new /obj/item/weapon/crowbar/power
to_chat(user, "<span class='notice'>You attach the pry jaws to [src].</span>")
qdel(src)
user.put_in_active_hand(pryjaws)
//Welding Tool
/obj/item/weapon/weldingtool
name = "welding tool"
desc = "A standard edition welder provided by Nanotrasen."
icon = 'icons/obj/tools.dmi'
icon_state = "welder"
item_state = "welder"
@@ -137,15 +315,21 @@
throwforce = 5
throw_speed = 3
throw_range = 5
w_class = 2
hitsound = "swing_hit"
usesound = 'sound/items/Welder.ogg'
var/acti_sound = 'sound/items/WelderActivate.ogg'
var/deac_sound = 'sound/items/WelderDeactivate.ogg'
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=70, MAT_GLASS=30)
origin_tech = "engineering=1"
origin_tech = "engineering=1;plasmatech=1"
toolspeed = 1
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
var/change_icons = 1
var/can_off_process = 0
var/light_intensity = 2 //how powerful the emitted light is when used.
var/nextrefueltick = 0
/obj/item/weapon/weldingtool/New()
..()
@@ -158,7 +342,7 @@
to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
/obj/item/weapon/weldingtool/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] welds \his every orifice closed! It looks like \he's trying to commit suicide..</span>")
user.visible_message("<span class='suicide'>[user] welds their every orifice closed! It looks like they're trying to commit suicide!</span>")
return (FIRELOSS)
/obj/item/weapon/weldingtool/proc/update_torch()
@@ -179,13 +363,6 @@
icon_state = "[initial(icon_state)][ratio]"
update_torch()
/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params)
if(isscrewdriver(I))
flamethrower_screwdriver(I, user)
if(istype(I, /obj/item/stack/rods))
flamethrower_rods(I, user)
..()
/obj/item/weapon/weldingtool/process()
switch(welding)
if(0)
@@ -211,6 +388,14 @@
location = get_turf(M)
if(isturf(location))
location.hotspot_expose(700, 5)
/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params)
if(isscrewdriver(I))
flamethrower_screwdriver(I, user)
else if(istype(I, /obj/item/stack/rods))
flamethrower_rods(I, user)
else
..()
/obj/item/weapon/weldingtool/attack(mob/M, mob/user)
if(ishuman(M))
@@ -233,7 +418,7 @@
if(!do_mob(user, H, 10))
return 1
if(remove_fuel(1,null))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
playsound(src.loc, usesound, 50, 1)
S.heal_damage(15,0,0,1)
user.visible_message("<span class='alert'>\The [user] patches some dents on \the [M]'s [S.name] with \the [src].</span>")
else if(S.open != 2)
@@ -250,10 +435,13 @@
/obj/item/weapon/weldingtool/afterattack(atom/O, mob/user, proximity)
if(!proximity)
return
if(welding)
remove_fuel(1)
var/turf/location = get_turf(user)
location.hotspot_expose(700, 50, 1)
if(get_fuel() <= 0)
set_light(0)
if(isliving(O))
var/mob/living/L = O
@@ -262,7 +450,10 @@
log_game("[key_name(user)] set [key_name(L)] on fire")
/obj/item/weapon/weldingtool/attack_self(mob/user)
toggle(user)
switched_on(user)
if(welding)
set_light(light_intensity)
update_icon()
//Returns the amount of fuel in the welder
@@ -272,17 +463,17 @@
//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use()
/obj/item/weapon/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null)
if(!welding || !check_fuel())
return 0
return FALSE
if(get_fuel() >= amount)
reagents.remove_reagent("fuel", amount)
check_fuel()
if(M)
M.flash_eyes(light_intensity)
return 1
return TRUE
else
if(M)
to_chat(M, "\blue You need more welding fuel to complete this task.")
return 0
return FALSE
//Returns whether or not the welding tool is currently on.
/obj/item/weapon/weldingtool/proc/isOn()
@@ -291,43 +482,48 @@
//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
/obj/item/weapon/weldingtool/proc/check_fuel(mob/user)
if(get_fuel() <= 0 && welding)
toggle(user, 1)
switched_on(user)
update_icon()
//mob icon update
if(ismob(loc))
var/mob/M = loc
M.update_inv_r_hand(0)
M.update_inv_l_hand(0)
return 0
return 1
//Toggles the welder off and on
/obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0)
//Switches the welder on
/obj/item/weapon/weldingtool/proc/switched_on(mob/user)
if(!status)
to_chat(user, "<span class='warning'>[src] can't be turned on while unsecured!</span>")
to_chat(user, "span class='warning'>[src] can't be turned on while unsecured!</span>")
return
welding = !welding
if(welding)
if(get_fuel() >= 1)
to_chat(user, "<span class='notice'>You switch [src] on.</span>")
playsound(loc, acti_sound, 50, 1)
force = 15
damtype = "fire"
hitsound = 'sound/items/welder.ogg'
update_icon()
processing_objects |= src
processing_objects.Add(src)
else
to_chat(user, "<span class='warning'>You need more fuel!</span>")
welding = 0
switched_off(user)
else
if(!message)
to_chat(user, "<span class='notice'>You switch [src] off.</span>")
else
visible_message("<span class='warning'>[src] shuts off!</span>")
force = 3
damtype = "brute"
hitsound = "swing_hit"
update_icon()
to_chat(user, "<span class='notice'>You switch [src] off.</span>")
playsound(loc, deac_sound, 50, 1)
switched_off(user)
//Switches the welder off
/obj/item/weapon/weldingtool/proc/switched_off(mob/user)
welding = 0
set_light(0)
force = 3
damtype = "brute"
hitsound = "swing_hit"
update_icon()
/obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
if(welding)
@@ -354,7 +550,6 @@
user.put_in_hands(F)
else
to_chat(user, "<span class='warning'>You need one rod to start building a flamethrower!</span>")
return
/obj/item/weapon/weldingtool/largetank
name = "Industrial Welding Tool"
@@ -362,9 +557,12 @@
icon_state = "indwelder"
max_fuel = 40
materials = list(MAT_METAL=70, MAT_GLASS=60)
origin_tech = "engineering=2"
origin_tech = "engineering=2;plasmatech=2"
/obj/item/weapon/weldingtool/largetank/cyborg
name = "integrated welding tool"
desc = "An advanced welder designed to be used in robotic systems."
toolspeed = 0.5
/obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver()
return
@@ -374,12 +572,27 @@
desc = "A miniature welder used during emergencies."
icon_state = "miniwelder"
max_fuel = 10
w_class = 1
w_class = WEIGHT_CLASS_TINY
materials = list(MAT_METAL=30, MAT_GLASS=10)
change_icons = 0
/obj/item/weapon/weldingtool/mini/flamethrower_screwdriver()
return
/obj/item/weapon/weldingtool/abductor
name = "alien welding tool"
desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
icon = 'icons/obj/abductor.dmi'
icon_state = "welder"
toolspeed = 0.1
light_intensity = 0
change_icons = 0
origin_tech = "plasmatech=5;engineering=5;abductor=3"
/obj/item/weapon/weldingtool/abductor/process()
if(get_fuel() <= max_fuel)
reagents.add_reagent("welding_fuel", 1)
..()
/obj/item/weapon/weldingtool/hugetank
name = "Upgraded Welding Tool"
@@ -387,9 +600,8 @@
icon_state = "upindwelder"
item_state = "upindwelder"
max_fuel = 80
w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
origin_tech = "engineering=3"
origin_tech = "engineering=3;plasmatech=2"
/obj/item/weapon/weldingtool/experimental
name = "Experimental Welding Tool"
@@ -397,25 +609,25 @@
icon_state = "exwelder"
item_state = "exwelder"
max_fuel = 40
w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
origin_tech = "engineering=4;plasmatech=3"
origin_tech = "materials=4;engineering=4;bluespace=3;plasmatech=4"
change_icons = 0
can_off_process = 1
light_intensity = 1
toolspeed = 0.5
var/last_gen = 0
/obj/item/weapon/weldingtool/experimental/brass
name = "brass welding tool"
desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
icon_state = "brasswelder"
item_state = "brasswelder"
/obj/item/weapon/weldingtool/experimental/proc/fuel_gen()
if(!welding && !last_gen)
last_gen = 1
reagents.add_reagent("fuel",1)
spawn(10)
last_gen = 0
/obj/item/weapon/weldingtool/experimental/process()
obj/item/weapon/weldingtool/experimental/process()
..()
if(reagents.total_volume < max_fuel)
fuel_gen()
if(get_fuel() < max_fuel && nextrefueltick < world.time)
nextrefueltick = world.time + 10
reagents.add_reagent("fuel", 1)
//Crowbar
/obj/item/weapon/crowbar
@@ -423,37 +635,87 @@
desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
icon = 'icons/obj/tools.dmi'
icon_state = "crowbar"
item_state = "crowbar"
usesound = 'sound/items/Crowbar.ogg'
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5
throwforce = 7
item_state = "crowbar"
w_class = 2
materials = list(MAT_METAL=50)
origin_tech = "engineering=1"
origin_tech = "engineering=1;combat=1"
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
toolspeed = 1
/obj/item/weapon/crowbar/red
icon_state = "red_crowbar"
item_state = "crowbar_red"
icon_state = "crowbar_red"
force = 8
/obj/item/weapon/crowbar/brass
name = "brass crowbar"
desc = "A brass crowbar. It feels faintly warm to the touch."
icon_state = "crowbar_brass"
toolspeed = 0.5
/obj/item/weapon/crowbar/abductor
name = "alien crowbar"
desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
icon = 'icons/obj/abductor.dmi'
usesound = 'sound/weapons/sonic_jackhammer.ogg'
icon_state = "crowbar"
toolspeed = 0.1
origin_tech = "combat=4;engineering=4;abductor=3"
/obj/item/weapon/crowbar/large
name = "crowbar"
desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big."
force = 12
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
throw_range = 3
materials = list(MAT_METAL=70)
icon_state = "crowbar_large"
item_state = "crowbar"
toolspeed = 0.5
/obj/item/weapon/crowbar/cyborg
name = "hydraulic crowbar"
desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
usesound = 'sound/items/jaws_pry.ogg'
force = 10
toolspeed = 0.5
/obj/item/weapon/crowbar/power
name = "Jaws of Life"
desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a prying head"
icon_state = "jaws_pry"
item_state = "jawsoflife"
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
origin_tech = "materials=2;engineering=2"
usesound = 'sound/items/jaws_pry.ogg'
force = 15
toolspeed = 0.25
/obj/item/weapon/crowbar/power/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is putting their head in [src], it looks like they're trying to commit suicide!</span>")
playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1)
return (BRUTELOSS)
/obj/item/weapon/crowbar/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
var/obj/item/weapon/wirecutters/power/cutjaws = new /obj/item/weapon/wirecutters/power
to_chat(user, "<span class='notice'>You attach the cutting jaws to [src].</span>")
qdel(src)
user.put_in_active_hand(cutjaws)
// Conversion kit
/obj/item/weapon/conversion_kit
name = "\improper Revolver Conversion Kit"
desc = "A professional conversion kit used to convert any knock off revolver into the real deal capable of shooting lethal .357 rounds without the possibility of catastrophic failure"
icon = 'icons/obj/weapons.dmi'
icon_state = "kit"
flags = CONDUCT
w_class = 2
w_class = WEIGHT_CLASS_SMALL
origin_tech = "combat=2"
var/open = 0
@@ -466,5 +728,5 @@
/obj/item/weapon/conversion_kit/attack_self(mob/user)
open = !open
to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.")
to_chat(user, "<span class='notice'>You [open ? "open" : "close"] the conversion kit.</span>")
update_icon()