diff --git a/baystation12.dme b/baystation12.dme index 3dc5369865a..ce1f5b27c0f 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -601,7 +601,6 @@ #include "code\game\objects\items\stacks\nanopaste.dm" #include "code\game\objects\items\stacks\rods.dm" #include "code\game\objects\items\stacks\stack.dm" -#include "code\game\objects\items\stacks\sheets\glass.dm" #include "code\game\objects\items\stacks\sheets\leather.dm" #include "code\game\objects\items\stacks\sheets\light.dm" #include "code\game\objects\items\stacks\tiles\light.dm" diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm deleted file mode 100644 index fd20de103c3..00000000000 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ /dev/null @@ -1,174 +0,0 @@ -/* Glass stack types - * Contains: - * Glass sheets - * Reinforced glass sheets - * Phoron Glass Sheets - * Reinforced Phoron Glass Sheets (AKA Holy fuck strong windows) - * Glass shards - TODO: Move this into code/game/object/item/weapons - */ - -/* - * Glass sheets - */ -/obj/item/stack/material/glass - name = "glass" - singular_name = "glass sheet" - icon_state = "sheet-glass" - var/created_window = /obj/structure/window/basic - var/is_reinforced = 0 - var/list/construction_options = list("One Direction", "Full Window") - default_type = "glass" - -/obj/item/stack/material/glass/attack_self(mob/user as mob) - construct_window(user) - -/obj/item/stack/material/glass/attackby(obj/item/W, mob/user) - ..() - if(!is_reinforced) - if(istype(W,/obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/CC = W - if (get_amount() < 1 || CC.get_amount() < 5) - user << "You attach wire to the [name]." - new /obj/item/stack/light_w(user.loc) - else if(istype(W, /obj/item/stack/rods)) - var/obj/item/stack/rods/V = W - if (V.get_amount() < 1 || get_amount() < 1) - user << "You need one rod and one sheet of glass to make reinforced glass." - return - - var/obj/item/stack/material/glass/reinforced/RG = new (user.loc) - RG.add_fingerprint(user) - RG.add_to_stacks(user) - var/obj/item/stack/material/glass/G = src - src = null - var/replace = (user.get_inactive_hand()==G) - V.use(1) - G.use(1) - if (!G && replace) - user.put_in_hands(RG) - -/obj/item/stack/material/glass/proc/construct_window(mob/user as mob) - if(!user || !src) return 0 - if(!istype(user.loc,/turf)) return 0 - if(!user.IsAdvancedToolUser()) - return 0 - var/title = "Sheet-[name]" - title += " ([src.get_amount()] sheet\s left)" - switch(input(title, "What would you like to construct?") as null|anything in construction_options) - if("One Direction") - if(!src) return 1 - if(src.loc != user) return 1 - - var/list/directions = new/list(cardinal) - var/i = 0 - for (var/obj/structure/window/win in user.loc) - i++ - if(i >= 4) - user << "\red There are too many windows in this location." - return 1 - directions-=win.dir - if(!(win.dir in cardinal)) - user << "\red Can't let you do that." - return 1 - - //Determine the direction. It will first check in the direction the person making the window is facing, if it finds an already made window it will try looking at the next cardinal direction, etc. - var/dir_to_set = 2 - for(var/direction in list( user.dir, turn(user.dir,90), turn(user.dir,180), turn(user.dir,270) )) - var/found = 0 - for(var/obj/structure/window/WT in user.loc) - if(WT.dir == direction) - found = 1 - if(!found) - dir_to_set = direction - break - new created_window( user.loc, dir_to_set, 1 ) - src.use(1) - if("Full Window") - if(!src) return 1 - if(src.loc != user) return 1 - if(src.get_amount() < 4) - user << "\red You need more glass to do that." - return 1 - if(locate(/obj/structure/window) in user.loc) - user << "\red There is a window in the way." - return 1 - new created_window( user.loc, SOUTHWEST, 1 ) - src.use(4) - if("Windoor") - if(!is_reinforced) return 1 - - - if(!src || src.loc != user) return 1 - - if(isturf(user.loc) && locate(/obj/structure/windoor_assembly/, user.loc)) - user << "\red There is already a windoor assembly in that location." - return 1 - - if(isturf(user.loc) && locate(/obj/machinery/door/window/, user.loc)) - user << "\red There is already a windoor in that location." - return 1 - - if(src.get_amount() < 5) - user << "\red You need more glass to do that." - return 1 - - new /obj/structure/windoor_assembly(user.loc, user.dir, 1) - src.use(5) - - return 0 - - -/* - * Reinforced glass sheets - */ -/obj/item/stack/material/glass/reinforced - name = "reinforced glass" - singular_name = "reinforced glass sheet" - icon_state = "sheet-rglass" - default_type = "reinforced glass" - created_window = /obj/structure/window/reinforced - is_reinforced = 1 - construction_options = list("One Direction", "Full Window", "Windoor") - -/* - * Phoron Glass sheets - */ -/obj/item/stack/material/glass/phoronglass - name = "phoron glass" - singular_name = "phoron glass sheet" - icon_state = "sheet-phoronglass" - created_window = /obj/structure/window/phoronbasic - default_type = "phoron glass" - -/obj/item/stack/material/glass/phoronglass/attackby(obj/item/W, mob/user) - ..() - if( istype(W, /obj/item/stack/rods) ) - var/obj/item/stack/rods/V = W - var/obj/item/stack/material/glass/phoronrglass/RG = new (user.loc) - RG.add_fingerprint(user) - RG.add_to_stacks(user) - V.use(1) - var/obj/item/stack/material/glass/G = src - src = null - var/replace = (user.get_inactive_hand()==G) - G.use(1) - if (!G && !RG && replace) - user.put_in_hands(RG) - else - return ..() - -/* - * Reinforced phoron glass sheets - */ -/obj/item/stack/material/glass/phoronrglass - name = "reinforced phoron glass" - singular_name = "reinforced phoron glass sheet" - icon_state = "sheet-phoronrglass" - default_type = "reinforced phoron glass" - created_window = /obj/structure/window/phoronreinforced - is_reinforced = 1 diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index fa7a448bd66..7829705a63e 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -114,9 +114,12 @@ "You have [anchored ? "fastened the grille to" : "unfastened the grill from"] the floor.") return -//window placing begin - else if(istype(W,/obj/item/stack/material/glass)) - var/obj/item/stack/material/glass/ST = W +//window placing begin //TODO CONVERT PROPERLY TO MATERIAL DATUM + else if(istype(W,/obj/item/stack/material)) + var/obj/item/stack/material/ST = W + if(!ST.material.created_window) + return 0 + var/dir_to_set = 1 if(loc == user.loc) dir_to_set = user.dir @@ -146,7 +149,7 @@ user << "There is already a window facing this way there." return - var/wtype = ST.created_window + var/wtype = ST.material.created_window if (ST.use(1)) var/obj/structure/window/WD = new wtype(loc, dir_to_set, 1) user << "You place the [WD] on [src]." diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 72f0e444abc..031fc8b23d0 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -223,7 +223,7 @@ new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src)) qdel(src) return - else //This may need to be made more specific, but at this point I am not sure what the criteria should be. + else if(seed.get_trait(TRAIT_FLESH_COLOUR)) user << "You slice up \the [src]." var/slices = rand(3,5) var/reagents_to_transfer = round(reagents.total_volume/slices) diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 2331c328dcc..9afa043256f 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -60,7 +60,6 @@ set_trait(TRAIT_IDEAL_HEAT, 293) // Preferred temperature in Kelvin. set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) // Plant eats this much per tick. set_trait(TRAIT_PLANT_COLOUR, "#46B543") // Colour of the plant icon. - set_trait(TRAIT_FLESH_COLOUR, "#46B543") spawn(5) sleep(-1) @@ -637,7 +636,7 @@ if(GENE_STRUCTURE) traits_to_copy = list(TRAIT_PLANT_ICON,TRAIT_PRODUCT_ICON,TRAIT_HARVEST_REPEAT) if(GENE_FRUIT) - traits_to_copy = list(TRAIT_STINGS,TRAIT_EXPLOSIVE,TRAIT_JUICY) + traits_to_copy = list(TRAIT_STINGS,TRAIT_EXPLOSIVE,TRAIT_FLESH_COLOUR,TRAIT_JUICY) if(GENE_SPECIAL) traits_to_copy = list(TRAIT_TELEPORTING) diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index d93de272863..b8b05307883 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -844,6 +844,7 @@ set_trait(TRAIT_PRODUCT_ICON,"treefruit") set_trait(TRAIT_PRODUCT_COLOUR,"#3AF026") set_trait(TRAIT_PLANT_ICON,"tree") + set_trait(TRAIT_FLESH_COLOUR,"#3AF026") /datum/seed/citrus/lemon name = "lemon" @@ -856,6 +857,7 @@ ..() set_trait(TRAIT_PRODUCES_POWER,1) set_trait(TRAIT_PRODUCT_COLOUR,"#F0E226") + set_trait(TRAIT_FLESH_COLOUR,"#F0E226") /datum/seed/citrus/orange name = "orange" @@ -867,6 +869,7 @@ /datum/seed/citrus/orange/New() ..() set_trait(TRAIT_PRODUCT_COLOUR,"#FFC20A") + set_trait(TRAIT_FLESH_COLOUR,"#FFC20A") /datum/seed/grass name = "grass" diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index ec6f51540f4..62b3c433dc9 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -47,6 +47,19 @@ return 0 ..(S,tamount,1) +/obj/item/stack/material/attack_self(var/mob/user) + if(!material.build_windows(user, src)) + ..() + +/obj/item/stack/material/attackby(var/obj/item/W, var/mob/user) + if(istype(W,/obj/item/stack/cable_coil)) + material.build_wired_product(user, W, src) + return + else if(istype(W, /obj/item/stack/rods)) + material.build_rod_product(user, W, src) + return + return ..() + /obj/item/stack/material/iron name = "iron" icon_state = "sheet-silver" @@ -75,7 +88,7 @@ default_type = "phoron" /obj/item/stack/material/plastic - name = "Plastic" + name = "plastic" icon_state = "sheet-plastic" default_type = "plastic" @@ -151,3 +164,27 @@ singular_name = "leather piece" icon_state = "sheet-leather" default_type = "leather" + +/obj/item/stack/material/glass + name = "glass" + singular_name = "glass sheet" + icon_state = "sheet-glass" + default_type = "glass" + +/obj/item/stack/material/glass/reinforced + name = "reinforced glass" + singular_name = "reinforced glass sheet" + icon_state = "sheet-rglass" + default_type = "reinforced glass" + +/obj/item/stack/material/glass/phoronglass + name = "phoron glass" + singular_name = "phoron glass sheet" + icon_state = "sheet-phoronglass" + default_type = "phoron glass" + +/obj/item/stack/material/glass/phoronrglass + name = "reinforced phoron glass" + singular_name = "reinforced phoron glass sheet" + icon_state = "sheet-phoronrglass" + default_type = "reinforced phoron glass" diff --git a/code/modules/materials/material_synth.dm b/code/modules/materials/material_synth.dm index a0977e69c5f..23b0e7e5462 100644 --- a/code/modules/materials/material_synth.dm +++ b/code/modules/materials/material_synth.dm @@ -13,20 +13,26 @@ matter = null /obj/item/stack/material/cyborg/plastic + icon_state = "sheet-plastic" default_type = "plastic" /obj/item/stack/material/cyborg/steel + icon_state = "sheet-metal" default_type = "steel" /obj/item/stack/material/cyborg/plasteel + icon_state = "sheet-plasteel" default_type = "plasteel" /obj/item/stack/material/cyborg/wood + icon_state = "sheet-wood" default_type = "wood" /obj/item/stack/material/cyborg/glass + icon_state = "sheet-glass" default_type = "glass" /obj/item/stack/material/cyborg/glass/reinforced + icon_state = "sheet-rglass" default_type = "reinforced glass" charge_costs = list(500, 1000) \ No newline at end of file diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 0409a8b7f1b..0e2fecff36b 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -77,6 +77,12 @@ var/list/name_to_material var/conductive = 1 // Objects with this var add CONDUCTS to flags on spawn. var/list/composite_material // If set, object matter var will be a list containing these values. + // Placeholder vars for the time being, todo properly integrate windows/light tiles/rods. + var/created_window + var/rod_product + var/wire_product + var/list/window_options = list() + // Damage values. var/hardness = 60 // Prob of wall destruction by hulk, used for edge damage in weapons. var/weight = 20 // Determines blunt damage/throwforce for weapons. @@ -90,6 +96,37 @@ var/list/name_to_material // Wallrot crumble message. var/rotting_touch_message = "crumbles under your touch" +// Placeholders for light tiles and rglass. +/material/proc/build_rod_product(var/mob/user, var/obj/item/stack/used_stack, var/obj/item/stack/target_stack) + if(!rod_product) + user << "You cannot make anything out of \the [target_stack]" + return + if(used_stack.get_amount() < 1 || target_stack.get_amount() < 1) + user << "You need one rod and one sheet of [display_name] to make anything useful." + return + used_stack.use(1) + target_stack.use(1) + var/obj/item/stack/S = new rod_product(get_turf(user)) + S.add_fingerprint(user) + S.add_to_stacks(user) + if(!(user.l_hand && user.r_hand)) + user.put_in_hands(S) + +/material/proc/build_wired_product(var/mob/user, var/obj/item/stack/used_stack, var/obj/item/stack/target_stack) + if(!wire_product) + user << "You cannot make anything out of \the [target_stack]" + return + if(used_stack.get_amount() < 5 || target_stack.get_amount() < 1) + user << "You need five wires and one sheet of [display_name] to make anything useful." + return + + used_stack.use(5) + target_stack.use(1) + user << "You attach wire to the [name]." + var/obj/item/product = new wire_product(get_turf(user)) + if(!(user.l_hand && user.r_hand)) + user.put_in_hands(product) + // Make sure we have a display name and shard icon even if they aren't explicitly set. /material/New() ..() @@ -100,6 +137,10 @@ var/list/name_to_material if(!shard_icon) shard_icon = shard_type +// This is a placeholder for proper integration of windows/windoors into the system. +/material/proc/build_windows(var/mob/living/user, var/obj/item/stack/used_stack) + return 0 + // Weapons handle applying a divisor for this value locally. /material/proc/get_blunt_damage() return weight //todo @@ -288,21 +329,82 @@ var/list/name_to_material weight = 15 door_icon_base = "stone" destruction_desc = "shatters" + window_options = list("One Direction", "Full Window") + created_window = /obj/structure/window/basic + wire_product = /obj/item/stack/light_w + rod_product = /obj/item/stack/material/glass/reinforced -/material/glass/phoron - name = "phoron glass" - stack_type = /obj/item/stack/material/glass/phoronglass - flags = MATERIAL_BRITTLE - ignition_point = 300 - integrity = 200 // idk why but phoron windows are strong, so. - icon_colour = "#FC2BC5" - stack_origin_tech = "materials=3;phorontech=2" +/material/glass/build_windows(var/mob/living/user, var/obj/item/stack/used_stack) -/material/glass/phoron/reinforced - name = "reinforced phoron glass" - stack_type = /obj/item/stack/material/glass/phoronrglass - stack_origin_tech = "materials=4;phorontech=2" - composite_material = list() //todo + if(!user || !used_stack || !created_window || !window_options.len) + return 0 + + if(!user.IsAdvancedToolUser()) + user << "This task is too complex for your clumsy hands." + return 1 + + var/turf/T = user.loc + if(!istype(T)) + user << "You must be standing on open flooring to build a window." + return 1 + + var/title = "Sheet-[used_stack.name] ([used_stack.get_amount()] sheet\s left)" + var/choice = input(title, "What would you like to construct?") as null|anything in window_options + + if(!choice || !used_stack || !user || used_stack.loc != user || user.stat || user.loc != T) + return 1 + + // Get data for building windows here. + var/list/possible_directions = cardinal.Copy() + var/window_count = 0 + for (var/obj/structure/window/check_window in user.loc) + window_count++ + possible_directions -= check_window.dir + + // Get the closest available dir to the user's current facing. + var/build_dir = SOUTHWEST //Default to southwest for fulltile windows. + var/failed_to_build + + if(window_count >= 4) + failed_to_build = 1 + else + if(choice in list("One Direction","Windoor")) + if(possible_directions.len) + for(var/direction in list(user.dir, turn(user.dir,90), turn(user.dir,180), turn(user.dir,270) )) + if(direction in possible_directions) + build_dir = direction + break + else + failed_to_build = 1 + if(!failed_to_build && choice == "Windoor") + if(!is_reinforced()) + user << "This material is not reinforced enough to use for a door." + return + if((locate(/obj/structure/windoor_assembly) in T.contents) || (locate(/obj/machinery/door/window) in T.contents)) + failed_to_build = 1 + if(failed_to_build) + user << "There is no room in this location." + return 1 + + var/build_path = /obj/structure/windoor_assembly + var/sheets_needed = 4 + if(choice == "Windoor") + sheets_needed = 5 + build_dir = user.dir + else + build_path = created_window + + if(used_stack.get_amount() < sheets_needed) + user << "You need at least [sheets_needed] sheets to build this." + return 1 + + // Build the structure and update sheet count etc. + used_stack.use(sheets_needed) + new build_path(T, build_dir, 1) + return 1 + +/material/glass/proc/is_reinforced() + return (hardness > 35) //todo /material/glass/reinforced name = "reinforced glass" @@ -317,6 +419,31 @@ var/list/name_to_material weight = 30 stack_origin_tech = "materials=2" composite_material = list(DEFAULT_WALL_MATERIAL = 1875,"glass" = 3750) + window_options = list("One Direction", "Full Window", "Windoor") + created_window = /obj/structure/window/reinforced + wire_product = null + rod_product = null + +/material/glass/phoron + name = "phoron glass" + stack_type = /obj/item/stack/material/glass/phoronglass + flags = MATERIAL_BRITTLE + ignition_point = 300 + integrity = 200 // idk why but phoron windows are strong, so. + icon_colour = "#FC2BC5" + stack_origin_tech = "materials=3;phorontech=2" + created_window = /obj/structure/window/phoronbasic + wire_product = null + rod_product = /obj/item/stack/material/glass/phoronrglass + +/material/glass/phoron/reinforced + name = "reinforced phoron glass" + stack_type = /obj/item/stack/material/glass/phoronrglass + stack_origin_tech = "materials=4;phorontech=2" + composite_material = list() //todo + created_window = /obj/structure/window/phoronreinforced + hardness = 40 + rod_product = null /material/plastic name = "plastic"