Merge branch 'master' into protean-rework

This commit is contained in:
BlackMajor
2022-12-19 18:27:08 +13:00
committed by GitHub
488 changed files with 12463 additions and 69425 deletions

View File

@@ -0,0 +1,7 @@
/mob/observer
var/mob/living/body_backup = null //add reforming
/mob/observer/Destroy()
if(body_backup)
qdel(body_backup)
..()

View File

@@ -0,0 +1,7 @@
/obj/item/device/mmi
var/mob/living/body_backup = null //add reforming
/obj/item/device/mmi/Destroy()
if(body_backup)
qdel(body_backup)
..()

View File

@@ -0,0 +1,20 @@
/mob/living/carbon/human/verb/hide_nutrition()
set name = "Show/Hide Nutrition Levels"
set category = "IC"
set desc = "Allow other player to see your current nutrition level or not."
nutrition_hidden = !nutrition_hidden
to_chat(src, "Players will [nutrition_hidden ? "no longer" : "now"] see your nutrition levels.")
/mob/living/carbon/human/proc/toggle_speech_sounds()
set name = "Toggle Species Speech Sounds"
set desc = "Toggle if your species defined speech sound has a chance of playing on a Say"
set category = "IC"
if(stat)
to_chat(src, "<span class='warning'>You must be awake and standing to perform this action!</span>")
return
speech_sound_enabled = !speech_sound_enabled
to_chat(src, "You will [speech_sound_enabled ? "now" : "no longer"] have a chance to play your species defined speech sound on a Say.")
return TRUE

View File

@@ -22,4 +22,11 @@
set category = "IC"
set desc = "Toggle headset worn icon visibility."
hide_headset = !hide_headset
update_inv_ears()
update_inv_ears()
/mob/living/carbon/human/verb/hide_glasses()
set name = "Show/Hide Glasses"
set category = "IC"
set desc = "Toggle glasses worn icon visibility."
hide_glasses = !hide_glasses
update_inv_glasses()

View File

@@ -9,4 +9,7 @@
vore_icon_bellies = list("stomach", "taur belly")
var/struggle_anim_stomach = FALSE
var/struggle_anim_taur = FALSE
var/hide_headset = FALSE
var/hide_headset = FALSE
var/hide_glasses = FALSE
var/speech_sound_enabled = TRUE
var/nutrition_hidden = FALSE

View File

@@ -0,0 +1,5 @@
/datum/species/vox
speech_chance = 50 // As long as we're making the option to disable it, might as well bump up the chances when it is enabled
inherent_verbs = list(
/mob/living/carbon/human/proc/toggle_speech_sounds
)

View File

@@ -1,3 +1,51 @@
/datum/species
var/crit_mod = 1
var/vore_belly_default_variant = "H"
/datum/species
var/crit_mod = 1
var/vore_belly_default_variant = "H"
var/list/env_traits = list()
var/dirtslip = FALSE
var/photosynthesizing = FALSE
var/grows = FALSE
var/shrinks = FALSE
var/rad_levels = list("safe" = 2.5, "danger_1" = 50, "danger_2" = 75, "danger_3" = 150)
var/rad_removal_mod = 1
var/bite_mod = 1
var/grab_resist_divisor_victims = 1
var/grab_resist_divisor_self = 1
var/grab_power_victims = 0
var/grab_power_self = 0
var/waking_speed = 1
var/mudking = FALSE
var/icodigi = 'modular_chomp/icons/mob/human_races/r_digi.dmi'
var/digi_allowed = FALSE
// Handles non-standard eyes when using a species that utilizes a custom base icon set.
// Eye data is stored in the head organ, and this needs to be handled specially.
/datum/species/proc/handle_base_eyes(var/mob/living/carbon/human/H, var/custom_base)
if(selects_bodytype && custom_base) // only bother if our src species datum allows bases and one is assigned
var/datum/species/S = GLOB.all_species[custom_base]
//extract default eye data from species datum
var/baseHeadPath = S.has_limbs[BP_HEAD]["path"] //has_limbs is a list of lists
if(!baseHeadPath)
return // exit if we couldn't find a head path from the base.
var/obj/item/organ/external/head/baseHead = new baseHeadPath()
if(!baseHead)
return // exit if we didn't create the base properly
var/obj/item/organ/external/head/targetHead = H.get_organ(BP_HEAD)
if(!targetHead)
return // don't bother if target mob has no head for whatever reason
targetHead.eye_icon = baseHead.eye_icon
targetHead.eye_icon_location = baseHead.eye_icon_location
if(!QDELETED(baseHead) && baseHead)
qdel(baseHead)
return
/datum/species/handle_environment_special(var/mob/living/carbon/human/H)
for(var/datum/trait/env_trait in env_traits)
env_trait.handle_environment_special(H)
return

