Reupdated Station 1 map

This commit is contained in:
Hawk_v3
2019-10-24 21:57:58 +01:00
282 changed files with 35484 additions and 29587 deletions

View File

@@ -35,6 +35,7 @@
#define CE_ALCOHOL_TOXIC "alcotoxic" // Liver damage #define CE_ALCOHOL_TOXIC "alcotoxic" // Liver damage
#define CE_SPEEDBOOST "gofast" // Hyperzine #define CE_SPEEDBOOST "gofast" // Hyperzine
#define CE_SLOWDOWN "goslow" // Slowdown #define CE_SLOWDOWN "goslow" // Slowdown
#define CE_ANTACID "nopuke" // Don't puke.
#define REAGENTS_PER_SHEET 20 #define REAGENTS_PER_SHEET 20

View File

@@ -194,10 +194,24 @@
#define O_KIDNEYS "kidneys" #define O_KIDNEYS "kidneys"
#define O_APPENDIX "appendix" #define O_APPENDIX "appendix"
#define O_VOICE "voicebox" #define O_VOICE "voicebox"
#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_APPENDIX, O_VOICE) #define O_SPLEEN "spleen"
#define O_STOMACH "stomach"
#define O_INTESTINE "intestine"
#define O_STANDARD list(O_EYES, O_HEART, O_LUNGS, O_BRAIN, O_LIVER, O_KIDNEYS, O_SPLEEN, O_APPENDIX, O_VOICE, O_STOMACH, O_INTESTINE)
// Augments // Augments
#define O_AUG_TSHADE "integrated thermolensing implant" #define O_AUG_EYES "occular augment"
#define O_AUG_L_FOREARM "left forearm augment"
#define O_AUG_R_FOREARM "right forearm augment"
#define O_AUG_L_UPPERARM "left upperarm augment"
#define O_AUG_R_UPPERARM "right upperarm augment"
#define O_AUG_L_HAND "left hand augment"
#define O_AUG_R_HAND "right hand augment"
#define O_AUG_RIBS "rib augment"
#define O_AUG_SPINE "spinal augment"
#define O_AUG_PELVIC "pelvic augment"
// Non-Standard organs // Non-Standard organs
#define O_MOUTH "mouth" #define O_MOUTH "mouth"

View File

@@ -35,3 +35,4 @@
#define SPECIES_MONKEY_NEVREAN "Sparra" #define SPECIES_MONKEY_NEVREAN "Sparra"
#define SPECIES_MONKEY_SERGAL "Saru" #define SPECIES_MONKEY_SERGAL "Saru"
#define SPECIES_MONKEY_VULPKANIN "Wolpin" #define SPECIES_MONKEY_VULPKANIN "Wolpin"
#define SPECIES_WEREBEAST "Werebeast"

View File

@@ -8,11 +8,12 @@
#define CHANNEL_AMBIENCE 1018 #define CHANNEL_AMBIENCE 1018
#define CHANNEL_BUZZ 1017 #define CHANNEL_BUZZ 1017
#define CHANNEL_BICYCLE 1016 #define CHANNEL_BICYCLE 1016
#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel
//THIS SHOULD ALWAYS BE THE LOWEST ONE! //THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED //KEEP IT UPDATED
#define CHANNEL_HIGHEST_AVAILABLE 1015 #define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015
#define SOUND_MINIMUM_PRESSURE 10 #define SOUND_MINIMUM_PRESSURE 10
#define FALLOFF_SOUNDS 0.5 #define FALLOFF_SOUNDS 0.5

View File

@@ -42,40 +42,8 @@ var/global/list/item_vore_blacklist = list(
/obj/item/weapon/disk/nuclear, /obj/item/weapon/disk/nuclear,
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz) /obj/item/clothing/suit/storage/hooded/wintercoat/roiz)
var/global/list/digestion_sounds = list( //Classic Vore sounds
'sound/vore/digest1.ogg', var/global/list/classic_vore_sounds = list(
'sound/vore/digest2.ogg',
'sound/vore/digest3.ogg',
'sound/vore/digest4.ogg',
'sound/vore/digest5.ogg',
'sound/vore/digest6.ogg',
'sound/vore/digest7.ogg',
'sound/vore/digest8.ogg',
'sound/vore/digest9.ogg',
'sound/vore/digest10.ogg',
'sound/vore/digest11.ogg',
'sound/vore/digest12.ogg')
var/global/list/death_sounds = list(
'sound/vore/death1.ogg',
'sound/vore/death2.ogg',
'sound/vore/death3.ogg',
'sound/vore/death4.ogg',
'sound/vore/death5.ogg',
'sound/vore/death6.ogg',
'sound/vore/death7.ogg',
'sound/vore/death8.ogg',
'sound/vore/death9.ogg',
'sound/vore/death10.ogg')
var/global/list/hunger_sounds = list(
'sound/vore/growl1.ogg',
'sound/vore/growl2.ogg',
'sound/vore/growl3.ogg',
'sound/vore/growl4.ogg',
'sound/vore/growl5.ogg')
var/global/list/vore_sounds = list(
"Gulp" = 'sound/vore/gulp.ogg', "Gulp" = 'sound/vore/gulp.ogg',
"Insert" = 'sound/vore/insert.ogg', "Insert" = 'sound/vore/insert.ogg',
"Insertion1" = 'sound/vore/insertion1.ogg', "Insertion1" = 'sound/vore/insertion1.ogg',
@@ -86,15 +54,55 @@ var/global/list/vore_sounds = list(
"Squish2" = 'sound/vore/squish2.ogg', "Squish2" = 'sound/vore/squish2.ogg',
"Squish3" = 'sound/vore/squish3.ogg', "Squish3" = 'sound/vore/squish3.ogg',
"Squish4" = 'sound/vore/squish4.ogg', "Squish4" = 'sound/vore/squish4.ogg',
"Rustle (cloth)" = 'sound/effects/rustle5.ogg', "Rustle (cloth)" = 'sound/effects/rustle1.ogg',
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
"None" = null) "None" = null)
var/global/list/struggle_sounds = list( var/global/list/classic_release_sounds = list(
"Squish1" = 'sound/vore/squish1.ogg', "Rustle (cloth)" = 'sound/effects/rustle1.ogg',
"Squish2" = 'sound/vore/squish2.ogg', "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
"Squish3" = 'sound/vore/squish3.ogg', "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
"Squish4" = 'sound/vore/squish4.ogg') "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
"Splatter" = 'sound/effects/splat.ogg',
"None" = null
)
//Poojy's Fancy Sounds
var/global/list/fancy_vore_sounds = list(
"Gulp" = 'sound/vore/sunesound/pred/swallow_01.ogg',
"Swallow" = 'sound/vore/sunesound/pred/swallow_02.ogg',
"Insertion1" = 'sound/vore/sunesound/pred/insertion_01.ogg',
"Insertion2" = 'sound/vore/sunesound/pred/insertion_02.ogg',
"Tauric Swallow" = 'sound/vore/sunesound/pred/taurswallow.ogg',
"Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg',
"Schlorp" = 'sound/vore/sunesound/pred/schlorp.ogg',
"Squish1" = 'sound/vore/sunesound/pred/squish_01.ogg',
"Squish2" = 'sound/vore/sunesound/pred/squish_02.ogg',
"Squish3" = 'sound/vore/sunesound/pred/squish_03.ogg',
"Squish4" = 'sound/vore/sunesound/pred/squish_04.ogg',
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
"None" = null
)
var/global/list/fancy_release_sounds = list(
"Rustle (cloth)" = 'sound/effects/rustle1.ogg',
"Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg',
"Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg',
"Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg',
"Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg',
"Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg',
"Pred Escape" = 'sound/vore/sunesound/pred/escape.ogg',
"Splatter" = 'sound/effects/splat.ogg',
"None" = null
)
var/global/list/global_vore_egg_types = list( var/global/list/global_vore_egg_types = list(
"Unathi" = UNATHI_EGG, "Unathi" = UNATHI_EGG,

View File

@@ -105,7 +105,7 @@ SUBSYSTEM_DEF(vote)
factor = 1.4 factor = 1.4
choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor) choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor)
world << "<font color='purple'>Crew Transfer Factor: [factor]</font>" world << "<font color='purple'>Crew Transfer Factor: [factor]</font>"
greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"]) greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit
. = list() // Get all options with that many votes and return them in a list . = list() // Get all options with that many votes and return them in a list
if(greatest_votes) if(greatest_votes)
@@ -220,8 +220,8 @@ SUBSYSTEM_DEF(vote)
if(ticker.current_state <= GAME_STATE_SETTING_UP) if(ticker.current_state <= GAME_STATE_SETTING_UP)
initiator_key << "The crew transfer button has been disabled!" initiator_key << "The crew transfer button has been disabled!"
return 0 return 0
question = "End the shift?" question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //VOREStation Edit
choices.Add("Initiate Crew Transfer", "Continue The Round") choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
if(VOTE_ADD_ANTAGONIST) if(VOTE_ADD_ANTAGONIST)
if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP) if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP)
return 0 return 0

View File

@@ -32,3 +32,21 @@
name = "magazine (.44 rubber)" name = "magazine (.44 rubber)"
path =/obj/item/ammo_magazine/m44/rubber path =/obj/item/ammo_magazine/m44/rubber
hidden = 1 hidden = 1
/datum/category_item/autolathe/arms/classic_smg_9mm
name = "SMG magazine (9mm)"
path = /obj/item/ammo_magazine/m9mml
hidden = 1
/* De-coded?
/datum/category_item/autolathe/arms/classic_smg_9mmr
name = "SMG magazine (9mm rubber)"
path = /obj/item/ammo_magazine/m9mml/rubber
/datum/category_item/autolathe/arms/classic_smg_9mmp
name = "SMG magazine (9mm practice)"
path = /obj/item/ammo_magazine/m9mml/practice
/datum/category_item/autolathe/arms/classic_smg_9mmf
name = "SMG magazine (9mm flash)"
path = /obj/item/ammo_magazine/m9mml/flash
*/

View File

@@ -349,3 +349,24 @@
cost = 250 cost = 250
containertype = /obj/structure/largecrate containertype = /obj/structure/largecrate
containername = "Industrial Chemical distiller crate" containername = "Industrial Chemical distiller crate"
/datum/supply_pack/med/oxypump
name = "Oxygen pump crate"
contains = list(/obj/machinery/oxygen_pump/mobile = 1)
cost = 125
containertype = /obj/structure/largecrate
containername = "Oxygen pump crate"
/datum/supply_pack/med/anestheticpump
name = "Anesthetic pump crate"
contains = list(/obj/machinery/oxygen_pump/mobile/anesthetic = 1)
cost = 130
containertype = /obj/structure/largecrate
containername = "Anesthetic pump crate"
/datum/supply_pack/med/stablepump
name = "Portable stabilizer crate"
contains = list(/obj/machinery/oxygen_pump/mobile/stabilizer = 1)
cost = 175
containertype = /obj/structure/largecrate
containername = "Portable stabilizer crate"

View File

@@ -170,3 +170,12 @@
cost = 25 cost = 25
containertype = /obj/structure/closet/crate/freezer containertype = /obj/structure/closet/crate/freezer
containername = "emergency rations" containername = "emergency rations"
/datum/supply_pack/misc/medical_rations
name = "Emergency - VitaPaste"
contains = list(
/obj/item/weapon/storage/mre/menu13 = 2
)
cost = 40
containertype = /obj/structure/closet/crate/freezer
containername = "emergency rations"

View File

@@ -23,3 +23,53 @@
name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)" name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)"
item_cost = 50 //Original cost: 10 item_cost = 50 //Original cost: 10
path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
/datum/uplink_item/item/implants/imp_shades
name = "Integrated Thermal-Shades Implant (Organic)"
item_cost = 80
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug
/datum/uplink_item/item/implants/imp_taser
name = "Integrated Taser Implant (Organic)"
item_cost = 30
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/taser
/datum/uplink_item/item/implants/imp_laser
name = "Integrated Laser Implant (Organic)"
item_cost = 50
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/laser
/datum/uplink_item/item/implants/imp_dart
name = "Integrated Dart Implant (Organic)"
item_cost = 60
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/dart
/datum/uplink_item/item/implants/imp_toolkit
name = "Integrated Toolkit Implant (Organic)"
item_cost = 80
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit
/datum/uplink_item/item/implants/imp_medkit
name = "Integrated Medkit Implant (Organic)"
item_cost = 60
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit
/datum/uplink_item/item/implants/imp_analyzer
name = "Integrated Research Scanner Implant (Organic)"
item_cost = 20
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer
/datum/uplink_item/item/implants/imp_sword
name = "Integrated Sword Implant (Organic)"
item_cost = 40
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sword
/datum/uplink_item/item/implants/imp_sprinter
name = "Integrated Sprinter Implant (Organic)"
item_cost = 40
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
/datum/uplink_item/item/implants/imp_sprinter
name = "Integrated Surge Implant (Organic)"
item_cost = 40
path = /obj/item/weapon/storage/box/syndie_kit/imp_aug/surge

View File

@@ -0,0 +1,57 @@
/**********
* Medical *
**********/
/datum/uplink_item/item/medical/mre
name = "Meal, Ready to eat (Random)"
item_cost = 5
path = /obj/item/weapon/storage/mre/random
/datum/uplink_item/item/medical/protein
name = "Meal, Ready to eat (Protein)"
item_cost = 5
path = /obj/item/weapon/storage/mre/menu10
/datum/uplink_item/item/medical/emergency
name = "Meal, Ready to eat (Emergency)"
item_cost = 5
path = /obj/item/weapon/storage/mre/menu11
/datum/uplink_item/item/medical/glucose
name = "Glucose injector"
item_cost = 5
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose
/datum/uplink_item/item/medical/purity
name = "Purity injector"
item_cost = 5
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity
/datum/uplink_item/item/medical/brute
name = "Brute injector"
item_cost = 5
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute
/datum/uplink_item/item/medical/burn
name = "Burn injector"
item_cost = 5
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn
/datum/uplink_item/item/medical/toxin
name = "Toxin injector"
item_cost = 5
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin
/datum/uplink_item/item/medical/oxy
name = "Oxy injector"
item_cost = 5
path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy
/datum/uplink_item/item/medical/nanites
name = "Healing Nanite pill bottle"
item_cost = 30
path = /obj/item/weapon/storage/pill_bottle/healing_nanites
/datum/uplink_item/item/medical/insiderepair
name = "Combat organ kit"
item_cost = 120
path = /obj/item/weapon/storage/firstaid/insiderepair

View File

@@ -0,0 +1,42 @@
/********************
* Devices and Tools *
********************/
/datum/uplink_item/item/tools/basiclaptop
name = "Laptop (Basic)"
item_cost = 5
path = /obj/item/modular_computer/laptop/preset/custom_loadout/cheap
/datum/uplink_item/item/tools/survivalcapsule
name = "Survival Capsule"
item_cost = 5
path = /obj/item/device/survivalcapsule
/datum/uplink_item/item/tools/nanopaste
name = "Nanopaste (Advanced)"
item_cost = 10
path = /obj/item/stack/nanopaste/advanced
/datum/uplink_item/item/tools/elitetablet
name = "Tablet (Advanced)"
item_cost = 15
path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced
/datum/uplink_item/item/tools/elitelaptop
name = "Laptop (Advanced)"
item_cost = 20
path = /obj/item/modular_computer/laptop/preset/custom_loadout/elite
/datum/uplink_item/item/tools/luxurycapsule
name = "Survival Capsule (Luxury)"
item_cost = 40
path = /obj/item/device/survivalcapsule/luxury
/datum/uplink_item/item/tools/translocator
name = "Translocator"
item_cost = 40
path = /obj/item/device/perfect_tele
/datum/uplink_item/item/tools/barcapsule
name = "Survival Capsule (Bar)"
item_cost = 80
path = /obj/item/device/survivalcapsule/luxurybar

View File

@@ -18,6 +18,8 @@
var/mind=null var/mind=null
var/languages=null var/languages=null
var/list/flavor=null var/list/flavor=null
var/gender = null
var/list/body_descriptors = null
var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance. var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance.
/datum/dna2/record/proc/GetData() /datum/dna2/record/proc/GetData()
@@ -706,7 +708,10 @@
databuf.types = DNA2_BUF_UE databuf.types = DNA2_BUF_UE
databuf.dna = src.connected.occupant.dna.Clone() databuf.dna = src.connected.occupant.dna.Clone()
if(ishuman(connected.occupant)) if(ishuman(connected.occupant))
databuf.dna.real_name=connected.occupant.dna.real_name var/mob/living/carbon/human/H = connected.occupant
databuf.dna.real_name = H.dna.real_name
databuf.gender = H.gender
databuf.body_descriptors = H.descriptors
databuf.name = "Unique Identifier" databuf.name = "Unique Identifier"
src.buffers[bufferId] = databuf src.buffers[bufferId] = databuf
return 1 return 1
@@ -717,7 +722,10 @@
databuf.types = DNA2_BUF_UI|DNA2_BUF_UE databuf.types = DNA2_BUF_UI|DNA2_BUF_UE
databuf.dna = src.connected.occupant.dna.Clone() databuf.dna = src.connected.occupant.dna.Clone()
if(ishuman(connected.occupant)) if(ishuman(connected.occupant))
databuf.dna.real_name=connected.occupant.dna.real_name var/mob/living/carbon/human/H = connected.occupant
databuf.dna.real_name = H.dna.real_name
databuf.gender = H.gender
databuf.body_descriptors = H.descriptors
databuf.name = "Unique Identifier + Unique Enzymes" databuf.name = "Unique Identifier + Unique Enzymes"
src.buffers[bufferId] = databuf src.buffers[bufferId] = databuf
return 1 return 1
@@ -728,7 +736,10 @@
databuf.types = DNA2_BUF_SE databuf.types = DNA2_BUF_SE
databuf.dna = src.connected.occupant.dna.Clone() databuf.dna = src.connected.occupant.dna.Clone()
if(ishuman(connected.occupant)) if(ishuman(connected.occupant))
databuf.dna.real_name=connected.occupant.dna.real_name var/mob/living/carbon/human/H = connected.occupant
databuf.dna.real_name = H.dna.real_name
databuf.gender = H.gender
databuf.body_descriptors = H.descriptors
databuf.name = "Structural Enzymes" databuf.name = "Structural Enzymes"
src.buffers[bufferId] = databuf src.buffers[bufferId] = databuf
return 1 return 1
@@ -764,10 +775,18 @@
if ((buf.types & DNA2_BUF_UE)) if ((buf.types & DNA2_BUF_UE))
src.connected.occupant.real_name = buf.dna.real_name src.connected.occupant.real_name = buf.dna.real_name
src.connected.occupant.name = buf.dna.real_name src.connected.occupant.name = buf.dna.real_name
if(ishuman(connected.occupant))
var/mob/living/carbon/human/H = connected.occupant
H.gender = buf.gender
H.descriptors = buf.body_descriptors
src.connected.occupant.UpdateAppearance(buf.dna.UI.Copy()) src.connected.occupant.UpdateAppearance(buf.dna.UI.Copy())
else if (buf.types & DNA2_BUF_SE) else if (buf.types & DNA2_BUF_SE)
src.connected.occupant.dna.SE = buf.dna.SE src.connected.occupant.dna.SE = buf.dna.SE
src.connected.occupant.dna.UpdateSE() src.connected.occupant.dna.UpdateSE()
if(ishuman(connected.occupant))
var/mob/living/carbon/human/H = connected.occupant
H.gender = buf.gender
H.descriptors = buf.body_descriptors
domutcheck(src.connected.occupant,src.connected) domutcheck(src.connected.occupant,src.connected)
src.connected.occupant.apply_effect(rand(20,50), IRRADIATE, check_protection = 0) src.connected.occupant.apply_effect(rand(20,50), IRRADIATE, check_protection = 0)
return 1 return 1

View File

@@ -394,6 +394,7 @@ var/global/datum/controller/occupations/job_master
if(G.slot == "implant") if(G.slot == "implant")
var/obj/item/weapon/implant/I = G.spawn_item(H) var/obj/item/weapon/implant/I = G.spawn_item(H)
I.invisibility = 100
I.implant_loadout(H) I.implant_loadout(H)
continue continue

View File

@@ -1,17 +0,0 @@
/datum/category_item/autolathe/arms/classic_smg_9mm
name = "SMG magazine (9mm)"
path = /obj/item/ammo_magazine/m9mml
hidden = 1
/* De-coded?
/datum/category_item/autolathe/arms/classic_smg_9mmr
name = "SMG magazine (9mm rubber)"
path = /obj/item/ammo_magazine/m9mml/rubber
/datum/category_item/autolathe/arms/classic_smg_9mmp
name = "SMG magazine (9mm practice)"
path = /obj/item/ammo_magazine/m9mml/practice
/datum/category_item/autolathe/arms/classic_smg_9mmf
name = "SMG magazine (9mm flash)"
path = /obj/item/ammo_magazine/m9mml/flash
*/

View File

@@ -21,6 +21,10 @@
var/loaded_dna //Blood sample for DNA hashing. var/loaded_dna //Blood sample for DNA hashing.
var/malfunctioning = FALSE // May cause rejection, or the printing of some alien limb instead! var/malfunctioning = FALSE // May cause rejection, or the printing of some alien limb instead!
var/complex_organs = FALSE // Can it print more 'complex' organs?
var/anomalous_organs = FALSE // Can it print anomalous organs?
// These should be subtypes of /obj/item/organ // These should be subtypes of /obj/item/organ
// Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity // Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity
var/list/products = list( var/list/products = list(
@@ -29,6 +33,7 @@
"Kidneys" = list(/obj/item/organ/internal/kidneys,20), "Kidneys" = list(/obj/item/organ/internal/kidneys,20),
"Eyes" = list(/obj/item/organ/internal/eyes, 20), "Eyes" = list(/obj/item/organ/internal/eyes, 20),
"Liver" = list(/obj/item/organ/internal/liver, 20), "Liver" = list(/obj/item/organ/internal/liver, 20),
"Spleen" = list(/obj/item/organ/internal/spleen, 20),
"Arm, Left" = list(/obj/item/organ/external/arm, 40), "Arm, Left" = list(/obj/item/organ/external/arm, 40),
"Arm, Right" = list(/obj/item/organ/external/arm/right, 40), "Arm, Right" = list(/obj/item/organ/external/arm/right, 40),
"Leg, Left" = list(/obj/item/organ/external/leg, 40), "Leg, Left" = list(/obj/item/organ/external/leg, 40),
@@ -39,6 +44,18 @@
"Hand, Right" = list(/obj/item/organ/external/hand/right, 20) "Hand, Right" = list(/obj/item/organ/external/hand/right, 20)
) )
var/list/complex_products = list(
"Brain" = list(/obj/item/organ/internal/brain, 60),
"Larynx" = list(/obj/item/organ/internal/voicebox, 20),
"Head" = list(/obj/item/organ/external/head, 40)
)
var/list/anomalous_products = list(
"Lymphatic Complex" = list(/obj/item/organ/internal/immunehub, 120),
"Respiration Nexus" = list(/obj/item/organ/internal/lungs/replicant/mending, 80),
"Adrenal Valve Cluster" = list(/obj/item/organ/internal/heart/replicant/rage, 80)
)
/obj/machinery/organ_printer/attackby(var/obj/item/O, var/mob/user) /obj/machinery/organ_printer/attackby(var/obj/item/O, var/mob/user)
if(default_deconstruction_screwdriver(user, O)) if(default_deconstruction_screwdriver(user, O))
updateUsrDialog() updateUsrDialog()
@@ -90,6 +107,17 @@
else else
malfunctioning = initial(malfunctioning) malfunctioning = initial(malfunctioning)
if(manip_rating >= 3)
complex_organs = TRUE
if(manip_rating >= 4)
anomalous_organs = TRUE
if(manip_rating >= 5)
malfunctioning = TRUE
else
complex_organs = initial(complex_organs)
anomalous_organs = initial(anomalous_organs)
malfunctioning = initial(malfunctioning)
. = ..() . = ..()
/obj/machinery/organ_printer/attack_hand(mob/user) /obj/machinery/organ_printer/attack_hand(mob/user)
@@ -113,7 +141,17 @@
to_chat(user, "<span class='warning'>\The [src] can't operate without a reagent reservoir!</span>") to_chat(user, "<span class='warning'>\The [src] can't operate without a reagent reservoir!</span>")
/obj/machinery/organ_printer/proc/printing_menu(mob/user) /obj/machinery/organ_printer/proc/printing_menu(mob/user)
var/choice = input("What would you like to print?") as null|anything in products var/list/possible_list = list()
possible_list |= products
if(complex_organs)
possible_list |= complex_products
if(anomalous_organs)
possible_list |= anomalous_products
var/choice = input("What would you like to print?") as null|anything in possible_list
if(!choice || printing || (stat & (BROKEN|NOPOWER))) if(!choice || printing || (stat & (BROKEN|NOPOWER)))
return return

