diff --git a/code/datums/vehicles.dm b/code/datums/vehicles.dm index ac71cc1fc7..4c74ece75d 100644 --- a/code/datums/vehicles.dm +++ b/code/datums/vehicles.dm @@ -30,6 +30,10 @@ name = "Movie APC" interior_id = "apc_movie" +/datum/map_template/interior/arc + name = "ARC" + interior_id = "arc" + /datum/map_template/interior/fancy_locker name = "Fancy Locker" interior_id = "fancylocker" diff --git a/code/modules/vehicles/apc/arc.dm b/code/modules/vehicles/apc/arc.dm new file mode 100644 index 0000000000..eaddf2081c --- /dev/null +++ b/code/modules/vehicles/apc/arc.dm @@ -0,0 +1,157 @@ + +/obj/vehicle/multitile/apc/arc + name = "M540 Armored Recon Carrier" + desc = "An M540 Armored Recon Carrier, also known as an ARC. This is a much lighter and more nimble alternative to the M557A3 APC, often preferred by recon forces for that very reason. Entrance on the right." + + icon = 'icons/obj/vehicles/arc.dmi' + icon_state = "arc_base" + pixel_x = -48 + pixel_y = -48 + + bound_width = 96 + bound_height = 96 + + interior_map = /datum/map_template/interior/arc + + + passengers_slots = 9 + + entrances = list( + "right" = list(-2, 0), + ) + + seats = list( + VEHICLE_DRIVER = null, + VEHICLE_GUNNER = null, + ) + + active_hp = list( + VEHICLE_DRIVER = null, + VEHICLE_GUNNER = null, + ) + + hardpoints_allowed = list( + /obj/item/hardpoint/primary/arc_frontalcannon, + /obj/item/hardpoint/support/flare_launcher, + /obj/item/hardpoint/locomotion/apc_wheels/arc, + ) + +/obj/vehicle/multitile/apc/arc/add_seated_verbs(mob/living/M, seat) + if(!M.client) + return + add_verb(M.client, list( + /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/switch_hardpoint, + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_shift_click, + /obj/vehicle/multitile/proc/activate_horn, + )) + else if(seat == VEHICLE_GUNNER) + add_verb(M.client, list( + /obj/vehicle/multitile/proc/switch_hardpoint, + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_shift_click, + )) + +/obj/vehicle/multitile/apc/arc/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, + )) + 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/switch_hardpoint, + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_shift_click, + /obj/vehicle/multitile/proc/activate_horn, + )) + else if(seat == VEHICLE_GUNNER) + remove_verb(M.client, list( + /obj/vehicle/multitile/proc/switch_hardpoint, + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_shift_click, + )) + +/obj/vehicle/multitile/apc/arc/initialize_cameras(change_tag = FALSE) + if(!camera) + camera = new /obj/structure/machinery/camera/vehicle(src) + if(change_tag) + camera.c_tag = "#[rand(1,100)] M540 \"[nickname]\" ARC" + if(camera_int) + camera_int.c_tag = camera.c_tag + " interior" + else + camera.c_tag = "#[rand(1,100)] M540 ARC" + if(camera_int) + camera_int.c_tag = camera.c_tag + " interior" + +/obj/vehicle/multitile/apc/arc/set_muzzle_offsets(obj/item/hardpoint/HP) + //sets muzzle flash offsets for APC weapons + switch(HP.slot) + if(HDPT_SUPPORT) //flare + HP.muzzle_flash_pos = list( + "1" = list(-4, -40), + "2" = list(5, 5), + "4" = list(-25, 6), + "8" = list(25, -4) + ) + return ..() + +/* +** PRESETS SPAWNERS +*/ +/obj/effect/vehicle_spawner/arc + name = "ARC Spawner" + icon = 'icons/obj/vehicles/arc.dmi' + icon_state = "arc_base" + pixel_x = -48 + pixel_y = -48 + +/obj/effect/vehicle_spawner/arc/Initialize() + . = ..() + spawn_vehicle() + qdel(src) + +//PRESET: no hardpoints +/obj/effect/vehicle_spawner/arc/spawn_vehicle() + var/obj/vehicle/multitile/apc/arc/APC = new (loc) + + load_misc(APC) + load_hardpoints(APC) + handle_direction(APC) + APC.update_icon() + +//PRESET: only wheels installed +/obj/effect/vehicle_spawner/arc/plain/load_hardpoints(obj/vehicle/multitile/apc/arc/V) + V.add_hardpoint(new /obj/item/hardpoint/locomotion/apc_wheels/arc) + +//PRESET: default hardpoints, destroyed +/obj/effect/vehicle_spawner/arc/decrepit/spawn_vehicle() + var/obj/vehicle/multitile/apc/arc/APC = new (loc) + + load_misc(APC) + load_hardpoints(APC) + handle_direction(APC) + load_damage(APC) + APC.update_icon() + +/obj/effect/vehicle_spawner/arc/decrepit/load_hardpoints(obj/vehicle/multitile/apc/arc/V) + V.add_hardpoint(new /obj/item/hardpoint/primary/arc_frontalcannon) + V.add_hardpoint(new /obj/item/hardpoint/support/flare_launcher) + V.add_hardpoint(new /obj/item/hardpoint/locomotion/apc_wheels/arc) + +//PRESET: default hardpoints +/obj/effect/vehicle_spawner/arc/fixed/load_hardpoints(obj/vehicle/multitile/apc/arc/V) + V.add_hardpoint(new /obj/item/hardpoint/primary/arc_frontalcannon) + V.add_hardpoint(new /obj/item/hardpoint/support/flare_launcher) + V.add_hardpoint(new /obj/item/hardpoint/locomotion/apc_wheels/arc) diff --git a/code/modules/vehicles/apc/arc_weaponless.dm b/code/modules/vehicles/apc/arc_weaponless.dm new file mode 100644 index 0000000000..372c798b14 --- /dev/null +++ b/code/modules/vehicles/apc/arc_weaponless.dm @@ -0,0 +1,147 @@ + +/obj/vehicle/multitile/apc/arc/weaponless + name = "M540-S Armored Recon Carrier" + desc = "An M540-S Armored Recon Carrier, also known as an ARC. This is a much lighter and more nimble version to the M557A3 APC, often preferred by recon forces for that very reason. This variant has had it's weapons removed to lighten it's weight and improve it's stealth capabilities. Entrance on the right." + + icon_state = "arc_weaponless" + + interior_map = /datum/map_template/interior/arc + + passengers_slots = 9 + + entrances = list( + "right" = list(-2, 0), + ) + + seats = list( + VEHICLE_DRIVER = null, + VEHICLE_GUNNER = null, + ) + + active_hp = list( + VEHICLE_DRIVER = null, + VEHICLE_GUNNER = null, + ) + + hardpoints_allowed = list( + /obj/item/hardpoint/support/flare_launcher, + /obj/item/hardpoint/locomotion/apc_wheels/arc, + ) + +/obj/vehicle/multitile/apc/arc/weaponless/add_seated_verbs(mob/living/M, seat) + if(!M.client) + return + add_verb(M.client, list( + /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/switch_hardpoint, + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_shift_click, + /obj/vehicle/multitile/proc/activate_horn, + )) + else if(seat == VEHICLE_GUNNER) + add_verb(M.client, list( + /obj/vehicle/multitile/proc/switch_hardpoint, + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_shift_click, + )) + +/obj/vehicle/multitile/apc/arc/weaponless/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, + )) + 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/switch_hardpoint, + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_shift_click, + /obj/vehicle/multitile/proc/activate_horn, + )) + else if(seat == VEHICLE_GUNNER) + remove_verb(M.client, list( + /obj/vehicle/multitile/proc/switch_hardpoint, + /obj/vehicle/multitile/proc/cycle_hardpoint, + /obj/vehicle/multitile/proc/toggle_shift_click, + )) + +/obj/vehicle/multitile/apc/arc/weaponless/initialize_cameras(change_tag = FALSE) + if(!camera) + camera = new /obj/structure/machinery/camera/vehicle(src) + if(change_tag) + camera.c_tag = "#[rand(1,100)] M540-S \"[nickname]\" ARC" + if(camera_int) + camera_int.c_tag = camera.c_tag + " interior" + else + camera.c_tag = "#[rand(1,100)] M540-S ARC" + if(camera_int) + camera_int.c_tag = camera.c_tag + " interior" + +/obj/vehicle/multitile/apc/arc/weaponless/set_muzzle_offsets(obj/item/hardpoint/HP) + //sets muzzle flash offsets for APC weapons + switch(HP.slot) + if(HDPT_SUPPORT) //flare + HP.muzzle_flash_pos = list( + "1" = list(-4, -40), + "2" = list(5, 5), + "4" = list(-25, 6), + "8" = list(25, -4) + ) + return ..() + +/* +** PRESETS SPAWNERS +*/ +/obj/effect/vehicle_spawner/arc/weaponless + name = "Weaponless ARC Spawner" + icon = 'icons/obj/vehicles/arc.dmi' + icon_state = "arc_weaponless" + pixel_x = -48 + pixel_y = -48 + +/obj/effect/vehicle_spawner/arc/weaponless/Initialize() + . = ..() + spawn_vehicle() + qdel(src) + +//PRESET: no hardpoints +/obj/effect/vehicle_spawner/arc/weaponless/spawn_vehicle() + var/obj/vehicle/multitile/apc/arc/weaponless/APC = new (loc) + + load_misc(APC) + load_hardpoints(APC) + handle_direction(APC) + APC.update_icon() + +//PRESET: only wheels installed +/obj/effect/vehicle_spawner/arc/weaponless/plain/load_hardpoints(obj/vehicle/multitile/apc/arc/weaponless/V) + V.add_hardpoint(new /obj/item/hardpoint/locomotion/apc_wheels/arc) + +//PRESET: default hardpoints, destroyed +/obj/effect/vehicle_spawner/arc/weaponless/decrepit/spawn_vehicle() + var/obj/vehicle/multitile/apc/arc/weaponless/APC = new (loc) + + load_misc(APC) + load_hardpoints(APC) + handle_direction(APC) + load_damage(APC) + APC.update_icon() + +/obj/effect/vehicle_spawner/arc/weaponless/decrepit/load_hardpoints(obj/vehicle/multitile/apc/arc/weaponless/V) + V.add_hardpoint(new /obj/item/hardpoint/support/flare_launcher) + V.add_hardpoint(new /obj/item/hardpoint/locomotion/apc_wheels/arc) + +//PRESET: default hardpoints +/obj/effect/vehicle_spawner/arc/weaponless/fixed/load_hardpoints(obj/vehicle/multitile/apc/arc/weaponless/V) + V.add_hardpoint(new /obj/item/hardpoint/support/flare_launcher) + V.add_hardpoint(new /obj/item/hardpoint/locomotion/apc_wheels/arc) diff --git a/code/modules/vehicles/apc/interior.dm b/code/modules/vehicles/apc/interior.dm index d3947db2b8..010ea9ac2c 100644 --- a/code/modules/vehicles/apc/interior.dm +++ b/code/modules/vehicles/apc/interior.dm @@ -28,6 +28,11 @@ /obj/structure/interior_exit/vehicle/apc/rear/right icon_state = "door_rear_right" +/obj/structure/interior_exit/vehicle/arc + name = "ARC side door" + icon = 'icons/obj/vehicles/interiors/arc.dmi' + icon_state = "exit_door" + /obj/structure/prop/vehicle name = "Generic vehicle prop" desc = "Adds more flavour to vehicle interior." @@ -40,6 +45,13 @@ breakable = FALSE indestructible = TRUE +/obj/structure/prop/vehicle/arc + name = "ARC chassis" + + icon = 'icons/obj/vehicles/interiors/arc_chassis.dmi' + icon_state = "arc_chassis" + + /obj/structure/prop/vehicle/firing_port_weapon name = "M56 FPW handle" desc = "A control handle for a modified M56B Smartgun installed on the sides of M577 Armored Personnel Carrier as a Firing Port Weapon. \ diff --git a/code/modules/vehicles/hardpoints/primary/arc_frontal.dm b/code/modules/vehicles/hardpoints/primary/arc_frontal.dm new file mode 100644 index 0000000000..68dd21aafa --- /dev/null +++ b/code/modules/vehicles/hardpoints/primary/arc_frontal.dm @@ -0,0 +1,39 @@ +/obj/item/hardpoint/primary/arc_frontalcannon + name = "Bleihagel RE-RE850 Frontal Rotary Cannon" + desc = "A peculiar turret with two rotary cannons strapped to the front of it. Normally equipped with an autonomous mode, this one curiously lacks the feature." + icon = 'icons/obj/vehicles/hardpoints/arc.dmi' + + icon_state = "frontalcannon" + disp_icon = "arc" + disp_icon_state = "frontalcannon" + activation_sounds = list('sound/weapons/gun_smartgun1.ogg', 'sound/weapons/gun_smartgun2.ogg', 'sound/weapons/gun_smartgun3.ogg') + + damage_multiplier = 0.15 + + health = 2000 + firing_arc = 120 + + origins = list(0, -2) + + allowed_seat = VEHICLE_DRIVER + + ammo = new /obj/item/ammo_magazine/hardpoint/m56_cupola/frontal_cannon + max_clips = 1 + + use_muzzle_flash = TRUE + angle_muzzleflash = FALSE + muzzleflash_icon_state = "muzzle_flash_double" + + muzzle_flash_pos = list( + "1" = list(1, 5), + "2" = list(1, -30), + "4" = list(17, 3), + "8" = list(-17, 3) + ) + + scatter = 1 + gun_firemode = GUN_FIREMODE_AUTOMATIC + gun_firemode_list = list( + GUN_FIREMODE_AUTOMATIC, + ) + fire_delay = 0.05 SECONDS diff --git a/code/modules/vehicles/hardpoints/wheels/apc_wheels.dm b/code/modules/vehicles/hardpoints/wheels/apc_wheels.dm index 0060f78344..7df058b4a0 100644 --- a/code/modules/vehicles/hardpoints/wheels/apc_wheels.dm +++ b/code/modules/vehicles/hardpoints/wheels/apc_wheels.dm @@ -15,3 +15,12 @@ move_max_momentum = 2 move_momentum_build_factor = 1.5 move_turn_momentum_loss_factor = 0.5 + +/obj/item/hardpoint/locomotion/apc_wheels/arc + name = "ARC Wheels" + desc = "Not to be confused with the APC wheels, these are designed for the M540 ARC in mind." + icon = 'icons/obj/vehicles/hardpoints/arc.dmi' + + icon_state = "tires" + disp_icon = "arc" + disp_icon_state = "wheels" diff --git a/code/modules/vehicles/interior/areas.dm b/code/modules/vehicles/interior/areas.dm index f18c4d03c8..326ea8ee4a 100644 --- a/code/modules/vehicles/interior/areas.dm +++ b/code/modules/vehicles/interior/areas.dm @@ -28,6 +28,10 @@ name = "\improper M557A3 APC interior" icon_state = "apc_movie" +/area/vehicle/apc/arc + name = "\improper M540 ARC interior" + icon_state = "arc" + /area/vehicle/van name = "van interior" icon_state = "van" diff --git a/colonialmarines.dme b/colonialmarines.dme index 9872ffc48e..4e16283d5c 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -2392,6 +2392,8 @@ #include "code\modules\vehicles\apc\apc_command.dm" #include "code\modules\vehicles\apc\apc_medical.dm" #include "code\modules\vehicles\apc\apc_movie.dm" +#include "code\modules\vehicles\apc\arc.dm" +#include "code\modules\vehicles\apc\arc_weaponless.dm" #include "code\modules\vehicles\apc\interior.dm" #include "code\modules\vehicles\hardpoints\hardpoint.dm" #include "code\modules\vehicles\hardpoints\armor\armor.dm" @@ -2415,6 +2417,7 @@ #include "code\modules\vehicles\hardpoints\hardpoint_ammo\tow_ammo.dm" #include "code\modules\vehicles\hardpoints\holder\holder.dm" #include "code\modules\vehicles\hardpoints\holder\tank_turret.dm" +#include "code\modules\vehicles\hardpoints\primary\arc_frontal.dm" #include "code\modules\vehicles\hardpoints\primary\autocannon.dm" #include "code\modules\vehicles\hardpoints\primary\dual_cannon.dm" #include "code\modules\vehicles\hardpoints\primary\flamer.dm" diff --git a/icons/obj/vehicles/arc.dmi b/icons/obj/vehicles/arc.dmi new file mode 100644 index 0000000000..c7299ee22c Binary files /dev/null and b/icons/obj/vehicles/arc.dmi differ diff --git a/icons/obj/vehicles/hardpoints/arc.dmi b/icons/obj/vehicles/hardpoints/arc.dmi new file mode 100644 index 0000000000..873467317d Binary files /dev/null and b/icons/obj/vehicles/hardpoints/arc.dmi differ diff --git a/icons/obj/vehicles/interiors/arc.dmi b/icons/obj/vehicles/interiors/arc.dmi new file mode 100644 index 0000000000..9f921a02f8 Binary files /dev/null and b/icons/obj/vehicles/interiors/arc.dmi differ diff --git a/icons/obj/vehicles/interiors/arc_chassis.dmi b/icons/obj/vehicles/interiors/arc_chassis.dmi new file mode 100644 index 0000000000..8be5d23047 Binary files /dev/null and b/icons/obj/vehicles/interiors/arc_chassis.dmi differ diff --git a/icons/turf/areas_interiors.dmi b/icons/turf/areas_interiors.dmi index 40e6e906ce..0b9d67bc44 100644 Binary files a/icons/turf/areas_interiors.dmi and b/icons/turf/areas_interiors.dmi differ diff --git a/maps/interiors/arc.dmm b/maps/interiors/arc.dmm new file mode 100644 index 0000000000..50c5f96b62 --- /dev/null +++ b/maps/interiors/arc.dmm @@ -0,0 +1,110 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/void{ + opacity = 0 + }, +/area/space) +"q" = ( +/obj/structure/prop/vehicle/arc{ + layer = 2.01; + mouse_opacity = 0 + }, +/turf/closed/void{ + opacity = 0 + }, +/area/space) +"r" = ( +/obj/effect/landmark/interior/spawn/telephone{ + pixel_x = -13; + pixel_y = 15; + layer = 2.9 + }, +/obj/effect/landmark/interior/spawn/vehicle_driver_seat/armor{ + dir = 4 + }, +/turf/open/floor, +/area/vehicle/apc/arc) +"G" = ( +/obj/structure/bed/chair/vehicle{ + pixel_x = -8; + dir = 1 + }, +/obj/structure/bed/chair/vehicle{ + pixel_x = 8; + dir = 1 + }, +/turf/open/floor, +/area/vehicle/apc/arc) +"H" = ( +/obj/structure/bed/chair/vehicle{ + dir = 4; + layer = 3.1; + pixel_y = 5 + }, +/turf/open/floor, +/area/vehicle/apc/arc) +"I" = ( +/obj/structure/bed/chair/vehicle{ + pixel_x = -8 + }, +/obj/effect/landmark/interior/spawn/interior_viewport{ + pixel_x = 8; + pixel_y = 4; + layer = 2.9 + }, +/turf/open/floor, +/area/vehicle/apc/arc) +"N" = ( +/obj/effect/landmark/interior/spawn/entrance{ + alpha = 50; + exit_type = /obj/structure/interior_exit/vehicle/arc; + name = "ARC exit door"; + tag = "right"; + pixel_y = -10 + }, +/turf/open/floor, +/area/vehicle/apc/arc) +"X" = ( +/obj/structure/bed/chair/vehicle{ + pixel_x = -8 + }, +/obj/structure/bed/chair/vehicle{ + pixel_x = 8 + }, +/obj/structure/machinery/cm_vending/sorted/medical/wall_med/vehicle{ + pixel_y = 14; + pixel_x = -8 + }, +/turf/open/floor, +/area/vehicle/apc/arc) + +(1,1,1) = {" +a +a +a +q +"} +(2,1,1) = {" +a +X +G +a +"} +(3,1,1) = {" +a +I +N +a +"} +(4,1,1) = {" +a +r +H +a +"} +(5,1,1) = {" +a +a +a +a +"}