From 9f755e7b70cd158a51555860bc7119fc606fdf5b Mon Sep 17 00:00:00 2001 From: FlattestGuitar Date: Sat, 29 Jul 2017 18:21:08 +0200 Subject: [PATCH 1/6] Adds /tg/ guardians --- code/_onclick/hud/alert.dm | 19 + .../gamemodes/miniantags/guardian/guardian.dm | 523 ++---------------- .../miniantags/guardian/types/assassin.dm | 93 ++++ .../miniantags/guardian/types/bomb.dm | 76 +++ .../miniantags/guardian/types/charger.dm | 72 +++ .../miniantags/guardian/types/fire.dm | 67 +++ .../miniantags/guardian/types/healer.dm | 139 +++++ .../miniantags/guardian/types/lightning.dm | 109 ++++ .../miniantags/guardian/types/protector.dm | 57 ++ .../miniantags/guardian/types/ranged.dm | 99 ++++ .../miniantags/guardian/types/standard.dm | 47 ++ code/game/objects/effects/overlays.dm | 9 +- icons/effects/effects.dmi | Bin 382766 -> 388955 bytes paradise.dme | 10 +- 14 files changed, 850 insertions(+), 470 deletions(-) create mode 100644 code/game/gamemodes/miniantags/guardian/types/assassin.dm create mode 100644 code/game/gamemodes/miniantags/guardian/types/bomb.dm create mode 100644 code/game/gamemodes/miniantags/guardian/types/charger.dm create mode 100644 code/game/gamemodes/miniantags/guardian/types/fire.dm create mode 100644 code/game/gamemodes/miniantags/guardian/types/healer.dm create mode 100644 code/game/gamemodes/miniantags/guardian/types/lightning.dm create mode 100644 code/game/gamemodes/miniantags/guardian/types/protector.dm create mode 100644 code/game/gamemodes/miniantags/guardian/types/ranged.dm create mode 100644 code/game/gamemodes/miniantags/guardian/types/standard.dm diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 1d5d419ba82..9e32705fc90 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -366,6 +366,25 @@ so as to remain in compliance with the most up-to-date laws." desc = "Mech integrity is low." icon_state = "low_mech_integrity" +//GUARDIANS +/obj/screen/alert/cancharge + name = "Charge Ready" + desc = "You are ready to charge at a location!" + icon_state = "guardian_charge" + alerttooltipstyle = "parasite" + +/obj/screen/alert/canstealth + name = "Stealth Ready" + desc = "You are ready to enter stealth!" + icon_state = "guardian_canstealth" + alerttooltipstyle = "parasite" + +/obj/screen/alert/instealth + name = "In Stealth" + desc = "You are in stealth and your next attack will do bonus damage!" + icon_state = "guardian_instealth" + alerttooltipstyle = "parasite" + //GHOSTS //TODO: expand this system to replace the pollCandidates/CheckAntagonist/"choose quickly"/etc Yes/No messages diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 4825dea6ebb..c1137c9d977 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -39,6 +39,7 @@ var/bio_fluff_string = "Your scarabs fail to mutate. This shouldn't happen! Submit a bug report!" var/admin_fluff_string = "URK URF!"//the wheels on the bus... var/adminseal = FALSE + var/name_color = "white"//only used with protector shields for the time being /mob/living/simple_animal/hostile/guardian/Life() //Dies if the summoner dies ..() @@ -48,27 +49,29 @@ visible_message("The [src] dies along with its user!") ghostize() qdel(src) - if(summoner) - if(get_dist(get_turf(summoner),get_turf(src)) <= range) - return - else - to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]") - visible_message("The [src] jumps back to its user.") - Recall() + snapback() if(summoned && !summoner && !adminseal) to_chat(src, "You somehow lack a summoner! As a result, you dispel!") ghostize() qdel() -/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range - ..() +/mob/living/simple_animal/hostile/guardian/proc/snapback() if(summoner) if(get_dist(get_turf(summoner),get_turf(src)) <= range) return else - to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]") - visible_message("The [src] jumps back to its user.") - Recall() + to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!") + visible_message("\The [src] jumps back to its user.") + if(istype(summoner.loc, /obj/effect)) + Recall(TRUE) + else + new /obj/effect/overlay/temp/guardian/phase/out(loc) + forceMove(summoner.loc) //move to summoner's tile, don't recall + new /obj/effect/overlay/temp/guardian/phase(loc) + +/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range + ..() + snapback() /mob/living/simple_animal/hostile/guardian/death(gibbed) ..() @@ -128,8 +131,8 @@ src.client.eye = loc cooldown = world.time + 30 -/mob/living/simple_animal/hostile/guardian/proc/Recall() - if(cooldown > world.time) +/mob/living/simple_animal/hostile/guardian/proc/Recall(forced = FALSE) + if(cooldown > world.time && !forced) return if(!summoner) return new /obj/effect/overlay/temp/guardian/phase/out(get_turf(src)) @@ -141,7 +144,6 @@ var/input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "") if(!input) return - for(var/mob/M in mob_list) if(M == summoner) to_chat(M, "[src]: [input]") @@ -212,456 +214,6 @@ to_chat(src, "You deactivate your light.") light_on = !light_on -//////////////////////////TYPES OF GUARDIANS - - -//Fire. Low damage, low resistance, sets mobs on fire when bumping - -/mob/living/simple_animal/hostile/guardian/fire - a_intent = INTENT_HELP - 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, your melee attacks will randomly teleport enemies." - 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() //Dies if the summoner dies - ..() - if(summoner) - summoner.ExtinguishMob() - summoner.adjust_fire_stacks(-20) - -/mob/living/simple_animal/hostile/guardian/fire/ToggleMode() - if(src.loc == summoner) - 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(..()) - if(toggle) - if(ishuman(target) && !summoner) - spawn(0) - new /obj/effect/hallucination/delusion(target.loc, target, force_kind="custom", duration=200, skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) - else - if(prob(45)) - if(istype(target, /atom/movable)) - var/atom/movable/M = target - if(!M.anchored && M != summoner) - new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M)) - do_teleport(M, M, 10) - new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M)) - -/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj) - ..() - 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(istype(AM, /mob/living/)) - 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) -//Standard - -/mob/living/simple_animal/hostile/guardian/punch - melee_damage_lower = 20 - melee_damage_upper = 20 - damage_transfer = 0.5 - 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 - 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." - var/battlecry = "AT" - - -/mob/living/simple_animal/hostile/guardian/punch/sealpunch - name = "Seal Sprit" - real_name = "Seal Sprit" - icon = 'icons/mob/animal.dmi' - icon_living = "seal" - icon_state = "seal" - attacktext = "slaps" - speak_emote = list("barks") - melee_damage_lower = 0 - melee_damage_upper = 0 - melee_damage_type = STAMINA - damage_transfer = 0 - 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 - battlecry = "URK" - adminseal = TRUE - -/mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry() - set name = "Set Battlecry" - set category = "Guardian" - set desc = "Choose what you shout as you punch" - var/input = stripped_input(src,"What do you want your battlecry to be? Max length of 5 characters.", ,"", 6) - if(input) - battlecry = input - - - -/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget() - ..() - if(iscarbon(target) && target != summoner) - if(length(battlecry) > 11)//no more then 11 letters in a battle cry. - src.visible_message("[src] punches [target]!") - else - src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]") - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - -//Healer - -/mob/living/simple_animal/hostile/guardian/healer - a_intent = INTENT_HARM - friendly = "heals" - speed = 0 - 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." - 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/turf/simulated/floor/beacon - var/beacon_cooldown = 0 - var/toggle = FALSE - var/heal_cooldown = 0 - -/mob/living/simple_animal/hostile/guardian/healer/sealhealer - name = "Seal Sprit" - real_name = "Seal Sprit" - icon = 'icons/mob/animal.dmi' - icon_living = "seal" - icon_state = "seal" - attacktext = "slaps" - speak_emote = list("barks") - a_intent = INTENT_HARM - friendly = "heals" - speed = 0 - melee_damage_lower = 0 - melee_damage_upper = 0 - melee_damage_type = STAMINA - adminseal = TRUE - - -/mob/living/simple_animal/hostile/guardian/healer/New() - ..() - -/mob/living/simple_animal/hostile/guardian/healer/Life() - ..() - var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED] - medsensor.add_hud_to(src) - -/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() - ..() - if(toggle == TRUE) - if(src.loc == summoner) - to_chat(src, "You must be manifested to heal!") - return - if(iscarbon(target)) - src.changeNext_move(CLICK_CD_MELEE) - if(heal_cooldown <= world.time && !stat) - var/mob/living/carbon/C = target - C.adjustBruteLoss(-5) - C.adjustFireLoss(-5) - C.adjustOxyLoss(-5) - C.adjustToxLoss(-5) - heal_cooldown = world.time + 20 - -/mob/living/simple_animal/hostile/guardian/healer/ToggleMode() - if(src.loc == summoner) - if(toggle) - a_intent = INTENT_HARM - speed = 0 - damage_transfer = 0.7 - if(src.adminseal) - damage_transfer = 0 - melee_damage_lower = 15 - melee_damage_upper = 15 - to_chat(src, "You switch to combat mode.") - toggle = FALSE - else - a_intent = INTENT_HELP - speed = 1 - damage_transfer = 1 - if(src.adminseal) - damage_transfer = 0 - melee_damage_lower = 0 - melee_damage_upper = 0 - to_chat(src, "You switch to healing mode.") - toggle = TRUE - else - to_chat(src, "You have to be recalled to toggle modes!") - - -/mob/living/simple_animal/hostile/guardian/healer/verb/Beacon() - set name = "Place Bluespsace Beacon" - set category = "Guardian" - set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work in unfavorable atmospheric conditions." - if(beacon_cooldownBeacon placed! You may now warp targets to it, including your user, via Alt+Click. ") - if(beacon) - beacon.ChangeTurf(/turf/simulated/floor/plating) - beacon = F - beacon_cooldown = world.time+3000 - - else - to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") - -/mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) - if(!istype(A)) - return - if(src.loc == summoner) - to_chat(src, "You must be manifested to warp a target!") - return - if(!beacon) - to_chat(src, "You need a beacon placed to warp things!") - return - if(!Adjacent(A)) - to_chat(src, "You must be adjacent to your target!") - return - if((A.anchored)) - to_chat(src, "Your target can not be anchored!") - return - to_chat(src, "You begin to warp [A]") - if(do_mob(src, A, 50)) - if(!A.anchored) - if(src.beacon) //Check that the beacon still exists and is in a safe place. No instant kills. - if(beacon.air) - var/datum/gas_mixture/Z = beacon.air - if(Z.oxygen >= 16 && !Z.toxins && Z.carbon_dioxide < 10 && !Z.trace_gases.len) - if((Z.temperature > 270) && (Z.temperature < 360)) - var/pressure = Z.return_pressure() - if((pressure > 20) && (pressure < 550)) - new /obj/effect/overlay/temp/guardian/phase/out(get_turf(A)) - do_teleport(A, beacon, 0) - new /obj/effect/overlay/temp/guardian/phase(get_turf(A)) - else - to_chat(src, "The beacon isn't in a safe location!") - else - to_chat(src, "The beacon isn't in a safe location!") - else - to_chat(src, "You need a beacon to warp things!") - else - to_chat(src, "You need to hold still!") - - -///////////////////Ranged - -/obj/item/projectile/guardian - name = "crystal spray" - icon_state = "guardian" - damage = 5 - damage_type = BRUTE - armour_penetration = 100 - -/mob/living/simple_animal/hostile/guardian/ranged - a_intent = INTENT_HELP - friendly = "quietly assesses" - melee_damage_lower = 10 - melee_damage_upper = 10 - damage_transfer = 0.9 - projectiletype = /obj/item/projectile/guardian - ranged_cooldown_time = 10 - projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' - ranged = 1 - rapid = 1 - range = 13 - see_invisible = SEE_INVISIBLE_MINIMUM - see_in_dark = 8 - playstyle_string = "As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit." - magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." - tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online." - bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spraying shards of crystal." - var/list/snares = list() - var/toggle = FALSE - -/mob/living/simple_animal/hostile/guardian/ranged/ToggleMode() - if(src.loc == summoner) - if(toggle) - ranged = 1 - melee_damage_lower = 10 - melee_damage_upper = 10 - alpha = 255 - range = 13 - incorporeal_move = 0 - to_chat(src, "You switch to combat mode.") - toggle = FALSE - else - ranged = 0 - melee_damage_lower = 0 - melee_damage_upper = 0 - alpha = 60 - range = 255 - incorporeal_move = 1 - to_chat(src, "You switch to scout mode.") - toggle = TRUE - else - to_chat(src, "You have to be recalled to toggle modes!") - -/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() - if(see_invisible == SEE_INVISIBLE_MINIMUM) - to_chat(src, "You deactivate your night vision.") - see_invisible = SEE_INVISIBLE_LIVING - else - to_chat(src, "You activate your night vision.") - see_invisible = SEE_INVISIBLE_MINIMUM - -/mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() - set name = "Set Surveillance Trap" - set category = "Guardian" - set desc = "Set an invisible trap that will alert you when living creatures walk over it. Max of 5" - if(src.snares.len <6) - var/turf/snare_loc = get_turf(src.loc) - var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc) - S.spawner = src - S.name = "[get_area(snare_loc)] trap ([rand(1, 1000)])" - src.snares |= S - to_chat(src, "Surveillance trap deployed!") - else - to_chat(src, "You have too many traps deployed. Delete some first.") - -/mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare() - set name = "Remove Surveillance Trap" - set category = "Guardian" - set desc = "Disarm unwanted surveillance traps." - var/picked_snare = input(src, "Pick which trap to disarm", "Disarm Trap") as null|anything in src.snares - if(picked_snare) - src.snares -= picked_snare - qdel(picked_snare) - to_chat(src, "Snare disarmed.") - -/obj/item/effect/snare - name = "snare" - desc = "You shouldn't be seeing this!" - var/mob/living/spawner - invisibility = 1 - - -/obj/item/effect/snare/Crossed(AM as mob|obj) - if(istype(AM, /mob/living/)) - var/turf/snare_loc = get_turf(src.loc) - if(spawner) - to_chat(spawner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") - if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) - var/mob/living/simple_animal/hostile/guardian/G = spawner - if(G.summoner) - to_chat(G.summoner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") - -////Bomb - -/mob/living/simple_animal/hostile/guardian/bomb - melee_damage_lower = 15 - melee_damage_upper = 15 - damage_transfer = 0.6 - range = 13 - playstyle_string = "As an explosive type, you have only moderate close combat abilities, but are capable of converting any adjacent item into a disguised bomb via alt click." - magic_fluff_string = "..And draw the Scientist, master of explosive death." - tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online." - bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of stealthily booby trapping items." - var/bomb_cooldown = 0 - -/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A) - if(!istype(A)) - return - if(src.loc == summoner) - to_chat(src, "You must be manifested to create bombs!") - return - if(istype(A, /obj/)) - if(bomb_cooldown <= world.time && !stat) - var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A)) - to_chat(src, "Success! Bomb on \the [A] armed!") - if(summoner) - to_chat(summoner, "Your guardian has primed \the [A] to explode!") - bomb_cooldown = world.time + 200 - B.spawner = src - B.disguise (A) - else - to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") - -/obj/item/weapon/guardian_bomb - name = "bomb" - desc = "You shouldn't be seeing this!" - var/obj/stored_obj - var/mob/living/spawner - - -/obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A) - A.loc = src - stored_obj = A - anchored = A.anchored - density = A.density - appearance = A.appearance - spawn(600) - if(src) - stored_obj.loc = get_turf(src.loc) - if(spawner) - to_chat(spawner, "Failure! Your trap on \the [stored_obj] didn't catch anyone this time.") - qdel(src) - -/obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) - to_chat(user, "The [src] was boobytrapped!") - if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) - var/mob/living/simple_animal/hostile/guardian/G = spawner - if(user == G.summoner) - to_chat(user, "You knew this because of your link with your guardian, so you smartly defuse the bomb.") - stored_obj.loc = get_turf(src.loc) - qdel(src) - return - to_chat(spawner, "Success! Your trap on \the [src] caught [user]!") - stored_obj.loc = get_turf(src.loc) - playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1) - user.ex_act(2) - qdel(src) - -/obj/item/weapon/guardian_bomb/attackby(mob/living/user) - detonate(user) - return - -/obj/item/weapon/guardian_bomb/pickup(mob/living/user) - detonate(user) - return - -/obj/item/weapon/guardian_bomb/examine(mob/user) - stored_obj.examine(user) - if(get_dist(user,src)<=2) - to_chat(user, "Looks odd!") - - ////////Creation /obj/item/weapon/guardiancreator @@ -676,7 +228,7 @@ var/used_message = "All the cards seem to be blank now." var/failure_message = "..And draw a card! It's...blank? Maybe you should try again later." var/ling_failure = "The deck refuses to respond to a souless creature such as you." - var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive") + var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Assassin", "Lightning", "Charger", "Protector") var/random = TRUE /obj/item/weapon/guardiancreator/attack_self(mob/living/user) @@ -727,6 +279,18 @@ if("Explosive") pickedtype = /mob/living/simple_animal/hostile/guardian/bomb + if("Assassin") + pickedtype = /mob/living/simple_animal/hostile/guardian/assassin + + if("Lightning") + pickedtype = /mob/living/simple_animal/hostile/guardian/beam + + if("Charger") + pickedtype = /mob/living/simple_animal/hostile/guardian/charger + + if("Protector") + pickedtype = /mob/living/simple_animal/hostile/guardian/protector + var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user) G.summoner = user G.summoned = TRUE @@ -741,12 +305,33 @@ user.verbs += /mob/living/proc/guardian_reset var/color + + //names and their RGB + var/magic_list = list("Pink" = "#FFC0CB", \ + "Red" = "#FF0000", \ + "Orange" = "#FFA500", \ + "Green" = "#008000", \ + "Blue" = "#0000FF") + + var/tech_list = list("Rose" = "#F62C6B", \ + "Peony" = "#E54750", \ + "Lily" = "#F6562C", \ + "Daisy" = "#ECCD39", \ + "Zinnia" = "#89F62C", \ + "Ivy" = "#5DF62C", \ + "Iris" = "#2CF6B8", \ + "Petunia" = "#51A9D4", \ + "Violet" = "#8A347C", \ + "Lilac" = "#C7A0F6", \ + "Orchid" = "#F62CF5") + var/picked_name var/picked_color = pick("#FFFFFF","#000000","#808080","#A52A2A","#FF0000","#8B0000","#DC143C","#FFA500","#FFFF00","#008000","#00FF00","#006400","#00FFFF","#0000FF","#000080","#008080","#800080","#4B0082") switch(theme) if("magic") - color = pick("Pink", "Red", "Orange", "Green", "Blue") + color = pick(magic_list) + G.name_color = magic_list[color] picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces") G.name = "[picked_name] [color]" @@ -757,7 +342,8 @@ to_chat(user, "[G.magic_fluff_string].") if("tech") - color = pick("Rose", "Peony", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Lilac", "Orchid") //technically not colors, just flowers that can be specific colors + color = pick(tech_list) //technically not colors, just flowers that can be specific colors + G.name_color = tech_list[color] picked_name = pick("Gallium", "Indium", "Thallium", "Bismuth", "Aluminium", "Mercury", "Iron", "Silver", "Zinc", "Titanium", "Chromium", "Nickel", "Platinum", "Tellurium", "Palladium", "Rhodium", "Cobalt", "Osmium", "Tungsten", "Iridium") G.name = "[picked_name] [color]" @@ -769,6 +355,7 @@ to_chat(user, "[G.tech_fluff_string].") G.speak_emote = list("states") if("bio") + G.name_color = picked_color G.icon = 'icons/mob/mob.dmi' picked_name = pick("brood", "hive", "nest") to_chat(user, "[G.bio_fluff_string].") diff --git a/code/game/gamemodes/miniantags/guardian/types/assassin.dm b/code/game/gamemodes/miniantags/guardian/types/assassin.dm new file mode 100644 index 00000000000..d670e7e50f1 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/assassin.dm @@ -0,0 +1,93 @@ +/mob/living/simple_animal/hostile/guardian/assassin + melee_damage_lower = 15 + melee_damage_upper = 15 + armour_penetration = 0 + damage_transfer = 0.6 + playstyle_string = "As an Assassin type you do medium damage and have no 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." + tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of sneaking and stealthy attacks." + var/toggle = FALSE + var/stealthcooldown = 16 SECONDS + var/default_stealth_cooldown = 16 SECONDS + var/obj/screen/alert/canstealthalert + var/obj/screen/alert/instealthalert + +/mob/living/simple_animal/hostile/guardian/assassin/New() + ..() + stealthcooldown = 0 + +/mob/living/simple_animal/hostile/guardian/assassin/Life() + . = ..() + updatestealthalert() + if(loc == summoner && toggle) + ToggleMode(0) + +/mob/living/simple_animal/hostile/guardian/assassin/Stat() + ..() + if(statpanel("Status")) + if(stealthcooldown >= world.time) + stat(null, "Stealth Cooldown Remaining: [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds") + +/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget() + ..() + if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille))) + ToggleMode(1) + +/mob/living/simple_animal/hostile/guardian/assassin/adjustHealth(amount, updating_health = TRUE, forced = FALSE) + . = ..() + if(. > 0 && toggle) + ToggleMode(1) + +/mob/living/simple_animal/hostile/guardian/assassin/Recall() + ..() + if(toggle) + ToggleMode(0) + +/mob/living/simple_animal/hostile/guardian/assassin/ToggleMode(forced = 0) + if(toggle) + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + armour_penetration = initial(armour_penetration) + alpha = initial(alpha) + if(!forced) + to_chat(src, "You exit stealth.") + else + visible_message("\The [src] suddenly appears!") + stealthcooldown = world.time + default_stealth_cooldown //we were forced out of stealth and go on cooldown + cooldown = world.time + 40 //can't recall for 4 seconds + updatestealthalert() + toggle = FALSE + else if(stealthcooldown <= world.time) + if(src.loc == summoner) + to_chat(src, "You have to be manifested to enter stealth!") + return + melee_damage_lower = 50 + melee_damage_upper = 50 + armour_penetration = 100 + new /obj/effect/overlay/temp/guardian/phase(get_turf(src)) + alpha = 15 + if(!forced) + to_chat(src, "You enter stealth, empowering your next attack.") + updatestealthalert() + toggle = TRUE + else if(!forced) + to_chat(src, "You cannot yet enter stealth, wait another [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds!") + +/mob/living/simple_animal/hostile/guardian/assassin/proc/updatestealthalert() + if(stealthcooldown <= world.time) + if(toggle) + if(!instealthalert) + instealthalert = throw_alert("instealth", /obj/screen/alert/instealth) + clear_alert("canstealth") + canstealthalert = null + else + if(!canstealthalert) + canstealthalert = throw_alert("canstealth", /obj/screen/alert/canstealth) + clear_alert("instealth") + instealthalert = null + else + clear_alert("instealth") + instealthalert = null + clear_alert("canstealth") + canstealthalert = null \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm new file mode 100644 index 00000000000..6f0aaac78ff --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -0,0 +1,76 @@ +/mob/living/simple_animal/hostile/guardian/bomb + melee_damage_lower = 15 + melee_damage_upper = 15 + damage_transfer = 0.6 + range = 13 + playstyle_string = "As an Explosive type, you have only moderate close combat abilities, but are capable of converting any adjacent item into a disguised bomb via alt click." + magic_fluff_string = "..And draw the Scientist, master of explosive death." + tech_fluff_string = "Boot sequence complete. Explosive modules active. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of stealthily booby trapping items." + var/bomb_cooldown = 0 + +/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A) + if(!istype(A)) + return + if(get_dist(get_turf(src), get_turf(A)) > 1) + to_chat(src, "You're too far from [A] to disguise it as a bomb.") + return + if(istype(A, /obj/)) + if(bomb_cooldown <= world.time && !stat) + var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A)) + to_chat(src, "Success! Bomb on \the [A] armed!") + if(summoner) + to_chat(summoner, "Your guardian has primed \the [A] to explode!") + bomb_cooldown = world.time + 200 + B.spawner = src + B.disguise (A) + else + to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") + +/obj/item/weapon/guardian_bomb + name = "bomb" + desc = "You shouldn't be seeing this!" + var/obj/stored_obj + var/mob/living/spawner + + +/obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A) + A.loc = src + stored_obj = A + anchored = A.anchored + density = A.density + appearance = A.appearance + spawn(600) + if(src) + stored_obj.loc = get_turf(src.loc) + if(spawner) + to_chat(spawner, "Failure! Your trap on \the [stored_obj] didn't catch anyone this time.") + qdel(src) + +/obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) + to_chat(user, "The [src] was boobytrapped!") + if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) + var/mob/living/simple_animal/hostile/guardian/G = spawner + if(user == G.summoner) + to_chat(user, "You knew this because of your link with your guardian, so you smartly defuse the bomb.") + stored_obj.loc = get_turf(src.loc) + qdel(src) + return + to_chat(spawner, "Success! Your trap on \the [src] caught [user]!") + stored_obj.loc = get_turf(src.loc) + playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1) + user.ex_act(2) + qdel(src) + +/obj/item/weapon/guardian_bomb/attackby(mob/living/user) + detonate(user) + return + +/obj/item/weapon/guardian_bomb/pickup(mob/living/user) + detonate(user) + return + +/obj/item/weapon/guardian_bomb/examine(mob/user) + stored_obj.examine(user) + if(get_dist(user,src)<=2) + to_chat(user, "Looks odd!") diff --git a/code/game/gamemodes/miniantags/guardian/types/charger.dm b/code/game/gamemodes/miniantags/guardian/types/charger.dm new file mode 100644 index 00000000000..6f0c439dc25 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/charger.dm @@ -0,0 +1,72 @@ +/mob/living/simple_animal/hostile/guardian/charger + melee_damage_lower = 15 + melee_damage_upper = 15 + ranged = 1 //technically + ranged_message = "charges" + ranged_cooldown_time = 40 + speed = -1 + damage_transfer = 0.6 + playstyle_string = "As a Charger type you do medium damage, have medium damage resistance, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding." + magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault." + tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to deal damage." + var/charging = 0 + var/obj/screen/alert/chargealert + +/mob/living/simple_animal/hostile/guardian/charger/Life() + . = ..() + if(ranged_cooldown <= world.time) + if(!chargealert) + chargealert = throw_alert("charge", /obj/screen/alert/cancharge) + else + clear_alert("charge") + chargealert = null + +/mob/living/simple_animal/hostile/guardian/charger/OpenFire(atom/A) + if(!charging) + visible_message("[src] [ranged_message] at [A]!") + ranged_cooldown = world.time + ranged_cooldown_time + clear_alert("charge") + chargealert = null + Shoot(A) + +/mob/living/simple_animal/hostile/guardian/charger/Shoot(atom/targeted_atom) + charging = 1 + throw_at(targeted_atom, range, 1, src, 0, callback = CALLBACK(src, .proc/charging_end)) + +/mob/living/simple_animal/hostile/guardian/charger/proc/charging_end() + charging = 0 + +/mob/living/simple_animal/hostile/guardian/charger/Move() + if(charging) + new /obj/effect/overlay/temp/decoy/fading(loc,src) + . = ..() + +/mob/living/simple_animal/hostile/guardian/charger/snapback() + if(!charging) + ..() + +/mob/living/simple_animal/hostile/guardian/charger/throw_impact(atom/A) + if(!charging) + return ..() + + else if(A) + if(isliving(A) && A != summoner) + var/mob/living/L = A + var/blocked = FALSE + var/mob/living/simple_animal/hostile/guardian/G = A + if(istype(G) && G.summoner == summoner) //if the summoner matches don't hurt them + blocked = TRUE + if(ishuman(A)) + var/mob/living/carbon/human/H = A + if(H.check_shields(src, 90, "[name]", attack_type = THROWN_PROJECTILE_ATTACK)) + blocked = TRUE + if(!blocked) + L.Stun(1) + L.visible_message("[src] slams into [L]!", "[src] slams into you!") + L.apply_damage(20, BRUTE) + playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1) + shake_camera(L, 4, 3) + shake_camera(src, 2, 3) + + charging = 0 \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm new file mode 100644 index 00000000000..61554658a44 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm @@ -0,0 +1,67 @@ +/mob/living/simple_animal/hostile/guardian/fire + a_intent = INTENT_HELP + 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, your melee attacks will randomly teleport enemies." + 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() //Dies if the summoner dies + ..() + if(summoner) + summoner.ExtinguishMob() + summoner.adjust_fire_stacks(-20) + +/mob/living/simple_animal/hostile/guardian/fire/ToggleMode() + if(src.loc == summoner) + 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(..()) + if(toggle) + if(ishuman(target) && !summoner) + spawn(0) + new /obj/effect/hallucination/delusion(target.loc, target, force_kind="custom", duration=200, skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) + else + if(prob(45)) + if(istype(target, /atom/movable)) + var/atom/movable/M = target + if(!M.anchored && M != summoner) + new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M)) + do_teleport(M, M, 10) + new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M)) + +/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj) + ..() + 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(istype(AM, /mob/living/)) + 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/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm new file mode 100644 index 00000000000..fc6163126b3 --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -0,0 +1,139 @@ +/mob/living/simple_animal/hostile/guardian/healer + a_intent = INTENT_HARM + friendly = "heals" + speed = 0 + 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." + 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/turf/simulated/floor/beacon + var/beacon_cooldown = 0 + var/toggle = FALSE + var/heal_cooldown = 0 + +/mob/living/simple_animal/hostile/guardian/healer/sealhealer + name = "Seal Sprit" + real_name = "Seal Sprit" + icon = 'icons/mob/animal.dmi' + icon_living = "seal" + icon_state = "seal" + attacktext = "slaps" + speak_emote = list("barks") + a_intent = INTENT_HARM + friendly = "heals" + speed = 0 + melee_damage_lower = 0 + melee_damage_upper = 0 + melee_damage_type = STAMINA + adminseal = TRUE + + +/mob/living/simple_animal/hostile/guardian/healer/New() + ..() + +/mob/living/simple_animal/hostile/guardian/healer/Life() + ..() + var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED] + medsensor.add_hud_to(src) + +/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() + ..() + if(toggle == TRUE) + if(src.loc == summoner) + to_chat(src, "You must be manifested to heal!") + return + if(iscarbon(target)) + src.changeNext_move(CLICK_CD_MELEE) + if(heal_cooldown <= world.time && !stat) + var/mob/living/carbon/C = target + C.adjustBruteLoss(-5) + C.adjustFireLoss(-5) + C.adjustOxyLoss(-5) + C.adjustToxLoss(-5) + heal_cooldown = world.time + 20 + +/mob/living/simple_animal/hostile/guardian/healer/ToggleMode() + if(src.loc == summoner) + if(toggle) + a_intent = INTENT_HARM + speed = 0 + damage_transfer = 0.7 + if(src.adminseal) + damage_transfer = 0 + melee_damage_lower = 15 + melee_damage_upper = 15 + to_chat(src, "You switch to combat mode.") + toggle = FALSE + else + a_intent = INTENT_HELP + speed = 1 + damage_transfer = 1 + if(src.adminseal) + damage_transfer = 0 + melee_damage_lower = 0 + melee_damage_upper = 0 + to_chat(src, "You switch to healing mode.") + toggle = TRUE + else + to_chat(src, "You have to be recalled to toggle modes!") + + +/mob/living/simple_animal/hostile/guardian/healer/verb/Beacon() + set name = "Place Bluespsace Beacon" + set category = "Guardian" + set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work in unfavorable atmospheric conditions." + if(beacon_cooldownBeacon placed! You may now warp targets to it, including your user, via Alt+Click. ") + if(beacon) + beacon.ChangeTurf(/turf/simulated/floor/plating) + beacon = F + beacon_cooldown = world.time+3000 + + else + to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") + +/mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) + if(!istype(A)) + return + if(src.loc == summoner) + to_chat(src, "You must be manifested to warp a target!") + return + if(!beacon) + to_chat(src, "You need a beacon placed to warp things!") + return + if(!Adjacent(A)) + to_chat(src, "You must be adjacent to your target!") + return + if((A.anchored)) + to_chat(src, "Your target can not be anchored!") + return + to_chat(src, "You begin to warp [A]") + if(do_mob(src, A, 50)) + if(!A.anchored) + if(src.beacon) //Check that the beacon still exists and is in a safe place. No instant kills. + if(beacon.air) + var/datum/gas_mixture/Z = beacon.air + if(Z.oxygen >= 16 && !Z.toxins && Z.carbon_dioxide < 10 && !Z.trace_gases.len) + if((Z.temperature > 270) && (Z.temperature < 360)) + var/pressure = Z.return_pressure() + if((pressure > 20) && (pressure < 550)) + new /obj/effect/overlay/temp/guardian/phase/out(get_turf(A)) + do_teleport(A, beacon, 0) + new /obj/effect/overlay/temp/guardian/phase(get_turf(A)) + else + to_chat(src, "The beacon isn't in a safe location!") + else + to_chat(src, "The beacon isn't in a safe location!") + else + to_chat(src, "You need a beacon to warp things!") + else + to_chat(src, "You need to hold still!") diff --git a/code/game/gamemodes/miniantags/guardian/types/lightning.dm b/code/game/gamemodes/miniantags/guardian/types/lightning.dm new file mode 100644 index 00000000000..ea11fc5cfdd --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/lightning.dm @@ -0,0 +1,109 @@ +/obj/effect/ebeam/chain + name = "lightning chain" + layer = LYING_MOB_LAYER + +/mob/living/simple_animal/hostile/guardian/beam + melee_damage_lower = 7 + melee_damage_upper = 7 + attacktext = "shocks" + melee_damage_type = BURN + attack_sound = 'sound/machines/defib_zap.ogg' + damage_transfer = 0.7 + 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." + tech_fluff_string = "Boot sequence complete. Lightning modules active. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to electrify your enemies." + var/datum/beam/summonerchain + var/list/enemychains = list() + var/successfulshocks = 0 + +/mob/living/simple_animal/hostile/guardian/beam/AttackingTarget() + ..() + if(isliving(target) && target != src && target != summoner) + cleardeletedchains() + for(var/chain in enemychains) + var/datum/beam/B = chain + if(B.target == target) + return //oh this guy already HAS a chain, let's not chain again + if(enemychains.len > 2) + var/datum/beam/C = pick(enemychains) + qdel(C) + enemychains -= C + enemychains += Beam(target, "lightning[rand(1,12)]", 'icons/effects/effects.dmi', time=70, maxdistance=7, beam_type=/obj/effect/ebeam/chain) + +/mob/living/simple_animal/hostile/guardian/beam/Destroy() + removechains() + return ..() + +/mob/living/simple_animal/hostile/guardian/beam/Manifest() + ..() + if(summoner) + summonerchain = Beam(summoner, "lightning[rand(1,12)]", 'icons/effects/effects.dmi', time=INFINITY, maxdistance=INFINITY, beam_type=/obj/effect/ebeam/chain) + while(loc != summoner) + if(successfulshocks > 5) + successfulshocks = 0 + if(shockallchains()) + successfulshocks++ + sleep(3) + +/mob/living/simple_animal/hostile/guardian/beam/Recall() + . = ..() + if(.) + removechains() + +/mob/living/simple_animal/hostile/guardian/beam/proc/cleardeletedchains() + if(summonerchain && qdeleted(summonerchain)) + summonerchain = null + if(enemychains.len) + for(var/chain in enemychains) + var/datum/cd = chain + if(!chain || qdeleted(cd)) + enemychains -= chain + +/mob/living/simple_animal/hostile/guardian/beam/proc/shockallchains() + . = 0 + cleardeletedchains() + if(summoner) + if(!summonerchain) + summonerchain = Beam(summoner, "lightning[rand(1,12)]", 'icons/effects/effects.dmi', time=INFINITY, maxdistance=INFINITY, beam_type=/obj/effect/ebeam/chain) + . += chainshock(summonerchain) + if(enemychains.len) + for(var/chain in enemychains) + . += chainshock(chain) + +/mob/living/simple_animal/hostile/guardian/beam/proc/removechains() + if(summonerchain) + QDEL_NULL(summonerchain) + if(enemychains.len) + for(var/chain in enemychains) + qdel(chain) + enemychains = list() + +/mob/living/simple_animal/hostile/guardian/beam/proc/chainshock(datum/beam/B) + . = 0 + var/list/turfs = list() + for(var/E in B.elements) + var/obj/effect/ebeam/chainpart = E + if(chainpart && chainpart.x && chainpart.y && chainpart.z) + var/turf/T = get_turf_pixel(chainpart) + turfs |= T + if(T != get_turf(B.origin) && T != get_turf(B.target)) + for(var/turf/TU in circlerange(T, 1)) + turfs |= TU + for(var/turf in turfs) + var/turf/T = turf + for(var/mob/living/L in T) + if(L.stat != DEAD && L != src && L != summoner) + var/mob/living/simple_animal/hostile/guardian/G = L + if(istype(G) && G.summoner == summoner) + continue + if(successfulshocks > 4) + //L.electrocute_act(30, src) //shocks for 30 burn damage + L.visible_message( + "[L] was shocked by the lightning chain!", \ + "You are shocked by the lightning chain!", \ + "You hear a heavy electrical crack." \ + ) + L.adjustFireLoss(1.2) //adds up very rapidly + . = 1 \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/guardian/types/protector.dm b/code/game/gamemodes/miniantags/guardian/types/protector.dm new file mode 100644 index 00000000000..6d0c2f77c4c --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/protector.dm @@ -0,0 +1,57 @@ +/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." + 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 + +/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 + else + ..() + if(toggle) + visible_message("The explosion glances off [src]'s energy shielding!") + +/mob/living/simple_animal/hostile/guardian/protector/ToggleMode() + if(cooldown > world.time) + return 0 + cooldown = world.time + 10 + if(toggle) + overlays.Cut() + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + speed = initial(speed) + damage_transfer = 0.4 + to_chat(src, "You switch to combat mode.") + toggle = FALSE + else + var/icon/shield_overlay = icon('icons/effects/effects.dmi', "shield-grey") + shield_overlay *= name_color + overlays.Add(shield_overlay) + melee_damage_lower = 2 + melee_damage_upper = 2 + speed = 1 + damage_transfer = 0.05 //damage? what's damage? + to_chat(src, "You switch to protection mode.") + toggle = TRUE + +/mob/living/simple_animal/hostile/guardian/protector/snapback() //snap to what? snap to the guardian! + if(summoner) + if(get_dist(get_turf(summoner),get_turf(src)) <= range) + return + else + if(istype(summoner.loc, /obj/effect)) + to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!") + visible_message("\The [src] jumps back to its user.") + Recall(TRUE) + else + to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [src]!") + summoner.visible_message("\The [summoner] jumps back to their protector.") + new /obj/effect/overlay/temp/guardian/phase/out(get_turf(summoner)) + summoner.forceMove(get_turf(src)) + new /obj/effect/overlay/temp/guardian/phase(get_turf(summoner))//Protector \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm new file mode 100644 index 00000000000..789dfc4062c --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -0,0 +1,99 @@ +/obj/item/projectile/guardian + name = "crystal spray" + icon_state = "guardian" + damage = 5 + damage_type = BRUTE + armour_penetration = 100 + +/mob/living/simple_animal/hostile/guardian/ranged + a_intent = INTENT_HELP + friendly = "quietly assesses" + melee_damage_lower = 10 + melee_damage_upper = 10 + damage_transfer = 0.9 + projectiletype = /obj/item/projectile/guardian + ranged_cooldown_time = 10 + projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' + ranged = 1 + rapid = 1 + range = 13 + see_invisible = SEE_INVISIBLE_MINIMUM + see_in_dark = 8 + playstyle_string = "As a Ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit." + magic_fluff_string = "..And draw the Sentinel, an alien master of ranged combat." + tech_fluff_string = "Boot sequence complete. Ranged combat modules active. Holoparasite swarm online." + bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of spraying shards of crystal." + var/list/snares = list() + var/toggle = FALSE + +/mob/living/simple_animal/hostile/guardian/ranged/ToggleMode() + if(src.loc == summoner) + if(toggle) + ranged = 1 + melee_damage_lower = 10 + melee_damage_upper = 10 + alpha = 255 + range = 13 + incorporeal_move = 0 + to_chat(src, "You switch to combat mode.") + toggle = FALSE + else + ranged = 0 + melee_damage_lower = 0 + melee_damage_upper = 0 + alpha = 60 + range = 255 + incorporeal_move = 1 + to_chat(src, "You switch to scout mode.") + toggle = TRUE + else + to_chat(src, "You have to be recalled to toggle modes!") + +/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() + if(see_invisible == SEE_INVISIBLE_MINIMUM) + to_chat(src, "You deactivate your night vision.") + see_invisible = SEE_INVISIBLE_LIVING + else + to_chat(src, "You activate your night vision.") + see_invisible = SEE_INVISIBLE_MINIMUM + +/mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() + set name = "Set Surveillance Trap" + set category = "Guardian" + set desc = "Set an invisible trap that will alert you when living creatures walk over it. Max of 5" + if(src.snares.len <6) + var/turf/snare_loc = get_turf(src.loc) + var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc) + S.spawner = src + S.name = "[get_area(snare_loc)] trap ([rand(1, 1000)])" + src.snares |= S + to_chat(src, "Surveillance trap deployed!") + else + to_chat(src, "You have too many traps deployed. Delete some first.") + +/mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare() + set name = "Remove Surveillance Trap" + set category = "Guardian" + set desc = "Disarm unwanted surveillance traps." + var/picked_snare = input(src, "Pick which trap to disarm", "Disarm Trap") as null|anything in src.snares + if(picked_snare) + src.snares -= picked_snare + qdel(picked_snare) + to_chat(src, "Snare disarmed.") + +/obj/item/effect/snare + name = "snare" + desc = "You shouldn't be seeing this!" + var/mob/living/spawner + invisibility = 1 + + +/obj/item/effect/snare/Crossed(AM as mob|obj) + if(istype(AM, /mob/living/)) + var/turf/snare_loc = get_turf(src.loc) + if(spawner) + to_chat(spawner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") + if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) + var/mob/living/simple_animal/hostile/guardian/G = spawner + if(G.summoner) + to_chat(G.summoner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") diff --git a/code/game/gamemodes/miniantags/guardian/types/standard.dm b/code/game/gamemodes/miniantags/guardian/types/standard.dm new file mode 100644 index 00000000000..c9d538b809e --- /dev/null +++ b/code/game/gamemodes/miniantags/guardian/types/standard.dm @@ -0,0 +1,47 @@ +/mob/living/simple_animal/hostile/guardian/punch + melee_damage_lower = 20 + melee_damage_upper = 20 + 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 + 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." + var/battlecry = "AT" + +/mob/living/simple_animal/hostile/guardian/punch/verb/Battlecry() + set name = "Set Battlecry" + set category = "Guardian" + set desc = "Choose what you shout as you punch" + var/input = stripped_input(src,"What do you want your battlecry to be? Max length of 5 characters.", ,"", 6) + if(input) + battlecry = input + +/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget() + ..() + if(iscarbon(target) && target != summoner) + if(length(battlecry) > 11)//no more then 11 letters in a battle cry. + src.visible_message("[src] punches [target]!") + else + src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]") + playsound(loc, src.attack_sound, 50, 1, 1) + playsound(loc, src.attack_sound, 50, 1, 1) + playsound(loc, src.attack_sound, 50, 1, 1) + playsound(loc, src.attack_sound, 50, 1, 1) + +/mob/living/simple_animal/hostile/guardian/punch/sealpunch + name = "Seal Sprit" + real_name = "Seal Sprit" + icon = 'icons/mob/animal.dmi' + icon_living = "seal" + icon_state = "seal" + attacktext = "slaps" + speak_emote = list("barks") + melee_damage_lower = 0 + melee_damage_upper = 0 + melee_damage_type = STAMINA + damage_transfer = 0 + 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 + battlecry = "URK" + adminseal = TRUE \ No newline at end of file diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 2dd8502d662..96f52929da6 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -277,4 +277,11 @@ /obj/effect/overlay/temp/cult/turf/open/floor icon_state = "floorglow" - duration = 5 \ No newline at end of file + duration = 5 + +/obj/effect/overlay/temp/shieldflash + icon_state = "shield-flash" + duration = 3 + +/obj/effect/overlay/temp/shieldflash/New(var/flash_color) + diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index e0bc6105f061fde8c6af4ea21e7d0f9b735e2d3e..118b04af87aaf393d161a4da64b286ffad8b9c03 100644 GIT binary patch delta 36264 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 MseZ98I41u806go-^Z)<= diff --git a/paradise.dme b/paradise.dme index 1e66e3547b5..3e9290c2b69 100644 --- a/paradise.dme +++ b/paradise.dme @@ -453,6 +453,15 @@ #include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm" #include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" #include "code\game\gamemodes\miniantags\guardian\guardian.dm" +#include "code\game\gamemodes\miniantags\guardian\types\assassin.dm" +#include "code\game\gamemodes\miniantags\guardian\types\bomb.dm" +#include "code\game\gamemodes\miniantags\guardian\types\charger.dm" +#include "code\game\gamemodes\miniantags\guardian\types\fire.dm" +#include "code\game\gamemodes\miniantags\guardian\types\healer.dm" +#include "code\game\gamemodes\miniantags\guardian\types\lightning.dm" +#include "code\game\gamemodes\miniantags\guardian\types\protector.dm" +#include "code\game\gamemodes\miniantags\guardian\types\ranged.dm" +#include "code\game\gamemodes\miniantags\guardian\types\standard.dm" #include "code\game\gamemodes\miniantags\morph\morph.dm" #include "code\game\gamemodes\miniantags\morph\morph_event.dm" #include "code\game\gamemodes\miniantags\revenant\revenant.dm" @@ -494,7 +503,6 @@ #include "code\game\jobs\job\civilian.dm" #include "code\game\jobs\job\engineering.dm" #include "code\game\jobs\job\job.dm" -#include "code\game\jobs\job\medical.dm" #include "code\game\jobs\job\science.dm" #include "code\game\jobs\job\security.dm" #include "code\game\jobs\job\silicon.dm" From 08d2ebdad306bd6406716ab0875b25b0062ac00e Mon Sep 17 00:00:00 2001 From: FlattestGuitar Date: Sun, 30 Jul 2017 22:25:38 +0200 Subject: [PATCH 2/6] =?UTF-8?q?=F0=9F=A4=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/gamemodes/miniantags/guardian/types/assassin.dm | 6 +----- paradise.dme | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/types/assassin.dm b/code/game/gamemodes/miniantags/guardian/types/assassin.dm index d670e7e50f1..3bb5a1fd843 100644 --- a/code/game/gamemodes/miniantags/guardian/types/assassin.dm +++ b/code/game/gamemodes/miniantags/guardian/types/assassin.dm @@ -8,15 +8,11 @@ tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online." bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, capable of sneaking and stealthy attacks." var/toggle = FALSE - var/stealthcooldown = 16 SECONDS + var/stealthcooldown = 0 var/default_stealth_cooldown = 16 SECONDS var/obj/screen/alert/canstealthalert var/obj/screen/alert/instealthalert -/mob/living/simple_animal/hostile/guardian/assassin/New() - ..() - stealthcooldown = 0 - /mob/living/simple_animal/hostile/guardian/assassin/Life() . = ..() updatestealthalert() diff --git a/paradise.dme b/paradise.dme index 3e9290c2b69..86444ee7206 100644 --- a/paradise.dme +++ b/paradise.dme @@ -503,6 +503,7 @@ #include "code\game\jobs\job\civilian.dm" #include "code\game\jobs\job\engineering.dm" #include "code\game\jobs\job\job.dm" +#include "code\game\jobs\job\medical.dm" #include "code\game\jobs\job\science.dm" #include "code\game\jobs\job\security.dm" #include "code\game\jobs\job\silicon.dm" From 82f49c18ce51cae868386757a5b39d415cea7c58 Mon Sep 17 00:00:00 2001 From: FlattestGuitar Date: Wed, 23 Aug 2017 13:29:07 +0200 Subject: [PATCH 3/6] Tigerfixes --- .../gamemodes/miniantags/guardian/guardian.dm | 14 +++--- .../miniantags/guardian/types/assassin.dm | 12 ++--- .../miniantags/guardian/types/bomb.dm | 18 +++---- .../miniantags/guardian/types/fire.dm | 12 ++--- .../miniantags/guardian/types/healer.dm | 49 +++++++++---------- .../miniantags/guardian/types/protector.dm | 8 +-- .../miniantags/guardian/types/ranged.dm | 32 ++++++------ .../miniantags/guardian/types/standard.dm | 12 ++--- .../mob/living/carbon/human/species/apollo.dm | 2 +- 9 files changed, 79 insertions(+), 80 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index c1137c9d977..b6f240b8319 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -46,7 +46,7 @@ if(summoner) if(summoner.stat == DEAD) to_chat(src, "Your summoner has died!") - visible_message("The [src] dies along with its user!") + visible_message("The [src] dies along with its user!") ghostize() qdel(src) snapback() @@ -75,7 +75,7 @@ /mob/living/simple_animal/hostile/guardian/death(gibbed) ..() - to_chat(summoner, "Your [name] died somehow!") + to_chat(summoner, "Your [name] died somehow!") summoner.death() @@ -96,10 +96,10 @@ return summoner.adjustBruteLoss(damage) if(damage) - to_chat(summoner, "Your [name] is under attack! You take damage!") - summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!") + to_chat(summoner, "Your [name] is under attack! You take damage!") + summoner.visible_message("Blood sprays from [summoner] as [src] takes damage!") if(summoner.stat == UNCONSCIOUS) - to_chat(summoner, "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!") + to_chat(summoner, "Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!") summoner.adjustCloneLoss(damage/2) /mob/living/simple_animal/hostile/guardian/ex_act(severity, target) @@ -115,7 +115,7 @@ /mob/living/simple_animal/hostile/guardian/gib() if(summoner) - to_chat(summoner, "Your [src] was blown up!") + to_chat(summoner, "Your [src] was blown up!") summoner.Weaken(10)// your fermillier has died! ROLL FOR CON LOSS! ghostize() qdel(src) @@ -153,7 +153,7 @@ to_chat(src, "[src]: [input]") /mob/living/simple_animal/hostile/guardian/proc/ToggleMode() - to_chat(src, "You dont have another mode!") + to_chat(src, "You dont have another mode!") /mob/living/proc/guardian_comm() diff --git a/code/game/gamemodes/miniantags/guardian/types/assassin.dm b/code/game/gamemodes/miniantags/guardian/types/assassin.dm index 3bb5a1fd843..39ea9992308 100644 --- a/code/game/gamemodes/miniantags/guardian/types/assassin.dm +++ b/code/game/gamemodes/miniantags/guardian/types/assassin.dm @@ -47,16 +47,16 @@ armour_penetration = initial(armour_penetration) alpha = initial(alpha) if(!forced) - to_chat(src, "You exit stealth.") + to_chat(src, "You exit stealth.") else - visible_message("\The [src] suddenly appears!") + visible_message("[src] suddenly appears!") stealthcooldown = world.time + default_stealth_cooldown //we were forced out of stealth and go on cooldown cooldown = world.time + 40 //can't recall for 4 seconds updatestealthalert() toggle = FALSE else if(stealthcooldown <= world.time) - if(src.loc == summoner) - to_chat(src, "You have to be manifested to enter stealth!") + if(loc == summoner) + to_chat(src, "You have to be manifested to enter stealth!") return melee_damage_lower = 50 melee_damage_upper = 50 @@ -64,11 +64,11 @@ new /obj/effect/overlay/temp/guardian/phase(get_turf(src)) alpha = 15 if(!forced) - to_chat(src, "You enter stealth, empowering your next attack.") + to_chat(src, "You enter stealth, empowering your next attack.") updatestealthalert() toggle = TRUE else if(!forced) - to_chat(src, "You cannot yet enter stealth, wait another [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds!") + to_chat(src, "You cannot yet enter stealth, wait another [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds!") /mob/living/simple_animal/hostile/guardian/assassin/proc/updatestealthalert() if(stealthcooldown <= world.time) diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index 6f0aaac78ff..961dfeb0a81 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -13,14 +13,14 @@ if(!istype(A)) return if(get_dist(get_turf(src), get_turf(A)) > 1) - to_chat(src, "You're too far from [A] to disguise it as a bomb.") + to_chat(src, "You're too far from [A] to disguise it as a bomb.") return if(istype(A, /obj/)) if(bomb_cooldown <= world.time && !stat) var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A)) - to_chat(src, "Success! Bomb on \the [A] armed!") + to_chat(src, "Success! Bomb on [A] armed!") if(summoner) - to_chat(summoner, "Your guardian has primed \the [A] to explode!") + to_chat(summoner, "Your guardian has primed [A] to explode!") bomb_cooldown = world.time + 200 B.spawner = src B.disguise (A) @@ -35,16 +35,16 @@ /obj/item/weapon/guardian_bomb/proc/disguise(var/obj/A) - A.loc = src + A.forceMove(src) stored_obj = A anchored = A.anchored density = A.density appearance = A.appearance spawn(600) if(src) - stored_obj.loc = get_turf(src.loc) + stored_obj.loc = get_turf(loc) if(spawner) - to_chat(spawner, "Failure! Your trap on \the [stored_obj] didn't catch anyone this time.") + to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.") qdel(src) /obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) @@ -53,11 +53,11 @@ var/mob/living/simple_animal/hostile/guardian/G = spawner if(user == G.summoner) to_chat(user, "You knew this because of your link with your guardian, so you smartly defuse the bomb.") - stored_obj.loc = get_turf(src.loc) + stored_obj.loc = get_turf(loc) qdel(src) return - to_chat(spawner, "Success! Your trap on \the [src] caught [user]!") - stored_obj.loc = get_turf(src.loc) + to_chat(spawner, "Success! Your trap on [src] caught [user]!") + stored_obj.loc = get_turf(loc) playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1) user.ex_act(2) qdel(src) diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm index 61554658a44..0e17e0003c2 100644 --- a/code/game/gamemodes/miniantags/guardian/types/fire.dm +++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm @@ -20,12 +20,12 @@ summoner.adjust_fire_stacks(-20) /mob/living/simple_animal/hostile/guardian/fire/ToggleMode() - if(src.loc == summoner) + if(loc == summoner) if(toggle) - to_chat(src, "You switch to dispersion mode, and will teleport victims away from your master.") + 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.") + 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() @@ -33,10 +33,10 @@ if(toggle) if(ishuman(target) && !summoner) spawn(0) - new /obj/effect/hallucination/delusion(target.loc, target, force_kind="custom", duration=200, skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon) + new /obj/effect/hallucination/delusion(target.loc, target, force_kind="custom", duration=200, skip_nearby=0, custom_icon = icon_state, custom_icon_file = icon) else if(prob(45)) - if(istype(target, /atom/movable)) + if(ismovableatom(target)) var/atom/movable/M = target if(!M.anchored && M != summoner) new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M)) @@ -56,7 +56,7 @@ collision_ignite(AM) /mob/living/simple_animal/hostile/guardian/fire/proc/collision_ignite(AM as mob|obj) - if(istype(AM, /mob/living/)) + if(isliving(AM)) var/mob/living/M = AM if(AM != summoner && M.fire_stacks < 7) M.fire_stacks = 7 diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm index fc6163126b3..0a6efb45d06 100644 --- a/code/game/gamemodes/miniantags/guardian/types/healer.dm +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -29,7 +29,6 @@ melee_damage_type = STAMINA adminseal = TRUE - /mob/living/simple_animal/hostile/guardian/healer/New() ..() @@ -41,11 +40,11 @@ /mob/living/simple_animal/hostile/guardian/healer/AttackingTarget() ..() if(toggle == TRUE) - if(src.loc == summoner) - to_chat(src, "You must be manifested to heal!") + if(loc == summoner) + to_chat(src, "You must be manifested to heal!") return if(iscarbon(target)) - src.changeNext_move(CLICK_CD_MELEE) + changeNext_move(CLICK_CD_MELEE) if(heal_cooldown <= world.time && !stat) var/mob/living/carbon/C = target C.adjustBruteLoss(-5) @@ -55,71 +54,71 @@ heal_cooldown = world.time + 20 /mob/living/simple_animal/hostile/guardian/healer/ToggleMode() - if(src.loc == summoner) + if(loc == summoner) if(toggle) a_intent = INTENT_HARM speed = 0 damage_transfer = 0.7 - if(src.adminseal) + if(adminseal) damage_transfer = 0 melee_damage_lower = 15 melee_damage_upper = 15 - to_chat(src, "You switch to combat mode.") + to_chat(src, "You switch to combat mode.") toggle = FALSE else a_intent = INTENT_HELP speed = 1 damage_transfer = 1 - if(src.adminseal) + if(adminseal) damage_transfer = 0 melee_damage_lower = 0 melee_damage_upper = 0 - to_chat(src, "You switch to healing mode.") + to_chat(src, "You switch to healing mode.") toggle = TRUE else - to_chat(src, "You have to be recalled to toggle modes!") + to_chat(src, "You have to be recalled to toggle modes!") /mob/living/simple_animal/hostile/guardian/healer/verb/Beacon() set name = "Place Bluespsace Beacon" set category = "Guardian" set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work in unfavorable atmospheric conditions." - if(beacon_cooldownBeacon placed! You may now warp targets to it, including your user, via Alt+Click. ") + to_chat(src, "Beacon placed! You may now warp targets to it, including your user, via Alt+Click. ") if(beacon) beacon.ChangeTurf(/turf/simulated/floor/plating) beacon = F beacon_cooldown = world.time+3000 else - to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") + to_chat(src, "Your power is on cooldown. You must wait five minutes between placing beacons.") /mob/living/simple_animal/hostile/guardian/healer/AltClickOn(atom/movable/A) if(!istype(A)) return - if(src.loc == summoner) - to_chat(src, "You must be manifested to warp a target!") + if(loc == summoner) + to_chat(src, "You must be manifested to warp a target!") return if(!beacon) - to_chat(src, "You need a beacon placed to warp things!") + to_chat(src, "You need a beacon placed to warp things!") return if(!Adjacent(A)) - to_chat(src, "You must be adjacent to your target!") + to_chat(src, "You must be adjacent to your target!") return if((A.anchored)) - to_chat(src, "Your target can not be anchored!") + to_chat(src, "Your target can not be anchored!") return - to_chat(src, "You begin to warp [A]") + to_chat(src, "You begin to warp [A]") if(do_mob(src, A, 50)) if(!A.anchored) - if(src.beacon) //Check that the beacon still exists and is in a safe place. No instant kills. + if(beacon) //Check that the beacon still exists and is in a safe place. No instant kills. if(beacon.air) var/datum/gas_mixture/Z = beacon.air if(Z.oxygen >= 16 && !Z.toxins && Z.carbon_dioxide < 10 && !Z.trace_gases.len) @@ -130,10 +129,10 @@ do_teleport(A, beacon, 0) new /obj/effect/overlay/temp/guardian/phase(get_turf(A)) else - to_chat(src, "The beacon isn't in a safe location!") + to_chat(src, "The beacon isn't in a safe location!") else - to_chat(src, "The beacon isn't in a safe location!") + to_chat(src, "The beacon isn't in a safe location!") else - to_chat(src, "You need a beacon to warp things!") + to_chat(src, "You need a beacon to warp things!") else - to_chat(src, "You need to hold still!") + to_chat(src, "You need to hold still!") diff --git a/code/game/gamemodes/miniantags/guardian/types/protector.dm b/code/game/gamemodes/miniantags/guardian/types/protector.dm index 6d0c2f77c4c..aa8bcaf09dc 100644 --- a/code/game/gamemodes/miniantags/guardian/types/protector.dm +++ b/code/game/gamemodes/miniantags/guardian/types/protector.dm @@ -27,7 +27,7 @@ melee_damage_upper = initial(melee_damage_upper) speed = initial(speed) damage_transfer = 0.4 - to_chat(src, "You switch to combat mode.") + to_chat(src, "You switch to combat mode.") toggle = FALSE else var/icon/shield_overlay = icon('icons/effects/effects.dmi', "shield-grey") @@ -37,7 +37,7 @@ melee_damage_upper = 2 speed = 1 damage_transfer = 0.05 //damage? what's damage? - to_chat(src, "You switch to protection mode.") + to_chat(src, "You switch to protection mode.") toggle = TRUE /mob/living/simple_animal/hostile/guardian/protector/snapback() //snap to what? snap to the guardian! @@ -47,11 +47,11 @@ else if(istype(summoner.loc, /obj/effect)) to_chat(src, "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!") - visible_message("\The [src] jumps back to its user.") + visible_message("[src] jumps back to its user.") Recall(TRUE) else to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [src]!") - summoner.visible_message("\The [summoner] jumps back to their protector.") + summoner.visible_message("[summoner] jumps back to their protector.") new /obj/effect/overlay/temp/guardian/phase/out(get_turf(summoner)) summoner.forceMove(get_turf(src)) new /obj/effect/overlay/temp/guardian/phase(get_turf(summoner))//Protector \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/guardian/types/ranged.dm b/code/game/gamemodes/miniantags/guardian/types/ranged.dm index 789dfc4062c..648339743fd 100644 --- a/code/game/gamemodes/miniantags/guardian/types/ranged.dm +++ b/code/game/gamemodes/miniantags/guardian/types/ranged.dm @@ -27,7 +27,7 @@ var/toggle = FALSE /mob/living/simple_animal/hostile/guardian/ranged/ToggleMode() - if(src.loc == summoner) + if(loc == summoner) if(toggle) ranged = 1 melee_damage_lower = 10 @@ -35,7 +35,7 @@ alpha = 255 range = 13 incorporeal_move = 0 - to_chat(src, "You switch to combat mode.") + to_chat(src, "You switch to combat mode.") toggle = FALSE else ranged = 0 @@ -44,10 +44,10 @@ alpha = 60 range = 255 incorporeal_move = 1 - to_chat(src, "You switch to scout mode.") + to_chat(src, "You switch to scout mode.") toggle = TRUE else - to_chat(src, "You have to be recalled to toggle modes!") + to_chat(src, "You have to be recalled to toggle modes!") /mob/living/simple_animal/hostile/guardian/ranged/ToggleLight() if(see_invisible == SEE_INVISIBLE_MINIMUM) @@ -61,25 +61,25 @@ set name = "Set Surveillance Trap" set category = "Guardian" set desc = "Set an invisible trap that will alert you when living creatures walk over it. Max of 5" - if(src.snares.len <6) - var/turf/snare_loc = get_turf(src.loc) + if(snares.len <6) + var/turf/snare_loc = get_turf(loc) var/obj/item/effect/snare/S = new /obj/item/effect/snare(snare_loc) S.spawner = src S.name = "[get_area(snare_loc)] trap ([rand(1, 1000)])" - src.snares |= S - to_chat(src, "Surveillance trap deployed!") + snares |= S + to_chat(src, "Surveillance trap deployed!") else - to_chat(src, "You have too many traps deployed. Delete some first.") + to_chat(src, "You have too many traps deployed. Delete some first.") /mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare() set name = "Remove Surveillance Trap" set category = "Guardian" set desc = "Disarm unwanted surveillance traps." - var/picked_snare = input(src, "Pick which trap to disarm", "Disarm Trap") as null|anything in src.snares + var/picked_snare = input(src, "Pick which trap to disarm", "Disarm Trap") as null|anything in snares if(picked_snare) - src.snares -= picked_snare + snares -= picked_snare qdel(picked_snare) - to_chat(src, "Snare disarmed.") + to_chat(src, "Snare disarmed.") /obj/item/effect/snare name = "snare" @@ -89,11 +89,11 @@ /obj/item/effect/snare/Crossed(AM as mob|obj) - if(istype(AM, /mob/living/)) - var/turf/snare_loc = get_turf(src.loc) + if(isliving(AM)) + var/turf/snare_loc = get_turf(loc) if(spawner) - to_chat(spawner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") + to_chat(spawner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) var/mob/living/simple_animal/hostile/guardian/G = spawner if(G.summoner) - to_chat(G.summoner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") + to_chat(G.summoner, "[AM] has crossed your surveillance trap at [get_area(snare_loc)].") diff --git a/code/game/gamemodes/miniantags/guardian/types/standard.dm b/code/game/gamemodes/miniantags/guardian/types/standard.dm index c9d538b809e..2315d06c0dd 100644 --- a/code/game/gamemodes/miniantags/guardian/types/standard.dm +++ b/code/game/gamemodes/miniantags/guardian/types/standard.dm @@ -21,13 +21,13 @@ ..() if(iscarbon(target) && target != summoner) if(length(battlecry) > 11)//no more then 11 letters in a battle cry. - src.visible_message("[src] punches [target]!") + visible_message("[src] punches [target]!") else - src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]") - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) - playsound(loc, src.attack_sound, 50, 1, 1) + say("[battlecry][battlecry][battlecry][battlecry][battlecry]") + playsound(loc, attack_sound, 50, 1, 1) + playsound(loc, attack_sound, 50, 1, 1) + playsound(loc, attack_sound, 50, 1, 1) + playsound(loc, attack_sound, 50, 1, 1) /mob/living/simple_animal/hostile/guardian/punch/sealpunch name = "Seal Sprit" diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index 989fe9ba62a..4c1d8e9aa2e 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -73,7 +73,7 @@ node.remove(H) node.loc = M.loc to_chat(M, "You hear a loud crunch as you mercilessly pull off [H]'s antennae.") - to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M].") + to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M].") to_chat(H, "It's so quiet...") head_organ.h_style = "Bald" H.update_hair() From 81b23e4595945059ca485392e2c0597de59ae632 Mon Sep 17 00:00:00 2001 From: FlattestGuitar Date: Wed, 23 Aug 2017 13:38:13 +0200 Subject: [PATCH 4/6] :sweat: --- code/game/gamemodes/miniantags/guardian/types/bomb.dm | 2 +- code/game/gamemodes/miniantags/guardian/types/charger.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index 961dfeb0a81..98568af0529 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -25,7 +25,7 @@ B.spawner = src B.disguise (A) else - to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") + to_chat(src, "Your powers are on cooldown! You must wait 20 seconds between bombs.") /obj/item/weapon/guardian_bomb name = "bomb" diff --git a/code/game/gamemodes/miniantags/guardian/types/charger.dm b/code/game/gamemodes/miniantags/guardian/types/charger.dm index 6f0c439dc25..39bf995967e 100644 --- a/code/game/gamemodes/miniantags/guardian/types/charger.dm +++ b/code/game/gamemodes/miniantags/guardian/types/charger.dm @@ -24,7 +24,7 @@ /mob/living/simple_animal/hostile/guardian/charger/OpenFire(atom/A) if(!charging) - visible_message("[src] [ranged_message] at [A]!") + visible_message("[src] [ranged_message] at [A]!") ranged_cooldown = world.time + ranged_cooldown_time clear_alert("charge") chargealert = null From b4226898cb4c5c81df5dd60e39d10d867aa37713 Mon Sep 17 00:00:00 2001 From: FlattestGuitar Date: Mon, 11 Sep 2017 22:31:22 +0200 Subject: [PATCH 5/6] More tigerfixes --- code/game/gamemodes/miniantags/guardian/types/bomb.dm | 8 ++++---- code/game/gamemodes/miniantags/guardian/types/standard.dm | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index 98568af0529..e877fea68af 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -13,12 +13,12 @@ if(!istype(A)) return if(get_dist(get_turf(src), get_turf(A)) > 1) - to_chat(src, "You're too far from [A] to disguise it as a bomb.") + to_chat(src, "You're too far from [A] to disguise it as a bomb.") return if(istype(A, /obj/)) if(bomb_cooldown <= world.time && !stat) var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A)) - to_chat(src, "Success! Bomb on [A] armed!") + to_chat(src, "Success! Bomb on [A] armed!") if(summoner) to_chat(summoner, "Your guardian has primed [A] to explode!") bomb_cooldown = world.time + 200 @@ -44,7 +44,7 @@ if(src) stored_obj.loc = get_turf(loc) if(spawner) - to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.") + to_chat(spawner, "Failure! Your trap on [stored_obj] didn't catch anyone this time.") qdel(src) /obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) @@ -56,7 +56,7 @@ stored_obj.loc = get_turf(loc) qdel(src) return - to_chat(spawner, "Success! Your trap on [src] caught [user]!") + to_chat(spawner, "Success! Your trap on [src] caught [user]!") stored_obj.loc = get_turf(loc) playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1) user.ex_act(2) diff --git a/code/game/gamemodes/miniantags/guardian/types/standard.dm b/code/game/gamemodes/miniantags/guardian/types/standard.dm index 2315d06c0dd..10327778a65 100644 --- a/code/game/gamemodes/miniantags/guardian/types/standard.dm +++ b/code/game/gamemodes/miniantags/guardian/types/standard.dm @@ -21,7 +21,7 @@ ..() if(iscarbon(target) && target != summoner) if(length(battlecry) > 11)//no more then 11 letters in a battle cry. - visible_message("[src] punches [target]!") + visible_message("[src] punches [target]!") else say("[battlecry][battlecry][battlecry][battlecry][battlecry]") playsound(loc, attack_sound, 50, 1, 1) From 948a65b2a3675d43baa993f39c4ff029b7bef170 Mon Sep 17 00:00:00 2001 From: FlattestGuitar Date: Sun, 15 Oct 2017 23:40:38 +0200 Subject: [PATCH 6/6] more tigerfixes --- code/game/gamemodes/miniantags/guardian/types/bomb.dm | 4 ++-- code/game/gamemodes/miniantags/guardian/types/fire.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index e877fea68af..6a4c74ff1a3 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -48,7 +48,7 @@ qdel(src) /obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user) - to_chat(user, "The [src] was boobytrapped!") + to_chat(user, "The [src] was boobytrapped!") if(istype(spawner, /mob/living/simple_animal/hostile/guardian)) var/mob/living/simple_animal/hostile/guardian/G = spawner if(user == G.summoner) @@ -72,5 +72,5 @@ /obj/item/weapon/guardian_bomb/examine(mob/user) stored_obj.examine(user) - if(get_dist(user,src)<=2) + if(get_dist(user,src) <= 2) to_chat(user, "Looks odd!") diff --git a/code/game/gamemodes/miniantags/guardian/types/fire.dm b/code/game/gamemodes/miniantags/guardian/types/fire.dm index 0e17e0003c2..1447f36e739 100644 --- a/code/game/gamemodes/miniantags/guardian/types/fire.dm +++ b/code/game/gamemodes/miniantags/guardian/types/fire.dm @@ -25,7 +25,7 @@ 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.") + 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() @@ -33,7 +33,7 @@ if(toggle) if(ishuman(target) && !summoner) spawn(0) - new /obj/effect/hallucination/delusion(target.loc, target, force_kind="custom", duration=200, skip_nearby=0, custom_icon = icon_state, custom_icon_file = icon) + new /obj/effect/hallucination/delusion(target.loc, target, force_kind = "custom", duration = 200, skip_nearby = 0, custom_icon = icon_state, custom_icon_file = icon) else if(prob(45)) if(ismovableatom(target))