View File

@@ -113,6 +113,8 @@
if(!R.dna.real_name) //to prevent null names if(!R.dna.real_name) //to prevent null names
R.dna.real_name = "clone ([rand(0,999)])" R.dna.real_name = "clone ([rand(0,999)])"
H.real_name = R.dna.real_name H.real_name = R.dna.real_name
H.gender = R.gender
H.descriptors = R.body_descriptors
//Get the clone body ready //Get the clone body ready
H.adjustCloneLoss(150) // New damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite H.adjustCloneLoss(150) // New damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite

View File

@@ -105,7 +105,6 @@
/datum/frame/frame_types/reagent_distillery /datum/frame/frame_types/reagent_distillery
name = "Distillery" name = "Distillery"
frame_class = FRAME_CLASS_MACHINE frame_class = FRAME_CLASS_MACHINE
circuit = /obj/item/weapon/circuitboard/distiller
frame_size = 4 frame_size = 4
/datum/frame/frame_types/display /datum/frame/frame_types/display
@@ -192,13 +191,13 @@
////////////////////////////// //////////////////////////////
/obj/structure/frame /obj/structure/frame
anchored = 0 anchored = FALSE
name = "frame" name = "frame"
icon = 'icons/obj/stock_parts.dmi' icon = 'icons/obj/stock_parts.dmi'
icon_state = "machine_0" icon_state = "machine_0"
var/state = FRAME_PLACED var/state = FRAME_PLACED
var/obj/item/weapon/circuitboard/circuit = null var/obj/item/weapon/circuitboard/circuit = null
var/need_circuit = 1 var/need_circuit = TRUE
var/datum/frame/frame_types/frame_type = new /datum/frame/frame_types/machine var/datum/frame/frame_types/frame_type = new /datum/frame/frame_types/machine
var/list/components = null var/list/components = null
@@ -207,8 +206,8 @@
/obj/structure/frame/computer //used for maps /obj/structure/frame/computer //used for maps
frame_type = new /datum/frame/frame_types/computer frame_type = new /datum/frame/frame_types/computer
anchored = 1 anchored = TRUE
density = 1 density = TRUE
/obj/structure/frame/examine(mob/user) /obj/structure/frame/examine(mob/user)
..() ..()
@@ -260,14 +259,14 @@
pixel_y = (dir & 3)? (dir == NORTH ? -frame_type.y_offset : frame_type.y_offset) : 0 pixel_y = (dir & 3)? (dir == NORTH ? -frame_type.y_offset : frame_type.y_offset) : 0
if(frame_type.circuit) if(frame_type.circuit)
need_circuit = 0 need_circuit = FALSE
circuit = new frame_type.circuit(src) circuit = new frame_type.circuit(src)
if(frame_type.name == "Computer") if(frame_type.name == "Computer")
density = 1 density = TRUE
if(frame_type.frame_class == FRAME_CLASS_MACHINE) if(frame_type.frame_class == FRAME_CLASS_MACHINE)
density = 1 density = TRUE
update_icon() update_icon()
@@ -277,7 +276,7 @@
to_chat(user, "<span class='notice'>You start to wrench the frame into place.</span>") to_chat(user, "<span class='notice'>You start to wrench the frame into place.</span>")
playsound(src.loc, P.usesound, 50, 1) playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed)) if(do_after(user, 20 * P.toolspeed))
anchored = 1 anchored = TRUE
if(!need_circuit && circuit) if(!need_circuit && circuit)
state = FRAME_FASTENED state = FRAME_FASTENED
check_components() check_components()
@@ -290,7 +289,7 @@
playsound(src, P.usesound, 50, 1) playsound(src, P.usesound, 50, 1)
if(do_after(user, 20 * P.toolspeed)) if(do_after(user, 20 * P.toolspeed))
to_chat(user, "<span class='notice'>You unfasten the frame.</span>") to_chat(user, "<span class='notice'>You unfasten the frame.</span>")
anchored = 0 anchored = FALSE
else if(istype(P, /obj/item/weapon/weldingtool)) else if(istype(P, /obj/item/weapon/weldingtool))
if(state == FRAME_PLACED) if(state == FRAME_PLACED)
@@ -587,11 +586,11 @@
set src in oview(1) set src in oview(1)
if(usr.incapacitated()) if(usr.incapacitated())
return 0 return FALSE
if(anchored) if(anchored)
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!") to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
return 0 return FALSE
src.set_dir(turn(src.dir, 90)) src.set_dir(turn(src.dir, 90))
@@ -606,11 +605,11 @@
set src in oview(1) set src in oview(1)
if(usr.incapacitated()) if(usr.incapacitated())
return 0 return FALSE
if(anchored) if(anchored)
to_chat(usr, "It is fastened to the floor therefore you can't rotate it!") to_chat(usr, "It is fastened to the floor therefore you can't rotate it!")
return 0 return FALSE
src.set_dir(turn(src.dir, 270)) src.set_dir(turn(src.dir, 270))

View File

@@ -4,7 +4,7 @@
/obj/machinery/oxygen_pump /obj/machinery/oxygen_pump
name = "emergency oxygen pump" name = "emergency oxygen pump"
icon = 'icons/obj/walllocker.dmi' icon = 'icons/obj/walllocker.dmi'
desc = "A wall mounted oxygen pump with a retractable face mask that you can pull over your face in case of emergencies." desc = "A wall mounted oxygen pump with a retractable mask that you can pull over your face in case of emergencies."
icon_state = "oxygen_tank" icon_state = "oxygen_tank"
anchored = TRUE anchored = TRUE
@@ -236,3 +236,76 @@
icon_state_closed = "anesthetic_tank" icon_state_closed = "anesthetic_tank"
icon_state_open = "anesthetic_tank_open" icon_state_open = "anesthetic_tank_open"
mask_type = /obj/item/clothing/mask/breath/anesthetic mask_type = /obj/item/clothing/mask/breath/anesthetic
/obj/machinery/oxygen_pump/mobile
name = "portable oxygen pump"
icon = 'icons/obj/atmos.dmi'
desc = "A portable oxygen pump with a retractable mask that you can pull over your face in case of emergencies."
icon_state = "medpump"
icon_state_open = "medpump_open"
icon_state_closed = "medpump"
anchored = FALSE
density = TRUE
mask_type = /obj/item/clothing/mask/gas/clear
var/last_area = null
/obj/machinery/oxygen_pump/mobile/process()
..()
var/turf/T = get_turf(src)
if(!last_area && T)
last_area = T.loc
if(last_area != T.loc)
power_change()
last_area = T.loc
/obj/machinery/oxygen_pump/mobile/anesthetic
name = "portable anesthetic pump"
spawn_type = /obj/item/weapon/tank/anesthetic
icon_state = "medpump_n2o"
icon_state_closed = "medpump_n2o"
icon_state_open = "medpump_n2o_open"
mask_type = /obj/item/clothing/mask/breath/anesthetic
/obj/machinery/oxygen_pump/mobile/stabilizer
name = "portable patient stabilizer"
desc = "A portable oxygen pump with a retractable mask used for stabilizing patients in the field."
/obj/machinery/oxygen_pump/mobile/stabilizer/process()
if(breather)
if(!can_apply_to_target(breather))
if(tank)
tank.forceMove(src)
breather.remove_from_mob(contained)
contained.forceMove(src)
src.visible_message("<span class='notice'>\The [contained] rapidly retracts back into \the [src]!</span>")
breather = null
use_power = 1
else if(!breather.internal && tank)
breather.internal = tank
if(breather.internals)
breather.internals.icon_state = "internal0"
if(breather) // Safety.
if(ishuman(breather))
var/mob/living/carbon/human/H = breather
if(H.stat == DEAD)
H.add_modifier(/datum/modifier/bloodpump_corpse, 6 SECONDS)
else
H.add_modifier(/datum/modifier/bloodpump, 6 SECONDS)
var/turf/T = get_turf(src)
if(!last_area && T)
last_area = T.loc
if(last_area != T.loc)
power_change()
last_area = T.loc

View File

@@ -573,4 +573,233 @@
for(var/reagent in S.processed_reagents) for(var/reagent in S.processed_reagents)
S.reagents.add_reagent(reagent,amount) S.reagents.add_reagent(reagent,amount)
S.chassis.use_power(energy_drain) S.chassis.use_power(energy_drain)
return 1 return 1
/obj/item/mecha_parts/mecha_equipment/crisis_drone
name = "crisis dronebay"
desc = "A small shoulder-mounted dronebay containing a rapid response drone capable of moderately stabilizing a patient near the exosuit."
icon_state = "mecha_dronebay"
origin_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_BIO = 5, TECH_DATA = 4)
range = MELEE|RANGED
equip_cooldown = 3 SECONDS
required_type = list(/obj/mecha/medical)
var/droid_state = "med_droid"
var/beam_state = "medbeam"
var/enabled = FALSE
var/icon/drone_overlay
var/max_distance = 3
var/damcap = 60
var/heal_dead = FALSE // Does this device heal the dead?
var/brute_heal = 0.5 // Amount of bruteloss healed.
var/burn_heal = 0.5 // Amount of fireloss healed.
var/tox_heal = 0.5 // Amount of toxloss healed.
var/oxy_heal = 1 // Amount of oxyloss healed.
var/rad_heal = 0 // Amount of radiation healed.
var/clone_heal = 0 // Amount of cloneloss healed.
var/hal_heal = 0.2 // Amount of halloss healed.
var/bone_heal = 0 // Percent chance it will heal a broken bone. this does not mean 'make it not instantly re-break'.
var/mob/living/Target = null
var/datum/beam/MyBeam = null
equip_type = EQUIP_HULL
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Initialize()
..()
drone_overlay = new(src.icon, icon_state = droid_state)
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Destroy()
STOP_PROCESSING(SSobj, src)
..()
/obj/item/mecha_parts/mecha_equipment/crisis_drone/attach(obj/mecha/M as obj)
. = ..(M)
if(chassis)
START_PROCESSING(SSobj, src)
/obj/item/mecha_parts/mecha_equipment/crisis_drone/detach(atom/moveto=null)
shut_down()
. = ..(moveto)
STOP_PROCESSING(SSobj, src)
/obj/item/mecha_parts/mecha_equipment/crisis_drone/critfail()
. = ..()
STOP_PROCESSING(SSobj, src)
shut_down()
if(chassis && chassis.occupant)
to_chat(chassis.occupant, "<span class='notice'>\The [chassis] shudders as something jams!</span>")
log_message("[src.name] has malfunctioned. Maintenance required.")
/obj/item/mecha_parts/mecha_equipment/crisis_drone/process() // Will continually try to find the nearest person above the threshold that is a valid target, and try to heal them.
if(chassis && enabled && chassis.has_charge(energy_drain) && (chassis.occupant || enable_special))
var/mob/living/Targ = Target
var/TargDamage = 0
if(!valid_target(Target))
Target = null
if(Target)
TargDamage = (Targ.getOxyLoss() + Targ.getFireLoss() + Targ.getBruteLoss() + Targ.getToxLoss())
for(var/mob/living/Potential in viewers(max_distance, chassis))
if(!valid_target(Potential))
continue
var/tallydamage = 0
if(oxy_heal)
tallydamage += Potential.getOxyLoss()
if(burn_heal)
tallydamage += Potential.getFireLoss()
if(brute_heal)
tallydamage += Potential.getBruteLoss()
if(tox_heal)
tallydamage += Potential.getToxLoss()
if(hal_heal)
tallydamage += Potential.getHalLoss()
if(clone_heal)
tallydamage += Potential.getCloneLoss()
if(rad_heal)
tallydamage += Potential.radiation / 2
if(tallydamage > TargDamage)
Target = Potential
if(MyBeam && !valid_target(MyBeam.target))
QDEL_NULL(MyBeam)
if(Target)
if(MyBeam && MyBeam.target != Target)
QDEL_NULL(MyBeam)
if(valid_target(Target))
if(!MyBeam)
MyBeam = chassis.Beam(Target,icon='icons/effects/beam.dmi',icon_state=beam_state,time=3 SECONDS,maxdistance=max_distance,beam_type = /obj/effect/ebeam,beam_sleep_time=2)
heal_target(Target)
else
shut_down()
/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/valid_target(var/mob/living/L)
. = TRUE
if(!L || !istype(L))
return FALSE
if(get_dist(L, src) > max_distance)
return FALSE
if(!(L in viewers(max_distance, chassis)))
return FALSE
if(!unique_patient_checks(L))
return FALSE
if(L.stat == DEAD && !heal_dead)
return FALSE
var/tallydamage = 0
if(oxy_heal)
tallydamage += L.getOxyLoss()
if(burn_heal)
tallydamage += L.getFireLoss()
if(brute_heal)
tallydamage += L.getBruteLoss()
if(tox_heal)
tallydamage += L.getToxLoss()
if(hal_heal)
tallydamage += L.getHalLoss()
if(clone_heal)
tallydamage += L.getCloneLoss()
if(rad_heal)
tallydamage += L.radiation / 2
if(tallydamage < damcap)
return FALSE
/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/shut_down()
if(enabled)
chassis.visible_message("<span class='notice'>\The [chassis]'s [src] buzzes as its drone returns to port.</span>")
toggle_drone()
if(!isnull(Target))
Target = null
if(MyBeam)
QDEL_NULL(MyBeam)
/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/unique_patient_checks(var/mob/living/L) // Anything special for subtypes. Does it only work on Robots? Fleshies? A species?
. = TRUE
/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/heal_target(var/mob/living/L) // We've done all our special checks, just get to fixing damage.
chassis.use_power(energy_drain)
if(istype(L))
L.adjustBruteLoss(brute_heal * -1)
L.adjustFireLoss(burn_heal * -1)
L.adjustToxLoss(tox_heal * -1)
L.adjustOxyLoss(oxy_heal * -1)
L.adjustCloneLoss(clone_heal * -1)
L.adjustHalLoss(hal_heal * -1)
L.radiation = max(0, L.radiation - rad_heal)
if(ishuman(L) && bone_heal)
var/mob/living/carbon/human/H = L
if(H.bad_external_organs.len)
for(var/obj/item/organ/external/E in H.bad_external_organs)
if(prob(bone_heal))
E.status &= ~ORGAN_BROKEN
/obj/item/mecha_parts/mecha_equipment/crisis_drone/proc/toggle_drone()
..()
if(chassis)
enabled = !enabled
if(enabled)
set_ready_state(0)
log_message("Activated.")
chassis.overlays += drone_overlay
else
set_ready_state(1)
log_message("Deactivated.")
chassis.overlays -= drone_overlay
/obj/item/mecha_parts/mecha_equipment/crisis_drone/Topic(href, href_list)
..()
if(href_list["toggle_drone"])
toggle_drone()
return
/obj/item/mecha_parts/mecha_equipment/crisis_drone/get_equip_info()
if(!chassis) return
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span>&nbsp;[src.name] - <a href='?src=\ref[src];toggle_drone=1'>[enabled?"Dea":"A"]ctivate</a>"
/obj/item/mecha_parts/mecha_equipment/crisis_drone/rad
name = "hazmat dronebay"
desc = "A small shoulder-mounted dronebay containing a rapid response drone capable of purging a patient near the exosuit of radiation damage."
icon_state = "mecha_dronebay_rad"
droid_state = "rad_drone"
beam_state = "g_beam"
tox_heal = 0.5
rad_heal = 5
clone_heal = 0.2
hal_heal = 0.2
/obj/item/mecha_parts/mecha_equipment/tool/powertool/medanalyzer
name = "mounted humanoid scanner"
desc = "An exosuit-mounted scanning device."
icon_state = "mecha_analyzer_health"
origin_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 5, TECH_BIO = 5)
equip_cooldown = 5 SECONDS
energy_drain = 100
range = MELEE
equip_type = EQUIP_UTILITY
ready_sound = 'sound/weapons/flash.ogg'
required_type = list(/obj/mecha/medical)
tooltype = /obj/item/device/healthanalyzer/advanced

View File

@@ -229,6 +229,10 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop
if(isobserver(A)) if(isobserver(A))
A.forceMove(T) // Harmlessly move ghosts. A.forceMove(T) // Harmlessly move ghosts.
return return
//VOREStation Edit Start
if(!(A.can_fall()))
return // Phased shifted kin should not fall
//VOREStation Edit End
A.forceMove(T) A.forceMove(T)
// Living things should probably be logged when they fall... // Living things should probably be logged when they fall...

View File

