Merge branch 'master' into TRASH

This commit is contained in:
kcin2001
2019-09-19 14:01:55 -07:00
committed by GitHub
40 changed files with 1251 additions and 324 deletions
@@ -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
+4 -3
View File
@@ -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."
+13 -17
View File
@@ -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>")
+2
View File
@@ -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
@@ -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()
+25 -24
View File
@@ -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////////////////////////////////
//////////////////////////////////////////////
+22 -1
View File
@@ -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)