Merge branch 'master' of https://github.com/CHOMPstation/CHOMPstation into shadekin

# Conflicts:
#	code/modules/mob/living/simple_animal/vore/shadekin/types.dm
#	icons/mob/vore_shadekin.dmi
#	icons/mob/vore_shadekin64.dmi
This commit is contained in:
kcin2001
2019-10-06 00:30:58 -07:00
72 changed files with 1891 additions and 602 deletions
@@ -30,7 +30,8 @@
H.drop_from_inventory(W)
//teleport person to cell
H.loc = pick(prisonwarp)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(H), slot_w_uniform)
//CHOMPStation edit TFF 22/9/19 - refactor of prison jumpsuit
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
else
//teleport security person
+2 -1
View File
@@ -1011,7 +1011,8 @@
M.loc = prison_cell
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/prisoner = M
prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform)
//CHOMPStation edit TFF 22/9/19 - refactor of prison jumpsuit
prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(prisoner), slot_w_uniform)
prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes)
M << "<font color='red'>You have been sent to the prison station!</font>"
+2 -1
View File
@@ -35,7 +35,8 @@
M.loc = pick(prisonwarp)
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/prisoner = M
prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform)
//CHOMPStation edit TFF 22/9/19 - refactor of prison jumpsuit
prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(prisoner), slot_w_uniform)
prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes)
spawn(50)
M << "<font color='red'>You have been sent to the prison station!</font>"
@@ -178,7 +178,7 @@
/datum/gear/accessory/webbing
display_name = "webbing, simple"
path = /obj/item/clothing/accessory/storage/webbing
cost = 2
// cost = 2 //CHOMPStation Removal TFF 26/9/19 - Down to 1 point. No discernable reason for requiring two points instead.
/datum/gear/accessory/chaps
display_name = "chaps, brown"
@@ -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
+36 -1
View File
@@ -214,7 +214,9 @@ datum/preferences
dat += "<a href='?src=\ref[src];load=1'>Load slot</a> - "
dat += "<a href='?src=\ref[src];save=1'>Save slot</a> - "
dat += "<a href='?src=\ref[src];reload=1'>Reload slot</a> - "
dat += "<a href='?src=\ref[src];resetslot=1'>Reset slot</a>"
dat += "<a href='?src=\ref[src];resetslot=1'>Reset slot</a> - "
//CHOMPStation Edit - TFF 20/9/19 - Port Polaris slot Copying for Char Setup
dat += "<a href='?src=\ref[src];copy=1'>Copy slot</a>"
else
dat += "Please create an account to save your preferences."
@@ -270,6 +272,15 @@ datum/preferences
return 0
load_character(SAVE_RESET)
sanitize_preferences()
//CHOMPStation Edit - TFF 20/9/19 - Port Polaris slot Copying for Char Setup
else if(href_list["copy"])
if(!IsGuestKey(usr.key))
open_copy_dialog(usr)
return 1
else if(href_list["overwrite"])
overwrite_character(text2num(href_list["overwrite"]))
sanitize_preferences()
close_load_dialog(usr)
else
return 0
@@ -325,3 +336,27 @@ datum/preferences
/datum/preferences/proc/close_load_dialog(mob/user)
//user << browse(null, "window=saves")
panel.close()
//CHOMPStation Edit - TFF 20/9/19 - Port Polaris slot Copying for Char Setup
/datum/preferences/proc/open_copy_dialog(mob/user)
var/dat = "<body>"
dat += "<tt><center>"
var/savefile/S = new /savefile(path)
if(S)
dat += "<b>Select a character slot to overwrite</b><br>"
dat += "<b>You will then need to save to confirm</b><hr>"
var/name
for(var/i=1, i<= config.character_slots, i++)
S.cd = "/character[i]"
S["real_name"] >> name
if(!name) name = "Character[i]"
if(i==default_slot)
name = "<b>[name]</b>"
dat += "<a href='?src=\ref[src];overwrite=[i]'>[name]</a><br>"
dat += "<hr>"
dat += "</center></tt>"
panel = new(user, "Character Slots", "Character Slots", 300, 390, src)
panel.set_content(dat)
panel.open()
@@ -93,6 +93,22 @@
player_setup.save_character(S)
return 1
//CHOMPStation Edit - TFF 20/9/19 - Port Polaris slot Copying for Char Setup
/datum/preferences/proc/overwrite_character(slot)
if(!path) return 0
if(!fexists(path)) return 0
var/savefile/S = new /savefile(path)
if(!S) return 0
if(!slot) slot = default_slot
if(slot != SAVE_RESET)
slot = sanitize_integer(slot, 1, config.character_slots, initial(default_slot))
if(slot != default_slot)
default_slot = slot
S["default_slot"] << slot
else
S["default_slot"] << default_slot
return 1
/datum/preferences/proc/sanitize_preferences()
player_setup.sanitize_setup()
+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()
@@ -149,10 +149,9 @@
//Chief Engineer's rig. This is sort of a halfway point between the old hardsuits (voidsuits) and the rig class.
/obj/item/weapon/rig/ce
name = "advanced voidsuit control module"
suit_type = "advanced voidsuit"
desc = "An advanced voidsuit that protects against hazardous, low pressure environments. Shines with a high polish."
name = "advanced hardsuit control module"
suit_type = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
icon_state = "ce_rig"
armor = list(melee = 40, bullet = 10, laser = 30,energy = 25, bomb = 40, bio = 100, rad = 100)
slowdown = 0
@@ -334,13 +333,14 @@
/obj/item/weapon/storage/backpack,
)
req_access = list()
req_access = list(access_hos)
req_one_access = list()
/obj/item/weapon/rig/pursuit/equipped
initial_modules = list(
/obj/item/rig_module/maneuvering_jets,
/obj/item/rig_module/vision/sechud,
/obj/item/rig_module/sprinter/pursuit,
/obj/item/rig_module/grenade_launcher/nerfed,
@@ -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."
+7 -2
View File
@@ -30,13 +30,18 @@
icon_state = "grey"
rolled_sleeves = 0
//TFF 21/9/19 - add a different icon_state to both jumpsuits, orange and prison. Refactors orange and prison jumpsuit slightly.
/obj/item/clothing/under/color/orange
name = "orange jumpsuit"
desc = "It's standardized prisoner-wear. Its suit sensors are permanently set to the \"Tracking\" position."
icon_state = "orange"
rolled_sleeves = 0
/obj/item/clothing/under/color/prison
name = "prison jumpsuit"
desc = "It's standardized prisoner-wear. Its suit sensors are permanently set to the \"Tracking\" position."
icon_state = "prison"
has_sensor = 2
sensor_mode = 3
rolled_sleeves = 0
/obj/item/clothing/under/color/pink
name = "pink jumpsuit"
+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))
+16 -3
View File
@@ -430,9 +430,22 @@
if(additional_chems)
var/list/banned_chems = list(
var/list/banned_chems = list( //expanding this list on request - Skits
"adminordrazine",
"nutriment"
"nutriment",
"spideregg",
"bloodburn",
"eden_snake",
"aphrodisiac",
"change_drug",
"change_drug_male",
"change_drug_female",
"change_drug_intersex",
"macrocillin",
"microcillin",
"normalcillin",
"fakesynxchem",
"clownsynxchem"
)
for(var/x=1;x<=additional_chems;x++)
@@ -565,7 +578,7 @@
banned_chems += new_chem
chems[new_chem] = list(rand(1,10),rand(10,20))
source_turf.visible_message("<span class='notice'>\The [display_name] produce seems to be different!</span>")
if(7)
if(get_trait(TRAIT_YIELD) != -1)
set_trait(TRAIT_YIELD, get_trait(TRAIT_YIELD)+(rand(-2,2)*degree),10,0)
@@ -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)
@@ -5,7 +5,9 @@
icon_state = "goose"
icon_living = "goose"
icon_dead = "goose_dead"
has_hands = 1
faction = "geese"
intelligence_level = SA_ANIMAL
@@ -50,6 +52,29 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/honking = 0
/mob/living/simple_animal/hostile/goose/New()
..()
if (prob(10))
name = "Untitled Goose"
melee_damage_lower = 0
melee_damage_upper = 1
hostile = 0
retaliate = 1
cooperative = 1
maxHealth = 50
health = 50
honk()
honking = 1
humanoid_hands = 1
new /mob/living/simple_animal/hostile/goose(loc)
new /mob/living/simple_animal/hostile/goose(loc)
/mob/living/simple_animal/hostile/goose/Life()
..()
if(honking && prob(1))
honk()
/mob/living/simple_animal/hostile/goose/set_target()
. = ..()
@@ -58,3 +83,22 @@
/mob/living/simple_animal/hostile/goose/Process_Spacemove(var/check_drift = 0)
return 1 // VOREStation Edit No drifting in space!
/mob/living/simple_animal/hostile/goose/proc/honk()
playsound(loc, 'sound/effects/honk.ogg', 50, 1) //playceholder, will be actual honk later
/mob/living/simple_animal/hostile/goose/DoPunch(var/atom/A)
. = ..()
if(.) // If we succeeded in hitting.
if(isliving(A))
var/mob/living/L = A
if(prob(2) && honking)
L.drop_from_inventory(l_hand)
L.drop_from_inventory(r_hand)
/mob/living/simple_animal/hostile/goose/tooluser
name="goose with"
/mob/living/simple_animal/hostile/goose/tooluser/knife
name="goose with knife"
@@ -1,4 +1,5 @@
/mob/living/simple_animal/retaliate/synx
//on inteligence https://synx.fandom.com/wiki/Behavior/Intelligence //keeping this here for player controlled synxes.
name = "Synx"
desc = "A cold blooded, genderless, parasitic eel from the more distant and stranger areas of the cosmos. Plain, white, perpetually grinning and possessing a hunger as enthusiastic and endless as humanity's sense of exploration."
tt_desc = "synxus pergulus"
@@ -68,6 +69,18 @@
vore_icons = 0 //no vore icons
swallowTime = 6 SECONDS //Enter the eel you nerd
//Shouldn't be affected by lack of atmos, it's a space eel.
min_oxy = 0
max_oxy = 0 //Maybe add a max
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0 //Maybe add a max
min_n2 = 0
max_n2 = 0 //Maybe add a max
minbodytemp = 0
// TODO: Set a max temperature of about 20-30 above room temperatures. Synx don't like the heat.
/mob/living/simple_animal/retaliate/synx/init_vore()
..()
var/obj/belly/B = vore_selected
@@ -96,17 +109,29 @@
"The synx lets out an audible belch, the last of your air going with it, and with a few audible crunches from the outside, the stomach claims you as food for the parasite."
)
//Shouldn't be affected by lack of atmos, it's a space eel.
min_oxy = 0
max_oxy = 0 //Maybe add a max
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0 //Maybe add a max
min_n2 = 0
max_n2 = 0 //Maybe add a max
minbodytemp = 0
// TODO: Set a max temperature of about 20-30 above room temperatures. Synx don't like the heat.
/mob/living/simple_animal/retaliate/synx/pet/asteri/init_vore()
..()
var/obj/belly/B = vore_selected
B.desc = "The synx eagerly swallows you, taking you from its gullet into its long, serpentine stomach. The internals around you greedily press into your from all sides, keeping you coated in a slick coat of numbing fluids..."
B.digest_burn = 1
B.digest_brute = 1
B.emote_lists[DM_HOLD] = list(
"Your taut prison presses and pads into your body, the synx squeezing around you almost constrictingly tight while the rolling pulses of muscle around you keep your squirms well-contained.",
"You can feel parts of you sink and press into the squishy stomach walls as the synx's gut seems to relax, the wet ambience of its stomach muffling the parasite's various heartbeats.",
"You can hear the synx teasingly mimic the sounds you've made while it's eaten you, the stomach walls practically massaging more of numbing fluid into you as its innards do their best to tire you out.",
)
B.emote_lists[DM_DIGEST] = list(
"The stomach gives a crushing squeeze around your frame, its body restraining your movements and pressing digestive fluids deeper into you with overwhelming pressure from all sides..",
"The synx's insides greedily press into you all over, kneading around your body and softening you up for the slurry of numbing acid that's pooled around your melting frame.",
"You can hear a cacophony of wet churns and gurgles from the synx's body as it works on breaking you down, the parasite eagerly awaiting your final moments.",
"The tight, fleshy tunnel constricts around you, making it even harder to breathe the already thin air as the digestive cocktail around you wears you out.",
)
B.digest_messages_prey = list(
"You finally give in to the constricting pressure, softened up enough for the acids around you to turn your entire being into a gooey slop to be pumped through its body.",
"Slipping past the point of saving, your body gives out on you as the stomach walls grind your goopy remains into a chunky sludge, leaving behind only a few acid-soaked bones for it to stash in the vents.",
"The constant fatal massage pulls you under, your conciousness fading away as you're drawn into a numb, permanent sleep. The body you leave behind is put to good use as a few extra pounds on the synx's frame, its now-wider hips making it just a little harder to squeeze through the vents it's so fond of.",
"The synx's body gleefully takes what's left of your life, Asteri's usually-repressed sadism overwhelmed with a sinister satisfaction in snuffing you out as your liquefied remains gush into a bit more heft on the parasite's emaciated frame.",
)
/mob/living/simple_animal/retaliate/synx/New()
..()
@@ -463,6 +488,66 @@ mob/living/simple_animal/synx/PunchTarget()
vore_bump_chance = 2 //lowered bump chance
vore_escape_chance = 5 //Multivore allows for people to shove eachother out so lower normal escape chance.
/mob/living/simple_animal/retaliate/synx/pet/greed/synth
/*
▓███▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓███▓
▓▓ ▓▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓█ ▓▓ ▓▓▓█
▓ ▓▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓ ▓▓▓▓
▓ █▓▓▓ █▓▓ █▓▓ █▓▓ █▓▓ █▓▓▓
▓ █▓▓▓▓█ █▓▓ ▓█ █▓▓ ▓█ █▓▓█▓█ █▓▓▓ █▓▓▓
▓ █▓▓▓ ▓█▓ █▓█▓█ █▓█▓█ ▓▓█ ▓█ █▓▓▓
▓█ █▓▓▓ ▓▓▓ ▓▓▓ ▓▓ █▓▓▓
▓▓ █▓▓ ▓ ▓ ▓ █▓▓▓
▓ █▓▓ ▓█ █▓▓
▓ ▓▓▓ ▓▓ █▓▓
█\ ▓▓ ▓▓ ▓█ ▓ █▓▓
▓█\ ▓█ ▓█▓ ▓▓▓ █▓ █▓▓
▓▓▓█ ▓ ▓▓▓▓ ▓ ▓▓ ▓ █▓▓
▓█▓ ▓▓█▓▓ ▓ ▓▓ ▓▓▓
▓▓ █▓▓█ █▓ █▓▓
▓▓ ▓▓▓ ▓▓ █▓▓
▓ ▓▓▓ ▓ █▓▓
▓▓ █▓▓█ █▓ █▓▓▓
▓ █▓▓▓ ▓▓█ █▓█ ▓▓ █▓▓▓
▓ █▓▓▓▓▓ ▓▓█ ▓▓ ▓▓█▓ █▓▓▓
▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
▓ █▓▓▓ ▓▓▓ ▓▓▓ █▓▓▓
▓█▓██▓▓▓█▓█▓█▓▓▓█▓█▓█▓▓▓█▓█▓██▓▓▓
*/
icon_state = "synx_C_living"
icon_living = "synx_C_living"
icon_dead = "synx_C_dead"
hostile = 1
name = "SYN-KinC"
desc = "A robotic recreation of a an Alien parasite. The metal plates seem quite thick."
humanoid_hands = 1
health = 200 //Metally
player_msg = "All systems nominal."
/////////////////////ARMOR
armor = list(
"melee" = 50,
"bullet" = 50,
"laser" = -50,
"energy" = -50,
"bomb" = 50,
"bio" = 100,
"rad" = 100)
////////////////////////////MED INJECTOR
poison_type = "oxycodone" //OD effects, eye_blurry | Confuse + for slimes | stuttering
poison_chance = 77 //high but not guranteed.
poison_per_bite = 9 //OD for oxyc is 20
//////////////////////////////////////////////FACTION
faction = "SYN"
New()
..()
name = "SYN-KinC-([rand(100,999)])"
/mob/living/simple_animal/retaliate/synx/pet/greed/synth/goodboy
hostile = 0
faction = "neutral"
/mob/living/simple_animal/retaliate/synx/pet/diablo
//var/diablo_LIVING = "synx_diablo_living"
//var/diablo_DEAD = "synx_diablo_dead"
@@ -475,16 +560,24 @@ mob/living/simple_animal/synx/PunchTarget()
//Vore Section
vore_capacity = 2
/mob/living/simple_animal/retaliate/synx/pet/diablo/sicsempertyrannis
name = "grins"
desc = "A cold blooded, genderless, parasitic eel from the more distant and stranger areas of the cosmos. grey, perpetually grinning and possessing a hunger as enthusiastic and endless as humanity's sense of exploration.. This one has a small shock collar on it that reads 'grins'."
icon_state = "synx_diablo_living"
icon_living = "synx_diablo_living"
icon_dead = "synx_diablo_dead"
speak = list( )
/mob/living/simple_animal/retaliate/synx/pet/asteri
name = "Asteri"
desc = "A cold blooded, genderless, parasitic eel from the more distant and stranger areas of the cosmos. Bleak white, perpetually grinning and possessing a hunger as enthusiastic and endless as humanity's sense of exploration.. This one has distinctive markings over its face forming the shape of a star, and its back holds a sizeable scar leading up to a small implanted device just above its waist, the name 'Asteri' scribed across the metal."
//icon= //icon= would just set what DMI we are using, we already have our special one set.
icon_state = "synx_asteri_living"
icon_living = "synx_asteri_living"
icon_dead = "synx_asteri_dead"
speak = list("Who is there?")//preset unique words Asteri remembers, to be defined more
player_msg = "SCREAMING NOISES."
health = 100//Slightly lower health due to being damaged permanently.
speak_chance = 5
//Vore Section
vore_icons = SA_ICON_LIVING
vore_capacity = 2
vore_digest_chance = 50
vore_pounce_chance = 40
vore_bump_chance = 2
vore_escape_chance = 5
/mob/living/simple_animal/retaliate/synx/pet/clown
hostile = 1
@@ -548,9 +641,9 @@ mob/living/simple_animal/synx/PunchTarget()
/obj/random/mob/synx/item_to_spawn()
if(Holiday == "April Fool's Day") //WE WISH YOU A MERRY CLOWNMAS
return /mob/living/simple_animal/retaliate/synx/pet/clown
else return pick(prob(50);/mob/living/simple_animal/retaliate/synx/pet/greed,
prob(50);/mob/living/simple_animal/retaliate/synx/pet/diablo,
prob(50);/mob/living/simple_animal/retaliate/synx/pet/holo,)
else return pick(prob(70);/mob/living/simple_animal/retaliate/synx/pet/greed,
prob(50);/mob/living/simple_animal/retaliate/synx/pet/asteri,
prob(20);/mob/living/simple_animal/retaliate/synx/pet/holo,)
////////////////////////////////////////////////////////////////////////////
//////////////////////////NOT A SYNX///////but looks kinda like one/////////
@@ -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"
@@ -87,6 +87,9 @@
if(vore_capacity != 0 && (vore_fullness >= vore_capacity)) // We're too full to fit them
ai_log("vr/wont eat [M] because I am too full", 3)
return 0
if(!M.isEdible)//Don't eat mobs that can't be eaten.
ai_log("vr/wont eat [M] because they aren't edible", 3)
return 0
return 1
/mob/living/simple_animal/PunchTarget()
@@ -46,7 +46,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
speak_chance = 2
emote_hear = list("makes a wooshing sound")
emote_see = list("SKREE's")
emote_see = list("SKREEs")
meat_type = /obj/item/toy/figure/samus
@@ -57,6 +57,33 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
var/evo_limit = 0
var/next = null
/mob/living/simple_animal/hostile/metroid/init_vore() //graciously ~stolen~ inspired from the Synx code
..()
var/obj/belly/B = vore_selected
B.vore_verb = "swallow"
B.name = "membrane"
B.desc = "The metroid positions itself above you and swoops down, lazily enveloping you through its tight mouth and sending you straight to its bulbous membrane for all to see."
B.emote_lists[DM_HOLD] = list(
"The metroid's cortex tentacles wriggle over you, violating and teasing you as they sopped you in viscous slime.",
"The cortex you are forced against pulses with life, gently squeezing you between it and the stretchy membrane around you.",
"You press your face against the transparent membrane, watching how the world distorts as it stretches over your eyes.",
"The air around you is so thick. You struggle to breathe occasionally, choking on the heat and moisture.",
"You struggle a bit, making the membrane swell out."
)
B.emote_lists[DM_DIGEST] = list(
"The cortex tentacles are pulsating like lines of power streaking away from you as it drains you. Waves of sleepiness wash over you as the areas most closest to the tentacles are drained of energy.",
"The air feels a tinge incendiary as the cortex you rest on heats up, fueled by your own body as the metroid draws your strenght away from you.",
"As you grow weaker, your movements against the membrane grow weaker as well, making you feel as if the membrane is closing around you, wrapping and squeezing you, draining you for all you are worth.",
"You feel faint as the tentacles wrapped around you sap you of your strength, seemingly eager to drain and claim you for food."
)
B.digest_messages_prey = list(
"You can't stay awake anymore, the clear world around you going fuzzy until you can see it no more.",
"The tinge of the air grows to a crescendo and then fades away, just as the rest of your body fizzles into energy for the metroid.",
"The tentacles squeeze you one last time as the last of your energy is sapped and your body is claimed as food for the metroid.",
"The metroid swells as it absorbs the rest of your life force and nutrients into its body, making it stronger and even hungry for more."
)
//Stuff for if a person is playing as a metroid.
show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
ai_inactive = 0 // Set to 1 to turn off most AI actions
@@ -82,6 +109,36 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
playsound(src, 'sound/effects/metroiddeath.ogg', 50, 1)
..()
/mob/living/simple_animal/hostile/metroid/pet //Security's pet
name = "Jellybrig"
desc = "This one scree's happily at you."
hostile = 0
retaliate = 1 //Just making sure. Hostile and Retaliate vars are literally the only difference between a hostile and a retaliate mob.
faction = "neutral"
maxHealth = 400
health = 400
melee_damage_lower = 2
melee_damage_upper = 9
move_to_delay = 6
harm_intent_damage = 1
armor = list(
"melee" = 50,
"bullet" = -90,
"laser" = 0,
"energy" = -50,
"bomb" = 70,
"bio" = 100,
"rad" = 100)
vore_active = 1
vore_bump_chance = 0
vore_capacity = 1
vore_icons = SA_ICON_LIVING
vore_pounce_chance = 80 //Don't punch or grab this guy. He will grab you instead!
swallowTime = 1 SECONDS //Hungry little bastards.
vore_default_mode = DM_HOLD
vore_digest_chance = 1 // Chance to switch to digest mode if resisted
vore_absorb_chance = 0
vore_escape_chance = 10
/mob/living/simple_animal/hostile/metroid/mine
@@ -126,10 +183,10 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_damage_upper = 5
melee_miss_chance = 0
armor = list(
"melee" = 50,
"bullet" = 30,
"laser" = 80,
"energy" = 90,
"melee" = 20,
"bullet" = -60,
"laser" = 60,
"energy" = 10,
"bomb" = 70,
"bio" = 100,
"rad" = 100)
@@ -138,7 +195,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
move_to_delay = 3
//Metroids aren't affected by most atmospheres except cold.
minbodytemp = T0C-30
minbodytemp = T0C-40
cold_damage_per_tick = 100
min_oxy = 0
max_oxy = 0
@@ -191,13 +248,13 @@ 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" = 20,
"bullet" = -50,
"laser" = 90,
"energy" = 90,
"energy" = 10,
"bomb" = 70,
"bio" = 100,
"rad" = 100)
@@ -206,7 +263,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
move_to_delay = 3
//Metroids aren't affected by most atmospheres except cold.
minbodytemp = T0C-30
minbodytemp = T0C-40
cold_damage_per_tick = 100
min_oxy = 0
max_oxy = 0
@@ -273,10 +330,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" = 15,
"laser" = 50,
"energy" = 70,
"energy" = 60,
"bomb" = 10,
"bio" = 100,
"rad" = 100)
@@ -355,8 +412,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" = 15,
"laser" = 50,
"energy" = 90,
"bomb" = 10,
@@ -446,9 +503,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" = 15,
"laser" = 50,
"energy" = 70,
"energy" = 60,
"bomb" = 10,
"bio" = 100,
"rad" = 100)
@@ -539,9 +596,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 +690,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 +755,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 +829,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 +869,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)
@@ -924,7 +983,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
var/armor_modifier = abs((victim.getarmor(null, "bio") / 100) - 1)
if(istype(victim, /mob/living/carbon))
victim.adjustCloneLoss(rand(5,6) * armor_modifier)
victim.adjustCloneLoss(rand(2,6) * armor_modifier)
victim.adjustToxLoss(rand(1,2) * armor_modifier)
if(victim.health <= 0)
victim.adjustToxLoss(rand(2,4) * armor_modifier)
@@ -938,7 +997,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
"I can not feed from this subject", "I do not feel nourished", "This subject is not food")]...</span>")
stop_consumption()
adjust_nutrition(50 * armor_modifier)
adjust_nutrition(35 * armor_modifier)
playsound(src, 'sound/metroid/metroidattack.ogg', 50, 1)
adjustOxyLoss(-10 * armor_modifier) //Heal yourself
@@ -1028,7 +1087,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
if(!L.isSynthetic())
if(ishuman(L))
if(L.getCloneLoss() < L.getMaxHealth() * 1.5)
adjust_nutrition(damage_to_do * armor_modifier)
adjust_nutrition(5 + damage_to_do * armor_modifier)
else if(istype(L, /mob/living/simple_animal))
if(!ismetroid(L))
@@ -1201,7 +1260,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
var/mob/living/simple_animal/SA = L
if(!SA.stat)
L.attack_generic(src, damage_to_do, pick(attacktext))
adjust_nutrition(damage_to_do * 4)
adjust_nutrition(damage_to_do * 5)
if(istype(L,/obj/mecha))
@@ -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"
@@ -1374,9 +1380,10 @@
glass_desc = "A sweet concotion hated even by its namesake."
glass_special = list(DRINK_FIZZ)
/datum/reagent/drink/roy_rogers
//CHOMPStation Edit TFF 24/9/19 - Minor change to make it easier for no runtimes with casino.dm
/datum/reagent/drink/royrogers
name = "Roy Rogers"
id = "roy_rogers"
id = "royrogers"
description = "I'm a cowboy, on a steel horse I ride."
taste_description = "cola and fruit"
color = "#4F1811"
@@ -2045,7 +2052,8 @@
glass_name = "Barefoot"
glass_desc = "Barefoot and pregnant."
/datum/reagent/ethanol/beepsky_smash
//CHOMPStation Edit TFF 24/9/19 - Minor change to make it easier for no runtimes with casino.dm
/datum/reagent/ethanol/beepskysmash
name = "Beepsky Smash"
id = "beepskysmash"
description = "Deny drinking this and prepare for THE LAW."
@@ -2058,7 +2066,7 @@
glass_name = "Beepsky Smash"
glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
/datum/reagent/ethanol/beepsky_smash/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
/datum/reagent/ethanol/beepskysmash/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.Stun(2)
@@ -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////////////////////////////////
//////////////////////////////////////////////
+20 -18
View File
@@ -365,7 +365,7 @@
required_reagents = list("inaprovaline" = 1, "carbon" = 1)
inhibitors = list("sugar" = 1) // Messes up with inaprovaline
result_amount = 2
/datum/chemical_reaction/alizine
name = "Alizine"
id = "alizine"
@@ -1464,7 +1464,8 @@
required_reagents = list("rum" = 2, "vermouth" = 2, "phoron" = 2)
result_amount = 6
/datum/chemical_reaction/drinks/beepsky_smash
//CHOMPStation Edit TFF 24/9/19 - Minor change to make it easier for no runtimes with casino.dm
/datum/chemical_reaction/drinks/beepskysmash
name = "Beepksy Smash"
id = "beepksysmash"
result = "beepskysmash"
@@ -1850,10 +1851,11 @@
required_reagents = list("gingerale" = 4, "grenadine" = 1)
result_amount = 5
//CHOMPStation Edit TFF 24/9/19 - Minor change to make it easier for no runtimes with casino.dm
/datum/chemical_reaction/drinks/royrogers
name = "Roy Rogers"
id = "roy_rogers"
result = "roy_rogers"
id = "royrogers"
result = "royrogers"
required_reagents = list("gingerale" = 4, "lemon_lime" = 2, "grenadine" = 1)
result_amount = 7
@@ -1919,7 +1921,7 @@
result = "watermelontea"
required_reagents = list("tea" = 5, "watermelonjuice" = 1)
result_amount = 6
/datum/chemical_reaction/drinks/sakebomb
name = "Sake Bomb"
id = "sakebomb"
@@ -2236,7 +2238,7 @@
result = "eggnog"
required_reagents = list("sugar" = 1, "egg" = 1, "milk" = 1, "cream" = 1, "cognac" = 2)
result_amount = 6
/datum/chemical_reaction/drinks/spiderdrink
name = "Brimming glass of spiders"
id = "spiderdrink"
@@ -2250,28 +2252,28 @@
result = "bubbleteawatermelon"
required_reagents = list("gelatin" = 2, "watermelontea" = 6, "milk" = 2)
result_amount = 10
/datum/chemical_reaction/drinks/bubbleteastrawberry
name = "Strawberry bubble tea"
id = "bubbleteastrawberry"
result = "bubbleteastrawberry"
required_reagents = list("gelatin" = 2, "berrytea" = 6, "milk" = 2)
result_amount = 10
/datum/chemical_reaction/drinks/bubbleteacherry
name = "Cherry bubble tea"
id = "bubbleteacherry"
result = "bubbleteacherry"
required_reagents = list("gelatin" = 2, "cherrytea" = 6, "milk" = 2)
result_amount = 10
/datum/chemical_reaction/drinks/bubbleteacoffee
name = "Coffee bubble tea"
id = "bubbleteacoffee"
result = "bubbleteacoffee"
required_reagents = list("gelatin" = 2, "tea" = 5, "cafe_latte" = 3)
result_amount = 10
/datum/chemical_reaction/drinks/bubbleteabanana
name = "Banana bubble tea"
id = "bubbleteabanana"
@@ -2284,7 +2286,7 @@
id = "horchata"
result = "horchata"
required_reagents = list("milk" = 1, "sugar" = 2, "rice" = 2)
result_amount = 5
result_amount = 5
/datum/chemical_reaction/drinks/bluetrain
name = "Blue train"
@@ -2292,49 +2294,49 @@
result = "bluetrain"
required_reagents = list("coolant" = 2, "ethanol" = 2, "nutriment" = 1)
result_amount = 5
/datum/chemical_reaction/drinks/lowpower
name = "The low power"
id = "lowpower"
result = "lowpower"
required_reagents = list("lemonade" = 1, "cream" = 1, "limejuice" = 1)
result_amount = 3
/datum/chemical_reaction/drinks/jackbrew
name = "Jack's brew"
id = "jackbrew"
result = "jackbrew"
required_reagents = list("irishcoffee" = 1, "hyperzine" = 1)
result_amount = 2
/datum/chemical_reaction/drinks/bookwyrm
name = "Bookwyrm's bite"
id = "bookwyrm"
result = "bookwyrm"
required_reagents = list("coldfront" = 1, "limejuice" = 1, "stoxin" = 1)
result_amount = 3
/datum/chemical_reaction/drinks/highpower
name = "The high power"
id = "highpower"
result = "highpower"
required_reagents = list("lowpower" = 1, "iron" = 1, "uranium" = 1)
result_amount = 3
/datum/chemical_reaction/drinks/flapper
name = "Flapper"
id = "flapper"
result = "flapper"
required_reagents = list("whiskey" = 1, "blood" = 1, "ice" = 1)
result_amount = 3
/datum/chemical_reaction/toxin/oilslide
name = "Oil slide"
id = "oilslide"
result = "oilslide"
required_reagents = list("moonshine" = 1, "lube" = 1, "fuel" = 1)
result_amount = 3
/datum/chemical_reaction/drinks/sitonmyface
name = "Sit on my face"
id = "sitonmyface"
+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
@@ -115,9 +115,9 @@
egg spawn_reagent = "egg"
coco spawn_reagent = "coco"
cherryjelly spawn_reagent = "cherryjelly"
carrot spawn_reagent = "carrot"
apple spawn_reagent = "apple"
tomato spawn_reagent = "tomato"
carrotjuice spawn_reagent = "carrotjuice"
applejuice spawn_reagent = "applejuice"
tomatojuice spawn_reagent = "tomatojuice"
nutbutter spawn_reagent = "nutbutter" //ha
soymilk spawn_reagent = "soymilk"
grenadine spawn_reagent = "grenadine"
@@ -133,7 +133,7 @@
sake spawn_reagent = "sake"
acidspit spawn_reagent = "acidspit"
amasec spawn_reagent = "amasec"
beepsky_smash spawn_reagent = "beepsky_smash"
beepskysmash spawn_reagent = "beepskysmash"
atomicbomb spawn_reagent = "atomicbomb"
nuka_cola spawn_reagent = "nuka_cola"
threemileisland spawn_reagent = "threemileisland"
@@ -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)
+4
View File
@@ -617,6 +617,10 @@
to_chat(src, "<span class='notice'>You can taste the flavor of gluttonous waste of food.</span>")
else if(istype(I,/obj/item/weapon/storage/glass_ornament))
to_chat(src, "<span class='notice'>You can taste the flavor of smooth glass.</span>")
//TFF 10/7/19 - Add custom flavour for collars for trash can trait.
else if (istype(I,/obj/item/clothing/accessory/collar))
visible_message("<span class='warning'>[src] demonstrates their voracious capabilities by swallowing [I] whole!</span>")
to_chat(src, "<span class='notice'>You can taste the submissiveness in the wearer of [I]!</span>")
else if(istype(I,/obj/item/integrated_circuit) ||istype(I,/obj/item/weapon/circuitboard))
to_chat(src, "<span class='notice'>mmm crunchy computer chips.</span>")
else if(istype(I,/obj/item/weapon/cell))