diff --git a/code/controllers/subsystems/vis_overlays.dm b/code/controllers/subsystems/vis_overlays.dm index 8abc02f928a..82a652f00c3 100644 --- a/code/controllers/subsystems/vis_overlays.dm +++ b/code/controllers/subsystems/vis_overlays.dm @@ -77,7 +77,7 @@ SUBSYSTEM_DEF(vis_overlays) if(!length(thing.managed_vis_overlays)) thing.managed_vis_overlays = null -/atom/proc/add_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags, add_vis_flags, unique) +/atom/proc/add_vis_overlay(icon, iconstate, layer, plane, dir, alpha, add_appearance_flags, add_vis_flags = VIS_INHERIT_ID, unique) // The extremely minimal version where you just pass a string and nothing else if(istext(icon)) iconstate = icon diff --git a/code/game/objects/structures/decorative.dm b/code/game/objects/structures/decorative.dm new file mode 100644 index 00000000000..1f18eeeb40f --- /dev/null +++ b/code/game/objects/structures/decorative.dm @@ -0,0 +1,529 @@ +/** + * These are generally sprites ported from other servers, which don't have any unique code. + * They can be used by mappers for decorating their maps. They're mostly here so people who aren't + * rummaging around in the sprites can be aware of some neat sprites they can use. + * + * Obviously you can swipe the sprites for real structures and add code, but please don't add any code + * (beyond decorative things like maybe light) directly to these types or this file! + * Take the icon and state and make your own type under /obj/structure. + * + * Some of these do have a SMIDGE of code to allow a mapper to twirl them through states/animations without + * much effort, but beyond 'visuals logic', I'd rather keep all the logic out of here. + */ + +/obj/structure/decor + name = "mysterious structure" + desc = "A mysterious structure!" + anchored = TRUE + density = TRUE + icon = 'icons/obj/structures/decor.dmi' + var/state + +/obj/structure/decor/proc/change_state(state) + SHOULD_CALL_PARENT(TRUE) + src.state = state + return + +/obj/structure/decor/vv_edit_var(var_name, var_value) + if(var_name == "state") + change_state(var_value) + +// bluespace beacon from Eris +/obj/structure/decor/bsb_off + icon_state = "bsb_off" +/obj/structure/decor/bsb_on + icon_state = "bsb_on" + +// bluespace crystal from Eris +/obj/structure/decor/bsc + icon_state = "bsc" +/obj/structure/decor/bsc_dust + icon_state = "bsc_dust" + +// same as state names, from faction items on Eris +/obj/structure/decor/biosyphon + icon_state = "biosyphon" +/obj/structure/decor/von_krabin + icon_state = "von_krabin" +/obj/structure/decor/last_shelter + icon_state = "last_shelter" +/obj/structure/decor/complicator + icon_state = "complicator" +/obj/structure/decor/random_radio + icon_state = "random_radio" +/obj/structure/decor/nt_pedestal0_old + icon_state = "nt_pedestal0_old" +/obj/structure/decor/nt_pedestal1_old + icon_state = "nt_pedestal1_old" + +// statues from Eris +/obj/structure/decor/statue1 + icon_state = "artwork_statue_1" +/obj/structure/decor/statue2 + icon_state = "artwork_statue_2" +/obj/structure/decor/statue3 + icon_state = "artwork_statue_3" +/obj/structure/decor/statue4 + icon_state = "artwork_statue_4" +/obj/structure/decor/statue5 + icon_state = "artwork_statue_5" +/obj/structure/decor/statue6 + icon_state = "artwork_statue_6" + +// ship mast from TGMC +/obj/structure/decor/stump_plaque + icon_state = "stump" + +// vatgrowing thing from /tg/ +/obj/structure/decor/green_egg + icon_state = "gel_cocoon" + +// eye of the protector from Eris +/obj/structure/decor/eotp + icon = 'icons/obj/structures/decor32x64.dmi' + icon_state = "eotp" + +// dna vault from /tg/ +/obj/structure/decor/dna_vault + icon = 'icons/obj/structures/decor96x96.dmi' + icon_state = "vault" + +// fences from TGMC +// You'll need to 'create instances from icon_states' in an editor to use these well +/obj/structure/decor/fence + name = "fence" + desc = "It's a fence! Not much else to say about it." + icon = 'icons/obj/structures/decor_fences.dmi' + +/** + * + * tl;dr "You can varedit 'state' on these to the things in the comments below to get cool animations" + * + * These items have some logic to handle some fun animations on them. Mappers can call the 'change_state(state)' proc + * while referring to the comments here for what states they can use. You'll notice some crazy overlay handling, + * and that's because I don't want to add any vars to these mappers think they can fiddle with, which requires + * more logic than I'm willing to do at the moment. So we get crazy cut/add operations instead. + * + * There's also a VV helper so if you varedit 'state' to these during the game, you can get that to work. + * + * Like, I don't want to add a state machine to decorative objects. You can if you want. + * + */ + +/** + * Possible 'state' options for change_state(state) are: + * off: Looks boring and off + * on: candles lit and stuff + * no_cruciform: No cruciform (the little triangle thing) inserted + * red_cruciform: Red light cruciform inserted + * green_cruciform: Green light cruciform inserted + * panel_open: The panel is open (wiring) + * panel_closed: The panel is closed + */ +// neotheology cruciform reader from Eris +/obj/structure/decor/nt_reader + icon_state = "nt_reader_off" + +/obj/structure/decor/nt_reader/change_state(state) + . = ..() + switch(state) + if("off") + icon_state = "nt_reader_off" + if("on") + icon_state = "nt_reader_on" + if("no_cruciform") + cut_overlay("nt_reader_c_green") + cut_overlay("nt_reader_c_red") + if("red_cruciform") + cut_overlay("nt_reader_c_green") + cut_overlay("nt_reader_c_red") + add_overlay("nt_reader_c_red") + if("green_cruciform") + cut_overlay("nt_reader_c_red") + cut_overlay("nt_reader_c_green") + add_overlay("nt_reader_c_green") + if("panel_open") + cut_overlay("nt_reader_panel") + add_overlay("nt_reader_panel") + if("panel_closed") + cut_overlay("nt_reader_panel") + +/** + * Possible 'state' options for change_state(state) are: + * panel_open: The panel is opened + * panel_closed: The panel is closed + */ +// neotheology cloning biocan from Eris +/obj/structure/decor/nt_biocan + icon_state = "nt_biocan" + +/obj/structure/decor/nt_biocan/change_state(state) + . = ..() + switch(state) + if("panel_open") + cut_overlay("nt_biocan_panel") + add_overlay("nt_biocan_panel") + if("panel_closed") + cut_overlay("nt_biocan_panel") + +/** + * Possible 'state' options for change_state(state) are: + * blue, red, orange, yellow, green, purple: Set that color + * damaged: add damage overlay + * undamaged: remove damage overlay + * broken: become damaged + * plain: undamaged white version, otherwise use a color + */ +// dominator console from /tg/ +/obj/structure/decor/dominator + icon_state = "dominator" + +/obj/structure/decor/dominator/change_state(state) + . = ..() + switch(state) + if("blue") + icon_state = "dominator-blue" + if("red") + icon_state = "dominator-red" + if("orange") + icon_state = "dominator-orange" + if("yellow") + icon_state = "dominator-yellow" + if("green") + icon_state = "dominator-green" + if("purple") + icon_state = "dominator-purple" + if("damaged") + add_overlay("dom_damage") + if("undamaged") + cut_overlay("dom_damage") + if("broken") + icon_state = "dominator-broken" + if("plain") + icon_state = "dominator" + +/obj/structure/decor/dominator/blue + icon_state = "dominator-blue" +/obj/structure/decor/dominator/red + icon_state = "dominator-red" +/obj/structure/decor/dominator/orange + icon_state = "dominator-orange" +/obj/structure/decor/dominator/yellow + icon_state = "dominator-yellow" +/obj/structure/decor/dominator/green + icon_state = "dominator-green" +/obj/structure/decor/dominator/purple + icon_state = "dominator-purple" + +/** + * Possible 'state' options for change_state(state) are: + * off: Default, boring + * on: Pumping or something + */ +// some neotheology thing from Eris +/obj/structure/decor/nt_solifier + icon_state = "nt_solidifier" + +/obj/structure/decor/nt_solifier/change_state(state) + . = ..() + switch(state) + if("off") + icon_state = "nt_solidifier" + if("on") + icon_state = "nt_solidifier_on" + +/obj/structure/decor/nt_solifier/starts_on + icon_state = "nt_solidifier_on" + +/** + * Possible 'state' options for change_state(state) are: + * down: In the ground, glowing + * up: Out of the ground, open + */ +// experimental science destructor from /tg/ +/obj/structure/decor/tube + icon = 'icons/obj/structures/decor32x64.dmi' + icon_state = "tube_open" + +/obj/structure/decor/tube/change_state(state) + . = ..() + switch(state) + if("down") + icon_state = "tube_on" + flick("tube_down", src) + if("up") + icon_state = "tube_open" + flick("tube_up", src) + +/obj/structure/decor/tube/starts_down + icon_state = "tube_on" + +/** + * Possible 'state' options for change_state(state) are: + * off: Boring, static + * on: Turny and blinky + */ +// experimental science destructor from /tg/ +/obj/structure/decor/comm_tower + icon = 'icons/obj/structures/decor96x96.dmi' + icon_state = "comm_tower" + +/obj/structure/decor/comm_tower/change_state(state) + . = ..() + switch(state) + if("on") + icon_state = "comm_tower_on" + if("off") + icon_state = "comm_tower" + +/obj/structure/decor/comm_tower/starts_on + icon_state = "comm_tower_on" + +/** + * Possible 'state' options for change_state(state) are: + * off: Not doing much + * on: Stamping mysterious substances + */ +// sheetizer from /tg/ +/obj/structure/decor/stamper + icon_state = "stamper" + +/obj/structure/decor/stamper/change_state(state) + . = ..() + switch(state) + if("off") + cut_overlays() + if("on") + add_overlay("stamper_proc") + add_overlay("stamper_but") + +/obj/structure/decor/stamper/starts_on + icon_state = "stamper_on" + +/obj/structure/decor/stamper/starts_on/Initialize() + add_overlay("stamper_proc") + add_overlay("stamper_but") + + +/** + * Possible 'state' options for change_state(state) are: + * whole: Not doing much + * broken: Stamping mysterious substances + */ +// alien autopsy thing from TGMC +/obj/structure/decor/alien_tank + icon_state = "tank_larva" + +/obj/structure/decor/alien_tank/change_state(state) + . = ..() + switch(state) + if("whole") + icon_state = "tank_larva" + if("broken") + icon_state = "tank_broken" + +/obj/structure/decor/alien_tank/starts_broken + icon_state = "tank_broken" + +/** + * Possible 'state' options for change_state(state) are: + * idle: The default look + * active: Glowy lights underneath + * panel_open: Opened panel (wiring) + * panel_closed: Closed panel + */ +// neotheology optable from Eris +/obj/structure/decor/nt_optable + icon_state = "nt_optable-idle" + +/obj/structure/decor/nt_optable/change_state(state) + . = ..() + switch(state) + if("idle") + icon_state = "nt_optable-idle" + if("active") + icon_state = "nt_optable-active" + if("panel_open") + cut_overlay("nt_optable_panel") + add_overlay("nt_optable_panel") + if("panel_closed") + cut_overlay("nt_optable_panel") + +/** + * Possible 'state' options for change_state(state) are: + * off: Non-spinny + * on: Spinny and floaty + */ +// neotheology decorative(?) obelisk from Eris +/obj/structure/decor/nt_obelisk + icon_state = "nt_obelisk" + +/obj/structure/decor/nt_obelisk/change_state(state) + . = ..() + switch(state) + if("off") + icon_state = "nt_obelisk" + if("on") + icon_state = "nt_obelisk_on" + +/obj/structure/decor/nt_obelisk/starts_on + icon_state = "nt_obelisk_on" + +/** + * Possible 'state' options for change_state(state) are: + * idle: Not doing anything, with yellow template exposed + * work: busy doing work + * pause: paused work + */ +// cruciform forge from Eris +/obj/structure/decor/nt_cruciforge + icon_state = "nt_cruciforge" + +/obj/structure/decor/nt_cruciforge/change_state(state) + . = ..() + switch(state) + if("idle") + icon_state = "nt_cruciforge" + flick("nt_cruciforge_finish", src) // 8ds + if("work") + icon_state = "nt_cruciforge_work" + flick("nt_cruciforge_start", src) // 8ds + if("pause") + icon_state = "nt_cruciforge_pause" + + +/** + * This one is a bit more fancy than others. Anything in the contents (PLEASE LIMIT TO ONE THING) + * will show up inside it! Also if you map in an item on it, it will grab that at mapload and start + * in the 'closed, full of fluid' state, so you can put a body on it or whatever. + * + * As an aghost you can also dragdrop something into it (you have to be ghosted next to it) + * + * Possible 'state' options for change_state(state) are: + * open: Open, no fluid or anything. At the end the contents are ejected. + * closed: Closed, full of liquid + * panel_open: Shows panel + * panel_closed: Unshows panel + */ +// neotheology cloning pod from Eris +/obj/structure/decor/nt_pod + icon = 'icons/obj/structures/decor32x64.dmi' + icon_state = "nt_pod_mappreview" + bound_height = 64 + + var/obj/effect/overlay/vis/outside + var/obj/effect/overlay/vis/door + var/obj/effect/overlay/vis/fluid + + var/contents_vis_flags = NONE + var/contents_original_pixel_y = 0 + +/obj/structure/decor/nt_pod/Initialize(mapload) + // Our non-map-preview state + icon_state = "nt_pod" + + // Alpha mask to make sure things don't sneak out + var/obj/effect/overlay/vis/mask = new + mask.icon = icon + mask.icon_state = "nt_pod_mask" + mask.render_target = "*nt_podmask[REF(src)]" + mask.vis_flags = VIS_INHERIT_ID + vis_contents += mask + + outside = add_vis_overlay(icon, "nt_pod_over", ABOVE_MOB_LAYER, MOB_PLANE, unique = TRUE) + door = add_vis_overlay(icon, "nothing", ABOVE_MOB_LAYER, MOB_PLANE, unique = TRUE) + fluid = add_vis_overlay(icon, "nothing", ABOVE_MOB_LAYER, MOB_PLANE, unique = TRUE) + + // Gather up our friends + if(mapload) + var/atom/movable/AM = locate() in loc + AM?.forceMove(src) + +/obj/structure/decor/nt_pod/Entered(atom/movable/mover) + abduct(mover) + +/obj/structure/decor/nt_pod/proc/abduct(var/atom/movable/AM) + // Save old settings + contents_vis_flags = AM.vis_flags + contents_original_pixel_y = AM.pixel_y + + // Arrange + AM.add_filter("podmask", 1, alpha_mask_filter(render_source = "nt_podmask[REF(src)]", flags = MASK_INVERSE)) + AM.pixel_y = 12 + AM.vis_flags = VIS_INHERIT_ID|VIS_INHERIT_DIR + vis_contents += AM + if(ismob(AM)) + var/mob/M = AM + buckle_mob(M, TRUE, FALSE) + + // TRAP THEM + change_state("closed") + +/obj/structure/decor/nt_pod/proc/unduct(var/atom/movable/AM) + // Geddout + vis_contents -= AM + if(ismob(AM)) + var/mob/M = AM + unbuckle_mob(M, TRUE) + // Cleanup + AM.remove_filter("podmask") + AM.forceMove(drop_location()) + AM.vis_flags = contents_vis_flags + AM.pixel_y = contents_original_pixel_y + +/obj/structure/decor/nt_pod/MouseDrop_T(var/atom/movable/AM, var/mob/user) + if(contents.len) + return + if(!ismovable(AM)) + return + if(!user.client?.holder) + return + + AM.forceMove(src) + +/obj/structure/decor/nt_pod/change_state(state) + . = ..() + switch(state) + if("open") + cut_overlay("nt_pod_top_on") + cut_overlay("nt_pod_under") + + // Fluid drains + fluid.icon_state = "nothing" + flick("nt_pod_emptying", fluid) // 8ds + sleep(8) + + // Door opens + door.icon_state = "nothing" + flick("nt_pod_opening", door) // 9ds + sleep(9) + + // GET OUT + outside.layer = BELOW_MOB_LAYER + if(contents.len) + for(var/atom/movable/AM as anything in contents) + unduct(AM) + + if("closed") + outside.layer = ABOVE_MOB_LAYER + cut_overlay("nt_pod_top_on") + add_overlay("nt_pod_top_on") + add_overlay("nt_pod_under") + + // Door closes + door.icon_state = "nt_pod_glass" + flick("nt_pod_closing", door) // 9ds + sleep(9) + // Fluid fills + fluid.icon_state = "nt_pod_liquid" + flick("nt_pod_filling", fluid) // 8ds + + if("panel_open") + cut_overlay("nt_pod_panel") + add_overlay("nt_pod_panel") + if("panel_closed") + cut_overlay("nt_pod_panel") + +/** + * Possible 'state' options for change_state(state) are: + */ \ No newline at end of file diff --git a/icons/obj/structures/decor.dmi b/icons/obj/structures/decor.dmi new file mode 100644 index 00000000000..942ab117f04 Binary files /dev/null and b/icons/obj/structures/decor.dmi differ diff --git a/icons/obj/structures/decor32x64.dmi b/icons/obj/structures/decor32x64.dmi new file mode 100644 index 00000000000..71886fc3285 Binary files /dev/null and b/icons/obj/structures/decor32x64.dmi differ diff --git a/icons/obj/structures/decor96x96.dmi b/icons/obj/structures/decor96x96.dmi new file mode 100644 index 00000000000..7229e30f238 Binary files /dev/null and b/icons/obj/structures/decor96x96.dmi differ diff --git a/icons/obj/structures/decor_fences.dmi b/icons/obj/structures/decor_fences.dmi new file mode 100644 index 00000000000..155d5bef68c Binary files /dev/null and b/icons/obj/structures/decor_fences.dmi differ diff --git a/vorestation.dme b/vorestation.dme index daabe6918c6..707b076c5c3 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1432,6 +1432,7 @@ #include "code\game\objects\structures\coathanger.dm" #include "code\game\objects\structures\curtains.dm" #include "code\game\objects\structures\dancepole_vr.dm" +#include "code\game\objects\structures\decorative.dm" #include "code\game\objects\structures\displaycase.dm" #include "code\game\objects\structures\dogbed.dm" #include "code\game\objects\structures\door_assembly.dm"