mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2026-08-27 14:46:57 +01:00
Merge branch 'master' into pr/870
This commit is contained in:
@@ -33,12 +33,12 @@
|
||||
face_atom(target)
|
||||
draining = TRUE
|
||||
to_chat(src, span_revennotice("You search for the lifespring of [target]."))
|
||||
if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second?
|
||||
if(do_after(src, rand(10, 20), target)) //did they get deleted in that second?
|
||||
for(var/obj/item/organ/genital/G in target.internal_organs)
|
||||
if(!(G.genital_flags & GENITAL_FUID_PRODUCTION))
|
||||
continue
|
||||
// var/datum/reagents/fluid_source = G.climaxable(target)
|
||||
if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second?
|
||||
if(do_after(src, rand(10, 20), target)) //did they get deleted in that second?
|
||||
// var/main_fluid = lowertext(fluid_source.get_master_reagent_name()) // doesn't work no more (should delete probably)
|
||||
var/main_fluid = G.get_fluid_name()
|
||||
var/fluid_ammount = G.get_fluid()
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
|
||||
|
||||
if(do_after(src, rand(15, 20), 0, target)) //did they get deleted NOW?
|
||||
if(do_after(src, rand(15, 20), target)) //did they get deleted NOW?
|
||||
switch(essence_drained)
|
||||
if(0 to 4)
|
||||
to_chat(src, span_revennotice("[target] is almost barren of essence. Still, every bit counts."))
|
||||
@@ -67,7 +67,7 @@
|
||||
to_chat(src, span_revenboldnotice("Such a feast! [target] will yield much essence to you."))
|
||||
if(30 to INFINITY)
|
||||
to_chat(src, span_revenbignotice("Ah, a sexually furstrated person. [target] will yield massive amounts of essence to you."))
|
||||
if(do_after(src, rand(15, 25), 0, target)) //how about now
|
||||
if(do_after(src, rand(15, 25), target)) //how about now
|
||||
if(target.stat)
|
||||
to_chat(src, span_revenwarning("[target.p_theyre(TRUE)] now too weak to provide anything of worth."))
|
||||
to_chat(target, span_boldannounce("You feel something tugging across your body before subsiding."))
|
||||
@@ -90,7 +90,7 @@
|
||||
draining = FALSE
|
||||
return
|
||||
var/datum/beam/B = Beam(target,icon_state="drain_life",time=INFINITY)
|
||||
if(do_after(src, 46, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining.
|
||||
if(do_after(src, 46, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining.
|
||||
change_essence_amount(essence_drained, FALSE, target)
|
||||
for(var/obj/item/organ/genital/G in target.internal_organs)
|
||||
var/datum/reagents/fluid_source = G.climaxable(target)
|
||||
|
||||
@@ -114,18 +114,21 @@
|
||||
var/percentage = ((get_lust() / (get_lust_tolerance() * 3)) * 100)
|
||||
return percentage
|
||||
|
||||
/atom/proc/add_cum_overlay() //This can go in a better spot, for now its here.
|
||||
cum_splatter_icon = icon(initial(icon), initial(icon_state), dir = 1)
|
||||
cum_splatter_icon.Blend("#fff", ICON_ADD)
|
||||
cum_splatter_icon.Blend(icon('modular_splurt/icons/effects/cumoverlay.dmi', "cum_obj"), ICON_MULTIPLY)
|
||||
/atom/proc/add_cum_overlay(cum_color) //This can go in a better spot, for now its here.
|
||||
wash_cum()
|
||||
cum_splatter_icon = mutable_appearance('modular_splurt/icons/effects/cumoverlay.dmi', "cum_obj", color = cum_color)
|
||||
add_overlay(cum_splatter_icon)
|
||||
|
||||
/mob/living/carbon/human/add_cum_overlay(cum_color, large = FALSE)
|
||||
wash_cum()
|
||||
cum_splatter_icon = mutable_appearance('modular_splurt/icons/effects/cumoverlay.dmi', large ? "cum_large" : "cum_normal", color = cum_color)
|
||||
add_overlay(cum_splatter_icon)
|
||||
|
||||
/atom/proc/wash_cum()
|
||||
cut_overlay(mutable_appearance('modular_splurt/icons/effects/cumoverlay.dmi', "cum_normal"))
|
||||
cut_overlay(mutable_appearance('modular_splurt/icons/effects/cumoverlay.dmi', "cum_large"))
|
||||
if(cum_splatter_icon)
|
||||
cut_overlay(cum_splatter_icon)
|
||||
return TRUE
|
||||
QDEL_NULL(cum_splatter_icon)
|
||||
return TRUE
|
||||
|
||||
//arousal hud display
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
var/datum/reagent/original_fluid_id
|
||||
var/datum/reagent/default_fluid_id
|
||||
var/list/writtentext = ""
|
||||
var/list/obj/item/equipment = list()
|
||||
|
||||
/obj/item/organ/genital/modify_size(modifier, min, max)
|
||||
. = ..()
|
||||
@@ -31,6 +32,11 @@
|
||||
return linked_organ.fluid_id
|
||||
return
|
||||
|
||||
/obj/item/organ/genital/proc/splash_cum(mob/living/carbon/human/orgasming, target_orifice, atom/partner, cumin, genital)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
return !(!owner || cumin || genital != src)
|
||||
|
||||
/obj/item/organ/genital/proc/get_fluid_name()
|
||||
var/milkies = get_fluid_id()
|
||||
var/message
|
||||
@@ -53,9 +59,6 @@
|
||||
else if(linked_organ?.genital_flags & GENITAL_FUID_PRODUCTION)
|
||||
linked_organ?.fluid_id = new_fluidtype
|
||||
|
||||
/obj/item/organ/genital
|
||||
var/list/obj/item/equipment = list()
|
||||
|
||||
/mob/living/carbon/human/update_genitals()
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -1,6 +1,18 @@
|
||||
/obj/item/organ/genital/breasts
|
||||
default_fluid_id = /datum/reagent/consumable/milk
|
||||
|
||||
/obj/item/organ/genital/breasts/Insert(mob/living/carbon/M, special, drop_if_replaced)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
RegisterSignal(owner, COMSIG_MOB_CAME, .proc/splash_cum)
|
||||
|
||||
/obj/item/organ/genital/breasts/Remove(special)
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/C = .
|
||||
if(!QDELETED(C))
|
||||
UnregisterSignal(C, COMSIG_MOB_CAME)
|
||||
|
||||
/obj/item/organ/genital/breasts/get_features(mob/living/carbon/human/H)
|
||||
var/datum/dna/D = H.dna
|
||||
if(D.features["breasts_fluid"])
|
||||
@@ -38,3 +50,34 @@
|
||||
owner.visible_message("<span class='lewd'>\The <b>[owner]</b>'s [pick(GLOB.breast_nouns)] swell up with the surge of [lowertext(source_gen.get_fluid_name())] from \the <b>[partner]</b>'s [source_gen.name]", ignored_mobs = owner.get_unconsenting())
|
||||
fluid_id = source_gen.get_fluid_id()
|
||||
climax_fluids.clear_reagents()
|
||||
|
||||
/obj/item/organ/genital/breasts/splash_cum(mob/living/carbon/human/orgasming, target_orifice, atom/partner, cumin, genital)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
// determine size stage
|
||||
var/width_multiplier = 0
|
||||
switch(round(size * get_size(owner)))
|
||||
if(10 to 20)
|
||||
width_multiplier = 1
|
||||
if(20 to INFINITY)
|
||||
width_multiplier = 2
|
||||
|
||||
// get affected objects
|
||||
var/turf/target_turf = owner.loc
|
||||
var/list/atom/cumsplashed_items = list()
|
||||
if(!istype(target_turf))
|
||||
return
|
||||
for(var/i in 0 to width_multiplier)
|
||||
target_turf = get_step(target_turf, owner.dir)
|
||||
for(var/object in target_turf.contents)
|
||||
if(isturf(object))
|
||||
continue
|
||||
LAZYADD(cumsplashed_items, object)
|
||||
if(cumsplashed_items.len)
|
||||
break
|
||||
|
||||
// splash affected objects
|
||||
for(var/atom/object in cumsplashed_items)
|
||||
object.add_cum_overlay(initial(fluid_id.color), width_multiplier > 1 ? TRUE : FALSE)
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
/obj/item/organ/genital/penis/Insert(mob/living/carbon/M, special, drop_if_replaced)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
RegisterSignal(owner, COMSIG_MOB_CAME, .proc/splash_cum)
|
||||
|
||||
/obj/item/organ/genital/penis/Remove(special)
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/C = .
|
||||
if(!QDELETED(C))
|
||||
UnregisterSignal(C, COMSIG_MOB_CAME)
|
||||
|
||||
/obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
original_fluid_id = fluid_id
|
||||
@@ -35,3 +47,36 @@
|
||||
if(linked_organ)
|
||||
linked_organ.fluid_id = source_gen.get_fluid_id()
|
||||
target.clear_reagents()
|
||||
|
||||
/obj/item/organ/genital/penis/splash_cum(mob/living/carbon/human/orgasming, target_orifice, atom/partner, cumin, genital)
|
||||
. = ..()
|
||||
if(!. || !linked_organ)
|
||||
return
|
||||
|
||||
// determine size stage
|
||||
var/length_multiplier = 0
|
||||
switch(round(length * get_size(owner)))
|
||||
if(16 to 32)
|
||||
length_multiplier = 1
|
||||
if(32 to INFINITY)
|
||||
length_multiplier = 2
|
||||
else
|
||||
return
|
||||
|
||||
// get affected objects
|
||||
var/turf/target_turf = owner.loc
|
||||
var/list/atom/cumsplashed_items = list()
|
||||
if(!istype(target_turf))
|
||||
return
|
||||
for(var/i in 0 to length_multiplier)
|
||||
target_turf = get_step(target_turf, owner.dir)
|
||||
for(var/object in target_turf.contents)
|
||||
if(isturf(object))
|
||||
continue
|
||||
LAZYADD(cumsplashed_items, object)
|
||||
if(cumsplashed_items.len)
|
||||
break
|
||||
|
||||
// splash affected objects
|
||||
for(var/atom/object in cumsplashed_items)
|
||||
object.add_cum_overlay(initial(linked_organ.fluid_id.color), length_multiplier > 1 ? TRUE : FALSE)
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/obj/item/organ/genital/vagina/Insert(mob/living/carbon/M, special, drop_if_replaced)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
RegisterSignal(owner, COMSIG_MOB_CAME, .proc/splash_cum)
|
||||
|
||||
/obj/item/organ/genital/vagina/Remove(special)
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/C = .
|
||||
if(!QDELETED(C))
|
||||
UnregisterSignal(C, COMSIG_MOB_CAME)
|
||||
|
||||
/obj/item/organ/genital/vagina/splash_cum(mob/living/carbon/human/orgasming, target_orifice, atom/partner, cumin, genital)
|
||||
. = ..()
|
||||
if(!. || !linked_organ)
|
||||
return
|
||||
|
||||
if(get_size(owner) < 1.25)
|
||||
return
|
||||
|
||||
// get target objects
|
||||
var/turf/target_turf = get_turf(owner)
|
||||
if(!istype(target_turf))
|
||||
return
|
||||
|
||||
// splash affected objects
|
||||
for(var/atom/object in target_turf.contents)
|
||||
if(!istype(object) || isturf(object) || object == owner)
|
||||
continue
|
||||
object.add_cum_overlay(initial(linked_organ.fluid_id.color), get_size(owner) >= 1.5)
|
||||
@@ -5,7 +5,7 @@
|
||||
attack_verb = list("penetrated", "slapped", "gaped", "prolapsed", "inseminated", "destroyed", "broke", "demolished", "whacked")
|
||||
|
||||
/obj/item/dildo/flared/gigantic/suicide_act(mob/living/user)
|
||||
if(do_after(user,45,target=src))
|
||||
if(do_after(user, 45, target=src))
|
||||
user.visible_message(span_suicide("[user] tears-up and gags as they try to deepthroat the [src]! WHY WOULD THEY DO THAT? It looks like [user.p_theyre()] trying to commit suicide!!"))
|
||||
playsound(loc, 'sound/weapons/gagging.ogg', 50, 2, -1)
|
||||
user.Stun(400)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/supply_pack/emergency/radiatione_emergency_bikini
|
||||
name = "Emergenc Beach Radiation Protection Crate"
|
||||
name = "Emergency Beach Radiation Protection Crate"
|
||||
desc = "Survive(?) the Nuclear Summer and Supermatter Engine alike with two sets of Radkinis. Each set contains a mask, bikini, and Geiger counter. We'll even throw in a few pill bottles that are able to handles radiation and the affects of the poisoning."
|
||||
cost = 2000
|
||||
contains = list(/obj/item/clothing/mask/gas/radmask,
|
||||
|
||||
@@ -111,13 +111,13 @@
|
||||
contains = list( /obj/item/gunpart/riflebrush2stock, /obj/item/gunpart/riflebrush2barrel, /obj/item/ammo_box/g45l)
|
||||
|
||||
/datum/supply_pack/goody/revolver45_single
|
||||
name = ".45 Reolver Single-Pack"
|
||||
name = ".45 Revolver Single-Pack"
|
||||
desc = "Contains a parts kit to assemble a 45 Revolver Gun. Comes with a box of .45 Long"
|
||||
cost = 800
|
||||
contains = list( /obj/item/gunpart/revolver45cylinder, /obj/item/gunpart/revolver45frame, /obj/item/ammo_box/g45l)
|
||||
|
||||
/datum/supply_pack/goody/huntingshotgun_single
|
||||
name = "Hunting Shotgun Single-Pack"
|
||||
desc = "Contains a parts kit to assemble a hutning shotgun."
|
||||
desc = "Contains a parts kit to assemble a hunting shotgun."
|
||||
cost = 1700
|
||||
contains = list(/obj/item/gunpart/shotgunhutningstock, /obj/item/gunpart/shotgunhutningbarrel, /obj/item/storage/box/lethalshot)
|
||||
|
||||
@@ -576,3 +576,133 @@
|
||||
/obj/item/cane/plague
|
||||
)
|
||||
crate_name = "plague doctor crate"
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_cloaks_vr
|
||||
name = "Teshari cloaks"
|
||||
|
||||
contains = list(
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/white,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/white_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/red_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/orange_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/yellow_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/green_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/blue_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/purple_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/pink_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/brown_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/rainbow,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/orange
|
||||
)
|
||||
cost = 40
|
||||
|
||||
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_cloaks_b_vr
|
||||
name = "Teshari cloaks (black)"
|
||||
|
||||
contains = list(
|
||||
/obj/item/clothing/neck/cloak/teshari,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_red,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_orange,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_yellow,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_green,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_blue,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_purple,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_pink,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_brown,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_grey,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_white,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_glow,
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/dark_retrowave
|
||||
)
|
||||
cost = 40
|
||||
|
||||
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_beltcloaks_vr
|
||||
name = "Teshari cloaks (belted)"
|
||||
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/orange_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/rainbow,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/lightgrey_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/white_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/red_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/orange,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/yellow_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/green_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/blue_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/purple_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/pink_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/brown_grey
|
||||
)
|
||||
cost = 40
|
||||
|
||||
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_beltcloaks_b_vr
|
||||
name = "Teshari cloaks (belted, black)"
|
||||
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_orange,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_midgrey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_lightgrey,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_white,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_red,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_yellow,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_green,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_blue,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_purple,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_pink,
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_brown
|
||||
)
|
||||
cost = 40
|
||||
|
||||
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_hoodcloaks_vr
|
||||
name = "Teshari cloaks (hooded)"
|
||||
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/orange_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/lightgrey_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/white_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/red_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/orange,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/yellow_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/green_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/blue_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/purple_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/pink_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/brown_grey
|
||||
)
|
||||
cost = 40
|
||||
|
||||
|
||||
|
||||
/datum/supply_pack/randomised/costumes/tesh_hoodcloaks_b_vr
|
||||
name = "Teshari cloaks (hooded, black)"
|
||||
|
||||
contains = list(
|
||||
/obj/item/clothing/suit/hooded/teshari,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_orange,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_grey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_midgrey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_lightgrey,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_white,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_red,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_yellow,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_green,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_blue,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_purple,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_pink,
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_brown
|
||||
)
|
||||
cost = 40
|
||||
|
||||
|
||||
|
||||
@@ -13,6 +13,12 @@
|
||||
ckeywhitelist = list()
|
||||
donator_group_id = DONATOR_GROUP_TIER_1
|
||||
|
||||
/datum/gear/donator/uniform/chameleon
|
||||
name = "Chameleon suit"
|
||||
path = /obj/item/clothing/under/chameleon
|
||||
ckeywhitelist = list()
|
||||
donator_group_id = DONATOR_GROUP_TIER_1
|
||||
|
||||
//Head
|
||||
/datum/gear/donator/head/crown/fancy
|
||||
name = "magnificent crown"
|
||||
|
||||
@@ -52,3 +52,35 @@
|
||||
path = /obj/item/clothing/neck/petcollar/poly
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#00bb70", "#FFC600")
|
||||
|
||||
/datum/gear/neck/teshari
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION
|
||||
|
||||
/datum/gear/neck/teshari/standard
|
||||
name = "Teshari Cloak"
|
||||
path = /obj/item/clothing/neck/cloak/teshari
|
||||
|
||||
|
||||
/datum/gear/neck/teshari/black_red
|
||||
name = "Teshari Cloak Black Red"
|
||||
path = /obj/item/clothing/neck/cloak/teshari/standard/black_red
|
||||
|
||||
/datum/gear/neck/teshari/white
|
||||
name = "Teshari Cloak White"
|
||||
path = /obj/item/clothing/neck/cloak/teshari/standard/white
|
||||
|
||||
/datum/gear/neck/teshari/rainbow
|
||||
name = "Teshari Cloak Rainbow"
|
||||
path = /obj/item/clothing/neck/cloak/teshari/standard/rainbow
|
||||
|
||||
/datum/gear/neck/teshari/orange
|
||||
name = "Teshari Cloak orange"
|
||||
path = /obj/item/clothing/neck/cloak/teshari/standard/orange
|
||||
|
||||
/datum/gear/neck/teshari/dark_retrowave
|
||||
name = "Teshari Cloak Dark Retrowave"
|
||||
path = /obj/item/clothing/neck/cloak/teshari/standard/dark_retrowave
|
||||
|
||||
/datum/gear/neck/teshari/black_glow
|
||||
name = "Teshari Cloak Dark Black Glow"
|
||||
path = /obj/item/clothing/neck/cloak/teshari/standard/black_glow
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
/datum/outfit/vox
|
||||
name = "Vox"
|
||||
r_hand = /obj/item/tank/internals/plasmaman/belt/full
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
@@ -50,3 +50,713 @@
|
||||
|
||||
. = ..()
|
||||
*/
|
||||
|
||||
// Standard Cloaks
|
||||
/obj/item/clothing/neck/cloak/teshari
|
||||
name = "black cloak"
|
||||
desc = "It drapes over a Teshari's shoulders and closes at the neck with pockets convienently placed inside."
|
||||
icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi'
|
||||
icon_state = "tesh_cloak_bn"
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_red
|
||||
name = "black and red cloak"
|
||||
icon_state = "tesh_cloak_br"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_orange
|
||||
name = "black and orange cloak"
|
||||
icon_state = "tesh_cloak_bo"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_yellow
|
||||
name = "black and yellow cloak"
|
||||
icon_state = "tesh_cloak_by"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_green
|
||||
name = "black and green cloak"
|
||||
icon_state = "tesh_cloak_bgr"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_blue
|
||||
name = "black and blue cloak"
|
||||
icon_state = "tesh_cloak_bbl"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_purple
|
||||
name = "black and purple cloak"
|
||||
icon_state = "tesh_cloak_bp"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_pink
|
||||
name = "black and pink cloak"
|
||||
icon_state = "tesh_cloak_bpi"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_brown
|
||||
name = "black and brown cloak"
|
||||
icon_state = "tesh_cloak_bbr"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_grey
|
||||
name = "black and grey cloak"
|
||||
icon_state = "tesh_cloak_bg"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_white
|
||||
name = "black and white cloak"
|
||||
icon_state = "tesh_cloak_bw"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/white
|
||||
name = "white cloak"
|
||||
icon_state = "tesh_cloak_wn"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/white_grey
|
||||
name = "white and grey cloak"
|
||||
icon_state = "tesh_cloak_wg"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/red_grey
|
||||
name = "red and grey cloak"
|
||||
icon_state = "tesh_cloak_rg"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/orange_grey
|
||||
name = "orange and grey cloak"
|
||||
icon_state = "tesh_cloak_og"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/yellow_grey
|
||||
name = "yellow and grey cloak"
|
||||
icon_state = "tesh_cloak_yg"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/green_grey
|
||||
name = "green and grey cloak"
|
||||
icon_state = "tesh_cloak_gg"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/blue_grey
|
||||
name = "blue and grey cloak"
|
||||
icon_state = "tesh_cloak_blug"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/purple_grey
|
||||
name = "purple and grey cloak"
|
||||
icon_state = "tesh_cloak_pg"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/pink_grey
|
||||
name = "pink and grey cloak"
|
||||
icon_state = "tesh_cloak_pig"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/brown_grey
|
||||
name = "brown and grey cloak"
|
||||
icon_state = "tesh_cloak_brg"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/rainbow
|
||||
name = "rainbow cloak"
|
||||
icon_state = "tesh_cloak_rainbow"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/orange
|
||||
name = "orange cloak"
|
||||
icon_state = "tesh_cloak_on"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/dark_retrowave
|
||||
name = "dark aesthetic cloak"
|
||||
icon_state = "tesh_cloak_dretrowave"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/standard/black_glow
|
||||
name = "black and glowing cloak"
|
||||
icon_state = "tesh_cloak_bglowing"
|
||||
|
||||
|
||||
// Job Cloaks
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/cap
|
||||
name = "site manager cloak"
|
||||
desc = "A soft Teshari cloak made for the Site Manager"
|
||||
icon_state = "tesh_cloak_cap"
|
||||
|
||||
//Cargo
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/qm
|
||||
name = "quartermaster cloak"
|
||||
desc = "A soft Teshari cloak made for the Quartermaster"
|
||||
icon_state = "tesh_cloak_qm"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/cargo
|
||||
name = "cargo cloak"
|
||||
desc = "A soft Teshari cloak made for the Cargo department"
|
||||
icon_state = "tesh_cloak_car"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/mining
|
||||
name = "mining cloak"
|
||||
desc = "A soft Teshari cloak made for Mining"
|
||||
icon_state = "tesh_cloak_mine"
|
||||
|
||||
//Engineering
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/ce
|
||||
name = "cheif engineer cloak"
|
||||
desc = "A soft Teshari cloak made the Chief Engineer"
|
||||
icon_state = "tesh_cloak_ce"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/engineer
|
||||
name = "engineering cloak"
|
||||
desc = "A soft Teshari cloak made for the Engineering department"
|
||||
icon_state = "tesh_cloak_engie"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/atmos
|
||||
name = "atmospherics cloak"
|
||||
desc = "A soft Teshari cloak made for the Atmospheric Technician"
|
||||
icon_state = "tesh_cloak_atmos"
|
||||
|
||||
//Medical
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/cmo
|
||||
name = "chief medical officer cloak"
|
||||
desc = "A soft Teshari cloak made the Cheif Medical Officer"
|
||||
icon_state = "tesh_cloak_cmo"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/medical
|
||||
name = "medical cloak"
|
||||
desc = "A soft Teshari cloak made for the Medical department"
|
||||
icon_state = "tesh_cloak_doc"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/chemistry
|
||||
name = "chemist cloak"
|
||||
desc = "A soft Teshari cloak made for the Chemist"
|
||||
icon_state = "tesh_cloak_chem"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/viro
|
||||
name = "virologist cloak"
|
||||
desc = "A soft Teshari cloak made for the Virologist"
|
||||
icon_state = "tesh_cloak_viro"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/para
|
||||
name = "paramedic cloak"
|
||||
desc = "A soft Teshari cloak made for the Paramedic"
|
||||
icon_state = "tesh_cloak_para"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/psych
|
||||
name = " psychiatrist cloak"
|
||||
desc = "A soft Teshari cloak made for the Psychiatrist"
|
||||
icon_state = "tesh_cloak_psych"
|
||||
|
||||
//Science
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/rd
|
||||
name = "research director cloak"
|
||||
desc = "A soft Teshari cloak made for the Research Director"
|
||||
icon_state = "tesh_cloak_rd"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/sci
|
||||
name = "scientist cloak"
|
||||
desc = "A soft Teshari cloak made for the Science department"
|
||||
icon_state = "tesh_cloak_sci"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/robo
|
||||
name = "roboticist cloak"
|
||||
desc = "A soft Teshari cloak made for the Roboticist"
|
||||
icon_state = "tesh_cloak_robo"
|
||||
|
||||
//Security
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/hos
|
||||
name = "head of security cloak"
|
||||
desc = "A soft Teshari cloak made for the Head of Security"
|
||||
icon_state = "tesh_cloak_hos"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/sec
|
||||
name = "security cloak"
|
||||
desc = "A soft Teshari cloak made for the Security department"
|
||||
icon_state = "tesh_cloak_sec"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/iaa
|
||||
name = "internal affairs cloak"
|
||||
desc = "A soft Teshari cloak made for the Internal Affairs Agent"
|
||||
icon_state = "tesh_cloak_iaa"
|
||||
|
||||
//Service
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/hop
|
||||
name = "head of personnel cloak"
|
||||
desc = "A soft Teshari cloak made for the Head of Personnel"
|
||||
icon_state = "tesh_cloak_hop"
|
||||
|
||||
/obj/item/clothing/neck/cloak/teshari/jobs/service
|
||||
name = "service cloak"
|
||||
desc = "A soft Teshari cloak made for the Service department"
|
||||
icon_state = "tesh_cloak_serv"
|
||||
|
||||
//Misc
|
||||
|
||||
/obj/item/clothing/suit/hooded/toggle/labcoat/teshari
|
||||
name = "Teshari labcoat"
|
||||
desc = "A small suit that protects against minor chemical spills. This one is a good fit on Teshari."
|
||||
icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi'
|
||||
icon_state = "tesh_labcoat"
|
||||
|
||||
|
||||
/obj/item/clothing/suit/hooded/toggle/tesharicoat
|
||||
name = "small black coat"
|
||||
desc = "A coat that seems too small to fit a human."
|
||||
icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi'
|
||||
icon_state = "tesharicoat"
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/suit/hooded/toggle/tesharicoatwhite
|
||||
name = "small coat"
|
||||
desc = "A coat that seems too small to fit a human."
|
||||
icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi'
|
||||
icon_state = "tesharicoatwhite"
|
||||
|
||||
|
||||
|
||||
//Hooded teshari cloaks
|
||||
/obj/item/clothing/suit/hooded/teshari
|
||||
name = "Hooded Teshari Cloak"
|
||||
desc = "A soft teshari cloak with an added hood."
|
||||
icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi'
|
||||
icon_state = "tesh_hcloak_bo"
|
||||
|
||||
|
||||
|
||||
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood
|
||||
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood
|
||||
name = "Cloak Hood"
|
||||
desc = "A hood attached to a teshari cloak."
|
||||
icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi'
|
||||
//default_worn_icon = 'icons/inventory/suit/mob_teshari.dmi'
|
||||
icon_state = "tesh_hood_bo"
|
||||
|
||||
|
||||
|
||||
body_parts_covered = HEAD
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_orange
|
||||
name = "black and orange hooded cloak"
|
||||
icon_state = "tesh_hcloak_bo"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_orange
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_grey
|
||||
name = "black and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_bg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_grey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_midgrey
|
||||
name = "black and medium grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_bmg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_midgrey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_lightgrey
|
||||
name = "black and light grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_blg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_lightgrey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_white
|
||||
name = "black and white hooded cloak"
|
||||
icon_state = "tesh_hcloak_bw"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_white
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_red
|
||||
name = "black and red hooded cloak"
|
||||
icon_state = "tesh_hcloak_br"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_red
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black
|
||||
name = "black hooded cloak"
|
||||
icon_state = "tesh_hcloak_bn"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_yellow
|
||||
name = "black and yellow hooded cloak"
|
||||
icon_state = "tesh_hcloak_by"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_yellow
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_green
|
||||
name = "black and green hooded cloak"
|
||||
icon_state = "tesh_hcloak_bgr"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_green
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_blue
|
||||
name = "black and blue hooded cloak"
|
||||
icon_state = "tesh_hcloak_bbl"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_blue
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_purple
|
||||
name = "black and purple hooded cloak"
|
||||
icon_state = "tesh_hcloak_bp"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_purple
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_pink
|
||||
name = "black and pink hooded cloak"
|
||||
icon_state = "tesh_hcloak_bpi"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_pink
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/black_brown
|
||||
name = "black and brown hooded cloak"
|
||||
icon_state = "tesh_hcloak_bbr"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/black_brown
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/orange_grey
|
||||
name = "orange and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_og"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/orange_grey
|
||||
|
||||
///obj/item/clothing/suit/hooded/teshari/standard/rainbow
|
||||
// name = "rainbow hooded cloak"
|
||||
// icon_state = "tesh_hcloak_rainbow"
|
||||
// hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/rainbow
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/lightgrey_grey
|
||||
name = "light grey and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_lgg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/lightgrey_grey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/white_grey
|
||||
name = "white and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_wg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/white_grey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/red_grey
|
||||
name = "red and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_rg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/red_grey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/orange
|
||||
name = "orange hooded cloak"
|
||||
icon_state = "tesh_hcloak_on"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/orange
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/yellow_grey
|
||||
name = "yellow and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_yg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/yellow_grey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/green_grey
|
||||
name = "green and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_gg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/green_grey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/blue_grey
|
||||
name = "blue and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_blug"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/blue_grey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/purple_grey
|
||||
name = "purple and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_pg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/purple_grey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/pink_grey
|
||||
name = "pink and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_pig"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/pink_grey
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/standard/brown_grey
|
||||
name = "brown and grey hooded cloak"
|
||||
icon_state = "tesh_hcloak_brg"
|
||||
hoodtype = /obj/item/clothing/head/hooded/tesh_hood/standard/brown_grey
|
||||
|
||||
//The actual hoods
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_orange
|
||||
name = "black and orange cloak hood"
|
||||
icon_state = "tesh_hood_bo"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_grey
|
||||
name = "black and grey cloak hood"
|
||||
icon_state = "tesh_hood_bg"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_midgrey
|
||||
name = "black and medium grey cloak hood"
|
||||
icon_state = "tesh_hood_bmg"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_lightgrey
|
||||
name = "black and light grey cloak hood"
|
||||
icon_state = "tesh_hood_blg"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_white
|
||||
name = "black and white cloak hood"
|
||||
icon_state = "tesh_hood_bw"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_red
|
||||
name = "black and red cloak hood"
|
||||
icon_state = "tesh_hood_br"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black
|
||||
name = "black cloak hood"
|
||||
icon_state = "tesh_hood_bn"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_yellow
|
||||
name = "black and yellow cloak hood"
|
||||
icon_state = "tesh_hood_by"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_green
|
||||
name = "black and green cloak hood"
|
||||
icon_state = "tesh_hood_bgr"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_blue
|
||||
name = "black and blue cloak hood"
|
||||
icon_state = "tesh_hood_bbl"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_purple
|
||||
name = "black and purple cloak hood"
|
||||
icon_state = "tesh_hood_bp"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_pink
|
||||
name = "black and pink cloak hood"
|
||||
icon_state = "tesh_hood_bpi"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/black_brown
|
||||
name = "black and brown cloak hood"
|
||||
icon_state = "tesh_hood_bbr"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/orange_grey
|
||||
name = "orange and grey cloak hood"
|
||||
icon_state = "tesh_hood_og"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/rainbow
|
||||
name = "rainbow cloak hood"
|
||||
icon_state = "tesh_hood_rainbow"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/lightgrey_grey
|
||||
name = "light grey and grey cloak hood"
|
||||
icon_state = "tesh_hood_lgg"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/white_grey
|
||||
name = "white and grey cloak hood"
|
||||
icon_state = "tesh_hood_wg"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/red_grey
|
||||
name = "red and grey cloak hood"
|
||||
icon_state = "tesh_hood_rg"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/orange
|
||||
name = "orange cloak hood"
|
||||
icon_state = "tesh_hood_on"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/yellow_grey
|
||||
name = "yellow and grey cloak hood"
|
||||
icon_state = "tesh_hood_yg"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/green_grey
|
||||
name = "green and grey cloak hood"
|
||||
icon_state = "tesh_hood_gg"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/blue_grey
|
||||
name = "blue and grey cloak hood"
|
||||
icon_state = "tesh_hood_blug"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/purple_grey
|
||||
name = "purple and grey cloak hood"
|
||||
icon_state = "tesh_hood_pg"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/pink_grey
|
||||
name = "pink and grey cloak hood"
|
||||
icon_state = "tesh_hood_pig"
|
||||
|
||||
/obj/item/clothing/head/hooded/tesh_hood/standard/brown_grey
|
||||
name = "brown and grey cloak hood"
|
||||
icon_state = "tesh_hood_brg"
|
||||
|
||||
//Belted cloaks
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak
|
||||
name = "belted cloak"
|
||||
desc = "A more ridged and stylized Teshari cloak."
|
||||
icon = 'modular_splurt/icons/mob/clothing/species/teshari/tesh_items.dmi'
|
||||
icon_state = "tesh_beltcloak_bo"
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_orange
|
||||
name = "black belted cloak (orange)"
|
||||
icon_state = "tesh_beltcloak_bo"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_grey
|
||||
name = "black belted cloak"
|
||||
icon_state = "tesh_beltcloak_bg"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_midgrey
|
||||
name = "black belted cloak (medium grey)"
|
||||
icon_state = "tesh_beltcloak_bmg"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_lightgrey
|
||||
name = "black belted cloak (light grey)"
|
||||
icon_state = "tesh_beltcloak_blg"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_white
|
||||
name = "black belted cloak (white)"
|
||||
icon_state = "tesh_beltcloak_bw"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_red
|
||||
name = "black belted cloak (red)"
|
||||
icon_state = "tesh_beltcloak_br"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black
|
||||
name = "black simple belted cloak"
|
||||
icon_state = "tesh_beltcloak_bn"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_yellow
|
||||
name = "black belted cloak (yellow)"
|
||||
icon_state = "tesh_beltcloak_by"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_green
|
||||
name = "black belted cloak (green)"
|
||||
icon_state = "tesh_beltcloak_bgr"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_blue
|
||||
name = "black belted cloak (blue)"
|
||||
icon_state = "tesh_beltcloak_bbl"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_purple
|
||||
name = "black belted cloak (purple)"
|
||||
icon_state = "tesh_beltcloak_bp"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_pink
|
||||
name = "black belted cloak (pink)"
|
||||
icon_state = "tesh_beltcloak_bpi"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/black_brown
|
||||
name = "black belted cloak (brown)"
|
||||
icon_state = "tesh_beltcloak_bbr"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/orange_grey
|
||||
name = "orange belted cloak"
|
||||
icon_state = "tesh_beltcloak_og"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/rainbow
|
||||
name = "rainbow belted cloak"
|
||||
icon_state = "tesh_beltcloak_rainbow"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/lightgrey_grey
|
||||
name = "light grey belted cloak"
|
||||
icon_state = "tesh_beltcloak_lgg"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/white_grey
|
||||
name = "white belted cloak"
|
||||
icon_state = "tesh_beltcloak_wg"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/red_grey
|
||||
name = "red belted cloak"
|
||||
icon_state = "tesh_beltcloak_rg"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/orange
|
||||
name = "orange simple belted cloak"
|
||||
icon_state = "tesh_beltcloak_on"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/yellow_grey
|
||||
name = "yellow belted cloak"
|
||||
icon_state = "tesh_beltcloak_yg"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/green_grey
|
||||
name = "green belted cloak"
|
||||
icon_state = "tesh_beltcloak_gg"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/blue_grey
|
||||
name = "blue belted cloak"
|
||||
icon_state = "tesh_beltcloak_blug"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/purple_grey
|
||||
name = "purple belted cloak"
|
||||
icon_state = "tesh_beltcloak_pg"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/pink_grey
|
||||
name = "pink belted cloak"
|
||||
icon_state = "tesh_beltcloak_pig"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/standard/brown_grey
|
||||
name = "brown belted cloak"
|
||||
icon_state = "tesh_beltcloak_brg"
|
||||
|
||||
//Belted job cloaks
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/cargo
|
||||
name = "cargo belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Cargo department"
|
||||
icon_state = "tesh_beltcloak_car"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/mining
|
||||
name = "mining belted cloak"
|
||||
desc = "A soft Teshari cloak made for Mining"
|
||||
icon_state = "tesh_beltcloak_mine"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/command
|
||||
name = "command belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Command department"
|
||||
icon_state = "tesh_beltcloak_comm"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/ce
|
||||
name = "chief engineer belted cloak"
|
||||
desc = "A soft Teshari cloak made the Chief Engineer"
|
||||
icon_state = "tesh_beltcloak_ce"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/engineer
|
||||
name = "engineering belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Engineering department"
|
||||
icon_state = "tesh_beltcloak_engie"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/atmos
|
||||
name = "atmospherics belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Atmospheric Technician"
|
||||
icon_state = "tesh_beltcloak_atmos"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/cmo
|
||||
name = "chief medical officer belted cloak"
|
||||
desc = "A soft Teshari cloak made the Chief Medical Officer"
|
||||
icon_state = "tesh_beltcloak_cmo"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/medical
|
||||
name = "medical belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Medical department"
|
||||
icon_state = "tesh_beltcloak_doc"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/chemistry
|
||||
name = "chemist belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Chemist"
|
||||
icon_state = "tesh_beltcloak_chem"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/viro
|
||||
name = "virologist belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Virologist"
|
||||
icon_state = "tesh_beltcloak_viro"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/para
|
||||
name = "paramedic belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Paramedic"
|
||||
icon_state = "tesh_beltcloak_para"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/sci
|
||||
name = "scientist belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Science department"
|
||||
icon_state = "tesh_beltcloak_sci"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/robo
|
||||
name = "roboticist belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Roboticist"
|
||||
icon_state = "tesh_beltcloak_robo"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/sec
|
||||
name = "security belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Security department"
|
||||
icon_state = "tesh_beltcloak_sec"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/qm
|
||||
name = "quartermaster belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Quartermaster"
|
||||
icon_state = "tesh_beltcloak_qm"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/service
|
||||
name = "service belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Service department"
|
||||
icon_state = "tesh_beltcloak_serv"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/iaa
|
||||
name = "internal affairs belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Internal Affairs Agent"
|
||||
icon_state = "tesh_beltcloak_iaa"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/wrdn
|
||||
name = "warden belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Warden"
|
||||
icon_state = "tesh_beltcloak_wrdn"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/hos
|
||||
name = "security chief belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Head of Security"
|
||||
icon_state = "tesh_beltcloak_hos"
|
||||
|
||||
/obj/item/clothing/suit/hooded/teshari/beltcloak/jobs/jani
|
||||
name = "janitor belted cloak"
|
||||
desc = "A soft Teshari cloak made for the Janitor"
|
||||
icon_state = "tesh_beltcloak_jani"
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
/datum/crafting_recipe/hudsunsec
|
||||
parts = list()
|
||||
|
||||
/datum/crafting_recipe/hudsunmed
|
||||
parts = list()
|
||||
|
||||
/datum/crafting_recipe/diagnostic_sunglasses
|
||||
parts = list()
|
||||
|
||||
/datum/crafting_recipe/secpatch
|
||||
parts = list()
|
||||
|
||||
/datum/crafting_recipe/medpatch
|
||||
parts = list()
|
||||
|
||||
/datum/crafting_recipe/diagpatch
|
||||
parts = list()
|
||||
|
||||
/datum/crafting_recipe/mesonpatch
|
||||
parts = list()
|
||||
@@ -301,3 +301,49 @@
|
||||
)
|
||||
mix_message = "The lights flicker for a moment..."
|
||||
mix_sound = 'sound/weapons/taser.ogg'
|
||||
|
||||
/datum/chemical_reaction/twinkjuice
|
||||
name = "Twink Juice"
|
||||
id = /datum/reagent/consumable/ethanol/twinkjuice
|
||||
results = list(/datum/reagent/consumable/ethanol/twinkjuice = 6)
|
||||
required_reagents = list(
|
||||
/datum/reagent/consumable/ethanol/vodka = 3,
|
||||
/datum/reagent/consumable/berryjuice = 2,
|
||||
/datum/reagent/lube = 1
|
||||
)
|
||||
mix_message = "Oooo you like kissing booooys"
|
||||
mix_sound = 'modular_splurt/sound/voice/waa.ogg'
|
||||
|
||||
/datum/chemical_reaction/midnight_tears
|
||||
name = "Midnight Tears"
|
||||
id = /datum/reagent/consumable/ethanol/midnight_tears
|
||||
results = list(/datum/reagent/consumable/ethanol/midnight_tears = 20)
|
||||
required_reagents = list(
|
||||
/datum/reagent/consumable/ethanol/rum = 3,
|
||||
/datum/reagent/consumable/ethanol/curacao = 5,
|
||||
/datum/reagent/consumable/sugar = 1,
|
||||
/datum/reagent/consumable/sodawater = 15
|
||||
)
|
||||
|
||||
/datum/chemical_reaction/midnight_sky
|
||||
name = "Midnight Sky"
|
||||
id = /datum/reagent/consumable/ethanol/midnight_sky
|
||||
results = list(/datum/reagent/consumable/ethanol/midnight_sky = 25)
|
||||
required_reagents = list(
|
||||
/datum/reagent/consumable/ethanol/navy_rum = 3,
|
||||
/datum/reagent/consumable/ethanol/curacao = 2,
|
||||
/datum/reagent/consumable/sugar = 2,
|
||||
/datum/reagent/consumable/space_cola = 15,
|
||||
/datum/reagent/consumable/ice = 2
|
||||
)
|
||||
|
||||
/datum/chemical_reaction/midnight_joy
|
||||
name = "Midnight Joy"
|
||||
id = /datum/reagent/consumable/ethanol/midnight_joy
|
||||
results = list(/datum/reagent/consumable/ethanol/midnight_joy = 25)
|
||||
required_reagents = list(
|
||||
/datum/reagent/consumable/ethanol/rum = 3,
|
||||
/datum/reagent/consumable/pineapplejuice = 5,
|
||||
/datum/reagent/consumable/sugar = 1,
|
||||
/datum/reagent/consumable/sodawater = 15
|
||||
)
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/obj/effect/mob_spawn/human/ghostcafeVR/special(mob/living/carbon/human/new_spawn)
|
||||
if(new_spawn.client)
|
||||
new_spawn.client.prefs.copy_to(new_spawn)
|
||||
var/datum/outfit/O = new /datum/outfit/ghostcafeVR()
|
||||
O.equip(new_spawn, FALSE, new_spawn.client)
|
||||
SSjob.equip_loadout(null, new_spawn)
|
||||
SSjob.post_equip_loadout(null, new_spawn)
|
||||
SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn)
|
||||
ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT)
|
||||
ADD_TRAIT(new_spawn, TRAIT_EXEMPT_HEALTH_EVENTS, GHOSTROLE_TRAIT)
|
||||
ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still eligible for ghost roles popups.
|
||||
|
||||
/datum/outfit/ghostcafeVR
|
||||
name = "ID, jumpsuit and shoes"
|
||||
uniform = /obj/item/clothing/under/color/random
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
|
||||
/datum/outfit/ghostcafeVR/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
..()
|
||||
if (isplasmaman(H))
|
||||
head = /obj/item/clothing/head/helmet/space/plasmaman
|
||||
uniform = /obj/item/clothing/under/plasmaman
|
||||
l_hand= /obj/item/tank/internals/plasmaman/belt/full
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
return
|
||||
|
||||
/datum/outfit/ghostcafeVR/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
|
||||
H.internal = H.get_item_for_held_index(1)
|
||||
H.update_internals_hud_icon(1)
|
||||
|
||||
/obj/effect/mob_spawn/human/ghostcafeVR
|
||||
name = "Ghost Cafe VR Sleeper"
|
||||
uses = -1
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
mob_name = "a ghost cafe VR visitor"
|
||||
roundstart = FALSE
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
death = FALSE
|
||||
assignedrole = "Ghost Cafe VR Visitor"
|
||||
short_desc = "You are a Ghost Cafe VR Visitor!"
|
||||
flavour_text = "You know one thing for sure. You arent actually alive. Are you in a simulation?"
|
||||
skip_reentry_check = TRUE
|
||||
banType = ROLE_GHOSTCAFE
|
||||
@@ -2,6 +2,18 @@
|
||||
/obj/effect/holodeck_effect/mobspawner/funclaw
|
||||
mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/gentle
|
||||
|
||||
/obj/effect/holodeck_effect/mobspawner/alphaclaw
|
||||
mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/gentle/newclaw/alphaclaw
|
||||
|
||||
/obj/effect/holodeck_effect/mobspawner/newclaw
|
||||
mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/gentle/newclaw
|
||||
|
||||
/obj/effect/holodeck_effect/mobspawner/femclaw
|
||||
mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/femclaw
|
||||
|
||||
/obj/effect/holodeck_effect/mobspawner/bigmommyclaw
|
||||
mobtype = /mob/living/simple_animal/hostile/deathclaw/funclaw/femclaw/mommyclaw
|
||||
|
||||
// Holodeck mob: Friendly Bee
|
||||
/obj/effect/holodeck_effect/mobspawner/bumbles
|
||||
mobtype = /mob/living/simple_animal/pet/bumbles
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
/datum/language_holder/synthetic/New()
|
||||
. = ..()
|
||||
understood_languages += list(/datum/language/schechi = list(LANGUAGE_ATOM))
|
||||
spoken_languages += list(/datum/language/schechi = list(LANGUAGE_ATOM))
|
||||
@@ -0,0 +1,17 @@
|
||||
/// Takes in a type path, locates an instance of that type in the cached map, and calculates its offset from the origin of the map, returns this offset in the form list(x, y).
|
||||
/datum/map_template/proc/discover_offset(obj/marker)
|
||||
var/key
|
||||
var/list/models = cached_map.grid_models
|
||||
for(key in models)
|
||||
if(findtext(models[key], "[marker]")) // Yay compile time checks
|
||||
break // This works by assuming there will ever only be one mobile dock in a template at most
|
||||
|
||||
for(var/datum/grid_set/gset as anything in cached_map.gridSets)
|
||||
var/ycrd = gset.ycrd
|
||||
for(var/line in gset.gridLines)
|
||||
var/xcrd = gset.xcrd
|
||||
for(var/j in 1 to length(line) step cached_map.key_len)
|
||||
if(key == copytext(line, j, j + cached_map.key_len))
|
||||
return list(xcrd, ycrd)
|
||||
++xcrd
|
||||
--ycrd
|
||||
@@ -0,0 +1,132 @@
|
||||
# Modular Map Loader
|
||||
|
||||
## Concept
|
||||
|
||||
Modular map loading is a system to allow maps to be generated with random variants by selecting from a set of pre-made modules. The system is designed to be as simple as possible for mappers to use, with a minimum of interaction with the code required.
|
||||
|
||||
## Implementation
|
||||
|
||||
### /obj/modular_map_root
|
||||
|
||||
This root object handled picking and loading in map modules. It has two variables, and one proc.
|
||||
|
||||
* `var/config_file` - A string, points to a TOML configuration file, which is used to hold the information necessary to pull the correct map files and place them on the correct roots. This will be the same for all roots on a map.
|
||||
* `var/key` - A string, used to pull a list of `.dmm` files from the configuration file.
|
||||
* `load_map()` - Called asynchronously in the root's `Initialize()`. This proc creates a new instance of `/datum/map_template/map_module`, ingests the configuration file `config_file` points to, and picks a `.dmm` file path which maps to the root's `key`, by picking a random filename from among those which `key` maps to, and appending it to a folder path. This file path is passed into the map templace instance's `load()`, and the template takes over.
|
||||
|
||||
INITIALIZE_IMMEDIATE is used to ensure the ruins are loaded at the right time to avoid runtime errors related to lighting.
|
||||
|
||||
### /datum/map_template/map_module
|
||||
|
||||
This map templace subtype is responsible for loading in the module, it has two variables and two relevant procs.
|
||||
|
||||
* `var/x_offset` and `var/y_offset` - Integers, used to store the offsets used to correctly align the module when it is loaded.
|
||||
* `load()` - Extends the functionality of the general map template's `load()` to allow a map to be specified at runtime. This means `preload_size()` must be called again here as the template's map file has been changed. The origin turf for the map to be loaded from is set using the offsets, and the map is loaded as per the parent.
|
||||
* `preload_size()` - Extends the functionality of the general map template's `preload_size()` to run the `discover_offset` proc, calculating the offset of `/obj/modular_map_connector` and setting the offset variables accordingly.
|
||||
|
||||
### /obj/modular_map_connector
|
||||
|
||||
This object is used only to determine the offsets to be used on loading, and has no other functionality.
|
||||
|
||||
### TOML configuration
|
||||
|
||||
This TOML file is used to map between a list of `.dmm` files and a string key. The file consists of two parts. The first is a line
|
||||
|
||||
```
|
||||
directory = "_maps/etc/"
|
||||
```
|
||||
|
||||
which points at a folder containing the `.dmm` files of the modules used in the map. The second is a series of tables
|
||||
|
||||
```
|
||||
[rooms.example]
|
||||
modules = ["example_1.dmm", "example_2.dmm"]
|
||||
```
|
||||
|
||||
which contains the mapping between the key `"example"` and the list of filenames `["example_1.dmm", "example_2.dmm"]`.
|
||||
|
||||
### /datum/unit_test/modular_map_loader
|
||||
|
||||
This is the unit test for modular map loading. It performs two checks on every subtype of `/obj/modular_map_root`. First it checks if the file `config_file` points at, and if it does not the test is failed because the file does not exist. If it does exist, it then attempts to read the file, if this is null it means the fild is not valid TOML, and the test is failed because the TOML file is invalid.
|
||||
|
||||
## How-To
|
||||
|
||||
This section will cover the basics of how to use map modules as a mapper. If you want a concrete example to look at, the space ruin `_maps/RandomRuins/SpaceRuins/DJstation.dmm` and its associated code, configuration and modules employ all the techniques covered in this tutorial.
|
||||
|
||||
### The Main Map
|
||||
|
||||
First we need to create a map, as we usually would. Let's say we want to create a new space ruin `foobar.dmm`, and we put it in the appropriate folder as usual, `_maps/RandomRuins/SpaceRuins/foobar.dmm`. We now need to create three more things.
|
||||
|
||||
* `code/modules/ruins/spaceruin_code/foobar.dm` - A code file like would be used to store any code specific to this map.
|
||||
* `strings/modular_maps/foobar.toml`- A configuration file, this will be looked at in more detail later.
|
||||
* `_maps/RandomRuins/SpaceRuins/foobar/` - A new subfolder, which is where we will put the `.dmm` files for the modules.
|
||||
|
||||
In `code/modules/ruins/spaceruin_code/foobar.dm` we need to add a small piece of code to define a new modular map root type for our map, which should look like this
|
||||
|
||||
```
|
||||
/obj/modular_map_root/foobar
|
||||
config_file = "strings/modular_maps/foobar.toml"
|
||||
```
|
||||
|
||||
This means when we place root objects `/obj/modular_map_root` in our new map, we use this subtype that points to the correct configuration file.
|
||||
|
||||
When creating our main map, we place one of these roots in the location we want to generate a module at. Typically this would be placed at a natural landmark, such as a doorway. We then edit the varaibles of the placed root object, and set the `key` var to some string, let's use `key = vault`. Make the rest of the map, ensuring that every root you want to use a unique set of modules has a unique `key`.
|
||||
|
||||
### Module Maps
|
||||
|
||||
Now we need to make the modules to be placed on our roots. These will be saved in the folder we created earlier, `_maps/RandomRuins/SpaceRuins/foobar/`. Modules do not have to be the same size, so long as all modules will fit properly on the root without running into other parts of the map.
|
||||
|
||||
When making a module, you need to include a connector object `/obj/modular_map_connector`. When the module is loaded, it will be offset so this connector is placed on top of the root on the main map.
|
||||
|
||||
We will be making the first variant of our vault module, so we save this as `vault_1.dmm`, following the format `[key]_[number].dmm`. Keep doing this until all your modules have been made.
|
||||
|
||||
If you wish, you can also place another root on a module, if for some reason that module's position is dependent on the current one. IF you do this, make sure you've placed a root with the same key on every variant of the current module (unless you only want it to appear on certain varaints of this one.)
|
||||
|
||||
### Configuration
|
||||
|
||||
Now we go back to our configuration file `strings/modular_maps/foobar.toml`. Say we ended up using three different sets of modules in our map, `vault`, `airlock` and `bathroom`, each of which have two variants. We want our `.toml` file to look like this
|
||||
|
||||
```
|
||||
directory = "_maps/RandomRuins/SpaceRuins/foobar/"
|
||||
|
||||
[rooms.vault]
|
||||
modules = ["vault_1.dmm", "vault_2.dmm"]
|
||||
|
||||
[rooms.airlock]
|
||||
modules = ["airlock_1.dmm", "airlock_2.dmm"]
|
||||
|
||||
[rooms.bathroom]
|
||||
modules = ["bathroom_1.dmm", "bathroom_2.dmm"]
|
||||
```
|
||||
|
||||
Let's break down what is happening here.
|
||||
|
||||
`directory = "_maps/RandomRuins/SpaceRuins/foobar/"` points to the folder where our modules are stored.
|
||||
|
||||
`[rooms.vault]` identifies the following line as being the modules for a root with `key = vault`.
|
||||
|
||||
`modules = ["vault_1.dmm", "vault_2.dmm"]` specifies which map files within the folder are to be associated with this key.
|
||||
|
||||
Once this configuration is done, the map should be fully functional. Compile and run, place your map somewhere, and continue doing this until you have satisfied yourself that everything looks how you expected it to. Remember to do everything else you need to do when adding any new ruin, or whatever kind of map you made.
|
||||
|
||||
### Common Mistakes
|
||||
|
||||
> My map has modules that didn't load!
|
||||
|
||||
Check your configuration is correct. Do the filenames given for the problem root match the names of the map files? Is the key specified in the configuration file the same as the one on the root in the map?
|
||||
|
||||
> A module is loading in the wrong location!
|
||||
|
||||
Check the positioning of the connector is correct, and that only one is placed on the module.
|
||||
|
||||
> My ruin is spawning too close to or overlapping with something!
|
||||
|
||||
Make sure your main map is large enough to fully contain the most expansive variation that can possibly be chosen.
|
||||
|
||||
> Parts of my map are overlapping with each other!
|
||||
|
||||
Make sure modules placed adjacent or close to each other have no combination of variants which can overlap with each other, this may take some trial and error in complicated cases.
|
||||
|
||||
> My map still isn't working and I don't know what's wrong!
|
||||
|
||||
Ping @Maintainer in our coding channels if you need any help or find any problems
|
||||
@@ -0,0 +1,77 @@
|
||||
/obj/modular_map_root
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "pinonclose"
|
||||
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
anchored = TRUE
|
||||
|
||||
/// Points to a .toml file storing configuration data about the modules associated with this root
|
||||
var/config_file = null
|
||||
/// Key used to look up the appropriate map paths in the associated .toml file
|
||||
var/key = null
|
||||
|
||||
INITIALIZE_IMMEDIATE(/obj/modular_map_root)
|
||||
|
||||
/obj/modular_map_root/Initialize(mapload)
|
||||
. = ..()
|
||||
INVOKE_ASYNC(src, .proc/load_map)
|
||||
|
||||
/// Randonly selects a map file from the TOML config specified in config_file, loads it, then deletes itself.
|
||||
/obj/modular_map_root/proc/load_map()
|
||||
var/turf/spawn_area = get_turf(src)
|
||||
|
||||
var/datum/map_template/map_module/map = new()
|
||||
|
||||
if(!config_file)
|
||||
return
|
||||
|
||||
if(!key)
|
||||
return
|
||||
|
||||
var/config = rustg_read_toml_file(config_file)
|
||||
|
||||
var/mapfile = config["directory"] + pick(config["rooms"][key]["modules"])
|
||||
|
||||
map.load(spawn_area, FALSE, mapfile = mapfile)
|
||||
|
||||
qdel(src, force=TRUE)
|
||||
|
||||
/datum/map_template/map_module
|
||||
name = "Base Map Module Template"
|
||||
|
||||
var/x_offset = 0
|
||||
var/y_offset = 0
|
||||
|
||||
/datum/map_template/map_module/load(turf/T, centered = FALSE, orientation = SOUTH, annihilate = default_annihilate, force_cache = FALSE, rotate_placement_to_orientation = FALSE, mapfile = null)
|
||||
|
||||
if(!mapfile)
|
||||
return
|
||||
|
||||
mappath = mapfile
|
||||
|
||||
preload_size(mappath) // We need to run this here as the map path has been null until now
|
||||
|
||||
T = locate(T.x - x_offset, T.y - y_offset, T.z)
|
||||
. = ..()
|
||||
|
||||
/datum/map_template/map_module/preload_size(path, cache)
|
||||
. = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map
|
||||
if(!cached_map)
|
||||
return
|
||||
|
||||
var/list/offset = discover_offset(/obj/modular_map_connector)
|
||||
|
||||
x_offset = offset[1] - 1
|
||||
y_offset = offset[2] - 1
|
||||
|
||||
if(!cache)
|
||||
cached_map = null
|
||||
|
||||
/obj/modular_map_connector
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "pinonclose"
|
||||
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
anchored = TRUE
|
||||
@@ -7,7 +7,7 @@
|
||||
/datum/sprite_accessory/ears/mam_ears/gret
|
||||
name = "Gret"
|
||||
icon_state = "gret"
|
||||
color_src = SKINTONE
|
||||
color_src = MUTCOLORS
|
||||
icon = 'modular_splurt/icons/mob/mam_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/goathorns
|
||||
|
||||
@@ -170,3 +170,211 @@
|
||||
name = "Phoebe"
|
||||
icon = 'modular_splurt/icons/mob/hair.dmi'
|
||||
icon_state = "hair_phoebe"
|
||||
|
||||
|
||||
/datum/sprite_accessory/hair/teshari
|
||||
name = "Teshari Default"
|
||||
icon_state = "teshari_default"
|
||||
icon = 'modular_splurt/icons/mob/hair.dmi'
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/altdefault
|
||||
name = "Teshari Alt. Default"
|
||||
icon_state = "teshari_ears"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/tight
|
||||
name = "Teshari Tight"
|
||||
icon_state = "teshari_tight"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/excited
|
||||
name = "Teshari Spiky"
|
||||
icon_state = "teshari_spiky"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/spike
|
||||
name = "Teshari Spike"
|
||||
icon_state = "teshari_spike"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/long
|
||||
name = "Teshari Overgrown"
|
||||
icon_state = "teshari_long"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/burst
|
||||
name = "Teshari Starburst"
|
||||
icon_state = "teshari_burst"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/shortburst
|
||||
name = "Teshari Short Starburst"
|
||||
icon_state = "teshari_burst_short"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/mohawk
|
||||
name = "Teshari Mohawk"
|
||||
icon_state = "teshari_mohawk"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/pointy
|
||||
name = "Teshari Pointy"
|
||||
icon_state = "teshari_pointy"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/upright
|
||||
name = "Teshari Upright"
|
||||
icon_state = "teshari_upright"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/mane
|
||||
name = "Teshari Mane"
|
||||
icon_state = "teshari_mane"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/droopy
|
||||
name = "Teshari Droopy"
|
||||
icon_state = "teshari_droopy"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/mushroom
|
||||
name = "Teshari Mushroom"
|
||||
icon_state = "teshari_mushroom"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/twies
|
||||
name = "Teshari Twies"
|
||||
icon_state = "teshari_twies"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/backstrafe
|
||||
name = "Teshari Backstrafe"
|
||||
icon_state = "teshari_backstrafe"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/_longway
|
||||
name = "Teshari Long way"
|
||||
icon_state = "teshari_longway"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/tree
|
||||
name = "Teshari Tree"
|
||||
icon_state = "teshari_tree"
|
||||
|
||||
/datum/sprite_accessory/hair/teshari/fluffymohawk
|
||||
name = "Teshari Fluffy Mohawk"
|
||||
icon_state = "teshari_fluffymohawk"
|
||||
|
||||
//Teshari face things
|
||||
/datum/sprite_accessory/facial_hair/teshari
|
||||
name = "Teshari Beard"
|
||||
icon_state = "teshari_chin"
|
||||
gender = NEUTER
|
||||
icon = 'modular_splurt/icons/mob/hair.dmi'
|
||||
|
||||
/datum/sprite_accessory/facial_hair/teshari/scraggly
|
||||
name = "Teshari Scraggly"
|
||||
icon_state = "teshari_scraggly"
|
||||
|
||||
/datum/sprite_accessory/facial_hair/teshari/chops
|
||||
name = "Teshari Chops"
|
||||
icon_state = "teshari_gap"
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/teshari
|
||||
name = "Teshari (COLORABLE)"
|
||||
|
||||
icon_state = "teshari"
|
||||
color_src = MUTCOLORS2
|
||||
icon = 'modular_splurt/icons/mob/ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/tesharihigh
|
||||
name = "Teshari upper ears (COLORABLE)"
|
||||
|
||||
icon_state = "tesharihigh"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'modular_splurt/icons/mob/ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/ears/mam_ears/tesharilow
|
||||
name = "Teshari lower ears (COLORABLE)"
|
||||
|
||||
icon_state = "tesharilow"
|
||||
color_src = MUTCOLORS
|
||||
icon = 'modular_splurt/icons/mob/ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/tails/mam_tails/teshari
|
||||
icon = 'modular_splurt/icons/mob/tail.dmi'
|
||||
recommended_species = list("teshari")
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/tails/mam_tails/teshari/tesharitailhc
|
||||
name = "teshari tail, colorable"
|
||||
icon_state = "tesharicolorable"
|
||||
matrixed_sections = MATRIX_RED
|
||||
|
||||
/datum/sprite_accessory/tails/mam_tails/teshari/tesharitailfeatheredhc
|
||||
name = "teshari tail w/ feathers, colorable"
|
||||
icon_state = "tesharifeatherscolorable"
|
||||
matrixed_sections = MATRIX_RED
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/tesh_feathers
|
||||
name = "Teshari Feathers"
|
||||
icon = 'modular_splurt/icons/mob/mam_markings.dmi'
|
||||
icon_state = "tesh_feathers"
|
||||
covered_limbs = list("Left Foot" = MATRIX_GREEN, "Right Foot" = MATRIX_GREEN, "Left Hand" = MATRIX_GREEN, "Right Hand" = MATRIX_GREEN)
|
||||
recommended_species = list("teshari")
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/teshi_small_feathers
|
||||
name = "Teshari small wingfeathers"
|
||||
icon = 'modular_splurt/icons/mob/mam_markings.dmi'
|
||||
icon_state = "tesh_sf"
|
||||
covered_limbs = list("Left Foot" = MATRIX_GREEN, "Right Foot" = MATRIX_GREEN, "Left Hand" = MATRIX_GREEN, "Right Hand" = MATRIX_GREEN, "Chest" = MATRIX_GREEN)
|
||||
recommended_species = list("teshari")
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/tesh_skull
|
||||
name = "Teshari Skull Face"
|
||||
icon = 'modular_splurt/icons/mob/mam_markings.dmi'
|
||||
icon_state = "tesh_skull"
|
||||
covered_limbs = list("Head" = MATRIX_GREEN)
|
||||
recommended_species = list("teshari")
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/vr_teshari_large_eyes
|
||||
name = "Teshari large eyes"
|
||||
icon = 'modular_splurt/icons/mob/mam_markings.dmi'
|
||||
icon_state = "teshlarge_eyes"
|
||||
covered_limbs = list("Head" = MATRIX_GREEN)
|
||||
recommended_species = list("teshari")
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/vr_teshari_coat
|
||||
name = "Teshari coat"
|
||||
icon = 'modular_splurt/icons/mob/mam_markings.dmi'
|
||||
icon_state = "tesh_coat"
|
||||
covered_limbs = list("Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN, "Chest" = MATRIX_GREEN, "Head" = MATRIX_GREEN)
|
||||
recommended_species = list("teshari")
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/vr_teshari_pattern_male
|
||||
name = "Teshari male pattern"
|
||||
icon = 'modular_splurt/icons/mob/mam_markings.dmi'
|
||||
icon_state = "tesh_pattern_male"
|
||||
covered_limbs = list("Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN, "Left Hand" = MATRIX_GREEN, "Right Hand" = MATRIX_GREEN, "Chest" = MATRIX_GREEN, "Head" = MATRIX_GREEN)
|
||||
recommended_species = list("teshari")
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/vr_teshari_pattern_female
|
||||
name = "Teshari female pattern"
|
||||
icon = 'modular_splurt/icons/mob/mam_markings.dmi'
|
||||
icon_state = "tesh_pattern_fem"
|
||||
covered_limbs = list("Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Hand" = MATRIX_GREEN, "Right Hand" = MATRIX_GREEN, "Chest" = MATRIX_GREEN, "Groin" = MATRIX_GREEN, "Head" = MATRIX_GREEN)
|
||||
recommended_species = list("teshari")
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/vr_tesh_beak
|
||||
name = "Teshari beak, pointed"
|
||||
icon = 'modular_splurt/icons/mob/mam_markings.dmi'
|
||||
icon_state = "tesh_beak"
|
||||
covered_limbs = list("Head" = MATRIX_GREEN)
|
||||
recommended_species = list("teshari")
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/vr_tesh_beak_alt
|
||||
name = "Teshari beak, rounded"
|
||||
icon = 'modular_splurt/icons/mob/mam_markings.dmi'
|
||||
icon_state = "tesh_beak_alt"
|
||||
covered_limbs = list("Head" = MATRIX_GREEN)
|
||||
recommended_species = list("teshari")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,6 +20,12 @@
|
||||
/mob/living/carbon/human/species/mammal/shadekin
|
||||
race = /datum/species/mammal/shadekin
|
||||
|
||||
/mob/living/carbon/human/species/mammal/teshari
|
||||
race = /datum/species/mammal/teshari
|
||||
|
||||
/mob/living/carbon/human/species/mammal/vox
|
||||
race = /datum/species/vox
|
||||
|
||||
/mob/living/carbon/human/is_literate()
|
||||
// Check for D4C craving
|
||||
if(HAS_TRAIT(src, TRAIT_DUMB_CUM_CRAVE))
|
||||
|
||||
@@ -1,3 +1,19 @@
|
||||
/datum/species
|
||||
var/icon_accessories
|
||||
var/icon_back
|
||||
var/icon_belt
|
||||
var/icon_ears
|
||||
var/icon_eyes
|
||||
var/icon_feet
|
||||
var/icon_feet64
|
||||
var/icon_hands
|
||||
var/icon_head
|
||||
var/icon_mask
|
||||
var/icon_neck
|
||||
var/icon_suit
|
||||
var/icon_uniform
|
||||
|
||||
|
||||
/datum/species/althelp(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(user == target && istype(user))
|
||||
if(HAS_TRAIT(user, TRAIT_FLOORED))
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
var/nutrition_threshold = NUTRITION_LEVEL_FED
|
||||
if (H.nutrition >= nutrition_threshold)
|
||||
to_chat(H, "<i>You begin spinning some web...</i>")
|
||||
if(!do_after(H, 10 SECONDS, 1, T))
|
||||
if(!do_after(H, 10 SECONDS, T))
|
||||
to_chat(H, span_warning("Your web spinning was interrupted!"))
|
||||
return
|
||||
H.adjust_nutrition(-spinner_rate)
|
||||
@@ -86,7 +86,7 @@
|
||||
to_chat(H, span_warning("[L] resists your attempts to wrap [L.p_them()]!"))
|
||||
return
|
||||
H.visible_message(span_danger("[H] starts to wrap [A] into a cocoon!"),span_warning("You start to wrap [A] into a cocoon."))
|
||||
if(!do_after(H, 10 SECONDS, 1, A))
|
||||
if(!do_after(H, 10 SECONDS, A))
|
||||
to_chat(H, span_warning("Your web spinning was interrupted!"))
|
||||
return
|
||||
H.adjust_nutrition(spinner_rate * -3)
|
||||
|
||||
@@ -0,0 +1,193 @@
|
||||
#define TESHARI_TEMP_OFFSET -30 // K, added to comfort/damage limit etc
|
||||
#define TESHARI_BURNMOD 1.25 // They take more damage from practically everything
|
||||
#define TESHARI_BRUTEMOD 1.2
|
||||
#define TESHARI_HEATMOD 1.3
|
||||
#define TESHARI_COLDMOD 0.67 // Except cold.
|
||||
|
||||
|
||||
/datum/species/mammal/teshari
|
||||
name = "Teshari"
|
||||
id = SPECIES_TESHARI
|
||||
say_mod = "mars"
|
||||
eye_type = "teshari"
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "mam_tail" = "teshari tail, colorable", "mam_ears" = "None", "mam_body_markings" = list())
|
||||
allowed_limb_ids = null
|
||||
override_bp_icon = 'modular_splurt/icons/mob/teshari.dmi'
|
||||
damage_overlay_type = "teshari"
|
||||
species_language_holder = /datum/language_holder/teshari
|
||||
exotic_blood_color = "#D514F7"
|
||||
disliked_food = GROSS | GRAIN
|
||||
liked_food = MEAT
|
||||
payday_modifier = 0.75
|
||||
attack_verb = "claw"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
ass_image = 'icons/ass/asslizard.png'
|
||||
|
||||
species_traits = list(MUTCOLORS,
|
||||
EYECOLOR,
|
||||
NO_UNDERWEAR,
|
||||
HAIR,
|
||||
FACEHAIR,
|
||||
MARKINGS
|
||||
)
|
||||
|
||||
coldmod = TESHARI_COLDMOD
|
||||
heatmod = TESHARI_HEATMOD
|
||||
brutemod = TESHARI_BRUTEMOD
|
||||
burnmod = TESHARI_BURNMOD
|
||||
|
||||
|
||||
/datum/species/mammal/teshari/on_species_gain(mob/living/carbon/human/C, datum/species/old_species, pref_load)
|
||||
if(ishuman(C))
|
||||
C.verbs += /mob/living/carbon/human/proc/sonar_ping
|
||||
C.verbs += /mob/living/carbon/human/proc/hide
|
||||
C.setMaxHealth(50)
|
||||
C.physiology.hunger_mod *= 2
|
||||
C.add_movespeed_modifier(/datum/movespeed_modifier/teshari)
|
||||
|
||||
/datum/movespeed_modifier/teshari
|
||||
multiplicative_slowdown = -0.2
|
||||
|
||||
/datum/emote/sound/teshari
|
||||
mob_type_allowed_typecache = list(/mob/living/carbon/human)
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/language_holder/teshari
|
||||
understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
|
||||
/datum/language/schechi = list(LANGUAGE_ATOM))
|
||||
spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
|
||||
/datum/language/schechi = list(LANGUAGE_ATOM))
|
||||
|
||||
/datum/language/schechi
|
||||
|
||||
/datum/emote/living/audio/teshari/teshsqueak
|
||||
key = "surprised"
|
||||
key_third_person = "surprised"
|
||||
message = "chirps in surprise!"
|
||||
message_mime = "lets out an <b>inaudible</b> chirp!"
|
||||
emote_sound = 'modular_splurt/sound/voice/teshsqueak.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
|
||||
emote_cooldown = 2.1 SECONDS
|
||||
|
||||
/datum/emote/living/audio/teshari/teshsqueak/run_emote(mob/user, params)
|
||||
var/datum/dna/D = user.has_dna()
|
||||
if(D.species.name != "Teshari")
|
||||
return
|
||||
// Return normally
|
||||
. = ..()
|
||||
|
||||
/datum/emote/living/audio/teshari/teshchirp
|
||||
key = "tchirp"
|
||||
key_third_person = "tchirp"
|
||||
message = "chirps!"
|
||||
message_mime = "lets out an <b>inaudible</b> chirp!"
|
||||
emote_sound = 'modular_splurt/sound/voice/teshchirp.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
|
||||
emote_cooldown = 2.1 SECONDS
|
||||
|
||||
/datum/emote/living/audio/teshari/teshchirp/run_emote(mob/user, params)
|
||||
var/datum/dna/D = user.has_dna()
|
||||
if(D.species.name != "Teshari")
|
||||
return
|
||||
// Return normally
|
||||
. = ..()
|
||||
|
||||
/datum/emote/living/audio/teshari/trill
|
||||
key = "trill"
|
||||
key_third_person = "trill"
|
||||
message = "trills!"
|
||||
message_mime = "lets out an <b>inaudible</b> chirp!"
|
||||
emote_sound = 'modular_splurt/sound/voice/teshtrill.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
|
||||
emote_cooldown = 2.1 SECONDS
|
||||
|
||||
/datum/emote/living/audio/teshari/trill/run_emote(mob/user, params)
|
||||
var/datum/dna/D = user.has_dna()
|
||||
if(D.species.name != "Teshari")
|
||||
return
|
||||
// Return normally
|
||||
. = ..()
|
||||
|
||||
/datum/emote/living/audio/teshari/teshscream
|
||||
key = "teshscream"
|
||||
key_third_person = "teshscream"
|
||||
message = "screams!"
|
||||
message_mime = "lets out an <b>inaudible</b> screams!"
|
||||
emote_sound = 'modular_splurt/sound/voice/teshscream.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
|
||||
emote_cooldown = 2.1 SECONDS
|
||||
|
||||
/datum/emote/living/audio/teshari/teshscream/run_emote(mob/user, params)
|
||||
var/datum/dna/D = user.has_dna()
|
||||
if(D.species.name != "Teshari")
|
||||
return
|
||||
// Return normally
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/human
|
||||
var/next_sonar_ping = 0
|
||||
var/hiding = 0
|
||||
|
||||
/mob/living/carbon/human/proc/hide()
|
||||
set name = "Hide"
|
||||
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
|
||||
set category = "Abilities"
|
||||
|
||||
if(stat == DEAD || restrained() || buckled|| has_buckled_mobs()) //VORE EDIT: Check for has_buckled_mobs() (taur riding)
|
||||
return
|
||||
|
||||
if(hiding)
|
||||
plane = initial(plane)
|
||||
layer = initial(layer)
|
||||
to_chat(usr, "<span class='notice'>You have stopped hiding.</span>")
|
||||
hiding = 0
|
||||
else
|
||||
hiding = 1
|
||||
layer = BELOW_OBJ_LAYER //Just above cables with their 2.44
|
||||
plane = GAME_PLANE
|
||||
to_chat(src,"<span class='notice'>You are now hiding.</span>")
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/sonar_ping()
|
||||
set name = "Listen In"
|
||||
set desc = "Allows you to listen in to movement and noises around you."
|
||||
set category = "Abilities"
|
||||
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You need to recover before you can use this ability.</span>")
|
||||
return
|
||||
if(world.time < next_sonar_ping)
|
||||
to_chat(src, "<span class='warning'>You need another moment to focus.</span>")
|
||||
return
|
||||
var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS)
|
||||
if(ears.deaf > 0)
|
||||
to_chat(src, "<span class='warning'>You are for all intents and purposes currently deaf!</span>")
|
||||
return
|
||||
next_sonar_ping += 10 SECONDS
|
||||
var/heard_something = FALSE
|
||||
to_chat(src, "<span class='notice'>You take a moment to listen in to your environment...</span>")
|
||||
for(var/mob/living/L in range(client.view, src))
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T || L == src || L.stat == DEAD)
|
||||
continue
|
||||
heard_something = TRUE
|
||||
var/feedback = list()
|
||||
feedback += "<span class='notice'>There are noises of movement "
|
||||
var/direction = get_dir(src, L)
|
||||
if(direction)
|
||||
feedback += "towards the [dir2text(direction)], "
|
||||
switch(get_dist(src, L) / 7)
|
||||
if(0 to 0.2)
|
||||
feedback += "very close by."
|
||||
if(0.2 to 0.4)
|
||||
feedback += "close by."
|
||||
if(0.4 to 0.6)
|
||||
feedback += "some distance away."
|
||||
if(0.6 to 0.8)
|
||||
feedback += "further away."
|
||||
else
|
||||
feedback += "far away."
|
||||
else // No need to check distance if they're standing right on-top of us
|
||||
feedback += "right on top of you."
|
||||
feedback += "</span>"
|
||||
to_chat(src,jointext(feedback,null))
|
||||
if(!heard_something)
|
||||
to_chat(src, "<span class='notice'>You hear no movement but your own.</span>")
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
/datum/species/vox
|
||||
name = "Vox"
|
||||
id = SPECIES_VOX
|
||||
override_bp_icon = 'modular_splurt/icons/mob/vox.dmi'
|
||||
species_language_holder = /datum/language_holder/vox
|
||||
|
||||
|
||||
breathid = "tox"
|
||||
|
||||
mutantlungs = /obj/item/organ/lungs/vox
|
||||
|
||||
species_traits = list(MUTCOLORS,
|
||||
EYECOLOR,
|
||||
NO_UNDERWEAR,
|
||||
HAIR,
|
||||
FACEHAIR,
|
||||
MARKINGS
|
||||
)
|
||||
|
||||
exotic_blood_color = "#9066BD"
|
||||
//flesh_color = "#808D11"
|
||||
|
||||
|
||||
attack_verb = "claw"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
say_mod = "shrieks"
|
||||
eye_type = "vox"
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "mam_tail" = "teshari tail, colorable", "mam_ears" = "None", "mam_body_markings" = list())
|
||||
allowed_limb_ids = null
|
||||
damage_overlay_type = "vox"
|
||||
|
||||
/datum/species/vox/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
var/datum/outfit/vox/O = new /datum/outfit/vox
|
||||
H.equipOutfit(O, visualsOnly)
|
||||
H.internal = H.get_item_for_held_index(2)
|
||||
H.update_internals_hud_icon(1)
|
||||
return 0
|
||||
|
||||
/datum/species/vox/on_species_gain(mob/living/carbon/human/C, datum/species/old_species, pref_load)
|
||||
if(ishuman(C))
|
||||
C.add_movespeed_modifier(/datum/movespeed_modifier/vox)
|
||||
..()
|
||||
|
||||
/datum/movespeed_modifier/vox
|
||||
multiplicative_slowdown = -0.2
|
||||
|
||||
|
||||
/datum/language_holder/vox
|
||||
understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
|
||||
/datum/language/schechi = list(LANGUAGE_ATOM))
|
||||
spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
|
||||
/datum/language/schechi = list(LANGUAGE_ATOM))
|
||||
|
||||
/datum/language/vox
|
||||
|
||||
/datum/emote/sound/vox
|
||||
mob_type_allowed_typecache = list(/mob/living/carbon/human)
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
|
||||
/datum/emote/living/audio/vox/shriek
|
||||
key = "shriek"
|
||||
key_third_person = "shrieks"
|
||||
message = "shrieks!"
|
||||
message_mime = "lets out an <b>inaudible</b> shriek!"
|
||||
emote_sound = 'modular_splurt/sound/voice/shriek1.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
|
||||
emote_cooldown = 2.1 SECONDS
|
||||
|
||||
/datum/emote/living/audio/vox/shriek/run_emote(mob/user, params)
|
||||
var/datum/dna/D = user.has_dna()
|
||||
if(D.species.name != "Vox")
|
||||
return
|
||||
// Return normally
|
||||
. = ..()
|
||||
@@ -0,0 +1,281 @@
|
||||
// Xenochimera thing mostly
|
||||
#define REVIVING_NOW -1
|
||||
#define REVIVING_DONE 0
|
||||
#define REVIVING_READY 1
|
||||
|
||||
|
||||
/datum/species/mammal/xenochimera
|
||||
name = "Xenochimera"
|
||||
id = SPECIES_XENOCHIMERA
|
||||
mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "mam_snouts" = "None", "mam_tail" = "None", "mam_ears" = "None", "deco_wings" = "None",
|
||||
"taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian")
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,WINGCOLOR,HAS_FLESH,HAS_BONE)
|
||||
mutanteyes = /obj/item/organ/eyes/night_vision
|
||||
brutemod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though.
|
||||
burnmod = 1.15 //As vulnerable to burn as a Tajara.
|
||||
|
||||
/datum/species/mammal/xenochimera/on_species_gain(mob/living/carbon/human/C, datum/species/old_species, pref_load)
|
||||
if(ishuman(C))
|
||||
C.verbs += /mob/living/carbon/human/proc/reconstitute_form
|
||||
C.verbs += /mob/living/carbon/human/proc/sonar_ping
|
||||
C.verbs += /mob/living/carbon/human/proc/tie_hair
|
||||
C.add_movespeed_modifier(/datum/movespeed_modifier/xenochimera)
|
||||
|
||||
/datum/species/mammal/xenochimera/spec_life(mob/living/carbon/human/H)
|
||||
//If they're KO'd/dead, or reviving, they're probably not thinking a lot about much of anything.
|
||||
//if(!H.stat || !(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE))
|
||||
// handle_feralness(H)
|
||||
|
||||
//While regenerating
|
||||
if(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE)
|
||||
H.Paralyze(1000)
|
||||
var/regen_sounds = list(
|
||||
'modular_splurt/sound/effects/regen_1.ogg',
|
||||
'modular_splurt/sound/effects/regen_2.ogg',
|
||||
'modular_splurt/sound/effects/regen_4.ogg',
|
||||
'modular_splurt/sound/effects/regen_3.ogg',
|
||||
'modular_splurt/sound/effects/regen_5.ogg'
|
||||
)
|
||||
if(prob(2)) // 2% chance of playing squelchy noise while reviving, which is run roughly every 2 seconds/tick while regenerating.
|
||||
playsound(H, pick(regen_sounds), 30)
|
||||
H.visible_message("<span class='danger'><p><font size=4>[H.name]'s motionless form shudders grotesquely, rippling unnaturally.</font></p></span>")
|
||||
|
||||
//Cold/pressure effects when not regenerating
|
||||
else
|
||||
var/datum/gas_mixture/environment = H.loc.return_air()
|
||||
var/pressure2 = environment.return_pressure()
|
||||
var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2)
|
||||
|
||||
//Very low pressure damage
|
||||
if(adjusted_pressure2 <= 20)
|
||||
H.take_overall_damage(LOW_PRESSURE_DAMAGE, 0)
|
||||
|
||||
|
||||
//Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral.
|
||||
//NB: 'body_temperature' used here is the 'setpoint' species var
|
||||
var/body_temperature = 310.15
|
||||
var/temp_diff = body_temperature - H.bodytemperature
|
||||
if(temp_diff >= 50)
|
||||
H.eye_blurry = max(5,H.eye_blurry)
|
||||
|
||||
/datum/movespeed_modifier/xenochimera
|
||||
multiplicative_slowdown = -0.1
|
||||
|
||||
/mob/living/carbon/human/proc/reconstitute_form() //Scree's race ability.in exchange for: No cloning.
|
||||
set name = "Reconstitute Form"
|
||||
set category = "Abilities"
|
||||
|
||||
// Sanity is mostly handled in chimera_regenerate()
|
||||
if(stat == DEAD)
|
||||
var/confirm = tgui_alert(usr, "Are you sure you want to regenerate your corpse? This process can take up to thirty minutes.", "Confirm Regeneration", list("Yes", "No"))
|
||||
if(confirm == "Yes")
|
||||
chimera_regenerate()
|
||||
else if (quickcheckuninjured())
|
||||
var/confirm = tgui_alert(usr, "Are you sure you want to regenerate? As you are uninjured this will only take 30 seconds and match your appearance to your character slot.", "Confirm Regeneration", list("Yes", "No"))
|
||||
if(confirm == "Yes")
|
||||
chimera_regenerate()
|
||||
else
|
||||
var/confirm = tgui_alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to fifteen minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No"))
|
||||
if(confirm == "Yes")
|
||||
chimera_regenerate()
|
||||
|
||||
/mob/living/carbon/human/proc/tie_hair()
|
||||
set name = "Tie Hair"
|
||||
set desc = "Style your hair."
|
||||
set category = "IC"
|
||||
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You can't mess with your hair right now!</span>")
|
||||
return
|
||||
|
||||
if(hair_style)
|
||||
var/selected_string
|
||||
var/list/datum/sprite_accessory/hair/valid_hairstyles = list()
|
||||
for(var/hair_string in GLOB.hair_styles_list)
|
||||
valid_hairstyles.Add(hair_string)
|
||||
selected_string = tgui_input_list(usr, "Select a new hairstyle", "Your hairstyle", valid_hairstyles)
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You can't mess with your hair right now!</span>")
|
||||
return
|
||||
else if(selected_string && hair_style != selected_string)
|
||||
hair_style = selected_string
|
||||
regenerate_icons()
|
||||
visible_message("<span class='notice'>[src] pauses a moment to style their hair.</span>")
|
||||
else
|
||||
to_chat(src, "<span class ='notice'>You're already using that style.</span>")
|
||||
|
||||
/mob/living/carbon/human
|
||||
var/revive_ready = REVIVING_READY // Only used for creatures that have the xenochimera regen ability, so far.
|
||||
var/revive_finished = 0 // Only used for xenochimera regen, allows us to find out when the regen will finish.
|
||||
|
||||
/mob/living/carbon/human/proc/chimera_regenerate()
|
||||
//If they're already regenerating
|
||||
switch(revive_ready)
|
||||
if(REVIVING_NOW)
|
||||
to_chat(src, "You are already reconstructing, just wait for the reconstruction to finish!")
|
||||
return
|
||||
if(REVIVING_DONE)
|
||||
to_chat(src, "Your reconstruction is done, but you need to hatch now.")
|
||||
return
|
||||
if(revive_ready > world.time)
|
||||
to_chat(src, "You can't use that ability again so soon!")
|
||||
return
|
||||
|
||||
var/time = min(900, (120+780/(1 + nutrition/100))) //capped at 15 mins, roughly 6 minutes at 250 (yellow) nutrition, 4.1 minutes at 500 (grey), cannot be below 2 mins
|
||||
if (quickcheckuninjured()) //if you're completely uninjured, then you get a speedymode - check health first for quickness
|
||||
time = 30
|
||||
|
||||
//Clicked regen while dead.
|
||||
if(stat == DEAD)
|
||||
|
||||
//reviving from dead takes extra nutriment to be provided from outside OR takes twice as long and consumes extra at the end
|
||||
if(!nutrition > 0)
|
||||
time = time*2
|
||||
|
||||
to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.")
|
||||
|
||||
//Scary spawnerization.
|
||||
revive_ready = REVIVING_NOW
|
||||
revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
|
||||
throw_alert("regen", /atom/movable/screen/alert/xenochimera/reconstitution)
|
||||
spawn(time SECONDS)
|
||||
// check to see if they've been fixed by outside forces in the meantime such as defibbing
|
||||
if(stat != DEAD)
|
||||
to_chat(src, "<span class='notice'>Your body has recovered from its ordeal, ready to regenerate itself again.</span>")
|
||||
revive_ready = REVIVING_READY //reset their cooldown
|
||||
clear_alert("regen")
|
||||
throw_alert("hatch", /atom/movable/screen/alert/xenochimera/readytohatch)
|
||||
|
||||
// Was dead, still dead.
|
||||
else
|
||||
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch.</span>")
|
||||
verbs |= /mob/living/carbon/human/proc/hatch
|
||||
revive_ready = REVIVING_DONE
|
||||
clear_alert("regen")
|
||||
throw_alert("hatch", /atom/movable/screen/alert/xenochimera/readytohatch)
|
||||
|
||||
|
||||
//Clicked regen while NOT dead
|
||||
else
|
||||
to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.")
|
||||
|
||||
//Waiting for regen after being alive
|
||||
revive_ready = REVIVING_NOW
|
||||
revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
|
||||
throw_alert("regen", /atom/movable/screen/alert/xenochimera/reconstitution)
|
||||
spawn(time SECONDS)
|
||||
|
||||
//Slightly different flavour messages
|
||||
if(stat != DEAD || nutrition > 0)
|
||||
to_chat(src, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>")
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Consciousness begins to stir as your battered body struggles to recover from its ordeal..</span>")
|
||||
verbs |= /mob/living/carbon/human/proc/hatch
|
||||
revive_ready = REVIVING_DONE
|
||||
|
||||
clear_alert("regen")
|
||||
throw_alert("hatch", /atom/movable/screen/alert/xenochimera/readytohatch)
|
||||
|
||||
/mob/living/carbon/human/proc/hatch()
|
||||
set name = "Hatch"
|
||||
set category = "Abilities"
|
||||
|
||||
if(revive_ready != REVIVING_DONE)
|
||||
//Hwhat?
|
||||
verbs -= /mob/living/carbon/human/proc/hatch
|
||||
return
|
||||
|
||||
var/confirm = tgui_alert(usr, "Are you sure you want to hatch right now? This will be very obvious to anyone in view.", "Confirm Regeneration", list("Yes", "No"))
|
||||
if(confirm == "Yes")
|
||||
|
||||
//Dead when hatching
|
||||
if(stat == DEAD)
|
||||
|
||||
//Reviving from ded takes extra nutrition - if it isn't provided from outside sources, it comes from you
|
||||
if(!nutrition > 0)
|
||||
nutrition=nutrition * 0.75
|
||||
chimera_hatch()
|
||||
|
||||
visible_message("<span class='warning'><p><font size=4>The former corpse staggers to its feet, all its former wounds having vanished...</font></p></span>") //Bloody hell...
|
||||
clear_alert("hatch")
|
||||
return
|
||||
|
||||
//Alive when hatching
|
||||
else
|
||||
chimera_hatch()
|
||||
|
||||
visible_message("<span class='warning'><p><font size=4>[src] rises to \his feet.</font></p></span>") //Bloody hell...
|
||||
clear_alert("hatch")
|
||||
|
||||
/mob/living/carbon/human/proc/chimera_hatch()
|
||||
verbs -= /mob/living/carbon/human/proc/hatch
|
||||
to_chat(src, "<span class='notice'>Your new body awakens, bursting free from your old skin.</span>")
|
||||
//Modify and record values (half nutrition and braindamage)
|
||||
var/old_nutrition = nutrition
|
||||
var/uninjured=quickcheckuninjured()
|
||||
//I did have special snowflake code, but this is easier.
|
||||
revive()
|
||||
cure_husk()
|
||||
|
||||
|
||||
if(!uninjured)
|
||||
nutrition = old_nutrition * 0.5
|
||||
//Drop everything
|
||||
for(var/obj/item/W in src)
|
||||
dropItemToGround(W, 1)
|
||||
//Visual effects
|
||||
var/T = get_turf(src)
|
||||
|
||||
new /obj/effect/gibspawner/human(T, src)
|
||||
visible_message("<span class='danger'><p><font size=4>The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.</font></p></span>") //Bloody hell...
|
||||
|
||||
else //lower cost for doing a quick cosmetic revive
|
||||
nutrition = old_nutrition * 0.9
|
||||
|
||||
//Unfreeze some things
|
||||
//does_not_breathe = FALSE
|
||||
//update_canmove()
|
||||
//weakened = 2
|
||||
SetParalyzed(0)
|
||||
revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often.
|
||||
|
||||
|
||||
/atom/movable/screen/alert/xenochimera/reconstitution
|
||||
name = "Reconstructing Form"
|
||||
desc = "You're still rebuilding your body! Click the alert to find out how long you have left."
|
||||
icon_state = "regenerating"
|
||||
|
||||
// Commenting this out for now, will revisit later once I can figure out how to override Click() appropriately.
|
||||
/atom/movable/screen/alert/xenochimera/reconstitution/Click()
|
||||
if(ishuman(usr)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H.dna.species, /datum/species/mammal/xenochimera))
|
||||
if(H.revive_ready == REVIVING_NOW)
|
||||
to_chat(usr, "We are currently reviving, and will be done in [(H.revive_finished - world.time) / 10] seconds.")
|
||||
else if(H.revive_ready == REVIVING_DONE)
|
||||
to_chat(usr, "You should have a notification + alert for this! Bug report that this is still here!")
|
||||
|
||||
|
||||
/atom/movable/screen/alert/xenochimera/readytohatch
|
||||
name = "Ready to Hatch"
|
||||
desc = "You're done reconstructing your cells! Click me to Hatch!"
|
||||
icon_state = "hatch_ready"
|
||||
|
||||
// Commenting this out for now, will revisit later once I can figure out how to override Click() appropriately.
|
||||
/atom/movable/screen/alert/xenochimera/readytohatch/Click()
|
||||
if(ishuman(usr)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H.dna.species, /datum/species/mammal/xenochimera))
|
||||
if(H.revive_ready == REVIVING_DONE) // Sanity check.
|
||||
H.hatch() // Hatch.
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/quickcheckuninjured()
|
||||
if (getBruteLoss() || getFireLoss() || getToxLoss() || getOxyLoss()) //fails if they have any of the main damage types
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
#undef REVIVING_NOW
|
||||
#undef REVIVING_DONE
|
||||
#undef REVIVING_READY
|
||||
|
||||
@@ -314,7 +314,7 @@
|
||||
sound = pick('modular_splurt/sound/voice/moan_f1.ogg', 'modular_splurt/sound/voice/moan_f2.ogg', 'modular_splurt/sound/voice/moan_f3.ogg', 'modular_splurt/sound/voice/moan_f4.ogg', 'modular_splurt/sound/voice/moan_f5.ogg', 'modular_splurt/sound/voice/moan_f6.ogg', 'modular_splurt/sound/voice/moan_f7.ogg')
|
||||
if(isalien(user))
|
||||
sound = 'sound/voice/hiss6.ogg'
|
||||
playsound(user.loc, sound, 50, 1, 4, 1.2)
|
||||
playlewdinteractionsound(user.loc, sound, 50, 1, 4, 1.2)
|
||||
message = "moans!"
|
||||
else if(miming)
|
||||
message = "acts out a moan."
|
||||
@@ -956,6 +956,15 @@
|
||||
emote_sound = 'modular_splurt/sound/voice/rizz.ogg'
|
||||
emote_cooldown = 1.43 SECONDS
|
||||
|
||||
/datum/emote/living/audio/buff
|
||||
key = "buff"
|
||||
key_third_person = "buffs"
|
||||
message = "shows off their muscles."
|
||||
message_param = "shows off their muscles to %t."
|
||||
emote_sound = 'modular_splurt/sound/voice/buff.ogg'
|
||||
emote_cooldown = 4.77 SECONDS
|
||||
emote_pitch_variance = FALSE
|
||||
|
||||
/datum/emote/living/audio/merowr
|
||||
key = "merowr"
|
||||
key_third_person = "merowrs"
|
||||
@@ -1029,6 +1038,30 @@
|
||||
emote_sound = 'modular_splurt/sound/voice/moo.ogg'
|
||||
emote_cooldown = 1.7 SECONDS
|
||||
|
||||
/datum/emote/living/audio/untitledgoose
|
||||
key = "goosehonk"
|
||||
key_third_person = "honks"
|
||||
message = "honks!"
|
||||
message_mime = "looks like a duck from hell!"
|
||||
emote_sound = 'modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_01.ogg'
|
||||
emote_cooldown = 0.8 SECONDS
|
||||
|
||||
/datum/emote/living/audio/untitledgoose/run_emote(mob/user, params)
|
||||
emote_sound = pick('modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_01.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_02.ogg','modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_03.ogg','modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_06.ogg')
|
||||
. = ..()
|
||||
|
||||
/datum/emote/living/audio/untitledgooseB
|
||||
key = "goosehonkb"
|
||||
key_third_person = "honks differently"
|
||||
message = "honks differently!"
|
||||
message_mime = "looks like a duck from hell!"
|
||||
emote_sound = 'modular_splurt/sound/voice/goosehonk/sfx_goose_honk_b_01.ogg'
|
||||
emote_cooldown = 0.8 SECONDS
|
||||
|
||||
/datum/emote/living/audio/untitledgooseB/run_emote(mob/user, params)
|
||||
emote_sound = pick('modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_02.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_03.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_04.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_06.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_07.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_08.ogg', 'modular_splurt/sound/voice/goosehonk/sfx_gooseB_honk_09.ogg')
|
||||
. = ..()
|
||||
|
||||
/datum/emote/living/audio/scream2
|
||||
key = "scream2"
|
||||
key_third_person = "screams2"
|
||||
@@ -1039,5 +1072,5 @@
|
||||
emote_pitch_variance = FALSE
|
||||
|
||||
/datum/emote/living/audio/scream2/run_emote(mob/user, params)
|
||||
emote_sound = pick('modular_splurt/sound/voice/cscream1.ogg', 'modular_splurt/sound/voice/cscream2.ogg', 'modular_splurt/sound/voice/cscream3.ogg', 'modular_splurt/sound/voice/cscream4.ogg', 'modular_splurt/sound/voice/cscream5.ogg', 'modular_splurt/sound/voice/cscream6.ogg', 'modular_splurt/sound/voice/cscream7.ogg', 'modular_splurt/sound/voice/cscream8.ogg', 'modular_splurt/sound/voice/cscream9.ogg', 'modular_splurt/sound/voice/cscream10.ogg')
|
||||
emote_sound = pick('modular_splurt/sound/voice/cscream1.ogg', 'modular_splurt/sound/voice/cscream2.ogg', 'modular_splurt/sound/voice/cscream3.ogg', 'modular_splurt/sound/voice/cscream4.ogg', 'modular_splurt/sound/voice/cscream5.ogg', 'modular_splurt/sound/voice/cscream6.ogg', 'modular_splurt/sound/voice/cscream7.ogg', 'modular_splurt/sound/voice/cscream8.ogg', 'modular_splurt/sound/voice/cscream9.ogg', 'modular_splurt/sound/voice/cscream10.ogg', 'modular_splurt/sound/voice/cscream11.ogg')
|
||||
. = ..()
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
. = ..()
|
||||
if(iswendigo(pulledby)) //Grip is too strong, nonetheless.
|
||||
to_chat(src, "<span class='danger'>The grip is too strong! I need some time...</span>")
|
||||
if(do_after(src, 200, target=pulledby))
|
||||
if(do_after(src, 200, target = pulledby))
|
||||
to_chat(src, "<span class='danger'>I break free off [pulledby]'s grip!</span>")
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -84,12 +84,14 @@
|
||||
icon_state = "543box"
|
||||
ammo_type = /obj/item/ammo_casing/a543
|
||||
max_ammo = 40
|
||||
icon = 'modular_splurt/icons/obj/ammo.dmi'
|
||||
|
||||
/obj/item/ammo_box/a543/rubber
|
||||
name = "ammo box (.5x43mm Rubber)"
|
||||
icon_state = "543box"
|
||||
ammo_type = /obj/item/ammo_casing/a543/rubber
|
||||
max_ammo = 40
|
||||
icon = 'modular_splurt/icons/obj/ammo.dmi'
|
||||
|
||||
/obj/item/ammo_box/a308
|
||||
name = "stripper clip (.308)"
|
||||
@@ -262,3 +264,33 @@
|
||||
materials = list(/datum/material/iron = 35000)
|
||||
build_path = /obj/item/ammo_box/a308
|
||||
category = list("hacked", "Security")
|
||||
|
||||
/datum/design/a543_lethal
|
||||
name = "Ammo box (.5x43mm Lethal)"
|
||||
desc = "A 40 round ammunition box that stores .5x43mm lethal bullets."
|
||||
id = "a543_lethal"
|
||||
materials = list(/datum/material/iron = 48000, /datum/material/silver = 12000)
|
||||
build_path = /obj/item/ammo_box/a543/lethal
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
category = list("Ammo")
|
||||
build_type = PROTOLATHE
|
||||
|
||||
/datum/design/a543_rubber
|
||||
name = "Ammo box (.5x43mm Rubber)"
|
||||
desc = "A 40 round ammunition box that stores .5x43mm rubber bullets."
|
||||
id = "a543_rubber"
|
||||
materials = list(/datum/material/iron = 36000, /datum/material/silver = 6000)
|
||||
build_path = /obj/item/ammo_box/a543/rubber
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
category = list("Ammo")
|
||||
build_type = PROTOLATHE
|
||||
|
||||
/datum/supply_pack/security/armory/ammo5x43mm
|
||||
name = ".5x43mm Ammunition Crate"
|
||||
desc = "Contains two boxes of .5x43mm rubber bullets and two boxes of .5x43mm lethal bullets. Requires Armory access to open."
|
||||
cost = 8500
|
||||
contains = list(/obj/item/ammo_box/a543/rubber,
|
||||
/obj/item/ammo_box/a543/rubber,
|
||||
/obj/item/ammo_box/a543/lethal,
|
||||
/obj/item/ammo_box/a543/lethal)
|
||||
crate_name = ".5x43mm ammunition crate"
|
||||
|
||||
@@ -262,3 +262,11 @@
|
||||
|
||||
/obj/item/gun/ballistic/automatic/smg22/nomag
|
||||
spawnwithmagazine = FALSE
|
||||
|
||||
/datum/supply_pack/security/armory/m46a1
|
||||
name = "Pink M46A1 Full-Auto Rifle Crate"
|
||||
desc = "Contains two high-powered, fully automatic rifles rifles chambered in .5x43mm. Requires Armory access to open."
|
||||
cost = 25000
|
||||
contains = list(/obj/item/gun/ballistic/automatic/m46a1,
|
||||
/obj/item/gun/ballistic/automatic/m46a1)
|
||||
crate_name = "m46a1 rifles crate"
|
||||
|
||||
@@ -382,3 +382,111 @@
|
||||
C.adjustOxyLoss(0.25)
|
||||
. = 1
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/twinkjuice
|
||||
name = "Twink Juice"
|
||||
description = "A long slender fruity drink with a green thick liquid inside. It smells nice and, and probably tastes fruity."
|
||||
color = "#3fd2ff"
|
||||
taste_description = "a concoction of dubious origins, and dubious purposes"
|
||||
glass_icon = 'modular_splurt/icons/obj/drinks.dmi'
|
||||
glass_icon_state = "twinkdrink"
|
||||
glass_name = "glass of Boy Kisser"
|
||||
glass_desc = "Looking at this, you think about backyards"
|
||||
pH = 6.5
|
||||
value = REAGENT_VALUE_UNCOMMON
|
||||
boozepwr = 5
|
||||
quality = DRINK_FANTASTIC
|
||||
var/drinkerWasAlreadySubmissive = FALSE
|
||||
|
||||
/datum/reagent/consumable/ethanol/twinkjuice/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
if (ishuman(L))
|
||||
var/mob/living/carbon/human/M = L
|
||||
if(M.client?.prefs.cit_toggles & NO_APHRO)
|
||||
M.log_message("drank [src], but ignored it due to aphrodisiac preference.", LOG_EMOTE)
|
||||
return
|
||||
|
||||
if(!M.has_quirk(/datum/quirk/well_trained))
|
||||
M.log_message("is now under the effect of [src].", LOG_EMOTE)
|
||||
M.add_quirk(/datum/quirk/well_trained, APHRO_TRAIT)
|
||||
else
|
||||
drinkerWasAlreadySubmissive = TRUE
|
||||
|
||||
/datum/reagent/consumable/ethanol/twinkjuice/on_mob_end_metabolize(mob/living/L)
|
||||
if (ishuman(L))
|
||||
var/mob/living/carbon/human/M = L
|
||||
if(M.has_quirk(/datum/quirk/well_trained) && !drinkerWasAlreadySubmissive)
|
||||
M.log_message("is no longer under the effect of [src].", LOG_EMOTE)
|
||||
M.remove_quirk(/datum/quirk/well_trained, APHRO_TRAIT)
|
||||
|
||||
|
||||
/datum/reagent/consumable/ethanol/midnight_tears
|
||||
name = "Midnight Tears"
|
||||
description = "A reflection of what your Heart feels a weak call for love.\n-Leo Oxto"
|
||||
glass_icon = 'modular_splurt/icons/obj/drinks.dmi'
|
||||
glass_icon_state = "midnight_tears"
|
||||
glass_name = "glass of Midnight Tears"
|
||||
taste_description = "the warm feeling of a hug"
|
||||
color = "#005DE9"
|
||||
|
||||
/datum/reagent/consumable/ethanol/midnight_tears/on_mob_life(mob/living/carbon/C)
|
||||
..()
|
||||
if ishuman(C)
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(!H.dna || !H.dna.species || !H.dna.species.can_wag_tail(H))
|
||||
return
|
||||
if(!H.dna.species.is_wagging_tail())
|
||||
H.dna.species.start_wagging_tail(H)
|
||||
|
||||
/datum/reagent/consumable/ethanol/midnight_sky
|
||||
name = "Midnight Sky"
|
||||
description = "An escape from all your troubles, may it help you find love and joy.\n-Leo Oxto"
|
||||
glass_icon = 'modular_splurt/icons/obj/drinks.dmi'
|
||||
glass_icon_state = "midnight_sky"
|
||||
glass_name = "glass of Midnight Sky"
|
||||
taste_description = "a calm taste like the calm night"
|
||||
color = "#060709"
|
||||
|
||||
/datum/reagent/consumable/ethanol/midnight_sky/on_mob_life(mob/living/carbon/C)
|
||||
..()
|
||||
C.adjustBruteLoss(-0.5)
|
||||
C.adjustFireLoss(-0.5)
|
||||
. = TRUE
|
||||
|
||||
/datum/reagent/consumable/ethanol/midnight_joy
|
||||
name = "Midnight Joy"
|
||||
description = " Be sure to spread this feeling, for some lack it in their life, be the reason they have a smile on their face.\n-Leo Oxto"
|
||||
glass_icon = 'modular_splurt/icons/obj/drinks.dmi'
|
||||
glass_icon_state = "midnight_joy"
|
||||
glass_name = "glass of Midnight Joy"
|
||||
taste_description = "sweet joy"
|
||||
color = "#FFF393"
|
||||
|
||||
/datum/reagent/consumable/ethanol/midnight_joy/on_mob_life(mob/living/carbon/C)
|
||||
..()
|
||||
if (prob(7))
|
||||
C.emote("giggle")
|
||||
|
||||
/obj/item/storage/box/drinkingglasses/midnight
|
||||
name = "Midnight Drinking Box"
|
||||
desc = "A box containing two glasses of each of the three midnight drinks."
|
||||
|
||||
/obj/item/storage/box/drinkingglasses/midnight/PopulateContents()
|
||||
new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_joy(src)
|
||||
new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_joy(src)
|
||||
new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_sky(src)
|
||||
new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_sky(src)
|
||||
new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_tears(src)
|
||||
new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_tears(src)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_joy
|
||||
name = "Midnight Joy"
|
||||
list_reagents = list(/datum/reagent/consumable/ethanol/midnight_joy = 50)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_sky
|
||||
name = "Midnight Sky"
|
||||
list_reagents = list(/datum/reagent/consumable/ethanol/midnight_sky = 50)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/filled/midnight_tears
|
||||
name = "Midnight Tears"
|
||||
list_reagents = list(/datum/reagent/consumable/ethanol/midnight_tears = 50)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
/datum/techweb_node/ballistic_weapons
|
||||
design_ids = list("mag_oldsmg", "mag_oldsmg_ap", "mag_oldsmg_ic", "mag_oldsmg_rubber", "mag_oldsmg_tx", "a543_rubber", "a543_lethal")
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
/obj/item/ancientartifact/useless/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W,/obj/item/xenoarch/help/research))
|
||||
if(!do_after(user,100,target=src))
|
||||
if(!do_after(user, 100, target=src))
|
||||
to_chat(user,"You must stand still to analyze.")
|
||||
return
|
||||
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 2000))
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
/obj/item/ancientartifact/faunafossil/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W,/obj/item/xenoarch/help/research))
|
||||
if(!do_after(user,100,target=src))
|
||||
if(!do_after(user, 100, target=src))
|
||||
to_chat(user,"You must stand still to analyze.")
|
||||
return
|
||||
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 4000))
|
||||
@@ -63,14 +63,14 @@
|
||||
|
||||
/obj/item/ancientartifact/florafossil/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W,/obj/item/xenoarch/help/research))
|
||||
if(!do_after(user,100,target=src))
|
||||
if(!do_after(user, 100, target=src))
|
||||
to_chat(user,"You must stand still to analyze.")
|
||||
return
|
||||
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = 4000))
|
||||
to_chat(user,"You successfully researched the artifact. You have gained 4000 research points.")
|
||||
qdel(src)
|
||||
if(istype(W,/obj/item/xenoarch/help/plant))
|
||||
if(!do_after(user,50,target=src))
|
||||
if(!do_after(user, 50, target=src))
|
||||
to_chat(user,"You need to stand still to extract the seeds.")
|
||||
return
|
||||
var/seed = pick(list( /obj/item/seeds/amauri,
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
tryagain = TRUE
|
||||
var/obj/item/xenoarch/clean/hammer/HM = W
|
||||
playsound(loc, HM.usesound, 50, 1, -1)
|
||||
if(!do_after(user,HM.cleanspeed,target = src))
|
||||
if(!do_after(user, HM.cleanspeed, target = src))
|
||||
to_chat(user,"You must stand still to clean.")
|
||||
tryagain = FALSE
|
||||
return
|
||||
@@ -60,7 +60,7 @@
|
||||
tryagain = TRUE
|
||||
var/obj/item/xenoarch/clean/brush/HM = W
|
||||
playsound(loc, HM.usesound, 50, 1, -1)
|
||||
if(!do_after(user,HM.brushspeed,target = src))
|
||||
if(!do_after(user, HM.brushspeed, target = src))
|
||||
to_chat(user,"You must stand still to clean.")
|
||||
tryagain = FALSE
|
||||
return
|
||||
@@ -83,7 +83,7 @@
|
||||
if(istype(W,/obj/item/xenoarch/help/scanner))
|
||||
var/obj/item/xenoarch/help/scanner/HM = W
|
||||
playsound(loc, HM.usesound, 50, 1, -1)
|
||||
if(!do_after(user,30,target = src))
|
||||
if(!do_after(user, 30, target = src))
|
||||
to_chat(user,"You must stand still to scan.")
|
||||
return
|
||||
playsound(loc, HM.usesound, 50, 1, -1)
|
||||
@@ -92,7 +92,7 @@
|
||||
if(istype(W,/obj/item/xenoarch/help/scanneradv))
|
||||
var/obj/item/xenoarch/help/scanneradv/HM = W
|
||||
playsound(loc, HM.usesound, 50, 1, -1)
|
||||
if(!do_after(user,10,target = src))
|
||||
if(!do_after(user, 10, target = src))
|
||||
to_chat(user,"You must stand still to scan.")
|
||||
return
|
||||
playsound(loc, HM.usesound, 50, 1, -1)
|
||||
@@ -102,7 +102,7 @@
|
||||
if(istype(W,/obj/item/xenoarch/help/measuring))
|
||||
var/obj/item/xenoarch/help/measuring/HM = W
|
||||
playsound(loc, HM.usesound, 50, 1, -1)
|
||||
if(!do_after(user,10,target = src))
|
||||
if(!do_after(user, 10, target = src))
|
||||
to_chat(user,"You must stand still to measure.")
|
||||
return
|
||||
if(!dugdepth)
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
if(!istype(target,/obj/item))
|
||||
return
|
||||
var/datum/export_report/ex = new
|
||||
if(!do_after(user,300,target=target))
|
||||
if(!do_after(user, 300, target=target))
|
||||
to_chat(user,"You need to stand still to export items.")
|
||||
return
|
||||
export_item_and_contents(target, export_categories , dry_run = FALSE, external_report = ex)
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
/obj/machinery/spaceship_navigation_beacon/invion
|
||||
name = "wall"
|
||||
icon = 'modular_splurt/icons/obj/objects.dmi'
|
||||
icon_state = "invisible"
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
@@ -1,3 +1,14 @@
|
||||
/obj/item/organ/lungs/ipc
|
||||
name = "IPC cooling system"
|
||||
desc = "Helps regulate the body temperature of synthetic beings. Helpful!"
|
||||
|
||||
/obj/item/organ/lungs/vox
|
||||
name = "plasma filter"
|
||||
desc = "A spongy rib-shaped mass for filtering plasma from the air."
|
||||
icon_state = "lungs-plasma"
|
||||
breathing_class = BREATH_PLASMA
|
||||
maxHealth = INFINITY//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm
|
||||
|
||||
/obj/item/organ/lungs/vox/populate_gas_info()
|
||||
..()
|
||||
gas_max -= GAS_PLASMA
|
||||
|
||||
Reference in New Issue
Block a user