diff --git a/code/_helpers/events.dm b/code/_helpers/events.dm index 74e047e8119..e31d24783e8 100644 --- a/code/_helpers/events.dm +++ b/code/_helpers/events.dm @@ -12,4 +12,16 @@ var/area/A = locate(areapath) // Check if it actually exists if(istype(A) && A.z in using_map.player_levels) grand_list_of_areas += A - return grand_list_of_areas \ No newline at end of file + return grand_list_of_areas + +/** Checks if any living humans are in a given area! */ +/proc/is_area_occupied(var/area/myarea) + // Testing suggests looping over human_mob_list is quicker than looping over area contents + for(var/mob/living/carbon/human/H in human_mob_list) + if(H.stat >= DEAD) //Conditions for exclusion here, like if disconnected people start blocking it. + continue + var/area/A = get_area(H) + if(A == myarea) //The loc of a turf is the area it is in. + return 1 + return 0 + \ No newline at end of file diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index d13dcf3e80b..e5ebbc7d17f 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -362,6 +362,8 @@ qdel(R.mmi) for(var/obj/item/I in R.module) // the tools the borg has; metal, glass, guns etc + for(var/mob/M in I) //VOREStation edit + despawn_occupant(M) for(var/obj/item/O in I) // the things inside the tools, if anything; mainly for janiborg trash bags O.forceMove(R) qdel(I) diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 6d5a1cbe323..60cb0753b18 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -2,7 +2,7 @@ /obj/structure/catwalk name = "catwalk" desc = "Cats really don't like these things." - plane = TURF_PLANE + plane = DECAL_PLANE layer = ABOVE_UTILITY icon = 'icons/turf/catwalks.dmi' icon_state = "catwalk" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 81d936dce93..fc3fba6c7cb 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -659,11 +659,13 @@ var/list/admin_verbs_event_manager = list( set desc = "Cause an explosion of varying strength at your location." var/turf/epicenter = mob.loc - var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb") + var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb", "Cancel") var/choice = input("What size explosion would you like to produce?") in choices switch(choice) if(null) return 0 + if("Cancel") + return 0 if("Small Bomb") explosion(epicenter, 1, 2, 3, 3) if("Medium Bomb") diff --git a/code/modules/client/preference_setup/preference_setup_vr.dm b/code/modules/client/preference_setup/preference_setup_vr.dm new file mode 100644 index 00000000000..67c1d1792a8 --- /dev/null +++ b/code/modules/client/preference_setup/preference_setup_vr.dm @@ -0,0 +1,7 @@ +//Minimum limit is 18 +/datum/category_item/player_setup_item/get_min_age() + var/min_age = 18 + var/datum/species/S = all_species[pref.species ? pref.species : "Human"] + if(!is_FBP() && S.min_age > 18) + min_age = S.min_age + return min_age diff --git a/code/modules/events/atmos_leak.dm b/code/modules/events/atmos_leak.dm index e9fea3ff669..6823adee968 100644 --- a/code/modules/events/atmos_leak.dm +++ b/code/modules/events/atmos_leak.dm @@ -51,17 +51,6 @@ kill() return -/** Checks if any living humans are in a given area! */ -/datum/event/atmos_leak/proc/is_area_occupied(var/area/myarea) - // Testing suggests looping over human_mob_list is quicker than looping over area contents - for(var/mob/living/carbon/human/H in human_mob_list) - if(H.stat >= DEAD) //Conditions for exclusion here, like if disconnected people start blocking it. - continue - var/area/A = get_area(H) - if(A == myarea) //The loc of a turf is the area it is in. - return 1 - return 0 - /datum/event/atmos_leak/announce() command_announcement.Announce("Warning, hazardous [gas_data.name[gas_type]] gas leak detected in \the [target_area], evacuate the area and contain the damage!", "Hazard Alert") diff --git a/code/modules/events/escaped_slimes.dm b/code/modules/events/escaped_slimes.dm index b36a0d15bff..c9f4f661a3e 100644 --- a/code/modules/events/escaped_slimes.dm +++ b/code/modules/events/escaped_slimes.dm @@ -33,7 +33,7 @@ /datum/event/escaped_slimes/start() var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines) - if(temp_vent.network && temp_vent.loc.z in using_map.station_levels) //borrowed from spiders event, but it works. Distribute the slimes only in rooms with vents + if(temp_vent.network && temp_vent.loc.z in using_map.station_levels && !is_area_occupied(temp_vent.loc.loc)) //borrowed from spiders event, but it works. Distribute the slimes only in rooms with vents vents += temp_vent while((spawncount > 0) && vents.len) diff --git a/code/modules/mob/living/carbon/human/human_species_vr.dm b/code/modules/mob/living/carbon/human/human_species_vr.dm index 45b615c2400..ed27c12e62d 100644 --- a/code/modules/mob/living/carbon/human/human_species_vr.dm +++ b/code/modules/mob/living/carbon/human/human_species_vr.dm @@ -25,3 +25,7 @@ /mob/living/carbon/human/protean/New(var/new_loc) ..(new_loc, "Protean") + + +/mob/living/carbon/human/alraune/New(var/new_loc) + ..(new_loc, "Alraune") diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm new file mode 100644 index 00000000000..0f8d7b5622a --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm @@ -0,0 +1,336 @@ +/datum/species/alraune + name = SPECIES_ALRAUNE + name_plural = "Alraunes" + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite) + num_alternate_languages = 2 + language = LANGUAGE_ROOTLOCAL + slowdown = 1 //slow, they're plants. Not as slow as full diona. + total_health = 100 //standard + brute_mod = 1 //nothing special + burn_mod = 1.5 //plants don't like fire + metabolic_rate = 0.75 // slow metabolism + item_slowdown_mod = 0.25 //while they start slow, they don't get much slower + bloodloss_rate = 0.1 //While they do bleed, they bleed out VERY slowly + min_age = 18 + max_age = 250 + health_hud_intensity = 1.5 + + body_temperature = T20C + breath_type = "carbon_dioxide" + poison_type = "phoron" + exhale_type = "oxygen" + + // Heat and cold resistances are 20 degrees broader on the level 1 range, level 2 is default, level 3 is much weaker, halfway between L2 and normal L3. + // Essentially, they can tolerate a broader range of comfortable temperatures, but suffer more at extremes. + cold_level_1 = 240 //Default 260 - Lower is better + cold_level_2 = 200 //Default 200 + cold_level_3 = 160 //Default 120 + cold_discomfort_level = 260 //they start feeling uncomfortable around the point where humans take damage + + heat_level_1 = 380 //Default 360 - Higher is better + heat_level_2 = 400 //Default 400 + heat_level_3 = 700 //Default 1000 + heat_discomfort_level = 360 + + breath_cold_level_1 = 240 //They don't have lungs, they breathe through their skin + breath_cold_level_2 = 180 //sadly for them, their breath tolerance is no better than anyone else's. + breath_cold_level_3 = 140 //mainly 'cause breath tolerance is more generous than body temp tolerance. + + breath_heat_level_1 = 400 //slightly better heat tolerance in air though. Slightly. + breath_heat_level_2 = 450 + breath_heat_level_3 = 800 //lower incineration threshold though + + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED // whitelist only while WIP + flags = NO_SCAN | IS_PLANT | NO_MINOR_CUT + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + inherent_verbs = list( + /mob/living/carbon/human/proc/succubus_drain, + /mob/living/carbon/human/proc/succubus_drain_finalize, + /mob/living/carbon/human/proc/succubus_drain_lethal, + /mob/living/carbon/human/proc/bloodsuck) //Give them the voremodes related to wrapping people in vines and sapping their fluids + + color_mult = 1 + icobase = 'icons/mob/human_races/r_human_vr.dmi' + deform = 'icons/mob/human_races/r_def_human_vr.dmi' + flesh_color = "#9ee02c" + blood_color = "#edf4d0" //sap! + base_color = "#1a5600" + + blurb = "Alraunes are a rare sight in space. Their bodies are reminiscent of that of plants, and yet they share many\ + traits with other humanoid beings.\ + \ + Most Alraunes are not interested in traversing space, their heavy preference for natural environments and general\ + disinterest in things outside it keeps them as a species at a rather primal stage.\ + \ + However, after their discovery by the angels of Sanctum, many alraunes succumbed to their curiosity, and took the offer\ + to learn of the world and venture out, whether it's to Sanctum, or elsewhere in the galaxy." + + has_limbs = list( + BP_TORSO = list("path" = /obj/item/organ/external/chest), + BP_GROIN = list("path" = /obj/item/organ/external/groin), + BP_HEAD = list("path" = /obj/item/organ/external/head), + BP_L_ARM = list("path" = /obj/item/organ/external/arm), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), + BP_L_LEG = list("path" = /obj/item/organ/external/leg), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), + BP_L_HAND = list("path" = /obj/item/organ/external/hand), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) + ) + + // limited organs, 'cause they're simple + has_organ = list( + O_LIVER = /obj/item/organ/internal/liver/alraune, + O_KIDNEYS = /obj/item/organ/internal/kidneys/alraune, + O_BRAIN = /obj/item/organ/internal/brain/alraune, + O_EYES = /obj/item/organ/internal/eyes/alraune, + ) + +/datum/species/alraune/can_breathe_water() + return TRUE //eh, why not? Aquatic plants are a thing. + + +/datum/species/alraune/handle_environment_special(var/mob/living/carbon/human/H) + if(H.inStasisNow()) // if they're in stasis, they won't need this stuff. + return + + //setting these here 'cause ugh the defines for life are in the wrong place to compile properly + //set them back to HUMAN_MAX_OXYLOSS if we move the life defines to the defines folder at any point + var/ALRAUNE_MAX_OXYLOSS = 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it. + var/ALRAUNE_CRIT_MAX_OXYLOSS = ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average + + //They don't have lungs so breathe() will just return. Instead, they breathe through their skin. + //This is mostly normal breath code with some tweaks that apply to their particular biology. + + var/datum/gas_mixture/breath = null + var/fullysealed = FALSE //if they're wearing a fully sealed suit, their internals take priority. + var/environmentalair = FALSE //if no sealed suit, internals take priority in low pressure environements + + if(H.wear_suit && (H.wear_suit.item_flags & STOPPRESSUREDAMAGE) && H.head && (H.head.item_flags & STOPPRESSUREDAMAGE)) + fullysealed = TRUE + else // find out if local gas mixture is enough to override use of internals + var/datum/gas_mixture/environment = H.loc.return_air() + var/envpressure = environment.return_pressure() + if(envpressure >= hazard_low_pressure) + environmentalair = TRUE + + if(fullysealed || !environmentalair) + breath = H.get_breath_from_internal() + + if(!breath) //No breath from internals so let's try to get air from our location + // cut-down version of get_breath_from_environment - notably, gas masks provide no benefit + var/datum/gas_mixture/environment2 + if(H.loc) + environment2 = H.loc.return_air_for_internal_lifeform(H) + + if(environment2) + breath = environment2.remove_volume(BREATH_VOLUME) + H.handle_chemical_smoke(environment2) //handle chemical smoke while we're at it + + // NOW a crude copypasta of handle_breath. Leaving some things out that don't apply to plants. + if(H.does_not_breathe) + H.failed_last_breath = 0 + H.adjustOxyLoss(-5) + return // if somehow they don't breathe, abort breathing. + + if(!breath || (breath.total_moles == 0)) + H.failed_last_breath = 1 + if(H.health > config.health_threshold_crit) + H.adjustOxyLoss(ALRAUNE_MAX_OXYLOSS) + else + H.adjustOxyLoss(ALRAUNE_CRIT_MAX_OXYLOSS) + + H.oxygen_alert = max(H.oxygen_alert, 1) + + return // skip air processing if there's no air + + // now into the good stuff + + //var/safe_pressure_min = species.minimum_breath_pressure // Minimum safe partial pressure of breathable gas in kPa + //just replace safe_pressure_min with minimum_breath_pressure, no need to declare a new var + + var/safe_exhaled_max = 10 + var/safe_toxins_max = 0.2 + var/SA_para_min = 1 + var/SA_sleep_min = 5 + var/inhaled_gas_used = 0 + + var/breath_pressure = (breath.total_moles*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + + var/inhaling + var/poison + var/exhaling + + var/failed_inhale = 0 + var/failed_exhale = 0 + + inhaling = breath.gas[breath_type] + poison = breath.gas[poison_type] + exhaling = breath.gas[exhale_type] + + var/inhale_pp = (inhaling/breath.total_moles)*breath_pressure + var/toxins_pp = (poison/breath.total_moles)*breath_pressure + var/exhaled_pp = (exhaling/breath.total_moles)*breath_pressure + + // Not enough to breathe + if((inhale_pp + exhaled_pp) < minimum_breath_pressure) //they can breathe either oxygen OR CO2 + if(prob(20)) + spawn(0) H.emote("gasp") + + var/ratio = (inhale_pp + exhaled_pp)/minimum_breath_pressure + // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS (1) after all!) + H.adjustOxyLoss(max(ALRAUNE_MAX_OXYLOSS*(1-ratio), 0)) + failed_inhale = 1 + + H.oxygen_alert = max(H.oxygen_alert, 1) + else + // We're in safe limits + H.oxygen_alert = 0 + + inhaled_gas_used = inhaling/6 + breath.adjust_gas(breath_type, -inhaled_gas_used, update = 0) //update afterwards + breath.adjust_gas_temp(exhale_type, inhaled_gas_used, H.bodytemperature, update = 0) //update afterwards + + //Now we handle CO2. + if(inhale_pp > safe_exhaled_max * 0.7) // For a human, this would be too much exhaled gas in the air. But plants don't care. + H.co2_alert = 1 // Give them the alert on the HUD. They'll be aware when the good stuff is present. + + else + H.co2_alert = 0 + + //do the CO2 buff stuff here + + var/co2buff = 0 + if(inhaling) + co2buff = (Clamp(inhale_pp, 0, minimum_breath_pressure))/minimum_breath_pressure //returns a value between 0 and 1. + + var/light_amount = fullysealed ? H.getlightlevel() : H.getlightlevel()/5 // if they're covered, they're not going to get much light on them. + + if(co2buff && !H.toxloss && light_amount >= 0.1) //if there's enough light and CO2 and you're not poisoned, heal. Note if you're wearing a sealed suit your heal rate will suck. + H.adjustBruteLoss(-(light_amount * co2buff * 2)) //at a full partial pressure of CO2 and full light, you'll only heal half as fast as diona. + H.adjustFireLoss(-(light_amount * co2buff)) //this won't let you tank environmental damage from fire. MAYBE cold until your body temp drops. + + if(H.nutrition < (200 + 400*co2buff)) //if no CO2, a fully lit tile gives them 1/tick up to 200. With CO2, potentially up to 600. + H.nutrition += (light_amount*(1+co2buff*5)) + + // Too much poison in the air. + if(toxins_pp > safe_toxins_max) + var/ratio = (poison/safe_toxins_max) * 10 + if(H.reagents) + H.reagents.add_reagent("toxin", Clamp(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) + breath.adjust_gas(poison_type, -poison/6, update = 0) //update after + H.phoron_alert = max(H.phoron_alert, 1) + else + H.phoron_alert = 0 + + // If there's some other shit in the air lets deal with it here. + if(breath.gas["sleeping_agent"]) + var/SA_pp = (breath.gas["sleeping_agent"] / breath.total_moles) * breath_pressure + + // Enough to make us paralysed for a bit + if(SA_pp > SA_para_min) + + // 3 gives them one second to wake up and run away a bit! + H.Paralyse(3) + + // Enough to make us sleep as well + if(SA_pp > SA_sleep_min) + H.Sleeping(5) + + // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning + else if(SA_pp > 0.15) + if(prob(20)) + spawn(0) H.emote(pick("giggle", "laugh")) + breath.adjust_gas("sleeping_agent", -breath.gas["sleeping_agent"]/6, update = 0) //update after + + // Were we able to breathe? + if (failed_inhale || failed_exhale) + H.failed_last_breath = 1 + else + H.failed_last_breath = 0 + H.adjustOxyLoss(-5) + + + // Hot air hurts :( + if((breath.temperature < breath_cold_level_1 || breath.temperature > breath_heat_level_1) && !(COLD_RESISTANCE in H.mutations)) + + if(breath.temperature <= breath_cold_level_1) + if(prob(20)) + to_chat(H, "You feel icicles forming on your skin!") + else if(breath.temperature >= breath_heat_level_1) + if(prob(20)) + to_chat(H, "You feel yourself smouldering in the heat!") + + var/bodypart = pick(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + if(breath.temperature >= breath_heat_level_1) + if(breath.temperature < breath_heat_level_2) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, bodypart, used_weapon = "Excessive Heat") + H.fire_alert = max(H.fire_alert, 2) + else if(breath.temperature < breath_heat_level_3) + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, bodypart, used_weapon = "Excessive Heat") + H.fire_alert = max(H.fire_alert, 2) + else + H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, bodypart, used_weapon = "Excessive Heat") + H.fire_alert = max(H.fire_alert, 2) + + else if(breath.temperature <= breath_cold_level_1) + if(breath.temperature > breath_cold_level_2) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, bodypart, used_weapon = "Excessive Cold") + H.fire_alert = max(H.fire_alert, 1) + else if(breath.temperature > breath_cold_level_3) + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, bodypart, used_weapon = "Excessive Cold") + H.fire_alert = max(H.fire_alert, 1) + else + H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, bodypart, used_weapon = "Excessive Cold") + H.fire_alert = max(H.fire_alert, 1) + + + //breathing in hot/cold air also heats/cools you a bit + var/temp_adj = breath.temperature - H.bodytemperature + if (temp_adj < 0) + temp_adj /= (BODYTEMP_COLD_DIVISOR * 5) //don't raise temperature as much as if we were directly exposed + else + temp_adj /= (BODYTEMP_HEAT_DIVISOR * 5) //don't raise temperature as much as if we were directly exposed + + var/relative_density = breath.total_moles / (MOLES_CELLSTANDARD * BREATH_PERCENTAGE) + temp_adj *= relative_density + + if (temp_adj > BODYTEMP_HEATING_MAX) temp_adj = BODYTEMP_HEATING_MAX + if (temp_adj < BODYTEMP_COOLING_MAX) temp_adj = BODYTEMP_COOLING_MAX + //world << "Breath: [breath.temperature], [src]: [bodytemperature], Adjusting: [temp_adj]" + H.bodytemperature += temp_adj + + else if(breath.temperature >= heat_discomfort_level) + get_environment_discomfort(src,"heat") + else if(breath.temperature <= cold_discomfort_level) + get_environment_discomfort(src,"cold") + + breath.update_values() + return 1 + +/obj/item/organ/internal/brain/alraune + icon = 'icons/mob/species/alraune/organs.dmi' + icon_state = "neurostroma" + name = "neuro-stroma" + desc = "A knot of fibrous plant matter." + parent_organ = BP_TORSO // brains in their core + +/obj/item/organ/internal/eyes/alraune + icon = 'icons/mob/species/alraune/organs.dmi' + icon_state = "photoreceptors" + name = "photoreceptors" + desc = "Bulbous and fleshy plant matter." + +/obj/item/organ/internal/kidneys/alraune + icon = 'icons/mob/species/alraune/organs.dmi' + icon_state = "rhyzofilter" + name = "rhyzofilter" + desc = "A tangle of root nodules." + +/obj/item/organ/internal/liver/alraune + icon = 'icons/mob/species/alraune/organs.dmi' + icon_state = "phytoextractor" + name = "phytoextractor" + desc = "A bulbous gourd-like structure." \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/aliens/mimic.dm b/code/modules/mob/living/simple_animal/aliens/mimic.dm index fff75ecbe7e..17fc70008db 100644 --- a/code/modules/mob/living/simple_animal/aliens/mimic.dm +++ b/code/modules/mob/living/simple_animal/aliens/mimic.dm @@ -114,6 +114,8 @@ var/obj/structure/closet/crate/C = new(get_turf(src)) // Put loot in crate for(var/obj/O in src) + if(isbelly(O)) //VOREStation edit + continue O.forceMove(C) ..() @@ -146,6 +148,8 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca /mob/living/simple_animal/hostile/mimic/copy/death() for(var/atom/movable/M in src) + if(isbelly(M)) //VOREStation edit + continue M.forceMove(get_turf(src)) ..() diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 6cbef8586be..ea1a8b47068 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -451,7 +451,7 @@ if(!silent) if(planetary) visible_message("\A [src] falls out of the sky and crashes into \the [landing]!", \ - " You fall out of the skiy and crash into \the [landing]!", \ + " You fall out of the sky and crash into \the [landing]!", \ "You hear something slam into \the [landing].") var/turf/T = get_turf(landing) explosion(T, 0, 1, 2) diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index 3b44682095b..9d82a7749b8 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -50,7 +50,7 @@ // Now sync the organ's eye_colour list. update_colour() // Finally, update the eye icon on the mob. - owner.update_eyes() + owner.regenerate_icons() /obj/item/organ/internal/eyes/replaced(var/mob/living/carbon/human/target) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 789dce7dfbc..777ff047e1d 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -1105,6 +1105,8 @@ Note that amputating the affected organ does in fact remove the infection from t R = basic_robolimb if(R) force_icon = R.icon + brute_mod *= R.robo_brute_mod + burn_mod *= R.robo_burn_mod if(R.lifelike) robotic = ORGAN_LIFELIKE name = "[initial(name)]" diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 1f15f125c24..5a55b1bcd5a 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -49,6 +49,9 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ var/suggested_species = "Human" //If it should make the torso a species var/speech_bubble_appearance = "synthetic" // What icon_state to use for speech bubbles when talking. Check talk.dmi for all the icons. + var/robo_brute_mod = 1 // Multiplier for incoming brute damage. + var/robo_burn_mod = 1 // As above for burn. + /datum/robolimb/unbranded_monitor company = "Unbranded Monitor" desc = "A generic unbranded interpretation of a popular prosthetic head model. It looks rudimentary and cheaply constructed." @@ -214,6 +217,8 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ skin_tone = 1 blood_color = "#CCCCCC" speech_bubble_appearance = "normal" + //robo_brute_mod = 1.1 //VOREStation Edit + //robo_burn_mod = 1.1 //VOREStation Edit /datum/robolimb/wardtakahashi company = "Ward-Takahashi" 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 26481d8141a..56c93f56f1f 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -909,9 +909,9 @@ cup_icon_state = "cup_coffee" cup_name = "cup of coffee" - cup_desc = "Don't drop it, or you'll send scalding liquid and porcelain shards everywhere." + cup_desc = "Don't drop it, or you'll send scalding liquid and ceramic shards everywhere." - glass_name = "cup of coffee" + glass_name = "coffee" glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index dc35852eedc..494659fb1e3 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -5,8 +5,7 @@ desc = "..." icon = 'icons/obj/objects.dmi' icon_state = "watertank" - plane = TURF_PLANE - layer = TABLE_LAYER // Above catwalks, hopefully below other things + layer = TABLE_LAYER density = 1 anchored = 0 pressure_resistance = 2*ONE_ATMOSPHERE diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 13c2f7b2da6..a58fc9f6fff 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -88,16 +88,58 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/ears/curly_bug + name = "curly antennae, colorable" + desc = "" + icon_state = "curly_bug" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dual_robot + name = "synth antennae, colorable" + desc = "" + icon_state = "dual_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/right_robot + name = "right synth, colorable" + desc = "" + icon_state = "right_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/left_robot + name = "left synth, colorable" + desc = "" + icon_state = "left_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/ears/oni_h1 name = "oni horns" desc = "" icon_state = "oni-h1" +/datum/sprite_accessory/ears/oni_h1_c + name = "oni horns, colorable" + desc = "" + icon_state = "oni-h1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/ears/demon_horns1 name = "demon horns" desc = "" icon_state = "demon-horns1" +/datum/sprite_accessory/ears/demon_horns1_c + name = "demon horns, colorable" + desc = "" + icon_state = "demon-horns1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/ears/demon_horns2 name = "demon horns, colorable(outward)" desc = "" @@ -105,6 +147,13 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/ears/dragon_horns + name = "dragon horns, colorable" + desc = "" + icon_state = "dragon-horns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/ears/foxears name = "highlander zorren ears" desc = "" @@ -413,6 +462,7 @@ desc = "" icon_state = "spider-legs" color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/wing/moth name = "moth wings" desc = "" @@ -682,12 +732,14 @@ icon_state = "fantail" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/tail/wagtail name = "avian wagtail, colorable" desc = "" icon_state = "wagtail" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/tail/crossfox name = "cross fox" desc = "" diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 4b1d8ef0a50..e7f3df020c7 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -578,6 +578,11 @@ if(!(content in src) || !istype(target)) return content.forceMove(target) + if(isitem(content)) + var/obj/item/I = content + if(I.gurgled && (target.mode_flags & DM_FLAG_ITEMWEAK)) + I.decontaminate() + I.gurgle_contaminate(target.contents, target.cont_flavor) items_preserved -= content if(!silent && target.vore_sound && !recent_sound) var/soundfile = vore_sounds[target.vore_sound] diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 57b83c98768..3c05cdbc410 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -217,6 +217,13 @@ /obj/item/clothing/gloves/fluff/morsleeves, /obj/item/clothing/under/fluff/morunder) +// Mewchild: Phi Vietsi +/obj/item/weapon/storage/box/fluff/vietsi + name = "Phi's Personal Items" + desc = "A small box containing Phi's small things" + has_items = list( + /obj/item/clothing/accessory/medal/bronze_heart, + /obj/item/clothing/gloves/ring/seal/signet/fluff/vietsi) /* Swimsuits, for general use, to avoid arriving to work with your swimsuit. diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index dfa69659788..9e62b46e288 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1680,9 +1680,10 @@ Departamental Swimsuits, for general use //Mewchild: Phi Vietsi /obj/item/clothing/gloves/ring/seal/signet/fluff/vietsi - name = "signet ring" - desc = "A signet ring carved from the bones of something long extinct, as a ward against bad luck." - + name = "Phi Vietsi's Bone Signet Ring" + desc = "A signet ring belonging to Phi Vietsi, carved from the bones of something long extinct, as a ward against bad luck." + var/signet_name = "Phi Vietsi" + icon = 'icons/vore/custom_clothes_vr.dmi' icon_state = "vietsi_ring" diff --git a/config/custom_items.txt b/config/custom_items.txt index 5c7bf1b9af9..c442f1892d4 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -534,7 +534,7 @@ item_path: /obj/item/weapon/implanter/reagent_generator/savannah { ckey: mewchild character_name: Phi Vietsi -item_path: /obj/item/clothing/gloves/ring/seal/signet/fluff/vietsi +item_path: /obj/item/weapon/storage/box/fluff/vietsi } { diff --git a/config/jobwhitelist.txt b/config/jobwhitelist.txt index a6224b4fe4e..168eccbcda9 100644 --- a/config/jobwhitelist.txt +++ b/config/jobwhitelist.txt @@ -6,3 +6,4 @@ suicidalpickles - mime whiskyrose - clown tinybear16 - clown chargae - mime +verkister - clown diff --git a/html/changelogs/Anewbe - Robolimb Fragility.yml b/html/changelogs/Anewbe - Robolimb Fragility.yml new file mode 100644 index 00000000000..74ba5734125 --- /dev/null +++ b/html/changelogs/Anewbe - Robolimb Fragility.yml @@ -0,0 +1,37 @@ +################################ +# 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 +################################# + +# Your name. +author: Anewbe + +# 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: "Adds the ability to make robolimb brands more or less vulnerable to brute or burn." + - rscdel: "Makes VeyMed limbs more vulnerable to brute and burn." diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 78b0b2e1d4a..49f3738c97d 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi index 7a0211e603f..798d4ae73dc 100644 Binary files a/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi and b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi differ diff --git a/icons/mob/species/alraune/organs.dmi b/icons/mob/species/alraune/organs.dmi new file mode 100644 index 00000000000..e2da475f679 Binary files /dev/null and b/icons/mob/species/alraune/organs.dmi differ diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi index 126f2ba4268..37bf23b1747 100644 Binary files a/icons/mob/vore/ears_vr.dmi and b/icons/mob/vore/ears_vr.dmi differ diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm index 67d3a75d22a..6210eb82457 100644 --- a/maps/tether/tether-06-station2.dmm +++ b/maps/tether/tether-06-station2.dmm @@ -17600,6 +17600,9 @@ }, /turf/simulated/floor/tiled, /area/security/prison) +"Ey" = ( +/turf/simulated/floor/reinforced/airless, +/area/space) "ED" = ( /obj/structure/table/rack{ dir = 8; @@ -18101,6 +18104,11 @@ /obj/random/maintenance/medical, /turf/simulated/floor, /area/maintenance/station/sec_lower) +"NS" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/space, +/area/space) "NY" = ( /obj/machinery/light/small{ dir = 8 @@ -22628,16 +22636,16 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +NS +NS +NS +NS +NS +NS +NS +eM +NS +NS aa aa aa @@ -22770,6 +22778,7 @@ aa aa aa aa +NS aa aa aa @@ -22778,8 +22787,7 @@ aa aa aa aa -aa -aa +NS aa aa aa @@ -22912,7 +22920,7 @@ aa aa aa aa -aa +NS aa aa aa @@ -23054,7 +23062,7 @@ aa aa aa aa -aa +NS aa aa aa @@ -23196,7 +23204,7 @@ aa aa aa aa -aa +NS aa aa aa @@ -23338,14 +23346,14 @@ aa aa aa aa -aa +NS aa aa aa ab -ac -ac -at +Ey +Ey +Ey Qs Qs at @@ -23480,14 +23488,14 @@ aa aa aa aa +NS aa aa aa -aa -ac -ac -ac -Qs +ab +Ey +Ey +Ey Qs Qs at @@ -23622,14 +23630,14 @@ aa aa aa aa -aa +eM aa aa aa ac -ac -at -Qs +Ey +Ey +kk Qs Ug at @@ -23764,7 +23772,7 @@ aa aa aa aa -aa +NS aa ab ab @@ -23906,8 +23914,8 @@ aa aa aa aa -aa -aa +NS +NS ac ac ac diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index 58e18710b90..de47d879d0a 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -23475,6 +23475,10 @@ /obj/random/maintenance/engineering, /turf/simulated/floor, /area/maintenance/station/ai) +"Wf" = ( +/obj/structure/grille, +/turf/space, +/area/space) "WD" = ( /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/corner/red/border, @@ -27344,16 +27348,16 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +nA +nA +nA +nA +Wf +nA +nA +nB +nA +nA aa aa aa @@ -27486,6 +27490,7 @@ aa aa aa aa +nA aa aa aa @@ -27494,8 +27499,7 @@ aa aa aa aa -aa -aa +nA aa aa aa @@ -27628,7 +27632,7 @@ aa aa aa aa -aa +nA aa aa aa @@ -27770,7 +27774,7 @@ aa aa aa aa -aa +nA aa aa aa @@ -27912,7 +27916,7 @@ aa aa aa aa -aa +nA aa aa aa @@ -28054,7 +28058,7 @@ aa aa aa aa -aa +nA aa aa aa @@ -28196,7 +28200,7 @@ aa aa aa aa -aa +nA aa aa aa @@ -28338,7 +28342,7 @@ aa aa aa aa -aa +nB aa aa aa @@ -28480,7 +28484,7 @@ aa aa aa aa -aa +nA aa aa aa @@ -28622,8 +28626,8 @@ aa aa aa aa -aa -aa +nA +nA ab ab ab diff --git a/vorestation.dme b/vorestation.dme index 01841717d00..21345fe0dc4 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1452,6 +1452,7 @@ #include "code\modules\client\ui_style.dm" #include "code\modules\client\preference_setup\_defines.dm" #include "code\modules\client\preference_setup\preference_setup.dm" +#include "code\modules\client\preference_setup\preference_setup_vr.dm" #include "code\modules\client\preference_setup\antagonism\01_basic.dm" #include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" #include "code\modules\client\preference_setup\general\01_basic.dm" @@ -2048,6 +2049,7 @@ #include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" #include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" #include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" +#include "code\modules\mob\living\carbon\human\species\station\alraune.dm" #include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\golem.dm" #include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm"