Xenowork Prep For Future (#6491)
* Xenowork, weeds walls and material blobs. * More weeds * XenoUpdoots * Stop that, me.
@@ -152,6 +152,12 @@
|
|||||||
* Weeds
|
* Weeds
|
||||||
*/
|
*/
|
||||||
#define NODERANGE 3
|
#define NODERANGE 3
|
||||||
|
#define WEED_NORTH_EDGING "north"
|
||||||
|
#define WEED_SOUTH_EDGING "south"
|
||||||
|
#define WEED_EAST_EDGING "east"
|
||||||
|
#define WEED_WEST_EDGING "west"
|
||||||
|
#define WEED_NODE_GLOW "glow"
|
||||||
|
#define WEED_NODE_BASE "nodebase"
|
||||||
|
|
||||||
/obj/effect/alien/weeds
|
/obj/effect/alien/weeds
|
||||||
name = "weeds"
|
name = "weeds"
|
||||||
@@ -164,6 +170,18 @@
|
|||||||
layer = ABOVE_TURF_LAYER
|
layer = ABOVE_TURF_LAYER
|
||||||
var/health = 15
|
var/health = 15
|
||||||
var/obj/effect/alien/weeds/node/linked_node = null
|
var/obj/effect/alien/weeds/node/linked_node = null
|
||||||
|
var/static/list/weedImageCache
|
||||||
|
|
||||||
|
/obj/effect/alien/weeds/Destroy()
|
||||||
|
var/turf/T = get_turf(src)
|
||||||
|
// To not mess up the overlay updates.
|
||||||
|
loc = null
|
||||||
|
|
||||||
|
for (var/obj/effect/alien/weeds/W in range(1,T))
|
||||||
|
W.updateWeedOverlays()
|
||||||
|
|
||||||
|
linked_node = null
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/effect/alien/weeds/node
|
/obj/effect/alien/weeds/node
|
||||||
icon_state = "weednode"
|
icon_state = "weednode"
|
||||||
@@ -173,9 +191,22 @@
|
|||||||
light_range = NODERANGE
|
light_range = NODERANGE
|
||||||
var/node_range = NODERANGE
|
var/node_range = NODERANGE
|
||||||
|
|
||||||
|
var/set_color = null
|
||||||
|
|
||||||
/obj/effect/alien/weeds/node/New()
|
/obj/effect/alien/weeds/node/New()
|
||||||
..(src.loc, src)
|
..(src.loc, src)
|
||||||
|
|
||||||
|
/obj/effect/alien/weeds/node/Initialize()
|
||||||
|
..()
|
||||||
|
START_PROCESSING(SSobj, src)
|
||||||
|
|
||||||
|
spawn(1 SECOND)
|
||||||
|
if(color)
|
||||||
|
set_color = color
|
||||||
|
|
||||||
|
/obj/effect/alien/weeds/node/Destroy()
|
||||||
|
STOP_PROCESSING(SSobj, src)
|
||||||
|
..()
|
||||||
|
|
||||||
/obj/effect/alien/weeds/New(pos, node)
|
/obj/effect/alien/weeds/New(pos, node)
|
||||||
..()
|
..()
|
||||||
@@ -184,12 +215,45 @@
|
|||||||
return
|
return
|
||||||
linked_node = node
|
linked_node = node
|
||||||
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
|
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
|
||||||
spawn(rand(150, 200))
|
|
||||||
if(src)
|
fullUpdateWeedOverlays()
|
||||||
Life()
|
|
||||||
|
/obj/effect/alien/weeds/proc/updateWeedOverlays()
|
||||||
|
|
||||||
|
overlays.Cut()
|
||||||
|
|
||||||
|
if(!weedImageCache || !weedImageCache.len)
|
||||||
|
weedImageCache = list()
|
||||||
|
// weedImageCache.len = 4
|
||||||
|
weedImageCache[WEED_NORTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_n", layer=2.11, pixel_y = -32)
|
||||||
|
weedImageCache[WEED_SOUTH_EDGING] = image('icons/mob/alien.dmi', "weeds_side_s", layer=2.11, pixel_y = 32)
|
||||||
|
weedImageCache[WEED_EAST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_e", layer=2.11, pixel_x = -32)
|
||||||
|
weedImageCache[WEED_WEST_EDGING] = image('icons/mob/alien.dmi', "weeds_side_w", layer=2.11, pixel_x = 32)
|
||||||
|
|
||||||
|
var/turf/N = get_step(src, NORTH)
|
||||||
|
var/turf/S = get_step(src, SOUTH)
|
||||||
|
var/turf/E = get_step(src, EAST)
|
||||||
|
var/turf/W = get_step(src, WEST)
|
||||||
|
if(!locate(/obj/effect/alien) in N.contents)
|
||||||
|
if(istype(N, /turf/simulated/floor))
|
||||||
|
overlays += weedImageCache[WEED_SOUTH_EDGING]
|
||||||
|
if(!locate(/obj/effect/alien) in S.contents)
|
||||||
|
if(istype(S, /turf/simulated/floor))
|
||||||
|
overlays += weedImageCache[WEED_NORTH_EDGING]
|
||||||
|
if(!locate(/obj/effect/alien) in E.contents)
|
||||||
|
if(istype(E, /turf/simulated/floor))
|
||||||
|
overlays += weedImageCache[WEED_WEST_EDGING]
|
||||||
|
if(!locate(/obj/effect/alien) in W.contents)
|
||||||
|
if(istype(W, /turf/simulated/floor))
|
||||||
|
overlays += weedImageCache[WEED_EAST_EDGING]
|
||||||
|
|
||||||
|
/obj/effect/alien/weeds/proc/fullUpdateWeedOverlays()
|
||||||
|
for (var/obj/effect/alien/weeds/W in range(1,src))
|
||||||
|
W.updateWeedOverlays()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/effect/alien/weeds/proc/Life()
|
/obj/effect/alien/weeds/process()
|
||||||
set background = 1
|
set background = 1
|
||||||
var/turf/U = get_turf(src)
|
var/turf/U = get_turf(src)
|
||||||
/*
|
/*
|
||||||
@@ -211,6 +275,9 @@ Alien plants should do something if theres a lot of poison
|
|||||||
if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) )
|
if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) )
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if(linked_node != src)
|
||||||
|
color = linked_node.set_color
|
||||||
|
|
||||||
direction_loop:
|
direction_loop:
|
||||||
for(var/dirn in cardinal)
|
for(var/dirn in cardinal)
|
||||||
var/turf/T = get_step(src, dirn)
|
var/turf/T = get_step(src, dirn)
|
||||||
@@ -222,10 +289,33 @@ Alien plants should do something if theres a lot of poison
|
|||||||
// continue
|
// continue
|
||||||
|
|
||||||
for(var/obj/O in T)
|
for(var/obj/O in T)
|
||||||
if(O.density)
|
if(!O.CanZASPass(U))
|
||||||
continue direction_loop
|
continue direction_loop
|
||||||
|
|
||||||
new /obj/effect/alien/weeds(T, linked_node)
|
var/obj/effect/E = new /obj/effect/alien/weeds(T, linked_node)
|
||||||
|
|
||||||
|
E.color = color
|
||||||
|
|
||||||
|
if(istype(src, /obj/effect/alien/weeds/node))
|
||||||
|
var/obj/effect/alien/weeds/node/N = src
|
||||||
|
var/list/nearby_weeds = list()
|
||||||
|
for(var/obj/effect/alien/weeds/W in range(N.node_range,src))
|
||||||
|
nearby_weeds |= W
|
||||||
|
|
||||||
|
for(var/obj/effect/alien/weeds/W in nearby_weeds)
|
||||||
|
if(!W)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if(!W.linked_node)
|
||||||
|
linked_node = src
|
||||||
|
|
||||||
|
W.color = W.linked_node.set_color
|
||||||
|
|
||||||
|
if(W == src)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if(prob(max(10, 40 - (5 * nearby_weeds.len))))
|
||||||
|
W.process()
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/alien/weeds/ex_act(severity)
|
/obj/effect/alien/weeds/ex_act(severity)
|
||||||
@@ -282,7 +372,12 @@ Alien plants should do something if theres a lot of poison
|
|||||||
healthcheck()
|
healthcheck()
|
||||||
|
|
||||||
#undef NODERANGE
|
#undef NODERANGE
|
||||||
|
#undef WEED_NORTH_EDGING
|
||||||
|
#undef WEED_SOUTH_EDGING
|
||||||
|
#undef WEED_EAST_EDGING
|
||||||
|
#undef WEED_WEST_EDGING
|
||||||
|
#undef WEED_NODE_GLOW
|
||||||
|
#undef WEED_NODE_BASE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Acid
|
* Acid
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
|
|
||||||
/obj/structure/girder/update_icon()
|
/obj/structure/girder/update_icon()
|
||||||
if(anchored)
|
if(anchored)
|
||||||
icon_state = "girder"
|
icon_state = initial(icon_state)
|
||||||
else
|
else
|
||||||
icon_state = "displaced"
|
icon_state = "displaced"
|
||||||
|
|
||||||
@@ -320,6 +320,7 @@
|
|||||||
name = "column"
|
name = "column"
|
||||||
icon= 'icons/obj/cult.dmi'
|
icon= 'icons/obj/cult.dmi'
|
||||||
icon_state= "cultgirder"
|
icon_state= "cultgirder"
|
||||||
|
max_health = 250
|
||||||
health = 250
|
health = 250
|
||||||
cover = 70
|
cover = 70
|
||||||
girder_material = "cult"
|
girder_material = "cult"
|
||||||
@@ -354,6 +355,13 @@
|
|||||||
new /obj/effect/decal/remains/human(get_turf(src))
|
new /obj/effect/decal/remains/human(get_turf(src))
|
||||||
dismantle()
|
dismantle()
|
||||||
|
|
||||||
|
/obj/structure/girder/resin
|
||||||
|
name = "soft girder"
|
||||||
|
icon_state = "girder_resin"
|
||||||
|
max_health = 225
|
||||||
|
health = 225
|
||||||
|
cover = 60
|
||||||
|
girder_material = "resin"
|
||||||
|
|
||||||
/obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
/obj/structure/girder/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode)
|
||||||
var/turf/simulated/T = get_turf(src)
|
var/turf/simulated/T = get_turf(src)
|
||||||
|
|||||||
@@ -93,8 +93,9 @@
|
|||||||
if(..()) return 1
|
if(..()) return 1
|
||||||
|
|
||||||
if(!can_open)
|
if(!can_open)
|
||||||
to_chat(user, "<span class='notice'>You push the wall, but nothing happens.</span>")
|
if(!material.wall_touch_special(src, user))
|
||||||
playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
|
to_chat(user, "<span class='notice'>You push the wall, but nothing happens.</span>")
|
||||||
|
playsound(src, 'sound/weapons/Genhit.ogg', 25, 1)
|
||||||
else
|
else
|
||||||
toggle_open(user)
|
toggle_open(user)
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -59,6 +59,9 @@
|
|||||||
/turf/simulated/wall/snowbrick/New(var/newloc)
|
/turf/simulated/wall/snowbrick/New(var/newloc)
|
||||||
..(newloc,"packed snow")
|
..(newloc,"packed snow")
|
||||||
|
|
||||||
|
/turf/simulated/wall/resin/New(var/newloc)
|
||||||
|
..(newloc,"resin",null,"resin")
|
||||||
|
|
||||||
// Kind of wondering if this is going to bite me in the butt.
|
// Kind of wondering if this is going to bite me in the butt.
|
||||||
/turf/simulated/wall/skipjack/New(var/newloc)
|
/turf/simulated/wall/skipjack/New(var/newloc)
|
||||||
..(newloc,"alienalloy")
|
..(newloc,"alienalloy")
|
||||||
|
|||||||
@@ -225,3 +225,14 @@
|
|||||||
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE)
|
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE)
|
||||||
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE)
|
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE)
|
||||||
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE)
|
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE)
|
||||||
|
|
||||||
|
/material/resin/generate_recipes()
|
||||||
|
recipes = list()
|
||||||
|
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||||
|
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
|
||||||
|
recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||||
|
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||||
|
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE)
|
||||||
|
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
|
||||||
|
recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE)
|
||||||
|
recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS)
|
||||||
|
|||||||
@@ -371,6 +371,15 @@
|
|||||||
pass_color = TRUE
|
pass_color = TRUE
|
||||||
strict_color_stacking = TRUE
|
strict_color_stacking = TRUE
|
||||||
|
|
||||||
|
/obj/item/stack/material/resin
|
||||||
|
name = "resin"
|
||||||
|
icon_state = "sheet-resin"
|
||||||
|
default_type = "resin"
|
||||||
|
no_variants = TRUE
|
||||||
|
apply_colour = TRUE
|
||||||
|
pass_color = TRUE
|
||||||
|
strict_color_stacking = TRUE
|
||||||
|
|
||||||
/obj/item/stack/material/cardboard
|
/obj/item/stack/material/cardboard
|
||||||
name = "cardboard"
|
name = "cardboard"
|
||||||
icon_state = "sheet-card"
|
icon_state = "sheet-card"
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
stone
|
stone
|
||||||
metal
|
metal
|
||||||
solid
|
solid
|
||||||
|
resin
|
||||||
ONLY WALLS
|
ONLY WALLS
|
||||||
cult
|
cult
|
||||||
hull
|
hull
|
||||||
@@ -240,6 +241,10 @@ var/list/name_to_material
|
|||||||
/material/proc/combustion_effect(var/turf/T, var/temperature)
|
/material/proc/combustion_effect(var/turf/T, var/temperature)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
// Used by walls to do on-touch things, after checking for crumbling and open-ability.
|
||||||
|
/material/proc/wall_touch_special(var/turf/simulated/wall/W, var/mob/living/L)
|
||||||
|
return
|
||||||
|
|
||||||
// Datum definitions follow.
|
// Datum definitions follow.
|
||||||
/material/uranium
|
/material/uranium
|
||||||
name = "uranium"
|
name = "uranium"
|
||||||
@@ -824,12 +829,18 @@ var/list/name_to_material
|
|||||||
/material/resin
|
/material/resin
|
||||||
name = "resin"
|
name = "resin"
|
||||||
icon_colour = "#35343a"
|
icon_colour = "#35343a"
|
||||||
|
icon_base = "resin"
|
||||||
dooropen_noise = 'sound/effects/attackblob.ogg'
|
dooropen_noise = 'sound/effects/attackblob.ogg'
|
||||||
door_icon_base = "resin"
|
door_icon_base = "resin"
|
||||||
|
icon_reinf = "reinf_mesh"
|
||||||
melting_point = T0C+300
|
melting_point = T0C+300
|
||||||
sheet_singular_name = "blob"
|
sheet_singular_name = "blob"
|
||||||
sheet_plural_name = "blobs"
|
sheet_plural_name = "blobs"
|
||||||
conductive = 0
|
conductive = 0
|
||||||
|
explosion_resistance = 60
|
||||||
|
radiation_resistance = 10
|
||||||
|
stack_origin_tech = list(TECH_MATERIAL = 8, TECH_PHORON = 4, TECH_BLUESPACE = 4, TECH_BIO = 7)
|
||||||
|
stack_type = /obj/item/stack/material/resin
|
||||||
|
|
||||||
/material/resin/can_open_material_door(var/mob/living/user)
|
/material/resin/can_open_material_door(var/mob/living/user)
|
||||||
var/mob/living/carbon/M = user
|
var/mob/living/carbon/M = user
|
||||||
@@ -837,6 +848,17 @@ var/list/name_to_material
|
|||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
/material/resin/wall_touch_special(var/turf/simulated/wall/W, var/mob/living/L)
|
||||||
|
var/mob/living/carbon/M = L
|
||||||
|
if(istype(M) && locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
|
||||||
|
to_chat(M, "<span class='alien'>\The [W] shudders under your touch, starting to become porous.</span>")
|
||||||
|
playsound(W, 'sound/effects/attackblob.ogg', 50, 1)
|
||||||
|
if(do_after(L, 5 SECONDS))
|
||||||
|
spawn(2)
|
||||||
|
playsound(W, 'sound/effects/attackblob.ogg', 100, 1)
|
||||||
|
W.dismantle_wall()
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
/material/wood
|
/material/wood
|
||||||
name = MAT_WOOD
|
name = MAT_WOOD
|
||||||
|
|||||||
@@ -1283,6 +1283,9 @@
|
|||||||
else if (affecting.robotic >= ORGAN_LIFELIKE)
|
else if (affecting.robotic >= ORGAN_LIFELIKE)
|
||||||
. = 0
|
. = 0
|
||||||
fail_msg = "Your needle refuses to penetrate more than a short distance..."
|
fail_msg = "Your needle refuses to penetrate more than a short distance..."
|
||||||
|
else if (affecting.thick_skin && prob(70 - round(affecting.brute_dam + affecting.burn_dam / 2))) // Allows transplanted limbs with thick skin to maintain their resistance.
|
||||||
|
. = 0
|
||||||
|
fail_msg = "Your needle fails to penetrate \the [affecting]'s thick hide..."
|
||||||
else
|
else
|
||||||
switch(target_zone)
|
switch(target_zone)
|
||||||
if(BP_HEAD)
|
if(BP_HEAD)
|
||||||
|
|||||||
@@ -121,7 +121,9 @@
|
|||||||
|
|
||||||
if(check_alien_ability(50,1,O_RESIN))
|
if(check_alien_ability(50,1,O_RESIN))
|
||||||
visible_message("<span class='alium'><B>[src] has planted some alien weeds!</B></span>")
|
visible_message("<span class='alium'><B>[src] has planted some alien weeds!</B></span>")
|
||||||
new /obj/effect/alien/weeds/node(loc)
|
var/obj/O = new /obj/effect/alien/weeds/node(loc)
|
||||||
|
if(O)
|
||||||
|
O.color = "#321D37"
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/Spit(var/atom/A)
|
/mob/living/carbon/human/proc/Spit(var/atom/A)
|
||||||
@@ -231,7 +233,7 @@
|
|||||||
set desc = "Secrete tough malleable resin."
|
set desc = "Secrete tough malleable resin."
|
||||||
set category = "Abilities"
|
set category = "Abilities"
|
||||||
|
|
||||||
var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist
|
var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest","resin blob") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist
|
||||||
if(!choice)
|
if(!choice)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -239,15 +241,24 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
visible_message("<span class='warning'><B>[src] vomits up a thick purple substance and begins to shape it!</B></span>", "<span class='alium'>You shape a [choice].</span>")
|
visible_message("<span class='warning'><B>[src] vomits up a thick purple substance and begins to shape it!</B></span>", "<span class='alium'>You shape a [choice].</span>")
|
||||||
|
|
||||||
|
var/obj/O
|
||||||
|
|
||||||
switch(choice)
|
switch(choice)
|
||||||
if("resin door")
|
if("resin door")
|
||||||
new /obj/structure/simple_door/resin(loc)
|
O = new /obj/structure/simple_door/resin(loc)
|
||||||
if("resin wall")
|
if("resin wall")
|
||||||
new /obj/effect/alien/resin/wall(loc)
|
O = new /obj/effect/alien/resin/wall(loc)
|
||||||
if("resin membrane")
|
if("resin membrane")
|
||||||
new /obj/effect/alien/resin/membrane(loc)
|
O = new /obj/effect/alien/resin/membrane(loc)
|
||||||
if("resin nest")
|
if("resin nest")
|
||||||
new /obj/structure/bed/nest(loc)
|
O = new /obj/structure/bed/nest(loc)
|
||||||
|
if("resin blob")
|
||||||
|
O = new /obj/item/stack/material/resin(loc)
|
||||||
|
|
||||||
|
if(O)
|
||||||
|
O.color = "#321D37"
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/leap()
|
/mob/living/carbon/human/proc/leap()
|
||||||
|
|||||||
@@ -66,17 +66,17 @@
|
|||||||
var/weeds_plasma_rate = 5 // Plasma regen on weeds.
|
var/weeds_plasma_rate = 5 // Plasma regen on weeds.
|
||||||
|
|
||||||
has_limbs = list(
|
has_limbs = list(
|
||||||
BP_TORSO = list("path" = /obj/item/organ/external/chest),
|
BP_TORSO = list("path" = /obj/item/organ/external/chest/unseverable/xeno),
|
||||||
BP_GROIN = list("path" = /obj/item/organ/external/groin),
|
BP_GROIN = list("path" = /obj/item/organ/external/groin/unseverable/xeno),
|
||||||
BP_HEAD = list("path" = /obj/item/organ/external/head/no_eyes),
|
BP_HEAD = list("path" = /obj/item/organ/external/head/unseverable/xeno),
|
||||||
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
|
BP_L_ARM = list("path" = /obj/item/organ/external/arm/unseverable/xeno),
|
||||||
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
|
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unseverable/xeno),
|
||||||
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
|
BP_L_LEG = list("path" = /obj/item/organ/external/leg/unseverable/xeno),
|
||||||
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
|
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unseverable/xeno),
|
||||||
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
|
BP_L_HAND = list("path" = /obj/item/organ/external/hand/unseverable/xeno),
|
||||||
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
|
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unseverable/xeno),
|
||||||
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
|
BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unseverable/xeno),
|
||||||
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
|
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unseverable/xeno)
|
||||||
)
|
)
|
||||||
|
|
||||||
/datum/species/xenos/get_bodytype()
|
/datum/species/xenos/get_bodytype()
|
||||||
@@ -136,7 +136,7 @@
|
|||||||
H.adjustOxyLoss(-heal_rate)
|
H.adjustOxyLoss(-heal_rate)
|
||||||
H.adjustToxLoss(-heal_rate)
|
H.adjustToxLoss(-heal_rate)
|
||||||
if (prob(5))
|
if (prob(5))
|
||||||
H << "<span class='alium'>You feel a soothing sensation come over you...</span>"
|
H << "<span class='alien'>You feel a soothing sensation come over you...</span>"
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
//next internal organs
|
//next internal organs
|
||||||
@@ -144,7 +144,7 @@
|
|||||||
if(I.damage > 0)
|
if(I.damage > 0)
|
||||||
I.damage = max(I.damage - heal_rate, 0)
|
I.damage = max(I.damage - heal_rate, 0)
|
||||||
if (prob(5))
|
if (prob(5))
|
||||||
H << "<span class='alium'>You feel a soothing sensation within your [I.parent_organ]...</span>"
|
H << "<span class='alien'>You feel a soothing sensation within your [I.parent_organ]...</span>"
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
//next mend broken bones, approx 10 ticks each
|
//next mend broken bones, approx 10 ticks each
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
if (E.status & ORGAN_BROKEN)
|
if (E.status & ORGAN_BROKEN)
|
||||||
if (prob(mend_prob))
|
if (prob(mend_prob))
|
||||||
if (E.mend_fracture())
|
if (E.mend_fracture())
|
||||||
H << "<span class='alium'>You feel something mend itself inside your [E.name].</span>"
|
H << "<span class='alien'>You feel something mend itself inside your [E.name].</span>"
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ var/list/organ_cache = list()
|
|||||||
var/vital // Lose a vital limb, die immediately.
|
var/vital // Lose a vital limb, die immediately.
|
||||||
var/damage = 0 // Current damage to the organ
|
var/damage = 0 // Current damage to the organ
|
||||||
var/robotic = 0
|
var/robotic = 0
|
||||||
|
var/stapled_nerves = FALSE
|
||||||
|
|
||||||
// Reference data.
|
// Reference data.
|
||||||
var/mob/living/carbon/human/owner // Current mob owning the organ.
|
var/mob/living/carbon/human/owner // Current mob owning the organ.
|
||||||
@@ -431,6 +432,8 @@ var/list/organ_cache = list()
|
|||||||
return 0
|
return 0
|
||||||
if(robotic && robotic < ORGAN_LIFELIKE) //Super fancy humanlike robotics probably have sensors, or something?
|
if(robotic && robotic < ORGAN_LIFELIKE) //Super fancy humanlike robotics probably have sensors, or something?
|
||||||
return 0
|
return 0
|
||||||
|
if(stapled_nerves)
|
||||||
|
return 0
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/obj/item/organ/proc/handle_organ_mod_special(var/removed = FALSE) // Called when created, transplanted, and removed.
|
/obj/item/organ/proc/handle_organ_mod_special(var/removed = FALSE) // Called when created, transplanted, and removed.
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
var/burn_dam = 0 // Actual current burn damage.
|
var/burn_dam = 0 // Actual current burn damage.
|
||||||
var/last_dam = -1 // used in healing/processing calculations.
|
var/last_dam = -1 // used in healing/processing calculations.
|
||||||
var/spread_dam = 0
|
var/spread_dam = 0
|
||||||
|
var/thick_skin = 0 // If a needle has a chance to fail to penetrate.
|
||||||
|
|
||||||
// Appearance vars.
|
// Appearance vars.
|
||||||
var/nonsolid // Snowflake warning, reee. Used for slime limbs.
|
var/nonsolid // Snowflake warning, reee. Used for slime limbs.
|
||||||
|
|||||||
@@ -63,3 +63,9 @@
|
|||||||
cannot_amputate = 1
|
cannot_amputate = 1
|
||||||
cannot_break = 1
|
cannot_break = 1
|
||||||
dislocated = -1
|
dislocated = -1
|
||||||
|
|
||||||
|
/obj/item/organ/external/head/no_eyes/indestructible
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
cannot_break = 1
|
||||||
|
dislocated = -1
|
||||||
|
|||||||
@@ -137,3 +137,79 @@
|
|||||||
if(ishuman(owner))
|
if(ishuman(owner))
|
||||||
H = owner
|
H = owner
|
||||||
color = H.species.blood_color
|
color = H.species.blood_color
|
||||||
|
|
||||||
|
|
||||||
|
// XENOMORPH EXTERNAL ORGANS
|
||||||
|
|
||||||
|
/obj/item/organ/external/chest/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/groin/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
encased = TRUE
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/arm/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
stapled_nerves = TRUE
|
||||||
|
encased = TRUE
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/arm/right/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
stapled_nerves = TRUE
|
||||||
|
encased = TRUE
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/leg/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
stapled_nerves = TRUE
|
||||||
|
encased = TRUE
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/leg/right/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
stapled_nerves = TRUE
|
||||||
|
encased = TRUE
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/foot/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
stapled_nerves = TRUE
|
||||||
|
encased = TRUE
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/foot/right/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
stapled_nerves = TRUE
|
||||||
|
encased = TRUE
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/hand/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
stapled_nerves = TRUE
|
||||||
|
encased = TRUE
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/hand/right/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
stapled_nerves = TRUE
|
||||||
|
encased = TRUE
|
||||||
|
thick_skin = TRUE
|
||||||
|
|
||||||
|
/obj/item/organ/external/head/unseverable/xeno
|
||||||
|
cannot_gib = 1
|
||||||
|
cannot_amputate = 1
|
||||||
|
thick_skin = TRUE
|
||||||
|
eye_icon = "blank_eyes"
|
||||||
|
|||||||
@@ -183,8 +183,8 @@
|
|||||||
if(H.wear_suit)
|
if(H.wear_suit)
|
||||||
if(istype(H.wear_suit, /obj/item/clothing/suit/space))
|
if(istype(H.wear_suit, /obj/item/clothing/suit/space))
|
||||||
injtime = injtime * 2
|
injtime = injtime * 2
|
||||||
else if(!H.can_inject(user, 1))
|
if(!H.can_inject(user, 1))
|
||||||
return
|
return
|
||||||
|
|
||||||
else if(isliving(target))
|
else if(isliving(target))
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 111 KiB |