@@ -17,3 +17,6 @@
centComm = 1 centComm = 1
ks2type = /obj/item/device/encryptionkey/ert ks2type = /obj/item/device/encryptionkey/ert
/obj/item/device/radio/headset
sprite_sheets = list(SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi')

View File

@@ -95,7 +95,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/interact(mob/user) /obj/item/device/radio/interact(mob/user)
if(!user) if(!user)
return 0 return FALSE
if(b_stat) if(b_stat)
wires.Interact(user) wires.Interact(user)
@@ -151,10 +151,10 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/proc/has_channel_access(var/mob/user, var/freq) /obj/item/device/radio/proc/has_channel_access(var/mob/user, var/freq)
if(!user) if(!user)
return 0 return FALSE
if(!(freq in internal_channels)) if(!(freq in internal_channels))
return 0 return FALSE
return user.has_internal_radio_channel_access(internal_channels[freq]) return user.has_internal_radio_channel_access(internal_channels[freq])
@@ -191,7 +191,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/Topic(href, href_list) /obj/item/device/radio/Topic(href, href_list)
if(..()) if(..())
return 1 return TRUE
usr.set_machine(src) usr.set_machine(src)
if (href_list["track"]) if (href_list["track"])
@@ -229,7 +229,7 @@ var/global/list/default_medbay_channels = list(
set_frequency(text2num(freq)) set_frequency(text2num(freq))
. = 1 . = 1
if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk
return 1 return TRUE
if(.) if(.)
SSnanoui.update_uis(src) SSnanoui.update_uis(src)
@@ -246,8 +246,6 @@ var/global/list/default_medbay_channels = list(
channel = null channel = null
if (!istype(connection)) if (!istype(connection))
return return
if (!connection)
return
var/static/mob/living/silicon/ai/announcer/A = new /mob/living/silicon/ai/announcer(src, null, null, 1) var/static/mob/living/silicon/ai/announcer/A = new /mob/living/silicon/ai/announcer(src, null, null, 1)
A.SetName(from) A.SetName(from)
@@ -274,18 +272,18 @@ var/global/list/default_medbay_channels = list(
return null return null
/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null) /obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null)
if(!on) return 0 // the device has to be on if(!on) return FALSE // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them. // Fix for permacell radios, but kinda eh about actually fixing them.
if(!M || !message) return 0 if(!M || !message) return FALSE
if(speaking && (speaking.flags & (SIGNLANG|NONVERBAL))) return 0 if(speaking && (speaking.flags & (SIGNLANG|NONVERBAL))) return FALSE
if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO) if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO)
// Uncommenting this. To the above comment: // Uncommenting this. To the above comment:
// The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom // The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom
if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact if(wires.IsIndexCut(WIRE_TRANSMIT)) // The device has to have all its wires and shit intact
return 0 return FALSE
if(!radio_connection) if(!radio_connection)
set_frequency(frequency) set_frequency(frequency)
@@ -304,9 +302,7 @@ var/global/list/default_medbay_channels = list(
//#### Grab the connection datum ####// //#### Grab the connection datum ####//
var/datum/radio_frequency/connection = handle_message_mode(M, message, channel) var/datum/radio_frequency/connection = handle_message_mode(M, message, channel)
if (!istype(connection)) if (!istype(connection))
return 0 return FALSE
if (!connection)
return 0
var/turf/position = get_turf(src) var/turf/position = get_turf(src)
@@ -360,13 +356,12 @@ var/global/list/default_medbay_channels = list(
/* ###### Radio headsets can only broadcast through subspace ###### */ /* ###### Radio headsets can only broadcast through subspace ###### */
if(subspace_transmission) if(subspace_transmission)
var/list/jamming = is_jammed(src) var/list/jamming = is_jammed(src)
if(jamming) if(jamming)
var/distance = jamming["distance"] var/distance = jamming["distance"]
to_chat(M,"<span class='danger'>\icon[src] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.</span>") to_chat(M,"<span class='danger'>\icon[src] You hear the [distance <= 2 ? "loud hiss" : "soft hiss"] of static.</span>")
return 0 return FALSE
// First, we want to generate a new radio signal // First, we want to generate a new radio signal
var/datum/signal/signal = new var/datum/signal/signal = new
@@ -414,6 +409,7 @@ var/global/list/default_medbay_channels = list(
for(var/obj/machinery/telecomms/allinone/R in telecomms_list) for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
R.receive_signal(signal) R.receive_signal(signal)
// Receiving code can be located in Telecommunications.dm
if(signal.data["done"] && position.z in signal.data["level"]) if(signal.data["done"] && position.z in signal.data["level"])
return TRUE //Huzzah, sent via subspace return TRUE //Huzzah, sent via subspace
@@ -474,13 +470,13 @@ var/global/list/default_medbay_channels = list(
to_chat(loc,"<span class='notice'>\The [src] pings as it reestablishes subspace communications.</span>") to_chat(loc,"<span class='notice'>\The [src] pings as it reestablishes subspace communications.</span>")
subspace_transmission = TRUE subspace_transmission = TRUE
// we're done here. // we're done here.
return 1 return TRUE
// Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level. // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
// Send a mundane broadcast with limited targets: // Send a mundane broadcast with limited targets:
//THIS IS TEMPORARY. YEAH RIGHT //THIS IS TEMPORARY. YEAH RIGHT
if(!connection) return 0 //~Carn if(!connection) return FALSE //~Carn
//VOREStation Add Start //VOREStation Add Start
if(bluespace_radio) if(bluespace_radio)
@@ -504,7 +500,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message) /obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message)
if ((R.frequency == frequency && message)) if ((R.frequency == frequency && message))
return 1 return TRUE
else if else if
else else
@@ -544,7 +540,7 @@ var/global/list/default_medbay_channels = list(
if (!accept) if (!accept)
for (var/ch_name in channels) for (var/ch_name in channels)
var/datum/radio_frequency/RF = secure_radio_connections[ch_name] var/datum/radio_frequency/RF = secure_radio_connections[ch_name]
if (RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING)) if (RF && RF.frequency==freq && (channels[ch_name]&FREQ_LISTENING))
accept = 1 accept = 1
break break
if (!accept) if (!accept)
@@ -695,7 +691,7 @@ var/global/list/default_medbay_channels = list(
/obj/item/device/radio/borg/Topic(href, href_list) /obj/item/device/radio/borg/Topic(href, href_list)
if(..()) if(..())
return 1 return TRUE
if (href_list["mode"]) if (href_list["mode"])
var/enable_subspace_transmission = text2num(href_list["mode"]) var/enable_subspace_transmission = text2num(href_list["mode"])
if(enable_subspace_transmission != subspace_transmission) if(enable_subspace_transmission != subspace_transmission)

View File

@@ -175,6 +175,30 @@ HALOGEN COUNTER - Radcount on mobs
dat += stomachunknownreagents[d] dat += stomachunknownreagents[d]
else else
dat += "<span class='warning'>Unknown substance[(unknown > 1)?"s":""] found in subject's stomach.</span><br>" dat += "<span class='warning'>Unknown substance[(unknown > 1)?"s":""] found in subject's stomach.</span><br>"
if(C.touching && C.touching.total_volume)
var/unknown = 0
var/touchreagentdata[0]
var/touchunknownreagents[0]
for(var/B in C.touching.reagent_list)
var/datum/reagent/T = B
if(T.scannable)
touchreagentdata["[T.id]"] = "<span class='notice'>\t[round(C.touching.get_reagent_amount(T.id), 1)]u [T.name]</span><br>"
if (advscan == 0 || showadvscan == 0)
dat += "<span class='notice'>[T.name] found in subject's dermis.</span><br>"
else
++unknown
touchunknownreagents["[T.id]"] = "<span class='notice'>\t[round(C.ingested.get_reagent_amount(T.id), 1)]u [T.name]</span><br>"
if(advscan >= 1 && showadvscan == 1)
dat += "<span class='notice'>Beneficial reagents detected in subject's dermis:</span><br>"
for(var/d in touchreagentdata)
dat += touchreagentdata[d]
if(unknown)
if(advscan >= 3 && showadvscan == 1)
dat += "<span class='warning'>Warning: Non-medical reagent[(unknown > 1)?"s":""] found in subject's dermis:</span><br>"
for(var/d in touchunknownreagents)
dat += touchunknownreagents[d]
else
dat += "<span class='warning'>Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.</span><br>"
if(C.virus2.len) if(C.virus2.len)
for (var/ID in C.virus2) for (var/ID in C.virus2)
if (ID in virusDB) if (ID in virusDB)

View File

@@ -50,4 +50,9 @@
/datum/matter_synth/wire /datum/matter_synth/wire
name = "Wire Synthesizer" name = "Wire Synthesizer"
max_energy = 50 max_energy = 50
recharge_rate = 2 recharge_rate = 2
/datum/matter_synth/bandage
name = "Bandage Synthesizer"
max_energy = 10
recharge_rate = 1

View File

@@ -11,6 +11,8 @@
var/heal_burn = 0 var/heal_burn = 0
var/apply_sounds var/apply_sounds
var/upgrade_to // The type path this stack can be upgraded to.
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob) /obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (!istype(M)) if (!istype(M))
user << "<span class='warning'>\The [src] cannot be applied to [M]!</span>" user << "<span class='warning'>\The [src] cannot be applied to [M]!</span>"
@@ -59,6 +61,80 @@
use(1) use(1)
M.updatehealth() M.updatehealth()
/obj/item/stack/medical/proc/upgrade_stack(var/upgrade_amount)
. = FALSE
var/turf/T = get_turf(src)
if(ispath(upgrade_to) && use(upgrade_amount))
var/obj/item/stack/medical/M = new upgrade_to(T, upgrade_amount)
return M
return .
/obj/item/stack/medical/crude_pack
name = "crude bandage"
singular_name = "crude bandage length"
desc = "Some bandages to wrap around bloody stumps."
icon_state = "gauze"
origin_tech = list(TECH_BIO = 1)
no_variants = FALSE
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
upgrade_to = /obj/item/stack/medical/bruise_pack
/obj/item/stack/medical/crude_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open)
to_chat(user, "<span class='notice'>The [affecting.name] is cut open, you'll need more than a bandage!</span>")
return
if(affecting.is_bandaged())
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>")
return 1
else
user.visible_message("<span class='notice'>\The [user] starts bandaging [M]'s [affecting.name].</span>", \
"<span class='notice'>You start bandaging [M]'s [affecting.name].</span>" )
var/used = 0
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if(W.bandaged)
continue
if(used == amount)
break
if(!do_mob(user, M, W.damage/3))
to_chat(user, "<span class='notice'>You must stand still to bandage wounds.</span>")
break
if(affecting.is_bandaged()) // We do a second check after the delay, in case it was bandaged after the first check.
to_chat(user, "<span class='warning'>The wounds on [M]'s [affecting.name] have already been bandaged.</span>")
return 1
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message("<span class='notice'>\The [user] bandages \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
else
user.visible_message("<span class='notice'>\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You place a bandage over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
playsound(src, pick(apply_sounds), 25)
used++
affecting.update_damages()
if(used == amount)
if(affecting.is_bandaged())
to_chat(user, "<span class='warning'>\The [src] is used up.</span>")
else
to_chat(user, "<span class='warning'>\The [src] is used up, but there are more wounds to treat on \the [affecting.name].</span>")
use(used)
/obj/item/stack/medical/bruise_pack /obj/item/stack/medical/bruise_pack
name = "roll of gauze" name = "roll of gauze"
singular_name = "gauze length" singular_name = "gauze length"
@@ -68,6 +144,8 @@
no_variants = FALSE no_variants = FALSE
apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg') apply_sounds = list('sound/effects/rip1.ogg','sound/effects/rip2.ogg')
upgrade_to = /obj/item/stack/medical/advanced/bruise_pack
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob) /obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..()) if(..())
return 1 return 1

View File

@@ -24,6 +24,9 @@
var/list/datum/matter_synth/synths = null var/list/datum/matter_synth/synths = null
var/no_variants = TRUE // Determines whether the item should update it's sprites based on amount. var/no_variants = TRUE // Determines whether the item should update it's sprites based on amount.
var/pass_color = FALSE // Will the item pass its own color var to the created item? Dyed cloth, wood, etc.
var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc)
/obj/item/stack/New(var/loc, var/amount=null) /obj/item/stack/New(var/loc, var/amount=null)
..() ..()
if (!stacktype) if (!stacktype)
@@ -159,6 +162,17 @@
for (var/obj/item/I in O) for (var/obj/item/I in O)
qdel(I) qdel(I)
if ((pass_color || recipe.pass_color))
if(!color)
if(recipe.use_material)
var/material/MAT = get_material_by_name(recipe.use_material)
if(MAT.icon_colour)
O.color = MAT.icon_colour
else
return
else
O.color = color
/obj/item/stack/Topic(href, href_list) /obj/item/stack/Topic(href, href_list)
..() ..()
if ((usr.restrained() || usr.stat || usr.get_active_hand() != src)) if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
@@ -242,6 +256,9 @@
return 0 return 0
if ((stacktype != S.stacktype) && !type_verified) if ((stacktype != S.stacktype) && !type_verified)
return 0 return 0
if ((strict_color_stacking || S.strict_color_stacking) && S.color != color)
return 0
if (isnull(tamount)) if (isnull(tamount))
tamount = src.get_amount() tamount = src.get_amount()
@@ -355,8 +372,9 @@
var/one_per_turf = 0 var/one_per_turf = 0
var/on_floor = 0 var/on_floor = 0
var/use_material var/use_material
var/pass_color
New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null) New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null, pass_stack_color)
src.title = title src.title = title
src.result_type = result_type src.result_type = result_type
src.req_amount = req_amount src.req_amount = req_amount
@@ -366,6 +384,7 @@
src.one_per_turf = one_per_turf src.one_per_turf = one_per_turf
src.on_floor = on_floor src.on_floor = on_floor
src.use_material = supplied_material src.use_material = supplied_material
src.pass_color = pass_stack_color
/* /*
* Recipe list datum * Recipe list datum

View File

@@ -929,6 +929,12 @@
icon_state = "nymphplushie" icon_state = "nymphplushie"
pokephrase = "Chirp!" pokephrase = "Chirp!"
/obj/item/toy/plushie/teshari
name = "teshari plush"
desc = "This is a plush teshari. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like she is sleeping. Shhh!"
icon_state = "teshariplushie"
pokephrase = "Rya!"
/obj/item/toy/plushie/mouse /obj/item/toy/plushie/mouse
name = "mouse plush" name = "mouse plush"
desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend." desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
@@ -1357,4 +1363,4 @@
icon_state = "tinyxmastree" icon_state = "tinyxmastree"
w_class = ITEMSIZE_TINY w_class = ITEMSIZE_TINY
force = 1 force = 1
throwforce = 1 throwforce = 1

View File

@@ -80,6 +80,10 @@
name = "\improper \"LiquidProtein\" ration" name = "\improper \"LiquidProtein\" ration"
icon_state = "liquidprotein" icon_state = "liquidprotein"
/obj/item/trash/liquidvitamin
name = "\improper \"VitaPaste\" ration"
icon_state = "liquidvitamin"
/obj/item/trash/tastybread /obj/item/trash/tastybread
name = "bread tube" name = "bread tube"
icon_state = "tastybread" icon_state = "tastybread"

View File

@@ -13,6 +13,7 @@
var/implant_color = "b" var/implant_color = "b"
var/allow_reagents = 0 var/allow_reagents = 0
var/malfunction = 0 var/malfunction = 0
var/initialize_loc = BP_TORSO
show_messages = 1 show_messages = 1
/obj/item/weapon/implant/proc/trigger(emote, source as mob) /obj/item/weapon/implant/proc/trigger(emote, source as mob)
@@ -30,7 +31,7 @@
var/mob/living/carbon/human/H = source var/mob/living/carbon/human/H = source
var/obj/item/organ/external/affected = H.get_organ(target_zone) var/obj/item/organ/external/affected = H.get_organ(target_zone)
if(affected) if(affected)
affected.implants += src affected.implants |= src
part = affected part = affected
if(part) if(part)
forceMove(part) forceMove(part)
@@ -65,8 +66,9 @@
/obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H) /obj/item/weapon/implant/proc/implant_loadout(var/mob/living/carbon/human/H)
if(H) if(H)
var/obj/item/organ/external/affected = H.organs_by_name[BP_HEAD] var/obj/item/organ/external/affected = H.organs_by_name[initialize_loc]
if(handle_implant(H, affected)) if(handle_implant(H, affected))
invisibility = initial(invisibility)
post_implant(H) post_implant(H)
/obj/item/weapon/implant/Destroy() /obj/item/weapon/implant/Destroy()
@@ -110,7 +112,7 @@ GLOBAL_LIST_BOILERPLATE(all_tracking_implants, /obj/item/weapon/implant/tracking
..() ..()
/obj/item/weapon/implant/tracking/post_implant(var/mob/source) /obj/item/weapon/implant/tracking/post_implant(var/mob/source)
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
/obj/item/weapon/implant/tracking/Destroy() /obj/item/weapon/implant/tracking/Destroy()
STOP_PROCESSING(SSobj, src) STOP_PROCESSING(SSobj, src)
@@ -563,7 +565,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/death_alarm/post_implant(mob/source as mob) /obj/item/weapon/implant/death_alarm/post_implant(mob/source as mob)
mobname = source.real_name mobname = source.real_name
START_PROCESSING(SSobj, src) START_PROCESSING(SSobj, src)
////////////////////////////// //////////////////////////////
// Compressed Matter Implant // Compressed Matter Implant

View File

@@ -0,0 +1,196 @@
//////////////////////////////
// Nanite Organ Implant
//////////////////////////////
/obj/item/weapon/implant/organ
name = "nanite fabrication implant"
desc = "A buzzing implant covered in a writhing layer of metal insects."
icon_state = "implant_evil"
origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 2, TECH_ILLEGAL = 2)
var/organ_to_implant = /obj/item/organ/internal/augment/bioaugment/thermalshades
var/organ_display_name = "unknown organ"
/obj/item/weapon/implant/organ/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> \"GreyDoctor\" Class Nanite Hive<BR>
<b>Life:</b> Activates upon implantation, destroying itself in the process.<BR>
<b>Important Notes:</b> Nanites will fail to complete their task if a suitable location cannot be found for the organ.<BR>
<HR>
<b>Implant Details:</b><BR>
<b>Function:</b> Nanites will fabricate: <span class='alien'>[organ_display_name]</span><BR>
<b>Special Features:</b> Organ identification protocols.<BR>
<b>Integrity:</b> N/A"}
return dat
/obj/item/weapon/implant/organ/post_implant(var/mob/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/NewOrgan = new organ_to_implant()
var/obj/item/organ/external/E = H.get_organ(NewOrgan.parent_organ)
to_chat(H, "<span class='notice'>You feel a tingling sensation in your [part].</span>")
if(E && !(H.internal_organs_by_name[NewOrgan.organ_tag]))
spawn(rand(1 SECONDS, 30 SECONDS))
to_chat(H, "<span class='alien'>You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.</span>")
NewOrgan.forceMove(H)
NewOrgan.owner = H
if(E.internal_organs == null)
E.internal_organs = list()
E.internal_organs |= NewOrgan
H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan
H.internal_organs |= NewOrgan
NewOrgan.handle_organ_mod_special()
spawn(1)
if(!QDELETED(src))
qdel(src)
else
qdel(NewOrgan)
to_chat(H, "<span class='warning'>You feel a pinching sensation in your [part]. The implant remains.</span>")
/obj/item/weapon/implant/organ/islegal()
return 0
/*
* Arm / leg mounted augments.
*/
/obj/item/weapon/implant/organ/limbaugment
name = "nanite implant"
organ_to_implant = /obj/item/organ/internal/augment/armmounted/taser
organ_display_name = "physiological augment"
var/list/possible_targets = list(O_AUG_L_FOREARM, O_AUG_R_FOREARM)
/obj/item/weapon/implant/organ/limbaugment/post_implant(var/mob/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/NewOrgan = new organ_to_implant()
var/obj/item/organ/external/E = setup_augment_slots(H, NewOrgan)
to_chat(H, "<span class='notice'>You feel a tingling sensation in your [part].</span>")
if(E && istype(E) && !(H.internal_organs_by_name[NewOrgan.organ_tag]))
spawn(rand(1 SECONDS, 30 SECONDS))
to_chat(H, "<span class='alien'>You feel a pressure in your [E] as the tingling fades, the lump caused by the implant now gone.</span>")
NewOrgan.forceMove(H)
NewOrgan.owner = H
if(E.internal_organs == null)
E.internal_organs = list()
E.internal_organs |= NewOrgan
H.internal_organs_by_name[NewOrgan.organ_tag] = NewOrgan
H.internal_organs |= NewOrgan
NewOrgan.handle_organ_mod_special()
spawn(1)
if(!QDELETED(src))
qdel(src)
else
qdel(NewOrgan)
to_chat(H, "<span class='warning'>You feel a pinching sensation in your [part]. The implant remains.</span>")
/obj/item/weapon/implant/organ/limbaugment/proc/setup_augment_slots(var/mob/living/carbon/human/H, var/obj/item/organ/internal/augment/armmounted/I)
var/list/Choices = possible_targets.Copy()
for(var/targ in possible_targets)
if(H.internal_organs_by_name[targ])
Choices -= targ
var/target_choice = null
if(Choices && Choices.len)
if(Choices.len == 1)
target_choice = Choices[1]
else
target_choice = input("Choose augment location:") in Choices
else
return FALSE
if(target_choice)
switch(target_choice)
if(O_AUG_R_HAND)
I.organ_tag = O_AUG_R_HAND
I.parent_organ = BP_R_HAND
I.target_slot = slot_r_hand
if(O_AUG_L_HAND)
I.organ_tag = O_AUG_L_HAND
I.parent_organ = BP_L_HAND
I.target_slot = slot_l_hand
if(O_AUG_R_FOREARM)
I.organ_tag = O_AUG_R_FOREARM
I.parent_organ = BP_R_ARM
I.target_slot = slot_r_hand
if(O_AUG_L_FOREARM)
I.organ_tag = O_AUG_L_FOREARM
I.parent_organ = BP_L_ARM
I.target_slot = slot_l_hand
if(O_AUG_R_UPPERARM)
I.organ_tag = O_AUG_R_UPPERARM
I.parent_organ = BP_R_ARM
I.target_slot = slot_r_hand
if(O_AUG_L_UPPERARM)
I.organ_tag = O_AUG_L_UPPERARM
I.parent_organ = BP_L_ARM
I.target_slot = slot_l_hand
. = H.get_organ(I.parent_organ)
/*
* Limb implant primary subtypes.
*/
/obj/item/weapon/implant/organ/limbaugment/upperarm
organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple
organ_display_name = "multi-use augment"
possible_targets = list(O_AUG_R_UPPERARM,O_AUG_L_UPPERARM)
/obj/item/weapon/implant/organ/limbaugment/wrist
organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand
organ_display_name = "wrist augment"
possible_targets = list(O_AUG_R_HAND,O_AUG_L_HAND)
/*
* Limb implant general subtypes.
*/
// Wrist
/obj/item/weapon/implant/organ/limbaugment/wrist/sword
organ_to_implant = /obj/item/organ/internal/augment/armmounted/hand/sword
organ_display_name = "weapon augment"
// Fore-arm
/obj/item/weapon/implant/organ/limbaugment/laser
organ_to_implant = /obj/item/organ/internal/augment/armmounted
organ_display_name = "weapon augment"
/obj/item/weapon/implant/organ/limbaugment/dart
organ_to_implant = /obj/item/organ/internal/augment/armmounted/dartbow
organ_display_name = "weapon augment"
// Upper-arm.
/obj/item/weapon/implant/organ/limbaugment/upperarm/medkit
organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/multiple/medical
/obj/item/weapon/implant/organ/limbaugment/upperarm/surge
organ_to_implant = /obj/item/organ/internal/augment/armmounted/shoulder/surge
/*
* Others
*/
/obj/item/weapon/implant/organ/pelvic
name = "nanite fabrication implant"
organ_to_implant = /obj/item/organ/internal/augment/bioaugment/sprint_enhance
organ_display_name = "pelvic augment"

View File

@@ -179,3 +179,103 @@
src.imp = new /obj/item/weapon/implant/language/eal( src ) src.imp = new /obj/item/weapon/implant/language/eal( src )
..() ..()
return return
/obj/item/weapon/implantcase/shades
name = "glass case - 'Integrated Shades'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/shades/New()
src.imp = new /obj/item/weapon/implant/organ( src )
..()
return
/obj/item/weapon/implantcase/taser
name = "glass case - 'Taser'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/taser/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment( src )
..()
return
/obj/item/weapon/implantcase/laser
name = "glass case - 'Laser'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/laser/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/laser( src )
..()
return
/obj/item/weapon/implantcase/dart
name = "glass case - 'Dart'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/dart/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/dart( src )
..()
return
/obj/item/weapon/implantcase/toolkit
name = "glass case - 'Toolkit'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/toolkit/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm( src )
..()
return
/obj/item/weapon/implantcase/medkit
name = "glass case - 'Toolkit'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/medkit/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/medkit( src )
..()
return
/obj/item/weapon/implantcase/surge
name = "glass case - 'Muscle Overclocker'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/surge/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/upperarm/surge( src )
..()
return
/obj/item/weapon/implantcase/analyzer
name = "glass case - 'Scanner'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/analyzer/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist( src )
..()
return
/obj/item/weapon/implantcase/sword
name = "glass case - 'Scanner'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/sword/New()
src.imp = new /obj/item/weapon/implant/organ/limbaugment/wrist/sword( src )
..()
return
/obj/item/weapon/implantcase/sprinter
name = "glass case - 'Sprinter'"
desc = "A case containing a nanite fabricator implant."
icon_state = "implantcase-b"
/obj/item/weapon/implantcase/sprinter/New()
src.imp = new /obj/item/weapon/implant/organ/pelvic( src )
..()
return

View File

@@ -0,0 +1,30 @@
/obj/item/weapon/implant/dud
name = "unknown implant"
desc = "A small device with small connector wires."
icon = 'icons/obj/device.dmi'
icon_state = "implant"
initialize_loc = BP_HEAD
var/roundstart = TRUE
/obj/item/weapon/implant/dud/torso
name = "unknown implant"
desc = "A small device with small connector wires."
icon = 'icons/obj/device.dmi'
icon_state = "implant"
initialize_loc = BP_TORSO
/obj/item/weapon/implant/dud/old
name = "old implant"
desc = "A small device with small connector wires."
icon = 'icons/obj/device.dmi'
icon_state = "implant"
roundstart = FALSE
/obj/item/weapon/implant/dud/Initialize()
..()
if(roundstart)
invisibility = 100
..()
spawn(3)
if(!ishuman(loc) && !QDELETED(src))
qdel(src)

View File

@@ -1,6 +1,7 @@
/obj/item/weapon/implant/neural /obj/item/weapon/implant/neural
name = "neural framework implant" name = "neural framework implant"
desc = "A small metal casing with numerous wires stemming off of it." desc = "A small metal casing with numerous wires stemming off of it."
initialize_loc = BP_HEAD
var/obj/item/organ/internal/brain/my_brain = null var/obj/item/organ/internal/brain/my_brain = null
var/target_state = null var/target_state = null
var/robotic_brain = FALSE var/robotic_brain = FALSE
@@ -104,3 +105,10 @@ Implant Specifics:<BR>"}
my_brain.take_damage(15) my_brain.take_damage(15)
my_brain = null my_brain = null
return return
/obj/item/weapon/implant/neural/roundstart/Initialize()
invisibility = 100
..()
spawn(3)
if(!ishuman(loc) && !QDELETED(src))
qdel(src)

View File

@@ -63,55 +63,48 @@
/obj/item/weapon/material/shard/afterattack(var/atom/target, mob/living/carbon/human/user as mob) /obj/item/weapon/material/shard/afterattack(var/atom/target, mob/living/carbon/human/user as mob)
var/active_hand //hand the shard is in var/active_hand //hand the shard is in
var/will_break var/will_break = FALSE
var/gloves_are_heavy = FALSE//this is a fucking mess var/protected_hands = FALSE //this is a fucking mess
var/break_damage = 4 var/break_damage = 4
var/light_glove_d = rand(2, 4) var/light_glove_d = rand(2, 4)
var/no_glove_d = rand(4, 6) var/no_glove_d = rand(4, 6)
var/list/h_gloves = list(/obj/item/clothing/gloves/captain, /obj/item/clothing/gloves/cyborg, var/list/forbidden_gloves = list(
/obj/item/clothing/gloves/swat, /obj/item/clothing/gloves/combat, /obj/item/clothing/gloves/sterile,
/obj/item/clothing/gloves/botanic_leather, /obj/item/clothing/gloves/duty, /obj/item/clothing/gloves/knuckledusters
/obj/item/clothing/gloves/tactical, /obj/item/clothing/gloves/vox, )
/obj/item/clothing/gloves/gauntlets)
if(istype(user.l_hand, src)) if(src == user.l_hand)
active_hand = BP_L_HAND active_hand = BP_L_HAND
else else if(src == user.r_hand)
active_hand = BP_R_HAND active_hand = BP_R_HAND
else
return // If it's not actually in our hands anymore, we were probably gentle with it
active_hand = (src == user.l_hand) ? BP_L_HAND : BP_R_HAND // May not actually be faster than an if-else block, but a little bit cleaner -Ater
if(prob(75)) if(prob(75))
will_break = TRUE will_break = TRUE
else
will_break = FALSE
if(user.gloves && (user.gloves.body_parts_covered & HANDS)) if(user.gloves && (user.gloves.body_parts_covered & HANDS) && istype(user.gloves, /obj/item/clothing/gloves)) // Not-gloves aren't gloves, and therefore don't protect us
var/obj/item/clothing/gloves/UG = user.gloves.type protected_hands = TRUE // If we're wearing gloves we can probably handle it just fine
for(var/I in h_gloves) for(var/I in forbidden_gloves)
if(UG == I) if(istype(user.gloves, I)) // forbidden_gloves is a blacklist, so if we match anything in there, our hands are not protected
gloves_are_heavy = TRUE protected_hands = FALSE
if(will_break) break
user.visible_message("<span class='danger'>[user] hit \the [target] with \the [src], shattering it!</span>", "<span class='warning'>You shatter \the [src] in your hand!</span>")
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
qdel(src)
if(gloves_are_heavy == FALSE) if(user.gloves && !protected_hands)
to_chat(user, "<span class='warning'>\The [src] partially cuts into your hand through your gloves as you hit \the [target]!</span>") to_chat(user, "<span class='warning'>\The [src] partially cuts into your hand through your gloves as you hit \the [target]!</span>")
if(will_break) user.apply_damage(light_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge) // Ternary to include break damage
user.visible_message("<span class='danger'>[user] hit \the [target] with \the [src], shattering it!</span>", "<span class='warning'>You shatter \the [src] in your hand!</span>")
user.apply_damage(light_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge) else if(!user.gloves)
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
qdel(src)
else
user.apply_damage(light_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge)
else
to_chat(user, "<span class='warning'>\The [src] cuts into your hand as you hit \the [target]!</span>") to_chat(user, "<span class='warning'>\The [src] cuts into your hand as you hit \the [target]!</span>")
if(will_break) user.apply_damage(no_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge)
user.visible_message("<span class='danger'>[user] hit \the [target] with \the [src], shattering it!</span>", "<span class='warning'>You shatter \the [src] in your hand!</span>")
user.apply_damage(no_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge) if(will_break && src.loc == user) // If it's not in our hand anymore
playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1) user.visible_message("<span class='danger'>[user] hit \the [target] with \the [src], shattering it!</span>", "<span class='warning'>You shatter \the [src] in your hand!</span>")
qdel(src) playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1)
else qdel(src)
user.apply_damage(no_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge) return
/obj/item/weapon/material/shard/Crossed(AM as mob|obj) /obj/item/weapon/material/shard/Crossed(AM as mob|obj)
..() ..()

