mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2025-12-10 04:06:00 +00:00
Ha ha, I have no idea what I'm doing.
This commit is contained in:
@@ -127,8 +127,10 @@
|
|||||||
// /turf signals
|
// /turf signals
|
||||||
#define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps)
|
#define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps)
|
||||||
#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities)
|
#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities)
|
||||||
#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction)
|
|
||||||
*/
|
*/
|
||||||
|
#define COMSIG_TURF_MULTIZ_DEL "turf_multiz_del"
|
||||||
|
///from base of turf/multiz_turf_new: (turf/source, direction)
|
||||||
|
#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new"
|
||||||
|
|
||||||
// /atom/movable signals
|
// /atom/movable signals
|
||||||
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom)
|
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom)
|
||||||
|
|||||||
@@ -16,3 +16,9 @@ GLOBAL_VAR(bible_icon_state)
|
|||||||
GLOBAL_VAR(bible_item_state)
|
GLOBAL_VAR(bible_item_state)
|
||||||
GLOBAL_VAR(holy_weapon_type)
|
GLOBAL_VAR(holy_weapon_type)
|
||||||
GLOBAL_VAR(holy_armor_type)
|
GLOBAL_VAR(holy_armor_type)
|
||||||
|
|
||||||
|
//Vore Port
|
||||||
|
GLOBAL_LIST_EMPTY(error_last_seen)
|
||||||
|
GLOBAL_LIST_EMPTY(error_cooldown)
|
||||||
|
|
||||||
|
GLOBAL_DATUM_INIT(destroyed_event, /decl/observ/destroyed, new())
|
||||||
|
|||||||
84
code/datums/elements/turf_transparency.dm
Normal file
84
code/datums/elements/turf_transparency.dm
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
|
||||||
|
/datum/element/turf_z_transparency
|
||||||
|
var/show_bottom_level = FALSE
|
||||||
|
|
||||||
|
///This proc sets up the signals to handle updating viscontents when turfs above/below update. Handle plane and layer here too so that they don't cover other obs/turfs in Dream Maker
|
||||||
|
/datum/element/turf_z_transparency/Attach(datum/target, show_bottom_level = TRUE)
|
||||||
|
. = ..()
|
||||||
|
if(!isturf(target))
|
||||||
|
return ELEMENT_INCOMPATIBLE
|
||||||
|
|
||||||
|
var/turf/our_turf = target
|
||||||
|
|
||||||
|
src.show_bottom_level = show_bottom_level
|
||||||
|
|
||||||
|
our_turf.plane = OPENSPACE_PLANE
|
||||||
|
//our_turf.layer = OPENSPACE_LAYER
|
||||||
|
|
||||||
|
RegisterSignal(target, COMSIG_TURF_MULTIZ_DEL, .proc/on_multiz_turf_del, override = TRUE)
|
||||||
|
RegisterSignal(target, COMSIG_TURF_MULTIZ_NEW, .proc/on_multiz_turf_new, override = TRUE)
|
||||||
|
|
||||||
|
update_multiz(our_turf, TRUE, TRUE)
|
||||||
|
|
||||||
|
/datum/element/turf_z_transparency/Detach(datum/source)
|
||||||
|
. = ..()
|
||||||
|
var/turf/our_turf = source
|
||||||
|
our_turf.vis_contents.len = 0
|
||||||
|
UnregisterSignal(our_turf, COMSIG_TURF_MULTIZ_DEL)
|
||||||
|
UnregisterSignal(our_turf, COMSIG_TURF_MULTIZ_NEW)
|
||||||
|
|
||||||
|
///Updates the viscontents or underlays below this tile.
|
||||||
|
/datum/element/turf_z_transparency/proc/update_multiz(turf/our_turf, prune_on_fail = FALSE, init = FALSE)
|
||||||
|
var/turf/below_turf = GetBelow(our_turf)
|
||||||
|
if(!below_turf)
|
||||||
|
our_turf.vis_contents.len = 0
|
||||||
|
if(!show_bottom_level(our_turf) && prune_on_fail) //If we cant show whats below, and we prune on fail, change the turf to plating as a fallback
|
||||||
|
our_turf.ChangeTurf(/turf/simulated/floor/plating)
|
||||||
|
return FALSE
|
||||||
|
else
|
||||||
|
return TRUE
|
||||||
|
if(init)
|
||||||
|
below_turf?.update_icon() // So the 'ceiling-less' overlay gets added.
|
||||||
|
our_turf.vis_contents += below_turf
|
||||||
|
|
||||||
|
if(is_blocked_turf(our_turf)) //Show girders below closed turfs
|
||||||
|
var/mutable_appearance/girder_underlay = mutable_appearance('icons/obj/structures.dmi', "girder", layer = TURF_LAYER-0.01)
|
||||||
|
girder_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR
|
||||||
|
our_turf.underlays += girder_underlay
|
||||||
|
var/mutable_appearance/plating_underlay = mutable_appearance('icons/turf/floors.dmi', "plating", layer = TURF_LAYER-0.02)
|
||||||
|
plating_underlay = RESET_ALPHA | RESET_COLOR
|
||||||
|
our_turf.underlays += plating_underlay
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/element/turf_z_transparency/proc/on_multiz_turf_del(turf/our_turf, turf/below_turf, dir)
|
||||||
|
if(dir != DOWN)
|
||||||
|
return
|
||||||
|
|
||||||
|
update_multiz(our_turf)
|
||||||
|
|
||||||
|
/datum/element/turf_z_transparency/proc/on_multiz_turf_new(turf/our_turf, turf/below_turf, dir)
|
||||||
|
|
||||||
|
if(dir != DOWN)
|
||||||
|
return
|
||||||
|
|
||||||
|
update_multiz(our_turf)
|
||||||
|
|
||||||
|
///Called when there is no real turf below this turf
|
||||||
|
/datum/element/turf_z_transparency/proc/show_bottom_level(turf/our_turf)
|
||||||
|
if(!show_bottom_level)
|
||||||
|
return FALSE
|
||||||
|
var/turf/path = get_base_turf_by_area(our_turf) || /turf/space
|
||||||
|
if(!ispath(path))
|
||||||
|
path = text2path(path)
|
||||||
|
if(!ispath(path))
|
||||||
|
warning("Z-level [our_turf] has invalid baseturf '[get_base_turf_by_area(our_turf)]' in area '[get_area(our_turf)]'")
|
||||||
|
path = /turf/space
|
||||||
|
|
||||||
|
var/do_plane = ispath(path, /turf/space) ? SPACE_PLANE : null
|
||||||
|
var/do_state = ispath(path, /turf/space) ? "white" : initial(path.icon_state)
|
||||||
|
|
||||||
|
var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), do_state, layer = TURF_LAYER-0.02, plane = do_plane)
|
||||||
|
underlay_appearance.appearance_flags = RESET_ALPHA | RESET_COLOR
|
||||||
|
our_turf.underlays += underlay_appearance
|
||||||
|
|
||||||
|
return TRUE
|
||||||
15
code/datums/observation/destroyed.dm
Normal file
15
code/datums/observation/destroyed.dm
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
// Observer Pattern Implementation: Destroyed
|
||||||
|
// Registration type: /datum
|
||||||
|
//
|
||||||
|
// Raised when: A /datum instance is destroyed.
|
||||||
|
//
|
||||||
|
// Arguments that the called proc should expect:
|
||||||
|
// /datum/destroyed_instance: The instance that was destroyed.
|
||||||
|
|
||||||
|
/decl/observ/destroyed
|
||||||
|
name = "Destroyed"
|
||||||
|
|
||||||
|
/datum/Destroy()
|
||||||
|
if(GLOB.destroyed_event)
|
||||||
|
GLOB.destroyed_event.raise_event(src)
|
||||||
|
. = ..()
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
if(new_partner)
|
if(new_partner)
|
||||||
pair(new_partner)
|
pair(new_partner)
|
||||||
|
|
||||||
/obj/effect/overmap/bluespace_rift/proc/pair(var/obj/effect/overmap/bluespace_rift/new_partner)
|
/obj/effect/overmap/bluespace_rift/proc/pair(var/obj/effect/overmap/bluespace_rift/new_partner)
|
||||||
if(istype(new_partner))
|
if(istype(new_partner))
|
||||||
partner = new_partner
|
partner = new_partner
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
attack_verb = list("attacked", "bonked", "hit")
|
attack_verb = list("attacked", "bonked", "hit")
|
||||||
var/min_name_len = 4 // Refuse if shuttle tag is shorter than this.
|
var/min_name_len = 4 // Refuse if shuttle tag is shorter than this.
|
||||||
var/max_name_len = 32 // Refuse if shuttle tag is longer than this.
|
var/max_name_len = 32 // Refuse if shuttle tag is longer than this.
|
||||||
var/max_area_turfs = 256 // Refuse if area has more than this many turfs.
|
var/max_area_turfs = 140 // Refuse if area has more than this many turfs.
|
||||||
|
|
||||||
/obj/item/champagne/afterattack(var/atom/A, mob/user as mob, proximity)
|
/obj/item/champagne/afterattack(var/atom/A, mob/user as mob, proximity)
|
||||||
if(!proximity)
|
if(!proximity)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
if(prob(50))
|
if(prob(50))
|
||||||
var/turf/T = get_turf(src)
|
var/turf/T = get_turf(src)
|
||||||
if(!isspace(T) && !istype(T, /turf/simulated/floor/carpet))
|
if(!istype(T, /turf/space) && !istype(T, /turf/simulated/floor/carpet))
|
||||||
playsound(T, pick(move_sounds), 50, 1)
|
playsound(T, pick(move_sounds), 50, 1)
|
||||||
|
|
||||||
/obj/structure/ship_munition/disperser_charge/fire
|
/obj/structure/ship_munition/disperser_charge/fire
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
var/skybox_pixel_x //Shift from lower left corner of skybox
|
var/skybox_pixel_x //Shift from lower left corner of skybox
|
||||||
var/skybox_pixel_y //Shift from lower left corner of skybox
|
var/skybox_pixel_y //Shift from lower left corner of skybox
|
||||||
var/image/cached_skybox_image //Cachey
|
var/image/cached_skybox_image //Cachey
|
||||||
|
var/image/real_appearance
|
||||||
|
|
||||||
//Overlay of how this object should look on other skyboxes
|
//Overlay of how this object should look on other skyboxes
|
||||||
/obj/effect/overmap/proc/get_skybox_representation()
|
/obj/effect/overmap/proc/get_skybox_representation()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
//Overmap object representing zlevel(s)
|
//Overmap object representing zlevel(s)
|
||||||
//===================================================================================
|
//===================================================================================
|
||||||
@@ -7,33 +6,45 @@
|
|||||||
scannable = TRUE
|
scannable = TRUE
|
||||||
scanner_desc = "!! No Data Available !!"
|
scanner_desc = "!! No Data Available !!"
|
||||||
|
|
||||||
|
icon_state = "generic"
|
||||||
|
|
||||||
|
/// Name prior to being scanned if !known
|
||||||
|
var/unknown_name = "unknown sector"
|
||||||
|
/// Icon_state prior to being scanned if !known
|
||||||
|
var/unknown_state = "field"
|
||||||
|
|
||||||
var/list/map_z = list()
|
var/list/map_z = list()
|
||||||
var/list/extra_z_levels // If you need to manually insist that these z-levels are part of this sector, for things like edge-of-map step trigger transitions rather than multi-z complexes
|
var/list/extra_z_levels //if you need to manually insist that these z-levels are part of this sector, for things like edge-of-map step trigger transitions rather than multi-z complexes
|
||||||
|
|
||||||
var/list/initial_generic_waypoints // Store landmark_tag of landmarks that should be added to the actual lists below on init.
|
var/list/initial_generic_waypoints //store landmark_tag of landmarks that should be added to the actual lists below on init.
|
||||||
var/list/initial_restricted_waypoints // For use with non-automatic landmarks (automatic ones add themselves).
|
var/list/initial_restricted_waypoints //For use with non-automatic landmarks (automatic ones add themselves).
|
||||||
|
|
||||||
var/list/generic_waypoints = list() // Waypoints that any shuttle can use
|
var/list/generic_waypoints = list() //waypoints that any shuttle can use
|
||||||
var/list/restricted_waypoints = list() // Waypoints for specific shuttles
|
var/list/restricted_waypoints = list() //waypoints for specific shuttles
|
||||||
var/docking_codes
|
var/docking_codes
|
||||||
|
|
||||||
var/start_x // Coordinates for self placing
|
var/start_x //Coordinates for self placing
|
||||||
var/start_y // Will use random values if unset
|
var/start_y //will use random values if unset
|
||||||
|
|
||||||
var/base = 0 // Starting sector, counts as station_levels
|
var/base = 0 //starting sector, counts as station_levels
|
||||||
var/in_space = 1 // Can be accessed via lucky EVA
|
var/in_space = 1 //can be accessed via lucky EVA
|
||||||
|
|
||||||
var/hide_from_reports = FALSE
|
var/hide_from_reports = FALSE
|
||||||
|
|
||||||
var/has_distress_beacon
|
var/has_distress_beacon
|
||||||
|
var/list/levels_for_distress
|
||||||
|
var/list/unowned_areas // areas we don't own despite them being present on our z
|
||||||
|
|
||||||
/obj/effect/overmap/visitable/Initialize(mapload)
|
/obj/effect/overmap/visitable/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
if(. == INITIALIZE_HINT_QDEL)
|
if(. == INITIALIZE_HINT_QDEL)
|
||||||
return
|
return
|
||||||
|
|
||||||
find_z_levels() // This populates map_z and assigns z levels to the ship.
|
find_z_levels() // This populates map_z and assigns z levels to the ship.
|
||||||
register_z_levels() // This makes external calls to update global z level information.
|
register_z_levels() // This makes external calls to update global z level information.
|
||||||
|
|
||||||
|
if(!GLOB.using_map.overmap_z)
|
||||||
|
build_overmap()
|
||||||
|
|
||||||
start_x = start_x || rand(OVERMAP_EDGE, GLOB.using_map.overmap_size - OVERMAP_EDGE)
|
start_x = start_x || rand(OVERMAP_EDGE, GLOB.using_map.overmap_size - OVERMAP_EDGE)
|
||||||
start_y = start_y || rand(OVERMAP_EDGE, GLOB.using_map.overmap_size - OVERMAP_EDGE)
|
start_y = start_y || rand(OVERMAP_EDGE, GLOB.using_map.overmap_size - OVERMAP_EDGE)
|
||||||
@@ -44,10 +55,29 @@
|
|||||||
|
|
||||||
testing("Located sector \"[name]\" at [start_x],[start_y], containing Z [english_list(map_z)]")
|
testing("Located sector \"[name]\" at [start_x],[start_y], containing Z [english_list(map_z)]")
|
||||||
|
|
||||||
LAZYADD(SSshuttle.sectors_to_initialize, src) // Queued for further init. Will populate the waypoint lists; waypoints not spawned yet will be added in as they spawn.
|
LAZYADD(SSshuttle.sectors_to_initialize, src) //Queued for further init. Will populate the waypoint lists; waypoints not spawned yet will be added in as they spawn.
|
||||||
SSshuttle.process_init_queues()
|
SSshuttle.process_init_queues()
|
||||||
|
|
||||||
// This is called later in the init order by SSshuttle to populate sector objects. Importantly for subtypes, shuttles will be created by then.
|
if(known)
|
||||||
|
plane = PLANE_LIGHTING_ABOVE
|
||||||
|
for(var/obj/machinery/computer/ship/helm/H in global.machines)
|
||||||
|
H.get_known_sectors()
|
||||||
|
else
|
||||||
|
real_appearance = image(icon, src, icon_state)
|
||||||
|
real_appearance.override = TRUE
|
||||||
|
name = unknown_name
|
||||||
|
icon_state = unknown_state
|
||||||
|
color = null
|
||||||
|
desc = "Scan this to find out more information."
|
||||||
|
|
||||||
|
|
||||||
|
// You generally shouldn't destroy these.
|
||||||
|
/obj/effect/overmap/visitable/Destroy()
|
||||||
|
testing("Deleting [src] overmap sector at [x],[y]")
|
||||||
|
unregister_z_levels()
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
//This is called later in the init order by SSshuttles to populate sector objects. Importantly for subtypes, shuttles will be created by then.
|
||||||
/obj/effect/overmap/visitable/proc/populate_sector_objects()
|
/obj/effect/overmap/visitable/proc/populate_sector_objects()
|
||||||
|
|
||||||
/obj/effect/overmap/visitable/proc/get_areas()
|
/obj/effect/overmap/visitable/proc/get_areas()
|
||||||
@@ -57,7 +87,7 @@
|
|||||||
. += A
|
. += A
|
||||||
|
|
||||||
/obj/effect/overmap/visitable/proc/find_z_levels()
|
/obj/effect/overmap/visitable/proc/find_z_levels()
|
||||||
if(!LAZYLEN(map_z)) // If map_z is already populated use it as-is, otherwise start with connected z-levels.
|
if(!LAZYLEN(map_z)) // If map_z is already populated use it as-is, otherwise start with connected z-levels.
|
||||||
map_z = GetConnectedZlevels(z)
|
map_z = GetConnectedZlevels(z)
|
||||||
if(LAZYLEN(extra_z_levels))
|
if(LAZYLEN(extra_z_levels))
|
||||||
map_z |= extra_z_levels
|
map_z |= extra_z_levels
|
||||||
@@ -69,10 +99,34 @@
|
|||||||
GLOB.using_map.player_levels |= map_z
|
GLOB.using_map.player_levels |= map_z
|
||||||
if(!in_space)
|
if(!in_space)
|
||||||
GLOB.using_map.sealed_levels |= map_z
|
GLOB.using_map.sealed_levels |= map_z
|
||||||
|
/* VOREStation Removal - We have a map system that does this already.
|
||||||
if(base)
|
if(base)
|
||||||
GLOB.using_map.station_levels |= map_z
|
global.using_map.station_levels |= map_z
|
||||||
GLOB.using_map.contact_levels |= map_z
|
global.using_map.contact_levels |= map_z
|
||||||
GLOB.using_map.map_levels |= map_z
|
global.using_map.map_levels |= map_z
|
||||||
|
*/
|
||||||
|
|
||||||
|
/obj/effect/overmap/visitable/proc/unregister_z_levels()
|
||||||
|
map_sectors -= map_z
|
||||||
|
|
||||||
|
GLOB.using_map.player_levels -= map_z
|
||||||
|
if(!in_space)
|
||||||
|
GLOB.using_map.sealed_levels -= map_z
|
||||||
|
/* VOREStation Removal - We have a map system that does this already.
|
||||||
|
if(base)
|
||||||
|
global.using_map.station_levels -= map_z
|
||||||
|
global.using_map.contact_levels -= map_z
|
||||||
|
global.using_map.map_levels -= map_z
|
||||||
|
*/
|
||||||
|
|
||||||
|
/obj/effect/overmap/visitable/get_scan_data()
|
||||||
|
if(!known)
|
||||||
|
known = TRUE
|
||||||
|
name = initial(name)
|
||||||
|
icon_state = initial(icon_state)
|
||||||
|
color = initial(color)
|
||||||
|
desc = initial(desc)
|
||||||
|
return ..()
|
||||||
|
|
||||||
/obj/effect/overmap/visitable/proc/get_space_zlevels()
|
/obj/effect/overmap/visitable/proc/get_space_zlevels()
|
||||||
if(in_space)
|
if(in_space)
|
||||||
@@ -80,12 +134,17 @@
|
|||||||
else
|
else
|
||||||
return list()
|
return list()
|
||||||
|
|
||||||
// Helper for init.
|
//Helper for init.
|
||||||
/obj/effect/overmap/visitable/proc/check_ownership(obj/object)
|
/obj/effect/overmap/visitable/proc/check_ownership(obj/object)
|
||||||
if((object.z in map_z) && !(get_area(object) in SSshuttle.shuttle_areas))
|
var/area/A = get_area(object)
|
||||||
|
if(A in SSshuttle.shuttle_areas)
|
||||||
|
return 0
|
||||||
|
if(is_type_in_list(A, unowned_areas))
|
||||||
|
return 0
|
||||||
|
if(get_z(object) in map_z)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
// If shuttle_name is false, will add to generic waypoints; otherwise will add to restricted. Does not do checks.
|
//If shuttle_name is false, will add to generic waypoints; otherwise will add to restricted. Does not do checks.
|
||||||
/obj/effect/overmap/visitable/proc/add_landmark(obj/effect/shuttle_landmark/landmark, shuttle_name)
|
/obj/effect/overmap/visitable/proc/add_landmark(obj/effect/shuttle_landmark/landmark, shuttle_name)
|
||||||
landmark.sector_set(src, shuttle_name)
|
landmark.sector_set(src, shuttle_name)
|
||||||
if(shuttle_name)
|
if(shuttle_name)
|
||||||
@@ -110,21 +169,24 @@
|
|||||||
for(var/thing in restricted_waypoints[shuttle_name])
|
for(var/thing in restricted_waypoints[shuttle_name])
|
||||||
.[thing] = name
|
.[thing] = name
|
||||||
|
|
||||||
/obj/effect/overmap/visitable/proc/generate_skybox()
|
/obj/effect/overmap/visitable/proc/generate_skybox(zlevel)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/obj/effect/overmap/visitable/proc/cleanup()
|
||||||
|
return FALSE
|
||||||
|
|
||||||
/obj/effect/overmap/visitable/MouseEntered(location, control, params)
|
/obj/effect/overmap/visitable/MouseEntered(location, control, params)
|
||||||
openToolTip(user = usr, tip_src = src, params = params, title = name)
|
openToolTip(user = usr, tip_src = src, params = params, title = name)
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/effect/overmap/visitable/MouseDown()
|
/obj/effect/overmap/visitable/MouseDown()
|
||||||
closeToolTip(usr) // No reason not to, really
|
closeToolTip(usr) //No reason not to, really
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/effect/overmap/visitable/MouseExited()
|
/obj/effect/overmap/visitable/MouseExited()
|
||||||
closeToolTip(usr) // No reason not to, really
|
closeToolTip(usr) //No reason not to, really
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
@@ -132,12 +194,46 @@
|
|||||||
name = "generic sector"
|
name = "generic sector"
|
||||||
desc = "Sector with some stuff in it."
|
desc = "Sector with some stuff in it."
|
||||||
icon_state = "sector"
|
icon_state = "sector"
|
||||||
anchored = 1
|
anchored = TRUE
|
||||||
|
|
||||||
// Because of the way these are spawned, they will potentially have their invisibility adjusted by the turfs they are mapped on
|
// Because of the way these are spawned, they will potentially have their invisibility adjusted by the turfs they are mapped on
|
||||||
// prior to being moved to the overmap. This blocks that. Use set_invisibility to adjust invisibility as needed instead.
|
// prior to being moved to the overmap. This blocks that. Use set_invisibility to adjust invisibility as needed instead.
|
||||||
/obj/effect/overmap/visitable/sector/hide()
|
/obj/effect/overmap/visitable/sector/hide()
|
||||||
|
|
||||||
|
/obj/effect/overmap/visitable/proc/distress(mob/user)
|
||||||
|
if(has_distress_beacon)
|
||||||
|
return FALSE
|
||||||
|
has_distress_beacon = TRUE
|
||||||
|
|
||||||
|
admin_chat_message(message = "Overmap panic button hit on z[z] ([name]) by '[user?.ckey || "Unknown"]'", color = "#FF2222") //VOREStation Add
|
||||||
|
var/message = "This is an automated distress signal from a MIL-DTL-93352-compliant beacon transmitting on [PUB_FREQ*0.1]kHz. \
|
||||||
|
This beacon was launched from '[initial(name)]'. I can provide this additional information to rescuers: [get_distress_info()]. \
|
||||||
|
Per the Interplanetary Convention on Space SAR, those receiving this message must attempt rescue, \
|
||||||
|
or relay the message to those who can. This message will repeat one time in 5 minutes. Thank you for your urgent assistance."
|
||||||
|
|
||||||
|
if(!levels_for_distress)
|
||||||
|
levels_for_distress = list(1)
|
||||||
|
for(var/zlevel in levels_for_distress)
|
||||||
|
priority_announcement.Announce(message, new_title = "Automated Distress Signal", new_sound = 'sound/AI/sos.ogg', zlevel = zlevel)
|
||||||
|
|
||||||
|
var/image/I = image(icon, icon_state = "distress")
|
||||||
|
I.plane = PLANE_LIGHTING_ABOVE
|
||||||
|
I.appearance_flags = KEEP_APART|RESET_TRANSFORM|RESET_COLOR
|
||||||
|
add_overlay(I)
|
||||||
|
|
||||||
|
addtimer(CALLBACK(src, .proc/distress_update), 5 MINUTES)
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/obj/effect/overmap/visitable/proc/get_distress_info()
|
||||||
|
return "\[X:[x], Y:[y]\]"
|
||||||
|
|
||||||
|
/obj/effect/overmap/visitable/proc/distress_update()
|
||||||
|
var/message = "This is the final message from the distress beacon launched from '[initial(name)]'. I can provide this additional information to rescuers: [get_distress_info()]. \
|
||||||
|
Please render assistance under your obligations per the Interplanetary Convention on Space SAR, or relay this message to a party who can. Thank you for your urgent assistance."
|
||||||
|
|
||||||
|
for(var/zlevel in levels_for_distress)
|
||||||
|
priority_announcement.Announce(message, new_title = "Automated Distress Signal", new_sound = 'sound/AI/sos.ogg', zlevel = zlevel)
|
||||||
|
|
||||||
/proc/build_overmap()
|
/proc/build_overmap()
|
||||||
if(!GLOB.using_map.use_overmap)
|
if(!GLOB.using_map.use_overmap)
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
73
code/modules/overmap/ships/panicbutton.dm
Normal file
73
code/modules/overmap/ships/panicbutton.dm
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
/obj/structure/panic_button
|
||||||
|
name = "distress beacon trigger"
|
||||||
|
desc = "WARNING: Will deploy ship's distress beacon and request help. Misuse may result in fines and jail time."
|
||||||
|
description_info = "Using this device (smashing the glas on harm intent, and then pressing the button) will send a message to people on other z-levels requesting their aid. It may take them a while to come get you, as they'll need to prepare. You should only use this if you really need it."
|
||||||
|
icon = 'icons/obj/objects_vr.dmi'
|
||||||
|
icon_state = "panicbutton"
|
||||||
|
anchored = TRUE
|
||||||
|
|
||||||
|
var/glass = TRUE
|
||||||
|
var/launched = FALSE
|
||||||
|
|
||||||
|
// In case we're annihilated by a meteor
|
||||||
|
/obj/structure/panic_button/Destroy()
|
||||||
|
if(!launched)
|
||||||
|
launch()
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/obj/structure/panic_button/update_icon()
|
||||||
|
if(launched)
|
||||||
|
icon_state = "[initial(icon_state)]_launched"
|
||||||
|
else if(!glass)
|
||||||
|
icon_state = "[initial(icon_state)]_open"
|
||||||
|
else
|
||||||
|
icon_state = "[initial(icon_state)]"
|
||||||
|
|
||||||
|
/obj/structure/panic_button/attack_hand(mob/living/user)
|
||||||
|
if(!istype(user))
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
if(user.incapacitated())
|
||||||
|
return
|
||||||
|
|
||||||
|
// Already launched
|
||||||
|
if(launched)
|
||||||
|
to_chat(user, "<span class='warning'>The button is already depressed; the beacon has been launched already.</span>")
|
||||||
|
// Glass present
|
||||||
|
else if(glass)
|
||||||
|
if(user.a_intent == INTENT_HARM)
|
||||||
|
visible_message("<span class='warning'>smashes the glass on [src]!</span>")
|
||||||
|
glass = FALSE
|
||||||
|
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg')
|
||||||
|
update_icon()
|
||||||
|
else
|
||||||
|
visible_message("<span class='notice'>pats [src] in a friendly manner.</span>")
|
||||||
|
to_chat(user, "<span class='warning'>If you're trying to break the glass, you'll have to hit it harder than that...</span>")
|
||||||
|
// Must be !glass and !launched
|
||||||
|
else
|
||||||
|
user.custom_emote("<span class='warning'>pushes the button on [src]!</span>")
|
||||||
|
launch(user)
|
||||||
|
playsound(src, get_sfx("button"))
|
||||||
|
update_icon()
|
||||||
|
|
||||||
|
/obj/structure/panic_button/proc/launch(mob/living/user)
|
||||||
|
if(launched)
|
||||||
|
return
|
||||||
|
launched = TRUE
|
||||||
|
var/obj/effect/overmap/visitable/S = get_overmap_sector(z)
|
||||||
|
if(!S)
|
||||||
|
visible_message("<span class='danger'>Distress button hit on z[z] but that's not an overmap sector...</span>")
|
||||||
|
return
|
||||||
|
S.distress(user)
|
||||||
|
//Kind of pricey, but this is a one-time thing that can't be reused, so I'm not too worried.
|
||||||
|
var/list/hear_z = GetConnectedZlevels(z) // multiz 'physical' connections only, not crazy overmap connections
|
||||||
|
|
||||||
|
var/mapsize = (world.maxx+world.maxy)*0.5
|
||||||
|
var/turf/us = get_turf(src)
|
||||||
|
|
||||||
|
for(var/hz in hear_z)
|
||||||
|
for(var/mob/M as anything in GLOB.players_by_zlevel[hz])
|
||||||
|
var/sound/SND = sound('sound/misc/emergency_beacon_launched.ogg') // Inside the loop because playsound_local modifies it for each person, so, need separate instances
|
||||||
|
var/turf/them = get_turf(M)
|
||||||
|
var/volume = max(0.20, 1-(get_dist(us,them) / mapsize*0.8))*100
|
||||||
|
M.playsound_local(get_turf(M), SND, vol = volume)
|
||||||
@@ -261,6 +261,12 @@
|
|||||||
/obj/effect/overmap/visitable/ship/proc/get_landed_info()
|
/obj/effect/overmap/visitable/ship/proc/get_landed_info()
|
||||||
return "This ship cannot land."
|
return "This ship cannot land."
|
||||||
|
|
||||||
|
/obj/effect/overmap/visitable/ship/get_distress_info()
|
||||||
|
var/turf/T = get_turf(src) // Usually we're on the turf, but sometimes we might be landed or something.
|
||||||
|
var/x_to_use = T?.x || "UNK"
|
||||||
|
var/y_to_use = T?.y || "UNK"
|
||||||
|
return "\[X:[x_to_use], Y:[y_to_use], VEL:[get_speed() * 1000], HDG:[get_heading_degrees()]\]"
|
||||||
|
|
||||||
#undef MOVING
|
#undef MOVING
|
||||||
#undef SANITIZE_SPEED
|
#undef SANITIZE_SPEED
|
||||||
#undef CHANGE_SPEED_BY
|
#undef CHANGE_SPEED_BY
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ var/global/list/map_sectors = list()
|
|||||||
else
|
else
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
/turf/unsimulated/map/Initialize(mapload)
|
/turf/unsimulated/map/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
name = "[x]-[y]"
|
name = "[x]-[y]"
|
||||||
var/list/numbers = list()
|
var/list/numbers = list()
|
||||||
@@ -77,6 +77,7 @@ var/global/list/map_sectors = list()
|
|||||||
if(x == GLOB.using_map.overmap_size)
|
if(x == GLOB.using_map.overmap_size)
|
||||||
I.pixel_x = 5*i + 2
|
I.pixel_x = 5*i + 2
|
||||||
add_overlay(I)
|
add_overlay(I)
|
||||||
|
AddElement(/datum/element/turf_z_transparency)
|
||||||
|
|
||||||
/turf/unsimulated/map/Entered(var/atom/movable/O, var/atom/oldloc)
|
/turf/unsimulated/map/Entered(var/atom/movable/O, var/atom/oldloc)
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -251,6 +251,14 @@
|
|||||||
Z_LEVEL_UNDERDARK
|
Z_LEVEL_UNDERDARK
|
||||||
)
|
)
|
||||||
|
|
||||||
|
levels_for_distress = list(
|
||||||
|
Z_LEVEL_OFFMAP1,
|
||||||
|
Z_LEVEL_BEACH,
|
||||||
|
Z_LEVEL_AEROSTAT,
|
||||||
|
Z_LEVEL_DEBRISFIELD,
|
||||||
|
Z_LEVEL_FUELDEPOT
|
||||||
|
)
|
||||||
|
|
||||||
//Port of Triumph Overmap Visitable Effects
|
//Port of Triumph Overmap Visitable Effects
|
||||||
/obj/effect/overmap/visitable/sector/debrisfield
|
/obj/effect/overmap/visitable/sector/debrisfield
|
||||||
name = "Debris Field"
|
name = "Debris Field"
|
||||||
|
|||||||
BIN
sound/AI/sos.ogg
Normal file
BIN
sound/AI/sos.ogg
Normal file
Binary file not shown.
BIN
sound/effects/metalscrape1.ogg
Normal file
BIN
sound/effects/metalscrape1.ogg
Normal file
Binary file not shown.
BIN
sound/effects/metalscrape2.ogg
Normal file
BIN
sound/effects/metalscrape2.ogg
Normal file
Binary file not shown.
BIN
sound/effects/metalscrape3.ogg
Normal file
BIN
sound/effects/metalscrape3.ogg
Normal file
Binary file not shown.
BIN
sound/machines/disperser_fire.ogg
Normal file
BIN
sound/machines/disperser_fire.ogg
Normal file
Binary file not shown.
BIN
sound/misc/emergency_beacon_launched.ogg
Normal file
BIN
sound/misc/emergency_beacon_launched.ogg
Normal file
Binary file not shown.
@@ -333,6 +333,7 @@
|
|||||||
#include "code\datums\elements\_element.dm"
|
#include "code\datums\elements\_element.dm"
|
||||||
#include "code\datums\elements\conflict_checking.dm"
|
#include "code\datums\elements\conflict_checking.dm"
|
||||||
#include "code\datums\elements\persistence.dm"
|
#include "code\datums\elements\persistence.dm"
|
||||||
|
#include "code\datums\elements\turf_transparency.dm"
|
||||||
#include "code\datums\helper_datums\construction_datum.dm"
|
#include "code\datums\helper_datums\construction_datum.dm"
|
||||||
#include "code\datums\helper_datums\events.dm"
|
#include "code\datums\helper_datums\events.dm"
|
||||||
#include "code\datums\helper_datums\getrev.dm"
|
#include "code\datums\helper_datums\getrev.dm"
|
||||||
@@ -354,6 +355,7 @@
|
|||||||
#include "code\datums\looping_sounds\weather_sounds.dm"
|
#include "code\datums\looping_sounds\weather_sounds.dm"
|
||||||
#include "code\datums\observation\_debug.dm"
|
#include "code\datums\observation\_debug.dm"
|
||||||
#include "code\datums\observation\_defines.dm"
|
#include "code\datums\observation\_defines.dm"
|
||||||
|
#include "code\datums\observation\destroyed.dm"
|
||||||
#include "code\datums\observation\observation.dm"
|
#include "code\datums\observation\observation.dm"
|
||||||
#include "code\datums\observation\shuttle_added.dm"
|
#include "code\datums\observation\shuttle_added.dm"
|
||||||
#include "code\datums\observation\shuttle_moved.dm"
|
#include "code\datums\observation\shuttle_moved.dm"
|
||||||
@@ -2958,24 +2960,33 @@
|
|||||||
#include "code\modules\organs\subtypes\vox_vr.dm"
|
#include "code\modules\organs\subtypes\vox_vr.dm"
|
||||||
#include "code\modules\organs\subtypes\xenochimera.dm"
|
#include "code\modules\organs\subtypes\xenochimera.dm"
|
||||||
#include "code\modules\organs\subtypes\xenos.dm"
|
#include "code\modules\organs\subtypes\xenos.dm"
|
||||||
|
#include "code\modules\overmap\abductor_vr.dm"
|
||||||
#include "code\modules\overmap\bluespace_rift.dm"
|
#include "code\modules\overmap\bluespace_rift.dm"
|
||||||
#include "code\modules\overmap\champagne.dm"
|
#include "code\modules\overmap\champagne.dm"
|
||||||
#include "code\modules\overmap\helpers.dm"
|
#include "code\modules\overmap\helpers.dm"
|
||||||
#include "code\modules\overmap\overmap_object.dm"
|
#include "code\modules\overmap\overmap_object.dm"
|
||||||
|
#include "code\modules\overmap\overmap_planet.dm"
|
||||||
#include "code\modules\overmap\overmap_shuttle.dm"
|
#include "code\modules\overmap\overmap_shuttle.dm"
|
||||||
#include "code\modules\overmap\sectors.dm"
|
#include "code\modules\overmap\sectors.dm"
|
||||||
#include "code\modules\overmap\spacetravel.dm"
|
#include "code\modules\overmap\spacetravel.dm"
|
||||||
#include "code\modules\overmap\turfs.dm"
|
#include "code\modules\overmap\turfs.dm"
|
||||||
|
#include "code\modules\overmap\disperser\disperser.dm"
|
||||||
|
#include "code\modules\overmap\disperser\disperser_charge.dm"
|
||||||
|
#include "code\modules\overmap\disperser\disperser_circuit.dm"
|
||||||
|
#include "code\modules\overmap\disperser\disperser_console.dm"
|
||||||
|
#include "code\modules\overmap\disperser\disperser_fire.dm"
|
||||||
#include "code\modules\overmap\events\event_handler.dm"
|
#include "code\modules\overmap\events\event_handler.dm"
|
||||||
#include "code\modules\overmap\events\generation.dm"
|
#include "code\modules\overmap\events\generation.dm"
|
||||||
#include "code\modules\overmap\events\overmap_event.dm"
|
#include "code\modules\overmap\events\overmap_event.dm"
|
||||||
#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\ship.dm"
|
#include "code\modules\overmap\ships\ship.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"
|
||||||
#include "code\modules\overmap\ships\computers\sensors.dm"
|
#include "code\modules\overmap\ships\computers\sensors.dm"
|
||||||
#include "code\modules\overmap\ships\computers\ship.dm"
|
#include "code\modules\overmap\ships\computers\ship.dm"
|
||||||
|
#include "code\modules\overmap\ships\computers\ship_vr.dm"
|
||||||
#include "code\modules\overmap\ships\computers\shuttle.dm"
|
#include "code\modules\overmap\ships\computers\shuttle.dm"
|
||||||
#include "code\modules\overmap\ships\engines\engine.dm"
|
#include "code\modules\overmap\ships\engines\engine.dm"
|
||||||
#include "code\modules\overmap\ships\engines\gas_thruster.dm"
|
#include "code\modules\overmap\ships\engines\gas_thruster.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user