From 4fa6e49c6154c0956a3f260132fa6cfe1ce623b2 Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Mon, 16 May 2022 08:34:52 -0500 Subject: [PATCH] Adds radial support + balloon alerts to stack crafting, cult metal now uses a radial when making buildings (#66938) * Adds radial support to stack crafting - uses it for runed metal * Unit tests * Balloon alerts and toilet lives --- .../items/stacks/sheets/runed_metal.dm | 114 ++++++ .../items/stacks/sheets/sheet_types.dm | 53 --- code/game/objects/items/stacks/stack.dm | 383 +++++++++++------- .../game/objects/items/stacks/stack_recipe.dm | 104 +++++ icons/hud/radial.dmi | Bin 26316 -> 27600 bytes tgstation.dme | 2 + 6 files changed, 450 insertions(+), 206 deletions(-) create mode 100644 code/game/objects/items/stacks/sheets/runed_metal.dm create mode 100644 code/game/objects/items/stacks/stack_recipe.dm diff --git a/code/game/objects/items/stacks/sheets/runed_metal.dm b/code/game/objects/items/stacks/sheets/runed_metal.dm new file mode 100644 index 00000000000..6d75547401c --- /dev/null +++ b/code/game/objects/items/stacks/sheets/runed_metal.dm @@ -0,0 +1,114 @@ +// Note, the order these in are deliberate, as it affects +// the order they are shown via radial. +GLOBAL_LIST_INIT(runed_metal_recipes, list( \ + new /datum/stack_recipe/radial( \ + title = "pylon", \ + result_type = /obj/structure/destructible/cult/pylon, \ + req_amount = 4, \ + time = 4 SECONDS, \ + one_per_turf = TRUE, \ + on_floor = TRUE, \ + desc = span_cultbold("Pylon: Heals and regenerates the blood of nearby blood cultists and constructs, and also \ + converts nearby floor tiles into engraved flooring, which allows blood cultists to scribe runes faster."), \ + required_noun = "runed metal sheet", \ + ), \ + new /datum/stack_recipe/radial( \ + title = "altar", \ + result_type = /obj/structure/destructible/cult/item_dispenser/altar, \ + req_amount = 3, \ + time = 4 SECONDS, \ + one_per_turf = TRUE, \ + on_floor = TRUE, \ + desc = span_cultbold("Altar: Can make Eldritch Whetstones, Construct Shells, and Flasks of Unholy Water."), \ + required_noun = "runed metal sheet", \ + ), \ + new /datum/stack_recipe/radial( \ + title = "archives", \ + result_type = /obj/structure/destructible/cult/item_dispenser/archives, \ + req_amount = 3, \ + time = 4 SECONDS, \ + one_per_turf = TRUE, \ + on_floor = TRUE, \ + desc = span_cultbold("Archives: Can make Zealot's Blindfolds, Shuttle Curse Orbs, \ + and Veil Walker equipment. Emits Light."), \ + required_noun = "runed metal sheet", \ + ), \ + new /datum/stack_recipe/radial( \ + title = "daemon forge", \ + result_type = /obj/structure/destructible/cult/item_dispenser/forge, \ + req_amount = 3, \ + time = 4 SECONDS, \ + one_per_turf = TRUE, \ + on_floor = TRUE, \ + desc = span_cultbold("Daemon Forge: Can make Nar'Sien Hardened Armor, Flagellant's Robes, \ + and Eldritch Longswords. Emits Light."), \ + required_noun = "runed metal sheet", \ + ), \ + new /datum/stack_recipe/radial( \ + title = "runed door", \ + result_type = /obj/machinery/door/airlock/cult, \ + time = 5 SECONDS, \ + one_per_turf = TRUE, \ + on_floor = TRUE, \ + desc = span_cultbold("Runed Door: A weak door which stuns non-blood cultists who touch it."), \ + required_noun = "runed metal sheet", \ + ), \ + new /datum/stack_recipe/radial( \ + title = "runed girder", \ + result_type = /obj/structure/girder/cult, \ + time = 5 SECONDS, \ + one_per_turf = TRUE, \ + on_floor = TRUE, \ + desc = span_cultbold("Runed Girder: A weak girder that can be instantly destroyed by ritual daggers. Not a recommended usage of runed metal."), \ + required_noun = "runed metal sheet", \ + ), \ +)) + +/obj/item/stack/sheet/runed_metal + name = "runed metal" + desc = "Sheets of cold metal with shifting inscriptions writ upon them." + singular_name = "runed metal sheet" + icon_state = "sheet-runed" + inhand_icon_state = "sheet-runed" + icon = 'icons/obj/stack_objects.dmi' + mats_per_unit = list(/datum/material/runedmetal = MINERAL_MATERIAL_AMOUNT) + sheettype = "runed" + merge_type = /obj/item/stack/sheet/runed_metal + novariants = TRUE + grind_results = list(/datum/reagent/iron = 5, /datum/reagent/blood = 15) + material_type = /datum/material/runedmetal + has_unique_girder = TRUE + use_radial = TRUE + +/obj/item/stack/sheet/runed_metal/interact(mob/user) + if(!IS_CULTIST(user)) + to_chat(user, span_warning("Only one with forbidden knowledge could hope to work this metal...")) + return FALSE + + var/turf/user_turf = get_turf(user) + var/area/user_area = get_area(user) + + var/is_valid_turf = user_turf && (is_station_level(user_turf.z) || is_mining_level(user_turf.z)) + var/is_valid_area = user_area && (user_area.area_flags & CULT_PERMITTED) + + if(!is_valid_turf || !is_valid_area) + to_chat(user, span_warning("The veil is not weak enough here.")) + return FALSE + + return ..() + +/obj/item/stack/sheet/runed_metal/radial_check(mob/builder) + return ..() && IS_CULTIST(builder) + +/obj/item/stack/sheet/runed_metal/get_main_recipes() + . = ..() + . += GLOB.runed_metal_recipes + +/obj/item/stack/sheet/runed_metal/fifty + amount = 50 + +/obj/item/stack/sheet/runed_metal/ten + amount = 10 + +/obj/item/stack/sheet/runed_metal/five + amount = 5 diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 35dc58d86b8..2a45a9323b3 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -564,59 +564,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ else . = ..() - -/* - * Runed Metal - */ - -GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ - new /datum/stack_recipe("runed door (a weak door that stuns non-cultists who touch it)", /obj/machinery/door/airlock/cult, 1, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \ - new /datum/stack_recipe("runed girder (not a recommended usage of runed metal)", /obj/structure/girder/cult, 1, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \ - new /datum/stack_recipe("pylon (heals (and regenerates the blood of) nearby blood cultists and constructs, but also turns nearby floor tiles into engraved flooring)", /obj/structure/destructible/cult/pylon, 4, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \ - new /datum/stack_recipe("daemon forge (can make Nar'Sien hardened armor, flagellant's robes, and eldritch longswords)", /obj/structure/destructible/cult/item_dispenser/forge, 3, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \ - new /datum/stack_recipe("archives (can make zealot's blindfolds, shuttle curse orbs, and veil walker equipment)", /obj/structure/destructible/cult/item_dispenser/archives, 3, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \ - new /datum/stack_recipe("altar (can make eldritch whetstones, construct shells, and flasks of unholy water)", /obj/structure/destructible/cult/item_dispenser/altar, 3, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \ - )) - -/obj/item/stack/sheet/runed_metal - name = "runed metal" - desc = "Sheets of cold metal with shifting inscriptions writ upon them." - singular_name = "runed metal sheet" - icon_state = "sheet-runed" - inhand_icon_state = "sheet-runed" - icon = 'icons/obj/stack_objects.dmi' - mats_per_unit = list(/datum/material/runedmetal = MINERAL_MATERIAL_AMOUNT) - sheettype = "runed" - merge_type = /obj/item/stack/sheet/runed_metal - novariants = TRUE - grind_results = list(/datum/reagent/iron = 5, /datum/reagent/blood = 15) - material_type = /datum/material/runedmetal - has_unique_girder = TRUE - -/obj/item/stack/sheet/runed_metal/attack_self(mob/living/user) - if(!IS_CULTIST(user)) - to_chat(user, span_warning("Only one with forbidden knowledge could hope to work this metal...")) - return - var/turf/T = get_turf(user) //we may have moved. adjust as needed... - var/area/A = get_area(user) - if((!is_station_level(T.z) && !is_mining_level(T.z)) || (A && !(A.area_flags & CULT_PERMITTED))) - to_chat(user, span_warning("The veil is not weak enough here.")) - return FALSE - return ..() - -/obj/item/stack/sheet/runed_metal/get_main_recipes() - . = ..() - . += GLOB.runed_metal_recipes - -/obj/item/stack/sheet/runed_metal/fifty - amount = 50 - -/obj/item/stack/sheet/runed_metal/ten - amount = 10 - -/obj/item/stack/sheet/runed_metal/five - amount = 5 - /* * Bronze */ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 6573ef69b1e..c98ab48efcf 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -1,8 +1,8 @@ //stack recipe placement check types /// Checks if there is an object of the result type in any of the cardinal directions -#define STACK_CHECK_CARDINALS "cardinals" +#define STACK_CHECK_CARDINALS (1<<0) /// Checks if there is an object of the result type within one tile -#define STACK_CHECK_ADJACENT "adjacent" +#define STACK_CHECK_ADJACENT (1<<1) /* Stack type objects! * Contains: @@ -20,35 +20,60 @@ gender = PLURAL material_modifier = 0.05 //5%, so that a 50 sheet stack has the effect of 5k materials instead of 100k. max_integrity = 100 + /// A list to all recipies this stack item can create. var/list/datum/stack_recipe/recipes + /// What's the name of just 1 of this stack. You have a stack of leather, but one piece of leather var/singular_name + /// How much is in this stack? var/amount = 1 - var/max_amount = 50 //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount - var/is_cyborg = FALSE // It's TRUE if module is used by a cyborg, and uses its storage + /// How much is allowed in this stack? + // Also see stack recipes initialisation. "max_res_amount" must be equal to this max_amount + var/max_amount = 50 + /// If TRUE, this stack is a module used by a cyborg (doesn't run out like normal / etc) + var/is_cyborg = FALSE + /// Related to above. If present, the energy we draw from when using stack items, for cyborgs var/datum/robot_energy_storage/source - var/cost = 1 // How much energy from storage it costs - var/merge_type = null // This path and its children should merge with this stack, defaults to src.type - var/full_w_class = WEIGHT_CLASS_NORMAL //The weight class the stack should have at amount > 2/3rds max_amount - var/novariants = TRUE //Determines whether the item should update it's sprites based on amount. - var/list/mats_per_unit //list that tells you how much is in a single unit. - ///Datum material type that this stack is made of + /// Related to above. How much energy it costs from storage to use stack items + var/cost = 1 + /// This path and its children should merge with this stack, defaults to src.type + var/merge_type = null + /// The weight class the stack has at amount > 2/3rds max_amount + var/full_w_class = WEIGHT_CLASS_NORMAL + /// Determines whether the item should update it's sprites based on amount. + var/novariants = TRUE + /// List that tells you how much is in a single unit. + var/list/mats_per_unit + /// Datum material type that this stack is made of var/material_type - //NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - these amounts will be multiplied by the stack size in on_grind() - var/obj/structure/table/tableVariant // we tables now (stores table variant to be built from this stack) - - // The following are all for medical treatment, they're here instead of /stack/medical because sticky tape can be used as a makeshift bandage or splint - /// If set and this used as a splint for a broken bone wound, this is used as a multiplier for applicable slowdowns (lower = better) (also for speeding up burn recoveries) - var/splint_factor - /// Like splint_factor but for burns instead of bone wounds. This is a multiplier used to speed up burn recoveries - var/burn_cleanliness_bonus - /// How much blood flow this stack can absorb if used as a bandage on a cut wound, note that absorption is how much we lower the flow rate, not the raw amount of blood we suck up - var/absorption_capacity - /// How quickly we lower the blood flow on a cut wound we're bandaging. Expected lifetime of this bandage in seconds is thus absorption_capacity/absorption_rate, or until the cut heals, whichever comes first - var/absorption_rate - /// Amount of matter for RCD + // NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - + // these amounts will be multiplied by the stack size in on_grind() + /// Amount of matter given back to RCDs var/matter_amount = 0 /// Does this stack require a unique girder in order to make a wall? var/has_unique_girder = FALSE + /// What typepath table we create from this stack + var/obj/structure/table/tableVariant + /// If TRUE, we'll use a radial instead when displaying recipes + var/use_radial = FALSE + /// If use_radial is TRUE, this is the radius of the radial + var/radial_radius = 52 + + // The following are all for medical treatment + // They're here instead of /stack/medical + // because sticky tape can be used as a makeshift bandage or splint + + /// If set and this used as a splint for a broken bone wound, + /// This is used as a multiplier for applicable slowdowns (lower = better) (also for speeding up burn recoveries) + var/splint_factor + /// Like splint_factor but for burns instead of bone wounds. This is a multiplier used to speed up burn recoveries + var/burn_cleanliness_bonus + /// How much blood flow this stack can absorb if used as a bandage on a cut wound. + /// note that absorption is how much we lower the flow rate, not the raw amount of blood we suck up + var/absorption_capacity + /// How quickly we lower the blood flow on a cut wound we're bandaging. + /// Expected lifetime of this bandage in seconds is thus absorption_capacity/absorption_rate, + /// or until the cut heals, whichever comes first + var/absorption_rate /obj/item/stack/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) if(new_amount != null) @@ -75,18 +100,17 @@ INVOKE_ASYNC(src, .proc/merge_without_del, item_stack) if(is_zero_amount(delete_if_zero = FALSE)) return INITIALIZE_HINT_QDEL - var/list/temp_recipes = get_main_recipes() - recipes = temp_recipes.Copy() + + recipes = get_main_recipes().Copy() if(material_type) - var/datum/material/M = GET_MATERIAL_REF(material_type) //First/main material - for(var/i in M.categories) - switch(i) + var/datum/material/what_are_we_made_of = GET_MATERIAL_REF(material_type) //First/main material + for(var/category in what_are_we_made_of.categories) + switch(category) if(MAT_CATEGORY_BASE_RECIPES) - var/list/temp = SSmaterials.base_stack_recipes.Copy() - recipes += temp + recipes |= SSmaterials.base_stack_recipes.Copy() if(MAT_CATEGORY_RIGID) - var/list/temp = SSmaterials.rigid_stack_recipes.Copy() - recipes += temp + recipes |= SSmaterials.rigid_stack_recipes.Copy() + update_weight() update_appearance() var/static/list/loc_connections = list( @@ -128,8 +152,10 @@ return TRUE /obj/item/stack/proc/get_main_recipes() + RETURN_TYPE(/list) SHOULD_CALL_PARENT(TRUE) - return list()//empty list + + return list() //empty list /obj/item/stack/proc/update_weight() if(amount <= (max_amount * (1/3))) @@ -224,6 +250,12 @@ return TRUE return FALSE +/obj/item/stack/interact(mob/user) + if(use_radial) + show_construction_radial(user) + else + ui_interact(user) + /obj/item/stack/ui_state(mob/user) return GLOB.hands_state @@ -250,64 +282,149 @@ switch(action) if("make") - if(get_amount() < 1 && !is_cyborg) - qdel(src) - return var/datum/stack_recipe/recipe = locate(params["ref"]) - if(!is_valid_recipe(recipe, recipes)) //href exploit protection - return var/multiplier = text2num(params["multiplier"]) - if(!multiplier || (multiplier <= 0)) //href exploit protection - return - if(!building_checks(recipe, multiplier)) - return - if(recipe.time) - var/adjusted_time = 0 - usr.visible_message(span_notice("[usr] starts building \a [recipe.title]."), span_notice("You start building \a [recipe.title]...")) - if(HAS_TRAIT(usr, recipe.trait_booster)) - adjusted_time = (recipe.time * recipe.trait_modifier) - else - adjusted_time = recipe.time - if(!do_after(usr, adjusted_time, target = usr)) - return - if(!building_checks(recipe, multiplier)) - return - var/obj/O - if(recipe.max_res_amount > 1) //Is it a stack? - O = new recipe.result_type(usr.drop_location(), recipe.res_amount * multiplier) - else if(ispath(recipe.result_type, /turf)) - var/turf/T = usr.drop_location() - if(!isturf(T)) - return - T.PlaceOnTop(recipe.result_type, flags = CHANGETURF_INHERIT_AIR) - else - O = new recipe.result_type(usr.drop_location()) - if(O) - O.setDir(usr.dir) - use(recipe.req_amount * multiplier) - usr.investigate_log("[key_name(usr)] crafted [recipe.title]", INVESTIGATE_CRAFTING) + return make_item(usr, recipe, multiplier) - if(recipe.applies_mats && LAZYLEN(mats_per_unit)) - if(isstack(O)) - var/obj/item/stack/crafted_stack = O - crafted_stack.set_mats_per_unit(mats_per_unit, recipe.req_amount / recipe.res_amount) - else - O.set_custom_materials(mats_per_unit, recipe.req_amount / recipe.res_amount) +/// The key / title for a radial option that shows the entire list of buildables (uses the old menu) +#define FULL_LIST "view full list" - if(QDELETED(O)) - return //It's a stack and has already been merged +/// Shows a radial consisting of every radial recipe we have in our list. +/obj/item/stack/proc/show_construction_radial(mob/builder) + var/list/options = list() + var/list/titles_to_recipes = list() - O.add_fingerprint(usr) //Add fingerprints first, otherwise O might already be deleted because of stack merging - if(isitem(O)) - usr.put_in_hands(O) + for(var/datum/stack_recipe/radial/recipe in recipes) + var/datum/radial_menu_choice/option = new() + option.image = image( + icon = initial(recipe.result_type.icon), + icon_state = initial(recipe.result_type.icon_state), + ) - //BubbleWrap - so newly formed boxes are empty - if(istype(O, /obj/item/storage)) - for (var/obj/item/I in O) - qdel(I) - //BubbleWrap END - return TRUE + if(recipe.desc) + option.info = recipe.desc + + options[recipe.title] = option + titles_to_recipes[recipe.title] = recipe + + // After everything's been added to the radial, add an option + // that lets the user see the whole list of buildables + options[FULL_LIST] = image( + icon = 'icons/hud/radial.dmi', + icon_state = "radial_full_list", + ) + + var/selection = show_radial_menu( + user = builder, + anchor = builder, + choices = options, + custom_check = CALLBACK(src, .proc/radial_check, builder), + radius = radial_radius, + tooltips = TRUE, + ) + + if(!selection) + return + // Run normal UI interact if we wanna see the full list + if(selection == FULL_LIST) + ui_interact(builder) + return + + // Otherwise go straight to building + var/datum/stack_recipe/picked_recipe = titles_to_recipes[selection] + if(!istype(picked_recipe)) + return + + make_item(builder, picked_recipe, 1) + +/// Used as a callback for radial building. +/obj/item/stack/proc/radial_check(mob/builder) + if(QDELETED(builder) || QDELETED(src)) + return FALSE + if(builder.incapacitated()) + return FALSE + if(!builder.is_holding(src)) + return FALSE + return TRUE + +#undef FULL_LIST + +/// Makes the item with the given recipe. +/obj/item/stack/proc/make_item(mob/builder, datum/stack_recipe/recipe, multiplier) + if(get_amount() < 1 && !is_cyborg) //sanity check as this shouldn't happen + qdel(src) + return + if(!is_valid_recipe(recipe, recipes)) //href exploit protection + return + if(!multiplier || (multiplier <= 0)) //href exploit protection + return + if(!building_checks(builder, recipe, multiplier)) + return + if(recipe.time) + var/adjusted_time = 0 + builder.balloon_alert(builder, "building...") + builder.visible_message( + span_notice("[builder] starts building \a [recipe.title]."), + span_notice("You start building \a [recipe.title]..."), + ) + if(HAS_TRAIT(builder, recipe.trait_booster)) + adjusted_time = (recipe.time * recipe.trait_modifier) + else + adjusted_time = recipe.time + if(!do_after(builder, adjusted_time, target = builder)) + builder.balloon_alert(builder, "interrupted!") + return + if(!building_checks(builder, recipe, multiplier)) + return + + var/atom/created + if(recipe.max_res_amount > 1) // Is it a stack? + created = new recipe.result_type(builder.drop_location(), recipe.res_amount * multiplier) + builder.balloon_alert(builder, "built items") + + else if(ispath(recipe.result_type, /turf)) + var/turf/covered_turf = builder.drop_location() + if(!isturf(covered_turf)) + return + covered_turf.PlaceOnTop(recipe.result_type, flags = CHANGETURF_INHERIT_AIR) + builder.balloon_alert(builder, "placed [ispath(recipe.result_type, /turf/open) ? "floor" : "wall"]") + + else + created = new recipe.result_type(builder.drop_location()) + builder.balloon_alert(builder, "built item") + + if(created) + created.setDir(builder.dir) + + // Use up the material + use(recipe.req_amount * multiplier) + builder.investigate_log("[key_name(builder)] crafted [recipe.title]", INVESTIGATE_CRAFTING) + + // Apply mat datums + if(recipe.applies_mats && LAZYLEN(mats_per_unit)) + if(isstack(created)) + var/obj/item/stack/crafted_stack = created + crafted_stack.set_mats_per_unit(mats_per_unit, recipe.req_amount / recipe.res_amount) + else + created.set_custom_materials(mats_per_unit, recipe.req_amount / recipe.res_amount) + + // We could be qdeleted - like if it's a stack and has already been merged + if(QDELETED(created)) + return TRUE + + // Add fingerprints first, otherwise created might already be deleted because of stack merging + created.add_fingerprint(builder) + if(isitem(created)) + builder.put_in_hands(created) + + //BubbleWrap - so newly formed boxes are empty + if(istype(created, /obj/item/storage)) + for (var/obj/item/thing in created) + qdel(thing) + //BubbleWrap END + + return TRUE /obj/item/stack/vv_edit_var(vname, vval) if(vname == NAMEOF(src, amount)) @@ -319,34 +436,32 @@ return TRUE return ..() -/obj/item/stack/proc/building_checks(datum/stack_recipe/recipe, multiplier) - if (get_amount() < recipe.req_amount*multiplier) - if (recipe.req_amount*multiplier>1) - to_chat(usr, span_warning("You haven't got enough [src] to build \the [recipe.req_amount*multiplier] [recipe.title]\s!")) - else - to_chat(usr, span_warning("You haven't got enough [src] to build \the [recipe.title]!")) +/// Checks if we can build here, validly. +/obj/item/stack/proc/building_checks(mob/builder, datum/stack_recipe/recipe, multiplier) + if (get_amount() < recipe.req_amount * multiplier) + builder.balloon_alert(builder, "not enough material!") return FALSE - var/turf/dest_turf = get_turf(usr) + var/turf/dest_turf = get_turf(builder) // If we're making a window, we have some special snowflake window checks to do. if(ispath(recipe.result_type, /obj/structure/window)) var/obj/structure/window/result_path = recipe.result_type - if(!valid_window_location(dest_turf, usr.dir, is_fulltile = initial(result_path.fulltile))) - to_chat(usr, span_warning("The [recipe.title] won't fit here!")) + if(!valid_window_location(dest_turf, builder.dir, is_fulltile = initial(result_path.fulltile))) + builder.balloon_alert(builder, "won't fit here!") return FALSE if(recipe.one_per_turf && (locate(recipe.result_type) in dest_turf)) - to_chat(usr, span_warning("There is another [recipe.title] here!")) + builder.balloon_alert(builder, "already one here!") return FALSE if(recipe.on_tram) if(!locate(/obj/structure/industrial_lift/tram) in dest_turf) - to_chat(usr, span_warning("\The [recipe.title] must be constructed on a tram floor!")) + builder.balloon_alert(builder, "must be made on a tram!") return FALSE if(recipe.on_floor) if(!isfloorturf(dest_turf)) - to_chat(usr, span_warning("\The [recipe.title] must be constructed on the floor!")) + builder.balloon_alert(builder, "must be made on a floor!") return FALSE for(var/obj/object in dest_turf) @@ -359,21 +474,23 @@ if(!window_structure.fulltile) continue if(object.density || NO_BUILD & object.obj_flags) - to_chat(usr, span_warning("There is \a [object.name] here. You can\'t make \a [recipe.title] here!")) + builder.balloon_alert(builder, "something is in the way!") return FALSE - if(recipe.placement_checks) - switch(recipe.placement_checks) - if(STACK_CHECK_CARDINALS) - var/turf/step - for(var/direction in GLOB.cardinals) - step = get_step(dest_turf, direction) - if(locate(recipe.result_type) in step) - to_chat(usr, span_warning("\The [recipe.title] must not be built directly adjacent to another!")) - return FALSE - if(STACK_CHECK_ADJACENT) - if(locate(recipe.result_type) in range(1, dest_turf)) - to_chat(usr, span_warning("\The [recipe.title] must be constructed at least one tile away from others of its type!")) - return FALSE + + if(recipe.placement_checks & STACK_CHECK_CARDINALS) + var/turf/nearby_turf + for(var/direction in GLOB.cardinals) + nearby_turf = get_step(dest_turf, direction) + if(locate(recipe.result_type) in nearby_turf) + to_chat(builder, span_warning("\The [recipe.title] must not be built directly adjacent to another!")) + builder.balloon_alert(builder, "can't be adjacent to another!") + return FALSE + + if(recipe.placement_checks & STACK_CHECK_ADJACENT) + if(locate(recipe.result_type) in range(1, dest_turf)) + builder.balloon_alert(builder, "can't be near another!") + return FALSE + return TRUE /obj/item/stack/use(used, transfer = FALSE, check = TRUE) // return 0 = borked; return 1 = had enough @@ -394,6 +511,9 @@ /obj/item/stack/tool_use_check(mob/living/user, amount) if(get_amount() < amount) + // general balloon alert that says they don't have enough + user.balloon_alert(user, "not enough material!") + // then a more specific message about how much they need and what they need specifically if(singular_name) if(amount > 1) to_chat(user, span_warning("You need at least [amount] [singular_name]\s to do this!")) @@ -577,48 +697,5 @@ if(istype(M) && M.dirty < 100) M.dirty += amount -/* - * Recipe datum - */ -/datum/stack_recipe - var/title = "ERROR" - var/result_type - var/req_amount = 1 - var/res_amount = 1 - var/max_res_amount = 1 - var/time = 0 - var/one_per_turf = FALSE - var/on_floor = FALSE - var/on_tram = FALSE - var/placement_checks = FALSE - var/applies_mats = FALSE - var/trait_booster = null - var/trait_modifier = 1 - -/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1,time = 0, one_per_turf = FALSE, on_floor = FALSE, on_tram = FALSE, window_checks = FALSE, placement_checks = FALSE, applies_mats = FALSE, trait_booster = null, trait_modifier = 1) - src.title = title - src.result_type = result_type - src.req_amount = req_amount - src.res_amount = res_amount - src.max_res_amount = max_res_amount - src.time = time - src.one_per_turf = one_per_turf - src.on_floor = on_floor - src.on_tram = on_tram - src.placement_checks = placement_checks - src.applies_mats = applies_mats - src.trait_booster = trait_booster - src.trait_modifier = trait_modifier -/* - * Recipe list datum - */ -/datum/stack_recipe_list - var/title = "ERROR" - var/list/recipes - -/datum/stack_recipe_list/New(title, recipes) - src.title = title - src.recipes = recipes - #undef STACK_CHECK_CARDINALS #undef STACK_CHECK_ADJACENT diff --git a/code/game/objects/items/stacks/stack_recipe.dm b/code/game/objects/items/stacks/stack_recipe.dm new file mode 100644 index 00000000000..b6dc8d27eb8 --- /dev/null +++ b/code/game/objects/items/stacks/stack_recipe.dm @@ -0,0 +1,104 @@ + +/* + * Recipe datum + */ +/datum/stack_recipe + /// The title of the recipe + var/title = "ERROR" + /// What atom the recipe makes, typepath + var/atom/result_type + /// Amount of stack required to make + var/req_amount = 1 + /// Amount of resulting atoms made + var/res_amount = 1 + /// Max amount of resulting atoms made + var/max_res_amount = 1 + /// How long it takes to make + var/time = 0 + /// If only one of the resulting atom is allowed per turf + var/one_per_turf = FALSE + /// If the atom requires a floor below + var/on_floor = FALSE + /// If the atom requires a tram floor below + var/on_tram = FALSE + /// Bitflag of additional placement checks required to place. (STACK_CHECK_CARDINALS|STACK_CHECK_ADJACENT) + var/placement_checks = NONE + /// If TRUE, the created atom will gain custom mat datums + var/applies_mats = FALSE + /// What trait, if any, boosts the construction speed of this item + var/trait_booster + /// How much the trait above, if supplied, boosts the construct speed of this item + var/trait_modifier = 1 + +/datum/stack_recipe/New( + title, + result_type, + req_amount = 1, + res_amount = 1, + max_res_amount = 1, + time = 0, + one_per_turf = FALSE, + on_floor = FALSE, + on_tram = FALSE, + window_checks = FALSE, + placement_checks = NONE, + applies_mats = FALSE, + trait_booster, + trait_modifier = 1, +) + + src.title = title + src.result_type = result_type + src.req_amount = req_amount + src.res_amount = res_amount + src.max_res_amount = max_res_amount + src.time = time + src.one_per_turf = one_per_turf + src.on_floor = on_floor + src.on_tram = on_tram + src.placement_checks = placement_checks + src.applies_mats = applies_mats + src.trait_booster = trait_booster + src.trait_modifier = trait_modifier + +/datum/stack_recipe/radial + /// Optional info to be shown on the radial option for this item + var/desc + +/datum/stack_recipe/radial/New( + title, + result_type, + req_amount = 1, + res_amount = 1, + max_res_amount = 1, + time = 0, + one_per_turf = FALSE, + on_floor = FALSE, + on_tram = FALSE, + window_checks = FALSE, + placement_checks = NONE, + applies_mats = FALSE, + trait_booster, + trait_modifier = 1, + desc, + required_noun, +) + + if(desc) + src.desc = desc + if(required_noun) + src.desc += span_boldnotice("[desc ? " - ":""]Requires: [req_amount] [required_noun]\s.") + + return ..() + + +/* + * Recipe list datum + */ +/datum/stack_recipe_list + var/title = "ERROR" + var/list/recipes + +/datum/stack_recipe_list/New(title, recipes) + src.title = title + src.recipes = recipes diff --git a/icons/hud/radial.dmi b/icons/hud/radial.dmi index 1741623cf0995eb14efceb708de05b117d557d3d..5e3016009564d9e04d66b88dbd687f637a530c75 100644 GIT binary patch literal 27600 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 diff --git a/tgstation.dme b/tgstation.dme index d4afb1b375d..ccd6a7cda1a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1655,6 +1655,7 @@ #include "code\game\objects\items\stacks\medical.dm" #include "code\game\objects\items\stacks\rods.dm" #include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\stack_recipe.dm" #include "code\game\objects\items\stacks\tape.dm" #include "code\game\objects\items\stacks\telecrystal.dm" #include "code\game\objects\items\stacks\tickets.dm" @@ -1664,6 +1665,7 @@ #include "code\game\objects\items\stacks\sheets\leather.dm" #include "code\game\objects\items\stacks\sheets\light.dm" #include "code\game\objects\items\stacks\sheets\mineral.dm" +#include "code\game\objects\items\stacks\sheets\runed_metal.dm" #include "code\game\objects\items\stacks\sheets\sheet_types.dm" #include "code\game\objects\items\stacks\sheets\sheets.dm" #include "code\game\objects\items\stacks\tiles\light.dm"