View File

@@ -128,4 +128,9 @@
/obj/item/weapon/storage/backpack/dufflebag/fluff //Black dufflebag without syndie buffs. /obj/item/weapon/storage/backpack/dufflebag/fluff //Black dufflebag without syndie buffs.
name = "plain black dufflebag" name = "plain black dufflebag"
desc = "A large dufflebag for holding extra tactical supplies." desc = "A large dufflebag for holding extra tactical supplies."
icon_state = "duffle_syndie" icon_state = "duffle_syndie"
/obj/item/weapon/storage/backpack
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/back.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/back.dmi')

View File

@@ -0,0 +1,4 @@
/obj/item/weapon/storage/belt
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/belt.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/belt.dmi')

View File

@@ -185,6 +185,20 @@ MRE Stuff
/obj/random/mre/sauce/crayon /obj/random/mre/sauce/crayon
) )
/obj/item/weapon/storage/mre/menu13
name = "medical MRE"
meal_desc = "This one is menu 13, vitamin paste & dessert. Only for emergencies."
icon_state = "crayonmre"
starts_with = list(
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin,
/obj/item/weapon/reagent_containers/food/snacks/liquidprotein,
/obj/random/mre/drink,
/obj/item/weapon/storage/mrebag/dessert,
/obj/item/weapon/material/kitchen/utensil/spoon/plastic
)
/obj/item/weapon/storage/mre/random /obj/item/weapon/storage/mre/random
meal_desc = "The menu label is faded out." meal_desc = "The menu label is faded out."
starts_with = list( starts_with = list(

View File

@@ -93,6 +93,42 @@
O.update() O.update()
. = ..() . = ..()
/obj/item/weapon/storage/box/syndie_kit/imp_aug
name = "boxed augment implant (with injector)"
var/case_type = /obj/item/weapon/implantcase/shades
/obj/item/weapon/storage/box/syndie_kit/imp_aug/Initialize()
new /obj/item/weapon/implanter(src)
new case_type(src)
. = ..()
/obj/item/weapon/storage/box/syndie_kit/imp_aug/taser
case_type = /obj/item/weapon/implantcase/taser
/obj/item/weapon/storage/box/syndie_kit/imp_aug/laser
case_type = /obj/item/weapon/implantcase/laser
/obj/item/weapon/storage/box/syndie_kit/imp_aug/dart
case_type = /obj/item/weapon/implantcase/dart
/obj/item/weapon/storage/box/syndie_kit/imp_aug/toolkit
case_type = /obj/item/weapon/implantcase/toolkit
/obj/item/weapon/storage/box/syndie_kit/imp_aug/medkit
case_type = /obj/item/weapon/implantcase/medkit
/obj/item/weapon/storage/box/syndie_kit/imp_aug/surge
case_type = /obj/item/weapon/implantcase/surge
/obj/item/weapon/storage/box/syndie_kit/imp_aug/analyzer
case_type = /obj/item/weapon/implantcase/analyzer
/obj/item/weapon/storage/box/syndie_kit/imp_aug/sword
case_type = /obj/item/weapon/implantcase/sword
/obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
case_type = /obj/item/weapon/implantcase/sprinter
/obj/item/weapon/storage/box/syndie_kit/space /obj/item/weapon/storage/box/syndie_kit/space
name = "boxed space suit and helmet" name = "boxed space suit and helmet"
starts_with = list( starts_with = list(

View File

@@ -128,6 +128,15 @@
icon_state = "scalpel_manager_on" icon_state = "scalpel_manager_on"
force = 7.5 force = 7.5
/obj/item/weapon/surgical/scalpel/ripper
name = "organ pincers"
desc = "A horrifying bladed tool with a large metal spike in its center. The tool is used for rapidly removing organs from hopefully willing patients."
icon_state = "organ_ripper"
item_state = "bone_setter"
force = 15.0
toolspeed = 0.75
origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 3, TECH_ILLEGAL = 2)
/* /*
* Circular Saw * Circular Saw
*/ */
@@ -147,6 +156,19 @@
sharp = 1 sharp = 1
edge = 1 edge = 1
/obj/item/weapon/surgical/circular_saw/manager
name = "energetic bone diverter"
desc = "For heavy duty cutting (and sealing), with science!"
icon_state = "adv_saw"
item_state = "saw3"
hitsound = 'sound/weapons/emitter2.ogg'
damtype = SEARING
w_class = ITEMSIZE_LARGE
origin_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 6)
matter = list(DEFAULT_WALL_MATERIAL = 12500)
attack_verb = list("attacked", "slashed", "seared", "cut")
toolspeed = 0.75
//misc, formerly from code/defines/weapons.dm //misc, formerly from code/defines/weapons.dm
/obj/item/weapon/surgical/bonegel /obj/item/weapon/surgical/bonegel
name = "bone gel" name = "bone gel"
@@ -245,4 +267,4 @@
/obj/item/weapon/surgical/bone_clamp/alien /obj/item/weapon/surgical/bone_clamp/alien
icon = 'icons/obj/abductor.dmi' icon = 'icons/obj/abductor.dmi'
toolspeed = 0.75 toolspeed = 0.75

View File

@@ -137,6 +137,46 @@
if ("button") soundin = pick('sound/machines/button1.ogg','sound/machines/button2.ogg','sound/machines/button3.ogg','sound/machines/button4.ogg') if ("button") soundin = pick('sound/machines/button1.ogg','sound/machines/button2.ogg','sound/machines/button3.ogg','sound/machines/button4.ogg')
if ("switch") soundin = pick('sound/machines/switch1.ogg','sound/machines/switch2.ogg','sound/machines/switch3.ogg','sound/machines/switch4.ogg') if ("switch") soundin = pick('sound/machines/switch1.ogg','sound/machines/switch2.ogg','sound/machines/switch3.ogg','sound/machines/switch4.ogg')
if ("casing_sound") soundin = pick('sound/weapons/casingfall1.ogg','sound/weapons/casingfall2.ogg','sound/weapons/casingfall3.ogg') if ("casing_sound") soundin = pick('sound/weapons/casingfall1.ogg','sound/weapons/casingfall2.ogg','sound/weapons/casingfall3.ogg')
//VORESTATION EDIT - vore sounds for better performance
if ("hunger_sounds") soundin = pick('sound/vore/growl1.ogg','sound/vore/growl2.ogg','sound/vore/growl3.ogg','sound/vore/growl4.ogg','sound/vore/growl5.ogg')
if("classic_digestion_sounds") soundin = pick(
'sound/vore/digest1.ogg','sound/vore/digest2.ogg','sound/vore/digest3.ogg','sound/vore/digest4.ogg',
'sound/vore/digest5.ogg','sound/vore/digest6.ogg','sound/vore/digest7.ogg','sound/vore/digest8.ogg',
'sound/vore/digest9.ogg','sound/vore/digest10.ogg','sound/vore/digest11.ogg','sound/vore/digest12.ogg')
if("classic_death_sounds") soundin = pick(
'sound/vore/death1.ogg','sound/vore/death2.ogg','sound/vore/death3.ogg','sound/vore/death4.ogg','sound/vore/death5.ogg',
'sound/vore/death6.ogg','sound/vore/death7.ogg','sound/vore/death8.ogg','sound/vore/death9.ogg','sound/vore/death10.ogg')
if("classic_struggle_sounds") soundin = pick('sound/vore/squish1.ogg','sound/vore/squish2.ogg','sound/vore/squish3.ogg','sound/vore/squish4.ogg')
if("fancy_prey_struggle") soundin = pick(
'sound/vore/sunesound/prey/struggle_01.ogg','sound/vore/sunesound/prey/struggle_02.ogg','sound/vore/sunesound/prey/struggle_03.ogg',
'sound/vore/sunesound/prey/struggle_04.ogg','sound/vore/sunesound/prey/struggle_05.ogg')
if("fancy_digest_pred") soundin = pick(
'sound/vore/sunesound/pred/digest_01.ogg','sound/vore/sunesound/pred/digest_02.ogg','sound/vore/sunesound/pred/digest_03.ogg',
'sound/vore/sunesound/pred/digest_04.ogg','sound/vore/sunesound/pred/digest_05.ogg','sound/vore/sunesound/pred/digest_06.ogg',
'sound/vore/sunesound/pred/digest_07.ogg','sound/vore/sunesound/pred/digest_08.ogg','sound/vore/sunesound/pred/digest_09.ogg',
'sound/vore/sunesound/pred/digest_10.ogg','sound/vore/sunesound/pred/digest_11.ogg','sound/vore/sunesound/pred/digest_12.ogg',
'sound/vore/sunesound/pred/digest_13.ogg','sound/vore/sunesound/pred/digest_14.ogg','sound/vore/sunesound/pred/digest_15.ogg',
'sound/vore/sunesound/pred/digest_16.ogg','sound/vore/sunesound/pred/digest_17.ogg','sound/vore/sunesound/pred/digest_18.ogg')
if("fancy_death_pred") soundin = pick(
'sound/vore/sunesound/pred/death_01.ogg','sound/vore/sunesound/pred/death_02.ogg','sound/vore/sunesound/pred/death_03.ogg',
'sound/vore/sunesound/pred/death_04.ogg','sound/vore/sunesound/pred/death_05.ogg','sound/vore/sunesound/pred/death_06.ogg',
'sound/vore/sunesound/pred/death_07.ogg','sound/vore/sunesound/pred/death_08.ogg','sound/vore/sunesound/pred/death_09.ogg',
'sound/vore/sunesound/pred/death_10.ogg')
if("fancy_digest_prey") soundin = pick(
'sound/vore/sunesound/prey/digest_01.ogg','sound/vore/sunesound/prey/digest_02.ogg','sound/vore/sunesound/prey/digest_03.ogg',
'sound/vore/sunesound/prey/digest_04.ogg','sound/vore/sunesound/prey/digest_05.ogg','sound/vore/sunesound/prey/digest_06.ogg',
'sound/vore/sunesound/prey/digest_07.ogg','sound/vore/sunesound/prey/digest_08.ogg','sound/vore/sunesound/prey/digest_09.ogg',
'sound/vore/sunesound/prey/digest_10.ogg','sound/vore/sunesound/prey/digest_11.ogg','sound/vore/sunesound/prey/digest_12.ogg',
'sound/vore/sunesound/prey/digest_13.ogg','sound/vore/sunesound/prey/digest_14.ogg','sound/vore/sunesound/prey/digest_15.ogg',
'sound/vore/sunesound/prey/digest_16.ogg','sound/vore/sunesound/prey/digest_17.ogg','sound/vore/sunesound/prey/digest_18.ogg')
if("fancy_death_prey") soundin = pick(
'sound/vore/sunesound/prey/death_01.ogg','sound/vore/sunesound/prey/death_02.ogg','sound/vore/sunesound/prey/death_03.ogg',
'sound/vore/sunesound/prey/death_04.ogg','sound/vore/sunesound/prey/death_05.ogg','sound/vore/sunesound/prey/death_06.ogg',
'sound/vore/sunesound/prey/death_07.ogg','sound/vore/sunesound/prey/death_08.ogg','sound/vore/sunesound/prey/death_09.ogg',
'sound/vore/sunesound/prey/death_10.ogg')
//END VORESTATION EDIT
return soundin return soundin
//Are these even used? //Are these even used?

View File

@@ -28,7 +28,7 @@
if(N == /turf/space) if(N == /turf/space)
var/turf/below = GetBelow(src) var/turf/below = GetBelow(src)
if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)) && !istype(below, /turf/unsimulated/wall)) // VOREStation Edit: Weird open space if(istype(below) && (air_master.has_valid_zone(below) || air_master.has_valid_zone(src)) && (!istype(below, /turf/unsimulated/wall) && !istype(below, /turf/simulated/sky))) // VOREStation Edit: Weird open space
N = /turf/simulated/open N = /turf/simulated/open
var/obj/fire/old_fire = fire var/obj/fire/old_fire = fire

View File

@@ -139,7 +139,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
else else
O.robotize() O.robotize()
for(var/name in list(O_HEART,O_EYES,O_LUNGS,O_LIVER,O_KIDNEYS,O_BRAIN)) for(var/name in list(O_HEART,O_EYES,O_VOICE,O_LUNGS,O_LIVER,O_KIDNEYS,O_SPLEEN,O_STOMACH,O_INTESTINE,O_BRAIN))
var/status = pref.organ_data[name] var/status = pref.organ_data[name]
if(!status) if(!status)
continue continue
@@ -237,6 +237,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
organ_name = "heart" organ_name = "heart"
if(O_EYES) if(O_EYES)
organ_name = "eyes" organ_name = "eyes"
if(O_VOICE)
organ_name = "larynx"
if(O_BRAIN) if(O_BRAIN)
organ_name = "brain" organ_name = "brain"
if(O_LUNGS) if(O_LUNGS)
@@ -245,6 +247,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
organ_name = "liver" organ_name = "liver"
if(O_KIDNEYS) if(O_KIDNEYS)
organ_name = "kidneys" organ_name = "kidneys"
if(O_SPLEEN)
organ_name = "spleen"
if(O_STOMACH)
organ_name = "stomach"
if(O_INTESTINE)
organ_name = "intestines"
if(status == "cyborg") if(status == "cyborg")
++ind ++ind
@@ -708,7 +716,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
else if(href_list["organs"]) else if(href_list["organs"])
var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes", "Lungs", "Liver", "Kidneys", "Brain") var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes","Larynx", "Lungs", "Liver", "Kidneys", "Spleen", "Intestines", "Stomach", "Brain")
if(!organ_name) return if(!organ_name) return
var/organ = null var/organ = null
@@ -717,12 +725,20 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
organ = O_HEART organ = O_HEART
if("Eyes") if("Eyes")
organ = O_EYES organ = O_EYES
if("Larynx")
organ = O_VOICE
if("Lungs") if("Lungs")
organ = O_LUNGS organ = O_LUNGS
if("Liver") if("Liver")
organ = O_LIVER organ = O_LIVER
if("Kidneys") if("Kidneys")
organ = O_KIDNEYS organ = O_KIDNEYS
if("Spleen")
organ = O_SPLEEN
if("Intestines")
organ = O_INTESTINE
if("Stomach")
organ = O_STOMACH
if("Brain") if("Brain")
if(pref.organ_data[BP_HEAD] != "cyborg") if(pref.organ_data[BP_HEAD] != "cyborg")
user << "<span class='warning'>You may only select a cybernetic or synthetic brain if you have a full prosthetic body.</span>" user << "<span class='warning'>You may only select a cybernetic or synthetic brain if you have a full prosthetic body.</span>"

View File

@@ -124,6 +124,24 @@
path = /obj/item/weapon/implant/tracking/weak path = /obj/item/weapon/implant/tracking/weak
cost = 0 //VOREStation Edit. Changed cost to 0 cost = 0 //VOREStation Edit. Changed cost to 0
/datum/gear/utility/implant/neural
display_name = "implant, neural assistance web"
description = "A complex web implanted into the subject, medically in order to compensate for neurological disease."
path = /obj/item/weapon/implant/neural/roundstart
cost = 6
/datum/gear/utility/implant/dud1
display_name = "implant, head"
description = "An implant with no obvious purpose."
path = /obj/item/weapon/implant/dud
cost = 1
/datum/gear/utility/implant/dud2
display_name = "implant, torso"
description = "An implant with no obvious purpose."
path = /obj/item/weapon/implant/dud/torso
cost = 1
/datum/gear/utility/implant/language /datum/gear/utility/implant/language
cost = 2 cost = 2
exploitable = 0 exploitable = 0

View File

@@ -2,3 +2,35 @@
datum/preferences datum/preferences
var/show_in_directory = 1 //TFF 5/8/19 - show in Character Directory var/show_in_directory = 1 //TFF 5/8/19 - show in Character Directory
var/sensorpref = 5 //TFF 5/8/19 - set character's suit sensor level var/sensorpref = 5 //TFF 5/8/19 - set character's suit sensor level
//Why weren't these in game toggles already?
/client/verb/toggle_eating_noises()
set name = "Eating Noises"
set category = "Preferences"
set desc = "Toggles Vore Eating noises."
var/pref_path = /datum/client_preference/eating_noises
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear eating related vore noises."
SScharacter_setup.queue_preferences_save(prefs)
feedback_add_details("admin_verb","TEatNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_digestion_noises()
set name = "Digestion Noises"
set category = "Preferences"
set desc = "Toggles Vore Digestion noises."
var/pref_path = /datum/client_preference/digestion_noises
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear digestion related vore noises."
SScharacter_setup.queue_preferences_save(prefs)
feedback_add_details("admin_verb","TDigestNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!

View File

@@ -4,6 +4,10 @@
/obj/item/clothing/shoes /obj/item/clothing/shoes
var/list/inside_emotes = list() var/list/inside_emotes = list()
var/recent_squish = 0 var/recent_squish = 0
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/shoes.dmi',
SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/feet.dmi')
/obj/item/clothing/shoes/New() /obj/item/clothing/shoes/New()
inside_emotes = list( inside_emotes = list(
@@ -51,6 +55,17 @@
..() ..()
/obj/item/clothing/gloves
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/gloves.dmi',
SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/hands.dmi')
/obj/item/clothing/ears
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/ears.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/ears.dmi')
/obj/item/clothing/relaymove(var/mob/living/user,var/direction) /obj/item/clothing/relaymove(var/mob/living/user,var/direction)
if(recent_struggle) if(recent_struggle)
@@ -98,13 +113,18 @@
SPECIES_ZORREN_FLAT = 'icons/mob/species/fennec/mask_vr.dmi', SPECIES_ZORREN_FLAT = 'icons/mob/species/fennec/mask_vr.dmi',
SPECIES_AKULA = 'icons/mob/species/akula/mask_vr.dmi', SPECIES_AKULA = 'icons/mob/species/akula/mask_vr.dmi',
SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/mask.dmi', SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/mask.dmi',
SPECIES_XENOCHIMERA = 'icons/mob/species/tajaran/mask_vr.dmi' SPECIES_XENOCHIMERA = 'icons/mob/species/tajaran/mask_vr.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/masks.dmi'
) )
//"Spider" = 'icons/mob/species/spider/mask_vr.dmi' Add this later when they have custom mask sprites and everything. //"Spider" = 'icons/mob/species/spider/mask_vr.dmi' Add this later when they have custom mask sprites and everything.
//Switch to taur sprites if a taur equips //Switch to taur sprites if a taur equips
/obj/item/clothing/suit /obj/item/clothing/suit
var/taurized = FALSE //Easier than trying to 'compare icons' to see if it's a taur suit var/taurized = FALSE //Easier than trying to 'compare icons' to see if it's a taur suit
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi',
SPECIES_VOX = 'icons/mob/species/vox/suit.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/suit.dmi')
/obj/item/clothing/suit/equipped(var/mob/user, var/slot) /obj/item/clothing/suit/equipped(var/mob/user, var/slot)
var/normalize = TRUE var/normalize = TRUE
@@ -137,6 +157,10 @@
/obj/item/clothing/under /obj/item/clothing/under
sensor_mode = 3 sensor_mode = 3
var/sensorpref = 5 var/sensorpref = 5
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/uniform.dmi',
SPECIES_VOX = 'icons/mob/species/vox/uniform.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/uniform.dmi')
//TFF 5/8/19 - define numbers and specifics for suit sensor settings //TFF 5/8/19 - define numbers and specifics for suit sensor settings
/obj/item/clothing/under/New(var/mob/living/carbon/human/H) /obj/item/clothing/under/New(var/mob/living/carbon/human/H)
@@ -150,4 +174,10 @@
if(5) sensor_mode = pick(0,1,2,3) //Select a random setting if(5) sensor_mode = pick(0,1,2,3) //Select a random setting
else else
sensor_mode = pick(0,1,2,3) sensor_mode = pick(0,1,2,3)
log_debug("Invalid switch for suit sensors, defaulting to random. [sensorpref] chosen") log_debug("Invalid switch for suit sensors, defaulting to random. [sensorpref] chosen")
/obj/item/clothing/head
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi',
SPECIES_VOX = 'icons/mob/species/vox/head.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/head.dmi')

