From 39e66cc5be5dd7c04626ac9350cd3865bdea8c63 Mon Sep 17 00:00:00 2001 From: Geeves Date: Thu, 15 Jul 2021 03:37:50 +0200 Subject: [PATCH] Exosuit Phazon Module (#12157) --- aurorastation.dme | 1 + code/__defines/mobs.dm | 1 + .../temporary_visuals/incorporeal_mech.dm | 10 +++ .../modules/heavy_vehicle/equipment/combat.dm | 4 +- .../heavy_vehicle/equipment/utility.dm | 77 ++++++++++++++++-- code/modules/heavy_vehicle/mech_helpers.dm | 44 +++++++++- .../modules/heavy_vehicle/mech_interaction.dm | 20 ++++- code/modules/heavy_vehicle/mech_life.dm | 2 +- code/modules/heavy_vehicle/mecha.dm | 1 + code/modules/mob/mob_movement.dm | 67 ++++++++------- .../mechs/designs_exosuit_equipment.dm | 12 ++- html/changelogs/geeves-phazon_module.yml | 6 ++ icons/mecha/mech_equipment.dmi | Bin 29375 -> 30485 bytes 13 files changed, 194 insertions(+), 51 deletions(-) create mode 100644 code/game/objects/effects/temporary_visuals/incorporeal_mech.dm create mode 100644 html/changelogs/geeves-phazon_module.yml diff --git a/aurorastation.dme b/aurorastation.dme index 1df19864941..4abd60fd068 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -864,6 +864,7 @@ #include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\effects\temporary_visuals\blaster_effect.dm" #include "code\game\objects\effects\temporary_visuals\blood_splatter.dm" +#include "code\game\objects\effects\temporary_visuals\incorporeal_mech.dm" #include "code\game\objects\effects\temporary_visuals\nuke.dm" #include "code\game\objects\effects\temporary_visuals\teleport_visuals.dm" #include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 182de847687..d77e62978c4 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -23,6 +23,7 @@ #define INCORPOREAL_NINJA 2 // Pass through matter with a cool effect #define INCORPOREAL_BSTECH 3 // Like ninja, but also go across Z-levels and move in space freely #define INCORPOREAL_SHADE 4 // Shady +#define INCORPOREAL_MECH 5 // stripped down bstech // Grab levels. #define GRAB_PASSIVE 1 diff --git a/code/game/objects/effects/temporary_visuals/incorporeal_mech.dm b/code/game/objects/effects/temporary_visuals/incorporeal_mech.dm new file mode 100644 index 00000000000..e0718d4dde1 --- /dev/null +++ b/code/game/objects/effects/temporary_visuals/incorporeal_mech.dm @@ -0,0 +1,10 @@ +/obj/effect/temp_visual/incorporeal_mech + layer = BELOW_MOB_LAYER + randomdir = FALSE + +/obj/effect/temp_visual/incorporeal_mech/Initialize(mapload, new_dir, var/mob/living/heavy_vehicle/HV) + . = ..() + appearance = HV.appearance + mouse_opacity = 0 + opacity = FALSE + animate(src, time = duration, alpha = 0) \ No newline at end of file diff --git a/code/modules/heavy_vehicle/equipment/combat.dm b/code/modules/heavy_vehicle/equipment/combat.dm index 78b30d161ce..be450a971fb 100644 --- a/code/modules/heavy_vehicle/equipment/combat.dm +++ b/code/modules/heavy_vehicle/equipment/combat.dm @@ -318,11 +318,9 @@ return if((world.time - last_recharge) < cooldown) return - var/obj/item/cell/cell = owner.get_cell() var/actual_required_power = Clamp(max_charge - charge, 0, charging_rate) - if(cell) - charge += cell.use(actual_required_power) + owner.use_cell_power(actual_required_power) /obj/item/mecha_equipment/shield/get_hardpoint_status_value() return charge / max_charge diff --git a/code/modules/heavy_vehicle/equipment/utility.dm b/code/modules/heavy_vehicle/equipment/utility.dm index 163f4d2c6f5..c3aae9f5a1f 100644 --- a/code/modules/heavy_vehicle/equipment/utility.dm +++ b/code/modules/heavy_vehicle/equipment/utility.dm @@ -272,9 +272,7 @@ log_and_message_admins("used [src] to throw [locked] at [target].", user, owner.loc) locked = null - var/obj/item/cell/C = owner.get_cell() - if(istype(C)) - C.use(active_power_use * CELLRATE) + owner.use_cell_power(active_power_use * CELLRATE) else locked = null @@ -293,9 +291,8 @@ log_and_message_admins("used [src]'s area throw on [target].", user, owner.loc) - var/obj/item/cell/C = owner.get_cell() - if(istype(C)) - C.use(active_power_use * CELLRATE * 2) //bit more expensive to throw all + + owner.use_cell_power(active_power_use * CELLRATE * 2) //bit more expensive to throw all /obj/item/material/drill_head var/durability = 0 @@ -374,9 +371,7 @@ to_chat(user, "Your drill doesn't have a head!") return - var/obj/item/cell/C = owner.get_cell() - if(istype(C)) - C.use(active_power_use * CELLRATE) + owner.use_cell_power(active_power_use * CELLRATE) owner.visible_message("\The [owner] starts to drill \the [target]", "You hear a large drill.") var/T = target.loc @@ -657,6 +652,70 @@ /obj/item/mecha_equipment/quick_enter/attack_self() return +/obj/item/mecha_equipment/phazon + name = "phazon bluespace transmission system" + desc = "A large back-mounted device that grants the exosuit it's mounted to the ability to semi-shift into bluespace, allowing it to pass through dense objects." + desc_info = "It needs an anomaly core to function. You can install some simply by using a core on it." + icon_state = "mecha_phazon" + restricted_hardpoints = list(HARDPOINT_BACK) + w_class = ITEMSIZE_HUGE + origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINEERING = 6, TECH_BLUESPACE = 6) + active_power_use = 88 KILOWATTS + + var/obj/item/anomaly_core/AC + var/image/anomaly_overlay + +/obj/item/mecha_equipment/phazon/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/anomaly_core)) + if(AC) + to_chat(user, SPAN_WARNING("\The [src] already has an anomaly core installed!")) + return + user.drop_from_inventory(I, src) + AC = I + to_chat(user, SPAN_NOTICE("You insert \the [AC] into \the [src].")) + desc_info = "\The [src] has an anomaly core installed! You can use a wrench to remove it." + anomaly_overlay = image(AC.icon, null, AC.icon_state) + anomaly_overlay.pixel_y = 3 + add_overlay(anomaly_overlay) + return + if(I.iswrench()) + if(!AC) + to_chat(user, SPAN_WARNING("\The [src] doesn't have an anomaly core installed!")) + return + to_chat(user, SPAN_NOTICE("You remove \the [AC] from \the [src].")) + playsound(loc, I.usesound, 50, TRUE) + user.put_in_hands(AC) + cut_overlay(anomaly_overlay) + qdel(anomaly_overlay) + AC = null + if(owner) + deactivate() + return + return ..() + +/obj/item/mecha_equipment/phazon/attack_self(mob/user) + . = ..() + if(!.) + return + + if(!AC) + to_chat(user, SPAN_WARNING("\The [src] needs an anomaly core to function!")) + return + + if(!owner.incorporeal_move) + to_chat(user, SPAN_NOTICE("You fire up \the [src], semi-shifting into another plane of existence!")) + owner.set_mech_incorporeal(INCORPOREAL_MECH) + else + to_chat(user, SPAN_NOTICE("You disable \the [src], shifting back into your normal reality.")) + owner.set_mech_incorporeal(INCORPOREAL_DISABLE) + +/obj/item/mecha_equipment/phazon/deactivate() + owner.set_mech_incorporeal(INCORPOREAL_DISABLE) + ..() + +/obj/item/mecha_equipment/phazon/uninstalled() + owner.set_mech_incorporeal(INCORPOREAL_DISABLE) + ..() /obj/item/mecha_equipment/mounted_system/grenadecleaner name = "cleaner grenade launcher" diff --git a/code/modules/heavy_vehicle/mech_helpers.dm b/code/modules/heavy_vehicle/mech_helpers.dm index 02956750f46..49fa2a9d6a3 100644 --- a/code/modules/heavy_vehicle/mech_helpers.dm +++ b/code/modules/heavy_vehicle/mech_helpers.dm @@ -18,7 +18,7 @@ next_mecha_move = world.time + 15 return - next_mecha_move = world.time + legs.move_delay + next_mecha_move = world.time + (incorporeal_move ? legs.move_delay / 2 : legs.move_delay) if(maintenance_protocols) if(user) @@ -74,4 +74,44 @@ text = replacemany(text, list("\"" = "", "." = "", "," = "")) text = trim_left(text) text = trim_right(text) - return text \ No newline at end of file + return text + +/mob/living/heavy_vehicle/proc/use_cell_power(var/power_to_use) + var/power_used = get_cell()?.use(power_to_use) + if(power_used <= 0) + for(var/hardpoint in hardpoints) + var/obj/item/mecha_equipment/ME = hardpoints[hardpoint] + if(ME) + ME.deactivate() + return power_used + +/mob/living/heavy_vehicle/proc/drain_cell_power(var/power_to_drain) + var/power_used = get_cell()?.drain_power(0, 0, power_to_drain) + if(power_used <= 0) + for(var/hardpoint in hardpoints) + var/obj/item/mecha_equipment/ME = hardpoints[hardpoint] + if(ME) + ME.deactivate() + return power_used + +/mob/living/heavy_vehicle/proc/checked_use_cell(var/power_to_drain) + var/can_use = get_cell()?.checked_use(0, 0, power_to_drain) + if(!get_cell()?.charge) + for(var/hardpoint in hardpoints) + var/obj/item/mecha_equipment/ME = hardpoints[hardpoint] + if(ME) + ME.deactivate() + return can_use + +/mob/living/heavy_vehicle/proc/set_mech_incorporeal(var/incorporeal_state) + var/old_corporeal_state = incorporeal_move + incorporeal_move = incorporeal_state + if(old_corporeal_state != incorporeal_move) + if(incorporeal_move) + add_filter("INCORPBLUR", 1, list("type" = "blur")) + animate(src, time = 1 SECOND, alpha = 150, flags = ANIMATION_PARALLEL) + animate(get_filter("INCORPBLUR"), time = 1 SECOND, size = 1.5, flags = ANIMATION_PARALLEL) + else + animate(get_filter("INCORPBLUR"), time = 1 SECOND, size = 1, flags = ANIMATION_PARALLEL) + animate(src, time = 1 SECOND, alpha = initial(alpha), flags = ANIMATION_PARALLEL) + remove_filter("INCORPBLUR") \ No newline at end of file diff --git a/code/modules/heavy_vehicle/mech_interaction.dm b/code/modules/heavy_vehicle/mech_interaction.dm index a79151b8e87..a98875765e7 100644 --- a/code/modules/heavy_vehicle/mech_interaction.dm +++ b/code/modules/heavy_vehicle/mech_interaction.dm @@ -75,7 +75,7 @@ setClickCooldown(15) return - if(!(get_cell()?.checked_use(arms.power_use * CELLRATE))) + if(!checked_use_cell(arms.power_use * CELLRATE)) to_chat(user, power == MECH_POWER_ON ? SPAN_WARNING("Error: Power levels insufficient.") : SPAN_WARNING("\The [src] is powered off.")) return @@ -286,9 +286,15 @@ var/turf/target_loc = get_step(src, direction) if(!legs.can_move_on(loc, target_loc)) return - Move(target_loc, direction) + if(incorporeal_move) + if(legs && legs.mech_step_sound) + playsound(src.loc,legs.mech_step_sound,40,1) + use_cell_power(legs.power_use * CELLRATE) + user.client.Process_Incorpmove(direction, src) + else + Move(target_loc, direction) else - get_cell()?.use(legs.power_use * CELLRATE) + use_cell_power(legs.power_use * CELLRATE) if(legs && legs.mech_turn_sound) playsound(src.loc,legs.mech_turn_sound,40,1) next_mecha_move = world.time + legs.turn_delay @@ -307,9 +313,15 @@ if(..() && !istype(loc, /turf/space)) if(legs && legs.mech_step_sound) playsound(src.loc,legs.mech_step_sound,40,1) - get_cell()?.use(legs.power_use * CELLRATE) + use_cell_power(legs.power_use * CELLRATE) update_icon() +/mob/living/heavy_vehicle/Post_Incorpmove() + if(istype(hardpoints[HARDPOINT_BACK], /obj/item/mecha_equipment/phazon)) + var/obj/item/mecha_equipment/phazon/PZ = hardpoints[HARDPOINT_BACK] + use_cell_power(PZ.active_power_use * CELLRATE) + return ..() + /mob/living/heavy_vehicle/attackby(var/obj/item/thing, var/mob/user) if(user.a_intent != I_HURT && istype(thing, /obj/item/mecha_equipment)) if(hardpoints_locked) diff --git a/code/modules/heavy_vehicle/mech_life.dm b/code/modules/heavy_vehicle/mech_life.dm index cfd6e07b10d..3a4ee7a07e4 100644 --- a/code/modules/heavy_vehicle/mech_life.dm +++ b/code/modules/heavy_vehicle/mech_life.dm @@ -30,7 +30,7 @@ var/powered = FALSE if(get_cell()) - powered = get_cell().drain_power(0, 0, calc_power_draw()) > 0 + powered = drain_cell_power(calc_power_draw()) > 0 if(!powered) //Shut down all systems diff --git a/code/modules/heavy_vehicle/mecha.dm b/code/modules/heavy_vehicle/mecha.dm index 6b357750585..eaba2b963e8 100644 --- a/code/modules/heavy_vehicle/mecha.dm +++ b/code/modules/heavy_vehicle/mecha.dm @@ -10,6 +10,7 @@ mob_push_flags = ALLMOBS can_be_buckled = FALSE accent = ACCENT_TTS + appearance_flags = KEEP_TOGETHER var/decal var/emp_damage = 0 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index a59609b994c..fa9966809f8 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -191,7 +191,7 @@ Move_object(direct) if(mob.incorporeal_move && isobserver(mob)) - Process_Incorpmove(direct) + Process_Incorpmove(direct, mob) return if(moving || world.time < move_delay) @@ -219,8 +219,8 @@ if(isliving(mob)) var/mob/living/L = mob - if(L.incorporeal_move)//Move though walls - Process_Incorpmove(direct) + if(L.incorporeal_move && isturf(mob.loc))//Move though walls + Process_Incorpmove(direct, mob) return if(mob.client && ((mob.client.view != world.view) || (mob.client.pixel_x != 0) || (mob.client.pixel_y != 0))) // If mob moves while zoomed in with device, unzoom them. for(var/obj/item/item in mob) @@ -395,44 +395,49 @@ ///Process_Incorpmove ///Called by client/Move() ///Allows mobs to run though walls -/client/proc/Process_Incorpmove(direct) - var/turf/mobloc = get_turf(mob) - switch(mob.incorporeal_move) +/client/proc/Process_Incorpmove(direct, var/mob/use_mob) + if(!use_mob) + use_mob = mob + var/turf/mobloc = get_turf(use_mob) + switch(use_mob.incorporeal_move) if(INCORPOREAL_GHOST) - var/turf/T = get_step(mob, direct) - if(mob.check_holy(T)) - to_chat(mob, SPAN_WARNING("You cannot get past holy grounds while you are in this plane of existence!")) + var/turf/T = get_step(use_mob, direct) + if(use_mob.check_holy(T)) + to_chat(src, SPAN_WARNING("You cannot get past holy grounds while you are in this plane of existence!")) return else - mob.forceMove(get_step(mob, direct)) - mob.dir = direct + use_mob.forceMove(get_step(use_mob, direct)) + use_mob.dir = direct if(INCORPOREAL_NINJA, INCORPOREAL_BSTECH) - anim(mobloc, mob, 'icons/mob/mob.dmi', null, "shadow", null, mob.dir) - mob.forceMove(get_step(mob, direct)) - mob.dir = direct + anim(mobloc, use_mob, 'icons/mob/mob.dmi', null, "shadow", null, use_mob.dir) + use_mob.forceMove(get_step(use_mob, direct)) + use_mob.dir = direct + if(INCORPOREAL_MECH) + new /obj/effect/temp_visual/incorporeal_mech(mobloc, use_mob.dir, use_mob) + use_mob.forceMove(get_step(use_mob, direct)) if(INCORPOREAL_SHADE) - if(!mob.canmove || mob.anchored) + if(!use_mob.canmove || use_mob.anchored) return move_delay = 1 + world.time - var/turf/T = get_step(mob, direct) + var/turf/T = get_step(use_mob, direct) for(var/obj/structure/window/W in T) if(istype(W, /obj/structure/window/phoronbasic) || istype(W, /obj/structure/window/phoronreinforced)) if(W.is_full_window()) - to_chat(mob, SPAN_WARNING("\The [W] obstructs your movement!")) + to_chat(src, SPAN_WARNING("\The [W] obstructs your movement!")) return if((direct & W.dir) && W.density) - to_chat(mob, SPAN_WARNING("\The [W] obstructs your movement!")) + to_chat(src, SPAN_WARNING("\The [W] obstructs your movement!")) return if(istype(T, /turf/simulated/wall/phoron) || istype(T, /turf/simulated/wall/ironphoron)) - to_chat(mob, SPAN_WARNING("\The [T] obstructs your movement!")) + to_chat(src, SPAN_WARNING("\The [T] obstructs your movement!")) return for(var/mob/living/L in T) if(L.is_diona() == DIONA_WORKER) - to_chat(mob, SPAN_DANGER("You struggle briefly as you are photovored into \the [L], trapped within a nymphomatic husk!")) + to_chat(src, SPAN_DANGER("You struggle briefly as you are photovored into \the [L], trapped within a nymphomatic husk!")) var/mob/living/carbon/alien/diona/D = new /mob/living/carbon/alien/diona(L) - var/mob/living/simple_animal/shade/bluespace/BS = mob + var/mob/living/simple_animal/shade/bluespace/BS = use_mob if (!(/mob/living/carbon/proc/echo_eject in L.verbs)) L.verbs.Add(/mob/living/carbon/proc/echo_eject) BS.mind.transfer_to(D) @@ -445,21 +450,21 @@ qdel(BS) return - mob.forceMove(get_step(mob, direct)) - mob.dir = direct + use_mob.forceMove(get_step(use_mob, direct)) + use_mob.dir = direct // Crossed is always a bit iffy - for(var/obj/S in mob.loc) + for(var/obj/S in use_mob.loc) if(istype(S,/obj/effect/step_trigger) || istype(S,/obj/effect/beam)) - S.Crossed(mob) + S.Crossed(use_mob) - var/area/A = get_area_master(mob) + var/area/A = get_area_master(use_mob) if(A) - A.Entered(mob) - if(isturf(mob.loc)) - var/turf/T = mob.loc - T.Entered(mob) - mob.Post_Incorpmove() + A.Entered(use_mob) + if(isturf(use_mob.loc)) + var/turf/T = use_mob.loc + T.Entered(use_mob) + use_mob.Post_Incorpmove() return 1 /mob/proc/Post_Incorpmove() diff --git a/code/modules/research/designs/mechfab/mechs/designs_exosuit_equipment.dm b/code/modules/research/designs/mechfab/mechs/designs_exosuit_equipment.dm index e37be761086..7b279a9fc56 100644 --- a/code/modules/research/designs/mechfab/mechs/designs_exosuit_equipment.dm +++ b/code/modules/research/designs/mechfab/mechs/designs_exosuit_equipment.dm @@ -131,4 +131,14 @@ /datum/design/item/mechfab/exosuit_equipment/drill_mover name = "Mounted Drill Loader System" materials = list(DEFAULT_WALL_MATERIAL = 15000) - build_path = /obj/item/mecha_equipment/drill_mover \ No newline at end of file + build_path = /obj/item/mecha_equipment/drill_mover + +/datum/design/item/mechfab/exosuit_equipment/phazon + name = "Phazon Bluespace Transmission System" + materials = list(MATERIAL_STEEL = 25000, MATERIAL_PHORON = 10000) + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 5) + build_path = /obj/item/mecha_equipment/phazon + +/datum/design/item/mechfab/exosuit_equipment/phazon/AssembleDesignDesc() + . = ..() + desc += " It needs an anomaly core to function, however." \ No newline at end of file diff --git a/html/changelogs/geeves-phazon_module.yml b/html/changelogs/geeves-phazon_module.yml new file mode 100644 index 00000000000..c14a9065fa7 --- /dev/null +++ b/html/changelogs/geeves-phazon_module.yml @@ -0,0 +1,6 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Added the phazon bluespace transmission system to the mechfab. When built and supplied with an anomaly core, it'll allow exosuit to pass through solid objects, at a massive energy cost." \ No newline at end of file diff --git a/icons/mecha/mech_equipment.dmi b/icons/mecha/mech_equipment.dmi index c9602e9cc91a95445af79acd71fe44c988bae5c5..90c3520826bbe5fa6033b31be27b370534908796 100644 GIT binary patch delta 11001 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 BUFrY;