This commit is contained in:
Zuhayr
2014-12-24 22:50:13 +10:30
11 changed files with 116 additions and 164 deletions

View File

@@ -52,7 +52,7 @@
if(stat == DEAD)
return 0
if(!gibbed)
if(!gibbed && deathmessage != "no message") // This is gross, but reliable. Only brains use it.
src.visible_message("<b>\The [src.name]</b> [deathmessage]")
stat = DEAD

View File

@@ -73,6 +73,7 @@
brainmob.mind.transfer_to(target)
else
target.key = brainmob.key
..()
/obj/item/organ/brain/slime
name = "slime core"

View File

@@ -1,7 +1,9 @@
/mob/living/carbon/brain/death(gibbed)
if(!gibbed && istype(container, /obj/item/device/mmi)) //If not gibbed but in a container.
container.icon_state = "mmi_dead"
return ..(gibbed,"beeps shrilly as the MMI flatlines!")
return ..(gibbed,"beeps shrilly as the MMI flatlines!")
else
return ..(gibbed,"no message")
/mob/living/carbon/brain/gib()
if(istype(container, /obj/item/device/mmi))

View File

@@ -1,5 +1,12 @@
/mob/living/carbon/human/gib()
for(var/datum/organ/internal/I in internal_organs)
var/obj/item/organ/current_organ = I.remove()
if(current_organ)
if(istype(loc,/turf))
current_organ.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
current_organ.removed(src)
for(var/datum/organ/external/E in src.organs)
if(istype(E, /datum/organ/external/chest))
continue
@@ -8,24 +15,6 @@
// Override the current limb status and don't cause an explosion
E.droplimb(1,1)
for(var/datum/organ/internal/I in internal_organs)
var/obj/item/organ/current_organ = I.remove()
current_organ.loc = src.loc
current_organ.organ_data.rejecting = null
var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in current_organ.reagents.reagent_list
if(!organ_blood || !organ_blood.data["blood_DNA"])
src.vessel.trans_to(current_organ, 5, 1, 1)
current_organ.removed(src)
if(current_organ && istype(loc,/turf))
var/target_dir = pick(cardinal)
var/turf/target_turf = loc
var/steps = rand(1,2)
for(var/i = 0;i<steps;i++)
target_turf = get_step(target_turf,target_dir)
current_organ.throw_at(target_turf)
..(species.gibbed_anim)
gibs(loc, viruses, dna, null, species.flesh_color, species.blood_color)

View File

@@ -944,7 +944,11 @@
vessel.add_reagent("blood",560-vessel.total_volume)
fixblood()
for (var/obj/item/weapon/organ/head/H in world)
// Fix up any missing organs.
// This will ignore any prosthetics in the prefs currently.
species.create_organs(src)
for (var/obj/item/organ/brain/H in world)
if(H.brainmob)
if(H.brainmob.real_name == src.real_name)
if(H.brainmob.mind)
@@ -1144,6 +1148,13 @@
vessel.add_reagent("blood",560-vessel.total_volume)
fixblood()
// Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them.
if(client && client.screen)
client.screen.len = null
if(hud_used)
del(hud_used)
hud_used = new /datum/hud(src)
if(species)
return 1
else

View File