View File

@@ -111,3 +111,10 @@
item_state = "tajblind_meson" item_state = "tajblind_meson"
off_state = "tajblind" off_state = "tajblind"
body_parts_covered = EYES body_parts_covered = EYES
/obj/item/clothing/glasses
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/eyes.dmi',
SPECIES_VOX = 'icons/mob/species/vox/eyes.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/eyes.dmi'
)

View File

@@ -3748,6 +3748,24 @@
reagents.add_reagent("iron", 3) reagents.add_reagent("iron", 3)
bitesize = 4 bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin
name = "\improper VitaPaste Ration"
desc = "A variant of the liquidfood ration, designed for any carbon-based life. Somehow worse than regular liquidfood. Should this be crunchy?"
icon_state = "liquidvitamin"
trash = /obj/item/trash/liquidvitamin
filling_color = "#A8A8A8"
survivalfood = TRUE
center_of_mass = list("x"=16, "y"=15)
/obj/item/weapon/reagent_containers/food/snacks/liquidvitamin/Initialize()
..()
reagents.add_reagent("flour", 20)
reagents.add_reagent("tricordrazine", 5)
reagents.add_reagent("paracetamol", 5)
reagents.add_reagent("enzyme", 1)
reagents.add_reagent("iron", 3)
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/meatcube /obj/item/weapon/reagent_containers/food/snacks/meatcube
name = "cubed meat" name = "cubed meat"
desc = "Fried, salted lean meat compressed into a cube. Not very appetizing." desc = "Fried, salted lean meat compressed into a cube. Not very appetizing."

View File

@@ -137,3 +137,12 @@
icon = 'icons/obj/chemical.dmi' icon = 'icons/obj/chemical.dmi'
icon_state = "bottle-3" icon_state = "bottle-3"
prefill = list("unsorbitol" = 60) prefill = list("unsorbitol" = 60)
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask/glucose
name = "glucose container"
desc = "A container of glucose. Used to treat bloodloss through a hardsuit in unconscious patients."
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask/glucose/Initialize()
. = ..()
reagents.add_reagent("glucose", 100)
on_reagent_change()

View File

@@ -241,6 +241,8 @@
icon = 'icons/obj/beekeeping.dmi' icon = 'icons/obj/beekeeping.dmi'
icon_state = "wax" icon_state = "wax"
default_type = "wax" default_type = "wax"
pass_color = TRUE
strict_color_stacking = TRUE
/obj/item/stack/material/wax/New() /obj/item/stack/material/wax/New()
..() ..()
@@ -252,6 +254,7 @@
icon_colour = "#fff343" icon_colour = "#fff343"
melting_point = T0C+300 melting_point = T0C+300
weight = 1 weight = 1
pass_stack_colors = TRUE
var/global/list/datum/stack_recipe/wax_recipes = list( \ var/global/list/datum/stack_recipe/wax_recipes = list( \
new/datum/stack_recipe("candle", /obj/item/weapon/flame/candle) \ new/datum/stack_recipe("candle", /obj/item/weapon/flame/candle) \

View File

@@ -7,27 +7,27 @@
recipes = list() recipes = list()
// If is_brittle() returns true, these are only good for a single strike. // If is_brittle() returns true, these are only good for a single strike.
recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
if(integrity>=50) if(integrity>=50)
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] double bed", /obj/structure/bed/double, 4, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
if(hardness>50) if(hardness>50)
recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
/material/steel/generate_recipes() /material/steel/generate_recipes()
..() ..()
@@ -117,55 +117,55 @@
/material/plastic/generate_recipes() /material/plastic/generate_recipes()
..() ..()
recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1) recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0) recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0) // 500u recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0, pass_stack_color = TRUE) // 500u
recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0) // 250u recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0, pass_stack_color = TRUE) // 250u
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0) // 100u recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE) // 100u
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20) recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20) recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1) recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE) recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE, pass_stack_color = TRUE)
/material/wood/generate_recipes() /material/wood/generate_recipes()
..() ..()
recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]") recipes += new/datum/stack_recipe("oar", /obj/item/weapon/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]") recipes += new/datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]") recipes += new/datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1) recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1) recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1) recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20) recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0) recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4) recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1) recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1) recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0) recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5) recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS) recipes += new/datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE)
/material/wood/log/generate_recipes() /material/wood/log/generate_recipes()
recipes = list() recipes = list()
recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]") recipes += new/datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE)
/material/cardboard/generate_recipes() /material/cardboard/generate_recipes()
..() ..()
recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box) recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty) recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box) recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes) recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs) recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps) recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3) recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg) recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox) recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe_list("folders",list( \ recipes += new/datum/stack_recipe_list("folders",list( \
new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue), \ new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue), \
new/datum/stack_recipe("grey folder", /obj/item/weapon/folder), \ new/datum/stack_recipe("grey folder", /obj/item/weapon/folder), \
@@ -195,7 +195,7 @@
/material/wood/sif/generate_recipes() /material/wood/sif/generate_recipes()
..() ..()
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20) recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20, pass_stack_color = TRUE)
for(var/datum/stack_recipe/r_recipe in recipes) for(var/datum/stack_recipe/r_recipe in recipes)
if(r_recipe.title == "wood floor tile") if(r_recipe.title == "wood floor tile")
recipes -= r_recipe recipes -= r_recipe
@@ -210,17 +210,18 @@
/material/cloth/generate_recipes() /material/cloth/generate_recipes()
recipes = list() recipes = list()
recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS) recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS) recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS) recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS) recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS) recipes += new/datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS) recipes += new/datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES) recipes += new/datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS) recipes += new/datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS) recipes += new/datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS) recipes += new/datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS) recipes += new/datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS) recipes += new/datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS) recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE) recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE)

View File

@@ -316,6 +316,7 @@
name = "wooden plank" name = "wooden plank"
icon_state = "sheet-wood" icon_state = "sheet-wood"
default_type = MAT_WOOD default_type = MAT_WOOD
strict_color_stacking = TRUE
/obj/item/stack/material/wood/sif /obj/item/stack/material/wood/sif
name = "alien wooden plank" name = "alien wooden plank"
@@ -367,12 +368,16 @@
icon_state = "sheet-cloth" icon_state = "sheet-cloth"
default_type = "cloth" default_type = "cloth"
no_variants = FALSE no_variants = FALSE
pass_color = TRUE
strict_color_stacking = TRUE
/obj/item/stack/material/cardboard /obj/item/stack/material/cardboard
name = "cardboard" name = "cardboard"
icon_state = "sheet-card" icon_state = "sheet-card"
default_type = "cardboard" default_type = "cardboard"
no_variants = FALSE no_variants = FALSE
pass_color = TRUE
strict_color_stacking = TRUE
/obj/item/stack/material/snow /obj/item/stack/material/snow
name = "snow" name = "snow"
@@ -392,6 +397,8 @@
icon_state = "sheet-leather" icon_state = "sheet-leather"
default_type = "leather" default_type = "leather"
no_variants = FALSE no_variants = FALSE
pass_color = TRUE
strict_color_stacking = TRUE
/obj/item/stack/material/glass /obj/item/stack/material/glass
name = "glass" name = "glass"

View File

@@ -94,6 +94,7 @@ var/list/name_to_material
var/door_icon_base = "metal" // Door base icon tag. See header. var/door_icon_base = "metal" // Door base icon tag. See header.
var/icon_reinf = "reinf_metal" // Overlay used var/icon_reinf = "reinf_metal" // Overlay used
var/list/stack_origin_tech = list(TECH_MATERIAL = 1) // Research level for stacks. var/list/stack_origin_tech = list(TECH_MATERIAL = 1) // Research level for stacks.
var/pass_stack_colors = FALSE // Will stacks made from this material pass their colors onto objects?
// Attributes // Attributes
var/cut_delay = 0 // Delay in ticks when cutting through this wall. var/cut_delay = 0 // Delay in ticks when cutting through this wall.
@@ -866,6 +867,7 @@ var/list/name_to_material
stack_type = /obj/item/stack/material/log stack_type = /obj/item/stack/material/log
sheet_singular_name = null sheet_singular_name = null
sheet_plural_name = "pile" sheet_plural_name = "pile"
pass_stack_colors = TRUE
/material/wood/log/sif /material/wood/log/sif
name = MAT_SIFLOG name = MAT_SIFLOG
@@ -903,6 +905,7 @@ var/list/name_to_material
door_icon_base = "wood" door_icon_base = "wood"
destruction_desc = "crumples" destruction_desc = "crumples"
radiation_resistance = 1 radiation_resistance = 1
pass_stack_colors = TRUE
/material/snow /material/snow
name = MAT_SNOW name = MAT_SNOW
@@ -949,6 +952,7 @@ var/list/name_to_material
protectiveness = 1 // 4% protectiveness = 1 // 4%
flags = MATERIAL_PADDING flags = MATERIAL_PADDING
conductive = 0 conductive = 0
pass_stack_colors = TRUE
/material/cult /material/cult
name = "cult" name = "cult"

View File

@@ -1,3 +1,38 @@
/*
* Modifiers applied by Medical sources.
*/
/datum/modifier/bloodpump
name = "external blood pumping"
desc = "Your blood flows thanks to the wonderful power of science."
on_created_text = "<span class='notice'>You feel alive.</span>"
on_expired_text = "<span class='notice'>You feel.. less alive.</span>"
stacks = MODIFIER_STACK_EXTEND
pulse_set_level = PULSE_NORM
/datum/modifier/bloodpump/check_if_valid()
..()
if(holder.stat == DEAD)
src.expire()
/datum/modifier/bloodpump_corpse
name = "forced blood pumping"
desc = "Your blood flows thanks to the wonderful power of science."
on_created_text = "<span class='notice'>You feel alive.</span>"
on_expired_text = "<span class='notice'>You feel.. less alive.</span>"
stacks = MODIFIER_STACK_EXTEND
pulse_set_level = PULSE_SLOW
/datum/modifier/bloodpump/corpse/check_if_valid()
..()
if(holder.stat != DEAD)
src.expire()
/* /*
* Modifiers caused by chemicals or organs specifically. * Modifiers caused by chemicals or organs specifically.
*/ */

View File

@@ -182,6 +182,31 @@ the artifact triggers the rage.
accuracy_dispersion = 3 // Ditto. accuracy_dispersion = 3 // Ditto.
evasion = -45 // Too angry to dodge. evasion = -45 // Too angry to dodge.
// Speedy, but not hasted.
/datum/modifier/sprinting
name = "sprinting"
desc = "You are filled with energy!"
on_created_text = "<span class='warning'>You feel a surge of energy!</span>"
on_expired_text = "<span class='notice'>The energy high dies out.</span>"
stacks = MODIFIER_STACK_EXTEND
slowdown = -1
disable_duration_percent = 0.8
// Speedy, but not berserked.
/datum/modifier/melee_surge
name = "melee surge"
desc = "You are filled with energy!"
on_created_text = "<span class='warning'>You feel a surge of energy!</span>"
on_expired_text = "<span class='notice'>The energy high dies out.</span>"
stacks = MODIFIER_STACK_ALLOWED
attack_speed_percent = 0.8
outgoing_melee_damage_percent = 1.1
disable_duration_percent = 0.8
// Non-cult version of deep wounds. // Non-cult version of deep wounds.
// Surprisingly, more dangerous. // Surprisingly, more dangerous.
/datum/modifier/grievous_wounds /datum/modifier/grievous_wounds
@@ -201,7 +226,6 @@ the artifact triggers the rage.
// Ignition, but confined to the modifier system. // Ignition, but confined to the modifier system.
// This makes it more predictable and thus, easier to balance. // This makes it more predictable and thus, easier to balance.
/datum/modifier/fire /datum/modifier/fire
@@ -305,7 +329,7 @@ the artifact triggers the rage.
bleeding_rate_percent = 0.8 bleeding_rate_percent = 0.8
pulse_set_level = PULSE_SLOW pulse_modifier = -1
// Temperature Normalizer. // Temperature Normalizer.
/datum/modifier/homeothermic /datum/modifier/homeothermic

View File

@@ -164,6 +164,11 @@
if(name != "Noise") // Audible Emotes if(name != "Noise") // Audible Emotes
if(ishuman(speaker)) if(ishuman(speaker))
var/mob/living/carbon/human/H = speaker var/mob/living/carbon/human/H = speaker
if(H.species.has_organ[O_VOICE] && !(flags & SIGNLANG) && !(flags & NONVERBAL)) // Does the species need a voicebox? Is the language even spoken?
var/obj/item/organ/internal/voicebox/vocal = H.internal_organs_by_name[O_VOICE]
if(!vocal || vocal.is_broken() || vocal.mute)
return FALSE
if(src.name in H.species.assisted_langs) if(src.name in H.species.assisted_langs)
. = FALSE . = FALSE
var/obj/item/organ/internal/voicebox/vox = locate() in H.internal_organs // Only voiceboxes for now. Maybe someday it'll include other organs, but I'm not that clever var/obj/item/organ/internal/voicebox/vox = locate() in H.internal_organs // Only voiceboxes for now. Maybe someday it'll include other organs, but I'm not that clever

View File

@@ -126,4 +126,4 @@
/datum/language/unathi/monkey /datum/language/unathi/monkey
flags = RESTRICTED flags = RESTRICTED
/datum/language/tajaran/monkey /datum/language/tajaran/monkey
flags = RESTRICTED flags = RESTRICTED

View File

@@ -105,9 +105,11 @@
message = "<span class='warning'>[t_He] [t_is] extremely hungry. A deep growl occasionally rumbles from [t_his] empty stomach.</span>\n" message = "<span class='warning'>[t_He] [t_is] extremely hungry. A deep growl occasionally rumbles from [t_his] empty stomach.</span>\n"
if(100 to 499) if(100 to 499)
return message //Well that's pretty normal, really. return message //Well that's pretty normal, really.
if(500 to 1199) // Fat. if(500 to 999) // Fat.
message = "[t_He] [t_has] a stuffed belly, bloated fat and round from eating too much.\n" message = "[t_He] [t_has] a stuffed belly, bloated fat and round from eating too much.\n"
if(1200 to 1934) // One person fully digested. if(1000 to 1399)
message = "[t_He] [t_has] a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight.\n"
if(1400 to 1934) // One person fully digested.
message = "<span class='warning'>[t_He] [t_is] sporting a large, round, sagging stomach. It's contains at least their body weight worth of glorping slush.</span>\n" message = "<span class='warning'>[t_He] [t_is] sporting a large, round, sagging stomach. It's contains at least their body weight worth of glorping slush.</span>\n"
if(1935 to 3004) // Two people. if(1935 to 3004) // Two people.
message = "<span class='warning'>[t_He] [t_is] engorged with a huge stomach that sags and wobbles as they move. [t_He] must have consumed at least twice their body weight. It looks incredibly soft.</span>\n" message = "<span class='warning'>[t_He] [t_is] engorged with a huge stomach that sags and wobbles as they move. [t_He] must have consumed at least twice their body weight. It looks incredibly soft.</span>\n"

View File

@@ -923,7 +923,7 @@
overeatduration -= 2 //doubled the unfat rate overeatduration -= 2 //doubled the unfat rate
if(noisy == TRUE && nutrition < 250 && prob(10)) //VOREStation edit for hunger noises. if(noisy == TRUE && nutrition < 250 && prob(10)) //VOREStation edit for hunger noises.
var/growlsound = pick(hunger_sounds) var/sound/growlsound = sound(get_sfx("hunger_sounds"))
var/growlmultiplier = 100 - (nutrition / 250 * 100) var/growlmultiplier = 100 - (nutrition / 250 * 100)
playsound(src, growlsound, vol = growlmultiplier, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) playsound(src, growlsound, vol = growlmultiplier, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
// VOREStation Edit End // VOREStation Edit End
@@ -983,7 +983,7 @@
var/brainOxPercent = 0.015 //Default 1.5% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage var/brainOxPercent = 0.015 //Default 1.5% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
if(CE_STABLE in chem_effects) if(CE_STABLE in chem_effects)
brainOxPercent = 0.008 //Halved in effect brainOxPercent = 0.008 //Halved in effect
if(oxyloss >= 20 && prob(5)) if(oxyloss >= (getMaxHealth() * 0.3) && prob(5)) // If oxyloss exceeds 30% of your max health, you can take brain damage.
adjustBrainLoss(brainOxPercent * oxyloss) adjustBrainLoss(brainOxPercent * oxyloss)
if(halloss >= species.total_health) if(halloss >= species.total_health)
@@ -1558,6 +1558,8 @@
var/temp = PULSE_NORM var/temp = PULSE_NORM
var/brain_modifier = 1
var/modifier_shift = 0 var/modifier_shift = 0
var/modifier_set var/modifier_set
@@ -1589,6 +1591,14 @@
var/obj/item/organ/internal/heart/Pump = internal_organs_by_name[O_HEART] var/obj/item/organ/internal/heart/Pump = internal_organs_by_name[O_HEART]
var/obj/item/organ/internal/brain/Control = internal_organs_by_name[O_BRAIN]
if(Control)
brain_modifier = Control.get_control_efficiency()
if(brain_modifier <= 0.7 && brain_modifier >= 0.4) // 70%-40% control, things start going weird as the brain is failing.
brain_modifier = rand(5, 15) / 10
if(Pump) if(Pump)
temp += Pump.standard_pulse_level - PULSE_NORM temp += Pump.standard_pulse_level - PULSE_NORM
@@ -1616,7 +1626,7 @@
if(R.id in cheartstopper) //Conditional heart-stoppage if(R.id in cheartstopper) //Conditional heart-stoppage
if(R.volume >= R.overdose) if(R.volume >= R.overdose)
temp = PULSE_NONE temp = PULSE_NONE
return temp return temp * brain_modifier
//handles different chems' influence on pulse //handles different chems' influence on pulse
for(var/datum/reagent/R in reagents.reagent_list) for(var/datum/reagent/R in reagents.reagent_list)
if(R.id in bradycardics) if(R.id in bradycardics)
@@ -1631,7 +1641,7 @@
if(R.volume >= R.overdose) if(R.volume >= R.overdose)
temp = PULSE_NONE temp = PULSE_NONE
return temp return max(0, round(temp * brain_modifier))
/mob/living/carbon/human/proc/handle_heartbeat() /mob/living/carbon/human/proc/handle_heartbeat()
if(pulse == PULSE_NONE) if(pulse == PULSE_NONE)

View File

@@ -60,7 +60,9 @@
O_BRAIN = /obj/item/organ/internal/brain/replicant, O_BRAIN = /obj/item/organ/internal/brain/replicant,
O_EYES = /obj/item/organ/internal/eyes/replicant, O_EYES = /obj/item/organ/internal/eyes/replicant,
O_AREJECT = /obj/item/organ/internal/immunehub/replicant, O_AREJECT = /obj/item/organ/internal/immunehub/replicant,
O_VRLINK = /obj/item/organ/internal/brainmirror O_VRLINK = /obj/item/organ/internal/brainmirror,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
) )
/datum/species/shapeshifter/replicant/alpha /datum/species/shapeshifter/replicant/alpha
@@ -95,7 +97,9 @@
O_AREJECT = /obj/item/organ/internal/immunehub/replicant, O_AREJECT = /obj/item/organ/internal/immunehub/replicant,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/replicant, O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/replicant,
O_ACID = /obj/item/organ/internal/xenos/acidgland/replicant, O_ACID = /obj/item/organ/internal/xenos/acidgland/replicant,
O_VRLINK = /obj/item/organ/internal/brainmirror O_VRLINK = /obj/item/organ/internal/brainmirror,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
) )
/datum/species/shapeshifter/replicant/beta /datum/species/shapeshifter/replicant/beta
@@ -119,5 +123,7 @@
O_VENTC = /obj/item/organ/internal/metamorphgland/replicant, O_VENTC = /obj/item/organ/internal/metamorphgland/replicant,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/replicant, O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/replicant,
O_RESIN = /obj/item/organ/internal/xenos/resinspinner/replicant, O_RESIN = /obj/item/organ/internal/xenos/resinspinner/replicant,
O_VRLINK = /obj/item/organ/internal/brainmirror O_VRLINK = /obj/item/organ/internal/brainmirror,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
) )

View File

@@ -196,7 +196,9 @@
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_APPENDIX = /obj/item/organ/internal/appendix, O_APPENDIX = /obj/item/organ/internal/appendix,
O_EYES = /obj/item/organ/internal/eyes O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
) )
var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them. var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them.
var/dispersed_eyes // If set, the species will be affected by flashbangs regardless if they have eyes or not, as they see in large areas. var/dispersed_eyes // If set, the species will be affected by flashbangs regardless if they have eyes or not, as they see in large areas.

View File

