diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 69bbd6deab9..6b444d7b7aa 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -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 diff --git a/code/game/gamemodes/miniantags/guardian/types/assassin.dm b/code/game/gamemodes/miniantags/guardian/types/assassin.dm index 45e7a8f039b..33263f8fb5a 100644 --- a/code/game/gamemodes/miniantags/guardian/types/assassin.dm +++ b/code/game/gamemodes/miniantags/guardian/types/assassin.dm @@ -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 Assassin 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." diff --git a/code/game/gamemodes/miniantags/guardian/types/chaos.dm b/code/game/gamemodes/miniantags/guardian/types/chaos.dm deleted file mode 100644 index 48e3acdf68a..00000000000 --- a/code/game/gamemodes/miniantags/guardian/types/chaos.dm +++ /dev/null @@ -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 Chaos 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, "You switch to dispersion mode, and will teleport victims away from your master.") - toggle = FALSE - else - to_chat(src, "You switch to deception mode, and will turn your victims against their allies.") - 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) diff --git a/code/game/gamemodes/miniantags/guardian/types/charger.dm b/code/game/gamemodes/miniantags/guardian/types/charger.dm index 9858fbc55bf..4e293a639d2 100644 --- a/code/game/gamemodes/miniantags/guardian/types/charger.dm +++ b/code/game/gamemodes/miniantags/guardian/types/charger.dm @@ -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 diff --git a/code/game/gamemodes/miniantags/guardian/types/explosive_guardian.dm b/code/game/gamemodes/miniantags/guardian/types/explosive_guardian.dm index 08943d4dc63..08c0644ea91 100644 --- a/code/game/gamemodes/miniantags/guardian/types/explosive_guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/types/explosive_guardian.dm @@ -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) diff --git a/code/game/gamemodes/miniantags/guardian/types/gaseous.dm b/code/game/gamemodes/miniantags/guardian/types/gaseous.dm new file mode 100644 index 00000000000..221d2833f98 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/gaseous.dm @@ -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 gaseous 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, "You stopped expelling gas.") + return + if(!picked_gas) + return + to_chat(src, "You are now expelling [picked_gas].") + 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 ..() diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm index 2eeb8afb577..7622b105ca0 100644 --- a/code/game/gamemodes/miniantags/guardian/types/healer.dm +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -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 Support 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 Support 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, "You must be manifested to heal!") - return + if(loc == summoner) + to_chat(src, "You must be manifested to heal!") + 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, "You begin to do a mass repair on [C], keep them still!") + 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, "You switch to combat mode.") - 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, "You switch to healing mode.") - 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, "You switch to combat mode.") + 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, "You switch to healing mode.") + toggle = HEALING + if(HEALING) + to_chat(src, "You switch to surgical. You no longer heal on punch, but can do a big critical injury healing on a long cooldown.") + toggle = SURGICAL else to_chat(src, "You have to be recalled to toggle modes!") @@ -137,3 +162,8 @@ return else to_chat(src, "You need to hold still!") + + +#undef COMBAT +#undef HEALING +#undef SURGICAL diff --git a/code/game/gamemodes/miniantags/guardian/types/lightning_guardian.dm b/code/game/gamemodes/miniantags/guardian/types/lightning_guardian.dm index 459dae5c9d5..34e8dd2195b 100644 --- a/code/game/gamemodes/miniantags/guardian/types/lightning_guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/types/lightning_guardian.dm @@ -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 Lightning 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 @@ "You are shocked by the lightning chain!", \ "You hear a heavy electrical crack." \ ) - 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) diff --git a/code/game/gamemodes/miniantags/guardian/types/protector.dm b/code/game/gamemodes/miniantags/guardian/types/protector.dm index 4a9efcf1fea..3e04ac63bf8 100644 --- a/code/game/gamemodes/miniantags/guardian/types/protector.dm +++ b/code/game/gamemodes/miniantags/guardian/types/protector.dm @@ -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 Protector 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 Protector 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("The explosion glances off [src]'s energy shielding!") + +/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, "You switch to combat mode.") 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, "You switch to protection mode.") 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("[user] has hit [src] with [I]!", "You hit [src] with [I]!") + linked_guardian.apply_damage(I.force, I.damtype) + +/obj/effect/guardianshield/Destroy() + linked_guardian = null + return ..() + + +#undef LEFT_SHIELD +#undef RIGHT_SHEILD diff --git a/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm b/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm index d458ce2f49d..bb08805bbe2 100644 --- a/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/types/standard_guardian.dm @@ -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 Standard 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." diff --git a/paradise.dme b/paradise.dme index 5e55095651a..27da27baa54 100644 --- a/paradise.dme +++ b/paradise.dme @@ -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"