Merge branch 'master' into upstream-merge-11375
@@ -122,9 +122,15 @@ SUBSYSTEM_DEF(skybox)
|
|||||||
if(istype(O))
|
if(istype(O))
|
||||||
var/image/self_image = O.generate_skybox(z)
|
var/image/self_image = O.generate_skybox(z)
|
||||||
new_overlays += self_image
|
new_overlays += self_image
|
||||||
for(var/obj/effect/overmap/visitable/other in O.loc)
|
//VOREStation Add
|
||||||
if(other != O)
|
if(isbelly(O.loc)) // Teehee
|
||||||
new_overlays += other.get_skybox_representation(z)
|
base.icon = 'icons/skybox/skybox_vr.dmi'
|
||||||
|
base.icon_state = "flesh"
|
||||||
|
//VOREStation Add End
|
||||||
|
else
|
||||||
|
for(var/obj/effect/overmap/visitable/other in O.loc)
|
||||||
|
if(other != O)
|
||||||
|
new_overlays += other.get_skybox_representation(z)
|
||||||
|
|
||||||
// Allow events to apply custom overlays to skybox! (Awesome!)
|
// Allow events to apply custom overlays to skybox! (Awesome!)
|
||||||
for(var/datum/event/E in SSevents.active_events)
|
for(var/datum/event/E in SSevents.active_events)
|
||||||
|
|||||||
@@ -182,3 +182,10 @@
|
|||||||
stack_trace("Directional light cone deleted, but not by our component")
|
stack_trace("Directional light cone deleted, but not by our component")
|
||||||
return QDEL_HINT_LETMELIVE
|
return QDEL_HINT_LETMELIVE
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
/obj/effect/overlay/closet_door
|
||||||
|
anchored = TRUE
|
||||||
|
plane = FLOAT_PLANE
|
||||||
|
layer = FLOAT_LAYER
|
||||||
|
vis_flags = VIS_INHERIT_ID
|
||||||
|
appearance_flags = KEEP_TOGETHER | LONG_GLIDE | PIXEL_SCALE
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
closet_appearance = null
|
closet_appearance = null
|
||||||
open_sound = 'sound/items/zip.ogg'
|
open_sound = 'sound/items/zip.ogg'
|
||||||
close_sound = 'sound/items/zip.ogg'
|
close_sound = 'sound/items/zip.ogg'
|
||||||
|
door_anim_time = 0 //Unsupported
|
||||||
var/item_path = /obj/item/bodybag
|
var/item_path = /obj/item/bodybag
|
||||||
density = FALSE
|
density = FALSE
|
||||||
storage_capacity = (MOB_MEDIUM * 2) - 1
|
storage_capacity = (MOB_MEDIUM * 2) - 1
|
||||||
|
|||||||
@@ -65,6 +65,7 @@
|
|||||||
closet_appearance = null
|
closet_appearance = null
|
||||||
catalogue_data = list(/datum/category_item/catalogue/information/objects/oldreactor)
|
catalogue_data = list(/datum/category_item/catalogue/information/objects/oldreactor)
|
||||||
climbable = FALSE
|
climbable = FALSE
|
||||||
|
door_anim_time = 0 //Unsupported
|
||||||
|
|
||||||
starts_with = list(
|
starts_with = list(
|
||||||
/obj/item/weapon/fuel_assembly/deuterium = 6)
|
/obj/item/weapon/fuel_assembly/deuterium = 6)
|
||||||
|
|||||||
@@ -36,6 +36,19 @@
|
|||||||
|
|
||||||
var/closet_appearance = /decl/closet_appearance // The /decl that defines what decals we end up with, that makes our look unique
|
var/closet_appearance = /decl/closet_appearance // The /decl that defines what decals we end up with, that makes our look unique
|
||||||
|
|
||||||
|
/// Currently animating the door transform
|
||||||
|
var/is_animating_door = FALSE
|
||||||
|
/// Length of time (ds) to animate the door transform
|
||||||
|
var/door_anim_time = 2.0
|
||||||
|
/// Amount to 'squish' the full width of the door by
|
||||||
|
var/door_anim_squish = 0.30
|
||||||
|
/// Virtual angle at which the door is opened to (136 by default, so not a full 180)
|
||||||
|
var/door_anim_angle = 136
|
||||||
|
/// Offset for the door hinge location from centerline
|
||||||
|
var/door_hinge = -6.5
|
||||||
|
/// Our visual object for the closet door
|
||||||
|
var/obj/effect/overlay/closet_door/door_obj
|
||||||
|
|
||||||
/obj/structure/closet/Initialize()
|
/obj/structure/closet/Initialize()
|
||||||
..()
|
..()
|
||||||
return INITIALIZE_HINT_LATELOAD
|
return INITIALIZE_HINT_LATELOAD
|
||||||
@@ -66,6 +79,10 @@
|
|||||||
color = null
|
color = null
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
|
/obj/structure/closet/Destroy()
|
||||||
|
. = ..()
|
||||||
|
qdel_null(door_obj)
|
||||||
|
|
||||||
/obj/structure/closet/examine(mob/user)
|
/obj/structure/closet/examine(mob/user)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(Adjacent(user) || isobserver(user))
|
if(Adjacent(user) || isobserver(user))
|
||||||
@@ -134,7 +151,7 @@
|
|||||||
playsound(src, open_sound, 15, 1, -3)
|
playsound(src, open_sound, 15, 1, -3)
|
||||||
if(initial(density))
|
if(initial(density))
|
||||||
density = !density
|
density = !density
|
||||||
update_icon()
|
animate_door()
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/obj/structure/closet/proc/close()
|
/obj/structure/closet/proc/close()
|
||||||
@@ -159,7 +176,7 @@
|
|||||||
playsound(src, close_sound, 15, 1, -3)
|
playsound(src, close_sound, 15, 1, -3)
|
||||||
if(initial(density))
|
if(initial(density))
|
||||||
density = !density
|
density = !density
|
||||||
update_icon()
|
animate_door(TRUE)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
//Cham Projector Exception
|
//Cham Projector Exception
|
||||||
@@ -214,10 +231,11 @@
|
|||||||
|
|
||||||
|
|
||||||
/obj/structure/closet/proc/toggle(mob/user as mob)
|
/obj/structure/closet/proc/toggle(mob/user as mob)
|
||||||
|
if(is_animating_door)
|
||||||
|
return
|
||||||
if(!(opened ? close() : open()))
|
if(!(opened ? close() : open()))
|
||||||
to_chat(user, "<span class='notice'>It won't budge!</span>")
|
to_chat(user, "<span class='notice'>It won't budge!</span>")
|
||||||
return
|
return
|
||||||
update_icon()
|
|
||||||
|
|
||||||
// this should probably use dump_contents()
|
// this should probably use dump_contents()
|
||||||
/obj/structure/closet/ex_act(severity)
|
/obj/structure/closet/ex_act(severity)
|
||||||
@@ -481,8 +499,45 @@
|
|||||||
spawn(1) qdel(src)
|
spawn(1) qdel(src)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
// Just a generic cabinet for mappers to use
|
/obj/structure/closet/proc/animate_door(closing = FALSE)
|
||||||
/obj/structure/closet/cabinet
|
if(!door_anim_time)
|
||||||
name = "cabinet"
|
update_icon()
|
||||||
icon = 'icons/obj/closets/bases/cabinet.dmi'
|
return
|
||||||
closet_appearance = /decl/closet_appearance/cabinet
|
if(!door_obj)
|
||||||
|
door_obj = new
|
||||||
|
vis_contents |= door_obj
|
||||||
|
door_obj.icon = icon
|
||||||
|
door_obj.icon_state = "door_front"
|
||||||
|
is_animating_door = TRUE
|
||||||
|
if(!closing)
|
||||||
|
update_icon()
|
||||||
|
var/num_steps = door_anim_time / world.tick_lag
|
||||||
|
for(var/I in 0 to num_steps)
|
||||||
|
var/angle = door_anim_angle * (closing ? 1 - (I/num_steps) : (I/num_steps))
|
||||||
|
var/matrix/M = get_door_transform(angle)
|
||||||
|
var/door_state = angle >= 90 ? "door_back" : "door_front"
|
||||||
|
var/door_layer = angle >= 90 ? FLOAT_LAYER : ABOVE_MOB_LAYER
|
||||||
|
|
||||||
|
if(I == 0)
|
||||||
|
door_obj.transform = M
|
||||||
|
door_obj.icon_state = door_state
|
||||||
|
door_obj.layer = door_layer
|
||||||
|
else if(I == 1)
|
||||||
|
animate(door_obj, transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag, flags = ANIMATION_END_NOW)
|
||||||
|
else
|
||||||
|
animate(transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag)
|
||||||
|
addtimer(CALLBACK(src,.proc/end_door_animation,closing),door_anim_time,TIMER_UNIQUE|TIMER_OVERRIDE)
|
||||||
|
|
||||||
|
/obj/structure/closet/proc/end_door_animation(closing = FALSE)
|
||||||
|
is_animating_door = FALSE
|
||||||
|
if(closing)
|
||||||
|
// There's not really harm in leaving it on, but, one less atom to send to clients to render when lockers are closed
|
||||||
|
vis_contents -= door_obj
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/structure/closet/proc/get_door_transform(angle)
|
||||||
|
var/matrix/M = matrix()
|
||||||
|
M.Translate(-door_hinge, 0)
|
||||||
|
M.Multiply(matrix(cos(angle), 0, 0, -sin(angle) * door_anim_squish, 1, 0))
|
||||||
|
M.Translate(door_hinge, 0)
|
||||||
|
return M
|
||||||
|
|||||||
@@ -33,6 +33,8 @@
|
|||||||
var/icon/closed_locked_welded_icon
|
var/icon/closed_locked_welded_icon
|
||||||
var/icon/closed_unlocked_icon
|
var/icon/closed_unlocked_icon
|
||||||
var/icon/closed_unlocked_welded_icon
|
var/icon/closed_unlocked_welded_icon
|
||||||
|
var/icon/door_front_icon
|
||||||
|
var/icon/door_back_icon
|
||||||
|
|
||||||
// Create open icon.
|
// Create open icon.
|
||||||
var/icon/new_icon = new
|
var/icon/new_icon = new
|
||||||
@@ -40,6 +42,10 @@
|
|||||||
open_icon.Blend(icon(base_icon, "open"), ICON_OVERLAY)
|
open_icon.Blend(icon(base_icon, "open"), ICON_OVERLAY)
|
||||||
open_icon.Blend(color, BLEND_ADD)
|
open_icon.Blend(color, BLEND_ADD)
|
||||||
open_icon.Blend(icon(base_icon, "interior"), ICON_OVERLAY)
|
open_icon.Blend(icon(base_icon, "interior"), ICON_OVERLAY)
|
||||||
|
|
||||||
|
door_back_icon = icon(base_icon, "door_back")
|
||||||
|
door_back_icon.Blend(color, BLEND_ADD)
|
||||||
|
|
||||||
if(decal_icon)
|
if(decal_icon)
|
||||||
for(var/thing in decals)
|
for(var/thing in decals)
|
||||||
var/icon/this_decal_icon = icon(decal_icon, "[thing]_open")
|
var/icon/this_decal_icon = icon(decal_icon, "[thing]_open")
|
||||||
@@ -47,6 +53,8 @@
|
|||||||
open_icon.Blend(this_decal_icon, ICON_OVERLAY)
|
open_icon.Blend(this_decal_icon, ICON_OVERLAY)
|
||||||
|
|
||||||
// Generate basic closed icons.
|
// Generate basic closed icons.
|
||||||
|
door_front_icon = icon(base_icon, "door_front")
|
||||||
|
door_front_icon.Blend(color, BLEND_ADD)
|
||||||
closed_emagged_icon = icon(base_icon, "base")
|
closed_emagged_icon = icon(base_icon, "base")
|
||||||
if(can_lock)
|
if(can_lock)
|
||||||
closed_emagged_icon.Blend(icon(base_icon, "lock"), ICON_OVERLAY)
|
closed_emagged_icon.Blend(icon(base_icon, "lock"), ICON_OVERLAY)
|
||||||
@@ -56,6 +64,10 @@
|
|||||||
var/icon/this_decal_icon = icon(decal_icon, thing)
|
var/icon/this_decal_icon = icon(decal_icon, thing)
|
||||||
this_decal_icon.Blend(decals[thing], BLEND_ADD)
|
this_decal_icon.Blend(decals[thing], BLEND_ADD)
|
||||||
closed_emagged_icon.Blend(this_decal_icon, ICON_OVERLAY)
|
closed_emagged_icon.Blend(this_decal_icon, ICON_OVERLAY)
|
||||||
|
door_front_icon.Blend(this_decal_icon, ICON_OVERLAY)
|
||||||
|
|
||||||
|
door_front_icon.AddAlphaMask(icon(base_icon, "door_front")) // Remove pesky 'more than just door' decals
|
||||||
|
|
||||||
closed_locked_icon = icon(closed_emagged_icon)
|
closed_locked_icon = icon(closed_emagged_icon)
|
||||||
closed_unlocked_icon = icon(closed_emagged_icon)
|
closed_unlocked_icon = icon(closed_emagged_icon)
|
||||||
|
|
||||||
@@ -83,13 +95,15 @@
|
|||||||
closed_emagged_welded_icon.Blend(sparks, ICON_OVERLAY)
|
closed_emagged_welded_icon.Blend(sparks, ICON_OVERLAY)
|
||||||
|
|
||||||
// Insert our bevy of icons into the final icon file.
|
// Insert our bevy of icons into the final icon file.
|
||||||
new_icon.Insert(open_icon, "open")
|
new_icon.Insert(open_icon, "open")
|
||||||
new_icon.Insert(closed_emagged_icon, "closed_emagged")
|
new_icon.Insert(closed_emagged_icon, "closed_emagged")
|
||||||
new_icon.Insert(closed_emagged_welded_icon, "closed_emagged_welded")
|
new_icon.Insert(closed_emagged_welded_icon, "closed_emagged_welded")
|
||||||
new_icon.Insert(closed_locked_icon, "closed_locked")
|
new_icon.Insert(closed_locked_icon, "closed_locked")
|
||||||
new_icon.Insert(closed_locked_welded_icon, "closed_locked_welded")
|
new_icon.Insert(closed_locked_welded_icon, "closed_locked_welded")
|
||||||
new_icon.Insert(closed_unlocked_icon, "closed_unlocked")
|
new_icon.Insert(closed_unlocked_icon, "closed_unlocked")
|
||||||
new_icon.Insert(closed_unlocked_welded_icon, "closed_unlocked_welded")
|
new_icon.Insert(closed_unlocked_welded_icon, "closed_unlocked_welded")
|
||||||
|
new_icon.Insert(door_front_icon, "door_front")
|
||||||
|
new_icon.Insert(door_back_icon, "door_back")
|
||||||
|
|
||||||
// Set icon!
|
// Set icon!
|
||||||
icon = new_icon
|
icon = new_icon
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
seal_tool = /obj/item/weapon/tool/screwdriver
|
seal_tool = /obj/item/weapon/tool/screwdriver
|
||||||
breakout_sound = 'sound/weapons/tablehit1.ogg'
|
breakout_sound = 'sound/weapons/tablehit1.ogg'
|
||||||
closet_appearance = null // Special icon for us
|
closet_appearance = null // Special icon for us
|
||||||
|
door_anim_time = 0 //Unsupported
|
||||||
|
|
||||||
/* Graves */
|
/* Graves */
|
||||||
/obj/structure/closet/grave
|
/obj/structure/closet/grave
|
||||||
@@ -20,6 +21,7 @@
|
|||||||
max_closets = 1
|
max_closets = 1
|
||||||
opened = 1
|
opened = 1
|
||||||
closet_appearance = null // Special icon for us
|
closet_appearance = null // Special icon for us
|
||||||
|
door_anim_time = 0 //Unsupported
|
||||||
|
|
||||||
/obj/structure/closet/grave/attack_hand(mob/user as mob)
|
/obj/structure/closet/grave/attack_hand(mob/user as mob)
|
||||||
if(opened)
|
if(opened)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
/obj/structure/closet/crate/critter
|
/obj/structure/closet/crate/critter
|
||||||
name = "critter crate"
|
name = "critter crate"
|
||||||
desc = "A crate which can sustain life for a while."
|
desc = "A crate which can sustain life for a while."
|
||||||
closet_appearance = /decl/closet_appearance/large_crate/critter
|
closet_appearance = /decl/closet_appearance/large_crate/critter
|
||||||
|
door_anim_time = 0 //Unsupported
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
opened = 0
|
opened = 0
|
||||||
sealed = 0 //Don't touch this.
|
sealed = 0 //Don't touch this.
|
||||||
health = 100
|
health = 100
|
||||||
|
door_anim_time = 0 //Unsupported
|
||||||
|
|
||||||
/obj/structure/closet/secure_closet/egg/update_icon()
|
/obj/structure/closet/secure_closet/egg/update_icon()
|
||||||
if(opened)
|
if(opened)
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
/obj/structure/closet/cabinet
|
/obj/structure/closet/cabinet
|
||||||
name = "cabinet"
|
name = "cabinet"
|
||||||
desc = "Old will forever be in fashion."
|
desc = "Old will forever be in fashion."
|
||||||
|
icon = 'icons/obj/closets/bases/cabinet.dmi'
|
||||||
closet_appearance = /decl/closet_appearance/cabinet
|
closet_appearance = /decl/closet_appearance/cabinet
|
||||||
|
door_anim_time = 0 //Unsupported
|
||||||
|
|
||||||
/obj/structure/closet/acloset
|
/obj/structure/closet/acloset
|
||||||
name = "strange closet"
|
name = "strange closet"
|
||||||
|
|||||||
@@ -312,3 +312,4 @@ GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/br
|
|||||||
|
|
||||||
//too small to put a man in
|
//too small to put a man in
|
||||||
large = 0
|
large = 0
|
||||||
|
door_anim_time = 0 // Unsupported
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
anchored = TRUE
|
anchored = TRUE
|
||||||
health = 0 //destroying the statue kills the mob within
|
health = 0 //destroying the statue kills the mob within
|
||||||
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
|
blocks_emissive = EMISSIVE_BLOCK_UNIQUE
|
||||||
|
door_anim_time = 0 // Why is this a closet??
|
||||||
var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock
|
var/intialTox = 0 //these are here to keep the mob from taking damage from things that logically wouldn't affect a rock
|
||||||
var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils.
|
var/intialFire = 0 //it's a little sloppy I know but it was this or the GODMODE flag. Lesser of two evils.
|
||||||
var/intialBrute = 0
|
var/intialBrute = 0
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
anchored = TRUE
|
anchored = TRUE
|
||||||
store_mobs = 0
|
store_mobs = 0
|
||||||
wall_mounted = 1
|
wall_mounted = 1
|
||||||
|
door_anim_time = 0 // Unsupported
|
||||||
|
|
||||||
//spawns 2 sets of breathmask, emergency oxy tank and crowbar
|
//spawns 2 sets of breathmask, emergency oxy tank and crowbar
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
closet_appearance = /decl/closet_appearance/crate
|
closet_appearance = /decl/closet_appearance/crate
|
||||||
climbable = TRUE
|
climbable = TRUE
|
||||||
dir = 4 //Spawn facing 'forward' by default.
|
dir = 4 //Spawn facing 'forward' by default.
|
||||||
|
door_anim_time = 0 //Unsupported until appropriate sprites are available
|
||||||
var/points_per_crate = 5
|
var/points_per_crate = 5
|
||||||
var/rigged = 0
|
var/rigged = 0
|
||||||
|
|
||||||
|
|||||||
@@ -54,6 +54,24 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
|
|||||||
var/mutable_appearance/under_EM
|
var/mutable_appearance/under_EM
|
||||||
var/fancy_shuttle_tag
|
var/fancy_shuttle_tag
|
||||||
|
|
||||||
|
// Reinforced hull steel
|
||||||
|
/turf/simulated/wall/fancy_shuttle/Initialize(mapload, materialtype, rmaterialtype, girdertype)
|
||||||
|
. = ..(mapload, MAT_STEELHULL, MAT_STEELHULL, MAT_STEELHULL)
|
||||||
|
|
||||||
|
/turf/simulated/wall/fancy_shuttle/window
|
||||||
|
opacity = FALSE
|
||||||
|
icon_state = "hull_transparent"
|
||||||
|
|
||||||
|
/turf/simulated/wall/fancy_shuttle/window/attack_generic(mob/user, damage, attack_message)
|
||||||
|
take_damage(damage)
|
||||||
|
return damage
|
||||||
|
|
||||||
|
/turf/simulated/wall/fancy_shuttle/nondense
|
||||||
|
density = FALSE
|
||||||
|
blocks_air = FALSE
|
||||||
|
opacity = FALSE
|
||||||
|
icon_state = "hull_nondense"
|
||||||
|
|
||||||
/turf/simulated/wall/fancy_shuttle/pre_translate_A(turf/B)
|
/turf/simulated/wall/fancy_shuttle/pre_translate_A(turf/B)
|
||||||
. = ..()
|
. = ..()
|
||||||
remove_underlay()
|
remove_underlay()
|
||||||
@@ -62,15 +80,21 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
|
|||||||
apply_underlay()
|
apply_underlay()
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/turf/simulated/wall/fancy_shuttle/window
|
// No girders, and Eris plating
|
||||||
opacity = FALSE
|
/turf/simulated/wall/fancy_shuttle/dismantle_wall(var/devastated, var/explode, var/no_product)
|
||||||
icon_state = "hull_transparent"
|
|
||||||
|
|
||||||
/turf/simulated/wall/fancy_shuttle/nondense
|
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
||||||
density = FALSE
|
if(!no_product && !devastated)
|
||||||
blocks_air = FALSE
|
material.place_dismantled_product(src)
|
||||||
opacity = FALSE
|
if (!reinf_material)
|
||||||
icon_state = "hull_nondense"
|
material.place_dismantled_product(src)
|
||||||
|
|
||||||
|
clear_plants()
|
||||||
|
material = get_material_by_name("placeholder")
|
||||||
|
reinf_material = null
|
||||||
|
girder_material = null
|
||||||
|
|
||||||
|
ChangeTurf(/turf/simulated/floor/plating/eris/under)
|
||||||
|
|
||||||
/turf/simulated/wall/fancy_shuttle/proc/remove_underlay()
|
/turf/simulated/wall/fancy_shuttle/proc/remove_underlay()
|
||||||
if(under_MA)
|
if(under_MA)
|
||||||
@@ -217,6 +241,36 @@ GLOBAL_LIST_EMPTY(fancy_shuttles)
|
|||||||
/obj/effect/fancy_shuttle_floor_preview/dropship
|
/obj/effect/fancy_shuttle_floor_preview/dropship
|
||||||
icon = 'icons/turf/fancy_shuttles/dropship_preview.dmi'
|
icon = 'icons/turf/fancy_shuttles/dropship_preview.dmi'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Explo shuttle
|
||||||
|
* North facing: W:13, H:18
|
||||||
|
*/
|
||||||
|
/obj/effect/fancy_shuttle/exploration
|
||||||
|
icon = 'icons/turf/fancy_shuttles/exploration_preview.dmi'
|
||||||
|
split_file = 'icons/turf/fancy_shuttles/exploration.dmi'
|
||||||
|
/obj/effect/fancy_shuttle_floor_preview/exploration
|
||||||
|
icon = 'icons/turf/fancy_shuttles/exploration_preview.dmi'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sec shuttle
|
||||||
|
* North facing: W:13, H:18
|
||||||
|
*/
|
||||||
|
/obj/effect/fancy_shuttle/security
|
||||||
|
icon = 'icons/turf/fancy_shuttles/security_preview.dmi'
|
||||||
|
split_file = 'icons/turf/fancy_shuttles/security.dmi'
|
||||||
|
/obj/effect/fancy_shuttle_floor_preview/security
|
||||||
|
icon = 'icons/turf/fancy_shuttles/security_preview.dmi'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Med shuttle
|
||||||
|
* North facing: W:13, H:18
|
||||||
|
*/
|
||||||
|
/obj/effect/fancy_shuttle/medical
|
||||||
|
icon = 'icons/turf/fancy_shuttles/medical_preview.dmi'
|
||||||
|
split_file = 'icons/turf/fancy_shuttles/medical.dmi'
|
||||||
|
/obj/effect/fancy_shuttle_floor_preview/medical
|
||||||
|
icon = 'icons/turf/fancy_shuttles/medical_preview.dmi'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Orange line tram
|
* Orange line tram
|
||||||
* North facing: W:9, H:16
|
* North facing: W:9, H:16
|
||||||
|
|||||||
@@ -300,6 +300,11 @@
|
|||||||
if(D.density)
|
if(D.density)
|
||||||
ai_log("destroy_surroundings() : Attacking closed door.", AI_LOG_INFO)
|
ai_log("destroy_surroundings() : Attacking closed door.", AI_LOG_INFO)
|
||||||
return melee_attack(D)
|
return melee_attack(D)
|
||||||
|
|
||||||
|
// Should always be last thing attempted
|
||||||
|
if(!problem_turf.opacity)
|
||||||
|
ai_log("destroy_surroundings() : Attacking a transparent (window?) turf.", AI_LOG_INFO)
|
||||||
|
return melee_attack(problem_turf)
|
||||||
|
|
||||||
ai_log("destroy_surroundings() : Exiting due to nothing to attack.", AI_LOG_INFO)
|
ai_log("destroy_surroundings() : Exiting due to nothing to attack.", AI_LOG_INFO)
|
||||||
return ATTACK_FAILED // Nothing to attack.
|
return ATTACK_FAILED // Nothing to attack.
|
||||||
|
|||||||
@@ -551,6 +551,18 @@
|
|||||||
)
|
)
|
||||||
gear_tweaks += new/datum/gear_tweak/path(jacket)
|
gear_tweaks += new/datum/gear_tweak/path(jacket)
|
||||||
|
|
||||||
|
/datum/gear/suit/miscellaneous/light_jacket
|
||||||
|
display_name = "light jacket selection"
|
||||||
|
path = /obj/item/clothing/suit/storage/toggle/light_jacket
|
||||||
|
|
||||||
|
/datum/gear/suit/miscellaneous/light_jacket/New()
|
||||||
|
..()
|
||||||
|
var/list/jacket = list(
|
||||||
|
"grey light jacket" = /obj/item/clothing/suit/storage/toggle/light_jacket,
|
||||||
|
"dark blue light jacket" = /obj/item/clothing/suit/storage/toggle/light_jacket/blue
|
||||||
|
)
|
||||||
|
gear_tweaks += new/datum/gear_tweak/path(jacket)
|
||||||
|
|
||||||
/datum/gear/suit/miscellaneous/peacoat
|
/datum/gear/suit/miscellaneous/peacoat
|
||||||
display_name = "peacoat"
|
display_name = "peacoat"
|
||||||
path = /obj/item/clothing/suit/storage/toggle/peacoat
|
path = /obj/item/clothing/suit/storage/toggle/peacoat
|
||||||
|
|||||||
@@ -726,6 +726,19 @@
|
|||||||
item_state_slots = list(slot_r_hand_str = "med_dep_jacket", slot_l_hand_str = "med_dep_jacket")
|
item_state_slots = list(slot_r_hand_str = "med_dep_jacket", slot_l_hand_str = "med_dep_jacket")
|
||||||
flags_inv = HIDEHOLSTER
|
flags_inv = HIDEHOLSTER
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/storage/toggle/light_jacket
|
||||||
|
name = "grey light jacket"
|
||||||
|
desc = "A light, cozy jacket. Now in grey."
|
||||||
|
icon_state = "grey_dep_jacket"
|
||||||
|
item_state_slots = list(slot_r_hand_str = "grey_dep_jacket", slot_l_hand_str = "grey_dep_jacket")
|
||||||
|
flags_inv = HIDEHOLSTER
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/storage/toggle/light_jacket/blue
|
||||||
|
name = "dark blue light jacket"
|
||||||
|
desc = "A light, cozy jacket. Now in dark blue."
|
||||||
|
icon_state = "blue_dep_jacket"
|
||||||
|
item_state_slots = list(slot_r_hand_str = "blue_dep_jacket", slot_l_hand_str = "blue_dep_jacket")
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Track Jackets
|
* Track Jackets
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -112,7 +112,7 @@
|
|||||||
if(1000 to 1399)
|
if(1000 to 1399)
|
||||||
message = "[t_He] [t_has] a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight."
|
message = "[t_He] [t_has] a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight."
|
||||||
if(1400 to 1934) // One person fully digested.
|
if(1400 to 1934) // One person fully digested.
|
||||||
message = "<span class='warning'>[t_He] [t_is] sporting a large, round, sagging stomach. It's contains at least their body weight worth of glorping slush.</span>"
|
message = "<span class='warning'>[t_He] [t_is] sporting a large, round, sagging stomach. It contains at least their body weight worth of glorping slush.</span>"
|
||||||
if(1935 to 3004) // Two people.
|
if(1935 to 3004) // Two people.
|
||||||
message = "<span class='warning'>[t_He] [t_is] engorged with a huge stomach that sags and wobbles as they move. [t_He] must have consumed at least twice their body weight. It looks incredibly soft.</span>"
|
message = "<span class='warning'>[t_He] [t_is] engorged with a huge stomach that sags and wobbles as they move. [t_He] must have consumed at least twice their body weight. It looks incredibly soft.</span>"
|
||||||
if(3005 to 4074) // Three people.
|
if(3005 to 4074) // Three people.
|
||||||
@@ -195,4 +195,4 @@
|
|||||||
else
|
else
|
||||||
return "<span class='notice'>[t_He] [t_appear] to be in some sort of torpor.</span>"
|
return "<span class='notice'>[t_He] [t_appear] to be in some sort of torpor.</span>"
|
||||||
if(feral)
|
if(feral)
|
||||||
return "<span class='warning'>[t_He] [t_has] a crazed, wild look in [t_his] eyes!</span>"
|
return "<span class='warning'>[t_He] [t_has] a crazed, wild look in [t_his] eyes!</span>"
|
||||||
|
|||||||
@@ -272,7 +272,7 @@
|
|||||||
if(eyecolor_val < 40)
|
if(eyecolor_val < 40)
|
||||||
eyecolor_val = 40
|
eyecolor_val = 40
|
||||||
|
|
||||||
eyecolor_rgb = rgb(eyecolor_hue, eyecolor_sat, eyecolor_val, COLORSPACE_HSV)
|
eyecolor_rgb = rgb(eyecolor_hue, eyecolor_sat, eyecolor_val, space=COLORSPACE_HSV)
|
||||||
|
|
||||||
H.r_eyes = rgb2num(eyecolor_rgb)[1]
|
H.r_eyes = rgb2num(eyecolor_rgb)[1]
|
||||||
H.g_eyes = rgb2num(eyecolor_rgb)[2]
|
H.g_eyes = rgb2num(eyecolor_rgb)[2]
|
||||||
|
|||||||
@@ -45,4 +45,4 @@
|
|||||||
|
|
||||||
var/list/listeners = get_people_in_ship()
|
var/list/listeners = get_people_in_ship()
|
||||||
for(var/mob/M as anything in listeners)
|
for(var/mob/M as anything in listeners)
|
||||||
M.show_message(message, m_type)
|
M.show_message(message, m_type)
|
||||||
@@ -523,6 +523,15 @@
|
|||||||
H.vent_gas(loc)
|
H.vent_gas(loc)
|
||||||
qdel(H)
|
qdel(H)
|
||||||
|
|
||||||
|
/obj/machinery/disposal/hitby(atom/movable/AM)
|
||||||
|
. = ..()
|
||||||
|
if(istype(AM, /obj/item) && !istype(AM, /obj/item/projectile))
|
||||||
|
if(prob(75))
|
||||||
|
AM.forceMove(src)
|
||||||
|
visible_message("\The [AM] lands in \the [src].")
|
||||||
|
else
|
||||||
|
visible_message("\The [AM] bounces off of \the [src]'s rim!")
|
||||||
|
|
||||||
/obj/machinery/disposal/CanPass(atom/movable/mover, turf/target)
|
/obj/machinery/disposal/CanPass(atom/movable/mover, turf/target)
|
||||||
if(istype(mover, /obj/item/projectile))
|
if(istype(mover, /obj/item/projectile))
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -652,7 +652,7 @@
|
|||||||
//Digest a single item
|
//Digest a single item
|
||||||
//Receives a return value from digest_act that's how much nutrition
|
//Receives a return value from digest_act that's how much nutrition
|
||||||
//the item should be worth
|
//the item should be worth
|
||||||
/obj/belly/proc/digest_item(obj/item/item, /var/touchable_amount) //CHOMPEdit
|
/obj/belly/proc/digest_item(obj/item/item, touchable_amount) //CHOMPEdit
|
||||||
var/digested = item.digest_act(src, touchable_amount) //CHOMPEdit
|
var/digested = item.digest_act(src, touchable_amount) //CHOMPEdit
|
||||||
if(digested == FALSE) //CHOMPEdit
|
if(digested == FALSE) //CHOMPEdit
|
||||||
items_preserved |= item
|
items_preserved |= item
|
||||||
|
|||||||
@@ -132,17 +132,17 @@
|
|||||||
var/to_update = FALSE
|
var/to_update = FALSE
|
||||||
var/digestion_noise_chance = 0
|
var/digestion_noise_chance = 0
|
||||||
var/list/touchable_mobs = list()
|
var/list/touchable_mobs = list()
|
||||||
|
var/touchable_amount = touchable_atoms.len //CHOMPEdit start
|
||||||
|
|
||||||
for(var/A in touchable_atoms)
|
for(var/A in touchable_atoms)
|
||||||
//Handle stray items
|
//Handle stray items
|
||||||
if(isitem(A)) //CHOMPEdit start
|
if(isitem(A))
|
||||||
if(!item_mode_serial)
|
if(!item_mode_serial)
|
||||||
var/touchable_amount = touchable_atoms.len
|
|
||||||
did_an_item = handle_digesting_item(A, touchable_amount)
|
did_an_item = handle_digesting_item(A, touchable_amount)
|
||||||
else if(!did_an_item)
|
else if(!did_an_item)
|
||||||
did_an_item = handle_digesting_item(A, 1)
|
did_an_item = handle_digesting_item(A, 1)
|
||||||
if(did_an_item)
|
if(did_an_item)
|
||||||
to_update = TRUE //CHOMPEdit end
|
to_update = TRUE
|
||||||
|
|
||||||
//Less often than with normal digestion
|
//Less often than with normal digestion
|
||||||
if((item_digest_mode == IM_DIGEST_FOOD || item_digest_mode == IM_DIGEST) && prob(25))
|
if((item_digest_mode == IM_DIGEST_FOOD || item_digest_mode == IM_DIGEST) && prob(25))
|
||||||
@@ -150,6 +150,7 @@
|
|||||||
// but we also want the prob(25) chance to run for -every- item we look at, not just once
|
// but we also want the prob(25) chance to run for -every- item we look at, not just once
|
||||||
// More gurgles the better~
|
// More gurgles the better~
|
||||||
digestion_noise_chance = 25
|
digestion_noise_chance = 25
|
||||||
|
continue //CHOMPEdit end
|
||||||
|
|
||||||
//Handle eaten mobs
|
//Handle eaten mobs
|
||||||
else if(isliving(A))
|
else if(isliving(A))
|
||||||
@@ -217,7 +218,7 @@
|
|||||||
M.playsound_local(get_turf(src), preyloop, 80, 0, channel = CHANNEL_PREYLOOP)
|
M.playsound_local(get_turf(src), preyloop, 80, 0, channel = CHANNEL_PREYLOOP)
|
||||||
M.next_preyloop = (world.time + (52 SECONDS))
|
M.next_preyloop = (world.time + (52 SECONDS))
|
||||||
|
|
||||||
/obj/belly/proc/handle_digesting_item(obj/item/I, var/touchable_amount = 1) //CHOMPEdit
|
/obj/belly/proc/handle_digesting_item(obj/item/I, touchable_amount) //CHOMPEdit
|
||||||
var/did_an_item = FALSE
|
var/did_an_item = FALSE
|
||||||
// We always contaminate IDs.
|
// We always contaminate IDs.
|
||||||
if(contaminates || istype(I, /obj/item/weapon/card/id))
|
if(contaminates || istype(I, /obj/item/weapon/card/id))
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
//return non-negative integer: Amount of nutrition/charge gained (scaled to nutrition, other end can multiply for charge scale).
|
//return non-negative integer: Amount of nutrition/charge gained (scaled to nutrition, other end can multiply for charge scale).
|
||||||
|
|
||||||
// Ye default implementation.
|
// Ye default implementation.
|
||||||
/obj/item/proc/digest_act(atom/movable/item_storage = null, var/touchable_amount = 1) //CHOMPEdit
|
/obj/item/proc/digest_act(atom/movable/item_storage = null, touchable_amount) //CHOMPEdit
|
||||||
if(istype(item_storage, /obj/item/device/dogborg/sleeper))
|
if(istype(item_storage, /obj/item/device/dogborg/sleeper))
|
||||||
if(istype(src, /obj/item/device/pda))
|
if(istype(src, /obj/item/device/pda))
|
||||||
var/obj/item/device/pda/P = src
|
var/obj/item/device/pda/P = src
|
||||||
@@ -26,9 +26,11 @@
|
|||||||
|
|
||||||
if(isbelly(item_storage))
|
if(isbelly(item_storage))
|
||||||
var/obj/belly/B = item_storage
|
var/obj/belly/B = item_storage
|
||||||
g_damage = 0.25 * (B.digest_brute + B.digest_burn) / touchable_amount //CHOMPEdit
|
if(!touchable_amount) //CHOMPEdit Start
|
||||||
if(g_damage <= 0) //CHOMPEdit
|
touchable_amount = 1
|
||||||
return FALSE //CHOMPEdit
|
g_damage = 0.25 * (B.digest_brute + B.digest_burn) / touchable_amount
|
||||||
|
if(g_damage <= 0)
|
||||||
|
return FALSE //CHOMPEdit End
|
||||||
|
|
||||||
if(digest_stage > 0)
|
if(digest_stage > 0)
|
||||||
if(g_damage > digest_stage)
|
if(g_damage > digest_stage)
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 196 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 587 KiB After Width: | Height: | Size: 587 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.5 KiB |
BIN
icons/turf/fancy_shuttles/exploration.dmi
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
icons/turf/fancy_shuttles/exploration_preview.dmi
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
icons/turf/fancy_shuttles/medical.dmi
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
icons/turf/fancy_shuttles/medical_preview.dmi
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
icons/turf/fancy_shuttles/security.dmi
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
icons/turf/fancy_shuttles/security_preview.dmi
Normal file
|
After Width: | Height: | Size: 52 KiB |
@@ -1436,6 +1436,7 @@
|
|||||||
/area/shuttle/excursion
|
/area/shuttle/excursion
|
||||||
requires_power = 1
|
requires_power = 1
|
||||||
icon_state = "shuttle2"
|
icon_state = "shuttle2"
|
||||||
|
base_turf = /turf/simulated/floor/reinforced
|
||||||
|
|
||||||
/area/shuttle/excursion/general
|
/area/shuttle/excursion/general
|
||||||
name = "\improper Excursion Shuttle"
|
name = "\improper Excursion Shuttle"
|
||||||
@@ -1446,6 +1447,9 @@
|
|||||||
/area/shuttle/excursion/cargo
|
/area/shuttle/excursion/cargo
|
||||||
name = "\improper Excursion Shuttle Cargo"
|
name = "\improper Excursion Shuttle Cargo"
|
||||||
|
|
||||||
|
/area/shuttle/excursion/power
|
||||||
|
name = "\improper Excursion Shuttle Power"
|
||||||
|
|
||||||
/area/shuttle/tourbus
|
/area/shuttle/tourbus
|
||||||
requires_power = 1
|
requires_power = 1
|
||||||
icon_state = "shuttle2"
|
icon_state = "shuttle2"
|
||||||
|
|||||||
@@ -191,7 +191,7 @@
|
|||||||
warmup_time = 0
|
warmup_time = 0
|
||||||
current_location = "tether_excursion_hangar"
|
current_location = "tether_excursion_hangar"
|
||||||
docking_controller_tag = "expshuttle_docker"
|
docking_controller_tag = "expshuttle_docker"
|
||||||
shuttle_area = list(/area/shuttle/excursion/cockpit, /area/shuttle/excursion/general, /area/shuttle/excursion/cargo)
|
shuttle_area = list(/area/shuttle/excursion/cockpit, /area/shuttle/excursion/general, /area/shuttle/excursion/cargo, /area/shuttle/excursion/power)
|
||||||
fuel_consumption = 3
|
fuel_consumption = 3
|
||||||
move_direction = NORTH
|
move_direction = NORTH
|
||||||
|
|
||||||
|
|||||||
@@ -3538,6 +3538,7 @@
|
|||||||
#include "code\modules\overmap\ships\landable.dm"
|
#include "code\modules\overmap\ships\landable.dm"
|
||||||
#include "code\modules\overmap\ships\panicbutton.dm"
|
#include "code\modules\overmap\ships\panicbutton.dm"
|
||||||
#include "code\modules\overmap\ships\ship.dm"
|
#include "code\modules\overmap\ships\ship.dm"
|
||||||
|
#include "code\modules\overmap\ships\ship_vr.dm"
|
||||||
#include "code\modules\overmap\ships\computers\computer_shims.dm"
|
#include "code\modules\overmap\ships\computers\computer_shims.dm"
|
||||||
#include "code\modules\overmap\ships\computers\engine_control.dm"
|
#include "code\modules\overmap\ships\computers\engine_control.dm"
|
||||||
#include "code\modules\overmap\ships\computers\helm.dm"
|
#include "code\modules\overmap\ships\computers\helm.dm"
|
||||||
|
|||||||