From bed7b774a1e9120b8c640ebfd09d2602e3bc68bc Mon Sep 17 00:00:00 2001 From: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com> Date: Sat, 25 Sep 2021 19:30:00 -0400 Subject: [PATCH] glassblowing and ceramics (#8244) * okay * ceramics and glassblowing * forgot this --- .../items/stacks/sheets/sheet_types.dm | 1 + .../modules/primitive_fun/code/ceramics.dm | 177 +++++++++ .../primitive_fun/code/glassblowing.dm | 376 ++++++++++++++++++ .../modules/primitive_fun/icons/prim_fun.dmi | Bin 0 -> 2624 bytes .../modules/primitive_fun/readme.md | 28 ++ .../code/modules/reagent_forging/forge.dm | 92 +++++ .../modules/reagent_forging/water_basin.dm | 6 + .../research/xenoarch/xenoarch_item.dm | 8 +- tgstation.dme | 2 + 9 files changed, 688 insertions(+), 2 deletions(-) create mode 100644 modular_skyrat/modules/primitive_fun/code/ceramics.dm create mode 100644 modular_skyrat/modules/primitive_fun/code/glassblowing.dm create mode 100644 modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi create mode 100644 modular_skyrat/modules/primitive_fun/readme.md diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index b23a8eb86c6..2985925020e 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -134,6 +134,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ //SKYRAT EDIT START: REAGENT FORGING & PRIMITIVE CENTRIFUGE new/datum/stack_recipe("anvil", /obj/structure/reagent_anvil, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("forge", /obj/structure/reagent_forge, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("throwing wheel", /obj/structure/throwing_wheel, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("primitive centrifuge", /obj/item/reagent_containers/glass/primitive_centrifuge, 10) //SKYRAT EDIT STOP: REAGENT FORGING & PRIMITIVE CENTRIFUGE )) diff --git a/modular_skyrat/modules/primitive_fun/code/ceramics.dm b/modular_skyrat/modules/primitive_fun/code/ceramics.dm new file mode 100644 index 00000000000..bbe9ea18295 --- /dev/null +++ b/modular_skyrat/modules/primitive_fun/code/ceramics.dm @@ -0,0 +1,177 @@ +/obj/structure/water_source/puddle/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/stack/ore/glass)) + var/obj/item/stack/ore/glass/glass_item = O + if(!glass_item.use(1)) + return + new /obj/item/ceramic/clay(get_turf(src)) + return + return ..() + +/turf/open/water/attackby(obj/item/C, mob/user, params) + if(istype(C, /obj/item/stack/ore/glass)) + var/obj/item/stack/ore/glass/glass_item = C + if(!glass_item.use(1)) + return + new /obj/item/ceramic/clay(src) + return + return ..() + +/obj/structure/sink/attackby(obj/item/O, mob/living/user, params) + if(istype(O, /obj/item/stack/ore/glass)) + if(dispensedreagent != /datum/reagent/water) + return + if(reagents.total_volume <= 0) + return + var/obj/item/stack/ore/glass/glass_item = O + if(!glass_item.use(1)) + return + new /obj/item/ceramic/clay(src) + return + return ..() + +/obj/item/ceramic + icon = 'modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi' + var/forge_item + +/obj/item/ceramic/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/toy/crayon)) + var/obj/item/toy/crayon/crayon_item = I + if(!forge_item || !crayon_item.paint_color) + return + color = crayon_item.paint_color + to_chat(user, span_notice("You color [src] with [crayon_item]...")) + return + return ..() + +/obj/item/ceramic/clay + name = "clay" + desc = "A pile of clay that can be used to create ceramic artwork." + icon_state = "clay" + +/datum/export/ceramics + cost = 1000 + unit_name = "ceramic product" + export_types = list(/obj/item/plate/ceramic, + /obj/item/reagent_containers/glass/bowl/ceramic, + /obj/item/reagent_containers/glass/beaker/large/ceramic) + +/obj/item/ceramic/plate + name = "ceramic plate" + desc = "A piece of clay that is flat, in the shape of a plate." + icon_state = "clay_plate" + forge_item = /obj/item/plate/ceramic + +/obj/item/plate/ceramic + name = "ceramic plate" + icon = 'modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi' + icon_state = "clay_plate" + +/obj/item/ceramic/bowl + name = "ceramic bowl" + desc = "A piece of clay with a raised lip, in the shape of a bowl." + icon_state = "clay_bowl" + forge_item = /obj/item/reagent_containers/glass/bowl/ceramic + +/obj/item/reagent_containers/glass/bowl/ceramic + name = "ceramic bowl" + icon = 'modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi' + icon_state = "clay_bowl" + custom_materials = null + +/obj/item/ceramic/cup + name = "ceramic cup" + desc = "A piece of clay with high walls, in the shape of a cup. It can hold 120 units." + icon_state = "clay_cup" + forge_item = /obj/item/reagent_containers/glass/beaker/large/ceramic + +/obj/item/reagent_containers/glass/beaker/large/ceramic + name = "ceramic cup" + desc = "A cup that is made from ceramic." + icon = 'modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi' + icon_state = "clay_cup" + custom_materials = null + +/obj/structure/throwing_wheel + name = "throwing wheel" + desc = "A machine that allows you to throw clay." + icon = 'modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi' + icon_state = "throw_wheel_empty" + density = TRUE + anchored = TRUE + var/spinning_speed = 4 SECONDS + var/in_use = FALSE + +/obj/structure/throwing_wheel/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/ceramic/clay)) + if(length(contents) >= 1) + return + if(!do_after(user, spinning_speed, target = src)) + return + I.forceMove(src) + icon_state = "throw_wheel_full" + return + if(I.tool_behaviour == TOOL_CROWBAR) + new /obj/item/stack/sheet/iron/ten(get_turf(src)) + qdel(src) + return + if(I.tool_behaviour == TOOL_WRENCH) + anchored = !anchored + return + return ..() + +/obj/structure/throwing_wheel/proc/use_clay(spawn_type, mob/user) + var/given_message = list( + "You slowly start spinning the throwing wheel...", + "You place your hands on the clay, slowly shaping it...", + "You start becoming satisfied with what you have made...", + "You slowly stop the throwing wheel from spinning...", + "You stop the throwing wheel, admiring your new creation...", + ) + for(var/loop_try in 1 to 5) + if(!do_after(user, spinning_speed, target = src)) + in_use = FALSE + return + to_chat(user, span_notice(given_message[loop_try])) + var/obj/change_obj = new spawn_type(get_turf(src)) + var/atom/movable/get_atom = contents[1] + change_obj.color = get_atom.color + qdel(get_atom) + icon_state = "throw_wheel_empty" + in_use = FALSE + +/obj/structure/throwing_wheel/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(in_use) + return + in_use = TRUE + if(length(contents) >= 1) + var/user_input = tgui_alert(user, "What would you like to do?", "Choice Selection", list("Create", "Remove")) + if(!user_input) + in_use = FALSE + return + switch(user_input) + if("Create") + var/creation_choice = tgui_alert(user, "What you like to create?", "Creation Choice", list("Cup", "Plate", "Bowl")) + if(!creation_choice) + in_use = FALSE + return + switch(creation_choice) + if("Cup") + use_clay(/obj/item/ceramic/cup, user) + if("Plate") + use_clay(/obj/item/ceramic/plate, user) + if("Bowl") + use_clay(/obj/item/ceramic/bowl, user) + return + if("Remove") + if(!do_after(user, spinning_speed, target = src)) + in_use = FALSE + return + var/atom/movable/get_atom = contents[1] + get_atom.forceMove(get_turf(src)) + user.put_in_active_hand(get_atom) + in_use = FALSE + icon_state = "throw_wheel_empty" + return + in_use = FALSE + return diff --git a/modular_skyrat/modules/primitive_fun/code/glassblowing.dm b/modular_skyrat/modules/primitive_fun/code/glassblowing.dm new file mode 100644 index 00000000000..4304101444d --- /dev/null +++ b/modular_skyrat/modules/primitive_fun/code/glassblowing.dm @@ -0,0 +1,376 @@ +/obj/item/glassblowing + icon = 'modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi' + +/obj/item/glassblowing/glass_globe + name = "glass globe" + desc = "A glass bowl that is capable of carrying things." + icon_state = "glass_bowl" + +/datum/export/glassblowing + cost = 1000 + unit_name = "glassblowing product" + export_types = list(/obj/item/glassblowing/glass_lens, + /obj/item/glassblowing/glass_globe, + /obj/item/reagent_containers/glass/bowl/blowing_glass, + /obj/item/reagent_containers/glass/beaker/large/blowing_glass, + /obj/item/plate/blowing_glass) + +/datum/export/glassblowing/sell_object(obj/O, datum/export_report/report, dry_run, apply_elastic = FALSE) //I really dont want them to feel gimped + . = ..() + +/obj/item/glassblowing/glass_lens + name = "glass lens" + desc = "A glass bowl that is capable of carrying things." + icon_state = "glass_bowl" + +/obj/item/reagent_containers/glass/bowl/blowing_glass + name = "glass bowl" + desc = "A glass bowl that is capable of carrying things." + icon = 'modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi' + icon_state = "glass_bowl" + +/obj/item/reagent_containers/glass/beaker/large/blowing_glass + name = "glass cup" + desc = "A glass cup that is capable of carrying liquids." + icon = 'modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi' + icon_state = "glass_cup" + custom_materials = null + +/obj/item/plate/blowing_glass + name = "glass plate" + desc = "A glass plate that is capable of carrying things." + icon = 'modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi' + icon_state = "glass_plate" + +/obj/item/glassblowing/molten_glass + name = "molten glass" + desc = "A glob of molten glass, ready to be shaped into art." + icon_state = "molten_glass" + ///the time check against world.time if its still molten / requires heating up + var/world_molten = 0 + var/list/required_actions = list(0,0,0,0,0) //blowing, spinning, paddles, shears, jacks + var/list/current_actions = list(0,0,0,0,0) + var/chosen_item + +/obj/item/glassblowing/molten_glass/Initialize() + . = ..() + world_molten = world.time + 15 SECONDS + +/obj/item/glassblowing/molten_glass/examine(mob/user) + . = ..() + if(world_molten < world.time) + . += span_notice("[src] has cooled down and will require reheating to modify!") + if(required_actions[1]) + . += "You require [required_actions[1]] blowing actions!" + . += "You currently have [current_actions[1]] blowing actions!" + if(required_actions[2]) + . += "You require [required_actions[2]] spinning actions!" + . += "You currently have [current_actions[2]] spinning actions!" + if(required_actions[3]) + . += "You require [required_actions[3]] paddling actions!" + . += "You currently have [current_actions[3]] paddling actions!" + if(required_actions[4]) + . += "You require [required_actions[4]] shearing actions!" + . += "You currently have [current_actions[4]] shearing actions!" + if(required_actions[5]) + . += "You require [required_actions[5]] jacking actions!" + . += "You currently have [current_actions[5]] jacking actions!" + +/obj/item/glassblowing/molten_glass/pickup(mob/user) + if(!isliving(user)) + return ..() + var/mob/living/living_user = user + if(world_molten >= world.time) + to_chat(living_user, span_warning("You burn your hands trying to pick up [src]!")) + living_user.adjustFireLoss(15) + user.dropItemToGround(src) + return + return ..() + +/obj/item/glassblowing/blowing_rod + name = "blowing rod" + desc = "A tool that is used to hold the molten glass as well as help shape it." + icon_state = "blow_pipe_empty" + var/in_use = FALSE + +/datum/crafting_recipe/glass_blowing_rod + name = "Glass-blowing Blowing Rod" + result = /obj/item/glassblowing/blowing_rod + reqs = list(/obj/item/stack/sheet/iron = 5) + category = CAT_PRIMAL + +/obj/item/glassblowing/blowing_rod/examine(mob/user) + . = ..() + var/obj/item/glassblowing/molten_glass/find_glass = locate() in contents + if(find_glass) + if(find_glass.required_actions[1]) + . += "You require [find_glass.required_actions[1]] blowing actions!" + . += "You currently have [find_glass.current_actions[1]] blowing actions!" + if(find_glass.required_actions[2]) + . += "You require [find_glass.required_actions[2]] spinning actions!" + . += "You currently have [find_glass.current_actions[2]] spinning actions!" + if(find_glass.required_actions[3]) + . += "You require [find_glass.required_actions[3]] paddling actions!" + . += "You currently have [find_glass.current_actions[3]] paddling actions!" + if(find_glass.required_actions[4]) + . += "You require [find_glass.required_actions[4]] shearing actions!" + . += "You currently have [find_glass.current_actions[4]] shearing actions!" + if(find_glass.required_actions[5]) + . += "You require [find_glass.required_actions[5]] jacking actions!" + . += "You currently have [find_glass.current_actions[5]] jacking actions!" + +/obj/item/glassblowing/blowing_rod/proc/check_valid_table() + for(var/obj/structure/table/check_table in range(1, get_turf(src))) + if(!(check_table.resistance_flags & FLAMMABLE)) + return TRUE //if you can find a table that is not flammable, good + return FALSE + +/obj/item/glassblowing/blowing_rod/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag) + return ..() + if(istype(target, /obj/item/glassblowing/molten_glass)) + var/obj/item/glassblowing/molten_glass/attacking_glass = target + var/obj/item/glassblowing/molten_glass/find_glass = locate() in contents + if(find_glass) + to_chat(user, span_warning("[src] already has some glass on it still!")) + return + attacking_glass.forceMove(src) + to_chat(user, span_notice("[src] picks up [target].")) + icon_state = "blow_pipe_full" + return + return ..() + +/obj/item/glassblowing/blowing_rod/attackby(obj/item/I, mob/living/user, params) + var/obj/item/glassblowing/molten_glass/find_glass = locate() in contents + + if(istype(I, /obj/item/glassblowing/molten_glass)) + if(find_glass) + to_chat(user, span_warning("[src] already has some glass on it still!")) + return + I.forceMove(src) + to_chat(user, span_notice("[src] picks up [I].")) + icon_state = "blow_pipe_full" + return + + if(istype(I, /obj/item/glassblowing/paddle)) + if(in_use) + return + in_use = TRUE + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + to_chat(user, span_notice("You begin using [I] on [src].")) + if(!do_after(user, 5 SECONDS, target = src)) + to_chat(user, span_warning("You interrupt an action!")) + in_use = FALSE + return + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + find_glass.current_actions[3]++ + to_chat(user, span_notice("You finish using [I] on [src].")) + in_use = FALSE + return + + if(istype(I, /obj/item/glassblowing/shears)) + if(in_use) + return + in_use = TRUE + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + to_chat(user, span_notice("You begin using [I] on [src].")) + if(!do_after(user, 5 SECONDS, target = src)) + to_chat(user, span_warning("You interrupt an action!")) + in_use = FALSE + return + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + find_glass.current_actions[4]++ + to_chat(user, span_notice("You finish using [I] on [src].")) + in_use = FALSE + return + + if(istype(I, /obj/item/glassblowing/jacks)) + if(in_use) + return + in_use = TRUE + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + to_chat(user, span_notice("You begin using [I] on [src].")) + if(!do_after(user, 5 SECONDS, target = src)) + to_chat(user, span_warning("You interrupt an action!")) + in_use = FALSE + return + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + find_glass.current_actions[5]++ + to_chat(user, span_notice("You finish using [I] on [src].")) + in_use = FALSE + return + + return ..() + +/obj/item/glassblowing/blowing_rod/attack_self(mob/user, modifiers) + var/obj/item/glassblowing/molten_glass/find_glass = locate() in contents + if(find_glass) + if(find_glass.world_molten < world.time) + to_chat(user, span_warning("The glass has cooled down far too much to be handled...")) + return + if(in_use) + to_chat(user, span_warning("[src] is busy being used!")) + return + in_use = TRUE + if(!find_glass.chosen_item) + var/choice = tgui_input_list(user, "What would you like to make?", "Choice Selection", list("Plate", "Bowl", "Globe", "Cup", "Lens")) + if(!choice) + in_use = FALSE + return + switch(choice) + if("Plate") + find_glass.chosen_item = /obj/item/plate/blowing_glass + find_glass.required_actions = list(3,3,3,0,0) //blowing, spinning, paddling + if("Bowl") + find_glass.chosen_item = /obj/item/reagent_containers/glass/bowl/blowing_glass + find_glass.required_actions = list(2,2,2,0,3) //blowing, spinning, paddling + if("Globe") + find_glass.chosen_item = /obj/item/glassblowing/glass_globe + find_glass.required_actions = list(6,3,0,0,0) //blowing, spinning + if("Cup") + find_glass.chosen_item = /obj/item/reagent_containers/glass/beaker/large/blowing_glass + find_glass.required_actions = list(3,3,3,0,0) //blowing, spinning, paddling + if("Lens") + find_glass.chosen_item = /obj/item/glassblowing/glass_lens + find_glass.required_actions = list(0,0,3,3,3) //paddling, shearing, jacking + in_use = FALSE + return + else + var/action_choice = tgui_alert(user, "What would you like to do?", "Action Selection", list("Blow", "Spin", "Remove")) + if(!action_choice) + in_use = FALSE + return + switch(action_choice) + if("Blow") + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + to_chat(user, span_notice("You begin blowing [src].")) + if(!do_after(user, 5 SECONDS, target = src)) + to_chat(user, span_warning("You interrupt an action!")) + in_use = FALSE + return + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + find_glass.current_actions[1]++ + to_chat(user, span_notice("You finish blowing [src].")) + if("Spin") + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + to_chat(user, span_notice("You begin spinning [src].")) + if(!do_after(user, 5 SECONDS, target = src)) + to_chat(user, span_warning("You interrupt an action!")) + in_use = FALSE + return + if(!check_valid_table()) + to_chat(user, span_warning("You must be near a non-flammable table!")) + in_use = FALSE + return + find_glass.current_actions[2]++ + to_chat(user, span_notice("You finish spinning [src].")) + if("Remove") + if(find_glass.current_actions[1] < find_glass.required_actions[1]) + in_use = FALSE + find_glass.forceMove(get_turf(src)) + return + if(find_glass.current_actions[2] < find_glass.required_actions[2]) + in_use = FALSE + find_glass.forceMove(get_turf(src)) + return + if(find_glass.current_actions[3] < find_glass.required_actions[3]) + in_use = FALSE + find_glass.forceMove(get_turf(src)) + return + if(find_glass.current_actions[4] < find_glass.required_actions[4]) + in_use = FALSE + find_glass.forceMove(get_turf(src)) + return + if(find_glass.current_actions[5] < find_glass.required_actions[5]) + in_use = FALSE + find_glass.forceMove(get_turf(src)) + return + new find_glass.chosen_item(get_turf(src)) + in_use = FALSE + qdel(find_glass) + return + in_use = FALSE + return + return ..() + + +/obj/item/glassblowing/jacks + name = "jacks" + desc = "A tool that helps shape glass during the art process." + icon_state = "jacks" + +/datum/crafting_recipe/glass_jack + name = "Glass-blowing Jacks" + result = /obj/item/glassblowing/jacks + reqs = list(/obj/item/stack/sheet/iron = 5) + category = CAT_PRIMAL + +/obj/item/glassblowing/paddle + name = "paddle" + desc = "A tool that helps shape glass during the art process." + icon_state = "paddle" + +/datum/crafting_recipe/glass_paddle + name = "Glass-blowing Paddle" + result = /obj/item/glassblowing/paddle + reqs = list(/obj/item/stack/sheet/iron = 5) + category = CAT_PRIMAL + +/obj/item/glassblowing/shears + name = "shears" + desc = "A tool that helps shape glass during the art process." + icon_state = "shears" + +/datum/crafting_recipe/glass_shears + name = "Glass-blowing Shears" + result = /obj/item/glassblowing/shears + reqs = list(/obj/item/stack/sheet/iron = 5) + category = CAT_PRIMAL + +/obj/item/glassblowing/metal_cup + name = "metal cup" + desc = "A tool that helps shape glass during the art process." + icon_state = "metal_cup_empty" + var/has_sand = FALSE + +/datum/crafting_recipe/glass_metal_cup + name = "Glass-blowing Metal Cup" + result = /obj/item/glassblowing/metal_cup + reqs = list(/obj/item/stack/sheet/iron = 5) + category = CAT_PRIMAL + +/obj/item/glassblowing/metal_cup/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/stack/ore/glass)) + var/obj/item/stack/ore/glass/glass_obj = I + if(!glass_obj.use(1)) + return + has_sand = TRUE + icon_state = "metal_cup_full" + return ..() diff --git a/modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi b/modular_skyrat/modules/primitive_fun/icons/prim_fun.dmi new file mode 100644 index 0000000000000000000000000000000000000000..af9b6be11563dc8a52b04d9872df8d65212cf8a4 GIT binary patch literal 2624 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 R&gOmz0cfPHMK!{c^cM~v?YaN} literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/primitive_fun/readme.md b/modular_skyrat/modules/primitive_fun/readme.md new file mode 100644 index 00000000000..11bd0f7f51a --- /dev/null +++ b/modular_skyrat/modules/primitive_fun/readme.md @@ -0,0 +1,28 @@ +## Title: POSITRONIC ALERT CONSOLE + +MODULE ID: PRIM_FUN + +### Description: + +Adds glassblowing and ceramics! +Both can be sold to cargo for some cash + +### TG Proc/File Changes: + +- N/A + +### Defines: + +- N/A + +### Master file additions + +- N/A + +### Included files that are not contained in this module: + +- N/A + +### Credits: + +Jake Park diff --git a/modular_skyrat/modules/reagent_forging/code/modules/reagent_forging/forge.dm b/modular_skyrat/modules/reagent_forging/code/modules/reagent_forging/forge.dm index 720211ad512..8641e1ff652 100644 --- a/modular_skyrat/modules/reagent_forging/code/modules/reagent_forging/forge.dm +++ b/modular_skyrat/modules/reagent_forging/code/modules/reagent_forging/forge.dm @@ -492,6 +492,98 @@ in_use = FALSE return + if(istype(I, /obj/item/ceramic)) + var/obj/item/ceramic/ceramic_item = I + if(forge_temperature <= 50) + to_chat(user, span_warning("The temperature is not hot enough to start heating [ceramic_item].")) + return + if(!ceramic_item.forge_item) + to_chat(user, span_warning("You feel that setting [ceramic_item] would not yield anything useful!")) + return + to_chat(user, span_notice("You start setting [ceramic_item]...")) + if(!do_after(user, 5 SECONDS, target = src)) + to_chat(user, span_warning("You stop setting [ceramic_item]!")) + return + to_chat(user, span_notice("You finish setting [ceramic_item]...")) + var/obj/item/ceramic/spawned_ceramic = new ceramic_item.forge_item(get_turf(src)) + spawned_ceramic.color = ceramic_item.color + qdel(ceramic_item) + return + + if(istype(I, /obj/item/glassblowing/blowing_rod)) + var/obj/item/glassblowing/blowing_rod/blowing_item = I + if(in_use) //only insert one at a time + to_chat(user, span_warning("You cannot do multiple things at the same time!")) + return + in_use = TRUE + if(forge_temperature <= 50) + to_chat(user, span_warning("The temperature is not hot enough to start heating [blowing_item].")) + in_use = FALSE + return + var/obj/item/glassblowing/molten_glass/find_glass = locate() in blowing_item.contents + if(!find_glass) + to_chat(user, span_warning("[blowing_item] does not have any glass to heat up.")) + in_use = FALSE + return + to_chat(user, span_notice("You begin heating up [blowing_item].")) + for(var/do_loop in 1 to 5) //I really want 10 seconds, but not all at "once," this makes it feel like less time + if(!do_after(user, 2 SECONDS, target = src)) + to_chat(user, span_warning("[blowing_item] is interrupted in its heating process.")) + in_use = FALSE + return + find_glass.world_molten = world.time + 25 SECONDS + to_chat(user, span_notice("You finish heating up [blowing_item].")) + in_use = FALSE + return + + if(istype(I, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/glass_item = I + if(in_use) //only insert one at a time + to_chat(user, span_warning("You cannot do multiple things at the same time!")) + return + in_use = TRUE + if(forge_temperature <= 50) + to_chat(user, span_warning("The temperature is not hot enough to start heating [glass_item].")) + in_use = FALSE + return + if(!glass_item.use(1)) + to_chat(user, span_warning("You need to be able to use [glass_item]!")) + in_use = FALSE + return + if(!do_after(user, 5 SECONDS, target = src)) + to_chat(user, span_warning("You stop heating up [glass_item]!")) + in_use = FALSE + return + in_use = FALSE + var/obj/item/glassblowing/molten_glass/spawned_glass = new /obj/item/glassblowing/molten_glass(get_turf(src)) + spawned_glass.world_molten = world.time + 25 SECONDS + return + + if(istype(I, /obj/item/glassblowing/metal_cup)) + var/obj/item/glassblowing/metal_cup/metal_item = I + if(in_use) //only insert one at a time + to_chat(user, span_warning("You cannot do multiple things at the same time!")) + return + in_use = TRUE + if(forge_temperature <= 50) + to_chat(user, span_warning("The temperature is not hot enough to start heating [metal_item]!")) + in_use = FALSE + return + if(!metal_item.has_sand) + to_chat(user, span_warning("There is no sand within [metal_item]!")) + in_use = FALSE + return + if(!do_after(user, 5 SECONDS, target = src)) + to_chat(user, span_warning("You stop heating up [metal_item]!")) + in_use = FALSE + return + in_use = FALSE + metal_item.has_sand = FALSE + metal_item.icon_state = "metal_cup_empty" + var/obj/item/glassblowing/molten_glass/spawned_glass = new /obj/item/glassblowing/molten_glass(get_turf(src)) + spawned_glass.world_molten = world.time + 25 SECONDS + return + return ..() /obj/structure/reagent_forge/ready diff --git a/modular_skyrat/modules/reagent_forging/code/modules/reagent_forging/water_basin.dm b/modular_skyrat/modules/reagent_forging/code/modules/reagent_forging/water_basin.dm index 2d9c6ffc914..0cd369c8867 100644 --- a/modular_skyrat/modules/reagent_forging/code/modules/reagent_forging/water_basin.dm +++ b/modular_skyrat/modules/reagent_forging/code/modules/reagent_forging/water_basin.dm @@ -32,4 +32,10 @@ new /obj/item/stack/sheet/mineral/wood(get_turf(src)) qdel(src) return + if(istype(I, /obj/item/stack/ore/glass)) + var/obj/item/stack/ore/glass/glass_obj = I + if(!glass_obj.use(1)) + return + new /obj/item/ceramic/clay(get_turf(src)) + return return ..() diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_item.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_item.dm index 80f08aff6ee..e3d3cdc4122 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_item.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_item.dm @@ -9,8 +9,12 @@ /datum/export/xenoarch/useless_relic cost = 400 - unit_name = "useless relic" - export_types = list(/obj/item/xenoarch/useless_relic) + unit_name = "xenoarch item" + export_types = list(/obj/item/xenoarch/useless_relic, + /obj/item/xenoarch/broken_item) + +/datum/export/xenoarch/useless_relic/sell_object(obj/O, datum/export_report/report, dry_run, apply_elastic = FALSE) //I really dont want them to feel gimped + . = ..() //broken items /obj/item/xenoarch/broken_item diff --git a/tgstation.dme b/tgstation.dme index 05e5533d957..c60ea495687 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4796,6 +4796,8 @@ #include "modular_skyrat\modules\pollution\code\temporary_pollution_emission_component.dm" #include "modular_skyrat\modules\pollution\code\turf_open.dm" #include "modular_skyrat\modules\posi_alert\code\game\machinery\posialert.dm" +#include "modular_skyrat\modules\primitive_fun\code\ceramics.dm" +#include "modular_skyrat\modules\primitive_fun\code\glassblowing.dm" #include "modular_skyrat\modules\prison_transport\code\outfits.dm" #include "modular_skyrat\modules\prison_transport\code\shuttle.dm" #include "modular_skyrat\modules\QOL\code\_under.dm"