From 9bb3ba5c5af424f6ea8542996e362277976c8f12 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 8 Aug 2020 00:08:43 -0700 Subject: [PATCH 1/2] added ethereals --- code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/is_helpers.dm | 1 + code/__DEFINES/mobs.dm | 10 + code/__HELPERS/mobs.dm | 7 + code/__HELPERS/names.dm | 6 + code/__HELPERS/text.dm | 4 + code/_globalvars/lists/names.dm | 1 + code/_onclick/hud/alert.dm | 10 + code/datums/components/mood.dm | 20 ++ code/datums/mood_events/needs_events.dm | 21 ++ code/game/machinery/rechargestation.dm | 17 +- code/game/objects/items/trash.dm | 4 + code/modules/admin/topic.dm | 14 +- .../food_and_drinks/food/snacks/meat.dm | 8 + .../food_and_drinks/food/snacks_vend.dm | 10 + code/modules/language/language_holder.dm | 6 + code/modules/language/voltaic.dm | 14 ++ code/modules/mob/living/carbon/human/human.dm | 5 +- .../mob/living/carbon/human/species.dm | 15 +- .../carbon/human/species_types/ethereal.dm | 182 ++++++++++++++++++ .../human/species_types/shadowpeople.dm | 2 + .../modules/mob/living/silicon/robot/robot.dm | 11 ++ code/modules/power/apc.dm | 40 ++++ code/modules/power/cell.dm | 21 ++ code/modules/power/lighting.dm | 13 +- .../chemistry/reagents/food_reagents.dm | 4 +- code/modules/surgery/organs/stomach.dm | 33 ++++ code/modules/surgery/organs/tongue.dm | 23 +++ code/modules/vending/snack.dm | 3 +- config/game_options.txt | 1 + icons/misc/language.dmi | Bin 5313 -> 5468 bytes icons/obj/food/food.dmi | Bin 83956 -> 84510 bytes icons/obj/janitor.dmi | Bin 27603 -> 27975 bytes sound/weapons/etherealhit.ogg | Bin 0 -> 8696 bytes sound/weapons/etherealmiss.ogg | Bin 0 -> 8105 bytes strings/names/ethereal.txt | 38 ++++ tgstation.dme | 2 + 37 files changed, 524 insertions(+), 24 deletions(-) create mode 100644 code/modules/language/voltaic.dm create mode 100644 code/modules/mob/living/carbon/human/species_types/ethereal.dm create mode 100644 sound/weapons/etherealhit.ogg create mode 100644 sound/weapons/etherealmiss.ogg create mode 100644 strings/names/ethereal.txt diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 7e1a83486d..da1794db50 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -209,6 +209,8 @@ #define COMSIG_MOB_SWAP_HANDS "mob_swap_hands" //from base of mob/swap_hand(): (obj/item) #define COMPONENT_BLOCK_SWAP 1 +#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" + // /client signals #define COMSIG_MOB_CLIENT_LOGIN "mob_client_login" //sent when a mob/login() finishes: (client) #define COMSIG_MOB_CLIENT_LOGOUT "mob_client_logout" //sent when a mob/logout() starts: (client) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 3aa5a07480..d66521d945 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -74,6 +74,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define ismush(A) (is_species(A, /datum/species/mush)) #define isshadow(A) (is_species(A, /datum/species/shadow)) #define isskeleton(A) (is_species(A, /datum/species/skeleton)) +#define isethereal(A) (is_species(A, /datum/species/ethereal)) // Citadel specific species #define isipcperson(A) (is_species(A, /datum/species/ipc)) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 52657e9104..782095f883 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -176,6 +176,15 @@ #define DISGUST_LEVEL_VERYGROSS 50 #define DISGUST_LEVEL_GROSS 25 +//Charge levels for Ethereals +#define ETHEREAL_CHARGE_NONE 0 +#define ETHEREAL_CHARGE_LOWPOWER 20 +#define ETHEREAL_CHARGE_NORMAL 50 +#define ETHEREAL_CHARGE_ALMOSTFULL 75 +#define ETHEREAL_CHARGE_FULL 100 +#define ETHEREAL_CHARGE_OVERLOAD 125 +#define ETHEREAL_CHARGE_DANGEROUS 150 + //Slime evolution threshold. Controls how fast slimes can split/grow #define SLIME_EVOLUTION_THRESHOLD 10 @@ -284,6 +293,7 @@ #define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you #define HUNGER_FACTOR 0.1 //factor at which mob nutrition decreases +#define ETHEREAL_CHARGE_FACTOR 0.08 //factor at which ethereal's charge decreases #define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default. #define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index ca12567b59..c4964022e5 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -264,6 +264,13 @@ if(!findname(.)) break +/proc/random_unique_ethereal_name(attempts_to_find_unique_name=10) + for(var/i in 1 to attempts_to_find_unique_name) + . = capitalize(ethereal_name()) + + if(!findname(.)) + break + /proc/random_unique_moth_name(attempts_to_find_unique_name=10) for(var/i in 1 to attempts_to_find_unique_name) . = capitalize(pick(GLOB.moth_first)) + " " + capitalize(pick(GLOB.moth_last)) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 8b699e3eee..e1848b21a2 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -4,6 +4,12 @@ else return "[pick(GLOB.lizard_names_female)]-[pick(GLOB.lizard_names_female)]" +/proc/ethereal_name() + var/tempname = "[pick(GLOB.ethereal_names)] [random_capital_letter()]" + if(prob(65)) + tempname += random_capital_letter() + return tempname + /proc/plasmaman_name() return "[pick(GLOB.plasmaman_names)] \Roman[rand(1,99)]" diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 6dfb685331..7c251edd88 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -776,6 +776,10 @@ GLOBAL_LIST_INIT(binary, list("0","1")) else return "[number]\th" + +/proc/random_capital_letter() + return uppertext(pick(GLOB.alphabet)) + /proc/unintelligize(message) var/regex/word_boundaries = regex(@"\b[\S]+\b", "g") var/prefix = message[1] diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index e334d08040..b80fcf0bbf 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -17,6 +17,7 @@ GLOBAL_LIST_INIT(golem_names, world.file2list("strings/names/golem.txt")) GLOBAL_LIST_INIT(moth_first, world.file2list("strings/names/moth_first.txt")) GLOBAL_LIST_INIT(moth_last, world.file2list("strings/names/moth_last.txt")) GLOBAL_LIST_INIT(plasmaman_names, world.file2list("strings/names/plasmaman.txt")) +GLOBAL_LIST_INIT(ethereal_names, world.file2list("strings/names/ethereal.txt")) GLOBAL_LIST_INIT(posibrain_names, world.file2list("strings/names/posibrain.txt")) GLOBAL_LIST_INIT(nightmare_names, world.file2list("strings/names/nightmare.txt")) GLOBAL_LIST_INIT(megacarp_first_names, world.file2list("strings/names/megacarp1.txt")) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 8111680c41..6dc1433bc8 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -493,6 +493,16 @@ Recharging stations are available in robotics, the dormitory bathrooms, and the desc = "Unit's power cell is running low. Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." icon_state = "lowcell" +/obj/screen/alert/etherealcharge + name = "Low Blood Charge" + desc = "Your blood's electric charge is running low, find a source of charge for your blood. Use a recharging station found in robotics or the dormitory bathrooms, or eat some Ethereal-friendly food." + icon_state = "etherealcharge" + +/obj/screen/alert/ethereal_overcharge + name = "Blood Overcharge" + desc = "Your blood's electric charge is becoming dangerously high, find an outlet for your energy. Use Grab Intent on an APC to channel your energy into it." + icon_state = "ethereal_overcharge" + //Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg /obj/screen/alert/hacked name = "Hacked" diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 90fea9ec8a..87bc681651 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -307,6 +307,10 @@ /datum/component/mood/proc/HandleNutrition(mob/living/L) + if(isethereal(L)) + HandleCharge(L) + if(HAS_TRAIT(L, TRAIT_NOHUNGER)) + return FALSE //no mood events for nutrition switch(L.nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) add_event(null, "nutrition", /datum/mood_event/fat) @@ -321,6 +325,22 @@ if(0 to NUTRITION_LEVEL_STARVING) add_event(null, "nutrition", /datum/mood_event/starving) +/datum/component/mood/proc/HandleCharge(mob/living/carbon/human/H) + var/datum/species/ethereal/E = H.dna.species + switch(E.get_charge(H)) + if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER) + add_event(null, "charge", /datum/mood_event/decharged) + if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL) + add_event(null, "charge", /datum/mood_event/lowpower) + if(ETHEREAL_CHARGE_NORMAL to ETHEREAL_CHARGE_ALMOSTFULL) + clear_event(null, "charge") + if(ETHEREAL_CHARGE_ALMOSTFULL to ETHEREAL_CHARGE_FULL) + add_event(null, "charge", /datum/mood_event/charged) + if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD) + add_event(null, "charge", /datum/mood_event/overcharged) + if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS) + add_event(null, "charge", /datum/mood_event/supercharged) + /datum/component/mood/proc/update_beauty(area/A) if(A.outdoors) //if we're outside, we don't care. clear_event(null, "area_beauty") diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm index 962681eb94..b307bcb0aa 100644 --- a/code/datums/mood_events/needs_events.dm +++ b/code/datums/mood_events/needs_events.dm @@ -19,6 +19,27 @@ description = "I'm starving!\n" mood_change = -15 +//charge +/datum/mood_event/supercharged + description = "I can't possibly keep all this power inside, I need to release some quick!\n" + mood_change = -10 + +/datum/mood_event/overcharged + description = "I feel dangerously overcharged, perhaps I should release some power.\n" + mood_change = -4 + +/datum/mood_event/charged + description = "I feel the power in my veins!\n" + mood_change = 6 + +/datum/mood_event/lowpower + description = "My power is running low, I should go charge up somewhere.\n" + mood_change = -6 + +/datum/mood_event/decharged + description = "I'm in desperate need of some electricity!\n" + mood_change = -10 + //Disgust /datum/mood_event/gross description = "I saw something gross.\n" diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index bbafe99006..0accd0994c 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -126,17 +126,6 @@ update_icon() /obj/machinery/recharge_station/proc/process_occupant() - if(occupant && iscyborg(occupant)) - var/mob/living/silicon/robot/R = occupant - restock_modules() - if(repairs) - R.heal_bodypart_damage(repairs, repairs - 1) - if(R.cell) - R.cell.charge = min(R.cell.charge + recharge_speed, R.cell.maxcharge) - -/obj/machinery/recharge_station/proc/restock_modules() - if(occupant) - var/mob/living/silicon/robot/R = occupant - if(R && R.module) - var/coeff = recharge_speed * 0.005 - R.module.respawn_consumable(R, coeff) + if(!occupant) + return + SEND_SIGNAL(occupant, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, recharge_speed, repairs) diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 4c6bcc08b4..2109d1038e 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -35,6 +35,10 @@ name = "syndi-cakes" icon_state = "syndi_cakes" +/obj/item/trash/energybar + name = "energybar wrapper" + icon_state = "energybar" + /obj/item/trash/waffles name = "waffles tray" icon_state = "waffles" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 41c3fe5105..13e8877440 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2184,8 +2184,18 @@ if(!ishuman(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human.") return - - var/obj/item/reagent_containers/food/snacks/cookie/cookie = new(H) + //let's keep it simple + //milk to plasmemes and skeletons, meat to lizards, electricity bars to ethereals, cookies to everyone else + var/cookiealt = /obj/item/reagent_containers/food/snacks/cookie + if(isskeleton(H)) + cookiealt = /obj/item/reagent_containers/food/condiment/milk + else if(isplasmaman(H)) + cookiealt = /obj/item/reagent_containers/food/condiment/milk + else if(isethereal(H)) + cookiealt = /obj/item/reagent_containers/food/snacks/energybar + else if(islizard(H)) + cookiealt = /obj/item/reagent_containers/food/snacks/meat/slab + var/obj/item/cookie = new cookiealt(H) if(H.put_in_hands(cookie)) H.update_inv_hands() else diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index fe70739ab5..4d287fdb86 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -162,6 +162,14 @@ tastes = list("brains" = 1, "meat" = 1) foodtype = RAW | MEAT | TOXIC +/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ethereal + icon_state = "etherealmeat" + desc = "So shiny you feel like ingesting it might make you shine too" + filling_color = "#97ee63" + list_reagents = list(/datum/reagent/consumable/liquidelectricity = 3) + tastes = list("pure electricity" = 2, "meat" = 1) + foodtype = RAW | MEAT | TOXIC + /obj/item/reagent_containers/food/snacks/carpmeat/aquatic name = "fillet" desc = "A fillet of one of the local water dwelling species." diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm index 38f7ecf5b1..b4c7c89b74 100644 --- a/code/modules/food_and_drinks/food/snacks_vend.dm +++ b/code/modules/food_and_drinks/food/snacks_vend.dm @@ -91,3 +91,13 @@ tastes = list("sweetness" = 3, "cake" = 1) foodtype = GRAIN | FRUIT | VEGETABLES custom_price = PRICE_CHEAP + +/obj/item/reagent_containers/food/snacks/energybar + name = "High-power energy bars" + icon_state = "energybar" + desc = "An energy bar with a lot of punch, you probably shouldn't eat this if you're not an Ethereal." + trash = /obj/item/trash/energybar + list_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/liquidelectricity = 3) + filling_color = "#97ee63" + tastes = list("pure electricity" = 3, "fitness" = 2) + foodtype = TOXIC diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 55e9352843..c1677117e9 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -324,6 +324,12 @@ Key procs /datum/language/sylvan = list(LANGUAGE_ATOM)) spoken_languages = list(/datum/language/sylvan = list(LANGUAGE_ATOM)) +/datum/language_holder/ethereal + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/voltaic = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/voltaic = list(LANGUAGE_ATOM)) + /datum/language_holder/empty understood_languages = list() spoken_languages = list() diff --git a/code/modules/language/voltaic.dm b/code/modules/language/voltaic.dm new file mode 100644 index 0000000000..ead7fe7c7f --- /dev/null +++ b/code/modules/language/voltaic.dm @@ -0,0 +1,14 @@ +// One of these languages will actually work, I'm certain of it. +/datum/language/voltaic + name = "Voltaic" + desc = "A sparky language made by manipulating electrical discharge." + key = "v" + space_chance = 20 + syllables = list( + "bzzt", "skrrt", "zzp", "mmm", "hzz", "tk", "shz", "k", "z", + "bzt", "zzt", "skzt", "skzz", "hmmt", "zrrt", "hzzt", "hz", + "vzt", "zt", "vz", "zip", "tzp", "lzzt", "dzzt", "zdt", "kzt", + "zzzz", "mzz" + ) + icon_state = "volt" + default_priority = 90 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b402260611..38b420aaba 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1042,7 +1042,7 @@ /mob/living/carbon/human/updatehealth() . = ..() - + dna?.species.spec_updatehealth(src) if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN)) //if we want to ignore slowdown from damage and equipment remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) @@ -1199,6 +1199,9 @@ /mob/living/carbon/human/species/lizard race = /datum/species/lizard +/mob/living/carbon/human/species/ethereal + race = /datum/species/ethereal + /mob/living/carbon/human/species/lizard/ashwalker race = /datum/species/lizard/ashwalker diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index dc7fe86aca..eae4757866 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -56,6 +56,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/list/mutant_organs = list() //Internal organs that are unique to this race. var/speedmod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster var/armor = 0 // overall defense for the race... or less defense, if it's negative. + var/attack_type = BRUTE // the type of damage unarmed attacks from this species do var/brutemod = 1 // multiplier for brute damage var/burnmod = 1 // multiplier for burn damage var/coldmod = 1 // multiplier for cold damage @@ -1364,6 +1365,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80 if(hungry >= 70) H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50)) + else if(isethereal(H)) + var/datum/species/ethereal/E = H.dna.species + if(E.get_charge(H) <= ETHEREAL_CHARGE_NORMAL) + H.add_movespeed_modifier(MOVESPEED_ID_HUNGRY, override = TRUE, multiplicative_slowdown = (1.5 * (1 - E.get_charge(H) / 100))) else H.remove_movespeed_modifier(/datum/movespeed_modifier/hunger) @@ -1420,6 +1425,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) // ATTACK PROCS // ////////////////// +/datum/species/proc/spec_updatehealth(mob/living/carbon/human/H) + return + +/datum/species/proc/spec_fully_heal(mob/living/carbon/human/H) + return + /datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) target.help_shake_act(user) @@ -1538,11 +1549,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) target.dismembering_strike(user, affecting.body_zone) if(atk_verb == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage + 0.5x stamina damage - target.apply_damage(damage*1.5, BRUTE, affecting, armor_block) + target.apply_damage(damage*1.5, attack_type, affecting, armor_block) target.apply_damage(damage*0.5, STAMINA, affecting, armor_block) log_combat(user, target, "kicked") else//other attacks deal full raw damage + 2x in stamina damage - target.apply_damage(damage, BRUTE, affecting, armor_block) + target.apply_damage(damage, attack_type, affecting, armor_block) target.apply_damage(damage*2, STAMINA, affecting, armor_block) log_combat(user, target, "punched") diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm new file mode 100644 index 0000000000..27338f598f --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -0,0 +1,182 @@ +#define ETHEREAL_COLORS list("#00ffff", "#ffc0cb", "#9400D3", "#4B0082", "#0000FF", "#00FF00", "#FFFF00", "#FF7F00", "#FF0000") + +/datum/species/ethereal + name = "Ethereal" + id = "ethereal" + attack_verb = "burn" + attack_sound = 'sound/weapons/etherealhit.ogg' + miss_sound = 'sound/weapons/etherealmiss.ogg' + meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ethereal + mutantstomach = /obj/item/organ/stomach/ethereal + mutanttongue = /obj/item/organ/tongue/ethereal + exotic_blood = /datum/reagent/consumable/liquidelectricity //Liquid Electricity. fuck you think of something better gamer + siemens_coeff = 0.5 //They thrive on energy + brutemod = 1.25 //They're weak to punches + attack_type = BURN //burn bish + damage_overlay_type = "" //We are too cool for regular damage overlays + species_traits = list(MUTCOLORS, NO_UNDERWEAR, HAIR, HAS_FLESH, HAS_BONE) // i mean i guess they have blood so they can have wounds too + species_language_holder = /datum/language_holder/ethereal + inherent_traits = list(TRAIT_NOHUNGER) + sexes = FALSE + toxic_food = NONE + /* + citadel doesn't have per-species temperatures, yet + // Body temperature for ethereals is much higher then humans as they like hotter environments + bodytemp_normal = (BODYTEMP_NORMAL + 50) + bodytemp_heat_damage_limit = FIRE_MINIMUM_TEMPERATURE_TO_SPREAD // about 150C + // Cold temperatures hurt faster as it is harder to move with out the heat energy + bodytemp_cold_damage_limit = (T20C - 10) // about 10c + */ + hair_color = "fixedmutcolor" + hair_alpha = 140 + var/current_color + var/EMPeffect = FALSE + var/emageffect = FALSE + var/r1 + var/g1 + var/b1 + var/static/r2 = 237 + var/static/g2 = 164 + var/static/b2 = 149 + //this is shit but how do i fix it? no clue. + var/drain_time = 0 //used to keep ethereals from spam draining power sources + +/datum/species/ethereal/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) + .=..() + if(ishuman(C)) + var/mob/living/carbon/human/H = C + default_color = "#" + H.dna.features["mcolor"] + r1 = GETREDPART(default_color) + g1 = GETGREENPART(default_color) + b1 = GETBLUEPART(default_color) + spec_updatehealth(H) + RegisterSignal(C, COMSIG_ATOM_EMAG_ACT, .proc/on_emag_act) + RegisterSignal(C, COMSIG_ATOM_EMP_ACT, .proc/on_emp_act) + +/datum/species/ethereal/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + .=..() + C.set_light(0) + UnregisterSignal(C, COMSIG_ATOM_EMAG_ACT) + UnregisterSignal(C, COMSIG_ATOM_EMP_ACT) + +/datum/species/ethereal/random_name(gender,unique,lastname) + if(unique) + return random_unique_ethereal_name() + + var/randname = ethereal_name() + + return randname + +/datum/species/ethereal/spec_updatehealth(mob/living/carbon/human/H) + .=..() + if(H.stat != DEAD && !EMPeffect) + var/healthpercent = max(H.health, 0) / 100 + if(!emageffect) + current_color = rgb(r2 + ((r1-r2)*healthpercent), g2 + ((g1-g2)*healthpercent), b2 + ((b1-b2)*healthpercent)) + H.set_light(1 + (2 * healthpercent), 1 + (1 * healthpercent), current_color) + fixed_mut_color = copytext_char(current_color, 2) + else + H.set_light(0) + fixed_mut_color = rgb(128,128,128) + H.update_body() + +/datum/species/ethereal/proc/on_emp_act(mob/living/carbon/human/H, severity) + EMPeffect = TRUE + spec_updatehealth(H) + to_chat(H, "You feel the light of your body leave you.") + switch(severity) + if(EMP_LIGHT) + addtimer(CALLBACK(src, .proc/stop_emp, H), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 10 seconds + if(EMP_HEAVY) + addtimer(CALLBACK(src, .proc/stop_emp, H), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) //We're out for 20 seconds + +/datum/species/ethereal/proc/on_emag_act(mob/living/carbon/human/H, mob/user) + if(emageffect) + return + emageffect = TRUE + if(user) + to_chat(user, "You tap [H] on the back with your card.") + H.visible_message("[H] starts flickering in an array of colors!") + handle_emag(H) + addtimer(CALLBACK(src, .proc/stop_emag, H), 30 SECONDS) //Disco mode for 30 seconds! This doesn't affect the ethereal at all besides either annoying some players, or making someone look badass. + + +/datum/species/ethereal/spec_life(mob/living/carbon/human/H) + .=..() + handle_charge(H) + + +/datum/species/ethereal/proc/stop_emp(mob/living/carbon/human/H) + EMPeffect = FALSE + spec_updatehealth(H) + to_chat(H, "You feel more energized as your shine comes back.") + + +/datum/species/ethereal/proc/handle_emag(mob/living/carbon/human/H) + if(!emageffect) + return + current_color = pick(ETHEREAL_COLORS) + spec_updatehealth(H) + addtimer(CALLBACK(src, .proc/handle_emag, H), 5) //Call ourselves every 0.5 seconds to change color + +/datum/species/ethereal/proc/stop_emag(mob/living/carbon/human/H) + emageffect = FALSE + spec_updatehealth(H) + H.visible_message("[H] stops flickering and goes back to their normal state!") + +/datum/species/ethereal/proc/handle_charge(mob/living/carbon/human/H) + brutemod = 1.25 + switch(get_charge(H)) + if(ETHEREAL_CHARGE_NONE) + H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 3) + if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER) + H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 2) + if(H.health > 10.5) + apply_damage(0.65, TOX, null, null, H) + brutemod = 1.75 + if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL) + H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 1) + brutemod = 1.5 + if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD) + H.throw_alert("ethereal_overcharge", /obj/screen/alert/ethereal_overcharge, 1) + apply_damage(0.2, TOX, null, null, H) + brutemod = 1.5 + if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS) + H.throw_alert("ethereal_overcharge", /obj/screen/alert/ethereal_overcharge, 2) + apply_damage(0.65, TOX, null, null, H) + brutemod = 1.75 + if(prob(10)) //10% each tick for ethereals to explosively release excess energy if it reaches dangerous levels + discharge_process(H) + else + H.clear_alert("ethereal_charge") + H.clear_alert("ethereal_overcharge") + +/datum/species/ethereal/proc/discharge_process(mob/living/carbon/human/H) + to_chat(H, "You begin to lose control over your charge!") + H.visible_message("[H] begins to spark violently!") + var/static/mutable_appearance/overcharge //shameless copycode from lightning spell + overcharge = overcharge || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) + H.add_overlay(overcharge) + if(do_mob(H, H, 50, 1)) + H.flash_lighting_fx(5, 7, current_color) + var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + playsound(H, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) + H.cut_overlay(overcharge) + tesla_zap(H, 2, stomach.crystal_charge*50, ZAP_OBJ_DAMAGE | ZAP_ALLOW_DUPLICATES) + if(istype(stomach)) + stomach.adjust_charge(100 - stomach.crystal_charge) + to_chat(H, "You violently discharge energy!") + H.visible_message("[H] violently discharges energy!") + if(prob(10)) //chance of developing heart disease to dissuade overcharging oneself + var/datum/disease/D = new /datum/disease/heart_failure + H.ForceContractDisease(D) + to_chat(H, "You're pretty sure you just felt your heart stop for a second there..") + H.playsound_local(H, 'sound/effects/singlebeat.ogg', 100, 0) + H.Paralyze(100) + return + +/datum/species/ethereal/proc/get_charge(mob/living/carbon/H) //this feels like it should be somewhere else. Eh? + var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + if(istype(stomach)) + return stomach.crystal_charge + return ETHEREAL_CHARGE_NONE diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index b9864bce16..b760af9850 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -185,6 +185,8 @@ T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) else if(isliving(AM)) var/mob/living/L = AM + if(isethereal(AM)) + AM.emp_act(EMP_LIGHT) if(iscyborg(AM)) var/mob/living/silicon/robot/borg = AM if(borg.lamp_intensity) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4fcd6d1dbd..9018c49b2c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -16,6 +16,8 @@ wires = new /datum/wires/robot(src) AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) + RegisterSignal(src, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) + robot_modules_background = new() robot_modules_background.icon_state = "block" robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it. @@ -1097,6 +1099,15 @@ for(var/i in connected_ai.aicamera.stored) aicamera.stored[i] = TRUE +/mob/living/silicon/robot/proc/charge(datum/source, amount, repairs) + if(module) + var/coeff = amount * 0.005 + module.respawn_consumable(src, coeff) + if(repairs) + heal_bodypart_damage(repairs, repairs - 1) + if(cell) + cell.charge = min(cell.charge + amount, cell.maxcharge) + /mob/living/silicon/robot/proc/rest_style() set name = "Switch Rest Style" set category = "Robot Commands" diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ba51eb3bef..3f3c9b3f94 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -838,6 +838,46 @@ // attack with hand - remove cell (if cover open) or interact with the APC /obj/machinery/power/apc/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) + if(isethereal(user)) + var/mob/living/carbon/human/H = user + if(H.a_intent == INTENT_HARM) + if(cell.charge <= (cell.maxcharge / 2)) // if charge is under 50% you shouldnt drain it + to_chat(H, "The APC doesn't have much power, you probably shouldn't drain any.") + return + var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + if(stomach.crystal_charge > 145) + to_chat(H, "Your charge is full!") + return + to_chat(H, "You start channeling some power through the APC into your body.") + if(do_after(user, 75, target = src)) + if(cell.charge <= (cell.maxcharge / 2) || (stomach.crystal_charge > 145)) + return + if(istype(stomach)) + to_chat(H, "You receive some charge from the APC.") + stomach.adjust_charge(10) + cell.charge -= 10 + else + to_chat(H, "You can't receive charge from the APC!") + return + if(H.a_intent == INTENT_GRAB) + if(cell.charge == cell.maxcharge) + to_chat(H, "The APC is full!") + return + var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + if(stomach.crystal_charge < 10) + to_chat(H, "Your charge is too low!") + return + to_chat(H, "You start channeling power through your body into the APC.") + if(do_after(user, 75, target = src)) + if(cell.charge == cell.maxcharge || (stomach.crystal_charge < 10)) + return + if(istype(stomach)) + to_chat(H, "You transfer some power to the APC.") + stomach.adjust_charge(-10) + cell.charge += 10 + else + to_chat(H, "You can't transfer power to the APC!") + return if(opened && (!issilicon(user))) if(cell) user.visible_message("[user] removes \the [cell] from [src]!","You remove \the [cell].") diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index ba6311a94d..6425feac31 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -151,6 +151,27 @@ if(prob(25)) corrupt() +/obj/item/stock_parts/cell/attack_self(mob/user) + if(isethereal(user)) + var/mob/living/carbon/human/H = user + if(charge < 100) + to_chat(H, "The [src] doesn't have enough power!") + return + var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + if(stomach.crystal_charge > 146) + to_chat(H, "Your charge is full!") + return + to_chat(H, "You clumsily channel power through the [src] and into your body, wasting some in the process.") + if(do_after(user, 5, target = src)) + if((charge < 100) || (stomach.crystal_charge > 146)) + return + if(istype(stomach)) + to_chat(H, "You receive some charge from the [src].") + stomach.adjust_charge(3) + charge -= 100 //you waste way more than you receive, so that ethereals cant just steal one cell and forget about hunger + else + to_chat(H, "You can't receive charge from the [src]!") + return /obj/item/stock_parts/cell/blob_act(obj/structure/blob/B) ex_act(EXPLODE_DEVASTATE) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 20f7ce099a..4c76c4b5b1 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -610,7 +610,18 @@ var/mob/living/carbon/human/H = user if(istype(H)) - + var/datum/species/ethereal/eth_species = H.dna?.species + if(istype(eth_species)) + to_chat(H, "You start channeling some power through the [fitting] into your body.") + if(do_after(user, 50, target = src)) + var/obj/item/organ/stomach/ethereal/stomach = H.getorganslot(ORGAN_SLOT_STOMACH) + if(istype(stomach)) + to_chat(H, "You receive some charge from the [fitting].") + stomach.adjust_charge(2) + else + to_chat(H, "You can't receive charge from the [fitting]!") + return + if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.max_heat_protection_temperature) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index d449fa310c..a6e78ae98c 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -768,7 +768,6 @@ color = "#97ee63" taste_description = "pure electricity" -/* //We don't have ethereals here, so I'll just comment it out. /datum/reagent/consumable/liquidelectricity/reaction_mob(mob/living/M, method=TOUCH, reac_volume) //can't be on life because of the way blood works. if((method == INGEST || method == INJECT || method == PATCH) && iscarbon(M)) @@ -776,10 +775,9 @@ var/obj/item/organ/stomach/ethereal/stomach = C.getorganslot(ORGAN_SLOT_STOMACH) if(istype(stomach)) stomach.adjust_charge(reac_volume * REM) -*/ /datum/reagent/consumable/liquidelectricity/on_mob_life(mob/living/carbon/M) - if(prob(25)) // && !isethereal(M)) + if(prob(25) && !isethereal(M)) M.electrocute_act(rand(10,15), "Liquid Electricity in their body", 1) //lmao at the newbs who eat energy bars playsound(M, "sparks", 50, TRUE) return ..() diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index d9cbf9be03..c4e4874a6f 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -91,3 +91,36 @@ /obj/item/organ/stomach/ipc name = "ipc stomach" icon_state = "stomach-ipc" + + +/obj/item/organ/stomach/ethereal + name = "biological battery" + icon_state = "stomach-p" //Welp. At least it's more unique in functionaliy. + desc = "A crystal-like organ that stores the electric charge of ethereals." + var/crystal_charge = ETHEREAL_CHARGE_FULL + +/obj/item/organ/stomach/ethereal/on_life() + ..() + adjust_charge(-ETHEREAL_CHARGE_FACTOR) + +/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/M, special = 0) + ..() + RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) + RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_electrocute) + +/obj/item/organ/stomach/ethereal/Remove(mob/living/carbon/M, special = 0) + UnregisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) + UnregisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT) + ..() + +/obj/item/organ/stomach/ethereal/proc/charge(datum/source, amount, repairs) + adjust_charge(amount / 70) + +/obj/item/organ/stomach/ethereal/proc/on_electrocute(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) + if(flags & SHOCK_ILLUSION) + return + adjust_charge(shock_damage * siemens_coeff * 2) + to_chat(owner, "You absorb some of the shock into your body!") + +/obj/item/organ/stomach/ethereal/proc/adjust_charge(amount) + crystal_charge = clamp(crystal_charge + amount, ETHEREAL_CHARGE_NONE, ETHEREAL_CHARGE_DANGEROUS) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 1c4a2d3043..7090ab62e2 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -312,3 +312,26 @@ desc = "A voice synthesizer used by IPCs to smoothly interface with organic lifeforms." electronics_magic = FALSE organ_flags = ORGAN_SYNTHETIC + +/obj/item/organ/tongue/ethereal + name = "electric discharger" + desc = "A sophisticated ethereal organ, capable of synthesising speech via electrical discharge." + icon_state = "electrotongue" + say_mod = "crackles" + attack_verb = list("shocked", "jolted", "zapped") + taste_sensitivity = 101 // Not a tongue, they can't taste shit + var/static/list/languages_possible_ethereal = typecacheof(list( + /datum/language/common, + /datum/language/draconic, + /datum/language/codespeak, + /datum/language/monkey, + /datum/language/narsie, + /datum/language/beachbum, + /datum/language/aphasia, + /datum/language/sylvan, + /datum/language/voltaic + )) + +/obj/item/organ/tongue/ethereal/Initialize(mapload) + . = ..() + languages_possible = languages_possible_ethereal diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 7aef2b627c..ff8fd46676 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -12,7 +12,8 @@ /obj/item/reagent_containers/food/snacks/no_raisin = 5, /obj/item/reagent_containers/food/snacks/spacetwinkie = 5, /obj/item/reagent_containers/food/snacks/cheesiehonkers = 5, - /obj/item/reagent_containers/food/snacks/cornchips = 5) + /obj/item/reagent_containers/food/snacks/cornchips = 5, + /obj/item/reagent_containers/food/snacks/energybar = 6) contraband = list( /obj/item/reagent_containers/food/snacks/cracker = 10, /obj/item/reagent_containers/food/snacks/honeybar = 5, diff --git a/config/game_options.txt b/config/game_options.txt index 405ec0405a..1585d45e6d 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -445,6 +445,7 @@ ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES shadow ROUNDSTART_RACES felinid ROUNDSTART_RACES dwarf +ROUNDSTART_RACES ethereal ## Races that are better than humans in some ways, but worse in others #ROUNDSTART_RACES jelly diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi index 155dbab98d992468300d7f7ffbbeae0f11661621..9501dc9216367b0d848a22990f4cab94859c7123 100644 GIT binary patch delta 5452 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 JR*8QM{C`eW8KM9H delta 9255 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 Vt^aLO#6yGwQc=`YsFt(%_`k(3nakdTy(25IT; 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 diff --git a/sound/weapons/etherealhit.ogg b/sound/weapons/etherealhit.ogg new file mode 100644 index 0000000000000000000000000000000000000000..19da8709618c46444fe8ff3562678c2912548a11 GIT binary patch literal 8696 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 lbMPyv;Dg=N9cec7{^otP84?m%${LDLqU=j{ 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 literal 0 HcmV?d00001 diff --git a/strings/names/ethereal.txt b/strings/names/ethereal.txt new file mode 100644 index 0000000000..d3e6a26e6e --- /dev/null +++ b/strings/names/ethereal.txt @@ -0,0 +1,38 @@ +Aten +Apollo +Arche +Atlas +Eos +Halo +Kale +Nysa +Orion +Pallas +Rigel +Themis +Aurora +Andromeda +Lyra +Saggitarius +Crux +Canis +Cygnus +Corvus +Cepheus +Auriga +Corona +Aquilla +Serpens +Cetus +Puppis +Ophiuchus +Carina +Cassiopeia +Canes +Fornax +Berenices +Coma +Vela +Triangulum +Tau +Ceti \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index faa1ce990c..c34bd2a1d8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2271,6 +2271,7 @@ #include "code\modules\language\swarmer.dm" #include "code\modules\language\sylvan.dm" #include "code\modules\language\vampiric.dm" +#include "code\modules\language\voltaic.dm" #include "code\modules\language\xenocommon.dm" #include "code\modules\library\lib_codex_gigas.dm" #include "code\modules\library\lib_items.dm" @@ -2499,6 +2500,7 @@ #include "code\modules\mob\living\carbon\human\species_types\corporate.dm" #include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" #include "code\modules\mob\living\carbon\human\species_types\dwarves.dm" +#include "code\modules\mob\living\carbon\human\species_types\ethereal.dm" #include "code\modules\mob\living\carbon\human\species_types\felinid.dm" #include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" #include "code\modules\mob\living\carbon\human\species_types\furrypeople.dm" From bdee7bdc632df5b4e2408ea187ab9e89a496dee5 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 8 Aug 2020 21:38:53 -0700 Subject: [PATCH 2/2] linters are always your friend --- code/modules/mob/living/carbon/human/species.dm | 2 +- code/modules/surgery/organs/stomach.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index eae4757866..54c3b314b9 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1368,7 +1368,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else if(isethereal(H)) var/datum/species/ethereal/E = H.dna.species if(E.get_charge(H) <= ETHEREAL_CHARGE_NORMAL) - H.add_movespeed_modifier(MOVESPEED_ID_HUNGRY, override = TRUE, multiplicative_slowdown = (1.5 * (1 - E.get_charge(H) / 100))) + H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (1.5 * (1 - E.get_charge(H) / 100))) else H.remove_movespeed_modifier(/datum/movespeed_modifier/hunger) diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index c4e4874a6f..44b4f6362a 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -103,7 +103,7 @@ ..() adjust_charge(-ETHEREAL_CHARGE_FACTOR) -/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/stomach/ethereal/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/charge) RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_electrocute)