View File

@@ -19,6 +19,7 @@
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
health_hud_intensity = 2
num_alternate_languages = 3
species_language = LANGUAGE_EAL
assisted_langs = list(LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX)
speech_bubble_appearance = "synthetic"
color_mult = TRUE

View File

@@ -1,2 +1,74 @@
/datum/species/unathi
vore_belly_default_variant = "L"
//Any species commented out here must be made restricted elsewhere. They are kept here for easy reference of what we disabled.
//Note that at the time of this PR we are simply disabling everything new to discuss keeping versus scrapping later.
///datum/species/zaddat
// spawn_flags = SPECIES_IS_RESTRICTED //Species has been enabled elsewhere.
///datum/species/crew_shadekin
// spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/human/gravworlder
spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/human/spacer
spawn_flags = SPECIES_IS_RESTRICTED
///datum/species/alraune
// spawn_flags = SPECIES_IS_RESTRICTED //Species has been enabled, keeping this here for reference.
///datum/species/werebeast
// spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/shadekin_yw
spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/shadekin
//spawn_flags = SPECIES_IS_RESTRICTED
//datum/species/protean
// spawn_flags = SPECIES_IS_RESTRICTED
//TFF 20/1/20 - More whitelisted species listed here. Unable to force overrides to be enabled here.
/*
/datum/species/xenochimera
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
/datum/species/diona
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
/datum/species/vox
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
*/
//Can use digitigrade flags
/datum/species/custom
digi_allowed = TRUE
/datum/species/unathi
digi_allowed = TRUE
vore_belly_default_variant = "L"
/datum/species/tajaran
digi_allowed = TRUE
/datum/species/hi_zoxxen
digi_allowed = TRUE
/datum/species/sergal
digi_allowed = TRUE
/datum/species/akula
digi_allowed = TRUE
/datum/species/nevrean
digi_allowed = TRUE
/datum/species/vulpkanin
digi_allowed = TRUE
/datum/species/xenohybrid
digi_allowed = TRUE
/datum/species/xenochimera
digi_allowed = TRUE

View File

@@ -0,0 +1,2 @@
/datum/trait/negative/deep_sleeper
custom_only = FALSE

View File

@@ -0,0 +1,5 @@
/datum/trait/positive/hardfeet
custom_only = FALSE
/datum/trait/positive/linguist
custom_only = FALSE

View File

@@ -0,0 +1,12 @@
/obj/item/weapon/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/weapon/implanter,
/obj/item/weapon/disk/nifsoft/compliance,
/obj/item/weapon/handcuffs,
/obj/item/toy
)

View File

