Environment Protection Bags + Minor Weather Changes (#59752)

Co-authored-by: Matthew J. <12817816+ZephyrTFA@users.noreply.github.com>
This commit is contained in:
Greniza
2021-07-03 22:05:58 -07:00
committed by GitHub
parent ea59898bc1
commit b2ecb787e1
41 changed files with 351 additions and 62 deletions
@@ -1274,11 +1274,11 @@
/area/security/prison)
"afD" = (
/obj/structure/table,
/obj/item/electropack,
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/item/electropack,
/turf/open/floor/iron,
/area/security/prison)
"afF" = (
@@ -30983,8 +30983,6 @@
/area/hallway/secondary/exit)
"iVY" = (
/obj/structure/table,
/obj/item/assembly/signaler,
/obj/item/clothing/suit/straight_jacket,
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -30995,6 +30993,8 @@
network = list("ss13","prison")
},
/obj/machinery/light/directional/south,
/obj/item/assembly/signaler,
/obj/item/clothing/suit/straight_jacket,
/turf/open/floor/iron,
/area/security/prison)
"iWe" = (
+14 -1
View File
@@ -8370,10 +8370,23 @@
/area/centcom/ferry)
"Ak" = (
/obj/structure/table/reinforced,
/obj/item/storage/firstaid/regular,
/obj/item/storage/firstaid/regular{
pixel_x = -7
},
/obj/effect/turf_decal/stripes/line{
dir = 5
},
/obj/item/bodybag/environmental/nanotrasen{
pixel_x = 7;
pixel_y = 12
},
/obj/item/bodybag/environmental/nanotrasen{
pixel_x = 7;
pixel_y = 6
},
/obj/item/bodybag/environmental/nanotrasen{
pixel_x = 7
},
/turf/open/floor/iron,
/area/centcom/ferry)
"Al" = (
+10
View File
@@ -42,6 +42,16 @@
/// Involved in checking the likelyhood of applying a wound to a mob.
#define WOUND "wound"
// Weather immunities //
#define WEATHER_STORM "storm"
#define WEATHER_ACID "acid"
#define WEATHER_ASH "ash"
#define WEATHER_LAVA "lava"
#define WEATHER_RAD "rad"
#define WEATHER_SNOW "snow"
#define WEATHER_VOID "void"
#define WEATHER_ALL "all"
//bitflag damage defines used for suicide_act
#define BRUTELOSS (1<<0)
#define FIRELOSS (1<<1)
+21 -7
View File
@@ -63,7 +63,7 @@
/// If the weather has no purpose other than looks
var/aesthetic = FALSE
/// Used by mobs to prevent them from being affected by the weather
var/immunity_type = "storm"
var/immunity_type = WEATHER_STORM
/// The stage of the weather, from 1-4
var/stage = END_STAGE
@@ -189,14 +189,28 @@
* Returns TRUE if the living mob can be affected by the weather
*
*/
/datum/weather/proc/can_weather_act(mob/living/act_on)
var/turf/mob_turf = get_turf(act_on)
if(mob_turf && !(mob_turf.z in impacted_z_levels))
/datum/weather/proc/can_weather_act(mob/living/mob_to_check)
var/turf/mob_turf = get_turf(mob_to_check)
if(!(mob_turf.z in impacted_z_levels))
if(mob_turf)
return
if(!(mob_to_check.loc.z in impacted_z_levels)) // in this case, get_turf(mob_to_check) =/= mob_to_check.loc, so we have to proceed with checking the location's type
return
if(istype(mob_to_check.loc, /obj/structure/closet))
var/obj/structure/closet/current_locker = mob_to_check.loc
if(current_locker.weather_protection)
if((immunity_type in current_locker.weather_protection) || (WEATHER_ALL in current_locker.weather_protection))
return
if((immunity_type in mob_to_check.weather_immunities) || (WEATHER_ALL in mob_to_check.weather_immunities))
return
if(immunity_type in act_on.weather_immunities)
return
if(!(get_area(act_on) in impacted_areas))
if(!(get_area(mob_to_check) in impacted_areas))
return
return TRUE
/**
@@ -21,7 +21,7 @@
protect_indoors = TRUE
target_trait = ZTRAIT_ACIDRAIN
immunity_type = ACID // temp
immunity_type = WEATHER_ACID // temp
barometer_predictable = TRUE
@@ -20,7 +20,7 @@
protect_indoors = TRUE
target_trait = ZTRAIT_ASHSTORM
immunity_type = "ash"
immunity_type = WEATHER_ASH
probability = 90
@@ -72,7 +72,7 @@
return TRUE
if(isliving(L))// if we're a non immune mob inside an immune mob we have to reconsider if that mob is immune to protect ourselves
var/mob/living/the_mob = L
if("ash" in the_mob.weather_immunities)
if(WEATHER_ASH in the_mob.weather_immunities)
return TRUE
L = L.loc //Check parent items immunities (recurses up to the turf)
return FALSE //RIP you
@@ -20,7 +20,7 @@
overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only
overlay_plane = FLOOR_PLANE
immunity_type = "lava"
immunity_type = WEATHER_LAVA
/datum/weather/floor_is_lava/weather_act(mob/living/L)
@@ -21,7 +21,7 @@
/area/ai_monitored/turret_protected/ai, /area/commons/storage/emergency/starboard, /area/commons/storage/emergency/port, /area/shuttle, /area/security/prison/safe, /area/security/prison/toilet)
target_trait = ZTRAIT_STATION
immunity_type = RAD
immunity_type = WEATHER_RAD
/datum/weather/rad_storm/telegraph()
..()
@@ -19,7 +19,7 @@
protect_indoors = TRUE
target_trait = ZTRAIT_SNOWSTORM
immunity_type = "snow"
immunity_type = WEATHER_SNOW
barometer_predictable = TRUE
@@ -17,7 +17,7 @@
protect_indoors = FALSE
target_trait = ZTRAIT_VOIDSTORM
immunity_type = "void"
immunity_type = WEATHER_VOID
barometer_predictable = FALSE
perpetual = TRUE
+5
View File
@@ -75,6 +75,11 @@
/// Whether this atom should have its dir automatically changed when it moves. Setting this to FALSE allows for things such as directional windows to retain dir on moving without snowflake code all of the place.
var/set_dir_on_move = TRUE
/// The degree of thermal insulation that mobs in list/contents have from the external environment, between 0 and 1
var/contents_thermal_insulation = 0
/// The degree of pressure protection that mobs in list/contents have from the external environment, between 0 and 1
var/contents_pressure_protection = 0
/atom/movable/Initialize(mapload)
. = ..()
+31
View File
@@ -89,3 +89,34 @@
return
loc.visible_message(span_warning("[user] suddenly appears in front of [loc]!"), span_userdanger("[user] breaks free of [src]!"))
qdel(src)
/obj/item/bodybag/environmental
name = "environmental protection bag"
desc = "A folded, reinforced bag designed to protect against exoplanetary environmental storms."
icon = 'icons/obj/bodybag.dmi'
icon_state = "envirobag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental
w_class = WEIGHT_CLASS_NORMAL //It's reinforced and insulated, like a beefed-up sleeping bag, so it has a higher bulkiness than regular bodybag
resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF
/obj/item/bodybag/environmental/nanotrasen
name = "elite environmental protection bag"
desc = "A folded, heavily reinforced, and insulated bag, capable of fully isolating its contents from external factors."
icon_state = "ntenvirobag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/nanotrasen
resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF | LAVA_PROOF
/obj/item/bodybag/environmental/prisoner
name = "prisoner transport bag"
desc = "Intended for transport of prisoners through hazardous environments, this folded environmental protection bag comes with straps to keep an occupant secure."
icon = 'icons/obj/bodybag.dmi'
icon_state = "prisonerenvirobag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner
/obj/item/bodybag/environmental/prisoner/syndicate
name = "syndicate prisoner transport bag"
desc = "An alteration of Nanotrasen's environmental protection bag which has been used in several high-profile kidnappings. Designed to keep a victim unconscious, alive, and secured until they are transported to a required location."
icon = 'icons/obj/bodybag.dmi'
icon_state = "syndieenvirobag_folded"
unfoldedbag_path = /obj/structure/closet/body_bag/environmental/prisoner/syndicate
resistance_flags = ACID_PROOF | FIRE_PROOF | FREEZE_PROOF | LAVA_PROOF
@@ -296,12 +296,12 @@
/obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr)
. = ..()
if(.)
LAZYADD(R.weather_immunities, "lava")
LAZYADD(R.weather_immunities, WEATHER_LAVA)
/obj/item/borg/upgrade/lavaproof/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
LAZYREMOVE(R.weather_immunities, "lava")
LAZYREMOVE(R.weather_immunities, WEATHER_LAVA)
/obj/item/borg/upgrade/selfrepair
name = "self-repair module"
@@ -44,6 +44,12 @@
var/delivery_icon = "deliverycloset" //which icon to use when packagewrapped. null to be unwrappable.
var/anchorable = TRUE
var/icon_welded = "welded"
/// Protection against weather that being inside of it provides.
var/list/weather_protection = null
/// How close being inside of the thing provides complete pressure safety. Must be between 0 and 1!
contents_pressure_protection = 0
/// How insulated the thing is, for the purposes of calculating body temperature. Must be between 0 and 1!
contents_thermal_insulation = 0
/// Whether a skittish person can dive inside this closet. Disable if opening the closet causes "bad things" to happen or that it leads to a logical inconsistency.
var/divable = TRUE
/// true whenever someone with the strong pull component is dragging this, preventing opening
@@ -27,13 +27,13 @@
QDEL_NULL(foldedbag_instance)
return ..()
/obj/structure/closet/body_bag/attackby(obj/item/I, mob/user, params)
if (istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon))
/obj/structure/closet/body_bag/attackby(obj/item/interact_tool, mob/user, params)
if (istype(interact_tool, /obj/item/pen) || istype(interact_tool, /obj/item/toy/crayon))
if(!user.is_literate())
to_chat(user, span_notice("You scribble illegibly on [src]!"))
return
var/t = stripped_input(user, "What would you like the label to be?", name, null, 53)
if(user.get_active_held_item() != I)
if(user.get_active_held_item() != interact_tool)
return
if(!user.canUseTopic(src, BE_CLOSE))
return
@@ -44,7 +44,7 @@
else
name = initial(name)
return
else if(I.tool_behaviour == TOOL_WIRECUTTER)
else if((interact_tool.tool_behaviour == TOOL_WIRECUTTER) && tagged)
to_chat(user, span_notice("You cut the tag off [src]."))
name = "body bag"
tagged = FALSE
@@ -87,9 +87,10 @@
if(opened)
to_chat(the_folder, span_warning("You wrestle with [src], but it won't fold while unzipped."))
return
if(contents.len)
to_chat(the_folder, span_warning("There are too many things inside of [src] to fold it up!"))
return
for(var/content_thing in contents)
if(istype(content_thing, /mob) || istype(content_thing, /obj))
to_chat(the_folder, span_warning("There are too many things inside of [src] to fold it up!"))
return
// toto we made it!
return TRUE
@@ -148,3 +149,198 @@
max_weight_of_contents = A_is_item.w_class
B.w_class = max_weight_of_contents
usr.put_in_hands(B)
/// Environmental bags
/obj/structure/closet/body_bag/environmental
name = "environmental protection bag"
desc = "An insulated, reinforced bag designed to protect against exoplanetary storms and other environmental factors."
icon = 'icons/obj/bodybag.dmi'
icon_state = "envirobag"
mob_storage_capacity = 1
contents_pressure_protection = 0.8
contents_thermal_insulation = 0.5
foldedbag_path = /obj/item/bodybag/environmental/
weather_protection = list(WEATHER_ACID, WEATHER_ASH, WEATHER_RAD, WEATHER_SNOW, WEATHER_VOID) // Does not protect against lava or the The Floor Is Lava spell.
/obj/structure/closet/body_bag/environmental/nanotrasen
name = "elite environmental protection bag"
desc = "A heavily reinforced and insulated bag, capable of fully isolating its contents from external factors."
icon = 'icons/obj/bodybag.dmi'
icon_state = "ntenvirobag"
contents_pressure_protection = 1
contents_thermal_insulation = 1
foldedbag_path = /obj/item/bodybag/environmental/nanotrasen/
weather_protection = list(WEATHER_ALL)
/// Securable enviro. bags
/obj/structure/closet/body_bag/environmental/prisoner
name = "prisoner transport bag"
desc = "Intended for transport of prisoners through hazardous environments, this environmental protection bag comes with straps to keep an occupant secure."
icon = 'icons/obj/bodybag.dmi'
icon_state = "prisonerenvirobag"
foldedbag_path = /obj/item/bodybag/environmental/prisoner/
breakout_time = 4 MINUTES // because it's probably about as hard to get out of this as it is to get out of a straightjacket.
/// How long it takes to sinch the bag.
var/sinch_time = 10 SECONDS
/// Whether or not the bag is sinched. Starts unsinched.
var/sinched = FALSE
/// The sound that plays when the bag is done sinching.
var/sinch_sound = 'sound/items/equip/toolbelt_equip.ogg'
/obj/structure/closet/body_bag/environmental/prisoner/attempt_fold(mob/living/carbon/human/the_folder)
if(sinched)
to_chat(the_folder, span_warning("You wrestle with [src], but it won't fold while its straps are fastened."))
return ..()
/obj/structure/closet/body_bag/environmental/prisoner/update_icon()
. = ..()
if(sinched)
icon_state = initial(icon_state) + "_sinched"
else
icon_state = initial(icon_state)
/obj/structure/closet/body_bag/environmental/prisoner/can_open(mob/living/user, force = FALSE)
if(force)
return TRUE
if(sinched)
to_chat(user, span_danger("The buckles on [src] are sinched down, preventing it from opening."))
return FALSE
. = ..()
/obj/structure/closet/body_bag/environmental/prisoner/open(mob/living/user, force = FALSE)
if(!can_open(user, force))
return
if(opened)
return
sinched = FALSE
playsound(loc, open_sound, open_sound_volume, TRUE, -3)
opened = TRUE
if(!dense_when_open)
set_density(FALSE)
dump_contents()
update_appearance()
after_open(user, force)
return TRUE
/obj/structure/closet/body_bag/environmental/prisoner/container_resist_act(mob/living/user)
/// copy-pasted with changes because flavor text as well as some other misc stuff
if(opened)
return
if(ismovable(loc))
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
var/atom/movable/location = loc
location.relay_container_resist_act(user, src)
return
if(!sinched)
open()
return
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
user.visible_message(span_warning("Someone in [src] begins to wriggle!"), \
span_notice("You start wriggling, attempting to loosen [src]'s buckles... (this will take about [DisplayTimeText(breakout_time)].)"), \
span_hear("You hear straining cloth from [src]."))
if(do_after(user,(breakout_time), target = src))
if(!user || user.stat != CONSCIOUS || user.loc != src || opened || !sinched )
return
//we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
user.visible_message(span_danger("[user] successfully broke out of [src]!"),
span_notice("You successfully break out of [src]!"))
bust_open()
else
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
to_chat(user, span_warning("You fail to break out of [src]!"))
/obj/structure/closet/body_bag/environmental/prisoner/bust_open()
sinched = FALSE
// We don't break the bag, because the buckles were backed out as opposed to fully broken.
open()
/obj/structure/closet/body_bag/environmental/prisoner/attack_hand_secondary(mob/user, modifiers)
if(!user.canUseTopic(src, BE_CLOSE) || !isturf(loc))
return
if(!opened)
togglelock(user)
return TRUE
/obj/structure/closet/body_bag/environmental/prisoner/togglelock(mob/living/user, silent)
if(user in contents)
to_chat(user, span_warning("You can't reach the buckles from here!"))
return
if(iscarbon(user))
add_fingerprint(user)
if(!sinched)
for(var/mob/living/target in contents)
to_chat(target, span_userdanger("You feel the lining of [src] tighten around you! Soon, you won't be able to escape!"))
user.visible_message(span_notice("You begin sinching down the buckles on [src]."))
if(!(do_after(user,(sinch_time),target = src)))
return
sinched = !sinched
if(sinched)
playsound(loc, sinch_sound, 15, TRUE, -2)
user.visible_message(span_notice("[user] [sinched ? null : "un"]sinches [src]."),
span_notice("You [sinched ? null : "un"]sinch [src]."),
span_hear("You hear stretching followed by metal clicking from [src]."))
log_game("[key_name(user)] [sinched ? "sinched":"unsinched"] secure environmental bag [src] at [AREACOORD(src)]")
update_appearance()
/obj/structure/closet/body_bag/environmental/prisoner/syndicate
name = "syndicate prisoner transport bag"
desc = "An alteration of Nanotrasen's environmental protection bag which has been used in several high-profile kidnappings. Designed to keep a victim unconscious, alive, and secured during transport."
icon = 'icons/obj/bodybag.dmi'
icon_state = "syndieenvirobag"
contents_pressure_protection = 1
contents_thermal_insulation = 1
foldedbag_path = /obj/item/bodybag/environmental/prisoner/syndicate
weather_protection = list(WEATHER_ALL)
breakout_time = 8 MINUTES
sinch_time = 20 SECONDS
// The contents of the gas to be distributed to an occupant once sinched down. Set in Initialize()
var/datum/gas_mixture/air_contents = null
/obj/structure/closet/body_bag/environmental/prisoner/syndicate/Initialize()
. = ..()
refresh_air()
/obj/structure/closet/body_bag/environmental/prisoner/syndicate/proc/refresh_air()
air_contents = null
air_contents = new(50) //liters
air_contents.temperature = T20C
air_contents.assert_gases(/datum/gas/oxygen, /datum/gas/nitrous_oxide)
air_contents.gases[/datum/gas/oxygen][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (ONE_ATMOSPHERE*50)/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
/obj/structure/closet/body_bag/environmental/prisoner/syndicate/Destroy()
if(air_contents)
QDEL_NULL(air_contents)
return ..()
/obj/structure/closet/body_bag/environmental/prisoner/syndicate/return_air()
if(sinched)
refresh_air()
return air_contents
return ..()
/obj/structure/closet/body_bag/environmental/prisoner/syndicate/remove_air(amount)
if(sinched)
refresh_air()
return air_contents // The internals for this bag are bottomless. Syndicate bluespace trickery.
return ..(amount)
/obj/structure/closet/body_bag/environmental/prisoner/syndicate/return_analyzable_air()
if(sinched)
refresh_air()
return air_contents
return ..()
/obj/structure/closet/body_bag/environmental/prisoner/syndicate/togglelock(mob/living/user, silent)
. = ..()
if(sinched)
for(var/mob/living/target in contents)
to_chat(target, span_warning("You hear a faint hiss, and a white mist fills your vision..."))
@@ -12,6 +12,7 @@
close_sound = 'sound/machines/wooden_closet_close.ogg'
open_sound_volume = 25
close_sound_volume = 50
contents_pressure_protection = 0.8
var/obj/item/tank/internals/emergency_oxygen/tank
/obj/structure/closet/crate/critter/Initialize()
+2 -2
View File
@@ -156,7 +156,7 @@
continue
else if(isliving(buckle_check))
var/mob/living/live = buckle_check
if("lava" in live.weather_immunities)
if(WEATHER_LAVA in live.weather_immunities)
continue
if(iscarbon(L))
@@ -167,7 +167,7 @@
if(S && H && S.clothing_flags & LAVAPROTECT && H.clothing_flags & LAVAPROTECT)
return
if("lava" in L.weather_immunities)
if(WEATHER_LAVA in L.weather_immunities)
continue
ADD_TRAIT(L, TRAIT_PERMANENTLY_ONFIRE,TURF_TRAIT)
@@ -194,7 +194,7 @@
var/mob/living/L = thing
if(L.movement_type & FLYING)
continue //YOU'RE FLYING OVER IT
if("snow" in L.weather_immunities)
if(WEATHER_SNOW in L.weather_immunities)
continue
var/buckle_check = L.buckled
@@ -205,7 +205,7 @@
else if(isliving(buckle_check))
var/mob/living/live = buckle_check
if("snow" in live.weather_immunities)
if(WEATHER_SNOW in live.weather_immunities)
continue
L.adjustFireLoss(2)
@@ -48,7 +48,7 @@
//Because the leaping sprite is bigger than the normal one
body_position_pixel_x_offset = -32
body_position_pixel_y_offset = -32
LAZYADD(weather_immunities,"lava")
LAZYADD(weather_immunities, WEATHER_LAVA)
update_icons()
throw_at(A, MAX_ALIEN_LEAP_DIST, 1, src, FALSE, TRUE, callback = CALLBACK(src, .proc/leap_end))
@@ -56,7 +56,7 @@
leaping = FALSE
body_position_pixel_x_offset = 0
body_position_pixel_y_offset = 0
LAZYREMOVE(weather_immunities, "lava")
LAZYREMOVE(weather_immunities, WEATHER_LAVA)
update_icons()
/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
@@ -64,6 +64,10 @@
if(chest_covered && head_covered)
return ONE_ATMOSPHERE
if(ismovable(loc))
/// If we're in a space with 0.5 content pressure protection, it averages the values, for example.
var/atom/movable/occupied_space = loc
return (occupied_space.contents_pressure_protection * ONE_ATMOSPHERE + (1 - occupied_space.contents_pressure_protection) * pressure)
return pressure
@@ -251,11 +251,11 @@
/datum/species/golem/titanium/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
LAZYOR(C.weather_immunities, "ash")
LAZYOR(C.weather_immunities, WEATHER_ASH)
/datum/species/golem/titanium/on_species_loss(mob/living/carbon/C)
. = ..()
LAZYREMOVE(C.weather_immunities, "ash")
LAZYREMOVE(C.weather_immunities, WEATHER_ASH)
//Immune to ash storms and lava
/datum/species/golem/plastitanium
@@ -270,13 +270,13 @@
/datum/species/golem/plastitanium/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
LAZYOR(C.weather_immunities, "lava")
LAZYOR(C.weather_immunities, "ash")
LAZYOR(C.weather_immunities, WEATHER_LAVA)
LAZYOR(C.weather_immunities, WEATHER_ASH)
/datum/species/golem/plastitanium/on_species_loss(mob/living/carbon/C)
. = ..()
LAZYREMOVE(C.weather_immunities, "ash")
LAZYREMOVE(C.weather_immunities, "lava")
LAZYREMOVE(C.weather_immunities, WEATHER_ASH)
LAZYREMOVE(C.weather_immunities, WEATHER_LAVA)
//Fast and regenerates... but can only speak like an abductor
/datum/species/golem/alloy
@@ -1225,7 +1225,7 @@
/datum/species/golem/snow/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
LAZYOR(C.weather_immunities, "snow")
LAZYOR(C.weather_immunities, WEATHER_SNOW)
ball = new
ball.charge_counter = 0
C.AddSpell(ball)
@@ -1235,7 +1235,7 @@
/datum/species/golem/snow/on_species_loss(mob/living/carbon/C)
. = ..()
LAZYREMOVE(C.weather_immunities, "snow")
LAZYREMOVE(C.weather_immunities, WEATHER_SNOW)
if(ball)
C.RemoveSpell(ball)
if(cryo)
+4
View File
@@ -98,6 +98,10 @@
var/loc_temp = get_temperature(environment)
var/temp_delta = loc_temp - bodytemperature
if(ismovable(loc))
var/atom/movable/occupied_space = loc
temp_delta *= (1 - occupied_space.contents_thermal_insulation)
if(temp_delta < 0) // it is cold here
if(!on_fire) // do not reduce body temp when on fire
adjust_bodytemperature(max(max(temp_delta / BODYTEMP_DIVISOR, BODYTEMP_COOLING_MAX) * delta_time, temp_delta))
+3
View File
@@ -1086,6 +1086,9 @@
else if(isspaceturf(get_turf(src)))
var/turf/heat_turf = get_turf(src)
loc_temp = heat_turf.temperature
if(ismovable(loc))
var/atom/movable/occupied_space = loc
loc_temp = ((1 - occupied_space.contents_thermal_insulation) * loc_temp) + (occupied_space.contents_thermal_insulation * bodytemperature)
return loc_temp
/mob/living/cancel_camera()
+1 -1
View File
@@ -8,7 +8,7 @@
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_TINY
desc = "A generic pAI mobile hard-light holographics emitter. It seems to be deactivated."
weather_immunities = list("ash")
weather_immunities = list(WEATHER_ASH)
health = 500
maxHealth = 500
layer = BELOW_MOB_LAYER
+1 -1
View File
@@ -8,7 +8,7 @@
initial_language_holder = /datum/language_holder/synthetic
see_in_dark = 8
bubble_icon = "machine"
weather_immunities = list("ash")
weather_immunities = list(WEATHER_ASH)
mob_biotypes = MOB_ROBOTIC
deathsound = 'sound/voice/borg_deathsound.ogg'
speech_span = SPAN_ROBOT
@@ -82,7 +82,7 @@
icon_living = "snowbear"
icon_dead = "snowbear_dead"
desc = "It's a polar bear, in space, but not actually in space."
weather_immunities = list("snow")
weather_immunities = list(WEATHER_SNOW)
/mob/living/simple_animal/hostile/bear/russian
name = "combat bear"
@@ -26,7 +26,7 @@
sentience_type = SENTIENCE_HUMANOID
faction = list(ROLE_WIZARD)
footstep_type = FOOTSTEP_MOB_SHOE
weather_immunities = list("lava","ash")
weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
minbodytemp = 0
maxbodytemp = INFINITY
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
@@ -2,7 +2,7 @@
vision_range = 5
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list("jungle")
weather_immunities = list(ACID)
weather_immunities = list(WEATHER_ACID)
obj_damage = 30
environment_smash = ENVIRONMENT_SMASH_WALLS
minbodytemp = 0
@@ -18,7 +18,7 @@ I'd rather there be something than the clockwork ruin be entirely empty though s
attack_verb_simple = "slash"
attack_sound = 'sound/weapons/bladeslice.ogg'
attack_vis_effect = ATTACK_EFFECT_SLASH
weather_immunities = list("snow")
weather_immunities = list(WEATHER_SNOW)
speak_emote = list("roars")
armour_penetration = 40
melee_damage_lower = 20
@@ -20,7 +20,7 @@ Difficulty: Extremely Hard
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
light_color = COLOR_LIGHT_GRAYISH_RED
movement_type = GROUND
weather_immunities = list("snow")
weather_immunities = list(WEATHER_SNOW)
speak_emote = list("roars")
armour_penetration = 100
melee_damage_lower = 10
@@ -10,7 +10,7 @@
obj_damage = 400
light_range = 3
faction = list("mining", "boss")
weather_immunities = list("lava","ash")
weather_immunities = list(WEATHER_LAVA,WEATHER_ASH)
robust_searching = TRUE
ranged_ignores_vision = TRUE
stat_attack = DEAD
@@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
crusher_achievement_type = /datum/award/achievement/boss/swarmer_beacon_crusher
score_achievement_type = /datum/award/score/swarmer_beacon_score
faction = list("mining", "boss", "swarmer")
weather_immunities = list("lava","ash")
weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
stop_automated_movement = TRUE
wander = FALSE
layer = BELOW_MOB_LAYER
@@ -97,7 +97,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
/mob/living/simple_animal/hostile/swarmer/ai
wander = 1
faction = list("swarmer", "mining")
weather_immunities = list("ash") //wouldn't be fun otherwise
weather_immunities = list(WEATHER_ASH) //wouldn't be fun otherwise
AIStatus = AI_ON
/mob/living/simple_animal/hostile/swarmer/ai/Initialize()
@@ -25,7 +25,7 @@ Difficulty: Hard
attack_verb_simple = "claw"
attack_sound = 'sound/magic/demon_attack1.ogg'
attack_vis_effect = ATTACK_EFFECT_CLAW
weather_immunities = list("snow")
weather_immunities = list(WEATHER_SNOW)
speak_emote = list("roars")
armour_penetration = 40
melee_damage_lower = 40
@@ -257,13 +257,13 @@
if(use_time > world.time)
to_chat(living_user, "<b>The tongue looks dried out. You'll need to wait longer to use it again.</b>")
return
else if("lava" in living_user.weather_immunities)
else if(WEATHER_LAVA in living_user.weather_immunities)
to_chat(living_user, "<b>You stare at the tongue. You don't think this is any use to you.</b>")
return
LAZYOR(living_user.weather_immunities, "lava")
LAZYOR(living_user.weather_immunities, WEATHER_LAVA)
to_chat(living_user, "<b>You squeeze the tongue, and some transluscent liquid shoots out all over you.</b>")
addtimer(CALLBACK(src, .proc/remove_lavaproofing, living_user), 10 SECONDS)
use_time = world.time + 60 SECONDS
/obj/item/crusher_trophy/broodmother_tongue/proc/remove_lavaproofing(mob/living/user)
LAZYREMOVE(user.weather_immunities, "lava")
LAZYREMOVE(user.weather_immunities, WEATHER_LAVA)
@@ -10,7 +10,7 @@
speak_emote = list("warbles", "quavers")
emote_hear = list("trills.")
emote_see = list("sniffs.", "burps.")
weather_immunities = list("lava","ash")
weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
faction = list("mining", "ashwalker")
density = FALSE
speak_chance = 1
@@ -264,7 +264,7 @@
aggro_vision_range = 9
speed = 3
faction = list("mining")
weather_immunities = list("lava","ash")
weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
obj_damage = 30
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
see_in_dark = 8
@@ -25,7 +25,7 @@
attack_verb_simple = "snip"
attack_sound = 'sound/weapons/bite.ogg'
attack_vis_effect = ATTACK_EFFECT_BITE //the closest we have to a crustacean pinching attack effect rn.
weather_immunities = list("snow")
weather_immunities = list(WEATHER_SNOW)
vision_range = 5
aggro_vision_range = 7
charger = TRUE
@@ -3,7 +3,7 @@
vision_range = 2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list("mining")
weather_immunities = list("lava","ash")
weather_immunities = list(WEATHER_LAVA,WEATHER_ASH)
obj_damage = 30
environment_smash = ENVIRONMENT_SMASH_WALLS
minbodytemp = 0
@@ -45,7 +45,7 @@
icon_dead = "eskimo_dead"
maxHealth = 55
health = 55
weather_immunities = list("snow")
weather_immunities = list(WEATHER_SNOW)
melee_damage_lower = 17
melee_damage_upper = 20
deathmessage = "collapses into a pile of bones, its gear falling to the floor!"
@@ -63,7 +63,7 @@
icon_dead = "templar_dead"
maxHealth = 150
health = 150
weather_immunities = list("snow")
weather_immunities = list(WEATHER_SNOW)
speed = 2
speak_chance = 1
speak = list("THE GODS WILL IT!","DEUS VULT!","REMOVE KABAB!")
@@ -83,7 +83,7 @@
speed = 5
maxHealth = 75
health = 75
weather_immunities = list("snow")
weather_immunities = list(WEATHER_SNOW)
color = rgb(114,228,250)
loot = list(/obj/effect/decal/remains/human{color = rgb(114,228,250)})
+2
View File
@@ -694,6 +694,8 @@
new /obj/item/pickaxe/emergency(src)
new /obj/item/survivalcapsule(src)
new /obj/item/storage/toolbox/emergency(src)
new /obj/item/bodybag/environmental(src)
new /obj/item/bodybag/environmental(src)
/obj/item/storage/pod/attackby(obj/item/W, mob/user, params)
if (can_interact(user))
Binary file not shown.

Before

Width:  |  Height:  |  Size: 875 B

After

Width:  |  Height:  |  Size: 3.0 KiB