@@ -44,8 +44,11 @@
O_VOICE = /obj/item/organ/internal/voicebox, O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_SPLEEN = /obj/item/organ/internal/spleen/minor,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE =/obj/item/organ/internal/intestine
) )
/* /*

View File

@@ -115,7 +115,9 @@
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
) )
unarmed_types = list( unarmed_types = list(

View File

@@ -25,6 +25,20 @@
spawn_flags = SPECIES_CAN_JOIN spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
O_APPENDIX = /obj/item/organ/internal/appendix,
O_SPLEEN = /obj/item/organ/internal/spleen,
O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
)
inherent_verbs = list( inherent_verbs = list(
/mob/living/carbon/human/proc/tie_hair) /mob/living/carbon/human/proc/tie_hair)
@@ -122,6 +136,8 @@
O_LIVER = /obj/item/organ/internal/liver/unathi, O_LIVER = /obj/item/organ/internal/liver/unathi,
O_BRAIN = /obj/item/organ/internal/brain/unathi, O_BRAIN = /obj/item/organ/internal/brain/unathi,
O_EYES = /obj/item/organ/internal/eyes, O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach/unathi,
O_INTESTINE = /obj/item/organ/internal/intestine/unathi
) )
@@ -228,7 +244,9 @@
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
) )
/datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H) /datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H)
@@ -384,7 +402,9 @@
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE =/obj/item/organ/internal/intestine
) )
descriptors = list( descriptors = list(

View File

@@ -64,7 +64,9 @@
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
) )
flesh_color = "#AFA59E" flesh_color = "#AFA59E"
@@ -382,3 +384,63 @@
H.eye_blurry = 5 H.eye_blurry = 5
H.shock_stage = min(H.shock_stage + coldshock, 160) //cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage. H.shock_stage = min(H.shock_stage + coldshock, 160) //cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage.
return return
/datum/species/werebeast
name = SPECIES_WEREBEAST
name_plural = "Werebeasts"
icobase = 'icons/mob/human_races/r_werebeast.dmi'
deform = 'icons/mob/human_races/r_def_werebeast.dmi'
icon_template = 'icons/mob/human_races/r_werebeast.dmi'
tail = "tail"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
total_health = 200
brute_mod = 0.85
burn_mod = 0.85
metabolic_rate = 2
item_slowdown_mod = 0.25
hunger_factor = 0.4
darksight = 8
mob_size = MOB_LARGE
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_CANILUNZT)
name_language = LANGUAGE_CANILUNZT
primitive_form = "Wolpin"
color_mult = 1
min_age = 18
max_age = 200
blurb = "Big buff werewolves. These are a limited functionality event species that are not balanced for regular gameplay. Adminspawn only."
wikilink="N/A"
catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin)
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
inherent_verbs = list(
/mob/living/proc/shred_limb,
/mob/living/proc/eat_trash)
flesh_color = "#AFA59E"
base_color = "#777777"
heat_discomfort_strings = list(
"Your fur prickles in the heat.",
"You feel uncomfortably warm.",
"Your overheated skin itches."
)
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/vr/werebeast),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)

View File

@@ -51,7 +51,9 @@
O_BRAIN = /obj/item/organ/internal/brain/xeno, O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel, O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel,
O_HIVE = /obj/item/organ/internal/xenos/hivenode, O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
) )
bump_flag = ALIEN bump_flag = ALIEN
@@ -182,7 +184,9 @@
O_ACID = /obj/item/organ/internal/xenos/acidgland, O_ACID = /obj/item/organ/internal/xenos/acidgland,
O_HIVE = /obj/item/organ/internal/xenos/hivenode, O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_RESIN = /obj/item/organ/internal/xenos/resinspinner, O_RESIN = /obj/item/organ/internal/xenos/resinspinner,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
) )
inherent_verbs = list( inherent_verbs = list(
@@ -218,7 +222,9 @@
O_BRAIN = /obj/item/organ/internal/brain/xeno, O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/hunter, O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/hunter,
O_HIVE = /obj/item/organ/internal/xenos/hivenode, O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
) )
inherent_verbs = list( inherent_verbs = list(
@@ -247,7 +253,9 @@
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/sentinel, O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/sentinel,
O_ACID = /obj/item/organ/internal/xenos/acidgland, O_ACID = /obj/item/organ/internal/xenos/acidgland,
O_HIVE = /obj/item/organ/internal/xenos/hivenode, O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
) )
inherent_verbs = list( inherent_verbs = list(
@@ -284,7 +292,9 @@
O_ACID = /obj/item/organ/internal/xenos/acidgland, O_ACID = /obj/item/organ/internal/xenos/acidgland,
O_HIVE = /obj/item/organ/internal/xenos/hivenode, O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_RESIN = /obj/item/organ/internal/xenos/resinspinner, O_RESIN = /obj/item/organ/internal/xenos/resinspinner,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
O_STOMACH = /obj/item/organ/internal/stomach/xeno,
O_INTESTINE = /obj/item/organ/internal/intestine/xeno
) )
inherent_verbs = list( inherent_verbs = list(

View File

@@ -296,7 +296,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
if(part.icon_position & (LEFT | RIGHT)) if(part.icon_position & (LEFT | RIGHT))
var/icon/temp2 = new('icons/mob/human.dmi',"blank") var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") //VOREStation Edit.
temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
if(!(part.icon_position & LEFT)) if(!(part.icon_position & LEFT))
@@ -441,8 +441,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
// VOREStation Edit - START // VOREStation Edit - START
var/icon/ears_s = get_ears_overlay() var/icon/ears_s = get_ears_overlay()
if (ears_s) if(ears_s)
face_standing.Blend(ears_s, ICON_OVERLAY) face_standing.Blend(ears_s, ICON_OVERLAY)
if(istype(head_organ,/obj/item/organ/external/head/vr))
var/obj/item/organ/external/head/vr/head_organ_vr = head_organ
overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ_vr.head_offset)
apply_layer(HAIR_LAYER)
return
// VOREStation Edit - END // VOREStation Edit - END
if(head_organ.nonsolid) if(head_organ.nonsolid)

View File

@@ -1048,6 +1048,14 @@ default behaviour is:
else else
to_chat(src, "<span class='warning'>You feel nauseous...</span>") to_chat(src, "<span class='warning'>You feel nauseous...</span>")
if(ishuman(src))
var/mob/living/carbon/human/Hu = src
if(CE_ANTACID in Hu.chem_effects)
if(prob(min(90, Hu.chem_effects[CE_ANTACID] * 15)))
spawn(rand(30 SECONDS, 2 MINUTES))
lastpuke = FALSE
return
spawn() spawn()
if(!skip_wait) if(!skip_wait)
sleep(150) //15 seconds until second warning sleep(150) //15 seconds until second warning

View File

@@ -172,6 +172,8 @@
/obj/item/device/dogborg/sleeper/proc/drain(var/amt = 3) //Slightly reduced cost (before, it was always injecting inaprov) /obj/item/device/dogborg/sleeper/proc/drain(var/amt = 3) //Slightly reduced cost (before, it was always injecting inaprov)
hound = src.loc hound = src.loc
if(istype(hound,/obj/item/weapon/robot_module))
hound = hound.loc
hound.cell.charge = hound.cell.charge - amt hound.cell.charge = hound.cell.charge - amt
/obj/item/device/dogborg/sleeper/attack_self(mob/user) /obj/item/device/dogborg/sleeper/attack_self(mob/user)

View File

@@ -499,7 +499,7 @@
M.install(src, user) M.install(src, user)
return return
if (istype(W, /obj/item/weapon/weldingtool)) if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent != I_HURT)
if (src == user) if (src == user)
to_chat(user, "<span class='warning'>You lack the reach to be able to repair yourself.</span>") to_chat(user, "<span class='warning'>You lack the reach to be able to repair yourself.</span>")
return return
@@ -531,7 +531,7 @@
for(var/mob/O in viewers(user, null)) for(var/mob/O in viewers(user, null))
O.show_message(text("<font color='red'>[user] has fixed some of the burnt wires on [src]!</font>"), 1) O.show_message(text("<font color='red'>[user] has fixed some of the burnt wires on [src]!</font>"), 1)
else if (W.is_crowbar()) // crowbar means open or close the cover else if (W.is_crowbar() && user.a_intent != I_HURT) // crowbar means open or close the cover
if(opened) if(opened)
if(cell) if(cell)
to_chat(user, "You close the cover.") to_chat(user, "You close the cover.")

View File

@@ -97,6 +97,29 @@
flick("portable_analyzer_load", src) flick("portable_analyzer_load", src)
icon_state = "portable_analyzer_full" icon_state = "portable_analyzer_full"
/obj/item/weapon/portable_scanner
name = "Portable Resonant Analyzer"
icon = 'icons/obj/items.dmi'
icon_state = "portable_scanner"
desc = "An advanced scanning device used for analyzing objects without completely annihilating them for science. Unfortunately, it has no connection to any database like its angrier cousin."
/obj/item/weapon/portable_scanner/afterattack(var/atom/target, var/mob/living/user, proximity)
if(!target)
return
if(!proximity)
return
if(istype(target,/obj/item))
var/obj/item/I = target
if(do_after(src, 5 SECONDS * I.w_class))
for(var/mob/M in viewers())
M.show_message(text("<span class='notice'>[user] sweeps \the [src] over \the [I].</span>"), 1)
flick("[initial(icon_state)]-scan", src)
if(I.origin_tech && I.origin_tech.len)
for(var/T in I.origin_tech)
to_chat(user, "<span class='notice'>\The [I] had level [I.origin_tech[T]] in [CallTechName(T)].</span>")
else
to_chat(user, "<span class='notice'>\The [I] cannot be scanned by \the [src].</span>")
//This is used to unlock other borg covers. //This is used to unlock other borg covers.
/obj/item/weapon/card/robot //This is not a child of id cards, as to avoid dumb typechecks on computers. /obj/item/weapon/card/robot //This is not a child of id cards, as to avoid dumb typechecks on computers.
name = "access code transmission device" name = "access code transmission device"

View File

@@ -0,0 +1,3 @@
#define AB_SHIFT_NONE 0
#define AB_SHIFT_PASSIVE 1
#define AB_SHIFT_ACTIVE 2

View File

@@ -0,0 +1,86 @@
/mob/living/simple_mob/vore/demon
name = "Rift Walker"
desc = "A large bipedal creature, body a mix of dark fur and scales. Marks on the creatures body pulse slowly with red light"
icon_state = "boxfox"
icon_living = "boxfox"
icon_dead = "boxfox_dead"
icon_rest = "boxfox_rest"
icon = 'icons/mob/demon_vr.dmi'
faction = "demon"
maxHealth = 30
health = 30
movement_cooldown = 0
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = INFINITY
response_help = "touches"
response_disarm = "pushes"
response_harm = "hits"
melee_damage_lower = 3
melee_damage_upper = 1
attacktext = list("clawed")
vore_active = TRUE
vore_icons = SA_ICON_LIVING
var/shifted_out = FALSE
var/shift_state = AB_SHIFT_NONE
var/last_shift = 0
var/is_shifting = FALSE
/mob/living/simple_mob/vore/demon/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food."
/mob/living/simple_mob/vore/demon/UnarmedAttack()
if(shifted_out)
return FALSE
. = ..()
/mob/living/simple_mob/vore/demon/can_fall()
if(shifted_out)
return FALSE
return ..()
/mob/living/simple_mob/vore/demon/zMove(direction)
if(shifted_out)
var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
if(destination)
forceMove(destination)
return TRUE
return ..()
/mob/living/simple_mob/vore/demon/Life()
. = ..()
if(shifted_out)
density = FALSE
/mob/living/simple_mob/vore/demon/handle_atmos()
if(shifted_out)
return
else
return .=..()
/mob/living/simple_mob/vore/demon/update_canmove()
if(is_shifting)
canmove = FALSE
return canmove
else
return ..()

View File

@@ -0,0 +1,214 @@
/mob/living/simple_mob/vore/demon/verb/blood_crawl()
set name = "Bloodcrawl"
set desc = "Shift out of reality using blood as your gateway"
set category = "Abilities"
var/turf/T = get_turf(src)
if(!T.CanPass(src,T) || loc != T)
to_chat(src,"<span class='warning'>You can't use that here!</span>")
return FALSE
if(shift_state && shift_state == AB_SHIFT_ACTIVE)
to_chat(src,"<span class='warning'>You can't do a shift while actively shifting!</span>")
return FALSE
if(!(locate(/obj/effect/decal/cleanable/blood) in src.loc))
to_chat(src,"<span class='warning'>You need blood to shift between realities!</span>")
return FALSE
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
is_shifting = TRUE
//Shifting in
if(shifted_out)
shifted_out = FALSE
name = real_name
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = initial(B.escapable)
overlays.Cut()
alpha = initial(alpha)
invisibility = initial(invisibility)
see_invisible = initial(see_invisible)
incorporeal_move = initial(incorporeal_move)
density = initial(density)
force_max_speed = initial(force_max_speed)
//Cosmetics mostly
flick("phasein",src)
custom_emote(1,"phases in!")
sleep(30) //The duration of the TP animation
is_shifting = FALSE
canmove = original_canmove
//Potential phase-in vore
if(can_be_drop_pred) //Toggleable in vore panel
var/list/potentials = living_mobs(0)
if(potentials.len)
var/mob/living/target = pick(potentials)
if(istype(target) && vore_selected)
target.forceMove(vore_selected)
to_chat(target,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
// Do this after the potential vore, so we get the belly
update_icon()
shift_state = AB_SHIFT_NONE
/*
//Affect nearby lights
var/destroy_lights = 0
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 10)
continue
if(prob(destroy_lights))
spawn(rand(5,25))
L.broken()
else
L.flicker(10)
*/
//Shifting out
else
shifted_out = TRUE
shift_state = AB_SHIFT_PASSIVE
custom_emote(1,"phases out!")
real_name = name
name = "Something"
health = maxHealth //Fullheal
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = FALSE
overlays.Cut()
flick("phaseout",src)
sleep(30)
invisibility = INVISIBILITY_LEVEL_TWO
see_invisible = INVISIBILITY_LEVEL_TWO
update_icon()
alpha = 127
is_shifting = FALSE
canmove = original_canmove
incorporeal_move = TRUE
density = FALSE
force_max_speed = TRUE
/mob/living/simple_mob/vore/demon/verb/phase_shift()
set name = "Phase Shift"
set desc = "Shift out of reality temporarily"
set category = "Abilities"
var/turf/T = get_turf(src)
if(shift_state && shift_state == AB_SHIFT_PASSIVE)
to_chat(src,"<span class='warning'>You can't do a shift while passively shifting!</span>")
return FALSE
if(shifted_out)
to_chat(src,"<span class='warning'>You can't return to the physical world yet!</span>")
return FALSE
if(world.time - last_shift < 600)
to_chat(src,"<span class='warning'>You can't temporarily shift so soon! You need to wait [round(((last_shift+600)-world.time)/10)] second\s!</span>")
return FALSE
shift_state = AB_SHIFT_ACTIVE
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
is_shifting = TRUE
shifted_out = TRUE
custom_emote(1,"phases out!")
real_name = name
name = "Something"
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = FALSE
overlays.Cut()
flick("phaseout",src)
sleep(30)
invisibility = INVISIBILITY_LEVEL_TWO
see_invisible = INVISIBILITY_LEVEL_TWO
update_icon()
alpha = 127
is_shifting = FALSE
canmove = original_canmove
incorporeal_move = TRUE
density = FALSE
force_max_speed = TRUE
spawn(300)
shifted_out = FALSE
name = real_name
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = initial(B.escapable)
overlays.Cut()
alpha = initial(alpha)
invisibility = initial(invisibility)
see_invisible = initial(see_invisible)
incorporeal_move = initial(incorporeal_move)
density = initial(density)
force_max_speed = initial(force_max_speed)
original_canmove = canmove
canmove = FALSE
is_shifting = TRUE
//Cosmetics mostly
flick("phasein",src)
custom_emote(1,"phases in!")
sleep(30) //The duration of the TP animation
is_shifting = FALSE
canmove = original_canmove
var/turf/NT = get_turf(src)
if(!NT.CanPass(src,NT))
for(var/direction in list(1,2,4,8,5,6,9,10))
var/turf/L = get_step(NT, direction)
if(L)
if(L.CanPass(src,L))
forceMove(L)
break
//Potential phase-in vore
if(can_be_drop_pred) //Toggleable in vore panel
var/list/potentials = living_mobs(0)
if(potentials.len)
var/mob/living/target = pick(potentials)
if(istype(target) && vore_selected)
target.forceMove(vore_selected)
to_chat(target,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
// Do this after the potential vore, so we get the belly
update_icon()
shift_state = AB_SHIFT_NONE
last_shift = world.time

View File

@@ -0,0 +1,19 @@
/mob/living/simple_mob/vore/demon/engorge
name = "Engorge"
icon_state = "engorge"
icon_living = "engorge"
icon_dead = "engorge_dead"
icon_rest = "engorge_rest"
vore_icons = null
/mob/living/simple_mob/vore/demon/zellic
name = "Zellic"
icon_state = "zellic"
icon_living = "zellic"
icon_dead = "zellic_dead"
icon_rest = null
vore_icons = null

View File

@@ -0,0 +1,3 @@
#undef AB_SHIFT_NONE
#undef AB_SHIFT_PASSIVE
#undef AB_SHIFT_ACTIVE

View File

@@ -8,7 +8,7 @@
//var/icon_add = 'icons/mob/human_face.dmi' //Already defined in sprite_accessories.dm line 49. //var/icon_add = 'icons/mob/human_face.dmi' //Already defined in sprite_accessories.dm line 49.
var/color_blend_mode = ICON_MULTIPLY var/color_blend_mode = ICON_MULTIPLY
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //This lets all races use the default hairstyles. species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the default hairstyles.
astolfo astolfo
name = "Astolfo" name = "Astolfo"
@@ -87,14 +87,14 @@
name = "Bald" name = "Bald"
icon_state = "bald" icon_state = "bald"
gender = MALE gender = MALE
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //Lets all the races be bald if they want. species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //Lets all the races be bald if they want.
ponytail6_fixed //Eggnerd's done with waiting for upstream fixes lmao. ponytail6_fixed //Eggnerd's done with waiting for upstream fixes lmao.
name = "Ponytail 6 but fixed" name = "Ponytail 6 but fixed"
icon = 'icons/mob/human_face_vr.dmi' icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi' icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "hair_ponytail6" icon_state = "hair_ponytail6"
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA,SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA,SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST)
una_hood una_hood
name = "Cobra Hood" name = "Cobra Hood"
@@ -477,13 +477,13 @@
/datum/sprite_accessory/facial_hair /datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face_or_vr.dmi' icon = 'icons/mob/human_face_or_vr.dmi'
var/color_blend_mode = ICON_MULTIPLY var/color_blend_mode = ICON_MULTIPLY
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //This lets all races use the facial hair styles. species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the facial hair styles.
shaved shaved
name = "Shaved" name = "Shaved"
icon_state = "bald" icon_state = "bald"
gender = NEUTER gender = NEUTER
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //This needed to be manually defined, apparantly. species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This needed to be manually defined, apparantly.
vulp_none vulp_none
@@ -1064,4 +1064,36 @@
name = "Heterochromia" name = "Heterochromia"
icon_state = "heterochromia" icon_state = "heterochromia"
body_parts = list(BP_HEAD) body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE) //This lets all races use the default hairstyles. species_allowed = list(SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST) //This lets all races use the default hairstyles.
werewolf_nose
name = "Werewolf nose"
icon = 'icons/mob/species/werebeast/werebeast_markings.dmi'
icon_state = "werewolf_nose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_WEREBEAST)
werewolf_face
name = "Werewolf face"
icon = 'icons/mob/species/werebeast/werebeast_markings.dmi'
icon_state = "werewolf"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_WEREBEAST)
werewolf_belly
name = "Werewolf belly"
icon = 'icons/mob/species/werebeast/werebeast_markings.dmi'
icon_state = "werewolf"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_GROIN,BP_TORSO)
species_allowed = list(SPECIES_WEREBEAST)
werewolf_socks
name = "Werewolf socks"
icon = 'icons/mob/species/werebeast/werebeast_markings.dmi'
icon_state = "werewolf"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
species_allowed = list(SPECIES_WEREBEAST)

View File

@@ -21,14 +21,14 @@
if(say_disabled) //This is here to try to identify lag problems if(say_disabled) //This is here to try to identify lag problems
usr << "<font color='red'>Speech is currently admin-disabled.</font>" usr << "<font color='red'>Speech is currently admin-disabled.</font>"
return return
message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason)
set_typing_indicator(FALSE)
//VOREStation Edit Start //VOREStation Edit Start
if(muffled) if(muffled)
return me_verb_subtle(message) return me_verb_subtle(message)
message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason)
//VOREStation Edit End //VOREStation Edit End
set_typing_indicator(FALSE)
if(use_me) if(use_me)
usr.emote("me",usr.emote_type,message) usr.emote("me",usr.emote_type,message)
else else

View File

@@ -31,14 +31,15 @@
if(paper_title) if(paper_title)
P.name = paper_title P.name = paper_title
P.update_icon() P.update_icon()
P.fields = count_fields(P.info, P.fields) P.fields = count_fields(P.info)
P.updateinfolinks() P.updateinfolinks()
stored_paper-- stored_paper--
return 1 return 1
/obj/item/weapon/computer_hardware/nano_printer/proc/count_fields(var/info, var/fields) /obj/item/weapon/computer_hardware/nano_printer/proc/count_fields(var/info)
//Count the fields //Count the fields. This is taken directly from paper.dm, /obj/item/weapon/paper/proc/parsepencode(). -Hawk_v3
var/fields = 0
var/t = info var/t = info
var/laststart = 1 var/laststart = 1
while(1) while(1)

View File

@@ -111,7 +111,7 @@
if(!A.CanPass(M, M.loc, 1.5, 0)) if(!A.CanPass(M, M.loc, 1.5, 0))
to_chat(M, "<span class='notice'>\The [A] is blocking \the [src].</span>") to_chat(M, "<span class='notice'>\The [A] is blocking \the [src].</span>")
return FALSE return FALSE
return M.Move(T) return M.forceMove(T) //VOREStation Edit - Fixes adminspawned ladders
/obj/structure/ladder/CanPass(obj/mover, turf/source, height, airflow) /obj/structure/ladder/CanPass(obj/mover, turf/source, height, airflow)
return airflow || !density return airflow || !density

View File

@@ -49,12 +49,15 @@
if (!( target )) if (!( target ))
qdel(src) qdel(src)
return return
if (istype(target, /obj/structure/portal_subtle))
qdel(src)
return
if (istype(M, /atom/movable)) if (istype(M, /atom/movable))
if(prob(failchance)) //oh dear a problem, put em in deep space if(prob(failchance)) //oh dear a problem, put em in deep space
src.icon_state = "portal1" src.icon_state = "portal1"
do_noeffect_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0) do_noeffect_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0)
else else
do_noeffect_teleport(M, target, 1) ///You will appear adjacent to the beacon do_noeffect_teleport(M, target, 0) ///You will appear on the beacon
/obj/structure/portal_gateway /obj/structure/portal_gateway
name = "portal" name = "portal"

View File

@@ -30,7 +30,7 @@
/mob/living/silicon/robot/shared_nano_interaction() /mob/living/silicon/robot/shared_nano_interaction()
. = STATUS_INTERACTIVE . = STATUS_INTERACTIVE
if(cell.charge <= 0) if(!has_power)
return STATUS_CLOSE return STATUS_CLOSE
if(lockdown) if(lockdown)
. = STATUS_DISABLED . = STATUS_DISABLED

View File

@@ -117,7 +117,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5
src << "<font color='red'>You feel extremely [word]</font>" src << "<font color='red'>You feel extremely [word]</font>"
else if(blood_volume >= BLOOD_VOLUME_SURVIVE) else if(blood_volume >= BLOOD_VOLUME_SURVIVE)
adjustOxyLoss(5 * dmg_coef) adjustOxyLoss(5 * dmg_coef)
adjustToxLoss(3 * dmg_coef) // adjustToxLoss(3 * dmg_coef)
if(prob(15)) if(prob(15))
var/word = pick("dizzy","woosey","faint") var/word = pick("dizzy","woosey","faint")
src << "<font color='red'>You feel extremely [word]</font>" src << "<font color='red'>You feel extremely [word]</font>"

