/mob/living/simple_animal/construct name = "Construct" 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" icon_dead = "shade_dead" speed = 0 a_intent = "harm" stop_automated_movement = 1 status_flags = CANPUSH attack_sound = 'sound/weapons/punch1.ogg' min_oxy = 0 max_oxy = 0 min_tox = 0 max_tox = 0 min_co2 = 0 max_co2 = 0 min_n2 = 0 max_n2 = 0 minbodytemp = 0 faction = list("cult") flying = 1 var/list/construct_spells = list() /mob/living/simple_animal/construct/New() ..() name = text("[initial(name)] ([rand(1, 1000)])") real_name = name for(var/spell in construct_spells) AddSpell(new spell(src)) updateglow() /mob/living/simple_animal/construct/Die() ..() new /obj/item/weapon/reagent_containers/food/snacks/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() qdel(src) return /mob/living/simple_animal/construct/examine() set src in oview() var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" if (src.health < src.maxHealth) msg += "" if (src.health >= src.maxHealth/2) msg += "It looks slightly dented.\n" else msg += "It looks severely dented!\n" msg += "" msg += "*---------*" usr << msg 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/full)) for(var/obj/structure/window/win in get_step(AM,t)) now_pushing = 0 return step(AM, t) now_pushing = null return return /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.") else if(M.melee_damage_upper <= 0) M.emote("[M.friendly] \the [src]") else M.do_attack_animation(src) if(M.attack_sound) 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) add_logs(M, src, "attacked") var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) /mob/living/simple_animal/construct/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(O.force) var/damage = O.force if (O.damtype == STAMINA) damage = 0 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 [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 [O]. ") /mob/living/simple_animal/construct/narsie_act() return /////////////////Juggernaut/////////////// /mob/living/simple_animal/construct/armoured name = "Juggernaut" real_name = "Juggernaut" desc = "A possessed suit of armour driven by the will of the restless dead" icon = 'icons/mob/mob.dmi' icon_state = "behemoth" icon_living = "behemoth" maxHealth = 250 health = 250 response_harm = "harmlessly punches" harm_intent_damage = 0 melee_damage_lower = 30 melee_damage_upper = 30 attacktext = "smashes their armoured gauntlet into" speed = 3 environment_smash = 2 attack_sound = 'sound/weapons/punch3.ogg' status_flags = 0 construct_spells = list(/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/lesserforcewall) /mob/living/simple_animal/construct/armoured/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(O.force) if(O.force >= 11) var/damage = O.force if (O.damtype == STAMINA) damage = 0 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 [O] by [user]. ") else for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) 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 [O]. ") /mob/living/simple_animal/construct/armoured/Life() weakened = 0 ..() /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)) if((P.damage_type == BRUTE || P.damage_type == BURN)) 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)) ////////////////////////Wraith///////////////////////////////////////////// /mob/living/simple_animal/construct/wraith name = "Wraith" real_name = "Wraith" desc = "A wicked bladed shell contraption piloted by a bound spirit" icon = 'icons/mob/mob.dmi' icon_state = "floating" icon_living = "floating" maxHealth = 75 health = 75 melee_damage_lower = 25 melee_damage_upper = 25 attacktext = "slashes" see_in_dark = 7 attack_sound = 'sound/weapons/bladeslice.ogg' construct_spells = list(/obj/effect/proc_holder/spell/wizard/targeted/ethereal_jaunt/shift) /////////////////////////////Artificer///////////////////////// /mob/living/simple_animal/construct/builder name = "Artificer" real_name = "Artificer" desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies" icon = 'icons/mob/mob.dmi' icon_state = "artificer" icon_living = "artificer" maxHealth = 50 health = 50 response_harm = "viciously beats" harm_intent_damage = 5 melee_damage_lower = 5 melee_damage_upper = 5 attacktext = "rams" environment_smash = 2 attack_sound = 'sound/weapons/punch2.ogg' construct_spells = list(/obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/construct/lesser, /obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/wall, /obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/floor, /obj/effect/proc_holder/spell/wizard/aoe_turf/conjure/soulstone, /obj/effect/proc_holder/spell/wizard/targeted/projectile/magic_missile/lesser) /////////////////////////////Behemoth///////////////////////// /mob/living/simple_animal/construct/behemoth name = "Behemoth" real_name = "Behemoth" desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal." icon = 'icons/mob/mob.dmi' icon_state = "behemoth" icon_living = "behemoth" maxHealth = 750 health = 750 speak_emote = list("rumbles") response_harm = "harmlessly punches" harm_intent_damage = 0 melee_damage_lower = 50 melee_damage_upper = 50 attacktext = "brutally crushes" speed = 5 environment_smash = 2 attack_sound = 'sound/weapons/punch4.ogg' var/energy = 0 var/max_energy = 1000 /mob/living/simple_animal/construct/behemoth/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(O.force) if(O.force >= 11) var/damage = O.force if (O.damtype == STAMINA) damage = 0 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 [O] by [user]. ") else for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) 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 [O]. ") /////////////////////////////Harvester///////////////////////// /mob/living/simple_animal/construct/harvester name = "Harvester" real_name = "Harvester" desc = "A harbinger of Nar-Sie's enlightenment. It'll be all over soon." icon = 'icons/mob/mob.dmi' icon_state = "harvester" icon_living = "harvester" maxHealth = 60 health = 60 melee_damage_lower = 1 melee_damage_upper = 5 attacktext = "prods" speed = 0 environment_smash = 1 see_in_dark = 7 attack_sound = 'sound/weapons/tap.ogg' construct_spells = list(/obj/effect/proc_holder/spell/wizard/targeted/smoke/disable) /mob/living/simple_animal/construct/harvester/Process_Spacemove(var/check_drift = 0) return 1 ////////////////Glow//////////////////// /mob/living/simple_animal/construct/proc/updateglow() overlays = 0 var/overlay_layer = LIGHTING_LAYER + 1 if(layer != MOB_LAYER) overlay_layer=TURF_LAYER+0.2 overlays += image(icon,"glow-[icon_state]",overlay_layer) set_light(2, -2, l_color = "#FFFFFF") ////////////////Powers////////////////// /* /client/proc/summon_cultist() set category = "Behemoth" set name = "Summon Cultist (300)" set desc = "Teleport a cultist to your location" if (istype(usr,/mob/living/simple_animal/constructbehemoth)) if(usr.energy<300) usr << "\red You do not have enough power stored!" return if(usr.stat) return usr.energy -= 300 var/list/mob/living/cultists = new for(var/datum/mind/H in ticker.mode.cult) if (istype(H.current,/mob/living)) cultists+=H.current var/mob/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - usr) if(!cultist) return 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")*/