@@ -598,10 +598,7 @@ Note that amputating the affected organ does in fact remove the infection from t
var/obj/organ //Dropped limb object
switch(body_part)
if(HEAD)
if(owner.species.flags & IS_SYNTHETIC)
organ= new /obj/item/weapon/organ/head/posi(owner.loc, owner)
else
organ= new /obj/item/weapon/organ/head(owner.loc, owner)
organ= new /obj/item/weapon/organ/head(owner.loc, owner)
owner.u_equip(owner.glasses)
owner.u_equip(owner.head)
owner.u_equip(owner.l_ear)
@@ -1003,6 +1000,8 @@ Note that amputating the affected organ does in fact remove the infection from t
obj/item/weapon/organ
icon = 'icons/mob/human_races/r_human.dmi'
var/op_stage = 0
var/list/organs_internal = list()
obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
..(loc)
@@ -1013,9 +1012,18 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
blood_DNA = list()
blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
//Forming icon for the limb
// Transferring over organs from the host.
for(var/datum/organ/internal/I in H.internal_organs)
if(I.parent_organ != name)
continue
var/obj/item/organ/current_organ = I.remove()
current_organ.removed(H)
current_organ.loc = src
if(current_organ.organ_data)
organs_internal |= current_organ.organ_data
//Setting base icon for this mob's race
// Forming icon for the limb
// Setting base icon for this mob's race
var/icon/base
if(H.species && H.species.icobase)
base = icon(H.species.icobase)
@@ -1068,15 +1076,9 @@ obj/item/weapon/organ/r_hand
obj/item/weapon/organ/r_leg
name = "right leg"
icon_state = "r_leg"
obj/item/weapon/organ/head
name = "head"
icon_state = "head_m"
var/mob/living/carbon/brain/brainmob
var/brain_op_stage = 0
/obj/item/weapon/organ/head/posi
name = "robotic head"
obj/item/weapon/organ/head/New(loc, mob/living/carbon/human/H)
if(istype(H))
@@ -1100,81 +1102,32 @@ obj/item/weapon/organ/head/New(loc, mob/living/carbon/human/H)
hair.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD)
overlays.Add(hair) //icon.Blend(hair, ICON_OVERLAY)
spawn(5)
if(brainmob && brainmob.client)
brainmob.client.screen.len = null //clear the hud
//if(ishuman(H))
// if(H.gender == FEMALE)
// H.icon_state = "head_f"
// H.overlays += H.generate_head_icon()
transfer_identity(H)
name = "[H.real_name]'s head"
H.regenerate_icons()
brainmob.stat = 2
brainmob.death()
obj/item/weapon/organ/head/proc/transfer_identity(var/mob/living/carbon/human/H)//Same deal as the regular brain proc. Used for human-->head
brainmob = new(src)
brainmob.name = H.real_name
brainmob.real_name = H.real_name
brainmob.dna = H.dna.Clone()
if(H.mind)
H.mind.transfer_to(brainmob)
brainmob.container = src
obj/item/weapon/organ/head/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/scalpel))
switch(brain_op_stage)
if(0)
for(var/mob/O in (oviewers(brainmob) - user))
O.show_message("\red [brainmob] is beginning to have \his head cut open with [W] by [user].", 1)
brainmob << "\red [user] begins to cut open your head with [W]!"
user << "\red You cut [brainmob]'s head open with [W]!"
brain_op_stage = 1
if(2)
for(var/mob/O in (oviewers(brainmob) - user))
O.show_message("\red [brainmob] is having \his connections to the brain delicately severed with [W] by [user].", 1)
brainmob << "\red [user] begins to cut open your head with [W]!"
user << "\red You cut [brainmob]'s head open with [W]!"
brain_op_stage = 3.0
else
..()
else if(istype(W,/obj/item/weapon/circular_saw))
switch(brain_op_stage)
if(1)
for(var/mob/O in (oviewers(brainmob) - user))
O.show_message("\red [brainmob] has \his head sawed open with [W] by [user].", 1)
brainmob << "\red [user] begins to saw open your head with [W]!"
user << "\red You saw [brainmob]'s head open with [W]!"
brain_op_stage = 2
if(3)
for(var/mob/O in (oviewers(brainmob) - user))
O.show_message("\red [brainmob] has \his spine's connection to the brain severed with [W] by [user].", 1)
brainmob << "\red [user] severs your brain's connection to the spine with [W]!"
user << "\red You sever [brainmob]'s brain's connection to the spine with [W]!"
user.attack_log += "\[[time_stamp()]\]<font color='red'> Debrained [brainmob.name] ([brainmob.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)])</font>"
brainmob.attack_log += "\[[time_stamp()]\]<font color='orange'> Debrained by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)])</font>"
msg_admin_attack("[user] ([user.ckey]) debrained [brainmob] ([brainmob.ckey]) (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
//TODO: ORGAN REMOVAL UPDATE.
if(istype(src,/obj/item/weapon/organ/head/posi))
var/obj/item/device/mmi/digital/posibrain/B = new(loc)
B.transfer_identity(brainmob)
obj/item/weapon/organ/attackby(obj/item/weapon/W as obj, mob/user as mob)
switch(op_stage)
if(0)
if(istype(W,/obj/item/weapon/scalpel))
user.visible_message("<span class='danger'><b>[user]</b> cuts [src] open with [W]!")
op_stage++
return
if(1)
if(istype(W,/obj/item/weapon/retractor))
user.visible_message("<span class='danger'><b>[user]</b> cracks [src] open like an egg with [W]!")
op_stage++
return
if(2)
if(istype(W,/obj/item/weapon/hemostat))
if(contents.len)
var/obj/item/removing = pick(contents)
removing.loc = src.loc
if(istype(removing,/obj/item/organ))
var/obj/item/organ/removed_organ = removing
organs_internal -= removed_organ.organ_data
user.visible_message("<span class='danger'><b>[user]</b> extracts [removing] from [src] with [W]!")
else
var/obj/item/organ/brain/B = new(loc)
B.transfer_identity(brainmob)
brain_op_stage = 4.0
else
..()
else
..()
user.visible_message("<span class='danger'><b>[user]</b> fishes around fruitlessly in [src] with [W].")
return
..()

View File

@@ -16,6 +16,7 @@
var/rejecting // Is this organ already being rejected?
var/obj/item/organ/organ_holder // If not in a body, held in this item.
var/list/transplant_data
/datum/organ/internal/proc/rejuvenate()
damage=0

View File

@@ -151,11 +151,24 @@
/obj/item/organ/appendix
name = "appendix"
/obj/item/organ/proc/removed(var/mob/living/target,var/mob/living/user)
/obj/item/organ/proc/removed(var/mob/living/carbon/human/target,var/mob/living/user)
if(!target)
if(!istype(target) || !organ_data)
return
target.internal_organs_by_name[organ_tag] = null
target.internal_organs_by_name -= organ_tag
target.internal_organs -= organ_data
var/datum/organ/external/affected = target.get_organ(organ_data.parent_organ)
affected.internal_organs -= organ_data
loc = target.loc
organ_data.rejecting = null
var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
if(!organ_blood || !organ_blood.data["blood_DNA"])
target.vessel.trans_to(src, 5, 1, 1)
if(target && user && organ_data.vital)
user.attack_log += "\[[time_stamp()]\]<font color='red'> removed a vital organ ([src]) from [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)])</font>"
target.attack_log += "\[[time_stamp()]\]<font color='orange'> had a vital organ ([src]) removed by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])</font>"
@@ -196,18 +209,40 @@
H.b_eyes = 0
H.update_body()
/obj/item/organ/proc/replaced(var/mob/living/target)
return
/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target,var/datum/organ/external/affected)
/obj/item/organ/eyes/replaced(var/mob/living/target)
if(!istype(target)) return
var/datum/reagent/blood/transplant_blood = locate(/datum/reagent/blood) in reagents.reagent_list
if(!transplant_blood)
organ_data.transplant_data = list()
organ_data.transplant_data["species"] = target.species.name
organ_data.transplant_data["blood_type"] = target.dna.b_type
organ_data.transplant_data["blood_DNA"] = target.dna.unique_enzymes
else
organ_data.transplant_data = list()
organ_data.transplant_data["species"] = transplant_blood.data["species"]
organ_data.transplant_data["blood_type"] = transplant_blood.data["blood_type"]
organ_data.transplant_data["blood_DNA"] = transplant_blood.data["blood_DNA"]
organ_data.organ_holder = null
organ_data.owner = target
target.internal_organs |= organ_data
affected.internal_organs |= organ_data
target.internal_organs_by_name[organ_tag] = organ_data
organ_data.status |= ORGAN_CUT_AWAY
del(src)
/obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target)
// Apply our eye colour to the target.
var/mob/living/carbon/human/H = target
if(istype(H) && eye_colour)
H.r_eyes = eye_colour[1]
H.g_eyes = eye_colour[2]
H.b_eyes = eye_colour[3]
H.update_body()
if(istype(target) && eye_colour)
target.r_eyes = eye_colour[1]
target.g_eyes = eye_colour[2]
target.b_eyes = eye_colour[3]
target.update_body()
..()
/obj/item/organ/proc/bitten(mob/user)

