From 6e783cff0279adb3c6cd4fc063b3ba5bc2e278d2 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 15 Sep 2024 17:29:18 -0400
Subject: [PATCH 01/20] Add
---
citadel.dme | 3 +
code/__HELPERS/game/turfs/blocks.dm | 83 +++++++++++
code/__HELPERS/game/turfs/line.dm | 2 +-
code/__HELPERS/game/turfs/offsets.dm | 2 +-
.../shuttles/shuttle/shuttle_descriptor.dm | 35 +++++
.../shuttles/shuttle/shuttle_template.dm | 138 ++++++++++++++++++
6 files changed, 261 insertions(+), 2 deletions(-)
create mode 100644 code/__HELPERS/game/turfs/blocks.dm
create mode 100644 code/modules/shuttles/shuttle/shuttle_descriptor.dm
create mode 100644 code/modules/shuttles/shuttle/shuttle_template.dm
diff --git a/citadel.dme b/citadel.dme
index 0da2380ea275..04e69fd440b9 100644
--- a/citadel.dme
+++ b/citadel.dme
@@ -399,6 +399,7 @@
#include "code\__HELPERS\files\walk.dm"
#include "code\__HELPERS\game\depth.dm"
#include "code\__HELPERS\game\combat\arc.dm"
+#include "code\__HELPERS\game\turfs\blocks.dm"
#include "code\__HELPERS\game\turfs\line.dm"
#include "code\__HELPERS\game\turfs\offsets.dm"
#include "code\__HELPERS\graphs\astar.dm"
@@ -4705,6 +4706,8 @@
#include "code\modules\shuttles\shuttles_vr.dm"
#include "code\modules\shuttles\shuttles_web.dm"
#include "code\modules\shuttles\web_datums.dm"
+#include "code\modules\shuttles\shuttle\shuttle_descriptor.dm"
+#include "code\modules\shuttles\shuttle\shuttle_template.dm"
#include "code\modules\species\abilites.dm"
#include "code\modules\species\character_species.dm"
#include "code\modules\species\physiology.dm"
diff --git a/code/__HELPERS/game/turfs/blocks.dm b/code/__HELPERS/game/turfs/blocks.dm
new file mode 100644
index 000000000000..d0a5e064a0a2
--- /dev/null
+++ b/code/__HELPERS/game/turfs/blocks.dm
@@ -0,0 +1,83 @@
+//* This file is explicitly licensed under the MIT license. *//
+//* Copyright (c) 2024 Citadel Station Developers *//
+
+/**
+ * get turfs bordering a block of turfs
+ *
+ * * returned list will be empty if distance = 0
+ * * returned list will have all nulls incurred by turfs being outside world border
+ * * returned list **has no particular order.**
+ *
+ * @params
+ * * ll_x - lowerleft x
+ * * ll_y - lowerleft y
+ * * ur_x - upperright x
+ * * ur_y - upperright y
+ * * z - z level
+ * * distance - border distance
+ *
+ * @return list() if distance = 0, list of turfs otherwise. turfs outside of world border will be null.
+ */
+/proc/border_of_turf_block(ll_x, ll_y, ur_x, ur_y, z, distance)
+ if(distance <= 0)
+ return list()
+ . = block(
+ ll_x - distance,
+ ll_y - distance,
+ z,
+ ll_x - 1,
+ ur_y + distance,
+ ) + block(
+ ur_x + 1,
+ ll_y - distance,
+ z,
+ ur_x + distance,
+ ur_y + distance,
+ ) + block(
+ ll_x,
+ ur_y + 1,
+ z,
+ ur_x,
+ ur_y + distance,
+ ) + block(
+ ll_x,
+ ll_y - distance,
+ z,
+ ur_x,
+ ll_y - 1,
+ )
+
+/**
+ * get turfs bordering a block of turfs
+ *
+ * * returned list will be empty if distance = 0
+ * * returned list will have all nulls incurred by turfs being outside world border
+ * * returned list is in clockwise order from the **upper left** turf, spiralling outwards from there.
+ *
+ * @params
+ * * ll_x - lowerleft x
+ * * ll_y - lowerleft y
+ * * ur_x - upperright x
+ * * ur_y - upperright y
+ * * z - z level
+ * * distance - border distance
+ *
+ * @return list() if distance = 0, list of turfs otherwise. turfs outside of world border will be null.
+ */
+/proc/border_of_turf_block_spiral_outwards_clockwise(ll_x, ll_y, ur_x, ur_y, z, distance)
+ if(distance <= 0)
+ return list()
+ . = list()
+ for(var/radius in distance)
+ // gather top left to right
+ for(var/x in (ll_x - radius) to (ur_x + radius))
+ . += locate(x, ur_y + radius, z)
+ // gather right top to bottom excluding top and bottom turf
+ for(var/y in (ur_y + radius - 1) to (ll_y - radius + 1) step -1)
+ . += locate(ur_x + radius, y, z)
+ // gather bottom right to left
+ for(var/x in (ur_x + radius) to (ll_x - radius) step -1)
+ . += locate(x, ll_y - radius, z)
+ // gather left bottom to top excluding top and bottom turf
+ for(var/y in (ll_y - radius + 1) to (ur_y + radius - 1))
+ . += locate(ll_x - radius, y, z)
diff --git a/code/__HELPERS/game/turfs/line.dm b/code/__HELPERS/game/turfs/line.dm
index c07645d3eb27..59a213720cd8 100644
--- a/code/__HELPERS/game/turfs/line.dm
+++ b/code/__HELPERS/game/turfs/line.dm
@@ -1,5 +1,5 @@
//* This file is explicitly licensed under the MIT license. *//
-//* Copyright (c) 2024 silicons *//
+//* Copyright (c) 2024 Citadel Station Developers *//
/**
* line drawing algorithm
diff --git a/code/__HELPERS/game/turfs/offsets.dm b/code/__HELPERS/game/turfs/offsets.dm
index cd206ffe0742..df4508beb427 100644
--- a/code/__HELPERS/game/turfs/offsets.dm
+++ b/code/__HELPERS/game/turfs/offsets.dm
@@ -1,5 +1,5 @@
//* This file is explicitly licensed under the MIT license. *//
-//* Copyright (c) 2024 silicons *//
+//* Copyright (c) 2024 Citadel Station Developers *//
/**
* get coordinate and direction tuple when entity is moved relative with a 'block' movement,
diff --git a/code/modules/shuttles/shuttle/shuttle_descriptor.dm b/code/modules/shuttles/shuttle/shuttle_descriptor.dm
new file mode 100644
index 000000000000..018199ec62da
--- /dev/null
+++ b/code/modules/shuttles/shuttle/shuttle_descriptor.dm
@@ -0,0 +1,35 @@
+//* This file is explicitly licensed under the MIT license. *//
+//* Copyright (c) 2024 Citadel Station Developers *//
+
+/**
+ * while /datum/shuttle_template describes the physical shuttle, this describes features
+ * like mass.
+ */
+/datum/shuttle_descriptor
+ //* Flight (overmaps / web)
+ /// mass in kilotons
+ // todo: in-game mass calculations? only really relevant for drone tbh
+ var/mass = 5
+ /// if set to false, this is absolute-ly unable to land on a planet
+ var/allow_atmospheric_landing = TRUE
+ /// preferred flight orientation
+ ///
+ /// * null = use orientation at takeoff
+ var/preferred_orientation
+
+ //* Jumps (ferry & moving to/from overmaps)
+ /// engine charging time when starting a move
+ // todo: should have support for being based on in game machinery (?)
+ var/jump_charging_time = 10 SECONDS
+ /// time spent in transit when performing a move
+ var/jump_move_time = 10 SECONDS
+
+/datum/shuttle_descriptor/clone(include_contents)
+ var/datum/shuttle_descriptor/clone = ..()
+
+ clone.mass = mass
+ clone.allow_atmospheric_landing = allow_atmospheric_landing
+ clone.preferred_orientation = preferred_orientation
+
+ clone.jump_charging_time = jump_charging_time
+ clone.jump_move_time = jump_move_time
diff --git a/code/modules/shuttles/shuttle/shuttle_template.dm b/code/modules/shuttles/shuttle/shuttle_template.dm
new file mode 100644
index 000000000000..cf074839604f
--- /dev/null
+++ b/code/modules/shuttles/shuttle/shuttle_template.dm
@@ -0,0 +1,138 @@
+//* This file is explicitly licensed under the MIT license. *//
+//* Copyright (c) 2024 Citadel Station Developers *//
+
+/**
+ * the shuttle templates in charge of holding definitions of shuttles.
+ *
+ * each can be instantiated multiple times unless otherwise stated.
+ */
+/datum/shuttle_template
+ abstract_type = /datum/shuttle_template
+
+ //* Basics
+ /// unique ID - use snake_case, must be unique & stable, including across rounds.
+ /// this means hardcoded ones shouldn't be changed willy-nilly.
+ var/id
+
+ //* Identity
+ /// Full name
+ var/name
+ /// Full description
+ var/desc
+ /// lore fluff
+ var/fluff
+
+ //* File
+ /// absolute path to file
+ var/absolute_path
+ /// relative path to file from current directory
+ var/relative_path
+
+ //* Functionality
+ /// our descriptor, used for cross-interaction with other systems
+ /// this should not be a cached typepath, as opposed to a directly made typepath
+ /// or an instance.
+ ///
+ /// * because we intentionally don't cache typepaths, anonymous typepaths are allowed **and encouraged**.
+ ///
+ /// typepaths will be initialized.
+ /// instances will be cloned.
+ var/datum/shuttle_descriptor/descriptor = /datum/shuttle_descriptor
+
+ //* .dmm
+ /// should we keep parsed map once first loaded?
+ var/cache_parsed_map = FALSE
+ /// our parsed map
+ var/datum/dmm_parsed/parsed_map
+ /// direction the shuttle is facing, in the map
+ /// please try to map shuttles in facing north.
+ var/facing_dir = NORTH
+
+/datum/shuttle_template/New(map_resource, use_dir)
+ if(map_resource)
+ absolute_path = map_resource
+ facing_dir = use_dir || NORTH
+ else
+ if(relative_path && !absolute_path)
+ var/our_file = __FILE__
+ var/our_directory = copytext_char(our_file, 1, findlasttext_char(our_file, "/"))
+ absolute_path = "[our_directory]/[relative_path]"
+
+ if(cache_parsed_map)
+ parsed_map = new(get_file())
+
+/datum/shuttle_template/proc/get_file()
+ return isfile(absolute_path)? absolute_path : file(absolute_path)
+
+/**
+ * Do not directly use. Use create_shuttle() on SSshuttles!
+ * This will not automatically register the shuttle with the subsystem.
+ */
+/datum/shuttle_template/proc/instance(list/datum/map_injection/map_injections)
+ RETURN_TYPE(/datum/shuttle)
+
+ var/datum/dmm_parsed/parsed_map = src.parsed_map
+ if(isnull(parsed_map))
+ parsed_map = new(get_file())
+ parsed_map
+ if(cache_parsed_map)
+ src.parsed_map = parsed_map
+
+ var/datum/shuttle/instance = new shuttle_type
+ var/width = parsed_map.width
+ var/height = parsed_map.height
+
+ // make reservation
+ var/datum/turf_reservation/reservation = SSmapping.request_block_reservation(
+ width + 2,
+ height + 2,
+ /datum/turf_reservation,
+ )
+
+ // create context
+ var/datum/dmm_context/context = create_dmm_context()
+ context.mangling_id = generate_mangling_id()
+ for(var/datum/map_injection/injection as anything in map_injections)
+ context.register_injection(injection)
+
+ // load into reservation
+ var/datum/dmm_context/loaded_context = parsed_map.load(
+ reservation.bottom_left_coords[1] + 1,
+ reservation.bottom_left_coords[2] + 1,
+ reservation.bottom_left_coords[3],
+ context = context,
+ )
+ var/list/loaded_bounds = loaded_context.loaded_bounds
+
+ // set descriptor
+ instance.descriptor = instance_descriptor()
+
+ // let shuttle do black magic first
+ // instance.before_bounds_init(reservation, src)
+
+ // init the bounds
+ SSatoms.init_map_bounds(loaded_bounds)
+
+ // let shuttle do post-init things
+ // instance.after_bounds_init(reservation, src)
+
+ // set vars on shuttle
+ instance.template_id = id
+
+ return instance
+
+/datum/shuttle_template/proc/instance_descriptor()
+ if(istype(descriptor))
+ return descriptor.clone()
+ else if(ispath(descriptor, /datum/shuttle_descriptor))
+ return new descriptor
+ CRASH("what? [descriptor] ([REF(descriptor)])")
+
+/datum/shuttle_template/proc/generate_mangling_id()
+ var/static/notch = 0
+ if(notch >= SHORT_REAL_LIMIT)
+ stack_trace("how the hell are we at this number?")
+ return "shuttle-[++notch]-[SSmapping.round_global_descriptor]"
+
+/datum/map_template/shuttle
+ abstract_type = /datum/map_template/shuttle
From 934536077ecaf3a07f3e1ab9ff80ef6e3f1bd42b Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 15 Sep 2024 17:31:18 -0400
Subject: [PATCH 02/20] reservation
---
code/__DEFINES/_flags/turf_flags.dm | 4 ++--
.../subsystem/mapping/reservations.dm | 2 +-
code/modules/mapping/turf_reservation.dm | 19 ++++++++++++++++---
3 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/code/__DEFINES/_flags/turf_flags.dm b/code/__DEFINES/_flags/turf_flags.dm
index 4ebcf6344bbd..41ea17828880 100644
--- a/code/__DEFINES/_flags/turf_flags.dm
+++ b/code/__DEFINES/_flags/turf_flags.dm
@@ -2,7 +2,7 @@
/// This is used in literally one place, turf.dm, to block ethwereal jaunt.
#define NO_JAUNT (1<<0)
/// Unused reservation turf
-#define UNUSED_RESERVATION_TURF (1<<2)
+#define TURF_FLAG_UNUSED_RESERVATION (1<<2)
/// queued for planet turf addition
#define TURF_PLANET_QUEUED (1<<3)
/// registered to a planet
@@ -28,7 +28,7 @@
DEFINE_BITFIELD(turf_flags, list(
BITFIELD(NO_JAUNT),
- BITFIELD(UNUSED_RESERVATION_TURF),
+ BITFIELD(TURF_FLAG_UNUSED_RESERVATION),
BITFIELD(TURF_PLANET_QUEUED),
BITFIELD(TURF_PLANET_REGISTERED),
BITFIELD(TURF_ZONE_REBUILD_QUEUED),
diff --git a/code/controllers/subsystem/mapping/reservations.dm b/code/controllers/subsystem/mapping/reservations.dm
index b9338097e3df..cd329e039ca7 100644
--- a/code/controllers/subsystem/mapping/reservations.dm
+++ b/code/controllers/subsystem/mapping/reservations.dm
@@ -99,7 +99,7 @@
/datum/controller/subsystem/mapping/proc/reserve_turfs(list/turf/turfs)
for(var/turf/T as anything in turfs)
T.empty(RESERVED_TURF_TYPE, RESERVED_TURF_TYPE)
- T.turf_flags |= UNUSED_RESERVATION_TURF
+ T.turf_flags |= TURF_FLAG_UNUSED_RESERVATION
CHECK_TICK
// todo: area.assimilate_turfs?
reservation_unallocated_area.contents.Add(turfs)
diff --git a/code/modules/mapping/turf_reservation.dm b/code/modules/mapping/turf_reservation.dm
index 5404480cfd07..d58ff598bd11 100644
--- a/code/modules/mapping/turf_reservation.dm
+++ b/code/modules/mapping/turf_reservation.dm
@@ -75,6 +75,19 @@
release()
return ..()
+/datum/turf_reservation/proc/get_approximately_center_turf()
+ return locate(
+ bottom_left_coords[1] + floor(top_right_coords[1] - bottom_left_coords[1]),
+ bottom_left_coords[2] + floor(top_right_coords[2] - bottom_left_coords[2]),
+ bottom_left_coords[3],
+ )
+
+/datum/turf_reservation/proc/is_atom_inside(atom/A)
+ A = get_turf(A)
+ return A.z == bottom_left_coords[3] && \
+ A.x >= bottom_left_coords[1] && A.x <= top_right_coords[1] && \
+ A.y >= bottom_left_coords[2] && A.y <= top_right_coords[2]
+
/datum/turf_reservation/proc/release()
if(border)
SSmapping.reserve_turfs(block(locate(
@@ -170,7 +183,7 @@
1 + (inner_y - 1) * TURF_CHUNK_RESOLUTION,
level_index,
)
- if(!(checking.turf_flags & UNUSED_RESERVATION_TURF))
+ if(!(checking.turf_flags & TURF_FLAG_UNUSED_RESERVATION))
passing = FALSE
break
if(!passing)
@@ -245,7 +258,7 @@
SSmapping.reservation_blocking_op = FALSE
return FALSE
for(var/turf/T as anything in final)
- T.turf_flags &= ~UNUSED_RESERVATION_TURF
+ T.turf_flags &= ~TURF_FLAG_UNUSED_RESERVATION
if(T.type != turf_type)
T.ChangeTurf(turf_type, turf_type)
@@ -262,7 +275,7 @@
// todo: take_turfs
src.border_area.contents.Add(final_border)
for(var/turf/T as anything in final_border)
- T.turf_flags &= ~UNUSED_RESERVATION_TURF
+ T.turf_flags &= ~TURF_FLAG_UNUSED_RESERVATION
// get just the first layer, but also init them at the same time
var/list/turf/final_immediate_border
// left
From 92c5fbab8ce9135d836e560eb78fde1ce439d892 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Sun, 15 Sep 2024 22:48:16 -0400
Subject: [PATCH 03/20] that
---
citadel.dme | 5 +-
code/game/objects/effects/misc.dm | 10 -
.../shuttles/effects/shuttle_landing.dm | 30 +++
.../shuttles/shuttle/shuttle_anchor.dm | 120 ++++++++++++
code/modules/shuttles/shuttle/shuttle_port.dm | 175 ++++++++++++++++++
.../shuttles/shuttle/shuttle_template.dm | 2 +
icons/effects/effects.dmi | Bin 444844 -> 446134 bytes
.../shuttles/effects/shuttle_landing.dmi | Bin 0 -> 405 bytes
8 files changed, 331 insertions(+), 11 deletions(-)
create mode 100644 code/modules/shuttles/effects/shuttle_landing.dm
create mode 100644 code/modules/shuttles/shuttle/shuttle_anchor.dm
create mode 100644 code/modules/shuttles/shuttle/shuttle_port.dm
create mode 100644 icons/modules/shuttles/effects/shuttle_landing.dmi
diff --git a/citadel.dme b/citadel.dme
index 04e69fd440b9..9ae3efd7add3 100644
--- a/citadel.dme
+++ b/citadel.dme
@@ -3498,10 +3498,10 @@
#include "code\modules\mob\logout.dm"
#include "code\modules\mob\mob-damage.dm"
#include "code\modules\mob\mob-defense.dm"
+#include "code\modules\mob\mob-iff.dm"
#include "code\modules\mob\mob-keybind-triggers.dm"
#include "code\modules\mob\mob.dm"
#include "code\modules\mob\mob_defines.dm"
-#include "code\modules\mob\mob-iff.dm"
#include "code\modules\mob\mob_helpers.dm"
#include "code\modules\mob\mob_transformation_simple.dm"
#include "code\modules\mob\mobility.dm"
@@ -4706,7 +4706,10 @@
#include "code\modules\shuttles\shuttles_vr.dm"
#include "code\modules\shuttles\shuttles_web.dm"
#include "code\modules\shuttles\web_datums.dm"
+#include "code\modules\shuttles\effects\shuttle_landing.dm"
+#include "code\modules\shuttles\shuttle\shuttle_anchor.dm"
#include "code\modules\shuttles\shuttle\shuttle_descriptor.dm"
+#include "code\modules\shuttles\shuttle\shuttle_port.dm"
#include "code\modules\shuttles\shuttle\shuttle_template.dm"
#include "code\modules\species\abilites.dm"
#include "code\modules\species\character_species.dm"
diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm
index d03e8a0d3c43..d5befd0dc5ad 100644
--- a/code/game/objects/effects/misc.dm
+++ b/code/game/objects/effects/misc.dm
@@ -38,16 +38,6 @@
. = ..()
animate(src, alpha = 0, time = time_to_die - 1)
-/obj/effect/temporary_effect/shuttle_landing
- name = "shuttle landing"
- desc = "You better move if you don't want to go splat!"
- icon_state = "shuttle_warning_still"
- time_to_die = 4.9 SECONDS
-
-/obj/effect/temporary_effect/shuttle_landing/Initialize(mapload)
- flick("shuttle_warning", src) // flick() forces the animation to always begin at the start.
- . = ..()
-
// The manifestation of Zeus's might. Or just a really unlucky day.
// This is purely a visual effect, this isn't the part of the code that hurts things.
/obj/effect/temporary_effect/lightning_strike
diff --git a/code/modules/shuttles/effects/shuttle_landing.dm b/code/modules/shuttles/effects/shuttle_landing.dm
new file mode 100644
index 000000000000..94469c5609d8
--- /dev/null
+++ b/code/modules/shuttles/effects/shuttle_landing.dm
@@ -0,0 +1,30 @@
+//* This file is explicitly licensed under the MIT license. *//
+//* Copyright (c) 2024 Citadel Station Developers *//
+
+// todo: maybe orchestrate this with lists and timers on shuttle_transit_cycle?
+/obj/effect/temporary_effect/shuttle_landing
+ name = "shuttle landing"
+ desc = "A massive entity is about to land here. You should not be here."
+ icon = 'icons/modules/shuttles/effects/shuttle_landing.dmi'
+ icon_state = "still"
+ time_to_die = 4.9 SECONDS
+
+/obj/effect/temporary_effect/shuttle_landing/Initialize(mapload, time_to_dock)
+ if(!isnull(time_to_dock))
+ time_to_die = time_to_dock
+ run_animation()
+ return ..()
+
+/obj/effect/temporary_effect/shuttle_landing/proc/run_animation()
+ var/half_time = time_to_die / 2
+
+ var/matrix/using_matrix = matrix()
+ using_matrix.Scale(0.1, 0.1)
+
+ transform = using_matrix
+ alpha = 75
+
+ using_matrix.Scale(10, 10)
+ animate(src, time = half_time, transform = using_matrix, alpha = 150)
+
+ animate(src, time = half_time, alpha = 255)
diff --git a/code/modules/shuttles/shuttle/shuttle_anchor.dm b/code/modules/shuttles/shuttle/shuttle_anchor.dm
new file mode 100644
index 000000000000..41df183334ce
--- /dev/null
+++ b/code/modules/shuttles/shuttle/shuttle_anchor.dm
@@ -0,0 +1,120 @@
+//* This file is explicitly licensed under the MIT license. *//
+//* Copyright (c) 2024 Citadel Station Developers *//
+
+/**
+ * the physical shuttle object
+ *
+ * for aligned docks, we align the direction and the tile to the shuttle dock.
+ *
+ * ## Bounds
+ *
+ * size_x, size_y describes our total bounding box size when facing NORTH.
+ * offset_x, offset_y describes where the anchor is when facing NORTH.
+ *
+ * The anchor is always aligned to the top left, with no offsets, in this way.
+ * When rotated it is where it would be when rotated counterclockwise to the new position.
+ *
+ * For a size_x, size_y of 6, 4:
+ *
+ * offset_x, offset_y = 0, dir NORTH
+ *
+ * ^00000
+ * 000000
+ * 000000
+ * 000000
+ *
+ * offset_x, offset_y = 0, dir SOUTH
+ *
+ * 000000
+ * 000000
+ * 000000
+ * 00000V
+ *
+ * offset_x, offset_y = 0, dir WEST
+ *
+ * 0000
+ * 0000
+ * 0000
+ * 0000
+ * 0000
+ * <000
+ *
+ * offset_x, offset_y = 3, -1, dir NORTH
+ *
+ * 000000
+ * 000^00
+ * 000000
+ * 000000
+ *
+ * offset_x, offset_y = 3, -1, dir SOUTH
+ *
+ * 000000
+ * 000000
+ * 00V000
+ * 000000
+ *
+ * offset_x, offset_y = 3, -1, dir WEST
+ *
+ * 0000
+ * 0000
+ * 0<00
+ * 0000
+ * 0000
+ * 0000
+ *
+ * Offsets can position the anchor outside. This works, albeit is a bad idea.
+ *
+ * ## Mappers
+ *
+ * * You don't need to put down anchors at all, they auto-generate.
+ * * If you place one anyways, it'll be respected. That said, the size will be auto-generated too.
+ *
+ * Do not mess with the variables; the init system will set them.
+ */
+/obj/shuttle_anchor
+ name = "Shuttle (uninitialized)"
+ desc = "Why do you see this?"
+ // by default this should be north.
+ dir = NORTH
+ icon = 'icons/modules/shuttles/shuttle_anchor.dmi'
+ icon_state = "main"
+ plane = DEBUG_PLANE
+ layer = DEBUG_LAYER_SHUTTLE_MARKERS
+ atom_flags = ATOM_ABSTRACT | ATOM_NONWORLD
+
+#ifndef CF_SHUTTLE_VISUALIZE_BOUNDING_BOXES
+ invisibility = INVISIBILITY_ABSTRACT
+#else
+ invisibility = INVISIBILITY_NONE
+#endif
+
+// This file is WIP, and is just here so mappers can start using them.
+
+//* Movement Hooks ; We don't allow normal movement. *//
+
+/obj/shuttle_anchor/forceMove()
+ CRASH("attempted to forcemove a shuttle anchor")
+
+/obj/shuttle_anchor/setDir(ndir)
+ if(!anchor_moving)
+ CRASH("attempted to setDir an anchor")
+ return ..()
+
+/obj/shuttle_anchor/abstract_move(atom/new_loc)
+ if(!anchor_moving)
+ CRASH("attempted to abstract_move a shuttle anchor")
+ return ..()
+
+//* Grid Hooks ; Shuttle manually moves us. *//
+
+/obj/shuttle_anchor/grid_move(grid_flags, turf/new_turf)
+ return
+
+/obj/shuttle_anchor/grid_after(grid_flags, rotation_angle, list/late_call_hooks)
+ return
+
+/obj/shuttle_anchor/grid_collect(grid_flags, turf/new_turf, loc_opinion)
+ return
+
+/obj/shuttle_anchor/grid_finished(grid_flags, rotation_angle)
+ return
diff --git a/code/modules/shuttles/shuttle/shuttle_port.dm b/code/modules/shuttles/shuttle/shuttle_port.dm
new file mode 100644
index 000000000000..2572ce0de592
--- /dev/null
+++ b/code/modules/shuttles/shuttle/shuttle_port.dm
@@ -0,0 +1,175 @@
+//* This file is explicitly licensed under the MIT license. *//
+//* Copyright (c) 2024 Citadel Station Developers *//
+
+/**
+ * shuttle-side docking port; put this on airlocks
+ */
+/obj/shuttle_port
+ /// port name - used in interfaces
+ name = "docking port"
+ /// port desc - used in interfaces
+ desc = "A port that allows the shuttle to align to a dock."
+ icon = 'icons/modules/shuttles/shuttle_anchor.dmi'
+ icon_state = "dock"
+ plane = DEBUG_PLANE
+ layer = DEBUG_LAYER_SHUTTLE_MARKERS
+ atom_flags = ATOM_ABSTRACT | ATOM_NONWORLD
+
+#ifndef CF_SHUTTLE_VISUALIZE_BOUNDING_BOXES
+ invisibility = INVISIBILITY_ABSTRACT
+#else
+ invisibility = INVISIBILITY_NONE
+#endif
+
+ /// dock width - this is how wide the airlock/otherwise opening is.
+ ///
+ /// the port is left-aligned to the width when looking north
+ /// so if it's width 3,
+ /// we have this:
+ /// ^XX
+ ///
+ /// if the port is rotated, we are left-aligned to the *direction of the port*, e.g.
+ /// east, =
+ /// >
+ /// x
+ /// x
+ var/port_width = 1
+ /// offset the port right in the width
+ ///
+ /// width 3, offset 2:
+ /// XX^
+ ///
+ /// this is needed because port alignment must always be
+ /// exact, so things like power lines and atmos lines can be connected.
+ var/port_offset = 0
+ /// how many tiles of 'safety' extends to both sides of the width
+ /// this means that an airtight seal can be formed as long as the dock accomodates the safety region,
+ /// even if it's too big for the width
+ var/port_margin = 1
+ /// port id - must be unique per shuttle instance
+ /// the maploader will handle ID scrambling
+ ///
+ /// * if this doesn't exist, stuff that need to hook it won't work.
+ /// * if this isn't set, we'll assign it a random one on init
+ var/port_id
+
+ /// is this the primary port?
+ /// if it is, this is what we align with for roundstart loading.
+ var/primary_port = FALSE
+
+// This file is WIP, and is just here so mappers can start using them.
+
+//* Movement Hooks ; We don't allow normal movement. *//
+
+/obj/shuttle_port/forceMove()
+ CRASH("attempted to forceMove a shuttle port")
+
+/obj/shuttle_port/setDir(ndir)
+ if(!port_moving)
+ CRASH("attempted to setDir a shuttle port")
+ return ..()
+
+/obj/shuttle_port/abstract_move(atom/new_loc)
+ if(!port_moving)
+ CRASH("attempted to abstract_move a shuttle port")
+ return ..()
+
+//* Grid Hooks ; Shuttle manually moves us. *//
+
+/obj/shuttle_port/grid_move(grid_flags, turf/new_turf)
+ return
+
+/obj/shuttle_port/grid_after(grid_flags, rotation_angle, list/late_call_hooks)
+ return
+
+/obj/shuttle_port/grid_collect(grid_flags, turf/new_turf, loc_opinion)
+ return
+
+/obj/shuttle_port/grid_finished(grid_flags, rotation_angle)
+ return
+
+#warn make sure the sprites are aligned so that it looks good from map editor (denotes center position & aims outwards)
+
+#define SHUTTLE_PORT_PATH(PATH) \
+/obj/shuttle_port/##PATH/primary { \
+ primary_port = TRUE; \
+ color = "#88ff88"; \
+} \
+/obj/shuttle_port/##PATH
+
+/obj/shuttle_port/north
+ dir = NORTH
+
+SHUTTLE_PORT_PATH(south)
+ dir = SOUTH
+
+SHUTTLE_PORT_PATH(east)
+ dir = EAST
+
+SHUTTLE_PORT_PATH(west)
+ dir = WEST
+
+SHUTTLE_PORT_PATH(two_wide)
+ abstract_type = /obj/shuttle_port/two_wide
+ icon = 'icons/modules/shuttles/shuttle_anchor_2x2.dmi'
+ icon_state = "dock"
+ port_width = 2
+
+SHUTTLE_PORT_PATH(two_wide/left_aligned)
+
+SHUTTLE_PORT_PATH(two_wide/left_aligned/north)
+ dir = NORTH
+
+SHUTTLE_PORT_PATH(two_wide/left_aligned/south)
+ dir = SOUTH
+ port_offset = 1
+
+SHUTTLE_PORT_PATH(two_wide/left_aligned/east)
+ dir = EAST
+ port_offset = 1
+
+SHUTTLE_PORT_PATH(two_wide/left_aligned/west)
+ dir = WEST
+
+SHUTTLE_PORT_PATH(two_wide/right_aligned)
+
+SHUTTLE_PORT_PATH(two_wide/right_aligned/north)
+ dir = NORTH
+ port_offset = 1
+ pixel_x = -32
+
+SHUTTLE_PORT_PATH(two_wide/right_aligned/south)
+ dir = SOUTH
+
+SHUTTLE_PORT_PATH(two_wide/right_aligned/east)
+ dir = EAST
+
+SHUTTLE_PORT_PATH(two_wide/right_aligned/west)
+ dir = WEST
+ port_offset = 1
+ pixel_y = -32
+
+SHUTTLE_PORT_PATH(three_wide)
+ icon = 'icons/modules/shuttles/shuttle_anchor_3x3.dmi'
+ icon_state = "dock"
+ port_width = 3
+
+SHUTTLE_PORT_PATH(three_wide/north)
+ dir = NORTH
+ port_offset = 1
+ pixel_x = -32
+
+SHUTTLE_PORT_PATH(three_wide/south)
+ dir = SOUTH
+ port_offset = 1
+ pixel_x = -32
+
+SHUTTLE_PORT_PATH(three_wide/east)
+ dir = EAST
+ port_offset = 1
+ pixel_y = -32
+
+SHUTTLE_PORT_PATH(three_wide/west)
+ dir = WEST
+ port_offset = 1
+ pixel_y = -32
diff --git a/code/modules/shuttles/shuttle/shuttle_template.dm b/code/modules/shuttles/shuttle/shuttle_template.dm
index cf074839604f..22b4bf30c507 100644
--- a/code/modules/shuttles/shuttle/shuttle_template.dm
+++ b/code/modules/shuttles/shuttle/shuttle_template.dm
@@ -124,6 +124,8 @@
/datum/shuttle_template/proc/instance_descriptor()
if(istype(descriptor))
return descriptor.clone()
+ else if(IS_ANONYMOUS_TYPEPATH(descriptor))
+ return new descriptor
else if(ispath(descriptor, /datum/shuttle_descriptor))
return new descriptor
CRASH("what? [descriptor] ([REF(descriptor)])")
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 0dca1a9633c3a563c785b28d666a54dc7cbb2686..6a7bac7c7333516350e26e1a2287edba8c394aec 100644
GIT binary patch
delta 100727
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
Tt4qL#~jc
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
tUHGYl^
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