mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-25 22:28:44 +01:00
Merge branch 'master' into protean-rework
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
// Chomp additions to character load/save logic
|
||||
// /datum/category_item/player_setup_item/general/body/content cannot be overridden here easily as the proc creates a list of html data
|
||||
// perhaps one could get that list here, and sort through sections to rewrite it's content...? that seems inefficent having to loop through the list.
|
||||
|
||||
//copy_to_mob setup proc for spawning mob from prefs
|
||||
/datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
. = ..()
|
||||
if(character.species.digi_allowed)
|
||||
character.digitigrade = pref.digitigrade
|
||||
else
|
||||
character.digitigrade = 0
|
||||
|
||||
//sanity check
|
||||
if(character.digitigrade == null)
|
||||
character.digitigrade = 0
|
||||
pref.digitigrade = 0 // given above code, if character.digi is null, pref.digi also has to be.
|
||||
|
||||
// ontopic, the proc for clicking an option in the body customisation panel
|
||||
/datum/category_item/player_setup_item/general/body/OnTopic(var/href,var/list/href_list, var/mob/user)
|
||||
if(href_list["digitigrade"])
|
||||
pref.digitigrade = !pref.digitigrade
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
. = ..()
|
||||
|
||||
// Savefile additions
|
||||
// Be careful here
|
||||
|
||||
// This will add chomp-custom data to the body customisaiton page, below 'body color', above 'genetics settings'
|
||||
/datum/category_item/player_setup_item/general/body/proc/chomp_custom_additions_body(var/mob/user, var/datum/species/mob_species)
|
||||
. += "<h2>ChompStation Settings</h2>"
|
||||
|
||||
if(mob_species.digi_allowed)
|
||||
. += "<br><b>Digitigrade?:</b> <a href='?src=\ref[src];digitigrade=1'><b>[pref.digitigrade ? "Yes" : "No"]</b></a><br>"
|
||||
|
||||
return .
|
||||
|
||||
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/load_character(var/savefile/S)
|
||||
. = ..()
|
||||
S["digitigrade"] >> pref.digitigrade //CHOMPEdit
|
||||
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
|
||||
. = ..()
|
||||
S["digitigrade"] << pref.digitigrade //CHOMPEdit
|
||||
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
|
||||
. = ..()
|
||||
pref.digitigrade = sanitize_integer(pref.digitigrade, 0, 1, initial(pref.digitigrade))
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/gear/plushieteshcolor
|
||||
display_name = "plushie, lifelike teshari, colorable"
|
||||
path = /obj/item/toy/plushie/teshari/w_yw
|
||||
|
||||
/datum/gear/plushieteshcolor/New()
|
||||
..()
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/spawnpoint/stationgateway
|
||||
display_name = "Station gateway"
|
||||
msg = "has completed translation from station gateway"
|
||||
disallow_job = list("Non-Crew")
|
||||
disallow_job = list(JOB_OUTSIDER)
|
||||
|
||||
/datum/spawnpoint/stationgateway/New()
|
||||
..()
|
||||
@@ -23,7 +23,7 @@
|
||||
/datum/spawnpoint/plainspath
|
||||
display_name = "Sif plains"
|
||||
msg = "has checked in at the plains gate"
|
||||
restrict_job = list("Non-Crew")
|
||||
restrict_job = list(JOB_OUTSIDER)
|
||||
|
||||
/datum/spawnpoint/plainspath/New()
|
||||
..()
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
/obj/item/clothing
|
||||
var/update_icon_define_orig = null // temp storage for original update_icon_define (if it exists)
|
||||
var/update_icon_define_digi = null
|
||||
var/fit_for_digi = FALSE // flag for if clothing has already been reskinned to digitigrade
|
||||
|
||||
/obj/item/clothing/shoes
|
||||
update_icon_define_digi = "modular_chomp/icons/inventory/feet/mob_digi.dmi"
|
||||
|
||||
/obj/item/clothing/suit
|
||||
update_icon_define_digi = "modular_chomp/icons/inventory/suit/mob_digi.dmi"
|
||||
|
||||
/obj/item/clothing/under
|
||||
update_icon_define_digi = "modular_chomp/icons/inventory/uniform/mob_digi.dmi"
|
||||
|
||||
/obj/item/clothing/shoes/MouseDrop_T(mob/living/target, mob/living/user)
|
||||
if(!istype(user)) return ..() // If the user passed in isn't a living mob, exit
|
||||
if(target != user) return ..() // If the user didn't drag themselves, exit
|
||||
@@ -17,3 +31,54 @@
|
||||
user.forceMove(src)
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/clothing/proc/handle_digitigrade(var/mob/user)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
// if digitigrade-use flag is set
|
||||
if(H.digitigrade)
|
||||
|
||||
// figure out what slot we care about
|
||||
if(!update_icon_define_digi)
|
||||
return
|
||||
|
||||
// Don't reset if already set
|
||||
if(!fit_for_digi)
|
||||
fit_for_digi = TRUE // set flag even if no icon_state exists, so we don't repeat checks
|
||||
|
||||
//if update_icon_define is already set to something, place it in a var to hold it temporarily
|
||||
if(update_icon_define)
|
||||
update_icon_define_orig = update_icon_define
|
||||
|
||||
// only override icon if a corresponding digitigrade replacement icon_state exists
|
||||
// otherwise, keep the old non-digi icon_define (or nothing)
|
||||
if(icon_state && icon_states(update_icon_define_digi).Find(icon_state))
|
||||
update_icon_define = update_icon_define_digi
|
||||
|
||||
|
||||
// if not-digitigrade, only act if the clothing was previously fit for a digitigrade char
|
||||
else
|
||||
if(fit_for_digi)
|
||||
fit_for_digi = FALSE
|
||||
|
||||
//either reset update_icon_define to it's old value
|
||||
// or reset update_icon_define to null
|
||||
if(update_icon_define_orig)
|
||||
update_icon_define = update_icon_define_orig
|
||||
update_icon_define_orig = null
|
||||
else
|
||||
update_icon_define = null
|
||||
|
||||
/obj/item/clothing/shoes/equipped(var/mob/user, var/slot)
|
||||
. = ..()
|
||||
handle_digitigrade(user)
|
||||
|
||||
/obj/item/clothing/suit/equipped(var/mob/user, var/slot)
|
||||
. = ..()
|
||||
handle_digitigrade(user)
|
||||
|
||||
/obj/item/clothing/under/equipped(var/mob/user, var/slot)
|
||||
. = ..()
|
||||
handle_digitigrade(user)
|
||||
@@ -1,15 +0,0 @@
|
||||
/obj/item/clothing/mask/gas/plaguedoctor/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/face/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/face/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/mask/gas/plaguedoctor/gold/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/face/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/face/mob_teshari.dmi'
|
||||
@@ -1,7 +0,0 @@
|
||||
/obj/item/clothing/mask/emotions/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/face/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/face/mob_teshari.dmi'
|
||||
@@ -1,97 +0,0 @@
|
||||
//PLEASE give me a better way to do this
|
||||
/obj/item/clothing/head/cone/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/wizard/fake/realistic/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/wizard/fake/realistic/colorable/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/cowboy/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/cowboy/rattan/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/cowboy/dark/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/cowboy/ranger/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/cowboy/black/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/cowboy/fancy/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/cowboy/rustler/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/cowboy/bandit/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
/obj/item/clothing/head/cowboy/wide/New()
|
||||
. = ..()
|
||||
var/shtfound = sprite_sheets.Find(SPECIES_TESHARI)
|
||||
if(shtfound)
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
else
|
||||
sprite_sheets[SPECIES_TESHARI] = 'modular_chomp/icons/inventory/head/mob_teshari.dmi'
|
||||
|
||||
@@ -20,7 +20,10 @@
|
||||
boot_type = /obj/item/clothing/shoes/magboots/rig/ch/clockwork
|
||||
cell_type = /obj/item/weapon/cell/clockwork
|
||||
|
||||
allowed = list(
|
||||
allowed = list(/obj/item/device/flashlight,
|
||||
/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,
|
||||
/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack,
|
||||
/obj/item/device/bluespaceradio, /obj/item/device/defib_kit, /obj/item/weapon/ratvarian_spear
|
||||
)
|
||||
|
||||
initial_modules = list(
|
||||
@@ -57,7 +60,7 @@
|
||||
name = "hierophant ansible"
|
||||
desc = "A curiously cold brass doodad. It seems as though it really doesn't appreciate being held. Due to it's size and the apparent electrical arc, it might be useful as a battery?"
|
||||
origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6)
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon = 'modular_chomp/icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "hierophant_ansible"
|
||||
maxcharge = 4800 //same stats as a void cell, but slower at recharging itself
|
||||
charge_amount = 120
|
||||
|
||||
@@ -83,6 +83,8 @@
|
||||
|
||||
/area/survivalpod/superpose/AnimalHospital
|
||||
|
||||
/area/survivalpod/superpose/RestaurationBar
|
||||
|
||||
/obj/item/device/survivalcapsule/superpose
|
||||
name = "superposed surfluid shelter capsule"
|
||||
desc = "A proprietary hyperstructure of many three-dimensional spaces superposed around a supermatter nano crystal; use a pen to reach the reset button. There's a license for use printed on the bottom."
|
||||
|
||||
@@ -252,4 +252,10 @@
|
||||
shelter_id = "AnimalHospital"
|
||||
mappath = "modular_chomp/maps/submaps/shelters/AnimalHospital-20x28.dmm"
|
||||
name = "Low-Tech Hospital."
|
||||
description = "An animal hospital, doesnt not contain high end medical supplies, better then nothing."
|
||||
description = "An animal hospital, doesnt not contain high end medical supplies, better then nothing."
|
||||
|
||||
/datum/map_template/shelter/superpose/RestaurationBar
|
||||
shelter_id = "RestaurationBar"
|
||||
mappath = "modular_chomp/maps/submaps/shelters/RestaurationBar-32x32.dmm"
|
||||
name = "Resto-Bar"
|
||||
description = "A large restaurant for food and drink, two overnight rental rooms and a small garden."
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
/mob/observer
|
||||
var/mob/living/body_backup = null //add reforming
|
||||
|
||||
/mob/observer/Destroy()
|
||||
if(body_backup)
|
||||
qdel(body_backup)
|
||||
..()
|
||||
@@ -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)
|
||||
..()
|
||||
@@ -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
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
+1
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/datum/trait/negative/deep_sleeper
|
||||
custom_only = FALSE
|
||||
@@ -0,0 +1,5 @@
|
||||
/datum/trait/positive/hardfeet
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/positive/linguist
|
||||
custom_only = FALSE
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
+23
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
@@ -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'
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
//clockcult gun
|
||||
|
||||
/obj/item/weapon/gun/energy/clockwork
|
||||
name = "clockwork rifle"
|
||||
desc = "A rifle that looks to be made entirely out of brass. It has a charging handle on the side, but doesn't seem to have a way to eject the magazine underneath."
|
||||
icon = 'modular_chomp/icons/obj/guns/clockwork/guns_ch.dmi'
|
||||
icon_state = "clockrifle"
|
||||
item_state = "clockrifle"
|
||||
wielded_item_state = "clockrifle-wielded"
|
||||
slot_flags = SLOT_BACK
|
||||
item_icons = list(slot_l_hand_str = 'modular_chomp/icons/mob/items/lefthand_guns_ch.dmi', slot_r_hand_str = 'modular_chomp/icons/mob/items/righthand_guns_ch.dmi', "slot_back" = 'modular_chomp/icons/mob/guns_back_ch.dmi')
|
||||
origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_POWER = 4)
|
||||
projectile_type = /obj/item/projectile/bullet/rifle/clockwork
|
||||
w_class = ITEMSIZE_HUGE
|
||||
one_handed_penalty = 90
|
||||
accuracy = 45
|
||||
charge_cost = 300
|
||||
|
||||
battery_lock = 1
|
||||
unacidable = TRUE
|
||||
|
||||
var/recharging = 0
|
||||
var/phase_power = 2400
|
||||
firemodes = list(
|
||||
list(mode_name="burst", burst=3, fire_delay=8, projectile_type=/obj/item/projectile/bullet/rifle/clockwork, charge_cost = 80),
|
||||
list(mode_name="volt beam", fire_delay=12, projectile_type=/obj/item/projectile/beam/shock/clockwork, charge_cost = 2400),
|
||||
)
|
||||
cell_type = /obj/item/weapon/cell/device/weapon/empproof
|
||||
|
||||
/obj/item/weapon/gun/energy/clockwork/unload_ammo(var/mob/user)
|
||||
if(recharging)
|
||||
return
|
||||
recharging = 1
|
||||
update_icon()
|
||||
playsound(src,'modular_chomp/sound/weapons/clockwork/clockwork_cock.ogg',25,1)
|
||||
user.visible_message("<span class='notice'>[user] pulls the charging handle on \the [src] and it whirrs to life!</span>", \
|
||||
"<span class='notice'>You pull the charging handle on \the [src] and begin the reloading sequence.</span>")
|
||||
playsound(src,'modular_chomp/sound/weapons/clockwork/cwc_rifle_fabricate.ogg',25,5)
|
||||
while(recharging)
|
||||
if(!do_after(user, 50, src))
|
||||
break
|
||||
user.hud_used.update_ammo_hud(user, src)
|
||||
if(power_supply.give(phase_power) < phase_power)
|
||||
break
|
||||
|
||||
recharging = 0
|
||||
update_icon()
|
||||
user.hud_used.update_ammo_hud(user, src) // Update one last time once we're finished!
|
||||
|
||||
/obj/item/projectile/bullet/rifle/clockwork
|
||||
fire_sound = 'modular_chomp/sound/weapons/clockwork/cwc_rifle_fire.ogg'
|
||||
damage = 20
|
||||
hud_state = "rifle_heavy"
|
||||
|
||||
/obj/item/projectile/beam/shock/clockwork
|
||||
name = "shock beam"
|
||||
fire_sound = 'modular_chomp/sound/weapons/clockwork/voltbeam_fire.ogg'
|
||||
icon_state = "lightning"
|
||||
damage_type = ELECTROCUTE
|
||||
|
||||
muzzle_type = /obj/effect/projectile/muzzle/voltbeam
|
||||
tracer_type = /obj/effect/projectile/tracer/voltbeam
|
||||
impact_type = /obj/effect/projectile/impact/voltbeam
|
||||
|
||||
damage = 40
|
||||
agony = 15
|
||||
eyeblur = 2
|
||||
hitsound = 'sound/effects/lightningshock.ogg'
|
||||
hitsound_wall = 'modular_chomp/sound/weapons/clockwork/voltbeamsearwall.ogg'
|
||||
hud_state = "taser"
|
||||
|
||||
/obj/effect/projectile/muzzle/voltbeam
|
||||
icon = 'modular_chomp/icons/obj/guns/clockwork/projectiles_tracer_ch.dmi'
|
||||
icon_state = "muzzle_volt_ray"
|
||||
light_range = 2
|
||||
light_power = 1
|
||||
light_color = "#DAAA18"
|
||||
|
||||
/obj/effect/projectile/tracer/voltbeam
|
||||
icon = 'modular_chomp/icons/obj/guns/clockwork/projectiles_tracer_ch.dmi'
|
||||
icon_state = "volt_ray"
|
||||
light_range = 2
|
||||
light_power = 1
|
||||
light_color = "#DAAA18"
|
||||
|
||||
/obj/effect/projectile/impact/voltbeam
|
||||
icon = 'modular_chomp/icons/obj/guns/clockwork/projectiles_tracer_ch.dmi'
|
||||
icon_state = "impact_volt_ray"
|
||||
light_range = 2
|
||||
light_power = 1
|
||||
light_color = "#DAAA18"
|
||||
@@ -0,0 +1,25 @@
|
||||
/decl/chemical_reaction/instant/amorphorovir
|
||||
name = "Amorphorovir"
|
||||
id = "amorphorovir"
|
||||
result = "amorphorovir"
|
||||
required_reagents = list("cryptobiolin" = 30, "biomass" = 30, "hyperzine" = 20)
|
||||
catalysts = list("phoron" = 5)
|
||||
result_amount = 1
|
||||
|
||||
/decl/chemical_reaction/instant/androrovir
|
||||
result = "change_drug_male"
|
||||
|
||||
/decl/chemical_reaction/instant/gynorovir
|
||||
result = "change_drug_female"
|
||||
|
||||
/decl/chemical_reaction/instant/androgynorovir
|
||||
result = "change_drug_intersex"
|
||||
|
||||
/decl/chemical_reaction/instant/androrovir_bootleg
|
||||
result = "change_drug_male"
|
||||
|
||||
/decl/chemical_reaction/instant/gynorovir_bootleg
|
||||
result = "change_drug_female"
|
||||
|
||||
/decl/chemical_reaction/instant/androgynorovir_bootleg
|
||||
result = "change_drug_intersex"
|
||||
@@ -0,0 +1,64 @@
|
||||
///GENDER CHANGE REAGENTS////
|
||||
|
||||
/datum/reagent/change_drug //base chemical
|
||||
name = "Amorphorovir" //always the same name
|
||||
id = "change_drug"
|
||||
metabolism = 100 //set high enough that it does not process multiple times(delay implemented below)
|
||||
description = "the bloods DNA in this seems aggressive"
|
||||
taste_description = "this shouldn't be here" //unobtainable ingame
|
||||
color = "#7F0000"
|
||||
var/gender_change = null //set the gender variable here so we can set it to others in varients
|
||||
|
||||
/datum/reagent/change_drug/male //inherits base chemical properties listed above
|
||||
name = "Androrovir"
|
||||
id = "change_drug_male" //unique ID for each varient
|
||||
taste_description = "old spice odor blocker and body wash"
|
||||
reagent_state = LIQUID
|
||||
description = \
|
||||
"A medical concoction, capable of rapidly altering genetic and physical structure of the body. This one seems\
|
||||
to realign the target's gender to be male."
|
||||
color = "#428AFF"
|
||||
gender_change = "male"
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/change_drug/female
|
||||
name = "Gynorovir"
|
||||
id = "change_drug_female"
|
||||
description = \
|
||||
"A medical concoction, capable of rapidly altering genetic and physical structure of the body. This one seems\
|
||||
to realign the target's gender to be female."
|
||||
taste_description = "spiced honey"
|
||||
reagent_state = LIQUID
|
||||
color = "#FFA0FA"
|
||||
gender_change = "female"
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/change_drug/intersex
|
||||
name = "Androgynorovir"
|
||||
id = "change_drug_intersex"
|
||||
description = \
|
||||
"A medical concoction, capable of rapidly altering genetic and physical structure of the body. This one seems\
|
||||
to realign the target's gender to be mixed."
|
||||
taste_description = "something salty and sweet"
|
||||
reagent_state = LIQUID
|
||||
color = "#CB9EFF"
|
||||
gender_change = "plural"
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/change_drug/affect_blood(var/mob/living/carbon/human/M, var/alien, var/removed)
|
||||
if (!(alien == IS_DIONA || M.gender == gender_change || M.gender_change_cooldown == 1) && M.allow_spontaneous_tf)
|
||||
//set not to bug them because the chem is activating
|
||||
M.gender_change_cooldown = 1
|
||||
M.visible_message(
|
||||
"<span class='notice'>[M] suddenly twitches as some of their features seem to contort and reshape.</span>",
|
||||
"<span class='notice'>You lose focus as warmth spreads throughout your chest and abdomen.</span>"
|
||||
)
|
||||
//wait 30 seconds, growth takes time yo
|
||||
spawn(300)
|
||||
//allow it to bug them again now that we've waited
|
||||
M.gender_change_cooldown = 0
|
||||
//check if they want this to happen for pref sake
|
||||
if (alert(M,"This chemical will change your gender, proceed?", "Warning", "Yes", "No") == "Yes")
|
||||
M.change_gender_identity(gender_change)
|
||||
M.change_gender(gender_change)
|
||||
M << "<span class='warning'>You feel like a new person.</span>" //success
|
||||
@@ -0,0 +1,11 @@
|
||||
/obj/machinery/clonepod/transhuman/growclone(var/datum/transhuman/body_record/current_project)
|
||||
. = ..()
|
||||
//Extra clonepod behavior
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
var/datum/dna2/record/R = current_project.mydna
|
||||
|
||||
H.digitigrade = R.dna.digitigrade // ensure clone mob has digitigrade var set appropriately
|
||||
if(H.dna.digitigrade <> R.dna.digitigrade)
|
||||
H.dna.digitigrade = R.dna.digitigrade // ensure cloned DNA is set appropriately from record??? for some reason it doesn't get set right despite the override to datum/dna/Clone()
|
||||
|
||||
H.update_icons_body()
|
||||
@@ -183,6 +183,12 @@
|
||||
// Visuals
|
||||
belly_data["affects_vore_sprites"] = B.affects_vore_sprites
|
||||
belly_data["count_absorbed_prey_for_sprite"] = B.count_absorbed_prey_for_sprite
|
||||
belly_data["absorbed_multiplier"] = B.absorbed_multiplier
|
||||
belly_data["count_liquid_for_sprite"] = B.count_liquid_for_sprite
|
||||
belly_data["liquid_multiplier"] = B.liquid_multiplier
|
||||
belly_data["count_items_for_sprite"] = B.count_items_for_sprite
|
||||
belly_data["item_multiplier"] = B.item_multiplier
|
||||
belly_data["health_impacts_size"] = B.health_impacts_size
|
||||
belly_data["resist_triggers_animation"] = B.resist_triggers_animation
|
||||
belly_data["size_factor_for_sprite"] = B.size_factor_for_sprite
|
||||
belly_data["belly_sprite_to_affect"] = B.belly_sprite_to_affect
|
||||
|
||||
Reference in New Issue
Block a user