diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index f78bfd929a1..232c0920987 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -96,6 +96,8 @@ var/datum/global_hud/global_hud = new()
var/obj/screen/lingchemdisplay
var/obj/screen/lingstingdisplay
+ var/obj/screen/guardianhealthdisplay
+
var/obj/screen/blobpwrdisplay
var/obj/screen/blobhealthdisplay
var/obj/screen/vampire_blood_display
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index 34a59ac9ac9..0d0870d375a 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -6,17 +6,17 @@
response_help = "passes through"
response_disarm = "flails at"
response_harm = "punches"
- icon = 'icons/mob/mob.dmi'
- icon_state = "stand"
- icon_living = "stand"
- icon_dead = "stand"
+ icon = 'icons/mob/guardian.dmi'
+ icon_state = "magicOrange"
+ icon_living = "magicOrange"
+ icon_dead = "magicOrange"
speed = 0
a_intent = I_HARM
stop_automated_movement = 1
floating = 1
attack_sound = 'sound/weapons/punch1.ogg'
minbodytemp = 0
- maxbodytemp = 10000000
+ maxbodytemp = INFINITY
min_oxy = 0
max_oxy = INFINITY
min_tox = 0
@@ -33,7 +33,6 @@
melee_damage_upper = 15
AIStatus = AI_OFF
var/summoned = FALSE
- var/animated_manifest = FALSE
var/cooldown = 0
var/damage_transfer = 1 //how much damage from each attack we transfer to the owner
var/mob/living/summoner
@@ -60,7 +59,7 @@
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()
- if(summoned && !summoner)
+ if(summoned && !summoner && !adminseal)
src << "You somehow lack a summoner! As a result, you dispel!"
ghostize()
qdel()
@@ -80,6 +79,17 @@
summoner << "Your [name] died somehow!"
summoner.death()
+
+/mob/living/simple_animal/hostile/guardian/handle_hud_icons_health()
+ if(summoner)
+ var/resulthealth
+ if(iscarbon(summoner))
+ resulthealth = round((abs(config.health_threshold_dead - summoner.health) / abs(config.health_threshold_dead - summoner.maxHealth)) * 100)
+ else
+ resulthealth = round((summoner.health / summoner.maxHealth) * 100)
+ hud_used.guardianhealthdisplay.maptext = "
[resulthealth]%
"
+
+
/mob/living/simple_animal/hostile/guardian/adjustBruteLoss(amount) //The spirit is invincible, but passes on damage to the summoner
var/damage = amount * damage_transfer
if (summoner)
@@ -118,20 +128,16 @@
return
if(!summoner) return
if(loc == summoner)
- loc = get_turf(summoner)
+ forceMove(get_turf(summoner))
src.client.eye = loc
cooldown = world.time + 30
- if(animated_manifest)
- var/end_icon = icon_state
- icon_state = "parasite_forming"
- spawn(6)
- icon_state = end_icon
/mob/living/simple_animal/hostile/guardian/proc/Recall()
if(cooldown > world.time)
return
if(!summoner) return
- loc = summoner
+ new /obj/effect/overlay/temp/guardian/phase/out(get_turf(src))
+ forceMove(summoner)
buckled = null
cooldown = world.time + 30
@@ -204,8 +210,10 @@
/mob/living/simple_animal/hostile/guardian/proc/ToggleLight()
if(!luminosity)
set_light(3)
+ src << "You activate your light."
else
set_light(0)
+ src << "You deactivate your light."
//////////////////////////TYPES OF GUARDIANS
@@ -226,6 +234,7 @@
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
..()
@@ -233,13 +242,29 @@
summoner.ExtinguishMob()
summoner.adjust_fire_stacks(-20)
+/mob/living/simple_animal/hostile/guardian/fire/ToggleMode()
+ if(src.loc == summoner)
+ if(toggle)
+ src << "You switch to dispersion mode, and will teleport victims away from your master."
+ toggle = FALSE
+ else
+ 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(prob(45))
- if(istype(target, /atom/movable))
- var/atom/movable/M = target
- if(!M.anchored && M != summoner)
- do_teleport(M, M, 10)
+ 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)
..()
@@ -446,7 +471,9 @@
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
src << "The beacon isn't in a safe location!"
else
@@ -476,7 +503,10 @@
ranged_cooldown_cap = 1
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."
@@ -507,6 +537,14 @@
else
src << "You have to be recalled to toggle modes!"
+/mob/living/simple_animal/hostile/guardian/ranged/ToggleLight()
+ if(see_invisible == SEE_INVISIBLE_MINIMUM)
+ src << "You deactivate your night vision."
+ see_invisible = SEE_INVISIBLE_LIVING
+ else
+ 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"
@@ -675,7 +713,6 @@
else
gaurdiantype = input(user, "Pick the type of [mob_name]", "[mob_name] Creation") as null|anything in possible_guardians
var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch
- var/picked_color = pick("#FFFFFF","#000000","#808080","#A52A2A","#FF0000","#8B0000","#DC143C","#FFA500","#FFFF00","#008000","#00FF00","#006400","#00FFFF","#0000FF","#000080","#008080","#800080","#4B0082")
switch(gaurdiantype)
if("Chaos")
@@ -705,29 +742,42 @@
user.verbs += /mob/living/proc/guardian_comm
user.verbs += /mob/living/proc/guardian_recall
user.verbs += /mob/living/proc/guardian_reset
- var/magic_suite = pick("Wands","Cups","Swords","Pentacles")
- var/picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
+
+ var/color
+ 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")
- G.name = "[mob_name] of [magic_suite]"
- G.color = picked_color
- G.real_name = "[mob_name] of [magic_suite]"
+ color = pick("Pink", "Red", "Orange", "Green", "Blue")
+ picked_name = pick("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
+
+ G.name = "[picked_name] [color]"
+ G.real_name = "[picked_name] [color]"
+ G.icon_living = "[theme][color]"
+ G.icon_state = "[theme][color]"
+ G.icon_dead = "[theme][color]"
+
user << "[G.magic_fluff_string]."
if("tech")
- var/colour = pick("orange", "neon", "pink", "red", "blue", "green")
- G.name = "[picked_name] [capitalize(colour)]"
- G.real_name = "[picked_name] [capitalize(colour)]"
- G.icon_living = "parasite[colour]"
- G.icon_state = "parasite[colour]"
- G.icon_dead = "parasite[colour]"
- G.animated_manifest = TRUE
+ color = pick("Rose", "Peony", "Lily", "Daisy", "Zinnia", "Ivy", "Iris", "Petunia", "Violet", "Lilac", "Orchid") //technically not colors, just flowers that can be specific colors
+ 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]"
+ G.real_name = "[picked_name] [color]"
+ G.icon_living = "[theme][color]"
+ G.icon_state = "[theme][color]"
+ G.icon_dead = "[theme][color]"
+
user << "[G.tech_fluff_string]."
G.speak_emote = list("states")
if("bio")
+ G.icon = 'icons/mob/mob.dmi'
+ picked_name = pick("brood", "hive", "nest")
user << "[G.bio_fluff_string]."
- G.name = "[mob_name] [picked_name]"
+ G.name = "[picked_name] swarm"
G.color = picked_color
- G.real_name = "[mob_name] [picked_name]"
+ G.real_name = "[picked_name] swarm"
G.icon_living = "headcrab"
G.icon_state = "headcrab"
G.attacktext = "swarms"
@@ -798,17 +848,17 @@
-
-
-
-
-///HUD
-
-/datum/hud/proc/guardian_hud(ui_style = 'icons/mob/screen1_midnight.dmi')
+/datum/hud/proc/guardian_hud(ui_style = 'icons/mob/screen1_Midnight.dmi')
adding = list()
var/obj/screen/using
+ guardianhealthdisplay = new /obj/screen/guardian()
+ guardianhealthdisplay.name = "summoner health"
+ guardianhealthdisplay.screen_loc = ui_health
+ guardianhealthdisplay.mouse_opacity = 0
+ adding += guardianhealthdisplay
+
using = new /obj/screen/guardian/Manifest()
using.screen_loc = ui_rhand
adding += using
@@ -834,12 +884,11 @@
mymob.client.screen += adding
-
-
//HUD BUTTONS
/obj/screen/guardian
icon = 'icons/mob/guardian.dmi'
+ icon_state = "base"
/obj/screen/guardian/Manifest
icon_state = "manifest"
@@ -882,6 +931,7 @@
var/mob/living/simple_animal/hostile/guardian/G = usr
G.Communicate()
+
/obj/screen/guardian/ToggleLight
icon_state = "light"
name = "Toggle Light"
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index e1dc0b4108e..35ed65ad0df 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -43,6 +43,16 @@
icon_state = "purplecrack"
duration = 6
+/obj/effect/overlay/temp/guardian
+ randomdir = 0
+
+/obj/effect/overlay/temp/guardian/phase
+ duration = 5
+ icon_state = "phasein"
+
+/obj/effect/overlay/temp/guardian/phase/out
+ icon_state = "phaseout"
+
/obj/effect/overlay/temp/emp
name = "emp sparks"
icon = 'icons/effects/effects.dmi'
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 0151136b580..d07474786ab 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -325,29 +325,33 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/hallucination/delusion
var/list/image/delusions = list()
-/obj/effect/hallucination/delusion/New(loc,var/mob/living/carbon/T)
+/obj/effect/hallucination/delusion/New(loc, mob/living/carbon/T, force_kind = null, duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null)
target = T
var/image/A = null
- var/kind = rand(1,3)
+ var/kind = force_kind ? force_kind : pick("clown", "corgi", "carp", "skeleton", "demon")
for(var/mob/living/carbon/human/H in living_mob_list)
if(H == target)
continue
- if(H in view(target))
+ if(skip_nearby && (H in view(target)))
continue
switch(kind)
- if(1)//Clown
+ if("clown")//Clown
A = image('icons/mob/animal.dmi',H,"clown")
- if(2)//Carp
+ if("carp")//Carp
A = image('icons/mob/animal.dmi',H,"carp")
- if(3)//Corgi
+ if("corgi")//Corgi
A = image('icons/mob/pets.dmi',H,"corgi")
- if(4)//Skeletons
+ if("skeleton")//Skeletons
A = image('icons/mob/human.dmi',H,"skeleton_s")
+ if("demon")//Demon
+ A = image('icons/mob/mob.dmi',H,"daemon")
+ if("custom")
+ A = image(custom_icon_file, H, custom_icon)
A.override = 1
if(target.client)
delusions |= A
target.client.images |= A
- sleep(300)
+ sleep(duration)
for(var/image/I in delusions)
if(target.client)
target.client.images.Remove(I)
diff --git a/icons/mob/guardian.dmi b/icons/mob/guardian.dmi
index 9db3fbedc68..a84ccec28ad 100644
Binary files a/icons/mob/guardian.dmi and b/icons/mob/guardian.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 36642747502..bc74db7c722 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