@@ -2,6 +2,7 @@
//speech sounds
var/list/speech_sounds = list()
var/speech_chance = 75 //mobs can be a bit more emotive than carbon/humans
var/speech_sound_enabled = TRUE
//vars for vore_icons toggle control
var/vore_icons_cache = null // null by default. Going from ON to OFF should store vore_icons val here, OFF to ON reset as null
@@ -34,8 +35,22 @@
update_icon()
/mob/living/simple_mob/verb/toggle_speech_sounds()
set name = "Toggle Species Speech Sounds"
set desc = "Toggle if your species defined speech sound has a chance of playing on a Say"
set category = "IC"
if(stat)
to_chat(src, "<span class='warning'>You must be awake and standing to perform this action!</span>")
return
speech_sound_enabled = !speech_sound_enabled
to_chat(src, "You will [speech_sound_enabled ? "now" : "no longer"] have a chance to play your species defined speech sound on a Say.")
return TRUE
/mob/living/simple_mob/handle_speech_sound()
if(speech_sounds && speech_sounds.len && prob(speech_chance))
if(speech_sound_enabled && speech_sounds && speech_sounds.len && prob(speech_chance))
var/list/returns[2]
returns[1] = sound(pick(speech_sounds))
returns[2] = 50
@@ -83,7 +98,6 @@
// This from original living.dm update_transforms too
handle_status_indicators()
/mob/living/simple_mob/proc/use_headset()
set name = "Use Headset"
set desc = "Opens your headset's GUI, if you have one."
@@ -107,4 +121,4 @@
/mob/living/simple_mob/New(var/newloc)
..()
verbs |= /mob/living/simple_mob/proc/use_headset
verbs |= /mob/living/simple_mob/proc/use_pda
verbs |= /mob/living/simple_mob/proc/use_pda

View File

@@ -0,0 +1,12 @@
/mob/living/simple_mob/horror/Master/aerostat
say_list_type = /datum/say_list/cyber_horror/master
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/horrormaster //The final boss of every Gradius game
/datum/say_list/cyber_horror/master
threaten_sound = 'modular_chomp/sound/mob/robots/MasterSee.ogg'
/datum/ai_holder/simple_mob/ranged/kiting/horrormaster
threaten = TRUE
threaten_delay = 1 SECOND
threaten_timeout = 30 SECONDS

View File

@@ -0,0 +1,12 @@
/mob/living/simple_mob/mechanical/infectionbot //This literally just adds onto the base robot at /code/modules/mob/living/simple_mob/subtypes/mechanical/disbot_vr.dm
say_list_type = /datum/say_list/disbot
ai_holder_type = /datum/ai_holder/simple_mob/melee/disbot
/datum/say_list/disbot
threaten_sound = 'modular_chomp/sound/mob/robots/infector.ogg'
/datum/ai_holder/simple_mob/melee/disbot
threaten = TRUE
threaten_delay = 1 SECOND
threaten_timeout = 30 SECONDS

View File

@@ -0,0 +1,23 @@
/mob/living/simple_mob/mechanical/combat_drone/lesser/aerostat
desc = "A Vir System Authority automated combat drone with an aged apperance."
movement_cooldown = 10
say_list_type = /datum/say_list/malf_drone/drone_aerostat
ai_holder_type = /datum/ai_holder/simple_mob/ranged/kiting/threatening/drone_aerostat
/datum/say_list/malf_drone/drone_aerostat
speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")
say_understood = list("Affirmative.", "Positive.")
say_cannot = list("Denied.", "Negative.")
say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.")
say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.")
say_threaten = list("This area is condemned by Vir System Authority. Please leave immediately. You have 20 seconds to comply.")
say_stand_down = list("Visual lost.", "Error: Target not found.")
say_escalate = list("Intruder is tresspassing. Maximum force authorized by Vir System Suthority.")
threaten_sound = 'modular_chomp/sound/mob/robots/DroneFreezeLong.ogg'
stand_down_sound = 'modular_chomp/sound/mob/robots/DroneLostTarget.ogg'
/datum/ai_holder/simple_mob/ranged/kiting/threatening/drone_aerostat
threaten_delay = 10 SECOND
threaten_timeout = 30 SECONDS

View File

@@ -0,0 +1,22 @@
/mob/living/simple_mob/mechanical/mecha/combat/gygax/aerostat
desc = "A Vir System Authority automated combat mech with an aged apperance."
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
say_list = /datum/say_list/gygax_aerostat
/datum/say_list/gygax_aerostat
speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")
say_understood = list("Affirmative.", "Positive.")
say_cannot = list("Denied.", "Negative.")
say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.")
say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.")
say_threaten = list("This area is condemned by Vir System Authority. Please leave immediately. You have 20 seconds to comply.")
say_stand_down = list("Visual lost.", "Error: Target not found.")
say_escalate = list("Intruder is tresspassing. Maximum force authorized by Vir System Suthority.")
threaten_sound = 'modular_chomp/sound/mob/robots/GygaxIntruder4.ogg'
stand_down_sound = 'modular_chomp/sound/mob/robots/GygaxDanger.ogg'
/datum/ai_holder/simple_mob/ranged/kiting/threatening/drone_aerostat
threaten_delay = 20 SECOND
threaten_timeout = 30 SECONDS

