mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 01:34:01 +00:00
Adds a flipping skillchip, the Chipped quirk, a chip connector implant, and a quirk to spawn with it. (#87082)
## About The Pull Request Added the FOSBURY skillchip, found in hacked toy vendors. This skillchip allows you to bypass the emote cooldown when flipping or spinning. However, if used too often, it will lower the chip's integrity. At first, this is harmless, emitting sparks only, but at a certain point, your head starts smoking, your brain begins short-circuiting, and once the chip has lost all integrity your head will explode in a shower of gore, giving you a cranial fissure! Added the Chipped quirk. It allows you to spawn with one skillchip. Of note here is that the only chips you can spawn with are the 'default' skillchips found in the toy vendor, you can NOT spawn in with the fosbury chip or with the musical one. Added the Chip Connector quirk. It contains a new implant, the chip connector, which allows you to install and take out skillchips at any time. Being EMPed will cause it to drop one random skillchip, and if you try using it while it's malfunctioning you'll take out a bit of your brain instead. It can also be made at the exosuit fabricator after basic research. Renamed the organ slots for brain implants and made the connector implant take the CNS slot. ## Why It's Good For The Game > Added the FOSBURY skillchip, found in hacked toy vendors. This skillchip allows you to bypass the emote cooldown when flipping or spinning. However, if used too often, it will lower the chip's integrity. At first, this is harmless, emitting sparks only, but at a certain point, your head starts smoking, your brain begins short-circuiting, and once the chip has lost all integrity your head will explode in a shower of gore, giving you a cranial fissure! During the time flipping was bugged to have no cooldown or delay, it was really funny seeing people flip at increasingly higher speeds. Many people miss it, and to be honest, so do I. But everything needs limits or it stops being funny and ends up being overdone. To this end this skillchip lets people relive those days of glory, until they go out in a beautiful explosion. The chip will last a very long while if well taken care of, and there are plenty of warning signs before it gets too risky to use, but we know what players are actually gonna do, and I am looking forward to it. > Added the Chipped quirk. It allows you to spawn with one skillchip. Of note here is that the only chips you can spawn with are the 'default' skillchips found in the toy vendor, you can NOT spawn in with the fosbury chip or with the musical one. Chips can be kind of neat sometimes, and I think always having one as part of your character can make for some fun things as the consistency of it makes it more likely to stick in your mind to do stuff with. > 'but can't you just go to the vendor at the start of every shift?' Sure. But we have loadouts. We have tagger, musician, and many other things that are 'roundstart bloat', and while that by itself is not an excuse, it's part of the design of character setup: Minimizing the time spent running around the station for things your character is supposed to have for their personality/roleplay/gimmick. They're paying the cost of quirk points for it, anyways. > Added the Chip Connector quirk. It contains a new implant, the chip connector, which allows you to install and take out skillchips at any time. Being EMPed will cause it to drop one random skillchip, and if you try using it while it's malfunctioning you'll take out a bit of your brain instead. It can also be made at the exosuit fabricator after basic research. I like the idea of having a gross usb drive on the back of your brain that you shove chips into and out of, especially if it drops pieces of your brain when malfunctioning. It also adds a little bit of extra relevance to skillchips now that you don't need to spend 15 (!!!) seconds inside a skillstation to add one. The cost is, as stated, quite literally losing your brain on EMP's and the moderately expensive sum of 4 points. > Renamed the organ slots for brain implants and made the connector implant take the CNS slot. It annoys me that there were organ slots for 'anti drop implant'. Now they're just slots for anything meant to connect to the cerebellum/central nervous system, making it less brute forcey and also adding the start of some fun exclusivity between brain implants. ## Changelog 🆑 add: Added the FOSBURY skillchip, found in hacked toy vendors. This skillchip allows you to bypass the emote cooldown when flipping or spinning. However, if used too often, it will lower the chip's integrity and cause malfunctions. add: Added the Chipped quirk. It allows you to spawn with one base skillchip. (not the one above) add: Added the Chip Connector quirk. It contains a new implant, the chip connector, which allows you to install and take out skillchips at any time. code: Renamed the organ slots for brain implants and made the connector implant take the CNS slot. --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> # Conflicts: # code/datums/emotes.dm
This commit is contained in:
@@ -90,8 +90,8 @@
|
|||||||
#define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator"
|
#define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator"
|
||||||
#define ORGAN_SLOT_APPENDIX "appendix"
|
#define ORGAN_SLOT_APPENDIX "appendix"
|
||||||
#define ORGAN_SLOT_BRAIN "brain"
|
#define ORGAN_SLOT_BRAIN "brain"
|
||||||
#define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop"
|
#define ORGAN_SLOT_BRAIN_CEREBELLUM "brain_antidrop"
|
||||||
#define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun"
|
#define ORGAN_SLOT_BRAIN_CNS "brain_antistun"
|
||||||
#define ORGAN_SLOT_BREATHING_TUBE "breathing_tube"
|
#define ORGAN_SLOT_BREATHING_TUBE "breathing_tube"
|
||||||
#define ORGAN_SLOT_EARS "ears"
|
#define ORGAN_SLOT_EARS "ears"
|
||||||
#define ORGAN_SLOT_EYES "eye_sight"
|
#define ORGAN_SLOT_EYES "eye_sight"
|
||||||
@@ -174,8 +174,8 @@ GLOBAL_LIST_INIT(organ_process_order, list(
|
|||||||
ORGAN_SLOT_VOICE,
|
ORGAN_SLOT_VOICE,
|
||||||
ORGAN_SLOT_ADAMANTINE_RESONATOR,
|
ORGAN_SLOT_ADAMANTINE_RESONATOR,
|
||||||
ORGAN_SLOT_HEART_AID,
|
ORGAN_SLOT_HEART_AID,
|
||||||
ORGAN_SLOT_BRAIN_ANTIDROP,
|
ORGAN_SLOT_BRAIN_CEREBELLUM,
|
||||||
ORGAN_SLOT_BRAIN_ANTISTUN,
|
ORGAN_SLOT_BRAIN_CNS,
|
||||||
ORGAN_SLOT_PARASITE_EGG,
|
ORGAN_SLOT_PARASITE_EGG,
|
||||||
ORGAN_SLOT_MONSTER_CORE,
|
ORGAN_SLOT_MONSTER_CORE,
|
||||||
ORGAN_SLOT_XENO_PLASMAVESSEL,
|
ORGAN_SLOT_XENO_PLASMAVESSEL,
|
||||||
|
|||||||
@@ -239,8 +239,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
|
|||||||
/// ex_act() with EXPLODE_DEVASTATE severity will gib mobs with less than this much bomb armor
|
/// ex_act() with EXPLODE_DEVASTATE severity will gib mobs with less than this much bomb armor
|
||||||
#define EXPLODE_GIB_THRESHOLD 50
|
#define EXPLODE_GIB_THRESHOLD 50
|
||||||
|
|
||||||
#define EMP_HEAVY 1
|
|
||||||
#define EMP_LIGHT 2
|
#define EMP_LIGHT 2
|
||||||
|
#define EMP_HEAVY 1
|
||||||
|
|
||||||
#define GRENADE_CLUMSY_FUMBLE 1
|
#define GRENADE_CLUMSY_FUMBLE 1
|
||||||
#define GRENADE_NONCLUMSY_FUMBLE 2
|
#define GRENADE_NONCLUMSY_FUMBLE 2
|
||||||
|
|||||||
@@ -150,6 +150,10 @@
|
|||||||
///from /mob/say_dead(): (mob/speaker, message)
|
///from /mob/say_dead(): (mob/speaker, message)
|
||||||
#define COMSIG_MOB_DEADSAY "mob_deadsay"
|
#define COMSIG_MOB_DEADSAY "mob_deadsay"
|
||||||
#define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0)
|
#define MOB_DEADSAY_SIGNAL_INTERCEPT (1<<0)
|
||||||
|
///from /mob/living/check_cooldown(): ()
|
||||||
|
#define COMSIG_MOB_EMOTE_COOLDOWN_CHECK "mob_emote_cd"
|
||||||
|
/// make a wild guess
|
||||||
|
#define COMPONENT_EMOTE_COOLDOWN_BYPASS (1<<0)
|
||||||
///from /mob/living/emote(): ()
|
///from /mob/living/emote(): ()
|
||||||
#define COMSIG_MOB_EMOTE "mob_emote"
|
#define COMSIG_MOB_EMOTE "mob_emote"
|
||||||
///from base of mob/swap_hand(): (obj/item/currently_held_item)
|
///from base of mob/swap_hand(): (obj/item/currently_held_item)
|
||||||
|
|||||||
@@ -100,3 +100,19 @@ GLOBAL_LIST_INIT(paraplegic_choice, list(
|
|||||||
"Default" = FALSE,
|
"Default" = FALSE,
|
||||||
"Amputee" = TRUE,
|
"Amputee" = TRUE,
|
||||||
))
|
))
|
||||||
|
|
||||||
|
///chipped Quirk
|
||||||
|
GLOBAL_LIST_INIT(quirk_chipped_choice, list(
|
||||||
|
"Basketsoft 3000" = /obj/item/skillchip/basketweaving,
|
||||||
|
"WINE" = /obj/item/skillchip/wine_taster,
|
||||||
|
"Hedge 3" = /obj/item/skillchip/bonsai,
|
||||||
|
"Skillchip adapter" = /obj/item/skillchip/useless_adapter,
|
||||||
|
"N16H7M4R3" = /obj/item/skillchip/light_remover,
|
||||||
|
"3NTR41LS" = /obj/item/skillchip/entrails_reader,
|
||||||
|
"GENUINE ID Appraisal Now!" = /obj/item/skillchip/appraiser,
|
||||||
|
"Le S48R4G3" = /obj/item/skillchip/sabrage,
|
||||||
|
"Integrated Intuitive Thinking and Judging" = /obj/item/skillchip/intj,
|
||||||
|
"F0RC3 4DD1CT10N" = /obj/item/skillchip/drunken_brawler,
|
||||||
|
"\"Space Station 13: The Musical\"" = /obj/item/skillchip/musical,
|
||||||
|
"Mast-Angl-Er skillchip" = /obj/item/skillchip/master_angler,
|
||||||
|
))
|
||||||
|
|||||||
@@ -256,12 +256,14 @@
|
|||||||
* Returns FALSE if the cooldown is not over, TRUE if the cooldown is over.
|
* Returns FALSE if the cooldown is not over, TRUE if the cooldown is over.
|
||||||
*/
|
*/
|
||||||
/datum/emote/proc/check_cooldown(mob/user, intentional)
|
/datum/emote/proc/check_cooldown(mob/user, intentional)
|
||||||
|
if(SEND_SIGNAL(user, COMSIG_MOB_EMOTE_COOLDOWN_CHECK, src.key, intentional) & COMPONENT_EMOTE_COOLDOWN_BYPASS)
|
||||||
|
intentional = FALSE
|
||||||
|
|
||||||
if(!intentional)
|
if(!intentional)
|
||||||
return TRUE
|
return TRUE
|
||||||
//SKYRAT EDIT CHANGE BEGIN - EMOTES - GLOBAL COOLDOWN
|
|
||||||
//if(user.emotes_used && user.emotes_used[src] + cooldown > world.time) - SKYRAT EDIT - ORIGINAL
|
if(user.emotes_used && user.emotes_used[src] + cooldown > world.time)
|
||||||
if(user.nextsoundemote > world.time)
|
var/datum/emote/default_emote = /datum/emote
|
||||||
var/datum/emote/default_emote = new /datum/emote
|
|
||||||
if(cooldown > initial(default_emote.cooldown)) // only worry about longer-than-normal emotes
|
if(cooldown > initial(default_emote.cooldown)) // only worry about longer-than-normal emotes
|
||||||
to_chat(user, span_danger("You must wait another [DisplayTimeText(user.nextsoundemote - world.time)] before using that emote."))
|
to_chat(user, span_danger("You must wait another [DisplayTimeText(user.nextsoundemote - world.time)] before using that emote."))
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|||||||
28
code/datums/quirks/positive_quirks/chip_connector.dm
Normal file
28
code/datums/quirks/positive_quirks/chip_connector.dm
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/datum/quirk/chip_connector
|
||||||
|
name = "Chip Connector"
|
||||||
|
desc = "You had a device installed that lets you manually add and remove skillchips! Just try not to get near any electromagnetic pulses."
|
||||||
|
icon = FA_ICON_PLUG
|
||||||
|
value = 4
|
||||||
|
gain_text = span_notice("You feel CONNECTED.")
|
||||||
|
lose_text = span_danger("You don't feel so CONNECTED anymore.")
|
||||||
|
medical_record_text = "Patient has a cybernetic implant on their back of their head that lets them install and remove skillchips at will. Gross."
|
||||||
|
mail_goodies = list()
|
||||||
|
var/obj/item/organ/internal/cyberimp/brain/connector/connector
|
||||||
|
|
||||||
|
/datum/quirk/chip_connector/New()
|
||||||
|
. = ..()
|
||||||
|
mail_goodies = assoc_to_keys(GLOB.quirk_chipped_choice) + /datum/quirk/chipped::mail_goodies
|
||||||
|
|
||||||
|
/datum/quirk/chip_connector/add_unique(client/client_source)
|
||||||
|
. = ..()
|
||||||
|
var/mob/living/carbon/carbon_holder = quirk_holder
|
||||||
|
if(!iscarbon(quirk_holder))
|
||||||
|
return
|
||||||
|
connector = new()
|
||||||
|
connector.Insert(carbon_holder, special = TRUE)
|
||||||
|
|
||||||
|
/datum/quirk/chip_connector/post_add()
|
||||||
|
to_chat(quirk_holder, span_boldannounce(desc)) // efficiency is clever laziness
|
||||||
|
|
||||||
|
/datum/quirk/chip_connector/remove()
|
||||||
|
qdel(connector)
|
||||||
57
code/datums/quirks/positive_quirks/chipped.dm
Normal file
57
code/datums/quirks/positive_quirks/chipped.dm
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/datum/quirk/chipped
|
||||||
|
name = "Chipped"
|
||||||
|
desc = "You got caught up in the skillchip craze a few years back, and had one of the commercially available chips implanted into yourself."
|
||||||
|
icon = FA_ICON_MICROCHIP
|
||||||
|
value = 2
|
||||||
|
gain_text = span_notice("The chip in your head itches a bit.")
|
||||||
|
lose_text = span_danger("You don't feel so chipped anymore..")
|
||||||
|
medical_record_text = "Patient explained how they got caught up in 'the skillchip chase' recently, and now the chip in they head itches every so often. Dumbass."
|
||||||
|
mail_goodies = list(
|
||||||
|
/obj/item/skillchip/matrix_taunt,
|
||||||
|
/obj/item/skillchip/big_pointer,
|
||||||
|
/obj/item/skillchip/acrobatics,
|
||||||
|
/obj/item/storage/pill_bottle/mannitol/braintumor,
|
||||||
|
)
|
||||||
|
/// Variable that holds the chip, used on removal.
|
||||||
|
var/obj/item/skillchip/installed_chip
|
||||||
|
var/datum/callback/itchy_timer
|
||||||
|
|
||||||
|
/datum/quirk_constant_data/chipped
|
||||||
|
associated_typepath = /datum/quirk/chipped
|
||||||
|
customization_options = list(/datum/preference/choiced/chipped)
|
||||||
|
|
||||||
|
/datum/quirk/chipped/add_to_holder(mob/living/new_holder, quirk_transfer, client/client_source)
|
||||||
|
var/obj/item/skillchip/chip_pref = GLOB.quirk_chipped_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/chipped)]
|
||||||
|
|
||||||
|
if(!chip_pref)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
gain_text = span_notice("The [chip_pref] in your head itches a bit.")
|
||||||
|
lose_text = span_notice("Your head stops itching so much.")
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/datum/quirk/chipped/add_unique(client/client_source)
|
||||||
|
|
||||||
|
var/preferred_chip = GLOB.quirk_chipped_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/chipped)]
|
||||||
|
if(isnull(preferred_chip)) //Client is gone or they chose a random chip
|
||||||
|
preferred_chip = GLOB.quirk_chipped_choice[pick(GLOB.quirk_chipped_choice)]
|
||||||
|
|
||||||
|
var/mob/living/carbon/quirk_holder_carbon = quirk_holder
|
||||||
|
if(iscarbon(quirk_holder))
|
||||||
|
installed_chip = new preferred_chip()
|
||||||
|
quirk_holder_carbon.implant_skillchip(installed_chip, force = TRUE)
|
||||||
|
installed_chip.try_activate_skillchip(silent = FALSE, force = TRUE)
|
||||||
|
|
||||||
|
var/obj/item/organ/internal/brain/itchy_brain = quirk_holder.get_organ_by_type(ORGAN_SLOT_BRAIN)
|
||||||
|
itchy_timer = addtimer(CALLBACK(src, PROC_REF(cause_itchy), itchy_brain), rand(5 SECONDS, 10 MINUTES)) // they get The Itch from a poor quality install every so often
|
||||||
|
|
||||||
|
/datum/quirk/chipped/remove()
|
||||||
|
qdel(installed_chip)
|
||||||
|
deltimer(itchy_timer)
|
||||||
|
. = ..()
|
||||||
|
|
||||||
|
/datum/quirk/chipped/proc/cause_itchy(obj/item/organ/internal/brain/itchy_brain)
|
||||||
|
|
||||||
|
itchy_brain.apply_organ_damage(rand(1, 5), maximum = itchy_brain.maxHealth * 0.3)
|
||||||
|
to_chat(itchy_brain.owner, span_warning("Your [itchy_brain] itches."))
|
||||||
|
itchy_timer = addtimer(CALLBACK(itchy_brain, PROC_REF(cause_itchy)), rand(5 SECONDS, 10 MINUTES)) // it will never end
|
||||||
@@ -272,7 +272,7 @@
|
|||||||
/datum/job/clown = /obj/item/organ/internal/cyberimp/brain/anti_stun, //HONK!
|
/datum/job/clown = /obj/item/organ/internal/cyberimp/brain/anti_stun, //HONK!
|
||||||
/datum/job/cook = /obj/item/organ/internal/cyberimp/chest/nutriment/plus,
|
/datum/job/cook = /obj/item/organ/internal/cyberimp/chest/nutriment/plus,
|
||||||
/datum/job/coroner = /obj/item/organ/internal/tongue/bone, //hes got a bone to pick with you
|
/datum/job/coroner = /obj/item/organ/internal/tongue/bone, //hes got a bone to pick with you
|
||||||
/datum/job/curator = /obj/item/organ/internal/eyes/robotic/glow,
|
/datum/job/curator = /obj/item/organ/internal/cyberimp/brain/connector,
|
||||||
/datum/job/detective = /obj/item/organ/internal/lungs/cybernetic/tier3,
|
/datum/job/detective = /obj/item/organ/internal/lungs/cybernetic/tier3,
|
||||||
/datum/job/doctor = /obj/item/organ/internal/cyberimp/arm/surgery,
|
/datum/job/doctor = /obj/item/organ/internal/cyberimp/arm/surgery,
|
||||||
/datum/job/geneticist = /obj/item/organ/internal/fly, //we don't care about implants, we have cancer.
|
/datum/job/geneticist = /obj/item/organ/internal/fly, //we don't care about implants, we have cancer.
|
||||||
|
|||||||
88
code/datums/status_effects/debuffs/temperature_over_time.dm
Normal file
88
code/datums/status_effects/debuffs/temperature_over_time.dm
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/**
|
||||||
|
* Affects temperature over time.
|
||||||
|
* I don't know how this wasn't a thing already.
|
||||||
|
|
||||||
|
* Incidentally: Thermal insulation is actually really bad for this, since it traps the temperature inside.
|
||||||
|
* If you're going to use this in a situation where it'd make sense for insulation to hinder its effects,
|
||||||
|
* you should to check for it manually.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/datum/status_effect/temperature_over_time
|
||||||
|
id = "temp_ot"
|
||||||
|
alert_type = null // no alert. you do the sprite
|
||||||
|
remove_on_fullheal = TRUE
|
||||||
|
on_remove_on_mob_delete = TRUE
|
||||||
|
tick_interval = 1 SECONDS
|
||||||
|
|
||||||
|
duration = 60 SECONDS
|
||||||
|
|
||||||
|
/// How much to change temperature per second.
|
||||||
|
var/temperature_value = 10
|
||||||
|
/// How much to remove from above variable per second.
|
||||||
|
var/temperature_decay = 1
|
||||||
|
/// Cap of temperature, won't apply the effect above this.
|
||||||
|
var/capped_temperature_hot = BODYTEMP_HEAT_WARNING_2
|
||||||
|
/// Cap of temperature, won't apply the effect below this.
|
||||||
|
var/capped_temperature_cold = BODYTEMP_COLD_WARNING_2
|
||||||
|
/// Effect removed outright at this temperature or above.
|
||||||
|
var/removal_temperature_hot = BODYTEMP_HEAT_WARNING_3
|
||||||
|
/// Effect removed outright at this temperature or below.
|
||||||
|
var/removal_temperature_cold = BODYTEMP_COLD_WARNING_3
|
||||||
|
|
||||||
|
/datum/status_effect/temperature_over_time/on_creation(mob/living/new_owner, duration = 10 SECONDS)
|
||||||
|
src.duration = duration
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/datum/status_effect/temperature_over_time/on_apply()
|
||||||
|
. = ..()
|
||||||
|
if((HAS_TRAIT(owner, TRAIT_RESISTHEAT) && temperature_value > 1))
|
||||||
|
qdel(src) // git out
|
||||||
|
else if((HAS_TRAIT(owner, TRAIT_RESISTCOLD) && temperature_value < 1))
|
||||||
|
qdel(src) // git out
|
||||||
|
|
||||||
|
/datum/status_effect/temperature_over_time/on_remove()
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/datum/status_effect/temperature_over_time/get_examine_text()
|
||||||
|
|
||||||
|
if(temperature_value > 0)
|
||||||
|
return "[owner.p_They()] [owner.p_are()] sweating bullets!"
|
||||||
|
|
||||||
|
return "[owner.p_They()] [owner.p_are()] shivering!"
|
||||||
|
|
||||||
|
/datum/status_effect/temperature_over_time/tick(seconds_between_ticks)
|
||||||
|
if((TRAIT_RESISTHEAT && temperature_value > 1) || (TRAIT_RESISTCOLD && temperature_value < 1))
|
||||||
|
qdel(src) // git out
|
||||||
|
return
|
||||||
|
temperaturetion(seconds_between_ticks)
|
||||||
|
|
||||||
|
/datum/status_effect/temperature_over_time/proc/temperaturetion(seconds_per_tick)
|
||||||
|
|
||||||
|
// I feel like there should be an easier way to do this but I am a fool
|
||||||
|
if(capped_temperature_hot && owner.bodytemperature > capped_temperature_hot)
|
||||||
|
return
|
||||||
|
if(capped_temperature_cold && owner.bodytemperature < capped_temperature_cold)
|
||||||
|
return
|
||||||
|
|
||||||
|
owner.adjust_bodytemperature(temperature_value * seconds_per_tick) // note that this has no softcap reduction, unlike fire
|
||||||
|
temperature_value += temperature_decay
|
||||||
|
if(temperature_value == 0)
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
if(removal_temperature_hot && owner.bodytemperature > removal_temperature_hot)
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
if(removal_temperature_cold && owner.bodytemperature < removal_temperature_cold)
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
|
||||||
|
/datum/status_effect/temperature_over_time/chip_overheat
|
||||||
|
id = "temp_ot_chip"
|
||||||
|
temperature_value = 15
|
||||||
|
temperature_decay = -0.5
|
||||||
|
duration = 15 SECONDS
|
||||||
|
capped_temperature_hot = BODYTEMP_HEAT_WARNING_3
|
||||||
|
removal_temperature_cold = BODYTEMP_COLD_WARNING_1 // internal cooling...
|
||||||
|
|
||||||
|
removal_temperature_hot = null
|
||||||
|
capped_temperature_cold = null
|
||||||
@@ -71,8 +71,6 @@
|
|||||||
/obj/effect/gibspawner/generic/animal
|
/obj/effect/gibspawner/generic/animal
|
||||||
gib_mob_type = /mob/living/basic/pet
|
gib_mob_type = /mob/living/basic/pet
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/gibspawner/human
|
/obj/effect/gibspawner/human
|
||||||
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up, /obj/effect/decal/cleanable/blood/gibs/down, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/body, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/gibs/core)
|
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up, /obj/effect/decal/cleanable/blood/gibs/down, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/body, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/gibs/core)
|
||||||
gibamounts = list(1, 1, 1, 1, 1, 1, 1)
|
gibamounts = list(1, 1, 1, 1, 1, 1, 1)
|
||||||
|
|||||||
20
code/modules/client/preferences/chipped.dm
Normal file
20
code/modules/client/preferences/chipped.dm
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/datum/preference/choiced/chipped
|
||||||
|
category = PREFERENCE_CATEGORY_MANUALLY_RENDERED
|
||||||
|
savefile_key = "chipped"
|
||||||
|
savefile_identifier = PREFERENCE_CHARACTER
|
||||||
|
|
||||||
|
/datum/preference/choiced/chipped/create_default_value()
|
||||||
|
return "Random"
|
||||||
|
|
||||||
|
/datum/preference/choiced/chipped/init_possible_values()
|
||||||
|
return list("Random") + assoc_to_keys(GLOB.quirk_chipped_choice)
|
||||||
|
|
||||||
|
/datum/preference/choiced/chipped/is_accessible(datum/preferences/preferences)
|
||||||
|
. = ..()
|
||||||
|
if (!.)
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
return /datum/quirk/chipped::name in preferences.all_quirks
|
||||||
|
|
||||||
|
/datum/preference/choiced/chipped/apply_to_human(mob/living/carbon/human/target, value)
|
||||||
|
return
|
||||||
@@ -0,0 +1,171 @@
|
|||||||
|
/obj/item/skillchip/acrobatics
|
||||||
|
name = "old F058UR7 skillchip"
|
||||||
|
desc = "A formerly cutting-edge skillchip that granted the user an advanced, Olympian-level degree of kinesthesics for flipping, spinning, and absolutely nothing else. \
|
||||||
|
It was pulled off the markets shortly after release due to users damaging the chip's integrity from excessive acrobatics, causing deadly malfunctions. It really puts the 'flop' in 'Fosbury Flop'!"
|
||||||
|
skill_name = "Spinesthetics"
|
||||||
|
skill_description = "Allows you to flip and spin at an illegal and dangerous rate."
|
||||||
|
skill_icon = FA_ICON_WHEELCHAIR_ALT
|
||||||
|
activate_message = span_notice("You suddenly have an extremely advanced and complex sense of how to spin and flip with grace.")
|
||||||
|
deactivate_message = span_notice("Your divine grasp of Spinesthesics disappears entirely.")
|
||||||
|
custom_premium_price = PAYCHECK_CREW * 4
|
||||||
|
/// set integrity to 1 when mapping for !!FUN!!
|
||||||
|
max_integrity = 100
|
||||||
|
/// list of emotes whose cd is overridden by this skillchip. can be edited in mapping or ingame
|
||||||
|
var/list/affected_emotes = list("spin", "flip")
|
||||||
|
var/datum/effect_system/spark_spread/sparks
|
||||||
|
// you can use this without lowering integrity! let's be honest. nobody's doing that
|
||||||
|
var/allowed_usage = 3
|
||||||
|
var/reload_charge = 10 SECONDS
|
||||||
|
// current particle effect used for smoking brain
|
||||||
|
var/obj/effect/abstract/particle_holder/particle_effect
|
||||||
|
|
||||||
|
/obj/item/skillchip/acrobatics/on_activate(mob/living/carbon/user, silent = FALSE)
|
||||||
|
. = ..()
|
||||||
|
RegisterSignal(user, COMSIG_MOB_EMOTE_COOLDOWN_CHECK, PROC_REF(whowee))
|
||||||
|
|
||||||
|
/obj/item/skillchip/acrobatics/on_deactivate(mob/living/carbon/user, silent)
|
||||||
|
. = ..()
|
||||||
|
UnregisterSignal(user, COMSIG_MOB_EMOTE_COOLDOWN_CHECK)
|
||||||
|
|
||||||
|
/obj/item/skillchip/acrobatics/Destroy(force)
|
||||||
|
QDEL_NULL(sparks)
|
||||||
|
QDEL_NULL(particle_effect)
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/item/skillchip/acrobatics/proc/whowee(mob/living/carbon/bozo, emote_key, emote_intentional)
|
||||||
|
SIGNAL_HANDLER
|
||||||
|
|
||||||
|
if(!(emote_key in affected_emotes))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(allowed_usage)
|
||||||
|
allowed_usage--
|
||||||
|
addtimer(CALLBACK(src, PROC_REF(charge)), reload_charge)
|
||||||
|
else
|
||||||
|
take_damage(1, sound_effect = FALSE)
|
||||||
|
|
||||||
|
if(!sparks)
|
||||||
|
sparks = new(src)
|
||||||
|
|
||||||
|
// minimum roll is by default capped at 50, with the min value lowering as integrity is reduced.
|
||||||
|
var/mintegrity = clamp(50 - (100 - get_integrity()), 1, 100)
|
||||||
|
switch(rand(mintegrity, get_integrity())) // 1 to 100 but gets worse every time
|
||||||
|
// CRIT FAIL
|
||||||
|
if(1)
|
||||||
|
bozo.visible_message(span_userdanger("[bozo]'s head suddenly explodes outwards!"))
|
||||||
|
|
||||||
|
explosion(bozo, light_impact_range = 2, adminlog = TRUE, explosion_cause = src)
|
||||||
|
// WITNESS THE GORE
|
||||||
|
for(var/mob/living/splashed in view(2, bozo))
|
||||||
|
if(bozo.has_status_effect(/datum/status_effect/grouped/blindness))
|
||||||
|
to_chat(splashed, span_userdanger("You're splashed with something"))
|
||||||
|
else
|
||||||
|
to_chat(splashed, span_userdanger("You are blinded by a shower of blood!"))
|
||||||
|
splashed.Stun(1 SECONDS)
|
||||||
|
splashed.Knockdown(2 SECONDS)
|
||||||
|
splashed.set_eye_blur_if_lower(15 SECONDS)
|
||||||
|
splashed.adjust_confusion(4 SECONDS)
|
||||||
|
|
||||||
|
// GORE
|
||||||
|
var/obj/item/bodypart/bozopart = bozo.get_bodypart(BODY_ZONE_HEAD)
|
||||||
|
if(bozopart)
|
||||||
|
var/datum/wound/cranial_fissure/crit_wound = new()
|
||||||
|
crit_wound.apply_wound(bozopart)
|
||||||
|
/*
|
||||||
|
var/list/droppage_candidates = bozo.get_organs_for_zone(BODY_ZONE_HEAD, include_children = TRUE)
|
||||||
|
if(droppage_candidates)
|
||||||
|
var/obj/thing_to_drop = pick(droppage_candidates)
|
||||||
|
thing_to_drop.forceMove(bozo.drop_location())
|
||||||
|
*/ //WHY DOESNTY IT OWRK
|
||||||
|
|
||||||
|
// does not necessarily kill you directly. instead it causes cranial fissure + something to drop from your head. could be eyes, tongue, ears, brain, even implants
|
||||||
|
new /obj/effect/gibspawner/generic(get_turf(bozo), bozo)
|
||||||
|
|
||||||
|
sparks.set_up(15, cardinals_only = FALSE, location = get_turf(src))
|
||||||
|
sparks.start()
|
||||||
|
|
||||||
|
qdel(src)
|
||||||
|
// last chance to stop
|
||||||
|
if(7 to 9)
|
||||||
|
bozo.visible_message(
|
||||||
|
span_danger("[bozo] seems to short circuit!"),
|
||||||
|
span_userdanger("Your brain short circuits!"),
|
||||||
|
)
|
||||||
|
// if they're susceptible to electrocution, confuse them
|
||||||
|
if(bozo.electrocute_act(15, bozo, 1, SHOCK_NOGLOVES|SHOCK_NOSTUN))
|
||||||
|
bozo.adjust_confusion(15 SECONDS)
|
||||||
|
bozo.set_eye_blur_if_lower(10 SECONDS)
|
||||||
|
// but the rest of the effects will happen either way
|
||||||
|
bozo.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20 - get_integrity())
|
||||||
|
|
||||||
|
sparks.set_up(5, cardinals_only = FALSE, location = get_turf(src))
|
||||||
|
sparks.start()
|
||||||
|
|
||||||
|
// brain Smoking. you should probably stop now
|
||||||
|
if(13 to 15)
|
||||||
|
// if already hot, light 'em up
|
||||||
|
var/particle_path = /particles/smoke/steam/mild
|
||||||
|
if(bozo.has_status_effect(/datum/status_effect/temperature_over_time/chip_overheat))
|
||||||
|
bozo.adjust_fire_stacks(11 - get_integrity())
|
||||||
|
bozo.ignite_mob()
|
||||||
|
bozo.visible_message(
|
||||||
|
span_danger("[bozo]'s head lights up!"),
|
||||||
|
span_userdanger("Your head hurts so much, it feels like it's on fire!"),
|
||||||
|
)
|
||||||
|
ASYNC
|
||||||
|
bozo.emote("scream")
|
||||||
|
if(particle_effect?.type == particle_path)
|
||||||
|
return
|
||||||
|
particle_path = /particles/smoke/steam/bad
|
||||||
|
else
|
||||||
|
bozo.visible_message(
|
||||||
|
span_danger("[bozo]'s head starts smoking!"),
|
||||||
|
span_userdanger("Your brain feels like it's on fire!"),
|
||||||
|
)
|
||||||
|
|
||||||
|
// increase smokiness if already smoking
|
||||||
|
if(particle_effect?.type == /particles/smoke/steam/mild)
|
||||||
|
particle_path = /particles/smoke/steam
|
||||||
|
else
|
||||||
|
particle_path = /particles/smoke/steam/mild
|
||||||
|
|
||||||
|
bozo.adjust_confusion(4 SECONDS)
|
||||||
|
bozo.set_eye_blur_if_lower(3 SECONDS)
|
||||||
|
|
||||||
|
particle_effect = new(bozo, particle_path)
|
||||||
|
// roughly head position.
|
||||||
|
// dont know how to make this not hardcoded
|
||||||
|
particle_effect.set_particle_position(-2, 12, 0)
|
||||||
|
bozo.apply_status_effect(/datum/status_effect/temperature_over_time/chip_overheat, 15 SECONDS)
|
||||||
|
QDEL_IN(particle_effect, 15 SECONDS)
|
||||||
|
|
||||||
|
sparks.set_up(10, cardinals_only = FALSE, location = get_turf(src))
|
||||||
|
sparks.start()
|
||||||
|
|
||||||
|
// hey, something isn't right...
|
||||||
|
if(16 to 50)
|
||||||
|
bozo.visible_message(
|
||||||
|
span_warning("[bozo]'s head sparks."),
|
||||||
|
)
|
||||||
|
|
||||||
|
sparks.set_up(rand(1,2), cardinals_only = TRUE, location = get_turf(src))
|
||||||
|
sparks.start()
|
||||||
|
|
||||||
|
return COMPONENT_EMOTE_COOLDOWN_BYPASS
|
||||||
|
|
||||||
|
/obj/item/skillchip/acrobatics/proc/charge()
|
||||||
|
allowed_usage++
|
||||||
|
|
||||||
|
/obj/item/skillchip/acrobatics/kiss
|
||||||
|
name = "prototype N. 807 - K1SS skillchip"
|
||||||
|
desc = "An idle experiment when developing skillchips led to this catastrophe. Everyone involved swore to keep it a secret until death, but it looks like someone has let loose this mistake into the world."
|
||||||
|
skill_name = "ERROERERROROROEROEORROER"
|
||||||
|
skill_description = "NULL DESCRIPTION NOT FOUND"
|
||||||
|
skill_icon = FA_ICON_KISS_BEAM
|
||||||
|
activate_message = span_userdanger("This was a mistake.")
|
||||||
|
deactivate_message = span_userdanger("The mistake is over.")
|
||||||
|
custom_premium_price = PAYCHECK_CREW * 500
|
||||||
|
max_integrity = 25
|
||||||
|
affected_emotes = list("kiss")
|
||||||
|
allowed_usage = 1
|
||||||
|
reload_charge = 30 SECONDS
|
||||||
@@ -150,7 +150,8 @@
|
|||||||
) = 9,
|
) = 9,
|
||||||
// Brain / Head
|
// Brain / Head
|
||||||
list(
|
list(
|
||||||
/obj/item/organ/internal/cyberimp/brain/anti_drop = 100,
|
/obj/item/organ/internal/cyberimp/brain/anti_drop = 50,
|
||||||
|
/obj/item/organ/internal/cyberimp/brain/connector = 50,
|
||||||
/obj/item/organ/internal/cyberimp/brain/anti_stun = 10,
|
/obj/item/organ/internal/cyberimp/brain/anti_stun = 10,
|
||||||
) = 10,
|
) = 10,
|
||||||
// Misc
|
// Misc
|
||||||
|
|||||||
@@ -592,6 +592,23 @@
|
|||||||
)
|
)
|
||||||
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
|
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
|
||||||
|
|
||||||
|
/datum/design/cyberimp_connector
|
||||||
|
name = "CNS Skillchip Connector Implant"
|
||||||
|
desc = "This cybernetic adds a port to the back of your head, where you can remove or add skillchips at will."
|
||||||
|
id = "ci-connector"
|
||||||
|
build_type = PROTOLATHE | AWAY_LATHE | MECHFAB
|
||||||
|
construction_time = 6 SECONDS
|
||||||
|
materials = list(
|
||||||
|
/datum/material/iron = SMALL_MATERIAL_AMOUNT*6,
|
||||||
|
/datum/material/glass = SMALL_MATERIAL_AMOUNT*6,
|
||||||
|
/datum/material/titanium = SMALL_MATERIAL_AMOUNT*3,
|
||||||
|
)
|
||||||
|
build_path = /obj/item/organ/internal/cyberimp/brain/connector
|
||||||
|
category = list(
|
||||||
|
RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_MISC
|
||||||
|
)
|
||||||
|
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
|
||||||
|
|
||||||
/datum/design/cyberimp_nutriment
|
/datum/design/cyberimp_nutriment
|
||||||
name = "Nutriment Pump Implant"
|
name = "Nutriment Pump Implant"
|
||||||
desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
|
desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
|
||||||
|
|||||||
@@ -162,6 +162,7 @@
|
|||||||
"ci-nutriment",
|
"ci-nutriment",
|
||||||
"ci-thrusters",
|
"ci-thrusters",
|
||||||
"ci-herculean",
|
"ci-herculean",
|
||||||
|
"ci-connector",
|
||||||
)
|
)
|
||||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS)
|
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS)
|
||||||
announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL)
|
announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL)
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
icon_state = "brain_implant_antidrop"
|
icon_state = "brain_implant_antidrop"
|
||||||
var/active = FALSE
|
var/active = FALSE
|
||||||
var/list/stored_items = list()
|
var/list/stored_items = list()
|
||||||
slot = ORGAN_SLOT_BRAIN_ANTIDROP
|
slot = ORGAN_SLOT_BRAIN_CEREBELLUM
|
||||||
actions_types = list(/datum/action/item_action/organ_action/toggle)
|
actions_types = list(/datum/action/item_action/organ_action/toggle)
|
||||||
|
|
||||||
/obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click()
|
/obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click()
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
name = "CNS rebooter implant"
|
name = "CNS rebooter implant"
|
||||||
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
|
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
|
||||||
icon_state = "brain_implant_rebooter"
|
icon_state = "brain_implant_rebooter"
|
||||||
slot = ORGAN_SLOT_BRAIN_ANTISTUN
|
slot = ORGAN_SLOT_BRAIN_CNS
|
||||||
|
|
||||||
var/static/list/signalCache = list(
|
var/static/list/signalCache = list(
|
||||||
COMSIG_LIVING_STATUS_STUN,
|
COMSIG_LIVING_STATUS_STUN,
|
||||||
@@ -179,6 +179,107 @@
|
|||||||
organ_flags &= ~ORGAN_FAILING
|
organ_flags &= ~ORGAN_FAILING
|
||||||
implant_ready()
|
implant_ready()
|
||||||
|
|
||||||
|
/obj/item/organ/internal/cyberimp/brain/connector
|
||||||
|
name = "CNS skillchip connector implant"
|
||||||
|
desc = "This cybernetic adds a port to the back of your head, where you can remove or add skillchips at will."
|
||||||
|
icon_state = "brain_implant_connector"
|
||||||
|
slot = ORGAN_SLOT_BRAIN_CNS
|
||||||
|
actions_types = list(/datum/action/item_action/organ_action/use)
|
||||||
|
|
||||||
|
/obj/item/organ/internal/cyberimp/brain/connector/ui_action_click()
|
||||||
|
|
||||||
|
to_chat(owner, span_warning("You start fiddling around with [src]..."))
|
||||||
|
playsound(owner, 'sound/items/taperecorder/tape_flip.ogg', 20, vary = TRUE) // asmr
|
||||||
|
|
||||||
|
if(!do_after(owner, 1.5 SECONDS, owner)) // othwerwise it doesnt appear
|
||||||
|
to_chat(owner, span_warning("You were interrupted!"))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(organ_flags & ORGAN_FAILING)
|
||||||
|
var/holy_shit_my_brain = remove_brain()
|
||||||
|
if(holy_shit_my_brain)
|
||||||
|
to_chat(owner, span_warning("You take [holy_shit_my_brain] out of [src]. You stare at it for a moment in confusion."))
|
||||||
|
return
|
||||||
|
|
||||||
|
var/obj/item/skillchip/skillchip = owner.get_active_held_item()
|
||||||
|
if(skillchip)
|
||||||
|
if(istype(skillchip, /obj/item/skillchip))
|
||||||
|
insert_skillchip(skillchip)
|
||||||
|
else
|
||||||
|
to_chat(owner, span_warning("You try to insert [owner.get_active_held_item()] into [src], but it won't fit!")) // make it kill you if you shove a crayon inside or something
|
||||||
|
else // no inhand item, assume removal
|
||||||
|
var/obj/item/organ/internal/brain/chippy_brain = owner.get_organ_by_type(/obj/item/organ/internal/brain)
|
||||||
|
if(!chippy_brain)
|
||||||
|
CRASH("we using a brain implant wit no brain")
|
||||||
|
remove_skillchip(chippy_brain)
|
||||||
|
|
||||||
|
/obj/item/organ/internal/cyberimp/brain/connector/proc/insert_skillchip(obj/item/skillchip/skillchip)
|
||||||
|
var/fail_string = owner.implant_skillchip(skillchip, force = FALSE)
|
||||||
|
if(fail_string)
|
||||||
|
to_chat(owner, span_warning(fail_string))
|
||||||
|
playsound(owner, 'sound/machines/buzz/buzz-sigh.ogg', 10, vary = TRUE)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/refail_string = skillchip.try_activate_skillchip(silent = FALSE, force = FALSE)
|
||||||
|
if(refail_string)
|
||||||
|
to_chat(owner, span_warning(fail_string))
|
||||||
|
playsound(owner, 'sound/machines/buzz/buzz-two.ogg', 10, vary = TRUE)
|
||||||
|
return
|
||||||
|
|
||||||
|
// success!
|
||||||
|
playsound(owner, 'sound/machines/chime.ogg', 10, vary = TRUE)
|
||||||
|
|
||||||
|
/obj/item/organ/internal/cyberimp/brain/connector/proc/remove_skillchip(obj/item/organ/internal/brain/chippy_brain)
|
||||||
|
var/obj/item/skillchip/skillchip = show_radial_menu(owner, owner, chippy_brain.skillchips)
|
||||||
|
if(skillchip)
|
||||||
|
owner.remove_skillchip(skillchip, silent = FALSE)
|
||||||
|
skillchip.forceMove(owner.drop_location())
|
||||||
|
owner.put_in_hands(skillchip, del_on_fail = FALSE)
|
||||||
|
playsound(owner, 'sound/machines/click.ogg', 10, vary = TRUE)
|
||||||
|
to_chat(owner, span_warning("You take [skillchip] out of [src]."))
|
||||||
|
return
|
||||||
|
|
||||||
|
to_chat(owner, span_warning("Your brain is empty!")) // heh
|
||||||
|
|
||||||
|
/obj/item/organ/internal/cyberimp/brain/connector/emp_act(severity)
|
||||||
|
. = ..()
|
||||||
|
if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF)
|
||||||
|
return
|
||||||
|
organ_flags |= ORGAN_FAILING
|
||||||
|
var/loops = 1
|
||||||
|
if(severity != EMP_LIGHT)
|
||||||
|
loops = 2
|
||||||
|
for(var/i in 1 to loops)
|
||||||
|
// you either lose a chip or a bit of your brain
|
||||||
|
owner.visible_message(span_warning("Something falls to the ground from behind [owner]'s head."),\
|
||||||
|
span_boldwarning("You feel something fall off from behind your head."))
|
||||||
|
var/obj/item/organ/internal/brain/chippy_brain = owner.get_organ_by_type(ORGAN_SLOT_BRAIN)
|
||||||
|
var/obj/item/skillchip/skillchip = chippy_brain?.skillchips[1]
|
||||||
|
if(skillchip)
|
||||||
|
owner.remove_skillchip(skillchip, silent = TRUE)
|
||||||
|
skillchip.forceMove(owner.drop_location())
|
||||||
|
playsound(owner, 'sound/machines/terminal/terminal_eject.ogg', 25, TRUE)
|
||||||
|
else
|
||||||
|
remove_brain()
|
||||||
|
addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity)
|
||||||
|
|
||||||
|
/obj/item/organ/internal/cyberimp/brain/connector/proc/remove_brain(obj/item/organ/internal/brain/chippy_brain, severity = 1)
|
||||||
|
playsound(owner, 'sound/effects/meatslap.ogg', 25, TRUE)
|
||||||
|
if(!chippy_brain)
|
||||||
|
return
|
||||||
|
chippy_brain.apply_organ_damage(20 * severity)
|
||||||
|
chippy_brain.maxHealth -= 15 * severity // a bit of your brain fell off. again.
|
||||||
|
if(chippy_brain.damage >= chippy_brain.maxHealth)
|
||||||
|
chippy_brain.forceMove(owner.drop_location())
|
||||||
|
owner.visible_message(span_userdanger("[owner]'s brain falls off the back of [owner.p_their()] head!!!"), span_boldwarning("You feel like you're missing something."))
|
||||||
|
return chippy_brain
|
||||||
|
|
||||||
|
new /obj/effect/decal/cleanable/blood/gibs/up(get_turf(owner))
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
/obj/item/organ/internal/cyberimp/brain/connector/proc/reboot()
|
||||||
|
organ_flags &= ~ORGAN_FAILING
|
||||||
|
|
||||||
//[[[[MOUTH]]]]
|
//[[[[MOUTH]]]]
|
||||||
/obj/item/organ/internal/cyberimp/mouth
|
/obj/item/organ/internal/cyberimp/mouth
|
||||||
zone = BODY_ZONE_PRECISE_MOUTH
|
zone = BODY_ZONE_PRECISE_MOUTH
|
||||||
|
|||||||
@@ -97,6 +97,7 @@
|
|||||||
/obj/item/clothing/shoes/wheelys/skishoes = 4,
|
/obj/item/clothing/shoes/wheelys/skishoes = 4,
|
||||||
/obj/item/instrument/musicalmoth = 1,
|
/obj/item/instrument/musicalmoth = 1,
|
||||||
/obj/item/gun/ballistic/revolver/russian = 1, //the most dangerous game
|
/obj/item/gun/ballistic/revolver/russian = 1, //the most dangerous game
|
||||||
|
/obj/item/skillchip/acrobatics = 1,
|
||||||
)
|
)
|
||||||
premium = list(
|
premium = list(
|
||||||
/obj/item/disk/holodisk = 5,
|
/obj/item/disk/holodisk = 5,
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 41 KiB |
@@ -55,7 +55,6 @@
|
|||||||
clothing_flags = MASKINTERNALS
|
clothing_flags = MASKINTERNALS
|
||||||
flags_cover = MASKCOVERSEYES
|
flags_cover = MASKCOVERSEYES
|
||||||
resistance_flags = FLAMMABLE
|
resistance_flags = FLAMMABLE
|
||||||
has_fov = FALSE
|
|
||||||
greyscale_config = /datum/greyscale_config/clown_mask
|
greyscale_config = /datum/greyscale_config/clown_mask
|
||||||
greyscale_config_worn = /datum/greyscale_config/clown_mask/worn
|
greyscale_config_worn = /datum/greyscale_config/clown_mask/worn
|
||||||
greyscale_colors = "#FFFFFF#F20018#0000FF#00CC00"
|
greyscale_colors = "#FFFFFF#F20018#0000FF#00CC00"
|
||||||
@@ -80,7 +79,6 @@
|
|||||||
icon_state = "respirator"
|
icon_state = "respirator"
|
||||||
inhand_icon_state = "sechailer"
|
inhand_icon_state = "sechailer"
|
||||||
w_class = WEIGHT_CLASS_SMALL
|
w_class = WEIGHT_CLASS_SMALL
|
||||||
has_fov = FALSE
|
|
||||||
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
|
||||||
flags_inv = HIDEFACIALHAIR|HIDESNOUT
|
flags_inv = HIDEFACIALHAIR|HIDESNOUT
|
||||||
flags_cover = MASKCOVERSMOUTH
|
flags_cover = MASKCOVERSMOUTH
|
||||||
|
|||||||
@@ -1918,6 +1918,8 @@
|
|||||||
#include "code\datums\quirks\positive_quirks\alcohol_tolerance.dm"
|
#include "code\datums\quirks\positive_quirks\alcohol_tolerance.dm"
|
||||||
#include "code\datums\quirks\positive_quirks\apathetic.dm"
|
#include "code\datums\quirks\positive_quirks\apathetic.dm"
|
||||||
#include "code\datums\quirks\positive_quirks\bilingual.dm"
|
#include "code\datums\quirks\positive_quirks\bilingual.dm"
|
||||||
|
#include "code\datums\quirks\positive_quirks\chip_connector.dm"
|
||||||
|
#include "code\datums\quirks\positive_quirks\chipped.dm"
|
||||||
#include "code\datums\quirks\positive_quirks\clown_enjoyer.dm"
|
#include "code\datums\quirks\positive_quirks\clown_enjoyer.dm"
|
||||||
#include "code\datums\quirks\positive_quirks\drunk_healing.dm"
|
#include "code\datums\quirks\positive_quirks\drunk_healing.dm"
|
||||||
#include "code\datums\quirks\positive_quirks\empath.dm"
|
#include "code\datums\quirks\positive_quirks\empath.dm"
|
||||||
@@ -2030,6 +2032,7 @@
|
|||||||
#include "code\datums\status_effects\debuffs\stamcrit.dm"
|
#include "code\datums\status_effects\debuffs\stamcrit.dm"
|
||||||
#include "code\datums\status_effects\debuffs\static_vision.dm"
|
#include "code\datums\status_effects\debuffs\static_vision.dm"
|
||||||
#include "code\datums\status_effects\debuffs\strandling.dm"
|
#include "code\datums\status_effects\debuffs\strandling.dm"
|
||||||
|
#include "code\datums\status_effects\debuffs\temperature_over_time.dm"
|
||||||
#include "code\datums\status_effects\debuffs\terrified.dm"
|
#include "code\datums\status_effects\debuffs\terrified.dm"
|
||||||
#include "code\datums\status_effects\debuffs\tower_of_babel.dm"
|
#include "code\datums\status_effects\debuffs\tower_of_babel.dm"
|
||||||
#include "code\datums\status_effects\debuffs\tox_vomit.dm"
|
#include "code\datums\status_effects\debuffs\tox_vomit.dm"
|
||||||
@@ -3897,6 +3900,7 @@
|
|||||||
#include "code\modules\client\preferences\blindfold_color.dm"
|
#include "code\modules\client\preferences\blindfold_color.dm"
|
||||||
#include "code\modules\client\preferences\body_type.dm"
|
#include "code\modules\client\preferences\body_type.dm"
|
||||||
#include "code\modules\client\preferences\broadcast_login_logout.dm"
|
#include "code\modules\client\preferences\broadcast_login_logout.dm"
|
||||||
|
#include "code\modules\client\preferences\chipped.dm"
|
||||||
#include "code\modules\client\preferences\clothing.dm"
|
#include "code\modules\client\preferences\clothing.dm"
|
||||||
#include "code\modules\client\preferences\darkened_flash.dm"
|
#include "code\modules\client\preferences\darkened_flash.dm"
|
||||||
#include "code\modules\client\preferences\food_allergy.dm"
|
#include "code\modules\client\preferences\food_allergy.dm"
|
||||||
@@ -4632,6 +4636,7 @@
|
|||||||
#include "code\modules\library\random_books.dm"
|
#include "code\modules\library\random_books.dm"
|
||||||
#include "code\modules\library\skill_learning\skill_station.dm"
|
#include "code\modules\library\skill_learning\skill_station.dm"
|
||||||
#include "code\modules\library\skill_learning\skillchip.dm"
|
#include "code\modules\library\skill_learning\skillchip.dm"
|
||||||
|
#include "code\modules\library\skill_learning\generic_skillchips\acrobatics.dm"
|
||||||
#include "code\modules\library\skill_learning\generic_skillchips\matrix_taunt.dm"
|
#include "code\modules\library\skill_learning\generic_skillchips\matrix_taunt.dm"
|
||||||
#include "code\modules\library\skill_learning\generic_skillchips\misc.dm"
|
#include "code\modules\library\skill_learning\generic_skillchips\misc.dm"
|
||||||
#include "code\modules\library\skill_learning\generic_skillchips\musical.dm"
|
#include "code\modules\library\skill_learning\generic_skillchips\musical.dm"
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import { FeatureIconnedDropdownInput, FeatureWithIcons } from '../dropdowns';
|
||||||
|
|
||||||
|
export const chipped: FeatureWithIcons<string> = {
|
||||||
|
name: 'Chipped',
|
||||||
|
component: FeatureIconnedDropdownInput,
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user