Removes Lag (tm) (#313)

* sensible fixes

* this too

* some more

* fixes chair icons

reverted to state before tg pull

* fixes telecomms icons

revert to state before tg pull

* fixes research icons

reverted to before tg pull

* de-whitewashed the stools

* fixed missing broadcaster sprites

* always load from the savefile

helps custom servers who don't want to fuck with the config, this will
never not be wanted with the system we have

* stop it, ghosts

* fixes limb augmentation

https://github.com/tgstation/tgstation/pull/25446

* removes lag

* re-adds sounds

* exception

* makes travis happy
This commit is contained in:
TalkingCactus
2017-03-26 09:39:29 -04:00
committed by GitHub
parent 6db6e99830
commit c997ebcabd
41 changed files with 44165 additions and 118370 deletions
+69 -7
View File
@@ -1,5 +1,6 @@
//THIS FILE CONTAINS CONSTANTS, PROCS, DEFINES, AND OTHER THINGS//
////////////////////////////////////////////////////////////////////
//THIS FILE CONTAINS CONSTANTS, PROCS, AND OTHER THINGS//
/////////////////////////////////////////////////////////
/mob/proc/setClickCooldown(var/timeout)
next_move = max(world.time + timeout, next_move)
@@ -154,14 +155,75 @@ var/global/dlooc_allowed = 1
/mob/living/carbon/human/proc/is_bodypart_exposed(bodypart)
/mob/living/carbon/proc/is_groin_exposed()
for(var/obj/item/I in get_equipped_items())
/mob/living/carbon/proc/is_groin_exposed(var/list/L)
if(!L)
L = get_equipped_items()
for(var/obj/item/I in L)
if(I.body_parts_covered & GROIN)
return 0
return 1
/mob/living/carbon/proc/is_chest_exposed()
for(var/obj/item/I in get_equipped_items())
/mob/living/carbon/proc/is_chest_exposed(var/list/L)
if(!L)
L = get_equipped_items()
for(var/obj/item/I in L)
if(I.body_parts_covered & CHEST)
return 0
return 1
return 1
////////////////////////
//DANGER | DEBUG PROCS//
////////////////////////
/client/proc/give_humans_genitals()
set name = "Mass Give Genitals"
set category = "Dangerous"
set desc = "Gives every human mob genitals for testing purposes. WARNING: NOT FOR LIVE SERVER USAGE!!"
log_admin("[src] gave everyone genitals.")
message_admins("[src] gave everyone genitals.")
for(var/mob/living/carbon/human/H in mob_list)
if(H.gender == MALE)
H.give_penis()
H.give_balls()
else
H.give_vagina()
H.give_womb()
H.give_breasts()
/client/proc/test_mammal_overlays()
set name = "Mass Give Mammalitus"
set category = "Dangerous"
set desc = "Turns every human into a mammal with tails, ears, etc. WARNING: NOT FOR LIVE SERVER USAGE!!"
log_admin("[src] turned everyone into mammals.")
message_admins("[src] turned everyone into mammals.")
for(var/mob/living/carbon/human/H in mob_list)
if(!H.dna)
continue
var/datum/dna/hdna = H.dna
H.set_species(/datum/species/mammal)
var/subspec = pick("Fox","Wolf","Fennec")
switch(subspec)
if("Wolf")
hdna.features["mam_tail"] = "Wolf"
hdna.features["mam_ears"] = "Wolf"
hdna.features["snout"] = "Wolf"
hdna.features["mam_body_markings"] = "Wolf"
hdna.features["mcolor"] = "555"
hdna.features["mcolor2"] = "999"
hdna.features["mcolor3"] = "999"
if("Fox")
hdna.features["mam_tail"] = "Fox"
hdna.features["mam_ears"] = "Fox"
hdna.features["snout"] = "Fox, Long"
hdna.features["mam_body_markings"] = "Fox"
hdna.features["mcolor"] = "f60"
hdna.features["mcolor2"] = "fff"
hdna.features["mcolor3"] = "fff"
if("Fennec")
hdna.features["mam_tail"] = "Fennec"
hdna.features["mam_ears"] = "Fennec"
hdna.features["snout"] = "Fox, Short"
hdna.features["mam_body_markings"] = "Fox"
H.regenerate_icons()
+1
View File
@@ -1,3 +1,4 @@
/area/maintenance/bar
name = "Maintenance Bar"
icon = 'code/citadel/icons/areas.dmi'
icon_state = "maintbar"
Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

After

Width:  |  Height:  |  Size: 405 B

+6 -5
View File
@@ -12,21 +12,22 @@
var/amount = 2
producing = TRUE
/obj/item/organ/genital/breasts/New()
..()
/obj/item/organ/genital/breasts/Initialize()
create_reagents(fluid_max_volume)
reagents.add_reagent(fluid_id, fluid_max_volume)
update()
/obj/item/organ/genital/breasts/on_life()
if(QDELETED(src))
return
if(!reagents || !owner)
return
reagents.maximum_volume = fluid_max_volume
if(fluid_id && producing)
generate_milk()
/obj/item/organ/genital/breasts/proc/generate_milk()
if(!owner)
return FALSE
if(owner.stat == DEAD)
return FALSE
reagents.isolate_reagent(fluid_id)
reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))
reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))
+33 -22
View File
@@ -13,16 +13,19 @@
var/producing = FALSE
/obj/item/organ/genital/Initialize()
..()
reagents = create_reagents(fluid_max_volume)
update()
/obj/item/organ/genital/Destroy()
remove_ref()
if(owner)
Remove(owner, 1)//this should remove references to it, so it can be GCd correctly
update_link()
update_link()//this should remove any other links it has
return ..()
/obj/item/organ/genital/proc/update()
if(QDELETED(src))
return
update_size()
update_appearance()
update_link()
@@ -33,6 +36,8 @@
/obj/item/organ/genital/proc/update_link()
/obj/item/organ/genital/proc/remove_ref()
/obj/item/organ/genital/Insert(mob/living/carbon/M, special = 0)
..()
update()
@@ -47,6 +52,7 @@
var/obj/item/organ/genital/GtoClean
for(GtoClean in internal_organs)
qdel(GtoClean)
if(dna.features["has_cock"])
give_penis()
if(dna.features["has_balls"])
@@ -92,7 +98,7 @@
// T.color = skintone2hex(skin_tone)
// else
// T.color = "#[dna.features["balls_color"]]"
T.size = dna.features["bals_size"]
T.size = dna.features["balls_size"]
T.sack_size = dna.features["balls_sack_size"]
T.fluid_id = dna.features["balls_fluid"]
T.fluid_rate = dna.features["balls_cum_rate"]
@@ -101,7 +107,7 @@
T.update()
/mob/living/carbon/human/proc/give_breasts()
if(!has_dna())
if(!dna)
return FALSE
if(NOGENITALS in dna.species.species_traits)
return FALSE
@@ -116,7 +122,7 @@
/mob/living/carbon/human/proc/give_ovipositor()
/mob/living/carbon/human/proc/give_eggsack()
/mob/living/carbon/human/proc/give_vagina()
if(!has_dna())
if(!dna)
return FALSE
if(NOGENITALS in dna.species.species_traits)
return FALSE
@@ -126,10 +132,10 @@
if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
V.color = skintone2hex(skin_tone)
else
V.color = dna.features["vag_color"]
V.color = "[dna.features["vag_color"]]"
V.update()
/mob/living/carbon/human/proc/give_womb()
if(!has_dna())
if(!dna)
return FALSE
if(NOGENITALS in dna.species.species_traits)
return FALSE
@@ -163,19 +169,20 @@
update_genitals()
/mob/living/carbon/human/proc/update_genitals()
dna.species.handle_genitals(src)
if(src && !QDELETED(src))
dna.species.handle_genitals(src)
/datum/species/proc/handle_genitals(mob/living/carbon/human/H)
if(!H)
if(!H)//no args
CRASH("H = null")
if(!H.internal_organs.len)
if(!LAZYLEN(H.internal_organs))//if they have no organs, we're done
return
if(NOGENITALS in species_traits)
if(NOGENITALS in species_traits)//golems and such
return
var/list/genitals_to_add = list()
var/list/relevent_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER)
var/list/standing = list()
var/list/genitals_to_add = list()
var/list/relevent_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER)
var/list/standing = list()
var/size
H.remove_overlay(GENITALS_BEHIND_LAYER)
@@ -185,12 +192,15 @@
if(H.disabilities & HUSK)
return
//start scanning for genitals
if(H.has_penis() && H.is_groin_exposed())
genitals_to_add += H.getorganslot("penis")
if(H.has_breasts() && H.is_chest_exposed())
genitals_to_add += H.getorganslot("breasts")
if(H.has_vagina() && H.is_groin_exposed())
genitals_to_add += H.getorganslot("vagina")
var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again
if(H.is_groin_exposed(worn_stuff))
if(H.has_penis())
genitals_to_add += H.getorganslot("penis")
if(H.has_vagina())
genitals_to_add += H.getorganslot("vagina")
if(H.is_chest_exposed(worn_stuff))
if(H.has_breasts())
genitals_to_add += H.getorganslot("breasts")
var/image/I
//start applying overlays
for(var/layer in relevent_layers)
@@ -230,8 +240,9 @@
else
I.color = "#[H.dna.features["mcolor3"]]"
standing += I
H.overlays_standing[layer] = standing.Copy()
standing = list()
if(LAZYLEN(standing))
H.overlays_standing[layer] = standing.Copy()
standing = list()
H.apply_overlay(GENITALS_BEHIND_LAYER)
H.apply_overlay(GENITALS_ADJ_LAYER)
@@ -7,10 +7,6 @@
color_src = "cock_color"
locked = 0
/datum/sprite_accessory/penis/none
icon_state = "none"
name = "None"
/datum/sprite_accessory/penis/human
icon_state = "human"
name = "Human"
@@ -40,9 +36,6 @@
color_src = MUTCOLORS2 //I'll have skin_tone override this if the species uses them
locked = 0
/*!!ULTRACOMPRESSEDEDITION!!*/
/datum/sprite_accessory/breasts/none
icon_state = "none"
name = "None"
/datum/sprite_accessory/breasts/a
icon_state = "a"
name = "A"
-1
View File
@@ -13,5 +13,4 @@
var/girth_ratio = COCK_GIRTH_RATIO_DEF //citadel_defines.dm for these defines
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
var/list/oviflags = list()
var/obj/item/organ/eggsack/linked_eggsack
+24 -15
View File
@@ -9,43 +9,47 @@
can_masturbate_with = 1
size = 2 //arbitrary value derived from length and girth for sprites.
var/length = 6 //inches
var/cached_length //used to detect a change in length
var/girth = 0
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
var/list/dickflags = list()
var/list/knotted_types = list("", "barbknot")
var/list/knotted_types = list("knotted", "barbknot")
var/obj/item/organ/genital/testicles/linked_balls
/obj/item/organ/genital/penis/Initialize()
update()
/obj/item/organ/genital/penis/update()
update_size()
update_appearance()
update_link()
/obj/item/organ/genital/penis/update_size()
if(length == cached_length)
return
switch(length)
if(-INFINITY to 5)
size = 1
if(5 to 9)
size = 2
if(9 to 12)
size = 3//no new sprites for anything larger
if(9 to 15)
if(9 to INFINITY)
size = 3//no new sprites for anything larger yet
/* if(9 to 15)
size = 3
if(15 to INFINITY)
size = 3
size = 3*/
girth = (length * girth_ratio)
cached_length = length
/obj/item/organ/genital/penis/update_appearance()
var/string = "penis_[lowertext(shape)]_[size]"
icon_state = sanitize_text(string)
// name = "[shape] penis"
desc = "That's a [lowertext(shape)] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long and [round(girth, 0.25)] inch[length > 1 ? "es" : ""] around."
if(!owner)
return
color = "#[owner.dna.features["cock_color"]]"
var/lowershape = lowertext(shape)
if(lowershape in knotted_types)
if(lowershape == "barbknot")
lowershape = "barbed, knotted"
desc = "That's a [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long, [round(girth, 0.25)] inch[length > 1 ? "es" : ""] around the shaft \
and [round(length * knot_girth_ratio, 0.25)] inch[length > 1 ? "es" : ""] around the knot."
else
desc = "That's a [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long and [round(girth, 0.25)] inch[length > 1 ? "es" : ""] around."
if(owner)
color = "#[owner.dna.features["cock_color"]]"
/obj/item/organ/genital/penis/update_link()
if(owner)
@@ -56,3 +60,8 @@
if(linked_balls)
linked_balls.linked_penis = null
linked_balls = null
/obj/item/organ/genital/penis/remove_ref()
if(linked_balls)
linked_balls.linked_penis = null
linked_balls = null
+8 -12
View File
@@ -20,24 +20,19 @@
update()
/obj/item/organ/genital/testicles/on_life()
if(fluid_id && producing)
if(QDELETED(src))
return
if(reagents && producing)
generate_cum()
/obj/item/organ/genital/testicles/proc/generate_cum()
reagents.maximum_volume = fluid_max_volume
if(reagents.total_volume >= reagents.maximum_volume)
if(sent_full_message < 0)
if(!sent_full_message)
send_full_message()
sent_full_message = 1
return FALSE
sent_full_message = 0
if(!owner && linked_penis)
if(linked_penis.linked_balls == src)
linked_penis.linked_balls = null
linked_penis = null
return FALSE
if(!reagents)
create_reagents(fluid_max_volume)
update_link()
if(!linked_penis)
return FALSE
@@ -45,12 +40,13 @@
reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))//generate the cum
/obj/item/organ/genital/testicles/update_link()
if(owner)
if(owner && !QDELETED(src))
linked_penis = (owner.getorganslot("penis"))
if(linked_penis)
linked_penis.linked_balls = src
else if(linked_penis != null)
linked_penis.linked_balls = null
else
if(linked_penis)
linked_penis.linked_balls = null
linked_penis = null
/obj/item/organ/genital/testicles/proc/send_full_message(msg = "Your balls finally feel full, again.")
+3 -2
View File
@@ -8,8 +8,9 @@
can_masturbate_with = 1
w_class = 3
var/wetness = 1
var/capacity_length = 8//D E P T H
var/capacity_girth = 8
var/cap_length = 8//D E P T H (cap = capacity)
var/cap_girth = 12
var/cap_girth_ratio = 1.5
var/clits = 1
var/clit_diam = 0.25
var/clit_len = 0.25
+4
View File
@@ -1,9 +1,13 @@
/obj/item/organ/genital/womb
name = "womb"
desc = "A female reproductive organ."
icon = 'code/citadel/icons/vagina.dmi'
icon_state = "womb"
zone = "groin"
slot = "womb"
w_class = 3
fluid_id = "femcum"
var/obj/item/organ/genital/vagina/linked_vag
/obj/item/organ/genital/womb/Destroy()
return ..()
+8 -2
View File
@@ -48,8 +48,6 @@ obj/item/weapon/dildo/proc/update_appearance()
switch(dildo_size)
if(1)
sizeword = "small "
if(2)
sizeword = ""
if(3)
sizeword = "big "
if(4)
@@ -60,6 +58,14 @@ obj/item/weapon/dildo/proc/update_appearance()
name = "[sizeword][dildo_shape] [can_customize ? "custom " : ""][dildo_type]"
obj/item/weapon/dildo/AltClick(mob/living/user)
if(QDELETED(src))
return
if(!isliving(user))
return
if(isAI(user))
return
if(user.stat > 0)//unconscious or dead
return
customize(user)
obj/item/weapon/dildo/proc/customize(mob/living/user)
+2
View File
@@ -38,6 +38,8 @@
//if they differ between directions, otherwise use the
//generic variables
/datum/riding/proc/handle_vehicle_offsets()
if(!ridden || QDELETED(ridden))
return
if(ridden.has_buckled_mobs())
for(var/m in ridden.buckled_mobs)
var/mob/living/buckled_mob = m
@@ -46,7 +46,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT)
sheettype = "sandstone"
/obj/item/stack/sheet/mineral/sandstone/New(var/loc, var/amount=null)
/obj/item/stack/sheet/mineral/sandstone/Initialize(mapload, new_amount, merge = TRUE)
recipes = sandstone_recipes
pixel_x = rand(0,4)-4
pixel_y = rand(0,4)-4
@@ -8,7 +8,7 @@
turf_type = /turf/open/floor/light
var/state = 0
/obj/item/stack/tile/light/New(var/loc, var/amount=null)
/obj/item/stack/tile/light/Initialize(mapload, new_amount, merge = TRUE)
..()
if(prob(5))
state = 3 //broken
+2 -2
View File
@@ -219,11 +219,11 @@
return
if(!use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed
return src
var/old_baseturf = baseturf
changing_turf = TRUE
qdel(src) //Just get the side effects and call Destroy
var/turf/W = new path(src)
W.baseturf = old_baseturf
if(!defer_change)
W.AfterChange(ignore_air)
+3
View File
@@ -143,6 +143,9 @@ var/list/admin_verbs_debug = list(
/client/proc/check_bomb_impacts,
/proc/machine_upgrade,
/client/proc/populate_world,
//citadel code
/client/proc/give_humans_genitals,
/client/proc/test_mammal_overlays,
/client/proc/get_dynex_power, //*debug verbs for dynex explosions.
/client/proc/get_dynex_range, //*debug verbs for dynex explosions.
/client/proc/set_dynex_scale,
+37 -36
View File
@@ -2,7 +2,7 @@
#define SAVEFILE_VERSION_MIN 10
//This is the current version, anything below this will attempt to update (if it's not obsolete)
#define SAVEFILE_VERSION_MAX 17
#define SAVEFILE_VERSION_MAX 18
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
This proc checks if the current directory of the savefile S needs updating
@@ -125,6 +125,36 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
joblessrole = BEASSISTANT
if(current_version < 17)
features["legs"] = "Normal Legs"
if(current_version < 18)//this should lower the amount of lag when you select or change something.
features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], mam_body_markings_list)
features["mam_ears"] = sanitize_inlist(features["mam_ears"], mam_ears_list)
features["mam_tail"] = sanitize_inlist(features["mam_tail"], mam_tails_list)
features["taur"] = sanitize_inlist(features["taur"], taur_list)
//Xeno features
features["xenotail"] = sanitize_inlist(features["xenotail"], xeno_tail_list)
features["xenohead"] = sanitize_inlist(features["xenohead"], xeno_head_list)
features["xenodorsal"] = sanitize_inlist(features["xenodorsal"], xeno_dorsal_list)
//cock features
features["has_cock"] = sanitize_integer(features["has_cock"], 0, 1, 0)
features["cock_shape"] = sanitize_inlist(features["cock_shape"], cock_shapes_list, "Human")
features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, 0)
features["cock_length"] = sanitize_integer(features["cock_length"], COCK_SIZE_MIN, COCK_SIZE_MAX, 6)
//balls features
features["has_balls"] = sanitize_integer(features["has_balls"], 0, 1, 0)
features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, 0)
features["balls_size"] = sanitize_integer(features["balls_size"], BALLS_SIZE_MIN, BALLS_SIZE_MAX, BALLS_SIZE_DEF)
features["balls_sack_size"] = sanitize_integer(features["balls_sack_size"], BALLS_SACK_SIZE_MIN, BALLS_SACK_SIZE_MAX, BALLS_SACK_SIZE_DEF)
features["balls_fluid"] = sanitize_inlist(features["balls_fluid"], cum_id_list, "semen")
//breasts features
features["has_breasts"] = sanitize_integer(features["has_breasts"], 0, 1, 0)
features["breasts_size"] = sanitize_inlist(features["breasts_size"], breasts_size_list, "C")
features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, 0)
features["breasts_fluid"] = sanitize_inlist(features["breasts_fluid"], milk_id_list, "milk")
//vagina features
features["has_vag"] = sanitize_integer(features["has_vag"], 0, 1, 0)
features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0)
//womb features
features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0)
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
@@ -300,12 +330,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_lizard_spines"] >> features["spines"]
S["feature_lizard_body_markings"] >> features["body_markings"]
S["feature_lizard_legs"] >> features["legs"]
if(!config.mutant_humans)
features["tail_human"] = "none"
features["ears"] = "none"
else
S["feature_human_tail"] >> features["tail_human"]
S["feature_human_ears"] >> features["ears"]
S["feature_human_tail"] >> features["tail_human"]
S["feature_human_ears"] >> features["ears"]
S["clown_name"] >> custom_names["clown"]
S["mime_name"] >> custom_names["mime"]
S["ai_name"] >> custom_names["ai"]
@@ -362,6 +388,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//vagina features
S["feature_has_vag"] >> features["has_vag"]
S["feature_vag_color"] >> features["vag_color"]
//womb features
S["feature_has_womb"] >> features["has_womb"]
//try to fix any outdated data if necessary
if(needs_update >= 0)
@@ -428,35 +456,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["mcolor3"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F")
features["mcolor2"] = sanitize_hexcolor(features["mcolor2"], 3, 0)
features["mcolor3"] = sanitize_hexcolor(features["mcolor3"], 3, 0)
features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], mam_body_markings_list)
features["mam_ears"] = sanitize_inlist(features["mam_ears"], mam_ears_list)
features["mam_tail"] = sanitize_inlist(features["mam_tail"], mam_tails_list)
features["taur"] = sanitize_inlist(features["taur"], taur_list)
//Xeno features
features["xenotail"] = sanitize_inlist(features["xenotail"], xeno_tail_list)
features["xenohead"] = sanitize_inlist(features["xenohead"], xeno_head_list)
features["xenodorsal"] = sanitize_inlist(features["xenodorsal"], xeno_dorsal_list)
//cock features
features["has_cock"] = sanitize_integer(features["has_cock"], 0, 1, 0)
features["cock_shape"] = sanitize_inlist(features["cock_shape"], cock_shapes_list, "Human")
features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, 0)
features["cock_length"] = sanitize_integer(features["cock_length"], COCK_SIZE_MIN, COCK_SIZE_MAX, 6)
//balls features
features["has_balls"] = sanitize_integer(features["has_balls"], 0, 1, 0)
features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, 0)
features["balls_size"] = sanitize_integer(features["balls_size"], BALLS_SIZE_MIN, BALLS_SIZE_MAX, BALLS_SIZE_DEF)
features["balls_sack_size"] = sanitize_integer(features["balls_sack_size"], BALLS_SACK_SIZE_MIN, BALLS_SACK_SIZE_MAX, BALLS_SACK_SIZE_DEF)
features["balls_fluid"] = sanitize_inlist(features["balls_fluid"], cum_id_list, "semen")
//breasts features
features["has_breasts"] = sanitize_integer(features["has_breasts"], 0, 1, 0)
features["breasts_size"] = sanitize_inlist(features["breasts_size"], breasts_size_list, "C")
features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, 0)
features["breasts_fluid"] = sanitize_inlist(features["breasts_fluid"], milk_id_list, "milk")
//vagina features
features["has_vag"] = sanitize_integer(features["has_vag"], 0, 1, 0)
features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0)
return 1
/datum/preferences/proc/save_character()
@@ -553,6 +552,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//vagina features
S["feature_has_vag"] << features["has_vag"]
S["feature_vag_color"] << features["vag_color"]
//womb features
S["feature_has_womb"] << features["has_womb"]
return 1
+1 -1
View File
@@ -232,7 +232,7 @@
if(!(text2path(href_list["release"]) in stack_list))
return
var/obj/item/stack/sheet/inp = stack_list[text2path(href_list["release"])]
var/obj/item/stack/sheet/out = new inp.type(src,merge=FALSE)
var/obj/item/stack/sheet/out = new inp.type(src, 0, FALSE)
var/desired = input("How many sheets?", "How many sheets to eject?", 1) as null|num
out.amount = round(min(desired,50,inp.amount))
if(out.amount)
@@ -62,6 +62,7 @@
if(previewJob && !nude)
mannequin.job = previewJob.title
previewJob.equip(mannequin, TRUE)
mannequin.update_body()
CHECK_TICK
preview_icon = icon('icons/effects/effects.dmi', "nothing")
preview_icon.Scale((112), (32))
@@ -353,8 +353,6 @@
H.overlays_standing[BODY_LAYER] = standing
H.apply_overlay(BODY_LAYER)
//citadel code
handle_genitals(H)
handle_mutant_bodyparts(H)
/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
@@ -3,7 +3,7 @@ datum/species/mammal
id = "mammal"
default_color = "4B4B4B"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "snout", "legs", "taur")
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "snout", "taur")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "body_markings" = "None", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "None", "taur" = "None")
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
@@ -60,6 +60,7 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_body()
remove_overlay(BODY_LAYER)
dna.species.handle_body(src)
dna.species.handle_genitals(src)
..()
/mob/living/carbon/human/update_fire()
@@ -73,6 +74,7 @@ There are several things that need to be remembered:
if(!..())
icon_render_key = null //invalidate bodyparts cache
update_body()
update_genitals()
update_hair()
update_inv_w_uniform()
update_inv_wear_id()
@@ -256,6 +258,11 @@ There are several things that need to be remembered:
if(get_num_legs() <2)
return
if("taur" in dna.species.mutant_bodyparts)
var/tpref = dna.features["taur"]
if(tpref == "Naga")
return
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_shoes]
inv.update_icon()
@@ -267,10 +274,7 @@ There are several things that need to be remembered:
client.screen += shoes //add it to client's screen
update_observer_view(shoes,1)
var/image/standing = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi')
if("taur" in dna.species.mutant_bodyparts)
switch(dna.features["taur"])
if(!"Naga" || "None")
overlays_standing[SHOES_LAYER] = standing
overlays_standing[SHOES_LAYER] = standing
apply_overlay(SHOES_LAYER)
+3 -3
View File
@@ -320,9 +320,9 @@
I = image("icon"='icons/mob/human_parts.dmi', "icon_state"="[species_id]_[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
else
if(should_draw_gender)
I = image("icon"='icons/mob/augments.dmi', "icon_state"="[initial(icon_state)]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
I = image("icon"= icon, "icon_state"="[body_zone]_[icon_gender]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
else
I = image("icon"='icons/mob/augments.dmi', "icon_state"="[initial(icon_state)]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
I = image("icon"= icon, "icon_state"="[body_zone]", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
standing += I
return standing
@@ -554,4 +554,4 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "severedtail"
color = "#161"
var/markings = "Smooth"
var/markings = "Smooth"
@@ -1,5 +1,3 @@
/obj/item/bodypart/l_arm/robot
name = "cyborg left arm"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
@@ -7,7 +5,7 @@
item_state = "buildpipe"
icon = 'icons/obj/robot_parts.dmi'
flags = CONDUCT
icon_state = "l_arm"
icon_state = "borg_l_arm"
status = BODYPART_ROBOTIC
@@ -18,7 +16,7 @@
item_state = "buildpipe"
icon = 'icons/obj/robot_parts.dmi'
flags = CONDUCT
icon_state = "r_arm"
icon_state = "borg_r_arm"
status = BODYPART_ROBOTIC
@@ -29,7 +27,7 @@
item_state = "buildpipe"
icon = 'icons/obj/robot_parts.dmi'
flags = CONDUCT
icon_state = "l_leg"
icon_state = "borg_l_leg"
status = BODYPART_ROBOTIC
@@ -40,7 +38,7 @@
item_state = "buildpipe"
icon = 'icons/obj/robot_parts.dmi'
flags = CONDUCT
icon_state = "r_leg"
icon_state = "borg_r_leg"
status = BODYPART_ROBOTIC
@@ -50,7 +48,7 @@
item_state = "buildpipe"
icon = 'icons/obj/robot_parts.dmi'
flags = CONDUCT
icon_state = "chest"
icon_state = "borg_chest"
status = BODYPART_ROBOTIC
var/wired = 0
var/obj/item/weapon/stock_parts/cell/cell = null
@@ -100,7 +98,7 @@
item_state = "buildpipe"
icon = 'icons/obj/robot_parts.dmi'
flags = CONDUCT
icon_state = "head"
icon_state = "borg_head"
status = BODYPART_ROBOTIC
var/obj/item/device/assembly/flash/handheld/flash1 = null
var/obj/item/device/assembly/flash/handheld/flash2 = null
@@ -165,27 +163,27 @@
/obj/item/bodypart/l_arm/robot/surplus
name = "surplus prosthetic left arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon = 'icons/mob/augments.dmi'
icon_state = "surplus_l_arm"
icon = 'icons/mob/surplus_augments.dmi'
icon_state = "l_arm"
max_damage = 20
/obj/item/bodypart/r_arm/robot/surplus
name = "surplus prosthetic right arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon = 'icons/mob/augments.dmi'
icon_state = "surplus_r_arm"
icon = 'icons/mob/surplus_augments.dmi'
icon_state = "r_arm"
max_damage = 20
/obj/item/bodypart/l_leg/robot/surplus
name = "surplus prosthetic left leg"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon = 'icons/mob/augments.dmi'
icon_state = "surplus_l_leg"
icon = 'icons/mob/surplus_augments.dmi'
icon_state = "l_leg"
max_damage = 20
/obj/item/bodypart/r_leg/robot/surplus
name = "surplus prosthetic right leg"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon = 'icons/mob/augments.dmi'
icon = 'icons/mob/surplus_augments.dmi'
icon_state = "surplus_r_leg"
max_damage = 20
max_damage = 20
+4 -3
View File
@@ -1,4 +1,3 @@
/////AUGMENTATION SURGERIES//////
@@ -46,13 +45,15 @@
//SURGERY STEP SUCCESSES
/datum/surgery_step/add_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
/datum/surgery_step/add_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery)
if(L)
user.visible_message("[user] successfully augments [target]'s [parse_zone(target_zone)]!", "<span class='notice'>You successfully augment [target]'s [parse_zone(target_zone)].</span>")
L.change_bodypart_status(BODYPART_ROBOTIC, 1)
L.icon = tool.icon
L.max_damage = tool.max_damage
user.drop_item()
qdel(tool)
target.update_damage_overlays()
target.update_body_parts()
target.updatehealth()
add_logs(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
else
@@ -62,6 +62,7 @@
S.icon_state = icon_state
S.origin_tech = origin_tech
S.w_class = w_class
S.color = color
return S