Skip to content

Commit

Permalink
Merge branch 'nebula-gases' of https://github.com/washikarasu/Citadel…
Browse files Browse the repository at this point in the history
…-Station-13-RP-Vodka into nebula-gases
  • Loading branch information
washikarasu committed Sep 2, 2024
2 parents 9a3980f + 8dfee8e commit 454f34f
Show file tree
Hide file tree
Showing 63 changed files with 311 additions and 1,701 deletions.
6 changes: 2 additions & 4 deletions citadel.dme
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@
#include "code\__DEFINES\dcs\signals\elements\signals_element_conflict_checking.dm"
#include "code\__DEFINES\dcs\signals\items\signals_inducer.dm"
#include "code\__DEFINES\dcs\signals\modules\signals_module_fishing.dm"
#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom-reachability.dm"
#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_appearance.dm"
#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_attack.dm"
#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_buckling.dm"
Expand Down Expand Up @@ -3212,6 +3213,7 @@
#include "code\modules\mapping\map_helpers\_map_helpers.dm"
#include "code\modules\mapping\map_helpers\baseturf.dm"
#include "code\modules\mapping\map_helpers\component_injector.dm"
#include "code\modules\mapping\map_helpers\electrochromatic_linker.dm"
#include "code\modules\mapping\map_helpers\engine_loader.dm"
#include "code\modules\mapping\map_helpers\gear_marker.dm"
#include "code\modules\mapping\map_helpers\paint.dm"
Expand Down Expand Up @@ -3931,10 +3933,6 @@
#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\types.dm"
#include "code\modules\mob\living\voice\voice.dm"
#include "code\modules\mob\new_player\join_menu.dm"
#include "code\modules\mob\new_player\login.dm"
Expand Down
1 change: 0 additions & 1 deletion code/__DEFINES/coloration.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

//* This file is explicitly licensed under the MIT license. *//
//* Copyright (c) 2024 Citadel Station developers. *//

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
//* This file is explicitly licensed under the MIT license. *//
//* Copyright (c) 2024 Citadel Station developers. *//

/**
* These are all **very** low level signals.
* Handle with care.
*/

/// from base of /atom/movable/proc/DirectAccess(): (list/accessible)
#define COMSIG_ATOM_REACHABILITY_DIRECTACCESS "atom-directaccess"
2 changes: 1 addition & 1 deletion code/__DEFINES/procs/clickcode.dm
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@

//! Reachability Depths - checked from level of DirectAccess and turf adjacency.
/// default reachability depth
#define DEFAULT_REACHABILITY_DEPTH 3 // enough to reach into pill bottles in box in backpack
#define DEFAULT_REACHABILITY_DEPTH 4

//! Reachability
/// can't reach - this *must* be a fals-y value.
Expand Down
2 changes: 1 addition & 1 deletion code/__HELPERS/text.dm
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

if(extra)
var/temp_input = replace_characters(input, list("\n"=" ","\t"=" "))//one character is replaced by two
if(length_char(input) < (length_char(temp_input) - (6 * 2))) //12 is the number of linebreaks allowed per message
if(length_char(input) < (length_char(temp_input) - 24)) //24 is the number of linebreaks allowed per message
input = replace_characters(temp_input,list(" "=" "))//replace again, this time the double spaces with single ones

if(encode)
Expand Down
3 changes: 2 additions & 1 deletion code/game/click/reachability.dm
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,8 @@
* checks what we can directly reach
*/
/atom/movable/proc/DirectAccess()
return list(src, loc)
. = list(src, loc)
SEND_SIGNAL(src, COMSIG_ATOM_REACHABILITY_DIRECTACCESS, .)

/mob/DirectAccess()
return ..() + get_equipped_items()
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/systems/storage.dm
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,7 @@
target = parent,
)
return TRUE
if(!actor.performer.Reachability(parent))
if(!actor.performer.Reachability(indirection || parent))
return TRUE
if(!try_insert(inserting, actor, silent, suppressed))
return TRUE
Expand Down
3 changes: 0 additions & 3 deletions code/game/rendering/screen.dm
Original file line number Diff line number Diff line change
Expand Up @@ -422,9 +422,6 @@
var/darkness = round(1 - T.get_lumcount(),0.1)
to_chat(usr,"<span class='notice'><b>Darkness:</b> [darkness]</span>")
if("energy")
var/mob/living/simple_mob/shadekin/SK = usr
if(istype(SK))
to_chat(usr,"<span class='notice'><b>Energy:</b> [SK.energy] ([SK.dark_gains])</span>")
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/shadekin))
to_chat(usr,"<span class='notice'><b>Energy:</b> [H.shadekin_get_energy(H)]</span>")
Expand Down
2 changes: 1 addition & 1 deletion code/modules/events/carp_migration.dm
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(carp_count,list())// a list of Z levels (string), associated wi
if(WEST)
return locate(clearance, rand(clearance, world.maxy - clearance), Z)

