mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-17 10:05:27 +01:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 3/14/2017_makeshift_armor
This commit is contained in:
@@ -333,7 +333,7 @@ steam.start() -- spawns the effect
|
||||
spawn(0)
|
||||
var/turf/T = get_turf(src.holder)
|
||||
if(T != src.oldposition)
|
||||
if(istype(T, /turf/simulated))
|
||||
if(isturf(T))
|
||||
var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, src.oldposition)
|
||||
src.oldposition = T
|
||||
I.set_dir(src.holder.dir)
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
new /obj/item/clothing/under/waiter(src.loc)
|
||||
var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears)
|
||||
new CHOICE(src.loc)
|
||||
new /obj/item/clothing/suit/apron(src.loc)
|
||||
new /obj/item/clothing/suit/storage/apron(src.loc)
|
||||
delete_me = 1
|
||||
|
||||
/obj/effect/landmark/costume/pirate/New()
|
||||
|
||||
@@ -95,10 +95,8 @@
|
||||
|
||||
Trigger(var/atom/movable/A)
|
||||
if(teleport_x && teleport_y && teleport_z)
|
||||
|
||||
A.x = teleport_x
|
||||
A.y = teleport_y
|
||||
A.z = teleport_z
|
||||
var/turf/T = locate(teleport_x, teleport_y, teleport_z)
|
||||
A.forceMove(T)
|
||||
|
||||
/* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */
|
||||
|
||||
@@ -110,8 +108,5 @@
|
||||
Trigger(var/atom/movable/A)
|
||||
if(teleport_x && teleport_y && teleport_z)
|
||||
if(teleport_x_offset && teleport_y_offset && teleport_z_offset)
|
||||
|
||||
A.x = rand(teleport_x, teleport_x_offset)
|
||||
A.y = rand(teleport_y, teleport_y_offset)
|
||||
A.z = rand(teleport_z, teleport_z_offset)
|
||||
|
||||
var/turf/T = locate(rand(teleport_x, teleport_x_offset), rand(teleport_y, teleport_y_offset), rand(teleport_z, teleport_z_offset))
|
||||
A.forceMove(T)
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
// This artificially splits a ZAS zone, useful if you wish to prevent massive super-zones which can cause lag.
|
||||
/obj/effect/zone_divider
|
||||
name = "zone divider"
|
||||
icon = 'icons/mob/screen1.dmi'
|
||||
icon_state = "x3"
|
||||
invisibility = 101 //nope, can't see this
|
||||
anchored = 1
|
||||
density = 0
|
||||
opacity = 0
|
||||
|
||||
/obj/effect/zone_divider/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
// Special case to prevent us from being part of a zone during the first air master tick.
|
||||
// We must merge ourselves into a zone on next tick. This will cause a bit of lag on
|
||||
// startup, but it can't really be helped you know?
|
||||
if(air_master && air_master.current_cycle == 0)
|
||||
spawn(1)
|
||||
air_master.mark_for_update(get_turf(src))
|
||||
return 0
|
||||
return !air_group // Anything except zones can pass
|
||||
|
||||
@@ -4,17 +4,17 @@
|
||||
|
||||
// #define EMPDEBUG 10
|
||||
|
||||
proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
|
||||
proc/empulse(turf/epicenter, first_range, second_range, third_range, fourth_range, log=0)
|
||||
if(!epicenter) return
|
||||
|
||||
if(!istype(epicenter, /turf))
|
||||
epicenter = get_turf(epicenter.loc)
|
||||
|
||||
if(log)
|
||||
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
|
||||
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
|
||||
message_admins("EMP with size ([first_range], [second_range], [third_range], [fourth_range]) in area [epicenter.loc.name] ")
|
||||
log_game("EMP with size ([first_range], [second_range], [third_range], [fourth_range]) in area [epicenter.loc.name] ")
|
||||
|
||||
if(heavy_range > 1)
|
||||
if(first_range > 1)
|
||||
var/obj/effect/overlay/pulse = PoolOrNew(/obj/effect/overlay, epicenter)
|
||||
pulse.icon = 'icons/effects/effects.dmi'
|
||||
pulse.icon_state = "emppulse"
|
||||
@@ -23,28 +23,50 @@ proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
|
||||
spawn(20)
|
||||
qdel(pulse)
|
||||
|
||||
if(heavy_range > light_range)
|
||||
light_range = heavy_range
|
||||
if(first_range > second_range)
|
||||
second_range = first_range
|
||||
if(second_range > third_range)
|
||||
third_range = second_range
|
||||
if(third_range > fourth_range)
|
||||
fourth_range = third_range
|
||||
|
||||
for(var/mob/M in range(heavy_range, epicenter))
|
||||
for(var/mob/M in range(first_range, epicenter))
|
||||
M << 'sound/effects/EMPulse.ogg'
|
||||
|
||||
for(var/atom/T in range(light_range, epicenter))
|
||||
for(var/atom/T in range(fourth_range, epicenter))
|
||||
#ifdef EMPDEBUG
|
||||
var/time = world.timeofday
|
||||
#endif
|
||||
var/distance = get_dist(epicenter, T)
|
||||
if(distance < 0)
|
||||
distance = 0
|
||||
if(distance < heavy_range)
|
||||
//Worst effects, really hurts
|
||||
if(distance < first_range)
|
||||
T.emp_act(1)
|
||||
else if(distance == heavy_range)
|
||||
else if(distance == first_range)
|
||||
if(prob(50))
|
||||
T.emp_act(1)
|
||||
else
|
||||
T.emp_act(2)
|
||||
else if(distance <= light_range)
|
||||
//Slightly less painful
|
||||
else if(distance <= second_range)
|
||||
T.emp_act(2)
|
||||
else if(distance == second_range)
|
||||
if(prob(50))
|
||||
T.emp_act(2)
|
||||
else
|
||||
T.emp_act(3)
|
||||
//Even less slightly less painful
|
||||
else if(distance <= third_range)
|
||||
T.emp_act(3)
|
||||
else if(distance == third_range)
|
||||
if(prob(50))
|
||||
T.emp_act(2)
|
||||
else
|
||||
T.emp_act(3)
|
||||
//This should be more or less harmless
|
||||
else if(distance <= fourth_range)
|
||||
T.emp_act(4)
|
||||
#ifdef EMPDEBUG
|
||||
if((world.timeofday - time) >= EMPDEBUG)
|
||||
log_and_message_admins("EMPDEBUG: [T.name] - [T.type] - took [world.timeofday - time]ds to process emp_act()!")
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up
|
||||
var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N
|
||||
var/list/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
var/list/armorsoak = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
var/list/allowed = null //suit storage stuff.
|
||||
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
|
||||
var/zoomdevicename = null //name used for message when binoculars/scope is used
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
a hostile enviroment."
|
||||
icon = 'icons/obj/cryobag.dmi'
|
||||
icon_state = "bodybag_folded"
|
||||
item_state = "bodybag_cryo_folded"
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
/obj/item/bodybag/cryobag/attack_self(mob/user)
|
||||
|
||||
@@ -419,6 +419,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
if(1) icon = 'icons/obj/pda.dmi'
|
||||
if(2) icon = 'icons/obj/pda_slim.dmi'
|
||||
if(3) icon = 'icons/obj/pda_old.dmi'
|
||||
if(4) icon = 'icons/obj/pda_rugged.dmi'
|
||||
else
|
||||
icon = 'icons/obj/pda_old.dmi'
|
||||
log_debug("Invalid switch for PDA, defaulting to old PDA icons. [pdachoice] chosen.")
|
||||
@@ -998,7 +999,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
M.apply_damage( rand(30,60) , BURN)
|
||||
message += "You feel a searing heat! Your [P] is burning!"
|
||||
if(i>=20 && i<=25) //EMP
|
||||
empulse(P.loc, 3, 6, 1)
|
||||
empulse(P.loc, 1, 2, 4, 6, 1)
|
||||
message += "Your [P] emits a wave of electromagnetic energy!"
|
||||
if(i>=25 && i<=40) //Smoke
|
||||
var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "inteliCard"
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
icon_state = "aicard" // aicard-full
|
||||
item_state = "electronic"
|
||||
item_state = "aicard"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
show_messages = 0
|
||||
|
||||
@@ -213,6 +213,17 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
|
||||
update_icon()
|
||||
ui_interact(user)
|
||||
|
||||
// Proc: MouseDrop()
|
||||
//Same thing PDAs do
|
||||
/obj/item/device/communicator/MouseDrop(obj/over_object as obj)
|
||||
var/mob/M = usr
|
||||
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
|
||||
return
|
||||
if(!istype(over_object, /obj/screen))
|
||||
return attack_self(M)
|
||||
return
|
||||
|
||||
|
||||
// Proc: attack_ghost()
|
||||
// Parameters: 1 (user - the ghost clicking on the device)
|
||||
// Description: Recreates the known_devices list, so that the ghost looking at the device can see themselves, then calls ..() so that NanoUI appears.
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
var/state //0 off, 1 open, 2 working, 3 dead
|
||||
var/uses = 2 //Calculates initial uses based on starting cell size
|
||||
var/use_on_synthetic = 0 //If 1, this is only useful on FBPs, if 0, this is only useful on fleshies
|
||||
var/pad_name = "defib pads" //Just the name given for some cosmetic things
|
||||
var/chance = 75 //Percent chance of working
|
||||
var/charge_cost //Set in New() based on uses
|
||||
var/obj/item/weapon/cell/cell //The size is mostly irrelevant, see 'uses'
|
||||
@@ -32,13 +34,31 @@
|
||||
if(istype(onto) && Adjacent(usr) && !usr.restrained() && !usr.stat)
|
||||
var/mob/living/carbon/human/user = usr
|
||||
//<--Feel free to code clothing checks right here
|
||||
user.visible_message("<span class='warning'>[user] begins applying defib pads to [onto].</span>",
|
||||
"<span class='warning'>You begin applying defib pads to [onto].</span>")
|
||||
if(can_defib(onto))
|
||||
user.visible_message("<span class='warning'>[user] begins applying [pad_name] to [onto].</span>",
|
||||
"<span class='warning'>You begin applying [pad_name] to [onto].</span>")
|
||||
if(do_after(user, 100, onto))
|
||||
patient = onto
|
||||
statechange(1,patient)
|
||||
user.visible_message("<span class='warning'>[user] applies defib pads to [onto].</span>",
|
||||
"<span class='warning'>You finish applying defib pads to [onto].</span>")
|
||||
user.visible_message("<span class='warning'>[user] applies [pad_name] to [onto].</span>",
|
||||
"<span class='warning'>You finish applying [pad_name] to [onto].</span>")
|
||||
|
||||
|
||||
//can_defib() check is where all of the qualifying conditions should go
|
||||
//Could probably toss in checks here for damage, organs, etc, but for now I'll leave it as just this
|
||||
/obj/item/device/defib_kit/proc/can_defib(var/mob/living/carbon/human/target)
|
||||
var/mob/living/carbon/human/user = usr
|
||||
if(use_on_synthetic && !target.isSynthetic())
|
||||
to_chat(user, "[src] isn't designed for organics!")
|
||||
return 0
|
||||
else if(!use_on_synthetic && target.isSynthetic())
|
||||
to_chat(user, "[src] isn't designed for synthetics!")
|
||||
return 0
|
||||
else if(!target.isSynthetic() && ((world.time - target.timeofdeath) > (10 MINUTES)))//Can only revive organics within a few minutes
|
||||
to_chat(user, "There is no spark of life in [target.name], they've been dead too long to revive this way.")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/device/defib_kit/attackby(var/obj/item/A as obj, mob/living/user as mob)
|
||||
..()
|
||||
@@ -94,7 +114,7 @@
|
||||
|
||||
//Patient moved too far
|
||||
if(patient && !(get_dist(src,patient) <= 1)) //You separated the kit and pads too far
|
||||
audible_message("<span class='warning'>There's a clatter as the defib pads are yanked off of [patient].</span>")
|
||||
audible_message("<span class='warning'>There is a clatter as the [pad_name] are yanked off of [patient].</span>")
|
||||
statechange(0)
|
||||
patient = null
|
||||
return
|
||||
@@ -111,7 +131,7 @@
|
||||
patient.visible_message("<span class='warning'>[patient] convulses!</span>")
|
||||
playsound(src.loc, 'sound/effects/sparks2.ogg', 75, 1)
|
||||
//Actual rezzing code
|
||||
if(prob(chance) && ((world.time - patient.timeofdeath) < (10 MINUTES))) //Can only revive within a few minutes
|
||||
if(prob(chance))
|
||||
if(!patient.client && patient.mind) //Don't force the dead person to come back if they don't want to.
|
||||
for(var/mob/observer/dead/ghost in player_list)
|
||||
if(ghost.mind == patient.mind)
|
||||
@@ -155,3 +175,10 @@
|
||||
break
|
||||
|
||||
return
|
||||
|
||||
/obj/item/device/defib_kit/jumper_kit
|
||||
name = "jumper cable kit"
|
||||
desc = "This Morpheus-branded FBP defib kit is a semi-automated model. Apply cables, step back, wait."
|
||||
icon_state = "jumper_kit"
|
||||
use_on_synthetic = 1
|
||||
pad_name = "jumper cables"
|
||||
|
||||
@@ -181,6 +181,38 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/device/flashlight/MouseDrop(obj/over_object as obj)
|
||||
if(!canremove)
|
||||
return
|
||||
|
||||
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
|
||||
|
||||
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
|
||||
return
|
||||
|
||||
if (!( istype(over_object, /obj/screen) ))
|
||||
return ..()
|
||||
|
||||
//makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
|
||||
//there's got to be a better way of doing this.
|
||||
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
|
||||
return
|
||||
|
||||
if (( usr.restrained() ) || ( usr.stat ))
|
||||
return
|
||||
|
||||
if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
|
||||
return
|
||||
|
||||
switch(over_object.name)
|
||||
if("r_hand")
|
||||
usr.u_equip(src)
|
||||
usr.put_in_r_hand(src)
|
||||
if("l_hand")
|
||||
usr.u_equip(src)
|
||||
usr.put_in_l_hand(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
/obj/item/device/flashlight/attackby(obj/item/weapon/W, mob/user as mob)
|
||||
if(power_use)
|
||||
if(istype(W, /obj/item/weapon/cell))
|
||||
@@ -210,6 +242,26 @@
|
||||
w_class = ITEMSIZE_TINY
|
||||
power_use = 0
|
||||
|
||||
/obj/item/device/flashlight/color //Default color is blue, just roll with it.
|
||||
name = "blue flashlight"
|
||||
desc = "A hand-held emergency light. This one is blue."
|
||||
icon_state = "flashlight_blue"
|
||||
|
||||
/obj/item/device/flashlight/color/red
|
||||
name = "red flashlight"
|
||||
desc = "A hand-held emergency light. This one is red."
|
||||
icon_state = "flashlight_red"
|
||||
|
||||
/obj/item/device/flashlight/color/orange
|
||||
name = "orange flashlight"
|
||||
desc = "A hand-held emergency light. This one is orange."
|
||||
icon_state = "flashlight_orange"
|
||||
|
||||
/obj/item/device/flashlight/color/yellow
|
||||
name = "yellow flashlight"
|
||||
desc = "A hand-held emergency light. This one is yellow."
|
||||
icon_state = "flashlight_yellow"
|
||||
|
||||
/obj/item/device/flashlight/maglight
|
||||
name = "maglight"
|
||||
desc = "A very, very heavy duty flashlight."
|
||||
|
||||
@@ -45,8 +45,6 @@
|
||||
|
||||
icon = 'icons/obj/janitor.dmi'
|
||||
icon_state = "lightreplacer0"
|
||||
item_state = "electronic"
|
||||
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 2)
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
name = "megaphone"
|
||||
desc = "A device used to project your voice. Loudly."
|
||||
icon_state = "megaphone"
|
||||
item_state = "radio"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
flags = CONDUCT
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
name = "power sink"
|
||||
desc = "A nulling power sink which drains energy from electrical systems."
|
||||
icon_state = "powersink0"
|
||||
item_state = "electronic"
|
||||
w_class = ITEMSIZE_LARGE
|
||||
flags = CONDUCT
|
||||
throwforce = 5
|
||||
|
||||
@@ -19,6 +19,12 @@
|
||||
origin_tech = list(TECH_ILLEGAL = 3)
|
||||
syndie = 1//Signifies that it de-crypts Syndicate transmissions
|
||||
|
||||
/obj/item/device/encryptionkey/raider
|
||||
icon_state = "cypherkey"
|
||||
channels = list("Raider" = 1)
|
||||
origin_tech = list(TECH_ILLEGAL = 2)
|
||||
syndie = 1
|
||||
|
||||
/obj/item/device/encryptionkey/binary
|
||||
icon_state = "cypherkey"
|
||||
translate_binary = 1
|
||||
|
||||
@@ -75,6 +75,15 @@
|
||||
syndie = 1
|
||||
ks1type = /obj/item/device/encryptionkey/syndicate
|
||||
|
||||
/obj/item/device/radio/headset/raider
|
||||
origin_tech = list(TECH_ILLEGAL = 2)
|
||||
syndie = 1
|
||||
ks1type = /obj/item/device/encryptionkey/raider
|
||||
|
||||
/obj/item/device/radio/headset/raider/initialize()
|
||||
..()
|
||||
set_frequency(RAID_FREQ)
|
||||
|
||||
/obj/item/device/radio/headset/binary
|
||||
origin_tech = list(TECH_ILLEGAL = 3)
|
||||
ks1type = /obj/item/device/encryptionkey/binary
|
||||
@@ -289,6 +298,7 @@
|
||||
desc = "The headset of the boss's boss."
|
||||
icon_state = "com_headset"
|
||||
item_state = "headset"
|
||||
centComm = 1
|
||||
// freerange = 1
|
||||
ks2type = /obj/item/device/encryptionkey/ert
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
/obj/item/device/radio/intercom/specops
|
||||
name = "\improper Spec Ops intercom"
|
||||
frequency = ERT_FREQ
|
||||
subspace_transmission = 1
|
||||
centComm = 1
|
||||
|
||||
/obj/item/device/radio/intercom/department
|
||||
canhear_range = 5
|
||||
@@ -81,6 +83,17 @@
|
||||
..()
|
||||
internal_channels[num2text(SYND_FREQ)] = list(access_syndicate)
|
||||
|
||||
/obj/item/device/radio/intercom/raider
|
||||
name = "illicit intercom"
|
||||
desc = "Pirate radio, but not in the usual sense of the word."
|
||||
frequency = RAID_FREQ
|
||||
subspace_transmission = 1
|
||||
syndie = 1
|
||||
|
||||
/obj/item/device/radio/intercom/raider/New()
|
||||
..()
|
||||
internal_channels[num2text(RAID_FREQ)] = list(access_syndicate)
|
||||
|
||||
/obj/item/device/radio/intercom/Destroy()
|
||||
processing_objects -= src
|
||||
..()
|
||||
|
||||
@@ -40,6 +40,7 @@ var/global/list/default_medbay_channels = list(
|
||||
var/list/channels = list() //see communications.dm for full list. First channel is a "default" for :h
|
||||
var/subspace_transmission = 0
|
||||
var/syndie = 0//Holder to see if it's a syndicate encrypted radio
|
||||
var/centComm = 0//Holder to see if it's a CentComm encrypted radio
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
throw_speed = 2
|
||||
@@ -508,6 +509,9 @@ var/global/list/default_medbay_channels = list(
|
||||
if(freq in ANTAG_FREQS)
|
||||
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
||||
return -1
|
||||
if(freq in CENT_FREQS)
|
||||
if(!(src.centComm))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
||||
return -1
|
||||
if (!on)
|
||||
return -1
|
||||
if (!freq) //recieved on main frequency
|
||||
|
||||
@@ -243,7 +243,6 @@ REAGENT SCANNER
|
||||
name = "mass spectrometer"
|
||||
desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample."
|
||||
icon_state = "spectrometer"
|
||||
item_state = "analyzer"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
flags = CONDUCT | OPENCONTAINER
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
name = "\improper T-ray scanner"
|
||||
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
|
||||
icon_state = "t-ray0"
|
||||
item_state = "t-ray"
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = ITEMSIZE_SMALL
|
||||
item_state = "electronic"
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 150)
|
||||
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
|
||||
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
//Universal translator
|
||||
/obj/item/device/universal_translator
|
||||
name = "handheld translator"
|
||||
desc = "This handy device appears to translate the languages it hears into onscreen text for a user."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "translator"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
|
||||
var/mult_icons = 1 //Changes sprite when it translates
|
||||
var/visual = 1 //If you need to see to get the message
|
||||
var/audio = 0 //If you need to hear to get the message
|
||||
var/listening = 0
|
||||
var/datum/language/langset
|
||||
|
||||
/obj/item/device/universal_translator/attack_self(mob/user)
|
||||
if(!listening) //Turning ON
|
||||
langset = input(user,"Translate to which of your languages?","Language Selection") as null|anything in user.languages
|
||||
if(langset)
|
||||
if(langset && ((langset.flags & NONVERBAL) || (langset.flags & HIVEMIND) || (!langset.machine_understands)))
|
||||
//Nonverbal means no spoken words to translate, so I didn't see the need to remove it.
|
||||
to_chat(user, "<span class='warning'>\The [src] cannot output that language.</span>")
|
||||
return
|
||||
else
|
||||
listening = 1
|
||||
listening_objects |= src
|
||||
if(mult_icons)
|
||||
icon_state = "[initial(icon_state)]1"
|
||||
to_chat(user, "<span class='notice'>You enable \the [src], translating into [langset.name].</span>")
|
||||
else //Turning OFF
|
||||
listening = 0
|
||||
listening_objects -= src
|
||||
langset = null
|
||||
icon_state = "[initial(icon_state)]"
|
||||
to_chat(user, "<span class='notice'>You disable \the [src].</span>")
|
||||
|
||||
/obj/item/device/universal_translator/hear_talk(var/mob/speaker, var/message, var/vrb, var/datum/language/language)
|
||||
if(!listening || !istype(speaker))
|
||||
return
|
||||
|
||||
//Show the "I heard something" animation.
|
||||
if(mult_icons)
|
||||
flick("[initial(icon_state)]2",src)
|
||||
|
||||
//Handheld or pocket only.
|
||||
if(!isliving(loc))
|
||||
return
|
||||
|
||||
var/mob/living/L = loc
|
||||
|
||||
if (language && (language.flags & NONVERBAL))
|
||||
return //Not gonna translate sign language
|
||||
|
||||
if (!language.machine_understands)
|
||||
return //Any other languages that it can't translate.
|
||||
|
||||
if (visual && ((L.sdisabilities & BLIND) || L.eye_blind))
|
||||
return //Can't see the screen, don't get the message
|
||||
|
||||
if (audio && ((L.sdisabilities & DEAF) || L.ear_deaf))
|
||||
return //Can't hear the translation, don't get the message
|
||||
|
||||
//Only translate if they can't understand, otherwise pointlessly spammy
|
||||
//I'll just assume they don't look at the screen in that case
|
||||
|
||||
//They don't understand the spoken language we're translating FROM
|
||||
if(!L.say_understands(speaker,language))
|
||||
//They understand the output language
|
||||
if(L.say_understands(null,langset))
|
||||
to_chat(L, "<i><b>[src]</b> translates, </i>\"<span class='[langset.colour]'>[message]</span>\"")
|
||||
|
||||
//They don't understand the output language
|
||||
else
|
||||
to_chat(L, "<i><b>[src]</b> translates, </i>\"<span class='[langset.colour]'>[langset.scramble(message)]</span>\"")
|
||||
|
||||
//Let's try an ear-worn version
|
||||
/obj/item/device/universal_translator/ear
|
||||
name = "translator earpiece"
|
||||
desc = "This handy device appears to translate the languages it hears into another language for a user."
|
||||
icon_state = "earpiece"
|
||||
w_class = ITEMSIZE_TINY
|
||||
slot_flags = SLOT_EARS
|
||||
visual = 0
|
||||
audio = 1
|
||||
@@ -50,3 +50,15 @@
|
||||
/obj/item/latexballon/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if (can_puncture(W))
|
||||
burst()
|
||||
|
||||
/*
|
||||
/obj/item/latexballon/nitrile
|
||||
name = "nitrile glove"
|
||||
desc = "A nitrile glove, usually used as a balloon."
|
||||
icon_state = "nitrileballon"
|
||||
item_icons = list(
|
||||
slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi',
|
||||
slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi',
|
||||
)
|
||||
item_state = "ngloves"
|
||||
*/
|
||||
@@ -4,34 +4,20 @@
|
||||
Cyborg Spec Items
|
||||
***********************************************************************/
|
||||
//Might want to move this into several files later but for now it works here
|
||||
// Consider changing this to a child of the stun baton class. ~Z
|
||||
/obj/item/borg/stun
|
||||
|
||||
/obj/item/weapon/melee/baton/robot/arm
|
||||
name = "electrified arm"
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
icon_state = "shock"
|
||||
|
||||
/obj/item/borg/stun/apply_hit_effect(mob/living/M, mob/living/silicon/robot/user, var/hit_zone)
|
||||
// How the Hell.
|
||||
if(!istype(user))
|
||||
var/mob/living/temp = user
|
||||
if(istype(temp))
|
||||
temp.drop_from_inventory(src)
|
||||
qdel(src)
|
||||
return
|
||||
hitcost = 750
|
||||
agonyforce = 70
|
||||
|
||||
user.visible_message("<span class='danger'>\The [user] has prodded \the [M] with \a [src]!</span>")
|
||||
|
||||
if(!user.cell || !user.cell.checked_use(1250)) //Slightly more than a baton.
|
||||
return
|
||||
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
|
||||
M.apply_effect(5, STUTTER)
|
||||
M.stun_effect_act(0, 70, check_zone(hit_zone), src)
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.forcesay(hit_appends)
|
||||
/obj/item/weapon/melee/baton/robot/arm/update_icon()
|
||||
if(status)
|
||||
set_light(1.5, 1, lightcolor)
|
||||
else
|
||||
set_light(0)
|
||||
|
||||
/obj/item/borg/overdrive
|
||||
name = "overdrive"
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
name = "robotic module reset board"
|
||||
desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot."
|
||||
icon_state = "cyborg_upgrade1"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R)
|
||||
@@ -41,6 +42,7 @@
|
||||
name = "robot reclassification board"
|
||||
desc = "Used to rename a cyborg."
|
||||
icon_state = "cyborg_upgrade1"
|
||||
item_state = "cyborg_upgrade"
|
||||
var/heldname = "default name"
|
||||
|
||||
/obj/item/borg/upgrade/rename/attack_self(mob/user as mob)
|
||||
@@ -59,6 +61,7 @@
|
||||
name = "robot emergency restart module"
|
||||
desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online."
|
||||
icon_state = "cyborg_upgrade1"
|
||||
item_state = "cyborg_upgrade"
|
||||
|
||||
|
||||
/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R)
|
||||
@@ -82,6 +85,7 @@
|
||||
name = "robotic VTEC Module"
|
||||
desc = "Used to kick in a robot's VTEC systems, increasing their speed."
|
||||
icon_state = "cyborg_upgrade2"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
|
||||
@@ -98,6 +102,7 @@
|
||||
name = "robotic Rapid Taser Cooling Module"
|
||||
desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
|
||||
@@ -132,6 +137,7 @@
|
||||
name = "mining robot jetpack"
|
||||
desc = "A carbon dioxide jetpack suitable for low-gravity mining operations."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R)
|
||||
@@ -153,6 +159,7 @@
|
||||
name = "illegal equipment module"
|
||||
desc = "Unlocks the hidden, deadlier functions of a robot"
|
||||
icon_state = "cyborg_upgrade3"
|
||||
item_state = "cyborg_upgrade"
|
||||
require_module = 1
|
||||
|
||||
/obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "tube"
|
||||
origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
|
||||
amount = 10
|
||||
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
/obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob)
|
||||
if (!istype(M) || !istype(user))
|
||||
|
||||
@@ -35,6 +35,10 @@
|
||||
name = "Scaredy's Private Reserve Beef Jerky"
|
||||
icon_state = "sosjerky"
|
||||
|
||||
/obj/item/trash/unajerky
|
||||
name = "Moghes Imported Sissalik Jerky"
|
||||
icon_state = "unathitinred"
|
||||
|
||||
/obj/item/trash/syndi_cakes
|
||||
name = "syndi cakes"
|
||||
icon_state = "syndi_cakes"
|
||||
|
||||
@@ -10,7 +10,6 @@ AI MODULES
|
||||
name = "\improper AI module"
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "std_mod"
|
||||
item_state = "electronic"
|
||||
desc = "An AI Module for transmitting encrypted instructions to the AI."
|
||||
flags = CONDUCT
|
||||
force = 5.0
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
desc = "Extracts information on wounds."
|
||||
icon = 'icons/obj/autopsy_scanner.dmi'
|
||||
icon_state = ""
|
||||
item_state = "autopsy_scanner"
|
||||
flags = CONDUCT
|
||||
w_class = ITEMSIZE_SMALL
|
||||
origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
|
||||
|
||||
@@ -87,6 +87,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
var/icon_on
|
||||
var/type_butt = null
|
||||
var/chem_volume = 0
|
||||
var/max_smoketime = 0 //Related to sprites
|
||||
var/smoketime = 0
|
||||
var/is_pipe = 0 //Prevents a runtime with pipes
|
||||
var/matchmes = "USER lights NAME with FLAME"
|
||||
@@ -100,18 +101,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
..()
|
||||
flags |= NOREACT // so it doesn't react until you light it
|
||||
create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15
|
||||
if(smoketime && !max_smoketime)
|
||||
max_smoketime = smoketime
|
||||
|
||||
/obj/item/clothing/mask/smokable/process()
|
||||
var/turf/location = get_turf(src)
|
||||
smoketime--
|
||||
if(smoketime < 1)
|
||||
die()
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/C = loc
|
||||
to_chat(C, "<span class='notice'>Your [name] goes out.</span>")
|
||||
return
|
||||
if(location)
|
||||
location.hotspot_expose(700, 5)
|
||||
/obj/item/clothing/mask/smokable/proc/smoke(amount)
|
||||
if(smoketime > max_smoketime)
|
||||
smoketime = max_smoketime
|
||||
smoketime -= amount
|
||||
if(reagents && reagents.total_volume) // check if it has any reagents at all
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/C = loc
|
||||
@@ -120,11 +116,38 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
else // else just remove some of the reagents
|
||||
reagents.remove_any(REM)
|
||||
|
||||
/obj/item/clothing/mask/smokable/process()
|
||||
var/turf/location = get_turf(src)
|
||||
smoke(1)
|
||||
if(smoketime < 1)
|
||||
die()
|
||||
return
|
||||
if(location)
|
||||
location.hotspot_expose(700, 5)
|
||||
|
||||
/obj/item/clothing/mask/smokable/update_icon()
|
||||
if(lit)
|
||||
icon_state = "[initial(icon_state)]_on"
|
||||
item_state = "[initial(item_state)]_on"
|
||||
else if(smoketime < max_smoketime)
|
||||
if(is_pipe)
|
||||
icon_state = initial(icon_state)
|
||||
item_state = initial(item_state)
|
||||
else
|
||||
icon_state = "[initial(icon_state)]_burnt"
|
||||
item_state = "[initial(item_state)]_burnt"
|
||||
if(ismob(loc))
|
||||
var/mob/living/M = loc
|
||||
M.update_inv_wear_mask(0)
|
||||
M.update_inv_l_hand(0)
|
||||
M.update_inv_r_hand(1)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/mask/smokable/examine(mob/user)
|
||||
..()
|
||||
if(is_pipe)
|
||||
return
|
||||
var/smoke_percent = round((smoketime / initial(smoketime)) * 100)
|
||||
var/smoke_percent = round((smoketime / max_smoketime) * 100)
|
||||
switch(smoke_percent)
|
||||
if(90 to INFINITY)
|
||||
user << "[src] is still fresh."
|
||||
@@ -156,15 +179,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
return
|
||||
flags &= ~NOREACT // allowing reagents to react after being lit
|
||||
reagents.handle_reactions()
|
||||
icon_state = icon_on
|
||||
item_state = icon_on
|
||||
if(ismob(loc))
|
||||
var/mob/living/M = loc
|
||||
M.update_inv_wear_mask(0)
|
||||
M.update_inv_l_hand(0)
|
||||
M.update_inv_r_hand(1)
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message(flavor_text)
|
||||
update_icon()
|
||||
set_light(2, 0.25, "#E38F46")
|
||||
processing_objects.Add(src)
|
||||
|
||||
@@ -205,14 +222,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/proc/quench()
|
||||
lit = 0
|
||||
processing_objects.Remove(src)
|
||||
icon_state = initial(icon_state)
|
||||
item_state = initial(item_state)
|
||||
update_icon()
|
||||
|
||||
if(ismob(loc))
|
||||
var/mob/living/M = loc
|
||||
M.update_inv_wear_mask(0)
|
||||
M.update_inv_l_hand(0)
|
||||
M.update_inv_r_hand(1)
|
||||
/obj/item/clothing/mask/smokable/attack(mob/living/carbon/human/H, mob/user, def_zone)
|
||||
if(lit && H == user && istype(H))
|
||||
var/obj/item/blocked = H.check_mouth_coverage()
|
||||
if(blocked)
|
||||
to_chat(H, "<span class='warning'>\The [blocked] is in the way!</span>")
|
||||
return 1
|
||||
to_chat(H, "<span class='notice'>You take a drag on your [name].</span>")
|
||||
smoke(5)
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/mask/smokable/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
@@ -248,15 +269,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/cigarette
|
||||
name = "cigarette"
|
||||
desc = "A roll of tobacco and nicotine."
|
||||
icon_state = "cigoff"
|
||||
icon_state = "cig"
|
||||
item_state = "cig"
|
||||
throw_speed = 0.5
|
||||
item_state = "cigoff"
|
||||
w_class = ITEMSIZE_TINY
|
||||
slot_flags = SLOT_EARS | SLOT_MASK
|
||||
attack_verb = list("burnt", "singed")
|
||||
icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
|
||||
type_butt = /obj/item/weapon/cigbutt
|
||||
chem_volume = 15
|
||||
max_smoketime = 300
|
||||
smoketime = 300
|
||||
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
|
||||
lightermes = "<span class='notice'>USER manages to light their NAME with FLAME.</span>"
|
||||
@@ -304,11 +325,11 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/cigarette/cigar
|
||||
name = "premium cigar"
|
||||
desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
|
||||
icon_state = "cigar2off"
|
||||
icon_on = "cigar2on"
|
||||
icon_state = "cigar2"
|
||||
type_butt = /obj/item/weapon/cigbutt/cigarbutt
|
||||
throw_speed = 0.5
|
||||
item_state = "cigaroff"
|
||||
item_state = "cigar"
|
||||
max_smoketime = 1500
|
||||
smoketime = 1500
|
||||
chem_volume = 20
|
||||
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
|
||||
@@ -320,14 +341,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba
|
||||
name = "\improper Cohiba Robusto cigar"
|
||||
desc = "There's little more you could want from a cigar."
|
||||
icon_state = "cigar2off"
|
||||
icon_on = "cigar2on"
|
||||
icon_state = "cigar2"
|
||||
|
||||
/obj/item/clothing/mask/smokable/cigarette/cigar/havana
|
||||
name = "premium Havanian cigar"
|
||||
desc = "A cigar fit for only the best of the best."
|
||||
icon_state = "cigar2off"
|
||||
icon_on = "cigar2on"
|
||||
icon_state = "cigar2"
|
||||
max_smoketime = 7200
|
||||
smoketime = 7200
|
||||
chem_volume = 30
|
||||
|
||||
@@ -364,9 +384,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/pipe
|
||||
name = "smoking pipe"
|
||||
desc = "A pipe, for smoking. Made of fine, stained cherry wood."
|
||||
icon_state = "pipeoff"
|
||||
item_state = "pipeoff"
|
||||
icon_on = "pipeon" //Note - these are in masks.dmi
|
||||
icon_state = "pipe"
|
||||
item_state = "pipe"
|
||||
smoketime = 0
|
||||
chem_volume = 50
|
||||
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
|
||||
@@ -418,6 +437,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
if (smoketime)
|
||||
user << "<span class='notice'>[src] is already packed.</span>"
|
||||
return
|
||||
max_smoketime = 1000
|
||||
smoketime = 1000
|
||||
if(G.reagents)
|
||||
G.reagents.trans_to_obj(src, G.reagents.total_volume)
|
||||
@@ -444,9 +464,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
/obj/item/clothing/mask/smokable/pipe/cobpipe
|
||||
name = "corn cob pipe"
|
||||
desc = "A nicotine delivery system popularized by folksy backwoodsmen, kept popular in the modern age and beyond by space hipsters."
|
||||
icon_state = "cobpipeoff"
|
||||
item_state = "cobpipeoff"
|
||||
icon_on = "cobpipeon" //Note - these are in masks.dmi
|
||||
icon_state = "cobpipe"
|
||||
item_state = "cobpipe"
|
||||
chem_volume = 35
|
||||
|
||||
/////////
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
name = "circuit board"
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "id_mod"
|
||||
item_state = "electronic"
|
||||
origin_tech = list(TECH_DATA = 2)
|
||||
density = 0
|
||||
anchored = 0
|
||||
@@ -47,7 +46,7 @@
|
||||
var/comp_amt = req_components[comp_path]
|
||||
if(!comp_amt)
|
||||
continue
|
||||
|
||||
|
||||
if(ispath(comp_path, /obj/item/stack))
|
||||
M.component_parts += new comp_path(contain_parts ? M : null, comp_amt)
|
||||
else
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#ifndef T_BOARD
|
||||
#error T_BOARD macro is not defined but we need it!
|
||||
#endif
|
||||
|
||||
/obj/item/weapon/circuitboard/pipelayer
|
||||
name = T_BOARD("pipe layer")
|
||||
build_path = /obj/machinery/pipelayer
|
||||
board_type = new /datum/frame/frame_types/machine
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
|
||||
req_components = list(
|
||||
/obj/item/weapon/stock_parts/motor = 1,
|
||||
/obj/item/weapon/stock_parts/gear = 1,
|
||||
/obj/item/weapon/stock_parts/matter_bin = 1)
|
||||
@@ -7,7 +7,6 @@
|
||||
name = "exosuit circuit board"
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "std_mod"
|
||||
item_state = "electronic"
|
||||
board_type = "other"
|
||||
|
||||
/obj/item/weapon/circuitboard/mecha/ripley
|
||||
|
||||
@@ -3,12 +3,14 @@
|
||||
icon_state = "emp"
|
||||
item_state = "empgrenade"
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
|
||||
var/emp_heavy = 4
|
||||
var/emp_light = 10
|
||||
var/emp_heavy = 2
|
||||
var/emp_med = 4
|
||||
var/emp_light = 7
|
||||
var/emp_long = 10
|
||||
|
||||
prime()
|
||||
..()
|
||||
if(empulse(src, emp_heavy, emp_light))
|
||||
if(empulse(src, emp_heavy, emp_med, emp_light, emp_long))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -18,4 +20,6 @@
|
||||
icon_state = "lyemp"
|
||||
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
|
||||
emp_heavy = 1
|
||||
emp_light = 4
|
||||
emp_med = 2
|
||||
emp_light = 3
|
||||
emp_long = 4
|
||||
@@ -42,7 +42,8 @@
|
||||
|
||||
/obj/item/weapon/handcuffs/proc/can_place(var/mob/target, var/mob/user)
|
||||
if(istype(user, /mob/living/silicon/robot))
|
||||
return 1
|
||||
if(user.Adjacent(target))
|
||||
return 1
|
||||
else
|
||||
for(var/obj/item/weapon/grab/G in target.grabbed_by)
|
||||
if(G.loc == user && G.state >= GRAB_AGGRESSIVE)
|
||||
|
||||
@@ -101,6 +101,10 @@ Implant Specifics:<BR>"}
|
||||
meltdown()
|
||||
if(2)
|
||||
delay = rand(5*60*10,15*60*10) //from 5 to 15 minutes of free time
|
||||
if(3)
|
||||
delay = rand(2*60*10,5*60*10) //from 2 to 5 minutes of free time
|
||||
if(4)
|
||||
delay = rand(0.5*60*10,1*60*10) //from .5 to 1 minutes of free time
|
||||
|
||||
spawn(delay)
|
||||
malfunction--
|
||||
@@ -227,10 +231,22 @@ Implant Specifics:<BR>"}
|
||||
return
|
||||
malfunction = MALFUNCTION_TEMPORARY
|
||||
switch (severity)
|
||||
if (2.0) //Weak EMP will make implant tear limbs off.
|
||||
if (4) //Weak EMP will make implant tear limbs off.
|
||||
if (prob(25))
|
||||
small_boom()
|
||||
if (3) //Weak EMP will make implant tear limbs off.
|
||||
if (prob(50))
|
||||
small_boom()
|
||||
if (1.0) //strong EMP will melt implant either making it go off, or disarming it
|
||||
if (2) //strong EMP will melt implant either making it go off, or disarming it
|
||||
if (prob(70))
|
||||
if (prob(75))
|
||||
small_boom()
|
||||
else
|
||||
if (prob(13))
|
||||
activate() //chance of bye bye
|
||||
else
|
||||
meltdown() //chance of implant disarming
|
||||
if (1) //strong EMP will melt implant either making it go off, or disarming it
|
||||
if (prob(70))
|
||||
if (prob(50))
|
||||
small_boom()
|
||||
@@ -320,7 +336,13 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
if(prob(60))
|
||||
activate(20)
|
||||
if(2)
|
||||
if(prob(30))
|
||||
if(prob(40))
|
||||
activate(20)
|
||||
if(3)
|
||||
if(prob(40))
|
||||
activate(5)
|
||||
if(4)
|
||||
if(prob(20))
|
||||
activate(5)
|
||||
|
||||
spawn(20)
|
||||
@@ -430,23 +452,27 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
|
||||
if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
|
||||
//give the syndies a bit of stealth
|
||||
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security")
|
||||
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical")
|
||||
a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "General")
|
||||
// a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security")
|
||||
// a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical")
|
||||
else
|
||||
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security")
|
||||
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical")
|
||||
a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "General")
|
||||
// a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security")
|
||||
// a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical")
|
||||
qdel(a)
|
||||
processing_objects.Remove(src)
|
||||
if ("emp")
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
|
||||
var/name = prob(50) ? t.name : pick(teleportlocs)
|
||||
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security")
|
||||
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical")
|
||||
a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "General")
|
||||
// a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security")
|
||||
// a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical")
|
||||
qdel(a)
|
||||
else
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
|
||||
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security")
|
||||
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical")
|
||||
a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "General")
|
||||
// a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security")
|
||||
// a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical")
|
||||
qdel(a)
|
||||
processing_objects.Remove(src)
|
||||
|
||||
|
||||
@@ -67,4 +67,4 @@
|
||||
qdel(I)
|
||||
qdel(src)
|
||||
user.put_in_hands(finished)
|
||||
update_icon(user)
|
||||
update_icon(user)
|
||||
@@ -9,6 +9,7 @@
|
||||
default_material = "wood"
|
||||
force_divisor = 1.1 // 22 when wielded with weight 20 (steel)
|
||||
unwielded_force_divisor = 0.7 // 15 when unwielded based on above.
|
||||
dulled_divisor = 0.75 // A "dull" bat is still gonna hurt
|
||||
slot_flags = SLOT_BACK
|
||||
|
||||
//Predefined materials go here.
|
||||
|
||||
@@ -94,7 +94,6 @@
|
||||
icon_state = "tacknife"
|
||||
item_state = "knife"
|
||||
applies_material_colour = 0
|
||||
unbreakable = 1
|
||||
|
||||
/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
@@ -117,6 +116,7 @@
|
||||
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
|
||||
default_material = "wood"
|
||||
force_divisor = 0.7 // 10 when wielded with weight 15 (wood)
|
||||
dulled_divisor = 0.75 // Still a club
|
||||
thrown_force_divisor = 1 // as above
|
||||
|
||||
/obj/item/weapon/material/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
|
||||
|
||||
@@ -33,7 +33,13 @@
|
||||
name = "switchblade"
|
||||
desc = "A classic switchblade with gold engraving. Just holding it makes you feel like a gangster."
|
||||
icon_state = "switchblade"
|
||||
unbreakable = 1
|
||||
|
||||
/obj/item/weapon/material/butterfly/boxcutter
|
||||
name = "box cutter"
|
||||
desc = "A thin, inexpensive razor-blade knife designed to open cardboard boxes."
|
||||
icon_state = "boxcutter"
|
||||
force_divisor = 0.1 // 6 when wielded with hardness 60 (steel)
|
||||
thrown_force_divisor = 0.2 // 4 when thrown with weight 20 (steel)
|
||||
|
||||
/obj/item/weapon/material/butterfly/attack_self(mob/user)
|
||||
active = !active
|
||||
@@ -60,7 +66,6 @@
|
||||
matter = list(DEFAULT_WALL_MATERIAL = 12000)
|
||||
origin_tech = "materials=1"
|
||||
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
unbreakable = 1
|
||||
|
||||
/obj/item/weapon/material/knife/suicide_act(mob/user)
|
||||
viewers(user) << pick("<span class='danger'>\The [user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.</span>", \
|
||||
|
||||
@@ -16,9 +16,12 @@
|
||||
)
|
||||
|
||||
var/applies_material_colour = 1
|
||||
var/unbreakable
|
||||
var/unbreakable = 0 //Doesn't lose health
|
||||
var/fragile = 0 //Shatters when it dies
|
||||
var/dulled = 0 //Has gone dull
|
||||
var/force_divisor = 0.5
|
||||
var/thrown_force_divisor = 0.5
|
||||
var/dulled_divisor = 0.5 //Just drops the damage by half
|
||||
var/default_material = DEFAULT_WALL_MATERIAL
|
||||
var/material/material
|
||||
var/drops_debris = 1
|
||||
@@ -47,6 +50,8 @@
|
||||
else
|
||||
force = material.get_blunt_damage()
|
||||
force = round(force*force_divisor)
|
||||
if(dulled)
|
||||
force = round(force*dulled_divisor)
|
||||
throwforce = round(material.get_blunt_damage()*thrown_force_divisor)
|
||||
//spawn(1)
|
||||
// world << "[src] has force [force] and throwforce [throwforce] when made from default material [material.name]"
|
||||
@@ -77,9 +82,18 @@
|
||||
health--
|
||||
check_health()
|
||||
|
||||
/obj/item/weapon/material/attackby(obj/item/weapon/W, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/whetstone))
|
||||
var/obj/item/weapon/whetstone/whet = W
|
||||
repair(whet.repair_amount, whet.repair_time, user)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/material/proc/check_health(var/consumed)
|
||||
if(health<=0)
|
||||
shatter(consumed)
|
||||
if(fragile)
|
||||
shatter(consumed)
|
||||
else if(!dulled)
|
||||
dull()
|
||||
|
||||
/obj/item/weapon/material/proc/shatter(var/consumed)
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -90,6 +104,34 @@
|
||||
playsound(src, "shatter", 70, 1)
|
||||
if(!consumed && drops_debris) material.place_shard(T)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/material/proc/dull()
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message("<span class='danger'>\The [src] goes dull!</span>")
|
||||
playsound(src, "shatter", 70, 1)
|
||||
dulled = 1
|
||||
if(is_sharp() || has_edge())
|
||||
sharp = 0
|
||||
edge = 0
|
||||
|
||||
/obj/item/weapon/material/proc/repair(var/repair_amount, var/repair_time, mob/living/user)
|
||||
if(!fragile)
|
||||
if(health < initial(health))
|
||||
user.visible_message("[user] begins repairing \the [src].", "You begin repairing \the [src].")
|
||||
if(do_after(user, repair_time))
|
||||
user.visible_message("[user] has finished repairing \the [src]", "You finish repairing \the [src].")
|
||||
health = min(health + repair_amount, initial(health))
|
||||
dulled = 0
|
||||
sharp = initial(sharp)
|
||||
edge = initial(edge)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] doesn't need repairs.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't repair \the [src].</span>")
|
||||
return
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Commenting this out pending rebalancing of radiation based on small objects.
|
||||
/obj/item/weapon/material/process()
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
gender = PLURAL
|
||||
w_class = ITEMSIZE_SMALL
|
||||
force_divisor = 0.63
|
||||
dulled_divisor = 0.75 //It's a heavy bit of metal
|
||||
attack_verb = list("punched", "beaten", "struck")
|
||||
applies_material_colour = 0
|
||||
|
||||
@@ -82,6 +83,7 @@
|
||||
icon_state = "hoe"
|
||||
force_divisor = 0.25 // 5 with weight 20 (steel)
|
||||
thrown_force_divisor = 0.25 // as above
|
||||
dulled_divisor = 0.75 //Still metal on a long pole
|
||||
w_class = ITEMSIZE_SMALL
|
||||
attack_verb = list("slashed", "sliced", "cut", "clawed")
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
if(affecting.take_damage(force, 0))
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
if(affecting.can_feel_pain())
|
||||
if(affecting.organ_can_feel_pain())
|
||||
H.Weaken(3)
|
||||
return
|
||||
check -= picked
|
||||
|
||||
@@ -85,6 +85,7 @@
|
||||
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
|
||||
unwielded_force_divisor = 0.25
|
||||
force_divisor = 0.7 // 10/42 with hardness 60 (steel) and 0.25 unwielded divisor
|
||||
dulled_divisor = 0.75 //Still metal on a stick
|
||||
sharp = 1
|
||||
edge = 1
|
||||
w_class = ITEMSIZE_LARGE
|
||||
@@ -140,4 +141,5 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
|
||||
default_material = "glass"
|
||||
applies_material_colour = 0
|
||||
applies_material_colour = 0
|
||||
fragile = 1 //It's a haphazard thing of glass, wire, and steel
|
||||
@@ -0,0 +1,11 @@
|
||||
//This is in the material folder because it's used by them...
|
||||
//Actual name may need to change
|
||||
//All of the important code is in material_weapons.dm
|
||||
/obj/item/weapon/whetstone
|
||||
name = "whetstone"
|
||||
desc = "A simple, fine grit stone, useful for sharpening dull edges and polishing out dents."
|
||||
icon_state = "whetstone"
|
||||
force = 3
|
||||
w_class = ITEMSIZE_SMALL
|
||||
var/repair_amount = 5
|
||||
var/repair_time = 40
|
||||
@@ -0,0 +1,35 @@
|
||||
//This'll be used for gun permits, such as for heads of staff, antags, and bartenders
|
||||
|
||||
/obj/item/weapon/permit
|
||||
name = "permit"
|
||||
desc = "A permit for something."
|
||||
icon = 'icons/obj/card.dmi'
|
||||
icon_state = "permit"
|
||||
w_class = ITEMSIZE_TINY
|
||||
var/owner = 0 //To prevent people from just renaming the thing if they steal it
|
||||
|
||||
/obj/item/weapon/permit/attack_self(mob/user as mob)
|
||||
if(isliving(user))
|
||||
if(!owner)
|
||||
set_name(user.name)
|
||||
to_chat(user, "[src] registers your name.")
|
||||
else
|
||||
to_chat(user, "[src] already has an owner!")
|
||||
|
||||
/obj/item/weapon/permit/proc/set_name(var/new_name)
|
||||
owner = 1
|
||||
if(new_name)
|
||||
src.name += " ([new_name])"
|
||||
desc += " It belongs to [new_name]."
|
||||
|
||||
/obj/item/weapon/permit/emag_act(var/remaining_charges, var/mob/user)
|
||||
to_chat(user, "You reset the naming locks on [src]!")
|
||||
owner = 0
|
||||
|
||||
/obj/item/weapon/permit/gun
|
||||
name = "weapon permit"
|
||||
desc = "A card indicating that the owner is allowed to carry a firearm."
|
||||
|
||||
/obj/item/weapon/permit/gun/bar
|
||||
name = "bar shotgun permit"
|
||||
desc = "A card indicating that the owner is allowed to carry a shotgun in the bar."
|
||||
@@ -75,7 +75,7 @@
|
||||
/obj/item/weapon/storage/box/gloves/New()
|
||||
..()
|
||||
for(var/i = 1 to 7)
|
||||
new /obj/item/clothing/gloves/latex(src)
|
||||
new /obj/item/clothing/gloves/sterile/latex(src)
|
||||
|
||||
/obj/item/weapon/storage/box/masks
|
||||
name = "box of sterile masks"
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
new /obj/item/weapon/storage/pill_bottle/dylovene(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/tramadol(src)
|
||||
new /obj/item/weapon/storage/pill_bottle/spaceacillin(src)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
|
||||
new /obj/item/stack/medical/splint(src)
|
||||
return
|
||||
|
||||
@@ -150,6 +151,19 @@
|
||||
new /obj/item/stack/medical/advanced/bruise_pack(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/firstaid/clotting
|
||||
name = "clotting kit"
|
||||
desc = "Contains chemicals to stop bleeding."
|
||||
max_storage_space = ITEMSIZE_COST_SMALL * 7
|
||||
|
||||
/obj/item/weapon/storage/firstaid/clotting/New()
|
||||
..()
|
||||
if (empty)
|
||||
return
|
||||
for(var/i = 1 to 8)
|
||||
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src)
|
||||
return
|
||||
|
||||
/*
|
||||
* Pill Bottles
|
||||
*/
|
||||
|
||||
@@ -28,6 +28,38 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/baton/MouseDrop(obj/over_object as obj)
|
||||
if(!canremove)
|
||||
return
|
||||
|
||||
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
|
||||
|
||||
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
|
||||
return
|
||||
|
||||
if (!( istype(over_object, /obj/screen) ))
|
||||
return ..()
|
||||
|
||||
//makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
|
||||
//there's got to be a better way of doing this.
|
||||
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
|
||||
return
|
||||
|
||||
if (( usr.restrained() ) || ( usr.stat ))
|
||||
return
|
||||
|
||||
if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
|
||||
return
|
||||
|
||||
switch(over_object.name)
|
||||
if("r_hand")
|
||||
usr.u_equip(src)
|
||||
usr.put_in_r_hand(src)
|
||||
if("l_hand")
|
||||
usr.u_equip(src)
|
||||
usr.put_in_l_hand(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed.
|
||||
..()
|
||||
bcell = new/obj/item/weapon/cell/device/weapon(src)
|
||||
|
||||
@@ -39,6 +39,10 @@
|
||||
|
||||
/obj/item/weapon/syndie/c4explosive/proc/detonate()
|
||||
icon_state = "c-4[size]_1"
|
||||
playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1)
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("\icon[src] <span class = 'warning'> The [src.name] beeps! </span>")
|
||||
sleep(50)
|
||||
explosion(get_turf(src), power, power*2, power*3, power*4, power*5)
|
||||
for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors.
|
||||
var/turf/simulated/wall/T = get_step(src,dirn)
|
||||
@@ -89,4 +93,4 @@
|
||||
/obj/item/weapon/flame/lighter/zippo/c4detonator/attackby(obj/item/weapon/W, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
detonator_mode = !detonator_mode
|
||||
user << "<span class='notice'>You unscrew the top panel of \the [src] revealing a button.</span>"
|
||||
user << "<span class='notice'>You unscrew the top panel of \the [src] revealing a button.</span>"
|
||||
|
||||
@@ -104,7 +104,6 @@
|
||||
name = "phoron tank"
|
||||
desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable."
|
||||
icon_state = "phoron_vox"
|
||||
item_state = "oxygen_fr"
|
||||
gauge_icon = null
|
||||
flags = CONDUCT
|
||||
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
|
||||
@@ -210,4 +209,4 @@
|
||||
/obj/item/weapon/tank/nitrogen/examine(mob/user)
|
||||
if(..(user, 0) && air_contents.gas["nitrogen"] < 10)
|
||||
user << text("<span class='danger'>The meter on \the [src] indicates you are almost out of nitrogen!</span>")
|
||||
//playsound(user, 'sound/effects/alert.ogg', 50, 1)
|
||||
//playsound(user, 'sound/effects/alert.ogg', 50, 1)
|
||||
|
||||
@@ -172,7 +172,8 @@
|
||||
|
||||
/obj/item/weapon/weldingtool/examine(mob/user)
|
||||
if(..(user, 0))
|
||||
user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )
|
||||
if(max_fuel)
|
||||
user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
@@ -234,18 +235,22 @@
|
||||
|
||||
/obj/item/weapon/weldingtool/afterattack(obj/O as obj, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !src.welding)
|
||||
O.reagents.trans_to_obj(src, max_fuel)
|
||||
user << "<span class='notice'>Welder refueled</span>"
|
||||
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
|
||||
return
|
||||
else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding)
|
||||
message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
|
||||
log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
|
||||
user << "<span class='danger'>You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.</span>"
|
||||
var/obj/structure/reagent_dispensers/fueltank/tank = O
|
||||
tank.explode()
|
||||
return
|
||||
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !welding)
|
||||
if(!welding && max_fuel)
|
||||
O.reagents.trans_to_obj(src, max_fuel)
|
||||
user << "<span class='notice'>Welder refueled</span>"
|
||||
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
|
||||
return
|
||||
else if(!welding)
|
||||
user << "<span class='notice'>[src] doesn't use fuel.</span>"
|
||||
return
|
||||
else
|
||||
message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
|
||||
log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
|
||||
user << "<span class='danger'>You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.</span>"
|
||||
var/obj/structure/reagent_dispensers/fueltank/tank = O
|
||||
tank.explode()
|
||||
return
|
||||
if (src.welding)
|
||||
remove_fuel(1)
|
||||
var/turf/location = get_turf(user)
|
||||
@@ -286,12 +291,44 @@
|
||||
|
||||
/obj/item/weapon/weldingtool/update_icon()
|
||||
..()
|
||||
icon_state = welding ? "welder1" : "welder"
|
||||
icon_state = welding ? "[icon_state]1" : "[initial(icon_state)]"
|
||||
var/mob/M = loc
|
||||
if(istype(M))
|
||||
M.update_inv_l_hand()
|
||||
M.update_inv_r_hand()
|
||||
|
||||
/obj/item/weapon/weldingtool/MouseDrop(obj/over_object as obj)
|
||||
if(!canremove)
|
||||
return
|
||||
|
||||
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
|
||||
|
||||
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
|
||||
return
|
||||
|
||||
if (!( istype(over_object, /obj/screen) ))
|
||||
return ..()
|
||||
|
||||
//makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
|
||||
//there's got to be a better way of doing this.
|
||||
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
|
||||
return
|
||||
|
||||
if (( usr.restrained() ) || ( usr.stat ))
|
||||
return
|
||||
|
||||
if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
|
||||
return
|
||||
|
||||
switch(over_object.name)
|
||||
if("r_hand")
|
||||
usr.u_equip(src)
|
||||
usr.put_in_r_hand(src)
|
||||
if("l_hand")
|
||||
usr.u_equip(src)
|
||||
usr.put_in_l_hand(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
//Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1)
|
||||
//so that the welding tool updates accordingly
|
||||
/obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M)
|
||||
@@ -313,7 +350,8 @@
|
||||
processing_objects |= src
|
||||
else
|
||||
if(M)
|
||||
M << "<span class='notice'>You need more welding fuel to complete this task.</span>"
|
||||
var/msg = max_fuel ? "welding fuel" : "charge"
|
||||
M << "<span class='notice'>You need more [msg] to complete this task.</span>"
|
||||
return
|
||||
//Otherwise
|
||||
else if(!set_welding && welding)
|
||||
@@ -370,7 +408,6 @@
|
||||
user.disabilities &= ~NEARSIGHTED
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/largetank
|
||||
name = "industrial welding tool"
|
||||
max_fuel = 40
|
||||
@@ -405,6 +442,113 @@
|
||||
if(get_fuel() < max_fuel && nextrefueltick < world.time)
|
||||
nextrefueltick = world.time + 10
|
||||
reagents.add_reagent("fuel", 1)
|
||||
|
||||
/*
|
||||
* Electric/Arc Welder
|
||||
*/
|
||||
|
||||
/obj/item/weapon/weldingtool/electric //AND HIS WELDING WAS ELECTRIC
|
||||
name = "electric welding tool"
|
||||
icon_state = "arcwelder"
|
||||
max_fuel = 0 //We'll handle the consumption later.
|
||||
var/obj/item/weapon/cell/power_supply //What type of power cell this uses
|
||||
var/charge_cost = 24 //The rough equivalent of 1 unit of fuel, based on us wanting 10 welds per battery
|
||||
var/cell_type = /obj/item/weapon/cell/device
|
||||
var/use_external_power = 0 //If in a borg or hardsuit, this needs to = 1
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/New()
|
||||
..()
|
||||
if(cell_type == null)
|
||||
update_icon()
|
||||
else if(cell_type)
|
||||
power_supply = new cell_type(src)
|
||||
else
|
||||
power_supply = new /obj/item/weapon/cell/device(src)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/unloaded/New()
|
||||
cell_type = null
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/examine(mob/user)
|
||||
..()
|
||||
if(power_supply)
|
||||
user << text("\icon[] [] has [] charge left.", src, src.name, get_fuel())
|
||||
else
|
||||
user << text("\icon[] [] has power for no power cell!", src, src.name)
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/get_fuel()
|
||||
if(use_external_power)
|
||||
var/obj/item/weapon/cell/external = get_external_power_supply()
|
||||
return external.charge
|
||||
else if(power_supply)
|
||||
return power_supply.charge
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/remove_fuel(var/amount = 1, var/mob/M = null)
|
||||
if(!welding)
|
||||
return 0
|
||||
if(get_fuel() >= amount)
|
||||
power_supply.checked_use(charge_cost)
|
||||
if(use_external_power)
|
||||
var/obj/item/weapon/cell/external = get_external_power_supply()
|
||||
if(!external || !external.use(charge_cost)) //Take power from the borg...
|
||||
power_supply.give(charge_cost) //Give it back to the cell.
|
||||
if(M)
|
||||
eyecheck(M)
|
||||
return 1
|
||||
else
|
||||
if(M)
|
||||
M << "<span class='notice'>You need more energy to complete this task.</span>"
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/attack_hand(mob/user as mob)
|
||||
if(user.get_inactive_hand() == src)
|
||||
if(power_supply)
|
||||
power_supply.update_icon()
|
||||
user.put_in_hands(power_supply)
|
||||
power_supply = null
|
||||
user << "<span class='notice'>You remove the cell from the [src].</span>"
|
||||
setWelding(0)
|
||||
update_icon()
|
||||
return
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/attackby(obj/item/weapon/W, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/cell))
|
||||
if(istype(W, /obj/item/weapon/cell/device))
|
||||
if(!power_supply)
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
power_supply = W
|
||||
user << "<span class='notice'>You install a cell in \the [src].</span>"
|
||||
update_icon()
|
||||
else
|
||||
user << "<span class='notice'>\The [src] already has a cell.</span>"
|
||||
else
|
||||
user << "<span class='notice'>\The [src] cannot use that type of cell.</span>"
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/proc/get_external_power_supply()
|
||||
if(isrobot(src.loc))
|
||||
var/mob/living/silicon/robot/R = src.loc
|
||||
return R.cell
|
||||
if(istype(src.loc, /obj/item/rig_module))
|
||||
var/obj/item/rig_module/module = src.loc
|
||||
if(module.holder && module.holder.wearer)
|
||||
var/mob/living/carbon/human/H = module.holder.wearer
|
||||
if(istype(H) && H.back)
|
||||
var/obj/item/weapon/rig/suit = H.back
|
||||
if(istype(suit))
|
||||
return suit.cell
|
||||
return null
|
||||
|
||||
/obj/item/weapon/weldingtool/electric/mounted
|
||||
use_external_power = 1
|
||||
|
||||
/*
|
||||
* Crowbar
|
||||
*/
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
/obj/item/weapon/towel/attack_self(mob/living/user as mob)
|
||||
user.visible_message(text("<span class='notice'>[] uses [] to towel themselves off.</span>", user, src))
|
||||
playsound(user, 'sound/weapons/towelwipe.ogg', 25, 1)
|
||||
if(user.fire_stacks > 0)
|
||||
user.fire_stacks = (max(0, user.fire_stacks - 1.5))
|
||||
else if(user.fire_stacks < 0)
|
||||
user.fire_stacks = (min(0, user.fire_stacks + 1.5))
|
||||
|
||||
/obj/item/weapon/towel/random/New()
|
||||
..()
|
||||
|
||||
@@ -77,11 +77,15 @@
|
||||
|
||||
//armour
|
||||
var/blocked = L.run_armor_check(target_zone, "melee")
|
||||
var/soaked = L.get_armor_soak(target_zone, "melee")
|
||||
|
||||
if(blocked >= 100)
|
||||
return
|
||||
|
||||
if(!L.apply_damage(30, BRUTE, target_zone, blocked, used_weapon=src))
|
||||
if(soaked >= 30)
|
||||
return
|
||||
|
||||
if(!L.apply_damage(30, BRUTE, target_zone, blocked, soaked, used_weapon=src))
|
||||
return 0
|
||||
|
||||
//trap the victim in place
|
||||
|
||||
@@ -80,10 +80,8 @@
|
||||
var/turf/T = get_turf(M)
|
||||
if(T)
|
||||
var/obj/effect/energy_net/net = new net_type(T)
|
||||
net.layer = M.layer+1
|
||||
M.captured = 1
|
||||
net.affecting = M
|
||||
T.visible_message("[M] was caught in an energy net!")
|
||||
if(net.buckle_mob(M))
|
||||
T.visible_message("[M] was caught in an energy net!")
|
||||
qdel(src)
|
||||
|
||||
// If we miss or hit an obstacle, we still want to delete the net.
|
||||
@@ -99,107 +97,56 @@
|
||||
density = 1
|
||||
opacity = 0
|
||||
mouse_opacity = 1
|
||||
anchored = 1
|
||||
anchored = 0
|
||||
|
||||
var/health = 25
|
||||
var/mob/living/affecting = null //Who it is currently affecting, if anyone.
|
||||
var/mob/living/master = null //Who shot web. Will let this person know if the net was successful.
|
||||
var/countdown = -1
|
||||
can_buckle = 1
|
||||
buckle_movable = 1
|
||||
buckle_lying = 0
|
||||
buckle_dir = SOUTH
|
||||
|
||||
/obj/effect/energy_net/teleport
|
||||
countdown = 60
|
||||
var/escape_time = 8 SECONDS
|
||||
|
||||
/obj/effect/energy_net/New()
|
||||
..()
|
||||
processing_objects |= src
|
||||
|
||||
/obj/effect/energy_net/Destroy()
|
||||
|
||||
if(affecting)
|
||||
var/mob/living/carbon/M = affecting
|
||||
M.anchored = initial(affecting.anchored)
|
||||
M.captured = 0
|
||||
M << "You are free of the net!"
|
||||
if(buckled_mob)
|
||||
to_chat(buckled_mob,"<span class='notice'>You are free of the net!</span>")
|
||||
unbuckle_mob()
|
||||
|
||||
processing_objects -= src
|
||||
..()
|
||||
|
||||
/obj/effect/energy_net/proc/healthcheck()
|
||||
|
||||
if(health <=0)
|
||||
density = 0
|
||||
src.visible_message("The energy net is torn apart!")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/effect/energy_net/process()
|
||||
|
||||
if(isnull(affecting) || affecting.loc != loc)
|
||||
if(isnull(buckled_mob) || buckled_mob.loc != loc)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
// Countdown begin set to -1 will stop the teleporter from firing.
|
||||
// Clientless mobs can be netted but they will not teleport or decrement the timer.
|
||||
var/mob/living/M = affecting
|
||||
if(countdown == -1 || (istype(M) && !M.client))
|
||||
return
|
||||
|
||||
if(countdown > 0)
|
||||
countdown--
|
||||
return
|
||||
|
||||
// TODO: consider removing or altering this; energy nets are useful on their own
|
||||
// merits and the teleportation was never properly implemented; it's halfassed.
|
||||
density = 0
|
||||
invisibility = 101 //Make the net invisible so all the animations can play out.
|
||||
health = INFINITY //Make the net invincible so that an explosion/something else won't kill it during anims.
|
||||
|
||||
playsound(affecting.loc, 'sound/effects/sparks4.ogg', 50, 1)
|
||||
anim(affecting.loc,affecting,'icons/mob/mob.dmi',,"phaseout",,affecting.dir)
|
||||
|
||||
affecting.visible_message("[affecting] vanishes in a flare of light!")
|
||||
|
||||
if(holdingfacility.len)
|
||||
affecting.loc = pick(holdingfacility)
|
||||
|
||||
affecting << "You appear in a strange place!"
|
||||
|
||||
playsound(affecting.loc, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(affecting.loc, 'sound/effects/sparks2.ogg', 50, 1)
|
||||
anim(affecting.loc,affecting,'icons/mob/mob.dmi',,"phasein",,affecting.dir)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/energy_net/bullet_act(var/obj/item/projectile/Proj)
|
||||
health -= Proj.get_structure_damage()
|
||||
healthcheck()
|
||||
return 0
|
||||
|
||||
/obj/effect/energy_net/ex_act()
|
||||
health = 0
|
||||
healthcheck()
|
||||
|
||||
/obj/effect/energy_net/attack_hand(var/mob/user)
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(istype(H))
|
||||
if(H.species.can_shred(H))
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
|
||||
health -= rand(10, 20)
|
||||
else
|
||||
health -= rand(1,3)
|
||||
|
||||
else if (HULK in user.mutations)
|
||||
health = 0
|
||||
else
|
||||
health -= rand(5,8)
|
||||
|
||||
H << "<span class='danger'>You claw at the energy net.</span>"
|
||||
|
||||
healthcheck()
|
||||
return
|
||||
|
||||
/obj/effect/energy_net/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
health -= W.force
|
||||
healthcheck()
|
||||
/obj/effect/energy_net/Move()
|
||||
..()
|
||||
if(buckled_mob)
|
||||
var/mob/living/occupant = buckled_mob
|
||||
occupant.buckled = null
|
||||
occupant.forceMove(src.loc)
|
||||
occupant.buckled = src
|
||||
if (occupant && (src.loc != occupant.loc))
|
||||
unbuckle_mob()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/energy_net/user_unbuckle_mob(mob/user)
|
||||
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
||||
visible_message("<span class='danger'>[user] begins to tear at \the [src]!</span>")
|
||||
if(do_after(usr, escape_time, src, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY)))
|
||||
if(!buckled_mob)
|
||||
return
|
||||
visible_message("<span class='danger'>[user] manages to tear \the [src] apart!</span>")
|
||||
unbuckle_mob()
|
||||
|
||||
/obj/effect/energy_net/post_buckle_mob(mob/living/M)
|
||||
if(buckled_mob) //Just buckled someone
|
||||
..()
|
||||
layer = M.layer+1
|
||||
M.can_pull_size = 0
|
||||
else //Just unbuckled someone
|
||||
M.can_pull_size = initial(M.can_pull_size)
|
||||
qdel(src)
|
||||
|
||||
@@ -559,7 +559,7 @@ something, make sure it's not in one of the other lists.*/
|
||||
prob(4);/obj/item/clothing/shoes/leather,
|
||||
prob(1);/obj/item/clothing/gloves/yellow,
|
||||
prob(3);/obj/item/clothing/gloves/botanic_leather,
|
||||
prob(2);/obj/item/clothing/gloves/latex,
|
||||
prob(2);/obj/item/clothing/gloves/sterile/latex,
|
||||
prob(5);/obj/item/clothing/gloves/white,
|
||||
prob(5);/obj/item/clothing/gloves/rainbow,
|
||||
prob(2);/obj/item/clothing/gloves/fyellow,
|
||||
@@ -583,7 +583,7 @@ something, make sure it's not in one of the other lists.*/
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/brown_jacket,
|
||||
prob(3);/obj/item/clothing/suit/storage/toggle/leather_jacket,
|
||||
prob(1);/obj/item/clothing/suit/storage/vest/press,
|
||||
prob(3);/obj/item/clothing/suit/apron,
|
||||
prob(3);/obj/item/clothing/suit/storage/apron,
|
||||
prob(4);/obj/item/clothing/under/color/grey,
|
||||
prob(2);/obj/item/clothing/under/syndicate/tacticool,
|
||||
prob(2);/obj/item/clothing/under/pants/camo,
|
||||
@@ -686,7 +686,7 @@ something, make sure it's not in one of the other lists.*/
|
||||
prob(2);/obj/item/weapon/storage/belt/medical,
|
||||
prob(1);/obj/item/clothing/shoes/boots/combat,
|
||||
prob(3);/obj/item/clothing/shoes/white,
|
||||
prob(2);/obj/item/clothing/gloves/latex,
|
||||
prob(2);/obj/item/clothing/gloves/sterile/nitrile,
|
||||
prob(5);/obj/item/clothing/gloves/white,
|
||||
prob(2);/obj/item/clothing/glasses/hud/health,
|
||||
prob(1);/obj/item/clothing/glasses/hud/health/prescription,
|
||||
@@ -761,7 +761,7 @@ something, make sure it's not in one of the other lists.*/
|
||||
prob(3);/obj/item/weapon/storage/box/beakers,
|
||||
prob(3);/obj/item/weapon/storage/box/syringes,
|
||||
prob(3);/obj/item/weapon/storage/box/gloves,
|
||||
prob(2);/obj/item/clothing/gloves/latex,
|
||||
prob(2);/obj/item/clothing/gloves/sterile/latex,
|
||||
prob(4);/obj/item/clothing/glasses/science,
|
||||
prob(3);/obj/item/clothing/glasses/material,
|
||||
prob(1);/obj/item/clothing/head/beret/purple,
|
||||
@@ -795,8 +795,8 @@ something, make sure it's not in one of the other lists.*/
|
||||
prob(3);/obj/item/clothing/glasses/material,
|
||||
prob(3);/obj/item/clothing/head/soft/yellow,
|
||||
prob(4);/obj/item/clothing/suit/storage/hazardvest,
|
||||
prob(3);/obj/item/clothing/suit/apron/overalls,
|
||||
prob(4);/obj/item/clothing/suit/apron,
|
||||
prob(3);/obj/item/clothing/suit/storage/apron/overalls,
|
||||
prob(4);/obj/item/clothing/suit/storage/apron,
|
||||
prob(2);/obj/item/clothing/under/syndicate/tacticool,
|
||||
prob(1);/obj/item/clothing/under/syndicate/combat,
|
||||
prob(2);/obj/item/clothing/accessory/storage/black_vest,
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
return 0
|
||||
if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
|
||||
return 0
|
||||
if (issilicon(user))
|
||||
if (isAI(user))
|
||||
user << "<span class='notice'>You need hands for this.</span>"
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
..()
|
||||
switch(rand(1,2))
|
||||
if(1)
|
||||
new /obj/item/clothing/suit/apron(src)
|
||||
new /obj/item/clothing/suit/storage/apron(src)
|
||||
if(2)
|
||||
new /obj/item/clothing/suit/apron/overalls(src)
|
||||
new /obj/item/clothing/suit/storage/apron/overalls(src)
|
||||
new /obj/item/weapon/storage/bag/plants(src)
|
||||
new /obj/item/clothing/under/rank/hydroponics(src)
|
||||
new /obj/item/device/analyzer/plant_analyzer(src)
|
||||
|
||||
@@ -142,6 +142,7 @@
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/emt(src)
|
||||
new /obj/item/device/radio/headset/headset_med/alt(src)
|
||||
new /obj/item/weapon/cartridge/medical(src)
|
||||
new /obj/item/weapon/storage/briefcase/inflatable(src)
|
||||
new /obj/item/device/flashlight(src)
|
||||
new /obj/item/weapon/tank/emergency/oxygen/engi(src)
|
||||
new /obj/item/clothing/glasses/hud/health(src)
|
||||
@@ -196,7 +197,7 @@
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(src)
|
||||
new /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt(src)
|
||||
new /obj/item/weapon/cartridge/cmo(src)
|
||||
new /obj/item/clothing/gloves/latex(src)
|
||||
new /obj/item/clothing/gloves/sterile/latex(src)
|
||||
new /obj/item/clothing/shoes/brown (src)
|
||||
new /obj/item/device/radio/headset/heads/cmo(src)
|
||||
new /obj/item/device/radio/headset/heads/cmo/alt(src)
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
new /obj/item/weapon/cartridge/rd(src)
|
||||
new /obj/item/clothing/shoes/white(src)
|
||||
new /obj/item/clothing/shoes/leather(src)
|
||||
new /obj/item/clothing/gloves/latex(src)
|
||||
new /obj/item/clothing/gloves/sterile/latex(src)
|
||||
new /obj/item/device/radio/headset/heads/rd(src)
|
||||
new /obj/item/device/radio/headset/heads/rd/alt(src)
|
||||
new /obj/item/weapon/tank/air(src)
|
||||
|
||||
@@ -189,7 +189,8 @@
|
||||
new /obj/item/clothing/suit/unathi/robe(src)
|
||||
new /obj/item/clothing/shoes/sandal(src)
|
||||
new /obj/item/clothing/shoes/sandal(src)
|
||||
new /obj/item/clothing/shoes/sandal(src)
|
||||
new /obj/item/clothing/shoes/footwraps(src)
|
||||
new /obj/item/clothing/shoes/footwraps(src)
|
||||
new /obj/item/clothing/shoes/boots/winter(src)
|
||||
new /obj/item/clothing/shoes/boots/winter(src)
|
||||
new /obj/item/clothing/suit/storage/hooded/wintercoat(src)
|
||||
|
||||
@@ -283,9 +283,9 @@
|
||||
/obj/structure/closet/crate/rcd
|
||||
name = "\improper RCD crate"
|
||||
desc = "A crate with rapid construction device."
|
||||
icon_state = "crate"
|
||||
icon_opened = "crateopen"
|
||||
icon_closed = "crate"
|
||||
icon_state = "engi_crate"
|
||||
icon_opened = "engi_crateopen"
|
||||
icon_closed = "engi_crate"
|
||||
|
||||
/obj/structure/closet/crate/rcd/New()
|
||||
..()
|
||||
@@ -427,6 +427,20 @@
|
||||
icon_opened = "hydrosecurecrateopen"
|
||||
icon_closed = "hydrosecurecrate"
|
||||
|
||||
/obj/structure/closet/crate/secure/engineering
|
||||
desc = "A crate with a lock on it, painted in the scheme of the station's engineers."
|
||||
name = "secure engineering crate"
|
||||
icon_state = "engi_secure_crate"
|
||||
icon_opened = "engi_secure_crateopen"
|
||||
icon_closed = "engi_secure_crate"
|
||||
|
||||
/obj/structure/closet/crate/secure/science
|
||||
name = "secure science crate"
|
||||
desc = "A crate with a lock on it, painted in the scheme of the station's scientists."
|
||||
icon_state = "scisecurecrate"
|
||||
icon_opened = "scisecurecrateopen"
|
||||
icon_closed = "scisecurecrate"
|
||||
|
||||
/obj/structure/closet/crate/secure/bin
|
||||
name = "secure bin"
|
||||
desc = "A secure bin."
|
||||
@@ -499,6 +513,23 @@
|
||||
icon_opened = "largermetalopen"
|
||||
icon_closed = "largermetal"
|
||||
|
||||
/obj/structure/closet/crate/engineering
|
||||
name = "engineering crate"
|
||||
icon_state = "engi_crate"
|
||||
icon_opened = "engi_crateopen"
|
||||
icon_closed = "engi_crate"
|
||||
|
||||
/obj/structure/closet/crate/engineering/electrical
|
||||
icon_state = "engi_e_crate"
|
||||
icon_opened = "engi_crateopen"
|
||||
icon_closed = "engi_e_crate"
|
||||
|
||||
/obj/structure/closet/crate/science
|
||||
name = "science crate"
|
||||
icon_state = "scicrate"
|
||||
icon_opened = "scicrateopen"
|
||||
icon_closed = "scicrate"
|
||||
|
||||
/obj/structure/closet/crate/hydroponics
|
||||
name = "hydroponics crate"
|
||||
desc = "All you need to destroy those pesky weeds and pests."
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
|
||||
/obj/structure/largecrate/animal/goat
|
||||
name = "goat crate"
|
||||
held_type = /mob/living/simple_animal/hostile/retaliate/goat
|
||||
held_type = /mob/living/simple_animal/retaliate/goat
|
||||
|
||||
/obj/structure/largecrate/animal/cat
|
||||
name = "cat carrier"
|
||||
|
||||
@@ -107,6 +107,16 @@
|
||||
airlock_type = "/highsecurity"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_voidcraft
|
||||
base_icon_state = "voidcraft"
|
||||
base_name = "voidcraft hatch"
|
||||
airlock_type = "/voidcraft"
|
||||
glass = -1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_voidcraft/vertical
|
||||
base_icon_state = "voidcraft_vertical"
|
||||
airlock_type = "/voidcraft/vertical"
|
||||
|
||||
/obj/structure/door_assembly/multi_tile
|
||||
icon = 'icons/obj/doors/door_assembly2x1.dmi'
|
||||
dir = EAST
|
||||
|
||||
@@ -256,7 +256,6 @@
|
||||
name = "inflatable barrier box"
|
||||
desc = "Contains inflatable walls and doors."
|
||||
icon_state = "inf_box"
|
||||
item_state = "syringe_kit"
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
max_storage_space = ITEMSIZE_COST_NORMAL * 7
|
||||
can_hold = list(/obj/item/inflatable)
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
icon = 'icons/obj/janitor.dmi'
|
||||
icon_state = "cart"
|
||||
anchored = 0
|
||||
density = 1
|
||||
density = 1
|
||||
climbable = 1
|
||||
flags = OPENCONTAINER
|
||||
//copypaste sorry
|
||||
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon = 'icons/obj/janitor.dmi'
|
||||
icon_state = "mopbucket"
|
||||
density = 1
|
||||
climbable = 1
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
pressure_resistance = 5
|
||||
flags = OPENCONTAINER
|
||||
|
||||
@@ -226,6 +226,7 @@
|
||||
desc = "A collapsed roller bed that can be carried around."
|
||||
icon = 'icons/obj/rollerbed.dmi'
|
||||
icon_state = "folded"
|
||||
slot_flags = SLOT_BACK
|
||||
w_class = ITEMSIZE_LARGE // Can't be put in backpacks. Oh well.
|
||||
|
||||
/obj/item/roller/attack_self(mob/user)
|
||||
|
||||
@@ -150,20 +150,22 @@
|
||||
|
||||
var/def_zone = ran_zone()
|
||||
var/blocked = occupant.run_armor_check(def_zone, "melee")
|
||||
var/soaked = occupant.get_armor_soak(def_zone, "melee")
|
||||
occupant.throw_at(A, 3, propelled)
|
||||
occupant.apply_effect(6, STUN, blocked)
|
||||
occupant.apply_effect(6, WEAKEN, blocked)
|
||||
occupant.apply_effect(6, STUTTER, blocked)
|
||||
occupant.apply_damage(10, BRUTE, def_zone, blocked)
|
||||
occupant.apply_damage(10, BRUTE, def_zone, blocked, soaked)
|
||||
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/victim = A
|
||||
def_zone = ran_zone()
|
||||
blocked = victim.run_armor_check(def_zone, "melee")
|
||||
soaked = victim.get_armor_soak(def_zone, "melee")
|
||||
victim.apply_effect(6, STUN, blocked)
|
||||
victim.apply_effect(6, WEAKEN, blocked)
|
||||
victim.apply_effect(6, STUTTER, blocked)
|
||||
victim.apply_damage(10, BRUTE, def_zone, blocked)
|
||||
victim.apply_damage(10, BRUTE, def_zone, blocked, soaked)
|
||||
occupant.visible_message("<span class='danger'>[occupant] crashed into \the [A]!</span>")
|
||||
|
||||
/obj/structure/bed/chair/office/light
|
||||
|
||||
@@ -149,20 +149,22 @@
|
||||
|
||||
var/def_zone = ran_zone()
|
||||
var/blocked = occupant.run_armor_check(def_zone, "melee")
|
||||
var/soaked = occupant.get_armor_soak(def_zone, "melee")
|
||||
occupant.throw_at(A, 3, propelled)
|
||||
occupant.apply_effect(6, STUN, blocked)
|
||||
occupant.apply_effect(6, WEAKEN, blocked)
|
||||
occupant.apply_effect(6, STUTTER, blocked)
|
||||
occupant.apply_damage(10, BRUTE, def_zone)
|
||||
occupant.apply_damage(10, BRUTE, def_zone, soaked)
|
||||
playsound(src.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/victim = A
|
||||
def_zone = ran_zone()
|
||||
blocked = victim.run_armor_check(def_zone, "melee")
|
||||
soaked = victim.get_armor_soak(def_zone, "melee")
|
||||
victim.apply_effect(6, STUN, blocked)
|
||||
victim.apply_effect(6, WEAKEN, blocked)
|
||||
victim.apply_effect(6, STUTTER, blocked)
|
||||
victim.apply_damage(10, BRUTE, def_zone)
|
||||
victim.apply_damage(10, BRUTE, def_zone, soaked)
|
||||
if(pulling)
|
||||
occupant.visible_message("<span class='danger'>[pulling] has thrusted \the [name] into \the [A], throwing \the [occupant] out of it!</span>")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user