mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-23 20:16:19 +01:00
Merge branch 'master' into TRASH
This commit is contained in:
@@ -241,6 +241,46 @@ datum/gear/suit/duster
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/hop
|
||||
allowed_roles = list("Head of Personnel")
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/cargo
|
||||
display_name = "cloak, cargo"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/cargo
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/mining
|
||||
display_name = "cloak, mining"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/mining
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/security
|
||||
display_name = "cloak, security"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/security
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/service
|
||||
display_name = "cloak, service"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/service
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/engineer
|
||||
display_name = "cloak, engineer"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/engineer
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/atmos
|
||||
display_name = "cloak, atmos"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/atmos
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/research
|
||||
display_name = "cloak, science"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/research
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/medical
|
||||
display_name = "cloak, medical"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/medical
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/custom //A colorable cloak
|
||||
display_name = "cloak (colorable)"
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cloak/custom
|
||||
|
||||
/datum/gear/suit/roles/poncho/cloak/custom/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/suit/unathi_robe
|
||||
display_name = "roughspun robe"
|
||||
path = /obj/item/clothing/suit/unathi/robe
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
name = "display monitor"
|
||||
desc = "A rather clunky old CRT-style display screen, fit for mounting on an optical output."
|
||||
body_parts_covered = FACE
|
||||
body_parts_covered = FACE|EYES
|
||||
dir = SOUTH
|
||||
|
||||
icon = 'icons/mob/monitor_icons.dmi'
|
||||
@@ -73,7 +73,7 @@
|
||||
/obj/item/clothing/mask/synthfacemask
|
||||
name = "Synth Face"
|
||||
desc = "A round dark muzzle made of LEDs."
|
||||
body_parts_covered = FACE
|
||||
body_parts_covered = FACE|EYES
|
||||
icon = 'icons/mob/species/seromi/synth_facemask.dmi'
|
||||
icon_override = 'icons/mob/species/seromi/synth_facemask.dmi'
|
||||
icon_state = "synth_facemask"
|
||||
@@ -98,5 +98,6 @@
|
||||
return 0
|
||||
update_icon()
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(istype(H)) H.update_inv_wear_mask()
|
||||
if (H.stat == DEAD) icon_state = "synth_facemask_dead"
|
||||
if(istype(H)) H.update_inv_wear_mask()
|
||||
|
||||
|
||||
@@ -148,3 +148,10 @@
|
||||
new /obj/item/clothing/accessory/badge/holo/cord(src)
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/badge/belly
|
||||
name = "bellybrig holobadge"
|
||||
desc = "This glowing blue badge marks the holder as a designated bellybrig."
|
||||
icon_state = "vorebadge"
|
||||
badge_string = "Certified Bellybrig"
|
||||
@@ -181,6 +181,61 @@
|
||||
icon_state = "capcloak"
|
||||
item_state = "capcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/cargo
|
||||
name = "brown cloak"
|
||||
desc = "A simple brown and black cloak."
|
||||
icon_state = "cargocloak"
|
||||
item_state = "cargocloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/mining
|
||||
name = "trimmed purple cloak"
|
||||
desc = "A trimmed purple and brown cloak."
|
||||
icon_state = "miningcloak"
|
||||
item_state = "miningcloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/security
|
||||
name = "red cloak"
|
||||
desc = "A simple red and black cloak."
|
||||
icon_state = "seccloak"
|
||||
item_state = "seccloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/service
|
||||
name = "green cloak"
|
||||
desc = "A simple green and blue cloak."
|
||||
icon_state = "servicecloak"
|
||||
item_state = "servicecloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/engineer
|
||||
name = "gold cloak"
|
||||
desc = "A simple gold and brown cloak."
|
||||
icon_state = "engicloak"
|
||||
item_state = "engicloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/atmos
|
||||
name = "yellow cloak"
|
||||
desc = "A trimmed yellow and blue cloak."
|
||||
icon_state = "atmoscloak"
|
||||
item_state = "atmoscloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/research
|
||||
name = "purple cloak"
|
||||
desc = "A simple purple and white cloak."
|
||||
icon_state = "scicloak"
|
||||
item_state = "scicloak"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/medical
|
||||
name = "blue cloak"
|
||||
desc = "A simple blue and white cloak."
|
||||
icon_state = "medcloak"
|
||||
item_state = "medcloak"
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cloak/custom //A colorable cloak
|
||||
name = "cloak"
|
||||
desc = "A simple, bland cloak."
|
||||
icon_state = "colorcloak"
|
||||
item_state = "colorcloak"
|
||||
|
||||
/obj/item/clothing/accessory/hawaii
|
||||
name = "flower-pattern shirt"
|
||||
desc = "You probably need some welder googles to look at this."
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
|
||||
/obj/item/weapon/spacecasinocash/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/spacecasinocash))
|
||||
if(istype(W, /obj/item/weapon/spacecasinocash/ewallet)) return 0
|
||||
|
||||
var/obj/item/weapon/spacecasinocash/SC = W
|
||||
|
||||
@@ -144,25 +143,12 @@ proc/spawn_casinochips(var/sum, spawnloc, mob/living/carbon/human/human_user as
|
||||
human_user.put_in_hands(SC)
|
||||
return
|
||||
|
||||
/obj/item/weapon/spacecasinocash/ewallet
|
||||
name = "Casino chip card"
|
||||
icon_state = "efundcard"
|
||||
desc = "A casino card that can hold credits."
|
||||
var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions.
|
||||
attack_self() return //Don't act
|
||||
attackby() return //like actual
|
||||
update_icon() return //space cash
|
||||
|
||||
/obj/item/weapon/spacecasinocash/ewallet/examine(mob/user)
|
||||
..(user)
|
||||
if (!(user in view(2)) && user!=src.loc) return
|
||||
user << "<font color='#6F6FE2'>Casino chip card's owner: [src.owner_name]. credits remaining: [src.worth].</font>"
|
||||
|
||||
/obj/item/weapon/casin_platinum_chip
|
||||
/obj/item/weapon/casino_platinum_chip
|
||||
name = "platinum chip"
|
||||
desc = "Ringa-a-Ding-Ding!"
|
||||
icon = 'icons/obj/casino.dmi'
|
||||
icon_state = "platinum_chip"
|
||||
var/sides = 2
|
||||
opacity = 0
|
||||
density = 0
|
||||
anchored = 0.0
|
||||
@@ -170,4 +156,14 @@ proc/spawn_casinochips(var/sum, spawnloc, mob/living/carbon/human/human_user as
|
||||
throwforce = 1.0
|
||||
throw_speed = 1
|
||||
throw_range = 2
|
||||
w_class = ITEMSIZE_SMALL
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
/obj/item/weapon/casino_platinum_chip/attack_self(mob/user as mob)
|
||||
var/result = rand(1, sides)
|
||||
var/comment = ""
|
||||
if(result == 1)
|
||||
comment = "Ace"
|
||||
else if(result == 2)
|
||||
comment = "Joker"
|
||||
user.visible_message("<span class='notice'>[user] has thrown \the [src]. It lands on [comment]! </span>", \
|
||||
"<span class='notice'>You throw \the [src]. It lands on [comment]! </span>")
|
||||
@@ -48,6 +48,8 @@
|
||||
teleport(user)
|
||||
|
||||
/obj/effect/portal/worm/teleport(atom/movable/M)
|
||||
if(istype(M, /mob/observer))
|
||||
return
|
||||
if(istype(M, /obj/effect)) //sparks don't teleport
|
||||
return
|
||||
if(M.anchored && istype(M, /obj/mecha))
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
mob_swap_flags = ~HEAVY
|
||||
|
||||
var/identifying_gender // In case the human identifies as another gender than it's biological
|
||||
var/gender_change_cooldown = 0 // A cooldown for gender and gender indentify changing procs to make it easy to avoid spam of gender change
|
||||
|
||||
var/step_count = 0 // Track how many footsteps have been taken to know when to play footstep sounds
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/datum/trait/transformer
|
||||
name = "Transformer"
|
||||
desc = "Allows you to change your body at will!"
|
||||
cost = 4
|
||||
|
||||
/datum/trait/transformer/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/carbon/human/proc/transform_select_shape
|
||||
H.verbs |= /mob/living/carbon/human/proc/transform_select_colour
|
||||
H.verbs |= /mob/living/carbon/human/proc/transform_select_hair
|
||||
H.verbs |= /mob/living/carbon/human/proc/transform_select_eye_colour
|
||||
H.verbs |= /mob/living/carbon/human/proc/transform_select_hair_colors
|
||||
H.verbs |= /mob/living/carbon/human/proc/transform_select_gender
|
||||
H.verbs |= /mob/living/carbon/human/proc/transform_select_wings
|
||||
H.verbs |= /mob/living/carbon/human/proc/transform_select_tail
|
||||
H.verbs |= /mob/living/carbon/human/proc/transform_select_ears
|
||||
+380
@@ -0,0 +1,380 @@
|
||||
// Procs for the prometh- COUGH- I mean, traits are here.
|
||||
// Contains procs on transforming hair and such, mostly ripped from shape shifters however adjusted for a trait.
|
||||
//
|
||||
// I should recycle and use the existing promethean code and do no edits, however I put the code here so that people
|
||||
// can make edits to the actual trait compared to prometheans, such as giving them a longer cooldown or something if it ever has a need.
|
||||
|
||||
// - Jon
|
||||
|
||||
|
||||
// Species stuff.
|
||||
/datum/species
|
||||
var/valid_trait_transform_species = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY)
|
||||
|
||||
/datum/species/proc/get_valid_transform_forms(var/mob/living/carbon/human/H)
|
||||
return valid_trait_transform_species
|
||||
|
||||
// Verbs
|
||||
/mob/living/carbon/human/proc/transform_select_hair()
|
||||
|
||||
set name = "Select Hair"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
|
||||
var/list/valid_hairstyles = list()
|
||||
var/list/valid_facialhairstyles = list()
|
||||
for(var/hairstyle in hair_styles_list)
|
||||
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
|
||||
if(gender == MALE && S.gender == FEMALE)
|
||||
continue
|
||||
if(gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
if(!(species.get_bodytype(src) in S.species_allowed))
|
||||
continue
|
||||
valid_hairstyles += hairstyle
|
||||
for(var/facialhairstyle in facial_hair_styles_list)
|
||||
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
|
||||
if(gender == MALE && S.gender == FEMALE)
|
||||
continue
|
||||
if(gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
if(!(species.get_bodytype(src) in S.species_allowed))
|
||||
continue
|
||||
valid_facialhairstyles += facialhairstyle
|
||||
|
||||
|
||||
visible_message("<span class='notice'>\The [src]'s form contorts subtly.</span>")
|
||||
if(valid_hairstyles.len)
|
||||
var/new_hair = input("Select a hairstyle.", "Transform Hair") as null|anything in valid_hairstyles
|
||||
change_hair(new_hair ? new_hair : "Bald")
|
||||
if(valid_facialhairstyles.len)
|
||||
var/new_hair = input("Select a facial hair style.", "Transform Hair") as null|anything in valid_facialhairstyles
|
||||
change_facial_hair(new_hair ? new_hair : "Shaved")
|
||||
|
||||
/mob/living/carbon/human/proc/transform_select_gender()
|
||||
|
||||
set name = "Select Gender"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 50
|
||||
|
||||
var/new_gender = input("Please select a gender.", "Transform Gender") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL)
|
||||
if(!new_gender)
|
||||
return
|
||||
|
||||
var/new_gender_identity = input("Please select a gender Identity.", "Transform Gender Identity") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL, HERM) //VOREStation Edit
|
||||
if(!new_gender_identity)
|
||||
return
|
||||
|
||||
visible_message("<span class='notice'>\The [src]'s form contorts subtly.</span>")
|
||||
change_gender(new_gender)
|
||||
change_gender_identity(new_gender_identity)
|
||||
|
||||
/mob/living/carbon/human/proc/transform_select_shape()
|
||||
|
||||
set name = "Select Body Shape"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 50
|
||||
|
||||
var/new_species = null
|
||||
new_species = input("Please select a species to emulate.", "Transform Body") as null|anything in species.get_valid_transform_forms(src)
|
||||
|
||||
if(!new_species || !all_species[new_species] || wrapped_species_by_ref["\ref[src]"] == new_species)
|
||||
return
|
||||
transform_change_shape(new_species)
|
||||
|
||||
/mob/living/carbon/human/proc/transform_change_shape(var/new_species = null)
|
||||
if(!new_species)
|
||||
return
|
||||
|
||||
wrapped_species_by_ref["\ref[src]"] = new_species
|
||||
visible_message("<span class='notice'>\The [src] shifts and contorts, taking the form of \a [new_species]!</span>")
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/carbon/human/proc/transform_select_colour()
|
||||
|
||||
set name = "Select Body Colour"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 50
|
||||
|
||||
var/new_skin = input("Please select a new body color.", "Change Colour") as color
|
||||
if(!new_skin)
|
||||
return
|
||||
transform_set_colour(new_skin)
|
||||
|
||||
/mob/living/carbon/human/proc/transform_set_colour(var/new_skin)
|
||||
|
||||
r_skin = hex2num(copytext(new_skin, 2, 4))
|
||||
g_skin = hex2num(copytext(new_skin, 4, 6))
|
||||
b_skin = hex2num(copytext(new_skin, 6, 8))
|
||||
r_synth = r_skin
|
||||
g_synth = g_skin
|
||||
b_synth = b_skin
|
||||
|
||||
for(var/obj/item/organ/external/E in organs)
|
||||
E.sync_colour_to_human(src)
|
||||
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/carbon/human/proc/transform_select_hair_colors()
|
||||
|
||||
set name = "Select Hair Colors"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 50
|
||||
|
||||
var/new_hair = input("Please select a new hair color.", "Hair Colour") as color
|
||||
if(!new_hair)
|
||||
return
|
||||
transform_set_hair_color(new_hair)
|
||||
var/new_fhair = input("Please select a new facial hair color.", "Facial Hair Color") as color
|
||||
if(!new_fhair)
|
||||
return
|
||||
transform_set_facial_color(new_fhair)
|
||||
|
||||
/mob/living/carbon/human/proc/transform_set_hair_color(var/new_hair)
|
||||
|
||||
change_hair_color(hex2num(copytext(new_hair, 2, 4)), hex2num(copytext(new_hair, 4, 6)), hex2num(copytext(new_hair, 6, 8)))
|
||||
|
||||
/mob/living/carbon/human/proc/transform_set_facial_color(var/new_fhair)
|
||||
|
||||
change_facial_hair_color(hex2num(copytext(new_fhair, 2, 4)), hex2num(copytext(new_fhair, 4, 6)), hex2num(copytext(new_fhair, 6, 8)))
|
||||
|
||||
// Replaces limbs and copies wounds
|
||||
/mob/living/carbon/human/proc/transform_change_species(var/new_species)
|
||||
if(!species)
|
||||
return
|
||||
|
||||
dna.species = new_species
|
||||
|
||||
var/list/limb_exists = list(
|
||||
BP_TORSO = 0,
|
||||
BP_GROIN = 0,
|
||||
BP_HEAD = 0,
|
||||
BP_L_ARM = 0,
|
||||
BP_R_ARM = 0,
|
||||
BP_L_LEG = 0,
|
||||
BP_R_LEG = 0,
|
||||
BP_L_HAND = 0,
|
||||
BP_R_HAND = 0,
|
||||
BP_L_FOOT = 0,
|
||||
BP_R_FOOT = 0
|
||||
)
|
||||
var/list/wounds_by_limb = list(
|
||||
BP_TORSO = new/list(),
|
||||
BP_GROIN = new/list(),
|
||||
BP_HEAD = new/list(),
|
||||
BP_L_ARM = new/list(),
|
||||
BP_R_ARM = new/list(),
|
||||
BP_L_LEG = new/list(),
|
||||
BP_R_LEG = new/list(),
|
||||
BP_L_HAND = new/list(),
|
||||
BP_R_HAND = new/list(),
|
||||
BP_L_FOOT = new/list(),
|
||||
BP_R_FOOT = new/list()
|
||||
)
|
||||
|
||||
// Copy damage values
|
||||
for(var/limb in organs_by_name)
|
||||
var/obj/item/organ/external/O = organs_by_name[limb]
|
||||
limb_exists[O.organ_tag] = 1
|
||||
wounds_by_limb[O.organ_tag] = O.wounds
|
||||
|
||||
species = all_species[new_species]
|
||||
species.create_organs(src)
|
||||
// species.handle_post_spawn(src)
|
||||
|
||||
for(var/limb in organs_by_name)
|
||||
var/obj/item/organ/external/O = organs_by_name[limb]
|
||||
if(limb_exists[O.organ_tag])
|
||||
O.species = all_species[new_species]
|
||||
O.wounds = wounds_by_limb[O.organ_tag]
|
||||
// sync the organ's damage with its wounds
|
||||
O.update_damages()
|
||||
O.owner.updatehealth() //droplimb will call updatehealth() again if it does end up being called
|
||||
else
|
||||
organs.Remove(O)
|
||||
organs_by_name.Remove(O)
|
||||
|
||||
spawn(0)
|
||||
regenerate_icons()
|
||||
/* VOREStation Edit - Our own trait system, sorry.
|
||||
if(species && mind)
|
||||
apply_traits()
|
||||
*/
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/transform_select_eye_colour()
|
||||
|
||||
set name = "Select Eye Color"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 50
|
||||
|
||||
var/current_color = rgb(r_eyes,g_eyes,b_eyes)
|
||||
var/new_eyes = input("Pick a new color for your eyes.","Eye Color", current_color) as null|color
|
||||
if(!new_eyes)
|
||||
return
|
||||
|
||||
transform_set_eye_color(new_eyes)
|
||||
|
||||
/mob/living/carbon/human/proc/transform_set_eye_color(var/new_eyes)
|
||||
|
||||
var/list/new_color_rgb_list = hex2rgb(new_eyes)
|
||||
// First, update mob vars.
|
||||
r_eyes = new_color_rgb_list[1]
|
||||
g_eyes = new_color_rgb_list[2]
|
||||
b_eyes = new_color_rgb_list[3]
|
||||
// Now sync the organ's eye_colour list, if possible
|
||||
var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES]
|
||||
if(istype(eyes))
|
||||
eyes.update_colour()
|
||||
|
||||
update_icons_body()
|
||||
update_eyes()
|
||||
|
||||
/mob/living/carbon/human/proc/transform_select_ears()
|
||||
set name = "Select Ears"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_ear_styles = list("Normal" = null)
|
||||
for(var/path in ear_styles_list)
|
||||
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_ear_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_ear_style = input(src, "Pick some ears!", "Character Preference", ear_style ? ear_style.name : null) as null|anything in pretty_ear_styles
|
||||
if(!new_ear_style)
|
||||
return
|
||||
|
||||
//Set new style
|
||||
ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
|
||||
|
||||
//Allow color picks
|
||||
var/current_pri_color = rgb(r_ears,g_ears,b_ears)
|
||||
|
||||
var/new_pri_color = input("Pick primary ear color:","Ear Color (Pri)", current_pri_color) as null|color
|
||||
if(new_pri_color)
|
||||
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
|
||||
r_ears = new_color_rgb_list[1]
|
||||
g_ears = new_color_rgb_list[2]
|
||||
b_ears = new_color_rgb_list[3]
|
||||
|
||||
//Indented inside positive primary color choice, don't bother if they clicked cancel
|
||||
var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2)
|
||||
|
||||
var/new_sec_color = input("Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color) as null|color
|
||||
if(new_sec_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_ears2 = new_color_rgb_list[1]
|
||||
g_ears2 = new_color_rgb_list[2]
|
||||
b_ears2 = new_color_rgb_list[3]
|
||||
|
||||
update_hair() //Includes Virgo ears
|
||||
|
||||
/mob/living/carbon/human/proc/transform_select_tail()
|
||||
set name = "Select Tail"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_tail_styles = list("Normal" = null)
|
||||
for(var/path in tail_styles_list)
|
||||
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_tail_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_tail_style = input(src, "Pick a tail!", "Character Preference", tail_style ? tail_style.name : null) as null|anything in pretty_tail_styles
|
||||
if(!new_tail_style)
|
||||
return
|
||||
|
||||
//Set new style
|
||||
tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]]
|
||||
|
||||
//Allow color picks
|
||||
var/current_pri_color = rgb(r_tail,g_tail,b_tail)
|
||||
|
||||
var/new_pri_color = input("Pick primary tail color:","Tail Color (Pri)", current_pri_color) as null|color
|
||||
if(new_pri_color)
|
||||
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
|
||||
r_tail = new_color_rgb_list[1]
|
||||
g_tail = new_color_rgb_list[2]
|
||||
b_tail = new_color_rgb_list[3]
|
||||
|
||||
//Indented inside positive primary color choice, don't bother if they clicked cancel
|
||||
var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2)
|
||||
|
||||
var/new_sec_color = input("Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color) as null|color
|
||||
if(new_sec_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_tail2 = new_color_rgb_list[1]
|
||||
g_tail2 = new_color_rgb_list[2]
|
||||
b_tail2 = new_color_rgb_list[3]
|
||||
|
||||
update_tail_showing()
|
||||
|
||||
/mob/living/carbon/human/proc/transform_select_wings()
|
||||
set name = "Select Wings"
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_wing_styles = list("None" = null)
|
||||
for(var/path in wing_styles_list)
|
||||
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_wing_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_wing_style = input(src, "Pick some wings!", "Character Preference", wing_style ? wing_style.name : null) as null|anything in pretty_wing_styles
|
||||
if(!new_wing_style)
|
||||
return
|
||||
|
||||
//Set new style
|
||||
wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]]
|
||||
|
||||
//Allow color picks
|
||||
var/current_color = rgb(r_wing,g_wing,b_wing)
|
||||
|
||||
var/new_color = input("Pick wing color:","Wing Color", current_color) as null|color
|
||||
if(new_color)
|
||||
var/list/new_color_rgb_list = hex2rgb(new_color)
|
||||
r_wing = new_color_rgb_list[1]
|
||||
g_wing = new_color_rgb_list[2]
|
||||
b_wing = new_color_rgb_list[3]
|
||||
|
||||
update_wing_showing()
|
||||
@@ -380,32 +380,33 @@
|
||||
return
|
||||
|
||||
/mob/living/silicon/pai/attack_hand(mob/user as mob)
|
||||
//Chompstation edit
|
||||
if(user.a_intent == I_HELP)
|
||||
visible_message("<span class='notice'>[user.name] [rand("pets","pats")] [src].</span>")
|
||||
else if(user.a_intent == I_GRAB)
|
||||
if(user == src || anchored)
|
||||
return 0
|
||||
for(var/obj/item/weapon/grab/G in src.grabbed_by)
|
||||
if(G.assailant == user)
|
||||
user << "<span class='notice'>You already grabbed [src].</span>"
|
||||
//Chompstation edit
|
||||
switch(user.a_intent)
|
||||
if(I_HELP)
|
||||
visible_message("<span class='notice'>[user.name] [pick("pets","pats")] [src].</span>")
|
||||
if(I_GRAB)
|
||||
if(user == src || anchored)
|
||||
return
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src)
|
||||
if(buckled)
|
||||
user << "<span class='notice'>You cannot grab [src], they're buckled in!</span>"
|
||||
if(!G) //the grab will delete itself in New if affecting is anchored
|
||||
return
|
||||
user.put_in_active_hand(G)
|
||||
G.synch()
|
||||
LAssailant = user
|
||||
for(var/obj/item/weapon/grab/G in src.grabbed_by)
|
||||
if(G.assailant == user)
|
||||
user << "<span class='notice'>You already grabbed [src].</span>"
|
||||
return
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src)
|
||||
if(buckled)
|
||||
user << "<span class='notice'>You cannot grab [src], they're buckled in!</span>"
|
||||
if(!G) //the grab will delete itself in New if affecting is anchored
|
||||
return
|
||||
user.put_in_active_hand(G)
|
||||
G.synch()
|
||||
LAssailant = user
|
||||
user.do_attack_animation(src)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'>[user] has grabbed [src] passively!</span>")
|
||||
|
||||
user.do_attack_animation(src)
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='warning'>[user] has grabbed [src] passively!</span>")
|
||||
//End Chompstation edit
|
||||
else
|
||||
visible_message("<span class='danger'>[user.name] boops [src] on the head.</span>")
|
||||
close_up()
|
||||
else
|
||||
visible_message("<span class='danger'>[user.name] boops [src] on the head.</span>")
|
||||
close_up()
|
||||
//End Chompstation edit
|
||||
|
||||
//I'm not sure how much of this is necessary, but I would rather avoid issues.
|
||||
/mob/living/silicon/pai/proc/close_up()
|
||||
|
||||
@@ -673,6 +673,17 @@
|
||||
max_item_count = 10
|
||||
decompiler = TRUE
|
||||
|
||||
/obj/item/device/dogborg/sleeper/general //generic stomach for borgs
|
||||
name = "Robotic Stomach"
|
||||
desc = "A stretchy stomach for a vore enabled borg, it can hold and digest items and crew."
|
||||
icon_state = "belly-standard"
|
||||
injection_chems = null
|
||||
max_item_count = 10
|
||||
|
||||
/obj/item/device/dogborg/sleeper/medical
|
||||
name = "Borg Mounted Sleeper"
|
||||
desc = "A stretchy stomach for a vore enabled medical borg, it can hold crew for healing or as emergency power."
|
||||
icon_state = "belly-medical"
|
||||
|
||||
/obj/item/device/dogborg/sleeper/compactor/brewer //Boozehound gut.
|
||||
name = "Brew Belly"
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/obj/item/weapon/service_fab
|
||||
name = "\improper Service item disepencer"
|
||||
desc = "A device used to dispence service items."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "rcd"
|
||||
var/obj/product
|
||||
var/mode = 1
|
||||
|
||||
/obj/item/weapon/service_fab/attack_self(mob/user as mob)
|
||||
var/mob/M = usr
|
||||
var/list/options = list()
|
||||
options["Drinking Glass, Pint"] = 1
|
||||
options["Coffee Cup"] = 2
|
||||
options["Paper"] = 3
|
||||
options["Pen"] = 4
|
||||
options["Dice Bag"] = 5
|
||||
options["Cigarette"] = 6
|
||||
var/choice = input(M,"Choose your item!") in options
|
||||
if(src && choice && !M.stat && in_range(M,src))
|
||||
mode = options[choice]
|
||||
M << "You will now dispence [choice]"
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/service_fab/afterattack(atom/A, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
|
||||
if(istype(user,/mob/living/silicon/robot))
|
||||
var/mob/living/silicon/robot/R = user
|
||||
if(R.stat || !R.cell || R.cell.charge <= 0)
|
||||
return
|
||||
// else
|
||||
// if(stored_matter <= 0)
|
||||
// return
|
||||
|
||||
if(!istype(A, /obj/structure/table) && !istype(A, /turf/simulated/floor))
|
||||
return
|
||||
|
||||
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
|
||||
var/used_energy = 30
|
||||
// var/obj/product
|
||||
|
||||
switch(mode)
|
||||
if(1)
|
||||
product = new /obj/item/weapon/reagent_containers/food/drinks/glass2/pint()
|
||||
if(2)
|
||||
product = new /obj/item/weapon/reagent_containers/food/drinks/cup()
|
||||
if(3)
|
||||
product = new /obj/item/weapon/paper()
|
||||
if(4)
|
||||
product = new /obj/item/weapon/pen()
|
||||
if(5)
|
||||
product = new /obj/item/weapon/storage/pill_bottle/dice()
|
||||
if(6)
|
||||
product = new /obj/item/clothing/mask/smokable/cigarette()
|
||||
|
||||
user << "Dispensing [product ? product : "product"]..."
|
||||
product.loc = get_turf(A)
|
||||
|
||||
// if(isrobot(user))
|
||||
var/mob/living/silicon/robot/R = user
|
||||
if(R.cell)
|
||||
R.cell.use(used_energy)
|
||||
@@ -0,0 +1,140 @@
|
||||
/obj/item/weapon/robot_module/robot/servore
|
||||
name = "vore services module"
|
||||
can_buckle = 1
|
||||
sprites = list(
|
||||
"Service BootyBot" = "servoregreen",
|
||||
"BoootyBlue" = "servore"
|
||||
)
|
||||
channels = list("Service" = 1)
|
||||
can_be_pushed = 0
|
||||
|
||||
languages = list(
|
||||
LANGUAGE_SOL_COMMON = 1,
|
||||
LANGUAGE_UNATHI = 1,
|
||||
LANGUAGE_SIIK = 1,
|
||||
LANGUAGE_AKHANI = 1,
|
||||
LANGUAGE_SKRELLIAN = 1,
|
||||
LANGUAGE_SKRELLIANFAR = 0,
|
||||
LANGUAGE_ROOTLOCAL = 0,
|
||||
LANGUAGE_TRADEBAND = 1,
|
||||
LANGUAGE_GUTTER = 0,
|
||||
LANGUAGE_SCHECHI = 1,
|
||||
LANGUAGE_EAL = 1,
|
||||
LANGUAGE_TERMINUS = 1,
|
||||
LANGUAGE_SIGN = 0
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/servore/New(var/mob/living/silicon/robot/R)
|
||||
src.modules += new /obj/item/weapon/gripper/service(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
|
||||
src.modules += new /obj/item/weapon/material/minihoe(src)
|
||||
src.modules += new /obj/item/weapon/material/knife/machete/hatchet(src)
|
||||
src.modules += new /obj/item/device/analyzer/plant_analyzer(src)
|
||||
src.modules += new /obj/item/weapon/storage/bag/plants(src)
|
||||
src.modules += new /obj/item/weapon/robot_harvester(src)
|
||||
src.modules += new /obj/item/weapon/material/knife(src)
|
||||
src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src)
|
||||
src.modules += new /obj/item/device/multitool(src) //to freeze trays
|
||||
src.modules += new /obj/item/device/dogborg/sleeper/general(src)
|
||||
src.modules += new /obj/item/weapon/service_fab(src)
|
||||
|
||||
//var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
|
||||
//M.stored_matter = 30
|
||||
//src.modules += M
|
||||
|
||||
src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src)
|
||||
|
||||
var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src)
|
||||
L.lit = 1
|
||||
src.modules += L
|
||||
|
||||
src.modules += new /obj/item/weapon/tray/robotray(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src)
|
||||
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
|
||||
|
||||
var/datum/reagents/N = new/datum/reagents(50)
|
||||
src.emag.reagents = N
|
||||
N.my_atom = src.emag
|
||||
N.add_reagent("beer2", 50)
|
||||
src.emag.name = "Mickey Finn's Special Brew"
|
||||
|
||||
R.icon = 'icons/mob/robots_ch.dmi'
|
||||
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
|
||||
R.ui_style_vr = TRUE
|
||||
// R.pixel_x = -16
|
||||
// R.old_x = -16
|
||||
// R.default_pixel_x = -16
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
R.resticon = FALSE
|
||||
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
|
||||
..()
|
||||
|
||||
/obj/item/weapon/robot_module/robot/medical/vore
|
||||
name = "crisis robot vore module"
|
||||
sprites = list(
|
||||
"Medical BootyBot" = "medvore"
|
||||
)
|
||||
|
||||
/obj/item/weapon/robot_module/robot/medical/vore/New(var/mob/living/silicon/robot/R)
|
||||
src.modules += new /obj/item/device/healthanalyzer(src)
|
||||
src.modules += new /obj/item/device/reagent_scanner/adv(src)
|
||||
src.modules += new /obj/item/roller_holder(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
|
||||
src.modules += new /obj/item/weapon/gripper/no_use/organ(src)
|
||||
src.modules += new /obj/item/weapon/gripper/medical(src)
|
||||
src.modules += new /obj/item/weapon/shockpaddles/robot(src)
|
||||
src.modules += new /obj/item/device/dogborg/sleeper/medical(src)
|
||||
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
|
||||
src.emag.reagents.add_reagent("pacid", 250)
|
||||
src.emag.name = "Polyacid spray"
|
||||
|
||||
var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000)
|
||||
synths += medicine
|
||||
|
||||
var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src)
|
||||
var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src)
|
||||
var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src)
|
||||
O.uses_charge = 1
|
||||
O.charge_costs = list(1000)
|
||||
O.synths = list(medicine)
|
||||
B.uses_charge = 1
|
||||
B.charge_costs = list(1000)
|
||||
B.synths = list(medicine)
|
||||
S.uses_charge = 1
|
||||
S.charge_costs = list(1000)
|
||||
S.synths = list(medicine)
|
||||
src.modules += O
|
||||
src.modules += B
|
||||
src.modules += S
|
||||
|
||||
R.icon = 'icons/mob/robots_ch.dmi'
|
||||
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
|
||||
R.ui_style_vr = TRUE
|
||||
// R.pixel_x = -16
|
||||
// R.old_x = -16
|
||||
// R.default_pixel_x = -16
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
R.resticon = FALSE
|
||||
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
|
||||
..()
|
||||
|
||||
/obj/item/weapon/robot_module/robot/medical/vore/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules
|
||||
if(S.mode == 2)
|
||||
S.reagents.clear_reagents()
|
||||
S.mode = initial(S.mode)
|
||||
S.desc = initial(S.desc)
|
||||
S.update_icon()
|
||||
|
||||
if(src.emag)
|
||||
var/obj/item/weapon/reagent_containers/spray/PS = src.emag
|
||||
PS.reagents.add_reagent("pacid", 2 * amount)
|
||||
|
||||
..()
|
||||
|
||||
@@ -45,6 +45,8 @@
|
||||
robot_modules["Pupdozer"] = /obj/item/weapon/robot_module/robot/engiedog
|
||||
robot_modules["BoozeHound"] = /obj/item/weapon/robot_module/robot/booze
|
||||
robot_modules["Service-borg"] = /obj/item/weapon/robot_module/robot/servborg
|
||||
robot_modules["Vore Services"] = /obj/item/weapon/robot_module/robot/servore//edit chompers
|
||||
robot_modules["Medivore"] = /obj/item/weapon/robot_module/robot/medical/vore
|
||||
return 1
|
||||
|
||||
//Just add a new proc with the robot_module type if you wish to run some other vore code
|
||||
@@ -509,11 +511,11 @@
|
||||
water.energy = 0
|
||||
R.water_res = water
|
||||
synths += water
|
||||
|
||||
|
||||
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
|
||||
T.water = water
|
||||
src.modules += T
|
||||
|
||||
|
||||
|
||||
src.modules += new /obj/item/weapon/tray/robotray(src)
|
||||
src.modules += new /obj/item/weapon/reagent_containers/borghypo/service/booze(src)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
var/leap_at
|
||||
var/dogborg = FALSE //Dogborg special features (overlays etc.)
|
||||
var/wideborg = FALSE //When the borg simply doesn't use standard 32p size.
|
||||
var/resticon = TRUE //does nothing without dogborg and when false makes it use a similar method to default borgs
|
||||
var/scrubbing = FALSE //Floor cleaning enabled
|
||||
var/datum/matter_synth/water_res = null
|
||||
var/notransform
|
||||
@@ -56,9 +57,12 @@
|
||||
add_overlay("taser")
|
||||
if(lights_on)
|
||||
add_overlay("eyes-[module_sprites[icontype]]-lights")
|
||||
if(resting)
|
||||
if(resting && resticon == FALSE)
|
||||
cut_overlay("eyes-[module_sprites[icontype]]")
|
||||
if(resting && resticon == TRUE)
|
||||
cut_overlays() // Hide that gut for it has no ground sprite yo.
|
||||
icon_state = "[module_sprites[icontype]]-rest"
|
||||
|
||||
else
|
||||
icon_state = "[module_sprites[icontype]]"
|
||||
if(dogborg == TRUE && stat == DEAD)
|
||||
|
||||
@@ -172,9 +172,17 @@
|
||||
var/obj/belly/B = vore_selected
|
||||
B.vore_verb = "chomp up"
|
||||
B.name = "stomach"
|
||||
B.desc = "You're pulled into the tight stomach of the plant. The walls knead weakly around you, coating you in thick, viscous fluids that cling to your body, that soon starts to tingle and burn..."
|
||||
B.desc = "You're pulled into the tight mouth of the plant. The teeth and walls gnash harshly on you!"
|
||||
B.digest_burn = 0
|
||||
B.digest_brute = 12
|
||||
B.digest_brute = 5
|
||||
|
||||
/mob/living/simple_animal/hostile/piranhaplant/spitter/init_vore()
|
||||
..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.vore_verb = "slurped up"
|
||||
B.desc = "You're pulled into the tight mouth of the plant. The tongue mulls you about and squishes you around, coating you in a slurry of digestive fluides that burn hotly and smell foul."
|
||||
B.digest_burn = 5
|
||||
B.digest_brute = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/piranhaplant/pitcher
|
||||
icon_state = "pitcher-plant"
|
||||
@@ -220,6 +228,7 @@
|
||||
/mob/living/simple_animal/hostile/piranhaplant/pitcher/init_vore()
|
||||
..()
|
||||
var/obj/belly/B = vore_selected
|
||||
B.desc = "You're pulled into the tight stomach of the plant. The walls knead weakly around you, coating you in thick, viscous fluids that cling to your body, that soon starts to tingle and burn..."
|
||||
B.digest_burn = 0.5
|
||||
B.digest_brute = 0
|
||||
B.vore_verb = "slurp up"
|
||||
|
||||
@@ -120,15 +120,15 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
icon_state = "baby"
|
||||
intelligence_level = SA_ANIMAL
|
||||
speak_emote = list("churrs")
|
||||
health = 200
|
||||
maxHealth = 200
|
||||
health = 125
|
||||
maxHealth = 125
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 5
|
||||
melee_miss_chance = 0
|
||||
armor = list(
|
||||
"melee" = 50,
|
||||
"bullet" = 30,
|
||||
"laser" = 80,
|
||||
"melee" = 30,
|
||||
"bullet" = 5,
|
||||
"laser" = 60,
|
||||
"energy" = 90,
|
||||
"bomb" = 70,
|
||||
"bio" = 100,
|
||||
@@ -191,11 +191,11 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
health = 250
|
||||
maxHealth = 250
|
||||
melee_damage_lower = 2
|
||||
melee_damage_upper = 5
|
||||
melee_damage_upper = 9
|
||||
melee_miss_chance = 0
|
||||
armor = list(
|
||||
"melee" = 50,
|
||||
"bullet" = 30,
|
||||
"melee" = 30,
|
||||
"bullet" = 10,
|
||||
"laser" = 90,
|
||||
"energy" = 90,
|
||||
"bomb" = 70,
|
||||
@@ -273,10 +273,10 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
melee_miss_chance = 5
|
||||
attacktext = list("rammed")
|
||||
armor = list(
|
||||
"melee" = 60,
|
||||
"bullet" = 45,
|
||||
"melee" = 50,
|
||||
"bullet" = 25,
|
||||
"laser" = 50,
|
||||
"energy" = 70,
|
||||
"energy" = 60,
|
||||
"bomb" = 10,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
@@ -355,8 +355,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
melee_miss_chance = 5
|
||||
attacktext = list("rammed")
|
||||
armor = list(
|
||||
"melee" = 60,
|
||||
"bullet" = 50,
|
||||
"melee" = 55,
|
||||
"bullet" = 25,
|
||||
"laser" = 50,
|
||||
"energy" = 90,
|
||||
"bomb" = 10,
|
||||
@@ -446,9 +446,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
attacktext = list("slashed")
|
||||
armor = list(
|
||||
"melee" = 70,
|
||||
"bullet" = 60,
|
||||
"bullet" = 30,
|
||||
"laser" = 50,
|
||||
"energy" = 70,
|
||||
"energy" = 60,
|
||||
"bomb" = 10,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
@@ -539,9 +539,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
attacktext = list("slashed")
|
||||
armor = list(
|
||||
"melee" = 75,
|
||||
"bullet" = 60,
|
||||
"bullet" = 40,
|
||||
"laser" = 55,
|
||||
"energy" = 90,
|
||||
"energy" = 60,
|
||||
"bomb" = 10,
|
||||
"bio" = 100,
|
||||
"rad" = 100)
|
||||
@@ -633,7 +633,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
attacktext = list("gnashed")
|
||||
armor = list(
|
||||
"melee" = 75,
|
||||
"bullet" = 60,
|
||||
"bullet" = 40,
|
||||
"laser" = 60,
|
||||
"energy" = 90,
|
||||
"bomb" = 10,
|
||||
@@ -698,7 +698,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
vore_pounce_chance = 60 //It's the queen, and it's hungry.
|
||||
vore_default_mode = DM_DIGEST
|
||||
swallowTime = 3 SECONDS
|
||||
vore_escape_chance = 0
|
||||
vore_escape_chance = 0 //You're not climbing out of that neck
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------
|
||||
@@ -772,23 +772,24 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
/mob/living/simple_animal/hostile/metroid/evolution/Life()
|
||||
. = ..()
|
||||
|
||||
if(canEvolve == 1 && nutrition >= evo_limit && (buckled || vore_fullness == 1)) //spit dat crap out if nutrition gets too high!
|
||||
release_vore_contents()
|
||||
prey_excludes.Cut()
|
||||
stop_consumption()
|
||||
if(stat != DEAD)
|
||||
if(canEvolve == 1 && nutrition >= evo_limit && (buckled || vore_fullness == 1)) //spit dat crap out if nutrition gets too high!
|
||||
release_vore_contents()
|
||||
prey_excludes.Cut()
|
||||
stop_consumption()
|
||||
|
||||
if(canEvolve == 1 && nutrition >= evo_point && !buckled && vore_fullness == 0 && !victim)
|
||||
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
|
||||
paralysis = 7998
|
||||
sleep(50)
|
||||
paralysis = 0
|
||||
expand_troid()
|
||||
return
|
||||
if(stance == 7) //Necessary to fix a bug where if their vore prey or latching victim is laying down when they evolve, they get stuck in stance 7 and do nothing.
|
||||
stance = 4
|
||||
return
|
||||
else
|
||||
handle_idle()
|
||||
if(canEvolve == 1 && nutrition >= evo_point && !buckled && vore_fullness == 0 && !victim)
|
||||
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
|
||||
paralysis = 7998
|
||||
sleep(50)
|
||||
paralysis = 0
|
||||
expand_troid()
|
||||
return
|
||||
if(stance == 7) //Necessary to fix a bug where if their vore prey or latching victim is laying down when they evolve, they get stuck in stance 7 and do nothing.
|
||||
stance = 4
|
||||
return
|
||||
else
|
||||
handle_idle()
|
||||
|
||||
/mob/living/simple_animal/hostile/metroid/proc/expand_troid()
|
||||
new next(get_turf(src))
|
||||
@@ -811,13 +812,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
|
||||
|
||||
/mob/living/simple_animal/hostile/metroid/evolution/proc/handle_idle()
|
||||
//Do we have a vent ? Good, let's take a look
|
||||
|
||||
for(entry_vent in view(1, src))
|
||||
if(!victim && !buckled && vore_fullness == 0 && prob(90)) //10 % chance to consider a vent, to try and avoid constant vent switching
|
||||
if(prob(1)) //1% chance to consider a vent, to try and avoid constant vent switching
|
||||
return
|
||||
visible_message("<span class='danger'>\The [src] starts trying to slide itself into the vent!</span>")
|
||||
sleep(50) //Let's stop the metroid for five seconds to do its parking job
|
||||
..()
|
||||
if(!victim && !buckled && vore_fullness == 0 && entry_vent.network && entry_vent.network.normal_members.len)
|
||||
if(entry_vent.network && entry_vent.network.normal_members.len)
|
||||
var/list/vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.network.normal_members)
|
||||
vents.Add(temp_vent)
|
||||
|
||||
@@ -13,30 +13,30 @@
|
||||
///mob/living/simple_animal/shadekin/red
|
||||
//then we simply add our shadekins name at the end (unless its used already)
|
||||
/mob/living/simple_animal/shadekin/red/proto
|
||||
name ="Proto"
|
||||
name ="Proto"
|
||||
//This here will be our shadekins name
|
||||
|
||||
desc = "An invisible entity not meant for use."
|
||||
|
||||
desc = "An invisible entity not meant for use."
|
||||
//here goes a lil tidbit people can see when examining the shadekin. Multiple lines works just as on the vore part
|
||||
|
||||
icon_state = "proto"
|
||||
|
||||
icon_state = "proto"
|
||||
//this will most likely also be your shadekins name, it corresponds to the name you gave the tail and body state in the DMIs
|
||||
//so if you named the body state "proto" and "proto-1" then icon_state should be called "proto"
|
||||
|
||||
|
||||
vore_stomach_flavor = "You stared into the void,\
|
||||
the void decided you look tasty,\
|
||||
now you are in the void, pretty wet"
|
||||
//This is what people see when they drop into your gut! the backslashes at the end of the sentence indicate the next text will be on its own line!
|
||||
|
||||
|
||||
player_msg = "Proto is you, Proto shouldn't exist"
|
||||
|
||||
|
||||
player_msg = "Proto is you, Proto shouldn't exist"
|
||||
//This message pops up when you are put into your shadekin
|
||||
//I recommend you use it as a way to remind yourself of how you want to act generally as your shadekin.
|
||||
|
||||
|
||||
//Step 3; PR
|
||||
// Assuming you already have a Fork of chompstation, make sure you got your files in order
|
||||
// and then simply make a new pull request to our github.
|
||||
|
||||
|
||||
//Now once you pushed the new DMIs with your added sprites to our github.
|
||||
//And you finished writing this code section for your shadekin and pushed that too. You are done.
|
||||
//If this is your first time I recommend getting someone to look over your work.
|
||||
@@ -407,3 +407,15 @@
|
||||
The gut seemed somewhat inviting with the warmth and softness, yet there was an ominous feeling to it with all the noises it made.\
|
||||
You'll probably be safe in here. Probably."
|
||||
player_msg = "You are Anno, you are energetic and playful"
|
||||
|
||||
/mob/living/simple_animal/shadekin/blue/roti
|
||||
name ="Roti"
|
||||
desc = "Roti is a shadekin with blue eyes, is chubby since he has eaten others before hand. He enjoys chocolate, the taste of it, the smell of it, he just wants anything sweet and chocolately to be in his belly. So be careful around him this is also a way to summon him by laying around chocolate and calling him out."
|
||||
icon_state = "roti"
|
||||
eye_desc = "blue eyes"
|
||||
vore_stomach_flavor = "You stare into Roti's maw as he moves it towards your head, putting it in and tasting your sweet delicious chocolately flavor. \
|
||||
Wet saliva covers your head as he pushes you inward, gulping down your head and shoulders into his pulsating throat. It pulses and eases you downward towards your destination \
|
||||
cramming your torso into his maw and taking wet SCHLURP, GLUK, to get it down and up to your waist. Roti continues to taste you all over wanting that succulent flavor \
|
||||
to himself. Another loud wet swallow and down goes your waist into his hungry maw, lifting up the legs high into the sky while allowing gravity and his gulps \
|
||||
to send you packing away into his chubby gut that now expands to fit you inside of the wet chamber. At least you were safe for now that is."
|
||||
player_msg = "You are Roti, a curious shadekin that wishes to learn from the station and eventually speak with them."
|
||||
@@ -270,6 +270,12 @@
|
||||
var/passthrough = (removed - (removed/pass_mod)) //Some may be nullified during consumption, between one third and one fifth.
|
||||
affect_blood(M, alien, passthrough)
|
||||
|
||||
/datum/reagent/sodiumchloride/overdose(var/mob/living/carbon/M, var/alien, var/removed) // This is for you, Solus. -Erik
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
|
||||
M/human.losebreath = 10
|
||||
|
||||
/datum/reagent/blackpepper
|
||||
name = "Black Pepper"
|
||||
id = "blackpepper"
|
||||
|
||||
@@ -188,7 +188,54 @@
|
||||
M.adjustBruteLoss(1)
|
||||
M.adjustToxLoss(1)
|
||||
|
||||
/datum/reagent/change_drug //base chemical
|
||||
name = "Elixer of Change" //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
|
||||
id = "change_drug_male" //unique ID for each varient
|
||||
taste_description = "old spice odor blocker body wash"
|
||||
reagent_state = LIQUID
|
||||
color = "#428AFF"
|
||||
gender_change = "male"
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/change_drug/female
|
||||
id = "change_drug_female"
|
||||
taste_description = "spiced honey"
|
||||
reagent_state = LIQUID
|
||||
color = "#FFA0FA"
|
||||
gender_change = "female"
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/change_drug/intersex
|
||||
id = "change_drug_intersex"
|
||||
taste_description = "something salty and sweet"
|
||||
reagent_state = LIQUID
|
||||
color = "#CB9EFF"
|
||||
gender_change = "herm"
|
||||
scannable = 1
|
||||
|
||||
/datum/reagent/change_drug/affect_blood(var/mob/living/carbon/human/M, var/alien, var/removed) //we need to process the change
|
||||
if(alien == IS_DIONA) //doesn't work on multiple creature hiveminds
|
||||
return
|
||||
if(M.identifying_gender == gender_change) //don't bug them if they're already the same gender
|
||||
return
|
||||
if(M.gender_change_cooldown == 1) //if already done, don't bug them
|
||||
return
|
||||
else
|
||||
M.gender_change_cooldown = 1 //set not to bug them because the chem is activating
|
||||
M << "<span class='notice'>You lose focus as warmth spreads throughout your chest and abdomen.</span>"
|
||||
spawn(300) //wait 30 seconds, growth takes time yo
|
||||
M.gender_change_cooldown = 0 //allow it to bug them again now that we've waited
|
||||
if (alert(M,"This chemical will change your gender, proceed?", "Warning", "Yes", "No") == "Yes") //check if they want this to happen for pref sake
|
||||
M.change_gender_identity(gender_change)
|
||||
M << "<span class='warning'>You feel like a new person</span>" //success
|
||||
////////////////////////////////////////////////
|
||||
/////////DRINKS////////////////////////////////
|
||||
//////////////////////////////////////////////
|
||||
|
||||
@@ -59,4 +59,25 @@
|
||||
id = "matcha_latte"
|
||||
result = "matcha_latte"
|
||||
required_reagents = list ("matchapowder" = 1, "milk" = 5)
|
||||
result_amount = 5
|
||||
result_amount = 5
|
||||
|
||||
/datum/chemical_reaction/change_drug/male
|
||||
name = "Elixer of Change"
|
||||
id = "change_drug_male"
|
||||
result = "change_drug_male"
|
||||
required_reagents = list("blood" = 1, "mutagen" = 1, "iron" = 1)
|
||||
result_amount = 1
|
||||
|
||||
/datum/chemical_reaction/change_drug/female
|
||||
name = "Elixer of Change"
|
||||
id = "change_drug_female"
|
||||
result = "change_drug_female"
|
||||
required_reagents = list("blood" = 1, "mutagen" = 1, "sugar" = 1)
|
||||
result_amount = 1
|
||||
|
||||
/datum/chemical_reaction/change_drug/intersex
|
||||
name = "Elixer of Change"
|
||||
id = "change_drug_intersex"
|
||||
result = "change_drug_intersex"
|
||||
required_reagents = list("change_drug_male" = 1, "change_drug_female" = 1)
|
||||
result_amount = 1
|
||||
@@ -386,3 +386,15 @@
|
||||
/obj/structure/reagent_dispensers/acid/New()
|
||||
..()
|
||||
reagents.add_reagent("sacid", 1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/space_cleaner
|
||||
name = "Space Cleaner Dispenser"
|
||||
desc = "A dispenser of space cleaner, every janitor's dream!"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "virusfoodtank"
|
||||
amount_per_transfer_from_this = 60
|
||||
anchored = 1
|
||||
|
||||
/obj/structure/reagent_dispensers/space_cleaner/New()
|
||||
..()
|
||||
reagents.add_reagent("cleaner", 3000)
|
||||
|
||||
Reference in New Issue
Block a user