diff --git a/code/game/machinery/doors/airlock_angled.dm b/code/game/machinery/doors/airlock_angled.dm index 4d3401b2514..ba39cf8bf20 100644 --- a/code/game/machinery/doors/airlock_angled.dm +++ b/code/game/machinery/doors/airlock_angled.dm @@ -3,6 +3,41 @@ #define FILL_GLASS 2 #define FILL_COLOR 3 +/** + * A fairly rough translation of Bay's airlock icon system into ours, with the + * icons being built at runtime to afford the luxury of not needing to pre-bake + * all the icons like we have in the past, but preventing the overlay thrashing that + * Bay's seem to encounter. All the heavy lifting is just done once at initialization. + * + * The input state names from the various Bay files are: + * preview: Only in base_icon for mapping + * closed: static, when closed + * open: static, when open + * closing: anim, from open to closed transition + * opening: anim, from closed to open transition + * deny: static/anim, when denying a mob access + * + * The output state names to our system are: + * door_closed: closed + * door_locked: closed+bolted lights + * door_deny: deny + * door_open: open + * door_opening: opening+allow lights + * door_closing: closing+allow lights + * o_door_opening: opening+panel + * o_door_closing: closing+panel + * door_opening_stat: opening + * door_closing_stat: closing + * + * These do not include the door icon and are overlays: + * panel_open: bare panel overlay + * welded: bare welded overlay + * sparks_damaged: sparks for partial damage overlay + * sparks_broken: sparks for full damage overlay + * sparks_open: sparks when door is open overlay + */ + + /obj/machinery/door/airlock/angled icon_state = "preview" dir = 2 @@ -10,27 +45,45 @@ var/fill_type = FILL_NONE var/static/list/angled_airlock_icon_cache = list() + /// Mandatory: The base door structure icon, very required. var/base_icon + /// Optional: Applied when fill_type is FILL_METAL var/metal_fill_icon + /// Optional: Applied when fill_type is FILL_GLASS var/glass_fill_icon + /// Optional: Applied when fill_type is FILL_COLOR var/color_fill_icon + /// Optional: Used if stripe_color is set to a color value var/stripe_icon + /// Optional: Used if stripe_color is set to a color value var/stripe_fill_icon + /// Optional: Used if door_color is set to a color value var/door_color_icon + /// Optional: Lights to flash when the door denies access var/lights_deny_icon + /// Optional: Lights to flash when the door is opening/closing var/lights_green_icon + /// Optional: Lights to display when the door is closed and locked var/lights_bolts_icon + /// Optional: Lights and/or sparks to display when the door is being emagged var/lights_emag_icon - var/panel_icon - var/welded_icon - var/spark_damaged_icon - var/spark_broken_icon + /// Optional: Icon that contains the panel overlays for the door being worked on + var/panel_icon = 'icons/obj/doors/angled/station/panel.dmi' // bay seems to think these are 'close enough' for default use + /// Optional: Icon that contains the welded overlay + var/welded_icon = 'icons/obj/doors/angled/station/welded.dmi' + /// Optional: Icon that contains the spark animations for the door being partially destroyed + var/spark_damaged_icon = 'icons/obj/doors/angled/station/sparks_damaged.dmi' + /// Optional: Icon that contains the spark animations for the door being fully destroyed + var/spark_broken_icon = 'icons/obj/doors/angled/station/sparks_broken.dmi' + /// Optional: If fill_value is not FILL_NONE, this color will be applied to the fill of the door var/fill_color + /// Optional: If stripe_icon is not null, this color will be applied to the stripe on the door var/stripe_color + /// Optional: If door_color_icon is not null, this color will be applied to the door color overlay var/door_color /obj/machinery/door/airlock/angled/Initialize() @@ -62,7 +115,7 @@ update_icon() return // hooray - // Base layer - the bare metal + // Base layer - the bare metal - absolutely required sprites var/icon/door_closed = icon(base_icon, "closed") var/icon/door_open = icon(base_icon, "open") var/icon/door_locked = icon(base_icon, "closed") @@ -70,17 +123,42 @@ var/icon/door_spark = icon(base_icon, "closed") var/icon/door_opening = icon(base_icon, "opening") var/icon/door_closing = icon(base_icon, "closing") - var/icon/o_door_opening = icon(base_icon, "opening") - var/icon/o_door_closing = icon(base_icon, "closing") var/icon/door_opening_stat = icon(base_icon, "opening") var/icon/door_closing_stat = icon(base_icon, "closing") + var/icon/o_door_opening = icon(base_icon, "opening") + var/icon/o_door_closing = icon(base_icon, "closing") - var/icon/panel_open = icon(panel_icon, "closed") - var/icon/welded = icon(welded_icon, "closed") + // Optional icons + var/icon/panel_open + var/icon/welded_closed + var/icon/welded_open + var/icon/sparks_damaged + var/icon/sparks_open + var/icon/sparks_broken - var/icon/sparks_damaged = icon(spark_damaged_icon, "closed") - var/icon/sparks_open = icon(spark_damaged_icon, "open") - var/icon/sparks_broken = icon(spark_broken_icon, "closed") + if(panel_icon) + panel_open = icon(panel_icon, "closed") + else + panel_open = icon('icons/effects/effects.dmi', "nothing") + + if(welded_icon) + welded_closed = icon(welded_icon, "closed") + welded_open = icon(welded_icon, "open") // only used on firedoors far as I can tell + else + welded_closed = icon('icons/effects/effects.dmi', "nothing") + welded_open = icon('icons/effects/effects.dmi', "nothing") + + if(spark_damaged_icon) + sparks_damaged = icon(spark_damaged_icon, "closed") + sparks_open = icon(spark_damaged_icon, "open") + else + sparks_damaged = icon('icons/effects/effects.dmi', "nothing") + sparks_open = icon('icons/effects/effects.dmi', "nothing") + + if(spark_broken_icon) + sparks_broken = icon(spark_broken_icon, "closed") + else + sparks_broken = icon('icons/effects/effects.dmi', "nothing") // The filler for the gaps in the door, metal or glass or other if(fill_icon) @@ -168,6 +246,9 @@ o_door_closing.Blend(icon(panel_icon, "closing"), ICON_OVERLAY) var/icon/final = icon('icons/effects/effects.dmi', "nothing") + if(width > 1) + var/pixel_width = world.icon_size * width + final.Crop(1,1,pixel_width,pixel_width) final.Insert(door_closed, "door_closed") final.Insert(door_open, "door_open") final.Insert(door_locked, "door_locked") @@ -180,21 +261,29 @@ final.Insert(door_opening_stat, "door_opening_stat") final.Insert(door_closing_stat, "door_closing_stat") final.Insert(panel_open, "panel_open") - final.Insert(welded, "welded") + final.Insert(welded_closed, "welded") + final.Insert(welded_open, "welded_open") final.Insert(sparks_damaged, "sparks_damaged") final.Insert(sparks_broken, "sparks_broken") final.Insert(sparks_open, "sparks_open") - + angled_airlock_icon_cache[cache_key] = final icon = final update_icon() -/obj/machinery/door/airlock/angled/standard/proc/gimme_icon() +/obj/machinery/door/airlock/angled/proc/gimme_icon() usr << ftp(icon, "[name].dmi") +/** + * The actual door types you can map in. + * Comments show what you can customize. + */ + +// Fills: Metal, glass, color +// Supports stripe color +// Supports door color /obj/machinery/door/airlock/angled/standard icon = 'icons/obj/doors/angled/station/door.dmi' - icon_state = "preview" fill_type = FILL_METAL base_icon = 'icons/obj/doors/angled/station/door.dmi' @@ -210,77 +299,166 @@ lights_emag_icon = 'icons/obj/doors/angled/station/emag.dmi' panel_icon = 'icons/obj/doors/angled/station/panel.dmi' welded_icon = 'icons/obj/doors/angled/station/welded.dmi' - spark_damaged_icon = 'icons/obj/doors/angled/station/sparks_damaged.dmi' - spark_broken_icon = 'icons/obj/doors/angled/station/sparks_broken.dmi' - -/obj/machinery/door/airlock/angled/standard/demo_fill_color +/obj/machinery/door/airlock/angled/standard/glass + icon_state = "preview_glass" + fill_type = FILL_GLASS +/obj/machinery/door/airlock/angled/standard/color + icon_state = "preview_color" fill_type = FILL_COLOR - fill_color = "#FF0000" -/obj/machinery/door/airlock/angled/standard/demo_stripe - stripe_color = "#FF0000" +// Fills: Metal +// Supports stripe color +/obj/machinery/door/airlock/angled/hatch + icon = 'icons/obj/doors/angled/hatch/door.dmi' + fill_type = FILL_METAL -/obj/machinery/door/airlock/angled/standard/demo_door_color - door_color = "#FF0000" + base_icon = 'icons/obj/doors/angled/hatch/door.dmi' + metal_fill_icon = 'icons/obj/doors/angled/hatch/fill_steel.dmi' + stripe_fill_icon = 'icons/obj/doors/angled/hatch/fill_stripe.dmi' + stripe_icon = 'icons/obj/doors/angled/hatch/stripe.dmi' + lights_deny_icon = 'icons/obj/doors/angled/hatch/lights_deny.dmi' + lights_green_icon = 'icons/obj/doors/angled/hatch/lights_green.dmi' + lights_bolts_icon = 'icons/obj/doors/angled/hatch/lights_bolts.dmi' + lights_emag_icon = 'icons/obj/doors/angled/hatch/emag.dmi' + panel_icon = 'icons/obj/doors/angled/hatch/panel.dmi' + welded_icon = 'icons/obj/doors/angled/hatch/welded.dmi' -/* -door_closed - static - base - metal or glass - stripe - door color +// Fills: None +/obj/machinery/door/airlock/angled/ascent + icon = 'icons/obj/doors/angled/ascent/door.dmi' -door_locked - static - as door_closed, plus lights_bolts_icon + base_icon = 'icons/obj/doors/angled/ascent/door.dmi' + lights_deny_icon = 'icons/obj/doors/angled/ascent/lights_deny.dmi' + lights_green_icon = 'icons/obj/doors/angled/ascent/lights_green.dmi' + lights_bolts_icon = 'icons/obj/doors/angled/ascent/lights_bolts.dmi' + lights_emag_icon = 'icons/obj/doors/angled/ascent/emag.dmi' + panel_icon = 'icons/obj/doors/angled/ascent/panel.dmi' + welded_icon = 'icons/obj/doors/angled/ascent/welded.dmi' + spark_damaged_icon = 'icons/obj/doors/angled/ascent/sparks_damaged.dmi' + spark_broken_icon = 'icons/obj/doors/angled/ascent/sparks_broken.dmi' -door_opening - animated - as door_closed, but opening states - lights_green opening +// Fills: Metal, glass, color +// Supports door color +/obj/machinery/door/airlock/angled/external + icon = 'icons/obj/doors/angled/external/door.dmi' + fill_type = FILL_METAL -door_deny - animated - as door_closed, plus lights_deny_icon + base_icon = 'icons/obj/doors/angled/external/door.dmi' + metal_fill_icon = 'icons/obj/doors/angled/external/fill_steel.dmi' + glass_fill_icon = 'icons/obj/doors/angled/external/fill_glass.dmi' + color_fill_icon = 'icons/obj/doors/angled/external/fill_color.dmi' + door_color_icon = 'icons/obj/doors/angled/external/color.dmi' + lights_deny_icon = 'icons/obj/doors/angled/external/lights_deny.dmi' + lights_green_icon = 'icons/obj/doors/angled/external/lights_green.dmi' + lights_bolts_icon = 'icons/obj/doors/angled/external/lights_bolts.dmi' + lights_emag_icon = 'icons/obj/doors/angled/external/emag.dmi' +/obj/machinery/door/airlock/angled/external/glass + icon_state = "preview_glass" + fill_type = FILL_GLASS +/obj/machinery/door/airlock/angled/external/color + icon_state = "preview_color" + fill_type = FILL_COLOR -door_closing - animated - as door_open, but closing states - lights_green closing +// Fills: Metal, glass +/obj/machinery/door/airlock/angled/elevator + icon = 'icons/obj/doors/angled/elevator/door.dmi' + fill_type = FILL_METAL -door_open - static - as door_closed, but open states + base_icon = 'icons/obj/doors/angled/elevator/door.dmi' + metal_fill_icon = 'icons/obj/doors/angled/elevator/fill_steel.dmi' + glass_fill_icon = 'icons/obj/doors/angled/elevator/fill_glass.dmi' + lights_deny_icon = 'icons/obj/doors/angled/elevator/lights_deny.dmi' + lights_green_icon = 'icons/obj/doors/angled/elevator/lights_green.dmi' + lights_bolts_icon = 'icons/obj/doors/angled/elevator/lights_bolts.dmi' + welded_icon = 'icons/obj/doors/angled/elevator/welded.dmi' +/obj/machinery/door/airlock/angled/elevator/glass + icon_state = "preview_glass" + fill_type = FILL_GLASS -door_spark - animated - as door_closed - spark_icon closed -o_door_opening - as door_opening - panel_icon opening +// Very few options on these, basically just static doors. +/obj/machinery/door/airlock/angled/hazard // firedoors + icon = 'icons/obj/doors/angled/hazard/door.dmi' -o_door_closing - as door_closing - panel_icon closing + base_icon = 'icons/obj/doors/angled/hazard/door.dmi' + panel_icon = 'icons/obj/doors/angled/hazard/panel.dmi' + welded_icon = 'icons/obj/doors/angled/hazard/welded.dmi' -door_opening_stat - as door_closed, but opening states without lights +/obj/machinery/door/airlock/angled/vault + icon = 'icons/obj/doors/angled/vault/door.dmi' + fill_type = FILL_METAL // the only option -door_closing_stat - as door_open, but closing states without lights + base_icon = 'icons/obj/doors/angled/vault/door.dmi' + metal_fill_icon = 'icons/obj/doors/angled/vault/fill_steel.dmi' -panel_open - just the panel +/obj/machinery/door/airlock/angled/secure + icon = 'icons/obj/doors/angled/secure/door.dmi' + fill_type = FILL_METAL // the only option -welded - just welded + base_icon = 'icons/obj/doors/angled/secure/door.dmi' + metal_fill_icon = 'icons/obj/doors/angled/secure/fill_steel.dmi' -sparks_damaged - spark_icon closed +/obj/machinery/door/airlock/angled/centcomm + icon = 'icons/obj/doors/angled/centcomm/door.dmi' + fill_type = FILL_METAL // the only option -sparks_broken - spark_icon closed + base_icon = 'icons/obj/doors/angled/centcomm/door.dmi' + metal_fill_icon = 'icons/obj/doors/angled/centcomm/fill_steel.dmi' -sparks_open - spark_icon open -*/ +// Double door requires a little code +// Fills: Metal, glass, color +// Supports stripe color +// Supports door color +/obj/machinery/door/airlock/angled/double + width = 2 + appearance_flags = 0 + icon = 'icons/obj/doors/angled/double/door.dmi' + fill_type = FILL_METAL -#undef FILL_METAL -#undef FILL_GLASS -#undef FILL_COLOR \ No newline at end of file + base_icon = 'icons/obj/doors/angled/double/door.dmi' + metal_fill_icon = 'icons/obj/doors/angled/double/fill_steel.dmi' + glass_fill_icon = 'icons/obj/doors/angled/double/fill_glass.dmi' + color_fill_icon = 'icons/obj/doors/angled/double/fill_color.dmi' + stripe_fill_icon = 'icons/obj/doors/angled/double/fill_stripe.dmi' + stripe_icon = 'icons/obj/doors/angled/double/stripe.dmi' + door_color_icon = 'icons/obj/doors/angled/double/color.dmi' + lights_deny_icon = 'icons/obj/doors/angled/double/lights_deny.dmi' + lights_green_icon = 'icons/obj/doors/angled/double/lights_green.dmi' + lights_bolts_icon = 'icons/obj/doors/angled/double/lights_bolts.dmi' + lights_emag_icon = 'icons/obj/doors/angled/double/emag.dmi' + panel_icon = 'icons/obj/doors/angled/double/panel.dmi' + welded_icon = 'icons/obj/doors/angled/double/welded.dmi' + spark_damaged_icon = 'icons/obj/doors/angled/double/sparks_damaged.dmi' + spark_broken_icon = 'icons/obj/doors/angled/double/sparks_broken.dmi' +/obj/machinery/door/airlock/angled/double/glass + icon_state = "preview_glass" + fill_type = FILL_GLASS +/obj/machinery/door/airlock/angled/double/color + icon_state = "preview_color" + fill_type = FILL_COLOR + +/obj/machinery/door/airlock/angled/double/Initialize(mapload) + . = ..() + SetBounds() + apply_opacity_to_my_turfs(opacity) + +/obj/machinery/door/airlock/angled/double/set_opacity() + . = ..() + apply_opacity_to_my_turfs(opacity) + +/obj/machinery/door/airlock/angled/double/Moved() + . = ..() + SetBounds() + +/obj/machinery/door/airlock/angled/double/proc/apply_opacity_to_my_turfs(new_opacity) + for(var/turf/T in locs) + T.set_opacity(new_opacity) + update_nearby_tiles() + +/obj/machinery/door/airlock/angled/double/proc/SetBounds() + if(dir & 3) + bound_width = width * world.icon_size + bound_height = world.icon_size + else + bound_width = world.icon_size + bound_height = width * world.icon_size diff --git a/icons/obj/doors/angled/ascent/base.dmi b/icons/obj/doors/angled/ascent/door.dmi similarity index 100% rename from icons/obj/doors/angled/ascent/base.dmi rename to icons/obj/doors/angled/ascent/door.dmi diff --git a/icons/obj/doors/angled/centcomm/door.dmi b/icons/obj/doors/angled/centcomm/door.dmi index 49f386ff380..9926e4c11f6 100644 Binary files a/icons/obj/doors/angled/centcomm/door.dmi and b/icons/obj/doors/angled/centcomm/door.dmi differ diff --git a/icons/obj/doors/angled/double/door.dmi b/icons/obj/doors/angled/double/door.dmi index 7aec3b074f5..14ba715f8ae 100644 Binary files a/icons/obj/doors/angled/double/door.dmi and b/icons/obj/doors/angled/double/door.dmi differ diff --git a/icons/obj/doors/angled/double/sparks_broken.dmi b/icons/obj/doors/angled/double/sparks_broken.dmi new file mode 100644 index 00000000000..20d5bd6ba24 Binary files /dev/null and b/icons/obj/doors/angled/double/sparks_broken.dmi differ diff --git a/icons/obj/doors/angled/double/sparks_damaged.dmi b/icons/obj/doors/angled/double/sparks_damaged.dmi new file mode 100644 index 00000000000..dd49c4f65c4 Binary files /dev/null and b/icons/obj/doors/angled/double/sparks_damaged.dmi differ diff --git a/icons/obj/doors/angled/elevator/door.dmi b/icons/obj/doors/angled/elevator/door.dmi index 3cfbc002d33..f2b0f1a32b5 100644 Binary files a/icons/obj/doors/angled/elevator/door.dmi and b/icons/obj/doors/angled/elevator/door.dmi differ diff --git a/icons/obj/doors/angled/external/door.dmi b/icons/obj/doors/angled/external/door.dmi index 2b861d13db8..086f2e944fb 100644 Binary files a/icons/obj/doors/angled/external/door.dmi and b/icons/obj/doors/angled/external/door.dmi differ diff --git a/icons/obj/doors/angled/hatch/door.dmi b/icons/obj/doors/angled/hatch/door.dmi index 8e354cf3954..12097241d6e 100644 Binary files a/icons/obj/doors/angled/hatch/door.dmi and b/icons/obj/doors/angled/hatch/door.dmi differ diff --git a/icons/obj/doors/angled/hazard/door.dmi b/icons/obj/doors/angled/hazard/door.dmi index e245c08d1e5..8f8a89d5b10 100644 Binary files a/icons/obj/doors/angled/hazard/door.dmi and b/icons/obj/doors/angled/hazard/door.dmi differ diff --git a/icons/obj/doors/angled/secure/door.dmi b/icons/obj/doors/angled/secure/door.dmi index 0f8ca68dd2d..6031fc3c30f 100644 Binary files a/icons/obj/doors/angled/secure/door.dmi and b/icons/obj/doors/angled/secure/door.dmi differ diff --git a/icons/obj/doors/angled/station/door.dmi b/icons/obj/doors/angled/station/door.dmi index 748b16f67e2..356a3fff4c5 100644 Binary files a/icons/obj/doors/angled/station/door.dmi and b/icons/obj/doors/angled/station/door.dmi differ diff --git a/icons/obj/doors/angled/vault/door.dmi b/icons/obj/doors/angled/vault/door.dmi index ee9e2803656..8111aeff9f8 100644 Binary files a/icons/obj/doors/angled/vault/door.dmi and b/icons/obj/doors/angled/vault/door.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 0e6b2ebdcb0..7375505e726 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -927,6 +927,7 @@ #include "code\game\machinery\computer\timeclock_vr.dm" #include "code\game\machinery\computer\~computer_vr.dm" #include "code\game\machinery\doors\airlock.dm" +#include "code\game\machinery\doors\airlock_angled.dm" #include "code\game\machinery\doors\airlock_control.dm" #include "code\game\machinery\doors\airlock_electronics.dm" #include "code\game\machinery\doors\airlock_vr.dm"