From 7bd20a971f02326a5c3793cbd4ceec7c6fe97cac Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Mon, 25 Feb 2019 18:05:15 -0500 Subject: [PATCH 01/19] Adds preternis part 1 --- yogstation.dme | 1 + .../carbon/human/species_types/preternis.dm | 128 ++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 yogstation/code/modules/mob/living/carbon/human/species_types/preternis.dm diff --git a/yogstation.dme b/yogstation.dme index 26eedf4896bc..40c1de10a6a1 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -3071,6 +3071,7 @@ #include "yogstation\code\modules\mob\living\carbon\human\species_types\jellypeople.dm" #include "yogstation\code\modules\mob\living\carbon\human\species_types\lizard.dm" #include "yogstation\code\modules\mob\living\carbon\human\species_types\plantpeople.dm" +#include "yogstation\code\modules\mob\living\carbon\human\species_types\preternis.dm" #include "yogstation\code\modules\mob\living\silicon\silicon.dm" #include "yogstation\code\modules\mob\living\silicon\ai\ai.dm" #include "yogstation\code\modules\mob\living\silicon\ai\vox_sounds.dm" diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis.dm new file mode 100644 index 000000000000..6d746e3b334b --- /dev/null +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis.dm @@ -0,0 +1,128 @@ +/* +-weak to EMPS //done +-emag level 1 = brain dmg //done +-emag level 2 = flashing colors //done +-125% brute dmg //done +-150% shock dmg //done +-cold and heat sensible //dpme + +-fully augmented +-implant insertion +-night vision if not hungry +-rad immunity +-virus resistant +-all virus are airborne +-feeds on power,gloves decresse and insulated prevent +-purge chem after 40 seconds +-oil heals burn at 2 per cycle +-welding fuel at 1 per cycle +-teslium = meth but gives 200% dmg to shock +-special robot language + +*/ + +/datum/species/preternis + name = "Preternis" + id = "preternis" + default_color = "FFFFFF" + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) + say_mod = "intones" + attack_verb = "assaults" + meat = null + toxic_food = NONE + brutemod = 1.25 + burnmod = 1.15 + var/eating_msg_cooldown = FALSE + var/emag_lvl = 0 + +/datum/species/preternis/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + if (istype(chem,/datum/reagent/consumable)) + var/datum/reagent/consumable/food = chem + if (food.nutriment_factor) + food.nutriment_factor *= 0.2 + if (!eating_msg_cooldown) + eating_msg_cooldown = TRUE + addtimer(VARSET_CALLBACK(src, eating_msg_cooldown, FALSE), 5 MINUTES) + to_chat(H,"NOTICE: Digestive subroutines are inefficient. Seek sustenance via power-cell C.O.N.S.U.M.E. technology induction.") + return TRUE + +/datum/species/preternis/spec_emp_act(mob/living/carbon/human/H, severity) + . = ..() + switch(severity) + if(EMP_HEAVY) + H.adjustBruteLoss(20) + H.adjustFireLoss(20) + H.Stun(5) + H.nutrition *= 0.4 + H.visible_message("Electricity ripples over [H]'s subdermal implants, smoking profusely.", \ + "A surge of searing pain erupts throughout your very being! As the pain subsides, a terrible sensation of emptiness is left in its wake.") + if(EMP_LIGHT) + H.adjustBruteLoss(10) + H.adjustFireLoss(10) + H.Stun(2) + H.nutrition *= 0.6 + H.visible_message("A faint fizzling emanates from [H].", \ + "A fit of twitching overtakes you as your subdermal implants convulse violently from the electromagnetic disruption. Your sustenance reserves have been partially depleted from the blast.") + +/datum/species/preternis/spec_emag_act(mob/living/carbon/human/H, mob/user) + . = ..() + emag_lvl = MIN(emag_lvl++,2) + switch(emag_lvl) + if(1) + H.adjustBrainLoss(50) //HALP AM DUMB + to_chat(H,"ALERT! MEMORY UNIT [rand(1,5)] FAILURE.NERVEOUS SYSTEM DAMAGE.") + playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 1, 1) + if(2) + H.overlay_fullscreen("preternis_emag", /obj/screen/fullscreen/high) + H.throw_alert("preternis_emag". /obj/screen/alert/high/preternis ) + +/obj/screen/alert/high/preternis //i dont want to make a file for 4 lines + name = "Optic sensor failure" + desc = "Main unit optic sensors damage detected.Vision processor compromised" + icon_state = "high" + +/obj/item/organ/eyes/preternis + name = "preternis eyes" + desc = "An experimental upgraded version of eyes that can see in the dark.They are designed to fit preternis" + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + actions_types = list(/datum/action/item_action/organ_action/use) + var/night_vision = TRUE + +/obj/item/organ/eyes/preternis/ui_action_click() + sight_flags = initial(sight_flags) + switch(lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + else + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + sight_flags &= ~SEE_BLACKNESS + owner.update_sight() + +/obj/item/organ/eyes/preternis/on_life() + . = ..() + if(owner.nutrition >= NUTRITION_LEVEL_ALMOST_FULL && see_in_dark == 2) + see_in_dark = 8 + else if(see_in_dark == 8) + see_in_dark = 2 + +/obj/item/organ/lungs/preternis + name = "preternis lungs" + desc = "An experimental set of lungs.Due to the cybernetic nature of these lungs,they are less resistant to heat and cold but are more efficent at filtering oxygen." + icon_state = "lungs-c" + safe_oxygen_min = 12 + safe_toxins_max = 0.15 + gas_stimulation_min = 0.1 //fucking filters removing my stimulants + + cold_level_1_threshold = 280 + cold_level_2_threshold = 260 + cold_level_3_threshold = 200 + + heat_level_1_threshold = 320 + heat_level_2_threshold = 400 + heat_level_3_threshold = 600 //HALP MY LUNGS ARE ON FIRE + From 4c49ed8bab63b3a487f4bc3f30fe4706e151449b Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Thu, 28 Feb 2019 18:04:54 -0500 Subject: [PATCH 02/19] Part 1 --- code/__DEFINES/~yogs_defines/is_helpers.dm | 2 + code/__DEFINES/~yogs_defines/mobs.dm | 11 ++ .../mob/living/carbon/human/species.dm | 2 +- config/game_options.txt | 1 + icons/mob/human.dmi | Bin 16572 -> 23432 bytes icons/mob/human_parts.dmi | Bin 62619 -> 65377 bytes yogstation.dme | 6 +- .../mob/living/carbon/human/species.dm | 10 +- .../carbon/human/species_types/preternis.dm | 128 ------------- .../human/species_types/preternis/organs.dm | 62 ++++++ .../species_types/preternis/power_suck.dm | 176 +++++++++++++++++ .../species_types/preternis/preternis.dm | 179 ++++++++++++++++++ .../species_types/preternis/screen_alerts.dm | 8 + 13 files changed, 453 insertions(+), 132 deletions(-) create mode 100644 code/__DEFINES/~yogs_defines/mobs.dm delete mode 100644 yogstation/code/modules/mob/living/carbon/human/species_types/preternis.dm create mode 100644 yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm create mode 100644 yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm create mode 100644 yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm create mode 100644 yogstation/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm diff --git a/code/__DEFINES/~yogs_defines/is_helpers.dm b/code/__DEFINES/~yogs_defines/is_helpers.dm index bda2fe14f2e7..934572c7b3f8 100644 --- a/code/__DEFINES/~yogs_defines/is_helpers.dm +++ b/code/__DEFINES/~yogs_defines/is_helpers.dm @@ -3,3 +3,5 @@ #define is_shadow_or_thrall(M) (is_thrall(M) || is_shadow(M)) #define isspacepod(A) (istype(A, /obj/spacepod)) + +#define ispreternis(A) (is_species(A, /datum/species/preternis)) \ No newline at end of file diff --git a/code/__DEFINES/~yogs_defines/mobs.dm b/code/__DEFINES/~yogs_defines/mobs.dm new file mode 100644 index 000000000000..f820f4381f94 --- /dev/null +++ b/code/__DEFINES/~yogs_defines/mobs.dm @@ -0,0 +1,11 @@ +#define PRETERNIS_LEVEL_FULL 550 +#define PRETERNIS_LEVEL_WELL_FED 450 +#define PRETERNIS_LEVEL_FED 350 +#define PRETERNIS_LEVEL_HUNGRY 250 +#define PRETERNIS_LEVEL_STARVING 150 +#define PRETERNIS_LEVEL_NONE 0 + +#define ELECTRICITY_TO_NUTRIMENT_FACTOR 0.12 + +#define PRETERNIS_NV_OFF 2 +#define PRETERNIS_NV_ON 8 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index a896df17ba64..35e1c2279fff 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -338,7 +338,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/dynamic_fhair_suffix = "" //for augmented heads - if(HD.status == BODYPART_ROBOTIC) + if(HD.status == BODYPART_ROBOTIC || yogs_draw_robot_hair) //yogs allow for robot head hair return //we check if our hat or helmet hides our facial hair. diff --git a/config/game_options.txt b/config/game_options.txt index b2c681e772e1..f0fad9ef9cda 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -445,6 +445,7 @@ ROUNDSTART_RACES lizard #ROUNDSTART_RACES moth ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES shadow +ROUNDSTART_RACES preternis ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index e0fe6b4d98896a043f58af6c03486d4806a4e460..8c62215800c1e83fd977f184ae9590f780b0ff75 100644 GIT binary patch literal 23432 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 literal 16572 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 v%Ni7|ZZ({4@_*987M0?0izEm(<)Rp9>xhcF-c diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index adf2b987b94ad735e279a4ca98bb4699e6601268..d8085580fbbb154619d2c13826d3eba4cd5d0575 100644 GIT binary patch delta 6355 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 F`X9u*BEtXx delta 3576 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: Digestive subroutines are inefficient. Seek sustenance via power-cell C.O.N.S.U.M.E. technology induction.") - return TRUE - -/datum/species/preternis/spec_emp_act(mob/living/carbon/human/H, severity) - . = ..() - switch(severity) - if(EMP_HEAVY) - H.adjustBruteLoss(20) - H.adjustFireLoss(20) - H.Stun(5) - H.nutrition *= 0.4 - H.visible_message("Electricity ripples over [H]'s subdermal implants, smoking profusely.", \ - "A surge of searing pain erupts throughout your very being! As the pain subsides, a terrible sensation of emptiness is left in its wake.") - if(EMP_LIGHT) - H.adjustBruteLoss(10) - H.adjustFireLoss(10) - H.Stun(2) - H.nutrition *= 0.6 - H.visible_message("A faint fizzling emanates from [H].", \ - "A fit of twitching overtakes you as your subdermal implants convulse violently from the electromagnetic disruption. Your sustenance reserves have been partially depleted from the blast.") - -/datum/species/preternis/spec_emag_act(mob/living/carbon/human/H, mob/user) - . = ..() - emag_lvl = MIN(emag_lvl++,2) - switch(emag_lvl) - if(1) - H.adjustBrainLoss(50) //HALP AM DUMB - to_chat(H,"ALERT! MEMORY UNIT [rand(1,5)] FAILURE.NERVEOUS SYSTEM DAMAGE.") - playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 1, 1) - if(2) - H.overlay_fullscreen("preternis_emag", /obj/screen/fullscreen/high) - H.throw_alert("preternis_emag". /obj/screen/alert/high/preternis ) - -/obj/screen/alert/high/preternis //i dont want to make a file for 4 lines - name = "Optic sensor failure" - desc = "Main unit optic sensors damage detected.Vision processor compromised" - icon_state = "high" - -/obj/item/organ/eyes/preternis - name = "preternis eyes" - desc = "An experimental upgraded version of eyes that can see in the dark.They are designed to fit preternis" - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - actions_types = list(/datum/action/item_action/organ_action/use) - var/night_vision = TRUE - -/obj/item/organ/eyes/preternis/ui_action_click() - sight_flags = initial(sight_flags) - switch(lighting_alpha) - if (LIGHTING_PLANE_ALPHA_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) - lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE - else - lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE - sight_flags &= ~SEE_BLACKNESS - owner.update_sight() - -/obj/item/organ/eyes/preternis/on_life() - . = ..() - if(owner.nutrition >= NUTRITION_LEVEL_ALMOST_FULL && see_in_dark == 2) - see_in_dark = 8 - else if(see_in_dark == 8) - see_in_dark = 2 - -/obj/item/organ/lungs/preternis - name = "preternis lungs" - desc = "An experimental set of lungs.Due to the cybernetic nature of these lungs,they are less resistant to heat and cold but are more efficent at filtering oxygen." - icon_state = "lungs-c" - safe_oxygen_min = 12 - safe_toxins_max = 0.15 - gas_stimulation_min = 0.1 //fucking filters removing my stimulants - - cold_level_1_threshold = 280 - cold_level_2_threshold = 260 - cold_level_3_threshold = 200 - - heat_level_1_threshold = 320 - heat_level_2_threshold = 400 - heat_level_3_threshold = 600 //HALP MY LUNGS ARE ON FIRE - diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm new file mode 100644 index 000000000000..c773706599a1 --- /dev/null +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -0,0 +1,62 @@ +/obj/item/organ/eyes/preternis + name = "preternis eyes" + desc = "An experimental upgraded version of eyes that can see in the dark.They are designed to fit preternis" + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + actions_types = list(/datum/action/item_action/organ_action/use) + var/night_vision = TRUE + +/obj/item/organ/eyes/preternis/ui_action_click() + var/datum/species/preternis/S = owner.dna.species + if(S.charge < PRETERNIS_LEVEL_FED) + return + sight_flags = initial(sight_flags) + switch(lighting_alpha) + if (LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + if (LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + else + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + sight_flags &= ~SEE_BLACKNESS + owner.update_sight() + +/obj/item/organ/eyes/preternis/on_life() + . = ..() + if(!ispreternis(owner)) + qdel(src) //these eyes depend on being inside a preternis + return + var/datum/species/preternis/S = owner.dna.species + if(S.charge >= PRETERNIS_LEVEL_FED) + if(see_in_dark == PRETERNIS_NV_OFF) + see_in_dark = PRETERNIS_NV_ON + owner.update_sight() + else + if(see_in_dark == PRETERNIS_NV_ON) + see_in_dark = PRETERNIS_NV_OFF + owner.update_sight() + if(lighting_alpha < LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + sight_flags &= ~SEE_BLACKNESS + owner.update_sight() + +/obj/item/organ/lungs/preternis + name = "preternis lungs" + desc = "An experimental set of lungs.Due to the cybernetic nature of these lungs,they are less resistant to heat and cold but are more efficent at filtering oxygen." + icon_state = "lungs-c" + safe_oxygen_min = 12 + safe_toxins_max = 10 + gas_stimulation_min = 0.1 //fucking filters removing my stimulants + + cold_level_1_threshold = 280 + cold_level_1_damage = 1.5 + cold_level_2_threshold = 260 + cold_level_2_damage = 3 + cold_level_3_threshold = 200 + cold_level_3_damage = 4.5 + + heat_level_1_threshold = 320 + heat_level_2_threshold = 400 + heat_level_3_threshold = 600 //HALP MY LUNGS ARE ON FIRE diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm new file mode 100644 index 000000000000..13d729423e4f --- /dev/null +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -0,0 +1,176 @@ +/mob/living/carbon/AltClickOn(atom/A) + if(ispreternis(src)) + dna.species.spec_AltClickOn(A,src) + return + ..() + +/datum/species/preternis/spec_AltClickOn(atom/A,H) + return species_drain_act(H, A) + +/datum/species/preternis/proc/species_drain_act(mob/living/carbon/human/H, atom/A) + if(!istype(H) || !A) + return 0 + + if(!A.can_consume_power_from()) + return 0 //if it returns text, we want it to continue so we can get the error message later. + + var/siemens_coefficient = 1 + + if(H.reagents.has_reagent("teslium")) + siemens_coefficient *= 1.5 + + if (charge == PRETERNIS_LEVEL_FULL - 25) + to_chat(H,"CONSUME protocol reports no need for additional power at this time.") + return 1 + + if(H.gloves) + if(H.gloves.siemens_coefficient == 0) + to_chat(H,"NOTICE: [H.gloves] prevent electrical contact - CONSUME protocol aborted.") + return 1 + else + if(H.gloves.siemens_coefficient < 1) + to_chat(H,"NOTICE: [H.gloves] are interfering with electrical contact - advise removal before activating CONSUME protocol.") + siemens_coefficient *= H.gloves.siemens_coefficient + + H.face_atom(A) + H.visible_message("[H] starts placing their hands on [A]...", "You start placing your hands on [A]...") + if(!do_after(H, 20, target = A)) + to_chat(H,"CONSUME protocol aborted.") + return 1 + + to_chat(H,"Extracutaneous implants detect viable power source. Initiating CONSUME protocol.") + + var/done = 0 + var/drain = 150 * siemens_coefficient + + var/cycle = 0 + var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() + spark_system.attach(A) + spark_system.set_up(5, 0, A) + while(!done) + cycle++ + var/nutritionIncrease = drain * ELECTRICITY_TO_NUTRIMENT_FACTOR + + if(charge + nutritionIncrease > PRETERNIS_LEVEL_FULL) + nutritionIncrease = max(PRETERNIS_LEVEL_FULL - charge, 0) //if their nutrition goes up from some other source, this could be negative, which would cause bad things to happen. + drain = nutritionIncrease/ELECTRICITY_TO_NUTRIMENT_FACTOR + + if (do_after(H,15, target = A)) + var/can_drain = A.can_consume_power_from() + if(!can_drain || istext(can_drain)) + if(istext(can_drain)) + to_chat(H,can_drain) + done = 1 + else + playsound(A.loc, "sparks", 50, 1) + if(prob(75)) + spark_system.start() + var/drained = A.consume_power_from(drain) + if(drained < drain) + to_chat(H,"[A]'s power has been depleted, CONSUME protocol halted.") + done = 1 + charge += drained * ELECTRICITY_TO_NUTRIMENT_FACTOR + + if(!done) + if(charge > (PRETERNIS_LEVEL_FULL -1)) + to_chat(H,"CONSUME protocol complete. Physical nourishment refreshed.") + done = 1 + else if(cycle % 4 == 0) + var/nutperc = round((charge / PRETERNIS_LEVEL_FULL) * 100) + to_chat(H,"CONSUME protocol continues. Current satiety level: [nutperc]%.") + else + done = 1 + qdel(spark_system) + return 1 + +/atom/proc/can_consume_power_from() + return 0 //if a string is returned, it will evaluate as false and be output to the person draining. + +/atom/proc/consume_power_from(amount) + return 0 //return the amount that was drained. + +#define MIN_DRAINABLE_POWER 10 + +//CELL// +/obj/item/stock_parts/cell/can_consume_power_from() + if(charge < MIN_DRAINABLE_POWER) + return "Power cell depleted, CONSUME protocol halted." + return 1 + +/obj/item/stock_parts/cell/consume_power_from(amount) + if((charge - amount) < MIN_DRAINABLE_POWER) + amount = max(charge - MIN_DRAINABLE_POWER, 0) + use(amount) + return amount + +//APC// +/obj/machinery/power/apc/can_consume_power_from() + if(!cell) + return "APC cell absent, CONSUME protocol halted." + if(stat & BROKEN) + return "APC is damaged, CONSUME protocol halted." + if(!operating || shorted) + return "APC main breaker is off, CONSUME protocol halted." + if(cell.charge < MIN_DRAINABLE_POWER) + return "APC cell depleted, CONSUME protocol halted." + return 1 + +/obj/machinery/power/apc/consume_power_from(amount) + if((cell.charge - amount) < MIN_DRAINABLE_POWER) + amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) + cell.use(amount) + if(charging == 2) + charging = 0 //if we do not do this here, the APC can get stuck thinking it is fully charged. + update() + return amount + +//SMES// +/obj/machinery/power/smes/can_consume_power_from() + if(stat & BROKEN) + return "SMES is damaged, CONSUME protocol halted." + if(!output_attempt) + return "SMES is not outputting power, CONSUME protocol halted." + if(charge < MIN_DRAINABLE_POWER) + return "SMES cells depleted, CONSUME protocol halted." + return 1 + +/obj/machinery/power/smes/consume_power_from(amount) + if((charge - amount) < MIN_DRAINABLE_POWER) + amount = max(charge - MIN_DRAINABLE_POWER, 0) + charge -= amount + return amount + +//MECH// +/obj/mecha/can_consume_power_from() + if(!cell) + return "Mech power cell absent, CONSUME protocol halted." + if(cell.charge < MIN_DRAINABLE_POWER) + return "Mech power cell depleted, CONSUME protocol halted." + return 1 + +/obj/mecha/consume_power_from(amount) + occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.") + if((cell.charge - amount) < MIN_DRAINABLE_POWER) + amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) + cell.use(amount) + return amount + +//BORG// +/mob/living/silicon/robot/can_consume_power_from() + if(!cell) + return "Cyborg power cell absent, CONSUME protocol halted." + if(cell.charge < MIN_DRAINABLE_POWER) + return "Cyborg power cell depleted, CONSUME protocol halted." + return 1 + +/mob/living/silicon/robot/consume_power_from(amount) + src << "Warning: Unauthorized access through sub-route 12, block C, detected." + if((cell.charge - amount) < MIN_DRAINABLE_POWER) + amount = max(cell.charge - MIN_DRAINABLE_POWER, 0) + cell.use(amount) + return amount + +#undef MIN_DRAINABLE_POWER + + + diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm new file mode 100644 index 000000000000..4eb5cf61ec1c --- /dev/null +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -0,0 +1,179 @@ +/* +-emag level 1 = brain dmg //done //tested +-emag level 2 = flashing colors //done //tested +-125% brute dmg //done //tested +-150% shock dmg //done //tested +-cold and heat sensible //done //tested +-night vision if not hungry //done //tested +-feeds on power,gloves decresse and insulated prevent //done //tested +-fully augmented //done //tested +-weak to EMPS //done //tested +-teslium = meth but gives 200% dmg to shock //done //tested +-purge chem after a couple of seconds //done //tested +-oil heals burn at 2 per cycle //done //bugged +-welding fuel at 1 per cycle //done //bugged + + +-implant insertion +-rad immunity +-virus resistant +-all virus are airborne +-special robot lansguage +*/ + +/datum/species/preternis + name = "Preternis" + id = "preternis" + default_color = "FFFFFF" + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + inherent_traits = list(TRAIT_NOHUNGER) + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) + say_mod = "intones" + attack_verb = "assaults" + meat = null + toxic_food = NONE + brutemod = 1.25 + burnmod = 1.5 + yogs_draw_robot_hair = TRUE + mutanteyes = /obj/item/organ/eyes/preternis + mutantlungs = /obj/item/organ/lungs/preternis + + var/charge = PRETERNIS_LEVEL_FULL + var/eating_msg_cooldown = FALSE + var/emag_lvl = 0 + var/power_drain = 0.3 //probably going to have to tweak this shit + var/tesliumtrip = FALSE + +/datum/species/preternis/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) + . = ..() + for (var/V in C.bodyparts) + var/obj/item/bodypart/BP = V + BP.change_bodypart_status(ORGAN_ROBOTIC,FALSE,TRUE) + +/datum/species/preternis/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + for (var/V in C.bodyparts) + var/obj/item/bodypart/BP = V + BP.change_bodypart_status(ORGAN_ORGANIC,FALSE,TRUE) + C.clear_alert("preternis_emag") + C.clear_fullscreen("preternis_emag") + C.remove_movespeed_modifier("preternis_teslium") + +/datum/species/preternis/spec_emp_act(mob/living/carbon/human/H, severity) + . = ..() + switch(severity) + if(EMP_HEAVY) + H.adjustBruteLoss(20) + H.adjustFireLoss(20) + H.Paralyze(50) + charge *= 0.4 + H.visible_message("Electricity ripples over [H]'s subdermal implants, smoking profusely.", \ + "A surge of searing pain erupts throughout your very being! As the pain subsides, a terrible sensation of emptiness is left in its wake.") + if(EMP_LIGHT) + H.adjustBruteLoss(10) + H.adjustFireLoss(10) + H.Paralyze(20) + charge *= 0.6 + H.visible_message("A faint fizzling emanates from [H].", \ + "A fit of twitching overtakes you as your subdermal implants convulse violently from the electromagnetic disruption. Your sustenance reserves have been partially depleted from the blast.") + +/datum/species/preternis/spec_emag_act(mob/living/carbon/human/H, mob/user) + . = ..() + if(emag_lvl == 2) + return + emag_lvl = min(emag_lvl + 1,2) + playsound(H.loc, 'sound/machines/warning-buzzer.ogg', 50, 1, 1) + H.Paralyze(60) + switch(emag_lvl) + if(1) + H.adjustBrainLoss(50) //HALP AM DUMB + to_chat(H,"ALERT! MEMORY UNIT [rand(1,5)] FAILURE.NERVEOUS SYSTEM DAMAGE.") + if(2) + H.overlay_fullscreen("preternis_emag", /obj/screen/fullscreen/high) + H.throw_alert("preternis_emag", /obj/screen/alert/high/preternis) + to_chat(H,"ALERT! OPTIC SENSORS FAILURE.VISION PROCESSOR COMPROMISED.") + +/datum/species/preternis/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) + . = ..() + + if(H.reagents.has_reagent("oil")) + H.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, 0) + metabolize(chem,H) + return TRUE + + if(H.reagents.has_reagent("welding_fuel")) + H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, 0) + metabolize(chem,H) + return TRUE + + if(H.reagents.has_reagent("teslium",10)) //10 u otherwise it wont update and they will remain quikk + H.add_movespeed_modifier("preternis_teslium", update=TRUE, priority=101, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) + if(H.health < 50 && H.health > 0) + H.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) + H.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, 0) + H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, 0) + H.AdjustParalyzed(-3) + H.AdjustStun(-3) + H.AdjustKnockdown(-3) + H.adjustStaminaLoss(-5*REAGENTS_EFFECT_MULTIPLIER) + charge -= 10 * REAGENTS_METABOLISM + burnmod = 200 + tesliumtrip = TRUE + else if(tesliumtrip) + burnmod = initial(burnmod) + tesliumtrip = FALSE + H.remove_movespeed_modifier("preternis_teslium") + + if (istype(chem,/datum/reagent/consumable)) + var/datum/reagent/consumable/food = chem + if (food.nutriment_factor) + var/nutrition = food.nutriment_factor * 0.2 + adjust_charge(nutrition) + if (!eating_msg_cooldown) + eating_msg_cooldown = TRUE + addtimer(VARSET_CALLBACK(src, eating_msg_cooldown, FALSE), 5 MINUTES) + to_chat(H,"NOTICE: Digestive subroutines are inefficient. Seek sustenance via power-cell C.O.N.S.U.M.E. technology induction.") + + if(chem.current_cycle >= 20) + H.reagents.del_reagent(chem.id) + + + return FALSE + +/datum/species/preternis/proc/metabolize(datum/reagent/chem,mob/living/carbon/human/H) //cant be assed to copy paste this everytime + chem.current_cycle++ + H.reagents.remove_reagent(chem.id, chem.metabolization_rate * H.metabolism_efficiency) + +/datum/species/preternis/spec_fully_heal(mob/living/carbon/human/H) + . = ..() + set_charge(PRETERNIS_LEVEL_FULL) + emag_lvl = 0 + H.clear_alert("preternis_emag") + H.clear_fullscreen("preternis_emag") + burnmod = initial(burnmod) + tesliumtrip = FALSE + H.remove_movespeed_modifier("preternis_teslium") //full heal removes chems so it wont update the teslium speed up until they eat something + +/datum/species/preternis/spec_life(mob/living/carbon/human/H) + . = ..() + handle_charge(H) + +/datum/species/preternis/proc/adjust_charge(var/newchange) + charge = CLAMP(charge + newchange, PRETERNIS_LEVEL_NONE, PRETERNIS_LEVEL_FULL) + +/datum/species/preternis/proc/set_charge(var/newchange) + charge = CLAMP(newchange, PRETERNIS_LEVEL_NONE, PRETERNIS_LEVEL_FULL) + +/datum/species/preternis/proc/handle_charge(mob/living/carbon/human/H) + adjust_charge(-power_drain) + if(charge == PRETERNIS_LEVEL_NONE) + to_chat(H,"Warning! System power criti-$#@$") + H.death() + else if(charge < PRETERNIS_LEVEL_STARVING) + H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 3) + else if(charge < PRETERNIS_LEVEL_HUNGRY) + H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 2) + else if(charge < PRETERNIS_LEVEL_FED) + H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 1) + else + H.clear_alert("preternis_charge") \ No newline at end of file diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm new file mode 100644 index 000000000000..9a8045f43cd5 --- /dev/null +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/screen_alerts.dm @@ -0,0 +1,8 @@ +/obj/screen/alert/high/preternis + name = "Optic sensor failure" + desc = "Main unit optic sensors damage detected.Vision processor compromised" + +/obj/screen/alert/preternis_charge + name = "Low power" + desc = "Find a power cell to recharge from or you may lose power." + icon_state = "lowcell" \ No newline at end of file From 3188a60cc4405229ca8345cb5cf02adf3f6e5bef Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Thu, 28 Feb 2019 18:11:14 -0500 Subject: [PATCH 03/19] :),quick tweak to remove limb buffs --- .../living/carbon/human/species_types/preternis/preternis.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 4eb5cf61ec1c..717f543219de 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -49,6 +49,9 @@ for (var/V in C.bodyparts) var/obj/item/bodypart/BP = V BP.change_bodypart_status(ORGAN_ROBOTIC,FALSE,TRUE) + BP.burn_reduction = 0 + BP.brute_reduction = 0 + BP.max_damage = 35 /datum/species/preternis/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) . = ..() From 73bbbc254c7c94741381407b9f4680a0b4ad8dd3 Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Sat, 2 Mar 2019 14:27:05 -0500 Subject: [PATCH 04/19] part 2 --- code/__DEFINES/~yogs_defines/mobs.dm | 4 +- .../modules/mob/living/carbon/damage_procs.dm | 2 +- code/modules/surgery/bodyparts/bodyparts.dm | 6 +- config/game_options.txt | 4 +- .../species_types/preternis/preternis.dm | 66 +++++++++---------- 5 files changed, 42 insertions(+), 40 deletions(-) diff --git a/code/__DEFINES/~yogs_defines/mobs.dm b/code/__DEFINES/~yogs_defines/mobs.dm index f820f4381f94..fcc74a2568fe 100644 --- a/code/__DEFINES/~yogs_defines/mobs.dm +++ b/code/__DEFINES/~yogs_defines/mobs.dm @@ -8,4 +8,6 @@ #define ELECTRICITY_TO_NUTRIMENT_FACTOR 0.12 #define PRETERNIS_NV_OFF 2 -#define PRETERNIS_NV_ON 8 \ No newline at end of file +#define PRETERNIS_NV_ON 8 + +#define BODYPART_ANY -1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index f8752e798591..30e4a5ba5b41 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -117,7 +117,7 @@ var/list/obj/item/bodypart/parts = list() for(var/X in bodyparts) var/obj/item/bodypart/BP = X - if(status && (BP.status != status)) + if(!(status == BODYPART_ANY) && (status && (BP.status != status))) //yogs - allows robot limb healing override continue if((brute && BP.brute_dam) || (burn && BP.burn_dam) || (stamina && BP.stamina_dam)) parts += BP diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index a858cd1a966e..6b1360134651 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -148,7 +148,7 @@ if(owner && (owner.status_flags & GODMODE)) return FALSE //godmode - if(required_status && (status != required_status)) + if(!(required_status == -1) && (required_status && (status != required_status))) return FALSE var/dmg_mlt = CONFIG_GET(number/damage_multiplier) @@ -197,8 +197,8 @@ //Damage cannot go below zero. //Cannot remove negative damage (i.e. apply damage) /obj/item/bodypart/proc/heal_damage(brute, burn, stamina, required_status, updating_health = TRUE) - - if(required_status && (status != required_status)) //So we can only heal certain kinds of limbs, ie robotic vs organic. + // yogs -- line below updated to allow for robotic body part healing override + if(!(required_status == BODYPART_ANY) && (required_status && (status != required_status)) ) //So we can only heal certain kinds of limbs, ie robotic vs organic. return brute_dam = round(max(brute_dam - brute, 0), DAMAGE_PRECISION) diff --git a/config/game_options.txt b/config/game_options.txt index f0fad9ef9cda..583b0cfc3336 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -36,8 +36,8 @@ EMOJIS ## To speed things up make the number negative, to slow things down, make the number positive. ## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. -RUN_DELAY 1 -WALK_DELAY 4 +RUN_DELAY 2 +WALK_DELAY 8 ## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE! ## Entries completely override all subtypes. Later entries have precedence over earlier entries. diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 717f543219de..e1a9d592e33d 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -1,24 +1,29 @@ /* --emag level 1 = brain dmg //done //tested --emag level 2 = flashing colors //done //tested --125% brute dmg //done //tested --150% shock dmg //done //tested --cold and heat sensible //done //tested --night vision if not hungry //done //tested --feeds on power,gloves decresse and insulated prevent //done //tested --fully augmented //done //tested --weak to EMPS //done //tested --teslium = meth but gives 200% dmg to shock //done //tested --purge chem after a couple of seconds //done //tested --oil heals burn at 2 per cycle //done //bugged --welding fuel at 1 per cycle //done //bugged - - --implant insertion --rad immunity --virus resistant --all virus are airborne --special robot lansguage +upsides: +NV //done tested +fixable by tools //done tested +no need to eat //done tested +purges chems after 30 cycles //done tested +more resistant to plasma/lack of o2 //done tested +more resistance to rads IMPLEMENT +more resistance to viruses IMPLEMENT +special preternis language IMPLEMENT +Oil heals 2 burn per cycle //done tested +Welding fuel heals 1 per cycle but deals 1 toxic damage per cycle //done tested + + +downsides: +emp does alot of damage and drains their cell alot //done tested +emag is an instant stun and will fuck up their vision and brain //done tested +not healable by chems //done tested +damagable by chems //done tested +needs to eat battery //done tested +needs welding helmet to fix themself //done tested +150% burn damage //done tested +125% brute damage //done tested +less resistant to heat changes //done tested +all viruses are resistance 10 +max 35 damage for limb failure //done tested */ /datum/species/preternis @@ -49,6 +54,8 @@ for (var/V in C.bodyparts) var/obj/item/bodypart/BP = V BP.change_bodypart_status(ORGAN_ROBOTIC,FALSE,TRUE) + if(istype(BP,/obj/item/bodypart/chest) || istype(BP,/obj/item/bodypart/head)) + continue BP.burn_reduction = 0 BP.brute_reduction = 0 BP.max_damage = 35 @@ -58,6 +65,7 @@ for (var/V in C.bodyparts) var/obj/item/bodypart/BP = V BP.change_bodypart_status(ORGAN_ORGANIC,FALSE,TRUE) + BP.burn_reduction = initial(BP.) C.clear_alert("preternis_emag") C.clear_fullscreen("preternis_emag") C.remove_movespeed_modifier("preternis_teslium") @@ -100,21 +108,17 @@ . = ..() if(H.reagents.has_reagent("oil")) - H.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, 0) - metabolize(chem,H) - return TRUE + H.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) if(H.reagents.has_reagent("welding_fuel")) - H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, 0) - metabolize(chem,H) - return TRUE + H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) if(H.reagents.has_reagent("teslium",10)) //10 u otherwise it wont update and they will remain quikk H.add_movespeed_modifier("preternis_teslium", update=TRUE, priority=101, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) if(H.health < 50 && H.health > 0) H.adjustOxyLoss(-1*REAGENTS_EFFECT_MULTIPLIER) - H.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, 0) - H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, 0) + H.adjustBruteLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) + H.adjustFireLoss(-1*REAGENTS_EFFECT_MULTIPLIER,FALSE,FALSE, BODYPART_ANY) H.AdjustParalyzed(-3) H.AdjustStun(-3) H.AdjustKnockdown(-3) @@ -134,7 +138,7 @@ adjust_charge(nutrition) if (!eating_msg_cooldown) eating_msg_cooldown = TRUE - addtimer(VARSET_CALLBACK(src, eating_msg_cooldown, FALSE), 5 MINUTES) + addtimer(VARSET_CALLBACK(src, eating_msg_cooldown, FALSE), 2 MINUTES) to_chat(H,"NOTICE: Digestive subroutines are inefficient. Seek sustenance via power-cell C.O.N.S.U.M.E. technology induction.") if(chem.current_cycle >= 20) @@ -143,10 +147,6 @@ return FALSE -/datum/species/preternis/proc/metabolize(datum/reagent/chem,mob/living/carbon/human/H) //cant be assed to copy paste this everytime - chem.current_cycle++ - H.reagents.remove_reagent(chem.id, chem.metabolization_rate * H.metabolism_efficiency) - /datum/species/preternis/spec_fully_heal(mob/living/carbon/human/H) . = ..() set_charge(PRETERNIS_LEVEL_FULL) From 281c0e9bf4d73ab70d429b318d325da9abb6d2b5 Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Sat, 2 Mar 2019 17:14:36 -0500 Subject: [PATCH 05/19] all features done,time to complete testing and iron out bugs! --- yogstation.dme | 2 ++ yogstation/code/datums/diseases/_MobProcs.dm | 4 ++++ .../code/datums/diseases/advance/advance.dm | 9 ++++++++ .../mob/living/carbon/human/species.dm | 5 +++++ .../species_types/preternis/preternis.dm | 22 ++++++++++++------- 5 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 yogstation/code/datums/diseases/_MobProcs.dm create mode 100644 yogstation/code/datums/diseases/advance/advance.dm diff --git a/yogstation.dme b/yogstation.dme index fc97285947e2..57413dd2dbd9 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -2814,7 +2814,9 @@ #include "yogstation\code\datums\components\uplink.dm" #include "yogstation\code\datums\components\walks.dm" #include "yogstation\code\datums\components\storage\storage.dm" +#include "yogstation\code\datums\diseases\_MobProcs.dm" #include "yogstation\code\datums\diseases\cluwnification.dm" +#include "yogstation\code\datums\diseases\advance\advance.dm" #include "yogstation\code\datums\diseases\advance\symptoms\confusion.dm" #include "yogstation\code\datums\diseases\advance\symptoms\heal.dm" #include "yogstation\code\datums\mood_events\generic_positive_events.dm" diff --git a/yogstation/code/datums/diseases/_MobProcs.dm b/yogstation/code/datums/diseases/_MobProcs.dm new file mode 100644 index 000000000000..66adac0f1144 --- /dev/null +++ b/yogstation/code/datums/diseases/_MobProcs.dm @@ -0,0 +1,4 @@ +/mob/living/carbon/human/CanContractDisease(datum/disease/D) + var/infectchance = dna.species ? dna.species.yogs_virus_infect_chance : 100 //will this compile? who knows + if(prob(infectchance)) + return ..() \ No newline at end of file diff --git a/yogstation/code/datums/diseases/advance/advance.dm b/yogstation/code/datums/diseases/advance/advance.dm new file mode 100644 index 000000000000..b3e8b84cfea8 --- /dev/null +++ b/yogstation/code/datums/diseases/advance/advance.dm @@ -0,0 +1,9 @@ +/datum/disease/advance/Refresh(new_name) + . = ..() + if(affected_mob.dna) + var/datum/species/S + properties["resistance"] += S.virus_resistance_boost + properties["stealth"] += S.virus_stealth_boost + properties["stage_rate"] += S.virus_stage_rate_boost + properties["transmittable"] += S.virus_transmittable_boost + AssignProperties() //this is a bit inefficent because its called twice but modularization amiright? \ No newline at end of file diff --git a/yogstation/code/modules/mob/living/carbon/human/species.dm b/yogstation/code/modules/mob/living/carbon/human/species.dm index a43eeb41db0e..04f7a6470b8b 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species.dm @@ -11,6 +11,11 @@ /datum/species var/yogs_draw_robot_hair = FALSE //DAMN ROBOTS STEALING OUR HAIR AND AIR + var/yogs_virus_infect_chance = 100 + var/virus_resistance_boost = 0 + var/virus_stealth_boost = 0 + var/virus_stage_rate_boost = 0 + var/virus_transmittable_boost = 0 /datum/species/proc/spec_AltClickOn(atom/A,mob/living/carbon/human/H) return 0 \ No newline at end of file diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index e1a9d592e33d..5a9fdb3cfd7e 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -5,9 +5,9 @@ fixable by tools //done tested no need to eat //done tested purges chems after 30 cycles //done tested more resistant to plasma/lack of o2 //done tested -more resistance to rads IMPLEMENT -more resistance to viruses IMPLEMENT -special preternis language IMPLEMENT +resistance to rads //done +more resistance to viruses //done +special preternis language //done Oil heals 2 burn per cycle //done tested Welding fuel heals 1 per cycle but deals 1 toxic damage per cycle //done tested @@ -22,7 +22,7 @@ needs welding helmet to fix themself //done tested 150% burn damage //done tested 125% brute damage //done tested less resistant to heat changes //done tested -all viruses are resistance 10 +all viruses are resistance 10 //done max 35 damage for limb failure //done tested */ @@ -31,8 +31,8 @@ max 35 damage for limb failure //done tested id = "preternis" default_color = "FFFFFF" changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - inherent_traits = list(TRAIT_NOHUNGER) - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS) + inherent_traits = list(TRAIT_NOHUNGER,TRAIT_RADIMMUNE) + species_traits = list(EYECOLOR,HAIR,LIPS) say_mod = "intones" attack_verb = "assaults" meat = null @@ -42,12 +42,15 @@ max 35 damage for limb failure //done tested yogs_draw_robot_hair = TRUE mutanteyes = /obj/item/organ/eyes/preternis mutantlungs = /obj/item/organ/lungs/preternis - + yogs_virus_infect_chance = 20 + virus_resistance_boost = 10 //YEOUTCH,good luck getting it out + var/charge = PRETERNIS_LEVEL_FULL var/eating_msg_cooldown = FALSE var/emag_lvl = 0 var/power_drain = 0.3 //probably going to have to tweak this shit var/tesliumtrip = FALSE + /datum/species/preternis/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) . = ..() @@ -59,7 +62,8 @@ max 35 damage for limb failure //done tested BP.burn_reduction = 0 BP.brute_reduction = 0 BP.max_damage = 35 - + C.grant_language(/datum/language/machine) //learn it once,learn it forever i guess,this isnt removed on species loss to prevent curators from forgetting machine language + /datum/species/preternis/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) . = ..() for (var/V in C.bodyparts) @@ -159,6 +163,8 @@ max 35 damage for limb failure //done tested /datum/species/preternis/spec_life(mob/living/carbon/human/H) . = ..() + for(var/datum/disease/advance/D in H.diseases) + D.properties["resistance"] = 10 //there isnt really a way to set the resistance handle_charge(H) /datum/species/preternis/proc/adjust_charge(var/newchange) From dae25bf9c563baa82963144c53bbed3b875e6257 Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Sat, 2 Mar 2019 17:47:40 -0500 Subject: [PATCH 06/19] tweaks --- .../living/carbon/human/species_types/preternis/preternis.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 5a9fdb3cfd7e..a789963e027c 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -34,7 +34,7 @@ max 35 damage for limb failure //done tested inherent_traits = list(TRAIT_NOHUNGER,TRAIT_RADIMMUNE) species_traits = list(EYECOLOR,HAIR,LIPS) say_mod = "intones" - attack_verb = "assaults" + attack_verb = "assault" meat = null toxic_food = NONE brutemod = 1.25 @@ -48,7 +48,7 @@ max 35 damage for limb failure //done tested var/charge = PRETERNIS_LEVEL_FULL var/eating_msg_cooldown = FALSE var/emag_lvl = 0 - var/power_drain = 0.3 //probably going to have to tweak this shit + var/power_drain = 1.3 //probably going to have to tweak this shit var/tesliumtrip = FALSE From dd9e2c90861eae76895bf38dc7f16bc75afeb138 Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Sun, 3 Mar 2019 09:44:59 -0500 Subject: [PATCH 07/19] bug fixes --- .../mob/living/carbon/human/species.dm | 2 +- code/modules/surgery/bodyparts/head.dm | 2 +- code/modules/surgery/organs/tongue.dm | 3 +- icons/mob/human.dmi | Bin 23432 -> 16572 bytes icons/mob/human_parts.dmi | Bin 65377 -> 62619 bytes yogstation.dme | 1 + yogstation/code/datums/diseases/_MobProcs.dm | 3 +- .../code/datums/diseases/advance/advance.dm | 6 +- .../mob/living/carbon/human/species.dm | 11 +++ .../species_types/preternis/power_suck.dm | 72 ++++++++++-------- .../species_types/preternis/preternis.dm | 57 ++++---------- yogstation/code/modules/surgery/bodypart.dm | 2 + 12 files changed, 78 insertions(+), 81 deletions(-) create mode 100644 yogstation/code/modules/surgery/bodypart.dm diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 35e1c2279fff..0905b432d807 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -338,7 +338,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/dynamic_fhair_suffix = "" //for augmented heads - if(HD.status == BODYPART_ROBOTIC || yogs_draw_robot_hair) //yogs allow for robot head hair + if(HD.status == BODYPART_ROBOTIC && !yogs_draw_robot_hair) //yogs - allow for robot head hair return //we check if our hat or helmet hides our facial hair. diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 23f54fefae97..022405011ace 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -195,7 +195,7 @@ . = ..() if(dropped) //certain overlays only appear when the limb is being detached from its owner. - if(status != BODYPART_ROBOTIC) //having a robotic head hides certain features. + if(status != BODYPART_ROBOTIC || yogs_draw_robot_hair) //having a robotic head hides certain features. //yogs -- preternis hair //facial hair if(facial_hair_style) var/datum/sprite_accessory/S = GLOB.facial_hair_styles_list[facial_hair_style] diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index c37337936d84..02dd25878aa4 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -18,7 +18,8 @@ /datum/language/ratvar, /datum/language/aphasia, /datum/language/piratespeak, - /datum/language/japanese //yogs + /datum/language/japanese, + /datum/language/machine //yogs )) /obj/item/organ/tongue/Initialize(mapload) diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index 8c62215800c1e83fd977f184ae9590f780b0ff75..e0fe6b4d98896a043f58af6c03486d4806a4e460 100644 GIT binary patch literal 16572 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 v%Ni7|ZZ({4@_*987M0?0izEm(<)Rp9>xhcF-c literal 23432 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 diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index d8085580fbbb154619d2c13826d3eba4cd5d0575..adf2b987b94ad735e279a4ca98bb4699e6601268 100644 GIT binary patch delta 3576 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 F`X9u*BEtXx diff --git a/yogstation.dme b/yogstation.dme index 57413dd2dbd9..3ed3f0aeb7e2 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -3166,6 +3166,7 @@ #include "yogstation\code\modules\stock_market\logs.dm" #include "yogstation\code\modules\stock_market\stockmarket.dm" #include "yogstation\code\modules\stock_market\stocks.dm" +#include "yogstation\code\modules\surgery\bodypart.dm" #include "yogstation\code\modules\surgery\tools.dm" #include "yogstation\code\modules\surgery\organs\shadowling_organs.dm" #include "yogstation\code\modules\uplink\uplink_item.dm" diff --git a/yogstation/code/datums/diseases/_MobProcs.dm b/yogstation/code/datums/diseases/_MobProcs.dm index 66adac0f1144..074271f0afc0 100644 --- a/yogstation/code/datums/diseases/_MobProcs.dm +++ b/yogstation/code/datums/diseases/_MobProcs.dm @@ -1,4 +1,5 @@ /mob/living/carbon/human/CanContractDisease(datum/disease/D) var/infectchance = dna.species ? dna.species.yogs_virus_infect_chance : 100 //will this compile? who knows if(prob(infectchance)) - return ..() \ No newline at end of file + return ..() + return FALSE \ No newline at end of file diff --git a/yogstation/code/datums/diseases/advance/advance.dm b/yogstation/code/datums/diseases/advance/advance.dm index b3e8b84cfea8..44c416ee694c 100644 --- a/yogstation/code/datums/diseases/advance/advance.dm +++ b/yogstation/code/datums/diseases/advance/advance.dm @@ -1,7 +1,7 @@ /datum/disease/advance/Refresh(new_name) - . = ..() - if(affected_mob.dna) - var/datum/species/S + ..() + if(affected_mob?.dna) + var/datum/species/S = affected_mob.dna.species properties["resistance"] += S.virus_resistance_boost properties["stealth"] += S.virus_stealth_boost properties["stage_rate"] += S.virus_stage_rate_boost diff --git a/yogstation/code/modules/mob/living/carbon/human/species.dm b/yogstation/code/modules/mob/living/carbon/human/species.dm index 04f7a6470b8b..0d0a00caa433 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species.dm @@ -17,5 +17,16 @@ var/virus_stage_rate_boost = 0 var/virus_transmittable_boost = 0 +/datum/species/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) + . = ..() + if(yogs_draw_robot_hair) + for(var/obj/item/bodypart/BP in C.bodyparts) + BP.yogs_draw_robot_hair = TRUE + +/datum/species/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + for(var/obj/item/bodypart/BP in C.bodyparts) + BP.yogs_draw_robot_hair = initial(BP.yogs_draw_robot_hair) + /datum/species/proc/spec_AltClickOn(atom/A,mob/living/carbon/human/H) return 0 \ No newline at end of file diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index 13d729423e4f..0b537698db21 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -1,32 +1,34 @@ /mob/living/carbon/AltClickOn(atom/A) - if(ispreternis(src)) - dna.species.spec_AltClickOn(A,src) - return - ..() + dna?.species.spec_AltClickOn(A,src) + return /datum/species/preternis/spec_AltClickOn(atom/A,H) - return species_drain_act(H, A) + return drain_power_from(H, A) -/datum/species/preternis/proc/species_drain_act(mob/living/carbon/human/H, atom/A) +/datum/species/preternis/proc/drain_power_from(mob/living/carbon/human/H, atom/A) if(!istype(H) || !A) - return 0 + return FALSE + + if(draining) + to_chat(H,"CONSUME protocols can only be used on one object at any single time.((If you are not currently consuming power from something,wait 1 minute and try again))") + return FALSE if(!A.can_consume_power_from()) - return 0 //if it returns text, we want it to continue so we can get the error message later. + return FALSE //if it returns text, we want it to continue so we can get the error message later. var/siemens_coefficient = 1 if(H.reagents.has_reagent("teslium")) siemens_coefficient *= 1.5 - if (charge == PRETERNIS_LEVEL_FULL - 25) + if (charge >= PRETERNIS_LEVEL_FULL - 25) //just to prevent spam a bit to_chat(H,"CONSUME protocol reports no need for additional power at this time.") - return 1 + return TRUE if(H.gloves) if(H.gloves.siemens_coefficient == 0) to_chat(H,"NOTICE: [H.gloves] prevent electrical contact - CONSUME protocol aborted.") - return 1 + return TRUE else if(H.gloves.siemens_coefficient < 1) to_chat(H,"NOTICE: [H.gloves] are interfering with electrical contact - advise removal before activating CONSUME protocol.") @@ -36,7 +38,7 @@ H.visible_message("[H] starts placing their hands on [A]...", "You start placing your hands on [A]...") if(!do_after(H, 20, target = A)) to_chat(H,"CONSUME protocol aborted.") - return 1 + return TRUE to_chat(H,"Extracutaneous implants detect viable power source. Initiating CONSUME protocol.") @@ -47,12 +49,16 @@ var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() spark_system.attach(A) spark_system.set_up(5, 0, A) + + draining = TRUE + var/failsafetimer = addtimer(VARSET_CALLBACK(src, draining, TRUE),1 MINUTES) //in case the proc fails and it doesnt set draining back to false,locking them out of recharging + while(!done) cycle++ var/nutritionIncrease = drain * ELECTRICITY_TO_NUTRIMENT_FACTOR if(charge + nutritionIncrease > PRETERNIS_LEVEL_FULL) - nutritionIncrease = max(PRETERNIS_LEVEL_FULL - charge, 0) //if their nutrition goes up from some other source, this could be negative, which would cause bad things to happen. + nutritionIncrease = CLAMP(PRETERNIS_LEVEL_FULL - charge, PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) //if their nutrition goes up from some other source, this could be negative, which would cause bad things to happen. drain = nutritionIncrease/ELECTRICITY_TO_NUTRIMENT_FACTOR if (do_after(H,15, target = A)) @@ -69,10 +75,10 @@ if(drained < drain) to_chat(H,"[A]'s power has been depleted, CONSUME protocol halted.") done = 1 - charge += drained * ELECTRICITY_TO_NUTRIMENT_FACTOR + charge = CLAMP(charge + (drained * ELECTRICITY_TO_NUTRIMENT_FACTOR),PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) if(!done) - if(charge > (PRETERNIS_LEVEL_FULL -1)) + if(charge > (PRETERNIS_LEVEL_FULL - 25)) to_chat(H,"CONSUME protocol complete. Physical nourishment refreshed.") done = 1 else if(cycle % 4 == 0) @@ -81,21 +87,23 @@ else done = 1 qdel(spark_system) - return 1 + draining = FALSE + deltimer(failsafetimer) + return TRUE /atom/proc/can_consume_power_from() - return 0 //if a string is returned, it will evaluate as false and be output to the person draining. + return FALSE //if a string is returned, it will evaluate as false and be output to the person draining. /atom/proc/consume_power_from(amount) - return 0 //return the amount that was drained. + return FALSE //return the amount that was drained. #define MIN_DRAINABLE_POWER 10 //CELL// /obj/item/stock_parts/cell/can_consume_power_from() if(charge < MIN_DRAINABLE_POWER) - return "Power cell depleted, CONSUME protocol halted." - return 1 + return "Power cell depleted, cannot consume power." + return TRUE /obj/item/stock_parts/cell/consume_power_from(amount) if((charge - amount) < MIN_DRAINABLE_POWER) @@ -106,14 +114,14 @@ //APC// /obj/machinery/power/apc/can_consume_power_from() if(!cell) - return "APC cell absent, CONSUME protocol halted." + return "APC cell absent, cannot consume power." if(stat & BROKEN) - return "APC is damaged, CONSUME protocol halted." + return "APC is damaged, cannot consume power." if(!operating || shorted) - return "APC main breaker is off, CONSUME protocol halted." + return "APC main breaker is off, cannot consume power." if(cell.charge < MIN_DRAINABLE_POWER) - return "APC cell depleted, CONSUME protocol halted." - return 1 + return "APC cell depleted, cannot consume power." + return TRUE /obj/machinery/power/apc/consume_power_from(amount) if((cell.charge - amount) < MIN_DRAINABLE_POWER) @@ -127,11 +135,11 @@ //SMES// /obj/machinery/power/smes/can_consume_power_from() if(stat & BROKEN) - return "SMES is damaged, CONSUME protocol halted." + return "SMES is damaged, cannot consume power." if(!output_attempt) - return "SMES is not outputting power, CONSUME protocol halted." + return "SMES is not outputting power, cannot consume power." if(charge < MIN_DRAINABLE_POWER) - return "SMES cells depleted, CONSUME protocol halted." + return "SMES cells depleted, cannot consume power." return 1 /obj/machinery/power/smes/consume_power_from(amount) @@ -143,9 +151,9 @@ //MECH// /obj/mecha/can_consume_power_from() if(!cell) - return "Mech power cell absent, CONSUME protocol halted." + return "Mech power cell absent, cannot consume power." if(cell.charge < MIN_DRAINABLE_POWER) - return "Mech power cell depleted, CONSUME protocol halted." + return "Mech power cell depleted, cannot consume power." return 1 /obj/mecha/consume_power_from(amount) @@ -158,9 +166,9 @@ //BORG// /mob/living/silicon/robot/can_consume_power_from() if(!cell) - return "Cyborg power cell absent, CONSUME protocol halted." + return "Cyborg power cell absent, cannot consume power." if(cell.charge < MIN_DRAINABLE_POWER) - return "Cyborg power cell depleted, CONSUME protocol halted." + return "Cyborg power cell depleted, cannot consume power." return 1 /mob/living/silicon/robot/consume_power_from(amount) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index a789963e027c..e3d651da9b02 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -1,29 +1,8 @@ /* -upsides: -NV //done tested -fixable by tools //done tested -no need to eat //done tested -purges chems after 30 cycles //done tested -more resistant to plasma/lack of o2 //done tested -resistance to rads //done -more resistance to viruses //done -special preternis language //done -Oil heals 2 burn per cycle //done tested -Welding fuel heals 1 per cycle but deals 1 toxic damage per cycle //done tested - - -downsides: -emp does alot of damage and drains their cell alot //done tested -emag is an instant stun and will fuck up their vision and brain //done tested -not healable by chems //done tested -damagable by chems //done tested -needs to eat battery //done tested -needs welding helmet to fix themself //done tested -150% burn damage //done tested -125% brute damage //done tested -less resistant to heat changes //done tested -all viruses are resistance 10 //done -max 35 damage for limb failure //done tested +procs: + +handle_charge - called in spec_life(),handles the alert indicators,the power loss death and decreasing the charge level +adjust_charge - take a positive or negative value to adjust the charge level */ /datum/species/preternis @@ -48,8 +27,9 @@ max 35 damage for limb failure //done tested var/charge = PRETERNIS_LEVEL_FULL var/eating_msg_cooldown = FALSE var/emag_lvl = 0 - var/power_drain = 1.3 //probably going to have to tweak this shit + var/power_drain = 0.7 //probably going to have to tweak this shit var/tesliumtrip = FALSE + var/draining = FALSE /datum/species/preternis/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) @@ -57,10 +37,10 @@ max 35 damage for limb failure //done tested for (var/V in C.bodyparts) var/obj/item/bodypart/BP = V BP.change_bodypart_status(ORGAN_ROBOTIC,FALSE,TRUE) - if(istype(BP,/obj/item/bodypart/chest) || istype(BP,/obj/item/bodypart/head)) - continue BP.burn_reduction = 0 BP.brute_reduction = 0 + if(istype(BP,/obj/item/bodypart/chest) || istype(BP,/obj/item/bodypart/head)) + continue BP.max_damage = 35 C.grant_language(/datum/language/machine) //learn it once,learn it forever i guess,this isnt removed on species loss to prevent curators from forgetting machine language @@ -69,8 +49,9 @@ max 35 damage for limb failure //done tested for (var/V in C.bodyparts) var/obj/item/bodypart/BP = V BP.change_bodypart_status(ORGAN_ORGANIC,FALSE,TRUE) - BP.burn_reduction = initial(BP.) - C.clear_alert("preternis_emag") + BP.burn_reduction = initial(BP.burn_reduction) + BP.brute_reduction = initial(BP.brute_reduction) + C.clear_alert("preternis_emag") //this means a changeling can transform from and back to a preternis to clear the emag status but w/e i cant find a solution to not do that C.clear_fullscreen("preternis_emag") C.remove_movespeed_modifier("preternis_teslium") @@ -127,7 +108,7 @@ max 35 damage for limb failure //done tested H.AdjustStun(-3) H.AdjustKnockdown(-3) H.adjustStaminaLoss(-5*REAGENTS_EFFECT_MULTIPLIER) - charge -= 10 * REAGENTS_METABOLISM + charge = CLAMP(charge - 10 * REAGENTS_METABOLISM,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) burnmod = 200 tesliumtrip = TRUE else if(tesliumtrip) @@ -139,7 +120,7 @@ max 35 damage for limb failure //done tested var/datum/reagent/consumable/food = chem if (food.nutriment_factor) var/nutrition = food.nutriment_factor * 0.2 - adjust_charge(nutrition) + charge = CLAMP(charge + nutrition,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) if (!eating_msg_cooldown) eating_msg_cooldown = TRUE addtimer(VARSET_CALLBACK(src, eating_msg_cooldown, FALSE), 2 MINUTES) @@ -153,7 +134,7 @@ max 35 damage for limb failure //done tested /datum/species/preternis/spec_fully_heal(mob/living/carbon/human/H) . = ..() - set_charge(PRETERNIS_LEVEL_FULL) + charge = PRETERNIS_LEVEL_FULL emag_lvl = 0 H.clear_alert("preternis_emag") H.clear_fullscreen("preternis_emag") @@ -163,18 +144,10 @@ max 35 damage for limb failure //done tested /datum/species/preternis/spec_life(mob/living/carbon/human/H) . = ..() - for(var/datum/disease/advance/D in H.diseases) - D.properties["resistance"] = 10 //there isnt really a way to set the resistance handle_charge(H) -/datum/species/preternis/proc/adjust_charge(var/newchange) - charge = CLAMP(charge + newchange, PRETERNIS_LEVEL_NONE, PRETERNIS_LEVEL_FULL) - -/datum/species/preternis/proc/set_charge(var/newchange) - charge = CLAMP(newchange, PRETERNIS_LEVEL_NONE, PRETERNIS_LEVEL_FULL) - /datum/species/preternis/proc/handle_charge(mob/living/carbon/human/H) - adjust_charge(-power_drain) + charge = CLAMP(charge - power_drain,PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) if(charge == PRETERNIS_LEVEL_NONE) to_chat(H,"Warning! System power criti-$#@$") H.death() diff --git a/yogstation/code/modules/surgery/bodypart.dm b/yogstation/code/modules/surgery/bodypart.dm new file mode 100644 index 000000000000..14ac6280c2fc --- /dev/null +++ b/yogstation/code/modules/surgery/bodypart.dm @@ -0,0 +1,2 @@ +/obj/item/bodypart + var/yogs_draw_robot_hair = FALSE \ No newline at end of file From c231ce18aa29432973f410507b68db2a3cbdabbf Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Sun, 3 Mar 2019 09:57:37 -0500 Subject: [PATCH 08/19] clears config changes --- config/game_options.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/config/game_options.txt b/config/game_options.txt index 583b0cfc3336..b2c681e772e1 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -36,8 +36,8 @@ EMOJIS ## To speed things up make the number negative, to slow things down, make the number positive. ## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. -RUN_DELAY 2 -WALK_DELAY 8 +RUN_DELAY 1 +WALK_DELAY 4 ## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE! ## Entries completely override all subtypes. Later entries have precedence over earlier entries. @@ -445,7 +445,6 @@ ROUNDSTART_RACES lizard #ROUNDSTART_RACES moth ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES shadow -ROUNDSTART_RACES preternis ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal From a8e9d976d45cd68ee689d8bd4f0820a0b9796b1a Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Sun, 3 Mar 2019 10:43:00 -0500 Subject: [PATCH 09/19] shit,forgot to test one feature and this is the result --- .../human/species_types/preternis/power_suck.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index 0b537698db21..ca6e007162ac 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -10,12 +10,13 @@ return FALSE if(draining) - to_chat(H,"CONSUME protocols can only be used on one object at any single time.((If you are not currently consuming power from something,wait 1 minute and try again))") + to_chat(H,"CONSUME protocols can only be used on one object at any single time.") return FALSE - if(!A.can_consume_power_from()) return FALSE //if it returns text, we want it to continue so we can get the error message later. + draining = TRUE + var/siemens_coefficient = 1 if(H.reagents.has_reagent("teslium")) @@ -23,11 +24,13 @@ if (charge >= PRETERNIS_LEVEL_FULL - 25) //just to prevent spam a bit to_chat(H,"CONSUME protocol reports no need for additional power at this time.") + draining = FALSE return TRUE if(H.gloves) if(H.gloves.siemens_coefficient == 0) to_chat(H,"NOTICE: [H.gloves] prevent electrical contact - CONSUME protocol aborted.") + draining = FALSE return TRUE else if(H.gloves.siemens_coefficient < 1) @@ -38,6 +41,7 @@ H.visible_message("[H] starts placing their hands on [A]...", "You start placing your hands on [A]...") if(!do_after(H, 20, target = A)) to_chat(H,"CONSUME protocol aborted.") + draining = FALSE return TRUE to_chat(H,"Extracutaneous implants detect viable power source. Initiating CONSUME protocol.") @@ -50,8 +54,7 @@ spark_system.attach(A) spark_system.set_up(5, 0, A) - draining = TRUE - var/failsafetimer = addtimer(VARSET_CALLBACK(src, draining, TRUE),1 MINUTES) //in case the proc fails and it doesnt set draining back to false,locking them out of recharging + while(!done) cycle++ @@ -88,7 +91,6 @@ done = 1 qdel(spark_system) draining = FALSE - deltimer(failsafetimer) return TRUE /atom/proc/can_consume_power_from() From d9574779b0b944528853aae4a6e3ceff1f57044e Mon Sep 17 00:00:00 2001 From: alexkar598 <25136265+alexkar598@users.noreply.github.com> Date: Mon, 11 Mar 2019 17:08:26 -0400 Subject: [PATCH 10/19] commends --- code/__DEFINES/~yogs_defines/mobs.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/~yogs_defines/mobs.dm b/code/__DEFINES/~yogs_defines/mobs.dm index fcc74a2568fe..fd59ed3ed5d7 100644 --- a/code/__DEFINES/~yogs_defines/mobs.dm +++ b/code/__DEFINES/~yogs_defines/mobs.dm @@ -5,9 +5,9 @@ #define PRETERNIS_LEVEL_STARVING 150 #define PRETERNIS_LEVEL_NONE 0 -#define ELECTRICITY_TO_NUTRIMENT_FACTOR 0.12 +#define ELECTRICITY_TO_NUTRIMENT_FACTOR 0.12 //1 power unit to 12 preternis charge -#define PRETERNIS_NV_OFF 2 +#define PRETERNIS_NV_OFF 2 //numbers of tile they can see #define PRETERNIS_NV_ON 8 -#define BODYPART_ANY -1 \ No newline at end of file +#define BODYPART_ANY -1 //use this when healing with something that needs a specefied bodypart type for all From a5dc373bfa75a0d60248827d41a91bace5c9d3cc Mon Sep 17 00:00:00 2001 From: alexkar598 <25136265+alexkar598@users.noreply.github.com> Date: Mon, 11 Mar 2019 17:09:46 -0400 Subject: [PATCH 11/19] webeditor <3 --- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 6b1360134651..0133856dcb71 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -148,7 +148,7 @@ if(owner && (owner.status_flags & GODMODE)) return FALSE //godmode - if(!(required_status == -1) && (required_status && (status != required_status))) + if(!(required_status == -1) && (required_status && (status != required_status))) //yogs -- adds in BODYPART_ANY return FALSE var/dmg_mlt = CONFIG_GET(number/damage_multiplier) From 519e13fe007d19b86df45974621a8d9db7e39170 Mon Sep 17 00:00:00 2001 From: Nichlas Pihl Date: Mon, 11 Mar 2019 17:11:19 -0400 Subject: [PATCH 12/19] does the thing Co-Authored-By: alexkar598 <25136265+alexkar598@users.noreply.github.com> --- .../mob/living/carbon/human/species_types/preternis/organs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm index c773706599a1..2206003e834d 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/organs.dm @@ -1,7 +1,7 @@ /obj/item/organ/eyes/preternis name = "preternis eyes" desc = "An experimental upgraded version of eyes that can see in the dark.They are designed to fit preternis" - see_in_dark = 8 + see_in_dark = PRETERNIS_NV_ON lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE actions_types = list(/datum/action/item_action/organ_action/use) var/night_vision = TRUE From 0906438b560c27f6232220459ac56716cf3c719c Mon Sep 17 00:00:00 2001 From: alexkar598 <25136265+alexkar598@users.noreply.github.com> Date: Mon, 11 Mar 2019 17:15:19 -0400 Subject: [PATCH 13/19] Update species.dm --- yogstation/code/modules/mob/living/carbon/human/species.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yogstation/code/modules/mob/living/carbon/human/species.dm b/yogstation/code/modules/mob/living/carbon/human/species.dm index 0d0a00caa433..612355a461d1 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species.dm @@ -29,4 +29,4 @@ BP.yogs_draw_robot_hair = initial(BP.yogs_draw_robot_hair) /datum/species/proc/spec_AltClickOn(atom/A,mob/living/carbon/human/H) - return 0 \ No newline at end of file + return FALSE From 8ab88e36a4efc40a8221015fccc994a8e93b1210 Mon Sep 17 00:00:00 2001 From: alexkar598 <25136265+alexkar598@users.noreply.github.com> Date: Mon, 11 Mar 2019 17:16:14 -0400 Subject: [PATCH 14/19] Update power_suck.dm --- .../living/carbon/human/species_types/preternis/power_suck.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index ca6e007162ac..9d4358896eef 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -1,6 +1,6 @@ /mob/living/carbon/AltClickOn(atom/A) dna?.species.spec_AltClickOn(A,src) - return + return ..() /datum/species/preternis/spec_AltClickOn(atom/A,H) return drain_power_from(H, A) From c54eb03439587037765b06f64f8b51071485b0ae Mon Sep 17 00:00:00 2001 From: Nichlas Pihl Date: Mon, 11 Mar 2019 17:16:29 -0400 Subject: [PATCH 15/19] Update yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm Co-Authored-By: alexkar598 <25136265+alexkar598@users.noreply.github.com> --- .../living/carbon/human/species_types/preternis/power_suck.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index 9d4358896eef..da0ac3a0599c 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -10,7 +10,7 @@ return FALSE if(draining) - to_chat(H,"CONSUME protocols can only be used on one object at any single time.") + to_chat(H,"CONSUME protocols can only be used on one object at any single time.") return FALSE if(!A.can_consume_power_from()) return FALSE //if it returns text, we want it to continue so we can get the error message later. From 5e2252b6c5fbc86425d73af43e16d1291eec5737 Mon Sep 17 00:00:00 2001 From: alexkar598 <25136265+alexkar598@users.noreply.github.com> Date: Mon, 11 Mar 2019 17:18:47 -0400 Subject: [PATCH 16/19] TRUE or FALSE? --- .../species_types/preternis/power_suck.dm | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index da0ac3a0599c..b2f0e490e377 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -28,7 +28,7 @@ return TRUE if(H.gloves) - if(H.gloves.siemens_coefficient == 0) + if(!H.gloves.siemens_coefficient) to_chat(H,"NOTICE: [H.gloves] prevent electrical contact - CONSUME protocol aborted.") draining = FALSE return TRUE @@ -46,7 +46,7 @@ to_chat(H,"Extracutaneous implants detect viable power source. Initiating CONSUME protocol.") - var/done = 0 + var/done = FALSE var/drain = 150 * siemens_coefficient var/cycle = 0 @@ -69,7 +69,7 @@ if(!can_drain || istext(can_drain)) if(istext(can_drain)) to_chat(H,can_drain) - done = 1 + done = TRUE else playsound(A.loc, "sparks", 50, 1) if(prob(75)) @@ -77,18 +77,18 @@ var/drained = A.consume_power_from(drain) if(drained < drain) to_chat(H,"[A]'s power has been depleted, CONSUME protocol halted.") - done = 1 + done = TRUE charge = CLAMP(charge + (drained * ELECTRICITY_TO_NUTRIMENT_FACTOR),PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) if(!done) if(charge > (PRETERNIS_LEVEL_FULL - 25)) to_chat(H,"CONSUME protocol complete. Physical nourishment refreshed.") - done = 1 - else if(cycle % 4 == 0) + done = TRUE + else if(!(cycle % 4)) var/nutperc = round((charge / PRETERNIS_LEVEL_FULL) * 100) to_chat(H,"CONSUME protocol continues. Current satiety level: [nutperc]%.") else - done = 1 + done = TRUE qdel(spark_system) draining = FALSE return TRUE @@ -142,7 +142,7 @@ return "SMES is not outputting power, cannot consume power." if(charge < MIN_DRAINABLE_POWER) return "SMES cells depleted, cannot consume power." - return 1 + return TRUE /obj/machinery/power/smes/consume_power_from(amount) if((charge - amount) < MIN_DRAINABLE_POWER) @@ -156,7 +156,7 @@ return "Mech power cell absent, cannot consume power." if(cell.charge < MIN_DRAINABLE_POWER) return "Mech power cell depleted, cannot consume power." - return 1 + return TRUE /obj/mecha/consume_power_from(amount) occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.") @@ -171,7 +171,7 @@ return "Cyborg power cell absent, cannot consume power." if(cell.charge < MIN_DRAINABLE_POWER) return "Cyborg power cell depleted, cannot consume power." - return 1 + return TRUE /mob/living/silicon/robot/consume_power_from(amount) src << "Warning: Unauthorized access through sub-route 12, block C, detected." From ba28f6611e8f5a2a9929db787646780a918584b1 Mon Sep 17 00:00:00 2001 From: alexkar598 <25136265+alexkar598@users.noreply.github.com> Date: Tue, 12 Mar 2019 15:44:07 -0400 Subject: [PATCH 17/19] bit too high --- .../living/carbon/human/species_types/preternis/preternis.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index e3d651da9b02..804cf556940f 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -27,7 +27,7 @@ adjust_charge - take a positive or negative value to adjust the charge level var/charge = PRETERNIS_LEVEL_FULL var/eating_msg_cooldown = FALSE var/emag_lvl = 0 - var/power_drain = 0.7 //probably going to have to tweak this shit + var/power_drain = 0.5 //probably going to have to tweak this shit var/tesliumtrip = FALSE var/draining = FALSE @@ -158,4 +158,4 @@ adjust_charge - take a positive or negative value to adjust the charge level else if(charge < PRETERNIS_LEVEL_FED) H.throw_alert("preternis_charge", /obj/screen/alert/preternis_charge, 1) else - H.clear_alert("preternis_charge") \ No newline at end of file + H.clear_alert("preternis_charge") From 26f2de3039585d2ea37c3c52a58b532edec453a1 Mon Sep 17 00:00:00 2001 From: alexkar598 <25136265+alexkar598@users.noreply.github.com> Date: Tue, 12 Mar 2019 15:50:26 -0400 Subject: [PATCH 18/19] as you wish master nich --- config/game_options.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/config/game_options.txt b/config/game_options.txt index b2c681e772e1..f0fad9ef9cda 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -445,6 +445,7 @@ ROUNDSTART_RACES lizard #ROUNDSTART_RACES moth ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES shadow +ROUNDSTART_RACES preternis ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal From 77a8f7c047199d49c96b18af79ecd480427edd6b Mon Sep 17 00:00:00 2001 From: alexkar598 <> Date: Thu, 14 Mar 2019 17:21:32 -0400 Subject: [PATCH 19/19] finalization,buffs power charging --- code/__DEFINES/~yogs_defines/mobs.dm | 2 +- .../living/carbon/human/species_types/preternis/power_suck.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/~yogs_defines/mobs.dm b/code/__DEFINES/~yogs_defines/mobs.dm index fd59ed3ed5d7..0ef3d1f09169 100644 --- a/code/__DEFINES/~yogs_defines/mobs.dm +++ b/code/__DEFINES/~yogs_defines/mobs.dm @@ -5,7 +5,7 @@ #define PRETERNIS_LEVEL_STARVING 150 #define PRETERNIS_LEVEL_NONE 0 -#define ELECTRICITY_TO_NUTRIMENT_FACTOR 0.12 //1 power unit to 12 preternis charge +#define ELECTRICITY_TO_NUTRIMENT_FACTOR 0.44 //1 power unit to 44 preternis charge they can uncharge an apc to 50% at most #define PRETERNIS_NV_OFF 2 //numbers of tile they can see #define PRETERNIS_NV_ON 8 diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm index b2f0e490e377..7eeb693c948f 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/power_suck.dm @@ -64,7 +64,7 @@ nutritionIncrease = CLAMP(PRETERNIS_LEVEL_FULL - charge, PRETERNIS_LEVEL_NONE,PRETERNIS_LEVEL_FULL) //if their nutrition goes up from some other source, this could be negative, which would cause bad things to happen. drain = nutritionIncrease/ELECTRICITY_TO_NUTRIMENT_FACTOR - if (do_after(H,15, target = A)) + if (do_after(H,5, target = A)) var/can_drain = A.can_consume_power_from() if(!can_drain || istext(can_drain)) if(istext(can_drain))