mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-07-12 09:32:38 +01:00
296 lines
7.6 KiB
Plaintext
296 lines
7.6 KiB
Plaintext
/obj/item/attackdummy
|
|
name = "attack dummy"
|
|
damtype = "brute"
|
|
force = 5
|
|
throwforce = 5
|
|
|
|
/mob/living/object
|
|
name = "living object"
|
|
var/obj/item/item
|
|
var/mob/owner
|
|
var/obj/item/attackdummy/dummy
|
|
var/obj/screen/release/release
|
|
density = 0
|
|
canmove = 1
|
|
var/canattack = 0
|
|
blinded = 0
|
|
anchored = 0
|
|
a_intent = "disarm" // todo: This should probably be selectable. Cyborg style - help/harm.
|
|
health = 50
|
|
max_health = 50
|
|
|
|
New(var/atom/loc as mob|obj|turf, var/mob/controller)
|
|
..()
|
|
message_admins("[key_name(controller)] possessed [loc] at [showCoords(loc.x, loc.y, loc.z)].")
|
|
var/obj/item/possessed
|
|
if (!istype(loc, /obj/item))
|
|
if (isobj(loc))
|
|
possessed = loc
|
|
set_loc(get_turf(possessed))
|
|
canattack = 0
|
|
dummy = new /obj/item/attackdummy(src)
|
|
dummy.name = loc.name
|
|
else
|
|
possessed = new /obj/item/paper()
|
|
logTheThing("admin", usr, null, "living object mob created with no item.")
|
|
var/turf/T = get_turf(loc)
|
|
if (!T)
|
|
logTheThing("admin", usr, null, "additionally, no turf could be found at creation loc [loc]")
|
|
var/ASLoc = pick(latejoin)
|
|
if (ASLoc)
|
|
src.set_loc(ASLoc)
|
|
else
|
|
src.set_loc(locate(1, 1, 1))
|
|
else
|
|
src.set_loc(T)
|
|
canattack = 1
|
|
else
|
|
canattack = 1
|
|
possessed = loc
|
|
set_loc(get_turf(possessed))
|
|
|
|
if (!src.canattack)
|
|
src.density = 1
|
|
src.opacity = possessed.opacity
|
|
possessed.set_loc(src)
|
|
src.name = "living [possessed.name]"
|
|
src.real_name = src.name
|
|
src.desc = "[possessed.desc]"
|
|
src.icon = possessed.icon
|
|
src.icon_state = possessed.icon_state
|
|
src.pixel_x = possessed.pixel_x
|
|
src.pixel_y = possessed.pixel_y
|
|
src.dir = possessed.dir
|
|
src.color = possessed.color
|
|
src.overlays = possessed.overlays
|
|
src.item = possessed
|
|
src.sight |= SEE_SELF
|
|
src.density = possessed.density
|
|
src.opacity = possessed.opacity
|
|
|
|
release = new()
|
|
release.owner = src
|
|
|
|
src.owner = controller
|
|
if (src.owner)
|
|
src.owner.set_loc(src)
|
|
if (!src.owner.mind)
|
|
src.owner.mind = new /datum/mind( )
|
|
src.owner.mind.key = src.owner.key
|
|
src.owner.mind.current = src.owner
|
|
ticker.minds += src.owner.mind
|
|
//if (src.owner.client)
|
|
// src.owner.client.mob = src
|
|
src.owner.mind.transfer_to(src)
|
|
|
|
src.visible_message("<span style=\"color:red\"><b>[possessed] comes to life!</b></span>") // was [src] but: "the living space thing comes alive!"
|
|
animate_levitate(src, -1, 20, 1)
|
|
|
|
equipped()
|
|
if (canattack)
|
|
return src.item
|
|
else
|
|
return src.dummy
|
|
|
|
examine()
|
|
..()
|
|
boutput(usr, "<span style=\"color:red\">It seems to be alive.</span>")
|
|
if (health < 25)
|
|
boutput(usr, "<span style=\"color:blue\">The ethereal grip on this object appears to be weak.</span>")
|
|
|
|
meteorhit(var/obj/O as obj)
|
|
src.death(1)
|
|
return
|
|
|
|
restrained()
|
|
return 0
|
|
|
|
updatehealth()
|
|
return
|
|
|
|
Life(datum/controller/process/mobs/parent)
|
|
if (..(parent))
|
|
return 1
|
|
updatehealth()
|
|
|
|
if (owner)
|
|
if (owner.abilityHolder)
|
|
if (owner.abilityHolder.usesPoints)
|
|
owner.abilityHolder.generatePoints()
|
|
|
|
weakened = 0
|
|
paralysis = 0
|
|
stunned = 0
|
|
slowed = 0
|
|
sleeping = 0
|
|
change_misstep_chance(-INFINITY)
|
|
drowsyness = 0.0
|
|
dizziness = 0
|
|
is_dizzy = 0
|
|
is_jittery = 0
|
|
jitteriness = 0
|
|
|
|
if (!src.item)
|
|
src.death(0)
|
|
|
|
if (src.item.loc != src)
|
|
if (isturf(src.item.loc))
|
|
src.item.loc = src
|
|
else
|
|
src.death(0)
|
|
|
|
for (var/atom/A as obj|mob in src)
|
|
if (A != src.item && A != src.dummy && A != src.owner && !istype(A, /obj/screen) && !istype(A, /obj/hud))
|
|
if (isobj(A) || ismob(A)) // what the heck else would this be?
|
|
A:set_loc(src.loc)
|
|
|
|
src.density = src.item.density
|
|
src.item.dir = src.dir
|
|
src.icon = src.item.icon
|
|
src.icon_state = src.item.icon_state
|
|
src.color = src.item.color
|
|
src.overlays = src.item.overlays
|
|
|
|
bullet_act(var/obj/projectile/P)
|
|
var/damage = 0
|
|
damage = round((P.power*P.proj_data.ks_ratio), 1.0)
|
|
|
|
switch (P.proj_data.damage_type)
|
|
if (D_KINETIC)
|
|
src.TakeDamage(null, damage, 0)
|
|
if (D_PIERCING)
|
|
src.TakeDamage(null, damage / 2.0, 0)
|
|
if (D_SLASHING)
|
|
src.TakeDamage(null, damage, 0)
|
|
if (D_BURNING)
|
|
src.TakeDamage(null, 0, damage)
|
|
if (D_ENERGY)
|
|
src.TakeDamage(null, 0, damage)
|
|
|
|
if(!P.proj_data.silentshot)
|
|
src.visible_message("<span style=\"color:red\">[src] is hit by the [P]!</span>")
|
|
|
|
attack_hand(mob/user as mob)
|
|
if (user.a_intent == "help")
|
|
user.visible_message("<span style=\"color:red\">[user] pets [src]!</span>")
|
|
else
|
|
user.visible_message("<span style=\"color:red\">[user] punches [src]!</span>")
|
|
src.TakeDamage(null, rand(4, 7), 0)
|
|
|
|
TakeDamage(zone, brute, burn)
|
|
health -= burn
|
|
health -= brute
|
|
health = min(max_health, health)
|
|
if (src.health <= 0)
|
|
src.death(0)
|
|
|
|
HealDamage(zone, brute, burn)
|
|
TakeDamage(zone, -brute, -burn)
|
|
|
|
change_eye_blurry(var/amount, var/cap = 0)
|
|
if (amount < 0)
|
|
return ..()
|
|
else
|
|
return 1
|
|
|
|
take_eye_damage(var/amount, var/tempblind = 0)
|
|
if (amount < 0)
|
|
return ..()
|
|
else
|
|
return 1
|
|
|
|
take_ear_damage(var/amount, var/tempdeaf = 0)
|
|
if (amount < 0)
|
|
return ..()
|
|
else
|
|
return 1
|
|
|
|
click(atom/target, params)
|
|
if (target == src)
|
|
if (canattack)
|
|
src.item.attack_self(src)
|
|
else
|
|
if(!istype(src.item, /obj/item))
|
|
src.item.attack_hand(src)
|
|
else //This shouldnt ever happen.
|
|
src.item.attackby(src.item, src)
|
|
else
|
|
if(src.a_intent == INTENT_GRAB && istype(target, /atom/movable) && get_dist(src, target) <= 1)
|
|
var/atom/movable/M = target
|
|
if(ismob(target) || !M.anchored)
|
|
src.visible_message("<span style=\"color:red\">[src] grabs [target]!</span>")
|
|
M.set_loc(src.loc)
|
|
else
|
|
. = ..()
|
|
if (src.item.loc != src)
|
|
if (isturf(src.item.loc))
|
|
src.item.loc = src
|
|
else
|
|
src.death(0)
|
|
|
|
//To reflect updates of the items appearance etc caused by interactions.
|
|
src.name = "living [src.item.name]"
|
|
src.real_name = src.name
|
|
src.desc = "[src.item.desc]"
|
|
src.item.dir = src.dir
|
|
src.icon = src.item.icon
|
|
src.icon_state = src.item.icon_state
|
|
//src.pixel_x = src.item.pixel_x
|
|
//src.pixel_y = src.item.pixel_y
|
|
src.color = src.item.color
|
|
src.overlays = src.item.overlays
|
|
src.density = src.item.density
|
|
src.opacity = src.item.opacity
|
|
|
|
death(gibbed)
|
|
if (src.owner)
|
|
src.owner.set_loc(get_turf(src))
|
|
src.visible_message("<span style=\"color:red\"><b>[src] is no longer possessed.</b></span>")
|
|
|
|
if (src.mind)
|
|
mind.transfer_to(src.owner)
|
|
else if (src.client)
|
|
src.client.mob = src.owner
|
|
else
|
|
if(src.mind || src.client)
|
|
var/mob/dead/observer/O = new/mob/dead/observer(get_turf(src))
|
|
if (isrestrictedz(src.z) && !restricted_z_allowed(src, get_turf(src)) && !(src.client && src.client.holder))
|
|
var/OS = observer_start.len ? pick(observer_start) : locate(1, 1, 1)
|
|
if (OS)
|
|
O.set_loc(OS)
|
|
else
|
|
O.z = 1
|
|
if (src.client)
|
|
src.client.mob = O
|
|
O.name = src.name
|
|
O.real_name = src.real_name
|
|
if (src.mind)
|
|
src.mind.transfer_to(O)
|
|
|
|
if (src.item)
|
|
if (!gibbed)
|
|
src.item.dir = src.dir
|
|
if (src.item.loc == src)
|
|
src.item.set_loc(get_turf(src))
|
|
else
|
|
qdel(src.item)
|
|
qdel(src)
|
|
..(gibbed)
|
|
|
|
movement_delay()
|
|
return 4
|
|
|
|
put_in_hand(obj/item/I, hand)
|
|
return 0
|
|
|
|
swap_hand()
|
|
return 0
|
|
|
|
drop_item_v()
|
|
return 0
|
|
|
|
item_attack_message(var/mob/T, var/obj/item/S, var/d_zone)
|
|
if (d_zone)
|
|
return "<span style=\"color:red\"><B>[src] attacks [T] in the [d_zone]!</B></span>"
|
|
else
|
|
return "<span style=\"color:red\"><B>[src] attacks [T]!</B></span>" |