diff --git a/aurorastation.dme b/aurorastation.dme index f28021a3105..a2908260096 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1852,10 +1852,12 @@ #include "code\modules\organs\subtypes\diona.dm" #include "code\modules\organs\subtypes\industrial.dm" #include "code\modules\organs\subtypes\machine.dm" +#include "code\modules\organs\subtypes\parasite.dm" #include "code\modules\organs\subtypes\resomi.dm" #include "code\modules\organs\subtypes\skrell.dm" #include "code\modules\organs\subtypes\standard.dm" #include "code\modules\organs\subtypes\unbreakable.dm" +#include "code\modules\organs\subtypes\vaurca.dm" #include "code\modules\organs\subtypes\xenos.dm" #include "code\modules\overmap\_defines.dm" #include "code\modules\overmap\sectors.dm" diff --git a/code/__defines/hydroponics.dm b/code/__defines/hydroponics.dm index a6bb7399f0f..5edafb92f6f 100644 --- a/code/__defines/hydroponics.dm +++ b/code/__defines/hydroponics.dm @@ -57,4 +57,5 @@ #define TRAIT_BIOLUM_COLOUR 37 #define TRAIT_IMMUTABLE 38 #define TRAIT_FLESH_COLOUR 39 -#define TRAIT_SPOROUS 40 \ No newline at end of file +#define TRAIT_SPOROUS 40 +#define TRAIT_BIOLUM_PWR 41 \ No newline at end of file diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 6e8d128b046..647a9bd4ab9 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -229,9 +229,14 @@ ..() if(seed.get_trait(TRAIT_SPREAD)) for(var/turf/T in targetTurfs) - if(locate(/obj/machinery/portable_atmospherics/hydroponics/soil/invisible in T)) + var/bad_turf = 0 + for(var/obj/O in T) + if(O.density || istype(O, /obj/machinery/portable_atmospherics/hydroponics)) + bad_turf = 1 + break + if(bad_turf) continue - if(prob(seed.get_trait(round(TRAIT_POTENCY/5)))) + if(prob(min(seed.get_trait(TRAIT_POTENCY),50))) new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(T,seed) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 234c982bf13..3faf63a7ee6 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -47,6 +47,7 @@ set_trait(TRAIT_PLANT_ICON, 0) // Icon to use for the plant growing in the tray. set_trait(TRAIT_PRODUCT_COLOUR, 0) // Colour to apply to product icon. set_trait(TRAIT_BIOLUM_COLOUR, 0) // The colour of the plant's radiance. + set_trait(TRAIT_BIOLUM_PWR, 1) // The power of the plant's radiance. set_trait(TRAIT_POTENCY, 1) // General purpose plant strength value. set_trait(TRAIT_REQUIRES_NUTRIENTS, 1) // The plant can starve. set_trait(TRAIT_REQUIRES_WATER, 1) // The plant can become dehydrated. @@ -91,7 +92,7 @@ var/datum/reagents/R = new/datum/reagents(100) if(chems.len) for(var/rid in chems) - var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/3)) + var/injecting = max(1,get_trait(TRAIT_POTENCY)/5) R.add_reagent(rid,injecting) var/datum/effect/effect/system/smoke_spread/chem/spores/S = new(name) @@ -171,10 +172,15 @@ if(!istype(splat)) // Plants handle their own stuff. splat.name = "[thrown.name] [pick("smear","smudge","splatter")]" if(get_trait(TRAIT_BIOLUM)) + var/pwr + if(get_trait(TRAIT_BIOLUM_PWR) == 0) + pwr = get_trait(TRAIT_BIOLUM) + else + pwr = get_trait(TRAIT_BIOLUM_PWR) var/clr if(get_trait(TRAIT_BIOLUM_COLOUR)) clr = get_trait(TRAIT_BIOLUM_COLOUR) - splat.set_light(get_trait(TRAIT_BIOLUM), l_color = clr) + splat.set_light(get_trait(TRAIT_POTENCY)/10, pwr, clr) var/flesh_colour = get_trait(TRAIT_FLESH_COLOUR) if(!flesh_colour) flesh_colour = get_trait(TRAIT_PRODUCT_COLOUR) if(flesh_colour) splat.color = get_trait(TRAIT_PRODUCT_COLOUR) @@ -473,6 +479,13 @@ if(prob(5)) set_trait(TRAIT_BIOLUM,1) set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190)) + if(prob(5)) + set_trait(TRAIT_BIOLUM_PWR,rand(0,-5)-rand()) + else + set_trait(TRAIT_BIOLUM_PWR,rand(0,5)+rand()) + + if(prob(5)) + set_trait(TRAIT_SPOROUS,1) set_trait(TRAIT_ENDURANCE,rand(60,100)) set_trait(TRAIT_YIELD,rand(3,15)) @@ -534,6 +547,8 @@ if(prob(degree*5)) set_trait(TRAIT_SPREAD, get_trait(TRAIT_SPREAD)+rand(-1,1),2, 0) source_turf.visible_message("\The [display_name] spasms visibly, shifting in the tray.") + if(prob(degree*5)) + set_trait(TRAIT_SPOROUS, !get_trait(TRAIT_SPOROUS)) if(9) set_trait(TRAIT_MATURATION, get_trait(TRAIT_MATURATION)+(rand(-1,1)*degree),30, 0) if(prob(degree*5)) @@ -624,7 +639,7 @@ P.values["[TRAIT_EXUDE_GASSES]"] = exude_gasses traits_to_copy = list(TRAIT_POTENCY) if(GENE_OUTPUT) - traits_to_copy = list(TRAIT_PRODUCES_POWER,TRAIT_BIOLUM) + traits_to_copy = list(TRAIT_PRODUCES_POWER,TRAIT_BIOLUM, TRAIT_BIOLUM_PWR) if(GENE_ATMOSPHERE) traits_to_copy = list(TRAIT_HEAT_TOLERANCE,TRAIT_LOWKPA_TOLERANCE,TRAIT_HIGHKPA_TOLERANCE) if(GENE_HARDINESS) @@ -642,7 +657,7 @@ if(GENE_PIGMENT) traits_to_copy = list(TRAIT_PLANT_COLOUR,TRAIT_PRODUCT_COLOUR,TRAIT_BIOLUM_COLOUR) if(GENE_STRUCTURE) - traits_to_copy = list(TRAIT_PLANT_ICON,TRAIT_PRODUCT_ICON,TRAIT_HARVEST_REPEAT) + traits_to_copy = list(TRAIT_PLANT_ICON,TRAIT_PRODUCT_ICON,TRAIT_HARVEST_REPEAT, TRAIT_SPOROUS) if(GENE_FRUIT) traits_to_copy = list(TRAIT_STINGS,TRAIT_EXPLOSIVE,TRAIT_FLESH_COLOUR,TRAIT_JUICY) if(GENE_SPECIAL) @@ -705,10 +720,15 @@ product.desc += " On second thought, something about this one looks strange." if(get_trait(TRAIT_BIOLUM)) + var/pwr + if(get_trait(TRAIT_BIOLUM_PWR) == 0) + pwr = get_trait(TRAIT_BIOLUM) + else + pwr = get_trait(TRAIT_BIOLUM_PWR) var/clr if(get_trait(TRAIT_BIOLUM_COLOUR)) clr = get_trait(TRAIT_BIOLUM_COLOUR) - product.set_light(get_trait(TRAIT_BIOLUM), l_color = clr) + product.set_light(get_trait(TRAIT_POTENCY)/10, pwr, clr) //Handle spawning in living, mobile products (like dionaea). if(istype(product,/mob/living)) diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 7046456c0ab..a762be0eb73 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -383,12 +383,12 @@ seed_name = "kois" seed_noun = "spores" display_name = "k'ois spores" - mutants = null chems = list( "koispaste" = list(4), "phoron" = list(8)) splat_type = /obj/effect/plant kitchen_tag = "koisspore" + mutants = list("blackkois") /datum/seed/koisspore/setup_traits() ..() @@ -397,7 +397,7 @@ set_trait(TRAIT_MATURATION,5) set_trait(TRAIT_PRODUCTION,1) set_trait(TRAIT_YIELD,3) - set_trait(TRAIT_POTENCY,60) + set_trait(TRAIT_POTENCY,40) set_trait(TRAIT_BIOLUM,1) set_trait(TRAIT_IDEAL_LIGHT,1) set_trait(TRAIT_LIGHT_TOLERANCE,2) @@ -407,6 +407,22 @@ set_trait(TRAIT_PLANT_COLOUR,"#E6E600") set_trait(TRAIT_PLANT_ICON,"mushroom6") +/datum/seed/koisspore/black + name = "blackkois" + mutants = null + chems = list( + "blackkois" = list(4), + "phoron" = list(2)) + +/datum/seed/koisspore/black/setup_traits() + ..() + set_trait(TRAIT_BIOLUM_PWR,-1.5) + set_trait(TRAIT_POTENCY,60) + set_trait(TRAIT_IDEAL_LIGHT,0) + set_trait(TRAIT_LIGHT_TOLERANCE,8) + set_trait(TRAIT_BIOLUM_COLOUR,"#FFFFFF") + set_trait(TRAIT_PRODUCT_COLOUR,"#31004A") + set_trait(TRAIT_PLANT_COLOUR,"#31004A") /datum/seed/mushroom/mold name = "mold" diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index d7444cdc3da..d1a56dcc19e 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -284,3 +284,6 @@ var/global/list/plant_seed_sprites = list() /obj/item/seeds/koisspore seed_type = "koisspore" + +/obj/item/seeds/blackkois + seed_type = "blackkois" \ No newline at end of file diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 039bc6bc1e9..daf28aad10b 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -234,7 +234,7 @@ weedlevel += 1 * HYDRO_SPEED_MULTIPLIER pestlevel = 0 if(prob(min(25,max(1,seed.get_trait(TRAIT_POTENCY/2))))) - if(seed.get_trait(TRAIT_SPOROUS)) + if(seed.get_trait(TRAIT_SPOROUS) && !closed_system) seed.create_spores(get_turf(src)) visible_message("\The [src] releases its spores!") diff --git a/code/modules/hydroponics/trays/tray_process.dm b/code/modules/hydroponics/trays/tray_process.dm index 515a4259ef1..d9adaa62c2c 100644 --- a/code/modules/hydroponics/trays/tray_process.dm +++ b/code/modules/hydroponics/trays/tray_process.dm @@ -119,7 +119,7 @@ (!harvest && !dead)) harvest = 1 lastproduce = age - if(seed.get_trait(TRAIT_SPOROUS)) + if(seed.get_trait(TRAIT_SPOROUS) && !closed_system) seed.create_spores(get_turf(src)) visible_message("\The [src] releases its spores!") diff --git a/code/modules/hydroponics/trays/tray_update_icons.dm b/code/modules/hydroponics/trays/tray_update_icons.dm index a4d1c19ee91..cb43c365a6f 100644 --- a/code/modules/hydroponics/trays/tray_update_icons.dm +++ b/code/modules/hydroponics/trays/tray_update_icons.dm @@ -75,15 +75,17 @@ // Update bioluminescence. if(seed && seed.get_trait(TRAIT_BIOLUM)) + var/pwr + if(seed.get_trait(TRAIT_BIOLUM_PWR) == 0) + pwr = seed.get_trait(TRAIT_BIOLUM) + else + pwr = seed.get_trait(TRAIT_BIOLUM_PWR) var/clr if(seed.get_trait(TRAIT_BIOLUM_COLOUR)) clr = seed.get_trait(TRAIT_BIOLUM_COLOUR) - var/val = round(seed.get_trait(TRAIT_POTENCY)/10) - if (val != last_biolum) - last_biolum = val - set_light(val, l_color = clr) + set_light(seed.get_trait(TRAIT_POTENCY)/10, pwr, clr) return - + if (last_biolum) set_light(0) last_biolum = null diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 5c35463dc8c..947784742b9 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -142,7 +142,8 @@ var/msg = "[name], [speaker_mask][format_message(message, get_spoken_verb(message))]" - speaker.custom_emote(1, "[pick("twitches their antennae", "twitches their antennae rhythmically")].") + if(isvaurca(speaker)) + speaker.custom_emote(1, "[pick("twitches their antennae", "twitches their antennae rythmically")].") if (within_jamming_range(speaker)) // The user thinks that the message got through. @@ -164,7 +165,9 @@ return 0 if(within_jamming_range(other)) return 0 - if(locate(/obj/item/organ/vaurca/neuralsocket) in M.internal_organs) + if(M.internal_organs_by_name["neural socket"]) + return 1 + if(M.internal_organs_by_name["blackkois"]) return 1 if (M.l_ear || M.r_ear) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index eb8b4d2b135..0da25b356bf 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -120,8 +120,8 @@ if(!owner) return - if(lobotomized && (owner.getBrainLoss() < 50)) //lobotomized brains cannot be healed with chemistry. Part of the brain is irrevocably missing. Can be fixed magically with cloning, ofc. - owner.setBrainLoss(50) + if(lobotomized && (owner.getBrainLoss() < 40)) //lobotomized brains cannot be healed with chemistry. Part of the brain is irrevocably missing. Can be fixed magically with cloning, ofc. + owner.setBrainLoss(40) /obj/item/organ/brain/slime name = "slime core" diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 6108e69a450..170d6949271 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -255,21 +255,27 @@ src << "You must have an aggressive grab to gut your prey!" return - last_special = world.time + 25 - - visible_message("\The [src] rips viciously at \the [G.affecting]'s flesh with its mandibles!") - if(istype(G.affecting,/mob/living/carbon/human)) var/mob/living/carbon/human/H = G.affecting - H.apply_damage(25,BRUTE, sharp=1, edge=1) + var/hit_zone = zone_sel.selecting + var/obj/item/organ/external/affected = H.get_organ(hit_zone) + + if(!affected || affected.is_stump()) + H << "They are missing that limb!" + return + + H.apply_damage(25, BRUTE, hit_zone, sharp = 1, edge = 1) + visible_message("\The [src] rips viciously at \the [G.affecting]'s [affected] with its mandibles!") msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(H)] (JMP)",ckey=key_name(src),ckey_target=key_name(H)) else var/mob/living/M = G.affecting if(!istype(M)) return M.apply_damage(25,BRUTE, sharp=1, edge=1) + visible_message("\The [src] rips viciously at \the [G.affecting]'s flesh with its mandibles!") msg_admin_attack("[key_name_admin(src)] mandible'd [key_name_admin(M)] (JMP)",ckey=key_name(src),ckey_target=key_name(M)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1) + last_special = world.time + 25 /mob/living/carbon/human/proc/detonate_flechettes() set category = "Hunter-Killer" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index b5ab7a5e9f8..afa0afa8846 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -48,8 +48,8 @@ owner.organs -= src if(owner.organs_by_name) owner.organs_by_name -= src - - owner = null + + owner = null QDEL_NULL(dna) return ..() diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index d909baf77c5..ba212f4cb67 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -174,324 +174,3 @@ icon_state = "appendixinflamed" name = "inflamed appendix" ..() - -//VAURCA ORGANS -/obj/item/organ/heart/left - name = "heart" - icon_state = "heart-on" - organ_tag = "left heart" - parent_organ = "chest" - dead_icon = "heart-off" - -/obj/item/organ/heart/right - name = "heart" - icon_state = "heart-on" - organ_tag = "right heart" - parent_organ = "chest" - dead_icon = "heart-off" - -/obj/item/organ/vaurca/neuralsocket - name = "neural socket" - organ_tag = "neural socket" - icon = 'icons/mob/alien.dmi' - icon_state = "neural_socket" - parent_organ = "head" - robotic = 2 - -obj/item/organ/vaurca/neuralsocket/process() - if (is_broken()) - if (all_languages[LANGUAGE_VAURCA] in owner.languages) - owner.remove_language(LANGUAGE_VAURCA) - owner << "Your mind suddenly grows dark as the unity of the Hive is torn from you." - else - if (!(all_languages[LANGUAGE_VAURCA] in owner.languages)) - owner.add_language(LANGUAGE_VAURCA) - owner << " Your mind expands, and your thoughts join the unity of the Hivenet." - ..() - -/obj/item/organ/vaurca/neuralsocket/replaced(var/mob/living/carbon/human/target) - if (!(all_languages[LANGUAGE_VAURCA] in owner.languages)) - owner.add_language(LANGUAGE_VAURCA) - owner << " Your mind expands, and your thoughts join the unity of the Hivenet." - ..() - -/obj/item/organ/vaurca/neuralsocket/removed(var/mob/living/carbon/human/target) - if(all_languages[LANGUAGE_VAURCA] in target.languages) - target.remove_language(LANGUAGE_VAURCA) - target << "Your mind suddenly grows dark as the unity of the Hive is torn from you." - ..() - -/obj/item/organ/vaurca/filtrationbit - name = "filtration bit" - organ_tag = "filtration bit" - parent_organ = "head" - icon = 'icons/mob/alien.dmi' - icon_state = "filter" - robotic = 2 - -/obj/item/organ/vaurca/preserve - name = "phoron reserve tank" - organ_tag = "phoron reserve tank" - parent_organ = "chest" - icon = 'icons/mob/alien.dmi' - icon_state = "breathing_app" - robotic = 1 - var/datum/gas_mixture/air_contents = null - var/distribute_pressure = ((2*ONE_ATMOSPHERE)*O2STANDARD) - var/volume = 50 - var/manipulated_by = null - -/obj/item/organ/vaurca/preserve/Initialize() - . = ..() - - air_contents = new /datum/gas_mixture() - air_contents.adjust_gas("phoron", (ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - air_contents.volume = volume //liters - air_contents.temperature = T20C - distribute_pressure = ((pick(2.4,2.8,3.2,3.6)*ONE_ATMOSPHERE)*O2STANDARD) - - START_PROCESSING(SSprocessing, src) - var/mob/living/carbon/location = loc - - location.internal = src - usr << "You open \the [src] valve." - if (location.internals) - location.internals.icon_state = "internal1" - - return - -/obj/item/organ/vaurca/preserve/Destroy() - if(air_contents) - qdel(air_contents) - - STOP_PROCESSING(SSprocessing, src) - return ..() - -/obj/item/organ/vaurca/preserve/examine(mob/user) - . = ..(user, 0) - if(.) - var/celsius_temperature = air_contents.temperature - T0C - var/descriptive - switch(celsius_temperature) - if(300 to INFINITY) - descriptive = "furiously hot" - if(100 to 300) - descriptive = "hot" - if(80 to 100) - descriptive = "warm" - if(40 to 80) - descriptive = "lukewarm" - if(20 to 40) - descriptive = "room temperature" - else - descriptive = "cold" - user << "\The [src] feels [descriptive]." - -/obj/item/organ/vaurca/preserve/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - var/obj/icon = src - - if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) - for (var/mob/O in viewers(user, null)) - O << "[user] has used [W] on \icon[icon] [src]" - - var/pressure = air_contents.return_pressure() - manipulated_by = user.real_name //This person is aware of the contents of the tank. - var/total_moles = air_contents.total_moles - - user << "Results of analysis of \icon[icon]" - if (total_moles>0) - user << "Pressure: [round(pressure,0.1)] kPa" - for(var/g in air_contents.gas) - user << "[gas_data.name[g]]: [(round(air_contents.gas[g] / total_moles) * 100)]%" - user << "Temperature: [round(air_contents.temperature-T0C)]°C" - else - user << "Tank is empty!" - src.add_fingerprint(user) - else if (istype(W,/obj/item/latexballon)) - var/obj/item/latexballon/LB = W - LB.blow(src) - src.add_fingerprint(user) - -/obj/item/organ/vaurca/preserve/attack_self(mob/user as mob) - if (!(src.air_contents)) - return - - ui_interact(user) - -/obj/item/organ/vaurca/preserve/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/mob/living/carbon/location = null - - var/using_internal - if(istype(location)) - if(location.internal==src) - using_internal = 1 - - // this is the data which will be sent to the ui - var/data[0] - data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) - data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0) - data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE) - data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE) - data["valveOpen"] = using_internal ? 1 : 0 - - data["maskConnected"] = 0 - - if(istype(location)) - var/mask_check = 0 - - if(location.internal == src) // if tank is current internal - mask_check = 1 - else if(src in location) // or if tank is in the mobs possession - if(!location.internal) // and they do not have any active internals - mask_check = 1 - else if(istype(src.loc, /obj/item/weapon/rig) && src.loc in location) // or the rig is in the mobs possession - if(!location.internal) // and they do not have any active internals - mask_check = 1 - - if(mask_check) - if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) - data["maskConnected"] = 1 - else if(istype(location, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = location - if(H.head && (H.head.flags & AIRTIGHT)) - data["maskConnected"] = 1 - - // update the ui if it exists, returns null if no ui is passed/found - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - // the ui does not exist, so we'll create a new() one - // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm - ui = new(user, src, ui_key, "tanks.tmpl", "Tank", 500, 300) - // when the ui is first opened this is the data it will use - ui.set_initial_data(data) - // open the new ui window - ui.open() - // auto update every Master Controller tick - ui.set_auto_update(1) - -/obj/item/organ/vaurca/preserve/Topic(href, href_list) - ..() - if (usr.stat|| usr.restrained()) - return 0 - if (src.loc != usr) - return 0 - - if (href_list["dist_p"]) - if (href_list["dist_p"] == "reset") - src.distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE - else if (href_list["dist_p"] == "max") - src.distribute_pressure = TANK_MAX_RELEASE_PRESSURE - else - var/cp = text2num(href_list["dist_p"]) - src.distribute_pressure += cp - src.distribute_pressure = min(max(round(src.distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE) - if (href_list["stat"]) - if(istype(loc,/mob/living/carbon)) - var/mob/living/carbon/location = loc - if(location.internal == src) - location.internal = null - location.internals.icon_state = "internal0" - usr << "You close the tank release valve." - if (location.internals) - location.internals.icon_state = "internal0" - else - - var/can_open_valve - if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) - can_open_valve = 1 - else if(istype(location,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = location - if(H.head && (H.head.flags & AIRTIGHT)) - can_open_valve = 1 - - if(can_open_valve) - location.internal = src - usr << "You open \the [src] valve." - if (location.internals) - location.internals.icon_state = "internal1" - else - usr << "You need something to connect to \the [src]." - - src.add_fingerprint(usr) - return 1 - - -/obj/item/organ/vaurca/preserve/remove_air(amount) - return air_contents.remove(amount) - -/obj/item/organ/vaurca/preserve/return_air() - return air_contents - -/obj/item/organ/vaurca/preserve/assume_air(datum/gas_mixture/giver) - air_contents.merge(giver) - - check_status() - return 1 - -/obj/item/organ/vaurca/preserve/proc/remove_air_volume(volume_to_return) - if(!air_contents) - return null - - var/tank_pressure = air_contents.return_pressure() - if((tank_pressure < distribute_pressure) && prob(5)) - owner << "There is a buzzing in your [parent_organ]." - - var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature) - - return remove_air(moles_needed) - -/obj/item/organ/vaurca/preserve/process() - //Allow for reactions - air_contents.react() //cooking up air tanks - add phoron and oxygen, then heat above PHORON_MINIMUM_BURN_TEMPERATURE - check_status() - ..() - - -/obj/item/organ/vaurca/preserve/proc/check_status() - //Handle exploding, leaking, and rupturing of the tank - - if(!air_contents) - return 0 - - var/pressure = air_contents.return_pressure() - if(pressure > TANK_FRAGMENT_PRESSURE) - if(!istype(src.loc,/obj/item/device/transfer_valve)) - message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") - log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") - - //Give the gas a chance to build up more pressure through reacting - air_contents.react() - air_contents.react() - air_contents.react() - - pressure = air_contents.return_pressure() - var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE - - explosion( - get_turf(loc), - round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)), - round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)), - round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)), - round(min(BOMBCAP_FLASH_RADIUS, range*1.50)) - ) - qdel(src) - - else if(pressure > (8.0*ONE_ATMOSPHERE)) - - if(damage >= 60) - var/turf/simulated/T = get_turf(src) - if(!T) - return - T.assume_air(air_contents) - playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) - qdel(src) - - else if(pressure > (5.0*ONE_ATMOSPHERE)) - - if(damage >= 45) - var/turf/simulated/T = get_turf(src) - if(!T) - return - var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25) - T.assume_air(leaked_gas) diff --git a/code/modules/organs/subtypes/parasite.dm b/code/modules/organs/subtypes/parasite.dm new file mode 100644 index 00000000000..1d4017ca87c --- /dev/null +++ b/code/modules/organs/subtypes/parasite.dm @@ -0,0 +1,196 @@ +/obj/item/organ/parasite + name = "parasite" + icon = 'icons/mob/alien.dmi' + icon_state = "burst_lie" + dead_icon = "bursted_lie" + + organ_tag = "parasite" + var/stage = 1 + var/max_stage = 4 + var/stage_ticker = 0 + var/stage_interval = 600 //time between stages, in seconds + var/subtle = 0 //will the body reject the parasite naturally? + +/obj/item/organ/parasite/process() + ..() + + if(!owner) + return + + if(stage < max_stage) + stage_ticker += 2 //process ticks every ~2 seconds + + if(stage_ticker >= stage*stage_interval) + stage = min(stage+1,max_stage) + +/obj/item/organ/parasite/handle_rejection() + if(subtle) + return ..() + else + if(rejecting) + rejecting = 0 + return + +/////////////////// +///K'ois Mycosis/// +/////////////////// + +/obj/item/organ/parasite/kois + name = "k'ois mycosis" + icon_state = "kois-on" + dead_icon = "kois-off" + + organ_tag = "kois" + + parent_organ = "chest" + +/obj/item/organ/parasite/kois/process() + ..() + + if(prob(10) && !(owner.species.flags & NO_PAIN)) + owner << "You feel a stinging pain in your abdomen!" + owner.emote("me",1,"winces slightly.") + owner.adjustHalLoss(5) + + else if(prob(10) && !(owner.species.flags & NO_BREATHE)) + owner.emote("cough") + + else if(prob(10) && !(owner.species.flags & NO_BREATHE)) + owner.emote("me", 1, "coughs up blood!") + owner.drip(10) + + if(stage >= 2) + if(prob(10) && !(owner.species.flags & NO_BREATHE)) + owner.emote("me", 1, "gasps for air!") + owner.losebreath += 5 + + if(stage >= 3) + set_light(1, l_color = "#E6E600") + if(prob(10)) + owner << "You feel something squirming inside of you!" + owner.reagents.add_reagent("phoron", 8) + owner.reagents.add_reagent("koispaste", 5) + + if(stage >= 4) + if(prob(10)) + owner << "You feel something alien coming up your throat!" + owner.emote("cough") + + var/turf/T = get_turf(owner) + + var/datum/reagents/R = new/datum/reagents(100) + R.add_reagent("koispaste",10) + R.add_reagent("phoron",10) + var/datum/effect/effect/system/smoke_spread/chem/spores/S = new("koisspore") + + S.attach(T) + S.set_up(R, 20, 0, T, 40) + S.start() + + if(!(owner.species.flags & NO_PAIN)) + owner.emote("scream") + owner.adjustHalLoss(15) + owner.drip(15) + owner.delayed_vomit() + +/////////////////// +///Black Mycosis/// +/////////////////// + +/obj/item/organ/parasite/blackkois + name = "k'ois mycosis" + icon_state = "black-on" + dead_icon = "black-off" + subtle = 1 + + organ_tag = "blackkois" + + parent_organ = "head" + var/removed_langs = 0 + +/obj/item/organ/parasite/blackkois/process() + ..() + + if(prob(10) && !(owner.species.flags & NO_PAIN)) + if(stage < 3) + owner << "You feel a stinging pain in your abdomen!" + else + owner << "You feel a stinging pain in your head!" + owner.emote("me",1,"winces slightly.") + owner.adjustHalLoss(5) + + if(stage >= 2) + if(prob(10) && !(owner.species.flags & NO_BREATHE)) + owner.emote("me", 1, "gasps for air!") + owner.losebreath += 5 + + if(stage >= 3) + set_light(-1.5, 6, "#FFFFFF") + if(!(all_languages[LANGUAGE_VAURCA] in owner.languages)) + owner.add_language(LANGUAGE_VAURCA) + owner << " Your mind expands, and your thoughts join the unity of the Hivenet." + + if(prob(5)) + owner << "You feel something squirming inside of you!" + owner.reagents.add_reagent("phoron", 4) + + else if(prob(10)) + owner << "You feel disorientated!" + switch(rand(1,3)) + if(1) + owner.confused += 10 + owner.apply_effect(10,EYE_BLUR) + if(2) + owner.slurring += 30 + if(3) + owner.make_dizzy(10) + + if(stage >= 4) + + var/obj/item/organ/brain/B = owner.internal_organs_by_name["brain"] + + if(B && !B.lobotomized) + owner << "As the K'ois consumes your mind, you feel your past self, your memories, your very being slip away... only slavery to the swarm remains..." + owner << "You have been lobotomized by K'ois infection. All of your previous memories up until this point are gone, and all of your ambitions are nothing. You live for only one purpose; to serve the Lii'dra hive." + + B.lobotomized = 1 + + + if(!removed_langs) + for(var/datum/language/L in owner.languages) + owner.remove_language(L.name) + owner.add_language(LANGUAGE_VAURCA) + removed_langs = 1 + + if(prob(10)) + if(!(owner.species.flags & NO_PAIN)) + owner << "You feel an unbearable pain in your mind!" + owner.emote("scream") + owner.adjustBrainLoss(1) + + else if(prob(10)) + owner << "You feel something alien coming up your throat!" + + var/turf/T = get_turf(owner) + + var/datum/reagents/R = new/datum/reagents(100) + R.add_reagent("blackkois",10) + R.add_reagent("phoron",10) + var/datum/effect/effect/system/smoke_spread/chem/spores/S = new("blackkois") + + S.attach(T) + S.set_up(R, 20, 0, T, 40) + S.start() + + if(!(owner.species.flags & NO_PAIN)) + owner.emote("scream") + owner.adjustHalLoss(15) + owner.drip(15) + owner.delayed_vomit() + +/obj/item/organ/parasite/blackkois/removed(var/mob/living/carbon/human/target) + if(all_languages[LANGUAGE_VAURCA] in target.languages && stage >= 3 && !isvaurca(target)) + target.remove_language(LANGUAGE_VAURCA) + target << "Your mind suddenly grows dark as the unity of the Hive is torn from you." + removed_langs = 0 + ..() diff --git a/code/modules/organs/subtypes/vaurca.dm b/code/modules/organs/subtypes/vaurca.dm new file mode 100644 index 00000000000..600809d4ddc --- /dev/null +++ b/code/modules/organs/subtypes/vaurca.dm @@ -0,0 +1,315 @@ +/obj/item/organ/heart/left + name = "heart" + icon_state = "heart-on" + organ_tag = "left heart" + parent_organ = "chest" + dead_icon = "heart-off" + +/obj/item/organ/heart/right + name = "heart" + icon_state = "heart-on" + organ_tag = "right heart" + parent_organ = "chest" + dead_icon = "heart-off" + +/obj/item/organ/vaurca/neuralsocket + name = "neural socket" + organ_tag = "neural socket" + icon = 'icons/mob/alien.dmi' + icon_state = "neural_socket" + parent_organ = "head" + robotic = 2 + +obj/item/organ/vaurca/neuralsocket/process() + if (is_broken()) + if (all_languages[LANGUAGE_VAURCA] in owner.languages) + owner.remove_language(LANGUAGE_VAURCA) + owner << "Your mind suddenly grows dark as the unity of the Hive is torn from you." + else + if (!(all_languages[LANGUAGE_VAURCA] in owner.languages)) + owner.add_language(LANGUAGE_VAURCA) + owner << " Your mind expands, and your thoughts join the unity of the Hivenet." + ..() + +/obj/item/organ/vaurca/neuralsocket/replaced(var/mob/living/carbon/human/target) + if (!(all_languages[LANGUAGE_VAURCA] in owner.languages)) + owner.add_language(LANGUAGE_VAURCA) + owner << " Your mind expands, and your thoughts join the unity of the Hivenet." + ..() + +/obj/item/organ/vaurca/neuralsocket/removed(var/mob/living/carbon/human/target) + if(all_languages[LANGUAGE_VAURCA] in target.languages) + target.remove_language(LANGUAGE_VAURCA) + target << "Your mind suddenly grows dark as the unity of the Hive is torn from you." + ..() + +/obj/item/organ/vaurca/filtrationbit + name = "filtration bit" + organ_tag = "filtration bit" + parent_organ = "head" + icon = 'icons/mob/alien.dmi' + icon_state = "filter" + robotic = 2 + +/obj/item/organ/vaurca/preserve + name = "phoron reserve tank" + organ_tag = "phoron reserve tank" + parent_organ = "chest" + icon = 'icons/mob/alien.dmi' + icon_state = "breathing_app" + robotic = 1 + var/datum/gas_mixture/air_contents = null + var/distribute_pressure = ((2*ONE_ATMOSPHERE)*O2STANDARD) + var/volume = 50 + var/manipulated_by = null + +/obj/item/organ/vaurca/preserve/Initialize() + . = ..() + + air_contents = new /datum/gas_mixture() + air_contents.adjust_gas("phoron", (ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.volume = volume //liters + air_contents.temperature = T20C + distribute_pressure = ((pick(2.4,2.8,3.2,3.6)*ONE_ATMOSPHERE)*O2STANDARD) + + var/mob/living/carbon/location = loc + + location.internal = src + if (location.internals) + location.internals.icon_state = "internal1" + + return + +/obj/item/organ/vaurca/preserve/Destroy() + if(air_contents) + QDEL_NULL(air_contents) + + return ..() + +/obj/item/organ/vaurca/preserve/examine(mob/user) + . = ..(user, 0) + if(.) + var/celsius_temperature = air_contents.temperature - T0C + var/descriptive + switch(celsius_temperature) + if(300 to INFINITY) + descriptive = "furiously hot" + if(100 to 300) + descriptive = "hot" + if(80 to 100) + descriptive = "warm" + if(40 to 80) + descriptive = "lukewarm" + if(20 to 40) + descriptive = "room temperature" + else + descriptive = "cold" + user << "\The [src] feels [descriptive]." + +/obj/item/organ/vaurca/preserve/attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + var/obj/icon = src + + if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) + user.visible_message("[user] has used [W] on \icon[icon] [src]") + + var/pressure = air_contents.return_pressure() + manipulated_by = user.real_name //This person is aware of the contents of the tank. + var/total_moles = air_contents.total_moles + + user << "Results of analysis of \icon[icon]" + if (total_moles>0) + user << "Pressure: [round(pressure,0.1)] kPa" + for(var/g in air_contents.gas) + user << "[gas_data.name[g]]: [(round(air_contents.gas[g] / total_moles) * 100)]%" + user << "Temperature: [round(air_contents.temperature-T0C)]°C" + else + user << "Tank is empty!" + src.add_fingerprint(user) + else if (istype(W,/obj/item/latexballon)) + var/obj/item/latexballon/LB = W + LB.blow(src) + src.add_fingerprint(user) + +/obj/item/organ/vaurca/preserve/attack_self(mob/user as mob) + if (!(src.air_contents)) + return + + ui_interact(user) + +/obj/item/organ/vaurca/preserve/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/mob/living/carbon/location = null + + var/using_internal + if(istype(location)) + if(location.internal==src) + using_internal = 1 + + // this is the data which will be sent to the ui + var/data[0] + data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) + data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0) + data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE) + data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE) + data["valveOpen"] = using_internal ? 1 : 0 + + data["maskConnected"] = 0 + + if(istype(location)) + var/mask_check = 0 + + if(location.internal == src) // if tank is current internal + mask_check = 1 + else if(src in location) // or if tank is in the mobs possession + if(!location.internal) // and they do not have any active internals + mask_check = 1 + else if(istype(src.loc, /obj/item/weapon/rig) && src.loc in location) // or the rig is in the mobs possession + if(!location.internal) // and they do not have any active internals + mask_check = 1 + + if(mask_check) + if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) + data["maskConnected"] = 1 + else if(istype(location, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = location + if(H.head && (H.head.flags & AIRTIGHT)) + data["maskConnected"] = 1 + + // update the ui if it exists, returns null if no ui is passed/found + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + // the ui does not exist, so we'll create a new() one + // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm + ui = new(user, src, ui_key, "tanks.tmpl", "Tank", 500, 300) + // when the ui is first opened this is the data it will use + ui.set_initial_data(data) + // open the new ui window + ui.open() + // auto update every Master Controller tick + ui.set_auto_update(1) + +/obj/item/organ/vaurca/preserve/Topic(href, href_list) + ..() + if (usr.stat|| usr.restrained()) + return 0 + if (src.loc != usr) + return 0 + + if (href_list["dist_p"]) + if (href_list["dist_p"] == "reset") + src.distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + else if (href_list["dist_p"] == "max") + src.distribute_pressure = TANK_MAX_RELEASE_PRESSURE + else + var/cp = text2num(href_list["dist_p"]) + src.distribute_pressure += cp + src.distribute_pressure = min(max(round(src.distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE) + if (href_list["stat"]) + if(istype(loc,/mob/living/carbon)) + var/mob/living/carbon/location = loc + if(location.internal == src) + location.internal = null + location.internals.icon_state = "internal0" + usr << "You close the tank release valve." + if (location.internals) + location.internals.icon_state = "internal0" + else + + var/can_open_valve + if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) + can_open_valve = 1 + else if(istype(location,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = location + if(H.head && (H.head.flags & AIRTIGHT)) + can_open_valve = 1 + + if(can_open_valve) + location.internal = src + usr << "You open \the [src] valve." + if (location.internals) + location.internals.icon_state = "internal1" + else + usr << "You need something to connect to \the [src]." + + src.add_fingerprint(usr) + return 1 + + +/obj/item/organ/vaurca/preserve/remove_air(amount) + return air_contents.remove(amount) + +/obj/item/organ/vaurca/preserve/return_air() + return air_contents + +/obj/item/organ/vaurca/preserve/assume_air(datum/gas_mixture/giver) + air_contents.merge(giver) + + check_status() + return 1 + +/obj/item/organ/vaurca/preserve/proc/remove_air_volume(volume_to_return) + if(!air_contents) + return null + + var/tank_pressure = air_contents.return_pressure() + if((tank_pressure < distribute_pressure) && prob(5)) + owner << "There is a buzzing in your [parent_organ]." + + var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature) + + return remove_air(moles_needed) + +/obj/item/organ/vaurca/preserve/process() + //Allow for reactions + air_contents.react() //cooking up air tanks - add phoron and oxygen, then heat above PHORON_MINIMUM_BURN_TEMPERATURE + check_status() + ..() + + +/obj/item/organ/vaurca/preserve/proc/check_status() + //Handle exploding, leaking, and rupturing of the tank + + if(!air_contents) + return 0 + + var/pressure = air_contents.return_pressure() + if(pressure > TANK_FRAGMENT_PRESSURE) + if(!istype(src.loc,/obj/item/device/transfer_valve)) + message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") + log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") + + //Give the gas a chance to build up more pressure through reacting + air_contents.react() + air_contents.react() + air_contents.react() + + pressure = air_contents.return_pressure() + var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE + + explosion( + get_turf(loc), + round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)), + round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)), + round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)), + round(min(BOMBCAP_FLASH_RADIUS, range*1.50)) + ) + qdel(src) + + else if(pressure > (8.0*ONE_ATMOSPHERE)) + + if(damage >= 60) + var/turf/simulated/T = get_turf(src) + if(!T) + return + T.assume_air(air_contents) + playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) + qdel(src) + + else if(pressure > (5.0*ONE_ATMOSPHERE)) + + if(damage >= 45) + var/turf/simulated/T = get_turf(src) + if(!T) + return + var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25) + T.assume_air(leaked_gas) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 928e48f9a51..4229ced9e28 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -8,14 +8,65 @@ var/injectable = 0 color = "#dcd9cd" taste_description = "boiled cabbage" + unaffected_species = IS_MACHINE /datum/reagent/kois/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(isvaurca(M)) - M.heal_organ_damage(0.8 * removed, 0) + M.heal_organ_damage(1.2 * removed, 1.2 * removed) + M.adjustToxLoss(-1.2 * removed) M.nutrition += nutriment_factor * removed // For hunger and fatness M.add_chemical_effect(CE_BLOODRESTORE, 6 * removed) else - M.adjustToxLoss(1.5 * removed) + if(istype(M,/mob/living/carbon/human)) + + var/mob/living/carbon/human/H = M + if(!H.internal_organs_by_name["kois"]) + + if(prob(10*removed)) + var/obj/item/organ/external/affected = H.get_organ("chest") + var/obj/item/organ/parasite/kois/infest = new() + infest.replaced(H, affected) + + else + H.adjustToxLoss(1 * removed) + else + M.adjustToxLoss(1 * removed) + return + ..() + +/datum/reagent/blackkois + name = "Modified K'ois" + id = "blackkois" + description = "A thick goopy substance, rich in K'ois nutrients. This sample appears to be modified." + metabolism = REM * 4 + var/nutriment_factor = 10 + var/injectable = 0 + color = "#31004A" + taste_description = "tar" + unaffected_species = IS_MACHINE + +/datum/reagent/blackkois/affect_ingest(var/mob/living/carbon/human/H, var/alien, var/removed) + + if(istype(H)) + if(isvaurca(H) || H.internal_organs_by_name["blackkois"]) + H.heal_organ_damage(1.2 * removed, 1.2 * removed) + H.adjustToxLoss(-1.2 * removed) + H.nutrition += nutriment_factor * removed // For hunger and fatness + H.add_chemical_effect(CE_BLOODRESTORE, 6 * removed) + else + if(!H.internal_organs_by_name["blackkois"]) + + if(prob(20*removed)) + + var/obj/item/organ/external/affected = H.get_organ("head") + var/obj/item/organ/parasite/blackkois/infest = new() + infest.replaced(H, affected) + + else + + H.adjustToxLoss(0.8 * removed) + else + H.adjustToxLoss(0.8 * removed) return ..() @@ -3255,4 +3306,4 @@ glass_icon_state = "sarezhiglass" glass_name = "glass of Sarezhi Wine" - glass_desc = "It tastes like flat grape soda. Is this supposed to be alcoholic?" \ No newline at end of file + glass_desc = "It tastes like flat grape soda. Is this supposed to be alcoholic?" diff --git a/html/changelogs/blackness.yml b/html/changelogs/blackness.yml new file mode 100644 index 00000000000..23f8fb9a516 --- /dev/null +++ b/html/changelogs/blackness.yml @@ -0,0 +1,41 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +################################# + +# Your name. +author: LordFowl + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Implements Black K'ois." + - rscadd: "Implements Black K'ois Mycosis and K'ois Mycosis." + - balance: "Buffs K'ois healing properties" + - tweak: "Vaurca can now control which limb they bite" + - bugfix: "Fixes a bug where Vaurca lungs would start processing twice." \ No newline at end of file diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi index 38737c3766e..0459f5415cb 100644 Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