mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-01-04 06:23:19 +00:00
Reupdated Station 1 map
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
*/
|
||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
57
code/datums/uplink/medical_vr.dm
Normal file
57
code/datums/uplink/medical_vr.dm
Normal 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
|
||||||
42
code/datums/uplink/tools_vr.dm
Normal file
42
code/datums/uplink/tools_vr.dm
Normal 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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
*/
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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> [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
|
||||||
|
|||||||
@@ -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...
|
||||||
|
|||||||
@@ -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')
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
196
code/game/objects/items/weapons/implants/implantaugment.dm
Normal file
196
code/game/objects/items/weapons/implants/implantaugment.dm
Normal 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"
|
||||||
@@ -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
|
||||||
|
|||||||
30
code/game/objects/items/weapons/implants/implantdud.dm
Normal file
30
code/game/objects/items/weapons/implants/implantdud.dm
Normal 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)
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
4
code/game/objects/items/weapons/storage/belt_vr.dm
Normal file
4
code/game/objects/items/weapons/storage/belt_vr.dm
Normal 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')
|
||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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!
|
||||||
|
|||||||
@@ -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')
|
||||||
@@ -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'
|
||||||
|
)
|
||||||
@@ -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."
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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) \
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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)
|
||||||
|
)
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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.")
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#define AB_SHIFT_NONE 0
|
||||||
|
#define AB_SHIFT_PASSIVE 1
|
||||||
|
#define AB_SHIFT_ACTIVE 2
|
||||||
@@ -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 ..()
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#undef AB_SHIFT_NONE
|
||||||
|
#undef AB_SHIFT_PASSIVE
|
||||||
|
#undef AB_SHIFT_ACTIVE
|
||||||
@@ -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)
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>"
|
||||||
|
|||||||
177
code/modules/organs/internal/augment.dm
Normal file
177
code/modules/organs/internal/augment.dm
Normal 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
|
||||||
262
code/modules/organs/internal/augment/armmounted.dm
Normal file
262
code/modules/organs/internal/augment/armmounted.dm
Normal 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
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
|
||||||
@@ -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."
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
23
code/modules/organs/internal/intestine.dm
Normal file
23
code/modules/organs/internal/intestine.dm
Normal 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"
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
87
code/modules/organs/internal/spleen.dm
Normal file
87
code/modules/organs/internal/spleen.dm
Normal 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)
|
||||||
50
code/modules/organs/internal/stomach.dm
Normal file
50
code/modules/organs/internal/stomach.dm
Normal 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"
|
||||||
@@ -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()
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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."
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user