From db92f01489644197109667354bd483de70f47033 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 22 Nov 2024 20:23:47 +1100 Subject: [PATCH 01/42] Vending machine and smartfridge cleanup and icon fixes. --- code/game/machinery/kitchen/drying_oven.dm | 45 ----- .../_smartfridge.dm} | 182 ++++++------------ .../smartfridge/_smartfridge_secure.dm | 22 +++ code/game/machinery/smartfridge/chemistry.dm | 9 + code/game/machinery/smartfridge/drinks.dm | 9 + .../game/machinery/smartfridge/drying_oven.dm | 35 ++++ code/game/machinery/smartfridge/foods.dm | 9 + code/game/machinery/smartfridge/medbay.dm | 15 ++ code/game/machinery/smartfridge/produce.dm | 6 + code/game/machinery/smartfridge/seeds.dm | 8 + code/game/machinery/smartfridge/sheets.dm | 6 + code/game/machinery/vending/_vending.dm | 17 +- code/game/machinery/vending/actors.dm | 6 +- code/game/machinery/vending/botany.dm | 16 +- code/game/machinery/vending/cigs.dm | 4 +- code/game/machinery/vending/engineering.dm | 20 +- code/game/machinery/vending/food.dm | 43 ++--- code/game/machinery/vending/medical.dm | 12 +- code/game/machinery/vending/misc.dm | 19 +- code/game/machinery/vending/security.dm | 4 +- code/game/objects/random/subtypes/misc.dm | 4 +- code/modules/acting/acting_items.dm | 4 +- code/modules/hydroponics/seed_storage.dm | 4 +- .../modular_computers/laptop_vendor.dm | 6 +- code/modules/reagents/reagent_dispenser.dm | 11 +- code/unit_tests/icon_tests.dm | 100 ++++++++++ .../machines/smartfridges/contents_chem.dmi | Bin 0 -> 1925 bytes .../machines/smartfridges/contents_drink.dmi | Bin 0 -> 1748 bytes .../machines/smartfridges/contents_food.dmi | Bin 0 -> 1784 bytes .../machines/smartfridges/contents_plants.dmi | Bin 0 -> 801 bytes icons/obj/machines/smartfridges/dark.dmi | Bin 0 -> 4902 bytes icons/obj/machines/smartfridges/drinks.dmi | Bin 0 -> 4873 bytes .../obj/machines/smartfridges/drying_oven.dmi | Bin 0 -> 2223 bytes icons/obj/machines/smartfridges/food.dmi | Bin 0 -> 4635 bytes icons/obj/machines/smartfridges/science.dmi | Bin 0 -> 4796 bytes icons/obj/machines/vending/bar.dmi | Bin 0 -> 2760 bytes icons/obj/machines/vending/cartridges.dmi | Bin 0 -> 1226 bytes icons/obj/machines/vending/cigarettes.dmi | Bin 0 -> 3327 bytes icons/obj/machines/vending/coffee.dmi | Bin 0 -> 5470 bytes icons/obj/machines/vending/dinnerware.dmi | Bin 0 -> 3118 bytes icons/obj/machines/vending/drinks.dmi | Bin 0 -> 3435 bytes icons/obj/machines/vending/engineering.dmi | Bin 0 -> 4049 bytes icons/obj/machines/vending/engivend.dmi | Bin 0 -> 3374 bytes icons/obj/machines/vending/fitness.dmi | Bin 0 -> 3544 bytes icons/obj/machines/vending/games.dmi | Bin 0 -> 3360 bytes icons/obj/machines/vending/generic.dmi | Bin 0 -> 2842 bytes icons/obj/machines/vending/hotfood.dmi | Bin 0 -> 5507 bytes icons/obj/machines/vending/laptops.dmi | Bin 0 -> 3003 bytes icons/obj/machines/vending/lavatory.dmi | Bin 0 -> 3348 bytes icons/obj/machines/vending/magic.dmi | Bin 0 -> 3453 bytes icons/obj/machines/vending/medical.dmi | Bin 0 -> 3789 bytes icons/obj/machines/vending/nutri_green.dmi | Bin 0 -> 3757 bytes icons/obj/machines/vending/nutri_grey.dmi | Bin 0 -> 3631 bytes icons/obj/machines/vending/nutrimat.dmi | Bin 0 -> 1174 bytes icons/obj/machines/vending/robotics.dmi | Bin 0 -> 3830 bytes icons/obj/machines/vending/security.dmi | Bin 0 -> 3786 bytes icons/obj/machines/vending/seeds_green.dmi | Bin 0 -> 4206 bytes icons/obj/machines/vending/seeds_grey.dmi | Bin 0 -> 3779 bytes icons/obj/machines/vending/snacks.dmi | Bin 0 -> 3710 bytes icons/obj/machines/vending/snix.dmi | Bin 0 -> 4362 bytes icons/obj/machines/vending/soda.dmi | Bin 0 -> 3169 bytes icons/obj/machines/vending/solsnacks.dmi | Bin 0 -> 3700 bytes icons/obj/machines/vending/soviet.dmi | Bin 0 -> 3162 bytes icons/obj/machines/vending/theater.dmi | Bin 0 -> 3023 bytes icons/obj/machines/vending/tool.dmi | Bin 0 -> 3450 bytes icons/obj/machines/vending/tool_adh.dmi | Bin 0 -> 3254 bytes icons/obj/machines/vending/uniform.dmi | Bin 0 -> 3813 bytes icons/obj/machines/vending/wallmed.dmi | Bin 0 -> 2406 bytes icons/obj/machines/vending/weeb.dmi | Bin 0 -> 4127 bytes icons/obj/structures/water_cooler.dmi | Bin 0 -> 1558 bytes icons/obj/vending.dmi | Bin 353938 -> 0 bytes .../icons/smartfridge_contents_slime.dmi | Bin 0 -> 1842 bytes mods/content/xenobiology/overrides.dm | 2 +- nebula.dme | 11 +- 74 files changed, 344 insertions(+), 285 deletions(-) rename code/game/machinery/{kitchen/smartfridge.dm => smartfridge/_smartfridge.dm} (59%) create mode 100644 code/game/machinery/smartfridge/_smartfridge_secure.dm create mode 100644 code/game/machinery/smartfridge/chemistry.dm create mode 100644 code/game/machinery/smartfridge/drinks.dm create mode 100644 code/game/machinery/smartfridge/drying_oven.dm create mode 100644 code/game/machinery/smartfridge/foods.dm create mode 100644 code/game/machinery/smartfridge/medbay.dm create mode 100644 code/game/machinery/smartfridge/produce.dm create mode 100644 code/game/machinery/smartfridge/seeds.dm create mode 100644 code/game/machinery/smartfridge/sheets.dm create mode 100644 icons/obj/machines/smartfridges/contents_chem.dmi create mode 100644 icons/obj/machines/smartfridges/contents_drink.dmi create mode 100644 icons/obj/machines/smartfridges/contents_food.dmi create mode 100644 icons/obj/machines/smartfridges/contents_plants.dmi create mode 100644 icons/obj/machines/smartfridges/dark.dmi create mode 100644 icons/obj/machines/smartfridges/drinks.dmi create mode 100644 icons/obj/machines/smartfridges/drying_oven.dmi create mode 100644 icons/obj/machines/smartfridges/food.dmi create mode 100644 icons/obj/machines/smartfridges/science.dmi create mode 100644 icons/obj/machines/vending/bar.dmi create mode 100644 icons/obj/machines/vending/cartridges.dmi create mode 100644 icons/obj/machines/vending/cigarettes.dmi create mode 100644 icons/obj/machines/vending/coffee.dmi create mode 100644 icons/obj/machines/vending/dinnerware.dmi create mode 100644 icons/obj/machines/vending/drinks.dmi create mode 100644 icons/obj/machines/vending/engineering.dmi create mode 100644 icons/obj/machines/vending/engivend.dmi create mode 100644 icons/obj/machines/vending/fitness.dmi create mode 100644 icons/obj/machines/vending/games.dmi create mode 100644 icons/obj/machines/vending/generic.dmi create mode 100644 icons/obj/machines/vending/hotfood.dmi create mode 100644 icons/obj/machines/vending/laptops.dmi create mode 100644 icons/obj/machines/vending/lavatory.dmi create mode 100644 icons/obj/machines/vending/magic.dmi create mode 100644 icons/obj/machines/vending/medical.dmi create mode 100644 icons/obj/machines/vending/nutri_green.dmi create mode 100644 icons/obj/machines/vending/nutri_grey.dmi create mode 100644 icons/obj/machines/vending/nutrimat.dmi create mode 100644 icons/obj/machines/vending/robotics.dmi create mode 100644 icons/obj/machines/vending/security.dmi create mode 100644 icons/obj/machines/vending/seeds_green.dmi create mode 100644 icons/obj/machines/vending/seeds_grey.dmi create mode 100644 icons/obj/machines/vending/snacks.dmi create mode 100644 icons/obj/machines/vending/snix.dmi create mode 100644 icons/obj/machines/vending/soda.dmi create mode 100644 icons/obj/machines/vending/solsnacks.dmi create mode 100644 icons/obj/machines/vending/soviet.dmi create mode 100644 icons/obj/machines/vending/theater.dmi create mode 100644 icons/obj/machines/vending/tool.dmi create mode 100644 icons/obj/machines/vending/tool_adh.dmi create mode 100644 icons/obj/machines/vending/uniform.dmi create mode 100644 icons/obj/machines/vending/wallmed.dmi create mode 100644 icons/obj/machines/vending/weeb.dmi create mode 100644 icons/obj/structures/water_cooler.dmi delete mode 100644 icons/obj/vending.dmi create mode 100644 mods/content/xenobiology/icons/smartfridge_contents_slime.dmi diff --git a/code/game/machinery/kitchen/drying_oven.dm b/code/game/machinery/kitchen/drying_oven.dm index 7c2a310b1123..e69de29bb2d1 100644 --- a/code/game/machinery/kitchen/drying_oven.dm +++ b/code/game/machinery/kitchen/drying_oven.dm @@ -1,45 +0,0 @@ -/obj/machinery/smartfridge/drying_oven - name = "drying oven" - desc = "A machine for drying plants." - icon_state = "drying_rack" - icon_base = "drying_rack" - obj_flags = OBJ_FLAG_ANCHORABLE - atom_flags = ATOM_FLAG_CLIMBABLE - -/obj/machinery/smartfridge/drying_oven/accept_check(var/obj/item/O) - return istype(O) && O.is_dryable() - -/obj/machinery/smartfridge/drying_oven/Process() - ..() - if(inoperable()) - return - var/do_update = FALSE - for(var/obj/item/thing in get_contained_external_atoms()) - var/obj/item/product = thing.dry_out(src, silent = TRUE) - if(product) - product.dropInto(loc) - do_update = TRUE - if(QDELETED(thing) || !(thing in contents)) - for(var/datum/stored_items/I in item_records) - I.instances -= thing - if(do_update) - update_icon() - -/obj/machinery/smartfridge/drying_oven/on_update_icon() - ..() - var/has_items = FALSE - for(var/datum/stored_items/I in item_records) - if(I.get_amount()) - has_items = TRUE - break - if(inoperable()) - if(has_items) - icon_state = "[icon_base]-plant-off" - else - icon_state = "[icon_base]-off" - else if(has_items) - icon_state = "[icon_base]-plant" - if(!inoperable()) - icon_state = "[icon_base]-close" - else - icon_state = icon_base diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/smartfridge/_smartfridge.dm similarity index 59% rename from code/game/machinery/kitchen/smartfridge.dm rename to code/game/machinery/smartfridge/_smartfridge.dm index e9020da7cf04..28f51fab493c 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/smartfridge/_smartfridge.dm @@ -3,8 +3,8 @@ */ /obj/machinery/smartfridge name = "\improper SmartFridge" - icon = 'icons/obj/vending.dmi' - icon_state = "fridge_sci" + icon = 'icons/obj/machines/smartfridges/science.dmi' + icon_state = ICON_STATE_WORLD layer = BELOW_OBJ_LAYER density = TRUE anchored = TRUE @@ -14,9 +14,11 @@ obj_flags = OBJ_FLAG_ANCHORABLE | OBJ_FLAG_ROTATABLE atmos_canpass = CANPASS_NEVER required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES + construct_state = /decl/machine_construction/default/panel_closed + uncreated_component_parts = null + stat_immune = 0 - var/icon_base = "fridge_sci" - var/icon_contents = "chem" + var/overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_chem.dmi' var/list/item_records = list() var/seconds_electrified = 0; var/shoot_inventory = 0 @@ -24,13 +26,6 @@ var/scan_id = 1 var/is_secure = 0 - construct_state = /decl/machine_construction/default/panel_closed - uncreated_component_parts = null - stat_immune = 0 - -/obj/machinery/smartfridge/secure - is_secure = 1 - /obj/machinery/smartfridge/Initialize() if(is_secure) wires = new/datum/wires/smartfridge/secure(src) @@ -55,75 +50,6 @@ return 1 return 0 -/obj/machinery/smartfridge/seeds - name = "\improper MegaSeed Servitor" - desc = "When you need seeds fast!" - -/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O) - if(istype(O,/obj/item/seeds/)) - return 1 - return 0 - -/obj/machinery/smartfridge/secure/medbay - name = "\improper Refrigerated Medicine Storage" - desc = "A refrigerated storage unit for storing medicine and chemicals." - icon_contents = "chem" - initial_access = list(list(access_medical, access_chemistry)) - -/obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O) - if(istype(O,/obj/item/chems/glass)) - return 1 - if(istype(O,/obj/item/pill_bottle)) - return 1 - if(istype(O,/obj/item/chems/pill)) - return 1 - return 0 - -/obj/machinery/smartfridge/produce - name = "produce smartfridge" - desc = "A refrigerated storage unit for fruits and vegetables." - -/obj/machinery/smartfridge/produce/accept_check(var/obj/item/O) - return istype(O, /obj/item/food/grown) - -/obj/machinery/smartfridge/sheets - name = "raw material storage" - desc = "A storage unit for bundles of material sheets, ingots and other shapes." - -/obj/machinery/smartfridge/sheets/accept_check(var/obj/item/O) - return istype(O, /obj/item/stack/material) - -/obj/machinery/smartfridge/chemistry - name = "\improper Smart Chemical Storage" - desc = "A refrigerated storage unit for medicine and chemical storage." - icon_contents = "chem" - -/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O) - if(istype(O,/obj/item/pill_bottle) || istype(O,/obj/item/chems)) - return 1 - return 0 - -/obj/machinery/smartfridge/drinks - name = "\improper Drink Showcase" - desc = "A refrigerated storage unit for tasty tasty alcohol." - icon_state = "fridge_dark" - icon_base = "fridge_dark" - icon_contents = "drink" - -/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O) - if(istype(O,/obj/item/chems/glass) || istype(O,/obj/item/chems/drinks) || istype(O,/obj/item/chems/condiment)) - return 1 - -/obj/machinery/smartfridge/foods - name = "\improper Hot Foods Display" - desc = "A heated storage unit for piping hot meals." - icon_state = "fridge_food" - icon_contents = "food" - -/obj/machinery/smartfridge/foods/accept_check(var/obj/item/O) - if(istype(O,/obj/item/food) || istype(O,/obj/item/utensil)) - return 1 - /obj/machinery/smartfridge/Process() if(stat & (BROKEN|NOPOWER)) return @@ -133,42 +59,61 @@ src.throw_item() /obj/machinery/smartfridge/on_update_icon() - overlays.Cut() - if(stat & (BROKEN|NOPOWER)) - icon_state = "[icon_base]-off" - else - icon_state = icon_base + // Reset our icon_state and overlays. + icon_state = initial(icon_state) + cut_overlays() // Does not appear to be called lower down the chain, sadly. + + // Draw our side panel overlay (for access checking) + var/draw_state if(is_secure) - overlays += image(icon, "[icon_base]-sidepanel") + if(stat & BROKEN) + draw_state = "[icon_state]-sidepanel-broken" + else + draw_state = "[icon_state]-sidepanel" + if(check_state_in_icon(draw_state, icon)) + add_overlay(draw_state) + // Draw our panel overlay. if(panel_open) - overlays += image(icon, "[icon_base]-panel") - - var/image/I - var/is_off = "" - if(inoperable()) - is_off = "-off" + draw_state = "[icon_state]-panel" + if(check_state_in_icon(draw_state, icon)) + add_overlay(draw_state) // Fridge contents - switch(contents.len - LAZYLEN(component_parts)) - if(0) - I = image(icon, "empty[is_off]") - if(1 to 2) - I = image(icon, "[icon_contents]-1[is_off]") - if(3 to 5) - I = image(icon, "[icon_contents]-2[is_off]") - if(6 to 8) - I = image(icon, "[icon_contents]-3[is_off]") - else - I = image(icon, "[icon_contents]-4[is_off]") - overlays += I + if(overlay_contents_icon) + var/is_off = inoperable() ? "-off" : "" + switch(contents.len - LAZYLEN(component_parts)) + if(0) + draw_state = "empty[is_off]" + if(1 to 2) + draw_state = "1[is_off]" + if(3 to 5) + draw_state = "2[is_off]" + if(6 to 8) + draw_state = "3[is_off]" + else + draw_state = "4[is_off]" + if(draw_state && check_state_in_icon(draw_state, icon)) + add_overlay(image(overlay_contents_icon, draw_state)) // Fridge top - I = image(icon, "[icon_base]-top") - I.pixel_z = 32 - I.layer = ABOVE_WINDOW_LAYER - overlays += I + if(stat & BROKEN) + draw_state = "[draw_state]-top-broken" + else + draw_state = "[icon_state]-top" + + if(check_state_in_icon(draw_state, icon)) + var/image/I = image(icon, draw_state) + I.pixel_z = 32 + I.layer = ABOVE_WINDOW_LAYER + add_overlay(I) + + // Append our off state if needed. + if(stat & BROKEN) + icon_state = "[icon_state]-broken" + else if(stat & NOPOWER) + icon_state = "[icon_state]-off" /obj/machinery/smartfridge/dismantle() for(var/datum/stored_items/I in item_records) @@ -208,14 +153,6 @@ return TRUE return ..() -/obj/machinery/smartfridge/secure/emag_act(var/remaining_charges, var/mob/user) - if(!emagged) - emagged = 1 - locked = -1 - req_access.Cut() - to_chat(user, "You short out the product lock on [src].") - return 1 - /obj/machinery/smartfridge/proc/stock_item(var/obj/item/O) for(var/datum/stored_items/I in item_records) if(istype(O, I.item_path) && O.name == I.item_name) @@ -288,7 +225,9 @@ for(var/i = 1 to amount) I.get_product(get_turf(src)) update_icon() - + var/vend_state = "[icon_state]-vend" + if (check_state_in_icon(vend_state, icon)) //Show the vending animation if needed + flick(vend_state, src) return 1 return 0 @@ -311,12 +250,3 @@ update_icon() return 1 -/************************ -* Secure SmartFridges -*************************/ - -/obj/machinery/smartfridge/secure/CanUseTopic(mob/user, datum/topic_state/state, href_list) - if(!allowed(user) && !emagged && locked != -1 && href_list && href_list["vend"] && scan_id) - to_chat(user, "Access denied.") - return STATUS_CLOSE - return ..() \ No newline at end of file diff --git a/code/game/machinery/smartfridge/_smartfridge_secure.dm b/code/game/machinery/smartfridge/_smartfridge_secure.dm new file mode 100644 index 000000000000..25ba47725b70 --- /dev/null +++ b/code/game/machinery/smartfridge/_smartfridge_secure.dm @@ -0,0 +1,22 @@ +/************************ +* Secure SmartFridges +*************************/ +/obj/machinery/smartfridge/secure + is_secure = 1 + +/obj/machinery/smartfridge/secure/CanUseTopic(mob/user, datum/topic_state/state, href_list) + if(!allowed(user) && !emagged && locked != -1 && href_list && href_list["vend"] && scan_id) + to_chat(user, SPAN_WARNING("Access denied.")) + var/vend_state = "[icon_state]-deny" + if (check_state_in_icon(vend_state, icon)) //Show the vending animation if needed + flick(vend_state, src) + return STATUS_CLOSE + return ..() + +/obj/machinery/smartfridge/secure/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + emagged = 1 + locked = -1 + req_access.Cut() + to_chat(user, SPAN_NOTICE("You short out the product lock on \the [src].")) + return 1 diff --git a/code/game/machinery/smartfridge/chemistry.dm b/code/game/machinery/smartfridge/chemistry.dm new file mode 100644 index 000000000000..486a812d2816 --- /dev/null +++ b/code/game/machinery/smartfridge/chemistry.dm @@ -0,0 +1,9 @@ +/obj/machinery/smartfridge/chemistry + name = "\improper Smart Chemical Storage" + desc = "A refrigerated storage unit for medicine and chemical storage." + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_chem.dmi' + +/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O) + if(istype(O,/obj/item/pill_bottle) || istype(O,/obj/item/chems)) + return 1 + return 0 diff --git a/code/game/machinery/smartfridge/drinks.dm b/code/game/machinery/smartfridge/drinks.dm new file mode 100644 index 000000000000..f90f23e2d4b0 --- /dev/null +++ b/code/game/machinery/smartfridge/drinks.dm @@ -0,0 +1,9 @@ +/obj/machinery/smartfridge/drinks + name = "\improper Drink Showcase" + desc = "A refrigerated storage unit for tasty tasty alcohol." + icon = 'icons/obj/machines/smartfridges/dark.dmi' + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_drink.dmi' + +/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O) + if(istype(O,/obj/item/chems/glass) || istype(O,/obj/item/chems/drinks) || istype(O,/obj/item/chems/condiment)) + return 1 diff --git a/code/game/machinery/smartfridge/drying_oven.dm b/code/game/machinery/smartfridge/drying_oven.dm new file mode 100644 index 000000000000..ece54b6c8c3a --- /dev/null +++ b/code/game/machinery/smartfridge/drying_oven.dm @@ -0,0 +1,35 @@ +/obj/machinery/smartfridge/drying_oven + name = "drying oven" + desc = "A machine for drying plants." + icon = 'icons/obj/machines/smartfridges/drying_oven.dmi' + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_plants.dmi' + obj_flags = OBJ_FLAG_ANCHORABLE + atom_flags = ATOM_FLAG_CLIMBABLE + +/obj/machinery/smartfridge/drying_oven/accept_check(var/obj/item/O) + return istype(O) && O.is_dryable() + +/obj/machinery/smartfridge/drying_oven/Process() + ..() + if(inoperable()) + return + var/do_update = FALSE + for(var/obj/item/thing in get_contained_external_atoms()) + var/obj/item/product = thing.dry_out(src, silent = TRUE) + if(product) + product.dropInto(loc) + do_update = TRUE + if(QDELETED(thing) || !(thing in contents)) + for(var/datum/stored_items/I in item_records) + I.instances -= thing + if(do_update) + update_icon() + +/obj/machinery/smartfridge/drying_oven/on_update_icon() + if(!inoperable()) + for(var/datum/stored_items/I in item_records) + if(I.get_amount()) + cut_overlays() + icon_state = "[initial(icon_state)]-closed" + return + return ..() diff --git a/code/game/machinery/smartfridge/foods.dm b/code/game/machinery/smartfridge/foods.dm new file mode 100644 index 000000000000..7992aaee6bcb --- /dev/null +++ b/code/game/machinery/smartfridge/foods.dm @@ -0,0 +1,9 @@ +/obj/machinery/smartfridge/foods + name = "\improper Hot Foods Display" + desc = "A heated storage unit for piping hot meals." + icon = 'icons/obj/machines/smartfridges/food.dmi' + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_food.dmi' + +/obj/machinery/smartfridge/foods/accept_check(var/obj/item/O) + if(istype(O,/obj/item/food) || istype(O,/obj/item/utensil)) + return 1 diff --git a/code/game/machinery/smartfridge/medbay.dm b/code/game/machinery/smartfridge/medbay.dm new file mode 100644 index 000000000000..c1361990e87a --- /dev/null +++ b/code/game/machinery/smartfridge/medbay.dm @@ -0,0 +1,15 @@ + +/obj/machinery/smartfridge/secure/medbay + name = "\improper Refrigerated Medicine Storage" + desc = "A refrigerated storage unit for storing medicine and chemicals." + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_chem.dmi' + initial_access = list(list(access_medical, access_chemistry)) + +/obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O) + if(istype(O,/obj/item/chems/glass)) + return 1 + if(istype(O,/obj/item/pill_bottle)) + return 1 + if(istype(O,/obj/item/chems/pill)) + return 1 + return 0 diff --git a/code/game/machinery/smartfridge/produce.dm b/code/game/machinery/smartfridge/produce.dm new file mode 100644 index 000000000000..b7ef607b1b5d --- /dev/null +++ b/code/game/machinery/smartfridge/produce.dm @@ -0,0 +1,6 @@ +/obj/machinery/smartfridge/produce + name = "produce smartfridge" + desc = "A refrigerated storage unit for fruits and vegetables." + +/obj/machinery/smartfridge/produce/accept_check(var/obj/item/O) + return istype(O, /obj/item/food/grown) diff --git a/code/game/machinery/smartfridge/seeds.dm b/code/game/machinery/smartfridge/seeds.dm new file mode 100644 index 000000000000..9aa1259e5283 --- /dev/null +++ b/code/game/machinery/smartfridge/seeds.dm @@ -0,0 +1,8 @@ +/obj/machinery/smartfridge/seeds + name = "\improper MegaSeed Servitor" + desc = "When you need seeds fast!" + +/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O) + if(istype(O,/obj/item/seeds/)) + return 1 + return 0 diff --git a/code/game/machinery/smartfridge/sheets.dm b/code/game/machinery/smartfridge/sheets.dm new file mode 100644 index 000000000000..a1e9c3be5f84 --- /dev/null +++ b/code/game/machinery/smartfridge/sheets.dm @@ -0,0 +1,6 @@ +/obj/machinery/smartfridge/sheets + name = "raw material storage" + desc = "A storage unit for bundles of material sheets, ingots and other shapes." + +/obj/machinery/smartfridge/sheets/accept_check(var/obj/item/O) + return istype(O, /obj/item/stack/material) diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm index fc318b706478..0608095c2975 100644 --- a/code/game/machinery/vending/_vending.dm +++ b/code/game/machinery/vending/_vending.dm @@ -4,8 +4,8 @@ /obj/machinery/vending name = "Vendomat" desc = "A generic vending machine." - icon = 'icons/obj/vending.dmi' - icon_state = "generic" + icon = 'icons/obj/machines/vending/generic.dmi' + icon_state = ICON_STATE_WORLD layer = BELOW_OBJ_LAYER anchored = TRUE density = TRUE @@ -20,9 +20,6 @@ wires = /datum/wires/vending required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES - var/icon_vend //Icon_state when vending - var/icon_deny //Icon_state when denying access - // Power var/vend_power_usage = 150 //actuators and stuff @@ -359,8 +356,11 @@ return if((!allowed(user)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH to_chat(user, "Access denied.")//Unless emagged of course - flick(icon_deny,src) + var/deny_state = "[icon_state]-deny" + if(check_state_in_icon(deny_state, icon)) + flick(deny_state, src) return + vend_ready = 0 //One thing at a time!! status_message = "Vending..." status_error = 0 @@ -369,8 +369,9 @@ do_vending_reply() use_power_oneoff(vend_power_usage) //actuators and stuff - if (icon_vend) //Show the vending animation if needed - flick(icon_vend,src) + var/vend_state = "[icon_state]-vend" + if (check_state_in_icon(vend_state, icon)) //Show the vending animation if needed + flick(vend_state, src) addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/vending, finish_vending), R), vend_delay) /obj/machinery/vending/proc/do_vending_reply() diff --git a/code/game/machinery/vending/actors.dm b/code/game/machinery/vending/actors.dm index 6ab863b7612d..0dac1d09962a 100644 --- a/code/game/machinery/vending/actors.dm +++ b/code/game/machinery/vending/actors.dm @@ -3,9 +3,7 @@ /obj/machinery/vending/props name = "prop dispenser" desc = "All the props an actor could need. Probably." - icon_state = "theater" - icon_vend = "theater-vend" - icon_deny = "theater-deny" + icon = 'icons/obj/machines/vending/theater.dmi' products = list( /obj/structure/flora/pottedplant = 2, /obj/item/flashlight/lamp = 2, @@ -24,7 +22,7 @@ /obj/machinery/vending/containers name = "container dispenser" desc = "A container that dispenses containers." - icon_state = "robotics" + icon = 'icons/obj/machines/vending/robotics.dmi' base_type = /obj/machinery/vending/containers products = list( /obj/structure/closet/crate/freezer = 2, diff --git a/code/game/machinery/vending/botany.dm b/code/game/machinery/vending/botany.dm index 9f29ac496edc..b1042ee71ea8 100644 --- a/code/game/machinery/vending/botany.dm +++ b/code/game/machinery/vending/botany.dm @@ -4,9 +4,7 @@ desc = "A plant nutrients vendor." product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!" product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..." - icon_state = "nutri" - icon_deny = "nutri-deny" - icon_vend = "nutri-vend" + icon = 'icons/obj/machines/vending/nutrimat.dmi' vend_delay = 26 base_type = /obj/machinery/vending/hydronutrients products = list( @@ -22,18 +20,14 @@ markup = 0 /obj/machinery/vending/hydronutrients/generic - icon_state = "nutri_generic" - icon_vend = "nutri_generic-vend" - icon_deny = "nutri_generic-deny" + icon = 'icons/obj/machines/vending/nutri_green.dmi' /obj/machinery/vending/hydroseeds name = "MegaSeed Servitor" desc = "When you need seeds fast!" product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection this half of the galaxy!;Also certain mushroom varieties available, more for experts! Get certified today!" product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" - icon_state = "seeds" - icon_vend = "seeds-vend" - icon_deny = "seeds-deny" + icon = 'icons/obj/machines/vending/seeds_green.dmi' vend_delay = 13 base_type = /obj/machinery/vending/hydroseeds markup = 0 @@ -85,6 +79,4 @@ ) /obj/machinery/vending/hydroseeds/generic - icon_state = "seeds_generic" - icon_vend = "seeds_generic-vend" - icon_deny = "seeds_generic-deny" + icon = 'icons/obj/machines/vending/seeds_grey.dmi' diff --git a/code/game/machinery/vending/cigs.dm b/code/game/machinery/vending/cigs.dm index b54fa328b69c..e5cb5a43b02b 100644 --- a/code/game/machinery/vending/cigs.dm +++ b/code/game/machinery/vending/cigs.dm @@ -21,9 +21,7 @@ We understand the depressed, alcoholic cowboy in you. That's why we also smoke Jericho.;\ Professionals. Better cigarettes for better people. Yes, better people." vend_delay = 21 - icon_state = "cigs" - icon_vend = "cigs-vend" - icon_deny = "cigs-deny" + icon = 'icons/obj/machines/vending/cigarettes.dmi' base_type = /obj/machinery/vending/cigarette products = list( /obj/item/cigpaper/filters = 5, diff --git a/code/game/machinery/vending/engineering.dm b/code/game/machinery/vending/engineering.dm index d23ee004bdbd..6eda475db41f 100644 --- a/code/game/machinery/vending/engineering.dm +++ b/code/game/machinery/vending/engineering.dm @@ -2,9 +2,7 @@ name = "YouTool" desc = "Tools for tools." markup = 0 - icon_state = "tool" - icon_deny = "tool-deny" - icon_vend = "tool-vend" + icon = 'icons/obj/machines/vending/tool.dmi' vend_delay = 11 base_type = /obj/machinery/vending/tool products = list( @@ -29,9 +27,7 @@ /obj/machinery/vending/engivend name = "Engi-Vend" desc = "Spare tool vending. What? Did you expect some witty description?" - icon_state = "engivend" - icon_deny = "engivend-deny" - icon_vend = "engivend-vend" + icon = 'icons/obj/machines/vending/engivend.dmi' markup = 0 vend_delay = 21 base_type = /obj/machinery/vending/engivend @@ -52,9 +48,7 @@ /obj/machinery/vending/engineering name = "Robco Tool Maker" desc = "Everything you need for do-it-yourself repair." - icon_state = "engi" - icon_deny = "engi-deny" - icon_vend = "engi-vend" + icon = 'icons/obj/machines/vending/engivend.dmi' base_type = /obj/machinery/vending/engineering markup = 0 initial_access = list(access_atmospherics, access_engine_equip) @@ -87,9 +81,7 @@ /obj/machinery/vending/robotics name = "Robotech Deluxe" desc = "All the tools you need to create your own robot army." - icon_state = "robotics" - icon_deny = "robotics-deny" - icon_vend = "robotics-vend" + icon = 'icons/obj/machines/vending/robotics.dmi' initial_access = list(access_robotics) base_type = /obj/machinery/vending/robotics products = list( @@ -108,9 +100,7 @@ /obj/machinery/vending/materials name = "MatterVend" desc = "Provides access to baryonic matter in easy to handle sheet form." - icon_state = "engivend" - icon_deny = "engivend-deny" - icon_vend = "engivend-vend" + icon = 'icons/obj/machines/vending/engivend.dmi' markup = 0 vend_delay = 21 base_type = /obj/machinery/vending/materials diff --git a/code/game/machinery/vending/food.dm b/code/game/machinery/vending/food.dm index c435303b96ad..8abc07f5536a 100644 --- a/code/game/machinery/vending/food.dm +++ b/code/game/machinery/vending/food.dm @@ -4,9 +4,7 @@ desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars." product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" - icon_state = "snack" - icon_vend = "snack-vend" - icon_deny = "snack-deny" + icon = 'icons/obj/machines/vending/snacks.dmi' vend_delay = 25 base_type = /obj/machinery/vending/snack products = list( @@ -33,10 +31,7 @@ vend_delay = 30 base_type = /obj/machinery/vending/snix product_slogans = "Snix!" - - icon_state = "snix" - icon_vend = "snix-vend" - icon_deny = "snix-deny" + icon = 'icons/obj/machines/vending/snix.dmi' products = list(/obj/item/food/junk/semki = 7, /obj/item/food/can/caviar = 7, /obj/item/food/junk/squid = 7, @@ -58,9 +53,7 @@ desc = "A SolCentric vending machine dispensing treats from home." vend_delay = 30 product_slogans = "A taste of home!" - icon_state = "solsnack" - icon_vend = "solsnack-vend" - icon_deny = "solsnack-deny" + icon = 'icons/obj/machines/vending/solsnacks.dmi' products = list( /obj/item/food/junk/lunacake = 8, /obj/item/food/junk/lunacake/mochicake = 8, @@ -79,9 +72,7 @@ desc = "A distressingly ethnic vending machine loaded with high sucrose low calorie for lack of better words snacks." vend_delay = 30 product_slogans = "Konnichiwa gaijin senpai! ;Notice me senpai!; Kawaii-desu!" - icon_state = "weeb" - icon_vend = "weeb-vend" - icon_deny = "weeb-deny" + icon = 'icons/obj/machines/vending/weeb.dmi' products = list( /obj/item/food/junk/weebonuts = 8, /obj/item/food/junk/ricecake = 8, @@ -100,10 +91,7 @@ desc = "An old vending machine promising 'hot foods'. You doubt any of its contents are still edible." vend_delay = 40 base_type = /obj/machinery/vending/hotfood - - icon_state = "hotfood" - icon_deny = "hotfood-deny" - icon_vend = "hotfood-vend" + icon = 'icons/obj/machines/vending/hotfood.dmi' products = list(/obj/item/food/old/pizza = 1, /obj/item/food/old/burger = 1, /obj/item/food/old/hamburger = 1, @@ -120,8 +108,7 @@ /obj/machinery/vending/boozeomat name = "Booze-O-Mat" desc = "A refrigerated vending unit for alcoholic beverages and alcoholic beverage accessories." - icon_state = "fridge_dark" - icon_deny = "fridge_dark-deny" + icon = 'icons/obj/machines/vending/bar.dmi' markup = 0 products = list( /obj/item/chems/drinks/glass2/square = 10, @@ -183,9 +170,7 @@ name = "Hot Drinks machine" desc = "A vending machine which dispenses hot drinks and hot drinks accessories." product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies" - icon_state = "coffee" - icon_vend = "coffee-vend" - icon_deny = "coffee-deny" + icon = 'icons/obj/machines/vending/coffee.dmi' vend_delay = 34 base_type = /obj/machinery/vending/coffee idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. @@ -206,7 +191,7 @@ /obj/machinery/vending/coffee/on_update_icon() ..() - if(stat & BROKEN && prob(20)) + if((stat & BROKEN) && prob(20)) icon_state = "[initial(icon_state)]-hellfire" else if(!(stat & NOPOWER)) add_overlay("[initial(icon_state)]-screen") @@ -214,9 +199,7 @@ /obj/machinery/vending/cola name = "Robust Softdrinks" desc = "A softdrink vendor provided by Robust Industries, LLC." - icon_state = "Cola_Machine" - icon_vend = "Cola_Machine-vend" - icon_deny = "Cola_Machine-deny" + icon = 'icons/obj/machines/vending/drinks.dmi' vend_delay = 11 base_type = /obj/machinery/vending/cola product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" @@ -245,9 +228,7 @@ desc = "An exercise aid and nutrition supplement vendor that preys on your inadequacy." product_slogans = "SweatMAX, get robust!" product_ads = "Pain is just weakness leaving the body!;Run! Your fat is catching up to you;Never forget leg day!;Push out!;This is the only break you get today.;Don't cry, sweat!;Healthy is an outfit that looks good on everybody." - icon_state = "fitness" - icon_vend = "fitness-vend" - icon_deny = "fitness-deny" + icon = 'icons/obj/machines/vending/fitness.dmi' vend_delay = 6 base_type = /obj/machinery/vending/fitness products = list( @@ -272,9 +253,7 @@ /obj/machinery/vending/sovietsoda name = "BODA" desc = "An old soda vending machine. How could this have got here?" - icon_state = "sovietsoda" - icon_vend = "sovietsoda-vend" - icon_deny = "sovietsoda-deny" + icon = 'icons/obj/machines/vending/soviet.dmi' base_type = /obj/machinery/vending/sovietsoda product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem." products = list( diff --git a/code/game/machinery/vending/medical.dm b/code/game/machinery/vending/medical.dm index a974f0767da9..4796499cbe39 100644 --- a/code/game/machinery/vending/medical.dm +++ b/code/game/machinery/vending/medical.dm @@ -2,9 +2,7 @@ /obj/machinery/vending/medical name = "NanoMed Plus" desc = "Medical drug dispenser." - icon_state = "med" - icon_deny = "med-deny" - icon_vend = "med-vend" + icon = 'icons/obj/machines/vending/medical.dmi' vend_delay = 18 markup = 0 base_type = /obj/machinery/vending/medical @@ -38,9 +36,7 @@ name = "NanoMed" desc = "A wall-mounted version of the NanoMed." product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" - icon_state = "wallmed" - icon_deny = "wallmed-deny" - icon_vend = "wallmed-vend" + icon = 'icons/obj/machines/vending/wallmed.dmi' base_type = /obj/machinery/vending/wallmed1 density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude products = list( @@ -61,9 +57,7 @@ name = "NanoMed Mini" desc = "A wall-mounted version of the NanoMed, containing only vital first aid equipment." product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" - icon_state = "wallmed" - icon_deny = "wallmed-deny" - icon_vend = "wallmed-vend" + icon = 'icons/obj/machines/vending/wallmed.dmi' density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude base_type = /obj/machinery/vending/wallmed2 products = list( diff --git a/code/game/machinery/vending/misc.dm b/code/game/machinery/vending/misc.dm index 7fc59e043707..a9386e3930e9 100644 --- a/code/game/machinery/vending/misc.dm +++ b/code/game/machinery/vending/misc.dm @@ -1,9 +1,7 @@ /obj/machinery/vending/magivend name = "MagiVend" desc = "A magic vending machine." - icon_state = "MagiVend" - icon_deny = "MagiVend-deny" - icon_vend = "MagiVend-vend" + icon = 'icons/obj/machines/vending/magic.dmi' product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!" vend_delay = 15 vend_reply = "Have an enchanted evening!" @@ -20,9 +18,7 @@ name = "Dinnerware" desc = "A kitchen and restaurant equipment vendor." product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." - icon_state = "dinnerware" - icon_vend = "dinnerware-vend" - icon_deny = "dinnerware-deny" + icon = 'icons/obj/machines/vending/dinnerware.dmi' markup = 0 base_type = /obj/machinery/vending/dinnerware products = list( @@ -52,7 +48,7 @@ name = "Smashing Fashions" desc = "For all your cheap knockoff needs." product_slogans = "Look smashing for your darling!;Be rich! Dress rich!" - icon_state = "theater" + icon = 'icons/obj/machines/vending/theater.dmi' vend_delay = 15 base_type = /obj/machinery/vending/fashionvend vend_reply = "Absolutely smashing!" @@ -78,9 +74,7 @@ vend_delay = 15 product_slogans = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!" product_ads = "Elves and dwarves!;Totally not satanic!;Fun times forever!" - icon_state = "games" - icon_deny = "games-deny" - icon_vend = "games-vend" + icon = 'icons/obj/machines/vending/games.dmi' base_type = /obj/machinery/vending/games products = list( /obj/item/toy/blink = 5, @@ -113,10 +107,7 @@ desc = "Vends things that make you less reviled in the work-place!" vend_delay = 15 product_slogans = "Take a shower you hippie.;Get a haircut, hippie!;Reeking of scale taint? Take a shower!" - - icon_state = "lavatory" - icon_deny = "lavatory-deny" - icon_vend = "lavatory-vend" + icon = 'icons/obj/machines/vending/lavatory.dmi' base_type = /obj/machinery/vending/lavatory products = list( /obj/item/soap = 12, diff --git a/code/game/machinery/vending/security.dm b/code/game/machinery/vending/security.dm index 225762761604..17b2a6cc88d8 100644 --- a/code/game/machinery/vending/security.dm +++ b/code/game/machinery/vending/security.dm @@ -3,9 +3,7 @@ name = "SecTech" desc = "A security equipment vendor." product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" - icon_state = "sec" - icon_deny = "sec-deny" - icon_vend = "sec-vend" + icon = 'icons/obj/machines/vending/security.dmi' vend_delay = 14 markup = 0 base_type = /obj/machinery/vending/security diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index b3e91da69ba6..a4356724b358 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -385,8 +385,8 @@ /obj/random/vendor name = "random vending machine" desc = "This is a randomly selected vending machine." - icon = 'icons/obj/vending.dmi' - icon_state = "coffee-hellfire" + icon = 'icons/obj/machines/vending/coffee.dmi' + icon_state = "world-hellfire" /obj/random/vendor/spawn_choices() var/static/list/spawnable_choices = list( diff --git a/code/modules/acting/acting_items.dm b/code/modules/acting/acting_items.dm index ac454ee59754..43fab6332707 100644 --- a/code/modules/acting/acting_items.dm +++ b/code/modules/acting/acting_items.dm @@ -1,8 +1,8 @@ /obj/machinery/acting/wardrobe name = "wardrobe dispenser" desc = "A machine that dispenses holo-clothing for those in need." - icon = 'icons/obj/vending.dmi' - icon_state = "cart" + icon = 'icons/obj/machines/vending/cartridges.dmi' + icon_state = ICON_STATE_WORLD anchored = TRUE density = TRUE var/active = 1 diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 01887107c99d..2d609cf629e3 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -24,8 +24,8 @@ /obj/machinery/seed_storage name = "Seed storage" desc = "It stores, sorts, and dispenses seeds." - icon = 'icons/obj/vending.dmi' - icon_state = "seeds" + icon = 'icons/obj/machines/vending/seeds_grey.dmi' + icon_state = ICON_STATE_WORLD density = TRUE anchored = TRUE idle_power_usage = 100 diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 06d4626f1474..f4de33b53613 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -3,8 +3,8 @@ /obj/machinery/lapvend name = "computer vendor" desc = "A vending machine with a built-in microfabricator, capable of dispensing various computers." - icon = 'icons/obj/vending.dmi' - icon_state = "laptop" + icon = 'icons/obj/machines/vending/laptops.dmi' + icon_state = ICON_STATE_WORLD layer = BELOW_OBJ_LAYER anchored = TRUE density = TRUE @@ -278,7 +278,7 @@ if(state == 2) if(process_payment(W)) fabricate_and_recalc_price(1) - flick("laptop-vend", src) + flick("world-vend", src) if((devtype == 1) && fabricated_laptop) fabricated_laptop.forceMove(src.loc) fabricated_laptop.update_icon() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 22877a3e341d..149d3b453de0 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -256,7 +256,7 @@ /obj/structure/reagent_dispensers/water_cooler name = "water cooler" desc = "A machine that dispenses cool water to drink." - icon = 'icons/obj/vending.dmi' + icon = 'icons/obj/structures/water_cooler.dmi' icon_state = "water_cooler" possible_transfer_amounts = null amount_dispensed = 5 @@ -299,10 +299,15 @@ qdel(C) cups++ return TRUE + return ..() +/obj/structure/reagent_dispensers/water_cooler/on_reagent_change() . = ..() - if(!. && ATOM_IS_OPEN_CONTAINER(W)) - flick("[icon_state]-vend", src) + // Bubbles in top of cooler. + if(reagents?.total_volume) + var/vend_state = "[icon_state]-vend" + if(check_state_in_icon(vend_state, icon)) + flick(vend_state, src) /obj/structure/reagent_dispensers/beerkeg name = "beer keg" diff --git a/code/unit_tests/icon_tests.dm b/code/unit_tests/icon_tests.dm index f2894e862e3a..c3a49677a90e 100644 --- a/code/unit_tests/icon_tests.dm +++ b/code/unit_tests/icon_tests.dm @@ -195,3 +195,103 @@ else pass("All preview icons have all background icon states.") return 1 + +/datum/unit_test/icon_test/smartfridges + name = "ICON_STATE - Smartfridges Will Have All Needed Icon States" + +/datum/unit_test/icon_test/smartfridges/start_test() + var/list/failures = list() + var/list/test_icons = list() + var/list/test_contents_overlays = list() + for(var/obj/machinery/smartfridge/fridge as anything in typesof(/obj/machinery/smartfridge)) + if(TYPE_IS_ABSTRACT(fridge) || !fridge::simulated) + continue + var/fridge_icon = fridge::icon + if(fridge_icon) + test_icons |= fridge_icon + else + failures += "[fridge] has null icon" + var/fridge_state = fridge::icon_state + if(fridge_state != ICON_STATE_WORLD) + failures += "[fridge] has non-world icon_state '[fridge_state]'" + var/fridge_contents_icon = fridge::overlay_contents_icon + if(fridge_contents_icon) + test_contents_overlays |= fridge_contents_icon + + for(var/test_icon in test_icons) + var/static/list/fridge_states = list( + "world", + "world-vend", + "world-deny", + "world-off", + "world-broken", + "world-panel", + "world-top", + "world-top-broken", + "world-broken", + "world-sidepanel", + "world-sidepanel-broken" + ) + for(var/test_state in fridge_states) + if(!check_state_in_icon(test_state, test_icon)) + failures += "[test_icon] missing icon_state [test_state]" + + for(var/test_icon in test_contents_overlays) + var/static/list/test_overlays = list( + "empty", + "1", + "2", + "3", + "4", + "empty-off", + "1-off", + "2-off", + "3-off", + "4-off" + ) + for(var/test_overlay in test_overlays) + if(!check_state_in_icon(test_overlay, test_icon)) + failures += "[test_icon] missing overlay [test_overlay]" + + if(length(failures)) + fail("Missing smartfridge icons or icon states:\n\t-[jointext(failures, "\n\t-")]") + else + pass("All smartfridges have all icons and icon states.") + return 1 + +/datum/unit_test/icon_test/vendors + name = "ICON_STATE - Vending Machines Will Have All Needed Icon States" + +/datum/unit_test/icon_test/vendors/start_test() + var/list/failures = list() + var/list/test_icons = list() + + for(var/obj/machinery/vending/vendor as anything in typesof(/obj/machinery/vending)) + if(TYPE_IS_ABSTRACT(vendor) || !vendor::simulated) + continue + var/vendor_icon = vendor::icon + if(vendor_icon) + test_icons |= vendor_icon + else + failures += "[vendor] has null icon" + var/vendor_state = vendor::icon_state + if(vendor_state != ICON_STATE_WORLD) + failures += "[vendor] has non-world icon_state '[vendor_state]'" + + for(var/test_icon in test_icons) + var/static/list/vendor_states = list( + "world", + "world-vend", + "world-deny", + "world-off", + "world-broken", + "world-panel", + ) + for(var/test_state in vendor_states) + if(!check_state_in_icon(test_state, test_icon)) + failures += "[test_icon] missing icon_state [test_state]" + + if(length(failures)) + fail("Missing vendor icons or icon states:\n\t-[jointext(failures, "\n\t-")]") + else + pass("All vendors have all icons and icon states.") diff --git a/icons/obj/machines/smartfridges/contents_chem.dmi b/icons/obj/machines/smartfridges/contents_chem.dmi new file mode 100644 index 0000000000000000000000000000000000000000..652eb6a7a29eb30e65914c86587fcd5affd6735c GIT binary patch literal 1925 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/smartfridges/contents_food.dmi b/icons/obj/machines/smartfridges/contents_food.dmi new file mode 100644 index 0000000000000000000000000000000000000000..34c205c5013d97a6828cc0b24aac9e962f1bcf94 GIT binary patch literal 1784 zcmYjSdoRKW+_r-d4&i;76=lh=Xp7;Hp^F8nR3IhB*!P>^! z004l!y-!cyyt zf^YnQuguPW_@thaR~CgW!pG%8ZBDy*IQRt8oX>k%Sok_Qdz?BG9-9~(a@GUwbH>Bo z#s9o-L@XNR>1*%kr&(JNwurauB?({QXt04e?qp-^X9teL9{}xg) zSHdd^f}pLw?z~eQSU`iHXk#9!)nK#b8H6Fv9>ui%k~xrnM>{qL>U-!uzz#tmtqWUd z1%dIXThQ3MLFGbpU6XKGq;(Sltoh?xzk2~y0>FU=Zc7<_PKey08nz+^R zWj@(1DGRSggwLG$sG!btY$EP@s2HusAN#B(XOYx4bWd9cGP2WPa=N$wk~}jm;==0` zN>Bf|Nz*w{up?HEg%u6zW95x2d6T~<>Zf&3K-AHtF1PYF<%A>_6m0wKw znH`&B%UD+m7rw$r3OM~BJIk#Tc3u)eVzpcEl1iNTu8WRR&VO#gEX|M3dw7{NTrakx zjzhZL>eXkf`X_Lizgb+^3^4-w>Zy^_Z$k$^>;XHqB=YIndf4Jxn?^ z!A%pO)Q9{LFkDL-p87*oLJSEOVSiL&kxo2e0kD^IUoF|O`azcfj~xzNe4=mwf=a(6&80oUy-H4^lq6l0JzoGLg) zZBO8OQu8$&G788l1jlK#B3lM9haV+Hp6a2j4rEZ1Ci#L&8d=+N&&PGt^COF;8NE&jsK2$3m$Ps4#z;~;i9}{8T^?Z{79|` z*9N)WPq-`YUS^2$UWbrxuV7jVc}~=Qb19VO9tIoMWwPZ|-l$}UDM>B%W3CnsT(oRZ zJXA|geJg$ahYNRJhMV2$p6BC*&|>UUJ#Q7`ST%cN{Tk18VNPvtmfoTE$Vw=wal5bn zL-m5Tj;j>(PVDN@?^1GOsl7V$&7HDdwUx}1)N?(P+I!nXM{KwMcWQW#T81cZILZIl zuu5?oS2`grwz?uF-1z~)t+W@t4Qms)RVX{PW3?h!;y_)u`^LAf8Hv$ zuWVGll|~6~a7+f1Z9{354{BuFWO{`L7Nu1^*|j5~N>$Mwt03zwCclzt#ztXtOf{Yq zm_3yj4U4-xE38$lzZMPo9G^Ry?Ogx7_Jfn@Q@1pImcSR=znY~nbcAhFG|Fb6OWym{ zb_VzM);B!tgTEKvD0JWPlO+e+COzeZF|kwffAQ;ugiXfq-n$mpsI-p7zo7}E&<{0# O3E=JShhm+J$@vFGDXM4y literal 0 HcmV?d00001 diff --git a/icons/obj/machines/smartfridges/contents_plants.dmi b/icons/obj/machines/smartfridges/contents_plants.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c51a11f5e925e8c1a6c51112f8fa39a00673202a GIT binary patch literal 801 zcmV++1K#|JP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DK)pCq*95CGbOXA7^I1dGp#5wHxmUuQVD*NrbtcY zIB~9D`ckL&jE%2uoW!zk-y4kxA*aE3%k7n-z7R|%GDAc^-3iP)yeO~RW%~iRe!Qdo z9ZL1n`yIxwzzku%RRDnMpRAAMvb=7W?FZm`?RQAS?)BPVslMUx-(i4;QKD>^rOL}< zm7n&qAcPRoJwwflhj}mF$ns*mx%;lw+wL&Sg(ragX6YPunD-Xd9URJwi~Mm_tFNMT z0ubaqOkX9ybE=QwkHj$kh4h8r^}EC{OCf#njXkXW4Y$kU4bn3&4#5!2dj<)f7s0$| zu%5wr5zKoA=_~UhA%vVC!RJM18j5C(dC#T)H$-MQ|7ex>YBA3^&Kc&O2hCCxh!btVJNFFdKk*;i!jpq zqK6^#9wCJEPVn`?76MB@DX6d17n=nt{iG$3n`k=L+^q5HdNnx!0q{oDXknjzq{iHC`eo`1|KPe2CMfir&eo`1|KPil~ fpA?39k2LTHdZ6FYSpG-Z00000NkvXXu0mjfj)iq% literal 0 HcmV?d00001 diff --git a/icons/obj/machines/smartfridges/dark.dmi b/icons/obj/machines/smartfridges/dark.dmi new file mode 100644 index 0000000000000000000000000000000000000000..27eb86d54c7667024d07c5665cf44d06263aa452 GIT binary patch literal 4902 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 AEdT%j literal 0 HcmV?d00001 diff --git a/icons/obj/machines/smartfridges/food.dmi b/icons/obj/machines/smartfridges/food.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0c690607da185c0dce6b7b1b68cf9d663aeebd39 GIT binary patch literal 4635 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 Bq6q*1 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/cartridges.dmi b/icons/obj/machines/vending/cartridges.dmi new file mode 100644 index 0000000000000000000000000000000000000000..927d474e441b692f7f05de4b679fa21c48ecb6c2 GIT binary patch literal 1226 zcmV;*1U37KP)C0000>P)t-sz`(#$ zM^NtW?#sr$m6eqLC-4-V{yh@3Z0larHXW@e9% zkGixWBqSsNGnoKFLYXr&4=FOtdjzQf0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pS zoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`QB~=drRL#KY6=uh%}J~TF?9^| zOm!e6P)SaHegQVKQd09Ov72R%Fw0N}38I^jpO!|XyOWCYvs3ekR9ujlmzsl1t+Ilv zp9?sg0i2;`u8n6=lmGw&bV)=(RCt{2SPOfiFc1V`p(1xZu9o)y|I*7wsCg{e@K{QZ z?5FtYtYk6?=uDRB$|owzcET?OS@~Xg5pIyj!wu4SBA^@S%6GwaLrE6wf@e@%Dzn@M zX*`2VRoC@Xn94nYFrGnK)kXc>8oB`hs__KExNfi+Dw!@XSMvmt_=90#GOWRyfgnCI z93Gci0YJ<^495msqVZ8{iR>AO;@F^wJ?N=ptv88115un{=>!hQ=&n2BJ7NsJG46lbFHnc5A+#6y6vebH7g$uxH?(z`;ENGro@v zty$i$nJ`YQ5j<*g4Sn34;@t1+26GKmL#a$d85m$K{tGKaAXob2ffIPRGec{D7y`~3 zc@m1^s-X=3rxV7pVWMCcJcH@l1wTZkd?4imiGZm8Px(N~2acH!{H|Y5o)0(*oG>2< zE8y+o|1ckL6)@@~`GBLqx90<^{Cz~e;Ny-0tNeXLz7WKZkq@l#_iOP@{68@HLI_{t z@4b8gn0z6Gr+gsg1Ba-T52Sn`5fJtNDIZArfJ{DM{Hr}_KHw{GwtT==;EeeIt-zV` z0q-jK;rRfp@%LNg1AYT+=l_33J|OA;qw)cO<^Fz?e86eg)c>b^Amsxbeu$Fx|Lpjz ze`oPBgtO!G=8?xsfj{JnMi;_V;O_|nlmY_-jbG;}!1#M&32Yofcnkr?-&4EXR>0^07hj;jf~x>V z5}n_lDLJ@C{|Om9 ohQLJ4_y0iPJb~%j1V48D15#k{s(d$ckN^Mx07*qoM6N<$f;lWX0ssI2 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/cigarettes.dmi b/icons/obj/machines/vending/cigarettes.dmi new file mode 100644 index 0000000000000000000000000000000000000000..83870f29f06b6e5cbaede83701f3f7d71a64bd42 GIT binary patch literal 3327 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/coffee.dmi b/icons/obj/machines/vending/coffee.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d4f22cabc6b72f77a05218ecec907dc311f1a2f1 GIT binary patch literal 5470 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
    6uVU7?*3BGJ?qO_U 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 I))<%YKQ=5T-~a#s literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/fitness.dmi b/icons/obj/machines/vending/fitness.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fbe9fd2a7a7e38cf5b7693e33482e020408dd8ab GIT binary patch literal 3544 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/games.dmi b/icons/obj/machines/vending/games.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e472e9421a29686d14a5eb60fa7c0e5efc390efc GIT binary patch literal 3360 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 c;fG8%uVvxv%j51ftZMIx$H|9?lIH~;_u literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/generic.dmi b/icons/obj/machines/vending/generic.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b7962898cd23d5bc822e4b0df47be980b8587c37 GIT binary patch literal 2842 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/hotfood.dmi b/icons/obj/machines/vending/hotfood.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d186fa5e3d19e453b2a65f40ec3be1cb39efd8db GIT binary patch literal 5507 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/laptops.dmi b/icons/obj/machines/vending/laptops.dmi new file mode 100644 index 0000000000000000000000000000000000000000..069ba54788355851bb7fe8f1130924397679d2ff GIT binary patch literal 3003 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 ZvrQ75J}65FsnUNjusi5TD8>6-{ud6C+KK=G literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/lavatory.dmi b/icons/obj/machines/vending/lavatory.dmi new file mode 100644 index 0000000000000000000000000000000000000000..83057f32eec8ed6d7045bd83f16e34dfc9596787 GIT binary patch literal 3348 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 Vv+|UV=l@%Pa29svRmbu1{{srKY(W43 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/magic.dmi b/icons/obj/machines/vending/magic.dmi new file mode 100644 index 0000000000000000000000000000000000000000..38a969fabe5554cd525c4ed24591f02a45281b35 GIT binary patch literal 3453 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/nutri_green.dmi b/icons/obj/machines/vending/nutri_green.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4c514e4f21523f64e22993c71c1c5de7509311c3 GIT binary patch literal 3757 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/nutri_grey.dmi b/icons/obj/machines/vending/nutri_grey.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b403fb74b0443ffe5b97e20472e561f4a749a7ea GIT binary patch literal 3631 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/nutrimat.dmi b/icons/obj/machines/vending/nutrimat.dmi new file mode 100644 index 0000000000000000000000000000000000000000..382a47df06a06b120c9468e9c67bb2382ec8d048 GIT binary patch literal 1174 zcmV;H1Zn$;P)C0001oP)t-sz`(#P zSSu=wI{*Iw3>g!xrbja(A`=x9P;rDVP-gD#?$oCob5aR>&|a~})O?ns|Fl;%q|cm& zU&Bz5#88oGS8bI4SDlAqQ%6vhm6gl@0GR+Y{{S-pLP8HIGEQ-Ye3qq6a)M5AgiUgU zPI7|4z`y`zGXOK0BqAfGpB^M6B)YUAKR-SEQm`BV0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0* zI5Sc+(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`QB~=drRL#KY77)j z%}J~TF?E0tU1v&aUL|&&W@tKL5Z#3Qv@{}JnN*aYotj6a;)2Ay)Er!Dl@(n5T)?3U z0B%oWz68uxpa1{^5J^NqRCt{2Sq*dAFbs`H8tjcGg>EH;WNWwGpp^gr`z9G~As~O8 zQ`@=K?;sraBw3PWCswiy!ANBP;G56bry*uDxUg`1av(X7u^9mtj?eO|1#))>mpmLl z1qX^t;J^9MfL|U3xZv=Smx6u%vbZ+jl}Ca5lJkmJ6@TDl1YUU*DDOF6@^U2whzPv$ zQlJ!~601@?2r>e%JPL>&WCUJ$StO?d!4DaMSN=lav3yiiu}@wKd`0lGDism<+fdo%}?QZfb~8q4EW?v0-GAKQ5rDu^#)P9@S_ck4PY8m5Vr_PgyZ9bkqF06 z;B1&2NDid_Kzs*=Pb|bUomUa| z1|axR`l&xKjl=2a{=n$t`Plxz=mtgXDTrHysXss>93SLt$TWPI!zokqAH;zR4^n^N zWA+E~oaHM1zvvGPUdwIj`8D4GqHu~53=?@GXpfUhMbI8+=XK^Wm*<`?>KQM5B;JfpEK;8>JZhrudL+S?--QjUGpGWTx zov;CnSW!Uy1kYVplWung9R*07*qoM6N<$g1_btbN~PV literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/robotics.dmi b/icons/obj/machines/vending/robotics.dmi new file mode 100644 index 0000000000000000000000000000000000000000..43d48409ad1cb342bf3501764e4007d25af95d73 GIT binary patch literal 3830 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 E0Br?3H2?qr literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/security.dmi b/icons/obj/machines/vending/security.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f09df161b80bc272b0e02476913a221fd8250b48 GIT binary patch literal 3786 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 MO{|P7&mf}z3q6$DfdBvi literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/seeds_grey.dmi b/icons/obj/machines/vending/seeds_grey.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c85ba5b81f8e50abde4d8562b34a2d6b9af535d3 GIT binary patch literal 3779 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 Ih4;<>0D{ONA^-pY literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/snacks.dmi b/icons/obj/machines/vending/snacks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c5bb7ce78a07d36c932fcea9dfa10a8870e6fab9 GIT binary patch literal 3710 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/snix.dmi b/icons/obj/machines/vending/snix.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9711d5a38ca6ca8227d953590bd55dc66512bdc8 GIT binary patch literal 4362 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 C|Fo+B literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/soda.dmi b/icons/obj/machines/vending/soda.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8b6277aa483851794112df76f16f065bbc8aa8ba GIT binary patch literal 3169 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/solsnacks.dmi b/icons/obj/machines/vending/solsnacks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..55498c1e585f34f56675d1f8847ad9feb109d3b5 GIT binary patch literal 3700 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/soviet.dmi b/icons/obj/machines/vending/soviet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a16f21e429d76cb40a3e582ce463e1baffe3c535 GIT binary patch literal 3162 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 A7ytkO literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/theater.dmi b/icons/obj/machines/vending/theater.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3108ae546b0a4b2aa6931b601185851d3010d308 GIT binary patch literal 3023 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/tool.dmi b/icons/obj/machines/vending/tool.dmi new file mode 100644 index 0000000000000000000000000000000000000000..97660e4385380bb1a49e3a73623397bb0468394d GIT binary patch literal 3450 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 w%ryt<8 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/tool_adh.dmi b/icons/obj/machines/vending/tool_adh.dmi new file mode 100644 index 0000000000000000000000000000000000000000..03f49f0d1dc4b8137bdce1bc4174ff7599f43c82 GIT binary patch literal 3254 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/wallmed.dmi b/icons/obj/machines/vending/wallmed.dmi new file mode 100644 index 0000000000000000000000000000000000000000..792954c53a9c1f36e3a9736b2059631cf96cff84 GIT binary patch literal 2406 zcmY*bc{tQ-8y-tUn4-l#V@j5TAtW`&SkKsEES=+2mLX|4b{aYO*=kg>l#WbPGN(pF zv`_yx}N*JuJ@`h zp!(gU&;LEnWHQSslL=Q_&Rr1GG`PM0~&kLQ4jo0eWjeA0u? z*0>>T+?*VwW#O0LZ~Ki^R8$hT>ebJt`AHRJQv7`aAdZXgPfLU9^uVAL*U03EBz!^& zK0XctNvjO_IUy;Pvk{Q6%3d(_GB+K0O$&H*%<`=@W6q4`ZSoS5RCuNRkhQ<{sI@1& za_;K$tAX%I)#Tst6BUtq}-5Y!Pve9vdth|LHEAb z1_ZKI#>3SqFs<@yRV?A|;qBQT^>_Q5k>;t1oHHT`u;wEhbmD-4q1OH+YXOdCGGQdQ za2{1;en~g8KoA5Ey|hcHG56V{e$rWedp|eE-{Bcs;jWpN2oz41R3h!dJ7$V+f6C)hda zEII$!aojwrEj&4U&r!UqZr3*Wu+|sn_akL8#(SK88(Wa?qB^w zRrZ5=&lq&JSdnOI;}qS6G1`=+L{kUU>8u}Gpd;N9l!~ur> zp1J>>UpDi{XgN+nbSZ40jIh5O{ zjz?LA!v3aDq~F9tK4BcWN^%vpJxgo%N1!2*@%kpzP9lGt-}0jV%`X^@Kz7UxMx$qi zkg>}>mn_tb!h(B$IEr1y-(YBX({%9qL#3fbJ)sdo&CKp+7hk@4=XeGvhwLk&jmd=P02b-dU%1->aK8I({mx zf*AT~Rj^y;gg*Dmr#M^t&=kQfBr+W=ji5yyeI3dlNiEW~Pa^BlYr-~(xKfcp;weB= z7di)hBGNMipA}AlrEA;b0L*X{hcK2QB_m6l{}K+N<=>Nq|0gWb3~2&f<+=PX;rlgB znrXdKA)4{d!1Ohv$*OT#-?Ufy-(j5M0CzpQxCGTMGB}qYaN#pHiCd`Dy&rFe`cTF3 zhb0Q`?P6pBpy=KzMwZZ6tODK_aS@5eWPRe*PD-|{Uu%$D?(uypMk?H%1c$r7GxTRZ z)i`68LOoG{_HGj+ci*Og!!LaQ5+k+IQ+(Jp2BOs ziQz6wKAhWNr@mzaslghnPej23jo|W@Ny&J8?3mX>NuEHX0scIfir%TdZ!THT(FL7I zgQ?6*nHHD+-^PU8zaAty=%yGBeqjl@?4|~*ELFw4U3P6~l(V`fOiiy(&q2z&I&s3b zwupSFNj|S*+QxDQwro?MQI#H)yF*wNgWxRmT{*MVCsWDNuo6~L-@Lv_14-(0 z7#}ea2N2^)L{1N45SFgdD-1?o8eu}IPFvRq2J2zlB|6yy8${3mbq~D{x{3#rFJ@i- zeF=q;jw&th_nl-8kq*L0A{_P<;I2CbyFis7gw-{Xmsf}u-SdL)1NZF|BgbI-LnV8b zp|Cq*8nKw)hoMN;=jO$h7y0M|zzt6ktO8x=_j_3j+RUFKso5a9DYJnxv1R`*m4UUzOXZvik#Qd;g$z5eqsF-O;=> zO0PN6j-FLPM(?rIqHoD zFM>^I65;}EZ-nHzSOCV6+X1rJ;uacJ^+?{=$QL*iX{uF6)d;>H^%Grr?^cG?^Z8oZ@k);Bu4Oz-xYDEpkM z7?bbMPH{IqZ|Av;52LejDjt={CC)1WJ1LWzU}q@x9BQ`7^FB|$&)a~kEf~@&E+^~U zTkRdsT6f=U*HV7WLIjI_NMCOZ9K})|M*MON@T{3KU9$B#oIerJY!BCR&LZ|dTfk`q zzR5_$Zkp?f93QGZx>I%*@R+vQ5s|8BUOt_7cvk7wm`nq>(AXyY>7;|5%v#3(vrQTZ0KwAJ3V?p%EhCXk?;pXGo I;2f6w4~N9iwg3PC literal 0 HcmV?d00001 diff --git a/icons/obj/machines/vending/weeb.dmi b/icons/obj/machines/vending/weeb.dmi new file mode 100644 index 0000000000000000000000000000000000000000..62966c77b127111bb38efe3c5b0407122c22a6ea GIT binary patch literal 4127 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 Rxj)GuGh-{GH-;Vw{|E5gY`Opd literal 0 HcmV?d00001 diff --git a/icons/obj/structures/water_cooler.dmi b/icons/obj/structures/water_cooler.dmi new file mode 100644 index 0000000000000000000000000000000000000000..47660e5d627eb1bb62311ac3d7e1224f71334730 GIT binary patch literal 1558 zcmZuxdo+}382=cVcEW7AjEc({|48Kl{h?`@QdZpXd2K&-0%1q!B$`v{5@y z003yaxjK8RSoqa8BUBiy&aqX|L86E6387GE3Tkwf{*TjD$>JMgeee!>6Dc0bHNSZ>4aKtuI1_t;*Xn6=`)7Xevd}m-xppc6gmhAwcH&TgN zWbUtPV4EmIjmA(DDY=d^qx${UH_4UtK8jRynERrzZ#Chb^3`c6Y|IDJ_T_Y>I64blp- zH}O9Z+*JE$a*qDdM10k01sNv=%n3$0L-g&Nw&!lB@zAb}GU|raVp26-RjZc?c>xl_ z`tG4}2nqWemUK&pUQg=VB?ZwBmPRrb)vM~EX2sVS4S|2rJjUKr)g=$DH=#tSs%cfA z%f7+CgJBMv|H@?n*Hp?n+u=AwC~Iv)p;^gtnni@7@sh$7r?+dc;14uDv3Nr60&+GG ziLg`MJm!rIYNPikxA3|E7tjMiXR&ezk>NvqA~*(Ssd45{F@W_o!M}R{C^NSr`U(75 zl?|~KXjzY%ClkNxF=&Ib!LB2`O;kUcBdSR0l=eNJmd}vo*J*s{h`l&*mvKaMRyKjm z?)dgH{slUjQ>3)1SS>r4*Ce^|F6HD*gyZ7}9j7I0X;P)lBjoMe3&|D>sA#BJCo-02 zail-LY3Qf$#HI@xX54!Yk33pmoQ+xqH{-6j%M#>ornJNs-#3j$ z8|j{EKNSlvYbLhBf$en~lb;Iu#Ffhe+<4$CT4O9HsbU35qi((Gfb@C*3Eoyf4PzHg z#4nX|Bhy9a5uOTaHhh(lfQ!OCGae)GnIT!=hi%2yvgO`d5{V#3g)`z{;VhP^Gm|Q? zJeX#DtdW$x#o>_nwQ^lA^o20q%uL&Ir*?#$dcvX|XHzs{4BG&=sa@A`IP}*Jaq4Rf zyhm4hQ};j%9F%N_XwSN@Awf&6xzFTqy*4e^-knWOGm|w;Ejuza p?m}B+tD%)k=3{QIjPc3^bgf-p=B~pdSk-0*+)j8p*B&D${|!ZC9smFU literal 0 HcmV?d00001 diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi deleted file mode 100644 index 91cf6530e5095df922bb5d7808d9779601c4c10e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353938 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

    Penelope Haze updated:

  1. added overlays to show when a crafted or dried waterskin is closed
  2. added a new sprite for waterskins made from dried ruminant stomachs
  3. - -

    23 September 2024

    -

    MistakeNot4892 updated:

    -
      -
    • You can now resist out of straightjackets.
    • -
    From af8f42da675f768d78cc3cdc5679b1ab96e464ed Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 25 Nov 2024 14:25:55 -0500 Subject: [PATCH 11/42] Fix mapped large casks having invisible contents --- code/game/objects/structures/barrels/cask_rack.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/barrels/cask_rack.dm b/code/game/objects/structures/barrels/cask_rack.dm index f284886622f8..20d6a1e61fe9 100644 --- a/code/game/objects/structures/barrels/cask_rack.dm +++ b/code/game/objects/structures/barrels/cask_rack.dm @@ -150,7 +150,7 @@ color = /decl/material/solid/organic/wood/ebony::color /obj/structure/cask_rack/large/mapped/Initialize(ml, _mat, _reinf_mat) - new /obj/structure/reagent_dispensers/barrel/cask/ebony/water(src) - new /obj/structure/reagent_dispensers/barrel/cask/ebony/beer(src) - new /obj/structure/reagent_dispensers/barrel/cask/ebony/wine(src) . = ..() + try_stack_barrel(new /obj/structure/reagent_dispensers/barrel/cask/ebony/water) + try_stack_barrel(new /obj/structure/reagent_dispensers/barrel/cask/ebony/beer) + try_stack_barrel(new /obj/structure/reagent_dispensers/barrel/cask/ebony/wine) From 9f4738a7194a749e1b417ceaf51dffdd37dd7ef6 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 25 Nov 2024 14:44:20 -0500 Subject: [PATCH 12/42] Add athletics check to barrel stacking --- .../objects/structures/barrels/cask_rack.dm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/barrels/cask_rack.dm b/code/game/objects/structures/barrels/cask_rack.dm index 20d6a1e61fe9..1fc406b86fbe 100644 --- a/code/game/objects/structures/barrels/cask_rack.dm +++ b/code/game/objects/structures/barrels/cask_rack.dm @@ -32,7 +32,7 @@ /obj/structure/cask_rack/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && user.Adjacent(src) && dropping.Adjacent(src) && user.Adjacent(dropping)) - return try_stack_barrel(dropping, user) + return try_stack_barrel_timed(dropping, user) /obj/structure/cask_rack/on_update_icon() . = ..() @@ -97,13 +97,16 @@ if(target && (!isturf(target) || !loc.Adjacent(target))) // TODO: Enter() or CanPass() checks instead of relying on step_towards() below. to_chat(user, SPAN_NOTICE("You cannot move \the [barrel] to \the [target].")) return FALSE + if(user && !user.do_skilled(3 SECONDS, SKILL_HAULING, src)) + to_chat(user, SPAN_NOTICE("You stop moving \the [barrel] off of \the [src].")) + return FALSE to_chat(user, SPAN_NOTICE("You move \the [barrel] off \the [src].")) barrel.dropInto(loc) if(target) step_towards(barrel, target) return TRUE -/obj/structure/cask_rack/proc/try_stack_barrel(atom/movable/barrel, mob/user) +/obj/structure/cask_rack/proc/can_stack_barrel(atom/movable/barrel, mob/user) if(!istype(barrel) || !barrel.simulated || barrel.anchored) return FALSE if(length(contents) >= max_stack) @@ -111,12 +114,27 @@ return FALSE var/list/stackable_types = get_stackable_barrel_types() if(!is_type_in_list(barrel, stackable_types)) - to_chat(user, SPAN_WARNING("\The [src] is cannot hold \the [barrel].")) + to_chat(user, SPAN_WARNING("\The [src] cannot hold \the [barrel].")) + return FALSE + return TRUE + +/obj/structure/cask_rack/proc/try_stack_barrel(atom/movable/barrel, mob/user) + if(!can_stack_barrel(barrel, user)) return FALSE barrel.forceMove(src) - to_chat(user, SPAN_NOTICE("You stack \the [barrel] onto \the [src].")) return TRUE +/obj/structure/cask_rack/proc/try_stack_barrel_timed(atom/movable/barrel, mob/user) + if(!can_stack_barrel(barrel, user)) + return FALSE + if(user && !user.do_skilled(3 SECONDS, SKILL_HAULING, src)) + to_chat(user, SPAN_NOTICE("You stop stacking \the [barrel] onto \the [src].")) + return FALSE + if(try_stack_barrel(barrel, user)) + to_chat(user, SPAN_NOTICE("You stack \the [barrel] onto \the [src].")) + return TRUE + return FALSE + /obj/structure/cask_rack/proc/get_stackable_barrel_types() var/static/list/_stackable_barrel_types = list( /obj/structure/reagent_dispensers/barrel/cask From cb99092f7846537835baf6208f48865f17e5126e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 26 Nov 2024 11:25:05 +1100 Subject: [PATCH 13/42] Adding Doe's signs. --- code/game/objects/structures/banners.dm | 239 ++++++++++++------ .../recipes_hardness_integrity.dm | 9 + icons/obj/items/banners/sign.dmi | Bin 0 -> 682 bytes icons/obj/items/banners/sign_symbols.dmi | Bin 0 -> 2038 bytes icons/obj/structures/sign_post.dmi | Bin 0 -> 769 bytes 5 files changed, 176 insertions(+), 72 deletions(-) create mode 100644 icons/obj/items/banners/sign.dmi create mode 100644 icons/obj/items/banners/sign_symbols.dmi create mode 100644 icons/obj/structures/sign_post.dmi diff --git a/code/game/objects/structures/banners.dm b/code/game/objects/structures/banners.dm index 21f09be9f6e4..fbf65eac37d4 100644 --- a/code/game/objects/structures/banners.dm +++ b/code/game/objects/structures/banners.dm @@ -1,23 +1,28 @@ +// Assoc list of icon to icon_states to avoid constantly extracting them +var/global/list/_banner_decals = list() + /obj/structure/banner_frame - name = "banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon = 'icons/obj/structures/banner_frame.dmi' - icon_state = "banner_stand_preview" - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color - anchored = TRUE - density = FALSE - opacity = FALSE - atom_flags = ATOM_FLAG_CLIMBABLE - layer = ABOVE_WINDOW_LAYER - obj_flags = OBJ_FLAG_ANCHORABLE + name = "banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon = 'icons/obj/structures/banner_frame.dmi' + icon_state = "banner_stand_preview" + material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood::color + anchored = TRUE + opacity = FALSE + atom_flags = ATOM_FLAG_CLIMBABLE + layer = ABOVE_WINDOW_LAYER + obj_flags = OBJ_FLAG_ANCHORABLE tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) - material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR - max_health = 50 + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR + max_health = 50 + density = TRUE + var/force_south_facing = TRUE var/base_icon_state = "banner_stand" /// Reference to any banner currently hung on the frame. var/obj/item/banner/banner + var/accepts_banner_type = /obj/item/banner /obj/structure/banner_frame/set_dir(ndir) return ..(force_south_facing ? SOUTH : ndir) @@ -54,6 +59,12 @@ if(banner) to_chat(user, SPAN_WARNING("There is already a banner hung on \the [src].")) return TRUE + + var/obj/item/banner/other_banner = O + if(other_banner.banner_type != accepts_banner_type) + to_chat(user, SPAN_WARNING("\The [src] is not suitable for hanging \the [O].")) + return TRUE + if(user.try_unequip(O, src)) user.visible_message(SPAN_NOTICE("\The [user] hangs \the [O] from \the [src]."), SPAN_NOTICE("You hang \the [O] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) set_banner(O) @@ -87,7 +98,10 @@ for(var/decal in banner.decals) I = image(banner.decal_icon, decal) I.appearance_flags |= RESET_COLOR - I.color = banner.decals[decal] + if(banner.colourise_decal) + I.color = banner.decals[decal] + else + I.color = banner.color add_overlay(I) /obj/structure/banner_frame/Destroy() @@ -95,28 +109,45 @@ QDEL_NULL(banner) return ..() -var/global/list/_banner_decals = list() - /obj/item/banner - name = "banner" - desc = "A furled-up banner." - icon = 'icons/obj/items/banners/banner.dmi' - icon_state = "banner" - material = /decl/material/solid/organic/cloth - color = /decl/material/solid/organic/cloth::color - max_health = 20 - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME - w_class = ITEM_SIZE_NORMAL - var/hung_desc = "The banner is rather unremarkable." + name = "banner" + desc = "A furled-up banner." + icon = 'icons/obj/items/banners/banner.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/cloth + color = /decl/material/solid/organic/cloth::color + max_health = 20 + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + w_class = ITEM_SIZE_NORMAL + var/colourise_decal = TRUE + var/hung_desc = "The banner is rather unremarkable." + var/decal_icon = 'icons/obj/items/banners/banner_symbols.dmi' + var/banner_type = /obj/item/banner + var/embroiderable = TRUE var/name_prefix - var/decal_icon = 'icons/obj/items/banners/banner_symbols.dmi' var/list/decals var/trim_color +/obj/item/banner/on_update_icon() + . = ..() + if(trim_color) + var/image/I = image(icon, "[icon_state]-trim") + I.appearance_flags |= RESET_COLOR + I.color = trim_color + add_overlay(I) + for(var/decal in decals) + var/image/I = image(decal_icon, decal) + if(colourise_decal) + I.appearance_flags |= RESET_COLOR + I.color = decals[decal] + add_overlay(I) + // TODO: PROPER EMBROIDERY AND ITEM DECORATION. /obj/item/banner/attackby(obj/item/used_item, mob/user) - if(istype(used_item, /obj/item/stack/material/thread)) + if(embroiderable && istype(used_item, /obj/item/stack/material/thread)) + + // TODO: check material crafting skill and do a do_after() if((!decal_icon || length(decals)) && trim_color) to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) @@ -150,95 +181,96 @@ var/global/list/_banner_decals = list() SetName("[name_prefix] [name]") /obj/item/banner/forked - name_prefix = "forked" - hung_desc = "The banner splits into two tails at the bottom." - icon = 'icons/obj/items/banners/banner_forked.dmi' - decal_icon = null // Current decals do not work nicely with the fork + name_prefix = "forked" + hung_desc = "The banner splits into two tails at the bottom." + icon = 'icons/obj/items/banners/banner_forked.dmi' + decal_icon = null // Current decals do not work nicely with the fork /obj/item/banner/pointed - name_prefix = "pointed" - hung_desc = "The banner narrows to a point at the bottom." - icon = 'icons/obj/items/banners/banner_pointed.dmi' + name_prefix = "pointed" + hung_desc = "The banner narrows to a point at the bottom." + icon = 'icons/obj/items/banners/banner_pointed.dmi' /obj/item/banner/rounded - name_prefix = "rounded" - hung_desc = "The banner has a rounded lower edge." - icon = 'icons/obj/items/banners/banner_rounded.dmi' + name_prefix = "rounded" + hung_desc = "The banner has a rounded lower edge." + icon = 'icons/obj/items/banners/banner_rounded.dmi' /obj/item/banner/square - name_prefix = "square" - hung_desc = "The banner has a squared-off lower edge." - icon = 'icons/obj/items/banners/banner_square.dmi' + name_prefix = "square" + hung_desc = "The banner has a squared-off lower edge." + icon = 'icons/obj/items/banners/banner_square.dmi' /obj/item/banner/tasselled - name_prefix = "tasselled" - hung_desc = "The banner has several dangling tassels at the bottom." - icon = 'icons/obj/items/banners/banner_tasselled.dmi' + name_prefix = "tasselled" + hung_desc = "The banner has several dangling tassels at the bottom." + icon = 'icons/obj/items/banners/banner_tasselled.dmi' /obj/item/banner/woven - name_prefix = "woven" - icon = 'icons/obj/items/banners/banner_woven.dmi' - material = /decl/material/solid/organic/plantmatter/grass/dry - color = /decl/material/solid/organic/plantmatter/grass/dry::color + name_prefix = "woven" + icon = 'icons/obj/items/banners/banner_woven.dmi' + material = /decl/material/solid/organic/plantmatter/grass/dry + color = /decl/material/solid/organic/plantmatter/grass/dry::color material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - hung_desc = "The woven banner is rustic and uneven." + hung_desc = "The woven banner is rustic and uneven." /obj/item/banner/green - name = "green banner" + name = "green banner" paint_color = COLOR_GREEN - color = COLOR_GREEN + color = COLOR_GREEN /obj/item/banner/red - name = "red banner" + name = "red banner" paint_color = COLOR_RED - color = COLOR_RED + color = COLOR_RED /obj/item/banner/blue - name = "blue banner" + name = "blue banner" paint_color = COLOR_BLUE - color = COLOR_BLUE + color = COLOR_BLUE // Mapping helpers below. /obj/structure/banner_frame/blue banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color // Mapping preview colour. + color = /obj/item/banner/blue::color // Mapping preview colour. /obj/structure/banner_frame/red banner = /obj/item/banner/red - color = /obj/item/banner/red::color + color = /obj/item/banner/red::color /obj/structure/banner_frame/green banner = /obj/item/banner/green - color = /obj/item/banner/green::color + color = /obj/item/banner/green::color // A wall-mounted banner frame with no stand. /obj/structure/banner_frame/wall - name = "hanging banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon_state = "banner_hanging_preview" - base_icon_state = "banner_hanging" + name = "hanging banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon_state = "banner_hanging_preview" + base_icon_state = "banner_hanging" directional_offset = @'{"NORTH":{"y":-32},"SOUTH":{"y":-32},"EAST":{"x":-32},"WEST":{"x":-32}}' force_south_facing = FALSE + density = FALSE /obj/structure/banner_frame/wall/ebony material = /decl/material/solid/organic/wood/ebony - color = /decl/material/solid/organic/wood/ebony::color + color = /decl/material/solid/organic/wood/ebony::color /obj/structure/banner_frame/wall/ebony/red - banner = /obj/item/banner/red - color = /obj/item/banner/red::color // Mapping preview colour. + banner = /obj/item/banner/red + color = /obj/item/banner/red::color // Mapping preview colour. /obj/structure/banner_frame/wall/ebony/blue - banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color + banner = /obj/item/banner/blue + color = /obj/item/banner/blue::color /obj/structure/banner_frame/wall/ebony/green - banner = /obj/item/banner/green - color = /obj/item/banner/green::color + banner = /obj/item/banner/green + color = /obj/item/banner/green::color /obj/structure/banner_frame/wall/ebony/woven - banner = /obj/item/banner/woven - color = /obj/item/banner/woven::color + banner = /obj/item/banner/woven + color = /obj/item/banner/woven::color // Debug item. /obj/structure/banner_frame/random/Initialize(ml, _mat, _reinf_mat) @@ -259,4 +291,67 @@ var/global/list/_banner_decals = list() var/decal = pick(global._banner_decals[banner.decal_icon]) var/decal_color = get_random_colour() LAZYSET(banner.decals, decal, decal_color) + banner.update_icon() update_icon() + +// what is a sign, if not a wooden banner +/obj/structure/banner_frame/sign + name = "sign post" + desc = "A post for hanging a sign." + icon = 'icons/obj/structures/sign_post.dmi' + desc = "A post for hanging a sign." + base_icon_state = "sign" + accepts_banner_type = /obj/item/banner/sign + icon_state = "sign_preview" + density = TRUE + +/obj/structure/banner_frame/sign/wall + base_icon_state = "sign_hanging" + icon_state = "sign_hanging_preview" + force_south_facing = FALSE + density = FALSE + +/obj/item/banner/sign + name = "sign" + banner_type = /obj/item/banner/sign + embroiderable = FALSE + icon = 'icons/obj/items/banners/sign.dmi' + material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood::color + hung_desc = "The sign is unadorned." + decal_icon = 'icons/obj/items/banners/sign_symbols.dmi' + colourise_decal = FALSE + +/obj/item/banner/sign/attackby(obj/item/used_item, mob/user) + if(IS_KNIFE(used_item) && user.a_intent == I_HELP) + if(!decal_icon || length(decals)) + to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) + return TRUE + if(!global._banner_decals[decal_icon]) + global._banner_decals[decal_icon] = icon_states(decal_icon) + var/decal_to_add = input(user, "Which symbol do you wish to add to \the [src]?", "Sign Symbol") as null|anything in global._banner_decals[decal_icon] + if(decal_to_add && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item) + decals[decal_to_add] = COLOR_WHITE + return TRUE + . = ..() + +/obj/item/banner/sign/random/Initialize(ml, material_key) + material = pick(typesof(/decl/material/solid/organic/wood)) + . = ..() + +/obj/structure/banner_frame/sign/random/Initialize(ml, _mat, _reinf_mat) + material = pick(typesof(/decl/material/solid/organic/wood)) + ..() + banner = new /obj/item/banner/sign/random(src) + return INITIALIZE_HINT_LATELOAD + +/obj/structure/banner_frame/sign/random/LateInitialize() + . = ..() + if(banner) + if(banner.decal_icon) + if(!global._banner_decals[banner.decal_icon]) + global._banner_decals[banner.decal_icon] = icon_states(banner.decal_icon) + var/decal = pick(global._banner_decals[banner.decal_icon]) + LAZYSET(banner.decals, decal, COLOR_WHITE) + banner.update_icon() + update_icon() diff --git a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm index 92e580a6d0e2..6277f73b606b 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm @@ -2,6 +2,9 @@ abstract_type = /decl/stack_recipe/hardness/integrity required_integrity = 50 +/decl/stack_recipe/hardness/integrity/sign + result_type = /obj/item/banner/sign + /decl/stack_recipe/hardness/integrity/furniture abstract_type = /decl/stack_recipe/hardness/integrity/furniture one_per_turf = TRUE @@ -19,6 +22,12 @@ /decl/stack_recipe/hardness/integrity/furniture/banner_frame result_type = /obj/structure/banner_frame +/decl/stack_recipe/hardness/integrity/furniture/sign_hook + result_type = /obj/structure/banner_frame/sign + +/decl/stack_recipe/hardness/integrity/furniture/sign_hook/wall + result_type = /obj/structure/banner_frame/sign/wall + /decl/stack_recipe/hardness/integrity/furniture/coatrack result_type = /obj/structure/coatrack diff --git a/icons/obj/items/banners/sign.dmi b/icons/obj/items/banners/sign.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a2fb9ec0361db2cb49207526d2bbd78c1186cdef GIT binary patch literal 682 zcmV;b0#*HqP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq19V=A~!mr6W|E;8R^vl$nc5sj`Br zp9|Q%0ESUCw;^cOQUCw}yh%hsR9J=Wmr;(wAP|N@yYJL+fL-+fMtcBC>-#?F{jahu z6wCZWTbk@9Cfj+K<_A7twEh!?*djCJsZ0B>e4x-F8` zovsGxmHr-(jhn;oA$E8Q_|4F2iDCPfwoutX@!97ynPcx|?C=P5b657}6Nk5P2|dBr zQ-^O)Vo!Qn@|P7m{BnPoqqo>%i^-7W5kgHryhR9fLYH?Yp`-`U{{0e_P^*E}S9(K0 z`Umz4znMxY8}Ai@8aP#}0jGGsAiEG%*o#Q@i`en0TJ9I@KhR>ocq{+^0rt9#&X%2^ QHUIzs07*qoM6N<$f}52=q5uE@ literal 0 HcmV?d00001 diff --git a/icons/obj/items/banners/sign_symbols.dmi b/icons/obj/items/banners/sign_symbols.dmi new file mode 100644 index 0000000000000000000000000000000000000000..16ce7891c0c98a6469bb14be61fb3c602c6581e4 GIT binary patch literal 2038 zcmVRtk3n73dAFBh_BOl4oQ_gB@SV#aLs@57WHG+FLJI4V)`%1>>Je6b_%dYl z0K{Tr#H>;2U{wOj1F(tYO~3Kv;sgWBx7zTf27wHO%z~5G{76bM@>J4ucw+1U`NBD( z{bPwp{Kbt&^ZU%Dx;54I6mPv!n!-$@hK>LL2FFQ6K~#90?OaWBqc{)+vD_mY?%1Gv z4Ay;d@ZA#T|NoT*&#dX!EjxD2)Yeq3o^!}U^cRSfo*N}eA|fIpA|fJQLaIYY^~bCB zn^vC6t%2(y;5!{i8fm@5LCUvdJ#q(W(LeTPcDhdl3cd07(`{=H)EszTeHv!0ye=RI z>MilU4_s4SnAMHX)P)WL&yvrK8Rw?KYYN^j<8(*_wv)~8WcK(;2Z0|xKMycE2h1&A zW%TCzS_W(jbI&{5X4#gEA>UV*eTBwZ-fSQT>Mb$d)XISM)ZMST+UIId#*pie3!jr} zv?Js|z0G&{L4|jdROj&MFurfW`K<_9Avq_T*ewtTRlSEn;A*UW!ePh9-d=!dZS|1v zwANMfTcKu`n}=N8ets{i+s|Vj5fKp)5fKsbr$H6{ZrJdn^P!@z-tj{f7Pm&en;~4Q z&5XC=QH8~=k*lC<$fBGSUFc>$pM=B&g~e+CZuTbwqqi)4vtPBwSk*mQN*}%|x%j3E z3#TgVgW&6fwkai)8JPKKhijz?pa)v!&|m+77!H{wU)d+ zh2&d9MC4o{4065z6c$(uerv~6h8)a%U8%gWG_IKQDH z3Ja_S_j78Z#C(>W_b)z_pMS_He&O8Wp>=?Ni#c^e0!~%bixCkK5fKp)e>~o8_odUt zh?Ol9!6v!`j26h^AG?EkB3~i(3QVj!yIkXT4d{4qrX4C8gsfyPmlLD6G`l z68nSHTiNYO8PIJyx7MUj>oPO9WnPMI7AUNAY_%hU=&jSn$y-u--QAfh$O(Dn9Jaa^ zfWpcSn+e)=;BD-7TCT+PrnC3+^@$E8rWEl|VdY(`K`T&iNjC?S70#!0>-l)goRBsN zDy(b{2o+Lqi8)xAv2x>f6*m|#FQv3Wg{8(VC`|B{WaAEdb2r$Hy_b!bbat&|iKwt_ zTf#-7-sTA=8<2@)O$e}eXX;jy^&_a=TiQ&_xf%=veq z4}L^ML_|bHL`1}IfwG-E*h&5I(Ei(HBYIP=*vp0SzNhQ?r_07>2;`;)vie4Ex&8`e zcq9@DtOY+vZL=)*LG)5@ha!;R?6hAkm^I^BIAO?wdUHiUOwEP&MDiS24Zw4urx#qo zEA{qDz$-ficoVurs)xHky}fWrnKg3NomAG$-M(Rur2?O6ulX!VD zKee<~g5Hw-G1MyhT7`9LrU_r3q})^&@dB)>&-iNJ7nSMVIn+J7t`|Z1T;U6_glArP z#V0{_WZknXTv8W!&(DW(z}pOJIxHa(iD?Ip9XiFwhSWhc_ z{~p?A2yM$H3hU`Te1DdH{~SJ_rEfon>HJ4U9tDN<^f~*pv=a}35`LwW!GH-v!DdYJtCIEi102aUkco_h6Br_t|kvsvJ1yn%*Vby^4+TapT z#oPLY6{`M0`GxHjMqg(qzhJk;(0+lb5p(hjCJ3tjS^0&UtC6sN!Bq699Aaf(y`8Lv z0UWGfXe)9o2l@k5eE|;G9}Lj(RRzF4hm!aC1_20k1~3M$N3a+H2y_O>YX;Gj_7V)x z8IY>=Sz#+cU@!pZ?w8OmD1Qxr^M3?jdO;os1E~Jn>h4iCz+eE*odLRL^%D#bu%hk& z2y_Pk0oHc_1M~nyy0dnEp#{3dv|sSh?Zq!F@h5TFr9YrM#ro7gyF!a_m<0&ImGtuA zLr2jf%zKoy5$clwlY_^ephY;(0+K|k?+20(0ca6ij9yjZp%)&C{!yuqFx7E*)wc!?PZWP8+Qnqn_)b=tQSxqucEv$WH@W)fmf$haA2DfK)nn{2X{Fx}4g}N06Te z=-j(h4@IYtTii7cA4R9~e!ZWf)5*s5Hp+Sf$hpbrp*C)V00000NkvXXu0mjf!@*f` literal 0 HcmV?d00001 From c960b102067f7742e07ccfd9ead9fb80c26c4043 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 29 Nov 2024 00:53:44 +0000 Subject: [PATCH 14/42] Automatic changelog generation [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index b65c2e11537e..11782eae61ac 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -112,13 +112,6 @@

    Atermonera updated:

    • Fixed some grammatical issues in location event strings.
    - -

    27 September 2024

    -

    Penelope Haze updated:

    -
      -
    • added overlays to show when a crafted or dried waterskin is closed
    • -
    • added a new sprite for waterskins made from dried ruminant stomachs
    • -
    From 8c2dfd64f3c6aaec45ae629b51a359b4434714af Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 14:29:46 -0500 Subject: [PATCH 15/42] Fix bots being treated as SSD on interact --- code/modules/mob/living/bot/bot.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 4a88a0fa0356..66ab04d665a4 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -84,6 +84,9 @@ if(. && !gibbed) gib() +/mob/living/bot/ssd_check() + return FALSE + /mob/living/bot/attackby(var/obj/item/O, var/mob/user) if(O.GetIdCard()) if(access_scanner.allowed(user) && !open) From f20e7e540e06e89b77e4aaa3d8011c45ceb70541 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 14:29:54 -0500 Subject: [PATCH 16/42] Fix dirt being nameless when bots clean it --- code/game/objects/effects/dirty_floor.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/effects/dirty_floor.dm b/code/game/objects/effects/dirty_floor.dm index 798d07d738c2..ef76cb068303 100644 --- a/code/game/objects/effects/dirty_floor.dm +++ b/code/game/objects/effects/dirty_floor.dm @@ -11,7 +11,6 @@ /obj/effect/decal/cleanable/dirt/Initialize() . = ..() - name = "" verbs.Cut() /obj/effect/decal/cleanable/dirt/on_update_icon() From 29c2d86f91416ade935e42ea1569593d8ed90052 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 14:30:28 -0500 Subject: [PATCH 17/42] Fix AI unarmed attacks doing nothing --- code/modules/mob/living/bot/cleanbot.dm | 2 +- code/modules/mob/living/bot/farmbot.dm | 2 +- code/modules/mob/living/bot/floorbot.dm | 2 +- code/modules/mob/living/bot/medibot.dm | 2 +- code/modules/mob/living/bot/mulebot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 2 +- code/modules/mob/living/simple_animal/friendly/corgi.dm | 2 +- .../mob/living/simple_animal/hostile/retaliate/parrot.dm | 2 +- mods/content/xenobiology/slime/_slime.dm | 2 +- mods/content/xenobiology/slime/slime_AI.dm | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index c9442e2857f9..e989ba53b320 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -51,7 +51,7 @@ /mob/living/bot/cleanbot/handleAdjacentTarget() if(get_turf(target) == src.loc) - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 4a487bb1a4c2..86a8a9411890 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -106,7 +106,7 @@ flick("farmbot_broke", src) /mob/living/bot/farmbot/handleAdjacentTarget() - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/farmbot/lookForTargets() if(emagged) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index d3dc81be5c32..b772273fd66a 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -95,7 +95,7 @@ /mob/living/bot/floorbot/handleAdjacentTarget() if(get_turf(target) == src.loc) - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/floorbot/lookForTargets() for(var/turf/floor/T in view(src)) diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index cf174faa8ce3..8084e5eaaebd 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -73,7 +73,7 @@ /mob/living/bot/medbot/handleAdjacentTarget() if(is_tipped) // Don't handle targets if we're incapacitated! return - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/medbot/lookForTargets() if(is_tipped) // Don't look for targets if we're incapacitated! diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index 12d54b837596..bb9cf31e58e4 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -172,7 +172,7 @@ if(target == src.loc) custom_emote(2, "makes a chiming sound.") playsound(loc, 'sound/machines/chime.ogg', 50, 0) - UnarmedAttack(target) + UnarmedAttack(target, TRUE) resetTarget() if(auto_return && home && (loc != home)) target = home diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 412d45498ac2..2e47d627b53a 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -182,7 +182,7 @@ begin_arrest(target, threat) ++awaiting_surrender else - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/secbot/proc/cuff_target(var/mob/living/target) if(istype(target) && !target.get_equipped_item(slot_handcuffed_str)) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index eef4666321c6..c8ee4417ebff 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -96,7 +96,7 @@ else body.set_dir(SOUTH) if(isturf(movement_target.loc) && body.Adjacent(movement_target)) - body.UnarmedAttack(movement_target) + body.UnarmedAttack(movement_target, TRUE) else if(ishuman(movement_target.loc) && prob(20)) body.custom_emote(VISIBLE_MESSAGE, "stares at the [movement_target] that [movement_target.loc] has with sad puppy eyes.") diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index 5f8e5040ffbd..aab2c3fca766 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -258,7 +258,7 @@ return //Time for the hurt to begin! - parrot.UnarmedAttack(L) + parrot.UnarmedAttack(L, parrot.Adjacent(L)) return //Otherwise, fly towards the mob! diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index fe74f0419334..474a98545d16 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -127,7 +127,7 @@ if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille)) if(nutrition <= get_hunger_nutrition()) if (is_adult || prob(5)) - UnarmedAttack(AM) + UnarmedAttack(AM, Adjacent(AM)) if(ismob(AM)) var/mob/tmob = AM diff --git a/mods/content/xenobiology/slime/slime_AI.dm b/mods/content/xenobiology/slime/slime_AI.dm index 993f1debc4b0..6577edb52efb 100644 --- a/mods/content/xenobiology/slime/slime_AI.dm +++ b/mods/content/xenobiology/slime/slime_AI.dm @@ -147,7 +147,7 @@ for(var/mob/living/slime/frenemy in range(1, body)) if(frenemy != body && body.Adjacent(frenemy)) body.a_intent_change((frenemy.slime_type == slime.slime_type) ? I_HELP : I_HURT) - body.UnarmedAttack(frenemy) + body.UnarmedAttack(frenemy, TRUE) added_delay = 10 else if(slime.Adjacent(current_target)) var/do_attack = FALSE @@ -161,7 +161,7 @@ body.a_intent_change(I_GRAB) do_attack = TRUE if(do_attack) - body.UnarmedAttack(current_target) + body.UnarmedAttack(current_target, TRUE) added_delay = 10 else current_target = null From 594a6dd788ed15842158b4bd7ee4d0b19933fba8 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 14:39:59 -0500 Subject: [PATCH 18/42] Fix hugging bots instead of opening their menu --- code/modules/mob/living/bot/bot.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 66ab04d665a4..fab8219c1698 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -87,6 +87,9 @@ /mob/living/bot/ssd_check() return FALSE +/mob/living/bot/try_awaken(mob/user) + return FALSE + /mob/living/bot/attackby(var/obj/item/O, var/mob/user) if(O.GetIdCard()) if(access_scanner.allowed(user) && !open) From 0a99bb6d2923bbea00e0ec0a79619ba671841992 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 30 Nov 2024 08:49:35 +1100 Subject: [PATCH 19/42] Reworking banners to address feedback. --- code/game/objects/structures/banners.dm | 357 ------------------ code/modules/banners/__banner.dm | 133 +++++++ code/modules/banners/_banner_frame.dm | 126 +++++++ code/modules/banners/_banner_symbols.dm | 201 ++++++++++ .../banners/banner_frame_definitions.dm | 57 +++ code/modules/banners/sign.dm | 25 ++ code/modules/banners/sign_post.dm | 32 ++ nebula.dme | 7 +- 8 files changed, 580 insertions(+), 358 deletions(-) delete mode 100644 code/game/objects/structures/banners.dm create mode 100644 code/modules/banners/__banner.dm create mode 100644 code/modules/banners/_banner_frame.dm create mode 100644 code/modules/banners/_banner_symbols.dm create mode 100644 code/modules/banners/banner_frame_definitions.dm create mode 100644 code/modules/banners/sign.dm create mode 100644 code/modules/banners/sign_post.dm diff --git a/code/game/objects/structures/banners.dm b/code/game/objects/structures/banners.dm deleted file mode 100644 index fbf65eac37d4..000000000000 --- a/code/game/objects/structures/banners.dm +++ /dev/null @@ -1,357 +0,0 @@ -// Assoc list of icon to icon_states to avoid constantly extracting them -var/global/list/_banner_decals = list() - -/obj/structure/banner_frame - name = "banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon = 'icons/obj/structures/banner_frame.dmi' - icon_state = "banner_stand_preview" - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color - anchored = TRUE - opacity = FALSE - atom_flags = ATOM_FLAG_CLIMBABLE - layer = ABOVE_WINDOW_LAYER - obj_flags = OBJ_FLAG_ANCHORABLE - tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) - material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR - max_health = 50 - density = TRUE - - var/force_south_facing = TRUE - var/base_icon_state = "banner_stand" - /// Reference to any banner currently hung on the frame. - var/obj/item/banner/banner - var/accepts_banner_type = /obj/item/banner - -/obj/structure/banner_frame/set_dir(ndir) - return ..(force_south_facing ? SOUTH : ndir) - -/obj/structure/banner_frame/Initialize(ml, _mat, _reinf_mat) - if(ispath(banner)) - set_banner(new banner(src)) - . = ..() - update_icon() - -/obj/structure/banner_frame/proc/set_banner(var/new_banner) - if(banner == new_banner) - return - banner = new_banner - if(banner) - name = banner.name - desc = "[initial(desc)] [banner.hung_desc]" - else - name = initial(name) - desc = initial(desc) - update_icon() - -/obj/structure/banner_frame/attack_hand(mob/user) - if(banner && user.check_dexterity(DEXTERITY_HOLD_ITEM)) - user.put_in_hands(banner) - var/old_banner = banner - set_banner(null) - user.visible_message(SPAN_NOTICE("\The [user] removes \the [old_banner] from \the [src]."), SPAN_NOTICE("You remove \the [old_banner] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) - return TRUE - return ..() - -/obj/structure/banner_frame/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/banner)) - if(banner) - to_chat(user, SPAN_WARNING("There is already a banner hung on \the [src].")) - return TRUE - - var/obj/item/banner/other_banner = O - if(other_banner.banner_type != accepts_banner_type) - to_chat(user, SPAN_WARNING("\The [src] is not suitable for hanging \the [O].")) - return TRUE - - if(user.try_unequip(O, src)) - user.visible_message(SPAN_NOTICE("\The [user] hangs \the [O] from \the [src]."), SPAN_NOTICE("You hang \the [O] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) - set_banner(O) - return TRUE - return ..() - -/obj/structure/banner_frame/dump_contents(atom/forced_loc = loc, mob/user) - if(istype(banner)) - banner.dropInto(forced_loc) - banner = null - . = ..() - -/obj/structure/banner_frame/on_update_icon() - . = ..() - - icon_state = base_icon_state - if(!istype(banner)) - return - - var/image/I = image(banner.icon, "[banner.icon_state]-hanging") - I.appearance_flags |= RESET_COLOR - I.color = banner.color - add_overlay(I) - - if(banner.trim_color) - I = image(banner.icon, "[banner.icon_state]-trim") - I.appearance_flags |= RESET_COLOR - I.color = banner.trim_color - add_overlay(I) - - for(var/decal in banner.decals) - I = image(banner.decal_icon, decal) - I.appearance_flags |= RESET_COLOR - if(banner.colourise_decal) - I.color = banner.decals[decal] - else - I.color = banner.color - add_overlay(I) - -/obj/structure/banner_frame/Destroy() - if(istype(banner)) - QDEL_NULL(banner) - return ..() - -/obj/item/banner - name = "banner" - desc = "A furled-up banner." - icon = 'icons/obj/items/banners/banner.dmi' - icon_state = ICON_STATE_WORLD - material = /decl/material/solid/organic/cloth - color = /decl/material/solid/organic/cloth::color - max_health = 20 - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME - w_class = ITEM_SIZE_NORMAL - var/colourise_decal = TRUE - var/hung_desc = "The banner is rather unremarkable." - var/decal_icon = 'icons/obj/items/banners/banner_symbols.dmi' - var/banner_type = /obj/item/banner - var/embroiderable = TRUE - var/name_prefix - var/list/decals - var/trim_color - -/obj/item/banner/on_update_icon() - . = ..() - if(trim_color) - var/image/I = image(icon, "[icon_state]-trim") - I.appearance_flags |= RESET_COLOR - I.color = trim_color - add_overlay(I) - for(var/decal in decals) - var/image/I = image(decal_icon, decal) - if(colourise_decal) - I.appearance_flags |= RESET_COLOR - I.color = decals[decal] - add_overlay(I) - -// TODO: PROPER EMBROIDERY AND ITEM DECORATION. -/obj/item/banner/attackby(obj/item/used_item, mob/user) - - if(embroiderable && istype(used_item, /obj/item/stack/material/thread)) - - // TODO: check material crafting skill and do a do_after() - - if((!decal_icon || length(decals)) && trim_color) - to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) - return TRUE - - var/obj/item/stack/material/thread/used_stack = used_item - if(used_stack.get_amount() < 5) - to_chat(user, SPAN_WARNING("You need at least five lengths of thread to embroider a banner.")) - return TRUE - - if(!trim_color) - user.visible_message("\The [user] sews a trim onto \the [src].") - trim_color = used_item.color - used_stack.use(5) - return TRUE - - if(decal_icon && !length(decals)) - if(!global._banner_decals[decal_icon]) - global._banner_decals[decal_icon] = icon_states(decal_icon) - var/decal_color = used_item.color - var/decal_to_sew = input(user, "Which symbol do you wish to add to \the [src]?", "Banner Symbol") as null|anything in global._banner_decals[decal_icon] - if(decal_to_sew && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item && used_stack.use(5)) - decals[decal_to_sew] = decal_color - return TRUE - - . = ..() - -// 'woven grass banner', 'forked linen banner' -/obj/item/banner/update_name() - . = ..() - SetName("[name_prefix] [name]") - -/obj/item/banner/forked - name_prefix = "forked" - hung_desc = "The banner splits into two tails at the bottom." - icon = 'icons/obj/items/banners/banner_forked.dmi' - decal_icon = null // Current decals do not work nicely with the fork - -/obj/item/banner/pointed - name_prefix = "pointed" - hung_desc = "The banner narrows to a point at the bottom." - icon = 'icons/obj/items/banners/banner_pointed.dmi' - -/obj/item/banner/rounded - name_prefix = "rounded" - hung_desc = "The banner has a rounded lower edge." - icon = 'icons/obj/items/banners/banner_rounded.dmi' - -/obj/item/banner/square - name_prefix = "square" - hung_desc = "The banner has a squared-off lower edge." - icon = 'icons/obj/items/banners/banner_square.dmi' - -/obj/item/banner/tasselled - name_prefix = "tasselled" - hung_desc = "The banner has several dangling tassels at the bottom." - icon = 'icons/obj/items/banners/banner_tasselled.dmi' - -/obj/item/banner/woven - name_prefix = "woven" - icon = 'icons/obj/items/banners/banner_woven.dmi' - material = /decl/material/solid/organic/plantmatter/grass/dry - color = /decl/material/solid/organic/plantmatter/grass/dry::color - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - hung_desc = "The woven banner is rustic and uneven." - -/obj/item/banner/green - name = "green banner" - paint_color = COLOR_GREEN - color = COLOR_GREEN - -/obj/item/banner/red - name = "red banner" - paint_color = COLOR_RED - color = COLOR_RED - -/obj/item/banner/blue - name = "blue banner" - paint_color = COLOR_BLUE - color = COLOR_BLUE - -// Mapping helpers below. -/obj/structure/banner_frame/blue - banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color // Mapping preview colour. - -/obj/structure/banner_frame/red - banner = /obj/item/banner/red - color = /obj/item/banner/red::color - -/obj/structure/banner_frame/green - banner = /obj/item/banner/green - color = /obj/item/banner/green::color - -// A wall-mounted banner frame with no stand. -/obj/structure/banner_frame/wall - name = "hanging banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon_state = "banner_hanging_preview" - base_icon_state = "banner_hanging" - directional_offset = @'{"NORTH":{"y":-32},"SOUTH":{"y":-32},"EAST":{"x":-32},"WEST":{"x":-32}}' - force_south_facing = FALSE - density = FALSE - -/obj/structure/banner_frame/wall/ebony - material = /decl/material/solid/organic/wood/ebony - color = /decl/material/solid/organic/wood/ebony::color - -/obj/structure/banner_frame/wall/ebony/red - banner = /obj/item/banner/red - color = /obj/item/banner/red::color // Mapping preview colour. - -/obj/structure/banner_frame/wall/ebony/blue - banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color - -/obj/structure/banner_frame/wall/ebony/green - banner = /obj/item/banner/green - color = /obj/item/banner/green::color - -/obj/structure/banner_frame/wall/ebony/woven - banner = /obj/item/banner/woven - color = /obj/item/banner/woven::color - -// Debug item. -/obj/structure/banner_frame/random/Initialize(ml, _mat, _reinf_mat) - . = ..() - var/banner_type = pick(list( - /obj/item/banner/pointed, - /obj/item/banner/rounded, - /obj/item/banner/square, - /obj/item/banner/tasselled, - /obj/item/banner/woven - )) - banner = new banner_type(src) - banner.set_color(get_random_colour()) - banner.trim_color = get_random_colour() - if(banner.decal_icon) - if(!global._banner_decals[banner.decal_icon]) - global._banner_decals[banner.decal_icon] = icon_states(banner.decal_icon) - var/decal = pick(global._banner_decals[banner.decal_icon]) - var/decal_color = get_random_colour() - LAZYSET(banner.decals, decal, decal_color) - banner.update_icon() - update_icon() - -// what is a sign, if not a wooden banner -/obj/structure/banner_frame/sign - name = "sign post" - desc = "A post for hanging a sign." - icon = 'icons/obj/structures/sign_post.dmi' - desc = "A post for hanging a sign." - base_icon_state = "sign" - accepts_banner_type = /obj/item/banner/sign - icon_state = "sign_preview" - density = TRUE - -/obj/structure/banner_frame/sign/wall - base_icon_state = "sign_hanging" - icon_state = "sign_hanging_preview" - force_south_facing = FALSE - density = FALSE - -/obj/item/banner/sign - name = "sign" - banner_type = /obj/item/banner/sign - embroiderable = FALSE - icon = 'icons/obj/items/banners/sign.dmi' - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color - hung_desc = "The sign is unadorned." - decal_icon = 'icons/obj/items/banners/sign_symbols.dmi' - colourise_decal = FALSE - -/obj/item/banner/sign/attackby(obj/item/used_item, mob/user) - if(IS_KNIFE(used_item) && user.a_intent == I_HELP) - if(!decal_icon || length(decals)) - to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) - return TRUE - if(!global._banner_decals[decal_icon]) - global._banner_decals[decal_icon] = icon_states(decal_icon) - var/decal_to_add = input(user, "Which symbol do you wish to add to \the [src]?", "Sign Symbol") as null|anything in global._banner_decals[decal_icon] - if(decal_to_add && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item) - decals[decal_to_add] = COLOR_WHITE - return TRUE - . = ..() - -/obj/item/banner/sign/random/Initialize(ml, material_key) - material = pick(typesof(/decl/material/solid/organic/wood)) - . = ..() - -/obj/structure/banner_frame/sign/random/Initialize(ml, _mat, _reinf_mat) - material = pick(typesof(/decl/material/solid/organic/wood)) - ..() - banner = new /obj/item/banner/sign/random(src) - return INITIALIZE_HINT_LATELOAD - -/obj/structure/banner_frame/sign/random/LateInitialize() - . = ..() - if(banner) - if(banner.decal_icon) - if(!global._banner_decals[banner.decal_icon]) - global._banner_decals[banner.decal_icon] = icon_states(banner.decal_icon) - var/decal = pick(global._banner_decals[banner.decal_icon]) - LAZYSET(banner.decals, decal, COLOR_WHITE) - banner.update_icon() - update_icon() diff --git a/code/modules/banners/__banner.dm b/code/modules/banners/__banner.dm new file mode 100644 index 000000000000..3301504725f6 --- /dev/null +++ b/code/modules/banners/__banner.dm @@ -0,0 +1,133 @@ +/obj/item/banner + name = "banner" + desc = "A furled-up banner." + icon = 'icons/obj/items/banners/banner.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/cloth + color = /decl/material/solid/organic/cloth::color + max_health = 20 + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + w_class = ITEM_SIZE_NORMAL + var/colourise_decal = TRUE + var/hung_desc = "The banner is rather unremarkable." + var/banner_type = /obj/item/banner + var/embroiderable = TRUE + var/name_prefix + var/list/decals + var/trim_color + +var/global/list/banner_type_to_symbols = list() +/obj/item/banner/proc/get_available_decals() + . = global.banner_type_to_symbols[banner_type] + if(!.) + . = list() + for(var/decl/banner_symbol/symbol in decls_repository.get_decls_of_type_unassociated(/decl/banner_symbol)) + if(banner_type in symbol.usable_by_banner_type) + . += symbol + global.banner_type_to_symbols[banner_type] = . + +// TODO: PROPER EMBROIDERY AND ITEM DECORATION. +/obj/item/banner/attackby(obj/item/used_item, mob/user) + + if(embroiderable && istype(used_item, /obj/item/stack/material/thread)) + + // TODO: check material crafting skill and do a do_after() + + if((!length(get_available_decals()) || length(decals)) && trim_color) + to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) + return TRUE + + var/obj/item/stack/material/thread/used_stack = used_item + if(used_stack.get_amount() < 5) + to_chat(user, SPAN_WARNING("You need at least five lengths of thread to embroider a banner.")) + return TRUE + + if(!trim_color) + user.visible_message("\The [user] sews a trim onto \the [src].") + trim_color = used_item.color + used_stack.use(5) + return TRUE + + if(length(get_available_decals()) && !length(decals)) + var/list/available_decals = get_available_decals() + var/decal_color = used_item.color + var/decal_to_sew = input(user, "Which symbol do you wish to add to \the [src]?", "Banner Symbol") as null|anything in available_decals + if(decal_to_sew && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item && used_stack.use(5)) + decals[decal_to_sew] = decal_color + return TRUE + + . = ..() + +// 'woven grass banner', 'forked linen banner' +/obj/item/banner/update_name() + . = ..() + SetName("[name_prefix] [name]") + +/obj/item/banner/examine(mob/user, distance, infix, suffix) + . = ..() + var/decorations = get_decal_string() + if(decorations) + to_chat(user, "\The [src] is decorated with [decorations].") + +/obj/item/banner/proc/get_decal_string() + for(var/decl/banner_symbol/decal in decals) + if(colourise_decal) + LAZYADD(., "\a [decal.name]") + else + LAZYADD(., "\a [decal.name]") + if(trim_color) + // This is weak but I'm not sure how else to phrase it without a color-to-string system. + LAZYADD(., "a trim") + if(.) + return english_list(.) + +/obj/item/banner/forked + name_prefix = "forked" + hung_desc = "The banner splits into two tails at the bottom." + icon = 'icons/obj/items/banners/banner_forked.dmi' + +/obj/item/banner/forked/get_available_decals() + return null // Current decals do not work nicely with the fork + +/obj/item/banner/pointed + name_prefix = "pointed" + hung_desc = "The banner narrows to a point at the bottom." + icon = 'icons/obj/items/banners/banner_pointed.dmi' + +/obj/item/banner/rounded + name_prefix = "rounded" + hung_desc = "The banner has a rounded lower edge." + icon = 'icons/obj/items/banners/banner_rounded.dmi' + +/obj/item/banner/square + name_prefix = "square" + hung_desc = "The banner has a squared-off lower edge." + icon = 'icons/obj/items/banners/banner_square.dmi' + +/obj/item/banner/tasselled + name_prefix = "tasselled" + hung_desc = "The banner has several dangling tassels at the bottom." + icon = 'icons/obj/items/banners/banner_tasselled.dmi' + +/obj/item/banner/woven + name_prefix = "woven" + icon = 'icons/obj/items/banners/banner_woven.dmi' + material = /decl/material/solid/organic/plantmatter/grass/dry + color = /decl/material/solid/organic/plantmatter/grass/dry::color + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + hung_desc = "The woven banner is rustic and uneven." + +/obj/item/banner/green + name = "green banner" + paint_color = COLOR_GREEN + color = COLOR_GREEN + +/obj/item/banner/red + name = "red banner" + paint_color = COLOR_RED + color = COLOR_RED + +/obj/item/banner/blue + name = "blue banner" + paint_color = COLOR_BLUE + color = COLOR_BLUE diff --git a/code/modules/banners/_banner_frame.dm b/code/modules/banners/_banner_frame.dm new file mode 100644 index 000000000000..cda9521373e5 --- /dev/null +++ b/code/modules/banners/_banner_frame.dm @@ -0,0 +1,126 @@ +/obj/structure/banner_frame + name = "banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon = 'icons/obj/structures/banner_frame.dmi' + icon_state = "banner_stand_preview" + material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood::color + anchored = TRUE + opacity = FALSE + atom_flags = ATOM_FLAG_CLIMBABLE + layer = ABOVE_WINDOW_LAYER + obj_flags = OBJ_FLAG_ANCHORABLE + tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR + max_health = 50 + density = TRUE + + var/force_south_facing = TRUE + var/base_icon_state = "banner_stand" + /// Reference to any banner currently hung on the frame. + var/obj/item/banner/banner + var/accepts_banner_type = /obj/item/banner + +/obj/structure/banner_frame/set_dir(ndir) + return ..(force_south_facing ? SOUTH : ndir) + +/obj/structure/banner_frame/Initialize(ml, _mat, _reinf_mat) + if(ispath(banner)) + set_banner(new banner(src)) + . = ..() + update_icon() + +/obj/structure/banner_frame/proc/set_banner(var/new_banner) + if(banner == new_banner) + return + banner = new_banner + if(banner) + name = banner.name + var/list/desc_strings = list(initial(desc), banner.hung_desc) + var/decorations = banner.get_decal_string() + if(decorations) + desc_strings += "It is decorated with [decorations]." + desc = jointext(desc_strings, " ") + else + name = initial(name) + desc = initial(desc) + update_icon() + +/obj/structure/banner_frame/attack_hand(mob/user) + if(banner && user.check_dexterity(DEXTERITY_HOLD_ITEM)) + user.put_in_hands(banner) + var/old_banner = banner + set_banner(null) + user.visible_message( + SPAN_NOTICE("\The [user] removes \the [old_banner] from \the [src]."), + SPAN_NOTICE("You remove \the [old_banner] from \the [src]."), + SPAN_NOTICE("You hear the rustling of fabric.") + ) + return TRUE + return ..() + +/obj/structure/banner_frame/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/banner)) + if(banner) + to_chat(user, SPAN_WARNING("There is already a banner hung on \the [src].")) + return TRUE + + var/obj/item/banner/other_banner = O + if(other_banner.banner_type != accepts_banner_type) + to_chat(user, SPAN_WARNING("\The [src] is not suitable for hanging \the [O].")) + return TRUE + + if(user.try_unequip(O, src)) + user.visible_message(SPAN_NOTICE("\The [user] hangs \the [O] from \the [src]."), SPAN_NOTICE("You hang \the [O] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) + set_banner(O) + return TRUE + return ..() + +/obj/structure/banner_frame/dump_contents(atom/forced_loc = loc, mob/user) + if(istype(banner)) + banner.dropInto(forced_loc) + banner = null + . = ..() + +/obj/structure/banner_frame/on_update_icon() + . = ..() + + icon_state = base_icon_state + if(!istype(banner)) + return + + var/image/I = image(banner.icon, "[banner.icon_state]-hanging") + I.appearance_flags |= RESET_COLOR + I.color = banner.color + add_overlay(I) + + for(var/decl/banner_symbol/decal as anything in banner.decals) + I = image(decal.icon, decal.icon_state) + I.appearance_flags |= RESET_COLOR + I.blend_mode = BLEND_INSET_OVERLAY // Masks us to the banner icon. + if(banner.colourise_decal) + I.color = banner.decals[decal] + else + I.color = banner.color + add_overlay(I) + + if(banner.trim_color) + I = image(banner.icon, "[banner.icon_state]-trim") + I.appearance_flags |= RESET_COLOR + I.color = banner.trim_color + add_overlay(I) + +/obj/structure/banner_frame/Destroy() + if(istype(banner)) + QDEL_NULL(banner) + return ..() + +// A wall-mounted banner frame with no stand. +/obj/structure/banner_frame/wall + name = "hanging banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon_state = "banner_hanging_preview" + base_icon_state = "banner_hanging" + directional_offset = @'{"NORTH":{"y":-32},"SOUTH":{"y":-32},"EAST":{"x":-32},"WEST":{"x":-32}}' + force_south_facing = FALSE + density = FALSE diff --git a/code/modules/banners/_banner_symbols.dm b/code/modules/banners/_banner_symbols.dm new file mode 100644 index 000000000000..2de8b8a6521d --- /dev/null +++ b/code/modules/banners/_banner_symbols.dm @@ -0,0 +1,201 @@ +/decl/banner_symbol + abstract_type = /decl/banner_symbol + decl_flags = DECL_FLAG_MANDATORY_UID + /// Icon to draw from when rendering on a banner. + var/icon = 'icons/obj/items/banners/banner_symbols.dmi' + /// Icon state to draw from the icon. + var/icon_state + /// String used to select/describe a symbol + var/name + var/usable_by_banner_type = list( + /obj/item/banner + ) + +/decl/banner_symbol/validate() + . = ..() + if(!icon) + . += "null icon" + if(!istext(icon_state)) + . += "invalid/null icon_state" + if(!istext(name)) + . += "invalid/null name" + if(icon && icon_state && !check_state_in_icon(icon_state, icon)) + . += "missing icon_state '[icon_state]' from icon '[icon]'" + +// Default definitions below. +/decl/banner_symbol/starburst + name = "starburst" + icon_state = "starburst" + uid = "symbol_starburst" + +/decl/banner_symbol/fern + name = "fern" + icon_state = "fern" + uid = "symbol_fern" + +/decl/banner_symbol/snowflake + name = "snowflake" + icon_state = "snowflake" + uid = "symbol_snowflake" + +/decl/banner_symbol/sun + name = "sun" + icon_state = "sun" + uid = "symbol_sun" + +/decl/banner_symbol/scarab + name = "scarab" + icon_state = "scarab" + uid = "symbol_scarab" + +/decl/banner_symbol/triangle_chevron + name = "triangle with chevron" + icon_state = "triangle with chevron" + uid = "symbol_triangle_chevron" + +/decl/banner_symbol/triangle_down + name = "downward triangle" + icon_state = "downward triangle" + uid = "symbol_triangle_down" + +/decl/banner_symbol/triangle_up + name = "upward triangle" + icon_state = "upward triangle" + uid = "symbol_triangle_up" + +/decl/banner_symbol/hand + name = "hand" + icon_state = "hand" + uid = "symbol_hand" + +/decl/banner_symbol/sword + name = "sword" + icon_state = "sword" + uid = "symbol_sword" + +/decl/banner_symbol/knot + name = "knot" + icon_state = "knot" + uid = "symbol_knot" + +/decl/banner_symbol/circled_cup + name = "circled cup" + icon_state = "circled cup" + uid = "symbol_cup_circle" + +/decl/banner_symbol/aquila + name = "aquila" + icon_state = "aquila" + uid = "symbol_aquila" + +/decl/banner_symbol/orb + name = "orb" + icon_state = "orb" + uid = "symbol_orb" + +/decl/banner_symbol/bird_head + name = "bird head" + icon_state = "bird head" + uid = "symbol_bird_head" + +/decl/banner_symbol/deer + name = "deer" + icon_state = "deer" + uid = "symbol_deer" + +/decl/banner_symbol/deer_antler + name = "antlered deer" + icon_state = "antlered deer" + uid = "symbol_deer_antler" + +/decl/banner_symbol/duck + name = "duck head" + icon_state = "duck head" + uid = "symbol_duck_head" + +/decl/banner_symbol/frog + name = "frog" + icon_state = "frog" + uid = "symbol_frog" + +/decl/banner_symbol/fish + name = "fish" + icon_state = "fish" + uid = "symbol_fish" + +/decl/banner_symbol/bird + name = "bird" + icon_state = "bird" + uid = "symbol_bird" + +/decl/banner_symbol/cross + name = "cross" + icon_state = "cross" + uid = "symbol_cross" + +/decl/banner_symbol/sign + icon = 'icons/obj/items/banners/sign_symbols.dmi' + abstract_type = /decl/banner_symbol/sign + usable_by_banner_type = list( + /obj/item/banner/sign + ) + +/decl/banner_symbol/sign/mug + name = "mug" + icon_state = "mug" + uid = "symbol_sign_mug" + +/decl/banner_symbol/sign/scales + name = "scales" + icon_state = "scales" + uid = "symbol_sign_scales" + +/decl/banner_symbol/sign/mortar_pestle + name = "mortar and pestle" + icon_state = "mortar and pestle" + uid = "symbol_sign_mortar_pestle" + +/decl/banner_symbol/sign/pick_shovel + name = "pick and shovel" + icon_state = "pick and shovel" + uid = "symbol_sign_pick_shovel" + +/decl/banner_symbol/sign/face + name = "face" + icon_state = "face" + uid = "symbol_sign_face" + +/decl/banner_symbol/sign/crescent + name = "crescent" + icon_state = "crescent" + uid = "symbol_sign_crescent" + +/decl/banner_symbol/sign/vial + name = "vial" + icon_state = "vial" + uid = "symbol_sign_vial" + +/decl/banner_symbol/sign/spool + name = "spool" + icon_state = "spool" + uid = "symbol_sign_spool" + +/decl/banner_symbol/sign/pawnbroker + name = "pawnbroker" + icon_state = "pawnbroker" + uid = "symbol_sign_pawnbroker" + +/decl/banner_symbol/sign/sword + name = "sword" + icon_state = "sword" + uid = "symbol_sign_sword" + +/decl/banner_symbol/sign/cross + name = "cross" + icon_state = "cross" + uid = "symbol_sign_cross" + +/decl/banner_symbol/sign/circle + name = "circle" + icon_state = "circle" + uid = "symbol_sign_circle" diff --git a/code/modules/banners/banner_frame_definitions.dm b/code/modules/banners/banner_frame_definitions.dm new file mode 100644 index 000000000000..cf09eaf4652a --- /dev/null +++ b/code/modules/banners/banner_frame_definitions.dm @@ -0,0 +1,57 @@ +// Mapping helpers below. +/obj/structure/banner_frame/blue + banner = /obj/item/banner/blue + color = /obj/item/banner/blue::color // Mapping preview colour. + +/obj/structure/banner_frame/red + banner = /obj/item/banner/red + color = /obj/item/banner/red::color + +/obj/structure/banner_frame/green + banner = /obj/item/banner/green + color = /obj/item/banner/green::color + +/obj/structure/banner_frame/wall/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/banner_frame/wall/ebony/red + banner = /obj/item/banner/red + color = /obj/item/banner/red::color // Mapping preview colour. + +/obj/structure/banner_frame/wall/ebony/blue + banner = /obj/item/banner/blue + color = /obj/item/banner/blue::color + +/obj/structure/banner_frame/wall/ebony/green + banner = /obj/item/banner/green + color = /obj/item/banner/green::color + +/obj/structure/banner_frame/wall/ebony/woven + banner = /obj/item/banner/woven + color = /obj/item/banner/woven::color + +// Debug item. +/obj/structure/banner_frame/random/Initialize(ml, _mat, _reinf_mat) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/structure/banner_frame/random/LateInitialize() + ..() + var/banner_type = pick(list( + /obj/item/banner/pointed, + /obj/item/banner/rounded, + /obj/item/banner/square, + /obj/item/banner/tasselled, + /obj/item/banner/woven + )) + var/obj/item/banner/new_banner = new banner_type(src) + new_banner.set_color(get_random_colour()) + new_banner.trim_color = get_random_colour() + var/list/available_decals = new_banner.get_available_decals() + if(length(available_decals)) + var/decal = pick(available_decals) + var/decal_color = get_random_colour() + LAZYSET(new_banner.decals, decal, decal_color) + new_banner.update_icon() + set_banner(new_banner) diff --git a/code/modules/banners/sign.dm b/code/modules/banners/sign.dm new file mode 100644 index 000000000000..cfc15e3310c2 --- /dev/null +++ b/code/modules/banners/sign.dm @@ -0,0 +1,25 @@ +/obj/item/banner/sign + name = "sign" + banner_type = /obj/item/banner/sign + embroiderable = FALSE + icon = 'icons/obj/items/banners/sign.dmi' + material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood::color + hung_desc = "The sign is unadorned." + colourise_decal = FALSE + +/obj/item/banner/sign/attackby(obj/item/used_item, mob/user) + if(IS_KNIFE(used_item) && user.a_intent == I_HELP) + var/available_decals = get_available_decals() + if(!length(available_decals) || length(decals)) + to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) + return TRUE + var/decal_to_add = input(user, "Which symbol do you wish to add to \the [src]?", "Sign Symbol") as null|anything in available_decals + if(decal_to_add && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item) + decals[decal_to_add] = COLOR_WHITE + return TRUE + . = ..() + +/obj/item/banner/sign/random/Initialize(ml, material_key) + material = pick(typesof(/decl/material/solid/organic/wood)) + . = ..() diff --git a/code/modules/banners/sign_post.dm b/code/modules/banners/sign_post.dm new file mode 100644 index 000000000000..d1d0f959023e --- /dev/null +++ b/code/modules/banners/sign_post.dm @@ -0,0 +1,32 @@ +// what is a sign, if not a wooden banner +/obj/structure/banner_frame/sign + name = "sign post" + desc = "A post for hanging a sign." + icon = 'icons/obj/structures/sign_post.dmi' + desc = "A post for hanging a sign." + base_icon_state = "sign" + accepts_banner_type = /obj/item/banner/sign + icon_state = "sign_preview" + density = TRUE + +/obj/structure/banner_frame/sign/wall + base_icon_state = "sign_hanging" + icon_state = "sign_hanging_preview" + force_south_facing = FALSE + density = FALSE + +/obj/structure/banner_frame/sign/random/Initialize(ml, _mat, _reinf_mat) + material = pick(typesof(/decl/material/solid/organic/wood)) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/structure/banner_frame/sign/random/LateInitialize() + . = ..() + var/obj/item/banner/new_banner = new /obj/item/banner/sign/random(src) + if(new_banner) + var/list/available_decals = new_banner.get_available_decals() + if(length(available_decals)) + var/decal = pick(available_decals) + LAZYSET(new_banner.decals, decal, COLOR_WHITE) + new_banner.update_icon() + set_banner(new_banner) diff --git a/nebula.dme b/nebula.dme index 7c4b88297fe0..c0d587451052 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1414,7 +1414,6 @@ #include "code\game\objects\structures\_structure_icon.dm" #include "code\game\objects\structures\_structure_materials.dm" #include "code\game\objects\structures\ai_decoy.dm" -#include "code\game\objects\structures\banners.dm" #include "code\game\objects\structures\barricade.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" @@ -1820,6 +1819,12 @@ #include "code\modules\backgrounds\location\locations_other.dm" #include "code\modules\backgrounds\religion\_religion.dm" #include "code\modules\backgrounds\religion\religions_human.dm" +#include "code\modules\banners\__banner.dm" +#include "code\modules\banners\_banner_frame.dm" +#include "code\modules\banners\_banner_symbols.dm" +#include "code\modules\banners\banner_frame_definitions.dm" +#include "code\modules\banners\sign.dm" +#include "code\modules\banners\sign_post.dm" #include "code\modules\blob\blob.dm" #include "code\modules\blood\blood.dm" #include "code\modules\blood\blood_types.dm" From d19df16ae3d25d455e283bf816df0037c79e9ef3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 30 Nov 2024 12:57:07 +1100 Subject: [PATCH 20/42] Updating modpack banners. --- code/modules/banners/__banner.dm | 8 ++++++ mods/content/corporate/icons/banner.dmi | Bin 816 -> 0 bytes .../corporate/icons/banner_symbols.dmi | Bin 0 -> 318 bytes mods/content/corporate/items/clutter.dm | 11 +++++--- mods/content/government/icons/banner.dmi | Bin 913 -> 0 bytes .../government/icons/banner_symbols.dmi | Bin 0 -> 461 bytes mods/content/government/items/clutter.dm | 24 +++++++++++++----- 7 files changed, 34 insertions(+), 9 deletions(-) delete mode 100644 mods/content/corporate/icons/banner.dmi create mode 100644 mods/content/corporate/icons/banner_symbols.dmi delete mode 100644 mods/content/government/icons/banner.dmi create mode 100644 mods/content/government/icons/banner_symbols.dmi diff --git a/code/modules/banners/__banner.dm b/code/modules/banners/__banner.dm index 3301504725f6..647f3adc73a3 100644 --- a/code/modules/banners/__banner.dm +++ b/code/modules/banners/__banner.dm @@ -16,6 +16,14 @@ var/list/decals var/trim_color +/obj/item/banner/Initialize(ml, material_key) + for(var/decal in decals) + if(ispath(decal)) + var/decl/banner_symbol/decal_decl = GET_DECL(decal) + decals[decal_decl] = decals[decal] + decals -= decal + . = ..() + var/global/list/banner_type_to_symbols = list() /obj/item/banner/proc/get_available_decals() . = global.banner_type_to_symbols[banner_type] diff --git a/mods/content/corporate/icons/banner.dmi b/mods/content/corporate/icons/banner.dmi deleted file mode 100644 index cc4c3c95e9efe5a0757947e8cdd7f50eefeec807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 816 zcmV-01JC@4P)gwvz(b1lsp1Zrd-rnBm=;*7ftH8j(?d|QMp`lz{T(GdPzP`Ssq@=^c!}$34 zK#A6s00001bW%=J06^y0W&i*Hg?dz2bVOxyV{&P5bZKvH004NLQ&wgNLXApo+4 zL~1A&{UQJW0pUqRK~z|U<&+C=f-n$(OJ9x~onuTGFx|ud{~vd40o#I$ZIdO7r-B&2 zkLz(gLjEoaCz4=Fy+fP@8R`o3MO+3m&)95;78I7Zh9X)}Ec|4METqfNhV6fHA^5g{ zE<76O6#l;tN;|ila%}YUI=j!upqVsT&fajZFsKhm%45mu?TL+ zfJ3R2(m22?RQT;6+iNMTdES+vru##!KT0*X3wS5NhUP1Mc5Dc*%V9?vBnp}G}_|FvhIXsG#8Qc%rm6( z7egvf!{?iN(g2DS)lnGgXNPAZ05BgT4CnI<xI0&B<+5M#&@7(RE^yL diff --git a/mods/content/corporate/icons/banner_symbols.dmi b/mods/content/corporate/icons/banner_symbols.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8d534a69a4839161b048e58b6f63ff7859d65205 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSoB=)|t_Kbr`2YX^p@S#ypJ>|v z6l5$3@(X5gcy=QV$jPq?i70VNElw`VEGWs$&tqVym=hdUP*nQ;OK`!*uTQkRb+yi& zIUl?s)Zn7=gGV~&eKb!p6!rA(urLlXzHIEJFz3;vBa=cDf;IIG_4hB)*l1zu-`Q=f zx_O1flF8l1Yc&kbMUR+02?{ItTFf|`m*G*ijC*;+@>rnN8J;eVAr`&K2@;nMG_p=T zZ_&u>o4~otL4B9QWa(KBhfPWtO-mT{Ov+6P1WI0MNC+I*($%PVh0(LYbWLOCRhAT0 zA%{@D3RWQr35$t8dw6+xv?^F{gqa%n@;ZbGo;t8$RbxgvzbMd;CH(A5?zDnJiow&> K&t;ucLK6VHb#jpa literal 0 HcmV?d00001 diff --git a/mods/content/corporate/items/clutter.dm b/mods/content/corporate/items/clutter.dm index 4de07358d1b1..19ba76ee4557 100644 --- a/mods/content/corporate/items/clutter.dm +++ b/mods/content/corporate/items/clutter.dm @@ -23,14 +23,19 @@ /obj/item/banner/nanotrasen name = "\improper NanoTrasen banner" hung_desc = "The banner is emblazoned with the NanoTrasen logo." - icon = 'mods/content/corporate/icons/banner.dmi' desc = "A banner emblazoned with the NanoTrasen logo." material_alteration = MAT_FLAG_ALTERATION_NONE color = COLOR_NAVY_BLUE + trim_color = COLOR_GOLD decals = list( - "banner_trim" = COLOR_GOLD, - "banner_nanotrasen" = COLOR_WHITE + /decl/banner_symbol/nanotrasen = COLOR_WHITE ) /obj/structure/banner_frame/nanotrasen banner = /obj/item/banner/nanotrasen + +/decl/banner_symbol/nanotrasen + icon = 'mods/content/corporate/icons/banner_symbols.dmi' + name = "NanoTrasen logo" + icon_state = "nanotrasen" + uid = "symbol_corporate_nanotrasen" diff --git a/mods/content/government/icons/banner.dmi b/mods/content/government/icons/banner.dmi deleted file mode 100644 index 88a40994837056f868696a063bba2b920b1aeb47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 913 zcmV;C18)3@P)gwvz(b1lsp1Zrd-rnBm=;*7ftH8j(?d|QMp`lz{T(GdPzP`Ssq@=^c!@$76 z|9L>)-{1edKmg4D!27VT00001bW%=J06^y0W&i*Hhk8_4bVOxyV{&P5bZKvH004NL zQ&wawp0006sNklvEeg5JmxAQnn~ArGWx<(sn3$ z|2M3JBoIi#Mv7-uVlKr%zvUpp;kw6R#BRE8GpvzZL)t;F;3PyufFPxaj*yN zfFNm#qOM8TJm7^}nxO{im*Jzuk_E?atcj?h{A{?*8^X#NO^^ zgM9W_|7;pOd@Uh1em1B_r|TYC410WkQvIkDN9Rqd4Pkt3@blH9G7IG|2LBX`Cb=JF zcN&CZe~4r7QgLjLICJLAna`PF|Ihz;!r>!-4a4-d!w)wI?8u`&dilWyP94Vg_iI#Mj9$DUh~e)n nAbJk&$fNnOo86f+XC9RQRqQFcdVEF&00000NkvXXu0mjfF{R0n diff --git a/mods/content/government/icons/banner_symbols.dmi b/mods/content/government/icons/banner_symbols.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ae958dd1f6d3cd8922d86cbc4a89b1246b995d86 GIT binary patch literal 461 zcmV;;0W$uHP)00DGTPE!Ct=GbNc003@!R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSI6p^;i!&v&s2HS$i!-e#F*g;&Hbkf?%PhjBMp?nt&joBT0BD{gPC*sySO5S3 z?@2^KR9J=Wl}!$WAPj}E;Q+u13Uh-wfs5Y%OjBn>j8c9!E++jFjnVgLOHDCGQJT0B zQNsKL-~qaNFpwQ+QgqnR<}~uExV)n28o(bK^qgKlLWol6r;#;Wap)J#X=D-X zR~uN$#;~=U5#!3LIG{iEVUW^kMN$48TIFw$?(Zy-tgnq>A~^&P;z~vh0~mjeU@6~f z#Bi&jZGiB;o``nKM=Tp5`Rh9tTd|1q)Gr}O-dC(_QqwTqhv`n&Y5hxzq9{AR`8zQ% zzVlQbs(1amg`m}rI(TW?JmSglykWYA>0O%dgQ65Zp Date: Mon, 2 Dec 2024 00:55:55 +0000 Subject: [PATCH 21/42] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 11782eae61ac..af37f2ad8369 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -106,12 +106,6 @@

    MistakeNot4892 updated:

    • Sledgehammers can demolish non-reinforced walls.
    - -

    30 September 2024

    -

    Atermonera updated:

    -
      -
    • Fixed some grammatical issues in location event strings.
    • -
    From 7ac5722f031a3d8392ac99d80f20e2c0bffdf912 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 30 Nov 2024 12:13:57 +1100 Subject: [PATCH 22/42] Adding a priority list system for mouse cursor icons. --- code/_helpers/cmp.dm | 5 +- code/_helpers/visual_filters.dm | 5 +- .../client/mouse_pointer/_mouse_pointer.dm | 67 ++++++++++++++++++ .../mouse_pointer_definitions.dm | 31 ++++++++ code/modules/mob/login.dm | 1 + code/modules/mob/mob.dm | 9 ++- code/modules/mob/mob_defines.dm | 3 - .../mouse_pointers/examine_pointer.dmi | Bin 430 -> 609 bytes nebula.dme | 2 + 9 files changed, 110 insertions(+), 13 deletions(-) create mode 100644 code/modules/client/mouse_pointer/_mouse_pointer.dm create mode 100644 code/modules/client/mouse_pointer/mouse_pointer_definitions.dm diff --git a/code/_helpers/cmp.dm b/code/_helpers/cmp.dm index e84ecc341fcc..32637fecad8d 100644 --- a/code/_helpers/cmp.dm +++ b/code/_helpers/cmp.dm @@ -154,4 +154,7 @@ if(a == prerequisite) return -1 // goes after return cmp_skill_asc(a, GET_DECL(b.prerequisites[1])) - return cmp_name_or_type_asc(a, b) \ No newline at end of file + return cmp_name_or_type_asc(a, b) + +/proc/cmp_priority_list(list/A, list/B) + return A["priority"] - B["priority"] diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm index deb7162f1964..ad1fc9104209 100644 --- a/code/_helpers/visual_filters.dm +++ b/code/_helpers/visual_filters.dm @@ -5,9 +5,6 @@ /atom/movable var/list/filter_data // For handling persistent filters -/proc/cmp_filter_data_priority(list/A, list/B) - return A["priority"] - B["priority"] - // Defining this for future proofing and ease of searching for erroneous usage. /image/proc/add_filter(filter_name, priority, list/params) filters += filter(arglist(params)) @@ -35,7 +32,7 @@ /atom/movable/proc/update_filters() filters = null - filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE) + filter_data = sortTim(filter_data, /proc/cmp_priority_list, TRUE) for(var/f in filter_data) var/list/data = filter_data[f] var/list/arguments = data.Copy() diff --git a/code/modules/client/mouse_pointer/_mouse_pointer.dm b/code/modules/client/mouse_pointer/_mouse_pointer.dm new file mode 100644 index 000000000000..3f42c8b3f4e8 --- /dev/null +++ b/code/modules/client/mouse_pointer/_mouse_pointer.dm @@ -0,0 +1,67 @@ +/* + * Adds pointer entries to clients to allow for multiple sources wanting to modify the cursor at once. + * - add_mouse_pointer(pointer_type, pointer_priority, icon_index) will add or replace a pointer of the specified /decl/mouse_pointer type. + * - remove_mouse_pointer(pointer_type) will clear that entry. + * - Updates are handled automatically by adding/removing, other procs should not be used without a good reason. + */ + +/client + VAR_PRIVATE/list/_mouse_pointers + +/client/proc/clear_mouse_pointers() + if(LAZYLEN(_mouse_pointers)) + LAZYCLEARLIST(_mouse_pointers) + update_mouse_pointer() + return TRUE + return FALSE + +/client/proc/set_mouse_pointer_icon(new_cursor) + if(isnull(new_cursor)) + new_cursor = initial(mouse_pointer_icon) + if(mouse_pointer_icon != new_cursor) + mouse_pointer_icon = new_cursor + return TRUE + return FALSE + +/client/proc/add_mouse_pointer(pointer_type, pointer_priority = 1, icon_index = 1) + + // Is an identical pointer already being tracked? + var/decl/mouse_pointer/pointer_decl = ispath(pointer_type) ? GET_DECL(pointer_type) : pointer_type + if(!isnum(icon_index) || icon_index < 1 || icon_index > length(pointer_decl.icons)) + CRASH("Invalid icon_index passed to add_mouse_pointer() for [pointer_type].") + + var/pointer_icon = pointer_decl.icons[icon_index] + var/list/comparing = _mouse_pointers?[pointer_type] + if(islist(comparing) && comparing["icon"] == pointer_icon && comparing["priority"] == pointer_priority) + return FALSE + + // Update our list entry. If we have multiple pointers, sort by priority. + var/need_update = !(pointer_type in _mouse_pointers) + LAZYSET(_mouse_pointers, pointer_type, list("icon" = pointer_icon, "priority" = pointer_priority)) + if(LAZYLEN(_mouse_pointers) > 1) + _mouse_pointers = sortTim(_mouse_pointers, /proc/cmp_priority_list, TRUE) + need_update = TRUE + + // Refresh if needed. + if(need_update) + update_mouse_pointer() + +/client/proc/remove_mouse_pointer(pointer_type) + if(!_mouse_pointers?[pointer_type]) + return FALSE + var/current_pointer = _mouse_pointers[1] + LAZYREMOVE(_mouse_pointers, pointer_type) + if(pointer_type == current_pointer) + update_mouse_pointer() + return TRUE + +/client/proc/update_mouse_pointer() + if(!LAZYLEN(_mouse_pointers)) + return set_mouse_pointer_icon() + var/list/pointer = _mouse_pointers[_mouse_pointers[1]] + if(!islist(pointer)) + return set_mouse_pointer_icon() + var/set_pointer = pointer["icon"] + if(isicon(set_pointer)) + return set_mouse_pointer_icon(set_pointer) + return set_mouse_pointer_icon() diff --git a/code/modules/client/mouse_pointer/mouse_pointer_definitions.dm b/code/modules/client/mouse_pointer/mouse_pointer_definitions.dm new file mode 100644 index 000000000000..f03d328975a1 --- /dev/null +++ b/code/modules/client/mouse_pointer/mouse_pointer_definitions.dm @@ -0,0 +1,31 @@ +/decl/mouse_pointer + abstract_type = /decl/mouse_pointer + /// Icon to set on the client for this cursor. + var/list/icons + +/decl/mouse_pointer/Initialize() + . = ..() + if(icons && !islist(icons)) + icons = list(icons) + +/decl/mouse_pointer/validate() + . = ..() + if(length(icons)) + var/static/list/check_states = list( + "", + "over", + "drag", + "drop", + "all" + ) + for(var/icon in icons) + for(var/check_state in check_states) + if(!check_state_in_icon(check_state, icon)) + . += "missing state '[check_state]' from icon '[icon]'" + else + . += "null or empty icon list" + +// Subtypes for use in add_mouse_pointer() below. +/decl/mouse_pointer/examine + uid = "pointer_examine" + icons = 'icons/effects/mouse_pointers/examine_pointer.dmi' diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index a2d7f65ab163..7903631bb68a 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -59,6 +59,7 @@ /mob/Login() + client.clear_mouse_pointers() // in case we are transferring mobs. global.player_list |= src update_Login_details() world.update_status() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7554d0e91f55..edf74c14dd0f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1135,11 +1135,10 @@ /mob/proc/update_mouse_pointer() if(!client) return - - client.mouse_pointer_icon = initial(client.mouse_pointer_icon) - - if(examine_cursor_icon && client.keys_held["Shift"]) - client.mouse_pointer_icon = examine_cursor_icon + if(client.keys_held["Shift"]) + client.add_mouse_pointer(/decl/mouse_pointer/examine) + else + client.remove_mouse_pointer(/decl/mouse_pointer/examine) /mob/keybind_face_direction(direction) facedir(direction) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index c6b35aa28723..957cdba36a3b 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -70,9 +70,6 @@ */ var/obj/screen/zone_selector/zone_sel = null - /// Cursor icon used when holding shift over things. - var/examine_cursor_icon = 'icons/effects/mouse_pointers/examine_pointer.dmi' - var/damageoverlaytemp = 0 var/obj/machinery/machine = null diff --git a/icons/effects/mouse_pointers/examine_pointer.dmi b/icons/effects/mouse_pointers/examine_pointer.dmi index 41a9cec13b07fc8954d21e7877b2b1f0ba7a1374..a565a554fa7dc443874466b4e8034248c13b3a32 100644 GIT binary patch delta 450 zcmV;z0X_b%1K|WEiBL{Q4GJ0x0000DNk~Le0001B0000$2m=5B0MhD$JOBUyMUf>& z7$GDwVtogp00001bW%=J06^y0W&i*Hh>?J3e-S$JfmV>NE2Stgog7{H1*Gdr%*i2I zld^)Vp9?tT07Y_FeahjX4FCWEHc3Q5R9J=WmceeqFcbt$TjIPF6Oz*Z|JC}rE#i=5 zElqp@mIH@bd81&Y3GWBbTUZO_;qZ~uke5PB?uDj27uxc$_519>!yP|*_U3oEi=J++ ze}Z|8y_xm7(~8@WKW57f%0n0J^ORCLd7}Y8#(r?_jeem)c`n$H(s?|mwD<^=d%;o~ zFXQ?Fi2oHfpAd0>hbG=J;^h{YxFv{}d;FUirv^NPc>5<#iv`L{qh!jN8}R>1{+{Nq z#RlcK%-8GpR)g}~n8gW@Kg_~rfpTxOc;&A=Qn3H4VE?ZfK>lAb!2DkiK>wEm)c;lX z^M4iU|MGn3{}tym|5u^@uY&zw4?zE~7-0TiHvs%!4^aPC!Tztp{a=Oqf5igz|Eh_w sga4~=|CbBcou6a@`oCUa{FNul4+@+uh`ls(cmMzZ07*qoM6N<$f^%-yT>t<8 delta 270 zcmaFJvW{7`Gr-TCmrII^fq{Y7)59eQNGpIa2Q!d#S<-b3NI6YZbrY4^>wXl-W-JNv z3ubV5b|VeQDVo@vQNMGFXw2W317QpdIS*u}2Ao~V2$Y%Q>Eak-(R=p7S)oG;JS+*T zoIG;7E`0kNf0f0$kA2fUnd!{!f7Sl9yiVE4Vt(0|`4?Y6KEpSz0{IJntL%Pdd`$I8 z@s#UynK^T_)cWU<;+vI)KGq6OJbI+SVcuHviSA0T7?rXkU5_b?Y;gCe6ybT$a^?fy zH!ipJFaCev3Y2Yhct3wlvcLvM~b%-r_=xcJ376@!4r-}_Gq{|Mxisabe* QJJ6vFp00i_>zopr0E!xE@c;k- diff --git a/nebula.dme b/nebula.dme index 7c4b88297fe0..7de4fd806009 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1870,6 +1870,8 @@ #include "code\modules\client\preferences_spawnpoints.dm" #include "code\modules\client\preferences_storage.dm" #include "code\modules\client\preferences_toggle.dm" +#include "code\modules\client\mouse_pointer\_mouse_pointer.dm" +#include "code\modules\client\mouse_pointer\mouse_pointer_definitions.dm" #include "code\modules\client\preference_setup\_defines.dm" #include "code\modules\client\preference_setup\preference_setup.dm" #include "code\modules\client\preference_setup\antagonism\01_candidacy.dm" From 5d27cfcceeb86ca5a30f9d14cb34a89f74580227 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Sun, 1 Dec 2024 21:59:14 -0500 Subject: [PATCH 23/42] Add tech levels to slapcrafting recipes --- code/controllers/subsystems/initialization/fabrication.dm | 3 +++ code/modules/crafting/slapcrafting/_crafting_stage.dm | 7 ++++++- .../crafting_recipes/bot_crafting/crafting_floorbot.dm | 3 ++- .../crafting_recipes/bot_crafting/crafting_janibot.dm | 1 + .../crafting_recipes/bot_crafting/crafting_medibot.dm | 1 + .../crafting_recipes/bot_crafting/crafting_secbot.dm | 1 + .../improvised_crafting/crafting_buckler.dm | 1 + .../improvised_crafting/crafting_crossbow.dm | 1 + .../improvised_crafting/crafting_spear_prod.dm | 1 + 9 files changed, 17 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/initialization/fabrication.dm b/code/controllers/subsystems/initialization/fabrication.dm index e383f77a1c43..37a6d57dfae0 100644 --- a/code/controllers/subsystems/initialization/fabrication.dm +++ b/code/controllers/subsystems/initialization/fabrication.dm @@ -33,6 +33,9 @@ SUBSYSTEM_DEF(fabrication) var/list/all_crafting_handlers = decls_repository.get_decls_of_subtype(/decl/crafting_stage) for(var/hid in all_crafting_handlers) var/decl/crafting_stage/handler = all_crafting_handlers[hid] + // TODO: revisit this if map tech level can be mutated at runtime + if(global.using_map.map_tech_level < handler.available_to_map_tech_level) + continue if(ispath(handler.begins_with_object_type)) LAZYDISTINCTADD(crafting_procedures_by_type[handler.begins_with_object_type], handler) diff --git a/code/modules/crafting/slapcrafting/_crafting_stage.dm b/code/modules/crafting/slapcrafting/_crafting_stage.dm index 6b1cc730cd72..23275abf92b0 100644 --- a/code/modules/crafting/slapcrafting/_crafting_stage.dm +++ b/code/modules/crafting/slapcrafting/_crafting_stage.dm @@ -10,6 +10,8 @@ var/begins_with_object_type var/list/next_stages var/product + /// What is the minimum map tech level to have access to this recipe? + var/available_to_map_tech_level = MAP_TECH_LEVEL_ANY /decl/crafting_stage/Initialize() . = ..() @@ -18,12 +20,15 @@ stages += GET_DECL(nid) next_stages = stages +/decl/crafting_stage/proc/is_available() + return global.using_map.map_tech_level >= available_to_map_tech_level + /decl/crafting_stage/proc/can_begin_with(var/obj/item/thing) . = istype(thing, begins_with_object_type) /decl/crafting_stage/proc/get_next_stage(var/obj/item/trigger) for(var/decl/crafting_stage/next_stage in next_stages) - if(next_stage.is_appropriate_tool(trigger) && next_stage.is_sufficient_amount(null, trigger)) + if(next_stage.is_available() && next_stage.is_appropriate_tool(trigger) && next_stage.is_sufficient_amount(null, trigger)) return next_stage /decl/crafting_stage/proc/progress_to(var/obj/item/thing, var/mob/user, var/obj/item/target) diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm index 0c270b5d63e1..38a9a9da5077 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm @@ -6,6 +6,7 @@ progress_message = "You dump a bunch of floor tiles into the empty toolbox." item_icon_state = "floorbot_1" next_stages = list(/decl/crafting_stage/proximity/floorbot) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/proximity/floorbot progress_message = "You wedge the proximity sensor in amongst the floor tiles." @@ -22,4 +23,4 @@ var/mob/living/bot/floorbot/bot = . var/obj/item/toolbox/box = locate() in work bot.boxtype = box.icon_state - bot.update_icon() + bot.update_icon() diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm index 8b249c33ad39..90b6b3a8d18a 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm @@ -4,6 +4,7 @@ progress_message = "You put the proximity sensor into the bucket." item_icon_state = "janibot_1" next_stages = list(/decl/crafting_stage/robot_arms/janibot) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/robot_arms/janibot progress_message = "You attach the arm to the assembly and finish off the Janibot. Beep boop." diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm index c376a5bffb2c..5a44b023be7d 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm @@ -5,6 +5,7 @@ completion_trigger_type = /obj/item/robot_parts item_icon_state = "medibot_1" next_stages = list(/decl/crafting_stage/scanner) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/scanner progress_message = "You add the health sensor to the assembly" diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm index 9e53c82645d7..af756c222af9 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm @@ -5,6 +5,7 @@ progress_message = "You add the signaler to the helmet." item_icon_state = "secbot_1" next_stages = list(/decl/crafting_stage/welding/secbot) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/secbot_signaller/can_begin_with(var/obj/item/thing) . = istype(thing, begins_with_object_type) diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm index 4270ffc3b334..d2c910fba7b9 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm @@ -7,6 +7,7 @@ progress_message = "You crudely sever the legs off the stool and remove the seat." consume_completion_trigger = FALSE next_stages = list(/decl/crafting_stage/buckler_panels) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE // todo: modern tech level /decl/crafting_stage/buckler_panels item_desc = "It's the seat of a stool with the legs sawn off and wooden planks layered over the top, ready to secure in place." diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm index 0516f188c224..7335cb83aefb 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm @@ -14,6 +14,7 @@ item_icon_state = "crossbowframe1" progress_message = "You assemble a backbone of rods around the wooden stock." next_stages = list(/decl/crafting_stage/welding/crossbow_rods) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/welding/crossbow_rods completion_trigger_type = /obj/item/weldingtool diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm index c79c047216b6..1b8e062fbbce 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm @@ -11,6 +11,7 @@ /decl/crafting_stage/spear_blade_blade, /decl/crafting_stage/stunprod_wirecutters ) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/material/stunprod_rod/consume_crafting_resource(var/mob/user, var/obj/item/thing, var/obj/item/target) . = ..() From 2aa5e644906c3376786a296d4da7d6ff04fbfc8d Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 2 Dec 2024 19:54:14 -0500 Subject: [PATCH 24/42] Add on-examine and alt interaction functionality to stock parts --- .../machinery/_machines_base/machinery.dm | 2 + .../_machines_base/machinery_components.dm | 9 ++++ .../stock_parts/_stock_parts.dm | 10 ++++ .../_machines_base/stock_parts/card_reader.dm | 7 +++ .../_machines_base/stock_parts/disk_reader.dm | 5 ++ .../_machines_base/stock_parts/item_holder.dm | 48 ++++++++++++++++++- code/modules/paperwork/faxmachine.dm | 18 ------- 7 files changed, 79 insertions(+), 20 deletions(-) diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index 290540f78f58..6736ad221bbe 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -433,6 +433,8 @@ Class Procs: var/obj/item/fake_thing = type parts += "[num2text(missing[type])] [initial(fake_thing.name)]" to_chat(user, "\The [src] is missing [english_list(parts)], rendering it inoperable.") + for(var/obj/item/stock_parts/part in component_parts) + part.on_machine_examined(user) // This is really pretty crap and should be overridden for specific machines. /obj/machinery/fluid_act(var/datum/reagents/fluids) diff --git a/code/game/machinery/_machines_base/machinery_components.dm b/code/game/machinery/_machines_base/machinery_components.dm index f60963589294..379a5dea9479 100644 --- a/code/game/machinery/_machines_base/machinery_components.dm +++ b/code/game/machinery/_machines_base/machinery_components.dm @@ -352,3 +352,12 @@ Standard helpers for users interacting with machinery parts. var/present = number_of_components(required_type, only_functional) if(present < needed) LAZYSET(., required_type, needed - present) + +/obj/machinery/get_alt_interactions(mob/user) + . = ..() + for(var/obj/item/stock_parts/component in component_parts) + if(!components_are_accessible(component.type)) + continue + var/list/machine_alt_interactions = component.get_machine_alt_interactions(user) + if(LAZYLEN(machine_alt_interactions)) + LAZYADD(., machine_alt_interactions) diff --git a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm index f4aab2938f7e..7ce4792bc9fa 100644 --- a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm +++ b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm @@ -109,3 +109,13 @@ if(istype(M) && (src in M.component_parts)) return ..() + +/// Alt-click interactions provided to our parent machine. +/obj/item/stock_parts/proc/get_machine_alt_interactions(mob/user) + SHOULD_CALL_PARENT(TRUE) + SHOULD_BE_PURE(TRUE) + RETURN_TYPE(/list) + . = list() + +/// A stub for showing messages based on part status when a machine is examined. +/obj/item/stock_parts/proc/on_machine_examined(mob/user) \ No newline at end of file diff --git a/code/game/machinery/_machines_base/stock_parts/card_reader.dm b/code/game/machinery/_machines_base/stock_parts/card_reader.dm index f78430de17d5..aecd5af4e4f9 100644 --- a/code/game/machinery/_machines_base/stock_parts/card_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/card_reader.dm @@ -14,6 +14,7 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE, ) max_health = ITEM_HEALTH_NO_DAMAGE + eject_handler = /decl/interaction_handler/remove_held_item/card var/should_swipe = FALSE //Whether the card should only be swiped instead of being inserted var/obj/item/card/inserted_card //Card currently in the slot @@ -67,3 +68,9 @@ /obj/item/stock_parts/item_holder/card_reader/proc/get_emag_card() return istype(inserted_card, /obj/item/card/emag) ? inserted_card : null + +/decl/interaction_handler/remove_held_item/card + name = "Eject Card" + icon = 'icons/screen/radial.dmi' + icon_state = "radial_eject_id" + expected_component_type = /obj/item/stock_parts/item_holder/card_reader \ No newline at end of file diff --git a/code/game/machinery/_machines_base/stock_parts/disk_reader.dm b/code/game/machinery/_machines_base/stock_parts/disk_reader.dm index eb6a5b8fe72a..e61cf6be322d 100644 --- a/code/game/machinery/_machines_base/stock_parts/disk_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/disk_reader.dm @@ -14,6 +14,7 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, ) max_health = ITEM_HEALTH_NO_DAMAGE + eject_handler = /decl/interaction_handler/remove_held_item/disk var/obj/item/disk/disk //Disk currently inserted /obj/item/stock_parts/item_holder/disk_reader/buildable @@ -38,3 +39,7 @@ /obj/item/stock_parts/item_holder/disk_reader/get_description_insertable() return "disk" + +/decl/interaction_handler/remove_held_item/disk + name = "Eject Disk" + expected_component_type = /obj/item/stock_parts/item_holder/disk_reader \ No newline at end of file diff --git a/code/game/machinery/_machines_base/stock_parts/item_holder.dm b/code/game/machinery/_machines_base/stock_parts/item_holder.dm index 170d90d0f392..9f6d75f6e6ce 100644 --- a/code/game/machinery/_machines_base/stock_parts/item_holder.dm +++ b/code/game/machinery/_machines_base/stock_parts/item_holder.dm @@ -5,8 +5,12 @@ name = null desc = null icon = 'icons/obj/items/stock_parts/modular_components.dmi' + var/decl/interaction_handler/eject_handler // The interaction handler type used for alt-interactions. var/datum/callback/on_insert_target //Callback to call when an item is inserted var/datum/callback/on_eject_target //Callback to call when an item is ejected + /// The verb used when a player inserts an item. + /// e.g. You [insert/place/attach] the cup in the cupholder. + var/place_verb = "insert" /obj/item/stock_parts/item_holder/Destroy() unregister_on_insert() @@ -38,6 +42,10 @@ /obj/item/stock_parts/item_holder/proc/get_inserted() return +/obj/item/stock_parts/item_holder/on_machine_examined(mob/user) + if(is_item_inserted()) + to_chat(user, SPAN_INFO("It has \a [get_inserted()] in \the [src].")) + ///Handle putting the object in the component's contents. Doesn't trigger any callbacks, or messages. /obj/item/stock_parts/item_holder/proc/set_inserted(var/obj/O) return @@ -55,7 +63,7 @@ if(user) if(user.try_unequip(O, src)) - to_chat(user, SPAN_NOTICE("You insert \the [O] into \the [src].")) + to_chat(user, SPAN_NOTICE("You [place_verb] \the [O] into \the [src].")) else return FALSE else @@ -111,4 +119,40 @@ QDEL_NULL(on_insert_target) /obj/item/stock_parts/item_holder/proc/unregister_on_eject() - QDEL_NULL(on_eject_target) \ No newline at end of file + QDEL_NULL(on_eject_target) + +// Alt interaction handling +/decl/interaction_handler/remove_held_item + abstract_type = /decl/interaction_handler/remove_held_item + expected_target_type = /obj/machinery + name = "Eject Item" + icon = 'icons/screen/radial.dmi' + icon_state = "radial_eject" + var/obj/item/stock_parts/item_holder/expected_component_type + +/decl/interaction_handler/remove_held_item/validate() + . = ..() + if(!ispath(expected_component_type)) + . += "Expected component type was [isnull(expected_component_type) ? "NULL" : expected_component_type], expected /obj/item/stock_parts/item_holder subtype" + +/decl/interaction_handler/remove_held_item/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() + if(.) + var/obj/machinery/target_machine = target + // Check all components, not just the first one. Maybe we have multiple! + for(var/obj/item/stock_parts/item_holder/holder in target_machine.get_all_components_of_type(expected_component_type)) + if(holder.is_item_inserted()) + return TRUE + +/decl/interaction_handler/remove_held_item/invoked(atom/target, mob/user, obj/item/prop) + var/obj/machinery/target_machine = target + // Check all components, not just the first one. Maybe we have multiple! + for(var/obj/item/stock_parts/item_holder/holder in target_machine.get_all_components_of_type(expected_component_type)) + if(holder.is_item_inserted()) + holder.eject_item(user) + return + +/obj/item/stock_parts/item_holder/get_machine_alt_interactions(mob/user) + . = ..() + if(ispath(eject_handler)) + LAZYADD(., eject_handler) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 1a5bbeb9e745..7aad7aace238 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -716,21 +716,3 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to for(var/uri in global.using_map.map_admin_faxes) var/list/contact_info = global.using_map.map_admin_faxes[uri] add_quick_dial_contact(contact_info["name"], uri) - -/obj/machinery/faxmachine/get_alt_interactions(mob/user) - . = ..() - LAZYADD(., /decl/interaction_handler/fax_remove_card) - -/decl/interaction_handler/fax_remove_card - name = "Remove ID Card" - expected_target_type = /obj/machinery/faxmachine - -/decl/interaction_handler/fax_remove_card/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/machinery/faxmachine/fax = target - return !!(fax.card_reader?.get_inserted()) - -/decl/interaction_handler/fax_remove_card/invoked(atom/target, mob/user, obj/item/prop) - var/obj/machinery/faxmachine/fax = target - fax.eject_card(user) From 4f559f25f502817d7827172cccfc16bae0bda6d4 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 2 Dec 2024 20:54:36 -0500 Subject: [PATCH 25/42] Make research machines use disk reader components --- .../_machines_base/stock_parts/item_holder.dm | 2 +- .../circuitboards/computer/computer.dm | 4 + .../circuitboards/machinery/research.dm | 1 + code/modules/research/design_console.dm | 73 +++++----- code/modules/research/design_database.dm | 125 +++++++++--------- nano/templates/design_database.tmpl | 14 +- 6 files changed, 109 insertions(+), 110 deletions(-) diff --git a/code/game/machinery/_machines_base/stock_parts/item_holder.dm b/code/game/machinery/_machines_base/stock_parts/item_holder.dm index 9f6d75f6e6ce..3462f18f5605 100644 --- a/code/game/machinery/_machines_base/stock_parts/item_holder.dm +++ b/code/game/machinery/_machines_base/stock_parts/item_holder.dm @@ -83,7 +83,7 @@ return var/obj/O = get_inserted() - if(user) + if(user && loc.Adjacent(user)) // Check adjacency in case this is called via UI stuff from a distance. user.put_in_hands(O) to_chat(user, SPAN_NOTICE("You remove \the [O] from \the [src].")) else diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm index 9c8b800d3c1a..c013c88bdf5c 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm @@ -91,6 +91,10 @@ /obj/item/stock_parts/circuitboard/design_console name = "circuitboard (design database console)" build_path = /obj/machinery/computer/design_console + additional_spawn_components = list( + /obj/item/stock_parts/power/apc/buildable = 1, + /obj/item/stock_parts/item_holder/disk_reader/buildable = 1, + ) /obj/item/stock_parts/circuitboard/central_atmos name = "circuitboard (central atmospherics computer)" diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 5d31dd554daa..efe256ceef44 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -265,6 +265,7 @@ req_components = list() additional_spawn_components = list( /obj/item/stock_parts/power/apc/buildable = 1, + /obj/item/stock_parts/item_holder/disk_reader/buildable = 1, /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/keyboard = 1 ) \ No newline at end of file diff --git a/code/modules/research/design_console.dm b/code/modules/research/design_console.dm index 73b6abc3255a..5e2e43978ad3 100644 --- a/code/modules/research/design_console.dm +++ b/code/modules/research/design_console.dm @@ -1,11 +1,16 @@ /obj/machinery/computer/design_console name = "design database console" desc = "A console for interfacing with a research and development design network." + maximum_component_parts = list( + /obj/item/stock_parts/item_holder/disk_reader = 1, + /obj/item/stock_parts = 15, + ) + /// A cached reference to our disk reader part, if present. + var/obj/item/stock_parts/item_holder/disk_reader/disk_reader var/initial_network_id var/initial_network_key var/list/local_cache - var/obj/item/disk/design_disk/disk var/obj/machinery/design_database/viewing_database var/showing_designs = FALSE @@ -13,36 +18,34 @@ . = ..() set_extension(src, /datum/extension/network_device, initial_network_id, initial_network_key, RECEIVER_STRONG_WIRELESS) +/obj/machinery/computer/design_console/Destroy() + viewing_database = null + disk_reader = null + return ..() + /obj/machinery/computer/design_console/modify_mapped_vars(map_hash) ..() ADJUST_TAG_VAR(initial_network_id, map_hash) +/obj/machinery/computer/design_console/RefreshParts() + . = ..() + disk_reader = get_component_of_type(/obj/item/stock_parts/item_holder/disk_reader) + if(disk_reader) + disk_reader.register_on_insert(CALLBACK(src, PROC_REF(update_ui))) + disk_reader.register_on_eject(CALLBACK(src, PROC_REF(update_ui))) + +/obj/machinery/computer/design_console/proc/try_get_disk() + return disk_reader?.get_inserted() + +/obj/machinery/computer/design_console/proc/update_ui() + SSnano.update_uis(src) + /obj/machinery/computer/design_console/handle_post_network_connection() ..() sync_network() -/obj/machinery/computer/design_console/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/design_disk)) - if(disk) - to_chat(user, SPAN_WARNING("\The [src] already has a disk inserted.")) - return TRUE - if(user.try_unequip(I, src)) - visible_message("\The [user] slots \the [I] into \the [src].") - disk = I - return TRUE - . = ..() - /obj/machinery/computer/design_console/proc/eject_disk(var/mob/user) - if(disk) - disk.dropInto(loc) - if(user) - if(!issilicon(user)) - user.put_in_hands(disk) - if(Adjacent(user, src)) - visible_message(SPAN_NOTICE("\The [user] removes \the [disk] from \the [src].")) - disk = null - return TRUE - return FALSE + return !!disk_reader.eject_item(user) /obj/machinery/computer/design_console/interface_interact(mob/user) ui_interact(user) @@ -55,9 +58,13 @@ var/datum/computer_network/network = device.get_network() data["network_id"] = device.network_tag + var/obj/item/disk/design_disk/disk = try_get_disk() if(disk) data["disk_name"] = disk.name - data["disk_tech"] = disk.blueprint ? disk.blueprint.name : "no design saved" + if(istype(disk)) + data["disk_tech"] = disk.blueprint ? disk.blueprint.name : "no design saved" + else + data["disk_tech"] = "invalid data format" else data["disk_name"] = "no disk loaded" @@ -159,7 +166,8 @@ if(href_list["save_design"]) var/datum/fabricator_recipe/design = locate(href_list["save_design"]) - if(istype(design) && disk) + var/obj/item/disk/design_disk/disk = try_get_disk() + if(istype(design) && istype(disk)) disk.blueprint = design disk.SetName("[initial(disk.name)] ([disk.blueprint.name])") return TOPIC_REFRESH @@ -219,20 +227,3 @@ var/list/techs = get_network_tech_levels() for(var/obj/machinery/fabricator/fab in network.get_devices_by_type(/obj/machinery/fabricator)) fab.refresh_design_cache(techs) - -/obj/machinery/computer/design_console/get_alt_interactions(var/mob/user) - . = ..() - LAZYADD(., /decl/interaction_handler/remove_disk/console) - -/decl/interaction_handler/remove_disk/console - expected_target_type = /obj/machinery/computer/design_console - -/decl/interaction_handler/remove_disk/console/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/machinery/computer/design_console/D = target - . = !!D.disk - -/decl/interaction_handler/remove_disk/console/invoked(atom/target, mob/user, obj/item/prop) - var/obj/machinery/computer/design_console/D = target - D.eject_disk(user) diff --git a/code/modules/research/design_database.dm b/code/modules/research/design_database.dm index 11e53477ef5d..5c5a6b3cc410 100644 --- a/code/modules/research/design_database.dm +++ b/code/modules/research/design_database.dm @@ -17,12 +17,17 @@ var/global/list/default_initial_tech_levels construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 + maximum_component_parts = list( + /obj/item/stock_parts/item_holder/disk_reader = 1, + /obj/item/stock_parts = 15, + ) + /// A cached reference to our disk reader part, if present. + var/obj/item/stock_parts/item_holder/disk_reader/disk_reader var/initial_network_id var/initial_network_key var/list/tech_levels var/need_disk_operation = FALSE - var/obj/item/disk/tech_disk/disk var/sync_policy = SYNC_PULL_NETWORK|SYNC_PUSH_NETWORK|SYNC_PULL_DISK /obj/machinery/design_database/proc/toggle_sync_policy_flag(var/sync_flag) @@ -36,13 +41,17 @@ var/global/list/default_initial_tech_levels var/list/data = list() var/datum/extension/network_device/device = get_extension(src, /datum/extension/network_device) data["network_id"] = device.network_tag + var/obj/item/disk/tech_disk/disk = try_get_disk() if(disk) data["disk_name"] = disk.name - var/list/tech_data = list() - for(var/tech in disk.stored_tech) - var/decl/research_field/field = SSfabrication.get_research_field_by_id(tech) - tech_data += list(list("field" = field.name, "desc" = field.desc, "level" = "[disk.stored_tech[tech]].0 GQ")) - data["disk_tech"] = tech_data + if(istype(disk)) + var/list/tech_data = list() + for(var/tech in disk.stored_tech) + var/decl/research_field/field = SSfabrication.get_research_field_by_id(tech) + tech_data += list(list("field" = field.name, "desc" = field.desc, "level" = "[disk.stored_tech[tech]].0 GQ")) + data["disk_tech"] = tech_data + else + data["disk_error"] = "invalid data format" else data["disk_name"] = "no disk loaded" @@ -116,26 +125,30 @@ var/global/list/default_initial_tech_levels return // Read or write from a loaded disk. + var/obj/item/disk/tech_disk/disk = try_get_disk() if(disk && need_disk_operation) - if(sync_policy & SYNC_PULL_DISK) - var/new_tech = FALSE - for(var/tech in disk.stored_tech) - if(tech_levels[tech] < disk.stored_tech[tech]) - tech_levels[tech] = disk.stored_tech[tech] - new_tech = TRUE - if(new_tech) - visible_message(SPAN_NOTICE("\The [src] clicks and chirps as it reads from \the [disk].")) - if((sync_policy & SYNC_PUSH_NETWORK) && !sync_design_consoles()) - visible_message(SPAN_WARNING("\The [src] flashes an error light from its network interface.")) - - if(sync_policy & SYNC_PUSH_DISK) - var/new_tech - for(var/tech in tech_levels) - if(tech_levels[tech] > LAZYACCESS(disk.stored_tech, tech)) - new_tech = TRUE - LAZYSET(disk.stored_tech, tech, tech_levels[tech]) - if(new_tech) - visible_message(SPAN_NOTICE("\The [src] whirrs and drones as it writes to \the [disk].")) + if(!istype(disk)) // wrong type of disk! + visible_message(SPAN_WARNING("\The [src] whirrs and drones, before emitting an ominous grinding sound.")) + else + if(sync_policy & SYNC_PULL_DISK) + var/new_tech = FALSE + for(var/tech in disk.stored_tech) + if(tech_levels[tech] < disk.stored_tech[tech]) + tech_levels[tech] = disk.stored_tech[tech] + new_tech = TRUE + if(new_tech) + visible_message(SPAN_NOTICE("\The [src] clicks and chirps as it reads from \the [disk].")) + if((sync_policy & SYNC_PUSH_NETWORK) && !sync_design_consoles()) + visible_message(SPAN_WARNING("\The [src] flashes an error light from its network interface.")) + + if(sync_policy & SYNC_PUSH_DISK) + var/new_tech + for(var/tech in tech_levels) + if(tech_levels[tech] > LAZYACCESS(disk.stored_tech, tech)) + new_tech = TRUE + LAZYSET(disk.stored_tech, tech, tech_levels[tech]) + if(new_tech) + visible_message(SPAN_NOTICE("\The [src] whirrs and drones as it writes to \the [disk].")) visible_message("The I/O light on \the [src] stops blinking.") need_disk_operation = FALSE @@ -148,49 +161,35 @@ var/global/list/default_initial_tech_levels /obj/machinery/design_database/Destroy() design_databases -= src - QDEL_NULL(disk) + disk_reader = null . = ..() -/obj/machinery/design_database/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/tech_disk)) - if(disk) - to_chat(user, SPAN_WARNING("\The [src] already has a disk inserted.")) - return TRUE - if(user.try_unequip(I, src)) - visible_message("\The [user] slots \the [I] into \the [src].") - visible_message(SPAN_NOTICE("\The [src]'s I/O light begins to blink.")) - disk = I - need_disk_operation = TRUE - return TRUE +/obj/machinery/design_database/proc/on_insert_disk(obj/item/disk/D, mob/user) + visible_message(SPAN_NOTICE("\The [src]'s I/O light begins to blink.")) + need_disk_operation = TRUE + update_ui() - . = ..() +/obj/machinery/design_database/proc/on_eject_disk(obj/item/disk/D, mob/user) + need_disk_operation = FALSE + update_ui() -/obj/machinery/design_database/proc/eject_disk(var/mob/user) - if(disk) - disk.dropInto(loc) - need_disk_operation = FALSE - if(user) - if(!issilicon(user)) - user.put_in_hands(disk) - if(Adjacent(user, src)) - visible_message(SPAN_NOTICE("\The [user] removes \the [disk] from \the [src].")) - disk = null - return TRUE - return FALSE - -/obj/machinery/design_database/get_alt_interactions(var/mob/user) +/obj/machinery/design_database/RefreshParts() . = ..() - LAZYADD(., /decl/interaction_handler/remove_disk/designs) + disk_reader = get_component_of_type(/obj/item/stock_parts/item_holder/disk_reader) + if(disk_reader) + disk_reader.register_on_insert(CALLBACK(src, PROC_REF(on_insert_disk))) + disk_reader.register_on_eject(CALLBACK(src, PROC_REF(on_eject_disk))) -/decl/interaction_handler/remove_disk/designs - expected_target_type = /obj/machinery/design_database +/obj/machinery/design_database/proc/try_get_disk() + return disk_reader?.get_inserted() -/decl/interaction_handler/remove_disk/designs/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/machinery/design_database/D = target - . = !!D.disk +/obj/machinery/design_database/proc/update_ui() + SSnano.update_uis(src) -/decl/interaction_handler/remove_disk/designs/invoked(atom/target, mob/user, obj/item/prop) - var/obj/machinery/design_database/D = target - D.eject_disk(user) +// used for, specifically, removing a disk via the UI +/obj/machinery/design_database/proc/eject_disk(var/mob/user) + if(!disk_reader) + to_chat(user, SPAN_WARNING("\The [src] has no disk drive installed.")) + return FALSE + . = !isnull(disk_reader.eject_item(user)) + update_ui() diff --git a/nano/templates/design_database.tmpl b/nano/templates/design_database.tmpl index f09a5415a942..db1dd81ea572 100644 --- a/nano/templates/design_database.tmpl +++ b/nano/templates/design_database.tmpl @@ -6,12 +6,16 @@
    External storage
    - {{if data.disk_tech}} + {{if data.disk_tech || data.disk_error}} - - {{for data.disk_tech}} - - {{/for}} + {{if data.disk_error}} + invalid data format + {{else}} + + {{for data.disk_tech}} + + {{/for}} + {{/if}} {{else}} {{/if}} From 4cde3d4974eec510b4cb41e427c2e49a6d657e20 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 2 Dec 2024 20:59:43 -0500 Subject: [PATCH 26/42] Add cupholder stock part --- .../_machines_base/stock_parts/cupholder.dm | 50 ++++++++++++++++++ .../items/stock_parts/modular_components.dmi | Bin 2686 -> 2814 bytes nebula.dme | 1 + 3 files changed, 51 insertions(+) create mode 100644 code/game/machinery/_machines_base/stock_parts/cupholder.dm diff --git a/code/game/machinery/_machines_base/stock_parts/cupholder.dm b/code/game/machinery/_machines_base/stock_parts/cupholder.dm new file mode 100644 index 000000000000..23f56f7772cb --- /dev/null +++ b/code/game/machinery/_machines_base/stock_parts/cupholder.dm @@ -0,0 +1,50 @@ +/obj/item/stock_parts/item_holder/cupholder + name = "cupholder" + desc = "A holder for cups." + icon = 'icons/obj/items/stock_parts/modular_components.dmi' + icon_state = "cupholder" + material = /decl/material/solid/organic/plastic + part_flags = PART_FLAG_HAND_REMOVE + place_verb = "place" + eject_handler = /decl/interaction_handler/remove_held_item/cup + var/image/cupholder_overlay + var/obj/item/cup + +/obj/item/stock_parts/item_holder/cupholder/Destroy() + QDEL_NULL(cup) + . = ..() + +/obj/item/stock_parts/item_holder/cupholder/is_item_inserted() + return !isnull(cup) + +/obj/item/stock_parts/item_holder/cupholder/is_accepted_type(obj/O) + var/static/allowed_cup_types + if(!allowed_cup_types) + allowed_cup_types = typecacheof(list( + /obj/item/chems/drinks/cans, + /obj/item/chems/drinks/bottle, + /obj/item/chems/glass/bottle, + /obj/item/chems/drinks/juicebox, + /obj/item/chems/drinks/glass2, + /obj/item/chems/drinks/h_chocolate, + /obj/item/chems/drinks/dry_ramen, + /obj/item/chems/drinks/tea, + /obj/item/chems/glass/handmade/cup, + /obj/item/chems/glass/handmade/mug, + /obj/item/chems/drinks/shaker, + /obj/item/chems/drinks/flask + )) + return is_type_in_typecache(O, allowed_cup_types) + +/obj/item/stock_parts/item_holder/cupholder/get_inserted() + return cup + +/obj/item/stock_parts/item_holder/cupholder/set_inserted(obj/O) + cup = O + +/obj/item/stock_parts/item_holder/cupholder/get_description_insertable() + return "cup" + +/decl/interaction_handler/remove_held_item/cup + name = "Remove Cup" + expected_component_type = /obj/item/stock_parts/item_holder/cupholder \ No newline at end of file diff --git a/icons/obj/items/stock_parts/modular_components.dmi b/icons/obj/items/stock_parts/modular_components.dmi index 570e13bbf6529630534e9b607d59071f52a44259..1a471de37faf2a0b2a2c827164ce61fc60ed43ae 100644 GIT binary patch delta 2315 zcmV+m3H0{<6#f;E7Y@J(0{{R3WdfWv0005qu_ey|C&0kKS65eme}9salBK1kZfLEG3X&d7>m8X}s zxiAcPkN*;YnZRo_k7&{uk*fj?Y#6}^(8$hb0p~H#RTXB7ToSQBX3I*8J<)Mge`x?B zIjN!zIe0-gv&083q6biUd25UsoaP`RWxt$BVaqcr_Ic?*G;}kmX-tx7>LC~Grabt% z2`enK?6YBQZA$^G$AlpZne3;bmr{C5)d(xAmDxa^~M}A07etWr3mbBx?kHf>W0tDqL zn!{03Q{!+zFClqtZ7q}+*tMF?&)>Hm;VPe2>(G4F49%OAvjIvAbfew&U zNc8-jor;_Y|JbYkEaRg)X=X>3Y2m=9ylFq|e{w&*w9~59s>IlP6(C zdI0JLhahvZdMC~WGW%NyK@bE%5ClOG1VNDhD@{#)6CgizN}QiQ-E0EnXU>T8OlfIt zJ=@lH?%etFE&Tk#1z{d&Z}0eq5#Z++FADRFX}NSMe;5p2zI+Z6xN=392d-Z2?Ck95 z00pjH6XpbQhZTR5ze(@{Q-D?|5`c44pi?3M=VXMlXK9at14QE1v#p|2#1sfh1i;)9 zAQcJ)z?_W0_TL8VpTw8QCOAcML?9>@5S$`ira-U_$gf`!=7Dxopc9;~3ax%gVYTyS2Zgd5^f`0G?E#G$0x5N2&*M)iD`*u=Yb7wOo@WVx# zf;kz1U1GZZkN~?1b%QTxVK*{C&TeFI9$+`JZn6OaIX}%rGZ`~5+&9`p{0)b|_@$)-(%oNC#e@yQKdH<&bf*=TjAP9mW2!iA$cTMiy zy+;6EqpE6;+SAhm?StgKYHx3^An#NA`ue~$J^*(JGrzCirzF?^z~teBhXlR>UEQSL z+27v}7|?vcIWRB)7|?vsIXF1THL%uBVFU1nu<}RFN0cOk6a+#NfsjNXlx=~qL?A2? ze+UZ&LK1He&kj_muDGukB*LxabuQ`yT`}JC*XY2Jvli!#R)^!`a$dn4GsMS1V-kboi

    8^*UtdWCc9e_-Nd3ehdji(_L9E5xCY$+7<0U02B?6Re3S>qq zlQ_3|YVzXg3qrPwK@bE%5ClOG1VOeJ+3NV)wR?E~)6>&4(=#(O@J@asKfgl*e>kgr z9<@qy2y8J(>e|C0uZgy^NZU)>7chT|02vuzLp(>HU{QP`M>gpb-+Y0iPuPhYl8X(814@rXa_!ibwxB5h((jS-DyyOK0nj|;44yOK0n zH(L;m<*Ps>wn3-BMojeZMKza+#MUv=1n#5VpWY~<@4R;U3XkLy=rv;%o9fE~y- l|HNW>T|a^#2!iAr{{rp=s;_ZEmH7Yw002ovPDHLkV1kbAK(+t? delta 2186 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 Date: Tue, 3 Dec 2024 19:30:16 +1100 Subject: [PATCH 27/42] Cleaning up a lot of sprite_sheets setting. --- mods/content/fantasy/_fantasy.dme | 2 +- .../content/fantasy/datum/kobaloi/clothing.dm | 6 +- .../fantasy/items/clothing/_overrides.dm | 15 ++++ mods/content/fantasy/items/clothing/jerkin.dm | 2 +- .../fantasy/items/clothing/loincloth.dm | 2 +- .../fantasy/items/clothing/overrides.dm | 4 - .../fantasy/items/clothing/trousers.dm | 8 +- mods/species/ascent/_ascent.dme | 1 + mods/species/ascent/items/_overrides.dm | 10 +++ mods/species/ascent/items/clothing.dm | 12 +-- mods/species/ascent/items/guns.dm | 2 +- mods/species/ascent/items/rig.dm | 11 ++- .../bayliens/{bayliens.dm => _bayliens.dm} | 13 ++- mods/species/bayliens/_bayliens.dme | 3 +- mods/species/bayliens/_overrides.dm | 7 ++ mods/species/bayliens/adherent/_adherent.dm | 2 - mods/species/bayliens/tajaran/_tajaran.dm | 2 - .../bayliens/tajaran/machinery/suit_cycler.dm | 85 +++++++----------- mods/species/drakes/_drakes.dme | 1 + mods/species/drakes/_overrides.dm | 10 +++ mods/species/drakes/clothing.dm | 28 ++---- mods/species/neoavians/_neoavians.dme | 1 + mods/species/neoavians/_overrides.dm | 7 ++ mods/species/neoavians/clothing.dm | 45 +++++----- .../neoavians/machinery/suit_cycler.dm | 90 ++++++++----------- 25 files changed, 180 insertions(+), 189 deletions(-) create mode 100644 mods/content/fantasy/items/clothing/_overrides.dm delete mode 100644 mods/content/fantasy/items/clothing/overrides.dm create mode 100644 mods/species/ascent/items/_overrides.dm rename mods/species/bayliens/{bayliens.dm => _bayliens.dm} (77%) create mode 100644 mods/species/bayliens/_overrides.dm create mode 100644 mods/species/drakes/_overrides.dm create mode 100644 mods/species/neoavians/_overrides.dm diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index 3cd8559ddf0f..1bf5230189d7 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -28,12 +28,12 @@ #include "datum\kobaloi\species.dm" #include "items\material_overrides.dm" #include "items\clothing\_loadout.dm" +#include "items\clothing\_overrides.dm" #include "items\clothing\_recipes.dm" #include "items\clothing\armor.dm" #include "items\clothing\glasses.dm" #include "items\clothing\jerkin.dm" #include "items\clothing\loincloth.dm" -#include "items\clothing\overrides.dm" #include "items\clothing\trousers.dm" #include "props\signpost.dm" // END_INCLUDE diff --git a/mods/content/fantasy/datum/kobaloi/clothing.dm b/mods/content/fantasy/datum/kobaloi/clothing.dm index 1bd63942fbf5..71346517d9c2 100644 --- a/mods/content/fantasy/datum/kobaloi/clothing.dm +++ b/mods/content/fantasy/datum/kobaloi/clothing.dm @@ -1,4 +1,2 @@ -/obj/item/bag/sack/Initialize() - . = ..() - if(!(BODYTYPE_KOBALOI in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_KOBALOI, 'mods/content/fantasy/icons/clothing/sack_kobaloi.dmi') \ No newline at end of file +/obj/item/bag/sack + _kobaloi_onmob_icon = 'mods/content/fantasy/icons/clothing/sack_kobaloi.dmi' diff --git a/mods/content/fantasy/items/clothing/_overrides.dm b/mods/content/fantasy/items/clothing/_overrides.dm new file mode 100644 index 000000000000..0ecd3b43e1cb --- /dev/null +++ b/mods/content/fantasy/items/clothing/_overrides.dm @@ -0,0 +1,15 @@ +/obj/item + var/_kobaloi_onmob_icon + var/_hnoll_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_kobaloi_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_KOBALOI, _kobaloi_onmob_icon) + if(_hnoll_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_HNOLL, _hnoll_onmob_icon) + +/obj/item/clothing/gloves/setup_equip_flags() + . = ..() + if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_EQUIP_FLAG_EXCLUDE)) + bodytype_equip_flags |= BODY_EQUIP_FLAG_HNOLL \ No newline at end of file diff --git a/mods/content/fantasy/items/clothing/jerkin.dm b/mods/content/fantasy/items/clothing/jerkin.dm index 4944bae19765..dc437db931dd 100644 --- a/mods/content/fantasy/items/clothing/jerkin.dm +++ b/mods/content/fantasy/items/clothing/jerkin.dm @@ -2,6 +2,6 @@ name = "jerkin" desc = "A sturdy jerkin, worn on the upper body." icon = 'mods/content/fantasy/icons/clothing/jerkin.dmi' - sprite_sheets = list(BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi') + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/leather diff --git a/mods/content/fantasy/items/clothing/loincloth.dm b/mods/content/fantasy/items/clothing/loincloth.dm index 168127ba6add..5cb8288038e1 100644 --- a/mods/content/fantasy/items/clothing/loincloth.dm +++ b/mods/content/fantasy/items/clothing/loincloth.dm @@ -3,7 +3,7 @@ gender = NEUTER desc = "A simple garment that is worn around the legs and lower body." icon = 'mods/content/fantasy/icons/clothing/loincloth.dmi' - sprite_sheets = list(BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/loincloth_hnoll.dmi') + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/loincloth_hnoll.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/skin/fur diff --git a/mods/content/fantasy/items/clothing/overrides.dm b/mods/content/fantasy/items/clothing/overrides.dm deleted file mode 100644 index 8ca8f71eea1e..000000000000 --- a/mods/content/fantasy/items/clothing/overrides.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/clothing/gloves/setup_equip_flags() - . = ..() - if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_EQUIP_FLAG_EXCLUDE)) - bodytype_equip_flags |= BODY_EQUIP_FLAG_HNOLL \ No newline at end of file diff --git a/mods/content/fantasy/items/clothing/trousers.dm b/mods/content/fantasy/items/clothing/trousers.dm index 37d757d3abe5..cbe30375bff0 100644 --- a/mods/content/fantasy/items/clothing/trousers.dm +++ b/mods/content/fantasy/items/clothing/trousers.dm @@ -5,9 +5,7 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/leather color = /decl/material/solid/organic/leather::color - sprite_sheets = list( - BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/trousers_hnoll.dmi' - ) + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/trousers_hnoll.dmi' /obj/item/clothing/pants/trousers/jerkin/Initialize() . = ..() @@ -20,6 +18,4 @@ name = "braies" desc = "Some short trousers. Comfortable and easy to wear." icon = 'mods/content/fantasy/icons/clothing/braies.dmi' - sprite_sheets = list( - BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/braies_hnoll.dmi' - ) + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/braies_hnoll.dmi' diff --git a/mods/species/ascent/_ascent.dme b/mods/species/ascent/_ascent.dme index 63d6f95300dc..461ef828f3a8 100644 --- a/mods/species/ascent/_ascent.dme +++ b/mods/species/ascent/_ascent.dme @@ -14,6 +14,7 @@ #include "datum\species_bodytypes.dm" #include "datum\traits.dm" #include "effects\razorweb.dm" +#include "items\_overrides.dm" #include "items\cell.dm" #include "items\clothing.dm" #include "items\clustertool.dm" diff --git a/mods/species/ascent/items/_overrides.dm b/mods/species/ascent/items/_overrides.dm new file mode 100644 index 000000000000..3cc8b68959b6 --- /dev/null +++ b/mods/species/ascent/items/_overrides.dm @@ -0,0 +1,10 @@ +/obj/item + var/_alate_onmob_icon + var/_gyne_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_alate_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_MANTID_SMALL, _alate_onmob_icon) + if(_gyne_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_MANTID_LARGE, _gyne_onmob_icon) diff --git a/mods/species/ascent/items/clothing.dm b/mods/species/ascent/items/clothing.dm index 9962664265ae..64641d04adf5 100644 --- a/mods/species/ascent/items/clothing.dm +++ b/mods/species/ascent/items/clothing.dm @@ -22,7 +22,7 @@ desc = "An alien facemask with chunky gas filters and a breathing valve." filter_water = TRUE icon = 'mods/species/ascent/icons/clothing/mask.dmi' - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/mask_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/clothing/mask_gyne.dmi' bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE filtered_gases = list( /decl/material/gas/nitrous_oxide, @@ -38,9 +38,7 @@ desc = "A set of powerful gripping claws." icon = 'mods/species/ascent/icons/magboots/boots.dmi' bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/magboots/boots_gyne.dmi' - ) + _gyne_onmob_icon = 'mods/species/ascent/icons/magboots/boots_gyne.dmi' /obj/item/clothing/jumpsuit/ascent name = "mantid undersuit" @@ -48,9 +46,7 @@ bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE icon = 'mods/species/ascent/icons/clothing/under.dmi' color = COLOR_DARK_GUNMETAL - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/under_gyne.dmi' - ) + _gyne_onmob_icon = 'mods/species/ascent/icons/clothing/under_gyne.dmi' /obj/item/clothing/suit/ascent name = "mantid gear harness" @@ -58,7 +54,7 @@ bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE icon_state = ICON_STATE_WORLD icon = 'mods/species/ascent/icons/clothing/under_harness.dmi' - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/under_harness_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/clothing/under_harness_gyne.dmi' body_parts_covered = 0 slot_flags = SLOT_OVER_BODY | SLOT_LOWER_BODY storage = /datum/storage/pockets/suit diff --git a/mods/species/ascent/items/guns.dm b/mods/species/ascent/items/guns.dm index 83fdda10ffce..99a76ce53514 100644 --- a/mods/species/ascent/items/guns.dm +++ b/mods/species/ascent/items/guns.dm @@ -20,7 +20,7 @@ list(mode_name="shock", projectile_type = /obj/item/projectile/beam/stun/shock), list(mode_name="lethal", projectile_type = /obj/item/projectile/beam/particle) ) - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/particle_rifle/inhands_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/particle_rifle/inhands_gyne.dmi' /obj/item/gun/energy/particle/small name = "particle projector" diff --git a/mods/species/ascent/items/rig.dm b/mods/species/ascent/items/rig.dm index 35697954e7b4..214f60caa99a 100644 --- a/mods/species/ascent/items/rig.dm +++ b/mods/species/ascent/items/rig.dm @@ -3,7 +3,6 @@ name = "alate support exosuit" desc = "A powerful support exosuit with integrated power supply, weapon and atmosphere. It's closer to a mech than a rig." icon = 'mods/species/ascent/icons/rig/rig.dmi' - suit_type = "support exosuit" armor = list( ARMOR_MELEE = ARMOR_MELEE_MAJOR, @@ -28,7 +27,7 @@ gloves = /obj/item/clothing/gloves/rig/mantid update_visible_name = TRUE - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_gyne.dmi' initial_modules = list( /obj/item/rig_module/vision/thermal, /obj/item/rig_module/ai_container, @@ -241,7 +240,7 @@ desc = "More like a torpedo casing than a helmet." bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE icon = 'mods/species/ascent/icons/rig/rig_helmet.dmi' - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_helmet_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_helmet_gyne.dmi' /obj/item/clothing/suit/space/rig/mantid desc = "It's closer to a mech than a suit." @@ -255,16 +254,16 @@ /obj/item/stack/medical/resin, /obj/item/chems/drinks/cans/waterbottle/ascent ) - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_chest_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_chest_gyne.dmi' /obj/item/clothing/shoes/magboots/rig/mantid icon = 'mods/species/ascent/icons/rig/rig_boots.dmi' desc = "It's like a highly advanced forklift." bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_boots_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_boots_gyne.dmi' /obj/item/clothing/gloves/rig/mantid icon = 'mods/species/ascent/icons/rig/rig_gloves.dmi' desc = "They look like a cross between a can opener and a Swiss army knife the size of a shoebox." bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gloves_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_gloves_gyne.dmi' diff --git a/mods/species/bayliens/bayliens.dm b/mods/species/bayliens/_bayliens.dm similarity index 77% rename from mods/species/bayliens/bayliens.dm rename to mods/species/bayliens/_bayliens.dm index a1ddf384ed92..68d625b481ff 100644 --- a/mods/species/bayliens/bayliens.dm +++ b/mods/species/bayliens/_bayliens.dm @@ -1,7 +1,12 @@ -#define SPECIES_SKRELL "Skrell" -#define SPECIES_TAJARA "Tajara" -#define SPECIES_LIZARD "Unathi" -#define SPECIES_ADHERENT "Adherent" +#define SPECIES_SKRELL "Skrell" +#define SPECIES_TAJARA "Tajara" +#define SPECIES_LIZARD "Unathi" +#define SPECIES_ADHERENT "Adherent" + +#define BODYTYPE_FELINE "feline body" +#define BODYTYPE_ADHERENT "adherent body" + +#define BODY_EQUIP_FLAG_FELINE BITFLAG(7) /decl/modpack/bayliens name = "Baystation 12 Aliens" diff --git a/mods/species/bayliens/_bayliens.dme b/mods/species/bayliens/_bayliens.dme index e8de7a35d0b6..014aba6cf5d8 100644 --- a/mods/species/bayliens/_bayliens.dme +++ b/mods/species/bayliens/_bayliens.dme @@ -1,7 +1,8 @@ #ifndef MODPACK_BAYLIENS #define MODPACK_BAYLIENS // BEGIN_INCLUDE -#include "bayliens.dm" +#include "_bayliens.dm" +#include "_overrides.dm" #include "adherent\_adherent.dm" #include "adherent\datum\culture.dm" #include "adherent\datum\emotes.dm" diff --git a/mods/species/bayliens/_overrides.dm b/mods/species/bayliens/_overrides.dm new file mode 100644 index 000000000000..5eb6f5a85583 --- /dev/null +++ b/mods/species/bayliens/_overrides.dm @@ -0,0 +1,7 @@ +/obj/item + var/_feline_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_feline_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_FELINE, _feline_onmob_icon) diff --git a/mods/species/bayliens/adherent/_adherent.dm b/mods/species/bayliens/adherent/_adherent.dm index 997107674c85..d70f337115d7 100644 --- a/mods/species/bayliens/adherent/_adherent.dm +++ b/mods/species/bayliens/adherent/_adherent.dm @@ -1,6 +1,4 @@ -#define BODYTYPE_ADHERENT "adherent body" #define LANGUAGE_ADHERENT "Protocol" - #define BP_FLOAT "floatation disc" #define BP_JETS "maneuvering jets" #define BP_COOLING_FINS "cooling fins" diff --git a/mods/species/bayliens/tajaran/_tajaran.dm b/mods/species/bayliens/tajaran/_tajaran.dm index b4e664e999bb..151b2b1c8a7a 100644 --- a/mods/species/bayliens/tajaran/_tajaran.dm +++ b/mods/species/bayliens/tajaran/_tajaran.dm @@ -1,6 +1,4 @@ #define LANGUAGE_TAJARA "Siik'maas" -#define BODYTYPE_FELINE "feline body" -#define BODY_EQUIP_FLAG_FELINE BITFLAG(7) /obj/item/clothing/setup_equip_flags() . = ..() diff --git a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm index af8842c7b19b..b6c5366944c3 100644 --- a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm +++ b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm @@ -2,70 +2,53 @@ LAZYDISTINCTADD(available_bodytypes, BODYTYPE_FELINE) . = ..() -/obj/item/clothing/suit/space/void/merc/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi') +/obj/item/clothing/suit/space/void/merc + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi' -/obj/item/clothing/suit/space/void/swat/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi') +/obj/item/clothing/suit/space/void/swat + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi' -/obj/item/clothing/suit/space/void/engineering/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi') +/obj/item/clothing/suit/space/void/engineering + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi' -/obj/item/clothing/suit/space/void/mining/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi') +/obj/item/clothing/suit/space/void/mining + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi' -/obj/item/clothing/suit/space/void/medical/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi') +/obj/item/clothing/suit/space/void/medical + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi' -/obj/item/clothing/suit/space/void/security/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi') +/obj/item/clothing/suit/space/void/security + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi' -/obj/item/clothing/suit/space/void/atmos/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi') +/obj/item/clothing/suit/space/void/atmos + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi' -/obj/item/clothing/suit/space/void/engineering/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi') +/obj/item/clothing/suit/space/void/engineering/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi' -/obj/item/clothing/suit/space/void/mining/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi') +/obj/item/clothing/suit/space/void/mining/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi' -/obj/item/clothing/suit/space/void/medical/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi') +/obj/item/clothing/suit/space/void/medical/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi' -/obj/item/clothing/suit/space/void/security/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi') +/obj/item/clothing/suit/space/void/security/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi' -/obj/item/clothing/suit/space/void/atmos/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi') +/obj/item/clothing/suit/space/void/atmos/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi' -/obj/item/clothing/suit/space/void/engineering/salvage/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi') +/obj/item/clothing/suit/space/void/engineering/salvage + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi' -/obj/item/clothing/suit/space/void/expedition/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi') +/obj/item/clothing/suit/space/void/expedition + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi' -/obj/item/clothing/suit/space/void/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi') +/obj/item/clothing/suit/space/void + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi' -/obj/item/clothing/suit/space/void/wizard/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi') +/obj/item/clothing/suit/space/void/wizard + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi' -/obj/item/clothing/suit/space/void/excavation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi') +/obj/item/clothing/suit/space/void/excavation + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi' diff --git a/mods/species/drakes/_drakes.dme b/mods/species/drakes/_drakes.dme index 44fa41725be3..1143d6a510ee 100644 --- a/mods/species/drakes/_drakes.dme +++ b/mods/species/drakes/_drakes.dme @@ -7,6 +7,7 @@ // BEGIN_INCLUDE #include "_drakes.dm" +#include "_overrides.dm" #include "clothing.dm" #include "culture.dm" #include "drake_abilities.dm" diff --git a/mods/species/drakes/_overrides.dm b/mods/species/drakes/_overrides.dm new file mode 100644 index 000000000000..a4c564def3ce --- /dev/null +++ b/mods/species/drakes/_overrides.dm @@ -0,0 +1,10 @@ +/obj/item + var/_drake_onmob_icon + var/_drake_hatchling_onmob_icon + +/obj/item/backpack/setup_sprite_sheets() + . = ..() + if(_drake_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, _drake_onmob_icon) + if(_drake_hatchling_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, _drake_hatchling_onmob_icon) diff --git a/mods/species/drakes/clothing.dm b/mods/species/drakes/clothing.dm index ac23b01ba190..63c803bc1dbe 100644 --- a/mods/species/drakes/clothing.dm +++ b/mods/species/drakes/clothing.dm @@ -1,21 +1,11 @@ +/obj/item/backpack + _drake_onmob_icon = 'mods/species/drakes/icons/clothing/backpack.dmi' + _drake_hatchling_onmob_icon = 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi' -/obj/item/backpack/setup_sprite_sheets() - . = ..() - if(!(BODYTYPE_GRAFADREKA in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/backpack.dmi') - if(!(BODYTYPE_GRAFADREKA_HATCHLING in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi') +/obj/item/card/id + _drake_onmob_icon = 'mods/species/drakes/icons/clothing/id.dmi' + _drake_hatchling_onmob_icon = 'mods/species/drakes/icons/clothing/hatchling_id.dmi' -/obj/item/card/id/setup_sprite_sheets() - . = ..() - if(!(BODYTYPE_GRAFADREKA in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/id.dmi') - if(!(BODYTYPE_GRAFADREKA_HATCHLING in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, 'mods/species/drakes/icons/clothing/hatchling_id.dmi') - -/obj/item/bag/setup_sprite_sheets() - . = ..() - if(!(BODYTYPE_GRAFADREKA in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/sack.dmi') - if(!(BODYTYPE_GRAFADREKA_HATCHLING in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi') +/obj/item/bag + _drake_onmob_icon = 'mods/species/drakes/icons/clothing/sack.dmi' + _drake_hatchling_onmob_icon = 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi' diff --git a/mods/species/neoavians/_neoavians.dme b/mods/species/neoavians/_neoavians.dme index e7c8d5263994..6c5b71cb056f 100644 --- a/mods/species/neoavians/_neoavians.dme +++ b/mods/species/neoavians/_neoavians.dme @@ -2,6 +2,7 @@ #define CONTENT_PACK_NEOAVIANS // BEGIN_INCLUDE #include "_neoavians.dm" +#include "_overrides.dm" #include "clothing.dm" #include "datum\accessory.dm" #include "datum\language.dm" diff --git a/mods/species/neoavians/_overrides.dm b/mods/species/neoavians/_overrides.dm new file mode 100644 index 000000000000..1d745db0a6fd --- /dev/null +++ b/mods/species/neoavians/_overrides.dm @@ -0,0 +1,7 @@ +/obj/item + var/_avian_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_avian_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_AVIAN, _avian_onmob_icon) diff --git a/mods/species/neoavians/clothing.dm b/mods/species/neoavians/clothing.dm index 98f5b8dac918..e7d90e623eaa 100644 --- a/mods/species/neoavians/clothing.dm +++ b/mods/species/neoavians/clothing.dm @@ -1,11 +1,9 @@ //Shoes -/obj/item/clothing/shoes/magboots/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/feet/magboots.dmi') +/obj/item/clothing/shoes/magboots + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/feet/magboots.dmi' -/obj/item/clothing/shoes/galoshes/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/feet/galoshes.dmi') +/obj/item/clothing/shoes/galoshes + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/feet/galoshes.dmi' //Gloves /obj/item/clothing/gloves/setup_equip_flags() @@ -13,34 +11,31 @@ if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_EQUIP_FLAG_EXCLUDE)) bodytype_equip_flags |= BODY_EQUIP_FLAG_AVIAN -/obj/item/clothing/gloves/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/gloves.dmi') +/obj/item/clothing/gloves + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/gloves.dmi' + +/obj/item/clothing/gloves/ring + _avian_onmob_icon = null //Backpacks & tanks -/obj/item/backpack/satchel/Initialize() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/satchel.dmi') +/obj/item/backpack/satchel + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/satchel.dmi' //Radsuits (theyre essential?) -/obj/item/clothing/head/radiation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/head/rad_helm.dmi') +/obj/item/clothing/head/radiation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/head/rad_helm.dmi' -/obj/item/clothing/suit/radiation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/suit/rad_suit.dmi') +/obj/item/clothing/suit/radiation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/suit/rad_suit.dmi' //cloaks -/obj/item/clothing/suit/cloak/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/accessory/cloak.dmi') +/obj/item/clothing/suit/cloak + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/accessory/cloak.dmi' -/obj/item/clothing/suit/cloak/hide/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/accessory/cloak_hide.dmi') +/obj/item/clothing/suit/cloak/hide + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/accessory/cloak_hide.dmi' //clothing /obj/item/clothing/dress/avian_smock @@ -49,6 +44,7 @@ icon = 'mods/species/neoavians/icons/clothing/under/smock.dmi' icon_state = ICON_STATE_WORLD bodytype_equip_flags = BODY_EQUIP_FLAG_AVIAN + _avian_onmob_icon = null /obj/item/clothing/dress/avian_smock/worker name = "worker's smock" @@ -86,6 +82,7 @@ icon = 'mods/species/neoavians/icons/clothing/feet/shoes.dmi' color = COLOR_GRAY bodytype_equip_flags = BODY_EQUIP_FLAG_AVIAN + _avian_onmob_icon = null /obj/item/clothing/shoes/avian/footwraps name = "cloth footwraps" diff --git a/mods/species/neoavians/machinery/suit_cycler.dm b/mods/species/neoavians/machinery/suit_cycler.dm index 9b368c305771..2fd6323e6edc 100644 --- a/mods/species/neoavians/machinery/suit_cycler.dm +++ b/mods/species/neoavians/machinery/suit_cycler.dm @@ -4,86 +4,68 @@ //mining -/obj/item/clothing/suit/space/void/mining/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi') +/obj/item/clothing/suit/space/void/mining + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi' -/obj/item/clothing/head/helmet/space/void/mining/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/mining + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi' //excavation -/obj/item/clothing/suit/space/void/excavation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi') +/obj/item/clothing/suit/space/void/excavation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi' -/obj/item/clothing/head/helmet/space/void/excavation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/excavation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi' //engineering -/obj/item/clothing/head/helmet/space/void/engineering/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/engineering + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/helmet.dmi' -/obj/item/clothing/suit/space/void/engineering/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/suit.dmi') +/obj/item/clothing/suit/space/void/engineering + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/suit.dmi' -/obj/item/clothing/head/helmet/space/void/atmos/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/atmos + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/helmet.dmi' -/obj/item/clothing/suit/space/void/atmos/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/suit.dmi') +/obj/item/clothing/suit/space/void/atmos + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/suit.dmi' //medical -/obj/item/clothing/suit/space/void/medical/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/suit.dmi') +/obj/item/clothing/suit/space/void/medical + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/suit.dmi' -/obj/item/clothing/head/helmet/space/void/medical/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/medical + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi' //security -/obj/item/clothing/head/helmet/space/void/security/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/security + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/helmet.dmi' -/obj/item/clothing/suit/space/void/security/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/suit.dmi') +/obj/item/clothing/suit/space/void/security + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/suit.dmi' //salvage -/obj/item/clothing/head/helmet/space/void/engineering/salvage/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/engineering/salvage + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/helmet.dmi' -/obj/item/clothing/suit/space/void/engineering/salvage/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/suit.dmi') +/obj/item/clothing/suit/space/void/engineering/salvage + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/suit.dmi' //pilot -/obj/item/clothing/head/helmet/space/void/expedition/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/expedition + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/helmet.dmi' -/obj/item/clothing/suit/space/void/expedition/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/suit.dmi') +/obj/item/clothing/suit/space/void/expedition + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/suit.dmi' //merc -/obj/item/clothing/head/helmet/space/void/merc/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/merc + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/helmet.dmi' -/obj/item/clothing/suit/space/void/merc/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/suit.dmi') \ No newline at end of file +/obj/item/clothing/suit/space/void/merc + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/suit.dmi' \ No newline at end of file From 3e0ac944bc4f1f1c7dac410e13f4aaad9527885c Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 4 Dec 2024 14:05:40 +1100 Subject: [PATCH 28/42] Automatic changelog generation for PR #4597 [ci skip] --- html/changelogs/AutoChangeLog-pr-4597.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4597.yml diff --git a/html/changelogs/AutoChangeLog-pr-4597.yml b/html/changelogs/AutoChangeLog-pr-4597.yml new file mode 100644 index 000000000000..30daa8a51a72 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4597.yml @@ -0,0 +1,6 @@ +author: ophelia +changes: + - {tweak: 'You can now put any disk into the research design database or research + design console, but only the correct disk type (tech disk or design disk) will + function.'} +delete-after: true From 71a5a78eda6f405f08ab7a7f23f698427a036b01 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 4 Dec 2024 20:08:38 +1100 Subject: [PATCH 29/42] Adding a lounge. --- .../stool_bed_chair_nest_sofa/pew.dm | 18 +++++++++++++++++- .../recipes_hardness_integrity.dm | 4 ++++ icons/obj/structures/benches.dmi | Bin 1969 -> 1836 bytes icons/obj/structures/lounge.dmi | Bin 0 -> 3905 bytes 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 icons/obj/structures/lounge.dmi diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm index 9e849a85d382..0cae0394ad38 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm @@ -132,4 +132,20 @@ /obj/structure/bed/chair/bench/pew/ebony color = /decl/material/solid/organic/wood/ebony::color - material = /decl/material/solid/organic/wood/ebony \ No newline at end of file + material = /decl/material/solid/organic/wood/ebony + +/obj/structure/bed/chair/bench/lounge + name = "lounge" + desc = "An elegant lounge, perfect for reclining on." + icon = 'icons/obj/structures/lounge.dmi' + icon_state = "lounge_standing" + base_icon = "lounge" + +/obj/structure/bed/chair/bench/lounge/get_material_icon() + return icon + +/obj/structure/bed/chair/bench/lounge/mapped + color = /decl/material/solid/organic/wood/mahogany::color + material = /decl/material/solid/organic/wood/mahogany + reinf_material = /decl/material/solid/organic/cloth + padding_color = COLOR_RED_GRAY diff --git a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm index 92e580a6d0e2..7da43a8ec2dc 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm @@ -43,6 +43,10 @@ /decl/stack_recipe/hardness/integrity/furniture/bench/pew/single result_type = /obj/structure/bed/chair/bench/pew/single +/decl/stack_recipe/hardness/integrity/furniture/bench/lounge + result_type = /obj/structure/bed/chair/bench/lounge + difficulty = MAT_VALUE_VERY_HARD_DIY + /decl/stack_recipe/hardness/integrity/furniture/closet result_type = /obj/structure/closet diff --git a/icons/obj/structures/benches.dmi b/icons/obj/structures/benches.dmi index 70510d9d975a7e3eb0096cbe90db04d2e01867ec..5a56743224bcfa6cf5aa46aa523c298eae2e3a06 100644 GIT binary patch delta 1574 zcmV+>2HE+s53CNb8UcR={7FPXRCt{2T#cHeAPiizKUQ73@Bg%i)hcS31d-PEGX1{O z6PFl942*`KAH@LEqbN`A-@pl{vKUT#_0TR#olAo%;Ig zV_`18m#ekTfxD$0uy^NxwXHkxkPdVV$Q)1xvOpPlH@=90I`n@St&h(@b-fkVfpVZb zUff)$*qZ?Z5L3;>Kut4H(+nW{k}EJ5fCvw~K5(ZUxRZUroFN2;xdsrn&(^09w$Gq9 zj2Y<0Fb~+KS?$hRa@$jgVSq5Yuy1Mr(^KD}w(iR8xck7&fvpT6`}JT5*>@E`FdTJz z-3k4%?u5~Rb)A26+8rGv7>MfwgZ<`lf!+3Tz+Hs%*xJdJko^;C;gc&b08SJGHspY% z81U^ATV%brUm_1nSAGL12?m<50}a7|Z-2RU*MqG0_OXkuyy_{oS3BalTNUZI5Vl{~ z;l2*rH^{@T4_pDrP8=7=p#9qoS?}!|)WU{&%q=_dhM|AN%D%UCO^+Y44+q-69&T%= z-F|E2k$&r7ZghayItTbjW?Fz)2DSt;WWQ|%44B{X=j{#$`0_Oau|tVvr89d2fPHhm zj6ZL;{~5kKnSoWM-tW>kG_>z(3!--bmq#+-?urEip#FymSoo+QG`;9cxbo>%Sah!C z*@5zK{eypdpsX(pPa2G<{P`bd9uX|ZlNMCCuR>`qQ~T1l&{TfNIkDeXw7AQZ|Mzg+ z<=j0*%7z|{y}*9=6l+8FyTM>nwr+@Vrh7K)fXS=x@8f_(-w#!gh~fQ0i|w~z`z{cj zMUnJ+&Z4Y|haw^S&s#`PK|Tgj>?;F_PzJt;0cL+nn4N)*_WL*>n3QLY0}1v$2CytL zZvi+Pi3!nJ~8VQ;1_g%+R}@LL37Pq3ZieKgGaH;{aCo zJ$-+Yzh^pl76xMOL0bcT-}?IgB!By&KgB?5A7J$Tc?;a@6n(!aeEYKZ3oHYizCUk) zSp$C)TdY0bZfgeO>=O>eQCO5xeSea_eI0!5K>95d6-c-i#`^yC>f7HTki~~``$y>d z-c}sw_8dyY45sWK(DyB??^A&+WiS^XNU*xk>HA9t-Vn$P()WL-mR<<_;|{^V%ZCy` z-yfR!vJ&{mot+tQKovCW7QpI0qwkY_poxF7@0~!`>s4@nR$yih5OsNf#g%&wJOdd} z=GOMT6F7aJu7I1dh-WlAI54&UrV0{~>;R|VAKwAaz^6Nqicub~@~9fg7`jg|f8h8I zIA$yM{X*+bIjRFL5LJ>$TIEsplJQ_b=72Jg1PvkaIBeLu%jh|6EV>c06I^9LmQehvn> z`~@KGFY*Tj`hJc+z~wIhXT-^u1o!nkkoE@$q668!gE`JT zR`+8W$PvgG1{isNYypwJpCynn`3qRye=;D{_wz7-^B36f^BIMI%>dB%H!;BEFR0jOu=fK8!hBSX68LR_G&mZ6%IDGy9>wtekp-?Ck z3WY-PYQXvECk$Ho^??o!etn>WWA=4BTA%2sz~c9bui)Ll>UYUk@NV$y105Xv`alN< z*0w*u0UXFaz=3aJfM1{Js5q0a7l`$VjtYK#po2rOKG3njzkg6D6bgkxp-?CkicDZ+ zkrzx!677rE2g-K+iT1_o1Lc2nAkBVF2>fLJKsE;w?K5Au=a-kI`3oUnec#I;$OUQs zLI~pZfpS5bzYv0WeV|;B<}ZYR)#ZqV@HRV;X#eejEY<$kFu>*yWOE?Vey{Hf@&~dx zK)zs*+ZV47l+S_0K7dbog#)tuh3#kLhQ38mC=?2XLZMJ76bgkxp->(u6bgkxp-}9K Ye<0`hs1HdMb^rhX07*qoM6N<$f@HxEMF0Q* delta 1708 zcmV;d22=U04zUlg8UcR>fk{L`RCt{2T#cHeAPih=ZT(xi@Bg%i)ha4Xf{0L$>Gz#p zaY@67foYSUpNtV=KykaPe=Qf>Z^d}o*`JO9QHsa2s_LR?+t%;_g?hUw>ZeBN+ z9|`gJeLSU94!oq<0r^r6NZF|ilXReGfagGFAP6!8v2h^=8ry$kv`L?V>RA_3!Q?>y zeo?DXaWn%0z@?j+fyT^0V`c!^=X?V30C4a?n*%Si125wo5G4e|Ff{E$kP##M;yJE9{M!M;EvEQrV4dJ=!{SW0Z{YezNo_#yjtp!*x3 zj&eR7j)EWQ_b%op2MkB$03FFh2jI%Uo|-yPVt7efoxKHmzf z$+f=P(r$n6e{>JD4UP6qgJ89P{zL2|tnGNyf*OxiD8*wQU-KdNct>;C~NGch|T`z7GiV|jsYM0nE_8^1}=ZZ0I?+u&cIIlLmXgi%7exM5BnMe zSQc510NjnZglx7f!Xd1YV7gzF!o&ectyABm+x(3kdCRJ-QD zCy)VUZfjq=fYSHP9Z)+K_KxNN2j=nL)qy9x9ia64^c|oKe7gg_nB?&)jH=;{ar#*E z2hw*yFWw zAsC?Y7l5?C${%3p`yu84mA?R_eMbJkO5d+I`o1FrRQ>{x_8U5XV5RR@9DU!B0V;oi z`~sz@Hb3CE>iZ#XAu4|Xk8eK*9Q1$v5P^)!UjWiRBY$9}E{9l3P`{oB(*Edxb09l* zF-Mul>b@%jAp#k}03q*BBf!%4g9I`ne*w$;9|oBEei#OD{sQ^?d_v*hG63}bT?`QU z3*_(fiQo5Y4txTcB@USVW;j6PH=w^2^S`tq%7LBx3~v5{H%JFk&mW*1NIrjmfOH@u zBO@atBO@at<7~kF=r=4{>H0v4gRT#hI2ONdNA-zP1s1>WbO*74)$beKL2S_Vff5H@ zA1HBPZTkxxz=7-w9JmStbbX>!Q5wHqFw`eX6?A=|#KEW!ls4$^A2Kp70`KxVv2hIt zeCh+mhIcAqYwlR>9jk-gJkr59FP{Krz5( zXy;Ri?w+`SVjy&VAn*JIoIeo0J`lFf$X|$EAILj@A$ENr@BD?u02_{2-}kQ%1WY%q z{Ds){fk=X>`~_-+L)Qnw)*1N=vFif?)4cqJ*!6*cX`g*9Y>>U!Ydp>>bTc2M)_$@J900X((g|LL>e1IsXc@x_a| z9LOT#It(0KALulMst+V|8iLgaIt#fzP;7i@eV~6aR!slTO&5&-00004bEW%0^C=B$cza`h@bysVK$lmeWGNY>fSG_4()b&vo6`b-muN_v?DxkH`Id+?QOO9n@8IQ~>}` z-|cAY3IHJd2m&Z1JmvcoABHDQ7pFsZTrSt|*xA~e#@!A+$;o#V3dPmdzdIMS;jYdH z0qRJ%KfK^vIOGv->v!g_(u}ZT zimQ+@)n+kPbK<~FZ}yRkO_lMiL*WKC)m~G3pM%wCcOR347CTR3bLUR*`0^#gWJt{s z05r6A+gcxr%=zKddh1EKrd`MR6;=>=XGr~>wJ%2*9aId#b~;5>mSj0=|T zMz03VPDFJA-x8gkRF>8E^h*z}Bdu;oLA)QXcnr11LnYrWrIrF7+UGTNca3E)lV8mC zClN#UsWxCGDn7M=OqPlVO|J&KWTw`Kx?RnkiI&YT)&k_u+K*cV^Kk6g!+J!Q?KT@A zM5`%}GN(Ok=R;N3(*dmv{;?9Y&3S_BF-yV~x0pdy&}n;a6GkNHW?9regR}|sS$BPl zzSZ=g5l7G7p#haL3y>F#3Y82tZl=qWdI@q#Q z$EL27`oj1i!mS3MIiyTx2TIUoLx+7YM{mv3o(d}2MPR8IpIZ&4=K4+b3D#Qi1&+cdeG^o3bq2Q~4nFYZWoffOS&ecBGU1jZg)|oq?R`c(~R-^df&*sr_ z%TcfTKVpqVL9McHFCGM(KWt$g=$yCO#nLAD{+RCL@5-e3Hq;`!C`VD$PT#h|Nl)-d zdU;3+!_(4Q_Hons)1$o>0xL}Jy|R)Y-WO??SGeX3hPmJLWQs2K9Jo6aAZtuD#S{+B z#mcsbe$pan#MLo=i5S%P@T67D?8Cl!LW3{6%FYRBU-2HCL>i%|WN6nHnH%t(rL(h9 zhXrw-(@F0yU;WinyUdtZaZGT4bJH_)SBYIl0Xm$_{=&o53`rmB?zmumoAdC=B%${! z&a#Prg3A4x`6&r86{PB3x%SY(E)6$Mp!;{#?$F|IY^s1LGAqBZI^w`T(rC;F`=jS4 zc|+Pi_hf|!brow{4P5KjxJ|2fiAX}_?yo)UebNTY8^X^FwLHT#{?+`*rL;=W5y~L| zrGs9#J@w41MWVm3 zH(0nxu^JSatyvvQ>ea~L{oP>wp)mUHa-@}(nR2oI-TfPjt_uW!gDushX}nI!aZL%8 zdW1DO%Z~kDuG5ve85?8v^GDy1V#FJHWv=7+$F2IbQT|ss=Mq*Vs~lXlc9AtB7JDLK za+du1IQG)$Ba~M>d=4F*wP8$EKzTdftJ$R-8Jt8iV&M?} z->|`k?*rQBmNkvZk~33zUb2UqpbC}u4x zC*(IBZuH-pL1=Qvu>KB`0_>OmUHkb&GbXdM=+#7YPT!sLX*Qr^g?DlU0~Dv|_8-ic zL1h2p#~yVCP!%FUnj~T8Cvno!Jk!1}<}QoXKDN|ht|^gce>9y=-v14|>a^C`?=A(o zSJVDFr1OP=+S7zHV2xn|F6eGK0BUVFIHV&=8yX7p0`g2n+gvst-xy^BZy~}N;DijH zK4a7TCWjR8KX;SJy$Ks9<77SWiFis@d>MxuphtOYV0v5hQ1k7S1n{Mi5gw@BRaC$9 zH8=R4K@nz+hTE3wI;li%ls|bW0bEU48v6OfLjDqM%3FW)`yQ58Iwek~|7PxgCkem^ zqYZ%1;-$^w{drdr1`FzjV_$bZC02@Rv4mH+TVBWQo;oU4R@2^5e&N;)YAK*)?6ev&*sP^8NB!h&%-mQ?x9TJk4SI+i{U5)9_S*T4t~4{qrm zppc1NITDMO@~8Kr@CvRu$p4HeW76*e<0O3CtnzggKmjf3qZB#iP`I8P>57_6dO6Y*z8=Eqme)`2kOcjm@aWdt_Q~%v<-I#)a z#!Vs>(4syHc~?D!jGo3d;3shF7SrdD=C*R=F%b5y;}+TiV%!cIJjhkRS;`t{R{4&} z{~O|mMP1LAz~WuQk}7x>MK4q?SSpEsTRPVKadZt;Kx%~lIxc9xOXiqP)IYuD=T9*c z?Fad!MeS)>nuT+7voB1HWMV@1lLA2}ZM0((j$v7s<^Yt=oH;1ngDtDK>Zc+%$|F%* zrVtNJj%pEwl+ALZJo0kzePB$dBi5qc%6C?29c5`;+X)nu8`PrBHa#=B%$J9j?q5&h z0Ws=%p~?0@v5qbMzOzGiUc}V95)Md=?QNBWxdob#g-cQZQ5{BY-(}tIH*gID)o0r@ z#>pR4earJeg+BG#8J;zrED+p#WUpHW?x;Q~C+CE8VAyWO(l~{GXR1c4e^e>JqTZh+ z$s(9xt4;-X61ro)TDSBa`^D+7@2J7O`;`{9J+Qo*x^T4BFpt9%W34QhbOj zn`eX~PN6EHkifRB6aiClFIqRY=m*V?i~Vu}1;dnG0HB5~5nJ&hZzL*f$h2we7hgq$ z7(~FQ%t}OYnmwUGNzd8}MRe$H$6q0cdPNVz>;?LJ?dV!+vCb>c9^vvmY0&n!CCoJS zd*=pAC!~DhXI*ZhykwspG|{E>>JTXVxQ*XD%eNQ2apXpVCr&m;MA70yL`bXA<}KRb zo3;VB+&zN@TZ#%kJ}C{;>@yFk^UT%{O$r<;*cA!HjEk_S=x0LS=q5yJZk0BZANW%) z@kdwsW#0`>Y*9H~ePmi)9(08Q;nvsq3&7lfT*=CqNbF*^me!tVi+Ca0Gn`1G$M*3f~R z^I64nag(hrwU=bx7efr7vufGX8*JvoDvv38%J(HwDQ3}^L!v);%fofSO23X2zM*&O z@?cJsbLkmCrCV(%=R6Rj(btuH8;O%h@lL44o?Y{Xpue7ld>d$qC|pFLL05nsS8`3c zw!#>2M`_fQYJK#b-b)1#mL;;2F@{y!HO4hSLQJQVaaJ1isrr$&XvU^N;5<4#7Kzfx z%r$}FH9q#WJcf~K2Q1FmW>sJ+!kp^AW7SnVvLpqf?a@>ZB8xZhf^C>9g{l;!qmOB%kC>1K_ynzG3*-Ge0KB%1bv+a4^dT zs&4~KbYj~W_PBe?igrG7Wm(+E;{!`UQ}Vg&_XDZeg_4QORS(5qt3D3@Izs@gFbzuk z$2;&o_Xza4B857)@@#f8VCHQq9CMOYa;OIFb4JojSVspy`h52F<2;y(ui#xEZ)fxP zcq$-b4xC!!_YKQ}TdqXpo-)j|2c+W(+Uzl`EhMX|-rwuU7_8TdN_>q06nyVN)Np27 z?!yP1&=IV4nYpt)FyWiv_smo+>-R2qo}bdoWuxnJ6G@rO*_SZljxGQ)cgo~=lK)&z z4-Oa<3(?0jNrxIk8H2VVyD|jZoqn(&1*5SNNM<{;uu5_Ym8Fu^qjl#|o;~%Imvg<- z==9Z!Puuq(qa6(2+`rjjH1o!GC0Qr70{!g%c&aU8c?$Q!eE&oa#4`|ydc_VaLV3Mn z;*rQfg@(+WM1rKs!!Vt;J!Voh{(Sg{qen;{^*n72{Sx?l|1(#n`~ap!%8bK*{L=qK z!efQ=pvtj%@CERblum~0es9o|aDOx&D}g^%%_!(Meg1F^ZKi-w`6kfZ0+~P+A75bh zxAy{xPA`zax`k3m1!U(oTvv@8Ojrn+K(x=f@#x`-<@u&AFcD#mvKYsLX^WkC1gBQK zn4t Date: Sun, 24 Nov 2024 13:27:22 +1100 Subject: [PATCH 30/42] Replacing wooden plank furniture with chipboard laminate furniture. --- code/game/objects/structures/benches.dm | 4 + code/game/objects/structures/tables.dm | 78 +++++++ .../designs/general/designs_general.dm | 58 +++++ .../solids/materials_solid_wood.dm | 43 ++++ .../materials/material_sheets_mapping.dm | 6 + .../reagents/reactions/reaction_synthesis.dm | 54 +++++ maps/antag_spawn/ert/ert_base.dmm | 10 +- maps/away/bearcat/bearcat-2.dmm | 4 +- maps/away/casino/casino.dmm | 38 ++-- maps/away/errant_pisces/errant_pisces.dmm | 14 +- maps/away/liberia/liberia.dmm | 64 +++--- maps/away/magshield/magshield.dmm | 26 +-- maps/away/mining/mining-signal.dmm | 18 +- maps/away/slavers/slavers_base.dmm | 12 +- maps/away/smugglers/smugglers.dmm | 4 +- maps/away/unishi/unishi-2.dmm | 20 +- maps/away/unishi/unishi-3.dmm | 26 +-- maps/away/yacht/yacht.dmm | 6 +- maps/exodus/exodus-2.dmm | 210 +++++++++--------- maps/exodus/exodus-admin.dmm | 42 ++-- maps/ministation/ministation-0.dmm | 26 +-- maps/ministation/ministation-1.dmm | 60 ++--- maps/ministation/ministation-2.dmm | 52 ++--- maps/tradeship/tradeship-0.dmm | 4 +- maps/tradeship/tradeship-2.dmm | 4 +- .../away_sites/lar_maria/lar_maria-2.dmm | 30 +-- .../government/away_sites/icarus/icarus-1.dmm | 14 +- .../government/away_sites/icarus/icarus-2.dmm | 18 +- mods/gamemodes/heist/heist_base.dmm | 16 +- 29 files changed, 602 insertions(+), 359 deletions(-) diff --git a/code/game/objects/structures/benches.dm b/code/game/objects/structures/benches.dm index ed9805ff78bb..0cf79b941736 100644 --- a/code/game/objects/structures/benches.dm +++ b/code/game/objects/structures/benches.dm @@ -38,6 +38,10 @@ material = /decl/material/solid/organic/wood reinf_material = /decl/material/solid/organic/wood +/obj/structure/table/bench/wooden/chipboard + material = /decl/material/solid/organic/wood/chipboard + reinf_material = /decl/material/solid/organic/wood/chipboard + /obj/structure/table/bench/padded icon_state = "padded_preview" material = /decl/material/solid/metal/steel diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index c66281e59f21..3700b2f4e488 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -778,6 +778,84 @@ /obj/structure/table/woodentable_reinforced/ebony/walnut additional_reinf_material = /decl/material/solid/organic/wood/walnut +// Wood laminate tables; chipboard basically. +// Smooth texture like plastic etc for a less rustic vibe on spacer maps. +/obj/structure/table/laminatetable + icon_state = "solid_preview" + color = WOOD_COLOR_GENERIC + material = /decl/material/solid/organic/wood/chipboard + reinf_material = /decl/material/solid/organic/wood/chipboard + +/obj/structure/table/laminatetable/mahogany + color = WOOD_COLOR_RICH + material = /decl/material/solid/organic/wood/chipboard/mahogany + reinf_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/obj/structure/table/laminatetable/maple + color = WOOD_COLOR_PALE + material = /decl/material/solid/organic/wood/chipboard/maple + reinf_material = /decl/material/solid/organic/wood/chipboard/maple + +/obj/structure/table/laminatetable/ebony + color = WOOD_COLOR_BLACK + material = /decl/material/solid/organic/wood/chipboard/ebony + reinf_material = /decl/material/solid/organic/wood/chipboard/ebony + +/obj/structure/table/laminatetable/walnut + color = WOOD_COLOR_CHOCOLATE + material = /decl/material/solid/organic/wood/chipboard/walnut + reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/structure/table/laminatetable_reinforced + icon_state = "reinf_preview" + color = WOOD_COLOR_GENERIC + material = /decl/material/solid/organic/wood/chipboard + reinf_material = /decl/material/solid/organic/wood/chipboard + additional_reinf_material = /decl/material/solid/organic/wood/chipboard + +/obj/structure/table/laminatetable_reinforced/walnut + color = WOOD_COLOR_CHOCOLATE + material = /decl/material/solid/organic/wood/chipboard/walnut + reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/structure/table/laminatetable_reinforced/walnut/maple + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/maple + +/obj/structure/table/laminatetable_reinforced/mahogany + color = WOOD_COLOR_RICH + material = /decl/material/solid/organic/wood/chipboard/mahogany + reinf_material = /decl/material/solid/organic/wood/chipboard/mahogany + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/obj/structure/table/laminatetable_reinforced/mahogany/walnut + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/structure/table/laminatetable_reinforced/ebony + color = WOOD_COLOR_BLACK + material = /decl/material/solid/organic/wood/chipboard/ebony + reinf_material = /decl/material/solid/organic/wood/chipboard/ebony + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/ebony + +/obj/structure/table/laminatetable_reinforced/ebony/walnut + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + + + + + + + + + + + + + + + + + // A table that doesn't smooth, intended for bedside tables or otherwise standalone tables. // TODO: make table legs use material and tabletop use reinf_material // theoretically, this could also be made to use the normal table icon system, unlike desks? diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 47eebe2b4542..ae37f50f4d94 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -188,3 +188,61 @@ /datum/fabricator_recipe/fishing_line_high_quality path = /obj/item/fishing_line/high_quality +/datum/fabricator_recipe/chipboard + path = /obj/item/stack/material/sheet/mapped/chipboard_pine + category = "Textiles" + fabricator_types = list( + FABRICATOR_CLASS_GENERAL, + FABRICATOR_CLASS_TEXTILE + ) + +/datum/fabricator_recipe/chipboard/get_resources() + resources = list( + /decl/material/solid/organic/wood = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard + path = /obj/item/stack/material/sheet/mapped/chipboard_pine + +/datum/fabricator_recipe/chipboard/get_resources() + resources = list( + /decl/material/solid/organic/wood = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/maple + path = /obj/item/stack/material/sheet/mapped/chipboard_maple + +/datum/fabricator_recipe/chipboard/maple/get_resources() + resources = list( + /decl/material/solid/organic/wood/maple = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/mahogany + path = /obj/item/stack/material/sheet/mapped/chipboard_mahogany + +/datum/fabricator_recipe/chipboard/mahogany/get_resources() + resources = list( + /decl/material/solid/organic/wood/mahogany = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/ebony + path = /obj/item/stack/material/sheet/mapped/chipboard_ebony + +/datum/fabricator_recipe/chipboard/ebony/get_resources() + resources = list( + /decl/material/solid/organic/wood/ebony = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/walnut + path = /obj/item/stack/material/sheet/mapped/chipboard_walnut + +/datum/fabricator_recipe/chipboard/walnut/get_resources() + resources = list( + /decl/material/solid/organic/wood/walnut = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) diff --git a/code/modules/materials/definitions/solids/materials_solid_wood.dm b/code/modules/materials/definitions/solids/materials_solid_wood.dm index 01629ab0acff..fd8f36268599 100644 --- a/code/modules/materials/definitions/solids/materials_solid_wood.dm +++ b/code/modules/materials/definitions/solids/materials_solid_wood.dm @@ -133,3 +133,46 @@ /decl/material/liquid/heartstopper = 0.1 ) value = 1.8 + +// Used solely to give the old smooth table icons for spacer tables. +// Easy to work, not very strong or valuable. +/decl/material/solid/organic/wood/chipboard + name = "pine chipboard" + adjective_name = "pine laminate" + uid = "solid_wood_chipboard_pine" + lore_text = "Also known as particle board, this material is made from various kinds of pine wood chips and resin, with a plastic laminate." + bench_icon = 'icons/obj/structures/benches.dmi' + pew_icon = 'icons/obj/structures/pews.dmi' + door_icon_base = "metal" + table_icon_base = "metal" + color = WOOD_COLOR_GENERIC + value = 1.1 + default_solid_form = /obj/item/stack/material/sheet + +/decl/material/solid/organic/wood/chipboard/maple + name = "maple chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of maple wood chips and resin, with a plastic laminate." + adjective_name = "maple laminate" + uid = "solid_wood_chipboard_maple" + color = WOOD_COLOR_PALE + +/decl/material/solid/organic/wood/chipboard/mahogany + name = "mahogany chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of mahogany wood chips and resin, with a plastic laminate." + adjective_name = "mahogany laminate" + uid = "solid_wood_chipboard_mahogany" + color = WOOD_COLOR_RICH + +/decl/material/solid/organic/wood/chipboard/ebony + name = "ebony chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of ebony wood chips and resin, with a plastic laminate." + adjective_name = "ebony laminate" + uid = "solid_wood_chipboard_ebony" + color = WOOD_COLOR_BLACK + +/decl/material/solid/organic/wood/chipboard/walnut + name = "walnut chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of walnut wood chips and resin, with a plastic laminate." + adjective_name = "walnut laminate" + uid = "solid_wood_chipboard_walnut" + color = WOOD_COLOR_CHOCOLATE diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index d852c202c26f..33dfdcb211c3 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -117,4 +117,10 @@ STACK_SUBTYPES(titanium, "titanium", solid/metal/tita STACK_SUBTYPES(cotton, "cotton", solid/organic/cloth, thread, null) STACK_SUBTYPES(dried_gut, "dried gut", solid/organic/leather/gut, thread, null) +STACK_SUBTYPES(chipboard_pine, "pine chipboard", solid/organic/wood/chipboard, sheet, null) +STACK_SUBTYPES(chipboard_maple, "maple chipboard", solid/organic/wood/chipboard/maple, sheet, null) +STACK_SUBTYPES(chipboard_mahogany, "mahogany chipboard", solid/organic/wood/chipboard/mahogany, sheet, null) +STACK_SUBTYPES(chipboard_ebony, "ebony chipboard", solid/organic/wood/chipboard/ebony, sheet, null) +STACK_SUBTYPES(chipboard_walnut, "walnut chipboard", solid/organic/wood/chipboard/walnut, sheet, null) + #undef STACK_SUBTYPES \ No newline at end of file diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index 90f7a0e19577..f30d0c4b049e 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -146,3 +146,57 @@ return for(var/i = 1 to create_soap) new /obj/item/soap/crafted(T) + +// Making chipboard out of wood scraps/recycled wood. +/decl/chemical_reaction/synthesis/chipboard + name = "Pine Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + result_amount = 1 + mix_message = "The wood particulate binds with the plastic to form laminated chipboard." + minimum_temperature = 100 CELSIUS + var/chipboard_type = /decl/material/solid/organic/wood/chipboard + +/decl/chemical_reaction/synthesis/chipboard/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) + ..() + var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) + if(!istype(T)) + return + var/create_sheets = floor(created_volume) + if(create_sheets <= 0) + return + new /obj/item/stack/material/sheet(T, create_sheets, chipboard_type) + +/decl/chemical_reaction/synthesis/chipboard/maple + name = "Maple Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/maple = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/maple + +/decl/chemical_reaction/synthesis/chipboard/mahogany + name = "Mahogany Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/mahogany = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/mahogany + +/decl/chemical_reaction/synthesis/chipboard/ebony + name = "Ebony Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/ebony = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/ebony + +/decl/chemical_reaction/synthesis/chipboard/walnut + name = "Walnut Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/walnut = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/walnut diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index 30c9701f6a83..e1e1f3f16a8f 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -1555,7 +1555,7 @@ /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "ev" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/machinery/button/blast_door{ @@ -1567,7 +1567,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "ew" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/radio/phone{ @@ -1577,7 +1577,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "ex" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/machinery/button/blast_door{ @@ -1747,7 +1747,7 @@ /turf/unsimulated/floor/dark, /area/map_template/rescue_base/base) "eH" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/ashtray, @@ -1761,7 +1761,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "eJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /turf/unsimulated/floor/cult, diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index c167b8ef9e01..10ca7b3af294 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -302,7 +302,7 @@ "aM" = ( /obj/item/paper_bin, /obj/item/pen, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -479,7 +479,7 @@ /turf/floor/wood, /area/ship/scrap/command/captain) "bc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable{ icon_state = "0-8" }, diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index b1d54db6ab7c..34f3ab6aa0d7 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -1293,7 +1293,7 @@ /turf/floor/plating, /area/casino/casino_storage) "dQ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigar{ pixel_y = 5 }, @@ -1317,7 +1317,7 @@ /turf/floor/plating, /area/casino/casino_storage) "dS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/toolbox/mechanical, /obj/item/stack/cable_coil, /turf/floor/plating, @@ -2244,7 +2244,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "gu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/mask/smokable/pipe, /obj/machinery/light{ dir = 1 @@ -2253,7 +2253,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "gv" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigar, /obj/item/box/fancy/cigar{ pixel_y = 5 @@ -2726,13 +2726,13 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "ia" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/utensil/fork, /turf/floor/carpet, /area/casino/casino_mainfloor) "ib" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/casino/casino_mainfloor) "ic" = ( @@ -2855,13 +2855,13 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "iq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/food/applepie, /turf/floor/carpet, /area/casino/casino_mainfloor) "ir" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/food/bigbiteburger, /turf/floor/carpet, @@ -3048,7 +3048,7 @@ /turf/floor/tiled, /area/casino/casino_kitchen) "iR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/utensil/spoon, /turf/floor/carpet, @@ -3385,7 +3385,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "jJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/item/food/cubancarp, /turf/floor/carpet, @@ -3463,7 +3463,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "jU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/food/waffles, /obj/item/chems/drinks/cans/iced_tea, @@ -3631,7 +3631,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "kt" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pizzabox/meat, /turf/floor/carpet, /area/casino/casino_mainfloor) @@ -4219,14 +4219,14 @@ /turf/floor/wood, /area/casino/casino_private_vip) "lZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigar{ pixel_y = 5 }, /turf/floor/wood, /area/casino/casino_private_vip) "ma" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/random/drinkbottle, /turf/floor/wood, @@ -4281,7 +4281,7 @@ /turf/floor/tiled/white, /area/casino/casino_patron_bathroom) "mj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/bottle/agedwhiskey, /obj/item/clothing/mask/smokable/cigarette/cigar/havana, /obj/item/clothing/mask/smokable/cigarette/cigar/havana, @@ -4328,12 +4328,12 @@ /turf/floor/wood, /area/casino/casino_private_vip) "mq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /turf/floor/wood, /area/casino/casino_private_vip) "mr" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/casino/casino_private_vip) "ms" = ( @@ -4348,7 +4348,7 @@ /turf/floor/wood, /area/casino/casino_private_vip) "mu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/random/coin, /obj/random/coin, @@ -4368,7 +4368,7 @@ /turf/floor/wood, /area/casino/casino_private1) "mx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index 7e62686eb0d9..dd44f08ac770 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -2562,7 +2562,7 @@ /turf/floor/wood, /area/errant_pisces/rooms) "gw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_pump/on{ level = 2 }, @@ -2742,7 +2742,7 @@ /turf/floor/tiled, /area/errant_pisces/dorms) "gZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/errant_pisces/rooms) "ha" = ( @@ -2752,7 +2752,7 @@ /turf/floor/wood, /area/errant_pisces/rooms) "hb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/flashlight/lamp, /turf/floor/wood, @@ -2769,7 +2769,7 @@ /turf/floor/wood, /area/errant_pisces/rooms) "he" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/random/smokes, /turf/floor/wood, @@ -2941,7 +2941,7 @@ name = "south bump"; pixel_y = -24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /obj/structure/cable/green, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -5784,7 +5784,7 @@ /turf/floor/wood, /area/errant_pisces/bridge) "pn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/errant_pisces/bridge) "po" = ( @@ -5870,7 +5870,7 @@ /turf/floor/wood, /area/errant_pisces/bridge) "pC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/toy, /turf/floor/wood, /area/errant_pisces/bridge) diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index 35999ef09ff5..5808decc8c01 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -1656,7 +1656,7 @@ /turf/floor/tiled/techfloor, /area/liberia/engineeringengines) "cZ" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/chemical_dispenser/bar_coffee{ dir = 1 }, @@ -3301,7 +3301,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/carpet, /area/liberia/bar) @@ -3325,7 +3325,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "fS" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light{ dir = 1 @@ -3348,7 +3348,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "fU" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/random/drinkbottle, /obj/structure/window/reinforced{ @@ -3357,12 +3357,12 @@ /turf/floor/wood/ebony, /area/liberia/bar) "fV" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/chemical_dispenser/bar_soft/full, /turf/floor/wood/ebony, /area/liberia/bar) "fW" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/light{ dir = 4 }, @@ -3486,7 +3486,7 @@ /area/liberia/bar) "gg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/deck/cards, /turf/floor/carpet, /area/liberia/bar) @@ -3513,7 +3513,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "gl" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/box/glasses/pint, /turf/floor/wood/ebony, /area/liberia/bar) @@ -3640,7 +3640,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "gx" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/structure/window/reinforced{ dir = 8 }, @@ -3653,7 +3653,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "gy" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/ashtray/glass, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -3665,7 +3665,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "gz" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/chems/glass/rag, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -4194,7 +4194,7 @@ /turf/floor/wood/walnut, /area/liberia/bar) "hA" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/scanner/price, /obj/item/scanner/price, /obj/machinery/light/small, @@ -4206,21 +4206,21 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/engineeringreactor) "hC" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/item/box/matches, /obj/random/smokes, /turf/floor/carpet/red, /area/liberia/captain) "hD" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /mob/living/simple_animal/tindalos{ name = "Eddy" }, /turf/floor/carpet/red, /area/liberia/captain) "hE" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/carpet/red, /area/liberia/captain) @@ -4257,7 +4257,7 @@ /turf/floor/carpet, /area/liberia/personellroom2) "hI" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -4312,7 +4312,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/merchantstorage) "hN" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/random/action_figure, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -5178,7 +5178,7 @@ /turf/floor/carpet, /area/liberia/library) "jX" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/lava/orange, /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 @@ -5186,7 +5186,7 @@ /turf/floor/carpet, /area/liberia/library) "jY" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/structure/flora/pottedplant/deskleaf{ pixel_x = -5; pixel_y = 2 @@ -5222,7 +5222,7 @@ /turf/floor/carpet/magenta, /area/liberia/guestroom2) "ka" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/structure/flora/pottedplant/smallcactus{ pixel_x = -5; pixel_y = 9 @@ -5246,7 +5246,7 @@ /turf/floor/carpet, /area/liberia/library) "kc" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/box/fancy/donut, /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 @@ -5424,7 +5424,7 @@ /turf/floor/carpet, /area/liberia/library) "kr" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/modular_computer/laptop/preset/custom_loadout/standard{ dir = 8 }, @@ -5472,7 +5472,7 @@ /turf/floor/carpet, /area/liberia/library) "ky" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/spline/fancy/wood, /obj/machinery/power/apc/liberia{ name = "south bump"; @@ -5482,7 +5482,7 @@ /turf/floor/carpet, /area/liberia/library) "kz" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light/small{ @@ -6241,7 +6241,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/merchantstorage) "os" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/spline/fancy/wood, /turf/floor/carpet/red, /area/liberia/traidingroom) @@ -6421,7 +6421,7 @@ /turf/floor/tiled/techfloor, /area/liberia/cryo) "pZ" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/fabricator/micro/bartender{ pixel_x = 4 }, @@ -6757,7 +6757,7 @@ pixel_x = 4; pixel_y = -4 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, @@ -7120,7 +7120,7 @@ /turf/wall/r_wall/prepainted, /area/liberia/captain) "Af" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/borderfloor{ dir = 10 }, @@ -7748,7 +7748,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /turf/floor/carpet/blue, /area/liberia/personellroom1) "Kh" = ( @@ -7862,7 +7862,7 @@ /turf/wall/r_wall/prepainted, /area/liberia/officeroom) "Ml" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/ashtray/glass, /obj/effect/floor_decal/borderfloor{ dir = 6 @@ -8106,7 +8106,7 @@ /turf/floor/tiled/techfloor, /area/liberia/merchantstorage) "QK" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/corner/green{ dir = 5 @@ -8512,7 +8512,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 10 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/carpet/blue, /area/liberia/personellroom1) diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index d6e4edc107af..ab90cfc20bcd 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -2268,7 +2268,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "gH" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 10 }, /obj/item/box/checkers, @@ -2278,20 +2278,20 @@ /turf/floor/carpet/blue, /area/magshield/west) "gI" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 10 }, /obj/item/belt/champion, /turf/floor/carpet/blue, /area/magshield/west) "gJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 10 }, /turf/floor/carpet/blue, /area/magshield/west) "gK" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 10 }, /obj/item/bible/booze, @@ -2385,7 +2385,7 @@ /turf/floor/tiled, /area/magshield/west) "gY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/action_figure, /turf/floor/tiled, /area/magshield/west) @@ -2483,7 +2483,7 @@ /turf/floor/tiled, /area/magshield/west) "hn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/sword/replica, /turf/floor/tiled, /area/magshield/west) @@ -2523,7 +2523,7 @@ /turf/floor/plating/airless, /area/space) "hw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/plushie/large, /turf/floor/tiled, /area/magshield/west) @@ -2565,7 +2565,7 @@ /turf/floor/tiled, /area/magshield/west) "hC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/toy/shipmodel, /turf/floor/tiled, /area/magshield/west) @@ -2614,7 +2614,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "hK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/supermatter_engine, /turf/floor/carpet/blue, /area/magshield/west) @@ -2665,7 +2665,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "hT" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/evaguide, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -2727,7 +2727,7 @@ /turf/floor/tiled, /area/magshield/west) "hZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/accessory, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -2735,7 +2735,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "ia" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flame/fuelled/lighter/zippo/random, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -2743,7 +2743,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "ib" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/random/smokes, /obj/machinery/light, diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 9876407c3682..0d101569e586 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -667,18 +667,18 @@ /turf/floor/wood/broken/three, /area/outpost/abandoned) "co" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/effect/decal/cleanable/dirt, /obj/random/trash, /turf/floor/wood, /area/outpost/abandoned) "cp" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/board, /turf/floor/wood, /area/outpost/abandoned) "cq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/wood, /area/outpost/abandoned) @@ -773,7 +773,7 @@ /turf/floor/carpet/blue, /area/outpost/abandoned) "cO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/carpet/blue, /area/outpost/abandoned) @@ -975,13 +975,13 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 10 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/carpet, /area/outpost/abandoned) "dx" = ( /obj/effect/floor_decal/spline/fancy/wood, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/outpost/abandoned) "dy" = ( @@ -994,7 +994,7 @@ /area/outpost/abandoned) "dz" = ( /obj/effect/floor_decal/spline/fancy/wood, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/carpet/broken, /area/outpost/abandoned) @@ -1002,7 +1002,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/outpost/abandoned) "dC" = ( @@ -1100,7 +1100,7 @@ /turf/wall/titanium, /area/outpost/abandoned) "dR" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ icon_state = "solid_flip0" }, /turf/floor/carpet/blue, diff --git a/maps/away/slavers/slavers_base.dmm b/maps/away/slavers/slavers_base.dmm index f9648ba28634..660b97f4fde2 100644 --- a/maps/away/slavers/slavers_base.dmm +++ b/maps/away/slavers/slavers_base.dmm @@ -2841,12 +2841,12 @@ /turf/floor/tiled/airless, /area/slavers_base/demo) "hO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/radio/shortwave, /turf/floor/tiled/airless, /area/slavers_base/demo) "hP" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/secure_storage/briefcase/money, /obj/random/cash, /obj/random/cash, @@ -2976,12 +2976,12 @@ /turf/floor/tiled/airless, /area/slavers_base/demo) "ij" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/bag/cash, /turf/floor/tiled/airless, /area/slavers_base/demo) "ik" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/cash, /turf/floor/tiled/airless, /area/slavers_base/demo) @@ -3052,7 +3052,7 @@ /turf/floor/tiled, /area/slavers_base/dorms) "iy" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper{ info = "

    Contract

    This contract describes exchanging of monetary pieces for the right o? the ownership for following examples: <*> Human, age 17. Price - 1500cr. <*> Human, age 49. Price - 1100cr. <*> Human, age 28. Good fist fighter. Price - 2400cr. <*> Human, age 34. Expirienced medic. Price - 6800cr. Overall price: 11800cr
    Place for signatures"; name = "Contract" @@ -3060,7 +3060,7 @@ /turf/floor/tiled/airless, /area/slavers_base/demo) "iz" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/coin, /obj/item/pen, /turf/floor/tiled/airless, diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index 808d13e14434..5e6ccae998bd 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -611,7 +611,7 @@ /turf/floor/tiled, /area/smugglers/office) "bD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper, /obj/item/pen, /obj/item/flashlight/lamp, @@ -665,7 +665,7 @@ /turf/floor/tiled, /area/smugglers/office) "bK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/coin{ pixel_x = -5; pixel_y = -3 diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index b63e93afd205..d3cc41c6a3bc 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -13,7 +13,7 @@ /turf/wall/titanium, /area/space) "ae" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/advdevice, /obj/item/flashlight/lamp, /turf/floor/carpet/red, @@ -32,7 +32,7 @@ /turf/floor/carpet/red, /area/unishi/library) "ai" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp, /turf/floor/carpet/red, /area/unishi/library) @@ -960,18 +960,18 @@ /turf/floor/tiled, /area/unishi/meeting) "cN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/pen/fancy, /turf/floor/tiled, /area/unishi/meeting) "cO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen/fancy, /turf/floor/tiled, /area/unishi/meeting) "cP" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/folder/yellow, /obj/item/pen/green, /turf/floor/tiled, @@ -1023,7 +1023,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cX" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1033,7 +1033,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1042,7 +1042,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1982,7 +1982,7 @@ /turf/floor/tiled/dark, /area/unishi/common) "fy" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/snack, /obj/item/flashlight/lamp, /turf/floor/tiled/dark, @@ -2008,7 +2008,7 @@ /turf/floor/tiled/dark, /area/unishi/common) "fC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/flashlight/lamp, /turf/floor/tiled/dark, diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index 8ad33994f7dc..43eb73530886 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -896,7 +896,7 @@ /turf/floor/wood, /area/unishi/lounge) "cH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/cell/crap, /obj/item/stock_parts/circuitboard/gyrotron_control, /obj/item/paper_bin, @@ -910,7 +910,7 @@ /turf/space, /area/space) "cJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/trash/raisins, /obj/item/pizzabox/margherita, /obj/random/advdevice, @@ -920,7 +920,7 @@ /turf/floor/tiled, /area/unishi/living) "cK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/dice, /obj/item/deck/cards, /obj/item/pen/fancy, @@ -928,14 +928,14 @@ /turf/floor/wood, /area/unishi/lounge) "cL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/board, /obj/item/book/manual/mass_spectrometry, /obj/item/book/fluff/stasis, /turf/floor/tiled, /area/unishi/living) "cM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, @@ -1024,7 +1024,7 @@ /turf/floor/tiled, /area/unishi/living) "cY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/trash/raisins, /obj/item/book/manual/nuclear, /turf/floor/tiled, @@ -1091,7 +1091,7 @@ /turf/floor/tiled, /area/unishi/kitchen) "dg" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/trash/candy, /obj/machinery/recharger, /turf/floor/tiled, @@ -1268,7 +1268,7 @@ /turf/floor/tiled, /area/unishi/living) "dD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/cane/fancy/sword, /obj/item/clothing/suit/radiation, /turf/floor/tiled, @@ -1441,7 +1441,7 @@ /turf/floor/tiled, /area/unishi/living) "eb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/poster, /obj/item/grooming/comb/colorable/random, /obj/random/advdevice, @@ -1641,7 +1641,7 @@ /turf/floor/wood, /area/unishi/living) "eB" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, @@ -1720,7 +1720,7 @@ /turf/floor/wood, /area/unishi/living) "eJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/grooming/brush, /obj/item/cosmetics/lipstick/black, /obj/item/cosmetics/lipstick/green, @@ -1780,7 +1780,7 @@ /turf/floor/wood, /area/unishi/living) "eS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen/fancy, /obj/random/drinkbottle, /turf/floor/wood, @@ -1796,7 +1796,7 @@ /turf/floor/wood, /area/unishi/living) "eV" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /turf/floor/wood, /area/unishi/living) diff --git a/maps/away/yacht/yacht.dmm b/maps/away/yacht/yacht.dmm index 3e56a19c9e63..84dd4a4fe613 100644 --- a/maps/away/yacht/yacht.dmm +++ b/maps/away/yacht/yacht.dmm @@ -56,7 +56,7 @@ "am" = ( /obj/item/folder/blue, /obj/item/form_printer, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/glass2/coffeecup, /obj/item/newspaper, /obj/effect/spider/stickyweb, @@ -540,7 +540,7 @@ }, /obj/item/bible, /obj/item/pen/blue, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper{ info = "Let me introduce myself. My name is Commander Archibald McKinley, although the Fleet fucks think that I do not deserve the title. Well, fuck them. They accused me of facilitating a destruction of the ship I was CO of. A small missile cruiser, with zero to fucking none point defenses was attacked, and they first accuse me of escaping before any of my crew. What kind of person wouldn't expect someone to escape when their ship is on fire? It's lunacy. But it only got worse. Then they said that I helped the Terrans take the ship. Well fuck them, they are wrong. That's non sense. I have no connection to the Terrans. They said that I got a large sum of money from them in order to betray my ship's position, which is once again total nonsense. I've got about 20 years of life left here, and I know that I will be safe with my ship here. I need to resupply once every 5 years, given how much food and fuel I have, and I've got enough range to go to pretty much any known part of the galaxy, in complete silence, as we are totally solar powered. I wish I could afford ion thrusters to not have to rely on gas for propulsion, but, our gas heaters should provide us with enough pressure to get anywhere in relative decent speed. Also, I got a robot butler who cooks delicious food for me! No more crappy lance corporal food, eh" }, @@ -1168,7 +1168,7 @@ /obj/item/clothing/suit/det_trench/grey, /obj/item/clothing/gloves/ring/cti, /obj/item/clothing/costume/oldman, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/effect/spider/stickyweb, /obj/random/cash, /obj/random/cash, diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 1b0190807cf8..655a78cc42f2 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -60,7 +60,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/security/detectives_office) "aae" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/flask/barflask{ pixel_x = -4; pixel_y = 8 @@ -1539,7 +1539,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/meeting) "adu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flame/candle{ pixel_x = -5; pixel_y = 5 @@ -3533,7 +3533,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/main) "ahH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/megaphone, /obj/item/radio/off, /turf/floor/tiled/dark, @@ -3587,7 +3587,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "ahO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/keycard_auth{ dir = 8 }, @@ -3790,7 +3790,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "air" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "1-4" }, @@ -3805,7 +3805,7 @@ name = "east bump"; pixel_x = 24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger{ pixel_y = 4 }, @@ -3985,7 +3985,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/main) "aiP" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/taperecorder, /turf/floor/tiled/dark, /area/exodus/crew_quarters/heads/hos) @@ -3993,7 +3993,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "aiR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -4004,7 +4004,7 @@ dir = 8; pixel_x = 24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -4507,7 +4507,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/heads/hos) "ajL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/newscaster{ pixel_x = 28; pixel_y = 1 @@ -4951,7 +4951,7 @@ /turf/floor/lino, /area/exodus/security/detectives_office) "akD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /obj/item/secure_storage/safe{ pixel_x = 6; @@ -4986,7 +4986,7 @@ /obj/machinery/alarm{ pixel_y = 22 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flash, /obj/item/clothing/glasses/sunglasses, /obj/item/chems/spray/pepper, @@ -5132,7 +5132,7 @@ /turf/floor/carpet, /area/exodus/security/detectives_office) "akU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray/plastic, /obj/item/box/fancy/cigarettes/dromedaryco, /obj/item/clothing/gloves/forensic, @@ -5495,7 +5495,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/button/alternate/door{ id_tag = "detdoor"; name = "Office Door" @@ -6350,7 +6350,7 @@ /obj/item/secure_storage/safe{ pixel_x = -23 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/lino, /area/exodus/security/detectives_office) @@ -6362,7 +6362,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/button/alternate/door{ id_tag = "detdoor"; name = "Office Door" @@ -6619,7 +6619,7 @@ dir = 8; pixel_x = 22 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/photo_album{ pixel_y = -10 }, @@ -6732,7 +6732,7 @@ /turf/floor/carpet, /area/exodus/security/detectives_office) "aof" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flash, /obj/item/chems/spray/pepper, /obj/item/clothing/glasses/sunglasses, @@ -11368,7 +11368,7 @@ /turf/floor/plating, /area/exodus/maintenance/security_port) "axY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/glasses/threedglasses, /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) @@ -11381,7 +11381,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "aya" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/coin, /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) @@ -11797,7 +11797,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "ayQ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paicard, /obj/structure/cable/green{ icon_state = "4-8" @@ -11810,7 +11810,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "ayR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -13764,7 +13764,7 @@ /turf/floor/tiled/dark, /area/shuttle/arrival/station) "aDi" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/fabricator/book, /obj/item/stack/material/panel/mapped/plastic/ten, /obj/item/stack/material/plank/mapped/wood/ten, @@ -13891,7 +13891,7 @@ /obj/machinery/status_display{ pixel_y = 32 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 @@ -14224,7 +14224,7 @@ /turf/floor/tiled/dark/monotile, /area/exodus/gateway) "aEh" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/reagentgrinder, /obj/item/chems/drinks/shaker, /obj/item/stack/package_wrap, @@ -14348,7 +14348,7 @@ /turf/floor/plating, /area/exodus/maintenance/bar) "aEv" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/gun/projectile/shotgun/doublebarrel, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/floor/wood/walnut, @@ -14463,7 +14463,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/maintenance/auxsolarport) "aEF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -15576,7 +15576,7 @@ /turf/floor/plating, /area/exodus/maintenance/library) "aGM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/dice/d20, /obj/item/dice, /obj/item/radio/intercom{ @@ -16646,7 +16646,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/secondary/entry/starboard) "aIN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/recharger, /turf/floor/tiled/dark, @@ -16805,7 +16805,7 @@ /turf/wall/r_wall/prepainted, /area/exodus/hallway/primary/central_two) "aJj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -2; pixel_y = 5 @@ -17658,7 +17658,7 @@ /turf/wall/prepainted, /area/exodus/crew_quarters/kitchen) "aLa" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp{ pixel_y = 10 }, @@ -17669,7 +17669,7 @@ /turf/floor/lino, /area/exodus/chapel/office) "aLb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/nullrod, /obj/item/eftpos{ eftpos_name = "Chapel EFTPOS scanner" @@ -17677,7 +17677,7 @@ /turf/floor/lino, /area/exodus/chapel/office) "aLc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen, /obj/item/chems/drinks/bottle/holywater, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -17752,7 +17752,7 @@ /turf/floor/tiled/dark, /area/exodus/chapel/main) "aLl" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/folder/yellow, /obj/item/pen, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -18471,7 +18471,7 @@ /turf/floor/tiled/dark, /area/exodus/chapel/main) "aMR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger, /turf/floor/wood/walnut, /area/exodus/library) @@ -18541,7 +18541,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/bar) "aNa" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -19130,7 +19130,7 @@ /turf/floor/wood/walnut, /area/exodus/library) "aOg" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/food/junk/chips, /obj/random/single{ name = "randomly spawned cola"; @@ -19445,13 +19445,13 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/port) "aOL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment, /obj/item/deck/cards, /turf/floor/wood/walnut, /area/exodus/library) "aOM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray/plastic{ pixel_x = -1; pixel_y = 1 @@ -20127,7 +20127,7 @@ /turf/floor/plating, /area/exodus/maintenance/arrivals) "aQj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigarettes{ pixel_y = 2 }, @@ -20220,7 +20220,7 @@ /area/exodus/security/prison/restroom) "aQw" = ( /obj/machinery/photocopier, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/library) "aQx" = ( @@ -20536,7 +20536,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/library) "aRm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -20657,7 +20657,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/bar) "aRx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/single{ name = "randomly spawned deck of cards"; spawn_object = /obj/item/deck/cards @@ -20925,7 +20925,7 @@ /obj/machinery/camera/network/civilian_east{ c_tag = "Bar East" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/pen/blue{ pixel_x = -3; @@ -21910,7 +21910,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aUp" = ( @@ -22265,7 +22265,7 @@ /turf/floor/plating, /area/exodus/maintenance/bar) "aVi" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/exodus/chapel/main) "aVj" = ( @@ -22655,7 +22655,7 @@ pixel_x = 2; pixel_y = 6 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/condiment/small/saltshaker{ pixel_x = -2; pixel_y = 4 @@ -22696,7 +22696,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aWi" = ( @@ -22890,7 +22890,7 @@ /turf/floor/wood/walnut, /area/exodus/library) "aWH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/light/small{ dir = 4 }, @@ -23262,7 +23262,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/research/mixing) "aXz" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/utensil/fork, /obj/item/utensil/fork, /turf/floor/wood/walnut, @@ -23275,13 +23275,13 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/kitchen) "aXB" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/board, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aXD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/checkers/chess/red, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -23304,7 +23304,7 @@ /area/exodus/crew_quarters/kitchen) "aXF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -23565,7 +23565,7 @@ /turf/floor/plating, /area/exodus/hallway/secondary/entry/port) "aYl" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -23749,7 +23749,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/locker) "aYF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/checkers, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -24120,7 +24120,7 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/kitchen) "aZm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aZn" = ( @@ -24147,7 +24147,7 @@ /area/exodus/crew_quarters/kitchen) "aZp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment, /obj/item/camera, /turf/floor/wood/walnut, @@ -24263,7 +24263,7 @@ /turf/floor/carpet, /area/exodus/library) "aZD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper, /turf/floor/wood/walnut, /area/exodus/library) @@ -24278,13 +24278,13 @@ /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aZF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/camera_film, /obj/item/camera_film, /turf/floor/wood/walnut, /area/exodus/library) "aZG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen/red{ pixel_x = 2; pixel_y = 6 @@ -24296,11 +24296,11 @@ /turf/floor/wood/walnut, /area/exodus/library) "aZH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/library) "aZI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 @@ -24953,7 +24953,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/locker) "bbd" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/condiment/small/peppermill{ pixel_x = 2; pixel_y = 6 @@ -24982,7 +24982,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/primary/starboard) "bbg" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/utensil/fork, /obj/item/utensil/fork, /obj/item/utensil/fork, @@ -25054,7 +25054,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/starboard) "bbo" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flame/candle, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -26531,7 +26531,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "beA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen, /turf/floor/wood/walnut, /area/exodus/library) @@ -26552,7 +26552,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/captain) "beD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -27056,7 +27056,7 @@ /area/exodus/crew_quarters/captain) "bfG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/checkers/chess, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -28096,7 +28096,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "bhU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/donut, /obj/structure/cable/green{ icon_state = "4-8" @@ -28290,7 +28290,7 @@ /obj/item/eftpos{ eftpos_name = "Bridge EFTPOS scanner" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -28313,14 +28313,14 @@ /area/exodus/quartermaster/storage) "bir" = ( /obj/item/folder/red, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bis" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -28349,7 +28349,7 @@ /turf/floor/wood/walnut, /area/exodus/bridge/meeting_room) "biv" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/faxmachine/mapped, /turf/floor/wood/walnut, /area/exodus/bridge/meeting_room) @@ -28405,7 +28405,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "biE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random_multi/single_item/captains_spare_id, /turf/floor/carpet, /area/exodus/crew_quarters/captain) @@ -29031,12 +29031,12 @@ pixel_y = 7 }, /obj/item/pen, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bjJ" = ( /obj/item/folder/blue, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bjK" = ( @@ -29532,14 +29532,14 @@ /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bkH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger{ pixel_y = 4 }, /turf/floor/wood/walnut, /area/exodus/bridge/meeting_room) "bkI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -29605,7 +29605,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "bkN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger{ pixel_y = 4 }, @@ -29985,7 +29985,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/primary/central_one) "blG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/folder/blue, /obj/item/stamp/captain{ pixel_x = -4; @@ -30010,7 +30010,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "blI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/wood/walnut, /area/exodus/crew_quarters/captain) @@ -30022,7 +30022,7 @@ /turf/floor/wood/walnut, /area/exodus/crew_quarters/captain) "blK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pinpointer, /obj/item/disk/nuclear, /obj/item/secure_storage/safe{ @@ -30488,7 +30488,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/donut, /turf/floor/wood/walnut, /area/exodus/bridge/meeting_room) @@ -30602,14 +30602,14 @@ /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "bmR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/eftpos{ eftpos_name = "Captain EFTPOS scanner" }, /turf/floor/wood/walnut, /area/exodus/crew_quarters/captain) "bmS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/whip/chainofcommand, /obj/machinery/alarm{ dir = 8; @@ -31431,7 +31431,7 @@ /area/exodus/research/chargebay) "boF" = ( /obj/machinery/faxmachine/mapped, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/floor/wood/walnut, @@ -31956,7 +31956,7 @@ /turf/floor/plating, /area/exodus/storage/emergency) "bpG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random_multi/single_item/captains_spare_id{ weight = 10 }, @@ -32382,7 +32382,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/research/robotics) "bqw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/carpet, /area/exodus/crew_quarters/captain) @@ -33858,7 +33858,7 @@ dir = 1; pixel_y = -30 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/deck/cards{ pixel_y = 4 }, @@ -35557,7 +35557,7 @@ /turf/floor/tiled/white, /area/exodus/medical/medbay2) "bwU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/matches, /obj/item/clothing/mask/smokable/cigarette/cigar, /obj/item/chems/drinks/flask{ @@ -35724,7 +35724,7 @@ /turf/floor/tiled/white, /area/exodus/medical/medbay2) "bxn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/camera, /obj/item/photo_album{ pixel_y = -10 @@ -47700,7 +47700,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/medical/patient_wing) "bVc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/dice, /turf/floor/wood/walnut, /area/exodus/engineering/break_room) @@ -47734,7 +47734,7 @@ /turf/floor/tiled/white, /area/exodus/research/misc_lab) "bVf" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/wood/walnut, /area/exodus/engineering/break_room) @@ -47950,7 +47950,7 @@ /turf/floor/plating, /area/exodus/engineering/engine_waste) "bVC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/engineering_guide{ pixel_x = 3; pixel_y = 2 @@ -47962,7 +47962,7 @@ /turf/floor/wood/walnut, /area/exodus/engineering/break_room) "bVD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/engineering_construction, /obj/item/book/manual/evaguide{ pixel_x = -2; @@ -48520,7 +48520,7 @@ /turf/floor/tiled/white, /area/exodus/research) "bWO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/clipboard, /obj/item/folder/blue{ @@ -49407,7 +49407,7 @@ /turf/floor/reinforced, /area/exodus/research/mixing) "bYx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/supermatter_engine{ pixel_x = -3 }, @@ -49606,7 +49606,7 @@ /turf/floor/carpet, /area/exodus/engineering/break_room) "bYR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -50243,12 +50243,12 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/engine_smes) "caj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/folder/yellow, /turf/floor/carpet, /area/exodus/engineering/break_room) "cak" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/food/junk/chips, /turf/floor/carpet, /area/exodus/engineering/break_room) @@ -50464,7 +50464,7 @@ /turf/floor/wood, /area/exodus/medical/psych) "caG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -50472,7 +50472,7 @@ /turf/floor/wood, /area/exodus/medical/psych) "caH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/computer/modular/preset/medical, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -52263,7 +52263,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/engine_eva) "cei" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/exodus/medical/psych) "cej" = ( @@ -53272,7 +53272,7 @@ /turf/floor/tiled/white, /area/exodus/medical/virology) "cgu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger, /turf/floor/carpet, /area/exodus/hallway/secondary/entry/starboard) @@ -56547,7 +56547,7 @@ /turf/wall/prepainted, /area/exodus/maintenance/arrivals) "cnn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/taperecorder, /obj/item/camera, /obj/item/eftpos{ diff --git a/maps/exodus/exodus-admin.dmm b/maps/exodus/exodus-admin.dmm index c25765329809..f7b4411a7a1d 100644 --- a/maps/exodus/exodus-admin.dmm +++ b/maps/exodus/exodus-admin.dmm @@ -1440,14 +1440,14 @@ /turf/unsimulated/floor/steel, /area/centcom/holding) "aMY" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/amanita_pie, /turf/unsimulated/floor/wood, /area/centcom/holding) "aMZ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/bigbiteburger, @@ -1466,13 +1466,13 @@ /turf/unsimulated/floor/wood, /area/centcom/holding) "aNc" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /turf/unsimulated/floor/wood, /area/centcom/holding) "aNh" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/stew, @@ -1483,7 +1483,7 @@ /turf/unsimulated/floor/lino, /area/centcom/holding) "aNk" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/book/manual/barman_recipes, @@ -1491,14 +1491,14 @@ /turf/unsimulated/floor/lino, /area/centcom/holding) "aNl" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/machinery/chemical_dispenser/bar_alc/full, /turf/unsimulated/floor/lino, /area/centcom/holding) "aNm" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/machinery/chemical_dispenser/bar_soft/full, @@ -1536,28 +1536,28 @@ /turf/floor/tiled/monotile, /area/shuttle/escape_shuttle) "aNB" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/boiledrice, /turf/unsimulated/floor/wood, /area/centcom/holding) "aNC" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/beet, /turf/unsimulated/floor/wood, /area/centcom/holding) "aNI" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/stuffing, /turf/unsimulated/floor/wood, /area/centcom/holding) "aNJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/soylenviridians, @@ -1713,14 +1713,14 @@ /turf/floor/tiled/techfloor/grid, /area/shuttle/escape_shuttle) "aPR" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/blood, /turf/unsimulated/floor/wood, /area/centcom/holding) "aPS" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/skewer/tofu, @@ -1730,7 +1730,7 @@ /turf/unsimulated/wall, /area/centcom/holding) "aRm" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/poppypretzel, @@ -1740,7 +1740,7 @@ /obj/structure/bed/chair/comfy/brown{ dir = 1 }, -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/clothing/pants/slacks/outfit, @@ -1754,13 +1754,13 @@ /obj/structure/bed/chair/comfy/brown{ dir = 1 }, -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /turf/unsimulated/floor/lino, /area/centcom/holding) "bgJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /turf/unsimulated/floor/lino, @@ -1831,7 +1831,7 @@ /turf/floor/tiled/dark/monotile, /area/shuttle/escape_shuttle) "bvb" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/spesslaw, @@ -1845,14 +1845,14 @@ /turf/floor/tiled, /area/shuttle/escape_shuttle) "byb" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/candiedapple, /turf/unsimulated/floor/wood, /area/centcom/holding) "bzm" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/mushroom, @@ -1864,7 +1864,7 @@ /turf/unsimulated/floor/lino, /area/tdome/tdomeadmin) "bMb" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/meatsteak, diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index c715e45dc03c..b427b70ebd3d 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -31,7 +31,7 @@ /turf/wall/natural/random/ministation, /area/space) "ai" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/pool, /area/ministation/dorms) "ak" = ( @@ -1727,7 +1727,7 @@ /turf/floor/reinforced/airmix, /area/ministation/atmospherics) "gF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/light{ dir = 4 }, @@ -3756,7 +3756,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7267,7 +7267,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /turf/floor/wood, /area/ministation/engine) "EN" = ( @@ -7277,7 +7277,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /obj/item/chems/chem_disp_cartridge/coffee{ name = "coffee canister" }, @@ -7289,7 +7289,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /turf/floor/wood, /area/ministation/engine) "EP" = ( @@ -7317,7 +7317,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 @@ -7405,7 +7405,7 @@ "Fc" = ( /obj/item/wrench, /obj/item/clothing/gloves/insulated, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /turf/floor/wood, /area/ministation/engine) "Fd" = ( @@ -7414,7 +7414,7 @@ }, /obj/item/stack/tape_roll/barricade_tape/atmos, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /obj/item/chems/spray/cleaner, /turf/floor/wood, /area/ministation/engine) @@ -7424,7 +7424,7 @@ }, /obj/item/chems/drinks/glass2/coffeecup/metal, /obj/item/chems/drinks/glass2/coffeecup/metal, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /obj/item/chems/drinks/glass2/coffeecup/tall, /turf/floor/wood, /area/ministation/engine) @@ -11756,7 +11756,7 @@ /turf/floor/tiled, /area/ministation/cargo) "Ro" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/mask/snorkel, /obj/item/clothing/mask/snorkel, /obj/machinery/light{ @@ -12544,7 +12544,7 @@ /turf/space, /area/space) "Ua" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/mask/snorkel, /obj/item/clothing/mask/snorkel, /turf/floor/pool, @@ -13830,7 +13830,7 @@ dir = 4 }, /obj/machinery/camera/autoname, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/poster, /obj/item/pen, /turf/floor/wood/walnut, diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index ce6e50124ac1..61ac63b60d6b 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -474,7 +474,7 @@ /turf/floor/plating, /area/ministation/hop) "cA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /obj/machinery/firealarm{ dir = 4; @@ -1218,7 +1218,7 @@ /turf/open, /area/ministation/hall/e2) "gB" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/pen/blue, /turf/floor/carpet/red, /area/ministation/security) @@ -1500,7 +1500,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "hC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_pump/on, /obj/item/scanner/spectrometer, /obj/item/handcuffs, @@ -1633,7 +1633,7 @@ /turf/floor/tiled, /area/ministation/security) "id" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -3020,7 +3020,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "pf" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/floor/tiled, /area/ministation/hall/w2) @@ -3069,7 +3069,7 @@ /turf/floor/plating, /area/ministation/maint/l2centraln) "px" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/glass/beaker, /turf/floor/lino, /area/ministation/cafe) @@ -3081,7 +3081,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/structure/window/reinforced{ dir = 4 }, @@ -3269,7 +3269,7 @@ /turf/floor/tiled/white, /area/ministation/detective) "qe" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/tiled, /area/ministation/hall/w2) "qf" = ( @@ -3644,7 +3644,7 @@ /turf/open, /area/ministation/hall/w2) "rA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -4864,7 +4864,7 @@ /turf/floor/plating, /area/ministation/medical) "vq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/detective, /turf/floor/carpet/red, /area/ministation/detective) @@ -5415,7 +5415,7 @@ /turf/floor/plating, /area/ministation/maint/l2centrals) "xn" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/paper_bin, /turf/floor/carpet/red, /area/ministation/security) @@ -6062,7 +6062,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/structure/window/reinforced{ dir = 8 }, @@ -6150,7 +6150,7 @@ pixel_x = -3; pixel_y = 6 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/button/blast_door{ id_tag = "Kitchen1"; name = "Kitchen Shutter"; @@ -6523,7 +6523,7 @@ /turf/floor/plating, /area/ministation/hall/w2) "Bk" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 @@ -6533,7 +6533,7 @@ /turf/floor/carpet, /area/ministation/hall/w2) "Bm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/lino, /area/ministation/cafe) "Br" = ( @@ -6708,7 +6708,7 @@ pixel_y = -24; dir = 1 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/reagent_temperature, /turf/floor/lino, /area/ministation/cafe) @@ -6873,7 +6873,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "Dj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/condiment/enzyme, /obj/item/mollusc/clam, /obj/item/mollusc/clam, @@ -7508,7 +7508,7 @@ /turf/floor/tiled, /area/ministation/hydro) "Hx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/reagent_temperature/cooler, /turf/floor/lino, /area/ministation/cafe) @@ -7639,7 +7639,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "Ia" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/machinery/faxmachine/mapped, /turf/floor/carpet/red, /area/ministation/security) @@ -7832,7 +7832,7 @@ /turf/floor/fake_grass, /area/ministation/hydro) "Jj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/camera/autoname{ dir = 8 }, @@ -7879,7 +7879,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "Jo" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigarettes, /obj/item/pen, /obj/structure/cable{ @@ -8195,7 +8195,7 @@ /turf/floor/tiled, /area/ministation/security) "Lk" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/pen/multi, /turf/floor/carpet/red, /area/ministation/security) @@ -8214,7 +8214,7 @@ /turf/floor/tiled, /area/ministation/security) "Lr" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/reagentgrinder/juicer, /obj/item/chems/glass/beaker, /turf/floor/lino, @@ -8269,7 +8269,7 @@ /turf/floor/carpet/red, /area/ministation/security) "LM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/knife/kitchen/cleaver, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -8903,7 +8903,7 @@ /turf/floor/plating, /area/ministation/medical) "Pd" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigarettes{ pixel_y = 2 }, @@ -9215,7 +9215,7 @@ /turf/floor/tiled, /area/ministation/hall/e2) "QH" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/pen, /turf/floor/carpet/red, /area/ministation/security) @@ -9755,7 +9755,7 @@ /turf/floor/tiled, /area/ministation/security) "TX" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/eftpos, /obj/item/chems/spray/cleaner, /obj/item/chems/packet/honey, @@ -9816,7 +9816,7 @@ /turf/floor/plating, /area/ministation/maint/secmaint) "Ur" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /turf/floor/carpet/red, /area/ministation/security) "Ut" = ( @@ -10132,7 +10132,7 @@ /turf/floor/plating, /area/ministation/medical) "Wa" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -10451,7 +10451,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "XW" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/ammo/beanbags, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index 12a062972d29..07e596175cf5 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -350,7 +350,7 @@ /area/ministation/bridge) "bt" = ( /obj/item/flashlight/lamp/green, -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 @@ -497,7 +497,7 @@ /turf/floor/wood/walnut, /area/ministation/bridge) "bI" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/modular_computer/tablet/lease/preset/command, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 @@ -900,7 +900,7 @@ /turf/floor/tiled, /area/ministation/bridge) "dn" = ( -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminatetable_reinforced/walnut, /obj/item/paper_bin, /obj/item/pen/retractable, /turf/floor/carpet/red, @@ -3295,7 +3295,7 @@ /turf/floor, /area/ministation/science) "ps" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminatetable/ebony, /obj/item/paper_bundle, /obj/effect/floor_decal/stoneborder{ dir = 6 @@ -4129,7 +4129,7 @@ /turf/floor/lino, /area/ministation/hall/s3) "wY" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminatetable/ebony, /obj/item/pen/fancy, /obj/item/box/fancy/crayons, /obj/effect/floor_decal/stoneborder{ @@ -5275,7 +5275,7 @@ /turf/floor/plating, /area/ministation/maint/l3central) "DD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/stack/material/panel/mapped/plastic/ten, /obj/item/stack/material/plank/mapped/wood/ten, /obj/item/stack/material/plank/mapped/wood/ten, @@ -5295,7 +5295,7 @@ /turf/floor/tiled/white, /area/ministation/science) "DQ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pill_bottle/dice, /turf/floor/carpet/green, /area/ministation/library) @@ -5335,7 +5335,7 @@ /turf/floor/plating, /area/ministation/maint/l3nw) "Ef" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet/green, /area/ministation/library) "Eg" = ( @@ -5548,7 +5548,7 @@ /turf/floor/tiled/white, /area/ministation/science) "FV" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/mollusc/clam, /obj/machinery/light/small, /turf/floor/wood/mahogany, @@ -5666,7 +5666,7 @@ /turf/floor/tiled, /area/ministation/hall/s3) "Hl" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminatetable/ebony, /obj/item/paper_bin, /obj/effect/floor_decal/stoneborder{ dir = 6 @@ -6064,7 +6064,7 @@ /turf/floor/carpet/green, /area/ministation/library) "Le" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/cans/waterbottle, /turf/floor/carpet/green, /area/ministation/library) @@ -6264,7 +6264,7 @@ dir = 8; pixel_x = 22 }, -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminatetable_reinforced/walnut, /obj/item/folder, /turf/floor/carpet/red, /area/ministation/court) @@ -6597,7 +6597,7 @@ /turf/floor/tiled, /area/ministation/hall/s3) "Ov" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /obj/machinery/light, /turf/floor/wood/yew, /area/ministation/court) @@ -6731,7 +6731,7 @@ /turf/floor/tiled, /area/ministation/hall/s3) "Pk" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /obj/item/folder/blue, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/floor/wood/yew, @@ -6763,7 +6763,7 @@ /turf/floor/tiled, /area/ministation/hall/n3) "Px" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /obj/item/folder/red, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -6843,7 +6843,7 @@ /turf/floor/tiled, /area/ministation/hall/n3) "PT" = ( -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminatetable_reinforced/walnut, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -6974,7 +6974,7 @@ /turf/floor/tiled, /area/ministation/shuttle/outgoing) "QD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/printable_red, /obj/item/pen, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -7023,7 +7023,7 @@ /obj/machinery/firealarm{ pixel_y = 24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/mahogany, /area/ministation/library) "Re" = ( @@ -7271,7 +7271,7 @@ /turf/floor/tiled, /area/ministation/tradehouse_rep) "Sf" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /obj/machinery/light{ dir = 1 }, @@ -7375,7 +7375,7 @@ /turf/floor/plating, /area/ministation/maint/l3ne) "Tk" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/mahogany, /area/ministation/library) "Tm" = ( @@ -7424,7 +7424,7 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminatetable/ebony, /obj/item/pen, /obj/item/pen/blue, /obj/item/pen/retractable, @@ -7502,7 +7502,7 @@ /turf/floor/tiled, /area/ministation/bridge) "TI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/cash, /obj/item/chems/drinks/cans/waterbottle, /turf/floor/carpet/green, @@ -7735,7 +7735,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/knife/kitchen, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -7788,7 +7788,7 @@ /turf/floor/carpet/red, /area/ministation/court) "Vw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/deck/cards, /turf/floor/carpet/green, /area/ministation/library) @@ -7865,7 +7865,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/fabricator/book, /turf/floor/wood/mahogany, /area/ministation/library) @@ -8584,7 +8584,7 @@ /turf/floor/wood/mahogany, /area/ministation/library) "ZZ" = ( -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminatetable_reinforced/walnut, /obj/item/bell, /turf/floor/carpet/red, /area/ministation/court) diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 4ff16d85d3a4..96d7b8d05c55 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -1074,7 +1074,7 @@ /area/ship/trade/disused) "hc" = ( /obj/item/radio, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /turf/floor/wood/walnut, /area/ship/trade/disused) "hf" = ( @@ -2017,7 +2017,7 @@ /turf/floor, /area/ship/trade/aft_starboard_underside_maint) "Qh" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/cell/crap/empty, /turf/floor/wood/walnut, /area/ship/trade/disused) diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index 5861bc931e5e..bba2a2d9e6cd 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -58,7 +58,7 @@ "af" = ( /obj/item/paper_bin, /obj/item/pen, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -7363,7 +7363,7 @@ /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "Rb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable{ icon_state = "0-8" }, diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm index cc042aa3f948..c67143981165 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm @@ -854,26 +854,26 @@ /turf/floor/plating, /area/lar_maria/atmos) "cD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/lar_maria/dorms) "cE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /turf/floor/wood, /area/lar_maria/dorms) "cF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/toy, /turf/floor/wood, /area/lar_maria/dorms) "cG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/glowsticks, /turf/floor/wood, /area/lar_maria/dorms) "cH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /obj/random/drinkbottle, /turf/floor/wood, @@ -1482,7 +1482,7 @@ /turf/floor/tiled, /area/lar_maria/office) "eC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/pen/blue, /turf/floor/tiled, @@ -1498,18 +1498,18 @@ /turf/floor/tiled, /area/lar_maria/office) "eF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/handcuffs, /turf/floor/wood, /area/lar_maria/dorms) "eG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /obj/random/snack, /turf/floor/wood, /area/lar_maria/dorms) "eH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/beakers, /turf/floor/wood, /area/lar_maria/dorms) @@ -1588,7 +1588,7 @@ /turf/floor/tiled, /area/lar_maria/office) "eU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/tiled, /area/lar_maria/office) "eV" = ( @@ -1812,29 +1812,29 @@ /turf/floor/tiled, /area/lar_maria/office) "fF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/cane/aluminium, /turf/floor/wood, /area/lar_maria/dorms) "fG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/head/soft/zhp_cap, /turf/floor/wood, /area/lar_maria/dorms) "fH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/random/contraband, /turf/floor/wood, /area/lar_maria/dorms) "fI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/toolbox, /obj/item/scalpel, /turf/floor/wood, /area/lar_maria/dorms) "fJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/snack, /turf/floor/wood, /area/lar_maria/dorms) diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index b04503e93339..de66dd98384c 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -68,13 +68,13 @@ /turf/floor/wood, /area/icarus/vessel) "au" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flame/fuelled/lighter/zippo/random, /obj/random/smokes, /turf/floor/wood, /area/icarus/vessel) "av" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/icarus/vessel) "aw" = ( @@ -90,7 +90,7 @@ /turf/floor/wood, /area/icarus/vessel) "az" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /turf/floor/wood, /area/icarus/vessel) @@ -105,17 +105,17 @@ /turf/floor/wood, /area/icarus/vessel) "aD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/lunchbox/mars, /turf/floor/wood, /area/icarus/vessel) "aE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/photo_album, /turf/floor/wood, /area/icarus/vessel) "aF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/random/drinkbottle, /obj/random/snack, @@ -153,7 +153,7 @@ /turf/floor/wood, /area/icarus/vessel) "aL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigar, /turf/floor/wood, /area/icarus/vessel) diff --git a/mods/content/government/away_sites/icarus/icarus-2.dmm b/mods/content/government/away_sites/icarus/icarus-2.dmm index e32afe37e27f..b17f4dd06a20 100644 --- a/mods/content/government/away_sites/icarus/icarus-2.dmm +++ b/mods/content/government/away_sites/icarus/icarus-2.dmm @@ -484,12 +484,12 @@ /turf/floor/tiled, /area/icarus/vessel) "bI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/tiled, /area/icarus/vessel) "bJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/tiled, /area/icarus/vessel) "bK" = ( @@ -647,7 +647,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cl" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/backpack/captain, /obj/machinery/alarm{ alarm_id = "xenobio3_alarm"; @@ -657,7 +657,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper/icarus/crew_roster, /obj/item/folder/blue, /turf/floor/tiled, @@ -751,7 +751,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/bottle/whiskey, /turf/floor/tiled, /area/icarus/vessel) @@ -768,12 +768,12 @@ /turf/floor/tiled, /area/icarus/vessel) "cD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/toy/ship_model, /turf/floor/tiled, /area/icarus/vessel) "cE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/action_figure, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -903,7 +903,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cW" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/disk/secret_project/science, /turf/floor/tiled, /area/icarus/vessel) @@ -1075,7 +1075,7 @@ /turf/floor/tiled, /area/icarus/vessel) "du" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp, /turf/floor/tiled, /area/icarus/vessel) diff --git a/mods/gamemodes/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm index cd92f5dc9096..812287b73ee6 100644 --- a/mods/gamemodes/heist/heist_base.dmm +++ b/mods/gamemodes/heist/heist_base.dmm @@ -371,7 +371,7 @@ /turf/unsimulated/floor/freezer, /area/map_template/syndicate_mothership/raider_base) "bo" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/carpet{ dir = 8 }, @@ -380,7 +380,7 @@ /turf/unsimulated/floor/carpet, /area/map_template/syndicate_mothership/raider_base) "bp" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/action_figure, /obj/random/contraband, /obj/random/junk, @@ -511,7 +511,7 @@ /turf/unsimulated/floor/wood/broken, /area/map_template/syndicate_mothership/raider_base) "bL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate/tray{ pixel_y = 5 }, @@ -519,12 +519,12 @@ /turf/unsimulated/floor/wood, /area/map_template/syndicate_mothership/raider_base) "bM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/glasses/rocks, /turf/unsimulated/floor/wood, /area/map_template/syndicate_mothership/raider_base) "bN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/chemical_dispenser/bar_soft/full, /turf/unsimulated/floor/wood/broken6, /area/map_template/syndicate_mothership/raider_base) @@ -592,18 +592,18 @@ /turf/unsimulated/floor/dark, /area/map_template/syndicate_mothership/raider_base) "ca" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pizzabox/meat, /turf/unsimulated/floor/wood, /area/map_template/syndicate_mothership/raider_base) "cb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/item/trash/cigbutt/cigarbutt, /turf/unsimulated/floor/wood, /area/map_template/syndicate_mothership/raider_base) "cc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/glass/rag, /obj/random/loot, /turf/unsimulated/floor/wood, From 7242145b9b530e39fb8f3ff612a76f6cbefaf426 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 24 Nov 2024 13:52:17 +1100 Subject: [PATCH 31/42] Adding wood laminate flooring for space maps. --- .../objects/items/stacks/tiles/tile_types.dm | 147 ++++-- code/game/turfs/flooring/flooring_wood.dm | 50 ++ code/game/turfs/floors/subtypes/floor_wood.dm | 54 ++ code/game/turfs/unsimulated/floor.dm | 17 + .../crafting/stack_recipes/recipes_stacks.dm | 23 + .../designs/general/designs_general.dm | 9 + .../solids/materials_solid_wood.dm | 7 + .../materials/material_sheets_mapping.dm | 1 + .../reagents/reactions/reaction_synthesis.dm | 8 + icons/turf/flooring/laminate.dmi | Bin 0 -> 2093 bytes maps/antag_spawn/wizard/wizard_base.dmm | 50 +- maps/away/bearcat/bearcat-2.dmm | 20 +- maps/away/casino/casino.dmm | 98 ++-- maps/away/errant_pisces/errant_pisces.dmm | 80 +-- maps/away/liberia/liberia.dmm | 128 ++--- maps/away/mining/mining-signal.dmm | 26 +- maps/away/unishi/unishi-3.dmm | 72 +-- maps/away/yacht/yacht.dmm | 134 ++--- maps/exodus/exodus-1.dmm | 6 +- maps/exodus/exodus-2.dmm | 490 +++++++++--------- maps/exodus/exodus-admin.dmm | 40 +- maps/ministation/ministation-0.dmm | 222 ++++---- maps/ministation/ministation-1.dmm | 14 +- maps/ministation/ministation-2.dmm | 168 +++--- .../exoplanet_ruins/playablecolony/colony.dmm | 102 ++-- maps/tradeship/tradeship-0.dmm | 20 +- maps/tradeship/tradeship-2.dmm | 44 +- .../away_sites/lar_maria/lar_maria-2.dmm | 122 ++--- .../government/away_sites/icarus/icarus-1.dmm | 48 +- mods/gamemodes/heist/heist_base.dmm | 28 +- 30 files changed, 1223 insertions(+), 1005 deletions(-) create mode 100644 icons/turf/flooring/laminate.dmi diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index a53c61d5bad1..6fed8b04b2b0 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -70,70 +70,119 @@ * Wood */ /obj/item/stack/tile/wood - name = "wood floor tile" - singular_name = "wood floor tile" - desc = "An easy to fit wooden floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_GENERIC - material = /decl/material/solid/organic/wood + name = "wood floor tile" + singular_name = "wood floor tile" + desc = "An easy-to-fit wooden floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood::color + material = /decl/material/solid/organic/wood /obj/item/stack/tile/wood/cyborg - name = "wood floor tile synthesizer" - desc = "A device that makes wood floor tiles." - uses_charge = 1 - charge_costs = list(250) - stack_merge_type = /obj/item/stack/tile/wood - build_type = /obj/item/stack/tile/wood - max_health = ITEM_HEALTH_NO_DAMAGE + name = "wood floor tile synthesizer" + desc = "A device that makes wood floor tiles." + uses_charge = 1 + charge_costs = list(250) + stack_merge_type = /obj/item/stack/tile/pine_laminate + build_type = /obj/item/stack/tile/pine_laminate + material = /decl/material/solid/organic/wood/chipboard + max_health = ITEM_HEALTH_NO_DAMAGE is_spawnable_type = FALSE /obj/item/stack/tile/mahogany - name = "mahogany floor tile" - singular_name = "mahogany floor tile" - desc = "An easy to fit mahogany wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_RICH - material = /decl/material/solid/organic/wood + name = "mahogany floor tile" + singular_name = "mahogany floor tile" + desc = "An easy-to-fit mahogany wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/mahogany::color + material = /decl/material/solid/organic/wood/mahogany /obj/item/stack/tile/maple - name = "maple floor tile" - singular_name = "maple floor tile" - desc = "An easy to fit maple wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_PALE - material = /decl/material/solid/organic/wood + name = "maple floor tile" + singular_name = "maple floor tile" + desc = "An easy-to-fit maple wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/maple::color + material = /decl/material/solid/organic/wood/maple /obj/item/stack/tile/ebony - name = "ebony floor tile" - singular_name = "ebony floor tile" - desc = "An easy to fit ebony floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_BLACK - material = /decl/material/solid/organic/wood + name = "ebony floor tile" + singular_name = "ebony floor tile" + desc = "An easy-to-fit ebony floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/ebony::color + material = /decl/material/solid/organic/wood/ebony /obj/item/stack/tile/walnut - name = "walnut floor tile" - singular_name = "walnut floor tile" - desc = "An easy to fit walnut wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_CHOCOLATE - material = /decl/material/solid/organic/wood + name = "walnut floor tile" + singular_name = "walnut floor tile" + desc = "An easy-to-fit walnut wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/walnut::color + material = /decl/material/solid/organic/wood/walnut /obj/item/stack/tile/bamboo - name = "bamboo floor tile" - singular_name = "bamboo floor tile" - desc = "An easy to fit bamboo wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_PALE2 - material = /decl/material/solid/organic/wood + name = "bamboo floor tile" + singular_name = "bamboo floor tile" + desc = "An easy-to-fit bamboo wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/bamboo::color + material = /decl/material/solid/organic/wood/bamboo /obj/item/stack/tile/yew - name = "yew floor tile" - singular_name = "yew floor tile" - desc = "An easy to fit yew wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_YELLOW - material = /decl/material/solid/organic/wood + name = "yew floor tile" + singular_name = "yew floor tile" + desc = "An easy-to-fit yew wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/yew::color + material = /decl/material/solid/organic/wood/yew + +/obj/item/stack/tile/pine_laminate + name = "pine laminate floor tile" + singular_name = "pine laminate floor tile" + desc = "An easy-to-fit pine laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard::color + material = /decl/material/solid/organic/wood/chipboard + +/obj/item/stack/tile/mahogany_laminate + name = "mahogany laminate floor tile" + singular_name = "mahogany laminate floor tile" + desc = "An easy-to-fit mahogany laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/mahogany::color + material = /decl/material/solid/organic/wood/chipboard/mahogany + +/obj/item/stack/tile/maple_laminate + name = "maple laminate floor tile" + singular_name = "maple laminate floor tile" + desc = "An easy-to-fit maple laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/maple::color + material = /decl/material/solid/organic/wood/chipboard/maple + +/obj/item/stack/tile/ebony_laminate + name = "ebony laminate floor tile" + singular_name = "ebony laminate floor tile" + desc = "An easy-to-fit ebony laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/ebony::color + material = /decl/material/solid/organic/wood/chipboard/ebony + +/obj/item/stack/tile/walnut_laminate + name = "walnut laminate floor tile" + singular_name = "walnut laminate floor tile" + desc = "An easy-to-fit walnut laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/walnut::color + material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/item/stack/tile/yew_laminate + name = "yew laminate floor tile" + singular_name = "yew laminate floor tile" + desc = "An easy-to-fit yew laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/yew::color + material = /decl/material/solid/organic/wood/chipboard/yew /obj/item/stack/tile/floor name = "steel floor tile" diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index a9c136bfcb57..fa503f0f5a84 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -52,3 +52,53 @@ color = /decl/material/solid/organic/wood/yew::color build_type = /obj/item/stack/tile/yew force_material = /decl/material/solid/organic/wood/yew + +// Chipboard/wood laminate floors. Uses older icons. +/decl/flooring/laminate + name = "wooden laminate floor" + desc = "A stretch of closely-fitted sections of chipboard with a laminated veneer." + icon = 'icons/turf/flooring/laminate.dmi' + icon_base = "wood" + damage_temperature = T0C+200 + descriptor = "sections" + build_type = /obj/item/stack/tile/pine_laminate + flooring_flags = TURF_IS_FRAGILE | TURF_REMOVE_SCREWDRIVER + footstep_type = /decl/footsteps/wood + color = /decl/material/solid/organic/wood/chipboard::color + force_material = /decl/material/solid/organic/wood/chipboard + constructed = TRUE + gender = NEUTER + broken_states = list( + "broken0", + "broken1", + "broken2", + "broken3", + "broken4", + "broken5", + "broken6" + ) + +/decl/flooring/laminate/mahogany + color = /decl/material/solid/organic/wood/chipboard/mahogany::color + build_type = /obj/item/stack/tile/mahogany_laminate + force_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/decl/flooring/laminate/maple + color = /decl/material/solid/organic/wood/chipboard/maple::color + build_type = /obj/item/stack/tile/maple_laminate + force_material = /decl/material/solid/organic/wood/chipboard/maple + +/decl/flooring/laminate/ebony + color = /decl/material/solid/organic/wood/chipboard/ebony::color + build_type = /obj/item/stack/tile/ebony_laminate + force_material = /decl/material/solid/organic/wood/chipboard/ebony + +/decl/flooring/laminate/walnut + color = /decl/material/solid/organic/wood/chipboard/walnut::color + build_type = /obj/item/stack/tile/walnut_laminate + force_material = /decl/material/solid/organic/wood/chipboard/yew + +/decl/flooring/laminate/yew + color = /decl/material/solid/organic/wood/chipboard/yew::color + build_type = /obj/item/stack/tile/yew_laminate + force_material = /decl/material/solid/organic/wood/chipboard/yew diff --git a/code/game/turfs/floors/subtypes/floor_wood.dm b/code/game/turfs/floors/subtypes/floor_wood.dm index 9ab163825a6f..4b1069772dbd 100644 --- a/code/game/turfs/floors/subtypes/floor_wood.dm +++ b/code/game/turfs/floors/subtypes/floor_wood.dm @@ -54,3 +54,57 @@ /turf/floor/wood/yew color = /decl/material/solid/organic/wood/yew::color _flooring = /decl/flooring/wood/yew + +// Laminate floor; basically identical to wood, but uses older smoother icons. +/turf/floor/laminate + name = "wooden laminate floor" + icon = 'icons/turf/flooring/laminate.dmi' + icon_state = "wood0" + color = /decl/material/solid/organic/wood/chipboard::color + _flooring = /decl/flooring/laminate + +/turf/floor/laminate/broken + icon_state = "wood_broken0" + _floor_broken = TRUE + +/turf/floor/laminate/broken/Initialize() + . = ..() + var/setting_broken = _floor_broken + _floor_broken = null + set_floor_broken(setting_broken) + +/turf/floor/laminate/broken/one + icon_state = "wood_broken1" + _floor_broken = "broken1" + +/turf/floor/laminate/broken/two + icon_state = "wood_broken2" + _floor_broken = "broken2" + +/turf/floor/laminate/broken/three + icon_state = "wood_broken3" + _floor_broken = "broken3" + +/turf/floor/laminate/broken/four + icon_state = "wood_broken4" + _floor_broken = "broken4" + +/turf/floor/laminate/mahogany + color = /decl/material/solid/organic/wood/chipboard/mahogany::color + _flooring = /decl/flooring/laminate/mahogany + +/turf/floor/laminate/maple + color = /decl/material/solid/organic/wood/chipboard/maple::color + _flooring = /decl/flooring/laminate/maple + +/turf/floor/laminate/ebony + color = /decl/material/solid/organic/wood/chipboard/ebony::color + _flooring = /decl/flooring/laminate/ebony + +/turf/floor/laminate/walnut + color = /decl/material/solid/organic/wood/chipboard/walnut::color + _flooring = /decl/flooring/laminate/walnut + +/turf/floor/laminate/yew + color = /decl/material/solid/organic/wood/chipboard/yew::color + _flooring = /decl/flooring/laminate/yew diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index 449745e5e122..3ec6296308df 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -52,6 +52,23 @@ /turf/unsimulated/floor/wood/broken6 icon_state = "wood_broken6" +/turf/unsimulated/floor/wood + name = "wooden laminate floor" + icon = 'icons/turf/flooring/laminate.dmi' + icon_state = "wood0" + +/turf/unsimulated/floor/wood/broken + icon_state = "wood_broken0" + +/turf/unsimulated/floor/wood/broken1 + icon_state = "wood_broken1" + +/turf/unsimulated/floor/wood/broken2 + icon_state = "wood_broken2" + +/turf/unsimulated/floor/wood/broken6 + icon_state = "wood_broken6" + /turf/unsimulated/floor/vault icon_state = "vault" diff --git a/code/modules/crafting/stack_recipes/recipes_stacks.dm b/code/modules/crafting/stack_recipes/recipes_stacks.dm index 0e97225f58de..2a929e693f93 100644 --- a/code/modules/crafting/stack_recipes/recipes_stacks.dm +++ b/code/modules/crafting/stack_recipes/recipes_stacks.dm @@ -26,6 +26,29 @@ result_type = /obj/item/stack/tile/walnut required_material = /decl/material/solid/organic/wood/walnut +/decl/stack_recipe/tile/wood/pine_laminate + result_type = /obj/item/stack/tile/pine_laminate + required_material = /decl/material/solid/organic/wood/chipboard + +/decl/stack_recipe/tile/wood/mahogany_laminate + result_type = /obj/item/stack/tile/mahogany_laminate + required_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/decl/stack_recipe/tile/wood/maple_laminate + result_type = /obj/item/stack/tile/maple_laminate + required_material = /decl/material/solid/organic/wood/chipboard/maple + +/decl/stack_recipe/tile/wood/ebony_laminate + result_type = /obj/item/stack/tile/ebony_laminate + required_material = /decl/material/solid/organic/wood/chipboard/ebony + +/decl/stack_recipe/tile/wood/walnut_laminate + result_type = /obj/item/stack/tile/walnut + required_material = /decl/material/solid/organic/wood/chipboard/walnut + +/decl/stack_recipe/tile/wood/yew_laminate + result_type = /obj/item/stack/tile/yew_laminate + required_material = /decl/material/solid/organic/wood/chipboard/yew /decl/stack_recipe/tile/steel abstract_type = /decl/stack_recipe/tile/steel diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index ae37f50f4d94..e390a749c29b 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -246,3 +246,12 @@ /decl/material/solid/organic/wood/walnut = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) ) + +/datum/fabricator_recipe/chipboard/yew + path = /obj/item/stack/material/sheet/mapped/chipboard_yew + +/datum/fabricator_recipe/chipboard/yew/get_resources() + resources = list( + /decl/material/solid/organic/wood/yew = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) diff --git a/code/modules/materials/definitions/solids/materials_solid_wood.dm b/code/modules/materials/definitions/solids/materials_solid_wood.dm index fd8f36268599..0285a6f6facf 100644 --- a/code/modules/materials/definitions/solids/materials_solid_wood.dm +++ b/code/modules/materials/definitions/solids/materials_solid_wood.dm @@ -176,3 +176,10 @@ adjective_name = "walnut laminate" uid = "solid_wood_chipboard_walnut" color = WOOD_COLOR_CHOCOLATE + +/decl/material/solid/organic/wood/chipboard/yew + name = "yew chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of yew wood chips and resin, with a plastic laminate." + adjective_name = "yew laminate" + uid = "solid_wood_chipboard_yew" + color = WOOD_COLOR_YELLOW \ No newline at end of file diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index 33dfdcb211c3..1c2d2147e084 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -122,5 +122,6 @@ STACK_SUBTYPES(chipboard_maple, "maple chipboard", solid/organic/wood/chip STACK_SUBTYPES(chipboard_mahogany, "mahogany chipboard", solid/organic/wood/chipboard/mahogany, sheet, null) STACK_SUBTYPES(chipboard_ebony, "ebony chipboard", solid/organic/wood/chipboard/ebony, sheet, null) STACK_SUBTYPES(chipboard_walnut, "walnut chipboard", solid/organic/wood/chipboard/walnut, sheet, null) +STACK_SUBTYPES(chipboard_yew, "yew chipboard", solid/organic/wood/chipboard/yew, sheet, null) #undef STACK_SUBTYPES \ No newline at end of file diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index f30d0c4b049e..8a3ee19771d7 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -200,3 +200,11 @@ /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) ) chipboard_type = /decl/material/solid/organic/wood/chipboard/walnut + +/decl/chemical_reaction/synthesis/chipboard/yew + name = "Yew Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/yew = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/yew diff --git a/icons/turf/flooring/laminate.dmi b/icons/turf/flooring/laminate.dmi new file mode 100644 index 0000000000000000000000000000000000000000..83d4933c155fe0b5b6ff17fe9b578128bc0a0356 GIT binary patch literal 2093 zcmV+|2-5e7P)C0000~P)t-sz`($J zdwYh4hKPuWVq#*iudk}As;#Z9TU%S7pPz(;gs`x%qobp;va+YAr!X)uBqJkXXL75n ztC^XZo12@Rot=k=hn$?8+1c6f@bG_sf3vf*R9L4#00001bW%=J06^y0W&i*Hta?;f zbVOxyV{&P5bZKvH004NLjncge!Y~lP@i}>l(C*SN-CU$aI@ni`YEBc12_(V3zQKar zB6r)}@tgi!sZPUroK$}q9m=?<)TS8g1H=|Tw8nGmL1AxsBD zn68HK-*lxKrvCfSANIr23O@Xj{{R36&q+if$bm6OFmpLjQwl)h?vq{(aJ4&B8iSv_!NDDT{B(r4&GrKd z3>5(YWm`K`6|HO+#)pt*jnl9rnC*xRJyZgqf>;2Gki-V_6xH(lSO6M;FN~|BGXw;yk|rWJUnV5d^KeNRU&%3JzLD zu3CEcXRQtaDA)mAG1&SSv;CQI0oM-z0744DnZ>fNF9%PIK1UMqoI8*%7&+U!MY$u0 z6cEVO8^}9FR~-SsOb{ZH)4xp%44{{Az&b$4Kq{ApQD%lD9QOj34RXQ?v~Smx0==)@ zkv=Ev@A|(O6E47n)c|}jf@?+DuoN+X`u5`(oKTo=0iY6LD?kjWUg-y}sB!0yD+?n;)c0?b6nyp=a5nSbOH4rPa{!fWQSFrn zK<-!ynN0%BxEvSd0|7z+AY}V6{~$TEFj@@D=!#yE517@vR&;hX14Fdk!v#a533<7X zCj`;$(AOQ*fJe*>DIQ(dwcXcOCxltM{p!qBwC&$*E13y^2z^)Z%Law`eu!YuC#OR^ zMEBJ_%)<=x#KP$wt+k7}wz6mVek0}RuSp3fn`oBDN#LRmm>2G{K4yh@*#p4Xz^qwoIj5W9iAq&lr2UuGc2j zBZnof^M!H26JGP1%)avp5ifY-wB+mLEIr&F0Nce$(c1$6g!)_NhCB=}i32Q=SeEjH zR3xw9DW7)`7I|6C5iH;^*?+;x?>_Ws0Dm!rod5&~J1kwQ5v?6X0EJ&0uAUbGl==tO z%8LL>{R3;|-+}|wKfw9}V!Mv?7nI}^On`Rl_XnhQ9_lYB$tM6HJNEknm|Y8Yp4xx# zHXMj^t(hAe)Rf4h`onntLF8~t{R4eDhKxiW)gMOt4`L0}h5ms^4qr2oNA-tU{Rc1S zfY$`+VVRew{(wY|uY0x(^dB_1I3}r?-D~YxYdz@oLw`Ub2QIj|u~n}BK$-PfW*7Fd zGd|tD&i50*`iZx2a`-6Ckqqz40XLlO*e^m(S|=MF_BqKK-52gzV1Zf))1l8Uof-(VAupT^$+y>1CHld9`_fN z2rFvVy03b2jdwmvZBeBWE&x{xjF15?iTQGdX;^?`Tb zz^d~-lN$}e%&2NceZbje>G__?UCysnh9`sdfwkxRAn)}DOs@~T1qY5U5wdY??Zz(5 z=|~vr18{!l$)M6B=l{A;ADAGw_Tlw`8qV(wfgU~o#{`%yk5h&HIk2s<`)PGrEMmo^ z2Isl+|B8A4V4?HxH|d0(HwykffrOFqmd>O8fZY4B{@~~Pb71q0K68F3o!_4=KX6;- z&hO8bzX=DzE{6U9JFx}Nq{`@Jch0Q`B=v{e+i+mo`M*)h$tdf~*9V3^Kk)YnsGlk4e>{!hFa#Q^ z4-9^O;O`UMOXc%F*>6x@`g~r#KL;*%-XAdke80LrVAT*H%s=0+l@kXXg!$+Dweo)f X&(}Q(BtDS500000NkvXXu0mjfY
    {{:helper.link(data.disk_name, null, {'eject_disk' : 1})}}
    DataStored
    {{:value.field}}{{:value.level}}
    DataStored
    {{:value.field}}{{:value.level}}
    {{:data.disk_name}}
    " show_browser(linked, jointext(html,null), "window=herald") -/datum/phenomena/create_gateway +/datum/phenomenon/create_gateway name = "Create Gateway" desc = "Creates a gateway from this world to the next. Gateways syphon absurd amounts of power but can be sacrificed to summon powerful minions." cost = 200 flags = PHENOMENA_NEAR_STRUCTURE expected_type = /atom -/datum/phenomena/create_gateway/can_activate(var/atom/a) +/datum/phenomenon/create_gateway/can_activate(var/atom/a) if(!..()) return 0 if(istype(a, /obj/structure/deity/gateway)) @@ -115,20 +115,20 @@ return 0 return 1 -/datum/phenomena/create_gateway/activate(var/atom/a) +/datum/phenomenon/create_gateway/activate(var/atom/a) ..() if(istype(a, /obj/structure/deity/gateway)) qdel(a) else new /obj/structure/deity/gateway(get_turf(a), linked) -/datum/phenomena/flickering_whisper +/datum/phenomenon/flickering_whisper name = "Flickering Whisper" desc = "Whisper to a non-believer, allowing you to intrude on their thoughts and see what they see." flags = PHENOMENA_NONFOLLOWER expected_type = /mob/living -/datum/phenomena/flickering_whisper/activate(var/mob/living/L) +/datum/phenomenon/flickering_whisper/activate(var/mob/living/L) var/atom/whisper_from for(var/obj/structure/deity/radiant_statue/rs in view(3, L)) whisper_from = rs @@ -142,12 +142,12 @@ events_repository.register(/decl/observ/destroyed, L, src, PROC_REF(deactivate_look)) addtimer(CALLBACK(src, PROC_REF(deactivate_look), L), 30 SECONDS) -/datum/phenomena/flickering_whisper/proc/deactivate_look(var/mob/viewer) +/datum/phenomenon/flickering_whisper/proc/deactivate_look(var/mob/viewer) if(!linked.is_follower(viewer)) //Don't remove if they are follower linked.eyenet.remove_source(viewer) events_repository.unregister(/decl/observ/destroyed, viewer, src) -/datum/phenomena/burning_glare +/datum/phenomenon/burning_glare name = "Burning Glare" desc = "Burn a victim. If they are burnt enough, you'll set them ablaze." cost = 100 @@ -155,7 +155,7 @@ cooldown = 30 SECONDS expected_type = /mob/living -/datum/phenomena/burning_glare/activate(var/mob/living/L) +/datum/phenomenon/burning_glare/activate(var/mob/living/L) ..() to_chat(L, SPAN_DANGER("You feel yourself burn!")) L.take_damage(10, BURN) @@ -163,7 +163,7 @@ L.fire_stacks += 50 L.IgniteMob() -/datum/phenomena/divine_right +/datum/phenomenon/divine_right name = "Divine Right" desc = "Trigger your rebirth into the body of someone wearing a herald's uniform. This takes time, requires 3 open gateways, and if the body is destroyed during the ritual... so are you. But once complete, you become an unstoppable demigod of unnatural power." cost = 300 @@ -171,7 +171,7 @@ flags = PHENOMENA_FOLLOWER|PHENOMENA_NEAR_STRUCTURE expected_type = /mob/living -/datum/phenomena/divine_right/can_activate(var/mob/living/L) +/datum/phenomenon/divine_right/can_activate(var/mob/living/L) if(!..()) return FALSE var/active_gateways = 0 @@ -190,7 +190,7 @@ to_chat(linked, SPAN_WARNING("\The [L] is not wearing a herald's uniform.")) return FALSE -/datum/phenomena/divine_right/activate(var/mob/living/L) +/datum/phenomenon/divine_right/activate(var/mob/living/L) ..() to_chat(L, SPAN_OCCULT("Your soul is ripped from your body as your master prepares to possess it.")) to_chat(linked, SPAN_OCCULT("You prepare the body for possession. Keep it safe. If it is totally destroyed, you will die.")) @@ -209,10 +209,10 @@ else to_chat(player, SPAN_NOTICE("Your Master is being reborn into the body of \the [L]. Protect it at all costs.")) -/datum/phenomena/divine_right/proc/fail_ritual(var/mob/living/L) +/datum/phenomenon/divine_right/proc/fail_ritual(var/mob/living/L) qdel(linked) -/datum/phenomena/divine_right/proc/succeed_ritual(var/mob/living/L) +/datum/phenomenon/divine_right/proc/succeed_ritual(var/mob/living/L) to_chat(linked, SPAN_OCCULT("You have been reborn! Your power is limited here, focused on your body, but in return you are both eternal and physical.")) for(var/mob/living/player in global.player_list) sound_to(player, 'sound/effects/cascade.ogg') @@ -221,12 +221,12 @@ L.SetName("[linked] Incarnate") L.real_name = "[linked] Incarnate" -/datum/phenomena/movable_object/wisp +/datum/phenomenon/movable_object/wisp name = "Wisp" desc = "Creates or moves a small ball of light for your followers to use." cost = 30 object_type = /obj/item/flashlight/slime -/datum/phenomena/movable_object/wisp/add_object() +/datum/phenomenon/movable_object/wisp/add_object() ..() object_to_move.SetName("wisp") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm index e86c92ec4d4e..381e885d3187 100644 --- a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm +++ b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm @@ -1,4 +1,4 @@ -/datum/phenomena/warp +/datum/phenomenon/warp name = "Warp Body" desc = "Corrupt a mortal being, causing their DNA to break and their body to fail on them." cost = 90 @@ -6,20 +6,20 @@ flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER expected_type = /mob/living -/datum/phenomena/warp/activate(var/mob/living/L) +/datum/phenomenon/warp/activate(var/mob/living/L) ..() L.take_damage(20, CLONE) SET_STATUS_MAX(L, STAT_WEAK, 2) to_chat(L, SPAN_DANGER("You feel your body warp and change underneath you!")) -/datum/phenomena/rock_form +/datum/phenomenon/rock_form name = "Rock Form" desc = "Convert your mortal followers into immortal stone beings." cost = 300 flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_FOLLOWER expected_type = /mob/living/human -/datum/phenomena/rock_form/activate(var/mob/living/human/H) +/datum/phenomenon/rock_form/activate(var/mob/living/human/H) ..() to_chat(H, SPAN_DANGER("You feel your body harden as it rapidly is transformed into living crystal!")) H.change_species(SPECIES_GOLEM) diff --git a/mods/gamemodes/deity/screen/intent.dm b/mods/gamemodes/deity/screen/intent.dm index 80b3a423170e..9f5b18b6aaa8 100644 --- a/mods/gamemodes/deity/screen/intent.dm +++ b/mods/gamemodes/deity/screen/intent.dm @@ -9,24 +9,25 @@ compile_overlays() /obj/screen/intent/deity/proc/sync_to_mob(var/mob) - var/mob/living/deity/D = mob - for(var/i in 1 to D.control_types.len) - var/obj/screen/deity_marker/S = new(null, D) - desc_screens[D.control_types[i]] = S + var/mob/living/deity/deity = mob + for(var/i in 1 to deity.control_types.len) + var/obj/screen/deity_marker/S = new(null, deity) + desc_screens[deity.control_types[i]] = S S.screen_loc = screen_loc //This sets it up right. Trust me. S.maptext_y = 33/2*i - i*i/2 - 10 - D.client.screen += S - + deity.client.screen += S update_text() /obj/screen/intent/deity/proc/update_text() - if(!isdeity(usr)) + var/mob/living/deity/deity = usr + var/mob/owner = owner_ref?.resolve() + if(!istype(deity) || !istype(owner) || owner != deity) return - var/mob/living/deity/D = usr - for(var/i in D.control_types) + var/decl/intent/intent = owner.get_intent() + for(var/i in deity.control_types) var/obj/screen/deity_marker/S = desc_screens[i] - var/datum/phenomena/P = D.intent_phenomenas[intent][i] + var/datum/phenomenon/P = deity.intent_phenomena[intent][i] if(P) S.maptext = "[P.name]" else diff --git a/nano/templates/deity.tmpl b/nano/templates/deity.tmpl index b249a8649600..5d1148e300e2 100644 --- a/nano/templates/deity.tmpl +++ b/nano/templates/deity.tmpl @@ -7,7 +7,7 @@ Deity Menu. Three seperate modes within it, followers, shop, and phenomena. {{:data.name}} the {{:data.form_name}}
    - Current Boon: + Current Boon: {{if data.boon_name}} {{:data.boon_name}} {{else}} @@ -78,13 +78,13 @@ Deity Menu. Three seperate modes within it, followers, shop, and phenomena. {{:helper.link('Bindings', 'key', {'switchMenu' : 1, 'menu' : 'phenomenaMenu'}, data.phenomenaMenu == 1 ? 'disabled' : null)}}
    {{if data.phenomenaMenu == 0}} - {{for data.phenomenas}} + {{for data.phenomena}}
    {{:helper.link(value.name, null, {'select_phenomena' : value.name})}}
    - Use Cost: {{:value.cost}} + Use Cost: {{:value.cost}} {{if value.cooldown}} Cooldown: {{:value.cooldown}} {{/if}} From 46606cf24c56275283f751ec53f9b8d9193abda2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 28 Nov 2024 13:39:00 +1100 Subject: [PATCH 39/42] Intent selector is now dynamically generated. --- code/__defines/hud.dm | 1 - code/_helpers/cmp.dm | 3 + code/_onclick/hud/animal.dm | 2 +- code/_onclick/hud/human.dm | 2 +- code/_onclick/hud/robot.dm | 2 +- code/_onclick/hud/screen/screen_intent.dm | 97 ++++++++++-------- code/datums/repositories/decls.dm | 2 + code/modules/client/ui_styles/_helpers.dm | 1 - code/modules/client/ui_styles/_ui_style.dm | 1 - .../client/ui_styles/_ui_style_states.dm | 9 -- .../client/ui_styles/ui_style_subtypes.dm | 1 - code/modules/mob/mob_intent.dm | 56 +++++++--- icons/mob/screen/styles/intents.dmi | Bin 1512 -> 286 bytes icons/mob/screen/styles/intents_wide.dmi | Bin 0 -> 259 bytes .../mob/screen/styles/minimalist/intents.dmi | Bin 2760 -> 0 bytes icons/screen/intents.dmi | Bin 0 -> 1087 bytes icons/screen/intents_wide.dmi | Bin 0 -> 658 bytes mods/content/xenobiology/slime/slime_hud.dm | 2 +- mods/gamemodes/deity/mobs/deity_hud.dm | 2 +- mods/mobs/borers/mob/borer/borer_hud.dm | 2 +- mods/mobs/dionaea/icons/ui_intent_overlay.dmi | Bin 0 -> 565 bytes mods/mobs/dionaea/icons/ui_intents.dmi | Bin 701 -> 422 bytes mods/mobs/dionaea/mob/_nymph.dm | 10 ++ mods/mobs/dionaea/mob/nymph_ui.dm | 12 ++- .../ascent/icons/ui_intent_overlay.dmi | Bin 0 -> 569 bytes mods/species/ascent/icons/ui_intents.dmi | Bin 695 -> 422 bytes mods/species/ascent/mobs/nymph/_nymph.dm | 10 ++ mods/species/ascent/mobs/nymph/nymph_ui.dm | 18 ++-- 28 files changed, 151 insertions(+), 82 deletions(-) create mode 100644 icons/mob/screen/styles/intents_wide.dmi delete mode 100644 icons/mob/screen/styles/minimalist/intents.dmi create mode 100644 icons/screen/intents.dmi create mode 100644 icons/screen/intents_wide.dmi create mode 100644 mods/mobs/dionaea/icons/ui_intent_overlay.dmi create mode 100644 mods/species/ascent/icons/ui_intent_overlay.dmi diff --git a/code/__defines/hud.dm b/code/__defines/hud.dm index 24e3be0d394a..7cb67e0fd28a 100644 --- a/code/__defines/hud.dm +++ b/code/__defines/hud.dm @@ -11,7 +11,6 @@ #define UI_ICON_NUTRITION "icon_nutrition" #define UI_ICON_HYDRATION "icon_hydration" #define UI_ICON_FIRE_INTENT "icon_fire_intent" -#define UI_ICON_INTENT "icon_intent" #define UI_ICON_UP_HINT "icon_uphint" #define UI_ICON_STATUS "icon_status" #define UI_ICON_STATUS_FIRE "icon_status_fire" diff --git a/code/_helpers/cmp.dm b/code/_helpers/cmp.dm index 32637fecad8d..3a04928449ee 100644 --- a/code/_helpers/cmp.dm +++ b/code/_helpers/cmp.dm @@ -137,6 +137,9 @@ /proc/cmp_decl_uid_asc(decl/a, decl/b) return sorttext(b.uid, a.uid) +/proc/cmp_decl_sort_value_asc(decl/a, decl/b) + return a.sort_order - b.sort_order + /proc/cmp_inventory_slot_desc(datum/inventory_slot/a, datum/inventory_slot/b) return b.quick_equip_priority - a.quick_equip_priority diff --git a/code/_onclick/hud/animal.dm b/code/_onclick/hud/animal.dm index 5c1d9173a3a6..70b61dffe77b 100644 --- a/code/_onclick/hud/animal.dm +++ b/code/_onclick/hud/animal.dm @@ -11,6 +11,6 @@ move_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_MOVEMENT) move_intent.icon_state = mymob.move_intent.hud_icon_state adding += move_intent - action_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) + action_intent = new(null, mymob, ui_style, ui_color, ui_alpha) adding += action_intent ..() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 96f20aa1c3a0..44722373ecbd 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -17,7 +17,7 @@ // Draw the attack intent dialogue. if(hud_data.show_intent_selector) - action_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) + action_intent = new(null, mymob) src.adding += action_intent hud_elements |= action_intent diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 41ad1300f871..6408ee430382 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -51,7 +51,7 @@ var/global/obj/screen/robot_inventory adding += R.ui_drop_grab //Intent - action_intent = new /obj/screen/intent/robot(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) + action_intent = new /obj/screen/intent/robot(null, mymob) action_intent.icon_state = R.get_intent().icon_state adding += action_intent diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm index accd7b27c4f0..4682cc14836c 100644 --- a/code/_onclick/hud/screen/screen_intent.dm +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -1,52 +1,67 @@ /obj/screen/intent - name = "intent" - icon = 'icons/mob/screen/styles/intents.dmi' - icon_state = "intent_help" - screen_loc = ui_acti - -/obj/screen/intent/proc/get_intent_state_map() - var/static/list/intent_state_map = list( - GET_DECL(I_DISARM) = "intent_disarm", - GET_DECL(I_HELP) = "intent_help", - GET_DECL(I_HARM) = "intent_harm", - GET_DECL(I_GRAB) = "intent_grab" - ) - return intent_state_map + name = "intent" + icon = 'icons/mob/screen/styles/intents.dmi' + icon_state = "intents" + screen_loc = ui_acti + requires_ui_style = FALSE + +/obj/screen/intent/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) + . = ..() + update_icon() /obj/screen/intent/handle_click(mob/user, params) var/mob/owner = owner_ref?.resolve() if(!istype(owner) || QDELETED(owner) || user != owner || !params) return - var/list/P = params2list(params) - var/icon_x = text2num(P["icon-x"]) - var/icon_y = text2num(P["icon-y"]) - if(icon_x <= world.icon_size/2) - if(icon_y <= world.icon_size/2) - owner.set_intent(I_HARM) - else - owner.set_intent(I_HELP) - else if(icon_y <= world.icon_size/2) - owner.set_intent(I_GRAB) - else - owner.set_intent(I_DISARM) - update_icon() + params = params2list(params) + if(owner.set_intent(get_intent_by_position(owner.get_available_intents(), text2num(params["icon-x"]), text2num(params["icon-y"])))) + update_icon() + +/obj/screen/intent/proc/get_intent_by_position(list/intents, icon_x, icon_y) + if(icon_y <= 16) + if(icon_x <= 16) + return intents[1] + return intents[2] + else if(icon_x <= 16) + return intents[3] + return intents[4] + +/obj/screen/intent/proc/apply_intent_overlay_offset(image/overlay, index) + switch(index) + if(2) + overlay.pixel_x = 16 + if(3) + overlay.pixel_y = 16 + if(4) + overlay.pixel_x = 16 + overlay.pixel_y = 16 /obj/screen/intent/on_update_icon() + cut_overlays() var/mob/owner = owner_ref?.resolve() - if(istype(owner) && !QDELETED(owner)) - var/list/intent_state_map = get_intent_state_map() - icon_state = intent_state_map[owner.get_intent()] || intent_state_map[intent_state_map[1]] - else - icon_state = initial(icon_state) + if(!istype(owner) || QDELETED(owner)) + return + var/decl/intent/owner_intent = owner.get_intent() + var/i = 0 + var/image/I + for(var/decl/intent/intent as anything in owner.get_available_intents()) + if(intent == owner_intent) + I = image(intent.icon, intent.icon_state) + else + I = image(intent.icon, "[intent.icon_state]_off") + i++ + apply_intent_overlay_offset(I, i) + add_overlay(I) + compile_overlays() /obj/screen/intent/binary - icon_state = "intent_harm" - -/obj/screen/intent/binary/get_intent_state_map() - var/static/list/intent_state_map = list( - GET_DECL(I_DISARM) = "intent_help", - GET_DECL(I_HELP) = "intent_help", - GET_DECL(I_HARM) = "intent_harm", - GET_DECL(I_GRAB) = "intent_harm" - ) - return intent_state_map + icon = 'icons/mob/screen/styles/intents_wide.dmi' + +/obj/screen/intent/binary/get_intent_by_position(list/intents, icon_x, icon_y) + if(icon_y <= 16) + return intents[1] + return intents[2] + +/obj/screen/intent/binary/apply_intent_overlay_offset(image/overlay, index) + if(index == 2) + overlay.pixel_y = 16 diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm index e7898fa23c34..73a9f14fb610 100644 --- a/code/datums/repositories/decls.dm +++ b/code/datums/repositories/decls.dm @@ -149,6 +149,8 @@ var/global/repository/decls/decls_repository = new var/uid var/decl_flags = null // DECL_FLAG_ALLOW_ABSTRACT_INIT, DECL_FLAG_MANDATORY_UID var/initialized = FALSE + /// General purpose sort value. + var/sort_order /decl/proc/Initialize() SHOULD_CALL_PARENT(TRUE) diff --git a/code/modules/client/ui_styles/_helpers.dm b/code/modules/client/ui_styles/_helpers.dm index 36685c53f351..83ceb172a415 100644 --- a/code/modules/client/ui_styles/_helpers.dm +++ b/code/modules/client/ui_styles/_helpers.dm @@ -13,7 +13,6 @@ UI_ICON_HEALTH = 'icons/mob/screen/styles/health.dmi', UI_ICON_CRIT_MARKER = 'icons/mob/screen/styles/crit_markers.dmi', UI_ICON_HYDRATION = 'icons/mob/screen/styles/hydration.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/intents.dmi', UI_ICON_INTERACTION = 'icons/mob/screen/styles/midnight/interaction.dmi', UI_ICON_INTERNALS = 'icons/mob/screen/styles/internals.dmi', UI_ICON_INVENTORY = 'icons/mob/screen/styles/midnight/inventory.dmi', diff --git a/code/modules/client/ui_styles/_ui_style.dm b/code/modules/client/ui_styles/_ui_style.dm index 24e3d9085160..5e0a5ba34c41 100644 --- a/code/modules/client/ui_styles/_ui_style.dm +++ b/code/modules/client/ui_styles/_ui_style.dm @@ -13,7 +13,6 @@ UI_ICON_HEALTH = 'icons/mob/screen/styles/health.dmi', UI_ICON_CRIT_MARKER = 'icons/mob/screen/styles/crit_markers.dmi', UI_ICON_HYDRATION = 'icons/mob/screen/styles/hydration.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/intents.dmi', UI_ICON_INTERACTION = 'icons/mob/screen/styles/midnight/interaction.dmi', UI_ICON_INTERNALS = 'icons/mob/screen/styles/internals.dmi', UI_ICON_INVENTORY = 'icons/mob/screen/styles/midnight/inventory.dmi', diff --git a/code/modules/client/ui_styles/_ui_style_states.dm b/code/modules/client/ui_styles/_ui_style_states.dm index bac1d053713e..881a423335e8 100644 --- a/code/modules/client/ui_styles/_ui_style_states.dm +++ b/code/modules/client/ui_styles/_ui_style_states.dm @@ -10,7 +10,6 @@ var/global/list/_ui_all_keys = list( UI_ICON_NUTRITION, UI_ICON_HYDRATION, UI_ICON_FIRE_INTENT, - UI_ICON_INTENT, UI_ICON_UP_HINT, UI_ICON_STATUS, UI_ICON_STATUS_FIRE, @@ -73,14 +72,6 @@ var/global/list/_ui_expected_states "hydration3", "hydration4" ), - UI_ICON_INTENT = list( - "intent_all", - "intent_help", - "intent_disarm", - "intent_grab", - "intent_harm", - "intent_none" - ), UI_ICON_INTERACTION = list( "act_resist", "act_throw_off", diff --git a/code/modules/client/ui_styles/ui_style_subtypes.dm b/code/modules/client/ui_styles/ui_style_subtypes.dm index 7fbd15f6c0db..cff4d996c43b 100644 --- a/code/modules/client/ui_styles/ui_style_subtypes.dm +++ b/code/modules/client/ui_styles/ui_style_subtypes.dm @@ -66,7 +66,6 @@ UI_ICON_ATTACK = 'icons/mob/screen/styles/minimalist/attack_selector.dmi', UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/minimalist/fire_intent.dmi', UI_ICON_HANDS = 'icons/mob/screen/styles/minimalist/hands.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/minimalist/intents.dmi', UI_ICON_INTERACTION = 'icons/mob/screen/styles/minimalist/interaction.dmi', UI_ICON_INVENTORY = 'icons/mob/screen/styles/minimalist/inventory.dmi', UI_ICON_MOVEMENT = 'icons/mob/screen/styles/minimalist/movement.dmi', diff --git a/code/modules/mob/mob_intent.dm b/code/modules/mob/mob_intent.dm index 7771df5dba1e..b73a189e9ac6 100644 --- a/code/modules/mob/mob_intent.dm +++ b/code/modules/mob/mob_intent.dm @@ -28,6 +28,8 @@ var/intent_flags = 0 /// Descriptive string used in status panel. var/name + /// Icon used to draw this intent in the selector. + var/icon = 'icons/screen/intents.dmi' /// State used to update intent selector. var/icon_state @@ -37,31 +39,53 @@ . += "null or invalid name" if(!istext(icon_state)) . += "null or invalid icon_state" + if(!icon) + . += "null icon" + if(icon && istext(icon_state)) + if(!check_state_in_icon(icon_state, icon)) + . += "missing icon_state '[icon_state]' from icon '[icon]'" + if(!check_state_in_icon("[icon_state]_off", icon)) + . += "missing icon_state '[icon_state]_off' from icon '[icon]'" // Basic subtypes. -/decl/intent/help - name = "help" - uid = "intent_help" - intent_flags = I_FLAG_HELP - icon_state = "intent_help" - /decl/intent/harm name = "harm" uid = "intent_harm" intent_flags = I_FLAG_HARM icon_state = "intent_harm" + sort_order = 1 // Bottom left of intent selector. /decl/intent/grab name = "grab" uid = "intent_grab" intent_flags = I_FLAG_GRAB icon_state = "intent_grab" + sort_order = 2 // Bottom left of the intent selector. + +/decl/intent/help + name = "help" + uid = "intent_help" + intent_flags = I_FLAG_HELP + icon_state = "intent_help" + sort_order = 3 // Top left of the intent selector. /decl/intent/disarm name = "disarm" uid = "intent_disarm" intent_flags = I_FLAG_DISARM icon_state = "intent_disarm" + sort_order = 4 // Top right of the intent selector. + +// Used by nymphs. +/decl/intent/harm/binary + icon = 'icons/screen/intents_wide.dmi' + uid = "intent_harm_simple" + intent_flags = (I_FLAG_HARM|I_FLAG_DISARM) + +/decl/intent/help/binary + icon = 'icons/screen/intents_wide.dmi' + uid = "intent_help_simple" + intent_flags = (I_FLAG_HARM|I_FLAG_GRAB) /mob /// Decl for current 'intent' of mob; hurt, harm, etc. Initialized by get_intent(). @@ -88,16 +112,22 @@ /mob/proc/get_intent() RETURN_TYPE(/decl/intent) if(!_a_intent) - _a_intent = get_available_intents()[1] + _a_intent = get_default_intent() return _a_intent +/mob/proc/get_default_intent() + return GET_DECL(I_HELP) + /mob/proc/get_available_intents() - var/static/list/available_intents = list( - GET_DECL(I_HELP), - GET_DECL(I_DISARM), - GET_DECL(I_GRAB), - GET_DECL(I_HARM) - ) + var/static/list/available_intents + if(!available_intents) + available_intents = list( + GET_DECL(I_HELP), + GET_DECL(I_DISARM), + GET_DECL(I_GRAB), + GET_DECL(I_HARM) + ) + available_intents = sortTim(available_intents, /proc/cmp_decl_sort_value_asc) return available_intents /mob/proc/cycle_intent(input) diff --git a/icons/mob/screen/styles/intents.dmi b/icons/mob/screen/styles/intents.dmi index 3c26214b74e2ae700720b3916e181bbbf7943f7f..3b0b33f849097d5e990704dff20e96350ecb11d9 100644 GIT binary patch delta 218 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 O0000qnpT3Vosj8UKe zfPH8>Mmae@M!>+p(b>?@)Y&{rJVR1OPhn4JbbyPMpr5C)vRn4<00001bW%=J06^y0 zW&i*HmwHrKbVOxyV{&P5bZKvH004NLQ&w6ZucgD#^TO= z4}u@^BsXs&MBtSWGp~f0dnH7$@G6+Scr}~9dNm(F;Da#a(}O6w2XSmk5R71%yevoX zmfnLbwv(^25hVXyAzo#uMUagvgh?2Nb_sweO(PG)t2m3}I9Q<^NS5JpxlAZ#^C*3L zgGi(F3NmI{2U&*K3~>^>!WBeO%I5~eKe%VO3?O8rgufnO4|t6r%T_VlggvuSj1(@p z=>aehH(~`qfbop9S`TgI`0yop4=rFC#D}A>U|~VFSodv3c1(`(;k)gU?JKszYy^vY zko15@L12YlD2)iP?U->$ZvX>@;oV(|<`b9CjdTZn4_Hxhw`y+xgX@9zp4?AgfAN z0F`tABT-vbk1Oa>Yi*YxkX2DgAg7SzfT5@Z%7JpP_xpWGF#t?m$YKCBvm8}j0Gg3X{v0SUv9!%aFo3!~DCKs-Mlq7!bJGJra@(K$7hEBc zT`5L79EY}Yy#6RZ^#EK$c@7`|TMO##v2QD~V{(kwpBCgju>Yi;)(2$|coYPjxNzfn z4vNW-O7-VG0tV9h;a$49d~T#WXuWytgy>SWGdeHQ>t^CbAX+yP_G zyYsm<|Gh%nop%#8*dcr;0RwR(R-7=r!+}{~CIQnRJ{-jf>5c8r`43z>*(KXoY=zkfTtj&d zQ+MOU;SIZFQ=OQ`0sC+A;BJb56Sr>sgOh&l@;!UK{{kG|r7vx;@qz#V002ovPDHLk FV1o0x>Zj6FSl^c%GR z0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS z%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$qd978j%;*!LYR3K9+Gp{5yuOvPrHK#y{ zi!&v&s2HSxi!-e#F*g;$#!#DBluNW)ptP+qS3|sjj-jJztuVFanhvD378pg}d z!|)6MoC$$P;QJ&`1I)oZF|PeSS4N0^Ic4p4py%um3>S;ztrm(Nty1^*x5=`ekLoZU7I=h858{yvN?y@!z)*e=M% zW8?d-&jOf}c*a-Kc^i;tnR8}JnrcZl(no;2-vqc5a@l7LHRSu=iWK*9h3{{R4<007+Zx2fAr#V-J%00001 zbW%=J06^y0W&i*HgL+h0bVOxyV{&P5bZKvH004NLQ&w?Vi1Gq`RT3I zw(*jW*&wQ0j2*!<`-%fWQn#2|g6p7`fd4G4g|Co*IYCG8!JrV>oZyy)6f)-owh}0a z9l@d!B=wL|LvYW+8ZCkPnp%Qva4(UIs}cmYQp1yAr_iRAHZAp8t2QPvWXZykMn&ICMzSs{QF!diQEdzT*00000NkvXXu0mjf D^gQST literal 0 HcmV?d00001 diff --git a/mods/mobs/dionaea/icons/ui_intents.dmi b/mods/mobs/dionaea/icons/ui_intents.dmi index d8aaeba136e219bc65d494ebe04e3db60c24cef6..7a7f29b4d21c75c396e026db96834dca91efc29d 100644 GIT binary patch delta 321 zcmdnXx{O)1Gr-TCmrII^fq{Y7)59eQNGpIa3p0>x3`su@q!cHrs)`mo`A`dFGnNGT z1v5B2yO9RuWKYcVt6vh)*=?-4d4+^V(ut!p!=}ub&6TLFz2n!;23|IX+LO`(^P^T; z0Tu7@ba4#Pn3y}!knfNIkLy`pDgTr$>S;$<6O#G@n6-s_6c!%173^ZGTPW0Z^-7@e zpM5v%e=@j*vu{X>Wog)buUbA%vEu&xZL$vxk69esB|E7gOx;Y6v#R{+<+xS{rAL20 zMs@Uaq@*PO)?v{X%JgLsZPQ-3oa5s)yG;w`c6~7TvRhJ8@J_>4=0^{v^_lqI-Z*(< zN^Fbwwm6s9T#Em1ny~!s^wemXr*y>k_lf*fbGbHN5A@Re{A5@Uy1vUXmHw@j8$ R69syN!PC{xWt~$(69A1HA<$iBL{Q4GJ0x0000DNk~Le0001B0000$2m=5B0MhD$JOBUyFp(uC zB;4?~soPD$009300GBn z0Mlz<9f1mzVgLXEp-DtRR9J=WSKE@qAP5aMH?vLm|NnLY(Oep;6V`oMWlU@iLm`Mc zbX^Df=xCU6rw{lQfBex8<1mrnkPFH<^bgdq;;7KiKFH!vtDX(ma8wv(CBS)L12!BL zMz5sEk8Hq(vj>X8K$>R{bNCj4%yR^6;3<=f=jdS$-#nMqAp&I=e{79$pkuF-}S1 zQh)8`_2N>OB<_xa!&y^=ZxKZASGbNKO}LIg!IKByC;8|hWFmlz2rmBM{T&|-6yd=G zWfvq54LE&Mf7N{~-&_;U=ebsi@w~U-#A}oY0fhIM@cPWIIybG)uIrE55w!l`|MUkM zzqjI9es9II{N9RZ`Mnj-@_Q@Z`h(UVwEkenO;3gL#y#)$55@fdZvRls|L^t>#r*$n p|4_{T@AeO^KWP0y>kqo_2TATpxAp|1H~;_u07*qo1w^hwV1l;@6fXb( diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 4c8b1a9f4967..4e13e530ef9a 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -76,6 +76,16 @@ heal_damage(OXY, rads, do_update_health = FALSE) heal_damage(TOX, rads) +/mob/living/simple_animal/alien/diona/get_default_intent() + return GET_DECL(/decl/intent/help/binary/diona) + +/mob/living/simple_animal/alien/diona/get_available_intents() + var/static/list/available_intents = list( + GET_DECL(/decl/intent/harm/binary/diona), + GET_DECL(/decl/intent/help/binary/diona) + ) + return available_intents + /decl/bodytype/diona name = "nymph" bodytype_flag = 0 diff --git a/mods/mobs/dionaea/mob/nymph_ui.dm b/mods/mobs/dionaea/mob/nymph_ui.dm index b337856bd458..0930bb184cdd 100644 --- a/mods/mobs/dionaea/mob/nymph_ui.dm +++ b/mods/mobs/dionaea/mob/nymph_ui.dm @@ -1,6 +1,13 @@ /obj/screen/intent/binary/diona + icon = 'mods/mobs/dionaea/icons/ui_intents.dmi' screen_loc = DIONA_SCREEN_LOC_INTENT +/decl/intent/harm/binary/diona + icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + +/decl/intent/help/binary/diona + icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + /decl/ui_style/diona name = "Diona" restricted = TRUE @@ -8,7 +15,6 @@ override_icons = list( UI_ICON_HEALTH = 'mods/mobs/dionaea/icons/ui_health.dmi', UI_ICON_HANDS = 'mods/mobs/dionaea/icons/ui_hands.dmi', - UI_ICON_INTENT = 'mods/mobs/dionaea/icons/ui_intents.dmi', UI_ICON_INTERACTION = 'mods/mobs/dionaea/icons/ui_interactions.dmi', UI_ICON_INVENTORY = 'mods/mobs/dionaea/icons/ui_inventory.dmi' ) @@ -27,8 +33,8 @@ var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - action_intent = new /obj/screen/intent/binary/diona(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) - mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) + action_intent = new /obj/screen/intent/binary/diona(null, mymob) + mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) src.other = list() src.adding = list(mymob.healths, action_intent) ..() diff --git a/mods/species/ascent/icons/ui_intent_overlay.dmi b/mods/species/ascent/icons/ui_intent_overlay.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d49275852d3485b58a6fd646fb89f8727e5e5633 GIT binary patch literal 569 zcmV-90>=G`P)oSPNev|8jzk;J}~|*qq=u3n^sI32Y@$ z5IX|SzTgo-QV%IL1bY_NXbIHU)DmQay+kgqN)Xga4KIR|LYr3FwA5#{KL6MzUmF?l zk&S6+1+f^M4?09}@_ajJ#X-D=cux3-`T@v6N#yy>e$Xi!-RuW7JK#WYu^)VB=m(YT zO*jyI8g%_Ygk6GL{h&YKj^J89coUSk+Yg4<4FCP$i~ZmUHr^jAv|?*m00000NkvXX Hu0mjffgtj~ literal 0 HcmV?d00001 diff --git a/mods/species/ascent/icons/ui_intents.dmi b/mods/species/ascent/icons/ui_intents.dmi index 1e027dcfcdddd90d6999f10bb9aea31c4f5b0bf4..0e8d07ec2fecf6f82ef9e05347c6baffdb6dcbf7 100644 GIT binary patch delta 321 zcmdnax{O)1Gr-TCmrII^fq{Y7)59eQNGpIa3p0>x3`su@q!cHrs*1Mip2`HW8B2ov zf*Bm1-ADs+vM1*G)h~(Y>^4^2yh1`F>BP~QVN+(z=1SDo-tlW^11}px?MZ2Y`B5va zfQt8cx;TbtOw65V$alzq$Mr0)lz++=^|T|b2}ykc%-X^|3JVY13U;y8EfngydL_{K z&%PV>KN;M@**7G`vNY_zS1li>SaE;;HrWS;$1INRlATl#rf#OkSyg`Za$Ku}(xX2g zqdNLIQc{wC>#*nxW%{y+wrMY1&hhb@-KGU|yFM6v*)1t4c&A}2^P>mT`b>OpZ=Ad_ zCAP(TTb#>lF2(;hO<4YRdTO-HQ##`N`$Yb#xm+8s2YTs!elja(_Lt{hSv#-9TP91W Ri2^;s;OXk;vd$@?2>`N`d>#M* delta 596 zcmV-a0;~O|1GfbwiBL{Q4GJ0x0000DNk~Le0001B0000$2m=5B0MhD$JOBUyFp(uC zB=EQ9+fBj$nE?OH0RLtHZ;Jj?00001bW%=J06^y0W&i*Hj*(wZeShacid8xS6Dl549xqw3s z0M@Qw9Wh5kPyhe{n@L1LR9J=Wm+N-JAP9iP=4RGp@Bg*~G&XVJl*!zmDaYJCv`{nw z=N!n*Q8RNdH~1C)e;CGToJp{y1IjcG57e-7R2Y^JWevsEz!TUwDvXQZ;4<~pYc()kZxGc=YmV)QDF{r_rU_#<261CGfxnC6oBKZ;(ziNH4k$8WqPxbc&i^4(#=M) zrH-QI6r|Iu;PS2sDTvJXv+TQ?zdXnt?malH+u+^Ef^4CIe$zKqT*v8~YvTMqmv-XuzPE77YXlDgQr=_Y?K8XPxoP|Cx_xWyL9Y+~ zPkrz%|F7lh{J)l~^Z#0|&i`wbb&V2!bWl5#OWJM_e0000 Date: Thu, 28 Nov 2024 16:15:43 +1100 Subject: [PATCH 40/42] Updating set_intent() to use flags instead of types. --- code/__defines/intent.dm | 7 +---- code/_onclick/other_mobs.dm | 2 +- code/datums/ai/aggressive.dm | 8 +++--- code/datums/ai/hunter.dm | 2 +- code/game/objects/effects/gateway.dm | 2 +- code/modules/keybindings/mob.dm | 8 +++--- code/modules/mechs/mech_interaction.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 4 +-- .../simple_animal/friendly/farm_animals.dm | 2 +- .../simple_animal/hostile/faithful_hound.dm | 2 +- code/modules/mob/mob_intent.dm | 26 +++++++++++------ code/modules/mob/transform_procs.dm | 6 ++-- code/modules/projectiles/projectile/change.dm | 4 +-- .../system/psionics/faculties/_faculty.dm | 8 ++---- .../system/psionics/faculties/coercion.dm | 2 +- .../system/psionics/faculties/energistics.dm | 2 +- .../psionics/faculties/psychokinesis.dm | 2 +- .../system/psionics/faculties/redaction.dm | 2 +- .../system/psionics/mob/mob_interactions.dm | 6 ++-- mods/content/psionics/system/subsystem_psi.dm | 28 ++++++++++++++----- mods/content/xenobiology/slime/slime_AI.dm | 12 ++++---- mods/gamemodes/deity/mobs/deity_phenomena.dm | 10 +++---- mods/mobs/dionaea/mob/nymph_ui.dm | 2 ++ mods/species/ascent/mobs/nymph/nymph_ui.dm | 2 ++ 24 files changed, 86 insertions(+), 65 deletions(-) diff --git a/code/__defines/intent.dm b/code/__defines/intent.dm index f4e895d4af9e..2fa914a8b4c2 100644 --- a/code/__defines/intent.dm +++ b/code/__defines/intent.dm @@ -1,14 +1,9 @@ -// Intent decls for use in set_intent() -#define I_HELP /decl/intent/help -#define I_DISARM /decl/intent/disarm -#define I_GRAB /decl/intent/grab -#define I_HARM /decl/intent/harm - // Intent bitflags for use in check_intent() #define I_FLAG_HELP BITFLAG(0) #define I_FLAG_DISARM BITFLAG(1) #define I_FLAG_GRAB BITFLAG(2) #define I_FLAG_HARM BITFLAG(3) +#define I_FLAG_ALL (I_FLAG_HELP|I_FLAG_DISARM|I_FLAG_GRAB|I_FLAG_HARM) //NOTE: INTENT_HOTKEY_* defines are not actual intents! //they are here to support hotkeys diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 36e4b7b0420d..870865a831ff 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -97,7 +97,7 @@ if(check_intent(I_FLAG_HELP) || !attacking_with) return A.attack_animal(src) - set_intent(I_HARM) + set_intent(I_FLAG_HARM) . = A.attackby(attacking_with, src) // attack effects are handled in natural_weapon's apply_hit_effect() instead of here if(!.) diff --git a/code/datums/ai/aggressive.dm b/code/datums/ai/aggressive.dm index e823de88f43d..62316d4d1977 100644 --- a/code/datums/ai/aggressive.dm +++ b/code/datums/ai/aggressive.dm @@ -10,7 +10,7 @@ /datum/mob_controller/aggressive/New() ..() if(isliving(body) && !QDELETED(body) && !QDELETED(src)) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) /datum/mob_controller/aggressive/set_target(atom/new_target) var/weakref/new_target_ref = weakref(new_target) @@ -113,7 +113,7 @@ SET_STATUS_MAX(victim, STAT_WEAK, 3) return target if(body.Adjacent(target)) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(target) return target @@ -140,7 +140,7 @@ // Attack anything on the target turf. var/obj/effect/shield/S = locate(/obj/effect/shield) in targ if(S && S.gen && S.gen.check_flag(MODEFLAG_NONHUMANS)) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(S) return @@ -161,7 +161,7 @@ for(var/type in valid_obstacles_by_priority) var/obj/obstacle = locate(type) in targ if(obstacle) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(obstacle) return diff --git a/code/datums/ai/hunter.dm b/code/datums/ai/hunter.dm index b5b4425ca895..e60294d4a87e 100644 --- a/code/datums/ai/hunter.dm +++ b/code/datums/ai/hunter.dm @@ -17,7 +17,7 @@ return !victim.isSynthetic() && (victim.stat == DEAD || victim.get_object_size() < body.get_object_size()) /datum/mob_controller/passive/hunter/proc/try_attack_prey(mob/living/prey) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(prey) /datum/mob_controller/passive/hunter/proc/consume_prey(mob/living/prey) diff --git a/code/game/objects/effects/gateway.dm b/code/game/objects/effects/gateway.dm index 87418769e154..2b6be989f274 100644 --- a/code/game/objects/effects/gateway.dm +++ b/code/game/objects/effects/gateway.dm @@ -60,7 +60,7 @@ qdel(W) var/mob/living/new_mob = new /mob/living/simple_animal/corgi(AM.loc) - new_mob.set_intent(I_HARM) + new_mob.set_intent(I_FLAG_HARM) if(victim.mind) victim.mind.transfer_to(new_mob) else diff --git a/code/modules/keybindings/mob.dm b/code/modules/keybindings/mob.dm index 370af83db5dd..4ab7f0f14f96 100644 --- a/code/modules/keybindings/mob.dm +++ b/code/modules/keybindings/mob.dm @@ -52,7 +52,7 @@ full_name = "Select Help Intent" /datum/keybinding/mob/select_help_intent/down(client/user) - user.mob.set_intent(I_HELP) + user.mob.set_intent(I_FLAG_HELP) return TRUE /datum/keybinding/mob/select_disarm_intent @@ -61,7 +61,7 @@ full_name = "Select Disarm Intent" /datum/keybinding/mob/select_disarm_intent/down(client/user) - user.mob.set_intent(I_DISARM) + user.mob.set_intent(I_FLAG_DISARM) return TRUE /datum/keybinding/mob/select_grab_intent @@ -70,7 +70,7 @@ full_name = "Select Grab Intent" /datum/keybinding/mob/select_grab_intent/down(client/user) - user.mob.set_intent(I_GRAB) + user.mob.set_intent(I_FLAG_GRAB) return TRUE /datum/keybinding/mob/select_harm_intent @@ -79,7 +79,7 @@ full_name = "Select Harm Intent" /datum/keybinding/mob/select_harm_intent/down(client/user) - user.mob.set_intent(I_HARM) + user.mob.set_intent(I_FLAG_HARM) return TRUE /datum/keybinding/mob/cycle_intent_right diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index efe8754fc57b..77fc243c7057 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -328,7 +328,7 @@ user.client.screen -= hud_elements user.client.eye = user if(user in pilots) - set_intent(I_HARM) + set_intent(I_FLAG_HARM) LAZYREMOVE(pilots, user) UNSETEMPTY(pilots) update_pilots() diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index a817ab7e7075..903677e4a811 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -209,9 +209,9 @@ return TRUE if(isanimal(M)) - set_intent(I_HARM) + set_intent(I_FLAG_HARM) else - set_intent(I_GRAB) + set_intent(I_FLAG_GRAB) stun_baton.use_on_mob(M, src) //robots and turrets aim for center of mass flick(attack_state, src) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index d260e451868c..ae8da0e797f3 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -59,7 +59,7 @@ var/atom/food = find_edible_atom(view(1, body.loc)) if(istype(food)) body.stop_automove() - body.set_intent(I_HELP) + body.set_intent(I_FLAG_HELP) body.ClickOn(food) else if(!LAZYLEN(body.grabbed_by)) food = find_edible_atom(oview(5, body.loc)) diff --git a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm index 19765360632c..345b7137994b 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm @@ -37,7 +37,7 @@ var/new_aggress = 1 var/dist = get_dist(mailman, body) if(dist < 2) //Attack! Attack! - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(mailman) return if(dist == 2) diff --git a/code/modules/mob/mob_intent.dm b/code/modules/mob/mob_intent.dm index b73a189e9ac6..39a1a9c5606a 100644 --- a/code/modules/mob/mob_intent.dm +++ b/code/modules/mob/mob_intent.dm @@ -2,7 +2,8 @@ // - Use mob.get_intent() to retrieve the entire decl structure. // - Use mob.check_intent(I_FOO) for 1:1 intent type checking. // - Use mob.check_intent(I_FLAG_FOO) for 'close enough for government work' flag checking. -// - Use mob.set_intent(I_FOO) to set intent to a type - does not accept flags. +// - Use mob.set_intent(I_FOO) to set intent to a type +// - Use mob.set_intent(I_FLAG_FOO) to set intent to whatever available type has the flag. // - Use mob.cycle_intent(INTENT_HOTKEY_LEFT) or mob.cycle_intent(INTENT_HOTKEY_RIGHT) to step up or down the mob intent list. // - Override mob.get_available_intents() if you want to change the intents from the default four. @@ -24,7 +25,7 @@ /decl/intent abstract_type = /decl/intent decl_flags = DECL_FLAG_MANDATORY_UID - /// Replacing the old usage of I_HURT etc. in attackby() and such. Refer to /mob/proc/check_intent(). + /// Replacing the old usage of I_HARM etc. in attackby() and such. Refer to /mob/proc/check_intent(). var/intent_flags = 0 /// Descriptive string used in status panel. var/name @@ -101,12 +102,21 @@ return (intent == resolve_intent(checking_intent)) /mob/proc/set_intent(decl/intent/new_intent) - new_intent = resolve_intent(new_intent) + + if(!isnum(new_intent)) + new_intent = resolve_intent(new_intent) + else // Retrieve intent decl based on flag. + for(var/decl/intent/intent as anything in get_available_intents()) + if(intent.intent_flags & new_intent) + new_intent = intent + break + if(istype(new_intent) && get_intent() != new_intent) _a_intent = new_intent if(istype(hud_used) && hud_used.action_intent) hud_used.action_intent.update_icon() return TRUE + return FALSE /mob/proc/get_intent() @@ -116,16 +126,16 @@ return _a_intent /mob/proc/get_default_intent() - return GET_DECL(I_HELP) + return GET_DECL(/decl/intent/help) /mob/proc/get_available_intents() var/static/list/available_intents if(!available_intents) available_intents = list( - GET_DECL(I_HELP), - GET_DECL(I_DISARM), - GET_DECL(I_GRAB), - GET_DECL(I_HARM) + GET_DECL(/decl/intent/help), + GET_DECL(/decl/intent/disarm), + GET_DECL(/decl/intent/grab), + GET_DECL(/decl/intent/harm) ) available_intents = sortTim(available_intents, /proc/cmp_decl_sort_value_asc) return available_intents diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index cb58eb00bfe0..e0c1d4468761 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -154,7 +154,7 @@ qdel(t) var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) - new_corgi.set_intent(I_HARM) + new_corgi.set_intent(get_intent()) new_corgi.key = key to_chat(new_corgi, "You are now a Corgi. Yap Yap!") @@ -186,7 +186,7 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.set_intent(I_HARM) + new_mob.set_intent(get_intent()) to_chat(new_mob, "You suddenly feel more... animalistic.") @@ -206,7 +206,7 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.set_intent(I_HARM) + new_mob.set_intent(get_intent()) to_chat(new_mob, "You feel more... animalistic.") qdel(src) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index a2a200522e4e..8e241456d22b 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -54,11 +54,11 @@ var/choice = pick(get_random_transformation_options(M)) var/mob/living/new_mob = apply_transformation(M, choice) if(new_mob) - new_mob.set_intent(I_HARM) + new_mob.set_intent(I_FLAG_HARM) if(M.mind) for (var/spell/S in M.mind.learned_spells) new_mob.add_spell(new S.type) - new_mob.set_intent(I_HARM) + new_mob.set_intent(I_FLAG_HARM) transfer_key_from_mob_to_mob(M, new_mob) to_chat(new_mob, "Your form morphs into that of \a [choice].") else diff --git a/mods/content/psionics/system/psionics/faculties/_faculty.dm b/mods/content/psionics/system/psionics/faculties/_faculty.dm index 16cd63a7e71c..03d9fc7a2363 100644 --- a/mods/content/psionics/system/psionics/faculties/_faculty.dm +++ b/mods/content/psionics/system/psionics/faculties/_faculty.dm @@ -1,18 +1,16 @@ /decl/psionic_faculty var/id var/name - var/decl/intent/associated_intent + var/associated_intent_flag var/list/armour_types = list() var/list/powers = list() /decl/psionic_faculty/validate() . = ..() - if(associated_intent && !istype(associated_intent)) - . += "non-/decl/intent associated_intent value set" + if(!isnull(associated_intent_flag) && !isnum(associated_intent_flag)) + . += "non-bitflag associated_intent_flag value set" /decl/psionic_faculty/Initialize() - if(ispath(associated_intent)) - associated_intent = GET_DECL(associated_intent) . = ..() for(var/atype in armour_types) SSpsi.armour_faculty_by_type[atype] = id diff --git a/mods/content/psionics/system/psionics/faculties/coercion.dm b/mods/content/psionics/system/psionics/faculties/coercion.dm index 0cddc48bf322..2af44aa9335a 100644 --- a/mods/content/psionics/system/psionics/faculties/coercion.dm +++ b/mods/content/psionics/system/psionics/faculties/coercion.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/coercion id = PSI_COERCION name = "Coercion" - associated_intent = I_DISARM + associated_intent_flag = I_FLAG_DISARM armour_types = list(PSIONIC) /decl/psionic_power/coercion diff --git a/mods/content/psionics/system/psionics/faculties/energistics.dm b/mods/content/psionics/system/psionics/faculties/energistics.dm index 2ab1a789936c..2396a1e71193 100644 --- a/mods/content/psionics/system/psionics/faculties/energistics.dm +++ b/mods/content/psionics/system/psionics/faculties/energistics.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/energistics id = PSI_ENERGISTICS name = "Energistics" - associated_intent = I_HARM + associated_intent_flag = I_FLAG_HARM armour_types = list(ARMOR_BOMB, ARMOR_LASER, ARMOR_ENERGY) /decl/psionic_power/energistics diff --git a/mods/content/psionics/system/psionics/faculties/psychokinesis.dm b/mods/content/psionics/system/psionics/faculties/psychokinesis.dm index 49c77a70ae0f..8d0dd5c61f88 100644 --- a/mods/content/psionics/system/psionics/faculties/psychokinesis.dm +++ b/mods/content/psionics/system/psionics/faculties/psychokinesis.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/psychokinesis id = PSI_PSYCHOKINESIS name = "Psychokinesis" - associated_intent = I_GRAB + associated_intent_flag = I_FLAG_GRAB armour_types = list(ARMOR_MELEE, ARMOR_BULLET) /decl/psionic_power/psychokinesis diff --git a/mods/content/psionics/system/psionics/faculties/redaction.dm b/mods/content/psionics/system/psionics/faculties/redaction.dm index 97354f41a059..8879259a72ac 100644 --- a/mods/content/psionics/system/psionics/faculties/redaction.dm +++ b/mods/content/psionics/system/psionics/faculties/redaction.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/redaction id = PSI_REDACTION name = "Redaction" - associated_intent = I_HELP + associated_intent_flag = I_FLAG_HELP armour_types = list(ARMOR_BIO, ARMOR_RAD) /decl/psionic_power/redaction diff --git a/mods/content/psionics/system/psionics/mob/mob_interactions.dm b/mods/content/psionics/system/psionics/mob/mob_interactions.dm index 94806af788ff..366adb308823 100644 --- a/mods/content/psionics/system/psionics/mob/mob_interactions.dm +++ b/mods/content/psionics/system/psionics/mob/mob_interactions.dm @@ -25,18 +25,18 @@ return TRUE /datum/ability_handler/psionics/do_grabbed_invocation(mob/user, atom/target) - INVOKE_PSI_POWERS(user, get_grab_powers(SSpsi.faculties_by_intent[user.get_intent()]), target) + INVOKE_PSI_POWERS(user, get_grab_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) /datum/ability_handler/psionics/can_do_melee_invocation(mob/user, atom/target) return TRUE /datum/ability_handler/psionics/do_melee_invocation(mob/user, atom/target) - INVOKE_PSI_POWERS(user, get_melee_powers(SSpsi.faculties_by_intent[user.get_intent()]), target) + INVOKE_PSI_POWERS(user, get_melee_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) /datum/ability_handler/psionics/can_do_ranged_invocation(mob/user, atom/target) return TRUE /datum/ability_handler/psionics/do_ranged_invocation(mob/user, atom/target) - INVOKE_PSI_POWERS(user, get_ranged_powers(SSpsi.faculties_by_intent[user.get_intent()]), target) + INVOKE_PSI_POWERS(user, get_ranged_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) #undef INVOKE_PSI_POWERS \ No newline at end of file diff --git a/mods/content/psionics/system/subsystem_psi.dm b/mods/content/psionics/system/subsystem_psi.dm index 806f911873b5..e6621835ce9d 100644 --- a/mods/content/psionics/system/subsystem_psi.dm +++ b/mods/content/psionics/system/subsystem_psi.dm @@ -5,13 +5,27 @@ PROCESSING_SUBSYSTEM_DEF(psi) priority = SS_PRIORITY_PSYCHICS flags = SS_POST_FIRE_TIMING | SS_BACKGROUND - var/list/faculties_by_id = list() - var/list/faculties_by_name = list() - var/list/all_aura_images = list() - var/list/psi_dampeners = list() - var/list/psi_monitors = list() + var/list/faculties_by_id = list() + var/list/faculties_by_name = list() + var/list/all_aura_images = list() + var/list/psi_dampeners = list() + var/list/psi_monitors = list() var/list/armour_faculty_by_type = list() - var/list/faculties_by_intent = list() + var/list/faculties_by_intent = new(I_FLAG_ALL) + +/datum/controller/subsystem/processing/psi/proc/get_faculty_by_intent(decl/intent/intent) + var/static/list/intent_flags = list( + I_FLAG_HELP, + I_FLAG_DISARM, + I_FLAG_GRAB, + I_FLAG_HARM + ) + . = faculties_by_intent[intent.intent_flags] + if(!.) + for(var/flag in intent_flags) + if(flag & intent.intent_flags) + . = faculties_by_intent[flag] + faculties_by_intent[intent.intent_flags] = . /datum/controller/subsystem/processing/psi/proc/get_faculty(var/faculty) return faculties_by_name[faculty] || faculties_by_id[faculty] @@ -24,7 +38,7 @@ PROCESSING_SUBSYSTEM_DEF(psi) var/decl/psionic_faculty/faculty = faculties[ftype] faculties_by_id[faculty.id] = faculty faculties_by_name[faculty.name] = faculty - faculties_by_intent[faculty.associated_intent] = faculty.id + faculties_by_intent[faculty.associated_intent_flag] = faculty.id var/list/powers = decls_repository.get_decls_of_subtype(/decl/psionic_power) for(var/ptype in powers) diff --git a/mods/content/xenobiology/slime/slime_AI.dm b/mods/content/xenobiology/slime/slime_AI.dm index 3cade1ddc496..7260e124070c 100644 --- a/mods/content/xenobiology/slime/slime_AI.dm +++ b/mods/content/xenobiology/slime/slime_AI.dm @@ -37,13 +37,13 @@ /datum/mob_controller/slime/proc/update_mood() if(!slime || !body) return - body.set_intent(I_HELP) + body.set_intent(I_FLAG_HELP) var/new_mood if(HAS_STATUS(body, STAT_CONFUSE)) new_mood = "pout" else if(rabid || attacked) new_mood = "angry" - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) else if(current_target) new_mood = "mischevous" @@ -146,19 +146,19 @@ if(prob(1)) for(var/mob/living/slime/frenemy in range(1, body)) if(frenemy != body && body.Adjacent(frenemy)) - body.set_intent((frenemy.slime_type == slime.slime_type) ? I_HELP : I_HARM) + body.set_intent((frenemy.slime_type == slime.slime_type) ? I_FLAG_HELP : I_FLAG_HARM) body.UnarmedAttack(frenemy, TRUE) added_delay = 10 else if(slime.Adjacent(current_target)) var/do_attack = FALSE if(issilicon(current_target)) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) do_attack = TRUE else if(current_target.client && !current_target.current_posture.prone && prob(60 + slime.powerlevel * 4)) - body.set_intent(I_DISARM) + body.set_intent(I_FLAG_DISARM) do_attack = TRUE else if(slime.check_valid_feed_target(current_target) == FEED_RESULT_VALID) - body.set_intent(I_GRAB) + body.set_intent(I_FLAG_GRAB) do_attack = TRUE if(do_attack) body.UnarmedAttack(current_target, TRUE) diff --git a/mods/gamemodes/deity/mobs/deity_phenomena.dm b/mods/gamemodes/deity/mobs/deity_phenomena.dm index eef27a6bdb60..a5abe64946a2 100644 --- a/mods/gamemodes/deity/mobs/deity_phenomena.dm +++ b/mods/gamemodes/deity/mobs/deity_phenomena.dm @@ -9,11 +9,11 @@ . = ..() for(var/decl/intent/intent as anything in decls_repository.get_decls_of_type_unassociated(/decl/intent)) //Just in case we somehow remove/add a new intent #futureproofing populate_intent(intent) - set_phenomenon(add_phenomenon(/datum/phenomenon/communicate), GET_DECL(I_HELP), "shift") - set_phenomenon(add_phenomenon(/datum/phenomenon/punish), GET_DECL(I_HELP), "control") - set_phenomenon(add_phenomenon(/datum/phenomenon/point), GET_DECL(I_HELP), "controlshift") - set_phenomenon(add_phenomenon(/datum/phenomenon/conversion), GET_DECL(I_GRAB), "shift") - set_phenomenon(add_phenomenon(/datum/phenomenon/forced_conversion), GET_DECL(I_GRAB), "control") + set_phenomenon(add_phenomenon(/datum/phenomenon/communicate), GET_DECL(/decl/intent/disarm), "shift") + set_phenomenon(add_phenomenon(/datum/phenomenon/punish), GET_DECL(/decl/intent/help), "control") + set_phenomenon(add_phenomenon(/datum/phenomenon/point), GET_DECL(/decl/intent/help), "controlshift") + set_phenomenon(add_phenomenon(/datum/phenomenon/conversion), GET_DECL(/decl/intent/grab), "shift") + set_phenomenon(add_phenomenon(/datum/phenomenon/forced_conversion), GET_DECL(/decl/intent/grab), "control") /mob/living/deity/proc/silence(amount) if(!silenced) diff --git a/mods/mobs/dionaea/mob/nymph_ui.dm b/mods/mobs/dionaea/mob/nymph_ui.dm index 0930bb184cdd..f970c5978862 100644 --- a/mods/mobs/dionaea/mob/nymph_ui.dm +++ b/mods/mobs/dionaea/mob/nymph_ui.dm @@ -4,9 +4,11 @@ /decl/intent/harm/binary/diona icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + uid = "intent_harm_binary_diona" /decl/intent/help/binary/diona icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + uid = "intent_help_binary_diona" /decl/ui_style/diona name = "Diona" diff --git a/mods/species/ascent/mobs/nymph/nymph_ui.dm b/mods/species/ascent/mobs/nymph/nymph_ui.dm index a22964614730..9f1430297d46 100644 --- a/mods/species/ascent/mobs/nymph/nymph_ui.dm +++ b/mods/species/ascent/mobs/nymph/nymph_ui.dm @@ -4,9 +4,11 @@ /decl/intent/harm/binary/ascent icon = 'mods/species/ascent/icons/ui_intent_overlay.dmi' + uid = "intent_harm_binary_ascent" /decl/intent/help/binary/ascent icon = 'mods/species/ascent/icons/ui_intent_overlay.dmi' + uid = "intent_help_binary_ascent" /obj/screen/ascent_nymph_molt name = "molt" From 7348e0aec044132c92e38b2a046743742d3c217a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 28 Nov 2024 16:54:10 +1100 Subject: [PATCH 41/42] Commenting out nymph intent selection/subtypes due to issues with interactions. --- code/modules/banners/sign.dm | 2 +- mods/mobs/dionaea/mob/_nymph.dm | 2 ++ mods/mobs/dionaea/mob/nymph_ui.dm | 6 ++++-- mods/species/ascent/mobs/nymph/_nymph.dm | 2 ++ mods/species/ascent/mobs/nymph/nymph_ui.dm | 5 +++-- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/modules/banners/sign.dm b/code/modules/banners/sign.dm index cfc15e3310c2..f7babc034d0f 100644 --- a/code/modules/banners/sign.dm +++ b/code/modules/banners/sign.dm @@ -9,7 +9,7 @@ colourise_decal = FALSE /obj/item/banner/sign/attackby(obj/item/used_item, mob/user) - if(IS_KNIFE(used_item) && user.a_intent == I_HELP) + if(IS_KNIFE(used_item) && user.check_intent(I_FLAG_HELP)) var/available_decals = get_available_decals() if(!length(available_decals) || length(decals)) to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 4e13e530ef9a..6ec480cda3be 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -76,6 +76,7 @@ heal_damage(OXY, rads, do_update_health = FALSE) heal_damage(TOX, rads) +/* /mob/living/simple_animal/alien/diona/get_default_intent() return GET_DECL(/decl/intent/help/binary/diona) @@ -85,6 +86,7 @@ GET_DECL(/decl/intent/help/binary/diona) ) return available_intents +*/ /decl/bodytype/diona name = "nymph" diff --git a/mods/mobs/dionaea/mob/nymph_ui.dm b/mods/mobs/dionaea/mob/nymph_ui.dm index f970c5978862..cdd3a3f8c6da 100644 --- a/mods/mobs/dionaea/mob/nymph_ui.dm +++ b/mods/mobs/dionaea/mob/nymph_ui.dm @@ -1,3 +1,4 @@ +/* Commented out due to issues with interactions and combined intent flags. /obj/screen/intent/binary/diona icon = 'mods/mobs/dionaea/icons/ui_intents.dmi' screen_loc = DIONA_SCREEN_LOC_INTENT @@ -9,6 +10,7 @@ /decl/intent/help/binary/diona icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' uid = "intent_help_binary_diona" +*/ /decl/ui_style/diona name = "Diona" @@ -35,8 +37,8 @@ var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - action_intent = new /obj/screen/intent/binary/diona(null, mymob) - mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) + action_intent = new /obj/screen/intent( null, mymob) // Swap to /obj/screen/intent/binary/diona when interaction code supports it. + mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) src.other = list() src.adding = list(mymob.healths, action_intent) ..() diff --git a/mods/species/ascent/mobs/nymph/_nymph.dm b/mods/species/ascent/mobs/nymph/_nymph.dm index 2c0a4f3646b2..16447b0c51dc 100644 --- a/mods/species/ascent/mobs/nymph/_nymph.dm +++ b/mods/species/ascent/mobs/nymph/_nymph.dm @@ -52,6 +52,7 @@ /mob/living/simple_animal/alien/kharmaan/get_dexterity(var/silent) return (DEXTERITY_EQUIP_ITEM) +/* /mob/living/simple_animal/alien/kharmaan/get_default_intent() return GET_DECL(/decl/intent/help/binary/ascent) @@ -61,3 +62,4 @@ GET_DECL(/decl/intent/help/binary/ascent) ) return available_intents +*/ \ No newline at end of file diff --git a/mods/species/ascent/mobs/nymph/nymph_ui.dm b/mods/species/ascent/mobs/nymph/nymph_ui.dm index 9f1430297d46..c100c95b4cd2 100644 --- a/mods/species/ascent/mobs/nymph/nymph_ui.dm +++ b/mods/species/ascent/mobs/nymph/nymph_ui.dm @@ -1,3 +1,4 @@ +/* Commented out due to issues with interactions and combined intent flags. /obj/screen/intent/binary/ascent icon = 'mods/species/ascent/icons/ui_intents.dmi' screen_loc = ANYMPH_SCREEN_LOC_INTENT @@ -9,7 +10,7 @@ /decl/intent/help/binary/ascent icon = 'mods/species/ascent/icons/ui_intent_overlay.dmi' uid = "intent_help_binary_ascent" - +*/ /obj/screen/ascent_nymph_molt name = "molt" icon = 'mods/species/ascent/icons/ui_molt.dmi' @@ -53,7 +54,7 @@ molt = new( null, mymob, ui_style, ui_color, ui_alpha) food = new /obj/screen/food( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_NUTRITION) drink = new /obj/screen/drink( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HYDRATION) - action_intent = new /obj/screen/intent/binary/ascent(null) + action_intent = new /obj/screen/intent( null) // Swap to /obj/screen/intent/binary/ascent when interaction code supports it. mymob.healths = new /obj/screen/ascent_nymph_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) src.other = list() src.adding = list(mymob.healths, molt, food, drink, action_intent) From 85b9c56a37464cbf9900889b630dc00697ad6dc8 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 6 Dec 2024 20:25:45 +1100 Subject: [PATCH 42/42] Automatic changelog generation for PR #4583 [ci skip] --- html/changelogs/AutoChangeLog-pr-4583.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4583.yml diff --git a/html/changelogs/AutoChangeLog-pr-4583.yml b/html/changelogs/AutoChangeLog-pr-4583.yml new file mode 100644 index 000000000000..9c592814efdd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4583.yml @@ -0,0 +1,5 @@ +author: MistakeNot4892 +changes: + - {tweak: Most wooden floors and tables on space maps are now chipboard laminate + instead.} +delete-after: true

    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 z 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 HiqHBF@M7cJ literal 0 HcmV?d00001 diff --git a/mods/content/xenobiology/overrides.dm b/mods/content/xenobiology/overrides.dm index a5c39ef27430..015002287b36 100644 --- a/mods/content/xenobiology/overrides.dm +++ b/mods/content/xenobiology/overrides.dm @@ -25,7 +25,7 @@ /obj/machinery/smartfridge/secure/extract name = "\improper Slime Extract Storage" desc = "A refrigerated storage unit for slime extracts." - icon_contents = "slime" + overlay_contents_icon = 'mods/content/xenobiology/icons/smartfridge_contents_slime.dmi' initial_access = list(access_research) /obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O) diff --git a/nebula.dme b/nebula.dme index 9c639d5db845..f342d9e5ce3e 100644 --- a/nebula.dme +++ b/nebula.dme @@ -969,7 +969,6 @@ #include "code\game\machinery\kitchen\gibber.dm" #include "code\game\machinery\kitchen\icecream.dm" #include "code\game\machinery\kitchen\microwave.dm" -#include "code\game\machinery\kitchen\smartfridge.dm" #include "code\game\machinery\kitchen\cooking_machines\_cooker.dm" #include "code\game\machinery\kitchen\cooking_machines\_cooker_output.dm" #include "code\game\machinery\kitchen\cooking_machines\candy.dm" @@ -979,6 +978,16 @@ #include "code\game\machinery\kitchen\cooking_machines\oven.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\pipelayer.dm" +#include "code\game\machinery\smartfridge\_smartfridge.dm" +#include "code\game\machinery\smartfridge\_smartfridge_secure.dm" +#include "code\game\machinery\smartfridge\chemistry.dm" +#include "code\game\machinery\smartfridge\drinks.dm" +#include "code\game\machinery\smartfridge\drying_oven.dm" +#include "code\game\machinery\smartfridge\foods.dm" +#include "code\game\machinery\smartfridge\medbay.dm" +#include "code\game\machinery\smartfridge\produce.dm" +#include "code\game\machinery\smartfridge\seeds.dm" +#include "code\game\machinery\smartfridge\sheets.dm" #include "code\game\machinery\turrets\_turrets.dm" #include "code\game\machinery\turrets\network_turret.dm" #include "code\game\machinery\turrets\turret_ammo.dm" From 8f7fa9377c2bd92b8545198dfae5c238de52be8e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 22 Nov 2024 22:35:06 +1100 Subject: [PATCH 02/42] Unit test name consistency pass (sorry). --- code/unit_tests/backgrounds.dm | 2 +- code/unit_tests/codex.dm | 8 ++++---- code/unit_tests/extension_tests.dm | 14 +++++++------- code/unit_tests/icon_tests.dm | 17 +++++++++-------- code/unit_tests/integrated_circuits.dm | 12 ++++++------ code/unit_tests/movement_tests.dm | 4 ++-- code/unit_tests/override_tests.dm | 8 ++++---- code/unit_tests/subsystem_tests.dm | 6 +++--- code/unit_tests/time_tests.dm | 14 +++++++------- code/unit_tests/virtual_mob_tests.dm | 18 +++++++++--------- 10 files changed, 52 insertions(+), 51 deletions(-) diff --git a/code/unit_tests/backgrounds.dm b/code/unit_tests/backgrounds.dm index d44e5e2c5c3a..e08b1ec37512 100644 --- a/code/unit_tests/backgrounds.dm +++ b/code/unit_tests/backgrounds.dm @@ -1,5 +1,5 @@ /datum/unit_test/background - name = "BACKGROUND - All Species Background Values Shall Be Of Valid Types And Length" + name = "BACKGROUND: All Species Background Values Shall Be Of Valid Types And Length" /datum/unit_test/background/start_test() diff --git a/code/unit_tests/codex.dm b/code/unit_tests/codex.dm index 92a97cec0d50..2130edd1f887 100644 --- a/code/unit_tests/codex.dm +++ b/code/unit_tests/codex.dm @@ -1,5 +1,5 @@ /datum/unit_test/codex_string_uniqueness - name = "CODEX - All Codex Associated Strings Shall Be Unique" + name = "CODEX: All Codex Associated Strings Shall Be Unique" /datum/unit_test/codex_string_uniqueness/start_test() var/list/failures = list() @@ -18,7 +18,7 @@ return TRUE /datum/unit_test/codex_overlap - name = "CODEX - No Codex String IDs Shall Overlap" + name = "CODEX: No Codex String IDs Shall Overlap" /datum/unit_test/codex_overlap/start_test() var/list/failures = list() @@ -42,7 +42,7 @@ return TRUE /datum/unit_test/codex_links - name = "CODEX - All Codex Links Will Function" + name = "CODEX: All Codex Links Will Function" /datum/unit_test/codex_links/start_test() var/list/failures = list() @@ -64,7 +64,7 @@ return 1 /datum/unit_test/codex_dump_test - name = "CODEX - Codex Will Successfully Dump To Filesystem" + name = "CODEX: Codex Will Successfully Dump To Filesystem" /datum/unit_test/codex_dump_test/start_test() var/dump_result diff --git a/code/unit_tests/extension_tests.dm b/code/unit_tests/extension_tests.dm index 3cf14a6f23dc..49f9769fa431 100644 --- a/code/unit_tests/extension_tests.dm +++ b/code/unit_tests/extension_tests.dm @@ -4,7 +4,7 @@ async = 0 /datum/unit_test/extensions/basic_extension_shall_lazy_initalize_as_expected - name = "EXTENSIONS - Basic extension shall lazy initialize as expected" + name = "EXTENSIONS: Basic extension shall lazy initialize as expected" /datum/unit_test/extensions/basic_extension_shall_lazy_initalize_as_expected/start_test() var/turf/start = get_safe_turf() @@ -40,7 +40,7 @@ return TRUE /datum/unit_test/extensions/basic_immediate_extension_shall_initalize_as_expected - name = "EXTENSIONS - Basic immediate extension shall initialize as expected" + name = "EXTENSIONS: Basic immediate extension shall initialize as expected" /datum/unit_test/extensions/basic_immediate_extension_shall_initalize_as_expected/start_test() var/turf/start = get_safe_turf() @@ -71,7 +71,7 @@ return TRUE /datum/unit_test/extensions/shall_acquire_extension_subtype_as_expected - name = "EXTENSIONS - Shall acquire extension subtype as expected" + name = "EXTENSIONS: Shall acquire extension subtype as expected" /datum/unit_test/extensions/shall_acquire_extension_subtype_as_expected/start_test() var/turf/start = get_safe_turf() @@ -88,7 +88,7 @@ return TRUE /datum/unit_test/extensions/extension_shall_be_provided_arguments_as_expected - name = "EXTENSIONS - Extension shall be provided arguments as expected" + name = "EXTENSIONS: Extension shall be provided arguments as expected" /datum/unit_test/extensions/extension_shall_be_provided_arguments_as_expected/start_test() var/turf/start = get_safe_turf() @@ -105,7 +105,7 @@ return TRUE /datum/unit_test/extensions/immediate_extension_shall_be_provided_arguments_as_expected - name = "EXTENSIONS - Immediate extension shall be provided arguments as expected" + name = "EXTENSIONS: Immediate extension shall be provided arguments as expected" /datum/unit_test/extensions/immediate_extension_shall_be_provided_arguments_as_expected/start_test() var/turf/start = get_safe_turf() @@ -122,7 +122,7 @@ return TRUE /datum/unit_test/extensions/get_or_create_extension_shall_initialize_as_expected - name = "EXTENSIONS - get_or_create() shall initialize as expected" + name = "EXTENSIONS: get_or_create() shall initialize as expected" /datum/unit_test/extensions/get_or_create_extension_shall_initialize_as_expected/start_test() var/turf/start = get_safe_turf() @@ -147,7 +147,7 @@ return TRUE /datum/unit_test/extensions/get_or_create_extension_with_arguments_shall_initialize_as_expected - name = "EXTENSIONS - get_or_create() with arguments shall initialize as expected" + name = "EXTENSIONS: get_or_create() with arguments shall initialize as expected" /datum/unit_test/extensions/get_or_create_extension_with_arguments_shall_initialize_as_expected/start_test() var/turf/start = get_safe_turf() diff --git a/code/unit_tests/icon_tests.dm b/code/unit_tests/icon_tests.dm index c3a49677a90e..8a25e15a29eb 100644 --- a/code/unit_tests/icon_tests.dm +++ b/code/unit_tests/icon_tests.dm @@ -3,7 +3,7 @@ template = /datum/unit_test/icon_test /datum/unit_test/icon_test/food_shall_have_icon_states - name = "ICON STATE - Food And Drink Subtypes Shall Have Icon States" + name = "ICON STATE: Food And Drink Subtypes Shall Have Icon States" var/list/check_types = list( /obj/item/chems/condiment, /obj/item/chems/drinks, @@ -48,7 +48,7 @@ return 1 /datum/unit_test/icon_test/turfs_shall_have_icon_states - name = "ICON STATE - Turf Subtypes Shall Have Icon States" + name = "ICON STATE: Turf Subtypes Shall Have Icon States" var/list/except_types = list( /turf/mimic_edge, /turf/open @@ -82,7 +82,7 @@ return 1 /datum/unit_test/icon_test/signs_shall_have_existing_icon_states - name = "ICON STATE - Signs shall have existing icon states" + name = "ICON STATE: Signs shall have existing icon states" var/list/skip_types = list( // Posters use a decl to set their icon and handle their own validation. /obj/structure/sign/poster @@ -121,7 +121,7 @@ return 1 /datum/unit_test/icon_test/random_spawners_shall_have_existing_icon_states - name = "ICON STATE - Random spawners shall have existing icon states" + name = "ICON STATE: Random spawners shall have existing icon states" /datum/unit_test/icon_test/random_spawners_shall_have_existing_icon_states/start_test() var/list/failures = list() @@ -144,7 +144,7 @@ return 1 /datum/unit_test/icon_test/floor_decals_shall_have_existing_icon_states - name = "ICON STATE - Floor decals shall have existing icon states" + name = "ICON STATE: Floor decals shall have existing icon states" var/static/list/excepted_types = list( /obj/effect/floor_decal/reset, /obj/effect/floor_decal/undo @@ -172,7 +172,7 @@ return 1 /datum/unit_test/icon_test/bgstate - name = "ICON_STATE - Character Previews Will Have Background States" + name = "ICON STATE: Character Previews Will Have Background States" /datum/unit_test/icon_test/bgstate/start_test() var/obj/screen/setup_preview/preview = /obj/screen/setup_preview @@ -197,7 +197,7 @@ return 1 /datum/unit_test/icon_test/smartfridges - name = "ICON_STATE - Smartfridges Will Have All Needed Icon States" + name = "ICON STATE: Smartfridges Will Have All Needed Icon States" /datum/unit_test/icon_test/smartfridges/start_test() var/list/failures = list() @@ -260,7 +260,7 @@ return 1 /datum/unit_test/icon_test/vendors - name = "ICON_STATE - Vending Machines Will Have All Needed Icon States" + name = "ICON STATE: Vending Machines Will Have All Needed Icon States" /datum/unit_test/icon_test/vendors/start_test() var/list/failures = list() @@ -295,3 +295,4 @@ fail("Missing vendor icons or icon states:\n\t-[jointext(failures, "\n\t-")]") else pass("All vendors have all icons and icon states.") + return 1 diff --git a/code/unit_tests/integrated_circuits.dm b/code/unit_tests/integrated_circuits.dm index ca6d5099487a..79c26d52a3a8 100644 --- a/code/unit_tests/integrated_circuits.dm +++ b/code/unit_tests/integrated_circuits.dm @@ -2,7 +2,7 @@ template = /datum/unit_test/integrated_circuits /datum/unit_test/integrated_circuits/unique_names - name = "INTEGRATED CIRCUITS - Circuits must have unique names" + name = "INTEGRATED CIRCUITS: Circuits must have unique names" /datum/unit_test/integrated_circuits/unique_names/start_test() var/list/circuits_by_name = list() @@ -20,7 +20,7 @@ /datum/unit_test/integrated_circuits/prefabs_are_valid - name = "INTEGRATED CIRCUITS - Prefabs Are Valid" + name = "INTEGRATED CIRCUITS: Prefabs Are Valid" /datum/unit_test/integrated_circuits/prefabs_are_valid/start_test() var/list/failed_prefabs = list() @@ -37,7 +37,7 @@ return 1 /datum/unit_test/integrated_circuits/prefabs_shall_not_fail_to_create - name = "INTEGRATED CIRCUITS - Prefabs Shall Not Fail To Create" + name = "INTEGRATED CIRCUITS: Prefabs Shall Not Fail To Create" /datum/unit_test/integrated_circuits/prefabs_shall_not_fail_to_create/start_test() var/list/failed_prefabs = list() @@ -63,7 +63,7 @@ return 1 /datum/unit_test/integrated_circuits/input_output - name = "INTEGRATED CIRCUITS - INPUT/OUTPUT - TEMPLATE" + name = "INTEGRATED CIRCUITS: INPUT/OUTPUT - TEMPLATE" template = /datum/unit_test/integrated_circuits/input_output var/list/all_inputs = list() var/list/all_expected_outputs = list() @@ -110,13 +110,13 @@ return 1 /datum/unit_test/integrated_circuits/input_output/multiplexer - name = "INTEGRATED CIRCUITS - INPUT/OUTPUT - Multiplexer - Medium" + name = "INTEGRATED CIRCUITS: INPUT/OUTPUT - Multiplexer - Medium" all_inputs = list(list(1,1,2,3,4),list(2,1,2,3,4),list(3,1,2,3,4),list(4,1,2,3,4)) all_expected_outputs = list(list(1),list(2),list(3),list(4)) circuit_type = /obj/item/integrated_circuit/transfer/multiplexer/medium /datum/unit_test/integrated_circuits/input_output/demultiplexer - name = "INTEGRATED CIRCUITS - INPUT/OUTPUT - Demultiplexer - Medium" + name = "INTEGRATED CIRCUITS: INPUT/OUTPUT - Demultiplexer - Medium" all_inputs = list(list(1,5),list(2,6),list(3,7),list(4,8)) all_expected_outputs = list(list(5,null,null,null),list(null,6,null,null),list(null,null,7,null),list(null,null,null,8)) circuit_type = /obj/item/integrated_circuit/transfer/demultiplexer/medium diff --git a/code/unit_tests/movement_tests.dm b/code/unit_tests/movement_tests.dm index d86ee6585a7c..8d45dbe20cfb 100644 --- a/code/unit_tests/movement_tests.dm +++ b/code/unit_tests/movement_tests.dm @@ -4,7 +4,7 @@ async = 0 /datum/unit_test/movement/force_move_shall_trigger_crossed_when_entering_turf - name = "MOVEMENT - Force Move Shall Trigger Crossed When Entering Turf" + name = "MOVEMENT: Force Move Shall Trigger Crossed When Entering Turf" /datum/unit_test/movement/force_move_shall_trigger_crossed_when_entering_turf/start_test() var/turf/start = get_safe_turf() @@ -27,7 +27,7 @@ return TRUE /datum/unit_test/movement/force_move_shall_trigger_entered - name = "MOVEMENT - Force Move Shall Trigger Entered" + name = "MOVEMENT: Force Move Shall Trigger Entered" /datum/unit_test/movement/force_move_shall_trigger_entered/start_test() var/turf/start = get_safe_turf() diff --git a/code/unit_tests/override_tests.dm b/code/unit_tests/override_tests.dm index 5a904c09ef51..2c8d6bc47cca 100644 --- a/code/unit_tests/override_tests.dm +++ b/code/unit_tests/override_tests.dm @@ -5,7 +5,7 @@ template = /datum/unit_test/override /datum/unit_test/override/obj_random_shall_spawn_heaviest_item - name = "OVERRIDE - obj/random shall spawn heaviest item" + name = "OVERRIDE: obj/random shall spawn heaviest item" /datum/unit_test/override/obj_random_shall_spawn_heaviest_item/start_test() global.unit_test_last_obj_random_creation = null @@ -22,7 +22,7 @@ return 1 /datum/unit_test/override/atom_creator_simple_shall_always_spawn - name = "OVERRIDE - /datum/atom_creator/simple shall always spawn" + name = "OVERRIDE: /datum/atom_creator/simple shall always spawn" /datum/unit_test/override/atom_creator_simple_shall_always_spawn/start_test() var/datum/atom_creator/simple/S = new/datum/atom_creator/simple(/obj/unit_test_light, 1) @@ -40,7 +40,7 @@ return 1 /datum/unit_test/override/atom_creator_weighted_shall_spawn_heaviest - name = "OVERRIDE - /datum/atom_creator/weighted shall spawn heaviest" + name = "OVERRIDE: /datum/atom_creator/weighted shall spawn heaviest" /datum/unit_test/override/atom_creator_weighted_shall_spawn_heaviest/start_test() var/datum/atom_creator/weighted/W = new/datum/atom_creator/weighted(list(/obj/unit_test_light = 9001, /obj/unit_test_heavy = 1)) @@ -57,7 +57,7 @@ return 1 /datum/unit_test/override/atom_creator_weighted_shall_spawn_heaviest_recursive - name = "OVERRIDE - /datum/atom_creator/weighted shall spawn heaviest - Recursive" + name = "OVERRIDE: /datum/atom_creator/weighted shall spawn heaviest - Recursive" /datum/unit_test/override/atom_creator_weighted_shall_spawn_heaviest_recursive/start_test() var/datum/atom_creator/weighted/W = new/datum/atom_creator/weighted( diff --git a/code/unit_tests/subsystem_tests.dm b/code/unit_tests/subsystem_tests.dm index 95224a7050b1..114dcb1a48c1 100644 --- a/code/unit_tests/subsystem_tests.dm +++ b/code/unit_tests/subsystem_tests.dm @@ -1,5 +1,5 @@ /datum/unit_test/subsystem_atom_shall_have_no_bad_init_calls - name = "SUBSYSTEM - ATOMS: Shall have no bad init calls" + name = "SUBSYSTEM: ATOMS: Shall have no bad init calls" /datum/unit_test/subsystem_atom_shall_have_no_bad_init_calls/start_test() if(SSatoms.BadInitializeCalls.len) @@ -10,7 +10,7 @@ return 1 /datum/unit_test/subsystem_shall_be_initialized - name = "SUBSYSTEM - INIT: Subsystems shall be initalized" + name = "SUBSYSTEM: INIT: Subsystems shall be initalized" /datum/unit_test/subsystem_shall_be_initialized/start_test() var/list/bad_subsystems = list() @@ -28,7 +28,7 @@ return 1 /datum/unit_test/all_atoms_shall_be_initialized - name = "SUBSYSTEM - ATOMS: All atoms shall be initialized." + name = "SUBSYSTEM: ATOMS: All atoms shall be initialized." /datum/unit_test/all_atoms_shall_be_initialized/start_test() set background = TRUE // avoid infinite loop warning; SS will still wait for us. diff --git a/code/unit_tests/time_tests.dm b/code/unit_tests/time_tests.dm index 8f700ed2d135..d233f327bd2e 100644 --- a/code/unit_tests/time_tests.dm +++ b/code/unit_tests/time_tests.dm @@ -1,9 +1,9 @@ /datum/unit_test/time - name = "TIME - Template" + name = "TIME: Template" template = /datum/unit_test/time /datum/unit_test/time/shall_validate_sixth_of_june - name = "Shall validate 6th of June" + name = "TIME: Shall validate 6th of June" /datum/unit_test/time/shall_validate_sixth_of_june/start_test() var/datum/is_date/day/D = new(6, 6) @@ -15,7 +15,7 @@ return TRUE /datum/unit_test/time/shall_not_validate_not_sixth_of_june - name = "Shall not validate not-6th of June" + name = "TIME: Shall not validate not-6th of June" /datum/unit_test/time/shall_not_validate_not_sixth_of_june/start_test() var/datum/is_date/day/D = new(1, 1) @@ -27,7 +27,7 @@ return TRUE /datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_before_end - name = "Shall be able to validate range that include 6th of June - Start before End" + name = "TIME: Shall be able to validate range that include 6th of June - Start before End" /datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_before_end/start_test() var/datum/is_date/range/R = new(5, 5, 7, 7) @@ -39,7 +39,7 @@ return TRUE /datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_after_end - name = "Shall be able to validate range that include 6th of June - Start after End" + name = "TIME: Shall be able to validate range that include 6th of June - Start after End" /datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_after_end/start_test() var/datum/is_date/range/R = new(8, 8, 7, 7) @@ -51,7 +51,7 @@ return TRUE /datum/unit_test/time/shall_not_validate_range_that_exlude_sixt_of_june_start_before_end - name = "Shall not validate range that exlude 6th of June - Start before End" + name = "TIME: Shall not validate range that exlude 6th of June - Start before End" /datum/unit_test/time/shall_not_validate_range_that_exlude_sixt_of_june_start_before_end/start_test() var/datum/is_date/range/R = new(7, 7, 8, 8) @@ -63,7 +63,7 @@ return TRUE /datum/unit_test/time/shall_not_validate_range_that_exclude_sixt_of_june_start_after_end - name = "Shall not validate range that exlude 6th of June - Start after End" + name = "TIME: Shall not validate range that exlude 6th of June - Start after End" /datum/unit_test/time/shall_not_validate_range_that_exclude_sixt_of_june_start_after_end/start_test() var/datum/is_date/range/R = new(7, 7, 5, 5) diff --git a/code/unit_tests/virtual_mob_tests.dm b/code/unit_tests/virtual_mob_tests.dm index 2a7eb99d0daa..dab89f395ec8 100644 --- a/code/unit_tests/virtual_mob_tests.dm +++ b/code/unit_tests/virtual_mob_tests.dm @@ -1,9 +1,9 @@ /datum/unit_test/virtual - name = "VIRTUAL - Template" + name = "VIRTUAL: Template" template = /datum/unit_test/virtual /datum/unit_test/virtual/helper - name = "VIRTUAL - Template Helper" + name = "VIRTUAL: Template Helper" template = /datum/unit_test/virtual/helper var/helper_proc @@ -45,14 +45,14 @@ return TRUE /datum/unit_test/virtual/helper/check_hearers_in_range - name = "VIRTUAL - Helper Test - Check Hearers In Range" + name = "VIRTUAL: Helper Test - Check Hearers In Range" helper_proc = /proc/hearers_in_range /datum/unit_test/virtual/helper/check_hearers_in_range/standard_setup() ..() expected_mobs = list(mob_one, mob_two, mob_three) /datum/unit_test/virtual/helper/check_hearers_in_range_with_mob_inside_storage - name = "VIRTUAL - Helper Test - Check Hearers In Range - With Mob Inside Storage" + name = "VIRTUAL: Helper Test - Check Hearers In Range - With Mob Inside Storage" helper_proc = /proc/hearers_in_range var/obj/storage /datum/unit_test/virtual/helper/check_hearers_in_range_with_mob_inside_storage/standard_setup() @@ -65,35 +65,35 @@ . = ..() /datum/unit_test/virtual/helper/check_viewers_in_range - name = "VIRTUAL - Helper Test - Check Viewers In Range" + name = "VIRTUAL: Helper Test - Check Viewers In Range" helper_proc = /proc/viewers_in_range /datum/unit_test/virtual/helper/check_viewers_in_range/standard_setup() ..() expected_mobs = list(mob_one, mob_two, mob_three) /datum/unit_test/virtual/helper/check_all_hearers - name = "VIRTUAL - Helper Test - Check All Hearers" + name = "VIRTUAL: Helper Test - Check All Hearers" helper_proc = /proc/all_hearers /datum/unit_test/virtual/helper/check_all_hearers/standard_setup() ..() expected_mobs = list(mob_one, mob_two) /datum/unit_test/virtual/helper/check_all_viewers - name = "VIRTUAL - Helper Test - Check All Viewers" + name = "VIRTUAL: Helper Test - Check All Viewers" helper_proc = /proc/all_viewers /datum/unit_test/virtual/helper/check_all_viewers/standard_setup() ..() expected_mobs = list(mob_one, mob_two) /datum/unit_test/virtual/helper/check_mobs_in_viewing_range - name = "VIRTUAL - Helper Test - Check Mobs In Viewing Range" + name = "VIRTUAL: Helper Test - Check Mobs In Viewing Range" helper_proc = /proc/hosts_in_view_range /datum/unit_test/virtual/helper/check_mobs_in_viewing_range/standard_setup() ..() expected_mobs = list(mob_one, mob_two) /datum/unit_test/virtual/helper/check_hosts_in_view_range_with_mob_inside_object - name = "VIRTUAL - Helper Test - Check Hosts in View Range - With Mob Inside Object" + name = "VIRTUAL: Helper Test - Check Hosts in View Range - With Mob Inside Object" helper_proc = /proc/hosts_in_view_range var/obj/storage /datum/unit_test/virtual/helper/check_hosts_in_view_range_with_mob_inside_object/standard_setup() From ea17fad5ccd1ff9c64f1f0d029807aa1a494fd06 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 23 Nov 2024 10:02:09 +1100 Subject: [PATCH 03/42] Requested tweaks. --- code/game/machinery/smartfridge/foods.dm | 9 +++++++-- .../game/objects/structures/under_wardrobe.dm | 4 ++-- code/unit_tests/time_tests.dm | 20 +++++++++---------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/code/game/machinery/smartfridge/foods.dm b/code/game/machinery/smartfridge/foods.dm index 7992aaee6bcb..1d3cf0d5b89e 100644 --- a/code/game/machinery/smartfridge/foods.dm +++ b/code/game/machinery/smartfridge/foods.dm @@ -5,5 +5,10 @@ overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_food.dmi' /obj/machinery/smartfridge/foods/accept_check(var/obj/item/O) - if(istype(O,/obj/item/food) || istype(O,/obj/item/utensil)) - return 1 + var/static/list/_food_types = list( + /obj/item/food, + /obj/item/utensil, + /obj/item/chems/glass/bowl, + /obj/item/chems/glass/handmade/bowl + ) + return istype(O) && O.reagents?.total_volume && is_type_in_list(O, _food_types) diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index db853713b21f..e8f8ab1e513f 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -78,7 +78,7 @@ var/datum/category_group/underwear/UWC = global.underwear.categories_by_name[href_list["select_underwear"]] if(!UWC) return - var/datum/category_item/underwear/UWI = input("Select your desired underwear:", "Choose underwear") as null|anything in exlude_none(UWC.items) + var/datum/category_item/underwear/UWI = input("Select your desired underwear:", "Choose underwear") as null|anything in exclude_none(UWC.items) if(!UWI) return @@ -113,7 +113,7 @@ if(.) interact(H) -/obj/structure/undies_wardrobe/proc/exlude_none(var/list/L) +/obj/structure/undies_wardrobe/proc/exclude_none(var/list/L) . = L.Copy() for(var/e in .) var/datum/category_item/underwear/UWI = e diff --git a/code/unit_tests/time_tests.dm b/code/unit_tests/time_tests.dm index d233f327bd2e..2dbf636d1e91 100644 --- a/code/unit_tests/time_tests.dm +++ b/code/unit_tests/time_tests.dm @@ -26,10 +26,10 @@ qdel(D) return TRUE -/datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_before_end +/datum/unit_test/time/shall_validate_range_that_include_sixth_of_june_start_before_end name = "TIME: Shall be able to validate range that include 6th of June - Start before End" -/datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_before_end/start_test() +/datum/unit_test/time/shall_validate_range_that_include_sixth_of_june_start_before_end/start_test() var/datum/is_date/range/R = new(5, 5, 7, 7) if(R.IsValid()) pass("Validation succeeded") @@ -38,10 +38,10 @@ qdel(R) return TRUE -/datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_after_end +/datum/unit_test/time/shall_validate_range_that_include_sixth_of_june_start_after_end name = "TIME: Shall be able to validate range that include 6th of June - Start after End" -/datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_after_end/start_test() +/datum/unit_test/time/shall_validate_range_that_include_sixth_of_june_start_after_end/start_test() var/datum/is_date/range/R = new(8, 8, 7, 7) if(R.IsValid()) pass("Validation succeeded") @@ -50,10 +50,10 @@ qdel(R) return TRUE -/datum/unit_test/time/shall_not_validate_range_that_exlude_sixt_of_june_start_before_end - name = "TIME: Shall not validate range that exlude 6th of June - Start before End" +/datum/unit_test/time/shall_not_validate_range_that_exclude_sixth_of_june_start_before_end + name = "TIME: Shall not validate range that exclude 6th of June - Start before End" -/datum/unit_test/time/shall_not_validate_range_that_exlude_sixt_of_june_start_before_end/start_test() +/datum/unit_test/time/shall_not_validate_range_that_exclude_sixth_of_june_start_before_end/start_test() var/datum/is_date/range/R = new(7, 7, 8, 8) if(R.IsValid()) fail("Unexpected validation") @@ -62,10 +62,10 @@ qdel(R) return TRUE -/datum/unit_test/time/shall_not_validate_range_that_exclude_sixt_of_june_start_after_end - name = "TIME: Shall not validate range that exlude 6th of June - Start after End" +/datum/unit_test/time/shall_not_validate_range_that_exclude_sixth_of_june_start_after_end + name = "TIME: Shall not validate range that exclude 6th of June - Start after End" -/datum/unit_test/time/shall_not_validate_range_that_exclude_sixt_of_june_start_after_end/start_test() +/datum/unit_test/time/shall_not_validate_range_that_exclude_sixth_of_june_start_after_end/start_test() var/datum/is_date/range/R = new(7, 7, 5, 5) if(R.IsValid()) fail("Unexpected validation") From 80cdec6cfcdbdad84e3f76bacada1c62e39bd7b2 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 20 Nov 2024 10:54:55 -0500 Subject: [PATCH 04/42] Fix drake salve aura never expiring --- mods/species/drakes/drake_abilities_friendly.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/species/drakes/drake_abilities_friendly.dm b/mods/species/drakes/drake_abilities_friendly.dm index 6a1d8796c137..a224540e9889 100644 --- a/mods/species/drakes/drake_abilities_friendly.dm +++ b/mods/species/drakes/drake_abilities_friendly.dm @@ -86,7 +86,7 @@ var/global/list/_wounds_being_tended_by_drakes = list() // Sivian animals get a heal buff from the modifier, others just // get it to stop friendly drakes constantly licking their wounds. // Organ wounds are closed, but the owners get sifsap injected via open wounds. - friend.add_aura(new /obj/aura/sifsap_salve(null, 60 SECONDS)) + friend.add_aura(new /obj/aura/sifsap_salve(friend, 60 SECONDS)) var/list/friend_organs = friend.get_external_organs() if(length(friend_organs)) for (var/obj/item/organ/external/E in friend_organs) From 8433b3248670139de45c0a6ec1ccffdacdc77adb Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 22 Nov 2024 18:04:32 -0500 Subject: [PATCH 05/42] Fix shredded paper burning --- code/modules/paperwork/papershredder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index ce2142055694..8a88f6dff173 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -245,7 +245,7 @@ user.visible_message( \ SPAN_DANGER("\The [user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap."), \ SPAN_DANGER("You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.")) - fire_act() + fire_act(return_air(), P.get_heat(), 500) /obj/item/shreddedp/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) SHOULD_CALL_PARENT(FALSE) From 11209ca24f53951df00a691d4e42b2b175c9443c Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 22 Nov 2024 18:05:14 -0500 Subject: [PATCH 06/42] Readd aggressive grabs applying pressure to wounds --- code/modules/mob/grab/normal/norm_aggressive.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/mob/grab/normal/norm_aggressive.dm b/code/modules/mob/grab/normal/norm_aggressive.dm index b581f3795d8d..5a48b8a9130f 100644 --- a/code/modules/mob/grab/normal/norm_aggressive.dm +++ b/code/modules/mob/grab/normal/norm_aggressive.dm @@ -14,6 +14,13 @@ breakability = 3 grab_icon_state = "reinforce1" break_chance_table = list(5, 20, 40, 80, 100) + help_action = "wound pressure" // A bit clunky, but this is only used for admin logs presently! + +/decl/grab/normal/aggressive/on_hit_help(obj/item/grab/grab, atom/target, proximity) + var/mob/living/human/grab_victim = grab.get_affecting_mob() + if(!istype(grab_victim) || !proximity || (target && target != grab_victim)) + return FALSE + return grab_victim.apply_pressure(grab.assailant, grab.target_zone) /decl/grab/normal/aggressive/process_effect(var/obj/item/grab/grab) var/mob/living/affecting_mob = grab.get_affecting_mob() From f5f2f81d68cb7672a1e7824508915251118d5357 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 22 Nov 2024 18:09:00 -0500 Subject: [PATCH 07/42] Rewrite injury self-examination --- .../mob/living/human/human_attackhand.dm | 132 ++++++++++-------- 1 file changed, 72 insertions(+), 60 deletions(-) diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index dca7496e1a81..cc45f1c3fc34 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -24,77 +24,89 @@ if(length(limb.unarmed_attacks) && limb.is_usable()) . |= limb.unarmed_attacks -/mob/living/human/default_help_interaction(mob/user) - - if(user != src) - if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !on_fire && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) - if (performing_cpr) - performing_cpr = FALSE - else - performing_cpr = TRUE - start_compressions(user, TRUE) - return TRUE - - if(apply_pressure(user, user.get_target_zone())) - return TRUE - - return ..() - - var/decl/pronouns/pronouns = get_pronouns() - visible_message( - SPAN_NOTICE("\The [src] examines [pronouns.self]."), - SPAN_NOTICE("You check yourself for injuries.") - ) - - // TODO: move status strings onto the organ and handle crystal/prosthetic limbs. - for(var/obj/item/organ/external/org in get_external_organs()) - var/list/status = list() - - var/feels = 1 + round(org.pain/100, 0.1) - var/feels_brute = org.can_feel_pain() ? (org.brute_dam * feels) : 0 +/obj/item/organ/external/proc/get_injury_status(include_pain = TRUE, include_visible = TRUE) + . = list() + if(include_pain && can_feel_pain()) + var/feels = 1 + round(get_pain()/100, 0.1) + var/feels_brute = brute_dam * feels if(feels_brute > 0) - switch(feels_brute / org.max_damage) + switch(feels_brute / max_damage) if(0 to 0.35) - status += "slightly sore" + . += "slightly sore" if(0.35 to 0.65) - status += "very sore" + . += "very sore" if(0.65 to INFINITY) - status += "throbbing with agony" + . += "throbbing with agony" - var/feels_burn = org.can_feel_pain() ? (org.burn_dam * feels) : 0 + var/feels_burn = burn_dam * feels if(feels_burn > 0) - switch(feels_burn / org.max_damage) + switch(feels_burn / max_damage) if(0 to 0.35) - status += "tingling" + . += "tingling" if(0.35 to 0.65) - status += "stinging" + . += "stinging" if(0.65 to INFINITY) - status += "burning fiercely" - - if(org.status & ORGAN_MUTATED) - status += "misshapen" - if(org.status & ORGAN_BLEEDING) - status += "bleeding" - if(org.is_dislocated()) - status += "dislocated" - if(org.status & ORGAN_BROKEN && org.can_feel_pain()) - status += "painful to the touch" - - if(org.status & ORGAN_DEAD) - if(BP_IS_PROSTHETIC(org) || BP_IS_CRYSTAL(org)) - status += "irrecoverably damaged" + . += "burning fiercely" + + if(status & ORGAN_BROKEN) + . += "painful to the touch" + + if(include_visible && !owner?.is_blind()) + if(status & ORGAN_MUTATED) + . += "misshapen" + if(status & ORGAN_BLEEDING) + . += "bleeding" + if(is_dislocated()) + . += "dislocated" + if(status & ORGAN_DEAD) + if(BP_IS_PROSTHETIC(src) || BP_IS_CRYSTAL(src)) + . += "irrecoverably damaged" else - status += "grey and necrotic" - else if(org.damage >= org.max_damage && org.germ_level >= INFECTION_LEVEL_TWO) - status += "likely beyond saving and decay has set in" - if(!org.is_usable() || org.is_dislocated()) - status += "dangling uselessly" - - if(status.len) - show_message("My [org.name] is [english_list(status)].",1) + . += "grey and necrotic" + else if(damage >= max_damage && germ_level >= INFECTION_LEVEL_TWO) + . += "likely beyond saving and decay has set in" + + if(!is_usable() || is_dislocated()) // This one is special and has a different message for visible/pain modes. + . += (!include_visible || owner?.is_blind()) ? "completely limp" : "dangling uselessly" + +/mob/living/human/proc/check_self_injuries(include_pain = TRUE, include_visible = TRUE) + if(include_visible) + var/decl/pronouns/pronouns = get_pronouns() + visible_message( + SPAN_NOTICE("\The [src] examines [pronouns.self]."), + SPAN_NOTICE("You check yourself for injuries.") + ) + else if(include_pain) + to_chat(src, SPAN_NOTICE("You take note of how your body feels...")) + else + return // This should never happen, we should always check pain, visible status, or both. + + // TODO: move status strings onto the bodytype and handle crystal/prosthetic limbs. + for(var/obj/item/organ/external/org in get_external_organs()) + var/list/status = org.get_injury_status(include_pain, include_visible) + if(length(status)) + to_chat(src, "Your [org.name] is [english_list(status)].") + else if(is_blind() || !include_visible) + to_chat(src, "You can't feel anything wrong with your [org.name].") + else if(!include_pain) + to_chat(src, "You can't see anything wrong with your [org.name].") else - show_message("My [org.name] is OK.",1) - return TRUE + to_chat(src, "Your [org.name] is OK.") + +/mob/living/human/default_help_interaction(mob/user) + if(apply_pressure(user, user.get_target_zone())) + return TRUE + if(user == src) + check_self_injuries() + return TRUE + if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !on_fire && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) + if (performing_cpr) + performing_cpr = FALSE + else + performing_cpr = TRUE + start_compressions(user, TRUE) + return TRUE + return ..() /mob/living/human/default_disarm_interaction(mob/user) var/decl/species/user_species = user.get_species() From 03f18a3f17e1515c08bfcf7d62cf2b4d2cdc54ea Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 22 Nov 2024 18:10:41 -0500 Subject: [PATCH 08/42] Make clicking the health doll examine yourself for injuries --- code/_onclick/hud/screen/screen_warnings.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/_onclick/hud/screen/screen_warnings.dm b/code/_onclick/hud/screen/screen_warnings.dm index 842f93677d1a..d89eb94e10b2 100644 --- a/code/_onclick/hud/screen/screen_warnings.dm +++ b/code/_onclick/hud/screen/screen_warnings.dm @@ -8,6 +8,12 @@ icon_state = "health0" screen_loc = ui_health +/obj/screen/health_warning/handle_click(mob/user, params) + if(ishuman(user)) + var/mob/living/human/human_user = user + human_user.check_self_injuries() + return TRUE + /obj/screen/warning_cells name = "cell" icon_state = "charge-empty" From da7c7677d80ea7f5888928d52518df19e28e6bef Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 24 Nov 2024 12:51:46 +1100 Subject: [PATCH 09/42] Implementing Doe's new banners. --- code/game/objects/structures/banners.dm | 128 ++++++++++++++++-- .../stack_recipes/recipes_textiles.dm | 21 +++ icons/obj/banner.dmi | Bin 679 -> 0 bytes icons/obj/banner_woven.dmi | Bin 694 -> 0 bytes icons/obj/items/banners/banner.dmi | Bin 0 -> 704 bytes icons/obj/items/banners/banner_forked.dmi | Bin 0 -> 700 bytes icons/obj/items/banners/banner_pointed.dmi | Bin 0 -> 703 bytes icons/obj/items/banners/banner_rounded.dmi | Bin 0 -> 765 bytes icons/obj/items/banners/banner_square.dmi | Bin 0 -> 687 bytes icons/obj/items/banners/banner_symbols.dmi | Bin 0 -> 3245 bytes icons/obj/items/banners/banner_tasselled.dmi | Bin 0 -> 743 bytes icons/obj/items/banners/banner_woven.dmi | Bin 0 -> 728 bytes icons/obj/structures/banner_frame.dmi | Bin 483 -> 641 bytes 13 files changed, 137 insertions(+), 12 deletions(-) delete mode 100644 icons/obj/banner.dmi delete mode 100644 icons/obj/banner_woven.dmi create mode 100644 icons/obj/items/banners/banner.dmi create mode 100644 icons/obj/items/banners/banner_forked.dmi create mode 100644 icons/obj/items/banners/banner_pointed.dmi create mode 100644 icons/obj/items/banners/banner_rounded.dmi create mode 100644 icons/obj/items/banners/banner_square.dmi create mode 100644 icons/obj/items/banners/banner_symbols.dmi create mode 100644 icons/obj/items/banners/banner_tasselled.dmi create mode 100644 icons/obj/items/banners/banner_woven.dmi diff --git a/code/game/objects/structures/banners.dm b/code/game/objects/structures/banners.dm index 11f37de7bfd0..21f09be9f6e4 100644 --- a/code/game/objects/structures/banners.dm +++ b/code/game/objects/structures/banners.dm @@ -14,10 +14,14 @@ tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR max_health = 50 + var/force_south_facing = TRUE var/base_icon_state = "banner_stand" /// Reference to any banner currently hung on the frame. var/obj/item/banner/banner +/obj/structure/banner_frame/set_dir(ndir) + return ..(force_south_facing ? SOUTH : ndir) + /obj/structure/banner_frame/Initialize(ml, _mat, _reinf_mat) if(ispath(banner)) set_banner(new banner(src)) @@ -64,38 +68,116 @@ /obj/structure/banner_frame/on_update_icon() . = ..() + icon_state = base_icon_state - if(istype(banner)) - var/image/I = image(banner.icon, "banner_base") + if(!istype(banner)) + return + + var/image/I = image(banner.icon, "[banner.icon_state]-hanging") + I.appearance_flags |= RESET_COLOR + I.color = banner.color + add_overlay(I) + + if(banner.trim_color) + I = image(banner.icon, "[banner.icon_state]-trim") + I.appearance_flags |= RESET_COLOR + I.color = banner.trim_color + add_overlay(I) + + for(var/decal in banner.decals) + I = image(banner.decal_icon, decal) I.appearance_flags |= RESET_COLOR - I.color = banner.color + I.color = banner.decals[decal] add_overlay(I) - for(var/decal in banner.decals) - I = image(banner.icon, decal) - I.appearance_flags |= RESET_COLOR - I.color = banner.decals[decal] - add_overlay(I) /obj/structure/banner_frame/Destroy() if(istype(banner)) QDEL_NULL(banner) return ..() +var/global/list/_banner_decals = list() + /obj/item/banner name = "banner" desc = "A furled-up banner." - icon = 'icons/obj/banner.dmi' + icon = 'icons/obj/items/banners/banner.dmi' icon_state = "banner" material = /decl/material/solid/organic/cloth color = /decl/material/solid/organic/cloth::color max_health = 20 material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME w_class = ITEM_SIZE_NORMAL - var/hung_desc = "The banner is rather plain, with no markings." + var/hung_desc = "The banner is rather unremarkable." + var/name_prefix + var/decal_icon = 'icons/obj/items/banners/banner_symbols.dmi' var/list/decals + var/trim_color + +// TODO: PROPER EMBROIDERY AND ITEM DECORATION. +/obj/item/banner/attackby(obj/item/used_item, mob/user) + + if(istype(used_item, /obj/item/stack/material/thread)) + + if((!decal_icon || length(decals)) && trim_color) + to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) + return TRUE + + var/obj/item/stack/material/thread/used_stack = used_item + if(used_stack.get_amount() < 5) + to_chat(user, SPAN_WARNING("You need at least five lengths of thread to embroider a banner.")) + return TRUE + + if(!trim_color) + user.visible_message("\The [user] sews a trim onto \the [src].") + trim_color = used_item.color + used_stack.use(5) + return TRUE + + if(decal_icon && !length(decals)) + if(!global._banner_decals[decal_icon]) + global._banner_decals[decal_icon] = icon_states(decal_icon) + var/decal_color = used_item.color + var/decal_to_sew = input(user, "Which symbol do you wish to add to \the [src]?", "Banner Symbol") as null|anything in global._banner_decals[decal_icon] + if(decal_to_sew && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item && used_stack.use(5)) + decals[decal_to_sew] = decal_color + return TRUE + + . = ..() + +// 'woven grass banner', 'forked linen banner' +/obj/item/banner/update_name() + . = ..() + SetName("[name_prefix] [name]") + +/obj/item/banner/forked + name_prefix = "forked" + hung_desc = "The banner splits into two tails at the bottom." + icon = 'icons/obj/items/banners/banner_forked.dmi' + decal_icon = null // Current decals do not work nicely with the fork + +/obj/item/banner/pointed + name_prefix = "pointed" + hung_desc = "The banner narrows to a point at the bottom." + icon = 'icons/obj/items/banners/banner_pointed.dmi' + +/obj/item/banner/rounded + name_prefix = "rounded" + hung_desc = "The banner has a rounded lower edge." + icon = 'icons/obj/items/banners/banner_rounded.dmi' + +/obj/item/banner/square + name_prefix = "square" + hung_desc = "The banner has a squared-off lower edge." + icon = 'icons/obj/items/banners/banner_square.dmi' + +/obj/item/banner/tasselled + name_prefix = "tasselled" + hung_desc = "The banner has several dangling tassels at the bottom." + icon = 'icons/obj/items/banners/banner_tasselled.dmi' /obj/item/banner/woven - icon = 'icons/obj/banner_woven.dmi' + name_prefix = "woven" + icon = 'icons/obj/items/banners/banner_woven.dmi' material = /decl/material/solid/organic/plantmatter/grass/dry color = /decl/material/solid/organic/plantmatter/grass/dry::color material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC @@ -136,6 +218,7 @@ icon_state = "banner_hanging_preview" base_icon_state = "banner_hanging" directional_offset = @'{"NORTH":{"y":-32},"SOUTH":{"y":-32},"EAST":{"x":-32},"WEST":{"x":-32}}' + force_south_facing = FALSE /obj/structure/banner_frame/wall/ebony material = /decl/material/solid/organic/wood/ebony @@ -155,4 +238,25 @@ /obj/structure/banner_frame/wall/ebony/woven banner = /obj/item/banner/woven - color = /obj/item/banner/woven::color \ No newline at end of file + color = /obj/item/banner/woven::color + +// Debug item. +/obj/structure/banner_frame/random/Initialize(ml, _mat, _reinf_mat) + . = ..() + var/banner_type = pick(list( + /obj/item/banner/pointed, + /obj/item/banner/rounded, + /obj/item/banner/square, + /obj/item/banner/tasselled, + /obj/item/banner/woven + )) + banner = new banner_type(src) + banner.set_color(get_random_colour()) + banner.trim_color = get_random_colour() + if(banner.decal_icon) + if(!global._banner_decals[banner.decal_icon]) + global._banner_decals[banner.decal_icon] = icon_states(banner.decal_icon) + var/decal = pick(global._banner_decals[banner.decal_icon]) + var/decal_color = get_random_colour() + LAZYSET(banner.decals, decal, decal_color) + update_icon() diff --git a/code/modules/crafting/stack_recipes/recipes_textiles.dm b/code/modules/crafting/stack_recipes/recipes_textiles.dm index ee608b17555b..c43dffe7ce14 100644 --- a/code/modules/crafting/stack_recipes/recipes_textiles.dm +++ b/code/modules/crafting/stack_recipes/recipes_textiles.dm @@ -12,11 +12,32 @@ category = "clothing" /decl/stack_recipe/textiles/banner + name = "banner" result_type = /obj/item/banner category = "furniture" crafting_extra_cost_factor = 1.1 // less material is lost because it's relatively simple difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making actual clothing. +/decl/stack_recipe/textiles/banner/forked + name = "banner, forked" + result_type = /obj/item/banner/forked + +/decl/stack_recipe/textiles/banner/pointed + name = "banner, pointed" + result_type = /obj/item/banner/pointed + +/decl/stack_recipe/textiles/banner/rounded + name = "banner, rounded" + result_type = /obj/item/banner/rounded + +/decl/stack_recipe/textiles/banner/square + name = "banner, square" + result_type = /obj/item/banner/square + +/decl/stack_recipe/textiles/banner/tasselled + name = "banner, tasselled" + result_type = /obj/item/banner/tasselled + /decl/stack_recipe/textiles/sack result_type = /obj/item/bag/sack category = "storage" diff --git a/icons/obj/banner.dmi b/icons/obj/banner.dmi deleted file mode 100644 index fdcb38c72c6f6cff486635460577960075421cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmV;Y0$BZtP)gwvz(b1lsp1Zrd-rnBm=;*7ftH8j(?d|QMp`lz{T(GdPzP`Ssq@=^c!vN;< z5dZ)H0d!JMQvg8b*k%9#0CRd&Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1ZAnByR7i=vu8$wl1gwPljqk!1(b=Am^|U#Q3OK$(PjyWo(-nt*X7h<1jTrg?1|tsw{=$bg|xN;w?y4JBQjx!Fo#$+K3V8lR7i z`zfU#7qFJ2564Tlymy-G%_7VNtVMye0kw#1z^V`IE^sjk zKT9D^ASlRTsQuu21u2qtP7hNmpi(l{-}=vsHDAW?K0OZ6aoRje&cW<=PXWv06byd0 ztO`a6Eb(9%M_c|_cAXGLbD25MW`_Oz-LRJ*dSUqP& z+|10(>gwvz(b1lsp6KZ4tE;QPz`*V8?V+KeTwGkRu&}V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ> zRWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DJd~8FSSUCi!&v&s2C_<$i;?cy$0v`Yd3p2z00DwYL_t(YiOrPZa)Tfcgd=dI zP|u{&AU0{!_kYSBpb=0rqn+vWqL@GXu`C>i!{1ev)Gje&*|3e`H3@(|Y@3Uq@KQct z*v4fHu1Uyw^uN_X6nQxx64(JCE%yZeEJFbxmH})~2Lf9G2zh)_T1uD!qWk1s%s{Bu z8nMxMlJa~$1Hc3bt51Im03lH|S|e)x*0$KT#=rx>viTPs2(20t2gJLs>EA`#)Iz$3 zxn7{cCWtW(EuzT*8KWxYa@6{70Ch&1G=wJ^3e+mdlt++{K)N(WX4|luAuV3}XPB7= z`g8`LU{J-4>8GK c$p2^k07~By4jC2ii~s-t07*qoM6N<$f-eG7wEzGB diff --git a/icons/obj/items/banners/banner.dmi b/icons/obj/items/banners/banner.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7edc1596436d869c47ba263fbc7c9849d8f8d4c5 GIT binary patch literal 704 zcmV;x0zdtUP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq19V=A~!mr6W|E z;8R^vl$nc5sj`Brp9|Q%0ESUCw;^cOQUCw}#z{m$R9J=WR!eTfAQS{#b)6_afQwP2 z?wr^Mi0voT1M~zI;sm|F`uI3eoPwcJx~V4%2W5ug8Qu^=HdxTwK8m+w!O0`t!6E9v z+Uokf7#zkJUwlsWRUnksTB$lB5MRjPyl$-kBnmV{9GEl|0N{;vFnk?zINB*u1(zfT zZV3uMqDra3@wL=y7@7nJuC!FzX*gN0fg#_~_24)w4s2?VZbm8WOIoc#z-X#aFimdG zwHlZJIG=GsA*=zRzJ}mgG74zhednj7-k}c(2;;*C9{?IZ?pzH`P=K$NzoW@KDxJeF zB0x!f<>Q(ZBD|tUoTQX}Y($m63TlfPlZQ$Q>CT=w|BZS9?N!1liTp}4r`GDXf9 z1qag#0QZShc!y<9m98yI(`{)E$b_aa{ha3TVzOmNO=4V<9GHpk(PmPW?4ZX^XE~_e zhFFF}Uq0I*w}v0z67|F7Sqkn0^}}U42X~ruZo*}H2G0^HonU!i1Wzm87l!|EUj+NX z+!y3^yDv8UYtUPN#Q&SkV7Csel3n__p;PhF%qf;C*v+Aoim}V%=L`D0n*T!Z^rEx( mA$zB@&QkVi&F+T{zsEPo(V#NQw;DD80000_YP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq19V=A~!mr6W|E z;8R^vl$nc5sj`Brp9|Q%0ESUCw;^cOQUCw}!bwCyR9J=Wm2GarAPk1d#{sCC17rkE z+P}2)07;6_4zLqMh!gDonhnXaWP-w^O8bFZ#fs#YCk7i6lFeGtSy#P83oeVr6PyJJ zrD!+73mjsm@ zq6o|eX!!Bg5?l^mf{QoG=xORB2uvHLjngplIENDAUAUQC%mYF>i&wXz;&ziB=D_70 zv(R#$-I_?izb}W9OL@J*f}Hnc$w7--;2cmPg*e@oC4n%KLIuvDWYasFr0f>~*OZVZ zbkc;eH-M0pfOT4gY6&IX8V}V<(KYcMH~w@HR#E5Av4U*b{*4u_^T+-;2_Y`DID9T8m%=7lv4Y(s)cauaTpQ`1)yv9g5~vii_~~O(gN?*A&vl% z@GT9vXaZhfh=?ZGWSa!SDtI2jp97B9lwGRDE$tjeEU1K&u5n)cA_Qv5&Wqtl@K>v6 zUikYV&x>r?img9rl%U)?u#LxzP2zW@3TnCzxL5$*M@fKfhQF4m= i(nzk>0000fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq19V=A~!mr6W|E z;8R^vl$nc5sj`Brp9|Q%0ESUCw;^cOQUCw}#Ysd#R9J=Wl~HbkFbsx)>;S9E0a%DC z?Tr-<&{8Yf0d@iug4+z!NA81Cc{3aD;SOZsS1sAsp z1Je}dtcmc&|1gNs!wVAZ=)fyg1ZtA0ZY}~o^mQP<2P;k6O|2JmoBoKzc~Bd%>!|w>#{|T z5Hj{~>v6Au5^SY4jB@+91 zM{M7VP5)c5{fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq19V=A~!mr6W|E z;8R^vl$nc5sj`Brp9|Q%0ESUCw;^cOQUCw~14%?dR9J=WRZDK9Fc1ZUW<5=#S$7PI zlpO&MkkBP-4v+&ROvxvh`zz%SWH2d$N9t90t!^4zkLN1aCrJ)i6s^68_UBH*dBR>o z(RyqVM0c70_q9i}VPC(D)vTbDCa7UUq5i8iN?CPQ0g&twfmaarod6)4eG2!^LTPxS zyUZ(GS$k>ikv{c>Zd0%DyltkDvVr^YPcFN5XRBRC9{M-oX?^LXj{Z;&IKDLK1h}UU3coIz^7mo zctRrN@LLY>kqWP)FV?8yn(aN!eVrGj$|A$i2NFLo5-w6~rQ z9JnP4e-%MOo*t)v=hI@L_t!kg_!d0l4Ao+RQz#K_m3As9PgX%G(>JKu<35F)dJ%P| zo?6V)Vj=Ul;k*#ki=eU7uJt6EPxoLMzW;*v$A@%%lUI;TFu68yo6};D>&radF zTq`7{TMruvuTZ?2-_^WeeMmA(Sj`JINtm`IPk5pQ6HaUqXIchHNJmWu8ZuqwfFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq19V=A~!mr6W|E z;8R^vl$nc5sj`Brp9|Q%0ESUCw;^cOQUCw}wMj%lR9J=Wl~HbkFbswR^a7|o01MHi zz0uMG6lz5~z)paooM89YoH*?S8o{2lr{O+O+W*goiR~!0M~tG4m+FOWIH%wfD6)jI zZ=T<)k>Z}yn~$k|8jSPaJJ)6m<`WfKw|z8#MT3V7p|n8)0J@8Wp!Ye#Yg`gtaAOg4 z6gd2thLZ#7z4dM!I|e~JZ=ENPR@*t0s3*A}NwYyHr~Z{zv?ji!%^VEeLlzFEiPqf8 zp)>%O3od9(rx-bq1Ny$crX{!cq15BM9svlTij+gHTD5*dNV+MIfEE}s2DG#fy{c-k z*1~Yi8fJ0Eq=t^K4-T0g9YXycdvKyib;Um~8oDk!uzs#^tY?2zH@Yr+`~t~wg!#Ov z5@9(-PR`LBvv%IiYXm$b;!juS8W!PzqooS~?{7Q;PVajFc+VyvA^`XVLi6?vkN+H*{`fgoJ8(T7 zJo@HWo|Ns9fFDZ*Bkpc$}4!K~4iP3`N(IQ$+0^L1D`VwW_*k@8C&1 z6Kg_ToTRxvDG0Gb9(Lc-`%b3`||K;hDN@GUOey25Rm3j zzKdL-V3(UNWUP|Q#tfb$-;HLN1m5wkpMJ>+C8SSHf&4IwEVnqnj9MLxF zVO_wRu-@ErOAW-^AG_+P*Z=VWlGigf7M)rW>l<<;E~2-tUR4%8Dn(E+7Jd99^`Qg= zJ%vXU{b#8}lpbRh?Wy^q|u6~Os1^rc84Q5v{NL+S%=N74vsM;a|INHvmHxYkJFIyRCbU5X$; z{)5y(nv_?i4Um5<;%L{m7De)TXC2=q`~l|$jw1Q^_((3_K9UG|JRXndCjq`S`^^P7 zNCl*rz*H6wc<^}=eZnq?g4p%}7EvJG<&aYSyU`Y$A_~ZFuD@uT!di2&!=+jG;0uMgBA_G%qaeHHuysGpm`L-Y|uQ4UuY%y zg7csoP#)t-0<*#Y0>-r%-Lw>YJRXn73=tpP6+Ea}Y$QQ8RWwmP2PzZI^YFmDy`PK0xX|})X%KBy`zec>ITgL2{S|wT%$Of-!CgUv7Iz{GbE}aFWX;mNSSd}J6n?-}5QEb#8 zD$8*worA=wL9-3Q=0T$kA{tGjvxnU_XdcC|mBcuTm4pEKoTJz>4}vhygFsyKpm`+$ zVp&NbI9HOdj&m*ccsw4D$K&yMJkNs8+YrdM%K#3q+#-QvpN7Q}ee_HSPiEY{5erh- z(|HJrinvAxZKzsyUDr6Oc%lNmDTF(k2MjAwt-u>!@)JUi;4Af&{PgG3`gL!{iV&c{ z0EKE}9_j`|VzhJjaJNXtrRMuV^3({o04^kocz|W0cM;Ce&fNv4tAw+By2F~E>>W_3 zLFo2A1zg2m$&F41Y2bt!)xcQys5^UrM@i})B~idtc%H<1Bpr_dgY1NMjUe$!7tq-Q zvre{be=UVsgCqt_GG-0R6GDw})a}-Q*#_t40cHWS4f1)KvKt|&0`n+_{T;+Oim_B< zz%D@q^0}GjL70QnI1iHKiZwILXK7kVU|3cXkH_Qjcsw4D$K&~;fWq@`DgSt50p?hf z&qErvTtxwi#K5hJ+Q_zcurDN_a(w+rxTL&Dwhc%)9>!!9n$15Kmmv{AOD-ls)e*hc0@ zc!!jLsMDMqG)+@#$+=KfSrp)+tv31?qQRuB#tW;f)Z_%o&>|pewc^{hDTJ$nFfNse zq|L@3Bp?DdVaP8`hN0=8tXYFa*G2lN;5D-byVI`Q)L?&c3+U9K*#^tFE8RXLrNLRi z4Gq$)Ji0?zk;?|nqnN}EAVhT5U=!eYLxa0|nm|*%eH5GLK_o-F_ihm*E>!-_QGA3= zGmd%CypoVafXc5PW9+noLHWNTu)9RQB9L{+)%#b8_ie>&Cx3E5SMjkXk0NNL^9v0Oq_z|^j9<3m;=Vmz+*!&l>ZGPH#kj%%@U zIRXTfgF4uk>l@P%<$^j37{#Rghm+nGTE^Ud7K~5QeRgvihW&x|d9InufOtTh0v@nn z2YMlaw#6&EFm7#K%%*7Xj*W`;^$_5E?AOt6>@fFF;Ot|8_CgTS>tRaAux(kb83)@^K@a;Q8NbGmQ7olk95vsc%RpM{Y>kMr0>-M>A5ZIlz~ix+XjsqMCG}x ztTs60HFwX1QywV|7K3ID<0TjFX+YWFEarv{qLLE(G&u0tyj&HKeXU%yV=uJ)hiP!n zgXU4JeBcfTC)Vc<9kv{B-e?JEB{9!~=ujPAe5+?t~c74!K<$LvT`YGh1z;@@##a;tHOYTcajZTcYNC7UX!0wZowd*C4pgF zYQZ1a@%}%L$K&yMJRXndf0I|Q-oAVFB`YB4wy=h`S8kDD`>57Oq)3Dmu0lS#FEls7 zH?PpEZ=6DW^V?50+CDY?H17y_M98ASeObG`_%;pN z;x83AfxMD#v_V8BKm#o{SZ;c(o&xzZhItgj8fY2C^xrSxaWcwyO<~Hd?%|lHwa6T zuuq)vI9V8}1{R@qd*1_b9;Fvn7K0YQ$J*r1ZRSIArv$uDv=^Z3B)(nU&IHO|%+Egz9?Zk17=ON>bmc{E%SRO<1`I2(X6dazBs%!l`K^oAdy z@H2Gvpk6Qb*FC5t&5RE^Jo)Ou=kpA0(<$6<^xF!yzo_6araweM)Z4G_S{`C3fv+5V zS~ny-FPC+HVf#_Le-Nm_vMtr&*7@7d7ZCJ3$0((`T8;CK#z3?(t67~tp80(F=-}>Q zw13oKuctxm>J|;wd-oWz*dT0V-eQB~0tiqvk78gY&mYAwZ1W(58|Fb6ww2^Zfo(1J fcsw4@|119i++3K#GT_|^00000NkvXXu0mjfmiI%k literal 0 HcmV?d00001 diff --git a/icons/obj/items/banners/banner_tasselled.dmi b/icons/obj/items/banners/banner_tasselled.dmi new file mode 100644 index 0000000000000000000000000000000000000000..271fbce4232c567ea6db69d9e19c3e0d18aca9a5 GIT binary patch literal 743 zcmV?P)rW61G00DGTPE!Ct=GbNc004e^R9JLG zWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq19V=A~!mr6W|E z;8R^vl$nc5sj`Brp9|Q%0ESUCw;^cOQUCw}?MXyIR9J=WS5c0GAP`0I0Ill*6ng+F z#AN?WA!HA*H;{0Gy?=H9>qadooBh}iUt6j1y?F(OnG~TD4%x+z*TaIQwnNh#7V!Ig z4FVH7f6s*=C~w6h#^;}7Hw(BHj7i-^1pLbw%~(gAKq_P35eKZ4F-A(sYUf}qVh+9K z8&Jt%a}}Y=^NliEi28s7(?)6IH4N>~0R!LDjqscu2RxGAM^xM` z((W9%eAroNIgUQ&-W)KOvTY$C=gt7K$U6pe$tolv*V_~_`th-f{|IhaAe+P#81T2OUsv#~JssA9KXXW)Lui#U z?uKGh{zLnaxn_*E{UW&26$J&|_KQ$1LBF7sZu>XF#EIDXc#Zbw z1jhbJEKm&oa~!scr0`LJP?7<%l`u(wh9ZrR%ZBc={Q1NSQgXH?pNA8_ Z$2Z0FjUaH;k3s+d002ovPDHLkV1iQ$PrCpB literal 0 HcmV?d00001 diff --git a/icons/obj/items/banners/banner_woven.dmi b/icons/obj/items/banners/banner_woven.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4178722e7b0506c1e8cdfdb70f39e61519b510c0 GIT binary patch literal 728 zcmV;}0w?{6P)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq19V=A~!mr6W|E z;8R^vl$nc5sj`Brp9|Q%0ESUCw;^cOQUCw}-bqA3R9J=WRzYrqFc35*>N!z(05w*m z-bmm90ajKY&=*7&FX;c(UE3rI$i}XeUdnJFR(3oL_Ksm}gF#lATmBwRI6K5ESOgV# zQ{I2)y~Pl!mtVK)PLO)UOIHDc{2rASqG}8Q)QA@Z6u2S)fT)eaXe0s(Cxrz_8R2Rb z4BxLHlvWBEdX#012dX#a(D!wO2SLROjD}$A9=N9Is6zF&X2k=)H7BE?l{7DD)q{jV z05afqvvaO_;1b|+!3m`_0xWYLynBfl&@_kEO_@0losYn{=s!gdP`hz!J=9(TzFP5t zBGafK4B1%x-CwDqNUEMpW_sE)cO02BIz2Xz$qUGlSyTq z0#?G%V$6<_3Y7X?LCGJffEH9&=p+x&6_DgX53Ne_KyPW`A#=m|Uh=L(=7#fh_O3K* z?S%96^zJ2ASi=0g@a|STFQ|TTUU>U~&I|UoofjMaHL^#4gul%u@J9!h(JI~4(6QLn zQ;NkB_ERXuVrbLq(+ORg=f5Dl+;s9fB(HSRUP|7r$^Ee5_xJ$=@0eQB+M+-J0000< KMNUMnLSTZpC{mOF literal 0 HcmV?d00001 diff --git a/icons/obj/structures/banner_frame.dmi b/icons/obj/structures/banner_frame.dmi index 986bf0821e7009de1461d786cfdd6554f1aa951f..7379e9201d2e9ff902dfb4f57cae4fdfe9084128 100644 GIT binary patch delta 542 zcmV+(0^$AR1AzroiBL{Q4GJ0x0000DNk~Le0001h0001B1Oos704G#udH?_b6;Mo6 zMZmzoNk?2|Vs?s(p2ES&|NsBMz`%ovaBlzr00DGTPE!Ct=GbNc0054WN^gG=%1!Vp z2b&#VP?TDhnOaVw9hlls?NU~7^>YDx8~}Y}P3`qaV_*OP0f0$FK~z|U?N(cIgdh+U zynwI#18e?Q-5fxJ2S`Qkf0YF_TLN1;I!RfZqQ7j#o(7?vC<@RZV!ogp#68feo>0{w z?mOTQfcT6oiB>287q&(L;C6q>a<@Q?bwGoIUw82S`VRIB{67aLd2oG&8^Iu!{>w! z$jz;*C2$**Qo~RKxpBZO0om&TN_Ig0#DRIP78Td|UpNSBaQ+&Qd5(V-kb4fuT%iSW z&p}j9b7WBNI*5v?LIUNU10n~F7R=o|(EsYb?^_1vP9m8R(t5thiI=aO?c**&zYzL` z*Tu5;_0I+X%kJAdoe=O;h_P@cM4D}leuDTSrOeDxm$JTYkM}@}DW(cHZQu^{o03tJ zcLyDqtWJnY+=CAEn|(qzX8v&psw)-B!O)IB4TOWXINJes4bWc!w-3-e5q%brrxBe8 g=tM$iV!&bC0X3P?`?cL_-2eap07*qoM6N<$f}7~=rT_o{ delta 383 zcmV-_0f7F21>*xsiBL{Q4GJ0x0000DNk~Le0000$0000$0s{a50M`eZO#lD@3{Xr| zMZmzo-QC^)|NpYGvdjE5Bme*a0d!JMQvg8b*k%9#0Ev-PZ-0qZ4mLZ!peVI0Gqs#V zI|yl0R&e!m0ec((dyq}%gb0Ys0002+Nklb<83Y+7(>3?W8y?f6tp4RBcX!fJ=z{Edq{KXdzCPM1hFWb|*ug8%jzWUB!KS))g ziQ+7@Y)ynH6qAWCzwD05M4*p1NhWeFD{V~V!c2{c{KUL%OoWoTN+tr|BALU9tUJ`^ zLyZOVzBZ9{7phI*!o2h1%)IoXdz2SaR^){)_Uc7(oGiCqOoTqY2&&18jHLDg-(P)^ dH+_G*A6H9!)U*7ux5NMd002ovPDHLkV1iM~ss#W5 From 5a846bf3459485582fb5047c84967071e4527436 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 25 Nov 2024 00:53:53 +0000 Subject: [PATCH 10/42] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 35c3254d6205..b65c2e11537e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -119,12 +119,6 @@

    Pg$uDA5-fZ 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