diff --git a/code/game/mecha/equipment/tools/repair_droid.dm b/code/game/mecha/equipment/tools/repair_droid.dm index f76eeed6f09..f4f9696aa5c 100644 --- a/code/game/mecha/equipment/tools/repair_droid.dm +++ b/code/game/mecha/equipment/tools/repair_droid.dm @@ -27,16 +27,16 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/mecha/M as obj) ..() droid_overlay = new(src.icon, icon_state = "repair_droid") - M.overlays += droid_overlay + M.add_overlay(droid_overlay) return /obj/item/mecha_parts/mecha_equipment/repair_droid/destroy() - chassis.overlays -= droid_overlay + chassis.cut_overlay(droid_overlay) ..() return /obj/item/mecha_parts/mecha_equipment/repair_droid/detach() - chassis.overlays -= droid_overlay + chassis.cut_overlay(droid_overlay) pr_repair_droid.stop() ..() return @@ -49,7 +49,7 @@ /obj/item/mecha_parts/mecha_equipment/repair_droid/Topic(href, href_list) ..() if(href_list["toggle_repairs"]) - chassis.overlays -= droid_overlay + chassis.cut_overlay(droid_overlay) if(pr_repair_droid.toggle()) droid_overlay = new(src.icon, icon_state = "repair_droid_a") log_message("Activated.") @@ -57,7 +57,7 @@ droid_overlay = new(src.icon, icon_state = "repair_droid") log_message("Deactivated.") set_ready_state(1) - chassis.overlays += droid_overlay + chassis.add_overlay(droid_overlay) send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) return diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 500f75b6c61..8eaf4062016 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -259,7 +259,9 @@ /obj/mecha/proc/check_for_support() - if(locate(/obj/structure/grille, orange(1, src)) || locate(/obj/structure/lattice, orange(1, src)) || locate(/turf/simulated, orange(1, src)) || locate(/turf/unsimulated, orange(1, src))) + var/list/things = orange(1, src) + + if(locate(/obj/structure/grille in things) || locate(/obj/structure/lattice in things) || locate(/turf/simulated in things) || locate(/turf/unsimulated in things)) return 1 else return 0 @@ -397,21 +399,26 @@ /obj/mecha/relaymove(mob/user,direction) if(user != src.occupant) //While not "realistic", this piece is player friendly. if(istype(user,/mob/living/carbon/brain)) - to_chat(user, "You try to move, but you are not the pilot! The exosuit doesn't respond.") + to_chat(user, "You try to move, but you are not the pilot! The exosuit doesn't respond.") return 0 user.forceMove(get_turf(src)) to_chat(user, "You climb out from [src]") return 0 if(connected_port) if(world.time - last_message > 20) - src.occupant_message("Unable to move while connected to the air system port") + src.occupant_message("Unable to move while connected to the air system port") last_message = world.time return 0 if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect") return return domove(direction) +/obj/mecha/proc/can_ztravel() + for(var/obj/item/mecha_parts/mecha_equipment/tool/jetpack/jp in equipment) + return jp.equip_ready + return FALSE + /obj/mecha/proc/domove(direction) return call((proc_res["dyndomove"]||src), "dyndomove")(direction) @@ -423,20 +430,51 @@ return 0 if(!has_charge(step_energy_drain)) return 0 + var/move_result = 0 + if(hasInternalDamage(MECHA_INT_CONTROL_LOST)) move_result = mechsteprand() - else if(src.dir!=direction) + //Up/down zmove + else if(direction & UP || direction & DOWN) + if(!can_ztravel()) + occupant_message("Your vehicle lacks the capacity to move in that direction!") + return FALSE + + //We're using locs because some mecha are 2x2 turfs. So thicc! + var/result = TRUE + + for(var/turf/T in locs) + if(!T.CanZPass(src,direction)) + occupant_message("You can't move that direction from here!") + result = FALSE + break + var/turf/dest = direction & UP ? GetAbove(T) : GetBelow(T) + if(!dest) + occupant_message("There is nothing of interest in this direction.") + result = FALSE + break + if(!dest.CanZPass(src,direction)) + occupant_message("There's something blocking your movement in that direction!") + result = FALSE + break + if(result) + move_result = mechstep(direction) + //Turning + else if(src.dir != direction) move_result = mechturn(direction) + //Stepping else move_result = mechstep(direction) + + if(move_result) can_move = 0 use_power(step_energy_drain) if(istype(src.loc, /turf/space)) if(!src.check_for_support()) src.pr_inertial_movement.start(list(src,direction)) - src.log_message("Movement control lost. Inertial movement started.") + src.log_message("Movement control lost. Inertial movement started.") if(do_after(step_in)) can_move = 1 return 1 diff --git a/code/game/mecha/space/gunpod_vr.dm b/code/game/mecha/space/gunpod_vr.dm new file mode 100644 index 00000000000..b6bc356a8a2 --- /dev/null +++ b/code/game/mecha/space/gunpod_vr.dm @@ -0,0 +1,127 @@ +/obj/mecha/working/hoverpod/gunpod + name = "Gunpod" + desc = "A more advanced (and angrier) variant of the hoverpod." + catalogue_data = list(/datum/category_item/catalogue/technology/gunpod) + icon = 'icons/mecha/mecha64x64.dmi' + icon_state = "gunpod" + initial_icon = "gunpod" + internal_damage_threshold = 90 + step_in = 2 + step_energy_drain = 5 + max_temperature = 20000 + health = 400 + maxhealth = 400 + infra_luminosity = 6 + wreckage = /obj/effect/decal/mecha_wreckage/gunpod + cargo_capacity = 3 + max_equip = 3 + + opacity = FALSE + + stomp_sound = 'sound/machines/generator/generator_end.ogg' + swivel_sound = 'sound/machines/hiss.ogg' + + // Paint colors! Null if not set. + var/stripe1_color + var/stripe2_color + var/image/stripe1_overlay + var/image/stripe2_overlay + + bound_height = 64 + bound_width = 64 + + max_hull_equip = 2 + max_weapon_equip = 2 + max_utility_equip = 1 + max_universal_equip = 1 + max_special_equip = 1 + +/obj/mecha/working/hoverpod/gunpod/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser + ME.attach(src) + + update_icon() //In case we were mapped in with paint + +/obj/mecha/working/hoverpod/gunpod/heavy/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/combat_shield + ME.attach(src) + +/obj/mecha/working/hoverpod/gunpod/agile/Initialize() + . = ..() + var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/teleporter + ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/repair_droid + ME.attach(src) + +/obj/mecha/working/hoverpod/gunpod/handle_equipment_movement() + . = ..() + if(has_gravity()) + start_hover() + else + stop_hover() + +/obj/mecha/working/hoverpod/gunpod/proc/start_hover() + if(!ion_trail.on) + ion_trail.start() + +/obj/mecha/working/hoverpod/gunpod/proc/stop_hover() + if(ion_trail.on) + ion_trail.stop() + +/obj/mecha/working/hoverpod/gunpod/check_for_support() + if (has_charge(step_energy_drain) && stabilization_enabled) + return 1 + + var/list/things = orange(1, src) + + if(locate(/obj/structure/grille in things) || locate(/obj/structure/lattice in things) || locate(/turf/simulated in things) || locate(/turf/unsimulated in things)) + return 1 + else + return 0 + +/obj/mecha/working/hoverpod/gunpod/update_icon() + cut_overlays() + ..() + + if(stripe1_color) + stripe1_overlay = image("gunpod_stripes1") + stripe1_overlay.color = stripe1_color + add_overlay(stripe1_overlay) + if(stripe2_overlay) + stripe2_overlay = image("gunpod_stripes2") + stripe2_overlay.color = stripe2_color + add_overlay(stripe2_overlay) + +/obj/mecha/working/hoverpod/gunpod/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/device/multitool) && state == 1) + var/new_paint_location = input("Please select a target zone.", "Paint Zone", null) as null|anything in list("Fore Stripe", "Aft Stripe", "CANCEL") + if(new_paint_location && new_paint_location != "CANCEL") + var/new_paint_color = input("Please select a paint color.", "Paint Color", null) as color|null + if(new_paint_color) + switch(new_paint_location) + if("Fore Stripe") + stripe1_color = new_paint_color + if("Aft Stripe") + stripe2_color = new_paint_color + + update_icon() + else ..() + +/obj/effect/decal/mecha_wreckage/gunpod + name = "Gunpod wreckage" + desc = "Remains of some unfortunate gunpod. Completely unrepairable." + icon = 'icons/mecha/mecha64x64.dmi' + icon_state = "gunpod-broken" + bound_width = 64 + bound_height = 64 + +/datum/category_item/catalogue/technology/gunpod + name = "Voidcraft - Gunpod" + desc = "This is a small space-capable fightercraft that has an arrowhead design. Can hold up to one pilot, \ + and sometimes one or two passengers, with the right modifications made. \ + Typically used as small fighter craft, the gunpod can't carry much of a payload, though it's still capable of holding it's own." + value = CATALOGUER_REWARD_MEDIUM \ No newline at end of file diff --git a/code/game/mecha/space/hoverpod.dm b/code/game/mecha/space/hoverpod.dm index 31558458d99..fc5fc1e7396 100644 --- a/code/game/mecha/space/hoverpod.dm +++ b/code/game/mecha/space/hoverpod.dm @@ -26,11 +26,20 @@ max_universal_equip = 1 max_special_equip = 1 -/obj/mecha/working/hoverpod/New() - ..() +/obj/mecha/working/hoverpod/Initialize() + . = ..() ion_trail = new /datum/effect/effect/system/ion_trail_follow() ion_trail.set_up(src) - ion_trail.start() + +/obj/mecha/working/hoverpod/moved_inside(var/mob/living/carbon/human/H as mob) + . = ..(H) + if(.) + ion_trail.start() + +/obj/mecha/working/hoverpod/go_out() + . = ..() + if(!occupant) + ion_trail.stop() //Modified phazon code /obj/mecha/working/hoverpod/Topic(href, href_list) @@ -52,6 +61,9 @@ output += ..() return output +/obj/mecha/working/hoverpod/can_ztravel() + return (stabilization_enabled && has_charge(step_energy_drain)) + // No space drifting /obj/mecha/working/hoverpod/check_for_support() //does the hoverpod have enough charge left to stabilize itself? @@ -106,7 +118,7 @@ max_special_equip = 1 /obj/mecha/working/hoverpod/combatpod/Initialize() - ..() + . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive @@ -117,7 +129,7 @@ desc = "Who knew a tiny ball could fit three people?" /obj/mecha/working/hoverpod/shuttlepod/Initialize() - ..() + . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tool/passenger diff --git a/code/game/mecha/space/shuttle.dm b/code/game/mecha/space/shuttle.dm index 7e361ece0c6..bf9aec34761 100644 --- a/code/game/mecha/space/shuttle.dm +++ b/code/game/mecha/space/shuttle.dm @@ -41,44 +41,30 @@ max_universal_equip = 1 max_special_equip = 1 -/obj/mecha/working/hoverpod/Initialize() - ..() - ion_trail.stop() - -/obj/mecha/working/hoverpod/shuttlecraft/moved_inside(var/mob/living/carbon/human/H as mob) - . = ..(H) - if(.) - ion_trail.start() - -/obj/mecha/working/hoverpod/shuttlecraft/go_out() - . = ..() - if(!occupant) - ion_trail.stop() - /obj/mecha/working/hoverpod/shuttlecraft/update_icon() - overlays.Cut() + cut_overlays() ..() if(base_paint) if(!base_paint_mask) base_paint_mask = image(icon, "[initial_icon]-mask+base", src.layer + 1) base_paint_mask.color = base_paint - overlays |= base_paint_mask + add_overlay(base_paint_mask) if(front_paint) if(!front_paint_mask) front_paint_mask = image(icon, "[initial_icon]-mask+front", src.layer + 1) front_paint_mask.color = front_paint - overlays |= front_paint_mask + add_overlay(front_paint_mask) if(engine_paint) if(!engine_paint_mask) engine_paint_mask = image(icon, "[initial_icon]-mask+engine", src.layer + 1) engine_paint_mask.color = engine_paint - overlays |= engine_paint_mask + add_overlay(engine_paint_mask) if(central_paint) if(!engine_paint_mask) central_paint_mask = image(icon, "[initial_icon]-mask+central", src.layer + 2) central_paint_mask.color = central_paint - overlays |= central_paint_mask + add_overlay(central_paint_mask) /obj/mecha/working/hoverpod/shuttlecraft/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/device/multitool) && state == 1) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index d99eff9569f..0ccb6404878 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -15,6 +15,10 @@ /mob/proc/zMove(direction) if(eyeobj) return eyeobj.zMove(direction) + if(istype(loc,/obj/mecha)) + var/obj/mecha/mech = loc + return mech.relaymove(src,direction) + if(!can_ztravel()) to_chat(src, "You lack means of travel in that direction.") return diff --git a/icons/mecha/mecha64x64.dmi b/icons/mecha/mecha64x64.dmi index 141724e4adf..42887d55b42 100644 Binary files a/icons/mecha/mecha64x64.dmi and b/icons/mecha/mecha64x64.dmi differ diff --git a/maps/tether/submaps/om_ships/aro.dmm b/maps/tether/submaps/om_ships/aro.dmm index 6a7a95a0545..abaf444861b 100644 --- a/maps/tether/submaps/om_ships/aro.dmm +++ b/maps/tether/submaps/om_ships/aro.dmm @@ -2978,6 +2978,9 @@ /obj/effect/floor_decal/corner_techfloor_grid{ dir = 9 }, +/obj/machinery/mech_recharger{ + icon = 'icons/turf/shuttle_alien_blue.dmi' + }, /turf/simulated/floor/tiled/techfloor, /area/ship/aro/midshipshangars) "gf" = ( @@ -3001,6 +3004,10 @@ icon_state = "corner_techfloor_grid"; dir = 6 }, +/obj/machinery/mech_recharger{ + icon = 'icons/turf/shuttle_alien_blue.dmi' + }, +/obj/mecha/working/hoverpod/gunpod/agile, /turf/simulated/floor/tiled/techfloor, /area/ship/aro/midshipshangars) "gh" = ( @@ -3349,6 +3356,88 @@ /obj/effect/overmap/visitable/ship/aro, /turf/space, /area/space) +"iU" = ( +/obj/effect/floor_decal/techfloor/orange{ + dir = 1 + }, +/obj/structure/table/rack/shelf/steel, +/obj/item/mecha_parts/mecha_equipment/crisis_drone, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) +"lD" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/phoron, +/obj/effect/floor_decal/industrial/danger/full, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) +"tu" = ( +/obj/machinery/atmospherics/binary/pump, +/turf/simulated/floor/reinforced, +/area/ship/aro/midshipshangars) +"uO" = ( +/obj/effect/floor_decal/techfloor/orange, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) +"uZ" = ( +/obj/effect/floor_decal/techfloor/orange, +/obj/structure/table/rack/shelf/steel, +/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) +"xu" = ( +/obj/effect/floor_decal/techfloor/orange{ + dir = 1 + }, +/obj/structure/table/rack/shelf/steel, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/cannon, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) +"CW" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/outline, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) +"HK" = ( +/obj/effect/floor_decal/techfloor/orange, +/obj/structure/table/rack/shelf/steel, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/explosive, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) +"Lp" = ( +/obj/effect/floor_decal/techfloor/orange{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/purple, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) +"Md" = ( +/obj/machinery/atmospherics/portables_connector, +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/floor_decal/industrial/outline, +/turf/simulated/floor/reinforced, +/area/ship/aro/midshipshangars) +"PJ" = ( +/obj/mecha/working/hoverpod/gunpod/agile, +/obj/machinery/atmospherics/portables_connector{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/outline, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) +"TU" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/phoron, +/obj/effect/floor_decal/industrial/danger/full, +/turf/simulated/floor/tiled/techfloor, +/area/ship/aro/midshipshangars) (1,1,1) = {" aa @@ -11105,9 +11194,9 @@ ek ek ek fy -fy -gd -fy +iU +lD +uZ fy fy fy @@ -11245,11 +11334,11 @@ ek ek ek ek -fy -fy -fy -fy -fy +Md +tu +Lp +PJ +uO fy fy fy @@ -12239,11 +12328,11 @@ ek ek ek ek -fy -fy -fy -fy -fy +Md +tu +Lp +CW +uO fy fy fy @@ -12383,9 +12472,9 @@ ek ek ek fy -fy -gh -fy +xu +TU +HK fy gI fy diff --git a/vorestation.dme b/vorestation.dme index 7dba23bc889..25c5888cdc8 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -966,6 +966,7 @@ #include "code\game\mecha\micro\micro_equipment.dm" #include "code\game\mecha\micro\security.dm" #include "code\game\mecha\micro\utility.dm" +#include "code\game\mecha\space\gunpod_vr.dm" #include "code\game\mecha\space\hoverpod.dm" #include "code\game\mecha\space\shuttle.dm" #include "code\game\mecha\working\ripley.dm"