[Requested] Serenity changed to proper medical exosuit. (#8951)

* Serenity changed to proper medical exosuit.

Serenity tweaked to be a medical subtype, weapons cannot fit in universal slots.

Serenity weapon slot converted to a hull slot.

Exosuit punching converted to general ability, if melee_can_hit is TRUE by default.

* Cleanup.
Move HuD management to /obj/mecha/medical

* dedent??

* Fixfix

* Jumpjet
This commit is contained in:
Mechoid
2023-03-04 13:44:46 -08:00
committed by GitHub
parent 875ce57109
commit 6064f4057c
10 changed files with 150 additions and 183 deletions
+4 -95
View File
@@ -1,7 +1,9 @@
/obj/mecha/combat
force = 30
var/melee_cooldown = 10
var/melee_can_hit = 1
melee_cooldown = 10
melee_can_hit = 1
melee_sound = 'sound/weapons/heavysmash.ogg'
//var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall, /obj/structure/girder)
internal_damage_threshold = 50
maint_access = 0
@@ -35,99 +37,6 @@
return
*/
/obj/mecha/combat/melee_action(atom/T)
if(internal_damage&MECHA_INT_CONTROL_LOST)
T = safepick(oview(1,src))
if(!melee_can_hit)
return
if(istype(T, /mob/living))
var/mob/living/M = T
if(src.occupant.a_intent == I_HURT || istype(src.occupant, /mob/living/carbon/brain)) //Brains cannot change intents; Exo-piloting brains lack any form of physical feedback for control, limiting the ability to 'play nice'.
playsound(src, 'sound/weapons/heavysmash.ogg', 50, 1)
if(damtype == "brute")
step_away(M,src,15)
/*
if(M.stat>1)
M.gib()
melee_can_hit = 0
if(do_after(melee_cooldown))
melee_can_hit = 1
return
*/
if(ishuman(T))
var/mob/living/carbon/human/H = T
// if (M.health <= 0) return
var/obj/item/organ/external/temp = H.get_organ(pick(BP_TORSO, BP_TORSO, BP_TORSO, BP_HEAD))
if(temp)
var/update = 0
switch(damtype)
if("brute")
H.Paralyse(1)
update |= temp.take_damage(rand(force/2, force), 0)
if("fire")
update |= temp.take_damage(0, rand(force/2, force))
if("tox")
if(H.reagents)
if(H.reagents.get_reagent_amount("carpotoxin") + force < force*2)
H.reagents.add_reagent("carpotoxin", force)
if(H.reagents.get_reagent_amount("cryptobiolin") + force < force*2)
H.reagents.add_reagent("cryptobiolin", force)
if("halloss")
H.stun_effect_act(1, force / 2, BP_TORSO, src)
else
return
if(update) H.UpdateDamageIcon()
H.updatehealth()
else
switch(damtype)
if("brute")
M.Paralyse(1)
M.take_overall_damage(rand(force/2, force))
if("fire")
M.take_overall_damage(0, rand(force/2, force))
if("tox")
if(M.reagents)
if(M.reagents.get_reagent_amount("carpotoxin") + force < force*2)
M.reagents.add_reagent("carpotoxin", force)
if(M.reagents.get_reagent_amount("cryptobiolin") + force < force*2)
M.reagents.add_reagent("cryptobiolin", force)
else
return
M.updatehealth()
src.occupant_message("You hit [T].")
src.visible_message("<font color='red'><b>[src.name] hits [T].</b></font>")
else
step_away(M,src)
src.occupant_message("You push [T] out of the way.")
src.visible_message("[src] pushes [T] out of the way.")
melee_can_hit = 0
if(do_after(melee_cooldown))
melee_can_hit = 1
return
else
if(istype(T, /obj/machinery/disposal)) // Stops mechs from climbing into disposals
return
if(src.occupant.a_intent == I_HURT || istype(src.occupant, /mob/living/carbon/brain)) // Don't smash unless we mean it
if(damtype == "brute")
src.occupant_message("You hit [T].")
src.visible_message("<font color='red'><b>[src.name] hits [T]</b></font>")
playsound(src, 'sound/weapons/heavysmash.ogg', 50, 1)
if(istype(T, /obj/structure/girder))
T:take_damage(force * 3) //Girders have 200 health by default. Steel, non-reinforced walls take four punches, girders take (with this value-mod) two, girders took five without.
else
T:take_damage(force)
melee_can_hit = 0
if(do_after(melee_cooldown))
melee_can_hit = 1
return
/obj/mecha/combat/moved_inside(var/mob/living/carbon/human/H as mob)
if(..())
if(H.client)
-56
View File
@@ -81,62 +81,6 @@
return
cell = new /obj/item/cell/hyper(src)
/obj/mecha/combat/gygax/serenity
desc = "A lightweight exosuit made from a modified Gygax chassis combined with proprietary VeyMed medical tech. It's faster and sturdier than most medical mechs, but much of the armor plating has been stripped out, leaving it more vulnerable than a regular Gygax."
name = "Serenity"
icon_state = "medgax"
initial_icon = "medgax"
health = 150
maxhealth = 150
deflect_chance = 20
step_in = 2
max_temperature = 20000
overload_coeff = 1
wreckage = /obj/effect/decal/mecha_wreckage/gygax/serenity
max_equip = 3
step_energy_drain = 8
cargo_capacity = 2
max_hull_equip = 1
max_weapon_equip = 1
max_utility_equip = 2
max_universal_equip = 1
max_special_equip = 1
starting_components = list(
/obj/item/mecha_parts/component/hull,
/obj/item/mecha_parts/component/actuator,
/obj/item/mecha_parts/component/armor/lightweight,
/obj/item/mecha_parts/component/gas,
/obj/item/mecha_parts/component/electrical
)
var/obj/item/clothing/glasses/hud/health/mech/hud
/obj/mecha/combat/gygax/serenity/Initialize()
. = ..()
hud = new /obj/item/clothing/glasses/hud/health/mech(src)
return
/obj/mecha/combat/gygax/serenity/moved_inside(var/mob/living/carbon/human/H as mob)
if(..())
if(H.glasses)
occupant_message("<font color='red'>[H.glasses] prevent you from using [src] [hud]</font>")
else
H.glasses = hud
H.recalculate_vis()
return 1
else
return 0
/obj/mecha/combat/gygax/serenity/go_out()
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
if(H.glasses == hud)
H.glasses = null
H.recalculate_vis()
..()
return
//Meant for random spawns.
/obj/mecha/combat/gygax/old
desc = "A lightweight, security exosuit. Popular among private and corporate security. This one is particularly worn looking and likely isn't as sturdy."
+1 -1
View File
@@ -9,7 +9,7 @@
range = RANGED
step_delay = 0.2 SECONDS
required_type = list(/obj/mecha/working/hoverpod, /obj/mecha/combat/gygax/serenity, /obj/mecha/combat/marauder)
required_type = list(/obj/mecha/working/hoverpod, /obj/mecha/medical/serenity, /obj/mecha/combat/marauder)
var/hover_sound = 'sound/machines/generator/generator_end.ogg'
+86 -2
View File
@@ -60,7 +60,11 @@
var/datum/effect_system/spark_spread/spark_system = new
var/lights = 0
var/lights_power = 6
var/force = 0
var/force = 15 // Damage value used for punching.
var/melee_cooldown = 10 // Cooldown for punching.
var/melee_can_hit = FALSE // If set to true, the exosuit will be able to punch.
var/melee_sound = 'sound/weapons/heavysmash.ogg'
var/mech_faction = null
var/firstactivation = 0 //It's simple. If it's 0, no one entered it yet. Otherwise someone entered it at least once.
@@ -676,7 +680,87 @@
if(src_object in view(2, src))
return STATUS_UPDATE //if they're close enough, allow the occupant to see the screen through the viewport or whatever.
/obj/mecha/proc/melee_action(atom/target)
/obj/mecha/proc/melee_action(atom/T)
if(internal_damage & MECHA_INT_CONTROL_LOST)
T = safepick(oview(1,src))
if(!melee_can_hit)
return
if(istype(T, /obj/machinery/disposal)) // Stops mechs from climbing into disposals
return
if(isliving(T))
var/mob/living/M = T
if(src.occupant.a_intent == I_HURT || isbrain(src.occupant)) //Brains cannot change intents; Exo-piloting brains lack any form of physical feedback for control, limiting the ability to 'play nice'.
playsound(src, 'sound/weapons/heavysmash.ogg', 50, 1)
do_attack_animation(T)
if(damtype == "brute")
step_away(M,src,15)
if(ishuman(T))
var/mob/living/carbon/human/H = T
var/obj/item/organ/external/temp = H.get_organ(pick(BP_TORSO, BP_TORSO, BP_TORSO, BP_HEAD))
if(istype(temp))
var/update = 0
switch(damtype)
if("brute")
H.Paralyse(1)
update |= temp.take_damage(rand(force/2, force), 0)
if("fire")
update |= temp.take_damage(0, rand(force/2, force))
if("tox")
if(H.reagents)
if(H.reagents.get_reagent_amount("carpotoxin") < force*2)
H.reagents.add_reagent("carpotoxin", force)
if(H.reagents.get_reagent_amount("cryptobiolin") < force*2)
H.reagents.add_reagent("cryptobiolin", force)
if("halloss")
H.stun_effect_act(1, force / 2, BP_TORSO, src)
else
return
if(update) H.UpdateDamageIcon()
H.updatehealth()
else
switch(damtype)
if("brute")
M.Paralyse(1)
M.take_overall_damage(rand(force/2, force))
if("fire")
M.take_overall_damage(0, rand(force/2, force))
if("tox")
if(M.reagents)
if(M.reagents.get_reagent_amount("carpotoxin") + force < force*2)
M.reagents.add_reagent("carpotoxin", force)
if(M.reagents.get_reagent_amount("cryptobiolin") + force < force*2)
M.reagents.add_reagent("cryptobiolin", force)
else
return
M.updatehealth()
src.occupant_message("You hit [T].")
src.visible_message(SPAN_DANGER("[src.name] hits [T]"))
else
step_away(M,src)
src.occupant_message("You push [T] out of the way.")
src.visible_message("[src] pushes [T] out of the way.")
else
if(src.occupant.a_intent == I_HURT || isbrain(src.occupant)) // Don't smash unless we mean it
if(damtype == "brute")
src.occupant_message("You hit [T].")
src.visible_message(SPAN_DANGER("[src.name] hits [T]"))
playsound(src, 'sound/weapons/heavysmash.ogg', 50, 1)
do_attack_animation(T)
if(istype(T, /obj/structure/girder))
T:take_damage(force * 3) //Girders have 200 health by default. Steel, non-reinforced walls take four combat exosuit punches, girders take (with this value-mod) two, girders took five without.
else
T:take_damage(force)
melee_can_hit = 0
if(do_after(melee_cooldown))
melee_can_hit = 1
return
/obj/mecha/proc/range_action(atom/target)
+1 -1
View File
@@ -594,7 +594,7 @@
/datum/construction/reversible/mecha/serenity
result = "/obj/mecha/combat/gygax/serenity"
result = "/obj/mecha/medical/serenity"
steps = list(
//1
list("key"=/obj/item/weldingtool,
+23
View File
@@ -5,6 +5,7 @@
max_universal_equip = 1
max_special_equip = 1
melee_sound = 'sound/weapons/resonator_blast.ogg'
stomp_sound = 'sound/mecha/mechmove01.ogg'
cargo_capacity = 1
@@ -17,12 +18,34 @@
/obj/item/mecha_parts/component/electrical
)
var/obj/item/clothing/glasses/hud/health/mech/hud
/obj/mecha/medical/Initialize()
. = ..()
var/turf/T = get_turf(src)
if(isPlayerLevel(T.z))
new /obj/item/mecha_parts/mecha_tracking(src)
hud = new /obj/item/clothing/glasses/hud/health/mech(src)
return
/obj/mecha/medical/moved_inside(var/mob/living/carbon/human/H as mob)
. = ..()
if(istype(H))
if(H.glasses)
occupant_message("<font color='red'>[H.glasses] prevent you from using [src] [hud]</font>")
else
H.glasses = hud
H.recalculate_vis()
/obj/mecha/medical/odysseus/go_out()
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
if(H.glasses == hud)
H.glasses = null
H.recalculate_vis()
return ..()
/* // One horrific bastardization of glorious inheritence dead. A billion to go. ~Mech
/obj/mecha/medical/mechturn(direction)
set_dir(direction)
+1 -26
View File
@@ -15,35 +15,10 @@
internal_damage_threshold = 35
deflect_chance = 15
step_energy_drain = 6
var/obj/item/clothing/glasses/hud/health/mech/hud
icon_scale_x = 1.2
icon_scale_y = 1.2
/obj/mecha/medical/odysseus/Initialize()
. = ..()
hud = new /obj/item/clothing/glasses/hud/health/mech(src)
return
/obj/mecha/medical/odysseus/moved_inside(var/mob/living/carbon/human/H as mob)
if(..())
if(H.glasses)
occupant_message("<font color='red'>[H.glasses] prevent you from using [src] [hud]</font>")
else
H.glasses = hud
H.recalculate_vis()
return 1
else
return 0
/obj/mecha/medical/odysseus/go_out()
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
if(H.glasses == hud)
H.glasses = null
H.recalculate_vis()
..()
return
/*
verb/set_perspective()
set name = "Set client perspective."
@@ -143,4 +118,4 @@
. = ..()
health = 25
maxhealth = 50 //Just slightly worse.
cell.charge = rand(0, (cell.charge/2))
cell.charge = rand(0, (cell.charge/2))
+31
View File
@@ -0,0 +1,31 @@
/obj/mecha/medical/serenity
desc = "A lightweight exosuit made from a modified Gygax chassis combined with proprietary VeyMed medical tech. It's faster and sturdier than most medical mechs, but much of the armor plating has been stripped out, leaving it more vulnerable than a regular Gygax."
name = "Serenity"
icon_state = "medgax"
initial_icon = "medgax"
health = 150
maxhealth = 150
deflect_chance = 20
step_in = 2
max_temperature = 20000
overload_coeff = 1
wreckage = /obj/effect/decal/mecha_wreckage/gygax/serenity
max_equip = 3
step_energy_drain = 8
cargo_capacity = 2
max_hull_equip = 2
max_weapon_equip = 0
max_utility_equip = 2
max_universal_equip = 1
max_special_equip = 1
overload_possible = 1
force = 20 // 10 less than normal combat exos.
melee_can_hit = TRUE
melee_sound = 'sound/weapons/heavysmash.ogg'
catalogue_data = list(
/datum/category_item/catalogue/information/organization/vey_med
)
+2 -2
View File
@@ -7,7 +7,7 @@
//This list includes the phazon, gorilla and mauler. You might want to use something else if balance is a concern.
/obj/random/mech/item_to_spawn()
return pick(/obj/mecha/combat/gygax,
/obj/mecha/combat/gygax/serenity,
/obj/mecha/medical/serenity,
/obj/mecha/combat/gygax/dark,
/obj/mecha/combat/marauder,
/obj/mecha/combat/marauder/seraph,
@@ -28,7 +28,7 @@
/obj/random/mech/weaker/item_to_spawn()
return pick(/obj/mecha/combat/gygax,
/obj/mecha/combat/gygax/serenity,
/obj/mecha/medical/serenity,
/obj/mecha/medical/odysseus,
/obj/mecha/combat/durand,
/obj/mecha/working/ripley,
+1
View File
@@ -883,6 +883,7 @@
#include "code\game\mecha\equipment\weapons\fire\incendiary.dm"
#include "code\game\mecha\medical\medical.dm"
#include "code\game\mecha\medical\odysseus.dm"
#include "code\game\mecha\medical\serenity.dm"
#include "code\game\mecha\space\hoverpod.dm"
#include "code\game\mecha\space\shuttle.dm"
#include "code\game\mecha\working\ripley.dm"