View File

@@ -0,0 +1,49 @@
/mob/living/simple_mob/shadekin
var/phase_gentle = 0
/mob/living/simple_mob/shadekin/Login()
. = ..()
verbs |= /mob/living/simple_mob/shadekin/proc/phase_strength_toggle
// Allow horizontal resting
/mob/living/simple_mob/shadekin/update_transform()
update_transform_horizontal()
//custom light flicker proc
/mob/living/simple_mob/shadekin/proc/handle_phasein_flicker()
if(phase_gentle) // gentle case: No light destruction. Flicker in 4 tile radius for 3s. Weaken for 3sec after
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 4)
continue
L.flicker(3)
src.Stun(3)
else //normal case. Flicker in 10 tile radius for 10s. chance to destroy light based on eye type.
var/destroy_lights = 0
if(eye_state == RED_EYES)
destroy_lights = 80
if(eye_state == PURPLE_EYES)
destroy_lights = 25
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 10)
continue
if(prob(destroy_lights))
spawn(rand(5,25))
L.broken()
else
L.flicker(10)
//toggle proc for toggling gentle/normal phasing
/mob/living/simple_mob/shadekin/proc/phase_strength_toggle()
set name = "Toggle Phase Strength"
set desc = "Toggle strength of phase. Gentle but slower, or faster but destructive to lights."
set category = "Abilities"
if(phase_gentle)
to_chat(src, "<span class='notice'>Phasing toggled to Normal. You may damage lights.</span>")
phase_gentle = 0
else
to_chat(src, "<span class='notice'>Phasing toggled to Gentle. You won't damage lights, but concentrating on that incurs a short stun.</span>")
phase_gentle = 1

View File

@@ -88,6 +88,8 @@
var/datum/action/innate/xeno_ch/xeno_pounce/pounce_action = new
var/datum/action/innate/xeno_ch/xeno_spin/spin_action = new
can_be_drop_prey = FALSE //CHOMP Add
/mob/living/simple_mob/xeno_ch/Initialize()
..()
src.adjust_nutrition(src.max_nutrition)
@@ -97,6 +99,7 @@
. = ..()
faction = "neutral"
verbs |= /mob/living/simple_mob/xeno_ch/proc/xeno_build
verbs |= /mob/living/simple_mob/verb/toggle_speech_sounds
build_action.Grant(src)

View File

@@ -1,9 +1,10 @@
/mob
var/voice_freq = 42500 // Preference for character voice frequency
var/list/voice_sounds_list = list() // The sound list containing our voice sounds!
var/enabled = TRUE //Pauses a mob if disabled (Prevents life ticks from happening)
var/died_in_vr = FALSE //For virtual reality sleepers
/mob/is_incorporeal()
if(incorporeal_move)
return 1
..()
..()

View File

@@ -163,4 +163,22 @@
name = "Thick Throat"
icon_state = "thickthroat"
body_parts = list(BP_HEAD)
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/marking/ch/fangs2
name = "Forward Fangs"
icon_state = "fangs2"
body_parts = list(BP_HEAD)
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/marking/ch/fangs3
name = "Further Forward Fangs"
icon_state = "fangs3"
body_parts = list(BP_HEAD)
color_blend_mode = ICON_MULTIPLY
/datum/sprite_accessory/marking/ch/normeyes
name = "Normal Eyes"
icon_state = "normeyes"
body_parts = list(BP_HEAD)
color_blend_mode = ICON_MULTIPLY

View File

@@ -1,3 +1,7 @@
/datum/sprite_accessory/tail
lower_layer_dirs = list(SOUTH, WEST, EAST)
/datum/sprite_accessory/tail/anthrovirus_tail
name = "Anthro Virus Tail"
icon = 'icons/mob/vore/tails_ch.dmi'