[READY] Adds alpha masking helper, which cryo now uses (#44281)

Fixes #40922
Changelog

cl
fix: Icons will no longer extend past cryo.
imagedel: Xenos and monkeys no longer have snowflake icons for cryo.
/cl
This commit is contained in:
nicbn
2019-06-21 19:47:41 -03:00
committed by oranges
parent b7264de8d9
commit 8672a8010b
5 changed files with 62 additions and 35 deletions

View File

@@ -1200,3 +1200,32 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
var/icon/I = getFlatIcon(thing) var/icon/I = getFlatIcon(thing)
return icon2html(I, target) return icon2html(I, target)
//If you are using icons, consider using /icon/UseAlphaMask instead
/proc/apply_alpha_mask(image/target, image/mask)
var/target_old_color = target.color
var/target_old_blend_mode = target.blend_mode
var/target_old_appearance_flags = target.appearance_flags
var/mask_old_color = mask.color
var/mask_old_appearance_flags = mask.appearance_flags
target.color = list(0,0,0,0, 0,0,0,0, 0,0,0,0, 1,0,0,0, 0,0,0,1)
target.blend_mode = BLEND_MULTIPLY
target.appearance_flags |= KEEP_TOGETHER
mask.color = list(0,0,0,1, 0,0,0,0, 0,0,0,0, 0,0,0,0, 1,1,1,0)
mask.appearance_flags |= KEEP_TOGETHER
var/image/together = new()
together.appearance_flags |= KEEP_TOGETHER
mask.add_overlay(target)
target.color = target_old_color
together.overlays = list(mask, target)
target.blend_mode = target_old_blend_mode
target.appearance_flags = target_old_appearance_flags
mask.color = mask_old_color
mask.appearance_flags = mask_old_appearance_flags
mask.cut_overlay(target)
return together

View File

@@ -1,5 +1,3 @@
#define CRYOMOBS 'icons/obj/cryo_mobs.dmi'
/obj/machinery/atmospherics/components/unary/cryo_cell /obj/machinery/atmospherics/components/unary/cryo_cell
name = "cryo cell" name = "cryo cell"
icon = 'icons/obj/cryogenics.dmi' icon = 'icons/obj/cryogenics.dmi'
@@ -37,11 +35,19 @@
fair_market_price = 10 fair_market_price = 10
payment_department = ACCOUNT_MED payment_department = ACCOUNT_MED
// for alpha masking
var/image/alpha_overlay
var/image/alpha_overlay_32x32
var/overlay_pixel_y = 0
/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize() /obj/machinery/atmospherics/components/unary/cryo_cell/Initialize()
. = ..() . = ..()
initialize_directions = dir initialize_directions = dir
alpha_overlay = image('icons/obj/cryogenics.dmi', "pod-alpha")
alpha_overlay_32x32 = image('icons/obj/cryogenics32x32.dmi', "pod-alpha")
radio = new(src) radio = new(src)
radio.keyslot = new radio_key radio.keyslot = new radio_key
radio.subspace_transmission = TRUE radio.subspace_transmission = TRUE
@@ -106,37 +112,21 @@
return return
if(occupant) if(occupant)
var/image/occupant_overlay var/image/occupant_overlay = image(occupant.icon, occupant.icon_state, dir = SOUTH)
occupant_overlay.appearance_flags |= KEEP_TOGETHER
if(ismonkey(occupant)) // Monkey
occupant_overlay = image(CRYOMOBS, "monkey")
else if(isalienadult(occupant))
if(isalienroyal(occupant)) // Queen and prae
occupant_overlay = image(CRYOMOBS, "alienq")
else if(isalienhunter(occupant)) // Hunter
occupant_overlay = image(CRYOMOBS, "alienh")
else if(isaliensentinel(occupant)) // Sentinel
occupant_overlay = image(CRYOMOBS, "aliens")
else // Drone or other
occupant_overlay = image(CRYOMOBS, "aliend")
else if(ishuman(occupant) || islarva(occupant) || (isanimal(occupant) && !ismegafauna(occupant))) // Mobs that are smaller than cryotube
occupant_overlay = image(occupant.icon, occupant.icon_state)
occupant_overlay.copy_overlays(occupant) occupant_overlay.copy_overlays(occupant)
occupant_overlay.pixel_x = occupant.pixel_x
overlay_pixel_y = 0
else var/is_32x32 = icon(occupant.icon, occupant.icon_state).Height() < 64 // anything less than 64 should get the 32 overlay
occupant_overlay = image(CRYOMOBS, "generic")
occupant_overlay.dir = SOUTH
occupant_overlay.pixel_y = 22
if(on && !running_anim && is_operational()) if(on && !running_anim && is_operational())
icon_state = "pod-on" icon_state = "pod-on"
running_anim = TRUE running_anim = TRUE
run_anim(TRUE, occupant_overlay) run_anim(is_32x32, occupant_overlay)
else else
icon_state = "pod-off" icon_state = "pod-off"
add_overlay(occupant_overlay) add_masked_overlay(is_32x32, occupant_overlay)
add_overlay("cover-off") add_overlay("cover-off")
else if(on && is_operational()) else if(on && is_operational())
@@ -146,20 +136,30 @@
icon_state = "pod-off" icon_state = "pod-off"
add_overlay("cover-off") add_overlay("cover-off")
/obj/machinery/atmospherics/components/unary/cryo_cell/proc/run_anim(anim_up, image/occupant_overlay) /obj/machinery/atmospherics/components/unary/cryo_cell/proc/run_anim(is32x32, image/occupant_overlay, anim_up = TRUE)
if(!on || !occupant || !is_operational()) if(!on || !occupant || !is_operational())
running_anim = FALSE running_anim = FALSE
return return
cut_overlays() cut_overlays()
if(occupant_overlay.pixel_y != 23) // Same effect as occupant_overlay.pixel_y == 22 || occupant_overlay.pixel_y == 24 if(overlay_pixel_y != 1) // Same effect as overlay_pixel_y == 0 || occupant_overlay.pixel_y == 2
anim_up = occupant_overlay.pixel_y == 22 // Same effect as if(occupant_overlay.pixel_y == 22) anim_up = TRUE ; if(occupant_overlay.pixel_y == 24) anim_up = FALSE anim_up = overlay_pixel_y == 0 // Same effect as if(overlay_pixel_y == 0) anim_up = TRUE ; if(overlay_pixel_y == 2) anim_up = FALSE
if(anim_up) if(anim_up)
occupant_overlay.pixel_y++ overlay_pixel_y++
else else
occupant_overlay.pixel_y-- overlay_pixel_y--
add_overlay(occupant_overlay) add_masked_overlay(is32x32, occupant_overlay)
add_overlay("cover-on") add_overlay("cover-on")
addtimer(CALLBACK(src, .proc/run_anim, anim_up, occupant_overlay), 7, TIMER_UNIQUE) addtimer(CALLBACK(src, .proc/run_anim, is32x32, occupant_overlay, anim_up), 7, TIMER_UNIQUE)
/obj/machinery/atmospherics/components/unary/cryo_cell/proc/add_masked_overlay(is32x32, image/overlay) // overlay blend mode needs to be multiply
var/image/masked
if(is32x32)
masked = apply_alpha_mask(overlay, alpha_overlay_32x32)
masked.pixel_y = 22 + overlay_pixel_y
else
overlay.pixel_y = overlay_pixel_y
masked = apply_alpha_mask(overlay, alpha_overlay)
add_overlay(masked)
/obj/machinery/atmospherics/components/unary/cryo_cell/nap_violation(mob/violator) /obj/machinery/atmospherics/components/unary/cryo_cell/nap_violation(mob/violator)
open_machine() open_machine()
@@ -450,5 +450,3 @@
node.atmosinit() node.atmosinit()
node.addMember(src) node.addMember(src)
build_network() build_network()
#undef CRYOMOBS

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B