View File

@@ -0,0 +1,177 @@
/*
* Augments. This file contains the base, and organic-targeting augments.
*/
/obj/item/organ/internal/augment
name = "augment"
icon_state = "cell_bay"
parent_organ = BP_TORSO
organ_verbs = list(/mob/living/carbon/human/proc/augment_menu) // Verbs added by the organ when present in the body.
target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted?
forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
var/obj/item/integrated_object // Objects held by the organ, used for re-usable, deployable things.
var/integrated_object_type // Object type the organ will spawn.
var/target_slot = null
var/silent_deploy = FALSE
var/image/my_radial_icon = null
var/radial_icon = null // DMI for the augment's radial icon.
var/radial_name = null // The augment's name in the Radial Menu.
var/radial_state = null // Icon state for the augment's radial icon.
var/aug_cooldown = 30 SECONDS
var/last_activate = null
/obj/item/organ/internal/augment/Initialize()
..()
setup_radial_icon()
if(integrated_object_type)
integrated_object = new integrated_object_type(src)
integrated_object.canremove = FALSE
/obj/item/organ/internal/augment/proc/setup_radial_icon()
if(!radial_icon)
radial_icon = icon
if(!radial_name)
radial_name = name
if(!radial_state)
radial_state = icon_state
my_radial_icon = image(icon = radial_icon, icon_state = radial_state)
/obj/item/organ/internal/augment/handle_organ_mod_special(var/removed = FALSE)
if(removed && integrated_object && integrated_object.loc != src)
if(isliving(integrated_object.loc))
var/mob/living/L = integrated_object.loc
L.drop_from_inventory(integrated_object)
integrated_object.forceMove(src)
..(removed)
/obj/item/organ/internal/augment/proc/augment_action()
if(!owner)
return
if(aug_cooldown)
if(last_activate <= world.time + aug_cooldown)
last_activate = world.time
else
return
var/item_to_equip = integrated_object
if(!item_to_equip && integrated_object_type)
item_to_equip = integrated_object_type
if(ispath(item_to_equip))
owner.equip_augment_item(target_slot, item_to_equip, silent_deploy, FALSE)
else if(item_to_equip)
owner.equip_augment_item(target_slot, item_to_equip, silent_deploy, FALSE, src)
/*
* The delicate handling of augment-controlled items.
*/
// Attaches to the end of dropped items' code.
/obj/item
var/destroy_on_drop = FALSE // Used by augments to determine if the item should destroy itself when dropped, or return to its master.
var/obj/item/organ/my_augment = null // Used to reference the object's host organ.
/obj/item/dropped(mob/user)
. = ..()
if(src)
if(destroy_on_drop && !QDELETED(src))
qdel(src)
return
if(my_augment)
forceMove(my_augment)
/*
* Human-specific mob procs.
*/
// The next two procs simply handle the radial menu for augment activation.
/mob/living/carbon/human/proc/augment_menu()
set name = "Open Augment Menu"
set desc = "Toggle your augment menu."
set category = "Augments"
enable_augments(usr)
/mob/living/carbon/human/proc/enable_augments(var/mob/living/user)
var/list/options = list()
var/list/present_augs = list()
for(var/obj/item/organ/internal/augment/Aug in internal_organs)
if(Aug.my_radial_icon && !Aug.is_broken() && Aug.check_verb_compatability())
present_augs[Aug.radial_name] = Aug
for(var/augname in present_augs)
var/obj/item/organ/internal/augment/iconsource = present_augs[augname]
options[augname] = iconsource.my_radial_icon
var/list/choice = list()
if(length(options) == 1)
for(var/key in options)
choice = key
else
choice = show_radial_menu(user, src, options)
if(!isnull(choice) && options[choice])
var/obj/item/organ/internal/augment/A = present_augs[choice]
A.augment_action(user)
/* equip_augment_item
* Used to equip an organ's augment items when possible.
* slot is the target equip slot, if it's not a generic either-hand deployable,
* equipping is either the target object, or a path for the target object,
* destroy_on_drop is the default value for the object to be deleted if it is removed from their person, if equipping is a path, however, this will be set to TRUE,
* cling_to_organ is a reference to the organ object itself, so they can easily return to their organ when removed by any means.
*/
/mob/living/carbon/human/proc/equip_augment_item(var/slot, var/obj/item/equipping = null, var/make_sound = TRUE, var/destroy_on_drop = FALSE, var/obj/item/organ/cling_to_organ = null)
if(!ishuman(src))
return 0
if(!equipping)
return 0
var/mob/living/carbon/human/M = src
if((slot == slot_l_hand && l_hand) || (slot == slot_r_hand && r_hand))
to_chat(M,"<span class='warning'>Your hand is full. Drop something first.</span>")
return 0
var/del_if_failure = destroy_on_drop
if(ispath(equipping))
del_if_failure = TRUE
equipping = new equipping(src)
if(!slot)
put_in_any_hand_if_possible(equipping, del_if_failure)
else
if(slot_is_accessible(slot, equipping, src))
equip_to_slot(equipping, slot, 1, 1)
else if(destroy_on_drop || del_if_failure)
qdel(equipping)
return 0
if(cling_to_organ) // Does the object automatically return to the organ?
equipping.my_augment = cling_to_organ
if(make_sound)
playsound(src, 'sound/items/change_jaws.ogg', 30, 1)
if(equipping.loc != src)
equipping.dropped()
return 1

View File

@@ -0,0 +1,262 @@
/*
* Arm mounted augments.
*/
/obj/item/organ/internal/augment/armmounted
name = "laser rifle implant"
desc = "A large implant that fits into a subject's arm. It deploys a laser-emitting array by some painful means."
icon_state = "augment_laser"
w_class = ITEMSIZE_LARGE
organ_tag = O_AUG_L_FOREARM
parent_organ = BP_L_ARM
target_slot = slot_l_hand
target_parent_classes = list(ORGAN_FLESH, ORGAN_ASSISTED)
integrated_object_type = /obj/item/weapon/gun/energy/laser/mounted/augment
/obj/item/organ/internal/augment/armmounted/attackby(obj/item/I as obj, mob/user as mob)
if(I.is_screwdriver())
switch(organ_tag)
if(O_AUG_L_FOREARM)
organ_tag = O_AUG_R_FOREARM
parent_organ = BP_R_ARM
target_slot = slot_r_hand
if(O_AUG_R_FOREARM)
organ_tag = O_AUG_L_FOREARM
parent_organ = BP_L_ARM
target_slot = slot_l_hand
to_chat(user, "<span class='notice'>You swap \the [src]'s servos to install neatly into \the lower [parent_organ] mount.</span>")
return
. = ..()
/obj/item/organ/internal/augment/armmounted/taser
name = "taser implant"
desc = "A large implant that fits into a subject's arm. It deploys a taser-emitting array by some painful means."
icon_state = "augment_taser"
integrated_object_type = /obj/item/weapon/gun/energy/taser/mounted/augment
/obj/item/organ/internal/augment/armmounted/dartbow
name = "crossbow implant"
desc = "A small implant that fits into a subject's arm. It deploys a dart launching mechanism through the flesh through unknown means."
icon_state = "augment_dart"
w_class = ITEMSIZE_SMALL
integrated_object_type = /obj/item/weapon/gun/energy/crossbow
// Wrist-or-hand-mounted implant
/obj/item/organ/internal/augment/armmounted/hand
name = "resonant analyzer implant"
desc = "An augment that fits neatly into the hand, useful for determining the usefulness of an object for research."
icon_state = "augment_box"
w_class = ITEMSIZE_SMALL
integrated_object_type = /obj/item/weapon/portable_scanner
/obj/item/organ/internal/augment/armmounted/hand/attackby(obj/item/I as obj, mob/user as mob)
if(I.is_screwdriver())
switch(organ_tag)
if(O_AUG_L_HAND)
organ_tag = O_AUG_R_HAND
parent_organ = BP_R_HAND
target_slot = slot_r_hand
if(O_AUG_R_HAND)
organ_tag = O_AUG_L_HAND
parent_organ = BP_L_HAND
target_slot = slot_l_hand
to_chat(user, "<span class='notice'>You swap \the [src]'s servos to install neatly into \the upper [parent_organ] mount.</span>")
return
. = ..()
/obj/item/organ/internal/augment/armmounted/hand/sword
name = "energy blade implant"
integrated_object_type = /obj/item/weapon/melee/energy/sword
/*
* Shoulder augment.
*/
/obj/item/organ/internal/augment/armmounted/shoulder
name = "shoulder augment"
desc = "A large implant that fits into a subject's arm. It looks kind of like a skeleton."
icon_state = "augment_armframe"
organ_tag = O_AUG_R_UPPERARM
w_class = ITEMSIZE_HUGE
integrated_object_type = null
/obj/item/organ/internal/augment/armmounted/shoulder/attackby(obj/item/I as obj, mob/user as mob)
if(I.is_screwdriver())
switch(organ_tag)
if(O_AUG_L_UPPERARM)
organ_tag = O_AUG_R_UPPERARM
parent_organ = BP_R_ARM
target_slot = slot_r_hand
if(O_AUG_R_UPPERARM)
organ_tag = O_AUG_L_UPPERARM
parent_organ = BP_L_ARM
target_slot = slot_l_hand
to_chat(user, "<span class='notice'>You swap \the [src]'s servos to install neatly into \the upper [parent_organ] mount.</span>")
return
. = ..()
/obj/item/organ/internal/augment/armmounted/shoulder/surge
name = "muscle overclocker"
aug_cooldown = 1.5 MINUTES
/obj/item/organ/internal/augment/armmounted/shoulder/surge/augment_action()
if(!owner)
return
if(aug_cooldown)
if(last_activate <= world.time + aug_cooldown)
last_activate = world.time
else
return
if(istype(owner, /mob/living/carbon/human))
var/mob/living/carbon/human/H = owner
H.add_modifier(/datum/modifier/melee_surge, 0.75 MINUTES)
// The toolkit / multi-tool implant.
/obj/item/organ/internal/augment/armmounted/shoulder/multiple
name = "rotary toolkit"
desc = "A large implant that fits into a subject's arm. It deploys an array of tools by some painful means."
icon_state = "augment_toolkit"
organ_tag = O_AUG_R_UPPERARM
w_class = ITEMSIZE_HUGE
integrated_object_type = null
toolspeed = 0.8
var/list/integrated_tools = list(
/obj/item/weapon/tool/screwdriver = null,
/obj/item/weapon/tool/wrench = null,
/obj/item/weapon/tool/crowbar = null,
/obj/item/weapon/tool/wirecutters = null,
/obj/item/device/multitool = null,
/obj/item/stack/cable_coil/gray = null,
/obj/item/weapon/tape_roll = null
)
var/list/integrated_tools_by_name
var/list/integrated_tool_images
var/list/synths
var/list/synth_types = list(
/datum/matter_synth/wire
)
/obj/item/organ/internal/augment/armmounted/shoulder/multiple/Initialize()
..()
if(integrated_object)
integrated_tools[integrated_object_type] = integrated_object
if(integrated_tools && integrated_tools.len)
integrated_tools_by_name = list()
integrated_tool_images = list()
if(synth_types)
synths = list()
for(var/datumpath in synth_types)
var/datum/matter_synth/MS = new datumpath
synths += MS
for(var/path in integrated_tools)
if(!integrated_tools[path])
integrated_tools[path] = new path(src)
var/obj/item/I = integrated_tools[path]
I.canremove = FALSE
I.toolspeed = toolspeed
I.my_augment = src
I.name = "integrated [I.name]"
for(var/tool in integrated_tools)
var/obj/item/Tool = integrated_tools[tool]
if(istype(Tool, /obj/item/stack))
var/obj/item/stack/S = Tool
S.synths = synths
S.uses_charge = synths.len
integrated_tools_by_name[Tool.name] = Tool
integrated_tool_images[Tool.name] = image(icon = Tool.icon, icon_state = Tool.icon_state)
/obj/item/organ/internal/augment/armmounted/shoulder/multiple/handle_organ_proc_special()
..()
if(!owner || is_bruised() || !synths)
return
if(prob(20))
for(var/datum/matter_synth/MS in synths)
MS.add_charge(MS.recharge_rate)
/obj/item/organ/internal/augment/armmounted/shoulder/multiple/augment_action()
if(!owner)
return
var/list/options = list()
for(var/Iname in integrated_tools_by_name)
options[Iname] = integrated_tool_images[Iname]
var/list/choice = list()
if(length(options) == 1)
for(var/key in options)
choice = key
else
choice = show_radial_menu(owner, owner, options)
integrated_object = integrated_tools_by_name[choice]
..()
/obj/item/organ/internal/augment/armmounted/shoulder/multiple/medical
name = "rotary medical kit"
icon_state = "augment_medkit"
integrated_object_type = null
integrated_tools = list(
/obj/item/weapon/surgical/hemostat = null,
/obj/item/weapon/surgical/retractor = null,
/obj/item/weapon/surgical/cautery = null,
/obj/item/weapon/surgical/surgicaldrill = null,
/obj/item/weapon/surgical/scalpel = null,
/obj/item/weapon/surgical/circular_saw = null,
/obj/item/weapon/surgical/bonegel = null,
/obj/item/weapon/surgical/FixOVein = null,
/obj/item/weapon/surgical/bonesetter = null,
/obj/item/stack/medical/crude_pack = null
)
synth_types = list(
/datum/matter_synth/bandage
)

View File

@@ -1,44 +1,18 @@
/*
* Augments. This file contains the base, and organic-targeting augments.
*/
/obj/item/organ/internal/augment
name = "augment"
icon_state = "cell_bay"
parent_organ = BP_TORSO
organ_verbs = list() // Verbs added by the organ when present in the body.
target_parent_classes = list() // Is the parent supposed to be organic, robotic, assisted?
forgiving_class = FALSE // Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic.
var/obj/item/integrated_object // Objects held by the organ, used for deployable things.
var/integrated_object_type // Object type the organ will spawn.
/obj/item/organ/internal/augment/Initialize()
..()
if(integrated_object_type)
integrated_object = new integrated_object_type(src)
integrated_object.canremove = FALSE
/obj/item/organ/internal/augment/handle_organ_mod_special(var/removed = FALSE)
if(removed && integrated_object && integrated_object.loc != src)
if(isliving(integrated_object.loc))
var/mob/living/L = integrated_object.loc
L.drop_from_inventory(integrated_object)
integrated_object.forceMove(src)
..(removed)
// The base organic-targeting augment. // The base organic-targeting augment.
/obj/item/organ/internal/augment/bioaugment /obj/item/organ/internal/augment/bioaugment
name = "bioaugmenting implant" name = "bioaugmenting implant"
robotic = ORGAN_ROBOT icon_state = "augment_hybrid"
dead_icon = "augment_hybrid_dead"
robotic = ORGAN_ASSISTED
target_parent_classes = list(ORGAN_FLESH) target_parent_classes = list(ORGAN_FLESH)
// Jensen Shades. Your vision can be augmented. /* Jensen Shades. Your vision can be augmented.
* This, technically, no longer needs its unique organ verb, however I have chosen to leave it for posterity
* in the event it needs to be referenced, while still remaining perfectly functional with either system.
*/
/obj/item/organ/internal/augment/bioaugment/thermalshades /obj/item/organ/internal/augment/bioaugment/thermalshades
name = "integrated thermolensing implant" name = "integrated thermolensing implant"
@@ -48,20 +22,31 @@
w_class = ITEMSIZE_TINY w_class = ITEMSIZE_TINY
organ_tag = O_AUG_TSHADE organ_tag = O_AUG_EYES
robotic = ORGAN_ROBOT
parent_organ = BP_HEAD parent_organ = BP_HEAD
organ_verbs = list(/mob/living/carbon/human/proc/toggle_shades) organ_verbs = list(
/mob/living/carbon/human/proc/augment_menu,
/mob/living/carbon/human/proc/toggle_shades)
integrated_object_type = /obj/item/clothing/glasses/hud/security/jensenshades integrated_object_type = /obj/item/clothing/glasses/hud/security/jensenshades
/obj/item/organ/internal/augment/bioaugment/thermalshades/augment_action()
if(!owner)
return
owner.toggle_shades()
// Here for posterity and example.
/mob/living/carbon/human/proc/toggle_shades() /mob/living/carbon/human/proc/toggle_shades()
set name = "Toggle Integrated Thermoshades" set name = "Toggle Integrated Thermoshades"
set desc = "Toggle your flash-proof, thermal-integrated sunglasses." set desc = "Toggle your flash-proof, thermal-integrated sunglasses."
set category = "Augments" set category = "Augments"
var/obj/item/organ/internal/augment/aug = internal_organs_by_name[O_AUG_TSHADE] var/obj/item/organ/internal/augment/aug = internal_organs_by_name[O_AUG_EYES]
if(glasses) if(glasses)
if(aug && aug.integrated_object == glasses) if(aug && aug.integrated_object == glasses)
@@ -90,3 +75,30 @@
var/obj/item/clothing/glasses/hud/security/jensenshades/J = new(get_turf(src)) var/obj/item/clothing/glasses/hud/security/jensenshades/J = new(get_turf(src))
equip_to_slot(J, slot_glasses, 1, 1) equip_to_slot(J, slot_glasses, 1, 1)
to_chat(src, "<span class='notice'>Your [aug.integrated_object] deploy.</span>") to_chat(src, "<span class='notice'>Your [aug.integrated_object] deploy.</span>")
/obj/item/organ/internal/augment/bioaugment/sprint_enhance
name = "locomotive optimization implant"
desc = "A chunk of meat and metal that can manage an individual's leg musculature."
organ_tag = O_AUG_PELVIC
parent_organ = BP_GROIN
target_parent_classes = list(ORGAN_FLESH, ORGAN_ASSISTED)
aug_cooldown = 2 MINUTES
/obj/item/organ/internal/augment/bioaugment/sprint_enhance/augment_action()
if(!owner)
return
if(aug_cooldown)
if(last_activate <= world.time + aug_cooldown)
last_activate = world.time
else
return
if(istype(owner, /mob/living/carbon/human))
var/mob/living/carbon/human/H = owner
H.add_modifier(/datum/modifier/sprinting, 1 MINUTES)

View File

@@ -130,6 +130,11 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain)
target.key = brainmob.key target.key = brainmob.key
..() ..()
/obj/item/organ/internal/brain/proc/get_control_efficiency()
. = max(0, 1 - (round(damage / max_damage * 10) / 10))
return .
/obj/item/organ/internal/brain/pariah_brain /obj/item/organ/internal/brain/pariah_brain
name = "brain remnants" name = "brain remnants"
desc = "Did someone tread on this? It looks useless for cloning or cyborgification." desc = "Did someone tread on this? It looks useless for cloning or cyborgification."

View File

@@ -9,7 +9,6 @@
var/standard_pulse_level = PULSE_NORM // We run on a normal clock. This is NOT CONNECTED to species heart-rate modifier. var/standard_pulse_level = PULSE_NORM // We run on a normal clock. This is NOT CONNECTED to species heart-rate modifier.
/obj/item/organ/internal/heart/handle_germ_effects() /obj/item/organ/internal/heart/handle_germ_effects()
. = ..() //Up should return an infection level as an integer . = ..() //Up should return an infection level as an integer
if(!.) return if(!.) return
@@ -23,6 +22,10 @@
owner.custom_pain("A stabbing pain rolls through your chest!",1) owner.custom_pain("A stabbing pain rolls through your chest!",1)
owner.apply_damage(damage = 25, damagetype = HALLOSS, def_zone = parent_organ) owner.apply_damage(damage = 25, damagetype = HALLOSS, def_zone = parent_organ)
/obj/item/organ/internal/heart/robotize()
..()
standard_pulse_level = PULSE_NONE
/obj/item/organ/internal/heart/grey /obj/item/organ/internal/heart/grey
icon_state = "heart_grey-on" icon_state = "heart_grey-on"
dead_icon = "heart_grey-off" dead_icon = "heart_grey-off"

View File

@@ -0,0 +1,23 @@
/obj/item/organ/internal/intestine
name = "intestine"
icon_state = "intestine"
organ_tag = O_INTESTINE
parent_organ = BP_GROIN
/obj/item/organ/internal/intestine/handle_germ_effects()
. = ..() //Up should return an infection level as an integer
if(!.) return
//Viral Gastroenteritis
if (. >= 1)
if(prob(1))
owner.custom_pain("There's a twisting pain in your abdomen!",1)
owner.vomit()
if (. >= 2)
if(prob(1))
owner.custom_pain("Your abdomen feels like it's tearing itself apart!",1)
owner.m_intent = "walk"
owner.hud_used.move_intent.icon_state = "walking"
/obj/item/organ/internal/intestine/xeno
color = "#555555"

View File

@@ -22,6 +22,13 @@
else if(is_broken()) else if(is_broken())
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY) owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)
/obj/item/organ/internal/kidneys/handle_organ_proc_special()
. = ..()
if(owner && owner.getToxLoss() <= owner.getMaxHealth() * 0.1) // If you have less than 10 tox damage (for a human), your kidneys can help purge it.
if(prob(owner.getToxLoss()))
owner.adjustToxLoss(rand(-1,-3))
/obj/item/organ/internal/kidneys/handle_germ_effects() /obj/item/organ/internal/kidneys/handle_germ_effects()
. = ..() //Up should return an infection level as an integer . = ..() //Up should return an infection level as an integer
if(!.) return if(!.) return

View File

@@ -21,6 +21,13 @@
spawn owner.emote("me", 1, "gasps for air!") spawn owner.emote("me", 1, "gasps for air!")
owner.AdjustLosebreath(15) owner.AdjustLosebreath(15)
if(owner.internal_organs_by_name[O_BRAIN]) // As the brain starts having Trouble, the lungs start malfunctioning.
var/obj/item/organ/internal/brain/Brain = owner.internal_organs_by_name[O_BRAIN]
if(Brain.get_control_efficiency() <= 0.8)
if(prob(4 / max(0.1,Brain.get_control_efficiency())))
spawn owner.emote("me", 1, "gasps for air!")
owner.AdjustLosebreath(round(3 / max(0.1,Brain.get_control_efficiency())))
/obj/item/organ/internal/lungs/proc/rupture() /obj/item/organ/internal/lungs/proc/rupture()
var/obj/item/organ/external/parent = owner.get_organ(parent_organ) var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
if(istype(parent)) if(istype(parent))

View File

