From 268c088da7f41a85e17871d53732ff346d56fb01 Mon Sep 17 00:00:00 2001 From: Singul0 <127663818+Singul0@users.noreply.github.com> Date: Thu, 3 Apr 2025 09:11:27 +0700 Subject: [PATCH] Adds table flipping! Take 2.0 (#90156) ## About The Pull Request Revives the long dead #80348. Right click a table to flip it over, Useful for makeshift cover or ragequitting. Their integrity is equal to that of the table you flipped. Some tables aren't able to be flipped (reinforced tables, roller tables, etc). I refactored it to be less snowflakey. so hopefully this passes with only minor changes ![290775902-48414bb3-aaa9-467d-8edf-a170a98b1506](https://github.com/user-attachments/assets/3627c537-043e-4829-b38b-f68a7d382167) ![gambar](https://github.com/user-attachments/assets/ce04a6d1-e480-46f9-8913-041f86db8a9a) ## Why It's Good For The Game I felt like we're lacking in the makeshift defense items. This is a quicky way to plop up a shitty barricade for you to guard with. and also really cool for roleplaying and such. also, this categorically goes hard: ![gambar](https://github.com/user-attachments/assets/af593068-d9f3-49b0-9102-989ce2b4d3fb) ## Changelog :cl: add: You can now flip tables by right clicking them! /:cl: --------- Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Co-authored-by: Jacquerel --- .../objects/effects/spawners/structure.dm | 15 ++ code/game/objects/structures/tables_racks.dm | 242 +++++++++++++++--- .../abductor/abductor_structures.dm | 1 + code/modules/mining/equipment/survival_pod.dm | 1 + icons/obj/flipped_tables.dmi | Bin 0 -> 27163 bytes 5 files changed, 230 insertions(+), 29 deletions(-) create mode 100644 icons/obj/flipped_tables.dmi diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 8048e9d96d9..7f462ff2480 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -375,3 +375,18 @@ again. icon = 'icons/obj/structures_spawners.dmi' icon_state = "electrified_grille" spawn_list = list(/obj/structure/grille, /obj/structure/cable) + +///flipped tables +/obj/effect/spawner/structure/flipped_table + name = "flipped table spawner" + icon = 'icons/obj/flipped_tables.dmi' + icon_state = "table" + ///just change this whatever table type you want, has to be a table subtype though. + var/table_to_spawn = /obj/structure/table + +/obj/effect/spawner/structure/flipped_table/Initialize(mapload) + . = ..() + var/obj/structure/table/table_to_flipped = new table_to_spawn(loc) + table_to_flipped.dir = dir + table_to_flipped.flip_table() + diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index b57c527e075..b438e42c49f 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -29,6 +29,9 @@ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TABLES canSmoothWith = SMOOTH_GROUP_TABLES + var/static/list/turf_traits = list(TRAIT_TURF_IGNORE_SLOWDOWN, TRAIT_TURF_IGNORE_SLIPPERY, TRAIT_IMMERSE_STOPPED) + ///a bit fucky, I know. but this is needed to get sorted on init smoothing groups stored + var/list/on_init_smoothed_vars var/frame = /obj/structure/table_frame var/framestack = /obj/item/stack/rods var/glass_shard_type = /obj/item/shard @@ -37,6 +40,16 @@ var/buildstackamount = 1 var/framestackamount = 2 var/deconstruction_ready = TRUE + ///Whether or not the table could be flipped or not + var/can_flip = TRUE + ///Whether or not the table is flipped + var/is_flipped = FALSE + /// Whether or not when flipped, it ignores PASS_GLASS flag + var/is_transparent = FALSE + /// If you don't have sprites for flipped tables, you can use matrices instead. looks ever-slightly worse. + var/use_matrices_instead = FALSE + /// Matrix to return to on unflipping table + var/matrix/before_flipped_matrix /obj/structure/table/Initialize(mapload, obj/structure/table_frame/frame_used, obj/item/stack/stack_used) . = ..() @@ -45,21 +58,33 @@ if(stack_used) apply_stack_properties(stack_used) - AddElement(/datum/element/footstep_override, priority = STEP_SOUND_TABLE_PRIORITY) - - make_climbable() + before_flipped_matrix = transform + on_init_smoothed_vars = list(smoothing_groups, canSmoothWith) var/static/list/loc_connections = list( COMSIG_LIVING_DISARM_COLLIDE = PROC_REF(table_living), + COMSIG_ATOM_EXIT = PROC_REF(on_exit), ) AddElement(/datum/element/connect_loc, loc_connections) - var/static/list/give_turf_traits = list(TRAIT_TURF_IGNORE_SLOWDOWN, TRAIT_TURF_IGNORE_SLIPPERY, TRAIT_IMMERSE_STOPPED) - AddElement(/datum/element/give_turf_traits, give_turf_traits) register_context() + if(can_flip) + AddElement( \ + /datum/element/contextual_screentip_bare_hands, \ + rmb_text = "Flip", \ + ) + ADD_TRAIT(src, TRAIT_COMBAT_MODE_SKIP_INTERACTION, INNATE_TRAIT) + if(can_flip && is_flipped) + flip_table() + return + + make_climbable() + AddElement(/datum/element/give_turf_traits, turf_traits) + AddElement(/datum/element/footstep_override, priority = STEP_SOUND_TABLE_PRIORITY) + /// Applies additional properties based on the frame used to construct this table. /obj/structure/table/proc/apply_frame_properties(obj/structure/table_frame/frame_used) frame = frame_used.type @@ -75,6 +100,76 @@ AddElement(/datum/element/climbable) AddElement(/datum/element/elevation, pixel_shift = 12) +//proc that adds elements present in normal tables +/obj/structure/table/proc/unflip_table() + playsound(src, 'sound/items/trayhit/trayhit2.ogg', 100) + make_climbable() + AddElement(/datum/element/give_turf_traits, turf_traits) + AddElement(/datum/element/footstep_override, priority = STEP_SOUND_TABLE_PRIORITY) + //resets vars from table being flipped + layer = TABLE_LAYER + smoothing_flags |= SMOOTH_BITMASK + pass_flags_self |= PASSTABLE + if(use_matrices_instead) + animate(src, transform = before_flipped_matrix, time = 0) + else + icon = initial(icon) + icon_state = initial(icon_state) + smoothing_groups = on_init_smoothed_vars[1] + canSmoothWith = on_init_smoothed_vars[2] + update_appearance() + is_flipped = FALSE + +//proc that removes elements present in now-flipped tables +/obj/structure/table/proc/flip_table(new_dir) + playsound(src, 'sound/items/trayhit/trayhit1.ogg', 100) + RemoveElement(/datum/element/climbable) + RemoveElement(/datum/element/footstep_override, priority = STEP_SOUND_TABLE_PRIORITY) + RemoveElement(/datum/element/give_turf_traits, turf_traits) + RemoveElement(/datum/element/elevation, pixel_shift = 12) + + //change icons + layer = LOW_ITEM_LAYER + if(new_dir & EAST) // Dirs need to be part of the 4 main cardinal directions so proc/CanAllowThrough isn't fucky wucky + new_dir = EAST + else if(new_dir & WEST) + new_dir = WEST + dir = new_dir + if(new_dir == SOUTH) + layer = ABOVE_MOB_LAYER + + var/turf/throw_target = get_step(src, src.dir) + if(!isnull(throw_target)) + for(var/atom/movable/movable_entity in src.loc) + if(is_able_to_throw(src, movable_entity)) + movable_entity.safe_throw_at(throw_target, range = 1, speed = 1, force = MOVE_FORCE_NORMAL, gentle = TRUE) + + smoothing_flags &= ~SMOOTH_BITMASK + smoothing_groups = null + canSmoothWith = null + pass_flags_self &= ~PASSTABLE + + if(use_matrices_instead) + icon_state = initial(icon_state) + before_flipped_matrix = transform + var/matrix/transform_matrix = matrix(1, 0, 0, 0, 0.350, 9) // "flips" the table + //there's probably a nicer way to do this but whatever. rotates the table according to the dir + if(dir == EAST) + transform_matrix.Turn(90) + if(dir == SOUTH) + transform_matrix.Turn(180) + if(dir == WEST) + transform_matrix.Turn(270) + animate(src, transform = transform_matrix, time = 0) + else + icon = 'icons/obj/flipped_tables.dmi' + icon_state = base_icon_state + + update_appearance() + QUEUE_SMOOTH_NEIGHBORS(src) + + is_flipped = TRUE + /obj/structure/table/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() @@ -100,11 +195,55 @@ /obj/structure/table/examine(mob/user) . = ..() + if(is_flipped) + . += span_notice("It's been flipped on its side!") . += deconstruction_hints(user) /obj/structure/table/proc/deconstruction_hints(mob/user) return span_notice("The top is screwed on, but the main bolts are also visible.") +/obj/structure/table/proc/on_exit(datum/source, atom/movable/leaving, direction) + SIGNAL_HANDLER + if(!is_flipped) + return + + if(leaving.movement_type & PHASING) + return + + if(leaving == src) + return + if(is_transparent) //Glass table, jolly ranchers pass + if(istype(leaving) && (leaving.pass_flags & PASSGLASS)) + return + + if(istype(leaving, /obj/projectile)) + return + + if(direction == dir) + leaving.Bump(src) + return COMPONENT_ATOM_BLOCK_EXIT + +/obj/structure/table/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(.) + return + + if(!is_flipped) + return FALSE + + if(is_transparent) //Glass table, jolly ranchers pass + if(istype(mover) && (mover.pass_flags & PASSGLASS)) + return TRUE + if(isprojectile(mover)) + var/obj/projectile/proj = mover + //Lets through bullets shot from behind the cover of the table + if(proj.movement_vector && angle2dir_cardinal(proj.movement_vector.angle) == dir) + return TRUE + return FALSE + if(border_dir == dir) + return FALSE + return TRUE + /obj/structure/table/update_icon(updates=ALL) . = ..() if((updates & UPDATE_SMOOTHING) && (smoothing_flags & USES_SMOOTHING)) @@ -120,6 +259,8 @@ return attack_hand(user, modifiers) /obj/structure/table/attack_hand(mob/living/user, list/modifiers) + if(is_flipped) + return if(Adjacent(user) && user.pulling) if(isliving(user.pulling)) var/mob/living/pushed_mob = user.pulling @@ -154,6 +295,41 @@ user.stop_pulling() return ..() +/obj/structure/table/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(!istype(user) || !user.can_interact_with(src)) + return FALSE + + if(!can_flip) + return + + if(!is_flipped) + user.balloon_alert_to_viewers("flipping table...") + if(!do_after(user, max_integrity * 0.25)) + return + + flip_table(get_dir(user, src)) + + return + + else + user.balloon_alert_to_viewers("flipping table upright...") + if(do_after(user, max_integrity * 0.25, src)) + unflip_table() + return TRUE + +/obj/structure/table/proc/is_able_to_throw(obj/structure/table, atom/movable/movable_entity) + if (movable_entity == table) //Thing is not the table + return FALSE + if (movable_entity.anchored) //Thing isn't anchored + return FALSE + if(!isliving(movable_entity) && !isobj(movable_entity)) //Thing isn't an obj or mob + return FALSE + if(movable_entity.throwing || (movable_entity.movement_type & (FLOATING|FLYING)) || HAS_TRAIT(movable_entity, TRAIT_IGNORE_ELEVATION)) //Thing isn't flying/floating + return FALSE + + return TRUE + /obj/structure/table/attack_tk(mob/user) return @@ -163,8 +339,9 @@ return if(mover.throwing) return TRUE - if(locate(/obj/structure/table) in get_turf(mover)) - return TRUE + for(var/obj/structure/table/table in get_turf(mover)) + if(!table.is_flipped) + return TRUE /obj/structure/table/CanAStarPass(to_dir, datum/can_pass_info/pass_info) if(!density) @@ -243,6 +420,9 @@ if(.) return . + if(is_flipped) + return . + if(istype(tool, /obj/item/toy/cards/deck)) . = deck_act(user, tool, modifiers, !!LAZYACCESS(modifiers, RIGHT_CLICK)) if(istype(tool, /obj/item/storage/bag/tray)) @@ -393,6 +573,7 @@ icon_state = "rollingtable" /// Lazylist of the items that we have on our surface. var/list/attached_items = null + can_flip = FALSE /obj/structure/table/rolling/Initialize(mapload, obj/structure/table_frame/frame_used, obj/item/stack/stack_used) . = ..() @@ -500,6 +681,8 @@ check_break(M) /obj/structure/table/glass/proc/check_break(mob/living/M) + if(is_flipped) + return FALSE if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) && (!isteshari(M))) //SKYRAT EDIT ADDITION - Allows Teshari to climb on glassies safely. - This should be a component table_shatter(M) @@ -581,15 +764,14 @@ /obj/structure/table/wood/fancy name = "fancy table" desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth." - icon = 'icons/obj/structures.dmi' - icon_state = "fancy_table" + icon = 'icons/obj/smooth_structures/fancy_table.dmi' + icon_state = "fancy_table-0" base_icon_state = "fancy_table" frame = /obj/structure/table_frame framestack = /obj/item/stack/rods buildstack = /obj/item/stack/tile/carpet smoothing_groups = SMOOTH_GROUP_FANCY_WOOD_TABLES //Don't smooth with SMOOTH_GROUP_TABLES or SMOOTH_GROUP_WOOD_TABLES canSmoothWith = SMOOTH_GROUP_FANCY_WOOD_TABLES - var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize() /obj/structure/table/wood/fancy/Initialize(mapload, obj/structure/table_frame/frame_used, obj/item/stack/stack_used) . = ..() @@ -597,64 +779,63 @@ // which the editor treats as a two-tile-tall object. The sprites are that // size so that the north/south corners look nice - examine the detail on // the sprites in the editor to see why. - icon = smooth_icon /obj/structure/table/wood/fancy/apply_stack_properties(obj/item/stack/stack_used) buildstack = stack_used.type /obj/structure/table/wood/fancy/black - icon_state = "fancy_table_black" + icon_state = "fancy_table_black-0" base_icon_state = "fancy_table_black" buildstack = /obj/item/stack/tile/carpet/black - smooth_icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' + icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' /obj/structure/table/wood/fancy/blue - icon_state = "fancy_table_blue" + icon_state = "fancy_table_blue-0" base_icon_state = "fancy_table_blue" buildstack = /obj/item/stack/tile/carpet/blue - smooth_icon = 'icons/obj/smooth_structures/fancy_table_blue.dmi' + icon = 'icons/obj/smooth_structures/fancy_table_blue.dmi' /obj/structure/table/wood/fancy/cyan - icon_state = "fancy_table_cyan" + icon_state = "fancy_table_cyan-0" base_icon_state = "fancy_table_cyan" buildstack = /obj/item/stack/tile/carpet/cyan - smooth_icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi' + icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi' /obj/structure/table/wood/fancy/green - icon_state = "fancy_table_green" + icon_state = "fancy_table_green-0" base_icon_state = "fancy_table_green" buildstack = /obj/item/stack/tile/carpet/green - smooth_icon = 'icons/obj/smooth_structures/fancy_table_green.dmi' + icon = 'icons/obj/smooth_structures/fancy_table_green.dmi' /obj/structure/table/wood/fancy/orange - icon_state = "fancy_table_orange" + icon_state = "fancy_table_orange-0" base_icon_state = "fancy_table_orange" buildstack = /obj/item/stack/tile/carpet/orange - smooth_icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi' + icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi' /obj/structure/table/wood/fancy/purple - icon_state = "fancy_table_purple" + icon_state = "fancy_table_purple-0" base_icon_state = "fancy_table_purple" buildstack = /obj/item/stack/tile/carpet/purple - smooth_icon = 'icons/obj/smooth_structures/fancy_table_purple.dmi' + icon = 'icons/obj/smooth_structures/fancy_table_purple.dmi' /obj/structure/table/wood/fancy/red - icon_state = "fancy_table_red" + icon_state = "fancy_table_red-0" base_icon_state = "fancy_table_red" buildstack = /obj/item/stack/tile/carpet/red - smooth_icon = 'icons/obj/smooth_structures/fancy_table_red.dmi' + icon = 'icons/obj/smooth_structures/fancy_table_red.dmi' /obj/structure/table/wood/fancy/royalblack - icon_state = "fancy_table_royalblack" + icon_state = "fancy_table_royalblack-0" base_icon_state = "fancy_table_royalblack" buildstack = /obj/item/stack/tile/carpet/royalblack - smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi' + icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi' /obj/structure/table/wood/fancy/royalblue - icon_state = "fancy_table_royalblue" + icon_state = "fancy_table_royalblue-0" base_icon_state = "fancy_table_royalblue" buildstack = /obj/item/stack/tile/carpet/royalblue - smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi' + icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi' /* * Reinforced tables @@ -670,6 +851,7 @@ max_integrity = 200 integrity_failure = 0.25 armor_type = /datum/armor/table_reinforced + can_flip = FALSE /datum/armor/table_reinforced melee = 10 @@ -767,6 +949,7 @@ buildstack = /obj/item/stack/sheet/bronze smoothing_groups = SMOOTH_GROUP_BRONZE_TABLES //Don't smooth with SMOOTH_GROUP_TABLES canSmoothWith = SMOOTH_GROUP_BRONZE_TABLES + can_flip = FALSE /obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob) ..() @@ -827,6 +1010,7 @@ can_buckle = TRUE buckle_lying = 90 custom_materials = list(/datum/material/silver =SHEET_MATERIAL_AMOUNT) + can_flip = FALSE var/mob/living/carbon/patient = null var/obj/machinery/computer/operating/computer = null diff --git a/code/modules/antagonists/abductor/abductor_structures.dm b/code/modules/antagonists/abductor/abductor_structures.dm index 3ca2fbacdc6..4668a67b65b 100644 --- a/code/modules/antagonists/abductor/abductor_structures.dm +++ b/code/modules/antagonists/abductor/abductor_structures.dm @@ -35,6 +35,7 @@ canSmoothWith = SMOOTH_GROUP_ABDUCTOR_TABLES frame = /obj/structure/table_frame/abductor custom_materials = list(/datum/material/silver =SHEET_MATERIAL_AMOUNT) + can_flip = FALSE /obj/structure/table/optable/abductor name = "alien operating table" diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index a770d7f4bbf..be27975294b 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -202,6 +202,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/door/window/survival_pod/left, 0) smoothing_flags = NONE smoothing_groups = null canSmoothWith = null + can_flip = FALSE //Sleeper /obj/machinery/sleeper/survival_pod diff --git a/icons/obj/flipped_tables.dmi b/icons/obj/flipped_tables.dmi new file mode 100644 index 0000000000000000000000000000000000000000..46934ae7d048e0dcb57204fbe165cecce13e1ea8 GIT binary patch literal 27163 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