/datum/event/carp_migration/proc/check_gib(var/mob/living/simple_mob/hostile/carp/M) //awesome road kills
/datum/event/carp_migration/proc/check_gib(var/mob/living/simple_mob/animal/space/carp/M) //awesome road kills
if(M.health <= 0 && prob(60))
M.gib()

Expand Down
17 changes: 17 additions & 0 deletions code/modules/mapping/map_helpers/electrochromatic_linker.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/obj/map_helper/electrochromatic_linker
icon = 'icons/mapping/helpers/electrochromatic_helper.dmi'
icon_state = "electrochromatic"
early = FALSE
late = TRUE
/**
* the ID to bind electrochromatic objects on our tile to
*/
var/id

/obj/map_helper/electrochromatic_linker/LateInitialize()
for(var/obj/structure/window/reinforced/polarized/chromatic_window in loc)
chromatic_window.id = id
/**
* Same behaviour needs to be applied to polarised airlocks, currently unable too
*/
qdel(src)
16 changes: 0 additions & 16 deletions code/modules/maps/_shim/away_spawner.dm
Original file line number Diff line number Diff line change
Expand Up @@ -92,22 +92,6 @@ For now this is still usable but bad.
depleted = TRUE
return

//Shadekin spawner. Could have them show up on any mission, so it's here.
//Make sure to put them away from others, so they don't get demolished by rude mobs.
/obj/tether_away_spawner/shadekin
name = "Shadekin Spawner"
icon = 'icons/mob/vore_shadekin.dmi'
icon_state = "spawner"

faction = "shadekin"
prob_spawn = 1
prob_fall = 1
//guard = 10 //Don't wander too far, to stay alive.
mobs_to_pick_from = list(
/mob/living/simple_mob/shadekin
)


// Underdark mob spawners
/obj/tether_away_spawner/underdark_drone_swarm
name = "Underdark Drone Swarm Spawner"
Expand Down
1 change: 0 additions & 1 deletion code/modules/maps/away_missions/140x140/snowfield.dm
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@
icon_living = "polarbear"
icon_dead = "polarbear-dead"
icon_gib = "bear-gib"
vore_active = 1
say_list_type = /datum/say_list/polar_bear

