Buffs every guardian bar ranged. Chaos guardian is gone, Gaseous guardian replaces it. (#21420)

* pushing to save

* the rest of the owl bar protection

* makes that work

* more plasma, agent B

* spacemove

* Apply suggestions from code review

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: Farie82 <farie82@users.noreply.github.com>

* efficency

* Update code/game/gamemodes/miniantags/guardian/types/gaseous.dm

Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>

* better name

* Apply suggestions from code review

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* string

* defines it

---------

Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: Farie82 <farie82@users.noreply.github.com>
Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>
Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
This commit is contained in:
Qwertytoforty
2023-09-06 12:36:48 +01:00
committed by GitHub
co-authored by Luc Farie82 SteelSlayer Henri215
parent 5b0c5c9e95
commit 69d0dc758f
11 changed files with 230 additions and 104 deletions
@@ -178,6 +178,9 @@
ghostize()
qdel(src)
/mob/living/simple_animal/hostile/guardian/Process_Spacemove(movement_dir = 0)
return TRUE //Works better in zero G, and not useless in space
//Manifest, Recall, Communicate
/mob/living/simple_animal/hostile/guardian/proc/Manifest()
@@ -328,8 +331,8 @@
var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch
switch(guardian_type)
if("Chaos")
pickedtype = /mob/living/simple_animal/hostile/guardian/fire
if("Gaseous")
pickedtype = /mob/living/simple_animal/hostile/guardian/gaseous
if("Standard")
pickedtype = /mob/living/simple_animal/hostile/guardian/punch
@@ -1,6 +1,6 @@
/mob/living/simple_animal/hostile/guardian/assassin
melee_damage_lower = 20
melee_damage_upper = 20
melee_damage_lower = 25
melee_damage_upper = 25
damage_transfer = 0.6
playstyle_string = "As an <b>Assassin</b> type you do medium damage and have moderate damage resistance, but can enter stealth, massively increasing the damage of your next attack and causing it to ignore armor. Stealth is broken when you attack or take damage."
magic_fluff_string = "..And draw the Space Ninja, a lethal, invisible assassin."
@@ -1,64 +0,0 @@
/mob/living/simple_animal/hostile/guardian/fire
melee_damage_lower = 10
melee_damage_upper = 10
attack_sound = 'sound/items/welder.ogg'
attacktext = "sears"
damage_transfer = 0.8
range = 10
playstyle_string = "As a <b>Chaos</b> type, you have only light damage resistance, but will ignite any enemy you bump into. In addition, you can toggle modes to make your attacks teleport enemies or make them hallucinate."
environment_smash = 1
magic_fluff_string = "..And draw the Wizard, bringer of endless chaos!"
tech_fluff_string = "Boot sequence complete. Crowd control modules activated. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to sow havoc at random."
var/toggle = FALSE
/mob/living/simple_animal/hostile/guardian/fire/Life(seconds, times_fired) //Dies if the summoner dies
..()
if(summoner)
summoner.ExtinguishMob()
summoner.adjust_fire_stacks(-20)
/mob/living/simple_animal/hostile/guardian/fire/ToggleMode()
if(toggle)
to_chat(src, "<span class='notice'>You switch to dispersion mode, and will teleport victims away from your master.</span>")
toggle = FALSE
else
to_chat(src, "<span class='notice'>You switch to deception mode, and will turn your victims against their allies.</span>")
toggle = TRUE
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
. = ..()
if(toggle)
if(. && iscarbon(target))
new /obj/effect/hallucination/delusion(get_turf(target), target, icon, icon_state)
else
if(prob(45))
if(ismovable(target))
var/atom/movable/M = target
if(!M.anchored && M != summoner)
new /obj/effect/temp_visual/guardian/phase/out(get_turf(M))
do_teleport(M, M, 10)
new /obj/effect/temp_visual/guardian/phase/out(get_turf(M))
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj, oldloc)
..()
collision_ignite(AM)
/mob/living/simple_animal/hostile/guardian/fire/Bumped(AM as mob|obj)
..()
collision_ignite(AM)
/mob/living/simple_animal/hostile/guardian/fire/Bump(AM as mob|obj)
..()
collision_ignite(AM)
/mob/living/simple_animal/hostile/guardian/fire/proc/collision_ignite(AM as mob|obj)
if(isliving(AM))
var/mob/living/M = AM
if(AM != summoner && M.fire_stacks < 7)
M.fire_stacks = 7
M.IgniteMob()
/mob/living/simple_animal/hostile/guardian/fire/Bump(AM as mob|obj)
..()
collision_ignite(AM)
@@ -1,6 +1,6 @@
/mob/living/simple_animal/hostile/guardian/charger
melee_damage_lower = 15
melee_damage_upper = 15
melee_damage_lower = 20
melee_damage_upper = 20
ranged = TRUE //technically
ranged_message = "charges"
ranged_cooldown_time = 40
@@ -87,6 +87,7 @@
stored_obj.forceMove(get_turf(loc))
playsound(get_turf(src),'sound/effects/explosion2.ogg', 200, 1)
user.ex_act(2)
user.Stun(3 SECONDS)//A bomb went off in your hands. Actually lets people follow up with it if they bait someone, right now it is unreliable.
qdel(src)
/obj/item/guardian_bomb/attackby(obj/item/W, mob/living/user)
@@ -0,0 +1,78 @@
//Gaseous
/mob/living/simple_animal/hostile/guardian/gaseous
melee_damage_lower = 10
melee_damage_upper = 10
damage_transfer = 0.7
range = 7
playstyle_string = "As a <b>gaseous</b> type, you have only light damage resistance, but you can expel gas in an area. In addition, your punches cause sparks, and you make your summoner heat resistant."
magic_fluff_string = "..And draw the Atmospheric Technician, flooding the area with gas!"
tech_fluff_string = "Boot sequence complete. Atmospheric modules activated. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spewing out many gases."
/// Moles of gas being expelled.
var/moles_of_gas = null
///Linda flag for the expelled gas because we need to use special flags for it that are not readable in game well.
var/linda_flags = null
/// Possible gases to expel, with how much moles they create.
var/static/list/possible_gases = list(
"Oxygen" = 50,
"Nitrogen" = 750, //overpressurizing is hard!.
"N2O" = 15,
"CO2" = 50,
"Plasma" = 5,
"Agent B" = 5
)
/mob/living/simple_animal/hostile/guardian/gaseous/Initialize(mapload, mob/living/host)
. = ..()
if(!summoner)
return
ADD_TRAIT(summoner, TRAIT_RESISTHEAT, "guardian")
/mob/living/simple_animal/hostile/guardian/gaseous/AttackingTarget(atom/attacked_target)
. = ..()
if(!isliving(target))
return
do_sparks(1, TRUE, target)
/mob/living/simple_animal/hostile/guardian/gaseous/Life(seconds, times_fired)
. = ..()
if(!moles_of_gas || loc == summoner)
return
var/turf/simulated/target_turf = get_turf(src)
if(istype(target_turf))
target_turf.atmos_spawn_air(linda_flags, moles_of_gas)
target_turf.air_update_turf()
/mob/living/simple_animal/hostile/guardian/gaseous/ToggleMode()
var/picked_gas = input("Select a gas to expel.", "Gas Producer") as null|anything in possible_gases
if(!picked_gas)
moles_of_gas = null
to_chat(src, "<span class='notice'>You stopped expelling gas.</span>")
return
if(!picked_gas)
return
to_chat(src, "<span class='bolddanger'>You are now expelling [picked_gas].</span>")
investigate_log("set their gas type to [picked_gas].", "atmos")
moles_of_gas = possible_gases[picked_gas]
switch(picked_gas)
if("Oxygen")
linda_flags = LINDA_SPAWN_OXYGEN | LINDA_SPAWN_20C
if("Nitrogen")
linda_flags = LINDA_SPAWN_NITROGEN | LINDA_SPAWN_20C
if("N2O")
linda_flags = LINDA_SPAWN_N2O | LINDA_SPAWN_20C
if("CO2")
linda_flags = LINDA_SPAWN_CO2 | LINDA_SPAWN_20C
if("Plasma")
linda_flags = LINDA_SPAWN_TOXINS | LINDA_SPAWN_20C
if("Agent B")
linda_flags = LINDA_SPAWN_AGENT_B | LINDA_SPAWN_20C
/mob/living/simple_animal/hostile/guardian/gaseous/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta)
. = ..()
return FALSE
/mob/living/simple_animal/hostile/guardian/gaseous/death(gibbed)
if(summoner)
REMOVE_TRAIT(summoner, TRAIT_RESISTHEAT, "guardian")
return ..()
@@ -1,18 +1,23 @@
#define COMBAT 0
#define HEALING 1
#define SURGICAL 2
/mob/living/simple_animal/hostile/guardian/healer
friendly = "heals"
speed = 0
damage_transfer = 0.7
melee_damage_lower = 15
melee_damage_upper = 15
playstyle_string = "As a <b>Support</b> type, you may toggle your basic attacks to a healing mode. In addition, Alt-Clicking on an adjacent mob will warp them to your bluespace beacon after a short delay."
playstyle_string = "As a <b>Support</b> type, you may toggle your basic attacks to a healing mode, or a surgical mode. In addition, Alt-Clicking on an adjacent mob will warp them to your bluespace beacon after a short delay."
magic_fluff_string = "..And draw the CMO, a potent force of life...and death."
tech_fluff_string = "Boot sequence complete. Medical modules active. Bluespace modules activated. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of mending wounds and travelling via bluespace."
var/obj/effect/bluespace_beacon/beacon
var/beacon_cooldown = 0
var/default_beacon_cooldown = 300 SECONDS
var/toggle = FALSE
var/toggle = COMBAT
var/heal_cooldown = 0
var/surgical_cooldown = 0
/mob/living/simple_animal/hostile/guardian/healer/sealhealer
name = "Seal Sprit"
@@ -42,45 +47,65 @@
..()
if(statpanel("Status"))
if(beacon_cooldown >= world.time)
stat(null, "Bluespace Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds")
stat(null, "Bluespace Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time) * 0.1, 0.1), 0)] seconds")
if(surgical_cooldown >= world.time)
stat(null, "Surgical Cooldown Remaining: [max(round((surgical_cooldown - world.time) * 0.1, 0.1), 0)] seconds")
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
. = ..()
if(toggle == TRUE)
if(loc == summoner)
to_chat(src, "<span class='danger'>You must be manifested to heal!</span>")
return
if(loc == summoner)
to_chat(src, "<span class='danger'>You must be manifested to heal!</span>")
return
if(toggle == HEALING)
if(iscarbon(target))
changeNext_move(CLICK_CD_MELEE)
changeNext_move(1.5 SECONDS)
if(heal_cooldown <= world.time && !stat)
var/mob/living/carbon/human/C = target
C.adjustBruteLoss(-5, robotic=1)
C.adjustFireLoss(-5, robotic=1)
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
heal_cooldown = world.time + 20
heal_cooldown = world.time + 1.5 SECONDS
if(C == summoner)
med_hud_set_health()
med_hud_set_status()
if(toggle == SURGICAL)
if(!iscarbon(target))
return
var/mob/living/carbon/human/C = target
if(surgical_cooldown <= world.time && !stat)
to_chat(src, "<span class='notice'>You begin to do a mass repair on [C], keep them still!</span>")
surgical_cooldown = world.time + 10 SECONDS
if(!do_after_once(src, 10 SECONDS, target = src))
return
for(var/obj/item/organ/external/E in C.bodyparts)
if(E.status & (ORGAN_INT_BLEEDING | ORGAN_BROKEN | ORGAN_SPLINTED | ORGAN_BURNT))
E.rejuvenate() //Repair it completely.
surgical_cooldown = world.time + 3 MINUTES
/mob/living/simple_animal/hostile/guardian/healer/ToggleMode()
if(loc == summoner)
if(toggle)
a_intent = INTENT_HARM
hud_used.action_intent.icon_state = a_intent
speed = 0
melee_damage_lower = 15
melee_damage_upper = 15
to_chat(src, "<span class='danger'>You switch to combat mode.</span>")
toggle = FALSE
else
a_intent = INTENT_HELP
hud_used.action_intent.icon_state = a_intent
speed = 1
melee_damage_lower = 0
melee_damage_upper = 0
to_chat(src, "<span class='danger'>You switch to healing mode.</span>")
toggle = TRUE
switch(toggle)
if(SURGICAL)
a_intent = INTENT_HARM
hud_used.action_intent.icon_state = a_intent
speed = 0
melee_damage_lower = 15
melee_damage_upper = 15
to_chat(src, "<span class='danger'>You switch to combat mode.</span>")
toggle = COMBAT
if(COMBAT)
a_intent = INTENT_HELP
hud_used.action_intent.icon_state = a_intent
speed = 1
melee_damage_lower = 0
melee_damage_upper = 0
to_chat(src, "<span class='danger'>You switch to healing mode.</span>")
toggle = HEALING
if(HEALING)
to_chat(src, "<span class='danger'>You switch to surgical. You no longer heal on punch, but can do a big critical injury healing on a long cooldown.</span>")
toggle = SURGICAL
else
to_chat(src, "<span class='danger'>You have to be recalled to toggle modes!</span>")
@@ -137,3 +162,8 @@
return
else
to_chat(src, "<span class='danger'>You need to hold still!</span>")
#undef COMBAT
#undef HEALING
#undef SURGICAL
@@ -8,7 +8,7 @@
attacktext = "shocks"
melee_damage_type = BURN
attack_sound = 'sound/machines/defib_zap.ogg'
damage_transfer = 0.6
damage_transfer = 0.5
range = 7
playstyle_string = "As a <b>Lightning</b> type, you will apply lightning chains to targets on attack and have a lightning chain to your summoner. Lightning chains will shock anyone near them."
magic_fluff_string = "..And draw the Tesla, a shocking, lethal source of power."
@@ -113,7 +113,7 @@
"<span class='userdanger'>You are shocked by the lightning chain!</span>", \
"<span class='italics'>You hear a heavy electrical crack.</span>" \
)
L.adjustFireLoss(1.2) //adds up very rapidly
L.adjustFireLoss(2.4) //adds up very rapidly
. = 1
/mob/living/simple_animal/hostile/guardian/beam/death(gibbed)
@@ -1,22 +1,51 @@
#define LEFT_SHIELD FALSE
#define RIGHT_SHEILD TRUE
/mob/living/simple_animal/hostile/guardian/protector
melee_damage_lower = 15
melee_damage_upper = 15
range = 15 //worse for it due to how it leashes
damage_transfer = 0.4
playstyle_string = "As a <b>Protector</b> type you cause your summoner to leash to you instead of you leashing to them and have two modes; Combat Mode, where you do and take medium damage, and Protection Mode, where you do and take almost no damage, but move slightly slower."
playstyle_string = "As a <b>Protector</b> type you cause your summoner to leash to you instead of you leashing to them and have two modes; Combat Mode, where you do and take medium damage, and Protection Mode, where you do and take almost no damage, but move slightly slower, as well as have a protective shield."
magic_fluff_string = "..And draw the Guardian, a stalwart protector that never leaves the side of its charge."
tech_fluff_string = "Boot sequence complete. Protector modules loaded. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to defend you."
var/toggle = FALSE
/// The shields the guardian has, and brings with it as it moves
var/list/connected_shields = list()
/mob/living/simple_animal/hostile/guardian/protector/ex_act(severity)
if(severity == 1)
adjustBruteLoss(400) //if in protector mode, will do 20 damage and not actually necessarily kill the summoner
adjustBruteLoss(200) //if in protector mode, will do 20 damage and not actually necessarily kill the summoner
else
..()
if(toggle)
visible_message("<span class='danger'>The explosion glances off [src]'s energy shielding!</span>")
/mob/living/simple_animal/hostile/guardian/protector/Manifest()
. = ..()
if(toggle && cooldown > world.time)
var/dir_left = turn(dir, -90)
var/dir_right = turn(dir, 90)
connected_shields += new /obj/effect/guardianshield(get_step(src, dir_left), src, FALSE)
connected_shields += new /obj/effect/guardianshield(get_step(src, dir_right), src, TRUE)
/mob/living/simple_animal/hostile/guardian/protector/Recall(forced)
. = ..()
if(cooldown > world.time && !forced)
QDEL_LIST_CONTENTS(connected_shields)
/mob/living/simple_animal/hostile/guardian/protector/Move()
. = ..()
for(var/obj/effect/guardianshield/G in connected_shields)
var/dir_chosen
if(G.shield_orientation)
dir_chosen = turn(dir, 90)
else
dir_chosen = turn(dir, -90)
G.forceMove(get_step(src, dir_chosen))
/mob/living/simple_animal/hostile/guardian/protector/ToggleMode()
if(cooldown > world.time)
return 0
@@ -31,6 +60,7 @@
damage_transfer = 0.4
to_chat(src, "<span class='danger'>You switch to combat mode.</span>")
toggle = FALSE
QDEL_LIST_CONTENTS(connected_shields)
else
var/icon/shield_overlay = icon('icons/effects/effects.dmi', "shield-grey")
shield_overlay *= name_color
@@ -40,9 +70,13 @@
obj_damage = 6 //40/7.5 rounded up, we don't want a protector guardian 2 shotting blob tiles while taking 5% damage, thats just silly.
move_resist = MOVE_FORCE_STRONG
speed = 1
damage_transfer = 0.05 //damage? what's damage?
damage_transfer = 0.1 //damage? what's damage?
to_chat(src, "<span class='danger'>You switch to protection mode.</span>")
toggle = TRUE
var/dir_left = turn(dir, -90)
var/dir_right = turn(dir, 90)
connected_shields += new /obj/effect/guardianshield(get_step(src, dir_left), src, LEFT_SHIELD)
connected_shields += new /obj/effect/guardianshield(get_step(src, dir_right), src, RIGHT_SHEILD)
/mob/living/simple_animal/hostile/guardian/protector/snapback() //snap to what? snap to the guardian!
// If the summoner dies instantly, the summoner's ghost may be drawn into null space as the protector is deleted. This check should prevent that.
@@ -66,3 +100,47 @@
if(toggle && isliving(mover)) //No crawling under a protector
return FALSE
/mob/living/simple_animal/hostile/guardian/protector/Destroy()
QDEL_LIST_CONTENTS(connected_shields)
return ..()
/obj/effect/guardianshield
name = "guardian's shield"
desc = "A guardian's defensive wall."
icon = 'icons/effects/effects.dmi'
icon_state = "shield-grey"
can_be_hit = TRUE
var/mob/living/simple_animal/hostile/guardian/protector/linked_guardian
///Is the guardians shield the left or right shield?
var/shield_orientation = LEFT_SHIELD
/obj/effect/guardianshield/Initialize(mapload, mob/living/simple_animal/hostile/guardian/protector/creator, left_or_right)
. = ..()
linked_guardian = creator
color = linked_guardian.name_color
shield_orientation = left_or_right
/obj/effect/guardianshield/CanPass(atom/movable/mover, turf/target)
if(mover == linked_guardian || mover == linked_guardian.summoner)
return TRUE
return FALSE
/obj/effect/guardianshield/bullet_act(obj/item/projectile/P)
if(!P)
return
linked_guardian.apply_damage(P.damage, P.damage_type)
P.on_hit(src, 0)
return FALSE
/obj/effect/guardianshield/attacked_by(obj/item/I, mob/living/user)
if(I.force)
user.visible_message("<span class='danger'>[user] has hit [src] with [I]!</span>", "<span class='danger'>You hit [src] with [I]!</span>")
linked_guardian.apply_damage(I.force, I.damtype)
/obj/effect/guardianshield/Destroy()
linked_guardian = null
return ..()
#undef LEFT_SHIELD
#undef RIGHT_SHEILD
@@ -1,10 +1,10 @@
/mob/living/simple_animal/hostile/guardian/punch
melee_damage_lower = 20
melee_damage_upper = 20
melee_damage_lower = 25 //This is almost esword level, but not sharp.
melee_damage_upper = 25
obj_damage = 80
damage_transfer = 0.4
playstyle_string = "As a <b>Standard</b> type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls."
environment_smash = 2
environment_smash = ENVIRONMENT_SMASH_RWALLS
magic_fluff_string = "..And draw the Assistant, faceless and generic, but never to be underestimated."
tech_fluff_string = "Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm stirs to life, ready to tear apart your enemies."
+1 -1
View File
@@ -646,9 +646,9 @@
#include "code\game\gamemodes\miniantags\guardian\guardian.dm"
#include "code\game\gamemodes\miniantags\guardian\host_actions.dm"
#include "code\game\gamemodes\miniantags\guardian\types\assassin.dm"
#include "code\game\gamemodes\miniantags\guardian\types\chaos.dm"
#include "code\game\gamemodes\miniantags\guardian\types\charger.dm"
#include "code\game\gamemodes\miniantags\guardian\types\explosive_guardian.dm"
#include "code\game\gamemodes\miniantags\guardian\types\gaseous.dm"
#include "code\game\gamemodes\miniantags\guardian\types\healer.dm"
#include "code\game\gamemodes\miniantags\guardian\types\lightning_guardian.dm"
#include "code\game\gamemodes\miniantags\guardian\types\protector.dm"