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
@@ -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,3 +1,4 @@
|
||||
/area/maintenance/bar
|
||||
name = "Maintenance Bar"
|
||||
icon = 'code/citadel/icons/areas.dmi'
|
||||
icon_state = "maintbar"
|
||||
BIN
code/citadel/icons/areas.dmi
Normal file
|
After Width: | Height: | Size: 403 B |
|
Before Width: | Height: | Size: 298 B After Width: | Height: | Size: 405 B |
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 1.7 KiB |
BIN
icons/mob/surplus_augments.dmi
Normal file
|
After Width: | Height: | Size: 843 B |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 3.0 KiB |