diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index ed00a731287..28db00ae3f3 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -255,3 +255,15 @@ ) time = 120 SECONDS category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/dragonator_spear_untreated + name = "Untreated Giant-Killer Spear" + result = /obj/item/spear/dragonator_untreated + reqs = list( + /obj/item/stack/sheet/plasteel = 15, + /obj/item/stack/sheet/mineral/titanium = 5, + /obj/item/knife = 7, + ) + time = 5 SECONDS + category = CAT_WEAPON_MELEE + diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 0c969659865..df4313cc114 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -316,7 +316,7 @@ /datum/crafting_recipe/pipe_organ_gun name = "Pipe Organ Gun" tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) - result = /obj/structure/mounted_gun/pipe + result = /obj/structure/mounted_gun/organ_gun reqs = list( /obj/item/pipe = 8, /obj/item/stack/sheet/mineral/wood = 15, @@ -329,6 +329,47 @@ category = CAT_WEAPON_RANGED crafting_flags = CRAFT_CHECK_DENSITY +/datum/crafting_recipe/Ratvarian_Repeater + name = "Emplaced Ratvarian Repeater" + tool_behaviors = list(TOOL_SCREWDRIVER,TOOL_WRENCH) + result = /obj/structure/mounted_gun/ratvarian_repeater + reqs = list( + /obj/item/stack/cable_coil = 15, + /obj/item/stock_parts/micro_laser = 2, + /obj/item/stock_parts/capacitor = 2, + /obj/item/reagent_containers/cup/glass/drinkingglass = 2, + /obj/item/stack/sheet/bronze = 5, + /obj/item/stack/rods = 10, + ) + time = 15 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY + +/datum/crafting_recipe/Detached_Ratvarian_Repeater + name = "Iconoclast's Repeater" + tool_behaviors = list(TOOL_WELDER) + result = /obj/item/gun/energy/laser/musket/repeater + structures = list( + /obj/structure/mounted_gun/ratvarian_repeater = CRAFTING_STRUCTURE_CONSUME, + ) + time = 10 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY + + +/datum/crafting_recipe/large_ballista + name = "Improvised Ballista" + tool_behaviors = list(TOOL_WELDER,TOOL_SCREWDRIVER,TOOL_WRENCH,TOOL_WIRECUTTER) + result = /obj/structure/mounted_gun/ballista + reqs = list( + /obj/item/stack/cable_coil = 15, + /obj/item/stack/sheet/iron = 10, + /obj/item/stack/rods = 10, + ) + time = 8 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY + /datum/crafting_recipe/trash_cannon name = "Trash Cannon" tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 5282cf2fb42..81c4de9a2fb 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -293,6 +293,68 @@ slapcraft_recipes = slapcraft_recipe_list,\ ) +/* + * Anti-big monster spear + * "WHERES MY DRAGONATOR?!" + */ +/obj/item/spear/dragonator + icon = 'icons/obj/weapons/48x.dmi' + icon_state = "speardragon0" + icon_prefix = "speardragon" + base_icon_state = "speardragon0" + lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' + name = "Giantslayer Spear" + desc = "An oversized multi-bladed spear designed to kill large hostile xenoforms such as space dragons or the creatures of lavaland. Capable of being launched from a ballista." + demolition_mod = 0.5 + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + force = 13 + throwforce = 23 + throw_range = 9 + throw_speed = 5 + wound_bonus = 0 + exposed_wound_bonus = 20 + force_unwielded = 13 + force_wielded = 21 + armour_penetration = 15 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 42, + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 15, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 5) + +/obj/item/spear/dragonator/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = MOB_MINING, damage_multiplier = 3.5) //For killing really big monsters, + +/* + * Untreated Giantslayer , needs to be thrown into lava + */ +/obj/item/spear/dragonator_untreated + icon = 'icons/obj/weapons/48x.dmi' + icon_state = "speardragonraw0" + icon_prefix = "speardragonraw" + base_icon_state = "speardragonraw0" + lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' + name = "Unfired Giantslayer Spear" + desc = "A half-finished giantslayer spear, needs to be thrown in lava to forge the metals to a killing edge." + demolition_mod = 0.5 + wound_bonus = 0 + exposed_wound_bonus = 0 + force_unwielded = 5 + force_wielded = 10 + armour_penetration = 0 + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 42, + /datum/material/alloy/plasteel = SHEET_MATERIAL_AMOUNT * 15, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 5) + +/obj/item/spear/dragonator_untreated/fire_act(exposed_temperature, exposed_volume) + var/obj/item/spear/dragonator/dragonator = new(loc) + playsound(dragonator.loc, 'sound/effects/magic/staff_change.ogg',5) + qdel(src) + + /* * Bone Spear */ diff --git a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm index ef4b9e3d55d..758a3f197e8 100644 --- a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm +++ b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm @@ -9,20 +9,35 @@ icon = 'icons/obj/weapons/cannons.dmi' icon_state = "falconet_patina" var/icon_state_base = "falconet_patina" + var/icon_state_loaded = "falconet_patina" var/icon_state_fire = "falconet_patina_fire" max_integrity = 300 ///whether the cannon can be unwrenched from the ground. Anchorable_cannon equivalent. var/anchorable_gun = TRUE + /// does this thing need ammo at all or does it just make ammo? + var/uses_ammo = TRUE ///Max shots per firing of the gun. var/max_shots_per_fire = 1 + ///Delay it takes to load the gun. Set to 0 if none. + var/load_delay = 0 + ///Message displayed when loading gun + var/loading_message = "gun loaded" ///Shots currently loaded. Should never be more than max_shots_per_fire. var/shots_in_gun = 1 ///shots added to gun, per piece of ammo loaded. var/shots_per_load = 1 + ///Does it have an alternative ammo type it can uses + var/has_alt_ammo = FALSE + //Is it loaded with said alternative ammo? + var/use_alt_ammo = FALSE ///Accepted "ammo" type var/obj/item/ammo_type = /obj/item/ammo_casing/strilka310 + ///Alternative ammo types, for extra effects! + var/obj/item/alt_ammo_type = /obj/item/ammo_casing/strilka310 ///Projectile from said gun. Doesnt automatically inherit said ammo's projectile in case you wanted to make a gun that shoots floor tiles or something. var/obj/projectile/projectile_type = /obj/projectile/bullet/strilka310 + ///Projectile from said gun. Doesnt automatically inherit said ammo's projectile in case you wanted to make a gun that shoots floor tiles or something. + var/obj/projectile/alt_projectile_type = /obj/projectile/bullet/strilka310 ///If the gun has anything in it. var/loaded_gun = TRUE ///If the gun is currently loaded with its maximum capacity. @@ -37,6 +52,8 @@ var/fire_sound = 'sound/items/weapons/gun/general/mountedgun.ogg' ///sound of firing for last shot var/last_fire_sound = 'sound/items/weapons/gun/general/mountedgunend.ogg' + ///So you can't reload it mid-firing + var/is_firing = FALSE /obj/structure/mounted_gun/wrench_act(mob/living/user, obj/item/tool) . = ..() @@ -46,37 +63,45 @@ return ITEM_INTERACT_SUCCESS ///Covers Reloading and lighting of the gun -/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, list/modifiers, list/attack_modifiers) - var/ignition_message = used_item.ignition_effect(src, user) // Checks if item used can ignite stuff. - if(istype(used_item, ammo_type)) +/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, params) + if(is_firing) + balloon_alert(user, "gun is firing!") + return + if(istype(used_item, ammo_type) && (uses_ammo == TRUE)) //see if the gun needs to be loaded in some way. if(fully_loaded_gun) balloon_alert(user, "already fully loaded!") return - else - shots_in_gun = shots_in_gun + shots_per_load //Add one to the shots in the gun - loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire. - QDEL_NULL(used_item) - if(shots_in_gun >= max_shots_per_fire) - shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size. - fully_loaded_gun = TRUE //So you cant load extra. + if(load_delay > 0 && !do_after(user, load_delay, target = src)) return - else if(ignition_message) // if item the player used ignites, light the gun! - visible_message(ignition_message) - user.log_message("fired a cannon", LOG_ATTACK) - log_game("[key_name(user)] fired a cannon in [AREACOORD(src)]") - addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun + shots_in_gun = shots_in_gun + shots_per_load //Add one to the shots in the gun + balloon_alert(user, loading_message) + loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire. + QDEL_NULL(used_item) + if(shots_in_gun >= max_shots_per_fire) + shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size. + fully_loaded_gun = TRUE //So you cant load extra. + icon_state = icon_state_loaded return - ..() + +/obj/structure/mounted_gun/attack_hand(mob/living/user, list/modifiers) + if(is_firing) + balloon_alert(user, "gun is firing!") + return + user.log_message("fired a mounted gun", LOG_ATTACK) + log_game("[key_name(user)] fired a mounted gun in [AREACOORD(src)]") + addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun + return /obj/structure/mounted_gun/proc/fire() if (!loaded_gun) balloon_alert_to_viewers("gun is not loaded!","",2) return + is_firing = TRUE for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. for(var/mob/shaken_mob in urange(10, src)) - if(shaken_mob.stat == CONSCIOUS && firing_shakes_camera == TRUE) + if(shaken_mob.stat == CONSCIOUS && firing_shakes_camera == TRUE) //is the mob awake to feel the shaking? shake_camera(shaken_mob, 3, 1) icon_state = icon_state_fire if(loaded_gun) @@ -84,23 +109,29 @@ if (times_fired < shots_in_gun) playsound(src, fire_sound, 50, FALSE, 5) else - playsound(src, last_fire_sound, 50, TRUE, 5) - var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + playsound(src, last_fire_sound, 50, TRUE, 5) //for the empty fire sound + + var/obj/projectile/fired_projectile = (use_alt_ammo) ? new alt_projectile_type(get_turf(src)) : new projectile_type(get_turf(src)) fired_projectile.firer = src fired_projectile.fired_from = src fired_projectile.fire(dir2angle(dir)) sleep(shot_delay) - loaded_gun = FALSE - shots_in_gun = 0 - fully_loaded_gun = FALSE + + if(uses_ammo == TRUE) + loaded_gun = FALSE + use_alt_ammo = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + is_firing = FALSE icon_state = icon_state_base -/obj/structure/mounted_gun/pipe +/obj/structure/mounted_gun/organ_gun name = "Pipe Organ Gun" desc = "To become master over one who has killed, one must become a better killer. This engine of destruction is one of many things made to that end." icon_state = "pipeorgangun" icon_state_base = "pipeorgangun" + icon_state_loaded = "pipeorgangun" icon_state_fire = "pipeorgangun_fire" anchored = FALSE anchorable_gun = TRUE @@ -116,7 +147,7 @@ firing_shakes_camera = FALSE custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 24.5, /datum/material/wood = SHEET_MATERIAL_AMOUNT * 15, /datum/material/glass = SMALL_MATERIAL_AMOUNT) -/obj/structure/mounted_gun/pipe/examine_more(mob/user) +/obj/structure/mounted_gun/organ_gun/examine_more(mob/user) . = ..() . += span_notice("Looking down at \the [src], you recall a tale told to you in some distant memory...") @@ -126,7 +157,7 @@ . += span_info("As such, the man who ended another's life with a stone, was in turn smote himself by another wielding a spear. After spears, bows. Swords. Guns. Tanks. Missiles. And on and on Vengeance fed. Growing stronger. Growing Worse.") . += span_info("Vengeance persists to this day. It sometimes may slumber, seemingly content with having gorged itself, but in the end, its ceaseless hunger can be neither numbed nor sated.") -/obj/structure/mounted_gun/pipe/fire() +/obj/structure/mounted_gun/organ_gun/fire() if (!loaded_gun) balloon_alert_to_viewers("Gun is not loaded!","",2) return @@ -165,6 +196,7 @@ desc = "''Quantity has a quality of its own.''" icon_state = "canister_gatling" icon_state_base = "canister_gatling" + icon_state_loaded = "canister_gatling" icon_state_fire = "canister_gatling_fire" anchored = FALSE anchorable_gun = TRUE @@ -187,3 +219,136 @@ throwforce = 0 w_class = WEIGHT_CLASS_BULKY projectile_type = /obj/projectile/bullet/shrapnel + +/obj/structure/mounted_gun/ratvarian_repeater + name = "Ratvarian Repeater" + desc = "''Brains? Bronze? Why not both?''" + icon_state = "ratvarian_repeater" + icon_state_base = "ratvarian_repeater" + icon_state_fire = "ratvarian_repeater_fire" + loading_message = "gun charged" + anchored = FALSE + anchorable_gun = TRUE + uses_ammo = FALSE + load_delay = 30 + max_shots_per_fire = 12 + shots_per_load = 12 + shots_in_gun = 12 + fire_sound = 'sound/items/weapons/thermalpistol.ogg' + last_fire_sound = 'sound/items/weapons/thermalpistol.ogg' + projectile_type = /obj/projectile/beam/laser/musket/repeater + loaded_gun = TRUE + fully_loaded_gun = TRUE + fire_delay = 1 + shot_delay = 2 + firing_shakes_camera = FALSE + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.25, + /datum/material/bronze = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.29 + ) + +/obj/structure/mounted_gun/ratvarian_repeater/dump_contents() + return // Stub because we don't want to do anything here + +/obj/structure/mounted_gun/ratvarian_repeater/attack_hand(mob/user, params) //the repeater is weird so has to have its own code since it takes no ammo. + + if(is_firing) + balloon_alert(user, "gun is firing!") + return + + if(!fully_loaded_gun) + if(!do_after(user, load_delay, target = src)) + return + shots_in_gun = shots_per_load //Add one to the shots in the gun + balloon_alert(user, "mechanism wound.") + playsound(src, 'sound/effects/magic/clockwork/fellowship_armory.ogg', 50, FALSE, 5) + loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire. + if(shots_in_gun >= max_shots_per_fire) + shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size. + fully_loaded_gun = TRUE //So you cant load extra. + return + + user.log_message("fired a ratvatian repeater", LOG_ATTACK) + log_game("[key_name(user)] fired a ratvatian repeater in [AREACOORD(src)]") + addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun + +/obj/structure/mounted_gun/ratvarian_repeater/fire() + if (!loaded_gun) + balloon_alert_to_viewers("needs winding!", vision_distance = 2) + return + is_firing = TRUE + for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself. + if(loaded_gun) + icon_state = icon_state_fire + if (times_fired < shots_in_gun) + playsound(src, fire_sound, 50, FALSE, 5) + else + playsound(src, last_fire_sound, 50, TRUE, 5) //for the empty fire sound + var/obj/projectile/fired_projectile = new projectile_type(get_turf(src)) + fired_projectile.firer = src + fired_projectile.fired_from = src + fired_projectile.fire(dir2angle(dir)) + if(times_fired % 2 != 1)//Burst Fire. + sleep(shot_delay) + sleep(shot_delay) + loaded_gun = FALSE + shots_in_gun = 0 + fully_loaded_gun = FALSE + is_firing = FALSE + icon_state = icon_state_base + +/obj/structure/mounted_gun/ballista + name = "Improvised Ballista" + desc = "''Engineers like to solve problems. If there are no problems handily available, they will create their own problems.''" + icon_state = "Improvised_Ballista" + icon_state_base = "Improvised_Ballista" + icon_state_loaded = "Improvised_Ballista_Loaded" + icon_state_fire = "Improvised_Ballista" + anchored = FALSE + anchorable_gun = TRUE + uses_ammo = TRUE + load_delay = 60 + max_shots_per_fire = 1 + shots_per_load = 1 + shots_in_gun = 1 + fire_sound = 'sound/items/xbow_lock.ogg' + last_fire_sound = 'sound/items/xbow_lock.ogg' + has_alt_ammo = TRUE + ammo_type = /obj/item/spear + projectile_type = /obj/projectile/bullet/ballista_spear + alt_ammo_type = /obj/item/spear/dragonator + alt_projectile_type = /obj/projectile/bullet/ballista_spear_dragon + loaded_gun = FALSE + fully_loaded_gun = FALSE + fire_delay = 1 + shot_delay = 1 + firing_shakes_camera = FALSE + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 15.15, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.5 + ) + +/obj/structure/mounted_gun/ballista/attackby(obj/item/ammo_casing/used_item, mob/user, params) //again its single shot so its kinda weird. + if(is_firing) + balloon_alert(user, "gun is firing") + return + + if(!istype(used_item, ammo_type)) + return + + if(fully_loaded_gun) + balloon_alert(user, "already fully loaded!") + return + + if(istype(used_item, alt_ammo_type)) + use_alt_ammo = TRUE + + playsound(src, 'sound/items/weapons/draw_bow.ogg', 50, FALSE, 5) + do_after(user, load_delay, target = src) + shots_in_gun = 1 //MAX OF ONE SHOT. + balloon_alert(user, loading_message) + loaded_gun = TRUE + QDEL_NULL(used_item) + fully_loaded_gun = TRUE + icon_state = icon_state_loaded diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 0a8abfa4d5c..4ae41e99ce9 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -61,6 +61,13 @@ pellets = 3 variance = 10 +/obj/item/ammo_casing/energy/laser/musket/repeater + projectile_type = /obj/projectile/beam/laser/musket/repeater + pellets = 2 + variance = 10 + fire_sound = 'sound/items/weapons/thermalpistol.ogg' + e_cost = LASER_SHOTS(6, STANDARD_CELL_CHARGE) + /obj/item/ammo_casing/energy/laser/practice projectile_type = /obj/projectile/beam/practice select_name = "practice" diff --git a/code/modules/projectiles/guns/energy/crank_guns.dm b/code/modules/projectiles/guns/energy/crank_guns.dm index 4110874abfb..1a2e785cd39 100644 --- a/code/modules/projectiles/guns/energy/crank_guns.dm +++ b/code/modules/projectiles/guns/energy/crank_guns.dm @@ -151,6 +151,35 @@ light_color = COLOR_BLUE ammo_type = list(/obj/item/ammo_casing/energy/nanite/cryo) +/obj/item/gun/energy/laser/musket/repeater + name = "Iconoclast's Repeater" + desc = "A weapon of incredible bulk, this ratvarian repeater has been permanently severed from its stand to be carried by hand. Cumbersome, Yes - but powerful." + icon_state = "repeater" + inhand_icon_state = "repeater" + slowdown = 1 + w_class = WEIGHT_CLASS_HUGE + ammo_type = list(/obj/item/ammo_casing/energy/laser/musket/repeater) + spread = 20 + charge_sections = 1 + item_flags = SLOWS_WHILE_IN_HAND | IMMUTABLE_SLOW + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5.25, + /datum/material/bronze = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.29 + ) + +/obj/item/gun/energy/laser/musket/repeater/Initialize(mapload) + . = ..() + AddComponent( \ + /datum/component/crank_recharge, \ + charging_cell = get_cell(), \ + charge_amount = STANDARD_CELL_CHARGE, \ + cooldown_time = 3 SECONDS, \ + charge_sound = 'sound/machines/clockcult/integration_cog_install.ogg', \ + charge_sound_cooldown_time = 3 SECONDS, \ + charge_move = IGNORE_USER_LOC_CHANGE, \ + ) + AddComponent(/datum/component/automatic_fire, 0.5 SECONDS) // The Deep Lore // // Laser Musket diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 95192c6c7bc..4a8a13b05a4 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -118,6 +118,15 @@ stamina = 20 weak_against_armour = FALSE +/obj/projectile/beam/laser/musket/repeater + name = "clockwork laser" + icon_state = "laser_repeater" + impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser + damage = 28 + stamina = 35 + weak_against_armour = TRUE + light_color = COLOR_DARK_ORANGE + /obj/projectile/beam/weak damage = 15 diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 85c2ef8e2a4..7cc8deaf976 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -228,3 +228,43 @@ desc = "doink!" damage_type = BRUTE icon_state = "paperball" + +//Big Ballista Mounted gun Spear +/obj/projectile/bullet/ballista_spear + name = "Spear" + icon_state = "ballista_spear" + damage = 80 + speed = 3 + catastropic_dismemberment = TRUE + projectile_piercing = PASSMOB + dismemberment = 3 + embed_type = null + armour_penetration = 25 + wound_bonus = 15 + exposed_wound_bonus = 30 + damage_type = BRUTE + shrapnel_type = /obj/item/spear + +/obj/projectile/bullet/ballista_spear/Initialize(mapload) + . = ..() + AddElement(/datum/element/projectile_drop, shrapnel_type) + +/obj/projectile/bullet/ballista_spear_dragon + name = "Dragon-Slaying Spear" + icon_state = "ballista_spear_dragon" + damage = 120 + speed = 4 + catastropic_dismemberment = TRUE + projectile_piercing = PASSMOB + dismemberment = 3 + embed_type = null + armour_penetration = 25 + wound_bonus = 15 + exposed_wound_bonus = 30 + damage_type = BRUTE + shrapnel_type = /obj/item/spear/dragonator + +/obj/projectile/bullet/ballista_spear_dragon/Initialize(mapload) + . = ..() + AddElement(/datum/element/projectile_drop, shrapnel_type) + AddElement(/datum/element/bane, mob_biotypes = MOB_MINING, damage_multiplier = 2) diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index ff8e847abf7..47c028bde91 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 782e3cab22e..4403cfedf06 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index 3ef8524655c..e2fcfc124d9 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/polearms_lefthand.dmi b/icons/mob/inhands/weapons/polearms_lefthand.dmi index 749de0cfca6..a882482331f 100644 Binary files a/icons/mob/inhands/weapons/polearms_lefthand.dmi and b/icons/mob/inhands/weapons/polearms_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/polearms_righthand.dmi b/icons/mob/inhands/weapons/polearms_righthand.dmi index df595538cc3..985e1188932 100644 Binary files a/icons/mob/inhands/weapons/polearms_righthand.dmi and b/icons/mob/inhands/weapons/polearms_righthand.dmi differ diff --git a/icons/obj/weapons/48x.dmi b/icons/obj/weapons/48x.dmi new file mode 100644 index 00000000000..4366de5f032 Binary files /dev/null and b/icons/obj/weapons/48x.dmi differ diff --git a/icons/obj/weapons/cannons.dmi b/icons/obj/weapons/cannons.dmi index 93b43b19239..01158ad9dff 100644 Binary files a/icons/obj/weapons/cannons.dmi and b/icons/obj/weapons/cannons.dmi differ diff --git a/icons/obj/weapons/guns/energy.dmi b/icons/obj/weapons/guns/energy.dmi index 3b91f79ef7d..5d3834b6030 100644 Binary files a/icons/obj/weapons/guns/energy.dmi and b/icons/obj/weapons/guns/energy.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index 3187eb83e86..b682c3866cb 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