faction = "polar"
Expand Down
2 changes: 1 addition & 1 deletion code/modules/materials/definitions/metals/steel.dm
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@
. += create_stack_recipe_datum(
name = "rack",
product = /obj/structure/table/rack,
cost = 1,
cost = 2,
time = 0.5 SECONDS,
)
. += create_stack_recipe_datum(
Expand Down
141 changes: 3 additions & 138 deletions code/modules/mob/living/simple_mob/simple_mob_vr.dm
Original file line number Diff line number Diff line change
@@ -1,113 +1,29 @@
// Flags for specifying which states we have vore icon_states for.
#define SA_ICON_LIVING 0x01
#define SA_ICON_DEAD 0x02
#define SA_ICON_REST 0x04

/mob/living/simple_mob
base_attack_cooldown = 15

var/temperature_range = 40 // How close will they get to environmental temperature before their body stops changing its heat

var/vore_active = 0 // If vore behavior is enabled for this mob

var/vore_capacity = 1 // The capacity (in people) this person can hold
var/vore_max_size = RESIZE_HUGE // The max size this mob will consider eating
var/vore_min_size = RESIZE_TINY // The min size this mob will consider eating
var/vore_bump_chance = 0 // Chance of trying to eat anyone that bumps into them, regardless of hostility
var/vore_bump_emote = "grabs hold of" // Allow messages for bumpnom mobs to have a flavorful bumpnom
var/vore_pounce_chance = 5 // Chance of this mob knocking down an opponent
var/vore_pounce_cooldown = 0 // Cooldown timer - if it fails a pounce it won't pounce again for a while
var/vore_pounce_successrate = 100 // Chance of a pounce succeeding against a theoretical 0-health opponent
var/vore_pounce_falloff = 1 // Success rate falloff per %health of target mob.
var/vore_pounce_maxhealth = 80 // Mob will not attempt to pounce targets above this %health
var/vore_standing_too = 0 // Can also eat non-stunned mobs
var/vore_ignores_undigestable = 1 // Refuse to eat mobs who are undigestable by the prefs toggle.
var/swallowsound = null // What noise plays when you succeed in eating the mob.

var/vore_default_mode = DM_DIGEST // Default bellymode (DM_DIGEST, DM_HOLD, DM_ABSORB)
var/vore_default_flags = 0 // No flags
var/vore_digest_chance = 25 // Chance to switch to digest mode if resisted
var/vore_absorb_chance = 0 // Chance to switch to absorb mode if resisted
var/vore_escape_chance = 25 // Chance of resisting out of mob

var/vore_stomach_name // The name for the first belly if not "stomach"
var/vore_stomach_flavor // The flavortext for the first belly if not the default

var/vore_default_item_mode = IM_DIGEST_FOOD //How belly will interact with items
var/vore_default_contaminates = TRUE //Will it contaminate?
var/vore_default_contamination_flavor = "Generic" //Contamination descriptors
var/vore_default_contamination_color = "green" //Contamination color

var/vore_fullness = 0 // How "full" the belly is (controls icons)
var/vore_icons = 0 // Bitfield for which fields we have vore icons for.
var/life_disabled = 0 // For performance reasons

var/obj/item/radio/headset/mob_headset/mob_radio //Adminbus headset for simplemob shenanigans.

// Release belly contents before being gc'd!
/mob/living/simple_mob/Destroy()
release_vore_contents()
prey_excludes.Cut()
. = ..()
return ..()

//For all those ID-having mobs
/mob/living/simple_mob/GetIdCard()
if(access_card)
return access_card

// Update fullness based on size & quantity of belly contents
/mob/living/simple_mob/proc/update_fullness()
var/new_fullness = 0
for(var/belly in vore_organs)
var/obj/belly/B = belly
for(var/mob/living/M in B)
new_fullness += M.size_multiplier
new_fullness = round(new_fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry.
vore_fullness = min(vore_capacity, new_fullness)

/mob/living/simple_mob/update_icon()
. = ..()
if(vore_active)
update_fullness()
if(!vore_fullness)
return 0
else if((stat == CONSCIOUS) && (!icon_rest || !resting || !incapacitated(INCAPACITATION_DISABLED)) && (vore_icons & SA_ICON_LIVING))
icon_state = "[icon_living]-[vore_fullness]"
else if(stat >= DEAD && (vore_icons & SA_ICON_DEAD))
icon_state = "[icon_dead]-[vore_fullness]"
else if(((stat == UNCONSCIOUS) || resting || incapacitated(INCAPACITATION_DISABLED) ) && icon_rest && (vore_icons & SA_ICON_REST))
icon_state = "[icon_rest]-[vore_fullness]"

/mob/living/simple_mob/proc/will_eat(var/mob/living/M)
return FALSE // no more mobvore

// Attempt to eat target
// TODO - Review this. Could be some issues here
/mob/living/simple_mob/proc/EatTarget(var/mob/living/M)
var/old_target = M
set_AI_busy(1)
. = animal_nom(M)
playsound(src, swallowsound, 50, 1)
update_icon()

if(.)
// If we succesfully ate them, lose the target
set_AI_busy(0)
return old_target
else if(old_target == M)
// If we didn't but they are still our target, go back to attack.
// but don't run the handler immediately, wait until next tick
// Otherwise we'll be in a possibly infinate loop
set_AI_busy(0)

/mob/living/simple_mob/death()
release_vore_contents()
. = ..()
return ..()

// Make sure you don't call ..() on this one, otherwise you duplicate work.
/mob/living/simple_mob/init_vore()
if(!vore_active || no_vore)
return
. = ..()

if(!IsAdvancedToolUser())
add_verb(src, /mob/living/simple_mob/proc/animal_nom)
Expand All @@ -116,63 +32,12 @@
if(LAZYLEN(vore_organs))
return

// Since they have bellies, add verbs to toggle settings on them.
add_verb(src, /mob/living/simple_mob/proc/toggle_digestion)
add_verb(src, /mob/living/simple_mob/proc/toggle_fancygurgle)

//A much more detailed version of the default /living implementation
var/obj/belly/B = new /obj/belly(src)
vore_selected = B
B.immutable = 1
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
B.digest_mode = vore_default_mode
B.mode_flags = vore_default_flags
B.item_digest_mode = vore_default_item_mode
B.contaminates = vore_default_contaminates
B.contamination_flavor = vore_default_contamination_flavor
B.contamination_color = vore_default_contamination_color
B.escapable = vore_escape_chance > 0
B.escapechance = vore_escape_chance
B.digestchance = vore_digest_chance
B.absorbchance = vore_absorb_chance
B.human_prey_swallow_time = swallowTime
B.nonhuman_prey_swallow_time = swallowTime
B.vore_verb = "swallow"
B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace
"The insides knead at you gently for a moment.",
"The guts glorp wetly around you as some air shifts.",
"The predator takes a deep breath and sighs, shifting you somewhat.",
"The stomach squeezes you tight for a moment, then relaxes harmlessly.",
"The predator's calm breathing and thumping heartbeat pulses around you.",
"The warm walls kneads harmlessly against you.",
"The liquids churn around you, though there doesn't seem to be much effect.",
"The sound of bodily movements drown out everything for a moment.",
"The predator's movements gently force you into a different position.")
B.emote_lists[DM_DIGEST] = list(
"The burning acids eat away at your form.",
"The muscular stomach flesh grinds harshly against you.",
"The caustic air stings your chest when you try to breathe.",
"The slimy guts squeeze inward to help the digestive juices soften you up.",
"The onslaught against your body doesn't seem to be letting up; you're food now.",
"The predator's body ripples and crushes against you as digestive enzymes pull you apart.",
"The juices pooling beneath you sizzle against your sore skin.",
"The churning walls slowly pulverize you into meaty nutrients.",
"The stomach glorps and gurgles as it tries to work you into slop.")

// Checks to see if mob doesn't like this kind of turf
/mob/living/simple_mob/IMove(turf/newloc, safety = TRUE)
if(istype(newloc,/turf/simulated/floor/sky))
return MOVEMENT_FAILED //Mobs aren't that stupid, probably
return ..() // Procede as normal.

//Grab = Nomf
/mob/living/simple_mob/UnarmedAttack(var/atom/A, var/proximity)
. = ..()

if(a_intent == INTENT_GRAB && isliving(A) && !has_hands)
animal_nom(A)

// todo: shitcode, rewrite on say rewrite
/mob/living/simple_mob/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
switch(message_mode)
Expand Down
32 changes: 0 additions & 32 deletions code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm
Original file line number Diff line number Diff line change
@@ -1,35 +1,3 @@
/mob/living/simple_mob/animal/passive/cat/runtime/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside."

B.emote_lists[DM_HOLD] = list(
"Runtime's stomach kneads gently on you and you're fairly sure you can hear her start purring.",
"Most of what you can hear are slick noises, Runtime breathing, and distant purring.",
"Runtime seems perfectly happy to have you in there. She lays down for a moment to groom and squishes you against the walls.",
"The CMO's pet seems to have found a patient of her own, and is treating them with warm, wet kneading walls.",
"Runtime mostly just lazes about, and you're left to simmer in the hot, slick guts unharmed.",
"Runtime's master might let you out of this fleshy prison, eventually. Maybe. Hopefully?")

B.emote_lists[DM_DIGEST] = list(
"Runtime's stomach is treating you rather like a mouse, kneading acids into you with vigor.",
"A thick dollop of bellyslime drips from above while the CMO's pet's gut works on churning you up.",
"Runtime seems to have decided you're food, based on the acrid air in her guts and the pooling fluids.",
"Runtime's stomach tries to claim you, kneading and pressing inwards again and again against your form.",
"Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.",
"The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.")

B.digest_messages_prey = list(
"Runtime's stomach slowly melts your body away. Her stomach refuses to give up it's onslaught, continuing until you're nothing more than nutrients for her body to absorb.",
"After an agonizing amount of time, Runtime's stomach finally manages to claim you, melting you down and adding you to her stomach.",
"Runtime's stomach continues to slowly work away at your body before tightly squeezing around you once more, causing the remainder of your body to lose form and melt away into the digesting slop around you.",
"Runtime's slimy gut continues to constantly squeeze and knead away at your body, the bulge you create inside of her stomach growing smaller as time progresses before soon dissapearing completely as you melt away.",
"Runtime's belly lets off a soft groan as your body finally gives out, the cat's eyes growing heavy as it settles down to enjoy it's good meal.",
"Runtime purrs happily as you slowly slip away inside of her gut, your body's nutrients are then used to put a layer of padding on the now pudgy cat.",
"The acids inside of Runtime's stomach, aided by the constant motions of the smooth walls surrounding you finally manage to melt you away into nothing more mush. She curls up on the floor, slowly kneading the air as her stomach moves its contents — including you — deeper into her digestive system.",
"Your form begins to slowly soften and break apart, rounding out Runtime's swollen belly. The carnivorous cat rumbles and purrs happily at the feeling of such a filling meal.")

// Ascian's Tactical Kitten
/obj/item/holder/cat/fluff/tabiranth
name = "Spirit"
Expand Down
Loading

0 comments on commit 454f34f

Please sign in to comment.