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