@@ -0,0 +1,87 @@
/obj/item/organ/internal/spleen
name = "spleen"
icon_state = "spleen"
organ_tag = O_SPLEEN
parent_organ = BP_TORSO
w_class = ITEMSIZE_TINY
var/spleen_tick = 20 // The number of ticks between Spleen cycles.
var/spleen_efficiency = 1 // A multiplier for how efficient this spleen is.
/obj/item/organ/internal/spleen/process()
..()
if(!owner) return
if(owner.life_tick % spleen_tick == 0)
//High toxins levels are dangerous
if(owner.getToxLoss() >= 30 && !owner.reagents.has_reagent("anti_toxin"))
//Healthy liver suffers on its own
if (src.damage < min_broken_damage)
src.damage += 0.2 * spleen_tick
//Damaged one shares the fun
else
var/obj/item/organ/internal/O = pick(owner.internal_organs)
if(O)
O.damage += 0.2 * spleen_tick
else if(!src.is_broken()) // If the spleen isn't severely damaged, it can help fight infections. Key word, can.
var/obj/item/organ/external/OEx = pick(owner.organs)
OEx.adjust_germ_level(round(rand(0 * spleen_efficiency,-10 * spleen_efficiency)))
if(!src.is_bruised() && owner.internal_organs_by_name[O_BRAIN]) // If it isn't bruised, it helps with brain infections.
var/obj/item/organ/internal/brain/B = owner.internal_organs_by_name[O_BRAIN]
B.adjust_germ_level(round(rand(-3 * spleen_efficiency, -10 * spleen_efficiency)))
//Detox can heal small amounts of damage
if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("anti_toxin"))
src.damage -= 0.2 * spleen_tick * spleen_efficiency
if(src.damage < 0)
src.damage = 0
/obj/item/organ/internal/spleen/handle_germ_effects()
. = ..() //Up should return an infection level as an integer
if(!.) return
// Low levels can cause pain and haemophilia, high levels can cause brain infections.
if (. >= 1)
if(prob(1))
owner.custom_pain("There's a sharp pain in your [owner.get_organ(parent_organ)]!",1)
owner.add_modifier(/datum/modifier/trait/haemophilia, 2 MINUTES * spleen_efficiency)
if (. >= 2)
if(prob(1))
if(owner.getToxLoss() < owner.getMaxHealth() * 0.2 * spleen_efficiency)
owner.adjustToxLoss(2 * spleen_efficiency)
else if(owner.internal_organs_by_name[O_BRAIN])
var/obj/item/organ/internal/brain/Brain = owner.internal_organs_by_name[O_BRAIN]
Brain.adjust_germ_level(round(rand(5 * spleen_efficiency,20 * spleen_efficiency)))
/obj/item/organ/internal/spleen/die()
..()
if(owner)
owner.add_modifier(/datum/modifier/trait/haemophilia, round(15 MINUTES * spleen_efficiency))
var/obj/item/organ/external/Target = owner.get_organ(parent_organ)
var/datum/wound/W = new /datum/wound/internal_bleeding(round(20 * spleen_efficiency))
owner.adjustToxLoss(15 * spleen_efficiency)
Target.wounds += W
/obj/item/organ/internal/spleen/skrell
name = "lymphatic hub"
icon_state = "spleen"
parent_organ = BP_HEAD
spleen_efficiency = 0.5
/obj/item/organ/internal/spleen/skrell/Initialize()
..()
adjust_scale(0.8,0.7)
/obj/item/organ/internal/spleen/minor
name = "vestigial spleen"
parent_organ = BP_GROIN
spleen_efficiency = 0.3
spleen_tick = 15
/obj/item/organ/internal/spleen/minor/Initialize()
..()
adjust_scale(0.7)

View File

@@ -0,0 +1,50 @@
/obj/item/organ/internal/stomach
name = "stomach"
icon_state = "stomach"
organ_tag = O_STOMACH
parent_organ = BP_GROIN
unacidable = TRUE // Don't melt when holding your acid, dangit.
var/acidtype = "stomacid" // Incase you want some stomach organ with, say, polyacid instead, or sulphuric.
var/max_acid_volume = 30
var/deadly_hold = TRUE // Does the stomach do damage to mobs eaten by its owner? Xenos should probably have this FALSE.
/obj/item/organ/internal/stomach/Initialize()
..()
if(reagents)
reagents.maximum_volume = 30
else
create_reagents(30)
/obj/item/organ/internal/stomach/handle_organ_proc_special()
if(owner && istype(owner, /mob/living/carbon/human))
if(reagents)
if(reagents.total_volume + 2 < max_acid_volume && prob(20))
reagents.add_reagent(acidtype, rand(1,2))
for(var/mob/living/L in owner.stomach_contents) // Splashes mobs inside with acid. Twice as effective as being splashed with the same acid outside the body.
reagents.trans_to(L, 2, 2, 0)
if(is_broken() && prob(1))
owner.custom_pain("There's a twisting pain in your abdomen!",1)
owner.vomit(FALSE, TRUE)
/obj/item/organ/internal/stomach/handle_germ_effects()
. = ..() //Up should return an infection level as an integer
if(!.) return
//Bacterial Gastroenteritis
if (. >= 1)
if(prob(1))
owner.custom_pain("There's a twisting pain in your abdomen!",1)
owner.apply_effect(2, AGONY, 0)
if (. >= 2)
if(prob(1) && owner.getToxLoss() < owner.getMaxHealth()*0.2)
owner.adjustToxLoss(3)
owner.vomit(FALSE, TRUE)
/obj/item/organ/internal/stomach/xeno
color = "#555555"

View File

@@ -1,7 +1,7 @@
/* /*
* Voicebox/Vocal Synthesizers * Voicebox/Vocal Synthesizers
* TL;DR: Assists with speaking languages that a species doesn't normally have, * TL;DR: Assists with speaking languages that a species doesn't normally have,
* such as EAL. Not standard or organic, because at the moment it's undesireable to completely mute characters. * such as EAL. Not standard or organic, because at the moment it's undesireable to completely mute characters. - - Can now actually cause muting, if destroyed / removed.
*/ */
/obj/item/organ/internal/voicebox /obj/item/organ/internal/voicebox
@@ -10,6 +10,7 @@
parent_organ = BP_TORSO // We don't have a neck area parent_organ = BP_TORSO // We don't have a neck area
organ_tag = O_VOICE organ_tag = O_VOICE
will_assist_languages = list(LANGUAGE_GALCOM) will_assist_languages = list(LANGUAGE_GALCOM)
var/mute = FALSE
/obj/item/organ/internal/voicebox/New() /obj/item/organ/internal/voicebox/New()
..() ..()

View File

@@ -37,7 +37,7 @@
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration) if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD)
overlays |= facial_s overlays |= image(facial_s, "pixel_y" = head_offset)
if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
@@ -45,14 +45,20 @@
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3)
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY) hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY)
overlays |= hair_s overlays |= image(hair_s, "pixel_y" = head_offset)
return mob_icon return mob_icon
/obj/item/organ/external/head/vr /obj/item/organ/external/head/vr
var/eye_icons_vr = 'icons/mob/human_face_vr.dmi' var/eye_icons_vr = 'icons/mob/human_face_vr.dmi'
var/eye_icon_vr = "blank_eyes" var/eye_icon_vr = "blank_eyes"
var/head_offset = 0
eye_icon = "blank_eyes" eye_icon = "blank_eyes"
/obj/item/organ/external/head/vr/sergal /obj/item/organ/external/head/vr/sergal
eye_icon_vr = "eyes_sergal" eye_icon_vr = "eyes_sergal"
/obj/item/organ/external/head/vr/werebeast
eye_icons_vr = 'icons/mob/werebeast_face_vr.dmi'
eye_icon_vr = "werebeast_eyes"
head_offset = 6

View File

@@ -47,4 +47,11 @@
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY) owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)
/obj/item/organ/internal/brain/unathi /obj/item/organ/internal/brain/unathi
color = "#b3cbc3" color = "#b3cbc3"
/obj/item/organ/internal/stomach/unathi
color = "#b3cbc3"
max_acid_volume = 40
/obj/item/organ/internal/intestine/unathi
color = "#b3cbc3"

View File

@@ -1,208 +1,230 @@
/obj/item/weapon/gun/energy /obj/item/weapon/gun/energy
name = "energy gun" name = "energy gun"
desc = "A basic energy-based gun." desc = "A basic energy-based gun."
icon_state = "energy" icon_state = "energy"
fire_sound_text = "laser blast" fire_sound_text = "laser blast"
var/obj/item/weapon/cell/power_supply //What type of power cell this uses var/obj/item/weapon/cell/power_supply //What type of power cell this uses
var/charge_cost = 240 //How much energy is needed to fire. var/charge_cost = 240 //How much energy is needed to fire.
var/accept_cell_type = /obj/item/weapon/cell/device var/accept_cell_type = /obj/item/weapon/cell/device
var/cell_type = /obj/item/weapon/cell/device/weapon var/cell_type = /obj/item/weapon/cell/device/weapon
projectile_type = /obj/item/projectile/beam/practice projectile_type = /obj/item/projectile/beam/practice
var/modifystate var/modifystate
var/charge_meter = 1 //if set, the icon state will be chosen based on the current charge var/charge_meter = 1 //if set, the icon state will be chosen based on the current charge
//self-recharging //self-recharging
var/self_recharge = 0 //if set, the weapon will recharge itself var/self_recharge = 0 //if set, the weapon will recharge itself
var/use_external_power = 0 //if set, the weapon will look for an external power source to draw from, otherwise it recharges magically var/use_external_power = 0 //if set, the weapon will look for an external power source to draw from, otherwise it recharges magically
var/recharge_time = 4 var/use_organic_power = 0 // If set, the weapon will draw from nutrition or blood.
var/charge_tick = 0 var/recharge_time = 4
var/charge_delay = 75 //delay between firing and charging var/charge_tick = 0
var/charge_delay = 75 //delay between firing and charging
var/battery_lock = 0 //If set, weapon cannot switch batteries
var/battery_lock = 0 //If set, weapon cannot switch batteries
/obj/item/weapon/gun/energy/New()
..() /obj/item/weapon/gun/energy/New()
if(self_recharge) ..()
power_supply = new /obj/item/weapon/cell/device/weapon(src) if(self_recharge)
START_PROCESSING(SSobj, src) power_supply = new /obj/item/weapon/cell/device/weapon(src)
else START_PROCESSING(SSobj, src)
if(cell_type) else
power_supply = new cell_type(src) if(cell_type)
else power_supply = new cell_type(src)
power_supply = null else
power_supply = null
update_icon()
update_icon()
/obj/item/weapon/gun/energy/Destroy()
if(self_recharge) /obj/item/weapon/gun/energy/Destroy()
STOP_PROCESSING(SSobj, src) if(self_recharge)
return ..() STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/weapon/gun/energy/get_cell()
return power_supply /obj/item/weapon/gun/energy/get_cell()
return power_supply
/obj/item/weapon/gun/energy/process()
if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery /obj/item/weapon/gun/energy/process()
if(world.time > last_shot + charge_delay) //Doesn't work if you've fired recently if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery
if(!power_supply || power_supply.charge >= power_supply.maxcharge) if(world.time > last_shot + charge_delay) //Doesn't work if you've fired recently
return 0 // check if we actually need to recharge if(!power_supply || power_supply.charge >= power_supply.maxcharge)
return 0 // check if we actually need to recharge
charge_tick++
if(charge_tick < recharge_time) return 0 charge_tick++
charge_tick = 0 if(charge_tick < recharge_time) return 0
charge_tick = 0
var/rechargeamt = power_supply.maxcharge*0.2
var/rechargeamt = power_supply.maxcharge*0.2
if(use_external_power)
var/obj/item/weapon/cell/external = get_external_power_supply() if(use_external_power)
if(!external || !external.use(rechargeamt)) //Take power from the borg... var/obj/item/weapon/cell/external = get_external_power_supply()
return 0 if(!external || !external.use(rechargeamt)) //Take power from the borg...
return 0
power_supply.give(rechargeamt) //... to recharge 1/5th the battery
update_icon() if(use_organic_power)
else var/mob/living/carbon/human/H
charge_tick = 0 if(ishuman(loc))
return 1 H = loc
/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob) if(istype(loc, /obj/item/organ))
..() var/obj/item/organ/O = loc
if(O.owner)
/obj/item/weapon/gun/energy/switch_firemodes(mob/user) H = O.owner
if(..())
update_icon() if(istype(H))
var/start_nutrition = H.nutrition
/obj/item/weapon/gun/energy/emp_act(severity) var/end_nutrition = 0
..()
update_icon() H.nutrition -= rechargeamt / 10
/obj/item/weapon/gun/energy/consume_next_projectile() end_nutrition = H.nutrition
if(!power_supply) return null
if(!ispath(projectile_type)) return null if(start_nutrition - max(0, end_nutrition) < rechargeamt / 10)
if(!power_supply.checked_use(charge_cost)) return null H.remove_blood((rechargeamt / 10) - (start_nutrition - max(0, end_nutrition)))
return new projectile_type(src)
power_supply.give(rechargeamt) //... to recharge 1/5th the battery
/obj/item/weapon/gun/energy/proc/load_ammo(var/obj/item/C, mob/user) update_icon()
if(istype(C, /obj/item/weapon/cell)) else
if(self_recharge || battery_lock) charge_tick = 0
user << "<span class='notice'>[src] does not have a battery port.</span>" return 1
return
if(istype(C, accept_cell_type)) /obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob)
var/obj/item/weapon/cell/P = C ..()
if(power_supply)
user << "<span class='notice'>[src] already has a power cell.</span>" /obj/item/weapon/gun/energy/switch_firemodes(mob/user)
else if(..())
user.visible_message("[user] is reloading [src].", "<span class='notice'>You start to insert [P] into [src].</span>") update_icon()
if(do_after(user, 5 * P.w_class))
user.remove_from_mob(P) /obj/item/weapon/gun/energy/emp_act(severity)
power_supply = P ..()
P.loc = src update_icon()
user.visible_message("[user] inserts [P] into [src].", "<span class='notice'>You insert [P] into [src].</span>")
playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) /obj/item/weapon/gun/energy/consume_next_projectile()
update_icon() if(!power_supply) return null
update_held_icon() if(!ispath(projectile_type)) return null
else if(!power_supply.checked_use(charge_cost)) return null
user << "<span class='notice'>This cell is not fitted for [src].</span>" return new projectile_type(src)
return
/obj/item/weapon/gun/energy/proc/load_ammo(var/obj/item/C, mob/user)
/obj/item/weapon/gun/energy/proc/unload_ammo(mob/user) if(istype(C, /obj/item/weapon/cell))
if(self_recharge || battery_lock) if(self_recharge || battery_lock)
user << "<span class='notice'>[src] does not have a battery port.</span>" user << "<span class='notice'>[src] does not have a battery port.</span>"
return return
if(power_supply) if(istype(C, accept_cell_type))
user.put_in_hands(power_supply) var/obj/item/weapon/cell/P = C
power_supply.update_icon() if(power_supply)
user.visible_message("[user] removes [power_supply] from [src].", "<span class='notice'>You remove [power_supply] from [src].</span>") user << "<span class='notice'>[src] already has a power cell.</span>"
power_supply = null else
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) user.visible_message("[user] is reloading [src].", "<span class='notice'>You start to insert [P] into [src].</span>")
update_icon() if(do_after(user, 5 * P.w_class))
update_held_icon() user.remove_from_mob(P)
else power_supply = P
user << "<span class='notice'>[src] does not have a power cell.</span>" P.loc = src
user.visible_message("[user] inserts [P] into [src].", "<span class='notice'>You insert [P] into [src].</span>")
/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob) playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1)
..() update_icon()
load_ammo(A, user) update_held_icon()
else
/obj/item/weapon/gun/energy/attack_hand(mob/user as mob) user << "<span class='notice'>This cell is not fitted for [src].</span>"
if(user.get_inactive_hand() == src) return
unload_ammo(user)
else /obj/item/weapon/gun/energy/proc/unload_ammo(mob/user)
return ..() if(self_recharge || battery_lock)
user << "<span class='notice'>[src] does not have a battery port.</span>"
/obj/item/weapon/gun/energy/proc/get_external_power_supply() return
if(isrobot(src.loc)) if(power_supply)
var/mob/living/silicon/robot/R = src.loc user.put_in_hands(power_supply)
return R.cell power_supply.update_icon()
if(istype(src.loc, /obj/item/rig_module)) user.visible_message("[user] removes [power_supply] from [src].", "<span class='notice'>You remove [power_supply] from [src].</span>")
var/obj/item/rig_module/module = src.loc power_supply = null
if(module.holder && module.holder.wearer) playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
var/mob/living/carbon/human/H = module.holder.wearer update_icon()
if(istype(H) && H.back) update_held_icon()
var/obj/item/weapon/rig/suit = H.back else
if(istype(suit)) user << "<span class='notice'>[src] does not have a power cell.</span>"
return suit.cell
return null /obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob)
..()
/obj/item/weapon/gun/energy/examine(mob/user) load_ammo(A, user)
. = ..()
if(power_supply) /obj/item/weapon/gun/energy/attack_hand(mob/user as mob)
if(charge_cost) if(user.get_inactive_hand() == src)
var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia unload_ammo(user)
to_chat(user, "Has [shots_remaining] shot\s remaining.") else
else return ..()
to_chat(user, "Has infinite shots remaining.")
else /obj/item/weapon/gun/energy/proc/get_external_power_supply()
to_chat(user, "Does not have a power cell.") if(isrobot(src.loc))
return var/mob/living/silicon/robot/R = src.loc
return R.cell
/obj/item/weapon/gun/energy/update_icon(var/ignore_inhands) if(istype(src.loc, /obj/item/rig_module))
if(power_supply == null) var/obj/item/rig_module/module = src.loc
if(modifystate) if(module.holder && module.holder.wearer)
icon_state = "[modifystate]_open" var/mob/living/carbon/human/H = module.holder.wearer
else if(istype(H) && H.back)
icon_state = "[initial(icon_state)]_open" var/obj/item/weapon/rig/suit = H.back
return if(istype(suit))
else if(charge_meter) return suit.cell
var/ratio = power_supply.charge / power_supply.maxcharge return null
//make sure that rounding down will not give us the empty state even if we have charge for a shot left. /obj/item/weapon/gun/energy/examine(mob/user)
if(power_supply.charge < charge_cost) . = ..()
ratio = 0 if(power_supply)
else if(charge_cost)
ratio = max(round(ratio, 0.25) * 100, 25) var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia
to_chat(user, "Has [shots_remaining] shot\s remaining.")
if(modifystate) else
icon_state = "[modifystate][ratio]" to_chat(user, "Has infinite shots remaining.")
else else
icon_state = "[initial(icon_state)][ratio]" to_chat(user, "Does not have a power cell.")
return
else if(power_supply)
if(modifystate) /obj/item/weapon/gun/energy/update_icon(var/ignore_inhands)
icon_state = "[modifystate]" if(power_supply == null)
else if(modifystate)
icon_state = "[initial(icon_state)]" icon_state = "[modifystate]_open"
else
if(!ignore_inhands) update_held_icon() icon_state = "[initial(icon_state)]_open"
return
/obj/item/weapon/gun/energy/proc/start_recharge() else if(charge_meter)
if(power_supply == null) var/ratio = power_supply.charge / power_supply.maxcharge
power_supply = new /obj/item/weapon/cell/device/weapon(src)
self_recharge = 1 //make sure that rounding down will not give us the empty state even if we have charge for a shot left.
START_PROCESSING(SSobj, src) if(power_supply.charge < charge_cost)
update_icon() ratio = 0
else
/obj/item/weapon/gun/energy/get_description_interaction() ratio = max(round(ratio, 0.25) * 100, 25)
var/list/results = list()
if(modifystate)
if(!battery_lock && !self_recharge) icon_state = "[modifystate][ratio]"
if(power_supply) else
results += "[desc_panel_image("offhand")]to remove the weapon cell." icon_state = "[initial(icon_state)][ratio]"
else
results += "[desc_panel_image("weapon cell")]to add a new weapon cell." else if(power_supply)
if(modifystate)
results += ..() icon_state = "[modifystate]"
else
return results icon_state = "[initial(icon_state)]"
if(!ignore_inhands) update_held_icon()
/obj/item/weapon/gun/energy/proc/start_recharge()
if(power_supply == null)
power_supply = new /obj/item/weapon/cell/device/weapon(src)
self_recharge = 1
START_PROCESSING(SSobj, src)
update_icon()
/obj/item/weapon/gun/energy/get_description_interaction()
var/list/results = list()
if(!battery_lock && !self_recharge)
if(power_supply)
results += "[desc_panel_image("offhand")]to remove the weapon cell."
else
results += "[desc_panel_image("weapon cell")]to add a new weapon cell."
results += ..()
return results

View File

@@ -24,6 +24,11 @@
use_external_power = 1 use_external_power = 1
one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry. one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry.
/obj/item/weapon/gun/energy/laser/mounted/augment
use_external_power = FALSE
use_organic_power = TRUE
canremove = FALSE
/obj/item/weapon/gun/energy/laser/practice /obj/item/weapon/gun/energy/laser/practice
name = "practice laser carbine" name = "practice laser carbine"
desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice." desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice."

View File

@@ -11,6 +11,12 @@
self_recharge = 1 self_recharge = 1
use_external_power = 1 use_external_power = 1
/obj/item/weapon/gun/energy/taser/mounted/augment
self_recharge = 1
use_external_power = 0
use_organic_power = TRUE
canremove = FALSE
/obj/item/weapon/gun/energy/taser/mounted/cyborg /obj/item/weapon/gun/energy/taser/mounted/cyborg
name = "taser gun" name = "taser gun"
charge_cost = 400 charge_cost = 400

View File

@@ -86,7 +86,17 @@
user.visible_message("<span class='notice'>\The [user] slots \the [cell] into \the [src].</span>") user.visible_message("<span class='notice'>\The [user] slots \the [cell] into \the [src].</span>")
update_icon() update_icon()
return return
if(thing.is_crowbar())
if(!manipulator)
to_chat(user, "<span class='warning'>\The [src] has no manipulator installed.</span>")
return
manipulator.forceMove(get_turf(src))
user.put_in_hands(manipulator)
user.visible_message("<span class='notice'>\The [user] levers \the [manipulator] from \the [src].</span>")
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
manipulator = null
update_icon()
return
if(thing.is_screwdriver()) if(thing.is_screwdriver())
if(!capacitor) if(!capacitor)
to_chat(user, "<span class='warning'>\The [src] has no capacitor installed.</span>") to_chat(user, "<span class='warning'>\The [src] has no capacitor installed.</span>")
@@ -112,6 +122,20 @@
update_icon() update_icon()
return return
if(istype(thing, /obj/item/weapon/stock_parts/manipulator))
if(manipulator)
to_chat(user, "<span class='warning'>\The [src] already has \a [manipulator] installed.</span>")
return
manipulator = thing
user.drop_from_inventory(manipulator)
manipulator.forceMove(src)
playsound(loc, 'sound/machines/click.ogg', 10,1)
mat_cost = initial(mat_cost) % (2*manipulator.rating)
user.visible_message("<span class='notice'>\The [user] slots \the [manipulator] into \the [src].</span>")
update_icon()
return
if(istype(thing, load_type)) if(istype(thing, load_type))
loading = TRUE loading = TRUE
var/obj/item/stack/material/M = thing var/obj/item/stack/material/M = thing

Some files were not shown because too many files have changed in this diff Show More