Merge branch 'master' into projectile_hit_sounds

This commit is contained in:
Neerti
2020-03-16 08:28:18 -04:00
committed by GitHub
243 changed files with 998 additions and 468 deletions
@@ -17,7 +17,7 @@
gravity_is_on = !gravity_is_on
for(var/area/A in all_areas)
A.gravitychange(gravity_is_on,A)
A.gravitychange(gravity_is_on)
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","Grav")
@@ -116,6 +116,12 @@ var/list/_client_preferences_by_type
enabled_description = "Audible"
disabled_description = "Silent"
/datum/client_preference/drop_sounds
description = "Dropped Item Sounds"
key = "SOUND_DROPPED"
enabled_description = "Enabled"
disabled_description = "Disabled"
/datum/client_preference/mob_tooltips
description ="Mob tooltips"
key = "MOB_TOOLTIPS"
@@ -54,23 +54,56 @@
if(alt_title && !(alt_title in job.alt_titles))
pref.player_alt_titles -= job.title
/datum/category_item/player_setup_item/occupation/content(mob/user, limit = 18, list/splitJobs = list("Chief Engineer"))
/datum/category_item/player_setup_item/occupation/content(mob/user, limit = 20, list/splitJobs = list())
if(!job_master)
return
. = list()
. += "<tt><center>"
. += "<b>Choose occupation chances</b><br>Unavailable occupations are crossed out.<br>"
. += "<table width='100%' cellpadding='1' cellspacing='0'><tr><td width='20%'>" // Table within a table for alignment, also allows you to easily add more columns.
. += "<table width='100%' cellpadding='1' cellspacing='0'><tr><td width='20%' valign='top'>" // Table within a table for alignment, also allows you to easily add more columns.
. += "<table width='100%' cellpadding='1' cellspacing='0'>"
var/index = -1
//The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows.
var/datum/job/lastJob
if (!job_master) return
for(var/datum/job/job in job_master.occupations)
var/datum/department/last_department = null // Used to avoid repeating the look-ahead check for if a whole department can fit.
if((++index >= limit) || (job.title in splitJobs))
var/list/all_valid_jobs = list()
// If the occupation window gets opened before SSJob initializes, then it'll just be blank, with no runtimes.
// It will work once init is finished.
for(var/D in SSjob.department_datums)
var/datum/department/department = SSjob.department_datums[D]
if(department.centcom_only) // No joining as a centcom role, if any are ever added.
continue
for(var/J in department.primary_jobs)
all_valid_jobs += department.jobs[J]
for(var/datum/job/job in all_valid_jobs)
var/datum/department/current_department = SSjob.get_primary_department_of_job(job)
// Should we add a new column?
var/make_new_column = FALSE
if(++index > limit)
// Ran out of rows, make a new column.
make_new_column = TRUE
else if(job.title in splitJobs)
// Is hardcoded to split at this job title.
make_new_column = TRUE
else if(current_department != last_department)
// If the department is bigger than the limit then we have to split.
if(limit >= current_department.primary_jobs.len)
// Look ahead to see if we would need to split, and if so, avoid it.
if(index + current_department.primary_jobs.len > limit)
// Looked ahead, and determined that a new column is needed to avoid splitting the department into two.
make_new_column = TRUE
if(make_new_column)
/*******
if((index < limit) && (lastJob != null))
//If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with
@@ -78,8 +111,9 @@
for(var/i = 0, i < (limit - index), i++)
. += "<tr bgcolor='[lastJob.selection_color]'><td width='60%' align='right'>//>&nbsp</a></td><td><a>&nbsp</a></td></tr>"
*******/
. += "</table></td><td width='20%'><table width='100%' cellpadding='1' cellspacing='0'>"
. += "</table></td><td width='20%' valign='top'><table width='100%' cellpadding='1' cellspacing='0'>"
index = 0
last_department = current_department
. += "<tr bgcolor='[job.selection_color]'><td width='60%' align='right'>"
@@ -239,6 +239,21 @@
feedback_add_details("admin_verb","TAirPumpNoise")
/client/verb/toggle_drop_sounds()
set name = "Toggle Dropped Item Sounds"
set category = "Preferences"
set desc = "Toggles sounds when items are dropped or thrown."
var/pref_path = /datum/client_preference/drop_sounds
toggle_preference(pref_path)
to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear sounds when items are dropped or thrown.")
SScharacter_setup.queue_preferences_save(prefs)
feedback_add_details("admin_verb", "TDropSounds")
/client/verb/toggle_safe_firing()
set name = "Toggle Gun Firing Intent Requirement"
set category = "Preferences"
+2
View File
@@ -1,6 +1,7 @@
/obj/item/clothing
name = "clothing"
siemens_coefficient = 0.9
drop_sound = 'sound/items/drop/clothing.ogg'
var/list/species_restricted = null //Only these species can wear this kit.
var/gunshot_residue //Used by forensics.
@@ -530,6 +531,7 @@
if(usr.put_in_hands(holding))
usr.visible_message("<span class='danger'>\The [usr] pulls a knife out of their boot!</span>")
playsound(get_turf(src), 'sound/weapons/holster/sheathout.ogg', 25)
holding = null
overlays -= image(icon, "[icon_state]_knife")
else
+2
View File
@@ -53,6 +53,7 @@
desc = "A delicate golden chain worn by female skrell to decorate their head tails."
icon_state = "skrell_chain"
item_state_slots = list(slot_r_hand_str = "egg5", slot_l_hand_str = "egg5")
drop_sound = 'sound/items/drop/accessory.ogg'
/obj/item/clothing/ears/skrell/chain/silver
name = "Silver headtail chains"
@@ -83,6 +84,7 @@
desc = "Golden metallic bands worn by male skrell to adorn their head tails."
icon_state = "skrell_band"
item_state_slots = list(slot_r_hand_str = "egg5", slot_l_hand_str = "egg5")
drop_sound = 'sound/items/drop/accessory.ogg'
/obj/item/clothing/ears/skrell/band/silver
name = "Silver headtail bands"
+3
View File
@@ -27,6 +27,7 @@ BLIND // can't see anything
var/activation_sound = 'sound/items/goggles_charge.ogg'
var/obj/screen/overlay = null
var/list/away_planes //Holder for disabled planes
drop_sound = 'sound/items/drop/accessory.ogg'
sprite_sheets = list(
"Teshari" = 'icons/mob/species/seromi/eyes.dmi',
@@ -159,6 +160,7 @@ BLIND // can't see anything
item_state_slots = list(slot_r_hand_str = "blindfold", slot_l_hand_str = "blindfold")
body_parts_covered = 0
var/eye = null
drop_sound = 'sound/items/drop/gloves.ogg'
/obj/item/clothing/glasses/eyepatch/verb/switcheye()
set name = "Switch Eyepatch"
@@ -340,6 +342,7 @@ BLIND // can't see anything
item_state_slots = list(slot_r_hand_str = "blindfold", slot_l_hand_str = "blindfold")
flash_protection = FLASH_PROTECTION_MAJOR
tint = BLIND
drop_sound = 'sound/items/drop/gloves.ogg'
/obj/item/clothing/glasses/sunglasses/blindfold/tape
name = "length of tape"
@@ -5,6 +5,7 @@
overgloves = 1
punch_force = 3
w_class = ITEMSIZE_NORMAL
drop_sound = 'sound/items/drop/metalshield.ogg'
/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot)
if(..()) //This will only run if no other problems occured when equiping.
+9
View File
@@ -1,9 +1,17 @@
/obj/item/clothing/gloves
desc = "you aren't supposed to see this."
name = "strange gloves"
icon_state = "black"
item_state = "bgloves"
drop_sound = 'sound/items/drop/gloves.ogg'
/obj/item/clothing/gloves/yellow
desc = "These gloves will protect the wearer from electric shock."
name = "insulated gloves"
icon_state = "yellow"
siemens_coefficient = 0
permeability_coefficient = 0.05
drop_sound = 'sound/items/drop/rubber.ogg'
/obj/item/clothing/gloves/fyellow //Cheap Chinese Crap
desc = "These gloves are cheap copies of proper insulated gloves. No way this can end badly."
@@ -11,6 +19,7 @@
icon_state = "yellow"
siemens_coefficient = 1 //Set to a default of 1, gets overridden in initialize()
permeability_coefficient = 0.05
drop_sound = 'sound/items/drop/rubber.ogg'
/obj/item/clothing/gloves/fyellow/Initialize()
. = ..()
@@ -56,6 +56,7 @@
permeability_coefficient = 0.01
germ_level = 0
fingerprint_chance = 25
drop_sound = 'sound/items/drop/rubber.ogg'
// var/balloonPath = /obj/item/latexballon
//TODO: Make inflating gloves a thing
@@ -81,6 +82,7 @@
item_state_slots = list(slot_r_hand_str = "lightbrown", slot_l_hand_str = "lightbrown")
permeability_coefficient = 0.05
siemens_coefficient = 0.75 //thick work gloves
drop_sound = 'sound/items/drop/leather.ogg'
/obj/item/clothing/gloves/duty
desc = "These brown duty gloves are made from a durable synthetic."
@@ -109,6 +111,7 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
species_restricted = list("Vox")
drop_sound = 'sound/items/drop/metalboots.ogg'
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
@@ -127,6 +130,7 @@
overgloves = 1
force = 5
punch_force = 5
drop_sound = 'sound/items/drop/metalboots.ogg'
/obj/item/clothing/gloves/ranger
var/glovecolor = "white"
@@ -1,6 +1,11 @@
//Hat Station 13
/obj/item/clothing/head/
name = "hat"
desc = "Apply on head."
drop_sound = 'sound/items/drop/hat.ogg'
/obj/item/clothing/head/collectable
name = "collectable hat"
desc = "A rare collectable hat."
@@ -37,6 +42,7 @@
desc = "What looks like an ordinary paper hat, is actually a rare and valuable collector's edition paper hat. Keep away from water, fire and Librarians."
icon_state = "paper"
body_parts_covered = 0
drop_sound = 'sound/items/drop/paper.ogg'
/obj/item/clothing/head/collectable/tophat
name = "collectable top hat"
@@ -36,21 +36,25 @@
desc = "A flower crown weaved with sunflowers."
icon_state = "sunflower_crown"
body_parts_covered = 0
drop_sound = 'sound/items/drop/herb.ogg'
/obj/item/clothing/head/lavender_crown
name = "lavender crown"
desc = "A flower crown weaved with lavender."
icon_state = "lavender_crown"
body_parts_covered = 0
drop_sound = 'sound/items/drop/herb.ogg'
/obj/item/clothing/head/poppy_crown
name = "poppy crown"
desc = "A flower crown weaved with poppies."
icon_state = "poppy_crown"
body_parts_covered = 0
drop_sound = 'sound/items/drop/herb.ogg'
/obj/item/clothing/head/rose_crown
name = "rose crown"
desc = "A flower crown weaved with roses."
icon_state = "poppy_crown"
body_parts_covered = 0
drop_sound = 'sound/items/drop/herb.ogg'
+1
View File
@@ -10,6 +10,7 @@
action_button_name = "Toggle Head-light"
w_class = ITEMSIZE_NORMAL
ear_protection = 1
drop_sound = 'sound/items/drop/helm.ogg'
/obj/item/clothing/head/hardhat/orange
icon_state = "hardhat0_orange"
+1
View File
@@ -14,6 +14,7 @@
siemens_coefficient = 0.7
w_class = ITEMSIZE_NORMAL
ear_protection = 1
drop_sound = 'sound/items/drop/helm.ogg'
/obj/item/clothing/head/helmet/solgov
name = "\improper Solar Confederate Government helmet"
+4 -1
View File
@@ -17,6 +17,7 @@
desc = "A nice hair pin."
slot_flags = SLOT_HEAD | SLOT_EARS
body_parts_covered = 0
drop_sound = 'sound/items/drop/ring.ogg'
/obj/item/clothing/head/pin/pink
icon_state = "pinkpin"
@@ -168,6 +169,7 @@
icon_state = "cardborg_h"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
body_parts_covered = HEAD|FACE|EYES
drop_sound = 'sound/items/drop/box.ogg'
/obj/item/clothing/head/justice
name = "justice hat"
@@ -420,6 +422,7 @@
desc = "A jeweled headpiece originating in India."
icon_state = "maangtikka"
body_parts_covered = 0
drop_sound = 'sound/items/drop/accessory.ogg'
/obj/item/clothing/head/jingasa
name = "jingasa"
@@ -427,7 +430,7 @@
icon_state = "jingasa"
body_parts_covered = 0
item_state_slots = list(slot_r_hand_str = "taq", slot_l_hand_str = "taq")
/obj/item/clothing/head/cowl
name = "black cowl"
desc = "A gold-lined black cowl. It gives off uncomfortable cult vibes, but fancy."
@@ -28,6 +28,7 @@
var/base_state
flash_protection = FLASH_PROTECTION_MAJOR
tint = TINT_HEAVY
drop_sound = 'sound/items/drop/helm.ogg'
/obj/item/clothing/head/welding/attack_self()
toggle()
@@ -167,6 +168,7 @@
brightness_on = 2
light_overlay = "helmet_light"
w_class = ITEMSIZE_NORMAL
drop_sound = 'sound/items/drop/herb.ogg'
/*
* Kitty ears
+8
View File
@@ -1,3 +1,11 @@
//Generic Ring
/obj/item/clothing/ring
name = "generic ring"
desc = "Torus shaped finger decoration."
icon_state = "material"
drop_sound = 'sound/items/drop/ring.ogg'
/////////////////////////////////////////
//Standard Rings
/obj/item/clothing/gloves/ring/engagement
+2
View File
@@ -5,11 +5,13 @@
force = 3
can_hold_knife = 1
step_volume_mod = 1.2
drop_sound = 'sound/items/drop/boots.ogg'
/obj/item/clothing/shoes/boots/cowboy
name = "cowboy boots"
desc = "Lacking a durasteel horse to ride."
icon_state = "cowboy"
drop_sound = 'sound/items/drop/leather.ogg'
/obj/item/clothing/shoes/boots/cowboy/classic
name = "classic cowboy boots"
+7
View File
@@ -1,3 +1,9 @@
/obj/item/clothing/shoes
name = "shoes"
icon_state = "white"
desc = "A pair of shoes."
drop_sound = 'sound/items/drop/shoes.ogg'
/obj/item/clothing/shoes/black
name = "black shoes"
icon_state = "black"
@@ -38,6 +44,7 @@
name = "leather shoes"
desc = "A sturdy pair of leather shoes."
icon_state = "leather"
drop_sound = 'sound/items/drop/leather.ogg'
/obj/item/clothing/shoes/rainbow
name = "rainbow shoes"
@@ -7,6 +7,7 @@
w_class = ITEMSIZE_NORMAL
step_volume_mod = 1.3
can_hold_knife = TRUE
drop_sound = 'sound/items/drop/boots.ogg'
/obj/item/clothing/shoes/leg_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
if(..()) //This will only run if no other problems occured when equiping.
+2
View File
@@ -16,6 +16,7 @@
var/obj/item/clothing/shoes/shoes = null //Undershoes
var/mob/living/carbon/human/wearer = null //For shoe procs
step_volume_mod = 1.3
drop_sound = 'sound/items/drop/metalboots.ogg'
/obj/item/clothing/shoes/magboots/proc/set_slowdown()
slowdown = shoes? max(SHOES_SLOWDOWN, shoes.slowdown): SHOES_SLOWDOWN //So you can't put on magboots to make you walk faster.
@@ -36,6 +37,7 @@
set_slowdown()
force = 5
if(icon_base) icon_state = "[icon_base]1"
playsound(get_turf(src), 'sound/effects/magnetclamp.ogg', 20)
to_chat(user, "You enable the mag-pulse traction system.")
user.update_inv_shoes() //so our mob-overlays update
user.update_action_buttons()
@@ -24,6 +24,7 @@
item_flags = NOSLIP
slowdown = SHOES_SLOWDOWN+1
species_restricted = null
drop_sound = 'sound/items/drop/rubber.ogg'
/obj/item/clothing/shoes/dress
name = "dress shoes"
@@ -98,6 +99,7 @@
force = 0
species_restricted = null
w_class = ITEMSIZE_SMALL
drop_sound = 'sound/items/drop/clothing.ogg'
/obj/item/clothing/shoes/slippers_worn
name = "worn bunny slippers"
@@ -155,6 +157,7 @@
force = 0
w_class = ITEMSIZE_SMALL
species_restricted = null
drop_sound = 'sound/items/drop/clothing.ogg'
/obj/item/clothing/shoes/boots/ranger
var/bootcolor = "white"
+1
View File
@@ -25,6 +25,7 @@
can_be_placed_into = null
flags = OPENCONTAINER | NOBLUDGEON
unacidable = 0
drop_sound = 'sound/items/drop/clothing.ogg'
var/on_fire = 0
var/burn_time = 20 //if the rag burns for too long it turns to ashes
+2
View File
@@ -15,6 +15,7 @@
var/access = list()
access = access_crate_cash
var/worth = 0
drop_sound = 'sound/items/drop/paper.ogg'
/obj/item/weapon/spacecash/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/spacecash))
@@ -150,6 +151,7 @@ proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
name = "charge card"
icon_state = "efundcard"
desc = "A card that holds an amount of money."
drop_sound = 'sound/items/drop/card.ogg'
var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions.
attack_self() return //Don't act
attackby() return //like actual
+2 -2
View File
@@ -17,7 +17,7 @@
gravity_is_on = 0
for(var/area/A in all_areas)
if(A.z in zLevels)
A.gravitychange(gravity_is_on, A)
A.gravitychange(gravity_is_on)
/datum/event/gravity/end()
if(!gravity_is_on)
@@ -25,6 +25,6 @@
for(var/area/A in all_areas)
if(A.z in zLevels)
A.gravitychange(gravity_is_on, A)
A.gravitychange(gravity_is_on)
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.", "Gravity Restored")
+1
View File
@@ -8,6 +8,7 @@
possible_transfer_amounts = null
volume = 50 //Sets the default container amount for all food items.
var/filling_color = "#FFFFFF" //Used by sandwiches.
drop_sound = 'sound/items/drop/food.ogg'
/obj/item/weapon/reagent_containers/food/Initialize()
. = ..()
+2
View File
@@ -2,6 +2,7 @@
volume = 40 //just over one and a half cups
amount_per_transfer_from_this = 5
flags = 0 //starts closed
drop_sound = 'sound/items/drop/soda.ogg'
//DRINKS
@@ -20,6 +21,7 @@
desc = "Introduced to the vending machines by Skrellian request, this water comes straight from the Martian poles."
icon_state = "waterbottle"
center_of_mass = list("x"=16, "y"=8)
drop_sound = 'sound/items/drop/food.ogg'
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle/Initialize()
. = ..()
+11
View File
@@ -5,6 +5,7 @@
name = "drink"
desc = "yummy"
icon = 'icons/obj/drinks.dmi'
drop_sound = 'sound/items/drop/bottle.ogg'
icon_state = null
flags = OPENCONTAINER
amount_per_transfer_from_this = 5
@@ -116,6 +117,7 @@
icon_state = "milk"
item_state = "carton"
center_of_mass = list("x"=16, "y"=9)
drop_sound = 'sound/items/drop/box.ogg'
/obj/item/weapon/reagent_containers/food/drinks/milk/Initialize()
. = ..()
@@ -127,6 +129,8 @@
icon_state = "soymilk"
item_state = "carton"
center_of_mass = list("x"=16, "y"=9)
drop_sound = 'sound/items/drop/box.ogg'
/obj/item/weapon/reagent_containers/food/drinks/soymilk/Initialize()
. = ..()
reagents.add_reagent("soymilk", 50)
@@ -138,6 +142,8 @@
icon_state = "mini-milk"
item_state = "carton"
center_of_mass = list("x"=16, "y"=9)
drop_sound = 'sound/items/drop/box.ogg'
/obj/item/weapon/reagent_containers/food/drinks/smallmilk/Initialize()
. = ..()
reagents.add_reagent("milk", 30)
@@ -149,6 +155,8 @@
icon_state = "mini-milk_choco"
item_state = "carton"
center_of_mass = list("x"=16, "y"=9)
drop_sound = 'sound/items/drop/box.ogg'
/obj/item/weapon/reagent_containers/food/drinks/smallchocmilk/Initialize()
. = ..()
reagents.add_reagent("chocolate_milk", 30)
@@ -158,6 +166,8 @@
desc = "Careful, the beverage you're about to enjoy is extremely hot."
icon_state = "coffee"
center_of_mass = list("x"=15, "y"=10)
drop_sound = 'sound/items/drop/box.ogg'
/obj/item/weapon/reagent_containers/food/drinks/coffee/Initialize()
. = ..()
reagents.add_reagent("coffee", 30)
@@ -209,6 +219,7 @@
possible_transfer_amounts = null
volume = 10
center_of_mass = list("x"=16, "y"=12)
drop_sound = 'sound/items/drop/paper.ogg'
/obj/item/weapon/reagent_containers/food/drinks/sillycup/Initialize()
. = ..()
+3 -1
View File
@@ -16,7 +16,9 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/Initialize()
. = ..()
if(isGlass) unacidable = 1
if(isGlass)
unacidable = 1
drop_sound = 'sound/items/drop/bottle.ogg'
/obj/item/weapon/reagent_containers/food/drinks/bottle/Destroy()
if(rag)
+2 -2
View File
@@ -20,7 +20,7 @@
gravity_is_on = 0
for(var/area/A in all_areas)
if(A.z in zLevels)
A.gravitychange(gravity_is_on, A)
A.gravitychange(gravity_is_on)
/datum/gm_action/gravity/end()
if(!gravity_is_on)
@@ -28,7 +28,7 @@
for(var/area/A in all_areas)
if(A.z in zLevels)
A.gravitychange(gravity_is_on, A)
A.gravitychange(gravity_is_on)
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.", "Gravity Restored")
+4 -4
View File
@@ -268,7 +268,7 @@
loadProgram(powerdown_program, 0)
if(!linkedholodeck.has_gravity)
linkedholodeck.gravitychange(1,linkedholodeck)
linkedholodeck.gravitychange(1)
active = 0
use_power = 1
@@ -365,16 +365,16 @@
use_power = 1
if(A.has_gravity)
A.gravitychange(0,A)
A.gravitychange(0)
else
A.gravitychange(1,A)
A.gravitychange(1)
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
//Turn it back to the regular non-holographic room
loadProgram(powerdown_program, 0)
if(!linkedholodeck.has_gravity)
linkedholodeck.gravitychange(1,linkedholodeck)
linkedholodeck.gravitychange(1)
active = 0
use_power = 1
+1
View File
@@ -340,6 +340,7 @@ datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/u
name = "basketball"
desc = "Here's your chance, do your dance at the Space Jam."
w_class = ITEMSIZE_LARGE //Stops people from hiding it in their bags/pockets
drop_sound = 'sound/items/drop/basketball.ogg'
/obj/structure/holohoop
name = "basketball hoop"
+2
View File
@@ -7,6 +7,7 @@
desc = "Nutritious! Probably."
flags = NOCONDUCT
slot_flags = SLOT_HOLSTER
drop_sound = 'sound/items/drop/herb.ogg'
var/plantname
var/datum/seed/seed
@@ -361,6 +362,7 @@ var/list/fruit_icon_cache = list()
name = "[S.seed_name] slice"
desc = "A slice of \a [S.seed_name]. Tasty, probably."
drop_sound = 'sound/items/drop/herb.ogg'
var/rind_colour = S.get_trait(TRAIT_PRODUCT_COLOUR)
var/flesh_colour = S.get_trait(TRAIT_FLESH_COLOUR)
+5
View File
@@ -180,6 +180,7 @@ Book Cart End
var/title // The real name of the book.
var/carved = 0 // Has the book been hollowed out for use as a secret storage item?
var/obj/item/store //What's in the book?
drop_sound = 'sound/bureaucracy/bookclose.ogg'
/obj/item/weapon/book/attack_self(var/mob/user as mob)
if(carved)
@@ -194,7 +195,9 @@ Book Cart End
if(src.dat)
user << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book")
user.visible_message("[user] opens a book titled \"[src.title]\" and begins reading intently.")
playsound(loc, 'sound/bureaucracy/bookopen.ogg', 50, 1)
onclose(user, "book")
playsound(loc, 'sound/bureaucracy/bookclose.ogg', 50, 1)
else
to_chat(user, "This book is completely blank!")
@@ -277,6 +280,8 @@ Book Cart End
to_chat(user, "<span class='notice'>You begin to carve out [title].</span>")
if(do_after(user, 30))
to_chat(user, "<span class='notice'>You carve out the pages from [title]! You didn't want to read it anyway.</span>")
playsound(loc, 'sound/bureaucracy/papercrumple.ogg', 50, 1)
new /obj/item/weapon/shreddedp(get_turf(src))
carved = 1
return
else
+1 -1
View File
@@ -39,7 +39,7 @@
w_class = ITEMSIZE_SMALL
root_type = /datum/lore/codex/category/main_news
libcategory = "Reference"
drop_sound = 'sound/items/drop/device.ogg'
// Combines SOP/Regs/Law
/obj/item/weapon/book/codex/corp_regs
name = "NanoTrasen Regulatory Compendium"
+11
View File
@@ -17,6 +17,7 @@
var/material/material
var/perunit = SHEET_MATERIAL_AMOUNT
var/apply_colour //temp pending icon rewrite
drop_sound = 'sound/items/drop/axe.ogg'
/obj/item/stack/material/New()
..()
@@ -106,17 +107,20 @@
icon_state = "sheet-sandstone"
default_type = "sandstone"
no_variants = FALSE
drop_sound = 'sound/items/drop/boots.ogg'
/obj/item/stack/material/marble
name = "marble brick"
icon_state = "sheet-marble"
default_type = "marble"
no_variants = FALSE
drop_sound = 'sound/items/drop/boots.ogg'
/obj/item/stack/material/diamond
name = "diamond"
icon_state = "sheet-diamond"
default_type = "diamond"
drop_sound = 'sound/items/drop/glass.ogg'
/obj/item/stack/material/uranium
name = "uranium"
@@ -129,6 +133,7 @@
icon_state = "sheet-phoron"
default_type = "phoron"
no_variants = FALSE
drop_sound = 'sound/items/drop/glass.ogg'
/obj/item/stack/material/plastic
name = "plastic"
@@ -324,6 +329,7 @@
icon_state = "sheet-wood"
default_type = MAT_WOOD
strict_color_stacking = TRUE
drop_sound = 'sound/items/drop/wooden.ogg'
/obj/item/stack/material/wood/sif
name = "alien wooden plank"
@@ -340,6 +346,7 @@
w_class = ITEMSIZE_HUGE
description_info = "Use inhand to craft things, or use a sharp and edged object on this to convert it into two wooden planks."
var/plank_type = /obj/item/stack/material/wood
drop_sound = 'sound/items/drop/wooden.ogg'
/obj/item/stack/material/log/sif
name = "alien log"
@@ -377,6 +384,7 @@
no_variants = FALSE
pass_color = TRUE
strict_color_stacking = TRUE
drop_sound = 'sound/items/drop/clothing.ogg'
/obj/item/stack/material/resin
name = "resin"
@@ -394,6 +402,7 @@
no_variants = FALSE
pass_color = TRUE
strict_color_stacking = TRUE
drop_sound = 'sound/items/drop/box.ogg'
/obj/item/stack/material/snow
name = "snow"
@@ -415,12 +424,14 @@
no_variants = FALSE
pass_color = TRUE
strict_color_stacking = TRUE
drop_sound = 'sound/items/drop/clothing.ogg'
/obj/item/stack/material/glass
name = "glass"
icon_state = "sheet-glass"
default_type = "glass"
no_variants = FALSE
drop_sound = 'sound/items/drop/glass.ogg'
/obj/item/stack/material/glass/reinforced
name = "reinforced glass"
+1
View File
@@ -12,6 +12,7 @@
slot_flags = SLOT_EARS
var/string_attached
var/sides = 2
drop_sound = 'sound/items/drop/ring.ogg'
/obj/item/weapon/coin/New()
randpixel_xy()
+1 -1
View File
@@ -23,7 +23,7 @@
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1)
attack_verb = list("hit", "pierced", "sliced", "attacked")
var/drill_sound = 'sound/weapons/Genhit.ogg'
var/drill_sound = "pickaxe"
var/drill_verb = "drilling"
sharp = 1
+1 -1
View File
@@ -416,7 +416,7 @@ turf/simulated/mineral/floor/light_corner
var/datum/find/F = finds[1]
if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably)
fail_message = ". <b>[pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]</b>"
wreckfinds(P.destroy_artefacts)
wreckfinds(P.destroy_artefacts)
to_chat(user, "<span class='notice'>You start [P.drill_verb][fail_message].</span>")
if(do_after(user,P.digspeed))
-1
View File
@@ -156,7 +156,6 @@ var/list/slot_equipment_priority = list( \
//Drops the item in our active hand. TODO: rename this to drop_active_hand or something
/mob/proc/drop_item(var/atom/Target)
return
/*
Removes the object from any slots the mob might have, calling the appropriate icon update proc.
Does nothing else.
@@ -178,9 +178,28 @@
for(var/obj/item/W in src)
drop_from_inventory(W)
visible_message("<span class='warning'>\The [src] quivers slightly, then splits apart with a wet slithering noise.</span>")
var/obj/item/organ/external/Chest = organs_by_name[BP_TORSO]
qdel(src)
if(Chest.robotic >= 2)
visible_message("<span class='warning'>\The [src] shudders slightly, then ejects a cluster of nymphs with a wet slithering noise.</span>")
species = GLOB.all_species[SPECIES_HUMAN] // This is hard-set to default the body to a normal FBP, without changing anything.
// Bust it
src.death()
for(var/obj/item/organ/internal/diona/Org in internal_organs) // Remove Nymph organs.
qdel(Org)
// Purge the diona verbs.
verbs -= /mob/living/carbon/human/proc/diona_split_nymph
verbs -= /mob/living/carbon/human/proc/regenerate
for(var/obj/item/organ/external/E in organs) // Just fall apart.
E.droplimb(TRUE)
else
visible_message("<span class='warning'>\The [src] quivers slightly, then splits apart with a wet slithering noise.</span>")
qdel(src)
/mob/living/carbon/human/proc/self_diagnostics()
set name = "Self-Diagnostics"
@@ -482,6 +482,7 @@
has_organ = list(
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
O_STRATA = /obj/item/organ/internal/diona/strata,
O_BRAIN = /obj/item/organ/internal/brain/cephalon,
O_RESPONSE = /obj/item/organ/internal/diona/node,
O_GBLADDER = /obj/item/organ/internal/diona/bladder,
O_POLYP = /obj/item/organ/internal/diona/polyp,
@@ -555,6 +556,16 @@
if(H.isSynthetic())
H.visible_message("<span class='danger'>\The [H] collapses into parts, revealing a solitary diona nymph at the core.</span>")
H.species = GLOB.all_species[SPECIES_HUMAN] // This is hard-set to default the body to a normal FBP, without changing anything.
for(var/obj/item/organ/internal/diona/Org in H.internal_organs) // Remove Nymph organs.
qdel(Org)
// Purge the diona verbs.
H.verbs -= /mob/living/carbon/human/proc/diona_split_nymph
H.verbs -= /mob/living/carbon/human/proc/regenerate
return
for(var/mob/living/carbon/alien/diona/D in H.contents)
+19 -2
View File
@@ -33,8 +33,25 @@
//Drops the item in our active hand. TODO: rename this to drop_active_hand or something
/mob/living/drop_item(var/atom/Target)
if(hand) return drop_l_hand(Target)
else return drop_r_hand(Target)
var/obj/item/item_dropped = null
if (hand)
item_dropped = l_hand
. = drop_l_hand(Target)
else
item_dropped = r_hand
. = drop_r_hand(Target)
if (istype(item_dropped) && !QDELETED(item_dropped) && is_preference_enabled(/datum/client_preference/drop_sounds))
addtimer(CALLBACK(src, .proc/make_item_drop_sound, item_dropped), 1)
/mob/proc/make_item_drop_sound(obj/item/I)
if(QDELETED(I))
return
if(I.drop_sound)
playsound(I, I.drop_sound, 25, 0, preference = /datum/client_preference/drop_sounds)
//Drops the item in our left hand
/mob/living/drop_l_hand(var/atom/Target)
+1 -1
View File
@@ -411,7 +411,7 @@ default behaviour is:
if(!isnull(M.incoming_hal_damage_percent))
amount *= M.incoming_hal_damage_percent
if(!isnull(M.disable_duration_percent))
amount *= M.incoming_hal_damage_percent
amount *= M.disable_duration_percent
else if(amount < 0)
for(var/datum/modifier/M in modifiers)
if(!isnull(M.incoming_healing_percent))
+10 -1
View File
@@ -9,4 +9,13 @@
return (!mover.density || !density || lying)
/mob/CanZASPass(turf/T, is_zone)
return ATMOS_PASS_YES
return ATMOS_PASS_YES
/mob/living/SelfMove(turf/n, direct)
// If on walk intent, don't willingly step into hazardous tiles.
// Unless the walker is confused.
if(m_intent == "walk" && confused <= 0)
if(!n.is_safe_to_enter(src))
to_chat(src, span("warning", "\The [n] is dangerous to move into."))
return FALSE // In case any code wants to know if movement happened.
return ..() // Parent call should make the mob move.
+2
View File
@@ -8,6 +8,7 @@ var/list/department_radio_keys = list(
":n" = "Science", ".n" = "Science",
":m" = "Medical", ".m" = "Medical",
":e" = "Engineering", ".e" = "Engineering",
":k" = "Response Team", ".k" = "Response Team", //TFF 11/3/20 - Add Response Team to channels usable rather than resorting to :H or such.,
":s" = "Security", ".s" = "Security",
":w" = "whisper", ".w" = "whisper",
":t" = "Mercenary", ".t" = "Mercenary",
@@ -25,6 +26,7 @@ var/list/department_radio_keys = list(
":N" = "Science", ".N" = "Science",
":M" = "Medical", ".M" = "Medical",
":E" = "Engineering", ".E" = "Engineering",
":k" = "Response Team", ".k" = "Response Team", //TFF 11/3/20 - Add Response Team to channels usable rather than resorting to :H or such.,
":S" = "Security", ".S" = "Security",
":W" = "whisper", ".W" = "whisper",
":T" = "Mercenary", ".T" = "Mercenary",
@@ -119,6 +119,11 @@
icon_state = "hair_long_bedhead"
flags = HAIR_TIEABLE
bedheadlongest
name = "Bedhead Longest"
icon_state = "hair_longest_bedhead"
flags = HAIR_TIEABLE
beehive
name = "Beehive"
icon_state = "hair_beehive"
@@ -743,6 +748,11 @@
icon_state = "hair_rowbraid"
flags = HAIR_TIEABLE
sabitsuki
name = "Sabitsuki"
icon_state = "hair_sabitsuki"
flags = HAIR_VERY_SHORT
scully
name = "Scully"
icon_state = "hair_scully"
+1 -1
View File
@@ -115,7 +115,7 @@
if(incapacitated())
return FALSE
if(hovering)
if(hovering || is_incorporeal())
return TRUE
if(Process_Spacemove())
+4 -1
View File
@@ -152,6 +152,9 @@
/turf/simulated/open/is_safe_to_enter(mob/living/L)
if(L.can_fall())
for(var/obj/O in contents)
if(!O.CanFallThru(L, GetBelow(src)))
return TRUE // Can't fall through this, like lattice or catwalk.
if(!locate(/obj/structure/stairs) in GetBelow(src))
return FALSE
return FALSE // Falling on stairs is safe.
return ..()
+1
View File
@@ -4,6 +4,7 @@ var/list/organ_cache = list()
name = "organ"
icon = 'icons/obj/surgery.dmi'
germ_level = 0
drop_sound = 'sound/items/drop/flesh.ogg'
// Strings.
var/organ_tag = "organ" // Unique identifier.
+2 -2
View File
@@ -18,7 +18,7 @@ var/global/list/limb_icon_cache = list()
h_col = null
if(robotic >= ORGAN_ROBOT)
var/datum/robolimb/franchise = all_robolimbs[model]
if(!(franchise && franchise.skin_tone))
if(!(franchise && franchise.skin_tone) && !(franchise && franchise.skin_color))
if(human.synth_color)
s_col = list(human.r_synth, human.g_synth, human.b_synth)
return
@@ -36,7 +36,7 @@ var/global/list/limb_icon_cache = list()
h_col = null
if(robotic >= ORGAN_ROBOT)
var/datum/robolimb/franchise = all_robolimbs[model]
if(!(franchise && franchise.skin_tone))
if(!(franchise && franchise.skin_tone) && !(franchise && franchise.skin_color))
return
if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.appearance_flags & HAS_SKIN_TONE))
s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE)
+108 -1
View File
@@ -33,6 +33,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
if(!R.unavailable_at_chargen)
chargen_robolimbs[R.company] = R //List only main brands and solo parts.
for(var/company in all_robolimbs)
var/datum/robolimb/R = all_robolimbs[company]
if(R.species_alternates)
for(var/species in R.species_alternates)
var/species_company = R.species_alternates[species]
if(species_company in all_robolimbs)
R.species_alternates[species] = all_robolimbs[species_company]
/datum/robolimb
var/company = "Unbranded" // Shown when selecting the limb.
var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb.
@@ -40,9 +48,11 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
var/unavailable_at_chargen // If set, not available at chargen.
var/unavailable_to_build // If set, can't be constructed.
var/lifelike // If set, appears organic.
var/skin_tone // If set, applies skin tone rather than part color
var/skin_tone // If set, applies skin tone rather than part color Overrides color.
var/skin_color // If set, applies skin color rather than part color.
var/blood_color = "#030303"
var/list/species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA)
var/list/species_alternates = list(SPECIES_TAJ = "Unbranded - Tajaran", SPECIES_UNATHI = "Unbranded - Unathi") //"Species Name" = "Robolimb Company" , List, when initialized, will become "Species Name" = RobolimbDatum, used for alternate species sprites.
var/list/monitor_styles //If empty, the model of limbs offers a head compatible with monitors.
var/parts = BP_ALL //Defines what parts said brand can replace on a body.
var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator.
@@ -72,10 +82,45 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi'
unavailable_to_build = 1
/datum/robolimb/unbranded_tajaran
company = "Unbranded - Tajaran"
species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_SKRELL, SPECIES_ZADDAT)
suggested_species = SPECIES_TAJ
desc = "A simple robotic limb with feline design. Seems rather stiff."
icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_tajaran.dmi'
unavailable_to_build = 1
/datum/robolimb/unbranded_unathi
company = "Unbranded - Unathi"
species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT)
suggested_species = SPECIES_UNATHI
desc = "A simple robotic limb with reptilian design. Seems rather stiff."
icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_unathi.dmi'
unavailable_to_build = 1
/datum/robolimb/nanotrasen
company = "NanoTrasen"
desc = "A simple but efficient robotic limb, created by NanoTrasen."
icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_main.dmi'
species_alternates = list(SPECIES_TAJ = "NanoTrasen - Tajaran", SPECIES_UNATHI = "NanoTrasen - Unathi")
/datum/robolimb/nanotrasen_tajaran
company = "NanoTrasen - Tajaran"
species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_SKRELL, SPECIES_ZADDAT)
species_alternates = list(SPECIES_HUMAN = "NanoTrasen")
suggested_species = SPECIES_TAJ
desc = "A simple but efficient robotic limb, created by NanoTrasen."
icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_tajaran.dmi'
unavailable_to_build = 1
/datum/robolimb/nanotrasen_unathi
company = "NanoTrasen - Unathi"
species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ZADDAT)
species_alternates = list(SPECIES_HUMAN = "NanoTrasen")
suggested_species = SPECIES_UNATHI
desc = "A simple but efficient robotic limb, created by NanoTrasen."
icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_unathi.dmi'
unavailable_to_build = 1
/datum/robolimb/bishop
company = "Bishop"
@@ -104,6 +149,19 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
parts = list(BP_HEAD)
monitor_styles = standard_monitor_styles
/datum/robolimb/gestaltframe
company = "Skrellian Exoskeleton"
desc = "This limb looks to be more like a strange.. puppet, than a prosthetic."
icon = 'icons/mob/human_races/cyberlimbs/veymed/dionaea/skrellian.dmi'
blood_color = "#63b521"
speech_bubble_appearance = "machine"
unavailable_to_build = 1
species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_TAJ, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_SKRELL, SPECIES_ZADDAT)
suggested_species = SPECIES_DIONA
// Dionaea are naturally very tanky, so the robotic limbs are actually far weaker than their normal bodies.
robo_brute_mod = 1.3
robo_burn_mod = 1.3
/datum/robolimb/cybersolutions
company = "Cyber Solutions"
desc = "This limb is grey and rough, with little in the way of aesthetic."
@@ -224,11 +282,25 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
unavailable_to_build = 1
lifelike = 1
skin_tone = 1
species_alternates = list(SPECIES_SKRELL = "Vey-Med - Skrell")
blood_color = "#CCCCCC"
speech_bubble_appearance = "normal"
robo_brute_mod = 1.1
robo_burn_mod = 1.1
/datum/robolimb/veymed_skrell
company = "Vey-Med - Skrell"
desc = "This high quality limb is nearly indistinguishable from an organic one."
icon = 'icons/mob/human_races/cyberlimbs/veymed/veymed_skrell.dmi'
unavailable_to_build = 1
lifelike = 1
skin_color = TRUE
species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_TAJ, SPECIES_HUMAN, SPECIES_VOX, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_DIONA, SPECIES_ZADDAT)
blood_color = "#4451cf"
speech_bubble_appearance = "normal"
robo_brute_mod = 1.05
robo_burn_mod = 1.05
/datum/robolimb/wardtakahashi
company = "Ward-Takahashi"
desc = "This limb features sleek black and white polymers."
@@ -343,6 +415,10 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Vey-Med"
catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med)
// Bus disk for Diona mech parts.
/obj/item/weapon/disk/limb/veymed/diona
company = "Skrellian Exoskeleton"
/obj/item/weapon/disk/limb/wardtakahashi
company = "Ward-Takahashi"
catalogue_data = list(/datum/category_item/catalogue/information/organization/ward_takahashi)
@@ -358,3 +434,34 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
/obj/item/weapon/disk/limb/nanotrasen
company = "NanoTrasen"
catalogue_data = list(/datum/category_item/catalogue/information/organization/nanotrasen)
/obj/item/weapon/disk/species
name = "Species Bioprints"
desc = "A disk containing the blueprints for species-specific prosthetics."
icon = 'icons/obj/cloning.dmi'
icon_state = "datadisk2"
var/species = SPECIES_HUMAN
/obj/item/weapon/disk/species/Initialize()
..()
if(species)
name = "[species] [initial(name)]"
/obj/item/weapon/disk/species/skrell
species = SPECIES_SKRELL
/obj/item/weapon/disk/species/unathi
species = SPECIES_UNATHI
/obj/item/weapon/disk/species/tajaran
species = SPECIES_TAJ
/obj/item/weapon/disk/species/teshari
species = SPECIES_TESHARI
// In case of bus, presently.
/obj/item/weapon/disk/species/diona
species = SPECIES_DIONA
/obj/item/weapon/disk/species/zaddat
species = SPECIES_ZADDAT
+31
View File
@@ -205,6 +205,37 @@
/obj/item/organ/internal/diona/node/removed()
return
// A 'brain' for the tree, still becomes a mindless nymph when removed like any other. Satisfies the FBP code.
/obj/item/organ/internal/brain/cephalon
name = "cephalon mass"
parent_organ = BP_TORSO
vital = TRUE
/obj/item/organ/internal/brain/cephalon/Initialize()
..()
spawn(30 SECONDS) // FBP Dionaea need some way to be disassembled through surgery, if absolutely necessary.
if(!owner.isSynthetic())
vital = FALSE
/obj/item/organ/internal/brain/cephalon/robotize()
return
/obj/item/organ/internal/brain/cephalon/mechassist()
return
/obj/item/organ/internal/brain/cephalon/digitize()
return
/obj/item/organ/internal/brain/cephalon/removed(var/mob/living/user, var/skip_nymph)
if(robotic >= ORGAN_ROBOT)
return ..()
var/mob/living/carbon/human/H = owner
..()
if(!istype(H) || !H.organs || !H.organs.len)
H.death()
if(prob(50) && !skip_nymph && spawn_diona_nymph(get_turf(src)))
qdel(src)
/obj/item/organ/external/head/no_eyes/diona
max_damage = 50
min_broken_damage = 25
+6 -3
View File
@@ -37,7 +37,9 @@
user.drop_item()
P.loc = src
icon_state = "[initial(icon_state)]-open"
sleep(5)
flick("[initial(icon_state)]-open",src)
playsound(loc, 'sound/bureaucracy/filingcabinet.ogg', 50, 1)
sleep(40)
icon_state = initial(icon_state)
updateUsrDialog()
else if(P.is_wrench())
@@ -98,9 +100,10 @@
if(istype(P) && (P.loc == src) && src.Adjacent(usr))
usr.put_in_hands(P)
updateUsrDialog()
icon_state = "[initial(icon_state)]-open"
flick("[initial(icon_state)]-open",src)
playsound(loc, 'sound/bureaucracy/filingcabinet.ogg', 50, 1)
spawn(0)
sleep(5)
sleep(20)
icon_state = initial(icon_state)
/*
+1
View File
@@ -5,6 +5,7 @@
icon_state = "folder"
w_class = ITEMSIZE_SMALL
pressure_resistance = 2
drop_sound = 'sound/items/drop/paper.ogg'
/obj/item/weapon/folder/blue
desc = "A blue folder."
+6
View File
@@ -19,6 +19,7 @@
slot_flags = SLOT_HEAD
body_parts_covered = HEAD
attack_verb = list("bapped")
drop_sound = 'sound/items/drop/paper.ogg'
var/info //What's actually written on the paper.
var/info_links //A different version of the paper which includes html links at fields and EOF
@@ -177,6 +178,7 @@
//crumple dat paper
info = stars(info,85)
user.visible_message("\The [user] crumples \the [src] into a ball!")
playsound(src, 'sound/bureaucracy/papercrumple.ogg', 50, 1)
icon_state = "scrap"
return
user.examinate(src)
@@ -368,6 +370,7 @@
user.visible_message("<span class='[class]'>[user] holds \the [P] up to \the [src], it looks like [TU.hes] trying to burn it!</span>", \
"<span class='[class]'>You hold \the [P] up to \the [src], burning it slowly.</span>")
playsound(src.loc, 'sound/bureaucracy/paperburn.ogg', 50, 1)
spawn(20)
if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit)
@@ -461,6 +464,8 @@
usr << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[info_links][stamps]</BODY></HTML>", "window=[name]") // Update the window
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 10)
update_icon()
/obj/item/weapon/paper/get_worn_icon_state(var/slot_name)
@@ -573,6 +578,7 @@
stamped += P.type
overlays += stampoverlay
playsound(src, 'sound/bureaucracy/stamp.ogg', 50, 1)
to_chat(user, "<span class='notice'>You stamp the paper with your rubber stamp.</span>")
else if(istype(P, /obj/item/weapon/flame))
+1
View File
@@ -12,6 +12,7 @@
layer = MOB_LAYER
pressure_resistance = 1
attack_verb = list("bapped")
drop_sound = 'sound/items/drop/paper.ogg'
var/page = 1 // current page
var/list/pages = list() // Ordered list of pages as they are to be displayed. Can be different order than src.contents.
+1
View File
@@ -23,6 +23,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 10)
var/colour = "black" //what colour the ink is!
pressure_resistance = 2
drop_sound = 'sound/items/drop/accessory.ogg'
/obj/item/weapon/pen/attack_self(var/mob/user)
to_chat(user, "<span class='notice'>Click.</span>")
+1
View File
@@ -515,6 +515,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
item_state = "coil"
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
stacktype = /obj/item/stack/cable_coil
drop_sound = 'sound/items/drop/accessory.ogg'
/obj/item/stack/cable_coil/cyborg
name = "cable coil synthesizer"
+2 -2
View File
@@ -127,13 +127,13 @@
if((A in G.localareas) && (G.on))
break
if(!G)
A.gravitychange(0,A)
A.gravitychange(0)
else
for(var/area/A in gravity_generator:localareas)
gravity_generator:on = 1
A.gravitychange(1,A)
A.gravitychange(1)
src.updateUsrDialog()
return
+1
View File
@@ -8,6 +8,7 @@
throwforce = 1
w_class = ITEMSIZE_TINY
preserve_item = 1
drop_sound = 'sound/items/drop/ring.ogg'
var/leaves_residue = 1
var/caliber = "" //Which kind of guns it can be loaded into
+1
View File
@@ -49,6 +49,7 @@
origin_tech = list(TECH_COMBAT = 1)
attack_verb = list("struck", "hit", "bashed")
zoomdevicename = "scope"
drop_sound = 'sound/items/drop/gun.ogg'
var/automatic = 0
var/burst = 1
@@ -150,7 +150,7 @@
w_class = ITEMSIZE_NORMAL
slowdown_held = 0
slowdown_held = 0.1
initial_cell_type = /obj/item/weapon/cell/device/weapon
initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor
@@ -159,7 +159,7 @@
firemodes = list(
list(mode_name="lethal", power_cost = 500, projectile_type = /obj/item/projectile/bullet/magnetic/heated, burst=1, fire_delay=10, move_delay=null, one_handed_penalty=0),
list(mode_name="stun", power_cost = 350, projectile_type = /obj/item/projectile/energy/electrode/stunshot, burst=1, fire_delay=7, move_delay=null, one_handed_penalty=0),
list(mode_name="stun", power_cost = 350, projectile_type = /obj/item/projectile/energy/electrode/strong, burst=1, fire_delay=7, move_delay=null, one_handed_penalty=0),
)
/obj/item/weapon/gun/magnetic/railgun/heater/pistol/hos
@@ -171,7 +171,7 @@
firemodes = list(
list(mode_name="lethal", power_cost = 400, projectile_type = /obj/item/projectile/bullet/magnetic/heated, burst=1, fire_delay=8, move_delay=null, one_handed_penalty=0),
list(mode_name="stun", power_cost = 300, projectile_type = /obj/item/projectile/energy/electrode/stunshot, burst=1, fire_delay=5, move_delay=null, one_handed_penalty=0),
list(mode_name="stun", power_cost = 300, projectile_type = /obj/item/projectile/energy/electrode/strong, burst=1, fire_delay=5, move_delay=null, one_handed_penalty=0),
)
/obj/item/weapon/gun/magnetic/railgun/flechette/sif
@@ -36,13 +36,16 @@
damage = 30
damage_type = SEARING
embed_chance = 0
armor_penetration = 40
penetrating = 1
/obj/item/projectile/bullet/magnetic/heated/weak
icon_state = "gauss_silenced"
damage = 15
agony = 5
embed_chance = 0
armor_penetration = 50
armor_penetration = 30
penetrating = 0
/obj/item/projectile/bullet/magnetic/fuelrod
name = "fuel rod"
@@ -160,6 +160,7 @@
var/label = href_list["dispense"]
if(cartridges[label] && container && container.is_open_container())
var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = cartridges[label]
playsound(src.loc, 'sound/machines/reagent_dispense.ogg', 25, 1)
C.reagents.trans_to(container, amount)
else if(href_list["ejectBeaker"])
@@ -21,6 +21,7 @@
icon = 'icons/obj/bloodpack.dmi'
icon_state = "empty"
item_state = "bloodpack_empty"
drop_sound = 'sound/items/drop/food.ogg'
volume = 200
var/label_text = ""
@@ -11,6 +11,7 @@
w_class = ITEMSIZE_TINY
slot_flags = SLOT_EARS
volume = 5
drop_sound = 'sound/items/drop/glass.ogg'
/obj/item/weapon/reagent_containers/dropper/examine(var/mob/user)
if(!..(user, 2))
@@ -7,6 +7,7 @@
icon = 'icons/obj/chemical.dmi'
icon_state = null
item_state = "pill"
drop_sound = 'sound/items/drop/food.ogg'
var/base_state = "pill"
@@ -25,6 +25,7 @@
var/visible_name = "a syringe"
var/time = 30
var/drawing = 0
drop_sound = 'sound/items/drop/glass.ogg'
/obj/item/weapon/reagent_containers/syringe/on_reagent_change()
update_icon()
@@ -18,6 +18,7 @@
unwrap()
proc/unwrap()
playsound(loc, 'sound/items/package_unwrap.ogg', 50, 1)
// Destroy will drop our wrapped object on the turf, so let it.
qdel(src)
@@ -48,6 +49,7 @@
user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\
"<span class='notice'>You title \the [src]: \"[str]\"</span>",\
"You hear someone scribbling a note.")
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20)
name = "[name] ([str])"
if(!examtext && !nameset)
nameset = 1
@@ -67,6 +69,7 @@
user.visible_message("\The [user] labels \the [src] with \a [W], scribbling down: \"[examtext]\"",\
"<span class='notice'>You label \the [src]: \"[examtext]\"</span>",\
"You hear someone scribbling a note.")
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20)
return
update_icon()
@@ -111,6 +114,7 @@
name = "small parcel"
icon = 'icons/obj/storage.dmi'
icon_state = "deliverycrate3"
drop_sound = 'sound/items/drop/box.ogg'
var/obj/item/wrapped = null
var/sortTag = null
var/examtext = null
@@ -155,6 +159,7 @@
user.visible_message("\The [user] titles \the [src] with \a [W], marking down: \"[str]\"",\
"<span class='notice'>You title \the [src]: \"[str]\"</span>",\
"You hear someone scribbling a note.")
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20)
name = "[name] ([str])"
if(!examtext && !nameset)
nameset = 1
@@ -175,6 +180,7 @@
user.visible_message("\The [user] labels \the [src] with \a [W], scribbling down: \"[examtext]\"",\
"<span class='notice'>You label \the [src]: \"[examtext]\"</span>",\
"You hear someone scribbling a note.")
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20)
return
update_icon()
@@ -217,6 +223,7 @@
icon_state = "deliveryPaper"
w_class = ITEMSIZE_NORMAL
var/amount = 25.0
drop_sound = 'sound/items/drop/wrapper.ogg'
afterattack(var/obj/target as obj, mob/user as mob, proximity)
@@ -267,6 +274,7 @@
user.visible_message("\The [user] wraps \a [target] with \a [src].",\
"<span class='notice'>You wrap \the [target], leaving [amount] units of paper on \the [src].</span>",\
"You hear someone taping paper around a small object.")
playsound(loc, 'sound/items/package_wrap.ogg', 50, 1)
else if (istype(target, /obj/structure/closet/crate))
var/obj/structure/closet/crate/O = target
if (src.amount > 3 && !O.opened)
@@ -278,6 +286,7 @@
user.visible_message("\The [user] wraps \a [target] with \a [src].",\
"<span class='notice'>You wrap \the [target], leaving [amount] units of paper on \the [src].</span>",\
"You hear someone taping paper around a large object.")
playsound(loc, 'sound/items/package_wrap.ogg', 50, 1)
else if(src.amount < 3)
to_chat(user, "<span class='warning'>You need more paper.</span>")
else if (istype (target, /obj/structure/closet))
@@ -291,6 +300,7 @@
user.visible_message("\The [user] wraps \a [target] with \a [src].",\
"<span class='notice'>You wrap \the [target], leaving [amount] units of paper on \the [src].</span>",\
"You hear someone taping paper around a large object.")
playsound(loc, 'sound/items/package_wrap.ogg', 50, 1)
else if(src.amount < 3)
to_chat(user, "<span class='warning'>You need more paper.</span>")
else
@@ -0,0 +1,46 @@
/datum/design/circuit/disk
build_type = IMPRINTER
req_tech = list(TECH_DATA = 3)
materials = list(MAT_PLASTIC = 2000, MAT_GLASS = 1000)
chemicals = list("pacid" = 10)
time = 5
/datum/design/circuit/disk/AssembleDesignName()
..()
if(build_path)
var/obj/item/weapon/disk/D = build_path
if(istype(D, /obj/item/weapon/disk/species))
name = "Species Prosthetic design ([item_name])"
else if(istype(D, /obj/item/weapon/disk/limb))
name = "Transtellar Prosthetic design ([item_name])"
else
name = "Disk design ([item_name])"
/datum/design/circuit/disk/skrellprint
name = SPECIES_SKRELL
id = "prosthetic_skrell"
req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
build_path = /obj/item/weapon/disk/species/skrell
sort_string = "DBAAA"
/datum/design/circuit/disk/tajprint
name = SPECIES_TAJ
id = "prosthetic_tajaran"
req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
build_path = /obj/item/weapon/disk/species/tajaran
sort_string = "DBAAB"
/datum/design/circuit/disk/unathiprint
name = SPECIES_UNATHI
id = "prosthetic_unathi"
req_tech = list(TECH_DATA = 3, TECH_BIO = 4)
build_path = /obj/item/weapon/disk/species/unathi
sort_string = "DBAAC"
/datum/design/circuit/disk/teshariprint
name = SPECIES_TESHARI
id = "prosthetic_teshari"
req_tech = list(TECH_DATA = 3, TECH_BIO = 4)
build_path = /obj/item/weapon/disk/species/teshari
sort_string = "DBAAD"
+39 -5
View File
@@ -13,7 +13,17 @@
var/obj/item/organ/O = new build_path(newloc)
if(prosfab.manufacturer)
var/datum/robolimb/manf = all_robolimbs[prosfab.manufacturer]
O.species = GLOB.all_species["[manf.suggested_species]"]
if(!(O.organ_tag in manf.parts)) // Make sure we're using an actually present icon.
manf = all_robolimbs["Unbranded"]
if(prosfab.species in manf.species_alternates) // If the prosthetics fab is set to say, Unbranded, and species set to 'Tajaran', it will make the Taj variant of Unbranded, if it exists.
manf = manf.species_alternates[prosfab.species]
if(!prosfab.species || (prosfab.species in manf.species_cannot_use)) // Fabricator ensures the manufacturer can make parts for the species we're set to.
O.species = GLOB.all_species["[manf.suggested_species]"]
else
O.species = GLOB.all_species[prosfab.species]
else
O.species = GLOB.all_species["Human"]
O.robotize(prosfab.manufacturer)
@@ -30,9 +40,18 @@
if(istype(fabricator, /obj/machinery/pros_fabricator))
var/obj/machinery/pros_fabricator/prosfab = fabricator
var/newspecies = "Human"
if(prosfab.manufacturer)
var/datum/robolimb/manf = all_robolimbs[prosfab.manufacturer]
newspecies = manf.suggested_species
var/datum/robolimb/manf = all_robolimbs[prosfab.manufacturer]
if(manf)
if(prosfab.species in manf.species_alternates) // If the prosthetics fab is set to say, Unbranded, and species set to 'Tajaran', it will make the Taj variant of Unbranded, if it exists.
manf = manf.species_alternates[prosfab.species]
if(!prosfab.species || (prosfab.species in manf.species_cannot_use))
newspecies = manf.suggested_species
else
newspecies = prosfab.species
var/mob/living/carbon/human/H = new(newloc,newspecies)
H.stat = DEAD
H.gender = gender
@@ -44,11 +63,26 @@
for(var/obj/item/organ/external/O in H.organs)
O.species = GLOB.all_species[newspecies]
O.robotize(prosfab.manufacturer)
if(!(O.organ_tag in manf.parts)) // Make sure we're using an actually present icon.
manf = all_robolimbs["Unbranded"]
O.robotize(manf.company)
O.dna = new/datum/dna()
O.dna.ResetUI()
O.dna.ResetSE()
// Skincolor weirdness.
O.s_col[1] = 0
O.s_col[2] = 0
O.s_col[3] = 0
// Resetting the UI does strange things for the skin of a non-human robot, which should be controlled by a whole different thing.
H.r_skin = 0
H.g_skin = 0
H.b_skin = 0
H.dna.ResetUIFrom(H)
H.real_name = "Synthmorph #[rand(100,999)]"
H.name = H.real_name
H.dir = 2
+93
View File
@@ -481,3 +481,96 @@
/datum/surgery_step/robotics/install_mmi/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("<span class='warning'>[user]'s hand slips.</span>", \
"<span class='warning'>Your hand slips.</span>")
/*
* Install a Diona Nymph into a Nymph Mech
*/
/datum/surgery_step/robotics/install_nymph
allowed_tools = list(
/obj/item/weapon/holder/diona = 100
)
min_duration = 60
max_duration = 80
/datum/surgery_step/robotics/install_nymph/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(target_zone != BP_TORSO)
return
var/obj/item/weapon/holder/diona/N = tool
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!(affected && affected.open == 3))
return 0
if(!istype(N))
return 0
if(!N.held_mob.client || N.held_mob.stat >= DEAD)
to_chat(user, "<span class='danger'>That nymph is not viable.</span>")
return SURGERY_FAILURE
if(!(affected.robotic >= ORGAN_ROBOT))
to_chat(user, "<span class='danger'>You cannot install a nymph into a meat puppet.</span>")
return SURGERY_FAILURE
if(!(affected.model != "Skrellian Exoskeleton"))
to_chat(user, "<span class='dangerou'>You're fairly certain a nymph can't pilot a normal robot.</span>")
return SURGERY_FAILURE
if(!target.should_have_organ("brain"))
to_chat(user, "<span class='danger'>You're pretty sure [target.species.name_plural] don't normally have a brain.</span>")
return SURGERY_FAILURE
if(!isnull(target.internal_organs["brain"]))
to_chat(user, "<span class='danger'>Your subject already has a cephalon.</span>")
return SURGERY_FAILURE
return 1
/datum/surgery_step/robotics/install_nymph/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts setting \the [tool] into [target]'s [affected.name].", \
"You start setting \the [tool] into [target]'s [affected.name].")
..()
/datum/surgery_step/robotics/install_nymph/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("<span class='notice'>[user] has installed \the [tool] into [target]'s [affected.name].</span>", \
"<span class='notice'>You have installed \the [tool] into [target]'s [affected.name].</span>")
var/obj/item/weapon/holder/diona/N = tool
var/obj/item/organ/internal/brain/cephalon/cephalon = new(target, 1)
target.internal_organs_by_name["brain"] = cephalon
var/mob/living/carbon/alien/diona/D = N.held_mob
user.drop_from_inventory(tool)
if(D && D.mind)
D.mind.transfer_to(target)
target.languages |= D.languages
qdel(D)
target.species = GLOB.all_species[SPECIES_DIONA]
target.verbs |= /mob/living/carbon/human/proc/diona_split_nymph
target.verbs |= /mob/living/carbon/human/proc/regenerate
spawn(0) //Name yourself on your own damn time
var/new_name = ""
while(!new_name)
if(!target) return
var/try_name = input(target,"Pick a name for your new form!", "New Name", target.name)
var/clean_name = sanitizeName(try_name, allow_numbers = TRUE)
if(clean_name)
var/okay = alert(target,"New name will be '[clean_name]', ok?", "Confirmation","Cancel","Ok")
if(okay == "Ok")
new_name = clean_name
target.name = new_name
target.real_name = target.name
/datum/surgery_step/robotics/install_nymph/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("<span class='warning'>[user]'s hand slips.</span>", \
"<span class='warning'>Your hand slips.</span>")