diff --git a/code/modules/vehicles/hardpoints/holder/humvee_turret.dm b/code/modules/vehicles/hardpoints/holder/humvee_turret.dm new file mode 100644 index 000000000000..0a5f6e6311bc --- /dev/null +++ b/code/modules/vehicles/hardpoints/holder/humvee_turret.dm @@ -0,0 +1,184 @@ +/obj/item/hardpoint/holder/humvee_turret + name = "\improper Humvee Turret" + desc = "The centerpiece of the humvee. Designed to support quick installation and deinstallation of various humvee weapon modules. Has inbuilt smoke screen deployment system." + + icon = 'icons/obj/vehicles/humvee.dmi' + icon_state = "humveeturret" + disp_icon = "humvee" + disp_icon_state = "humveeturret" + activation_sounds = list('sound/weapons/vehicles/smokelauncher_fire.ogg') + + density = TRUE //come on, it's huge + + activatable = TRUE + + ammo = new /obj/item/ammo_magazine/hardpoint/turret_smoke + max_clips = 2 + use_muzzle_flash = FALSE + + w_class = SIZE_MASSIVE + density = TRUE + anchored = TRUE + + allowed_seat = VEHICLE_DRIVER + + slot = HDPT_TURRET + + // big beefy chonk of metal + health = 450 + damage_multiplier = 0.05 + + accepted_hardpoints = list( + ///obj/item/hardpoint/primary/humvee_grenade_launcher, + /obj/item/hardpoint/primary/humvee_cannon, + //secondary + /obj/item/hardpoint/support/humvee_flare_launcher + ) + + hdpt_layer = HDPT_LAYER_TURRET + px_offsets = list( + "1" = list(0, -10), + "2" = list(0, 10), + "4" = list(-10, 0), + "8" = list(10, 0) + ) + + var/gyro = FALSE + + // How long the windup is before the turret rotates + var/rotation_windup = 0.5 SECONDS + // Used during the windup + var/rotating = FALSE + + scatter = 4 + gun_firemode = GUN_FIREMODE_BURSTFIRE + gun_firemode_list = list( + GUN_FIREMODE_BURSTFIRE, + ) + burst_amount = 2 + burst_delay = 1.0 SECONDS + extra_delay = 13.0 SECONDS + +/obj/item/hardpoint/holder/humvee_turret/update_icon() + var/broken = (health <= 0) + icon_state = "humveeturret_[broken]" + + /* + if(health <= initial(health)) + var/image/damage_overlay = image(icon, icon_state = "damaged_turret") + damage_overlay.alpha = 255 * (1 - (health / initial(health))) + overlays += damage_overlay + */ + ..() + + +/obj/item/hardpoint/holder/humvee_turret/get_icon_image(x_offset, y_offset, new_dir) + var/icon_state_suffix = "0" + if(health <= 0) + icon_state_suffix = "1" + + var/image/I = image(icon = disp_icon, icon_state = "[disp_icon_state]_[icon_state_suffix]", pixel_x = x_offset, pixel_y = y_offset, dir = new_dir) + /* + if(health <= initial(health)) + var/image/damage_overlay = image(icon, icon_state = "damaged_turret") + damage_overlay.alpha = 255 * (1 - (health / initial(health))) + I.overlays += damage_overlay + */ + return I + +// no picking this big beast up +/obj/item/hardpoint/holder/humvee_turret/attack_hand(mob/user) + return + +/obj/item/hardpoint/holder/humvee_turret/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/powerloader_clamp)) + var/obj/item/powerloader_clamp/PC = I + if(!PC.linked_powerloader) + qdel(PC) + return TRUE + + if(health < 1) + visible_message(SPAN_WARNING("\The [src] disintegrates into useless pile of scrap under the damage it suffered!")) + qdel(src) + return TRUE + + PC.grab_object(user, src, "vehicle_module", 'sound/machines/hydraulics_2.ogg') + update_icon() + return TRUE + ..() + + +/obj/item/hardpoint/holder/humvee_turret/get_tgui_info() + var/list/data = list() + + data += list(list( // turret smokescreen data + "name" = "Turret Smoke Screen", + "health" = health <= 0 ? null : floor(get_integrity_percent()), + "uses_ammo" = TRUE, + "current_rounds" = ammo.current_rounds / 2, + "max_rounds"= ammo.max_rounds / 2, + "mags" = LAZYLEN(backup_clips), + "max_mags" = max_clips, + )) + + for(var/obj/item/hardpoint/H in hardpoints) + data += list(H.get_tgui_info()) + + return data + +//gyro ON locks the turret in one direction, OFF will make turret turning when tank turns +/obj/item/hardpoint/holder/humvee_turret/proc/toggle_gyro(mob/user) + if(health <= 0) + to_chat(user, SPAN_WARNING("\The [src]'s stabilization systems are busted!")) + return + + gyro = !gyro + to_chat(user, SPAN_NOTICE("You toggle \the [src]'s gyroscopic stabilizer [gyro ? "ON" :"OFF"].")) + +/obj/item/hardpoint/holder/humvee_turret/proc/user_rotation(mob/user, deg) + // no rotating a broken turret + if(health <= 0) + return + + if(rotating) + return + + rotating = TRUE + to_chat(user, SPAN_NOTICE("You begin rotating the turret towards the [dir2text(turn(dir,deg))].")) + + if(!do_after(user, rotation_windup, INTERRUPT_ALL, BUSY_ICON_GENERIC)) + rotating = FALSE + return + rotating = FALSE + + rotate(deg, TRUE) + +/obj/item/hardpoint/holder/humvee_turret/rotate(deg, override_gyro = FALSE) + if(gyro && !override_gyro) + return + + ..(deg) + +/obj/item/hardpoint/holder/humvee_turret/try_fire(atom/target, mob/living/user, params) + var/turf/L + var/turf/R + switch(owner.dir) + if(NORTH) + L = locate(owner.x - 2, owner.y + 4, owner.z) + R = locate(owner.x + 2, owner.y + 4, owner.z) + if(SOUTH) + L = locate(owner.x + 2, owner.y - 4, owner.z) + R = locate(owner.x - 2, owner.y - 4, owner.z) + if(EAST) + L = locate(owner.x + 4, owner.y + 2, owner.z) + R = locate(owner.x + 4, owner.y - 2, owner.z) + else + L = locate(owner.x - 4, owner.y + 2, owner.z) + R = locate(owner.x - 4, owner.y - 2, owner.z) + + if(shots_fired) + target = R + else + target = L + + return ..() diff --git a/code/modules/vehicles/hardpoints/support/humvee_flare.dm b/code/modules/vehicles/hardpoints/support/humvee_flare.dm index c1eb4c25fd21..76f6c763ed09 100644 --- a/code/modules/vehicles/hardpoints/support/humvee_flare.dm +++ b/code/modules/vehicles/hardpoints/support/humvee_flare.dm @@ -3,9 +3,9 @@ desc = "A support module for APCs that shoots flares." icon = 'icons/obj/vehicles/hardpoints/humvee.dmi' - icon_state = "launcher" + icon_state = "humveelauncher" disp_icon = "humvee" - disp_icon_state = "launcher" + disp_icon_state = "humveelauncher" activation_sounds = list('sound/weapons/gun_m92_attachable.ogg') damage_multiplier = 0.1 diff --git a/code/modules/vehicles/humvee/humvee.dm b/code/modules/vehicles/humvee/humvee.dm index 5e73e04a386e..117a3af53a67 100644 --- a/code/modules/vehicles/humvee/humvee.dm +++ b/code/modules/vehicles/humvee/humvee.dm @@ -44,8 +44,7 @@ hardpoints_allowed = list( /obj/item/hardpoint/locomotion/humvee_wheels, - /obj/item/hardpoint/primary/humvee_cannon, - /obj/item/hardpoint/support/humvee_flare_launcher, + /obj/item/hardpoint/holder/humvee_turret, /obj/item/hardpoint/armor/humvee_snowplow, /obj/item/hardpoint/support/humvee_overhead_lights, /obj/item/hardpoint/primary/humvee_hatch @@ -80,6 +79,74 @@ vehicle_ram_multiplier = VEHICLE_TRAMPLE_DAMAGE_APC_REDUCTION minimap_icon_state = "arc" +/obj/vehicle/multitile/humvee/add_seated_verbs(mob/living/M, seat) + if(!M.client) + return + add_verb(M.client, list( + /obj/vehicle/multitile/proc/switch_hardpoint, + /obj/vehicle/multitile/proc/get_status_info, + /obj/vehicle/multitile/proc/open_controls_guide, + /obj/vehicle/multitile/proc/name_vehicle, + )) + if(seat == VEHICLE_DRIVER) + add_verb(M.client, list( + /obj/vehicle/multitile/proc/toggle_door_lock, + /obj/vehicle/multitile/proc/activate_horn, + )) + else if(seat == VEHICLE_GUNNER) + add_verb(M.client, list( + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_gyrostabilizer, + )) + + +/obj/vehicle/multitile/humvee/remove_seated_verbs(mob/living/M, seat) + if(!M.client) + return + remove_verb(M.client, list( + /obj/vehicle/multitile/proc/get_status_info, + /obj/vehicle/multitile/proc/open_controls_guide, + /obj/vehicle/multitile/proc/name_vehicle, + /obj/vehicle/multitile/proc/switch_hardpoint, + )) + SStgui.close_user_uis(M, src) + if(seat == VEHICLE_DRIVER) + remove_verb(M.client, list( + /obj/vehicle/multitile/proc/toggle_door_lock, + /obj/vehicle/multitile/proc/activate_horn, + )) + else if(seat == VEHICLE_GUNNER) + remove_verb(M.client, list( + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_gyrostabilizer, + )) + +/obj/vehicle/multitile/humvee/relaymove(mob/user, direction) + if(user == seats[VEHICLE_DRIVER]) + // Check if wheels are installed + if(!(locate(/obj/item/hardpoint/locomotion/humvee_wheels) in hardpoints)) + return FALSE + + return ..() + + if(user != seats[VEHICLE_GUNNER]) + return FALSE + + var/obj/item/hardpoint/holder/humvee_turret/T = null + for(var/obj/item/hardpoint/holder/humvee_turret/TT in hardpoints) + T = TT + break + if(!T) + return FALSE + + if(direction == GLOB.reverse_dir[T.dir] || direction == T.dir) + return FALSE + + T.user_rotation(user, turning_angle(T.dir, direction)) + update_icon() + + return TRUE + /obj/effect/vehicle_spawner/humvee/Initialize() . = ..() spawn_vehicle() @@ -95,4 +162,4 @@ /obj/effect/vehicle_spawner/humvee/load_hardpoints(obj/vehicle/multitile/V) V.add_hardpoint(new /obj/item/hardpoint/locomotion/humvee_wheels) - V.add_hardpoint(new /obj/item/hardpoint/primary/humvee_hatch) + V.add_hardpoint(new /obj/item/hardpoint/holder/humvee_turret) diff --git a/code/modules/vehicles/multitile/multitile_verbs.dm b/code/modules/vehicles/multitile/multitile_verbs.dm index df53803f9f78..e8a048a866cf 100644 --- a/code/modules/vehicles/multitile/multitile_verbs.dm +++ b/code/modules/vehicles/multitile/multitile_verbs.dm @@ -238,6 +238,9 @@ for(var/obj/item/hardpoint/holder/tank_turret/TT in V.hardpoints) T = TT break + for(var/obj/item/hardpoint/holder/humvee_turret/TT in V.hardpoints) + T = TT + break if(!T) return T.toggle_gyro(usr) diff --git a/colonialmarines.dme b/colonialmarines.dme index 90dc2774dfe2..979f242dce74 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -2617,6 +2617,7 @@ #include "code\modules\vehicles\hardpoints\hardpoint_ammo\smoke_ammo.dm" #include "code\modules\vehicles\hardpoints\hardpoint_ammo\tow_ammo.dm" #include "code\modules\vehicles\hardpoints\holder\holder.dm" +#include "code\modules\vehicles\hardpoints\holder\humvee_turret.dm" #include "code\modules\vehicles\hardpoints\holder\tank_turret.dm" #include "code\modules\vehicles\hardpoints\primary\arc_sentry.dm" #include "code\modules\vehicles\hardpoints\primary\autocannon.dm" diff --git a/icons/obj/vehicles/hardpoints/humvee.dmi b/icons/obj/vehicles/hardpoints/humvee.dmi index 026f4bbc82ee..8094f8b211d3 100644 Binary files a/icons/obj/vehicles/hardpoints/humvee.dmi and b/icons/obj/vehicles/hardpoints/humvee.dmi differ diff --git a/icons/obj/vehicles/humvee.dmi b/icons/obj/vehicles/humvee.dmi index 7aca6d9306b9..c87e5e5a7efa 100644 Binary files a/icons/obj/vehicles/humvee.dmi and b/icons/obj/vehicles/humvee.dmi differ