From 9b36f423cd2f421f173e90015cd3bb01ee61317d Mon Sep 17 00:00:00 2001 From: LDip999 Date: Wed, 27 Aug 2025 00:14:50 +0200 Subject: [PATCH 1/3] Bow and arrows --- .../datums/components/crafting/guncrafting.dm | 6 + .../components/crafting/recipes/weapon.dm | 11 + .../items/bowandarrow/arrow_crafting.dm | 189 ++++++++++++++++++ .../objects/items/stacks/sheets/leather.dm | 2 + .../objects/items/stacks/sheets/mineral.dm | 3 +- .../stacks/sheets/recipes/recipes_metal.dm | 7 +- .../items/stacks/sheets/sheet_types.dm | 9 +- .../projectiles/ammunition/caseless/arrow.dm | 32 ++- code/modules/projectiles/guns/misc/bow.dm | 9 +- .../projectiles/projectile/reusable/arrow.dm | 26 ++- icons/obj/arrow_crafting.dmi | Bin 0 -> 6762 bytes shiptest.dme | 1 + 12 files changed, 283 insertions(+), 12 deletions(-) create mode 100644 code/game/objects/items/bowandarrow/arrow_crafting.dm create mode 100644 icons/obj/arrow_crafting.dmi diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index c26b81bc41eb..e900348c1751 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -20,3 +20,9 @@ desc = "A long piece of Silk that looks like a cable coil." icon = 'icons/obj/improvised.dmi' icon_state = "silkstring" + +/obj/item/weaponcrafting/clothstring + name = "cloth string" + desc = "A long piece of cloth that looks like a cable coil." + icon = 'icons/obj/improvised.dmi' + icon_state = "silkstring" diff --git a/code/datums/components/crafting/recipes/weapon.dm b/code/datums/components/crafting/recipes/weapon.dm index 1f0151054e08..9fa53d4d9af3 100644 --- a/code/datums/components/crafting/recipes/weapon.dm +++ b/code/datums/components/crafting/recipes/weapon.dm @@ -196,6 +196,17 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON + + +/datum/crafting_recipe/longbow + name = "Long Bow" + result = /obj/item/gun/ballistic/bow + reqs = list(/obj/item/stack/sheet/mineral/wood = 2, + /obj/item/weaponcrafting/clothstring = 1) + time = 100 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + /*/datum/crafting_recipe/pipebow name = "Pipe Bow" result = /obj/item/gun/ballistic/bow/pipe diff --git a/code/game/objects/items/bowandarrow/arrow_crafting.dm b/code/game/objects/items/bowandarrow/arrow_crafting.dm new file mode 100644 index 000000000000..b038cd918c4a --- /dev/null +++ b/code/game/objects/items/bowandarrow/arrow_crafting.dm @@ -0,0 +1,189 @@ +/// ARROW CRAFTING ~ + +/// the stickthing that we're using as a base that everything will be slapped onto +/obj/item/arrow_shaft + name = "arrow shaft" + desc = "A long and sturdy piece of wood with notches at both ends. \ + Just add a head and some hay, and you've got yourself a DIY arrow!" + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_shaft" + /// our arrow head type + var/obj/item/stack/arrowhead/the_head + /// Does it have hay on it? + var/has_hay = TRUE // it does + /// The result arrow + var/obj/item/ammo_casing/caseless/arrow/the_arrow + +/obj/item/arrow_shaft/Initialize() + . = ..() + update_icon() // so the hay shows up + +/obj/item/arrow_shaft/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/stack/arrowhead) && attach_arrowhead(W, user)) + return + //if(istype(W, /obj/item/stack/sheet/hay) && attach_hay(W, user)) + // return + . = ..() + +/obj/item/arrow_shaft/attack_hand(mob/user, act_intent, attackchain_flags) + if(ispath(the_head, /obj/item/stack/arrowhead)) + remove_arrowhead(user) + return + //if(has_hay) + // remove_hay(user) + // return + . = ..() + +/obj/item/arrow_shaft/proc/attach_arrowhead(obj/item/stack/arrowhead/a_head, mob/user) + if(!istype(a_head)) + return FALSE + if(the_head || the_arrow) + return FALSE + if(!a_head.use(1)) + user.show_message(span_alert("You need at least one arrow head!")) + return FALSE + the_head = a_head.type + the_arrow = a_head.result_arrow + user.show_message(span_notice("You tie \the [a_head] to the head of the shaft.")) + update_icon() + check_constructed(user) + +/obj/item/arrow_shaft/proc/remove_arrowhead(mob/user) + if(!ispath(the_head, /obj/item/stack/arrowhead)) + return FALSE + var/obj/item/stack/arrowhead/new_head = new(get_turf(src)) + user.put_in_hands(new_head) + the_head = null + the_arrow = null + user.show_message(span_notice("You pull the head off the shaft.")) + update_icon() + check_constructed(user) + +/obj/item/arrow_shaft/proc/check_constructed(mob/user) + if(!ispath(the_head, /obj/item/stack/arrowhead)) + return FALSE + else if(!ispath(initial(the_head.result_arrow), /obj/item/ammo_casing/caseless/arrow)) + remove_arrowhead(user) + return FALSE + if(!has_hay) + return FALSE + finish_construction(user) + return TRUE + +/obj/item/arrow_shaft/proc/finish_construction(mob/user) + var/obj/item/ammo_casing/caseless/arrow/make_this_arrow = new the_arrow(get_turf(user)) + if(ismob(user)) + user.visible_message(span_notice("[user] makes \a [make_this_arrow]!")) + user.put_in_hands(make_this_arrow) // Try to put it in your hand + qdel(src) + +/obj/item/arrow_shaft/update_overlays() + . = ..() + if(ispath(the_head, /obj/item/stack/arrowhead)) + . += mutable_appearance(initial(the_head.icon), "[initial(the_head.icon_state)]_overlay") + if(has_hay) + . += mutable_appearance(icon, "arrow_fletching") + + +/// The arrow heads, use these on the shaft to stick them on the shaft, ezpz +/obj/item/stack/arrowhead + name = "arrow heads" + singular_name = "arrow head" + desc = "A standard vanilla arrowhead." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_arrow" + merge_type = /obj/item/stack/arrowhead + max_amount = 40 + /// The head defines the resulting arrow + var/obj/item/ammo_casing/caseless/arrow/result_arrow = /obj/item/ammo_casing/caseless/arrow + +/obj/item/stack/arrowhead/field + name = "field arrow heads" + singular_name = "field arrow head" + desc = "A thin, sharpened piece of metal, filed down to an aerodynamic point." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_field" + merge_type = /obj/item/stack/arrowhead/field + result_arrow = /obj/item/ammo_casing/caseless/arrow/field + +/obj/item/stack/arrowhead/bone + name = "bone arrow heads" + singular_name = "bone arrow head" + desc = "A sharpened 'animal' bone, filed down to an aerodynamic point." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_bone" + merge_type = /obj/item/stack/arrowhead/bone + result_arrow = /obj/item/ammo_casing/caseless/arrow/bone + +/obj/item/stack/arrowhead/flint + name = "flint arrow heads" + singular_name = "flint arrow head" + desc = "A sharpened piece of flint, filed down to an aerodynamic point." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_flint" + merge_type = /obj/item/stack/arrowhead/flint + result_arrow = /obj/item/ammo_casing/caseless/arrow/flint + +/*/obj/item/stack/arrowhead/glass + name = "glass arrow heads" + singular_name = "glass arrow head" + desc = "A sharpened piece of glass, filed down to an aerodynamic point." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_glass" + merge_type = /obj/item/stack/arrowhead/glass + result_arrow = /obj/item/ammo_casing/caseless/arrow/glass*/ + +/*/obj/item/stack/arrowhead/broadhead + name = "broadhead arrow tips" + singular_name = "broadhead arrow tip" + desc = "An extra-sharp arrowhead made for slicing up exposed flesh." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_broadhead" + merge_type = /obj/item/stack/arrowhead/broadhead + result_arrow = /obj/item/ammo_casing/caseless/arrow/broadhead*/ + +/obj/item/stack/arrowhead/bodkin + name = "bodkin arrow tips" + singular_name = "bodkin arrow tip" + desc = "An extra-pointy arrowhead made for penetrating armor." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_bodkin" + merge_type = /obj/item/stack/arrowhead/bodkin + result_arrow = /obj/item/ammo_casing/caseless/arrow/bodkin + +/*/obj/item/stack/arrowhead/explosive + name = "explosive arrow heads" + singular_name = "explosive arrow head" + desc = "A sack of explosives, ready to rearrange someone's guts all over the road." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_explosive" + merge_type = /obj/item/stack/arrowhead/explosive + result_arrow = /obj/item/ammo_casing/caseless/arrow/explosive + +/obj/item/stack/arrowhead/ion + name = "ion arrow heads" + singular_name = "ion arrow head" + desc = "A clump of charged electronic chunks, ready to let out all manner of electrical nonsense on whatever it hits." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_ion" + merge_type = /obj/item/stack/arrowhead/ion + result_arrow = /obj/item/ammo_casing/caseless/arrow/ion + +/obj/item/stack/arrowhead/split + name = "split arrow heads" + singular_name = "split arrow head" + desc = "A clump of arrows loosely bound with string, spreads out after shooting." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_splitarrow" + merge_type = /obj/item/stack/arrowhead/split + result_arrow = /obj/item/ammo_casing/caseless/arrow/split + +/obj/item/stack/arrowhead/bludgeon + name = "bludgeoning arrow heads" + singular_name = "bludgeoning arrow head" + desc = "A blunt sack, ready to gently paff someone from across the road." + icon = 'icons/obj/arrow_crafting.dmi' + icon_state = "arrow_head_bludgeon" + merge_type = /obj/item/stack/arrowhead/bludgeon + result_arrow = /obj/item/ammo_casing/caseless/arrow/bludgeon +*/ diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 2992a6d81970..77aed4d475a1 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -129,6 +129,8 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ new/datum/stack_recipe("leather jacket", /obj/item/clothing/suit/jacket/leather, 7), \ new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2), \ new/datum/stack_recipe("saddle", /obj/item/saddle, 5), \ + new/datum/stack_recipe("quiver", /obj/item/storage/bag/quiver, 2), \ + )) /obj/item/stack/sheet/leather/get_main_recipes() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 6701569352ef..b2dbcec0fe85 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -26,7 +26,8 @@ Mineral Sheets 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("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = 0, on_floor = 1) \ + new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = 0, on_floor = 1), \ + new/datum/stack_recipe("flint arrowhead", /obj/item/stack/arrowhead/flint, 1, 1, 25, time = 2.5 SECONDS) \ )) /obj/item/stack/sheet/mineral/sandstone diff --git a/code/game/objects/items/stacks/sheets/recipes/recipes_metal.dm b/code/game/objects/items/stacks/sheets/recipes/recipes_metal.dm index d8db71aa5b49..8b1e6080ee3b 100644 --- a/code/game/objects/items/stacks/sheets/recipes/recipes_metal.dm +++ b/code/game/objects/items/stacks/sheets/recipes/recipes_metal.dm @@ -250,5 +250,10 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("chest press", /obj/structure/weightmachine/stacklifter, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bench press", /obj/structure/weightmachine/weightlifter, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ )), \ - new/datum/stack_recipe("shower", /obj/machinery/shower, 3, time = 25) + new/datum/stack_recipe("shower", /obj/machinery/shower, 3, time = 25), + new/datum/stack_recipe_list("Arrow heads", list( \ + new/datum/stack_recipe("regular arrowhead", /obj/item/stack/arrowhead, 2, 1, 25, time = 2.5 SECONDS), \ + /* TODO: THIS THING /new/datum/stack_recipe("bludgeoning arrowhead", /obj/item/stack/arrowhead/bludgeon, 1, 1, 25, time = 1 SECONDS), \*/ + new/datum/stack_recipe("field arrowhead", /obj/item/stack/arrowhead/field, 1, 1, 25, time = 1 SECONDS) \ + ))\ )) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 0f730ab7b7b0..ab10ee70029e 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -155,8 +155,9 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ null, \ new/datum/stack_recipe("wooden railing", /obj/structure/railing/wood, 3, time = 18, window_checks = TRUE), \ new/datum/stack_recipe("wooden railing corner", /obj/structure/railing/corner/wood, 1, time = 10, window_checks = TRUE), \ - new /datum/stack_recipe("wooden computer frame", /obj/structure/frame/computer/solgov, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("wooden computer frame", /obj/structure/frame/computer/solgov, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("planter box", /obj/machinery/hydroponics/wooden, 5, time = 8 SECONDS, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("arrow shaft", /obj/item/arrow_shaft, 1, time = 0.5 SECONDS), \ )) /obj/item/stack/sheet/mineral/wood @@ -265,6 +266,8 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("23x19 canvas", /obj/item/canvas/twentythreeXnineteen, 4), \ new/datum/stack_recipe("23x23 canvas", /obj/item/canvas/twentythreeXtwentythree, 5), \ new/datum/stack_recipe("punching bag", /obj/structure/punching_bag, 5, time = 25, one_per_turf = TRUE, on_floor = TRUE), \ + null, \ + new/datum/stack_recipe("cloth string", /obj/item/weaponcrafting/clothstring, 1), \ )) /obj/item/stack/sheet/cotton/cloth @@ -512,7 +515,9 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ GLOBAL_LIST_INIT(bone_recipes, list( \ new /datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar/bone, 3), \ - new /datum/stack_recipe("bone dagger", /obj/item/melee/knife/bone, 2))) + new /datum/stack_recipe("bone dagger", /obj/item/melee/knife/bone, 2),\ + new /datum/stack_recipe("bone arrowhead", /obj/item/stack/arrowhead/bone, 1, 1, 25, time = 2 SECONDS)\ + )) /obj/item/stack/sheet/bone name = "bones" diff --git a/code/modules/projectiles/ammunition/caseless/arrow.dm b/code/modules/projectiles/ammunition/caseless/arrow.dm index 114a18452095..44e640025451 100644 --- a/code/modules/projectiles/ammunition/caseless/arrow.dm +++ b/code/modules/projectiles/ammunition/caseless/arrow.dm @@ -1,7 +1,8 @@ /obj/item/ammo_casing/caseless/arrow name = "arrow" - desc = "An arrow made of... something. It's hella sharp." + desc = "a simple arrow with a metal head." projectile_type = /obj/projectile/bullet/reusable/arrow + icon = 'icons/obj/arrow_crafting.dmi' caliber = "arrow" icon_state = "arrow" throwforce = 3 //good luck hitting someone with the pointy end of the arrow @@ -9,8 +10,33 @@ firing_effect_type = null flags_1 = NONE heavy_metal = FALSE + w_class = WEIGHT_CLASS_SMALL -/obj/item/ammo_casing/caseless/arrow/wood +/obj/item/ammo_casing/caseless/arrow/field + name = "field arrow" + desc = "Used primarily for small game and target practice, the tip is very narrow." + projectile_type = /obj/projectile/bullet/reusable/arrow/field + icon_state = "fieldarrow" + +/obj/item/ammo_casing/caseless/arrow/bone + name = "bone arrow" + desc = "A primitive arrow with a head made of knapped bone." + projectile_type = /obj/projectile/bullet/reusable/arrow/bone + icon_state = "bone" + +/obj/item/ammo_casing/caseless/arrow/flint + name = "flint arrow" + desc = "a primitive arrow with a head made of knapped flint." + projectile_type = /obj/projectile/bullet/reusable/arrow/bone + icon_state = "flint" + +/obj/item/ammo_casing/caseless/arrow/bodkin + name = "bodkin arrow" + desc = "Armor-piercing arrows." + projectile_type = /obj/projectile/bullet/reusable/arrow/bodkin + icon_state = "bodkin" + +/*/obj/item/ammo_casing/caseless/arrow/wood name = "wooden arrow" desc = "An arrow made of wood, typically fired from a bow." projectile_type = /obj/projectile/bullet/reusable/arrow/wood @@ -31,4 +57,4 @@ name = "bronze arrow" desc = "An arrow made from wood. tipped with bronze." icon_state = "bronzearrow" - projectile_type = /obj/projectile/bullet/reusable/arrow/bronze + projectile_type = /obj/projectile/bullet/reusable/arrow/bronze*/ diff --git a/code/modules/projectiles/guns/misc/bow.dm b/code/modules/projectiles/guns/misc/bow.dm index aee792acb130..60acd37719ca 100644 --- a/code/modules/projectiles/guns/misc/bow.dm +++ b/code/modules/projectiles/guns/misc/bow.dm @@ -7,7 +7,7 @@ spawn_blacklisted = TRUE load_sound = null fire_sound = 'sound/weapons/bowfire.ogg' - slot_flags = ITEM_SLOT_BACK + slot_flags = ITEM_SLOT_BACK || ITEM_SLOT_SUITSTORE default_ammo_type = /obj/item/ammo_box/magazine/internal/bow allowed_ammo_types = list( /obj/item/ammo_box/magazine/internal/bow, @@ -47,7 +47,8 @@ to_chat(user, "You can't shoot without drawing the bow.") return drawn = FALSE - . = ..() //fires, removing the arrow + . = ..() //fires, removing the arrow <-- DOESN'T REMOVE ARROW!!!!! WHY DO I HAVE TO FIXIT + magazine.stored_ammo.Cut() update_appearance() /obj/item/gun/ballistic/bow/shoot_with_empty_chamber(mob/living/user) @@ -71,9 +72,9 @@ /obj/item/storage/bag/quiver/Initialize(mapload) . = ..() var/datum/component/storage/storage = GetComponent(/datum/component/storage) - storage.max_w_class = WEIGHT_CLASS_TINY + storage.max_w_class = WEIGHT_CLASS_SMALL storage.max_items = 40 - storage.max_combined_w_class = 100 + storage.max_combined_w_class = 200 storage.set_holdable(list( /obj/item/ammo_casing/caseless/arrow )) diff --git a/code/modules/projectiles/projectile/reusable/arrow.dm b/code/modules/projectiles/projectile/reusable/arrow.dm index de0e58d92192..8d046aafdbaf 100644 --- a/code/modules/projectiles/projectile/reusable/arrow.dm +++ b/code/modules/projectiles/projectile/reusable/arrow.dm @@ -6,7 +6,30 @@ icon_state = "arrow" ammo_type = /obj/item/ammo_casing/caseless/arrow -/obj/projectile/bullet/reusable/arrow/wood +/obj/projectile/bullet/reusable/arrow/field + name = "Field Arrow" + damage = 20 + ammo_type = /obj/item/ammo_casing/caseless/arrow/field + +/obj/projectile/bullet/reusable/arrow/bone + name = "Bone Arrow" + armour_penetration = 20 + ammo_type = /obj/item/ammo_casing/caseless/arrow/bone + +/obj/projectile/bullet/reusable/arrow/flint + name = "Flint Arrow" + desc = "a primitive arrow with a head made of knapped flint." + ammo_type = /obj/item/ammo_casing/caseless/arrow/flint + +/obj/projectile/bullet/reusable/arrow/bodkin + name = "Bodkin Arrow" + desc = "Armor-piercing arrows." + damage = 40 + armour_penetration = 20 + ammo_type = /obj/item/ammo_casing/caseless/arrow/bodkin + + +/*/obj/projectile/bullet/reusable/arrow/wood name = "Wooden arrow" damage = 15 ammo_type = /obj/item/ammo_casing/caseless/arrow/wood @@ -30,3 +53,4 @@ damage = 20 armour_penetration = 10 ammo_type = /obj/item/ammo_casing/caseless/arrow/bronze +*/ diff --git a/icons/obj/arrow_crafting.dmi b/icons/obj/arrow_crafting.dmi new file mode 100644 index 0000000000000000000000000000000000000000..de1ed98f91730b231b3ad7ecec51d5ab45d5bba2 GIT binary patch literal 6762 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 literal 0 HcmV?d00001 diff --git a/shiptest.dme b/shiptest.dme index c433bf197914..ae63d5bb48fd 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1418,6 +1418,7 @@ #include "code\game\objects\items\attachments\gun_attachments\flamethrower.dm" #include "code\game\objects\items\attachments\gun_attachments\flaregun.dm" #include "code\game\objects\items\attachments\gun_attachments\riot_launcher.dm" +#include "code\game\objects\items\bowandarrow\arrow_crafting.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" #include "code\game\objects\items\circuitboards\computer_circuitboards.dm" #include "code\game\objects\items\circuitboards\machine_circuitboards.dm" From 2568eb523d1b5618a72f9674ed2b1f6e37cbce06 Mon Sep 17 00:00:00 2001 From: LDip999 Date: Wed, 27 Aug 2025 00:30:41 +0200 Subject: [PATCH 2/3] de-guns most of the vagrant and gives them bows instead --- _maps/shuttles/roumain/srm_vagrant.dmm | 39 +++++++------------------- 1 file changed, 10 insertions(+), 29 deletions(-) diff --git a/_maps/shuttles/roumain/srm_vagrant.dmm b/_maps/shuttles/roumain/srm_vagrant.dmm index 343bd805fa84..ff8680689328 100644 --- a/_maps/shuttles/roumain/srm_vagrant.dmm +++ b/_maps/shuttles/roumain/srm_vagrant.dmm @@ -446,11 +446,6 @@ /obj/structure/closet/secure_closet/collignes, /obj/item/clothing/suit/armor/roumain/colligne, /obj/item/clothing/head/cowboy/sec/roumain/colligne, -/obj/item/ammo_box/c38, -/obj/item/ammo_box/c38, -/obj/item/storage/box/ammo/c38, -/obj/item/gun/ballistic/revolver/detective, -/obj/item/storage/backpack/satchel/leather, /obj/item/gps{ pixel_x = -7 }, @@ -2561,23 +2556,14 @@ /turf/open/floor/wood/walnut, /area/ship/crew/cryo) "RH" = ( -/obj/structure/rack, -/obj/machinery/door/window/brigdoor/westleft, -/obj/item/ammo_box/magazine/illestren_a850r{ - pixel_x = -2; - pixel_y = -8 - }, -/obj/item/ammo_box/magazine/illestren_a850r{ - pixel_x = 5; - pixel_y = -3 - }, /obj/effect/turf_decal/siding/brown{ dir = 8 }, -/obj/item/storage/toolbox/ammo/shotgun, -/obj/item/storage/box/ammo/a8_50r, -/obj/item/storage/box/ammo/a12g_slug, -/obj/item/storage/box/ammo/a8_50r/match, +/obj/structure/table/wood, +/obj/item/storage/bag/quiver, +/obj/item/storage/bag/quiver, +/obj/item/storage/bag/quiver, +/obj/item/storage/bag/quiver, /turf/open/floor/wood/walnut, /area/ship/security) "Ss" = ( @@ -2821,19 +2807,14 @@ /turf/open/floor/plating, /area/ship/engineering/engine) "VO" = ( -/obj/machinery/door/window/brigdoor/westright, -/obj/structure/guncloset{ - anchored = 1 - }, -/obj/item/gun/ballistic/shotgun/flamingarrow/conflagration, -/obj/item/gun/ballistic/rifle/illestren/factory{ - pixel_x = -4; - pixel_y = -5 - }, /obj/effect/turf_decal/siding/brown{ dir = 8 }, -/obj/item/gun/ballistic/shotgun/flamingarrow/conflagration, +/obj/structure/table/wood, +/obj/item/gun/ballistic/bow, +/obj/item/gun/ballistic/bow, +/obj/item/gun/ballistic/bow, +/obj/item/gun/ballistic/bow, /turf/open/floor/wood/walnut, /area/ship/security) "Wg" = ( From 0ac499b0a464bd2c5f698dd212371fe492aa3a1f Mon Sep 17 00:00:00 2001 From: LDip999 Date: Wed, 27 Aug 2025 19:38:11 +0200 Subject: [PATCH 3/3] Oopsie! --- code/modules/projectiles/ammunition/caseless/arrow.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/ammunition/caseless/arrow.dm b/code/modules/projectiles/ammunition/caseless/arrow.dm index 44e640025451..11cbe477a65b 100644 --- a/code/modules/projectiles/ammunition/caseless/arrow.dm +++ b/code/modules/projectiles/ammunition/caseless/arrow.dm @@ -27,7 +27,7 @@ /obj/item/ammo_casing/caseless/arrow/flint name = "flint arrow" desc = "a primitive arrow with a head made of knapped flint." - projectile_type = /obj/projectile/bullet/reusable/arrow/bone + projectile_type = /obj/projectile/bullet/reusable/arrow/flint icon_state = "flint" /obj/item/ammo_casing/caseless/arrow/bodkin