From 16fddbb1401993856d9360f08303ea263eacf237 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 18 Mar 2022 18:35:29 -0300 Subject: [PATCH] Upload files --- code/_onclick/hud/radial.dm | 3 + code/controllers/subsystem/materials.dm | 2 +- code/datums/components/squeak.dm | 2 + code/datums/elements/art.dm | 17 +- code/datums/progressbar.dm | 164 +++++-- .../objects/items/stacks/sheets/mineral.dm | 18 - code/game/objects/structures/statues.dm | 448 +++++++++++++++--- .../autolathe_designs_tools.dm | 8 + .../lavalandruin_code/elephantgraveyard.dm | 9 +- icons/obj/statue.dmi | Bin 21597 -> 25765 bytes sound/items/handling/screwdriver_drop.ogg | Bin 0 -> 7332 bytes sound/items/handling/screwdriver_pickup.ogg | Bin 0 -> 6988 bytes 12 files changed, 516 insertions(+), 155 deletions(-) create mode 100644 sound/items/handling/screwdriver_drop.ogg create mode 100644 sound/items/handling/screwdriver_pickup.ogg diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 3cce288e67..0070362f8b 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -194,6 +194,9 @@ GLOBAL_LIST_EMPTY(radial_menus) else if(istext(choices_values[choice_id])) E.name = choices_values[choice_id] + else if(ispath(choices_values[choice_id],/atom)) + var/atom/A = choices_values[choice_id] + E.name = initial(A.name) else var/atom/movable/AM = choices_values[choice_id] //Movables only E.name = AM.name diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index 2134be0176..d8362ea0d1 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(materials) ) ///List of stackcrafting recipes for materials using rigid recipes var/list/rigid_stack_recipes = list( - // new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), + new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), ) ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index a285b7d3f2..faca18caff 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -42,6 +42,8 @@ RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop) if(istype(parent, /obj/item/clothing/shoes)) RegisterSignal(parent, COMSIG_SHOES_STEP_ACTION, .proc/step_squeak) + else if(isstructure(parent)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/use_squeak) override_squeak_sounds = custom_sounds if(chance_override) diff --git a/code/datums/elements/art.dm b/code/datums/elements/art.dm index 960d22af56..47908a2e2d 100644 --- a/code/datums/elements/art.dm +++ b/code/datums/elements/art.dm @@ -54,11 +54,14 @@ /datum/element/art/rev -/datum/element/art/rev/apply_moodlet(atom/source, mob/M, impress) - M.visible_message("[M] stops to inspect [source].", \ - "You take in [source], inspecting the fine craftsmanship of the proletariat.") - - if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev)) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat) +/datum/element/art/rev/apply_moodlet(atom/source, mob/user, impress) + var/msg + if(user.mind?.has_antag_datum(/datum/antagonist/rev)) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat) + msg = "What \a [pick("masterpiece", "chef-d'oeuvre")] [source.p_theyre()]. So [pick("subversive", "revolutionary", "unitizing", "egalitarian")]!" else - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad) + msg = "Wow, [source.p_they()] sucks." + + user.visible_message(span_notice("[user] stops to inspect [source]."), \ + span_notice("You appraise [source], inspecting the fine craftsmanship of the proletariat... [msg]")) diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index c2e0d3c9d2..b3d7d2d633 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -1,67 +1,139 @@ #define PROGRESSBAR_HEIGHT 6 +#define PROGRESSBAR_ANIMATION_TIME 5 /datum/progressbar - var/goal = 1 + ///The progress bar visual element. var/image/bar - var/shown = 0 + ///The target where this progress bar is applied and where it is shown. + var/atom/bar_loc + ///The mob whose client sees the progress bar. var/mob/user - var/client/client - var/listindex + ///The client seeing the progress bar. + var/client/user_client + ///Effectively the number of steps the progress bar will need to do before reaching completion. + var/goal = 1 + ///Control check to see if the progress was interrupted before reaching its goal. + var/last_progress = 0 + ///Variable to ensure smooth visual stacking on multiple progress bars. + var/listindex = 0 + /datum/progressbar/New(mob/User, goal_number, atom/target) . = ..() if (!istype(target)) - CRASH("Invalid target given") - if (goal_number) - goal = goal_number - bar = image('icons/effects/progessbar.dmi', target, "prog_bar_0", HUD_LAYER) - bar.plane = HUD_PLANE + EXCEPTION("Invalid target given") + if(QDELETED(User) || !istype(User)) + stack_trace("/datum/progressbar created with [isnull(User) ? "null" : "invalid"] user") + qdel(src) + return + if(!isnum(goal_number)) + stack_trace("/datum/progressbar created with [isnull(User) ? "null" : "invalid"] goal_number") + qdel(src) + return + goal = goal_number + bar_loc = target + bar = image('icons/effects/progessbar.dmi', bar_loc, "prog_bar_0") + bar.plane = ABOVE_HUD_PLANE bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA user = User - if(user) - client = user.client - LAZYINITLIST(user.progressbars) - LAZYINITLIST(user.progressbars[bar.loc]) - var/list/bars = user.progressbars[bar.loc] - bars.Add(src) + LAZYADDASSOCLIST(user.progressbars, bar_loc, src) + var/list/bars = user.progressbars[bar_loc] listindex = bars.len - bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)) -/datum/progressbar/proc/update(progress) - if (!user || !user.client) - shown = 0 - return - if (user.client != client) - if (client) - client.images -= bar - if (user.client) - user.client.images += bar + if(user.client) + user_client = user.client + add_prog_bar_image_to_client() - progress = clamp(progress, 0, goal) - bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]" - if (!shown) - user.client.images += bar - shown = 1 - -/datum/progressbar/proc/shiftDown() - --listindex - bar.pixel_y -= PROGRESSBAR_HEIGHT + RegisterSignal(user, COMSIG_PARENT_QDELETING, .proc/on_user_delete) + RegisterSignal(user, COMSIG_MOB_CLIENT_LOGOUT, .proc/clean_user_client) + RegisterSignal(user, COMSIG_MOB_CLIENT_LOGIN, .proc/on_user_login) /datum/progressbar/Destroy() - for(var/I in user.progressbars[bar.loc]) - var/datum/progressbar/P = I - if(P != src && P.listindex > listindex) - P.shiftDown() + if(user) + for(var/pb in user.progressbars[bar_loc]) + var/datum/progressbar/progress_bar = pb + if(progress_bar == src || progress_bar.listindex <= listindex) + continue + progress_bar.listindex-- - var/list/bars = user.progressbars[bar.loc] - bars.Remove(src) - if(!bars.len) - LAZYREMOVE(user.progressbars, bar.loc) + progress_bar.bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) + var/dist_to_travel = 32 + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - PROGRESSBAR_HEIGHT + animate(progress_bar.bar, pixel_y = dist_to_travel, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) - if (client) - client.images -= bar - qdel(bar) - . = ..() + LAZYREMOVEASSOC(user.progressbars, bar_loc, src) + user = null + if(user_client) + clean_user_client() + + bar_loc = null + + if(bar) + QDEL_NULL(bar) + + return ..() + + +///Called right before the user's Destroy() +/datum/progressbar/proc/on_user_delete(datum/source) + SIGNAL_HANDLER + + user.progressbars = null //We can simply nuke the list and stop worrying about updating other prog bars if the user itself is gone. + user = null + qdel(src) + + +///Removes the progress bar image from the user_client and nulls the variable, if it exists. +/datum/progressbar/proc/clean_user_client(datum/source) + SIGNAL_HANDLER + + if(!user_client) //Disconnected, already gone. + return + user_client.images -= bar + user_client = null + + +///Called by user's Login(), it transfers the progress bar image to the new client. +/datum/progressbar/proc/on_user_login(datum/source) + SIGNAL_HANDLER + + if(user_client) + if(user_client == user.client) //If this was not client handling I'd condemn this sanity check. But clients are fickle things. + return + clean_user_client() + if(!user.client) //Clients can vanish at any time, the bastards. + return + user_client = user.client + add_prog_bar_image_to_client() + + +///Adds a smoothly-appearing progress bar image to the player's screen. +/datum/progressbar/proc/add_prog_bar_image_to_client() + bar.pixel_y = 0 + bar.alpha = 0 + user_client.images += bar + animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) + + +///Updates the progress bar image visually. +/datum/progressbar/proc/update(progress) + progress = clamp(progress, 0, goal) + if(progress == last_progress) + return + last_progress = progress + bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]" + + +///Called on progress end, be it successful or a failure. Wraps up things to delete the datum and bar. +/datum/progressbar/proc/end_progress() + if(last_progress != goal) + bar.icon_state = "[bar.icon_state]_fail" + + animate(bar, alpha = 0, time = PROGRESSBAR_ANIMATION_TIME) + + QDEL_IN(src, PROGRESSBAR_ANIMATION_TIME) + + +#undef PROGRESSBAR_ANIMATION_TIME #undef PROGRESSBAR_HEIGHT diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index b2bd394a53..eaf576510e 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -27,7 +27,6 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ new/datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("aesthetic volcanic floor tile", /obj/item/stack/tile/basalt, 2, 2, 4, 20), \ - new/datum/stack_recipe("Assistant Statue", /obj/structure/statue/sandstone/assistant, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = 0, on_floor = 1) \ )) @@ -114,9 +113,6 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ GLOBAL_LIST_INIT(diamond_recipes, list ( \ new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20), \ - new/datum/stack_recipe("Captain Statue", /obj/structure/statue/diamond/captain, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("AI Hologram Statue", /obj/structure/statue/diamond/ai1, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("AI Core Statue", /obj/structure/statue/diamond/ai2, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("diamond ingot", /obj/item/ingot/diamond, 6, time = 100), \ )) @@ -144,8 +140,6 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ GLOBAL_LIST_INIT(uranium_recipes, list ( \ new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20), \ - new/datum/stack_recipe("Nuke Statue", /obj/structure/statue/uranium/nuke, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("Engineer Statue", /obj/structure/statue/uranium/eng, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("uranium ingot", /obj/item/ingot/uranium, 6, time = 100), \ )) @@ -178,7 +172,6 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ GLOBAL_LIST_INIT(plasma_recipes, list ( \ new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \ - new/datum/stack_recipe("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \ // new/datum/stack_recipe("plasma ingot", /obj/item/ingot/plasma, 6, time = 100), \ no )) @@ -218,12 +211,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ GLOBAL_LIST_INIT(gold_recipes, list ( \ new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20), \ - new/datum/stack_recipe("HoS Statue", /obj/structure/statue/gold/hos, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("HoP Statue", /obj/structure/statue/gold/hop, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("CE Statue", /obj/structure/statue/gold/ce, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("RD Statue", /obj/structure/statue/gold/rd, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/crown, 5), \ - new/datum/stack_recipe("CMO Statue", /obj/structure/statue/gold/cmo, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("gold ingot", /obj/item/ingot/gold, 6, time = 100), \ )) @@ -251,11 +239,6 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ GLOBAL_LIST_INIT(silver_recipes, list ( \ new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20), \ - new/datum/stack_recipe("Med Officer Statue", /obj/structure/statue/silver/md, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("Janitor Statue", /obj/structure/statue/silver/janitor, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("Sec Officer Statue", /obj/structure/statue/silver/sec, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("Sec Borg Statue", /obj/structure/statue/silver/secborg, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("Med Borg Statue", /obj/structure/statue/silver/medborg, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("silver ingot", /obj/item/ingot/silver, 6, time = 100), \ )) @@ -282,7 +265,6 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ GLOBAL_LIST_INIT(bananium_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \ - new/datum/stack_recipe("Clown Statue", /obj/structure/statue/bananium/clown, 5, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("hilarious ingot", /obj/item/ingot/bananium, 6, time = 100), \ )) diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 2924545cc1..268838dac9 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -6,43 +6,59 @@ density = TRUE anchored = FALSE max_integrity = 100 - var/oreAmount = 5 - var/material_drop_type = /obj/item/stack/sheet/metal - var/impressiveness = 15 CanAtmosPass = ATMOS_PASS_DENSITY - + /// Beauty component mood modifier + var/impressiveness = 15 + /// Art component subtype added to this statue + var/art_type = /datum/element/art + /// Abstract root type + var/abstract_type = /obj/structure/statue /obj/structure/statue/Initialize() . = ..() - AddElement(/datum/element/art, impressiveness) - addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, impressiveness * 75)), 0) + AddElement(art_type, impressiveness) + AddElement(/datum/element/beauty, impressiveness * 75) + +/obj/structure/statue/ComponentInitialize() + . = ..() + var/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags, null, CALLBACK(src, .proc/can_be_rotated)) + +/obj/structure/statue/proc/can_be_rotated() + if(anchored) + to_chat(user, "[src] cannot be rotated while it is fastened to the floor!") + return FALSE + return TRUE /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) if(!(flags_1 & NODECONSTRUCT_1)) if(default_unfasten_wrench(user, W)) return - if(W.tool_behaviour == TOOL_WELDER || istype(W, /obj/item/gun/energy/plasmacutter)) + if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return FALSE - user.visible_message("[user] is slicing apart the [name].", \ - "You are slicing apart the [name]...") + user.visible_message(span_notice("[user] is slicing apart the [name]."), \ + span_notice("You are slicing apart the [name]...")) if(W.use_tool(src, user, 40, volume=50)) - user.visible_message("[user] slices apart the [name].", \ - "You slice apart the [name]!") + user.visible_message(span_notice("[user] slices apart the [name]."), \ + span_notice("You slice apart the [name]!")) deconstruct(TRUE) return return ..() +/obj/structure/statue/AltClick(mob/user) + return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation + /obj/structure/statue/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) - if(material_drop_type) - var/drop_amt = oreAmount - if(!disassembled) - drop_amt -= 2 - if(drop_amt > 0) - new material_drop_type(get_turf(src), drop_amt) + var/amount_mod = disassembled ? 0 : -2 + for(var/mat in custom_materials) + var/datum/material/custom_material = SSmaterials.GetMaterialRef(mat) + var/amount = max(0,round(custom_materials[mat]/MINERAL_MATERIAL_AMOUNT) + amount_mod) + if(amount > 0) + new custom_material.sheet_type(drop_location(),amount) qdel(src) //////////////////////////////////////STATUES///////////////////////////////////////////////////////////// @@ -51,10 +67,9 @@ /obj/structure/statue/uranium max_integrity = 300 light_range = 2 - material_drop_type = /obj/item/stack/sheet/mineral/uranium - var/last_event = 0 - var/active = null + custom_materials = list(/datum/material/uranium=MINERAL_MATERIAL_AMOUNT*5) impressiveness = 25 // radiation makes an impression + abstract_type = /obj/structure/statue/uranium /obj/structure/statue/uranium/nuke name = "statue of a nuclear fission explosive" @@ -66,39 +81,14 @@ desc = "This statue has a sickening green colour." icon_state = "eng" -/obj/structure/statue/uranium/attackby(obj/item/W, mob/user, params) - radiate() - return ..() - -/obj/structure/statue/uranium/Bumped(atom/movable/AM) - radiate() - ..() - -/obj/structure/statue/uranium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - radiate() - . = ..() - -/obj/structure/statue/uranium/attack_paw(mob/user) - radiate() - . = ..() - -/obj/structure/statue/uranium/proc/radiate() - if(!active) - if(world.time > last_event+15) - active = 1 - radiation_pulse(src, 30) - last_event = world.time - active = null - return - return - ////////////////////////////plasma/////////////////////////////////////////////////////////////////////// /obj/structure/statue/plasma max_integrity = 200 - material_drop_type = /obj/item/stack/sheet/mineral/plasma desc = "This statue is suitably made from plasma." impressiveness = 20 + custom_materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT*5) + abstract_type = /obj/structure/statue/plasma /obj/structure/statue/plasma/scientist name = "statue of a scientist" @@ -108,7 +98,6 @@ if(exposed_temperature > 300) PlasmaBurn(exposed_temperature) - /obj/structure/statue/plasma/bullet_act(obj/item/projectile/Proj) var/burn = FALSE if(!(Proj.nodamage) && Proj.damage_type == BURN && !QDELETED(src)) @@ -136,7 +125,9 @@ /obj/structure/statue/plasma/proc/PlasmaBurn(exposed_temperature) if(QDELETED(src)) return - atmos_spawn_air("plasma=[oreAmount*10];TEMP=[exposed_temperature]") + if(custom_materials[/datum/material/plasma]) + var/plasma_amount = round(custom_materials[/datum/material/plasma]/MINERAL_MATERIAL_AMOUNT) + atmos_spawn_air("plasma=[plasma_amount*10];TEMP=[exposed_temperature]") deconstruct(FALSE) /obj/structure/statue/plasma/proc/ignite(exposed_temperature) @@ -147,9 +138,10 @@ /obj/structure/statue/gold max_integrity = 300 - material_drop_type = /obj/item/stack/sheet/mineral/gold desc = "This is a highly valuable statue made from gold." impressiveness = 30 + custom_materials = list(/datum/material/gold=MINERAL_MATERIAL_AMOUNT*5) + abstract_type = /obj/structure/statue/gold /obj/structure/statue/gold/hos name = "statue of the head of security" @@ -175,9 +167,10 @@ /obj/structure/statue/silver max_integrity = 300 - material_drop_type = /obj/item/stack/sheet/mineral/silver desc = "This is a valuable statue made from silver." impressiveness = 25 + custom_materials = list(/datum/material/silver=MINERAL_MATERIAL_AMOUNT*5) + abstract_type = /obj/structure/statue/silver /obj/structure/statue/silver/md name = "statue of a medical officer" @@ -203,9 +196,10 @@ /obj/structure/statue/diamond max_integrity = 1000 - material_drop_type = /obj/item/stack/sheet/mineral/diamond desc = "This is a very expensive diamond statue." impressiveness = 60 + custom_materials = list(/datum/material/diamond=MINERAL_MATERIAL_AMOUNT*5) + abstract_type = /obj/structure/statue/diamond /obj/structure/statue/diamond/captain name = "statue of THE captain." @@ -223,43 +217,22 @@ /obj/structure/statue/bananium max_integrity = 300 - material_drop_type = /obj/item/stack/sheet/mineral/bananium desc = "A bananium statue with a small engraving:'HOOOOOOONK'." - var/spam_flag = 0 impressiveness = 65 + custom_materials = list(/datum/material/bananium=MINERAL_MATERIAL_AMOUNT*5) + abstract_type = /obj/structure/statue/bananium /obj/structure/statue/bananium/clown name = "statue of a clown" icon_state = "clown" -/obj/structure/statue/bananium/Bumped(atom/movable/AM) - honk() - ..() - -/obj/structure/statue/bananium/attackby(obj/item/W, mob/user, params) - honk() - return ..() - -/obj/structure/statue/bananium/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - honk() - . = ..() - -/obj/structure/statue/bananium/attack_paw(mob/user) - honk() - ..() - -/obj/structure/statue/bananium/proc/honk() - if(!spam_flag) - spam_flag = 1 - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) - spawn(20) - spam_flag = 0 - /////////////////////sandstone///////////////////////////////////////// /obj/structure/statue/sandstone max_integrity = 50 - material_drop_type = /obj/item/stack/sheet/mineral/sandstone + impressiveness = 15 + custom_materials = list(/datum/material/sandstone=MINERAL_MATERIAL_AMOUNT*5) + abstract_type = /obj/structure/statue/sandstone /obj/structure/statue/sandstone/assistant name = "statue of an assistant" @@ -277,9 +250,326 @@ /obj/structure/statue/snow max_integrity = 50 - material_drop_type = /obj/item/stack/sheet/mineral/snow + custom_materials = list(/datum/material/snow=MINERAL_MATERIAL_AMOUNT*5) + abstract_type = /obj/structure/statue/snow /obj/structure/statue/snow/snowman name = "snowman" desc = "Several lumps of snow put together to form a snowman." icon_state = "snowman" + +/obj/structure/statue/snow/snowlegion + name = "snowlegion" + desc = "Looks like that weird kid with the tiger plushie has been round here again." + icon_state = "snowlegion" + +///////////////////////////////bronze/////////////////////////////////// + +/obj/structure/statue/bronze + custom_materials = list(/datum/material/bronze=MINERAL_MATERIAL_AMOUNT*5) + abstract_type = /obj/structure/statue/bronze + +/obj/structure/statue/bronze/marx + name = "\improper Karl Marx bust" + desc = "A bust depicting a certain 19th century economist. You get the feeling a specter is haunting the station." + icon_state = "marx" + art_type = /datum/element/art/rev + +///////////Elder Atmosian/////////////////////////////////////////// +/* Yeah no. +/obj/structure/statue/elder_atmosian + name = "Elder Atmosian" + desc = "A statue of an Elder Atmosian, capable of bending the laws of thermodynamics to their will" + icon_state = "eng" + custom_materials = list(/datum/material/metalhydrogen = MINERAL_MATERIAL_AMOUNT*10) + max_integrity = 1000 + impressiveness = 100 + abstract_type = /obj/structure/statue/elder_atmosian //This one is uncarvable +*/ + +/obj/item/chisel + name = "chisel" + desc = "Breaking and making art since 4000 BC. This one uses advanced technology to allow creation of lifelike moving statues." + icon = 'icons/obj/statue.dmi' + icon_state = "chisel" + item_state = "screwdriver_nuke" + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + flags_1 = CONDUCT_1 + slot_flags = ITEM_SLOT_BELT + force = 5 + w_class = WEIGHT_CLASS_TINY + throwforce = 5 + throw_speed = 3 + throw_range = 5 + custom_materials = list(/datum/material/iron=75) + attack_verb = list("stabs") + hitsound = 'sound/weapons/bladeslice.ogg' + usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') + drop_sound = 'sound/items/handling/screwdriver_drop.ogg' + pickup_sound = 'sound/items/handling/screwdriver_pickup.ogg' + // item_flags = EYE_STAB // don't have it + sharpness = SHARP_POINTY + + /// Block we're currently carving in + var/obj/structure/carving_block/prepared_block + /// If tracked user moves we stop sculpting + var/mob/living/tracked_user + /// Currently sculpting + var/sculpting = FALSE + +/obj/item/chisel/Initialize(mapload) + . = ..() + //AddElement(/datum/element/eyestab) + //AddElement(/datum/element/wall_engraver) + //deals 200 damage to statues, meaning you can actually kill one in ~250 hits + +/obj/item/chisel/ComponentInitialize() + . = ..() + AddComponent(/datum/component/bane, /mob/living/simple_animal/hostile/statue, damage_multiplier = 40) + +/obj/item/chisel/Destroy() + prepared_block = null + tracked_user = null + return ..() + +/* +Hit the block to start +Point with the chisel at the target to choose what to sculpt or hit block to choose from preset statue types. +Hit block again to start sculpting. +Moving interrupts +*/ +/obj/item/chisel/pre_attack(atom/A, mob/living/user, params) + . = ..() + if(sculpting) + return + if(istype(A,/obj/structure/carving_block)) + if(A == prepared_block && (prepared_block.current_target || prepared_block.current_preset_type)) + start_sculpting(user) + else if(!prepared_block) + set_block(A,user) + else if(A == prepared_block) + show_generic_statues_prompt(user) + return TRUE + else if(prepared_block) //We're aiming at something next to us with block prepared + prepared_block.set_target(A,user) + return TRUE + +// We aim at something distant. +/obj/item/chisel/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!proximity_flag && !sculpting && prepared_block && ismovable(target) && prepared_block.completion == 0) + prepared_block.set_target(target,user) + +/obj/item/chisel/proc/start_sculpting(mob/living/user) + to_chat(user,span_notice("You start sculpting [prepared_block]."),type="info") + sculpting = TRUE + //How long whole process takes + var/sculpting_time = 30 SECONDS + //Single interruptible progress period + var/sculpting_period = round(sculpting_time / world.icon_size) //this is just so it reveals pixels line by line for each. + var/interrupted = FALSE + var/remaining_time = sculpting_time - (prepared_block.completion * sculpting_time) + + var/datum/progressbar/total_progress_bar = new(user, sculpting_time, prepared_block ) + while(remaining_time > 0 && !interrupted) + if(do_after(user,sculpting_period, target = prepared_block, progress = FALSE)) + remaining_time -= sculpting_period + prepared_block.set_completion((sculpting_time - remaining_time)/sculpting_time) + total_progress_bar.update(sculpting_time - remaining_time) + else + interrupted = TRUE + total_progress_bar.end_progress() + if(!interrupted && !QDELETED(prepared_block)) + prepared_block.create_statue() + to_chat(user,span_notice("The statue is finished!"),type="info") + break_sculpting() + +/obj/item/chisel/proc/set_block(obj/structure/carving_block/B,mob/living/user) + prepared_block = B + tracked_user = user + RegisterSignal(tracked_user,COMSIG_MOVABLE_MOVED,.proc/break_sculpting) + to_chat(user,span_notice("You prepare to work on [B]."),type="info") + +/obj/item/chisel/dropped(mob/user, silent) + . = ..() + break_sculpting() + +/obj/item/chisel/proc/break_sculpting() + SIGNAL_HANDLER + sculpting = FALSE + if(prepared_block && prepared_block.completion == 0) + prepared_block.reset_target() + prepared_block = null + if(tracked_user) + UnregisterSignal(tracked_user,COMSIG_MOVABLE_MOVED) + tracked_user = null + +/obj/item/chisel/proc/show_generic_statues_prompt(mob/living/user) + var/list/choices = list() + for(var/statue_path in prepared_block.get_possible_statues()) + var/obj/structure/statue/S = statue_path + choices[statue_path] = image(icon=initial(S.icon),icon_state=initial(S.icon_state)) + var/choice = show_radial_menu(user, prepared_block , choices, require_near = TRUE) + if(choice) + prepared_block.current_preset_type = choice + var/image/chosen_looks = choices[choice] + prepared_block.current_target = chosen_looks.appearance + var/obj/structure/statue/S = choice + to_chat(user,span_notice("You decide to sculpt [prepared_block] into [initial(S.name)]."),type="info") + + +/obj/structure/carving_block + name = "block" + desc = "Ready for sculpting." + icon = 'icons/obj/statue.dmi' + icon_state = "block" + material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS | MATERIAL_ADD_PREFIX // MATERIAL_EFFECTS + density = TRUE + material_modifier = 0.5 //50% effectiveness of materials + + /// The thing it will look like - Unmodified resulting statue appearance + var/current_target + /// Currently chosen preset statue type + var/current_preset_type + //Table of required materials for each non-abstract statue type + var/static/list/statue_costs + /// statue completion from 0 to 1.0 + var/completion = 0 + /// Greyscaled target with cutout filter + var/mutable_appearance/target_appearance_with_filters + /// HSV color filters parameters + var/static/list/greyscale_with_value_bump = list(0,0,0, 0,0,0, 0,0,1, 0,0,-0.05) + +/obj/structure/carving_block/Destroy() + current_target = null + target_appearance_with_filters = null + return ..() + +/obj/structure/carving_block/proc/set_target(atom/movable/target,mob/living/user) + if(!is_viable_target(target)) + to_chat(user,"You won't be able to carve that.") + return + if(istype(target,/obj/structure/statue/custom)) + var/obj/structure/statue/custom/original = target + current_target = original.content_ma + else + current_target = target.appearance + var/mutable_appearance/ma = current_target + to_chat(user,span_notice("You decide to sculpt [src] into [ma.name]."),type="info") + +/obj/structure/carving_block/proc/reset_target() + current_target = null + current_preset_type = null + target_appearance_with_filters = null + +/obj/structure/carving_block/update_overlays() + . = ..() + if(!target_appearance_with_filters) + return + //We're only keeping one instance here that changes in the middle so we have to clone it to avoid managed overlay issues + var/mutable_appearance/clone = new(target_appearance_with_filters) + . += clone + +/obj/structure/carving_block/proc/is_viable_target(atom/movable/target) + //Only things on turfs + if(!isturf(target.loc)) + return FALSE + //No big icon things + var/icon/thing_icon = icon(target.icon, target.icon_state) + if(thing_icon.Height() != world.icon_size || thing_icon.Width() != world.icon_size) + return FALSE + return TRUE + +/obj/structure/carving_block/proc/create_statue() + if(current_preset_type) + var/obj/structure/statue/preset_statue = new current_preset_type(get_turf(src)) + preset_statue.set_custom_materials(custom_materials) + qdel(src) + else if(current_target) + var/obj/structure/statue/custom/new_statue = new(get_turf(src)) + new_statue.set_visuals(current_target) + new_statue.set_custom_materials(custom_materials) + var/mutable_appearance/ma = current_target + new_statue.name = "statue of [ma.name]" + new_statue.desc = "A statue depicting [ma.name]." + qdel(src) + +/obj/structure/carving_block/proc/set_completion(value) + if(!current_target) + return + if(!target_appearance_with_filters) + target_appearance_with_filters = new(current_target) + // KEEP_APART in case carving block gets KEEP_TOGETHER from somewhere like material texture filters. + target_appearance_with_filters.appearance_flags |= KEEP_TOGETHER | KEEP_APART + //Doesn't use filter helpers because MAs aren't atoms + target_appearance_with_filters.filters = filter(type="color",color=greyscale_with_value_bump,space=FILTER_COLOR_HSV) + completion = value + var/static/icon/white = icon('icons/effects/alphacolors.dmi', "white") + switch(value) + if(0) + //delete uncovered and reset filters + remove_filter("partial_uncover") + target_appearance_with_filters = null + else + var/mask_offset = min(world.icon_size,round(completion * world.icon_size)) + remove_filter("partial_uncover") + add_filter("partial_uncover", 1, alpha_mask_filter(icon = white, y = -mask_offset)) + target_appearance_with_filters.filters = filter(type="alpha",icon=white,y=-mask_offset,flags=MASK_INVERSE) + update_appearance() + + +/// Returns a list of preset statues carvable from this block depending on the custom materials +/obj/structure/carving_block/proc/get_possible_statues() + . = list() + if(!statue_costs) + statue_costs = build_statue_cost_table() + for(var/statue_path in statue_costs) + var/list/carving_cost = statue_costs[statue_path] + var/enough_materials = TRUE + for(var/required_material in carving_cost) + if(!custom_materials[required_material] || custom_materials[required_material] < carving_cost[required_material]) + enough_materials = FALSE + break + if(enough_materials) + . += statue_path + +/obj/structure/carving_block/proc/build_statue_cost_table() + . = list() + for(var/statue_type in subtypesof(/obj/structure/statue) - /obj/structure/statue/custom) + var/obj/structure/statue/S = new statue_type() + if(!S.icon_state || S.abstract_type == S.type || !S.custom_materials) + continue + .[S.type] = S.custom_materials + qdel(S) + +/obj/structure/statue/custom + name = "custom statue" + icon_state = "base" + obj_flags = CAN_BE_HIT | UNIQUE_RENAME + appearance_flags = TILE_BOUND | PIXEL_SCALE | KEEP_TOGETHER //Added keep together in case targets has weird layering + material_flags = MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS // MATERIAL_EFFECTS + /// primary statue overlay + var/mutable_appearance/content_ma + var/static/list/greyscale_with_value_bump = list(0,0,0, 0,0,0, 0,0,1, 0,0,-0.05) + +/obj/structure/statue/custom/Destroy() + content_ma = null + return ..() + +/obj/structure/statue/custom/proc/set_visuals(model_appearance) + if(content_ma) + QDEL_NULL(content_ma) + content_ma = new + content_ma.appearance = model_appearance + content_ma.pixel_x = 0 + content_ma.pixel_y = 0 + content_ma.alpha = 255 + content_ma.appearance_flags &= ~KEEP_APART //Don't want this + content_ma.filters = filter(type="color",color=greyscale_with_value_bump,space=FILTER_COLOR_HSV) + update_appearance() + +/obj/structure/statue/custom/update_overlays() + . = ..() + if(content_ma) + . += content_ma diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm index bebf836ce0..63442ef1ac 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tools.dm @@ -158,3 +158,11 @@ materials = list(/datum/material/iron = 150, /datum/material/glass = 150) build_path = /obj/item/geiger_counter category = list("initial", "Tools") + +/datum/design/chisel + name = "Chisel" + id = "chisel" + build_type = AUTOLATHE + materials = list(/datum/material/iron = 75) + build_path = /obj/item/chisel + category = list("initial","Tools") diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm index d9dfdd8c19..7dbb509779 100644 --- a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm +++ b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm @@ -3,27 +3,28 @@ /obj/structure/statue/bone anchored = TRUE max_integrity = 120 - material_drop_type = /obj/item/stack/sheet/bone impressiveness = 18 // Carved from the bones of a massive creature, it's going to be a specticle to say the least layer = ABOVE_ALL_MOB_LAYER + custom_materials = list(/datum/material/bone=MINERAL_MATERIAL_AMOUNT*5) + abstract_type = /obj/structure/statue/bone /obj/structure/statue/bone/rib name = "collosal rib" desc = "It's staggering to think that something this big could have lived, let alone died." - oreAmount = 4 + custom_materials = list(/datum/material/bone=MINERAL_MATERIAL_AMOUNT*4) icon = 'icons/obj/statuelarge.dmi' icon_state = "rib" /obj/structure/statue/bone/skull name = "collosal skull" desc = "The gaping maw of a dead, titanic monster." - oreAmount = 12 + custom_materials = list(/datum/material/bone=MINERAL_MATERIAL_AMOUNT*12) icon = 'icons/obj/statuelarge.dmi' icon_state = "skull" /obj/structure/statue/bone/skull/half desc = "The gaping maw of a dead, titanic monster. This one is cracked in half." - oreAmount = 6 + custom_materials = list(/datum/material/bone=MINERAL_MATERIAL_AMOUNT*6) icon = 'icons/obj/statuelarge.dmi' icon_state = "skull-half" diff --git a/icons/obj/statue.dmi b/icons/obj/statue.dmi index 0fe4f7f539eaafca5db53e26082d80f3e5be07d6..48368dda28d876366614fef260e73a0daf5f2f72 100644 GIT binary patch literal 25765 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 literal 21597 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 literal 0 HcmV?d00001 diff --git a/sound/items/handling/screwdriver_pickup.ogg b/sound/items/handling/screwdriver_pickup.ogg new file mode 100644 index 0000000000000000000000000000000000000000..368f1bfd275fa489ca826fb417e913c1f38aac10 GIT binary patch literal 6988 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