Merge branch 'pr/12'

This commit is contained in:
Fermi
2019-05-26 02:05:48 +01:00
245 changed files with 5789 additions and 2169 deletions
+36
View File
@@ -150,6 +150,42 @@
message_admins("[key_name_admin(src)] set the round end sound to [S]")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Set Round End Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/play_web_sound_manual()
set category = "Fun"
set name = "Manual Play Internet Sound"
if(!check_rights(R_SOUNDS))
return
var/web_sound_input = input("Enter youtube-dl fetched content URL (supported sites only, leave blank to stop playing)", "Send youtube-dl media link") as text|null
if(!istext(web_sound_input))
return
web_sound_input = trim(web_sound_input)
if(!length(web_sound_input))
log_admin("[key_name(src)] stopped web sound")
message_admins("[key_name(src)] stopped web sound")
for(var/m in GLOB.player_list)
var/mob/M = m
var/client/C = M.client
if((C.prefs.toggles & SOUND_MIDI) && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
C.chatOutput.stopMusic()
return
var/freq = input(usr, "What frequency would you like the sound to play at?",, 1) as null|num
if(!freq)
return
if(web_sound_input && !findtext(web_sound_input, GLOB.is_http_protocol))
to_chat(src, "<span class='boldwarning'>BLOCKED: Content URL not using http(s) protocol</span>")
to_chat(src, "<span class='warning'>The media provider returned a content URL that isn't using the HTTP or HTTPS protocol</span>")
return
SSblackbox.record_feedback("nested tally", "played_url_manual", 1, list("[ckey]", "[web_sound_input]"))
log_admin("[key_name(src)] manually played web sound: [web_sound_input]")
message_admins("[key_name(src)] manually played web sound: <a href='web_sound_input'>HREF</a>")
for(var/m in GLOB.player_list)
var/mob/M = m
var/client/C = M.client
if((C.prefs.toggles & SOUND_MIDI) && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
C.chatOutput.sendMusic(web_sound_input, freq)
/client/proc/stop_sounds()
set category = "Debug"
set name = "Stop All Playing Sounds"
+4 -1
View File
@@ -1249,7 +1249,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(!check_rights(R_ADMIN) || !check_rights(R_FUN))
return
var/list/punishment_list = list(ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_ROD, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING)
var/list/punishment_list = list(ADMIN_PUNISHMENT_PIE, ADMIN_PUNISHMENT_FIREBALL, ADMIN_PUNISHMENT_LIGHTNING, ADMIN_PUNISHMENT_BRAINDAMAGE, ADMIN_PUNISHMENT_BSA, ADMIN_PUNISHMENT_GIB, ADMIN_PUNISHMENT_SUPPLYPOD, ADMIN_PUNISHMENT_MAZING, ADMIN_PUNISHMENT_ROD)
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
@@ -1294,6 +1294,9 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(!puzzle_imprison(target))
to_chat(usr,"<span class='warning'>Imprisonment failed!</span>")
return
if(ADMIN_PUNISHMENT_PIE)
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target))
creamy.splat(target)
var/msg = "[key_name_admin(usr)] punished [key_name_admin(target)] with [punishment]."
message_admins(msg)
@@ -108,10 +108,20 @@
to_chat(loc, "<span class='warning'>Combat injection is still recharging.</span>")
return
var/mob/living/carbon/human/M = loc
M.adjustStaminaLoss(-75)
M.SetSleeping(0)
M.SetUnconscious(0)
M.SetStun(0)
M.SetKnockdown(0)
M.reagents.add_reagent("inaprovaline", 3)
M.reagents.add_reagent("synaptizine", 10)
M.reagents.add_reagent("stimulants", 10)
M.adjustStaminaLoss(-150)
M.stuttering = 0
M.updatehealth()
M.update_stamina()
M.resting = 0
M.lying = 0
M.update_canmove()
combat_cooldown = 0
START_PROCESSING(SSobj, src)
@@ -503,6 +513,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
L.lastattacker = user.real_name
L.lastattackerckey = user.ckey
L.adjustStaminaLoss(35) //because previously it took 5-6 hits to actually "incapacitate" someone for the purposes of the sleep inducement
L.Knockdown(140)
L.apply_effect(EFFECT_STUTTER, 7)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
@@ -9,6 +9,7 @@
point_return = 4
atmosblock = TRUE
armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
var/weakened
/obj/structure/blob/shield/scannerreport()
if(atmosblock)
@@ -25,10 +26,15 @@
name = "weakened strong blob"
desc = "A wall of twitching tendrils."
atmosblock = FALSE
armor = list("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
if(!weakened)
armor = armor.setRating("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
weakened = TRUE
else
icon_state = initial(icon_state)
name = initial(name)
desc = initial(desc)
atmosblock = TRUE
air_update_turf(1)
if(weakened)
armor = armor.setRating("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
weakened = FALSE
air_update_turf(1)
@@ -19,6 +19,14 @@
user.SetKnockdown(0)
user.reagents.add_reagent("changelingadrenaline", 10)
user.reagents.add_reagent("changelinghaste", 2) //For a really quick burst of speed
user.adjustStaminaLoss(-75)
user.reagents.add_reagent("inaprovaline", 3) //let's give another chance to dumb fucks who forget to breathe
user.adjustStaminaLoss(-150)
user.stuttering = 0
user.updatehealth()
user.update_stamina()
user.resting = 0
user.lying = 0
user.update_canmove()
return TRUE
@@ -13,7 +13,7 @@
if (user.has_trait(CHANGELING_HIVEMIND_MUTE))
to_chat(user, "<span class='warning'>The poison in the air hinders our ability to interact with the hivemind.</span>")
return
var/input = stripped_input(usr, "Please choose a message to transmit.", "Changeling Hivemind", "")
var/input = html_decode(stripped_input(usr, "Please choose a message to transmit.", "Changeling Hivemind", ""))
user.say(".g[input]")
/obj/effect/proc_holder/changeling/hivemind_comms/on_purchase(mob/user, is_respec)
@@ -44,12 +44,13 @@
/obj/item/clockwork/slab/cyborg //three scriptures, plus a spear and fabricator
clockwork_desc = "A divine link to the Celestial Derelict, allowing for limited recital of scripture."
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard)
quickbound = list(/datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/ranged_ability/linked_vanguard, \
/datum/clockwork_scripture/create_object/stargazer)
maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more
actions_types = list()
/obj/item/clockwork/slab/cyborg/engineer //two scriptures, plus a fabricator
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission)
/obj/item/clockwork/slab/cyborg/engineer //three scriptures, plus a fabricator
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission, /datum/clockwork_scripture/create_object/stargazer)
/obj/item/clockwork/slab/cyborg/medical //five scriptures, plus a spear
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \
@@ -61,12 +62,12 @@
/obj/item/clockwork/slab/cyborg/peacekeeper //two scriptures, plus a spear
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/ranged_ability/hateful_manacles, /datum/clockwork_scripture/ranged_ability/judicial_marker)
/obj/item/clockwork/slab/cyborg/janitor //five scriptures, plus a fabricator
/obj/item/clockwork/slab/cyborg/janitor //six scriptures, plus a fabricator
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \
/datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor)
/datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor)
/obj/item/clockwork/slab/cyborg/service //five scriptures, plus xray vision
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, \
/obj/item/clockwork/slab/cyborg/service //six scriptures, plus xray vision
quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant,/datum/clockwork_scripture/create_object/stargazer, \
/datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/create_object/clockwork_obelisk)
/obj/item/clockwork/slab/cyborg/miner //two scriptures, plus a spear and xray vision
@@ -2,6 +2,32 @@
// DRIVERS //
/////////////
//Stargazer: Creates a stargazer, a cheap power generator that utilizes starlight.
/datum/clockwork_scripture/create_object/stargazer
descname = "Generates Power From Starlight"
name = "Stargazer"
desc = "Forms a weak structure that generates power every second while within three tiles of starlight."
invocations = list("Capture their inferior light for us!")
channel_time = 50
power_cost = 200
object_path = /obj/structure/destructible/clockwork/stargazer
creator_message = "<span class='brass'>You form a stargazer, which will generate power near starlight.</span>"
observer_message = "<span class='warning'>A large lantern-shaped machine forms!</span>"
usage_tip = "For obvious reasons, make sure to place this near a window or somewhere else that can see space!"
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
primary_component = HIEROPHANT_ANSIBLE
sort_priority = 1
quickbind = TRUE
quickbind_desc = "Creates a stargazer, which generates power when near starlight."
/datum/clockwork_scripture/create_object/stargazer/check_special_requirements()
var/area/A = get_area(invoker)
if(A.outdoors || A.map_name == "Space" || !A.blob_allowed)
to_chat(invoker, "<span class='danger'>Stargazers can't be built off-station.</span>")
return
return ..()
//Integration Cog: Creates an integration cog that can be inserted into APCs to passively siphon power.
/datum/clockwork_scripture/create_object/integration_cog
@@ -18,7 +44,7 @@
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
primary_component = HIEROPHANT_ANSIBLE
sort_priority = 1
sort_priority = 2
important = TRUE
quickbind = TRUE
quickbind_desc = "Creates an integration cog, which can be used to siphon power from an open APC."
@@ -39,7 +65,7 @@
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
primary_component = HIEROPHANT_ANSIBLE
sort_priority = 2
sort_priority = 3
quickbind = TRUE
quickbind_desc = "Creates a Sigil of Transgression, which will briefly stun and slow the next non-Servant to cross it."
@@ -59,7 +85,7 @@
tier = SCRIPTURE_DRIVER
one_per_tile = TRUE
primary_component = HIEROPHANT_ANSIBLE
sort_priority = 3
sort_priority = 4
quickbind = TRUE
quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it."
@@ -76,7 +102,7 @@
usage_tip = "The light can be used from up to two tiles away. Damage taken will GREATLY REDUCE the stun's duration."
tier = SCRIPTURE_DRIVER
primary_component = BELLIGERENT_EYE
sort_priority = 4
sort_priority = 5
slab_overlay = "volt"
ranged_type = /obj/effect/proc_holder/slab/kindle
ranged_message = "<span class='brass'><i>You charge the clockwork slab with divine energy.</i>\n\
@@ -100,7 +126,7 @@
usage_tip = "The manacles are about as strong as zipties, and break when removed."
tier = SCRIPTURE_DRIVER
primary_component = BELLIGERENT_EYE
sort_priority = 5
sort_priority = 6
ranged_type = /obj/effect/proc_holder/slab/hateful_manacles
slab_overlay = "hateful_manacles"
ranged_message = "<span class='neovgre_small'><i>You charge the clockwork slab with divine energy.</i>\n\
@@ -124,7 +150,7 @@
usage_tip = "You cannot reactivate Vanguard while still shielded by it."
tier = SCRIPTURE_DRIVER
primary_component = VANGUARD_COGWHEEL
sort_priority = 6
sort_priority = 7
quickbind = TRUE
quickbind_desc = "Allows you to temporarily have quickly regenerating stamina and absorb stuns. All stuns absorbed will affect you when disabled."
@@ -156,7 +182,7 @@
usage_tip = "The Compromise is very fast to invoke, and will remove holy water from the target Servant."
tier = SCRIPTURE_DRIVER
primary_component = VANGUARD_COGWHEEL
sort_priority = 7
sort_priority = 8
quickbind = TRUE
quickbind_desc = "Allows you to convert a Servant's brute, burn, and oxygen damage to half toxin damage.<br><b>Click your slab to disable.</b>"
slab_overlay = "compromise"
@@ -180,7 +206,7 @@
usage_tip = "This can't be used while on Reebe, for obvious reasons."
tier = SCRIPTURE_DRIVER
primary_component = GEIS_CAPACITOR
sort_priority = 8
sort_priority = 9
important = TRUE
quickbind = TRUE
quickbind_desc = "Returns you to Reebe."
@@ -238,7 +264,7 @@
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
primary_component = GEIS_CAPACITOR
sort_priority = 9
sort_priority = 10
important = TRUE
quickbind = TRUE
quickbind_desc = "Creates a new Clockwork Slab."
@@ -259,6 +285,6 @@
tier = SCRIPTURE_DRIVER
space_allowed = TRUE
primary_component = GEIS_CAPACITOR
sort_priority = 10
sort_priority = 11
quickbind = TRUE
quickbind_desc = "Creates a pair of Wraith Spectacles, which grant true sight but cause gradual vision loss."
@@ -0,0 +1,70 @@
#define STARGAZER_RANGE 3 //How many tiles the stargazer can see out to
#define STARGAZER_POWER 7 //How many watts will be produced per second when the stargazer sees starlight
//Stargazer: A very fragile but cheap generator that creates power from starlight.
/obj/structure/destructible/clockwork/stargazer
name = "stargazer"
desc = "A large lantern-shaped machine made of thin brass. It looks fragile."
clockwork_desc = "A lantern-shaped generator that produces power when near starlight."
icon_state = "stargazer"
unanchored_icon = "stargazer_unwrenched"
max_integrity = 40
construction_value = 5
layer = WALL_OBJ_LAYER
break_message = "<span class='warning'>The stargazer's fragile body shatters into pieces!</span>"
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
light_color = "#DAAA18"
var/star_light_star_bright = FALSE //If this stargazer can see starlight
/obj/structure/destructible/clockwork/stargazer/Initialize()
. = ..()
START_PROCESSING(SSprocessing, src)
/obj/structure/destructible/clockwork/stargazer/Destroy()
STOP_PROCESSING(SSprocessing, src)
. = ..()
/obj/structure/destructible/clockwork/stargazer/examine(mob/user)
..()
if(is_servant_of_ratvar(user))
to_chat(user, "<span class='nzcrentr_small'>Generates <b>[DisplayPower(STARGAZER_POWER)]</b> per second while viewing starlight within [STARGAZER_RANGE] tiles.</span>")
if(star_light_star_bright)
to_chat(user, "[is_servant_of_ratvar(user) ? "<span class='nzcrentr_small'>It can see starlight!</span>" : "It's shining brilliantly!"]")
/obj/structure/destructible/clockwork/stargazer/process()
star_light_star_bright = check_starlight()
if(star_light_star_bright)
adjust_clockwork_power(STARGAZER_POWER)
/obj/structure/destructible/clockwork/stargazer/update_anchored(mob/living/user, damage)
. = ..()
star_light_star_bright = check_starlight()
/obj/structure/destructible/clockwork/stargazer/proc/check_starlight()
var/old_status = star_light_star_bright
var/has_starlight
if(!anchored)
has_starlight = FALSE
else
for(var/turf/T in view(3, src))
if(isspaceturf(T))
has_starlight = TRUE
break
if(has_starlight && anchored)
var/area/A = get_area(src)
if(A.outdoors || A.map_name == "Space" || !A.blob_allowed)
has_starlight = FALSE
if(old_status != has_starlight)
if(has_starlight)
visible_message("<span class='nzcrentr_small'>[src] hums and shines brilliantly!</span>")
playsound(src, 'sound/machines/clockcult/stargazer_activate.ogg', 50, TRUE)
add_overlay("stargazer_light")
set_light(1.5, 5)
else
if(anchored) //We lost visibility somehow
visible_message("<span class='danger'>[src] flickers, and falls dark.</span>")
else
visible_message("<span class='danger'>[src] whooshes quietly as it slides into a less bulky form.</span>")
cut_overlays()
set_light(0)
return has_starlight
@@ -0,0 +1,20 @@
//Mech sensor: Activates when stepped on by a mech
/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech
name = "mech sensor"
desc = "A thin plate of brass, barely visible but clearly distinct."
clockwork_desc = "A trigger that will activate when a mech controlled by a non-servant runs across it."
max_integrity = 5
icon_state = "pressure_sensor"
alpha = 75
/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM)
if(!istype(AM,/obj/mecha/))
return
var/obj/mecha/M = AM
if(M.occupant && is_servant_of_ratvar(M.occupant))
return
audible_message("<i>*click*</i>")
playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE)
activate()
@@ -68,7 +68,14 @@
mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off
buckle_mob(squirrel, TRUE)
else
visible_message("<span class='danger'>A massive brass spike erupts from the ground!</span>")
var/obj/mecha/M = locate() in get_turf(src)
if(M)
M.take_damage(50,BRUTE,"melee")
M.visible_message("<span class='danger'>A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!</span>")
addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1)
else
visible_message("<span class='danger'>A massive brass spike erupts from the ground!</span>")
playsound(src, 'sound/machines/clockcult/brass_skewer.ogg', 75, FALSE)
icon_state = "[initial(icon_state)]_extended"
density = TRUE //Skewers are one-use only
@@ -0,0 +1,17 @@
/obj/structure/destructible/clockwork/trap/power_nullifier
name = "power nullifier"
desc = "A well hidden set of wires and connections."
clockwork_desc = "When triggered, it sets off a 3x3 emp pulse with the center suffering a stronger pulse."
icon_state = "electric_trap"
break_message = "<span class='warning'>The power nullifier sparks, then slowly crumbles to debris!</span>"
max_integrity = 40
density = FALSE
var/activated = FALSE
/obj/structure/destructible/clockwork/trap/power_nullifier/activate()
if(!activated)
activated = TRUE
empulse(get_turf(src),1,1,TRUE)
/obj/structure/destructible/clockwork/trap/power_nullifier/emp_act(var/strength=1)
activate()
+5 -5
View File
@@ -211,8 +211,6 @@
else
return FALSE
/datum/action/innate/cult/spin2win
name = "Geometer's Fury"
desc = "You draw on the power of the sword's ancient runes, spinning it wildly around you as you become immune to most attacks."
@@ -267,7 +265,6 @@
return
. = ..()
/obj/item/clothing/head/culthood
name = "ancient cultist hood"
icon_state = "culthood"
@@ -294,7 +291,6 @@
heat_protection = CHEST|GROIN|LEGS|ARMS
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
/obj/item/clothing/head/culthood/alt
name = "cultist hood"
desc = "An armored hood worn by the followers of Nar'Sie."
@@ -313,7 +309,6 @@
/obj/item/clothing/suit/cultrobes/alt/ghost
item_flags = NODROP | DROPDEL
/obj/item/clothing/head/magus
name = "magus helm"
icon_state = "magus"
@@ -529,7 +524,12 @@
"The shuttle's custodian was found washing the windows with their own blood.",
"A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh.",
"A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine.",
"An assistant was found on the shuttle.",
"A medical officer was found pouring out several blood bags onto the shuttle's instrument panels, before slitting both wrists open and screaming 'DEATH IS NOT THE END'.",
"A fuel technician was found replacing the fuel with his blood.",
"All the lights aboard the shuttle turned a crimson red before blowing out..",
"The shuttle dispatcher was found dead with bloody symbols carved into their flesh.",
"An engine turbine began leaking blood when it was powered on.",
"The shuttle's transponder is emitting the encoded message 'FEAR THE OLD BLOOD' in lieu of its assigned identification signal.")
var/message = pick_n_take(curses)
message += " The shuttle will be delayed by three minutes."
+19 -19
View File
@@ -58,18 +58,12 @@
<A href='byond://?src=[REF(src)];send=1'>Send Signal</A><BR>
<B>Frequency/Code</B> for signaler:<BR>
Frequency:
<A href='byond://?src=[REF(src)];freq=-10'>-</A>
<A href='byond://?src=[REF(src)];freq=-2'>-</A>
[format_frequency(src.frequency)]
<A href='byond://?src=[REF(src)];freq=2'>+</A>
<A href='byond://?src=[REF(src)];freq=10'>+</A><BR>
<A href='byond://?src=[REF(src)];set=freq'>Set</A><BR>
Code:
<A href='byond://?src=[REF(src)];code=-5'>-</A>
<A href='byond://?src=[REF(src)];code=-1'>-</A>
[src.code]
<A href='byond://?src=[REF(src)];code=1'>+</A>
<A href='byond://?src=[REF(src)];code=5'>+</A><BR>
<A href='byond://?src=[REF(src)];set=code'>Set</A><BR>
[t1]
</TT>"}
user << browse(dat, "window=radio")
@@ -85,17 +79,23 @@ Code:
onclose(usr, "radio")
return
if (href_list["freq"])
var/new_frequency = (frequency + text2num(href_list["freq"]))
if(new_frequency < MIN_FREE_FREQ || new_frequency > MAX_FREE_FREQ)
new_frequency = sanitize_frequency(new_frequency)
set_frequency(new_frequency)
if (href_list["set"])
if(href_list["code"])
src.code += text2num(href_list["code"])
src.code = round(src.code)
src.code = min(100, src.code)
src.code = max(1, src.code)
if(href_list["set"] == "freq")
var/new_freq = input(usr, "Input a new signalling frequency", "Remote Signaller Frequency", format_frequency(frequency)) as num|null
if(!usr.canUseTopic(src, BE_CLOSE))
return
new_freq = unformat_frequency(new_freq)
new_freq = sanitize_frequency(new_freq, TRUE)
set_frequency(new_freq)
if(href_list["set"] == "code")
var/new_code = input(usr, "Input a new signalling code", "Remote Signaller Code", code) as num|null
if(!usr.canUseTopic(src, BE_CLOSE))
return
new_code = round(new_code)
new_code = CLAMP(new_code, 1, 100)
code = new_code
if(href_list["send"])
spawn( 0 )
@@ -206,4 +206,4 @@ Code:
/obj/item/assembly/signaler/cyborg/attackby(obj/item/W, mob/user, params)
return
/obj/item/assembly/signaler/cyborg/screwdriver_act(mob/living/user, obj/item/I)
return
return
+6
View File
@@ -21,6 +21,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/last_ip
var/last_id
//Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another
var/saveprefcooldown
var/loadprefcooldown
var/savecharcooldown
var/loadcharcooldown
//game-preferences
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
var/ooccolor = null
@@ -58,6 +58,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/load_preferences()
if(!path)
return 0
if(world.time < loadprefcooldown)
if(istype(parent))
to_chat(parent, "<span class='warning'>You're attempting to load your preferences a little too fast. Wait half a second, then try again.</span>")
return 0
loadprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
if(!fexists(path))
return 0
@@ -152,6 +157,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/save_preferences()
if(!path)
return 0
if(world.time < saveprefcooldown)
if(istype(parent))
to_chat(parent, "<span class='warning'>You're attempting to save your preferences a little too fast. Wait half a second, then try again.</span>")
return 0
saveprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
var/savefile/S = new /savefile(path)
if(!S)
return 0
@@ -204,6 +214,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/load_character(slot)
if(!path)
return 0
if(world.time < loadcharcooldown) //This is before the check to see if the filepath exists to ensure that BYOND can't get hung up on read attempts when the hard drive is a little slow
if(istype(parent))
to_chat(parent, "<span class='warning'>You're attempting to load your character a little too fast. Wait half a second, then try again.</span>")
return "SLOW THE FUCK DOWN" //the reason this isn't null is to make sure that people don't have their character slots overridden by random chars if they accidentally double-click a slot
loadcharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
if(!fexists(path))
return 0
var/savefile/S = new /savefile(path)
@@ -418,6 +433,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/save_character()
if(!path)
return 0
if(world.time < savecharcooldown)
if(istype(parent))
to_chat(parent, "<span class='warning'>You're attempting to save your character a little too fast. Wait half a second, then try again.</span>")
return 0
savecharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
var/savefile/S = new /savefile(path)
if(!S)
return 0
+67 -10
View File
@@ -177,9 +177,12 @@
/obj/item/clothing/neck/petcollar
name = "pet collar"
desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule."
desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule. It seems to be made out of a polychromic material."
icon_state = "petcollar"
item_color = "petcollar"
alternate_worn_icon = 'icons/mob/neck.dmi' //Because, as it appears, the item itself is normally not directly aware of its worn overlays, so this is about the easiest way, without adding a new var.
hasprimary = TRUE
primary_color = "#00BBBB"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar
var/tagname = null
@@ -187,21 +190,56 @@
tagname = copytext(sanitize(input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot") as null|text),1,MAX_NAME_LEN)
name = "[initial(name)] - [tagname]"
/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file)
. = ..()
if(hasprimary | hassecondary | hastertiary)
if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
if(hasprimary) //checks if overlays are enabled
var/mutable_appearance/primary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-primary") //automagical sprite selection
primary_worn.color = primary_color //colors the overlay
. += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite
if(hassecondary)
var/mutable_appearance/secondary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-secondary")
secondary_worn.color = secondary_color
. += secondary_worn
if(hastertiary)
var/mutable_appearance/tertiary_worn = mutable_appearance(alternate_worn_icon, "[item_color]-tertiary")
tertiary_worn.color = tertiary_color
. += tertiary_worn
/obj/item/clothing/neck/petcollar/leather
name = "leather pet collar"
icon_state = "leathercollar"
item_color = "leathercollar"
hasprimary = TRUE
hassecondary = TRUE
primary_color = "#222222"
secondary_color = "#888888"
/obj/item/clothing/neck/petcollar/choker
desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel."
name = "choker"
icon_state = "choker"
item_color = "choker"
hasprimary = TRUE
primary_color = "#222222"
/obj/item/clothing/neck/petcollar/locked
name = "locked collar"
desc = "A collar that has a small lock on it to keep it from being removed."
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar/locked
var/lock = FALSE
/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/key/collar, mob/user, params)
if(lock != FALSE)
to_chat(user, "<span class='warning'>With a click the collar unlocks!</span>")
lock = FALSE
item_flags = NONE
else
to_chat(user, "<span class='warning'>With a click the collar locks!</span>")
lock = TRUE
item_flags = NODROP
/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/K, mob/user, params)
if(istype(K, /obj/item/key/collar))
if(lock != FALSE)
to_chat(user, "<span class='warning'>With a click the collar unlocks!</span>")
lock = FALSE
else
to_chat(user, "<span class='warning'>With a click the collar locks!</span>")
lock = TRUE
return
/obj/item/clothing/neck/petcollar/locked/attack_hand(mob/user)
@@ -210,6 +248,25 @@
return
..()
/obj/item/clothing/neck/petcollar/locked/leather
name = "leather pet collar"
icon_state = "leathercollar"
item_color = "leathercollar"
hasprimary = TRUE
hassecondary = TRUE
primary_color = "#222222"
secondary_color = "#888888"
/obj/item/clothing/neck/petcollar/locked/choker
name = "choker"
desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel."
icon_state = "choker"
item_color = "choker"
hasprimary = TRUE
primary_color = "#222222"
/obj/item/key/collar
name = "Collar Key"
desc = "A key for a tiny lock on a collar or bag."
-6
View File
@@ -41,12 +41,6 @@
if(tauric == TRUE)
center = TRUE
dimension_x = 64
/*
else if(H.dna.features["taur"] == "Horse" || "Cow")
taurmode = HOOF_TAURIC //tweak this for when the exotics get their own suits, if ever.
center = TRUE
dimension_x = 64
*/
else
taurmode = NOT_TAURIC
if(tauric == TRUE)
-1
View File
@@ -23,7 +23,6 @@
item_state = "armoralt"
blood_overlay_type = "armor"
dog_fashion = /datum/dog_fashion/back
tauric = TRUE //Citadel Add for tauric hardsuits
/obj/item/clothing/suit/armor/vest/alt
desc = "A Type I armored vest that provides decent protection against most types of damage."
+1
View File
@@ -28,6 +28,7 @@
CAT_PIZZA,
CAT_SALAD,
CAT_SANDWICH,
CAT_SUSHI,
CAT_SOUP,
CAT_SPAGHETTI),
CAT_CLOTHING) //Clothing subcategories
+41 -1
View File
@@ -189,6 +189,16 @@
time = 40
category = CAT_ROBOT
/datum/crafting_recipe/Firebot
name = "Firebot"
result = /mob/living/simple_animal/bot/firebot
reqs = list(/obj/item/extinguisher = 1,
/obj/item/bodypart/r_arm/robot = 1,
/obj/item/assembly/prox_sensor = 1,
/obj/item/clothing/head/hardhat/red = 1)
time = 40
category = CAT_ROBOT
/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
name = "Pneumatic Cannon"
result = /obj/item/pneumatic_cannon/ghetto
@@ -435,6 +445,15 @@
result = /obj/item/extendohand
category = CAT_MISC
/datum/crafting_recipe/bluespacehonker
name = "Bluespace Bike horn"
result = /obj/item/bikehorn/bluespacehonker
time = 10
reqs = list(/obj/item/stack/ore/bluespace_crystal = 1,
/obj/item/toy/crayon/blue = 1,
/obj/item/bikehorn = 1)
category = CAT_MISC
/datum/crafting_recipe/chemical_payload
name = "Chemical Payload (C4)"
result = /obj/item/bombcore/chemical
@@ -686,6 +705,16 @@
reqs = list(/obj/item/bedsheet = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/briefcase
name = "Hand made Briefcase"
result = /obj/item/storage/briefcase/crafted
time = 35
tools = list(TOOL_WIRECUTTER)
reqs = list(/obj/item/stack/sheet/cardboard = 1,
/obj/item/stack/sheet/cloth = 2,
/obj/item/stack/sheet/leather = 5)
category = CAT_CLOTHING
/datum/crafting_recipe/aitater
name = "intelliTater"
result = /obj/item/aicard/aitater
@@ -706,6 +735,17 @@
name = "Improvised Jetpack"
result = /obj/item/tank/jetpack/improvised
time = 30
reqs = list(/obj/item/tank/internals/oxygen/red = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30)//red oxygen tank so it looks right
reqs = list(/obj/item/tank/internals/oxygen = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30)//red oxygen tank so it looks right
category = CAT_MISC
tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
/datum/crafting_recipe/goldenbox
name = "Gold Plated Toolbox"
result = /obj/item/storage/toolbox/gold_fake
reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
/obj/item/stack/cable_coil = 10,
/obj/item/stack/sheet/mineral/gold = 1,
/obj/item/stock_parts/cell = 1,
/datum/reagent/water = 15)
time = 40
category = CAT_MISC
+2 -6
View File
@@ -48,8 +48,6 @@
if(!shuttle_spawned)
spawn_shuttle()
/datum/round_event/pirates/start()
if(!paid_off && !shuttle_spawned)
spawn_shuttle()
@@ -150,7 +148,6 @@
to_chat(user,"<span class='notice'>You retrieve the siphoned credits!</span>")
credits_stored = 0
/obj/machinery/shuttle_scrambler/proc/send_notification()
priority_announce("Data theft signal detected, source registered on local gps units.")
@@ -222,8 +219,7 @@
suit_type = /obj/item/clothing/suit/space
helmet_type = /obj/item/clothing/head/helmet/space
mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/tank/internals/oxygen
storage_type = /obj/item/tank/jetpack/void
/obj/machinery/loot_locator
name = "Booty Locator"
@@ -454,4 +450,4 @@
/datum/export/pirate/cash/get_amount(obj/O)
var/obj/item/stack/spacecash/C = O
return ..() * C.amount * C.value
return ..() * C.amount * C.value
+15 -4
View File
@@ -47,7 +47,16 @@
"hair_dye",
"sugar",
"white_glitter",
"growthserum"
"growthserum",
"cornoil",
"uranium",
"carpet",
"firefighting_foam",
"semen",
"femcum",
"tearjuice",
"strange_reagent"
)
//needs to be chemid unit checked at some point
@@ -58,8 +67,10 @@
endWhen = rand(120, 180)
for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/temp_vent in GLOB.machines)
var/turf/T = get_turf(temp_vent)
if(T && is_station_level(T.z) && !temp_vent.welded)
var/area/A = T.loc
if(T && is_station_level(T.z) && !temp_vent.welded && !A.safe)
vents += temp_vent
if(!vents.len)
return kill()
@@ -87,8 +98,8 @@
else
R.add_reagent(pick(saferChems), reagentsAmount)
var/datum/effect_system/smoke_spread/chem/C = new
C.set_up(R,16,T,TRUE)
var/datum/effect_system/smoke_spread/chem/smoke_machine/C = new
C.set_up(R,16,1,T)
C.start()
playsound(T, 'sound/effects/smoke.ogg', 50, 1, -3)
@@ -316,7 +316,9 @@ h1.alert, h2.alert {color: #000000;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
.nicegreen {color: #14a833;}
.nicegreen {color: #14a833;}
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
.shadowling {color: #3b2769;}
.cult {color: #960000;}
@@ -643,6 +643,11 @@
icon_state = "setup_small_pda"
desc = "It's a case, for building small electronics with. This one resembles a PDA."
/obj/item/electronic_assembly/dildo
name = "type-g electronic assembly"
icon_state = "setup_dildo_medium"
desc = "It's a case, for building small electronics with. This one has a phallic design."
/obj/item/electronic_assembly/small
name = "electronic device"
icon_state = "setup_device"
@@ -674,6 +679,11 @@
icon_state = "setup_device_box"
desc = "It's a case, for building tiny-sized electronics with. This one has a boxy design."
/obj/item/electronic_assembly/small/dildo
name = "type-f electronic device"
icon_state = "setup_dildo_small"
desc = "It's a case, for building tiny-sized electronics with. This one has a phallic design."
/obj/item/electronic_assembly/medium
name = "electronic mechanism"
icon_state = "setup_medium"
@@ -714,6 +724,12 @@
icon_state = "setup_medium_radio"
desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio."
/obj/item/electronic_assembly/medium/dildo
name = "type-g electronic mechanism"
icon_state = "setup_dildo_large"
desc = "It's a case, for building medium-sized electronics with. This one has a phallic design."
/obj/item/electronic_assembly/large
name = "electronic machine"
icon_state = "setup_large"
@@ -25,7 +25,9 @@
"green" = COLOR_ASSEMBLY_GREEN,
"light blue" = COLOR_ASSEMBLY_LBLUE,
"blue" = COLOR_ASSEMBLY_BLUE,
"purple" = COLOR_ASSEMBLY_PURPLE
"purple" = COLOR_ASSEMBLY_PURPLE,
"pink" = COLOR_ASSEMBLY_PINK,
"custom" = COLOR_ASSEMBLY_WHITE
)
/obj/item/integrated_electronics/detailer/Initialize()
@@ -43,6 +45,9 @@
if(!color_list[color_choice])
return
if(!in_range(src, user))
return
detail_color = color_list[color_choice]
return
if(color_choice == "custom")
detail_color = input(user,"","Choose Color",detail_color) as color|null
else
detail_color = color_list[color_choice]
update_icon()
@@ -142,13 +142,14 @@
/obj/item/integrated_circuit/converter/concatenator
name = "concatenator"
desc = "This can join up to 8 strings together to get one big string."
desc = "This can join up to 8 strings together to get a string with a maximum of 512 characters."
complexity = 4
inputs = list()
outputs = list("result" = IC_PINTYPE_STRING)
activators = list("concatenate" = IC_PINTYPE_PULSE_IN, "on concatenated" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
var/number_of_pins = 8
var/max_string_length = 512
/obj/item/integrated_circuit/converter/concatenator/Initialize()
for(var/i = 1 to number_of_pins)
@@ -157,26 +158,46 @@
/obj/item/integrated_circuit/converter/concatenator/do_work()
var/result = null
var/spamprotection
for(var/k in 1 to inputs.len)
var/I = get_pin_data(IC_INPUT, k)
if(!isnull(I))
if((result ? length(result) : 0) + length(I) > max_string_length)
spamprotection = (result ? length(result) : 0) + length(I)
break
result = result + I
if(spamprotection >= max_string_length*1.75 && assembly)
if(assembly.fingerprintslast)
var/mob/M = get_mob_by_key(assembly.fingerprintslast)
var/more = ""
if(M)
more = "[ADMIN_LOOKUPFLW(M)] "
message_admins("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. Assembly last touched by [more ? more : assembly.fingerprintslast].")
investigate_log("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. Assembly last touched by [assembly.fingerprintslast].", INVESTIGATE_CIRCUIT)
else
message_admins("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. No associated key.")
investigate_log("A concatenator circuit has greatly exceeded its [max_string_length] character limit with a total of [spamprotection] characters, and has been deleted. No associated key.", INVESTIGATE_CIRCUIT)
qdel(assembly)
return
set_pin_data(IC_OUTPUT, 1, result)
push_data()
activate_pin(2)
/obj/item/integrated_circuit/converter/concatenator/small
name = "small concatenator"
desc = "This can join up to 4 strings together to get one big string."
desc = "This can join up to 4 strings together to get a string with a maximum of 256 characters."
complexity = 2
number_of_pins = 4
max_string_length = 256
/obj/item/integrated_circuit/converter/concatenator/large
name = "large concatenator"
desc = "This can join up to 16 strings together to get one very big string."
desc = "This can join up to 16 strings together to get a string with a maximum of 1024 characters."
complexity = 6
number_of_pins = 16
max_string_length = 1024
/obj/item/integrated_circuit/converter/separator
name = "separator"
@@ -1,139 +1,6 @@
/obj/item/integrated_circuit/manipulation
category_text = "Manipulation"
/obj/item/integrated_circuit/manipulation/weapon_firing
name = "weapon firing mechanism"
desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
extended_desc = "The firing mechanism can slot in any energy weapon. \
The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
hand, you will need to use an assembly that is a gun."
complexity = 20
w_class = WEIGHT_CLASS_SMALL
size = 3
inputs = list(
"target X rel" = IC_PINTYPE_NUMBER,
"target Y rel" = IC_PINTYPE_NUMBER,
"mode" = IC_PINTYPE_BOOLEAN
)
outputs = list("reference to gun" = IC_PINTYPE_REF)
activators = list(
"fire" = IC_PINTYPE_PULSE_IN
)
var/obj/item/gun/energy/installed_gun = null
spawn_flags = IC_SPAWN_RESEARCH
action_flags = IC_ACTION_COMBAT
power_draw_per_use = 0
ext_cooldown = 1
var/mode = FALSE
var/stun_projectile = null //stun mode projectile type
var/stun_projectile_sound
var/lethal_projectile = null //lethal mode projectile type
var/lethal_projectile_sound
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy()
qdel(installed_gun)
return ..()
/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user)
if(istype(O, /obj/item/gun/energy))
var/obj/item/gun/gun = O
if(installed_gun)
to_chat(user, "<span class='warning'>There's already a weapon installed.</span>")
return
user.transferItemToLoc(gun,src)
installed_gun = gun
var/list/gun_properties = gun.get_turret_properties()
to_chat(user, "<span class='notice'>You slide \the [gun] into the firing mechanism.</span>")
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
stun_projectile = gun_properties["stun_projectile"]
stun_projectile_sound = gun_properties["stun_projectile_sound"]
lethal_projectile = gun_properties["lethal_projectile"]
lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
if(gun_properties["shot_delay"])
cooldown_per_use = gun_properties["shot_delay"]*10
if(cooldown_per_use<30)
cooldown_per_use = 30
if(gun_properties["reqpower"])
power_draw_per_use = gun_properties["reqpower"]
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
push_data()
else
..()
/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user)
if(installed_gun)
installed_gun.forceMove(drop_location())
to_chat(user, "<span class='notice'>You slide \the [installed_gun] out of the firing mechanism.</span>")
size = initial(size)
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
installed_gun = null
set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
push_data()
else
to_chat(user, "<span class='notice'>There's no weapon to remove from the mechanism.</span>")
/obj/item/integrated_circuit/manipulation/weapon_firing/do_work()
if(!installed_gun || !installed_gun.handle_pins())
return
if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
return
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
push_data()
var/datum/integrated_io/xo = inputs[1]
var/datum/integrated_io/yo = inputs[2]
var/datum/integrated_io/mode1 = inputs[3]
mode = mode1.data
if(assembly)
if(isnum(xo.data))
xo.data = round(xo.data, 1)
if(isnum(yo.data))
yo.data = round(yo.data, 1)
var/turf/T = get_turf(assembly)
var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
assembly.visible_message("<span class='danger'>[assembly] fires [installed_gun]!</span>")
shootAt(locate(target_x, target_y, T.z))
/obj/item/integrated_circuit/manipulation/weapon_firing/proc/shootAt(turf/target)
var/turf/T = get_turf(src)
var/turf/U = target
if(!istype(T) || !istype(U))
return
if(!installed_gun.cell)
return
if(!installed_gun.cell.charge)
return
var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
if(installed_gun.cell.charge < shot.e_cost)
return
if(!shot)
return
update_icon()
var/obj/item/projectile/A
if(!mode)
A = new stun_projectile(T)
playsound(loc, stun_projectile_sound, 75, 1)
else
A = new lethal_projectile(T)
playsound(loc, lethal_projectile_sound, 75, 1)
installed_gun.cell.use(shot.e_cost)
//Shooting Code:
A.preparePixelProjectile(target, src)
A.fire()
log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
return A
/obj/item/integrated_circuit/manipulation/locomotion
name = "locomotion circuit"
desc = "This allows a machine to move in a given direction."
@@ -171,80 +38,6 @@
return FALSE
return FALSE
/obj/item/integrated_circuit/manipulation/grenade
name = "grenade primer"
desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
Beware: Once primed, there is no aborting the process!"
icon_state = "grenade"
complexity = 30
cooldown_per_use = 10
inputs = list("detonation time" = IC_PINTYPE_NUMBER)
outputs = list()
activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_RESEARCH
action_flags = IC_ACTION_COMBAT
var/obj/item/grenade/attached_grenade
var/pre_attached_grenade_type
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
/obj/item/integrated_circuit/manipulation/grenade/Initialize()
. = ..()
if(pre_attached_grenade_type)
var/grenade = new pre_attached_grenade_type(src)
attach_grenade(grenade)
/obj/item/integrated_circuit/manipulation/grenade/Destroy()
if(attached_grenade && !attached_grenade.active)
attached_grenade.forceMove(loc)
detach_grenade()
return ..()
/obj/item/integrated_circuit/manipulation/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
if(istype(G))
if(attached_grenade)
to_chat(user, "<span class='warning'>There is already a grenade attached!</span>")
else if(user.transferItemToLoc(G,src))
user.visible_message("<span class='warning'>\The [user] attaches \a [G] to \the [src]!</span>", "<span class='notice'>You attach \the [G] to \the [src].</span>")
attach_grenade(G)
G.forceMove(src)
else
return ..()
/obj/item/integrated_circuit/manipulation/grenade/attack_self(var/mob/user)
if(attached_grenade)
user.visible_message("<span class='warning'>\The [user] removes \an [attached_grenade] from \the [src]!</span>", "<span class='notice'>You remove \the [attached_grenade] from \the [src].</span>")
user.put_in_hands(attached_grenade)
detach_grenade()
else
return ..()
/obj/item/integrated_circuit/manipulation/grenade/do_work()
if(attached_grenade && !attached_grenade.active)
var/datum/integrated_io/detonation_time = inputs[1]
var/dt
if(isnum(detonation_time.data) && detonation_time.data > 0)
dt = CLAMP(detonation_time.data, 1, 12)*10
else
dt = 15
addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
var/atom/holder = loc
message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
// These procs do not relocate the grenade, that's the callers responsibility
/obj/item/integrated_circuit/manipulation/grenade/proc/attach_grenade(var/obj/item/grenade/G)
attached_grenade = G
G.forceMove(src)
desc += " \An [attached_grenade] is attached to it!"
/obj/item/integrated_circuit/manipulation/grenade/proc/detach_grenade()
if(!attached_grenade)
return
attached_grenade.forceMove(drop_location())
attached_grenade = null
desc = initial(desc)
/obj/item/integrated_circuit/manipulation/plant_module
name = "plant manipulation module"
desc = "Used to uproot weeds and harvest/plant trays."
@@ -478,7 +271,7 @@
/obj/item/integrated_circuit/manipulation/thrower
name = "thrower"
desc = "A compact launcher to throw things from inside or nearby tiles."
desc = "A compact launcher to throw things from inside or nearby tiles at a low enough velocity not to harm someone."
extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
The 'fire' activator will cause the mechanism to attempt to throw objects at the coordinates, if possible. Note that the \
projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
@@ -544,7 +337,7 @@
A.embedding = list("embed_chance" = 0)
//throw it
assembly.visible_message("<span class='danger'>[assembly] has thrown [A]!</span>")
log_attack("[assembly] [REF(assembly)] has thrown [A].")
log_attack("[assembly] [REF(assembly)] has thrown [A] with non-lethal force.")
A.forceMove(drop_location())
A.throw_at(locate(x_abs, y_abs, T.z), range, 3, , , , CALLBACK(src, .proc/post_throw, A))
@@ -813,4 +606,7 @@
set_pin_data(IC_OUTPUT, 1, assembly.detail_color)
push_data()
activate_pin(3)
activate_pin(3)
@@ -548,9 +548,12 @@
desc = "Unlike most electronics, creating smoke is completely intentional."
icon_state = "smoke"
extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
into the smoke clouds when activated. The reagents are consumed when the smoke is made."
into the smoke clouds when activated. The reagents are consumed when the smoke is made. Requires at least 10 units of reagents to generate smoke."
ext_cooldown = 1
volume = 100
container_type = OPENCONTAINER
complexity = 20
cooldown_per_use = 1 SECONDS
inputs = list()
@@ -573,6 +576,7 @@
if(changetype == ADD_REAGENT)
notified = FALSE
push_vol()
/obj/item/integrated_circuit/reagent/smoke/do_work(ord)
switch(ord)
if(1)
@@ -598,9 +602,10 @@
name = "integrated extinguisher"
desc = "This circuit sprays any of its contents out like an extinguisher."
icon_state = "injector"
extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher."
extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher. Requires at least 10 units of reagents to work."
volume = 30
container_type = OPENCONTAINER
complexity = 20
cooldown_per_use = 6 SECONDS
@@ -631,7 +636,7 @@
/obj/item/integrated_circuit/reagent/extinguisher/do_work()
//Check if enough volume
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
if(!reagents || reagents.total_volume < 5 || busy)
if(!reagents || reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS || busy)
push_data()
activate_pin(3)
return
@@ -0,0 +1,343 @@
/obj/item/integrated_circuit/weaponized
category_text = "Weaponized"
/obj/item/integrated_circuit/weaponized/weapon_firing
name = "weapon firing mechanism"
desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
extended_desc = "The firing mechanism can slot in any energy weapon. \
The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
hand, you will need to use an assembly that is a gun."
complexity = 20
w_class = WEIGHT_CLASS_SMALL
size = 3
inputs = list(
"target X rel" = IC_PINTYPE_NUMBER,
"target Y rel" = IC_PINTYPE_NUMBER,
"mode" = IC_PINTYPE_BOOLEAN
)
outputs = list("reference to gun" = IC_PINTYPE_REF)
activators = list(
"fire" = IC_PINTYPE_PULSE_IN
)
var/obj/item/gun/energy/installed_gun = null
spawn_flags = IC_SPAWN_RESEARCH
action_flags = IC_ACTION_COMBAT
power_draw_per_use = 0
ext_cooldown = 1
var/mode = FALSE
var/stun_projectile = null //stun mode projectile type
var/stun_projectile_sound
var/lethal_projectile = null //lethal mode projectile type
var/lethal_projectile_sound
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
/obj/item/integrated_circuit/weaponized/weapon_firing/Destroy()
qdel(installed_gun)
return ..()
/obj/item/integrated_circuit/weaponized/weapon_firing/attackby(var/obj/O, var/mob/user)
if(istype(O, /obj/item/gun/energy))
var/obj/item/gun/gun = O
if(installed_gun)
to_chat(user, "<span class='warning'>There's already a weapon installed.</span>")
return
user.transferItemToLoc(gun,src)
installed_gun = gun
var/list/gun_properties = gun.get_turret_properties()
to_chat(user, "<span class='notice'>You slide \the [gun] into the firing mechanism.</span>")
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
stun_projectile = gun_properties["stun_projectile"]
stun_projectile_sound = gun_properties["stun_projectile_sound"]
lethal_projectile = gun_properties["lethal_projectile"]
lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
if(gun_properties["shot_delay"])
cooldown_per_use = gun_properties["shot_delay"]*10
if(cooldown_per_use<30)
cooldown_per_use = 30
if(gun_properties["reqpower"])
power_draw_per_use = gun_properties["reqpower"]
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
push_data()
else
..()
/obj/item/integrated_circuit/weaponized/weapon_firing/attack_self(var/mob/user)
if(installed_gun)
installed_gun.forceMove(drop_location())
to_chat(user, "<span class='notice'>You slide \the [installed_gun] out of the firing mechanism.</span>")
size = initial(size)
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
installed_gun = null
set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
push_data()
else
to_chat(user, "<span class='notice'>There's no weapon to remove from the mechanism.</span>")
/obj/item/integrated_circuit/weaponized/weapon_firing/do_work()
if(!installed_gun || !installed_gun.handle_pins())
return
if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
return
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
push_data()
var/datum/integrated_io/xo = inputs[1]
var/datum/integrated_io/yo = inputs[2]
var/datum/integrated_io/mode1 = inputs[3]
mode = mode1.data
if(assembly)
if(isnum(xo.data))
xo.data = round(xo.data, 1)
if(isnum(yo.data))
yo.data = round(yo.data, 1)
var/turf/T = get_turf(assembly)
var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
assembly.visible_message("<span class='danger'>[assembly] fires [installed_gun]!</span>")
shootAt(locate(target_x, target_y, T.z))
/obj/item/integrated_circuit/weaponized/weapon_firing/proc/shootAt(turf/target)
var/turf/T = get_turf(src)
var/turf/U = target
if(!istype(T) || !istype(U))
return
if(!installed_gun.cell)
return
if(!installed_gun.cell.charge)
return
var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
if(installed_gun.cell.charge < shot.e_cost)
return
if(!shot)
return
update_icon()
var/obj/item/projectile/A
if(!mode)
A = new stun_projectile(T)
playsound(loc, stun_projectile_sound, 75, 1)
else
A = new lethal_projectile(T)
playsound(loc, lethal_projectile_sound, 75, 1)
installed_gun.cell.use(shot.e_cost)
//Shooting Code:
A.preparePixelProjectile(target, src)
A.fire()
log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
return A
/obj/item/integrated_circuit/weaponized/grenade
name = "grenade primer"
desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
Beware: Once primed, there is no aborting the process!"
icon_state = "grenade"
complexity = 30
cooldown_per_use = 10
inputs = list("detonation time" = IC_PINTYPE_NUMBER)
outputs = list()
activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_RESEARCH
action_flags = IC_ACTION_COMBAT
var/obj/item/grenade/attached_grenade
var/pre_attached_grenade_type
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
/obj/item/integrated_circuit/weaponized/grenade/Initialize()
. = ..()
if(pre_attached_grenade_type)
var/grenade = new pre_attached_grenade_type(src)
attach_grenade(grenade)
/obj/item/integrated_circuit/weaponized/grenade/Destroy()
if(attached_grenade && !attached_grenade.active)
attached_grenade.forceMove(loc)
detach_grenade()
return ..()
/obj/item/integrated_circuit/weaponized/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
if(istype(G))
if(attached_grenade)
to_chat(user, "<span class='warning'>There is already a grenade attached!</span>")
else if(user.transferItemToLoc(G,src))
user.visible_message("<span class='warning'>\The [user] attaches \a [G] to \the [src]!</span>", "<span class='notice'>You attach \the [G] to \the [src].</span>")
attach_grenade(G)
G.forceMove(src)
else
return ..()
/obj/item/integrated_circuit/weaponized/grenade/attack_self(var/mob/user)
if(attached_grenade)
user.visible_message("<span class='warning'>\The [user] removes \an [attached_grenade] from \the [src]!</span>", "<span class='notice'>You remove \the [attached_grenade] from \the [src].</span>")
user.put_in_hands(attached_grenade)
detach_grenade()
else
return ..()
/obj/item/integrated_circuit/weaponized/grenade/do_work()
if(attached_grenade && !attached_grenade.active)
var/datum/integrated_io/detonation_time = inputs[1]
var/dt
if(isnum(detonation_time.data) && detonation_time.data > 0)
dt = CLAMP(detonation_time.data, 1, 12)*10
else
dt = 15
addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
var/atom/holder = loc
message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
// These procs do not relocate the grenade, that's the callers responsibility
/obj/item/integrated_circuit/weaponized/grenade/proc/attach_grenade(var/obj/item/grenade/G)
attached_grenade = G
G.forceMove(src)
desc += " \An [attached_grenade] is attached to it!"
/obj/item/integrated_circuit/weaponized/grenade/proc/detach_grenade()
if(!attached_grenade)
return
attached_grenade.forceMove(drop_location())
attached_grenade = null
desc = initial(desc)
/obj/item/integrated_circuit/weaponized/air_cannon
name = "pneumatic cannon"
desc = "A compact pneumatic cannon to throw things from inside or nearby tiles at a high enough velocity to cause damage. Requires air from a canister to fire."
extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
The 'fire' activator will cause the mechanism to attempt to launch objects at the coordinates, if possible. Note that the \
projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
must also be a gun if you wish to launch something while the assembly is in hand."
complexity = 75
w_class = WEIGHT_CLASS_SMALL
size = 4
cooldown_per_use = 30
ext_cooldown = 15
inputs = list(
"target X rel" = IC_PINTYPE_NUMBER,
"target Y rel" = IC_PINTYPE_NUMBER,
"projectile" = IC_PINTYPE_REF,
"canister" = IC_PINTYPE_REF
)
outputs = list()
activators = list(
"fire" = IC_PINTYPE_PULSE_IN
)
spawn_flags = IC_SPAWN_RESEARCH
action_flags = IC_ACTION_COMBAT
power_draw_per_use = 50
var/gas_per_throw = 6
/obj/item/integrated_circuit/weaponized/air_cannon/do_work()
var/max_w_class = assembly.w_class
var/target_x_rel = round(get_pin_data(IC_INPUT, 1))
var/target_y_rel = round(get_pin_data(IC_INPUT, 2))
var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item)
var/obj/item/integrated_circuit/atmospherics/AT = get_pin_data_as_type(IC_INPUT, 4, /obj/item/integrated_circuit/atmospherics)
if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve))
return
if(!AT || !AT.air_contents)
return
if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun.
return
if(max_w_class && (A.w_class > max_w_class))
return
if(!assembly.can_fire_equipped && ishuman(assembly.loc))
return
// Is the target inside the assembly or close to it?
if(!check_target(A, exclude_components = TRUE))
return
var/turf/T = get_turf(get_object())
if(!T)
return
// If the item is in mob's inventory, try to remove it from there.
if(ismob(A.loc))
var/mob/living/M = A.loc
if(!M.temporarilyRemoveItemFromInventory(A))
return
var/datum/gas_mixture/source_air = AT.return_air()
var/datum/gas_mixture/target_air = T.return_air()
if(!source_air || !target_air)
return
var/datum/gas_mixture/removed = source_air.remove(gas_per_throw)
if(!removed)
return
target_air.merge(removed)
// If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it.
var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc
var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx)
var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy)
var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1)
assembly.visible_message("<span class='danger'>\The [assembly] has thrown [A]!</span>")
log_attack("[assembly] [REF(assembly)] has thrown [A] with lethal force.")
A.forceMove(drop_location())
A.throw_at(locate(x_abs, y_abs, T.z), range, 3)
air_update_turf()
// If the item came from a grabber now we can update the outputs since we've thrown it.
if(istype(G))
G.update_outputs()
/obj/item/integrated_circuit/weaponized/stun
name = "electronic stun module"
desc = "Used to stun a target holding the device via electricity."
icon_state = "power_relay"
extended_desc = "Attempts to stun the holder of this device, with the strength input being the strength of the stun, from 1 to 70."
complexity = 60
size = 4
inputs = list("strength" = IC_PINTYPE_NUMBER)
activators = list("stun" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
power_draw_per_use = 2000
cooldown_per_use = 50
ext_cooldown = 25
/obj/item/integrated_circuit/weaponized/stun/do_work()
var/stunforce = CLAMP(get_pin_data(IC_INPUT, 1),1,70)
var/mob/living/L = assembly.loc
if(attempt_stun(L,stunforce))
activate_pin(2)
else
activate_pin(3)
/obj/item/integrated_circuit/weaponized/proc/attempt_stun(var/mob/living/L,var/stunforce = 70) //Copied from stunbaton code.
if(!L || !isliving(L))
return 0
L.Knockdown(stunforce)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
message_admins("stunned someone with an assembly. Last touches: Assembly: [assembly.fingerprintslast] Circuit: [fingerprintslast]")
L.visible_message("<span class='danger'>\The [assembly] has stunned \the [L] with \the [src]!</span>", "<span class='userdanger'>\The [assembly] has stunned you with \the [src]!</span>")
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.forcesay(GLOB.hit_appends)
return 1
@@ -230,7 +230,7 @@
desc = "A wing ripped from a watcher. Suitable as a trophy for a kinetic crusher."
icon_state = "watcher_wing"
denied_type = /obj/item/crusher_trophy/watcher_wing
bonus_value = 5
bonus_value = 10
/obj/item/crusher_trophy/watcher_wing/effect_desc()
return "mark detonation to prevent certain creatures from using certain attacks for <b>[bonus_value*0.1]</b> second\s"
+48 -16
View File
@@ -300,6 +300,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else
if(C.client)
C.canbearoused = C.client.prefs.arousable
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(NOGENITALS in H.dna.species.species_traits)
H.give_genitals(TRUE) //call the clean up proc to delete anything on the mob then return.
// EDIT ENDS
/datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
@@ -756,7 +761,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!forced_colour)
switch(S.color_src)
if(SKINTONE)
accessory_overlay.color = skintone2hex(H.skin_tone)
accessory_overlay.color = "#[skintone2hex(H.skin_tone)]"
if(MUTCOLORS)
if(fixed_mut_color)
accessory_overlay.color = "#[fixed_mut_color]"
@@ -1451,25 +1456,52 @@ GLOBAL_LIST_EMPTY(roundstart_races)
target.forcesay(GLOB.hit_appends)
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
// CITADEL EDIT slap mouthy gits
var/aim_for_mouth = user.zone_selected == "mouth"
var/target_on_help_and_unarmed = target.a_intent == INTENT_HELP && !target.get_active_held_item()
// CITADEL EDIT slap mouthy gits and booty
var/aim_for_mouth = user.zone_selected == "mouth"
var/target_on_help = target.a_intent == INTENT_HELP
var/target_aiming_for_mouth = target.zone_selected == "mouth"
var/target_restrained = target.restrained()
if(aim_for_mouth && ( target_on_help_and_unarmed || target_restrained || target_aiming_for_mouth))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
user.visible_message("<span class='danger'>[user] slaps [target] in the face!</span>",
"<span class='notice'>You slap [target] in the face! </span>",\
"You hear a slap.")
stop_wagging_tail(target)
return FALSE
else if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
to_chat(user, "<span class='warning'>You're too exhausted.</span>")
return FALSE
else if(target.check_block()) //END EDIT
var/same_dir = (target.dir & user.dir)
var/aim_for_groin = user.zone_selected == "groin"
var/target_aiming_for_groin = target.zone_selected == "groin"
if(target.check_block()) //END EDIT
target.visible_message("<span class='warning'>[target] blocks [user]'s disarm attempt!</span>")
return 0
if(attacker_style && attacker_style.disarm_act(user,target))
else if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)
to_chat(user, "<span class='warning'>You're too exhausted!</span>")
return FALSE
else if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
user.visible_message(
"<span class='danger'>[user] slaps [target] in the face!</span>",
"<span class='notice'>You slap [user == target ? "yourself" : target] in the face! </span>",\
"You hear a slap."
)
if (!target.has_trait(TRAIT_NYMPHO))
stop_wagging_tail(target)
user.do_attack_animation(target, ATTACK_EFFECT_FACE_SLAP)
user.adjustStaminaLossBuffered(3)
return FALSE
else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
user.visible_message(
"<span class='danger'>[user] slaps [target]'s ass!</span>",
"<span class='notice'>You slap [user == target ? "your" : target + "'s"] ass! </span>",\
"You hear a slap."
)
if (target.canbearoused)
target.adjustArousalLoss(5)
if (target.getArousalLoss() >= 100 && ishuman(target) && target.has_trait(TRAIT_NYMPHO) && target.has_dna())
target.mob_climax(forced_climax=TRUE)
if (!target.has_trait(TRAIT_NYMPHO))
stop_wagging_tail(target)
user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP)
user.adjustStaminaLossBuffered(3)
return FALSE
else if(attacker_style && attacker_style.disarm_act(user,target))
return 1
else
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
@@ -3,7 +3,7 @@
id = "abductor"
say_mod = "gibbers"
sexes = FALSE
species_traits = list(NOBLOOD,NOEYES)
species_traits = list(NOBLOOD,NOEYES,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NOGUNS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutanttongue = /obj/item/organ/tongue/abductor
var/scientist = FALSE // vars to not pollute spieces list with castes
@@ -2,7 +2,7 @@
name = "Android"
id = "android"
say_mod = "states"
species_traits = list(NOBLOOD)
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT)
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
meat = null
@@ -15,6 +15,6 @@
attack_sound = 'sound/weapons/resonator_blast.ogg'
blacklisted = 1
use_skintones = 0
species_traits = list(NOBLOOD,EYECOLOR)
species_traits = list(NOBLOOD,EYECOLOR,NOGENITALS)
inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
sexes = 0
@@ -2,7 +2,7 @@
// Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck.
name = "Golem"
id = "iron golem"
species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR)
species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
mutant_organs = list(/obj/item/organ/adamantine_resonator)
@@ -9,7 +9,7 @@
nojumpsuit = TRUE
say_mod = "poofs" //what does a mushroom sound like
species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR)
species_traits = list(MUTCOLORS, NOEYES, NO_UNDERWEAR,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_NOBREATH)
speedmod = 1.5 //faster than golems but not by much
@@ -4,7 +4,7 @@
say_mod = "rattles"
sexes = 0
meat = /obj/item/stack/sheet/mineral/plasma
species_traits = list(NOBLOOD,NOTRANSSTING)
species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS)
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
mutantlungs = /obj/item/organ/lungs/plasmaman
@@ -12,6 +12,11 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant
disliked_food = MEAT | DAIRY
liked_food = VEGETABLES | FRUIT | GRAIN
var/light_nutrition_gain_factor = 10
var/light_toxheal = 1
var/light_oxyheal = 1
var/light_burnheal = 1
var/light_bruteheal = 1
/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
@@ -30,13 +35,13 @@
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
light_amount = min(1,T.get_lumcount()) - 0.5
H.nutrition += light_amount * 10
H.nutrition += light_amount * light_nutrition_gain_factor
if(H.nutrition > NUTRITION_LEVEL_FULL)
H.nutrition = NUTRITION_LEVEL_FULL
if(light_amount > 0.2) //if there's enough light, heal
H.heal_overall_damage(1,1)
H.adjustToxLoss(-1)
H.adjustOxyLoss(-1)
H.heal_overall_damage(light_bruteheal, light_burnheal)
H.adjustToxLoss(-light_toxheal)
H.adjustOxyLoss(-light_oxyheal)
if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
H.take_overall_damage(2,0)
@@ -64,3 +69,11 @@
H.show_message("<span class='userdanger'>The radiation beam singes you!</span>")
if(/obj/item/projectile/energy/florayield)
H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL)
/datum/species/pod/pseudo_weak
id = "podweak"
limbs_id = "pod"
light_nutrition_gain_factor = 7.5
light_bruteheal = 0.2
light_burnheal = 0.2
light_toxheal = 0.7
@@ -38,7 +38,7 @@
burnmod = 1.5
blacklisted = TRUE
no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE)
species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES)
species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOGUNS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
mutanteyes = /obj/item/organ/eyes/night_vision/nightmare
mutant_organs = list(/obj/item/organ/heart/nightmare)
@@ -6,7 +6,7 @@
blacklisted = 1
sexes = 0
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
species_traits = list(NOBLOOD)
species_traits = list(NOBLOOD,NOGENITALS,NOAROUSAL)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH)
inherent_biotypes = list(MOB_UNDEAD, MOB_HUMANOID)
mutanttongue = /obj/item/organ/tongue/bone
@@ -3,7 +3,7 @@
id = "synth"
say_mod = "beep boops" //inherited from a user's real species
sexes = 0
species_traits = list(NOTRANSSTING) //all of these + whatever we inherit from the real species
species_traits = list(NOTRANSSTING,NOGENITALS,NOAROUSAL) //all of these + whatever we inherit from the real species
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID)
dangerous_existence = 1
@@ -505,3 +505,33 @@
to_chat(user, "<span class='notice'>You unbolt [src]'s energy swords</span>")
for(var/IS in 1 to swordamt)
new /obj/item/melee/transforming/energy/sword/saber(Tsec)
//Firebot Assembly
/obj/item/bot_assembly/firebot
name = "incomplete firebot assembly"
desc = "A fire extinguisher with an arm attached to it."
icon_state = "firebot_arm"
created_name = "Firebot"
/obj/item/bot_assembly/firebot/attackby(obj/item/I, mob/user, params)
..()
switch(build_step)
if(ASSEMBLY_FIRST_STEP)
if(istype(I, /obj/item/clothing/head/hardhat/red))
if(!user.temporarilyRemoveItemFromInventory(I))
return
to_chat(user,"<span class='notice'>You add the [I] to [src]!</span>")
icon_state = "firebot_helmet"
desc = "An incomplete firebot assembly with a fire helmet."
qdel(I)
build_step++
if(ASSEMBLY_SECOND_STEP)
if(isprox(I))
if(!can_finish_build(I, user))
return
to_chat(user, "<span class='notice'>You add the [I] to [src]! Beep Boop!</span>")
var/mob/living/simple_animal/bot/firebot/F = new(drop_location())
F.name = created_name
qdel(I)
qdel(src)
@@ -0,0 +1,325 @@
//Firebot
#define SPEECH_INTERVAL 300 // Time between idle speeches
#define DETECTED_VOICE_INTERVAL 300 // Time between fire detected callouts
#define FOAM_INTERVAL 50 // Time between deployment of fire fighting foam
/mob/living/simple_animal/bot/firebot
name = "\improper Firebot"
desc = "A little fire extinguishing bot. He looks rather anxious."
icon = 'icons/mob/aibots.dmi'
icon_state = "firebot"
density = FALSE
anchored = FALSE
health = 25
maxHealth = 25
spacewalk = TRUE
radio_key = /obj/item/encryptionkey/headset_eng
radio_channel = "Engineering"
bot_type = FIRE_BOT
model = "Firebot"
bot_core = /obj/machinery/bot_core/firebot
window_id = "autoextinguisher"
window_name = "Mobile Fire Extinguisher v1.0"
path_image_color = "#FFA500"
var/atom/target_fire
var/atom/old_target_fire
var/obj/item/extinguisher/internal_ext
var/last_found = 0
var/speech_cooldown = 0
var/detected_cooldown = 0
var/foam_cooldown = 0
var/extinguish_people = TRUE
var/extinguish_fires = TRUE
var/stationary_mode = FALSE
/mob/living/simple_animal/bot/firebot/Initialize()
. = ..()
update_icon()
var/datum/job/engineer/J = new/datum/job/engineer
access_card.access += J.get_access()
prev_access = access_card.access
create_extinguisher()
/mob/living/simple_animal/bot/firebot/bot_reset()
create_extinguisher()
/mob/living/simple_animal/bot/firebot/proc/create_extinguisher()
internal_ext = new /obj/item/extinguisher(src)
internal_ext.safety = FALSE
internal_ext.precision = TRUE
internal_ext.max_water = INFINITY
internal_ext.refill()
/mob/living/simple_animal/bot/firebot/UnarmedAttack(atom/A)
if(!on)
return
if(internal_ext)
internal_ext.afterattack(A, src)
else
return ..()
/mob/living/simple_animal/bot/firebot/RangedAttack(atom/A)
if(!on)
return
if(internal_ext)
internal_ext.afterattack(A, src)
else
return ..()
/mob/living/simple_animal/bot/firebot/turn_on()
. = ..()
update_icon()
/mob/living/simple_animal/bot/firebot/turn_off()
..()
update_icon()
/mob/living/simple_animal/bot/firebot/bot_reset()
..()
target_fire = null
old_target_fire = null
ignore_list = list()
anchored = FALSE
update_icon()
/mob/living/simple_animal/bot/firebot/proc/soft_reset()
path = list()
target_fire = null
mode = BOT_IDLE
last_found = world.time
update_icon()
/mob/living/simple_animal/bot/firebot/set_custom_texts()
text_hack = "You corrupt [name]'s safety protocols."
text_dehack = "You detect errors in [name] and reset his programming."
text_dehack_fail = "[name] is not responding to reset commands!"
/mob/living/simple_animal/bot/firebot/get_controls(mob/user)
var/dat
dat += hack(user)
dat += showpai(user)
dat += "<TT><B>Mobile Fire Extinguisher v1.0</B></TT><BR><BR>"
dat += "Status: <A href='?src=[REF(src)];power=1'>[on ? "On" : "Off"]</A><BR>"
dat += "Maintenance panel panel is [open ? "opened" : "closed"]<BR>"
dat += "Behaviour controls are [locked ? "locked" : "unlocked"]<BR>"
if(!locked || issilicon(user) || IsAdminGhost(user))
dat += "Extinguish Fires: <A href='?src=[REF(src)];operation=extinguish_fires'>[extinguish_fires ? "Yes" : "No"]</A><BR>"
dat += "Extinguish People: <A href='?src=[REF(src)];operation=extinguish_people'>[extinguish_people ? "Yes" : "No"]</A><BR>"
dat += "Patrol Station: <A href='?src=[REF(src)];operation=patrol'>[auto_patrol ? "Yes" : "No"]</A><BR>"
dat += "Stationary Mode: <a href='?src=[REF(src)];operation=stationary_mode'>[stationary_mode ? "Yes" : "No"]</a><br>"
return dat
/mob/living/simple_animal/bot/firebot/emag_act(mob/user)
..()
if(emagged == 1)
if(user)
to_chat(user, "<span class='danger'>[src] buzzes and beeps.</span>")
audible_message("<span class='danger'>[src] buzzes oddly!</span>")
playsound(src, "sparks", 75, TRUE)
if(user)
old_target_fire = user
extinguish_fires = FALSE
extinguish_people = TRUE
internal_ext.chem = "clf3" //Refill the internal extinguisher with liquid fire
internal_ext.power = 3
internal_ext.safety = FALSE
internal_ext.precision = FALSE
internal_ext.max_water = INFINITY
internal_ext.refill()
/mob/living/simple_animal/bot/firebot/Topic(href, href_list)
if(..())
return TRUE
switch(href_list["operation"])
if("extinguish_fires")
extinguish_fires = !extinguish_fires
if("extinguish_people")
extinguish_people = !extinguish_people
if("stationary_mode")
stationary_mode = !stationary_mode
update_controls()
update_icon()
/mob/living/simple_animal/bot/firebot/proc/is_burning(atom/target)
if(ismob(target))
var/mob/living/M = target
if(M.on_fire || (emagged == 1 && !M.on_fire))
return TRUE
else if(isturf(target))
var/turf/open/T = target
if(T.active_hotspot)
return TRUE
return FALSE
/mob/living/simple_animal/bot/firebot/handle_automated_action()
if(!..())
return
if(IsStun())
old_target_fire = target_fire
target_fire = null
mode = BOT_IDLE
return
if(prob(1) && target_fire == null)
var/list/messagevoice = list("No fires detected." = 'sound/voice/firebot/nofires.ogg',
"Only you can prevent station fires." = 'sound/voice/firebot/onlyyou.ogg',
"Temperature nominal." = 'sound/voice/firebot/tempnominal.ogg',
"Keep it cool." = 'sound/voice/firebot/keepitcool.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(src, messagevoice[message], 50)
// Couldn't reach the target, reset and try again ignoring the old one
if(frustration > 8)
old_target_fire = target_fire
soft_reset()
// We extinguished our target or it was deleted
if(QDELETED(target_fire) || !is_burning(target_fire) || isdead(target_fire))
target_fire = null
var/scan_range = (stationary_mode ? 1 : DEFAULT_SCAN_RANGE)
if(extinguish_people)
target_fire = scan(/mob/living, old_target_fire, scan_range) // Scan for burning humans first
if(target_fire == null && extinguish_fires)
target_fire = scan(/turf/open, old_target_fire, scan_range) // Scan for burning turfs second
old_target_fire = target_fire
// Target reached ENGAGE WATER CANNON
if(target_fire && (get_dist(src, target_fire) <= (emagged == 1 ? 1 : 2))) // Make the bot spray water from afar when not emagged
if((speech_cooldown + SPEECH_INTERVAL) < world.time)
if(ishuman(target_fire))
speak("Stop, drop and roll!")
playsound(src, "sound/voice/firebot/stopdropnroll.ogg", 50, 0)
else
speak("Extinguishing!")
playsound(src, "sound/voice/firebot/extinguishing.ogg", 50, 0)
speech_cooldown = world.time
flick("firebot1_use", src)
spray_water(target_fire, src)
soft_reset()
// Target ran away
else if(target_fire && path.len && (get_dist(target_fire,path[path.len]) > 2))
path = list()
mode = BOT_IDLE
last_found = world.time
else if(target_fire && stationary_mode)
soft_reset()
return
if(target_fire && (get_dist(src, target_fire) > 2))
path = get_path_to(src, get_turf(target_fire), /turf/proc/Distance_cardinal, 0, 30, 1, id=access_card)
mode = BOT_MOVING
if(!path.len)
soft_reset()
if(path.len > 0 && target_fire)
if(!bot_move(path[path.len]))
old_target_fire = target_fire
soft_reset()
return
// We got a target but it's too far away from us
if(path.len > 8 && target_fire)
frustration++
if(auto_patrol && !target_fire && !stationary_mode)
if(mode == BOT_IDLE || mode == BOT_START_PATROL)
start_patrol()
if(mode == BOT_PATROL)
bot_patrol()
//Look for burning people or turfs around the bot
/mob/living/simple_animal/bot/firebot/process_scan(atom/scan_target)
var/result
if(scan_target == src)
return result
if(is_burning(scan_target))
if((detected_cooldown + DETECTED_VOICE_INTERVAL) < world.time)
speak("Fire detected!")
playsound(src, "sound/voice/firebot/detected.ogg", 50, 0)
detected_cooldown = world.time
result = scan_target
return result
/mob/living/simple_animal/bot/firebot/temperature_expose(datum/gas_mixture/air, temperature, volume)
if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && foam_cooldown + FOAM_INTERVAL < world.time)
new /obj/effect/particle_effect/foam/firefighting(loc)
foam_cooldown = world.time
..()
/mob/living/simple_animal/bot/firebot/proc/spray_water(atom/target, mob/user)
if(stationary_mode)
flick("firebots_use", user)
else
flick("firebot1_use", user)
internal_ext.afterattack(target, user, null)
/mob/living/simple_animal/bot/firebot/update_icon()
if(!on)
icon_state = "firebot0"
return
if(IsStun())
icon_state = "firebots1"
else if(stationary_mode) //Bot has yellow light to indicate stationary mode.
icon_state = "firebots1"
else
icon_state = "firebot1"
/mob/living/simple_animal/bot/firebot/explode()
on = FALSE
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/atom/Tsec = drop_location()
new /obj/item/assembly/prox_sensor(Tsec)
new /obj/item/clothing/head/hardhat/red(Tsec)
var/turf/T = get_turf(Tsec)
if(isopenturf(T))
var/turf/open/theturf = T
theturf.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
if(prob(50))
drop_part(robot_arm, Tsec)
do_sparks(3, TRUE, src)
..()
/obj/machinery/bot_core/firebot
req_one_access = list(ACCESS_CONSTRUCTION, ACCESS_ROBOTICS)
#undef SPEECH_INTERVAL
#undef DETECTED_VOICE_INTERVAL
#undef FOAM_INTERVAL
@@ -130,7 +130,7 @@
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/item/projectile/Proj)
if(!Proj)
return
if(prob(50))
if(prob(25))
return ..()
else
visible_message("<span class='danger'>[src] blocks [Proj] with its shield!</span>")
@@ -102,20 +102,19 @@
set category = "Object"
set src in oview(1)
var/datum/belly/B = vore_organs[vore_selected]
if(faction != usr.faction)
to_chat(usr,"<span class='warning'>This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.</span>")
return
if(B.digest_mode == "Hold")
var/mob/living/carbon/human/user = usr
if(!istype(user) || user.stat) return
if(vore_selected.digest_mode == DM_HOLD)
var/confirm = alert(usr, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will disable itself after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel")
if(confirm == "Enable")
B.digest_mode = "Digest"
sleep(20 MINUTES) //12000=20 minutes
B.digest_mode = "Hold"
vore_selected.digest_mode = DM_DIGEST
sleep(20 MINUTES)
vore_selected.digest_mode = vore_default_mode
else
var/confirm = alert(usr, "This mob is currently set to digest all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel")
if(confirm == "Disable")
B.digest_mode = "Hold"
vore_selected.digest_mode = DM_HOLD
//
// Simple nom proc for if you get ckey'd into a simple_animal mob! Avoids grabs.
@@ -61,6 +61,8 @@
var/mood = "" // To show its face
var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime
var/force_stasis = FALSE
do_footstep = TRUE
var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)")
///////////TIME FOR SUBSPECIES
@@ -4,12 +4,25 @@
if(!ninjacost(0,N_ADRENALINE))
var/mob/living/carbon/human/H = affecting
H.SetUnconscious(0)
H.SetSleeping(0)
H.SetStun(0)
H.SetKnockdown(0)
H.adjustStaminaLoss(-75)
H.SetUnconscious(0)
H.adjustStaminaLoss(-150)
H.stuttering = 0
H.updatehealth()
H.update_stamina()
H.resting = 0
H.lying = 0
H.update_canmove()
H.reagents.add_reagent("inaprovaline", 3) //let's give another chance to dumb fucks who forget to breathe
H.reagents.add_reagent("synaptizine", 10)
H.reagents.add_reagent("omnizine", 10)
H.reagents.add_reagent("stimulants", 10)
H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"), forced = "ninjaboost")
a_boost--
to_chat(H, "<span class='notice'>There are <B>[a_boost]</B> adrenaline boosts remaining.</span>")
s_coold = 3
@@ -299,4 +299,8 @@
ammo_type = list(/obj/item/ammo_casing/energy/gravity/repulse, /obj/item/ammo_casing/energy/gravity/attract, /obj/item/ammo_casing/energy/gravity/chaos)
item_state = "gravity_gun"
icon_state = "gravity_gun"
pin = null
var/power = 4
/obj/item/gun/energy/gravity_gun/security
pin = /obj/item/firing_pin
+2 -2
View File
@@ -280,11 +280,11 @@ im
if(C.reagent_check(R) != 1)
if(can_overdose)
if(R.overdose_threshold)
if(R.volume >= R.overdose_threshold && !R.overdosed)
if(R.volume > R.overdose_threshold && !R.overdosed)
R.overdosed = 1
need_mob_update += R.overdose_start(C)
if(R.addiction_threshold)
if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions))
if(R.volume > R.addiction_threshold && !is_type_in_list(R, cached_addictions))
var/datum/reagent/new_reagent = new R.type()
cached_addictions.Add(new_reagent)
if(R.overdosed)
@@ -320,13 +320,14 @@
reagent_state = SOLID
color = "#000067" // rgb: 0, 0, 103
toxpwr = 0
metabolization_rate = 1.5 * REAGENTS_METABOLISM
metabolization_rate = 1 * REAGENTS_METABOLISM
/datum/reagent/toxin/chloralhydratedelayed/on_mob_life(mob/living/carbon/M)
switch(current_cycle)
if(10 to 20)
M.confused += 1
M.drowsyness += 1
M.adjustStaminaLoss(7.5)
if(20 to INFINITY)
M.Sleeping(40, 0)
..()
@@ -1,872 +0,0 @@
///////////////////////////////////
//////////Autolathe Designs ///////
///////////////////////////////////
/datum/design/bucket
name = "Bucket"
id = "bucket"
build_type = AUTOLATHE
materials = list(MAT_METAL = 200)
build_path = /obj/item/reagent_containers/glass/bucket
category = list("initial","Tools")
/datum/design/crowbar
name = "Pocket Crowbar"
id = "crowbar"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50)
build_path = /obj/item/crowbar
category = list("initial","Tools")
/datum/design/flashlight
name = "Flashlight"
id = "flashlight"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 20)
build_path = /obj/item/flashlight
category = list("initial","Tools")
/datum/design/extinguisher
name = "Fire Extinguisher"
id = "extinguisher"
build_type = AUTOLATHE
materials = list(MAT_METAL = 90)
build_path = /obj/item/extinguisher
category = list("initial","Tools")
/datum/design/pocketfireextinguisher
name = "Pocket Fire Extinguisher"
id = "pocketfireextinguisher"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 40)
build_path = /obj/item/extinguisher/mini
category = list("initial","Tools")
/datum/design/multitool
name = "Multitool"
id = "multitool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 20)
build_path = /obj/item/multitool
category = list("initial","Tools")
/datum/design/analyzer
name = "Analyzer"
id = "analyzer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
build_path = /obj/item/analyzer
category = list("initial","Tools")
/datum/design/tscanner
name = "T-Ray Scanner"
id = "tscanner"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150)
build_path = /obj/item/t_scanner
category = list("initial","Tools")
/datum/design/weldingtool
name = "Welding Tool"
id = "welding_tool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 70, MAT_GLASS = 20)
build_path = /obj/item/weldingtool
category = list("initial","Tools")
/datum/design/mini_weldingtool
name = "Emergency Welding Tool"
id = "mini_welding_tool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 10)
build_path = /obj/item/weldingtool/mini
category = list("initial","Tools")
/datum/design/screwdriver
name = "Screwdriver"
id = "screwdriver"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75)
build_path = /obj/item/screwdriver
category = list("initial","Tools")
/datum/design/wirecutters
name = "Wirecutters"
id = "wirecutters"
build_type = AUTOLATHE
materials = list(MAT_METAL = 80)
build_path = /obj/item/wirecutters
category = list("initial","Tools")
/datum/design/wrench
name = "Wrench"
id = "wrench"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150)
build_path = /obj/item/wrench
category = list("initial","Tools")
/datum/design/welding_helmet
name = "Welding Helmet"
id = "welding_helmet"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1750, MAT_GLASS = 400)
build_path = /obj/item/clothing/head/welding
category = list("initial","Tools")
/datum/design/cable_coil
name = "Cable Coil"
id = "cable_coil"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 5)
build_path = /obj/item/stack/cable_coil/random
category = list("initial","Tools")
maxstack = 30
/datum/design/toolbox
name = "Toolbox"
id = "tool_box"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500)
build_path = /obj/item/storage/toolbox
category = list("initial","Tools")
/datum/design/apc_board
name = "APC Module"
id = "power control"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/electronics/apc
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/airlock_board
name = "Airlock Electronics"
id = "airlock_board"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/electronics/airlock
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/firelock_board
name = "Firelock Circuitry"
id = "firelock_board"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/electronics/firelock
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/airalarm_electronics
name = "Air Alarm Electronics"
id = "airalarm_electronics"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/electronics/airalarm
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/firealarm_electronics
name = "Fire Alarm Electronics"
id = "firealarm_electronics"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/electronics/firealarm
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/camera
name = "Camera"
id = "camera"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 100)
build_path = /obj/item/camera
category = list("initial", "Misc")
/datum/design/camera_film
name = "Camera Film Cartridge"
id = "camera_film"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 10)
build_path = /obj/item/camera_film
category = list("initial", "Misc")
/datum/design/earmuffs
name = "Earmuffs"
id = "earmuffs"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/clothing/ears/earmuffs
category = list("initial", "Misc")
/datum/design/pipe_painter
name = "Pipe Painter"
id = "pipe_painter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
build_path = /obj/item/pipe_painter
category = list("initial", "Misc")
/datum/design/airlock_painter
name = "Airlock Painter"
id = "airlock_painter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/airlock_painter
category = list("initial", "Misc")
/datum/design/metal
name = "Metal"
id = "metal"
build_type = AUTOLATHE
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/metal
category = list("initial","Construction")
maxstack = 50
/datum/design/glass
name = "Glass"
id = "glass"
build_type = AUTOLATHE
materials = list(MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/glass
category = list("initial","Construction")
maxstack = 50
/datum/design/rglass
name = "Reinforced Glass"
id = "rglass"
build_type = AUTOLATHE | SMELTER | PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/rglass
category = list("initial","Construction","Stock Parts")
maxstack = 50
/datum/design/rods
name = "Metal Rod"
id = "rods"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000)
build_path = /obj/item/stack/rods
category = list("initial","Construction")
maxstack = 50
/datum/design/rcd_ammo
name = "Compressed Matter Cartridge"
id = "rcd_ammo"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000, MAT_GLASS=8000)
build_path = /obj/item/rcd_ammo
category = list("initial","Construction")
/datum/design/kitchen_knife
name = "Kitchen Knife"
id = "kitchen_knife"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000)
build_path = /obj/item/kitchen/knife
category = list("initial","Dinnerware")
/datum/design/fork
name = "Fork"
id = "fork"
build_type = AUTOLATHE
materials = list(MAT_METAL = 80)
build_path = /obj/item/kitchen/fork
category = list("initial","Dinnerware")
/datum/design/tray
name = "Tray"
id = "tray"
build_type = AUTOLATHE
materials = list(MAT_METAL = 3000)
build_path = /obj/item/storage/bag/tray
category = list("initial","Dinnerware")
/datum/design/bowl
name = "Bowl"
id = "bowl"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 500)
build_path = /obj/item/reagent_containers/glass/bowl
category = list("initial","Dinnerware")
/datum/design/drinking_glass
name = "Drinking Glass"
id = "drinking_glass"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 500)
build_path = /obj/item/reagent_containers/food/drinks/drinkingglass
category = list("initial","Dinnerware")
/datum/design/shot_glass
name = "Shot Glass"
id = "shot_glass"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 100)
build_path = /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass
category = list("initial","Dinnerware")
/datum/design/shaker
name = "Shaker"
id = "shaker"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1500)
build_path = /obj/item/reagent_containers/food/drinks/shaker
category = list("initial","Dinnerware")
/datum/design/cultivator
name = "Cultivator"
id = "cultivator"
build_type = AUTOLATHE
materials = list(MAT_METAL=50)
build_path = /obj/item/cultivator
category = list("initial","Misc")
/datum/design/plant_analyzer
name = "Plant Analyzer"
id = "plant_analyzer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
build_path = /obj/item/plant_analyzer
category = list("initial","Misc")
/datum/design/shovel
name = "Shovel"
id = "shovel"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50)
build_path = /obj/item/shovel
category = list("initial","Misc")
/datum/design/spade
name = "Spade"
id = "spade"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50)
build_path = /obj/item/shovel/spade
category = list("initial","Misc")
/datum/design/hatchet
name = "Hatchet"
id = "hatchet"
build_type = AUTOLATHE
materials = list(MAT_METAL = 15000)
build_path = /obj/item/hatchet
category = list("initial","Misc")
/datum/design/foilhat
name = "Tinfoil Hat"
id = "tinfoil_hat"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5500)
build_path = /obj/item/clothing/head/foilhat
category = list("hacked", "Misc")
/datum/design/scalpel
name = "Scalpel"
id = "scalpel"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 1000)
build_path = /obj/item/scalpel
category = list("initial", "Medical")
/datum/design/circular_saw
name = "Circular Saw"
id = "circular_saw"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
build_path = /obj/item/circular_saw
category = list("initial", "Medical")
/datum/design/surgicaldrill
name = "Surgical Drill"
id = "surgicaldrill"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
build_path = /obj/item/surgicaldrill
category = list("initial", "Medical")
/datum/design/retractor
name = "Retractor"
id = "retractor"
build_type = AUTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 3000)
build_path = /obj/item/retractor
category = list("initial", "Medical")
/datum/design/cautery
name = "Cautery"
id = "cautery"
build_type = AUTOLATHE
materials = list(MAT_METAL = 2500, MAT_GLASS = 750)
build_path = /obj/item/cautery
category = list("initial", "Medical")
/datum/design/hemostat
name = "Hemostat"
id = "hemostat"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
build_path = /obj/item/hemostat
category = list("initial", "Medical")
/datum/design/beaker
name = "Beaker"
id = "beaker"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 500)
build_path = /obj/item/reagent_containers/glass/beaker
category = list("initial", "Medical")
/datum/design/large_beaker
name = "Large Beaker"
id = "large_beaker"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 2500)
build_path = /obj/item/reagent_containers/glass/beaker/large
category = list("initial", "Medical")
/datum/design/healthanalyzer
name = "Health Analyzer"
id = "healthanalyzer"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
build_path = /obj/item/healthanalyzer
category = list("initial", "Medical")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/pillbottle
name = "Pill Bottle"
id = "pillbottle"
build_type = AUTOLATHE
materials = list(MAT_METAL = 20, MAT_GLASS = 100)
build_path = /obj/item/storage/pill_bottle
category = list("initial", "Medical")
/datum/design/beanbag_slug
name = "Beanbag Slug"
id = "beanbag_slug"
build_type = AUTOLATHE
materials = list(MAT_METAL = 250)
build_path = /obj/item/ammo_casing/shotgun/beanbag
category = list("initial", "Security")
/datum/design/rubbershot
name = "Rubber Shot"
id = "rubber_shot"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun/rubbershot
category = list("initial", "Security")
/datum/design/c38
name = "Speed Loader (.38 rubber)"
id = "c38"
build_type = AUTOLATHE
materials = list(MAT_METAL = 20000)
build_path = /obj/item/ammo_box/c38
category = list("initial", "Security")
/datum/design/recorder
name = "Universal Recorder"
id = "recorder"
build_type = AUTOLATHE
materials = list(MAT_METAL = 60, MAT_GLASS = 30)
build_path = /obj/item/taperecorder/empty
category = list("initial", "Misc")
/datum/design/tape
name = "Tape"
id = "tape"
build_type = AUTOLATHE
materials = list(MAT_METAL = 20, MAT_GLASS = 5)
build_path = /obj/item/tape/random
category = list("initial", "Misc")
/datum/design/igniter
name = "Igniter"
id = "igniter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
build_path = /obj/item/assembly/igniter
category = list("initial", "Misc")
/datum/design/signaler
name = "Remote Signaling Device"
id = "signaler"
build_type = AUTOLATHE
materials = list(MAT_METAL = 400, MAT_GLASS = 120)
build_path = /obj/item/assembly/signaler
category = list("initial", "T-Comm")
/datum/design/radio_headset
name = "Radio Headset"
id = "radio_headset"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75)
build_path = /obj/item/radio/headset
category = list("initial", "T-Comm")
/datum/design/bounced_radio
name = "Station Bounced Radio"
id = "bounced_radio"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75, MAT_GLASS = 25)
build_path = /obj/item/radio/off
category = list("initial", "T-Comm")
/datum/design/intercom_frame
name = "Intercom Frame"
id = "intercom_frame"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75, MAT_GLASS = 25)
build_path = /obj/item/wallframe/intercom
category = list("initial", "T-Comm")
/datum/design/infrared_emitter
name = "Infrared Emitter"
id = "infrared_emitter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
build_path = /obj/item/assembly/infra
category = list("initial", "Misc")
/datum/design/health_sensor
name = "Health Sensor"
id = "health_sensor"
build_type = AUTOLATHE
materials = list(MAT_METAL = 800, MAT_GLASS = 200)
build_path = /obj/item/assembly/health
category = list("initial", "Medical")
/datum/design/timer
name = "Timer"
id = "timer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
build_path = /obj/item/assembly/timer
category = list("initial", "Misc")
/datum/design/voice_analyser
name = "Voice Analyser"
id = "voice_analyser"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
build_path = /obj/item/assembly/voice
category = list("initial", "Misc")
/datum/design/light_tube
name = "Light Tube"
id = "light_tube"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 100)
build_path = /obj/item/light/tube
category = list("initial", "Construction")
/datum/design/light_bulb
name = "Light Bulb"
id = "light_bulb"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 100)
build_path = /obj/item/light/bulb
category = list("initial", "Construction")
/datum/design/camera_assembly
name = "Camera Assembly"
id = "camera_assembly"
build_type = AUTOLATHE
materials = list(MAT_METAL = 400, MAT_GLASS = 250)
build_path = /obj/item/wallframe/camera
category = list("initial", "Construction")
/datum/design/newscaster_frame
name = "Newscaster Frame"
id = "newscaster_frame"
build_type = AUTOLATHE
materials = list(MAT_METAL = 14000, MAT_GLASS = 8000)
build_path = /obj/item/wallframe/newscaster
category = list("initial", "Construction")
/datum/design/syringe
name = "Syringe"
id = "syringe"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 20)
build_path = /obj/item/reagent_containers/syringe
category = list("initial", "Medical")
/datum/design/prox_sensor
name = "Proximity Sensor"
id = "prox_sensor"
build_type = AUTOLATHE
materials = list(MAT_METAL = 800, MAT_GLASS = 200)
build_path = /obj/item/assembly/prox_sensor
category = list("initial", "Misc")
/datum/design/foam_dart
name = "Box of Foam Darts"
id = "foam_dart"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500)
build_path = /obj/item/ammo_box/foambox
category = list("initial", "Misc")
//hacked autolathe recipes
/datum/design/flamethrower
name = "Flamethrower"
id = "flamethrower"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500)
build_path = /obj/item/flamethrower/full
category = list("hacked", "Security")
/datum/design/rcd
name = "Rapid Construction Device (RCD)"
id = "rcd"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/construction/rcd
category = list("hacked", "Construction")
/datum/design/rpd
name = "Rapid Pipe Dispenser (RPD)"
id = "rpd"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
build_path = /obj/item/pipe_dispenser
category = list("hacked", "Construction")
/datum/design/electropack
name = "Electropack"
id = "electropack"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 2500)
build_path = /obj/item/electropack
category = list("hacked", "Tools")
/datum/design/large_welding_tool
name = "Industrial Welding Tool"
id = "large_welding_tool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 70, MAT_GLASS = 60)
build_path = /obj/item/weldingtool/largetank
category = list("hacked", "Tools")
/datum/design/handcuffs
name = "Handcuffs"
id = "handcuffs"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500)
build_path = /obj/item/restraints/handcuffs
category = list("hacked", "Security")
/datum/design/receiver
name = "Modular Receiver"
id = "receiver"
build_type = AUTOLATHE
materials = list(MAT_METAL = 15000)
build_path = /obj/item/weaponcrafting/receiver
category = list("hacked", "Security")
/datum/design/shotgun_slug
name = "Shotgun Slug"
id = "shotgun_slug"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun
category = list("hacked", "Security")
/datum/design/buckshot_shell
name = "Buckshot Shell"
id = "buckshot_shell"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun/buckshot
category = list("hacked", "Security")
/datum/design/shotgun_dart
name = "Shotgun Dart"
id = "shotgun_dart"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun/dart
category = list("hacked", "Security")
/datum/design/incendiary_slug
name = "Incendiary Slug"
id = "incendiary_slug"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun/incendiary
category = list("hacked", "Security")
/datum/design/riot_dart
name = "Foam Riot Dart"
id = "riot_dart"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000) //Discount for making individually - no box = less metal!
build_path = /obj/item/ammo_casing/caseless/foam_dart/riot
category = list("hacked", "Security")
/datum/design/riot_darts
name = "Foam Riot Dart Box"
id = "riot_darts"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50000) //Comes with 40 darts
build_path = /obj/item/ammo_box/foambox/riot
category = list("hacked", "Security")
/datum/design/a357
name = "Speed Loader (.357)"
id = "a357"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/ammo_box/a357
category = list("hacked", "Security")
/datum/design/c10mm
name = "Ammo Box (10mm)"
id = "c10mm"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/ammo_box/c10mm
category = list("hacked", "Security")
/datum/design/c45
name = "Ammo Box (.45)"
id = "c45"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/ammo_box/c45
category = list("hacked", "Security")
/datum/design/c9mm
name = "Ammo Box (9mm)"
id = "c9mm"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/ammo_box/c9mm
category = list("hacked", "Security")
/datum/design/cleaver
name = "Butcher's Cleaver"
id = "cleaver"
build_type = AUTOLATHE
materials = list(MAT_METAL = 18000)
build_path = /obj/item/kitchen/knife/butcher
category = list("hacked", "Dinnerware")
/datum/design/spraycan
name = "Spraycan"
id = "spraycan"
build_type = AUTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/toy/crayon/spraycan
category = list("initial", "Tools")
/datum/design/desttagger
name = "Destination Tagger"
id = "desttagger"
build_type = AUTOLATHE
materials = list(MAT_METAL = 250, MAT_GLASS = 125)
build_path = /obj/item/destTagger
category = list("initial", "Electronics")
/datum/design/handlabeler
name = "Hand Labeler"
id = "handlabel"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 125)
build_path = /obj/item/hand_labeler
category = list("initial", "Electronics")
/datum/design/geiger
name = "Geiger Counter"
id = "geigercounter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
build_path = /obj/item/geiger_counter
category = list("initial", "Tools")
/datum/design/turret_control_frame
name = "Turret Control Frame"
id = "turret_control"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000)
build_path = /obj/item/wallframe/turret_control
category = list("initial", "Construction")
/datum/design/conveyor_belt
name = "Conveyor Belt"
id = "conveyor_belt"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000)
build_path = /obj/item/conveyor_construct
category = list("initial", "Construction")
/datum/design/conveyor_switch
name = "Conveyor Belt Switch"
id = "conveyor_switch"
build_type = AUTOLATHE
materials = list(MAT_METAL = 450, MAT_GLASS = 190)
build_path = /obj/item/conveyor_switch_construct
category = list("initial", "Construction")
/datum/design/laptop
name = "Laptop Frame"
id = "laptop"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 1000)
build_path = /obj/item/modular_computer/laptop/buildable
category = list("initial","Misc")
/datum/design/tablet
name = "Tablet Frame"
id = "tablet"
build_type = AUTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
build_path = /obj/item/modular_computer/tablet
category = list("initial","Misc")
/datum/design/slime_scanner
name = "Slime Scanner"
id = "slime_scanner"
build_type = AUTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 200)
build_path = /obj/item/slime_scanner
category = list("initial", "Misc")
/datum/design/pet_carrier
name = "Pet Carrier"
id = "pet_carrier"
build_type = AUTOLATHE
materials = list(MAT_METAL = 7500, MAT_GLASS = 100)
build_path = /obj/item/pet_carrier
category = list("initial", "Misc")
/datum/design/miniature_power_cell
name = "Light Fixture Battery"
id = "miniature_power_cell"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 20)
build_path = /obj/item/stock_parts/cell/emergency_light
category = list("initial", "Electronics")
/datum/design/packageWrap
name = "Package Wrapping"
id = "packagewrap"
build_type = AUTOLATHE
materials = list(MAT_METAL = 200, MAT_GLASS = 200)
build_path = /obj/item/stack/packageWrap
category = list("initial", "Misc")
maxstack = 30
/datum/design/holodisk
name = "Holodisk"
id = "holodisk"
build_type = AUTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/disk/holodisk
category = list("initial", "Misc")
@@ -0,0 +1,108 @@
///////////////////////////////////
//////////Autolathe Designs ///////
///////////////////////////////////
////////////////
///Construction//
////////////////
/datum/design/rods
name = "Metal Rod"
id = "rods"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000)
build_path = /obj/item/stack/rods
category = list("initial","Construction")
maxstack = 50
/datum/design/metal
name = "Metal"
id = "metal"
build_type = AUTOLATHE
materials = list(MAT_METAL = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/metal
category = list("initial","Construction")
maxstack = 50
/datum/design/glass
name = "Glass"
id = "glass"
build_type = AUTOLATHE
materials = list(MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/glass
category = list("initial","Construction")
maxstack = 50
/datum/design/rglass
name = "Reinforced Glass"
id = "rglass"
build_type = AUTOLATHE | SMELTER | PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
build_path = /obj/item/stack/sheet/rglass
category = list("initial","Construction","Stock Parts")
maxstack = 50
/datum/design/light_tube
name = "Light Tube"
id = "light_tube"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 100)
build_path = /obj/item/light/tube
category = list("initial", "Construction")
/datum/design/light_bulb
name = "Light Bulb"
id = "light_bulb"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 100)
build_path = /obj/item/light/bulb
category = list("initial", "Construction")
/datum/design/camera_assembly
name = "Camera Assembly"
id = "camera_assembly"
build_type = AUTOLATHE
materials = list(MAT_METAL = 400, MAT_GLASS = 250)
build_path = /obj/item/wallframe/camera
category = list("initial", "Construction")
/datum/design/newscaster_frame
name = "Newscaster Frame"
id = "newscaster_frame"
build_type = AUTOLATHE
materials = list(MAT_METAL = 14000, MAT_GLASS = 8000)
build_path = /obj/item/wallframe/newscaster
category = list("initial", "Construction")
/datum/design/turret_control_frame
name = "Turret Control Frame"
id = "turret_control"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000)
build_path = /obj/item/wallframe/turret_control
category = list("initial", "Construction")
/datum/design/conveyor_belt
name = "Conveyor Belt"
id = "conveyor_belt"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000)
build_path = /obj/item/conveyor_construct
category = list("initial", "Construction")
/datum/design/conveyor_switch
name = "Conveyor Belt Switch"
id = "conveyor_switch"
build_type = AUTOLATHE
materials = list(MAT_METAL = 450, MAT_GLASS = 190)
build_path = /obj/item/conveyor_switch_construct
category = list("initial", "Construction")
/datum/design/rcd_ammo
name = "Compressed Matter Cartridge"
id = "rcd_ammo"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000, MAT_GLASS=8000)
build_path = /obj/item/rcd_ammo
category = list("initial","Construction")
@@ -0,0 +1,76 @@
///////////////////////////////////
//////////Autolathe Designs ///////
///////////////////////////////////
////////////////
///Electronics//
////////////////
/datum/design/apc_board
name = "APC Module"
id = "power control"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/electronics/apc
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/airlock_board
name = "Airlock Electronics"
id = "airlock_board"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/electronics/airlock
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/firelock_board
name = "Firelock Circuitry"
id = "firelock_board"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/electronics/firelock
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/airalarm_electronics
name = "Air Alarm Electronics"
id = "airalarm_electronics"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/electronics/airalarm
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/firealarm_electronics
name = "Fire Alarm Electronics"
id = "firealarm_electronics"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/electronics/firealarm
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/desttagger
name = "Destination Tagger"
id = "desttagger"
build_type = AUTOLATHE
materials = list(MAT_METAL = 250, MAT_GLASS = 125)
build_path = /obj/item/destTagger
category = list("initial", "Electronics")
/datum/design/handlabeler
name = "Hand Labeler"
id = "handlabel"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 125)
build_path = /obj/item/hand_labeler
category = list("initial", "Electronics")
/datum/design/miniature_power_cell
name = "Light Fixture Battery"
id = "miniature_power_cell"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 20)
build_path = /obj/item/stock_parts/cell/emergency_light
category = list("initial", "Electronics")
@@ -0,0 +1,179 @@
///////////////////////////////////
//////////Autolathe Designs ///////
///////////////////////////////////
////////////////
////Dinnerware//
////////////////
/datum/design/kitchen_knife
name = "Kitchen Knife"
id = "kitchen_knife"
build_type = AUTOLATHE
materials = list(MAT_METAL = 12000)
build_path = /obj/item/kitchen/knife
category = list("initial","Dinnerware")
/datum/design/fork
name = "Fork"
id = "fork"
build_type = AUTOLATHE
materials = list(MAT_METAL = 80)
build_path = /obj/item/kitchen/fork
category = list("initial","Dinnerware")
/datum/design/tray
name = "Tray"
id = "tray"
build_type = AUTOLATHE
materials = list(MAT_METAL = 3000)
build_path = /obj/item/storage/bag/tray
category = list("initial","Dinnerware")
/datum/design/bowl
name = "Bowl"
id = "bowl"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 500)
build_path = /obj/item/reagent_containers/glass/bowl
category = list("initial","Dinnerware")
/datum/design/drinking_glass
name = "Drinking Glass"
id = "drinking_glass"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 500)
build_path = /obj/item/reagent_containers/food/drinks/drinkingglass
category = list("initial","Dinnerware")
/datum/design/shot_glass
name = "Shot Glass"
id = "shot_glass"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 100)
build_path = /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass
category = list("initial","Dinnerware")
/datum/design/shaker
name = "Shaker"
id = "shaker"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1500)
build_path = /obj/item/reagent_containers/food/drinks/shaker
category = list("initial","Dinnerware")
////////////
///Medical//
////////////
/datum/design/scalpel
name = "Scalpel"
id = "scalpel"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 1000)
build_path = /obj/item/scalpel
category = list("initial", "Medical")
/datum/design/circular_saw
name = "Circular Saw"
id = "circular_saw"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
build_path = /obj/item/circular_saw
category = list("initial", "Medical")
/datum/design/surgicaldrill
name = "Surgical Drill"
id = "surgicaldrill"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 6000)
build_path = /obj/item/surgicaldrill
category = list("initial", "Medical")
/datum/design/retractor
name = "Retractor"
id = "retractor"
build_type = AUTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 3000)
build_path = /obj/item/retractor
category = list("initial", "Medical")
/datum/design/cautery
name = "Cautery"
id = "cautery"
build_type = AUTOLATHE
materials = list(MAT_METAL = 2500, MAT_GLASS = 750)
build_path = /obj/item/cautery
category = list("initial", "Medical")
/datum/design/hemostat
name = "Hemostat"
id = "hemostat"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
build_path = /obj/item/hemostat
category = list("initial", "Medical")
/datum/design/beaker
name = "Beaker"
id = "beaker"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 500)
build_path = /obj/item/reagent_containers/glass/beaker
category = list("initial", "Medical")
/datum/design/large_beaker
name = "Large Beaker"
id = "large_beaker"
build_type = AUTOLATHE
materials = list(MAT_GLASS = 2500)
build_path = /obj/item/reagent_containers/glass/beaker/large
category = list("initial", "Medical")
/datum/design/healthanalyzer
name = "Health Analyzer"
id = "healthanalyzer"
build_type = AUTOLATHE | PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
build_path = /obj/item/healthanalyzer
category = list("initial", "Medical")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/pillbottle
name = "Pill Bottle"
id = "pillbottle"
build_type = AUTOLATHE
materials = list(MAT_METAL = 20, MAT_GLASS = 100)
build_path = /obj/item/storage/pill_bottle
category = list("initial", "Medical")
/datum/design/syringe
name = "Syringe"
id = "syringe"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 20)
build_path = /obj/item/reagent_containers/syringe
category = list("initial", "Medical")
/datum/design/health_sensor
name = "Health Sensor"
id = "health_sensor"
build_type = AUTOLATHE
materials = list(MAT_METAL = 800, MAT_GLASS = 200)
build_path = /obj/item/assembly/health
category = list("initial", "Medical")
/datum/design/hypovialsmall
name = "Hypovial"
id = "hypovial"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500)
build_path = /obj/item/reagent_containers/glass/bottle/vial/small
category = list("initial","Medical")
/datum/design/hypoviallarge
name = "Large Hypovial"
id = "large_hypovial"
build_type = AUTOLATHE
materials = list(MAT_METAL = 2500)
build_path = /obj/item/reagent_containers/glass/bottle/vial/large
category = list("initial","Medical")
@@ -0,0 +1,186 @@
///////////////////////////////////
//////////Autolathe Designs ///////
///////////////////////////////////
/////////////
////Secgear//
/////////////
/datum/design/beanbag_slug
name = "Beanbag Slug"
id = "beanbag_slug"
build_type = AUTOLATHE
materials = list(MAT_METAL = 250)
build_path = /obj/item/ammo_casing/shotgun/beanbag
category = list("initial", "Security")
/datum/design/rubbershot
name = "Rubber Shot"
id = "rubber_shot"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun/rubbershot
category = list("initial", "Security")
/datum/design/c38
name = "Speed Loader (.38 rubber)"
id = "c38"
build_type = AUTOLATHE
materials = list(MAT_METAL = 20000)
build_path = /obj/item/ammo_box/c38
category = list("initial", "Security")
/////////////////
///Hacked Gear //
/////////////////
/datum/design/large_welding_tool
name = "Industrial Welding Tool"
id = "large_welding_tool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 70, MAT_GLASS = 60)
build_path = /obj/item/weldingtool/largetank
category = list("hacked", "Tools")
/datum/design/flamethrower
name = "Flamethrower"
id = "flamethrower"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500)
build_path = /obj/item/flamethrower/full
category = list("hacked", "Security")
/datum/design/rcd
name = "Rapid Construction Device (RCD)"
id = "rcd"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/construction/rcd
category = list("hacked", "Construction")
/datum/design/rpd
name = "Rapid Pipe Dispenser (RPD)"
id = "rpd"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75000, MAT_GLASS = 37500)
build_path = /obj/item/pipe_dispenser
category = list("hacked", "Construction")
/datum/design/handcuffs
name = "Handcuffs"
id = "handcuffs"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500)
build_path = /obj/item/restraints/handcuffs
category = list("hacked", "Security")
/datum/design/receiver
name = "Modular Receiver"
id = "receiver"
build_type = AUTOLATHE
materials = list(MAT_METAL = 15000)
build_path = /obj/item/weaponcrafting/receiver
category = list("hacked", "Security")
/datum/design/shotgun_slug
name = "Shotgun Slug"
id = "shotgun_slug"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun
category = list("hacked", "Security")
/datum/design/buckshot_shell
name = "Buckshot Shell"
id = "buckshot_shell"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun/buckshot
category = list("hacked", "Security")
/datum/design/shotgun_dart
name = "Shotgun Dart"
id = "shotgun_dart"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun/dart
category = list("hacked", "Security")
/datum/design/incendiary_slug
name = "Incendiary Slug"
id = "incendiary_slug"
build_type = AUTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_casing/shotgun/incendiary
category = list("hacked", "Security")
/datum/design/riot_dart
name = "Foam Riot Dart"
id = "riot_dart"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000) //Discount for making individually - no box = less metal!
build_path = /obj/item/ammo_casing/caseless/foam_dart/riot
category = list("hacked", "Security")
/datum/design/riot_darts
name = "Foam Riot Dart Box"
id = "riot_darts"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50000) //Comes with 40 darts
build_path = /obj/item/ammo_box/foambox/riot
category = list("hacked", "Security")
/datum/design/a357
name = "Speed Loader (.357)"
id = "a357"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/ammo_box/a357
category = list("hacked", "Security")
/datum/design/c10mm
name = "Ammo Box (10mm)"
id = "c10mm"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/ammo_box/c10mm
category = list("hacked", "Security")
/datum/design/c45
name = "Ammo Box (.45)"
id = "c45"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/ammo_box/c45
category = list("hacked", "Security")
/datum/design/c9mm
name = "Ammo Box (9mm)"
id = "c9mm"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/ammo_box/c9mm
category = list("hacked", "Security")
/datum/design/electropack
name = "Electropack"
id = "electropack"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 2500)
build_path = /obj/item/electropack
category = list("hacked", "Security")
/datum/design/cleaver
name = "Butcher's Cleaver"
id = "cleaver"
build_type = AUTOLATHE
materials = list(MAT_METAL = 18000)
build_path = /obj/item/kitchen/knife/butcher
category = list("hacked", "Dinnerware")
/datum/design/foilhat
name = "Tinfoil Hat"
id = "tinfoil_hat"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5500)
build_path = /obj/item/clothing/head/foilhat
category = list("hacked", "Misc")
@@ -0,0 +1,251 @@
///////////////////////////////////
//////////Autolathe Designs ///////
///////////////////////////////////
/////////////
////T-Comms//
/////////////
/datum/design/signaler
name = "Remote Signaling Device"
id = "signaler"
build_type = AUTOLATHE
materials = list(MAT_METAL = 400, MAT_GLASS = 120)
build_path = /obj/item/assembly/signaler
category = list("initial", "T-Comm")
/datum/design/radio_headset
name = "Radio Headset"
id = "radio_headset"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75)
build_path = /obj/item/radio/headset
category = list("initial", "T-Comm")
/datum/design/bounced_radio
name = "Station Bounced Radio"
id = "bounced_radio"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75, MAT_GLASS = 25)
build_path = /obj/item/radio/off
category = list("initial", "T-Comm")
/datum/design/intercom_frame
name = "Intercom Frame"
id = "intercom_frame"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75, MAT_GLASS = 25)
build_path = /obj/item/wallframe/intercom
category = list("initial", "T-Comm")
/////////////
////MISC/////
/////////////
/datum/design/camera
name = "Camera"
id = "camera"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 100)
build_path = /obj/item/camera
category = list("initial", "Misc")
/datum/design/camera_film
name = "Camera Film Cartridge"
id = "camera_film"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 10)
build_path = /obj/item/camera_film
category = list("initial", "Misc")
/datum/design/earmuffs
name = "Earmuffs"
id = "earmuffs"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/clothing/ears/earmuffs
category = list("initial", "Misc")
/datum/design/pipe_painter
name = "Pipe Painter"
id = "pipe_painter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2000)
build_path = /obj/item/pipe_painter
category = list("initial", "Misc")
/datum/design/airlock_painter
name = "Airlock Painter"
id = "airlock_painter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/airlock_painter
category = list("initial", "Misc")
/datum/design/cultivator
name = "Cultivator"
id = "cultivator"
build_type = AUTOLATHE
materials = list(MAT_METAL=50)
build_path = /obj/item/cultivator
category = list("initial","Misc")
/datum/design/plant_analyzer
name = "Plant Analyzer"
id = "plant_analyzer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
build_path = /obj/item/plant_analyzer
category = list("initial","Misc")
/datum/design/shovel
name = "Shovel"
id = "shovel"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50)
build_path = /obj/item/shovel
category = list("initial","Misc")
/datum/design/spade
name = "Spade"
id = "spade"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50)
build_path = /obj/item/shovel/spade
category = list("initial","Misc")
/datum/design/hatchet
name = "Hatchet"
id = "hatchet"
build_type = AUTOLATHE
materials = list(MAT_METAL = 15000)
build_path = /obj/item/hatchet
category = list("initial","Misc")
/datum/design/recorder
name = "Universal Recorder"
id = "recorder"
build_type = AUTOLATHE
materials = list(MAT_METAL = 60, MAT_GLASS = 30)
build_path = /obj/item/taperecorder/empty
category = list("initial", "Misc")
/datum/design/tape
name = "Tape"
id = "tape"
build_type = AUTOLATHE
materials = list(MAT_METAL = 20, MAT_GLASS = 5)
build_path = /obj/item/tape/random
category = list("initial", "Misc")
/datum/design/igniter
name = "Igniter"
id = "igniter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
build_path = /obj/item/assembly/igniter
category = list("initial", "Misc")
/datum/design/infrared_emitter
name = "Infrared Emitter"
id = "infrared_emitter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
build_path = /obj/item/assembly/infra
category = list("initial", "Misc")
/datum/design/timer
name = "Timer"
id = "timer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
build_path = /obj/item/assembly/timer
category = list("initial", "Misc")
/datum/design/voice_analyser
name = "Voice Analyser"
id = "voice_analyser"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 50)
build_path = /obj/item/assembly/voice
category = list("initial", "Misc")
/datum/design/prox_sensor
name = "Proximity Sensor"
id = "prox_sensor"
build_type = AUTOLATHE
materials = list(MAT_METAL = 800, MAT_GLASS = 200)
build_path = /obj/item/assembly/prox_sensor
category = list("initial", "Misc")
/datum/design/foam_dart
name = "Box of Foam Darts"
id = "foam_dart"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500)
build_path = /obj/item/ammo_box/foambox
category = list("initial", "Misc")
/datum/design/laptop
name = "Laptop Frame"
id = "laptop"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 1000)
build_path = /obj/item/modular_computer/laptop/buildable
category = list("initial","Misc")
/datum/design/tablet
name = "Tablet Frame"
id = "tablet"
build_type = AUTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
build_path = /obj/item/modular_computer/tablet
category = list("initial","Misc")
/datum/design/slime_scanner
name = "Slime Scanner"
id = "slime_scanner"
build_type = AUTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 200)
build_path = /obj/item/slime_scanner
category = list("initial", "Misc")
/datum/design/pet_carrier
name = "Pet Carrier"
id = "pet_carrier"
build_type = AUTOLATHE
materials = list(MAT_METAL = 7500, MAT_GLASS = 100)
build_path = /obj/item/pet_carrier
category = list("initial", "Misc")
/datum/design/packageWrap
name = "Package Wrapping"
id = "packagewrap"
build_type = AUTOLATHE
materials = list(MAT_METAL = 200, MAT_GLASS = 200)
build_path = /obj/item/stack/packageWrap
category = list("initial", "Misc")
maxstack = 30
/datum/design/holodisk
name = "Holodisk"
id = "holodisk"
build_type = AUTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/disk/holodisk
category = list("initial", "Misc")
/datum/design/lock_collar
name = "Lockable Collar"
id = "lock_collar"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1200, MAT_GLASS = 100)
build_path = /obj/item/clothing/neck/petcollar/locked
category = list("initial", "Misc")
/datum/design/collar_key
name = "Collar Key"
id = "collar_key"
build_type = AUTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 150)
build_path = /obj/item/key/collar
category = list("initial", "Misc")
@@ -0,0 +1,150 @@
///////////////////////////////////
//////////Autolathe Designs ///////
///////////////////////////////////
///////////
///Tools //
///////////
/datum/design/bucket
name = "Bucket"
id = "bucket"
build_type = AUTOLATHE
materials = list(MAT_METAL = 200)
build_path = /obj/item/reagent_containers/glass/bucket
category = list("initial","Tools")
/datum/design/crowbar
name = "Pocket Crowbar"
id = "crowbar"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50)
build_path = /obj/item/crowbar
category = list("initial","Tools")
/datum/design/flashlight
name = "Flashlight"
id = "flashlight"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 20)
build_path = /obj/item/flashlight
category = list("initial","Tools")
/datum/design/extinguisher
name = "Fire Extinguisher"
id = "extinguisher"
build_type = AUTOLATHE
materials = list(MAT_METAL = 90)
build_path = /obj/item/extinguisher
category = list("initial","Tools")
/datum/design/pocketfireextinguisher
name = "Pocket Fire Extinguisher"
id = "pocketfireextinguisher"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 40)
build_path = /obj/item/extinguisher/mini
category = list("initial","Tools")
/datum/design/multitool
name = "Multitool"
id = "multitool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 20)
build_path = /obj/item/multitool
category = list("initial","Tools")
/datum/design/analyzer
name = "Analyzer"
id = "analyzer"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 20)
build_path = /obj/item/analyzer
category = list("initial","Tools")
/datum/design/tscanner
name = "T-Ray Scanner"
id = "tscanner"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150)
build_path = /obj/item/t_scanner
category = list("initial","Tools")
/datum/design/weldingtool
name = "Welding Tool"
id = "welding_tool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 70, MAT_GLASS = 20)
build_path = /obj/item/weldingtool
category = list("initial","Tools")
/datum/design/mini_weldingtool
name = "Emergency Welding Tool"
id = "mini_welding_tool"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30, MAT_GLASS = 10)
build_path = /obj/item/weldingtool/mini
category = list("initial","Tools")
/datum/design/screwdriver
name = "Screwdriver"
id = "screwdriver"
build_type = AUTOLATHE
materials = list(MAT_METAL = 75)
build_path = /obj/item/screwdriver
category = list("initial","Tools")
/datum/design/wirecutters
name = "Wirecutters"
id = "wirecutters"
build_type = AUTOLATHE
materials = list(MAT_METAL = 80)
build_path = /obj/item/wirecutters
category = list("initial","Tools")
/datum/design/wrench
name = "Wrench"
id = "wrench"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150)
build_path = /obj/item/wrench
category = list("initial","Tools")
/datum/design/welding_helmet
name = "Welding Helmet"
id = "welding_helmet"
build_type = AUTOLATHE
materials = list(MAT_METAL = 1750, MAT_GLASS = 400)
build_path = /obj/item/clothing/head/welding
category = list("initial","Tools")
/datum/design/cable_coil
name = "Cable Coil"
id = "cable_coil"
build_type = AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 5)
build_path = /obj/item/stack/cable_coil/random
category = list("initial","Tools")
maxstack = 30
/datum/design/toolbox
name = "Toolbox"
id = "tool_box"
build_type = AUTOLATHE
materials = list(MAT_METAL = 500)
build_path = /obj/item/storage/toolbox
category = list("initial","Tools")
/datum/design/spraycan
name = "Spraycan"
id = "spraycan"
build_type = AUTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/toy/crayon/spraycan
category = list("initial", "Tools")
/datum/design/geiger
name = "Geiger Counter"
id = "geigercounter"
build_type = AUTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
build_path = /obj/item/geiger_counter
category = list("initial", "Tools")
@@ -24,6 +24,17 @@
dangerous_construction = TRUE
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/satchel_holding
name = "Satchel of Holding"
desc = "A satchel that opens into a localized pocket of bluespace."
id = "satchel_holding"
build_type = PROTOLATHE
materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000)
build_path = /obj/item/storage/backpack/holding/satchel
category = list("Bluespace Designs")
dangerous_construction = TRUE
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/biobag_holding
name = "Bio Bag of Holding"
desc = "A chemical holding thingy. Mostly used for xenobiology."
@@ -196,8 +196,8 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_heal
name = "Defibrillartor Healing disk"
desc = "A disk allowing for greater amounts of healing"
name = "Defibrillator Healing disk"
desc = "An upgrade which increases the healing power of the defibrillator"
id = "defib_heal"
build_type = PROTOLATHE
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
@@ -207,8 +207,8 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_shock
name = "Defibrillartor Anit-Shock Disk"
desc = "A disk that helps agains shocking anyone, other then the intented target"
name = "Defibrillator Anti-Shock Disk"
desc = "A safety upgrade that guarantees only the patient will get shocked"
id = "defib_shock"
build_type = PROTOLATHE
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
@@ -218,8 +218,8 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_decay
name = "Defibrillartor Body-Decay extender Disk"
desc = "A disk that helps defibrillator revive the longer decayed dead"
name = "Defibrillator Body-Decay Extender Disk"
desc = "An upgrade allowing the defibrillator to work on more decayed bodies"
id = "defib_decay"
build_type = PROTOLATHE
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 16000, MAT_SILVER = 6000, MAT_TITANIUM = 2000)
@@ -229,8 +229,8 @@
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_speed
name = "Defibrllartor Pre-Primer Disk"
desc = "A disk that cuts the time charg time in half for defibrillator use"
name = "Defibrillator Fast Charge Disk"
desc = "An upgrade to the defibrillator capacitors, which let it charge faster"
id = "defib_speed"
build_type = PROTOLATHE
build_path = /obj/item/disk/medical/defib_speed
+3 -3
View File
@@ -102,8 +102,8 @@
/datum/techweb_node/adv_defibrillator_tec
id = "adv_defibrillator_tec"
display_name = "Adv Defibrillator tec"
description = "More ways to bring back the freshly dead."
display_name = "Defibrillator Upgrades"
description = "More ways to bring back the newly dead."
prereq_ids = list("adv_biotech", "exp_surgery", "adv_engi", "adv_power")
design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
@@ -246,7 +246,7 @@
display_name = "Bluespace Pockets"
description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality."
prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma")
design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash")
design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
export_price = 5000
/////////////////////////plasma tech/////////////////////////
+33 -17
View File
@@ -45,7 +45,8 @@
var/species_color = ""
var/mutation_color = ""
var/no_update = 0
var/body_markings //for bodypart markings
var/body_markings = "" //for bodypart markings
var/body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi'
var/list/markings_color = list()
var/auxmarking
var/list/auxmarking_color = list()
@@ -260,6 +261,7 @@
icon = DEFAULT_BODYPART_ICON_ORGANIC
else if(status == BODYPART_ROBOTIC)
icon = DEFAULT_BODYPART_ICON_ROBOTIC
body_markings = null
if(owner)
owner.updatehealth()
@@ -332,14 +334,18 @@
species_color = ""
if("mam_body_markings" in S.default_features)
var/datum/sprite_accessory/Smark
Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if(H.dna.features.["mam_body_markings"] != "None")
body_markings_icon = Smark.icon
body_markings = lowertext(H.dna.features.["mam_body_markings"])
if(MATRIXED)
markings_color = list(colorlist)
else
body_markings = "plain"
markings_color = (H.dna.features.["mcolor"])
else
body_markings = "None"
body_markings = null
markings_color = ""
if(!dropping_limb && H.dna.check_mutation(HULK))
@@ -354,6 +360,7 @@
if(status == BODYPART_ROBOTIC)
dmg_overlay_type = "robotic"
body_markings = null
if(dropping_limb)
no_update = TRUE //when attached, the limb won't be affected by the appearance changes of its mob owner.
@@ -378,6 +385,8 @@
. = list()
var/image_dir = 0
var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable
if(dropped)
image_dir = SOUTH
if(dmg_overlay_type)
@@ -385,11 +394,14 @@
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir)
if(burnstate)
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir)
if(body_markings)
if(use_digitigrade == NOT_DIGITIGRADE)
. += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
if(body_markings && status != BODYPART_ROBOTIC)
if(!use_digitigrade)
if(BODY_ZONE_CHEST)
. += image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
else
. += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
. += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
var/image/aux
@@ -410,8 +422,6 @@
limb.icon_state = "[animal_origin]_[body_zone]"
return
var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable
if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST))
should_draw_gender = FALSE
@@ -447,9 +457,12 @@
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else if(!use_digitigrade)
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
if(body_zone == BODY_ZONE_CHEST)
marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
else
marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += marking
// Citadel End
@@ -461,7 +474,7 @@
if(species_id == "husk")
auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
else
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
. += auxmarking
else
@@ -475,21 +488,24 @@
. += aux
if(body_markings)
if(species_id == "husk")
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
else
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
. += auxmarking
if(body_markings)
if(species_id == "husk")
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else if(!use_digitigrade)
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
if(body_zone == BODY_ZONE_CHEST)
marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
else
marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
else
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
. += marking
return
@@ -178,6 +178,7 @@
L.update_limb(fixed_icon, src)
if(robotic)
L.change_bodypart_status(BODYPART_ROBOTIC)
L.body_markings = null
. = L
/mob/living/carbon/monkey/newBodyPart(zone, robotic, fixed_icon)
+69
View File
@@ -0,0 +1,69 @@
/obj/item/nutcracker
name = "nutcracker"
desc = "It seems quite oversized. You could probably even crush a watermelon with it."
icon = 'icons/obj/surgery.dmi'
icon_state = "nutcracker"
force = 10
flags_1 = CONDUCT_1
w_class = WEIGHT_CLASS_NORMAL
attack_verb = list("smashed", "beaten", "crushed")
/obj/item/nutcracker/proc/gib_head(mob/living/carbon/M)
var/obj/item/bodypart/head = M.get_bodypart("head")
if(!head)
return
var/turf/T = get_turf(M)
var/list/organs = M.getorganszone("head") + M.getorganszone("eyes") + M.getorganszone("mouth")
for(var/internal_organ in organs)
var/obj/item/organ/I = internal_organ
I.Remove(M)
I.forceMove(T)
head.drop_limb()
qdel(head)
new M.gib_type(T,1,M.get_static_viruses())
M.add_splatter_floor(T)
playsound(M, 'sound/effects/splat.ogg', 50, 1)
//It's a bit of a clusterfuck, but if someone wants, it can be easily repurposed to work on other limbs too.
/obj/item/nutcracker/attack(mob/living/carbon/M, mob/living/carbon/user)
. = ..()
var/target_zone = "head"
var/obj/item/bodypart/target_limb = M.get_bodypart(target_zone)
if(!get_turf(M))
return
if(!istype(M))
return
if(M == user) //just use the suicide verb instead
return
if(user.zone_selected != "head")
return
if(!target_limb)
to_chat(user, "<span class='notice'>[M] has no [parse_zone(target_zone)]!</span>")
return
if(!get_location_accessible(M, target_zone))
to_chat(user, "<span class='notice'>Expose [M]\s head before trying to crush it!</span>")
return
M.visible_message("<span class='warning'>[user] is trying to crush [M]\s head with \the [src]!</span>")
var/crush_time = max(0, 400 - target_limb.brute_dam*2)
if(do_mob(user, M, crush_time))
if(get_location_accessible(M, target_zone)) //Yes, two checks, before and after the timer. What if someone puts a helmet on the guy while you're crushing his head?
if(target_limb)//If he still has the head. In case you queue up a lot of these up at once or the guy loses the head while you're removing it.
M.visible_message("<span class='warning'>[M]\s head cracks like a watermelon, spilling everything inside, as it becomes an unrecognizable mess!</span>")
gib_head(M)
else
to_chat(user, "<span class='notice'>Expose [M]\s head before trying to crush it!</span>")
/obj/item/nutcracker/suicide_act(mob/living/carbon/user)
var/obj/item/bodypart/target_limb = user.get_bodypart("head")
if(target_limb) //I mean like... for example lings can be still alive without heads.
user.visible_message("<span class='suicide'>[user] is crushing [user.p_their()] own head with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
if(do_after(user, 30))
gib_head(user)
else
return
return (BRUTELOSS)
+4
View File
@@ -113,6 +113,10 @@
if(owner)
to_chat(owner, "<span class ='userdanger'>Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!</span>")
/obj/item/organ/heart/cursed/Remove(mob/living/carbon/M, special = 0)
..()
M.remove_client_colour(/datum/client_colour/cursed_heart_blood)
/datum/action/item_action/organ_action/cursed_heart
name = "Pump your blood"
+13
View File
@@ -988,6 +988,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/backpack/duffelbag/syndie/surgery
cost = 3
/datum/uplink_item/device_tools/nutcracker
name = "Nutcracker"
desc = "An oversized version of what you'd initially expect here. Big enough to crush skulls."
item = /obj/item/nutcracker
cost = 1
/datum/uplink_item/device_tools/surgerybag_adv
name = "Syndicate Surgery Duffel Bag"
desc = "The Syndicate surgery duffel bag is a toolkit containing all newest surgery tools, surgical drapes, \
@@ -1438,6 +1444,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 20
restricted_roles = list("Assistant")
/datum/uplink_item/role_restricted/goldenbox
name = "Gold Toolbox"
desc = "A gold planted plastitanium toolbox loaded with tools. Comes with a set of AI detection multi-tool and a pare of combat gloves."
item = /obj/item/storage/toolbox/gold_real
cost = 5 // Has synda tools + gloves + a robust weapon
restricted_roles = list("Assistant", "Curator") //Curator do to being made of gold - It fits the theme
/datum/uplink_item/role_restricted/brainwash_disk
name = "Brainwashing Surgery Program"
desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \
+107 -107
View File
@@ -6,114 +6,114 @@
icon_deny = "clothes-deny"
product_slogans = "Dress for success!;Prepare to look swagalicious!;Look at all this free swag!;Why leave style up to fate? Use the ClothesMate!"
vend_reply = "Thank you for using the ClothesMate!"
products = list(/obj/item/clothing/head/that = 2,
/obj/item/clothing/head/fedora = 1,
/obj/item/clothing/glasses/monocle = 1,
/obj/item/clothing/suit/jacket = 2,
/obj/item/clothing/suit/jacket/puffer/vest = 2,
/obj/item/clothing/suit/jacket/puffer = 2,
/obj/item/clothing/under/suit_jacket/navy = 1,
/obj/item/clothing/under/suit_jacket/really_black = 1,
/obj/item/clothing/under/suit_jacket/burgundy = 1,
/obj/item/clothing/under/suit_jacket/charcoal = 1,
/obj/item/clothing/under/suit_jacket/white = 1,
/obj/item/clothing/under/kilt = 1,
/obj/item/clothing/under/overalls = 1,
/obj/item/clothing/under/sl_suit = 1,
/obj/item/clothing/under/pants/jeans = 3,
/obj/item/clothing/under/pants/classicjeans = 2,
/obj/item/clothing/under/pants/camo = 1,
/obj/item/clothing/under/pants/blackjeans = 2,
/obj/item/clothing/under/pants/khaki = 2,
/obj/item/clothing/under/pants/white = 2,
/obj/item/clothing/under/pants/red = 1,
/obj/item/clothing/under/pants/black = 2,
/obj/item/clothing/under/pants/tan = 2,
/obj/item/clothing/under/pants/track = 1,
/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/neck/tie/blue = 1,
/obj/item/clothing/neck/tie/red = 1,
/obj/item/clothing/neck/tie/black = 1,
/obj/item/clothing/neck/tie/horrible = 1,
/obj/item/clothing/neck/scarf/pink = 1,
/obj/item/clothing/neck/scarf/red = 1,
/obj/item/clothing/neck/scarf/green = 1,
/obj/item/clothing/neck/scarf/darkblue = 1,
/obj/item/clothing/neck/scarf/purple = 1,
/obj/item/clothing/neck/scarf/yellow = 1,
/obj/item/clothing/neck/scarf/orange = 1,
/obj/item/clothing/neck/scarf/cyan = 1,
/obj/item/clothing/neck/scarf = 1,
/obj/item/clothing/neck/scarf/black = 1,
/obj/item/clothing/neck/scarf/zebra = 1,
/obj/item/clothing/neck/scarf/christmas = 1,
/obj/item/clothing/neck/stripedredscarf = 1,
/obj/item/clothing/neck/stripedbluescarf = 1,
/obj/item/clothing/neck/stripedgreenscarf = 1,
/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/under/skirt/black = 1,
/obj/item/clothing/under/skirt/blue = 1,
/obj/item/clothing/under/skirt/red = 1,
/obj/item/clothing/under/skirt/purple = 1,
/obj/item/clothing/under/sundress = 2,
/obj/item/clothing/under/stripeddress = 1,
/obj/item/clothing/under/sailordress = 1,
/obj/item/clothing/under/redeveninggown = 1,
/obj/item/clothing/under/blacktango = 1,
/obj/item/clothing/under/plaid_skirt = 1,
/obj/item/clothing/under/plaid_skirt/blue = 1,
/obj/item/clothing/under/plaid_skirt/purple = 1,
/obj/item/clothing/under/plaid_skirt/green = 1,
/obj/item/clothing/glasses/regular = 1,
/obj/item/clothing/glasses/regular/jamjar = 1,
/obj/item/clothing/head/sombrero = 1,
/obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/suit/ianshirt = 1,
/obj/item/clothing/shoes/laceup = 2,
/obj/item/clothing/shoes/sneakers/black = 4,
/obj/item/clothing/shoes/sandal = 1,
/obj/item/clothing/gloves/fingerless = 2,
/obj/item/clothing/glasses/orange = 1,
/obj/item/clothing/glasses/red = 1,
/obj/item/storage/belt/fannypack = 1,
/obj/item/storage/belt/fannypack/blue = 1,
/obj/item/storage/belt/fannypack/red = 1,
/obj/item/clothing/suit/jacket/letterman = 2,
/obj/item/clothing/head/beanie = 1,
/obj/item/clothing/head/beanie/black = 1,
/obj/item/clothing/head/beanie/red = 1,
/obj/item/clothing/head/beanie/green = 1,
/obj/item/clothing/head/beanie/darkblue = 1,
/obj/item/clothing/head/beanie/purple = 1,
/obj/item/clothing/head/beanie/yellow = 1,
/obj/item/clothing/head/beanie/orange = 1,
/obj/item/clothing/head/beanie/cyan = 1,
/obj/item/clothing/head/beanie/christmas = 1,
/obj/item/clothing/head/beanie/striped = 1,
/obj/item/clothing/head/beanie/stripedred = 1,
/obj/item/clothing/head/beanie/stripedblue = 1,
/obj/item/clothing/head/beanie/stripedgreen = 1,
/obj/item/clothing/suit/jacket/letterman_red = 1,
products = list(/obj/item/clothing/head/that = 4,
/obj/item/clothing/head/fedora = 3,
/obj/item/clothing/glasses/monocle = 3,
/obj/item/clothing/suit/jacket = 4,
/obj/item/clothing/suit/jacket/puffer/vest = 4,
/obj/item/clothing/suit/jacket/puffer = 4,
/obj/item/clothing/under/suit_jacket/navy = 3,
/obj/item/clothing/under/suit_jacket/really_black = 3,
/obj/item/clothing/under/suit_jacket/burgundy = 3,
/obj/item/clothing/under/suit_jacket/charcoal = 3,
/obj/item/clothing/under/suit_jacket/white = 3,
/obj/item/clothing/under/kilt = 3,
/obj/item/clothing/under/overalls = 3,
/obj/item/clothing/under/sl_suit = 3,
/obj/item/clothing/under/pants/jeans = 5,
/obj/item/clothing/under/pants/classicjeans = 5,
/obj/item/clothing/under/pants/camo = 3,
/obj/item/clothing/under/pants/blackjeans = 5,
/obj/item/clothing/under/pants/khaki = 5,
/obj/item/clothing/under/pants/white = 5,
/obj/item/clothing/under/pants/red = 3,
/obj/item/clothing/under/pants/black = 4,
/obj/item/clothing/under/pants/tan = 4,
/obj/item/clothing/under/pants/track = 3,
/obj/item/clothing/suit/jacket/miljacket = 5,
/obj/item/clothing/neck/tie/blue = 3,
/obj/item/clothing/neck/tie/red = 3,
/obj/item/clothing/neck/tie/black = 3,
/obj/item/clothing/neck/tie/horrible = 5,
/obj/item/clothing/neck/scarf/pink = 3,
/obj/item/clothing/neck/scarf/red = 3,
/obj/item/clothing/neck/scarf/green = 3,
/obj/item/clothing/neck/scarf/darkblue = 3,
/obj/item/clothing/neck/scarf/purple = 3,
/obj/item/clothing/neck/scarf/yellow = 3,
/obj/item/clothing/neck/scarf/orange = 3,
/obj/item/clothing/neck/scarf/cyan = 3,
/obj/item/clothing/neck/scarf = 3,
/obj/item/clothing/neck/scarf/black = 3,
/obj/item/clothing/neck/scarf/zebra = 3,
/obj/item/clothing/neck/scarf/christmas = 3,
/obj/item/clothing/neck/stripedredscarf = 3,
/obj/item/clothing/neck/stripedbluescarf = 3,
/obj/item/clothing/neck/stripedgreenscarf = 3,
/obj/item/clothing/accessory/waistcoat = 2,
/obj/item/clothing/under/skirt/black = 3,
/obj/item/clothing/under/skirt/blue = 3,
/obj/item/clothing/under/skirt/red = 3,
/obj/item/clothing/under/skirt/purple = 3,
/obj/item/clothing/under/sundress = 4,
/obj/item/clothing/under/stripeddress = 3,
/obj/item/clothing/under/sailordress = 3,
/obj/item/clothing/under/redeveninggown = 3,
/obj/item/clothing/under/blacktango = 3,
/obj/item/clothing/under/plaid_skirt = 3,
/obj/item/clothing/under/plaid_skirt/blue = 3,
/obj/item/clothing/under/plaid_skirt/purple = 3,
/obj/item/clothing/under/plaid_skirt/green = 3,
/obj/item/clothing/glasses/regular = 2,
/obj/item/clothing/glasses/regular/jamjar = 2,
/obj/item/clothing/head/sombrero = 3,
/obj/item/clothing/suit/poncho = 3,
/obj/item/clothing/suit/ianshirt = 3,
/obj/item/clothing/shoes/laceup = 5,
/obj/item/clothing/shoes/sneakers/black = 6,
/obj/item/clothing/shoes/sandal = 3,
/obj/item/clothing/gloves/fingerless = 3,
/obj/item/clothing/glasses/orange = 5,
/obj/item/clothing/glasses/red = 5,
/obj/item/storage/belt/fannypack = 3,
/obj/item/storage/belt/fannypack/blue = 3,
/obj/item/storage/belt/fannypack/red = 3,
/obj/item/clothing/suit/jacket/letterman = 5,
/obj/item/clothing/head/beanie = 3,
/obj/item/clothing/head/beanie/black = 3,
/obj/item/clothing/head/beanie/red = 3,
/obj/item/clothing/head/beanie/green = 3,
/obj/item/clothing/head/beanie/darkblue = 3,
/obj/item/clothing/head/beanie/purple = 3,
/obj/item/clothing/head/beanie/yellow = 3,
/obj/item/clothing/head/beanie/orange = 3,
/obj/item/clothing/head/beanie/cyan = 3,
/obj/item/clothing/head/beanie/christmas = 3,
/obj/item/clothing/head/beanie/striped = 3,
/obj/item/clothing/head/beanie/stripedred = 3,
/obj/item/clothing/head/beanie/stripedblue = 3,
/obj/item/clothing/head/beanie/stripedgreen = 3,
/obj/item/clothing/suit/jacket/letterman_red = 3,
/obj/item/clothing/ears/headphones = 10,
/obj/item/clothing/suit/apron/purple_bartender = 2,
/obj/item/clothing/under/rank/bartender/purple = 2)
contraband = list(/obj/item/clothing/under/syndicate/tacticool = 1,
/obj/item/clothing/mask/balaclava = 1,
/obj/item/clothing/head/ushanka = 1,
/obj/item/clothing/under/soviet = 1,
/obj/item/storage/belt/fannypack/black = 2,
/obj/item/clothing/suit/jacket/letterman_syndie = 1,
/obj/item/clothing/under/jabroni = 1,
/obj/item/clothing/suit/vapeshirt = 1,
/obj/item/clothing/under/geisha = 1)
premium = list(/obj/item/clothing/under/suit_jacket/checkered = 1,
/obj/item/clothing/head/mailman = 1,
/obj/item/clothing/under/rank/mailman = 1,
/obj/item/clothing/suit/jacket/leather = 1,
/obj/item/clothing/suit/jacket/leather/overcoat = 1,
/obj/item/clothing/under/pants/mustangjeans = 1,
/obj/item/clothing/neck/necklace/dope = 3,
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 1)
/obj/item/clothing/suit/apron/purple_bartender = 4,
/obj/item/clothing/under/rank/bartender/purple = 4)
contraband = list(/obj/item/clothing/under/syndicate/tacticool = 3,
/obj/item/clothing/mask/balaclava = 3,
/obj/item/clothing/head/ushanka = 3,
/obj/item/clothing/under/soviet = 3,
/obj/item/storage/belt/fannypack/black = 3,
/obj/item/clothing/suit/jacket/letterman_syndie = 5,
/obj/item/clothing/under/jabroni = 2,
/obj/item/clothing/suit/vapeshirt = 2,
/obj/item/clothing/under/geisha = 4)
premium = list(/obj/item/clothing/under/suit_jacket/checkered = 4,
/obj/item/clothing/head/mailman = 2,
/obj/item/clothing/under/rank/mailman = 2,
/obj/item/clothing/suit/jacket/leather = 4,
/obj/item/clothing/suit/jacket/leather/overcoat = 4,
/obj/item/clothing/under/pants/mustangjeans = 3,
/obj/item/clothing/neck/necklace/dope = 5,
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 5)
refill_canister = /obj/item/vending_refill/clothing
/obj/item/vending_refill/clothing
+146 -146
View File
@@ -7,21 +7,21 @@
icon_state = "secdrobe"
product_ads = "Beat perps in style!;It's red so you can't see the blood!;You have the right to be fashionable!;Now you can be the fashion police you always wanted to be!"
vend_reply = "Thank you for using the SecDrobe!"
products = list(/obj/item/clothing/suit/hooded/wintercoat/security = 1,
/obj/item/storage/backpack/security = 1,
/obj/item/storage/backpack/satchel/sec = 1,
/obj/item/storage/backpack/duffelbag/sec = 2,
/obj/item/clothing/under/rank/security = 3,
/obj/item/clothing/shoes/jackboots = 3,
/obj/item/clothing/head/beret/sec = 3,
/obj/item/clothing/head/soft/sec = 3,
/obj/item/clothing/mask/bandana/red = 3,
/obj/item/clothing/under/rank/security/skirt = 3,
/obj/item/clothing/under/rank/security/grey = 3,
/obj/item/clothing/under/pants/khaki = 3)
premium = list(/obj/item/clothing/under/rank/security/navyblue = 3,
/obj/item/clothing/suit/security/officer = 3,
/obj/item/clothing/head/beret/sec/navyofficer = 3)
products = list(/obj/item/clothing/suit/hooded/wintercoat/security = 2,
/obj/item/storage/backpack/security = 2,
/obj/item/storage/backpack/satchel/sec = 2,
/obj/item/storage/backpack/duffelbag/sec = 3,
/obj/item/clothing/under/rank/security = 5,
/obj/item/clothing/shoes/jackboots = 5,
/obj/item/clothing/head/beret/sec =5,
/obj/item/clothing/head/soft/sec = 5,
/obj/item/clothing/mask/bandana/red = 5,
/obj/item/clothing/under/rank/security/skirt = 5,
/obj/item/clothing/under/rank/security/grey = 5,
/obj/item/clothing/under/pants/khaki = 5)
premium = list(/obj/item/clothing/under/rank/security/navyblue = 5,
/obj/item/clothing/suit/security/officer = 5,
/obj/item/clothing/head/beret/sec/navyofficer = 5)
refill_canister = /obj/item/vending_refill/wardrobe/sec_wardrobe
/obj/item/vending_refill/wardrobe/sec_wardrobe
@@ -33,23 +33,23 @@
icon_state = "medidrobe"
product_ads = "Make those blood stains look fashionable!!"
vend_reply = "Thank you for using the MediDrobe!"
products = list(/obj/item/clothing/accessory/pocketprotector = 1,
/obj/item/storage/backpack/duffelbag/med = 1,
/obj/item/storage/backpack/medic = 1,
/obj/item/storage/backpack/satchel/med = 1,
/obj/item/clothing/suit/hooded/wintercoat/medical = 1,
/obj/item/clothing/under/rank/nursesuit = 1,
/obj/item/clothing/head/nursehat = 1,
/obj/item/clothing/under/rank/medical/blue = 1,
/obj/item/clothing/under/rank/medical/green = 1,
/obj/item/clothing/under/rank/medical/purple = 1,
/obj/item/clothing/under/rank/medical = 3,
/obj/item/clothing/suit/toggle/labcoat = 3,
/obj/item/clothing/suit/toggle/labcoat/emt = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/head/soft/emt = 3,
/obj/item/clothing/suit/apron/surgical = 1,
/obj/item/clothing/mask/surgical = 1)
products = list(/obj/item/clothing/accessory/pocketprotector = 3,
/obj/item/storage/backpack/duffelbag/med = 3,
/obj/item/storage/backpack/medic = 3,
/obj/item/storage/backpack/satchel/med = 3,
/obj/item/clothing/suit/hooded/wintercoat/medical = 3,
/obj/item/clothing/under/rank/nursesuit = 3,
/obj/item/clothing/head/nursehat = 3,
/obj/item/clothing/under/rank/medical/blue = 2,
/obj/item/clothing/under/rank/medical/green = 2,
/obj/item/clothing/under/rank/medical/purple = 2,
/obj/item/clothing/under/rank/medical = 5,
/obj/item/clothing/suit/toggle/labcoat = 5,
/obj/item/clothing/suit/toggle/labcoat/emt = 5,
/obj/item/clothing/shoes/sneakers/white = 5,
/obj/item/clothing/head/soft/emt = 5,
/obj/item/clothing/suit/apron/surgical = 3,
/obj/item/clothing/mask/surgical = 5)
refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe
/obj/item/vending_refill/wardrobe/medi_wardrobe
@@ -61,15 +61,15 @@
icon_state = "engidrobe"
product_ads = "Guaranteed to protect your feet from industrial accidents!;Afraid of radiation? Then wear yellow!"
vend_reply = "Thank you for using the EngiDrobe!"
products = list(/obj/item/clothing/accessory/pocketprotector = 1,
/obj/item/storage/backpack/duffelbag/engineering = 1,
/obj/item/storage/backpack/industrial = 1,
/obj/item/storage/backpack/satchel/eng = 1,
/obj/item/clothing/suit/hooded/wintercoat/engineering = 1,
/obj/item/clothing/under/rank/engineer = 3,
/obj/item/clothing/suit/hazardvest = 3,
/obj/item/clothing/shoes/workboots = 3,
/obj/item/clothing/head/hardhat = 3)
products = list(/obj/item/clothing/accessory/pocketprotector = 5,
/obj/item/storage/backpack/duffelbag/engineering = 2,
/obj/item/storage/backpack/industrial = 3,
/obj/item/storage/backpack/satchel/eng = 3,
/obj/item/clothing/suit/hooded/wintercoat/engineering = 3,
/obj/item/clothing/under/rank/engineer = 5,
/obj/item/clothing/suit/hazardvest = 5,
/obj/item/clothing/shoes/workboots = 5,
/obj/item/clothing/head/hardhat = 5)
refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe
/obj/item/vending_refill/wardrobe/engi_wardrobe
@@ -81,13 +81,13 @@
icon_state = "atmosdrobe"
product_ads = "Get your inflammable clothing right here!!!"
vend_reply = "Thank you for using the AtmosDrobe!"
products = list(/obj/item/clothing/accessory/pocketprotector = 1,
/obj/item/storage/backpack/duffelbag/engineering = 1,
/obj/item/storage/backpack/satchel/eng = 1,
/obj/item/storage/backpack/industrial = 1,
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 3,
/obj/item/clothing/under/rank/atmospheric_technician = 3,
/obj/item/clothing/shoes/sneakers/black = 3)
products = list(/obj/item/clothing/accessory/pocketprotector = 3,
/obj/item/storage/backpack/duffelbag/engineering = 3,
/obj/item/storage/backpack/satchel/eng = 3,
/obj/item/storage/backpack/industrial = 3,
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 5,
/obj/item/clothing/under/rank/atmospheric_technician = 5,
/obj/item/clothing/shoes/sneakers/black = 5)
refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe
/obj/item/vending_refill/wardrobe/atmos_wardrobe
@@ -99,12 +99,12 @@
icon_state = "cargodrobe"
product_ads = "Upgraded Assistant Style! Pick yours today!;These shorts are comfy and easy to wear, get yours now!"
vend_reply = "Thank you for using the CargoDrobe!"
products = list(/obj/item/clothing/suit/hooded/wintercoat/cargo = 1,
/obj/item/clothing/under/rank/cargotech = 3,
/obj/item/clothing/shoes/sneakers/black = 3,
/obj/item/clothing/gloves/fingerless = 3,
/obj/item/clothing/head/soft = 3,
/obj/item/radio/headset/headset_cargo = 1)
products = list(/obj/item/clothing/suit/hooded/wintercoat/cargo = 3,
/obj/item/clothing/under/rank/cargotech = 5,
/obj/item/clothing/shoes/sneakers/black = 5,
/obj/item/clothing/gloves/fingerless = 5,
/obj/item/clothing/head/soft = 5,
/obj/item/radio/headset/headset_cargo = 3)
refill_canister = /obj/item/vending_refill/wardrobe/cargo_wardrobe
/obj/item/vending_refill/wardrobe/cargo_wardrobe
@@ -116,13 +116,13 @@
icon_state = "robodrobe"
product_ads = "You turn me TRUE, use defines!;0110001101101100011011110111010001101000011001010111001101101000011001010111001001100101"
vend_reply = "Thank you for using the RoboDrobe!"
products = list(/obj/item/clothing/glasses/hud/diagnostic = 2,
/obj/item/clothing/under/rank/roboticist = 2,
/obj/item/clothing/suit/toggle/labcoat = 2,
/obj/item/clothing/shoes/sneakers/black = 2,
/obj/item/clothing/gloves/fingerless = 2,
/obj/item/clothing/head/soft/black = 2,
/obj/item/clothing/mask/bandana/skull = 1)
products = list(/obj/item/clothing/glasses/hud/diagnostic = 3,
/obj/item/clothing/under/rank/roboticist = 3,
/obj/item/clothing/suit/toggle/labcoat = 3,
/obj/item/clothing/shoes/sneakers/black = 3,
/obj/item/clothing/gloves/fingerless = 3,
/obj/item/clothing/head/soft/black = 3,
/obj/item/clothing/mask/bandana/skull = 2)
premium = list(/obj/item/radio/headset/headset_rob = 2) //Cit change
refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe
@@ -135,15 +135,15 @@
icon_state = "scidrobe"
product_ads = "Longing for the smell of flesh plasma? Buy your science clothing now!;Made with 10% Auxetics, so you don't have to worry losing your arm!"
vend_reply = "Thank you for using the SciDrobe!"
products = list(/obj/item/clothing/accessory/pocketprotector = 1,
/obj/item/storage/backpack/science = 2,
/obj/item/storage/backpack/satchel/tox = 2,
/obj/item/clothing/suit/hooded/wintercoat/science = 1,
/obj/item/clothing/under/rank/scientist = 3,
/obj/item/clothing/suit/toggle/labcoat/science = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/radio/headset/headset_sci = 2,
/obj/item/clothing/mask/gas = 3)
products = list(/obj/item/clothing/accessory/pocketprotector = 5,
/obj/item/storage/backpack/science = 3,
/obj/item/storage/backpack/satchel/tox = 3,
/obj/item/clothing/suit/hooded/wintercoat/science = 3,
/obj/item/clothing/under/rank/scientist = 4,
/obj/item/clothing/suit/toggle/labcoat/science = 4,
/obj/item/clothing/shoes/sneakers/white = 4,
/obj/item/radio/headset/headset_sci = 4,
/obj/item/clothing/mask/gas = 5)
refill_canister = /obj/item/vending_refill/wardrobe/science_wardrobe
/obj/item/vending_refill/wardrobe/science_wardrobe
@@ -155,13 +155,13 @@
icon_state = "hydrobe"
product_ads = "Do you love soil? Then buy our clothes!;Get outfits to match your green thumb here!"
vend_reply = "Thank you for using the Hydrobe!"
products = list(/obj/item/storage/backpack/botany = 2,
/obj/item/storage/backpack/satchel/hyd = 2,
/obj/item/clothing/suit/hooded/wintercoat/hydro = 1,
/obj/item/clothing/suit/apron = 2,
/obj/item/clothing/suit/apron/overalls = 3,
/obj/item/clothing/under/rank/hydroponics = 3,
/obj/item/clothing/mask/bandana = 3)
products = list(/obj/item/storage/backpack/botany = 3,
/obj/item/storage/backpack/satchel/hyd = 3,
/obj/item/clothing/suit/hooded/wintercoat/hydro = 2,
/obj/item/clothing/suit/apron = 3,
/obj/item/clothing/suit/apron/overalls = 5,
/obj/item/clothing/under/rank/hydroponics = 5,
/obj/item/clothing/mask/bandana = 4)
refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe
/obj/item/vending_refill/wardrobe/hydro_wardrobe
@@ -173,12 +173,12 @@
icon_state = "curadrobe"
product_ads = "Our clothes are endorsed by treasure hunters everywhere!"
vend_reply = "Thank you for using the CuraDrobe!"
products = list(/obj/item/clothing/head/fedora/curator = 1,
/obj/item/clothing/suit/curator = 1,
/obj/item/clothing/under/rank/curator/treasure_hunter = 1,
/obj/item/clothing/shoes/workboots/mining = 1,
/obj/item/storage/backpack/satchel/explorer = 1,
/obj/item/storage/bag/books = 1)
products = list(/obj/item/clothing/head/fedora/curator = 2,
/obj/item/clothing/suit/curator = 2,
/obj/item/clothing/under/rank/curator/treasure_hunter = 2,
/obj/item/clothing/shoes/workboots/mining = 2,
/obj/item/storage/backpack/satchel/explorer = 2,
/obj/item/storage/bag/books = 2)
refill_canister = /obj/item/vending_refill/wardrobe/curator_wardrobe
/obj/item/vending_refill/wardrobe/curator_wardrobe
@@ -190,21 +190,21 @@
icon_state = "bardrobe"
product_ads = "Guaranteed to prevent stains from spilled drinks!"
vend_reply = "Thank you for using the BarDrobe!"
products = list(/obj/item/clothing/head/that = 2,
/obj/item/radio/headset/headset_srv = 2,
/obj/item/clothing/under/sl_suit = 2,
/obj/item/clothing/under/rank/bartender = 2,
/obj/item/clothing/under/rank/bartender/purple = 1,
/obj/item/clothing/accessory/waistcoat = 2,
/obj/item/clothing/suit/apron/purple_bartender = 1,
/obj/item/clothing/head/soft/black = 2,
/obj/item/clothing/shoes/sneakers/black = 2,
/obj/item/reagent_containers/glass/rag = 2,
products = list(/obj/item/clothing/head/that = 3,
/obj/item/radio/headset/headset_srv = 3,
/obj/item/clothing/under/sl_suit = 3,
/obj/item/clothing/under/rank/bartender = 3,
/obj/item/clothing/under/rank/bartender/purple = 2,
/obj/item/clothing/accessory/waistcoat = 3,
/obj/item/clothing/suit/apron/purple_bartender = 2,
/obj/item/clothing/head/soft/black = 4,
/obj/item/clothing/shoes/sneakers/black = 4,
/obj/item/reagent_containers/glass/rag = 4,
/obj/item/storage/box/beanbag = 1,
/obj/item/clothing/suit/armor/vest/alt = 1,
/obj/item/circuitboard/machine/dish_drive = 1,
/obj/item/clothing/glasses/sunglasses/reagent = 1,
/obj/item/clothing/neck/petcollar = 1,
/obj/item/clothing/neck/petcollar = 3,
/obj/item/storage/belt/bandolier = 1)
refill_canister = /obj/item/vending_refill/wardrobe/bar_wardrobe
@@ -217,17 +217,17 @@
icon_state = "chefdrobe"
product_ads = "Our clothes are guaranteed to protect you from food splatters!"
vend_reply = "Thank you for using the ChefDrobe!"
products = list(/obj/item/clothing/under/waiter = 2,
/obj/item/radio/headset/headset_srv = 2,
/obj/item/clothing/accessory/waistcoat = 2,
products = list(/obj/item/clothing/under/waiter = 3,
/obj/item/radio/headset/headset_srv = 4,
/obj/item/clothing/accessory/waistcoat = 3,
/obj/item/clothing/suit/apron/chef = 3,
/obj/item/clothing/head/soft/mime = 2,
/obj/item/storage/box/mousetraps = 2,
/obj/item/circuitboard/machine/dish_drive = 1,
/obj/item/clothing/suit/toggle/chef = 1,
/obj/item/clothing/under/rank/chef = 1,
/obj/item/clothing/head/chefhat = 1,
/obj/item/reagent_containers/glass/rag = 1)
/obj/item/clothing/suit/toggle/chef = 2,
/obj/item/clothing/under/rank/chef = 2,
/obj/item/clothing/head/chefhat = 2,
/obj/item/reagent_containers/glass/rag = 3)
refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe
/obj/item/vending_refill/wardrobe/chef_wardrobe
@@ -239,21 +239,21 @@
icon_state = "janidrobe"
product_ads = "Come and get your janitorial clothing, now endorsed by lizard janitors everywhere!"
vend_reply = "Thank you for using the JaniDrobe!"
products = list(/obj/item/clothing/under/rank/janitor = 1,
/obj/item/cartridge/janitor = 1,
/obj/item/clothing/gloves/color/black = 1,
/obj/item/clothing/head/soft/purple = 1,
/obj/item/paint/paint_remover = 1,
products = list(/obj/item/clothing/under/rank/janitor = 2,
/obj/item/cartridge/janitor = 3,
/obj/item/clothing/gloves/color/black = 2,
/obj/item/clothing/head/soft/purple = 2,
/obj/item/paint/paint_remover = 2,
/obj/item/melee/flyswatter = 1,
/obj/item/flashlight = 1,
/obj/item/caution = 6,
/obj/item/flashlight = 2,
/obj/item/caution = 8,
/obj/item/holosign_creator = 1,
/obj/item/lightreplacer = 1,
/obj/item/soap = 1,
/obj/item/storage/bag/trash = 1,
/obj/item/clothing/shoes/galoshes = 1,
/obj/item/watertank/janitor = 1,
/obj/item/storage/belt/janitor = 1)
/obj/item/storage/belt/janitor = 2)
refill_canister = /obj/item/vending_refill/wardrobe/jani_wardrobe
/obj/item/vending_refill/wardrobe/jani_wardrobe
@@ -265,17 +265,17 @@
icon_state = "lawdrobe"
product_ads = "OBJECTION! Get the rule of law for yourself!"
vend_reply = "Thank you for using the LawDrobe!"
products = list(/obj/item/clothing/under/lawyer/female = 1,
/obj/item/clothing/under/lawyer/black = 1,
/obj/item/clothing/under/lawyer/red = 1,
/obj/item/clothing/under/lawyer/bluesuit = 1,
/obj/item/clothing/suit/toggle/lawyer = 1,
/obj/item/clothing/under/lawyer/purpsuit = 1,
/obj/item/clothing/suit/toggle/lawyer/purple = 1,
/obj/item/clothing/under/lawyer/blacksuit = 1,
/obj/item/clothing/suit/toggle/lawyer/black = 1,
/obj/item/clothing/shoes/laceup = 2,
/obj/item/clothing/accessory/lawyers_badge = 2)
products = list(/obj/item/clothing/under/lawyer/female = 3,
/obj/item/clothing/under/lawyer/black = 3,
/obj/item/clothing/under/lawyer/red = 3,
/obj/item/clothing/under/lawyer/bluesuit = 3,
/obj/item/clothing/suit/toggle/lawyer = 3,
/obj/item/clothing/under/lawyer/purpsuit = 3,
/obj/item/clothing/suit/toggle/lawyer/purple = 3,
/obj/item/clothing/under/lawyer/blacksuit = 3,
/obj/item/clothing/suit/toggle/lawyer/black = 3,
/obj/item/clothing/shoes/laceup = 3,
/obj/item/clothing/accessory/lawyers_badge = 3)
refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe
/obj/item/vending_refill/wardrobe/law_wardrobe
@@ -288,14 +288,14 @@
product_ads = "Are you being bothered by cultists or pesky revenants? Then come and dress like the holy man!;Clothes for men of the cloth!"
vend_reply = "Thank you for using the ChapDrobe!"
products = list(/obj/item/holybeacon = 1,
/obj/item/storage/backpack/cultpack = 1,
/obj/item/clothing/accessory/pocketprotector/cosmetology = 1,
/obj/item/clothing/under/rank/chaplain = 1,
/obj/item/clothing/shoes/sneakers/black = 1,
/obj/item/clothing/suit/nun = 1,
/obj/item/clothing/head/nun_hood = 1,
/obj/item/clothing/suit/holidaypriest = 1,
/obj/item/storage/fancy/candle_box = 2)
/obj/item/storage/backpack/cultpack = 2,
/obj/item/clothing/accessory/pocketprotector/cosmetology = 2,
/obj/item/clothing/under/rank/chaplain = 2,
/obj/item/clothing/shoes/sneakers/black = 2,
/obj/item/clothing/suit/nun = 2,
/obj/item/clothing/head/nun_hood = 2,
/obj/item/clothing/suit/holidaypriest = 2,
/obj/item/storage/fancy/candle_box = 3)
refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe
/obj/item/vending_refill/wardrobe/chap_wardrobe
@@ -307,13 +307,13 @@
icon_state = "chemdrobe"
product_ads = "Our clothes are 0.5% more resistant to acid spills! Get yours now!"
vend_reply = "Thank you for using the ChemDrobe!"
products = list(/obj/item/clothing/under/rank/chemist = 2,
/obj/item/clothing/shoes/sneakers/white = 2,
/obj/item/clothing/suit/toggle/labcoat/chemist = 2,
/obj/item/storage/backpack/chemistry = 2,
/obj/item/storage/backpack/satchel/chem = 2,
/obj/item/storage/bag/chemistry = 2,
/obj/item/pHbooklet = 2)//pH indicator)
products = list(/obj/item/clothing/under/rank/chemist = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/chemist = 3,
/obj/item/storage/backpack/chemistry = 3,
/obj/item/storage/backpack/satchel/chem = 3,
/obj/item/storage/bag/chemistry = 3,
/obj/item/pHbooklet = 3)//pH indicator)
refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe
/obj/item/vending_refill/wardrobe/chem_wardrobe
@@ -325,11 +325,11 @@
icon_state = "genedrobe"
product_ads = "Perfect for the mad scientist in you!"
vend_reply = "Thank you for using the GeneDrobe!"
products = list(/obj/item/clothing/under/rank/geneticist = 2,
/obj/item/clothing/shoes/sneakers/white = 2,
/obj/item/clothing/suit/toggle/labcoat/genetics = 2,
/obj/item/storage/backpack/genetics = 2,
/obj/item/storage/backpack/satchel/gen = 2)
products = list(/obj/item/clothing/under/rank/geneticist = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/genetics = 3,
/obj/item/storage/backpack/genetics = 3,
/obj/item/storage/backpack/satchel/gen = 3)
refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe
/obj/item/vending_refill/wardrobe/gene_wardrobe
@@ -341,12 +341,12 @@
icon_state = "virodrobe"
product_ads = " Viruses getting you down? Then upgrade to sterilized clothing today!"
vend_reply = "Thank you for using the ViroDrobe"
products = list(/obj/item/clothing/under/rank/virologist = 2,
/obj/item/clothing/shoes/sneakers/white = 2,
/obj/item/clothing/suit/toggle/labcoat/virologist = 2,
/obj/item/clothing/mask/surgical = 2,
/obj/item/storage/backpack/virology = 2,
/obj/item/storage/backpack/satchel/vir = 2)
products = list(/obj/item/clothing/under/rank/virologist = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/virologist = 3,
/obj/item/clothing/mask/surgical = 3,
/obj/item/storage/backpack/virology = 3,
/obj/item/storage/backpack/satchel/vir = 3)
refill_canister = /obj/item/vending_refill/wardrobe/viro_wardrobe
/obj/item/vending_refill/wardrobe/viro_wardrobe