diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index ccc0cd705fb..47078644b3a 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -1,13 +1,13 @@
/mob/living/simple_animal/construct
name = "Construct"
- real_name = "Contruct"
+ real_name = "Construct"
desc = ""
speak_emote = list("hisses")
emote_hear = list("wails","screeches")
response_help = "thinks better of touching"
response_disarm = "flails at"
- response_harm = "punches the"
+ response_harm = "punches"
icon_dead = "shade_dead"
speed = -1
a_intent = "harm"
@@ -24,18 +24,24 @@
max_n2 = 0
minbodytemp = 0
faction = "cult"
+ var/list/construct_spells = list()
-
-/mob/living/simple_animal/construct/Life()
+/mob/living/simple_animal/construct/New()
..()
- if(stat == 2)
- new /obj/item/weapon/ectoplasm (src.loc)
- for(var/mob/M in viewers(src, null))
- if((M.client && !( M.blinded )))
- M.show_message("\red [src] collapses in a shattered heap ")
- ghostize()
- del src
- return
+ name = text("[initial(name)] ([rand(1, 1000)])")
+ real_name = name
+ for(var/spell in construct_spells)
+ spell_list += new spell(src)
+
+/mob/living/simple_animal/construct/Die()
+ ..()
+ new /obj/item/weapon/ectoplasm (src.loc)
+ for(var/mob/M in viewers(src, null))
+ if((M.client && !( M.blinded )))
+ M.show_message("\red [src] collapses in a shattered heap. ")
+ ghostize()
+ del src
+ return
/mob/living/simple_animal/construct/examine()
set src in oview()
@@ -54,45 +60,37 @@
return
/mob/living/simple_animal/construct/Bump(atom/movable/AM as mob|obj, yes)
- spawn( 0 )
- if ((!( yes ) || now_pushing))
- return
- now_pushing = 1
- if(ismob(AM))
- var/mob/tmob = AM
- if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
- if(prob(5))
- src << "\red You fail to push [tmob]'s fat ass out of the way."
- now_pushing = 0
- return
- if(!(tmob.status_flags & CANPUSH))
- now_pushing = 0
- return
-
- tmob.LAssailant = src
- now_pushing = 0
- ..()
- if (!( istype(AM, /atom/movable) ))
- return
- if (!( now_pushing ))
- now_pushing = 1
- if (!( AM.anchored ))
- var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window))
- if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
- for(var/obj/structure/window/win in get_step(AM,t))
- now_pushing = 0
- return
- step(AM, t)
- now_pushing = null
+ if ((!( yes ) || now_pushing))
return
- return
+ now_pushing = 1
+ if(ismob(AM))
+ var/mob/tmob = AM
+ if(!(tmob.status_flags & CANPUSH))
+ now_pushing = 0
+ return
+
+ tmob.LAssailant = src
+ now_pushing = 0
+ ..()
+ if (!istype(AM, /atom/movable))
+ return
+ if (!( now_pushing ))
+ now_pushing = 1
+ if (!( AM.anchored ))
+ var/t = get_dir(src, AM)
+ if (istype(AM, /obj/structure/window))
+ if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
+ for(var/obj/structure/window/win in get_step(AM,t))
+ now_pushing = 0
+ return
+ step(AM, t)
+ now_pushing = null
/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob)
if(istype(M, /mob/living/simple_animal/construct/builder))
health += 5
- M.emote("mends some of \the [src]'s wounds")
+ M.emote("mends some of \the [src]'s wounds.")
else
if(M.melee_damage_upper <= 0)
M.emote("[M.friendly] \the [src]")
@@ -101,25 +99,24 @@
playsound(loc, M.attack_sound, 50, 1, 1)
for(var/mob/O in viewers(src, null))
O.show_message("\The [M] [M.attacktext] \the [src]!", 1)
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
+ add_logs(M, src, "attacked", admin=0)
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- health -= damage
+ adjustBruteLoss(damage)
/mob/living/simple_animal/construct/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
var/damage = O.force
if (O.damtype == HALLOSS)
damage = 0
- health -= damage
+ adjustBruteLoss(damage)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
- M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
+ M.show_message("\red \b [src] has been attacked with [O] by [user]. ")
else
usr << "\red This weapon is ineffective, it does no damage."
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
+ M.show_message("\red [user] gently taps [src] with [O]. ")
@@ -136,7 +133,7 @@
icon_living = "behemoth"
maxHealth = 250
health = 250
- response_harm = "harmlessly punches the"
+ response_harm = "harmlessly punches"
harm_intent_damage = 0
melee_damage_lower = 30
melee_damage_upper = 30
@@ -145,6 +142,7 @@
wall_smash = 1
attack_sound = 'sound/weapons/punch3.ogg'
status_flags = 0
+ construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall)
/mob/living/simple_animal/construct/armoured/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
@@ -152,22 +150,46 @@
var/damage = O.force
if (O.damtype == HALLOSS)
damage = 0
- health -= damage
+ adjustBruteLoss(damage)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
- M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
+ M.show_message("\red \b [src] has been attacked with [O] by [user]. ")
else
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
- M.show_message("\red \b The [O] bounces harmlessly off of [src]. ")
+ M.show_message("\red \b [O] bounces harmlessly off of [src]. ")
else
usr << "\red This weapon is ineffective, it does no damage."
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
+ M.show_message("\red [user] gently taps [src] with [O]. ")
+/mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P)
+ if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
+ var/reflectchance = 80 - round(P.damage/3)
+ if(prob(reflectchance))
+ adjustBruteLoss(P.damage * 0.5)
+ visible_message("The [P.name] gets reflected by [src]'s shell!", \
+ "The [P.name] gets reflected by [src]'s shell!")
+ // Find a turf near or on the original location to bounce to
+ if(P.starting)
+ var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
+ var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
+ var/turf/curloc = get_turf(src)
+
+ // redirect the projectile
+ P.original = locate(new_x, new_y, P.z)
+ P.starting = curloc
+ P.current = curloc
+ P.firer = src
+ P.yo = new_y - curloc.y
+ P.xo = new_x - curloc.x
+
+ return -1 // complete projectile permutation
+
+ return (..(P))
@@ -190,6 +212,7 @@
speed = -1
see_in_dark = 7
attack_sound = 'sound/weapons/bladeslice.ogg'
+ construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift)
@@ -214,6 +237,11 @@
speed = 0
wall_smash = 1
attack_sound = 'sound/weapons/punch2.ogg'
+ construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
+ /obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
+ /obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
+ /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone,
+ /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser)
/////////////////////////////Behemoth/////////////////////////
@@ -229,7 +257,7 @@
maxHealth = 750
health = 750
speak_emote = list("rumbles")
- response_harm = "harmlessly punches the"
+ response_harm = "harmlessly punches"
harm_intent_damage = 0
melee_damage_lower = 50
melee_damage_upper = 50
@@ -240,25 +268,25 @@
var/energy = 0
var/max_energy = 1000
-/mob/living/simple_animal/constructbehemoth/attackby(var/obj/item/O as obj, var/mob/user as mob)
+/mob/living/simple_animal/construct/behemoth/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
if(O.force >= 11)
var/damage = O.force
if (O.damtype == HALLOSS)
damage = 0
- health -= damage
+ adjustBruteLoss(damage)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
- M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
+ M.show_message("\red \b [src] has been attacked with [O] by [user]. ")
else
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
- M.show_message("\red \b The [O] bounces harmlessly off of [src]. ")
+ M.show_message("\red \b [O] bounces harmlessly off of [src]. ")
else
usr << "\red This weapon is ineffective, it does no damage."
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
+ M.show_message("\red [user] gently taps [src] with [O]. ")
@@ -290,4 +318,4 @@
if (cultist == usr) //just to be sure.
return
cultist.loc = usr.loc
- usr.visible_message("\red [cultist] appears in a flash of red light as [usr] glows with power")*/
\ No newline at end of file
+ usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/
\ No newline at end of file