Merge branch 'release' of https://github.com/VOREStation/VOREStation into voreupdate-2

This commit is contained in:
izac112
2024-12-04 15:21:21 +01:00
51 changed files with 1908 additions and 258 deletions
@@ -8,6 +8,7 @@
#define TRAIT_PREF_TYPE_BOOLEAN 1
#define TRAIT_PREF_TYPE_COLOR 2
#define TRAIT_PREF_TYPE_STRING 3
#define TRAIT_NO_VAREDIT_TARGET 0
#define TRAIT_VAREDIT_TARGET_SPECIES 1
@@ -1177,3 +1177,48 @@ YW CHANGE STOP*/
/datum/trait/neutral/agraviaphobia/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null)
..()
H.phobias |= AGRAVIAPHOBIA
/datum/trait/neutral/gargoyle
name = "Gargoyle (Adjustable)"
desc = "You turn into a statue (or similar) at will, but also whenever you run out of energy. Being a statue replenishes your energy slowly."
cost = 0
custom_only = FALSE //slimes, xenochimera, diona, proteans, etc, basically anything but custom doesn't make sense (as much as I wanna play a petrifying slime)
//Nah makes perfect sense, they could just be gene modded, not to mention we can expand this to have the statue and description of it renameable as well as color adjustable, to support general petrification
has_preferences = list("identifier" = list(TRAIT_PREF_TYPE_STRING, "Identifier", TRAIT_NO_VAREDIT_TARGET, "statue"),
"material" = list(TRAIT_PREF_TYPE_STRING, "Material", TRAIT_NO_VAREDIT_TARGET, "stone"),
"tint" = list(TRAIT_PREF_TYPE_COLOR, "Statue color", TRAIT_NO_VAREDIT_TARGET, "#FFFFFF"),
"adjective" = list(TRAIT_PREF_TYPE_STRING, "Adjective", TRAIT_NO_VAREDIT_TARGET, "hardens")/*,
"pickupable" = list(TRAIT_PREF_TYPE_BOOLEAN, "Can be picked up", TRAIT_NO_VAREDIT_TARGET, FALSE)*/)
/datum/trait/neutral/gargoyle/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/list/trait_prefs)
..()
var/datum/component/gargoyle/G = H.LoadComponent(/datum/component/gargoyle)
if (trait_prefs)
G.tint = trait_prefs["tint"]
G.material = lowertext(trait_prefs["material"])
G.identifier = lowertext(trait_prefs["identifier"])
G.adjective = lowertext(trait_prefs["adjective"])
/datum/trait/neutral/gargoyle/apply_sanitization_to_string(var/pref, var/input)
if (has_preferences[pref][1] != TRAIT_PREF_TYPE_STRING || length(input) <= 0)
return
input = sanitizeSafe(input, 25)
if (length(input) <= 0)
return default_value_for_pref(pref)
input = lowertext(input)
if (pref == "adjective")
if (copytext_char(input, -1) != "s")
switch(copytext_char(input, -2))
if ("ss")
input += "es"
if ("sh")
input += "es"
if ("ch")
input += "es"
else
switch(copytext_char(input, -1))
if("s", "x", "z")
input += "es"
else
input += "s"
return input
@@ -75,4 +75,14 @@
return TRUE
if(TRAIT_PREF_TYPE_COLOR) //color
return "#ffffff"
if(TRAIT_PREF_TYPE_STRING) //string
return ""
return
/datum/trait/proc/apply_sanitization_to_string(var/pref, var/input)
if (has_preferences[pref][1] != TRAIT_PREF_TYPE_STRING || length(input) <= 0)
return default_value_for_pref(pref)
input = sanitizeSafe(input, MAX_NAME_LEN)
if (length(input) <= 0)
return default_value_for_pref(pref)
return input
@@ -57,52 +57,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
cut_overlay(I)
overlays_standing[cache_index] = null
// These are used as the layers for the icons, as well as indexes in a list that holds onto them.
// Technically the layers used are all -100+layer to make them FLOAT_LAYER overlays.
//Human Overlays Indexes/////////
#define MUTATIONS_LAYER 1 //Mutations like fat, and lasereyes
#define SKIN_LAYER 2 //Skin things added by a call on species
#define BLOOD_LAYER 3 //Bloodied hands/feet/anything else
#define MOB_DAM_LAYER 4 //Injury overlay sprites like open wounds
#define SURGERY_LAYER 5 //Overlays for open surgical sites
#define UNDERWEAR_LAYER 6 //Underwear/bras/etc
#define TAIL_LOWER_LAYER 7 //Tail as viewed from the south
#define WING_LOWER_LAYER 8 //Wings as viewed from the south
#define SHOES_LAYER_ALT 9 //Shoe-slot item (when set to be under uniform via verb)
#define UNIFORM_LAYER 10 //Uniform-slot item
#define ID_LAYER 11 //ID-slot item
#define SHOES_LAYER 12 //Shoe-slot item
#define GLOVES_LAYER 13 //Glove-slot item
#define BELT_LAYER 14 //Belt-slot item
#define SUIT_LAYER 15 //Suit-slot item
#define TAIL_UPPER_LAYER 16 //Some species have tails to render (As viewed from the N, E, or W)
#define GLASSES_LAYER 17 //Eye-slot item
#define BELT_LAYER_ALT 18 //Belt-slot item (when set to be above suit via verb)
#define SUIT_STORE_LAYER 19 //Suit storage-slot item
#define BACK_LAYER 20 //Back-slot item
#define HAIR_LAYER 21 //The human's hair
#define HAIR_ACCESSORY_LAYER 22 //VOREStation edit. Simply move this up a number if things are added.
#define EARS_LAYER 23 //Both ear-slot items (combined image)
#define EYES_LAYER 24 //Mob's eyes (used for glowing eyes)
#define FACEMASK_LAYER 25 //Mask-slot item
#define GLASSES_LAYER_ALT 26 //So some glasses can appear on top of hair and things
#define HEAD_LAYER 27 //Head-slot item
#define HANDCUFF_LAYER 28 //Handcuffs, if the human is handcuffed, in a secret inv slot
#define LEGCUFF_LAYER 29 //Same as handcuffs, for legcuffs
#define L_HAND_LAYER 30 //Left-hand item
#define R_HAND_LAYER 31 //Right-hand item
#define WING_LAYER 32 //Wings or protrusions over the suit.
#define TAIL_UPPER_LAYER_ALT 33 //Modified tail-sprite layer. Tend to be larger.
#define MODIFIER_EFFECTS_LAYER 34 //Effects drawn by modifiers
#define FIRE_LAYER 35 //'Mob on fire' overlay layer
// # define MOB_WATER_LAYER 36 //'Mob submerged' overlay layer // Moved to global defines
#define TARGETED_LAYER 37 //'Aimed at' overlay layer
#define VORE_BELLY_LAYER 38
#define VORE_TAIL_LAYER 39
#define TOTAL_LAYERS 39 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
//////////////////////////////////
/mob/living/carbon/human
var/list/overlays_standing[TOTAL_LAYERS]
var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed
@@ -245,6 +199,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(QDESTROYING(src))
return
remove_layer(BODYPARTS_LAYER)
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
@@ -427,6 +383,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//END CACHED ICON GENERATION.
stand_icon.Blend(base_icon,ICON_OVERLAY)
var/image/body = image(stand_icon)
if (body)
body.layer = BODY_LAYER + BODYPARTS_LAYER
overlays_standing[BODYPARTS_LAYER] = body
apply_layer(BODYPARTS_LAYER)
icon = stand_icon
//tail
+2 -2
View File
@@ -376,7 +376,7 @@ var/list/channel_to_radio_key = new
if(M && src) //If we still exist, when the spawn processes
//VOREStation Add - Ghosts don't hear whispers
if(whispering && isobserver(M) && (!M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || \
(!client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) && !M.client?.holder)))
(!(client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) || (isbelly(M.loc) && src == M.loc:owner)) && !M.client?.holder)))
M.show_message(span_game(span_say(span_name(src.name) + " [w_not_heard].")), 2)
return
//VOREStation Add End
@@ -437,7 +437,7 @@ var/list/channel_to_radio_key = new
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/verb_understood="gestures", var/datum/language/language, var/type = 1)
var/turf/T = get_turf(src)
//We're in something, gesture to people inside the same thing
if(loc != T)
if(loc != T && !istype(loc, /obj/item/holder)) // Partially fixes sign language while being held.
for(var/mob/M in loc)
M.hear_signlang(message, verb, verb_understood, language, src, type)
@@ -291,6 +291,16 @@
if(I_GRAB)
pai_nom(A)
// Allow card inhabited machines to be interacted with
// This has to override ClickOn because of storage depth nonsense with how pAIs are in cards in machines
/mob/living/silicon/pai/ClickOn(var/atom/A, var/params)
if(istype(A, /obj/machinery))
var/obj/machinery/M = A
if(M.paicard == card)
M.attack_ai(src)
return
return ..()
/mob/living/silicon/pai/proc/hug(var/mob/living/silicon/pai/H, var/mob/living/target)
var/t_him = "them"
@@ -177,6 +177,23 @@
/obj/item/material/gravemarker
)
/obj/item/gripper/scene
name = "misc gripper"
desc = "A simple grasping tool that can hold a variety of 'general' objects..."
can_hold = list(
/obj/item/capture_crystal,
/obj/item/clothing,
/obj/item/implanter,
/obj/item/disk/nifsoft/compliance,
/obj/item/handcuffs,
/obj/item/toy,
/obj/item/petrifier,
/obj/item/dice,
/obj/item/casino_platinum_chip,
/obj/item/spacecasinocash
)
/obj/item/gripper/no_use/organ
name = "organ gripper"
icon_state = "gripper-flesh"
@@ -208,6 +208,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/flash/robot(src)
src.modules += new /obj/item/extinguisher(src)
src.modules += new /obj/item/tool/crowbar/cyborg(src)
src.modules += new /obj/item/gripper/scene(src)
/obj/item/robot_module/robot/standard
name = "standard robot module"
@@ -97,7 +97,8 @@
/mob/living/simple_mob/vore/alienanimals/space_ghost/apply_melee_effects(var/atom/A)
var/mob/living/L = A
L.hallucination += 50
if(L.hallucination <= 100)
L.hallucination += rand(1,10)
/mob/living/simple_mob/vore/alienanimals/space_ghost/shoot(atom/A) //We're shooting ghosts at people and need them to have the same faction as their parent, okay?
if(!projectiletype)
@@ -209,7 +210,8 @@
/mob/living/simple_mob/vore/alienanimals/spooky_ghost/apply_melee_effects(var/atom/A)
var/mob/living/L = A
if(L && istype(L))
L.hallucination += rand(1,50)
if(L.hallucination <= 100)
L.hallucination += rand(1,10)
/mob/living/simple_mob/vore/alienanimals/spooky_ghost/Life()
. = ..()
+11
View File
@@ -126,6 +126,17 @@
/atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0)
return -1
// used for petrification machines
/atom/proc/get_ultimate_mob()
var/mob/ultimate_mob
var/atom/to_check = loc
var/n = 0
while (to_check && !isturf(to_check) && n++ < 16)
if (ismob(to_check))
ultimate_mob = to_check
to_check = to_check.loc
return ultimate_mob
// Show a message to all mobs and objects in earshot of this one
// This would be for audible actions by the src mob
// message is the message output to anyone who can hear.
+13 -4
View File
@@ -3,7 +3,6 @@
/mob/verb/whisper(message as text)
set name = "Whisper"
set category = "IC.Subtle"
set hidden = 1
//VOREStation Addition Start
if(forced_psay)
@@ -15,7 +14,6 @@
/mob/verb/say_verb(message as text)
set name = "Say"
set category = "IC.Chat"
set hidden = 1
set instant = TRUE
@@ -33,7 +31,6 @@
/mob/verb/me_verb(message as message)
set name = "Me"
set category = "IC.Chat"
set desc = "Emote to nearby people (and your pred/prey)"
set hidden = 1
@@ -110,7 +107,19 @@
if(speaking.flags & NONVERBAL)
if(sdisabilities & BLIND || blinded)
return FALSE
if(!other || !(other in view(src)))
if(!other)
return FALSE
// Fixes seeing non-verbal languages while being held
if(istype(other.loc, /obj/item/holder))
if(istype(src.loc, /obj/item/holder))
if(!(other.loc in view(src.loc.loc)))
return FALSE
else if(!(other.loc in view(src)))
return FALSE
else if(istype(src.loc, /obj/item/holder))
if((!other) in view(src.loc.loc))
return FALSE
else if((!other) in view(src))
return FALSE
//Language check.
+82
View File
@@ -0,0 +1,82 @@
// Allows the usage of old style chat inputs even with TG Say enabled
/mob/verb/say_verb_old()
set name = "Say Old"
set category = "IC.Chat"
client?.start_thinking()
client?.start_typing()
var/message = tgui_input_text(usr, "Speak to people in sight.\nType your message:", "Say")
client?.stop_thinking()
if(message)
say_verb(message)
/mob/verb/me_verb_old()
set name = "Me Old"
set category = "IC.Chat"
set desc = "Emote to nearby people (and your pred/prey)"
client?.start_thinking()
client?.start_typing()
var/message = tgui_input_text(usr, "Emote to people in sight (and your pred/prey).\nType your message:", "Emote", multiline = TRUE)
client?.stop_thinking()
if(message)
me_verb(message)
/mob/verb/whisper_old()
set name = "Whisper Old"
set category = "IC.Subtle"
var/message = tgui_input_text(usr, "Speak to nearby people.\nType your message:", "Whisper")
if(message)
whisper(message)
/mob/verb/me_verb_subtle_old()
set name = "Subtle Old"
set category = "IC.Subtle"
set desc = "Emote to nearby people (and your pred/prey)"
var/message = tgui_input_text(usr, "Emote to nearby people (and your pred/prey).\nType your message:", "Subtle", multiline = TRUE)
if(message)
me_verb_subtle(message)
/mob/verb/me_verb_subtle_custom_old()
set name = "Subtle (Custom) Old"
set category = "IC.Subtle"
set desc = "Emote to nearby people, with ability to choose which specific portion of people you wish to target."
var/message = tgui_input_text(usr, "Emote to nearby people, with ability to choose which specific portion of people you wish to target.\nType your message:", "Subtle (Custom)", multiline = TRUE)
if(message)
me_verb_subtle_custom(message)
/mob/verb/psay_old()
set name = "Psay Old"
set category = "IC.Subtle"
var/message = tgui_input_text(usr, "Talk to people affected by complete absorbed or dominate predator/prey.\nType your message:", "Psay")
if(message)
psay(message)
/mob/verb/pme_old()
set name = "Pme Old"
set category = "IC.Subtle"
var/message = tgui_input_text(usr, "Emote to people affected by complete absorbed or dominate predator/prey.\nType your message:", "Pme")
if(message)
pme(message)
/mob/living/verb/player_narrate_ch()
set name = "Narrate (Player) Old"
set category = "IC.Chat"
var/message = tgui_input_text(usr, "Narrate an action or event! An alternative to emoting, for when your emote shouldn't start with your name!\nType your message:", "Narrate (Player)")
if(message)
player_narrate(message)
+1 -6
View File
@@ -4,7 +4,6 @@
/mob/verb/me_verb_subtle(message as message) //This would normally go in say.dm
set name = "Subtle"
set category = "IC.Subtle"
set desc = "Emote to nearby people (and your pred/prey)"
set hidden = 1
@@ -24,7 +23,6 @@
/mob/verb/me_verb_subtle_custom(message as message) // Literally same as above but with mode_selection set to true
set name = "Subtle (Custom)"
set category = "IC.Subtle"
set desc = "Emote to nearby people, with ability to choose which specific portion of people you wish to target."
if(forced_psay)
@@ -197,7 +195,7 @@
continue
if(src.client && M && !(get_z(src) == get_z(M)))
message = span_multizsay("[message]")
if(isobserver(M) && (!M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || \
if(isobserver(M) && (!(M.client?.prefs?.read_preference(/datum/preference/toggle/ghost_see_whisubtle) || (isbelly(M.loc) && src == M.loc:owner)) || \
!client?.prefs?.read_preference(/datum/preference/toggle/whisubtle_vis) && !M.client?.holder))
spawn(0)
M.show_message(undisplayed_message, 2)
@@ -254,7 +252,6 @@
///// PSAY /////
/mob/verb/psay(message as text)
set category = "IC.Subtle"
set name = "Psay"
set desc = "Talk to people affected by complete absorbed or dominate predator/prey."
@@ -352,7 +349,6 @@
///// PME /////
/mob/verb/pme(message as message)
set category = "IC.Subtle"
set name = "Pme"
set desc = "Emote to people affected by complete absorbed or dominate predator/prey."
@@ -448,7 +444,6 @@
M.me_verb(message)
/mob/living/verb/player_narrate(message as message)
set category = "IC.Chat"
set name = "Narrate (Player)"
set desc = "Narrate an action or event! An alternative to emoting, for when your emote shouldn't start with your name!"