View File

@@ -181,11 +181,11 @@
target.update_body()
target.updatehealth()
target.UpdateDamageIcon()
var/obj/item/weapon/organ/head/B = tool
if (B.brainmob.mind)
B.brainmob.mind.transfer_to(target)
del(B)
for(var/obj/item/organ/replacing_organ in tool)
replacing_organ.loc = get_turf(tool)
replacing_organ.replaced(target,affected)
del(replacing_organ) //Just in case.
del(tool)
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)

View File

@@ -314,30 +314,12 @@
// Extract the organ!
if(target.op_stage.current_organ)
var/datum/organ/external/affected = target.get_organ(target_zone)
var/datum/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ]
var/obj/item/organ/O
if(I && istype(I))
O = I.remove(user)
if(O && istype(O))
// Stop the organ from continuing to reject.
O.organ_data.rejecting = null
// Transfer over some blood data, if the organ doesn't have data.
var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in O.reagents.reagent_list
if(!organ_blood || !organ_blood.data["blood_DNA"])
target.vessel.trans_to(O, 5, 1, 1)
// Kinda redundant, but I'm getting some buggy behavior.
target.internal_organs_by_name[target.op_stage.current_organ] = null
target.internal_organs_by_name -= target.op_stage.current_organ
target.internal_organs -= O.organ_data
affected.internal_organs -= O.organ_data
O.removed(target,user)
target.op_stage.current_organ = null
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -409,30 +391,8 @@
"\blue You have transplanted \the [tool] into [target]'s [affected.display_name].")
user.drop_item(tool)
var/obj/item/organ/O = tool
if(istype(O))
var/datum/reagent/blood/transplant_blood = locate(/datum/reagent/blood) in O.reagents.reagent_list
if(!transplant_blood)
O.organ_data.transplant_data = list()
O.organ_data.transplant_data["species"] = target.species.name
O.organ_data.transplant_data["blood_type"] = target.dna.b_type
O.organ_data.transplant_data["blood_DNA"] = target.dna.unique_enzymes
else
O.organ_data.transplant_data = list()
O.organ_data.transplant_data["species"] = transplant_blood.data["species"]
O.organ_data.transplant_data["blood_type"] = transplant_blood.data["blood_type"]
O.organ_data.transplant_data["blood_DNA"] = transplant_blood.data["blood_DNA"]
O.organ_data.organ_holder = null
O.organ_data.owner = target
target.internal_organs |= O.organ_data
affected.internal_organs |= O.organ_data
target.internal_organs_by_name[O.organ_tag] = O.organ_data
O.organ_data.status |= ORGAN_CUT_AWAY
O.replaced(target)
del(O)
O.replaced(target,affected)
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\red [user]'s hand slips, damaging \the [tool]!", \