Merge branch 'master' of https://github.com/Baystation12/Baystation12 into bs12_with_tgport
Conflicts: code/datums/disease.dm code/modules/reagents/Chemistry-Reagents.dm icons/turf/areas.dmi maps/tgstation.2.0.9.1.dmm yep, this time going to merge map updates before making map changes >.> Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
@@ -786,7 +786,6 @@
|
||||
#include "code\game\objects\structures\noticeboard.dm"
|
||||
#include "code\game\objects\structures\shuttle_engines.dm"
|
||||
#include "code\game\objects\structures\tables_racks.dm"
|
||||
#include "code\game\objects\structures\tank_dispenser.dm"
|
||||
#include "code\game\objects\structures\target_stake.dm"
|
||||
#include "code\game\objects\structures\watercloset.dm"
|
||||
#include "code\game\objects\structures\windoor_assembly.dm"
|
||||
|
||||
@@ -1028,6 +1028,29 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u
|
||||
return ..()
|
||||
if (istype(src, /obj/machinery/atmospherics/pipe/vent))
|
||||
return ..()
|
||||
|
||||
// ===== Handle paints =====
|
||||
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/red))
|
||||
src.color = "red"
|
||||
user << "\red You paint the pipe red."
|
||||
update_icon()
|
||||
return 1
|
||||
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/blue))
|
||||
src.color = "blue"
|
||||
user << "\red You paint the pipe blue."
|
||||
update_icon()
|
||||
return 1
|
||||
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/green))
|
||||
src.color = "green"
|
||||
user << "\red You paint the pipe green."
|
||||
update_icon()
|
||||
return 1
|
||||
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/yellow))
|
||||
src.color = "yellow"
|
||||
user << "\red You paint the pipe yellow."
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
if (!istype(W, /obj/item/weapon/wrench))
|
||||
return ..()
|
||||
var/turf/T = src.loc
|
||||
@@ -1052,4 +1075,4 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u
|
||||
if (meter.target == src)
|
||||
new /obj/item/pipe_meter(T)
|
||||
del(meter)
|
||||
del(src)
|
||||
del(src)
|
||||
|
||||
@@ -1,7 +1,28 @@
|
||||
|
||||
//check if mob is lying down on something we can operate him on.
|
||||
/proc/can_operate(mob/living/carbon/M)
|
||||
return (locate(/obj/machinery/optable, M.loc) && M.resting) || \
|
||||
(locate(/obj/structure/stool/bed/roller, M.loc) && \
|
||||
(M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || \
|
||||
(locate(/obj/structure/table/, M.loc) && \
|
||||
(M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))
|
||||
|
||||
/datum/surgery_status/
|
||||
var/eyes = 0
|
||||
var/face = 0
|
||||
var/appendix = 0
|
||||
|
||||
/mob/living/carbon/var/datum/surgery_status/op_stage = new/datum/surgery_status
|
||||
|
||||
/* SURGERY STEPS */
|
||||
|
||||
/datum/surgery_step
|
||||
// type path referencing the required tool for this step
|
||||
var/required_tool = null
|
||||
|
||||
// type path referencing tools that can be used as substitude for this step
|
||||
var/list/allowed_tools = null
|
||||
|
||||
// When multiple steps can be applied with the current tool etc., choose the one with higher priority
|
||||
|
||||
// checks whether this step can be applied with the given user and target
|
||||
@@ -27,26 +48,6 @@
|
||||
// evil infection stuff that will make everyone hate me
|
||||
var/can_infect = 0
|
||||
|
||||
/datum/surgery_step/cut_open_abdomen
|
||||
required_tool = /obj/item/weapon/scalpel
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return target_zone == "groin"
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts cutting open [target]'s abdomen with \the [tool]", "You start cutting open [user] with \the [tool]")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/groin = target.get_organ("groin")
|
||||
groin.open = 1
|
||||
|
||||
/datum/surgery_step/remove_appendix
|
||||
required_tool = /obj/item/weapon/scalpel
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/groin = target.get_organ("groin")
|
||||
return target_zone == "groin" && groin.open
|
||||
|
||||
// Build this list by iterating over all typesof(/datum/surgery_step) and sorting the results by priority
|
||||
var/global/list/surgery_steps = null
|
||||
|
||||
@@ -56,3 +57,781 @@ proc/build_surgery_steps_list()
|
||||
var/datum/surgery_step/S = new T
|
||||
surgery_steps += S
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// COMMON STEPS //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
/datum/surgery_step/generic/
|
||||
var/datum/organ/external/affected //affected organ
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return 0
|
||||
affected = target.get_organ(target_zone)
|
||||
if (affected == null)
|
||||
return 0
|
||||
return target_zone != "eyes" //there are specific steps for eye surgery
|
||||
|
||||
/datum/surgery_step/generic/cut_open
|
||||
required_tool = /obj/item/weapon/scalpel
|
||||
|
||||
min_duration = 90
|
||||
max_duration = 110
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && affected.open == 0 && target_zone != "mouth"
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("[user] starts the incision on [target]'s [affected.display_name] with \the [tool].", \
|
||||
"You start the incision on [target]'s [affected.display_name] with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\blue [user] has made an incision on [target]'s [affected.display_name] with \the [tool].", \
|
||||
"\blue You have made an incision on [target]'s [affected.display_name] with \the [tool].",)
|
||||
affected.open = 1
|
||||
affected.createwound(CUT, 1)
|
||||
if (target_zone == "head")
|
||||
target.brain_op_stage = 1
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!", \
|
||||
"\red Your hand slips, slicing open [target]'s [affected.display_name] in a wrong spot with \the [tool]!")
|
||||
affected.createwound(CUT, 10)
|
||||
|
||||
/datum/surgery_step/generic/clamp_bleeders
|
||||
required_tool = /obj/item/weapon/hemostat
|
||||
|
||||
min_duration = 40
|
||||
max_duration = 60
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && affected.open && (affected.status & ORGAN_BLEEDING)
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("[user] starts clamping bleeders in [target]'s [affected.display_name] with \the [tool].", \
|
||||
"You start clamping bleeders in [target]'s [affected.display_name] with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\blue [user] clamps bleeders in [target]'s [affected.display_name] with \the [tool].", \
|
||||
"\blue You clamp bleeders in [target]'s [affected.display_name] with \the [tool].")
|
||||
affected.bandage()
|
||||
affected.status &= ~ORGAN_BLEEDING
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, tearing blood vessals and causing massive bleeding in [target]'s [affected.display_name] with the \[tool]!", \
|
||||
"\red Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.display_name] with \the [tool]!",)
|
||||
affected.createwound(CUT, 10)
|
||||
|
||||
/datum/surgery_step/generic/retract_skin
|
||||
required_tool = /obj/item/weapon/retractor
|
||||
|
||||
min_duration = 30
|
||||
max_duration = 40
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && affected.open < 2 && !(affected.status & ORGAN_BLEEDING)
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
var/msg = "[user] starts to pry open the incision on [target]'s [affected.display_name] with \the [tool]."
|
||||
var/self_msg = "You start to pry open the incision on [target]'s [affected.display_name] with \the [tool]."
|
||||
if (target_zone == "chest")
|
||||
msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
|
||||
self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
|
||||
if (target_zone == "groin")
|
||||
msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
|
||||
self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
|
||||
user.visible_message(msg, self_msg)
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
var/msg = "\blue [user] keeps the incision open on [target]'s [affected.display_name] with \the [tool]."
|
||||
var/self_msg = "\blue You keep the incision open on [target]'s [affected.display_name] with \the [tool]."
|
||||
if (target_zone == "chest")
|
||||
msg = "\blue [user] keeps the ribcage open on [target]'s torso with \the [tool]."
|
||||
self_msg = "\blue You keep the ribcage open on [target]'s torso with \the [tool]."
|
||||
if (target_zone == "groin")
|
||||
msg = "\blue [user] keeps the incision open on [target]'s lower abdomen with \the [tool]."
|
||||
self_msg = "\blue You keep the incision open on [target]'s lower abdomen with \the [tool]."
|
||||
user.visible_message(msg, self_msg)
|
||||
affected.open = 2
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
var/msg = "\red [user]'s hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!"
|
||||
var/self_msg = "\red Your hand slips, tearing the edges of incision on [target]'s [affected.display_name] with \the [tool]!"
|
||||
if (target_zone == "chest")
|
||||
msg = "\red [user]'s hand slips, damaging several organs [target]'s torso with \the [tool]!"
|
||||
self_msg = "\red Your hand slips, damaging several organs [target]'s torso with \the [tool]!"
|
||||
if (target_zone == "groin")
|
||||
msg = "\red [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]"
|
||||
self_msg = "\red Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!"
|
||||
user.visible_message(msg, self_msg)
|
||||
target.apply_damage(12, BRUTE, affected)
|
||||
|
||||
/datum/surgery_step/generic/cauterize
|
||||
required_tool = /obj/item/weapon/cautery
|
||||
|
||||
min_duration = 70
|
||||
max_duration = 100
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && affected.open && target_zone != "mouth"
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool]." , \
|
||||
"You are beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\blue [user] cauterizes the incision on [target]'s [affected.display_name] with \the [tool].", \
|
||||
"\blue You cauterize the incision on [target]'s [affected.display_name] with \the [tool].")
|
||||
affected.open = 0
|
||||
affected.status &= ~ORGAN_BLEEDING
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, leaving a small burn on [target]'s [affected.display_name] with \the [tool]!", \
|
||||
"\red Your hand slips, leaving a small burn on [target]'s [affected.display_name] with \the [tool]!")
|
||||
target.apply_damage(3, BURN, affected)
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// APPENDECTOMY //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/surgery_step/appendectomy/
|
||||
var/datum/organ/external/groin
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (target_zone != "groin")
|
||||
return 0
|
||||
groin = target.get_organ("groin")
|
||||
if (!groin)
|
||||
return 0
|
||||
if (groin.open < 2)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/surgery_step/appendectomy/cut_appendix
|
||||
required_tool = /obj/item/weapon/scalpel
|
||||
|
||||
min_duration = 70
|
||||
max_duration = 90
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.op_stage.appendix == 0
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts to separating [target]'s appendix from the abdominal wall with \the [tool].", \
|
||||
"You start to separating [target]'s appendix from the abdominal wall with \the [tool]." )
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] has separated [target]'s appendix with \the [tool]." , \
|
||||
"\blue You have separated [target]'s appendix with \the [tool].")
|
||||
target.op_stage.appendix = 1
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/groin = target.get_organ("groin")
|
||||
user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s abdomen with \the [tool]!", \
|
||||
"\red Your hand slips, slicing an artery inside [target]'s abdomen with \the [tool]!")
|
||||
groin.createwound(CUT, 50)
|
||||
|
||||
/datum/surgery_step/appendectomy/remove_appendix
|
||||
required_tool = /obj/item/weapon/hemostat
|
||||
|
||||
min_duration = 60
|
||||
max_duration = 80
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.op_stage.appendix == 1
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts removing [target]'s appendix with \the [tool].", \
|
||||
"You start removing [target]'s appendix with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] has removed [target]'s appendix with \the [tool].", \
|
||||
"\blue You have removed [target]'s appendix with \the [tool].")
|
||||
var/datum/disease/appendicitis/app = null
|
||||
for(var/datum/disease/appendicitis/appendicitis in target.viruses)
|
||||
app = appendicitis
|
||||
appendicitis.cure()
|
||||
if (app)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed(get_turf(target))
|
||||
else
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(target))
|
||||
target.resistances += app
|
||||
target.op_stage.appendix = 2
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, nicking internal organs in [target]'s abdomen with \the [tool]!", \
|
||||
"\red Your hand slips, nicking internal organs in [target]'s abdomen with \the [tool]!")
|
||||
affected.createwound(BRUISE, 20)
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// INTERNAL WOUND PATCHING //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/datum/surgery_step/fix_vein
|
||||
required_tool = /obj/item/weapon/FixOVein
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
|
||||
var/internal_bleeding = 0
|
||||
for(var/datum/wound/W in affected.wounds) if(W.internal)
|
||||
internal_bleeding = 1
|
||||
break
|
||||
|
||||
return affected.open == 2 && internal_bleeding
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
if (affected.stage == 0)
|
||||
user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.display_name] with \the [tool]." , \
|
||||
"You start patching the damaged vein in [target]'s [affected.display_name] with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\blue [user] has patched the damaged vein in [target]'s [affected.display_name] with \the [tool].", \
|
||||
"\blue You have patched the damaged vein in [target]'s [affected.display_name] with \the [tool].")
|
||||
|
||||
for(var/datum/wound/W in affected.wounds) if(W.internal)
|
||||
affected.wounds -= W
|
||||
affected.update_damages()
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
|
||||
"\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
|
||||
affected.take_damage(5, 0)
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// BONE SURGERY //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/surgery_step/glue_bone
|
||||
required_tool = /obj/item/weapon/bonegel
|
||||
|
||||
min_duration = 50
|
||||
max_duration = 60
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
return affected.open == 2 && affected.stage == 0
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
if (affected.stage == 0)
|
||||
user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool]." , \
|
||||
"You start applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\blue [user] applies some [tool] to [target]'s bone in [affected.display_name]", \
|
||||
"\blue You apply some [tool] to [target]'s bone in [affected.display_name] with \the [tool].")
|
||||
affected.stage = 1
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
|
||||
"\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
|
||||
|
||||
/datum/surgery_step/set_bone
|
||||
required_tool = /obj/item/weapon/bonesetter
|
||||
|
||||
min_duration = 60
|
||||
max_duration = 70
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
return affected.name != "head" && affected.open == 2 && affected.stage == 1
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("[user] is beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool]." , \
|
||||
"You are beginning to set the bone in [target]'s [target_zone] in place with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
if (affected.status & ORGAN_BROKEN)
|
||||
user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name] in place with \the [tool].", \
|
||||
"\blue You set the bone in [target]'s [affected.display_name] in place with \the [tool].")
|
||||
affected.stage = 2
|
||||
else
|
||||
user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].", \
|
||||
"\blue You set the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].")
|
||||
affected.fracture()
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, damaging the bone in [target]'s [affected.display_name] with \the [tool]!" , \
|
||||
"\red Your hand slips, damaging the bone in [target]'s [affected.display_name] with \the [tool]!")
|
||||
affected.createwound(BRUISE, 5)
|
||||
|
||||
/datum/surgery_step/mend_skull
|
||||
required_tool = /obj/item/weapon/bonesetter
|
||||
|
||||
min_duration = 60
|
||||
max_duration = 70
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
return affected.name == "head" && affected.open == 2 && affected.stage == 1
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] is beginning piece together [target]'s skull with \the [tool]." , \
|
||||
"You are beginning piece together [target]'s skull with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\blue [user] sets [target]'s [affected.display_name] skull with \the [tool]." , \
|
||||
"\blue You set [target]'s [affected.display_name] skull with \the [tool].")
|
||||
affected.stage = 2
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, damaging [target]'s [affected.display_name] face with \the [tool]!" , \
|
||||
"\red Your hand slips, damaging [target]'s [affected.display_name] face with \the [tool]!")
|
||||
var/datum/organ/external/head/h = affected
|
||||
h.createwound(BRUISE, 10)
|
||||
h.disfigured = 1
|
||||
|
||||
/datum/surgery_step/finish_bone
|
||||
required_tool = /obj/item/weapon/bonegel
|
||||
|
||||
min_duration = 50
|
||||
max_duration = 60
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
return affected.open == 2 && affected.stage == 2
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("[user] starts to finish mending the damaged bones in [target]'s [affected.display_name] with \the [tool].", \
|
||||
"You start to finish mending the damaged bones in [target]'s [affected.display_name] with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\blue [user] has mended the damaged bones in [target]'s [affected.display_name] with \the [tool]." , \
|
||||
"\blue You have mended the damaged bones in [target]'s [affected.display_name] with \the [tool]." )
|
||||
affected.status &= ~ORGAN_BROKEN
|
||||
affected.status &= ~ORGAN_SPLINTED
|
||||
affected.stage = 0
|
||||
affected.perma_injury = 0
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!" , \
|
||||
"\red Your hand slips, smearing [tool] in the incision in [target]'s [affected.display_name]!")
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// EYE SURGERY //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/surgery_step/eye
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return 0
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
if (!affected)
|
||||
return 0
|
||||
return target_zone == "eyes"
|
||||
|
||||
/datum/surgery_step/eye/cut_open
|
||||
required_tool = /obj/item/weapon/scalpel
|
||||
|
||||
min_duration = 90
|
||||
max_duration = 110
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..()
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts to separate the corneas on [target]'s eyes with \the [tool].", \
|
||||
"You start to separate the corneas on [target]'s eyes with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] has separated the corneas on [target]'s eyes with \the [tool]." , \
|
||||
"\blue You have separated the corneas on [target]'s eyes with \the [tool].",)
|
||||
target.op_stage.eyes = 1
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \
|
||||
"\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" )
|
||||
affected.createwound(CUT, 10)
|
||||
|
||||
/datum/surgery_step/eye/lift_eyes
|
||||
required_tool = /obj/item/weapon/retractor
|
||||
|
||||
min_duration = 30
|
||||
max_duration = 40
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.op_stage.eyes == 1
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts lifting corneas from [target]'s eyes with \the [tool].", \
|
||||
"You start lifting corneas from [target]'s eyes with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] has lifted the corneas from [target]'s eyes from with \the [tool]." , \
|
||||
"\blue You has lifted the corneas from [target]'s eyes from with \the [tool]." )
|
||||
target.op_stage.eyes = 2
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \
|
||||
"\red Your hand slips, damaging [target]'s eyes with \the [tool]!")
|
||||
target.apply_damage(10, BRUTE, affected)
|
||||
|
||||
/datum/surgery_step/eye/mend_eyes
|
||||
required_tool = /obj/item/weapon/hemostat
|
||||
|
||||
min_duration = 80
|
||||
max_duration = 100
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.op_stage.eyes == 2
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts mending the nerves and lenses in [target]'s eyes with \the [tool].", \
|
||||
"You start mending the nerves and lenses in [target]'s eyes with the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] mends the nerves and lenses in [target]'s with \the [tool]." , \
|
||||
"\blue You mend the nerves and lenses in [target]'s with \the [tool].")
|
||||
target.op_stage.eyes = 3
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \
|
||||
"\red Your hand slips, stabbing \the [tool] into [target]'s eye!")
|
||||
target.apply_damage(10, BRUTE, affected)
|
||||
|
||||
/datum/surgery_step/eye/cauterize
|
||||
required_tool = /obj/item/weapon/cautery
|
||||
|
||||
min_duration = 70
|
||||
max_duration = 100
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..()
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] is beginning to cauterize the incision around [target]'s eyes with \the [tool]." , \
|
||||
"You are beginning to cauterize the incision around [target]'s eyes with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \
|
||||
"\blue You cauterize the incision around [target]'s eyes with \the [tool].")
|
||||
if (target.op_stage.eyes == 3)
|
||||
target.sdisabilities &= ~BLIND
|
||||
target.eye_stat = 0
|
||||
target.op_stage.eyes = 0
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \
|
||||
"\red Your hand slips, searing [target]'s eyes with \the [tool]!")
|
||||
target.apply_damage(5, BURN, affected)
|
||||
target.eye_stat += 5
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// FACE SURGERY //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/surgery_step/face
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
if (!hasorgans(target))
|
||||
return 0
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
if (!affected)
|
||||
return 0
|
||||
return target_zone == "mouth" && affected.open == 2 && !(affected.status & ORGAN_BLEEDING)
|
||||
|
||||
/datum/surgery_step/generic/cut_face
|
||||
required_tool = /obj/item/weapon/scalpel
|
||||
|
||||
min_duration = 90
|
||||
max_duration = 110
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target_zone == "mouth" && target.op_stage.face == 0
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts to cut open [target]'s face and neck with \the [tool].", \
|
||||
"You start to cut open [target]'s face and neck with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] has cut open [target]'s face and neck with \the [tool]." , \
|
||||
"\blue You have cut open [target]'s face and neck with \the [tool].",)
|
||||
target.op_stage.face = 1
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \
|
||||
"\red Your hand slips, slicing [target]'s throat wth \the [tool]!" )
|
||||
affected.createwound(CUT, 60)
|
||||
target.losebreath += 10
|
||||
|
||||
/datum/surgery_step/face/mend_vocal
|
||||
required_tool = /obj/item/weapon/hemostat
|
||||
|
||||
min_duration = 70
|
||||
max_duration = 90
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.op_stage.face == 1
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts mending [target]'s vocal cords with \the [tool].", \
|
||||
"You start mending [target]'s vocal cords with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] mends [target]'s vocal cords with \the [tool].", \
|
||||
"\blue You mend [target]'s vocal cords with \the [tool].")
|
||||
target.op_stage.face = 2
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\red [user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \
|
||||
"\red Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!")
|
||||
target.losebreath += 10
|
||||
|
||||
/datum/surgery_step/face/fix_face
|
||||
required_tool = /obj/item/weapon/retractor
|
||||
|
||||
min_duration = 80
|
||||
max_duration = 100
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.op_stage.face == 2
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts pulling skin on [target]'s face back in place with \the [tool].", \
|
||||
"You start pulling skin on [target]'s face back in place with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] pulls skin on [target]'s face back in place with \the [tool].", \
|
||||
"\blue You pull skin on [target]'s face back in place with \the [tool].")
|
||||
target.op_stage.face = 3
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \
|
||||
"\red Your hand slips, tearing skin on [target]'s face with \the [tool]!")
|
||||
target.apply_damage(10, BRUTE, affected)
|
||||
|
||||
/datum/surgery_step/face/cauterize
|
||||
required_tool = /obj/item/weapon/cautery
|
||||
|
||||
min_duration = 70
|
||||
max_duration = 100
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.op_stage.face > 0
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] is beginning to cauterize the incision on [target]'s face and neck with \the [tool]." , \
|
||||
"You are beginning to cauterize the incision on [target]'s face and neck with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\blue [user] cauterizes the incision on [target]'s face and neck with \the [tool].", \
|
||||
"\blue You cauterize the incision on [target]'s face and neck with \the [tool].")
|
||||
affected.open = 0
|
||||
affected.status &= ~ORGAN_BLEEDING
|
||||
if (target.op_stage.face == 3)
|
||||
var/datum/organ/external/head/h = affected
|
||||
h.disfigured = 0
|
||||
target.op_stage.face = 0
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
var/datum/organ/external/affected = target.get_organ(target_zone)
|
||||
user.visible_message("\red [user]'s hand slips, leaving a small burn on [target]'s face with \the [tool]!", \
|
||||
"\red Your hand slips, leaving a small burn on [target]'s face with \the [tool]!")
|
||||
target.apply_damage(4, BURN, affected)
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// BRAIN SURGERY //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/surgery_step/brain/
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return target_zone == "head" && hasorgans(target)
|
||||
|
||||
/datum/surgery_step/brain/saw_skull
|
||||
required_tool = /obj/item/weapon/circular_saw
|
||||
|
||||
min_duration = 50
|
||||
max_duration = 70
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target_zone == "head" && target.brain_op_stage == 1
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] begins to cut through [target]'s skull with \the [tool].", \
|
||||
"You begin to cut through [target]'s skull with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] has cut through [target]'s skull open with \the [tool].", \
|
||||
"\blue You have cut through [target]'s skull open with \the [tool].")
|
||||
target.brain_op_stage = 2
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\red [user]'s hand slips, cracking [target]'s skull with \the [tool]!" , \
|
||||
"\red Your hand slips, cracking [target]'s skull with \the [tool]!" )
|
||||
target.apply_damage(10, BRUTE, "head")
|
||||
|
||||
/datum/surgery_step/brain/cut_brain
|
||||
required_tool = /obj/item/weapon/scalpel
|
||||
|
||||
min_duration = 80
|
||||
max_duration = 100
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.brain_op_stage == 2
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts separating connections to [target]'s brain with \the [tool].", \
|
||||
"You start separating connections to [target]'s brain with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] separates connections to [target]'s brain with \the [tool].", \
|
||||
"\blue You separate connections to [target]'s brain with \the [tool].")
|
||||
target.brain_op_stage = 3
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \
|
||||
"\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!")
|
||||
target.apply_damage(50, BRUTE, "head")
|
||||
|
||||
/datum/surgery_step/brain/saw_spine
|
||||
required_tool = /obj/item/weapon/circular_saw
|
||||
|
||||
min_duration = 50
|
||||
max_duration = 70
|
||||
|
||||
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.brain_op_stage == 3
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts separating [target]'s brain from \his spine with \the [tool].", \
|
||||
"You start separating [target]'s brain from spine with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] separates [target]'s brain from \his spine with \the [tool].", \
|
||||
"\blue You separate [target]'s brain from spine with \the [tool].")
|
||||
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
target.attack_log += "\[[time_stamp()]\]<font color='orange'> Debrained by [user.name] ([user.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
|
||||
log_admin("ATTACK: [user] ([user.ckey]) debrained [target] ([target.ckey]) with [tool].")
|
||||
message_admins("ATTACK: [user] ([user.ckey]) debrained [target] ([target.ckey]) with [tool].")
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
var/obj/item/brain/B = new(target.loc)
|
||||
B.transfer_identity(target)
|
||||
|
||||
target:brain_op_stage = 4.0
|
||||
target.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \
|
||||
"\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!")
|
||||
target.apply_damage(30, BRUTE, "head")
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// METROID CORE EXTRACTION //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/surgery_step/metroid/
|
||||
can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
return istype(target, /mob/living/carbon/metroid/) && target.stat == 2
|
||||
|
||||
/datum/surgery_step/metroid/cut_flesh
|
||||
required_tool = /obj/item/weapon/scalpel
|
||||
|
||||
min_duration = 30
|
||||
max_duration = 50
|
||||
|
||||
can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
return ..() && target.brain_op_stage == 0
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts cutting [target]'s flesh with \the [tool].", \
|
||||
"You start cutting [target]'s flesh with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] cuts [target]'s flesh with \the [tool].", \
|
||||
"\blue You cut [target]'s flesh with \the [tool], exposing the cores")
|
||||
target.brain_op_stage = 1
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\red [user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \
|
||||
"\red Your hand slips, tearing [target]'s flesh with \the [tool]!")
|
||||
|
||||
/datum/surgery_step/metroid/cut_innards
|
||||
required_tool = /obj/item/weapon/scalpel
|
||||
|
||||
min_duration = 30
|
||||
max_duration = 50
|
||||
|
||||
can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
return ..() && target.brain_op_stage == 1
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts cutting [target]'s silky innards apart with \the [tool].", \
|
||||
"You start cutting [target]'s silky innards apart with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] cuts [target]'s innards apart with \the [tool], exposing the cores", \
|
||||
"\blue You cut [target]'s innards apart with \the [tool], exposing the cores")
|
||||
target.brain_op_stage = 2
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\red [user]'s hand slips, tearing [target]'s innards with \the [tool]!", \
|
||||
"\red Your hand slips, tearing [target]'s innards with \the [tool]!")
|
||||
|
||||
/datum/surgery_step/metroid/saw_core
|
||||
required_tool = /obj/item/weapon/circular_saw
|
||||
|
||||
min_duration = 50
|
||||
max_duration = 70
|
||||
|
||||
can_use(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
return ..() && target.brain_op_stage == 2 && target.cores > 0
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts cutting out one of [target]'s cores with \the [tool].", \
|
||||
"You start cutting out one of [target]'s cores with \the [tool].")
|
||||
|
||||
end_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
target.cores--
|
||||
user.visible_message("\blue [user] cuts out one of [target]'s cores with \the [tool].",, \
|
||||
"\blue You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.")
|
||||
new/obj/item/metroid_core(target.loc)
|
||||
if(target.cores <= 0)
|
||||
target.icon_state = "baby roro dead-nocore"
|
||||
|
||||
fail_step(mob/user, mob/living/carbon/metroid/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\red [user]'s hand slips, failing to cut core out!", \
|
||||
"\red Your hand slips, failing to cut core out!")
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// LIMB SURGERY //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
//uh, sometime later, okay?
|
||||
@@ -40,7 +40,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
|
||||
if(locate(/obj/fire) in src)
|
||||
return 1
|
||||
var/datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases
|
||||
var/obj/liquid_fuel/liquid = locate() in src
|
||||
var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src
|
||||
if(air_contents.calculate_firelevel(liquid) > vsc.IgnitionLevel && (fuel || liquid || air_contents.toxins > 0.5))
|
||||
igniting = 1
|
||||
if(air_contents.oxygen < 0.5)
|
||||
@@ -63,7 +63,7 @@ obj
|
||||
anchored = 1
|
||||
mouse_opacity = 0
|
||||
|
||||
//luminosity = 3
|
||||
luminosity = 3
|
||||
|
||||
icon = 'fire.dmi'
|
||||
icon_state = "1"
|
||||
@@ -90,7 +90,7 @@ obj
|
||||
//Get whatever trace fuels are in the area
|
||||
datum/gas/volatile_fuel/fuel = locate(/datum/gas/volatile_fuel/) in air_contents.trace_gases
|
||||
//Also get liquid fuels on the ground.
|
||||
obj/liquid_fuel/liquid = locate() in S
|
||||
obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S
|
||||
|
||||
var/datum/gas_mixture/flow = air_contents.remove_ratio(0.25)
|
||||
//The reason we're taking a part of the air instead of all of it is so that it doesn't jump to
|
||||
@@ -177,67 +177,12 @@ obj
|
||||
|
||||
..()
|
||||
|
||||
obj/liquid_fuel
|
||||
//Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "fuel"
|
||||
layer = TURF_LAYER+0.2
|
||||
anchored = 1
|
||||
var/amount = 1 //Basically moles.
|
||||
|
||||
New(newLoc,amt=1)
|
||||
src.amount = amt
|
||||
|
||||
//Be absorbed by any other liquid fuel in the tile.
|
||||
for(var/obj/liquid_fuel/other in newLoc)
|
||||
if(other != src)
|
||||
other.amount += src.amount
|
||||
spawn other.Spread()
|
||||
del src
|
||||
|
||||
Spread()
|
||||
. = ..()
|
||||
|
||||
proc/Spread()
|
||||
//Allows liquid fuels to sometimes flow into other tiles.
|
||||
if(amount < 0.5) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
for(var/d in cardinal)
|
||||
if(S.air_check_directions & d)
|
||||
if(rand(25))
|
||||
var/turf/simulated/O = get_step(src,d)
|
||||
if(!locate(/obj/liquid_fuel) in O)
|
||||
new/obj/liquid_fuel(O,amount*0.25)
|
||||
amount *= 0.75
|
||||
|
||||
flamethrower_fuel
|
||||
icon_state = "mustard"
|
||||
anchored = 0
|
||||
New(newLoc, amt = 1, d = 0)
|
||||
dir = d //Setting this direction means you won't get torched by your own flamethrower.
|
||||
. = ..()
|
||||
Spread()
|
||||
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
|
||||
if(amount < 0.1) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
|
||||
for(var/d in list(turn(dir,90),turn(dir,-90)))
|
||||
if(S.air_check_directions & d)
|
||||
var/turf/simulated/O = get_step(S,d)
|
||||
new/obj/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
|
||||
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
|
||||
|
||||
amount *= 0.5
|
||||
|
||||
|
||||
turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again.
|
||||
turf/proc/apply_fire_protection()
|
||||
turf/simulated/apply_fire_protection()
|
||||
fire_protection = world.time
|
||||
|
||||
datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
|
||||
datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid)
|
||||
//This proc is similar to fire(), but uses a simple logarithm to calculate temp, and is thus more stable with ZAS.
|
||||
if(temperature > PLASMA_MINIMUM_BURN_TEMPERATURE)
|
||||
var
|
||||
@@ -295,7 +240,7 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid)
|
||||
return 0
|
||||
|
||||
|
||||
datum/gas_mixture/proc/calculate_firelevel(obj/liquid_fuel/liquid)
|
||||
datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid)
|
||||
//Calculates the firelevel based on one equation instead of having to do this multiple times in different areas.
|
||||
var
|
||||
datum/gas/volatile_fuel/fuel = locate() in trace_gases
|
||||
@@ -305,7 +250,7 @@ datum/gas_mixture/proc/calculate_firelevel(obj/liquid_fuel/liquid)
|
||||
tox_concentration = toxins / volume
|
||||
fuel_concentration = 0
|
||||
|
||||
if(fuel) fuel_concentration = (fuel.moles*5) / volume
|
||||
if(fuel) fuel_concentration = (fuel.moles) / volume
|
||||
if(liquid) liquid_concentration = (liquid.amount*15) / volume
|
||||
return (oxy_concentration + tox_concentration + liquid_concentration + fuel_concentration)*100
|
||||
|
||||
|
||||
@@ -43,12 +43,12 @@ to null does not delete the object itself. Thank you.
|
||||
var/severity = null//severity descr
|
||||
var/longevity = 250//time in "ticks" the virus stays in inanimate object (blood stains, corpses, etc). In syringes, bottles and beakers it stays infinitely.
|
||||
var/list/hidden = list(0, 0)
|
||||
var/can_carry = 1 // If the disease allows "carriers".
|
||||
// if hidden[1] is true, then virus is hidden from medical scanners
|
||||
var/can_carry = 1 // If the disease allows "carriers". var/age = 0 // age of the disease in the current mob var/stage_minimum_age = 0 // how old the disease must be to advance per stage // if hidden[1] is true, then virus is hidden from medical scanners
|
||||
// if hidden[2] is true, then virus is hidden from PANDEMIC machine
|
||||
|
||||
|
||||
/datum/disease/proc/stage_act()
|
||||
age++
|
||||
var/cure_present = has_cure()
|
||||
//world << "[cure_present]"
|
||||
|
||||
@@ -60,7 +60,7 @@ to null does not delete the object itself. Thank you.
|
||||
|
||||
if(stage > max_stages)
|
||||
stage = max_stages
|
||||
if(stage_prob != 0 && prob(stage_prob) && stage != max_stages && !cure_present) //now the disease shouldn't get back up to stage 4 in no time
|
||||
if(stage_prob != 0 && prob(stage_prob) && stage != max_stages && !cure_present && age > stage_minimum_age * stage) //now the disease shouldn't get back up to stage 4 in no time
|
||||
stage++
|
||||
if(stage != 1 && (prob(1) || (cure_present && prob(cure_chance))))
|
||||
stage--
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/datum/disease/appendicitis
|
||||
form = "Condition"
|
||||
name = "Appendicitis"
|
||||
max_stages = 3
|
||||
max_stages = 4
|
||||
spread = "Acute"
|
||||
cure = "Surgery"
|
||||
agent = "Shitty Appendix"
|
||||
agent = "Appendix"
|
||||
affected_species = list("Human")
|
||||
permeability_mod = 1
|
||||
contagious_period = 9001 //slightly hacky, but hey! whatever works, right?
|
||||
@@ -12,16 +12,22 @@
|
||||
severity = "Medium"
|
||||
longevity = 1000
|
||||
hidden = list(0, 1)
|
||||
stage_minimum_age = 100 // at least 100 life ticks per stage
|
||||
|
||||
/datum/disease/appendicitis/stage_act()
|
||||
..()
|
||||
switch(stage)
|
||||
if(1)
|
||||
if(prob(5)) affected_mob.emote("cough")
|
||||
if(affected_mob.op_stage.appendix == 2.0)
|
||||
// appendix is removed, can't get infected again
|
||||
src.cure()
|
||||
if(prob(5))
|
||||
affected_mob << "\red You feel a stinging pain in your abdomen!"
|
||||
affected_mob.emote("me",1,"winces slightly.")
|
||||
if(2)
|
||||
if(prob(3))
|
||||
affected_mob << "\red You feel a stabbing pain in your abdomen!"
|
||||
affected_mob.Stun(rand(2,3))
|
||||
affected_mob.emote("me",1,"winces painfully.")
|
||||
affected_mob.adjustToxLoss(1)
|
||||
if(3)
|
||||
if(prob(1))
|
||||
@@ -38,4 +44,18 @@
|
||||
else
|
||||
affected_mob << "\red You gag as you want to throw up, but there's nothing in your stomach!"
|
||||
affected_mob.Weaken(10)
|
||||
affected_mob.adjustToxLoss(3)
|
||||
affected_mob.adjustToxLoss(3)
|
||||
|
||||
if(4)
|
||||
if(prob(1) && ishuman(affected_mob))
|
||||
var/mob/living/carbon/human/H = affected_mob
|
||||
H << "\red Your abdomen is a world of pain!"
|
||||
H.Weaken(10)
|
||||
H.op_stage.appendix = 2.0
|
||||
|
||||
var/datum/organ/external/groin = H.get_organ("groin")
|
||||
var/datum/wound/W = new /datum/wound/internal_bleeding(25)
|
||||
H.adjustToxLoss(25)
|
||||
groin.wounds += W
|
||||
|
||||
src.cure()
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
max_stages = 4
|
||||
spread = "On contact"
|
||||
spread_type = CONTACT_GENERAL
|
||||
cure = "Ryetalin"
|
||||
cure = "ryetalyn"
|
||||
curable = 0
|
||||
cure = "Ryetalyn"
|
||||
cure_id = "ryetalyn"
|
||||
curable = 1
|
||||
agent = "S4E1 retrovirus"
|
||||
affected_species = list("Human")
|
||||
var/list/original_dna = list()
|
||||
|
||||
@@ -53,6 +53,11 @@ datum/mind
|
||||
var/datum/faction/faction //associated faction
|
||||
var/datum/changeling/changeling //changeling holder
|
||||
|
||||
var/rev_cooldown = 0
|
||||
|
||||
// the world.time since the mob has been brigged, or -1 if not at all
|
||||
var/brigged_since = -1
|
||||
|
||||
New(var/key)
|
||||
src.key = key
|
||||
|
||||
@@ -1083,6 +1088,37 @@ datum/mind
|
||||
fail |= !ticker.mode.equip_revolutionary(current)
|
||||
|
||||
|
||||
// check whether this mind's mob has been brigged for the given duration
|
||||
// have to call this periodically for the duration to work properly
|
||||
proc/is_brigged(duration)
|
||||
var/turf/T = current.loc
|
||||
if(!istype(T))
|
||||
brigged_since = -1
|
||||
return 0
|
||||
|
||||
var/is_currently_brigged = 0
|
||||
|
||||
if(istype(T.loc,/area/security/brig))
|
||||
is_currently_brigged = 1
|
||||
for(var/obj/item/weapon/card/id/card in current)
|
||||
is_currently_brigged = 0
|
||||
break // if they still have ID they're not brigged
|
||||
for(var/obj/item/device/pda/P in current)
|
||||
if(P.id)
|
||||
is_currently_brigged = 0
|
||||
break // if they still have ID they're not brigged
|
||||
|
||||
if(!is_currently_brigged)
|
||||
brigged_since = -1
|
||||
return 0
|
||||
|
||||
if(brigged_since == -1)
|
||||
brigged_since = world.time
|
||||
|
||||
return (duration <= world.time - brigged_since)
|
||||
|
||||
|
||||
|
||||
|
||||
//Initialisation procs
|
||||
/mob/living/proc/mind_initialize()
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
|
||||
|
||||
proc/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list())
|
||||
// TODO: this proc needs to be rewritten to not update damages directly
|
||||
if((brute <= 0) && (burn <= 0))
|
||||
return 0
|
||||
if(status & ORGAN_DESTROYED)
|
||||
@@ -106,7 +105,8 @@
|
||||
if(forbidden_limbs.len)
|
||||
possible_points -= forbidden_limbs
|
||||
if(!possible_points.len)
|
||||
message_admins("Oh god WHAT! [owner]'s [src] was unable to find an organ to pass overdamage too!")
|
||||
if(owner.stat != 2)
|
||||
message_admins("Oh god WHAT! [owner]'s [src] was unable to find an organ to pass overdamage to!")
|
||||
else
|
||||
var/datum/organ/external/target = pick(possible_points)
|
||||
if(brute)
|
||||
@@ -181,6 +181,11 @@
|
||||
if(W.damage == 0 && W.created + 10 * 10 * 60 <= world.time)
|
||||
wounds -= W
|
||||
// let the GC handle the deletion of the wound
|
||||
if(W.internal && !W.is_treated())
|
||||
// internal wounds get worse over time
|
||||
W.open_wound(0.5 * wound_update_accuracy)
|
||||
owner.vessel.remove_reagent("blood",0.1 * W.damage * wound_update_accuracy)
|
||||
|
||||
if(W.is_treated())
|
||||
// slow healing
|
||||
var/amount = 0.2
|
||||
@@ -196,6 +201,7 @@
|
||||
proc/bandage()
|
||||
var/rval = 0
|
||||
for(var/datum/wound/W in wounds)
|
||||
if(W.internal) continue
|
||||
rval |= !W.bandaged
|
||||
W.bandaged = 1
|
||||
return rval
|
||||
@@ -232,14 +238,18 @@
|
||||
owner.update_body(1)
|
||||
return
|
||||
if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT))
|
||||
if(!(status & ORGAN_BROKEN))
|
||||
owner.visible_message("\red You hear a loud cracking sound coming from \the [owner].","\red <b>Something feels like it shattered in your [display_name]!</b>","You hear a sickening crack.")
|
||||
owner.emote("scream")
|
||||
status |= ORGAN_BROKEN
|
||||
broken_description = pick("broken","fracture","hairline fracture")
|
||||
perma_injury = brute_dam
|
||||
src.fracture()
|
||||
return
|
||||
|
||||
proc/fracture()
|
||||
if(status & ORGAN_BROKEN)
|
||||
return
|
||||
owner.visible_message("\red You hear a loud cracking sound coming from \the [owner].","\red <b>Something feels like it shattered in your [display_name]!</b>","You hear a sickening crack.")
|
||||
owner.emote("scream")
|
||||
status |= ORGAN_BROKEN
|
||||
broken_description = pick("broken","fracture","hairline fracture")
|
||||
perma_injury = brute_dam
|
||||
|
||||
// new damage icon system
|
||||
// returns just the brute/burn damage code
|
||||
proc/damage_state_text()
|
||||
@@ -418,7 +428,7 @@
|
||||
|
||||
W = new wound_type(damage)
|
||||
if(BURN)
|
||||
var/list/size_names = list(/datum/wound/moderate_burn, /datum/wound/large_burn, /datum/wound/severe_burn, /datum/wound/deep_burn, /datum/wound/carbonised_area)
|
||||
var/list/size_names = list(/datum/wound/moderate_burn, /datum/wound/large_burn, /datum/wound/severe_burn, /datum/wound/deep_burn, /datum/wound/carbonised_area, /datum/wound/carbonised_area)
|
||||
wound_type = size_names[size]
|
||||
|
||||
W = new wound_type(damage)
|
||||
|
||||
@@ -34,6 +34,13 @@
|
||||
// number of wounds of this type
|
||||
var/tmp/amount = 1
|
||||
|
||||
// maximum stage at which bleeding should still happen, counted from the right rather than the left of the list
|
||||
// 1 means all stages except the last should bleed
|
||||
var/max_bleeding_stage = 1
|
||||
|
||||
// internal wounds can only be fixed through surgery
|
||||
var/internal = 0
|
||||
|
||||
// helper lists
|
||||
var/tmp/list/desc_list = list()
|
||||
var/tmp/list/damage_list = list()
|
||||
@@ -55,6 +62,10 @@
|
||||
// this will ensure the size of the wound matches the damage
|
||||
src.heal_damage(0)
|
||||
|
||||
// make the max_bleeding_stage count from the end of the list rather than the start
|
||||
// this is more robust to changes to the list
|
||||
max_bleeding_stage = src.desc_list.len - max_bleeding_stage
|
||||
|
||||
// returns 1 if there's a next stage, 0 otherwise
|
||||
proc/next_stage()
|
||||
if(current_stage + 1 > src.desc_list.len)
|
||||
@@ -82,7 +93,13 @@
|
||||
|
||||
// heal the given amount of damage, and if the given amount of damage was more
|
||||
// than what needed to be healed, return how much heal was left
|
||||
proc/heal_damage(amount)
|
||||
// set @heals_internal to also heal internal organ damage
|
||||
// TODO: set heals_internal to 0 by default
|
||||
proc/heal_damage(amount, heals_internal = 1)
|
||||
if(src.internal && !heals_internal)
|
||||
// heal nothing
|
||||
return amount
|
||||
|
||||
var/healed_damage = min(src.damage, amount)
|
||||
amount -= healed_damage
|
||||
src.damage -= healed_damage
|
||||
@@ -106,29 +123,36 @@
|
||||
src.min_damage = damage_list[current_stage]
|
||||
|
||||
proc/bleeding()
|
||||
return (!bandaged && damage > 4)
|
||||
// internal wounds don't bleed in the sense of this function
|
||||
return (!bandaged && (damage_type == BRUISE && damage >= 20 || damage_type == CUT) && current_stage <= max_bleeding_stage && !src.internal)
|
||||
|
||||
/** CUTS **/
|
||||
/datum/wound/cut
|
||||
// link wound descriptions to amounts of damage
|
||||
max_bleeding_stage = 2
|
||||
stages = list("ugly ripped cut" = 20, "ripped cut" = 10, "cut" = 5, "healing cut" = 2, "small scab" = 0)
|
||||
|
||||
/datum/wound/deep_cut
|
||||
max_bleeding_stage = 3
|
||||
stages = list("ugly deep ripped cut" = 25, "deep ripped cut" = 20, "deep cut" = 15, "clotted cut" = 8, "scab" = 2, "fresh skin" = 0)
|
||||
|
||||
/datum/wound/flesh_wound
|
||||
max_bleeding_stage = 3
|
||||
stages = list("ugly ripped flesh wound" = 35, "ugly flesh wound" = 30, "flesh wound" = 25, "blood soaked clot" = 15, "large scab" = 5, "fresh skin" = 0)
|
||||
|
||||
/datum/wound/gaping_wound
|
||||
max_bleeding_stage = 2
|
||||
stages = list("gaping wound" = 50, "large blood soaked clot" = 25, "large clot" = 15, "small angry scar" = 5, \
|
||||
"small straight scar" = 0)
|
||||
|
||||
/datum/wound/big_gaping_wound
|
||||
max_bleeding_stage = 2
|
||||
stages = list("big gaping wound" = 60, "healing gaping wound" = 40, "large angry scar" = 10, "large straight scar" = 0)
|
||||
|
||||
needs_treatment = 1 // this only heals when bandaged
|
||||
|
||||
/datum/wound/massive_wound
|
||||
max_bleeding_stage = 2
|
||||
stages = list("massive wound" = 70, "massive healing wound" = 50, "massive angry scar" = 10, "massive jagged scar" = 0)
|
||||
|
||||
needs_treatment = 1 // this only heals when bandaged
|
||||
@@ -197,4 +221,12 @@
|
||||
|
||||
needs_treatment = 1 // this only heals when bandaged
|
||||
|
||||
damage_type = BURN
|
||||
damage_type = BURN
|
||||
|
||||
/datum/wound/internal_bleeding
|
||||
internal = 1
|
||||
|
||||
stages = list("severed vein" = 30, "cut vein" = 20, "damaged vein" = 10, "bruised vein" = 5)
|
||||
max_bleeding_stage = 0
|
||||
|
||||
needs_treatment = 1
|
||||
@@ -1633,6 +1633,32 @@
|
||||
attack_verb = list("attacked", "slashed", "sawed", "cut")
|
||||
sharp = 1
|
||||
|
||||
/obj/item/weapon/bonegel
|
||||
name = "bone gel"
|
||||
icon = 'surgery.dmi'
|
||||
icon_state = "bone-gel"
|
||||
force = 0
|
||||
throwforce = 1.0
|
||||
|
||||
/obj/item/weapon/FixOVein
|
||||
name = "FixOVein"
|
||||
icon = 'surgery.dmi'
|
||||
icon_state = "fixovein"
|
||||
force = 0
|
||||
throwforce = 1.0
|
||||
origin_tech = "materials=1;biotech=3"
|
||||
var/usage_amount = 10
|
||||
|
||||
/obj/item/weapon/bonesetter
|
||||
name = "bone setter"
|
||||
icon = 'surgery.dmi'
|
||||
icon_state = "bone setter"
|
||||
force = 8.0
|
||||
throwforce = 9.0
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
attack_verb = list("attacked", "hit", "bludgeoned")
|
||||
|
||||
/obj/item/weapon/syntiflesh
|
||||
name = "syntiflesh"
|
||||
desc = "Meat that appears...strange..."
|
||||
|
||||
@@ -1353,6 +1353,15 @@ proc/is_hot(obj/item/W as obj)
|
||||
istype(W, /obj/item/weapon/kitchen/utensil/fork) && W.icon_state != "forkloaded" || \
|
||||
istype(W, /obj/item/weapon/twohanded/fireaxe) \
|
||||
)
|
||||
/proc/is_surgery_tool(obj/item/W as obj)
|
||||
return ( \
|
||||
istype(W, /obj/item/weapon/scalpel) || \
|
||||
istype(W, /obj/item/weapon/hemostat) || \
|
||||
istype(W, /obj/item/weapon/retractor) || \
|
||||
istype(W, /obj/item/weapon/cautery) || \
|
||||
istype(W, /obj/item/weapon/bonegel) || \
|
||||
istype(W, /obj/item/weapon/bonesetter)
|
||||
)
|
||||
|
||||
/proc/reverse_direction(var/dir)
|
||||
switch(dir)
|
||||
@@ -1371,4 +1380,4 @@ proc/is_hot(obj/item/W as obj)
|
||||
if(WEST)
|
||||
return EAST
|
||||
if(NORTHWEST)
|
||||
return SOUTHEAST
|
||||
return SOUTHEAST
|
||||
|
||||
@@ -7,12 +7,17 @@
|
||||
config_tag = "Extend-A-Traitormongous"
|
||||
|
||||
var/list/possible_traitors
|
||||
var/num_players = 0
|
||||
|
||||
/datum/game_mode/traitor/autotraitor/announce()
|
||||
..()
|
||||
world << "<B>This is a test bed for theories and methods to implement an infinite traitor round. Traitors will be added to the round automagically as needed.<br>Expect bugs.</B>"
|
||||
world << "<B>Game mode is AutoTraitor. Traitors will be added to the round automagically as needed.<br>Expect bugs.</B>"
|
||||
|
||||
/datum/game_mode/traitor/autotraitor/pre_setup()
|
||||
|
||||
if(config.protect_roles_from_antagonist)
|
||||
restricted_jobs += protected_jobs
|
||||
|
||||
possible_traitors = get_players_for_role(BE_TRAITOR)
|
||||
|
||||
for(var/datum/mind/player in possible_traitors)
|
||||
@@ -134,33 +139,6 @@
|
||||
//else
|
||||
//message_admins("Number of Traitors is at maximum. Not making a new Traitor.")
|
||||
|
||||
|
||||
/* Old equation. Commenting out.
|
||||
target_traitors = max(1, min(round((playercount + r) / 10, 1), traitors_possible))
|
||||
message_admins("Target Traitor Count is: [target_traitors]")
|
||||
|
||||
if (traitorcount < target_traitors)
|
||||
message_admins("Number of Traitors is below Target. Making a new Traitor.")
|
||||
var/mob/living/newtraitor = pick(possible_traitors)
|
||||
message_admins("[newtraitor.real_name] is the new Traitor.")
|
||||
|
||||
for(var/datum/objective/o in SelectObjectives(newtraitor.mind.assigned_role, newtraitor.mind))
|
||||
o.owner = newtraitor.mind
|
||||
newtraitor.mind.objectives += o
|
||||
|
||||
equip_traitor(newtraitor)
|
||||
traitors += newtraitor.mind
|
||||
newtraitor << "\red <B>ATTENTION:</B> \black It is time to pay your debt to the Syndicate..."
|
||||
newtraitor << "<B>You are now a traitor.</B>"
|
||||
newtraitor.mind.special_role = "traitor"
|
||||
var/obj_count = 1
|
||||
newtraitor << "\blue Your current objectives:"
|
||||
for(var/datum/objective/objective in newtraitor.mind.objectives)
|
||||
newtraitor << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
obj_count++
|
||||
else
|
||||
message_admins("Number of Traitors is at Target. No new Traitor.")
|
||||
*/
|
||||
traitorcheckloop()
|
||||
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
// world << sound('sound/AI/outbreak7.ogg')
|
||||
var/virus_type
|
||||
if(!virus)
|
||||
virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
|
||||
virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis)
|
||||
else
|
||||
switch(virus)
|
||||
if("fake gbs")
|
||||
|
||||
@@ -324,6 +324,8 @@ Whitespace:Seperator;
|
||||
// Less if there are not enough valid players in the game entirely to make recommended_enemies.
|
||||
|
||||
|
||||
/datum/game_mode/proc/latespawn(var/mob)
|
||||
|
||||
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player)
|
||||
if(player.preferences.be_special & role)
|
||||
return 1
|
||||
|
||||
@@ -86,6 +86,128 @@ datum/objective/mutiny
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/mutiny/rp
|
||||
find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate, capture or convert [target.current.real_name], the [target.assigned_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
explanation_text = "Assassinate, capture or convert [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
// less violent rev objectives
|
||||
check_completion()
|
||||
if(target && target.current)
|
||||
if(target.current.stat == DEAD || target.current.handcuffed || !ishuman(target.current))
|
||||
return 1
|
||||
// Check if they're converted
|
||||
if(istype(ticker.mode, /datum/game_mode/revolution))
|
||||
if(target in ticker.mode:head_revolutionaries)
|
||||
return 1
|
||||
var/turf/T = get_turf(target.current)
|
||||
if(T && (T.z != 1)) //If they leave the station they count as dead for this
|
||||
return 2
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/anti_revolution/execute
|
||||
find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute \him[target.current]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute \him[target.current]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
check_completion()
|
||||
if(target && target.current)
|
||||
if(target.current.stat == DEAD || !ishuman(target.current))
|
||||
return 1
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/anti_revolution/brig
|
||||
var/already_completed = 0
|
||||
|
||||
find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
explanation_text = "Brig [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] for 20 minutes to set an example."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
check_completion()
|
||||
if(already_completed)
|
||||
return 1
|
||||
|
||||
if(target && target.current)
|
||||
if(target.current.stat == DEAD)
|
||||
return 0
|
||||
if(target.is_brigged(10 * 60 * 10))
|
||||
already_completed = 1
|
||||
return 1
|
||||
return 0
|
||||
return 0
|
||||
|
||||
datum/objective/anti_revolution/demote
|
||||
find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
check_completion()
|
||||
if(target && target.current && istype(target,/mob/living/carbon/human))
|
||||
var/obj/item/weapon/card/id/I = target.current:wear_id
|
||||
if(istype(I, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/P = I
|
||||
I = P.id
|
||||
|
||||
if(!istype(I)) return 1
|
||||
|
||||
if(I.assignment == "Assistant")
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/debrain//I want braaaainssss
|
||||
find_target()
|
||||
|
||||
222
code/game/gamemodes/revolution/anti_revolution.dm
Normal file
@@ -0,0 +1,222 @@
|
||||
// A sort of anti-revolution where the heads are given objectives to mess with the crew
|
||||
|
||||
/datum/game_mode/anti_revolution
|
||||
name = "anti-revolution"
|
||||
config_tag = "anti-revolution"
|
||||
required_players = 5
|
||||
|
||||
var/finished = 0
|
||||
var/checkwin_counter = 0
|
||||
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
||||
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
|
||||
|
||||
var/required_execute_targets = 1
|
||||
var/required_brig_targets = 0
|
||||
|
||||
var/recommended_execute_targets = 1
|
||||
var/recommended_brig_targets = 3
|
||||
var/recommended_demote_targets = 3
|
||||
|
||||
var/list/datum/mind/heads = list()
|
||||
var/list/datum/mind/execute_targets = list()
|
||||
var/list/datum/mind/brig_targets = list()
|
||||
var/list/datum/mind/demote_targets = list()
|
||||
|
||||
///////////////////////////
|
||||
//Announces the game type//
|
||||
///////////////////////////
|
||||
/datum/game_mode/anti_revolution/announce()
|
||||
world << "<B>The current game mode is - Anti-Revolution!</B>"
|
||||
world << "<B>Looks like CentComm has given a few new orders..</B>"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//Gets the round setup, cancelling if there's not enough players at the start//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/datum/game_mode/anti_revolution/pre_setup()
|
||||
for(var/mob/new_player/player in world) if(player.mind)
|
||||
if(player.mind.assigned_role in command_positions)
|
||||
heads += player.mind
|
||||
else
|
||||
if(execute_targets.len < recommended_execute_targets)
|
||||
execute_targets += player.mind
|
||||
else if(brig_targets.len < recommended_brig_targets)
|
||||
brig_targets += player.mind
|
||||
else if(demote_targets.len < recommended_demote_targets)
|
||||
demote_targets += player.mind
|
||||
|
||||
|
||||
if(heads.len==0)
|
||||
return 0
|
||||
|
||||
if(execute_targets.len < required_execute_targets || brig_targets.len < required_brig_targets)
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/proc/add_head_objectives(datum/mind/head)
|
||||
for(var/datum/mind/target in execute_targets)
|
||||
var/datum/objective/anti_revolution/execute/obj = new
|
||||
obj.owner = head
|
||||
obj.target = target
|
||||
obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute them."
|
||||
head.objectives += obj
|
||||
for(var/datum/mind/target in brig_targets)
|
||||
var/datum/objective/anti_revolution/brig/obj = new
|
||||
obj.owner = head
|
||||
obj.target = target
|
||||
obj.explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
|
||||
head.objectives += obj
|
||||
for(var/datum/mind/target in demote_targets)
|
||||
var/datum/objective/anti_revolution/demote/obj = new
|
||||
obj.owner = head
|
||||
obj.target = target
|
||||
obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote them to assistant."
|
||||
head.objectives += obj
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/post_setup()
|
||||
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
add_head_objectives(head_mind)
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
greet_head(head_mind)
|
||||
modePlayer += heads
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/process()
|
||||
checkwin_counter++
|
||||
if(checkwin_counter >= 5)
|
||||
if(!finished)
|
||||
ticker.mode.check_win()
|
||||
checkwin_counter = 0
|
||||
return 0
|
||||
|
||||
|
||||
/datum/game_mode/proc/greet_head(var/datum/mind/head_mind, var/you_are=1)
|
||||
var/obj_count = 1
|
||||
if (you_are)
|
||||
head_mind.current << "\blue It looks like this shift CentComm has some special orders for you.. check your objectives."
|
||||
head_mind.current << "\blue Note that you can ignore these objectives, but resisting NT's orders probably means demotion or worse."
|
||||
for(var/datum/objective/objective in head_mind.objectives)
|
||||
head_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
head_mind.special_role = "Corrupt Head"
|
||||
obj_count++
|
||||
|
||||
head_mind.current.verbs += /mob/proc/ResignFromHeadPosition
|
||||
|
||||
//////////////////////////////////////
|
||||
//Checks if the revs have won or not//
|
||||
//////////////////////////////////////
|
||||
/datum/game_mode/anti_revolution/check_win()
|
||||
if(check_head_victory())
|
||||
finished = 1
|
||||
else if(check_crew_victory())
|
||||
finished = 2
|
||||
return
|
||||
|
||||
///////////////////////////////
|
||||
//Checks if the round is over//
|
||||
///////////////////////////////
|
||||
/datum/game_mode/anti_revolution/check_finished()
|
||||
if(finished != 0)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
|
||||
//////////////////////////
|
||||
//Checks for crew victory//
|
||||
//////////////////////////
|
||||
/datum/game_mode/anti_revolution/proc/check_crew_victory()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
var/turf/T = get_turf(head_mind.current)
|
||||
if((head_mind) && (head_mind.current) && (head_mind.current.stat != 2) && T && (T.z == 1) && !head_mind.is_brigged(600))
|
||||
if(ishuman(head_mind.current))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/////////////////////////////
|
||||
//Checks for a head victory//
|
||||
/////////////////////////////
|
||||
/datum/game_mode/anti_revolution/proc/check_head_victory()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
for(var/datum/objective/objective in head_mind.objectives)
|
||||
if(!(objective.check_completion()))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/declare_completion()
|
||||
|
||||
var/text = ""
|
||||
if(finished == 2)
|
||||
world << "\red <FONT size = 3><B> The heads of staff were relieved of their posts! The crew wins!</B></FONT>"
|
||||
else if(finished == 1)
|
||||
world << "\red <FONT size = 3><B> The heads of staff managed to meet the goals set for them by CentComm!</B></FONT>"
|
||||
|
||||
|
||||
|
||||
world << "<FONT size = 2><B>The heads of staff were: </B></FONT>"
|
||||
var/list/heads = list()
|
||||
heads = get_all_heads()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
text = ""
|
||||
if(head_mind.current)
|
||||
text += "[head_mind.current.real_name]"
|
||||
if(head_mind.current.stat == 2)
|
||||
text += " (Dead)"
|
||||
else
|
||||
text += " (Survived!)"
|
||||
else
|
||||
text += "[head_mind.key] (character destroyed)"
|
||||
|
||||
world << text
|
||||
|
||||
|
||||
world << "<FONT size = 2><B>Their objectives were: </B></FONT>"
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
if(head_mind.objectives.len)//If the traitor had no objectives, don't need to process this.
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in head_mind.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
|
||||
feedback_add_details("head_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
|
||||
feedback_add_details("head_objective","[objective.type]|FAIL")
|
||||
count++
|
||||
break // just print once
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/latespawn(mob/living/carbon/human/character)
|
||||
..()
|
||||
if(emergency_shuttle.departed)
|
||||
return
|
||||
|
||||
if(character.mind.assigned_role in command_positions)
|
||||
heads += character.mind
|
||||
modePlayer += character.mind
|
||||
add_head_objectives(character.mind)
|
||||
greet_head(character.mind)
|
||||
|
||||
/mob/proc/ResignFromHeadPosition()
|
||||
set category = "IC"
|
||||
set name = "Resign From Head Position"
|
||||
|
||||
if(!istype(ticker.mode, /datum/game_mode/anti_revolution))
|
||||
return
|
||||
|
||||
ticker.mode:heads -= src.mind
|
||||
src.mind.objectives = list()
|
||||
ticker.mode.modePlayer -= src.mind
|
||||
src.mind.special_role = null
|
||||
|
||||
src.verbs -= /mob/proc/ResignFromHeadPosition
|
||||
|
||||
src << "\red You resigned from your position, now you have the consequences."
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
var/finished = 0
|
||||
var/checkwin_counter = 0
|
||||
var/const/max_headrevs = 3
|
||||
var/max_headrevs = 3
|
||||
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
||||
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
|
||||
///////////////////////////
|
||||
|
||||
@@ -280,46 +280,6 @@
|
||||
return 1
|
||||
|
||||
|
||||
/*obj/item/weapon/paper/communist_manifesto
|
||||
name = "Communist Manifesto"
|
||||
icon = 'books.dmi'
|
||||
icon_state = "redcommunist"
|
||||
info = "Supporters of the Revolution:<br><br>"
|
||||
attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
if(user.mind in ticker.mode:head_revolutionaries)
|
||||
if(RevConvert(M,user))
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\red [] converts [] with the Communist Manifesto!", user, M))
|
||||
info += "[M.real_name]<br>"
|
||||
else
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\red [] fails to convert [] with the Communist Manifesto!", user, M))
|
||||
else
|
||||
usr << "\red You are completely confounded as to the operation of this tome."
|
||||
return
|
||||
|
||||
proc/RevConvert(mob/living/carbon/M,mob/user)
|
||||
if(!istype(M)) return 0
|
||||
if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries))
|
||||
user << "\red <b>[M] is already a revolutionary!</b>"
|
||||
return 0
|
||||
else if(M.mind in ticker.mode:get_unconvertables())
|
||||
user << "\red <b>[M] cannot be a revolutionary!</b>"
|
||||
return 0
|
||||
else
|
||||
if(world.time < M.mind.rev_cooldown)
|
||||
user << "\red Wait five seconds before reconversion attempt."
|
||||
return 0
|
||||
user << "\red Attempting to convert [M]..."
|
||||
var/choice = alert(M,"Asked by [user]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!")
|
||||
if(choice == "Yes!")
|
||||
ticker.mode:add_revolutionary(M.mind)
|
||||
user << "\blue <b>[M] joins the revolution!</b>"
|
||||
. = 1
|
||||
else if(choice == "No!")
|
||||
user << "\red <b>[M] does not support the revolution!</b>"
|
||||
. = 0
|
||||
M.mind.rev_cooldown = world.time+50*/
|
||||
|
||||
mob/living/carbon/human/proc
|
||||
RevConvert(mob/M as mob in oview(src))
|
||||
|
||||
200
code/game/gamemodes/revolution/rp_revolution.dm
Normal file
@@ -0,0 +1,200 @@
|
||||
// BS12's less violent revolution mode
|
||||
|
||||
/datum/game_mode/revolution/rp_revolution
|
||||
name = "rp-revolution"
|
||||
config_tag = "rp-revolution"
|
||||
required_players = 12
|
||||
required_enemies = 3
|
||||
recommended_enemies = 3
|
||||
|
||||
var/list/heads = list()
|
||||
var/tried_to_add_revheads = 0
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//Gets the round setup, cancelling if there's not enough players at the start//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/datum/game_mode/revolution/rp_revolution/pre_setup()
|
||||
|
||||
if(config.protect_roles_from_antagonist)
|
||||
restricted_jobs += protected_jobs
|
||||
|
||||
var/num_players = num_players()
|
||||
max_headrevs = max(num_players / 4, 3)
|
||||
recommended_enemies = max_headrevs
|
||||
|
||||
var/list/datum/mind/possible_headrevs = get_players_for_role(BE_REV)
|
||||
|
||||
var/head_check = 0
|
||||
for(var/mob/new_player/player in player_list)
|
||||
if(player.mind.assigned_role in command_positions)
|
||||
head_check = 1
|
||||
break
|
||||
|
||||
for(var/datum/mind/player in possible_headrevs)
|
||||
for(var/job in restricted_jobs)//Removing heads and such from the list
|
||||
if(player.assigned_role == job)
|
||||
possible_headrevs -= player
|
||||
|
||||
for (var/i=1 to max_headrevs)
|
||||
if (possible_headrevs.len==0)
|
||||
break
|
||||
var/datum/mind/lenin = pick(possible_headrevs)
|
||||
possible_headrevs -= lenin
|
||||
head_revolutionaries += lenin
|
||||
|
||||
if((head_revolutionaries.len==0)||(!head_check))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/revolution/rp_revolution/post_setup()
|
||||
heads = get_living_heads()
|
||||
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
var/datum/objective/mutiny/rp/rev_obj = new
|
||||
rev_obj.owner = rev_mind
|
||||
rev_obj.target = head_mind
|
||||
rev_obj.explanation_text = "Assassinate or capture [head_mind.name], the [head_mind.assigned_role]."
|
||||
rev_mind.objectives += rev_obj
|
||||
|
||||
update_rev_icons_added(rev_mind)
|
||||
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
greet_revolutionary(rev_mind)
|
||||
rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert
|
||||
modePlayer += head_revolutionaries
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
|
||||
/datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1)
|
||||
var/obj_count = 1
|
||||
if (you_are)
|
||||
rev_mind.current << "\blue You are a member of the revolutionaries' leadership!"
|
||||
for(var/datum/objective/objective in rev_mind.objectives)
|
||||
rev_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
rev_mind.special_role = "Head Revolutionary"
|
||||
obj_count++
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
//Deals with converting players to the revolution//
|
||||
///////////////////////////////////////////////////
|
||||
/datum/game_mode/revolution/rp_revolution/add_revolutionary(datum/mind/rev_mind)
|
||||
// overwrite this func to make it so even heads can be converted
|
||||
var/mob/living/carbon/human/H = rev_mind.current//Check to see if the potential rev is implanted
|
||||
if(!is_convertible(H))
|
||||
return 0
|
||||
if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries))
|
||||
return 0
|
||||
revolutionaries += rev_mind
|
||||
rev_mind.current << "\red <FONT size = 3> You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill, capture or convert the heads to win the revolution!</FONT>"
|
||||
rev_mind.special_role = "Revolutionary"
|
||||
update_rev_icons_added(rev_mind)
|
||||
return 1
|
||||
|
||||
/////////////////////////////
|
||||
//Checks for a head victory//
|
||||
/////////////////////////////
|
||||
/datum/game_mode/revolution/rp_revolution/check_heads_victory()
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
var/turf/T = get_turf(rev_mind.current)
|
||||
if(rev_mind.current.stat != 2)
|
||||
// TODO: add a similar check that also checks whether they're without ID in the brig..
|
||||
// probably wanna export this stuff into a separate function for use by both
|
||||
// revs and heads
|
||||
if(!rev_mind.current.handcuffed && T && T.z == 1)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
///////////////////////////
|
||||
//Announces the game type//
|
||||
///////////////////////////
|
||||
/datum/game_mode/revolution/rp_revolution/announce()
|
||||
world << "<B>The current game mode is - Revolution!</B>"
|
||||
world << "<B>Some crewmembers are attempting to start a revolution!</B>"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//Announces the end of the game with all relavent information stated//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
/datum/game_mode/revolution/rp_revolution/declare_completion()
|
||||
if(finished == 1)
|
||||
feedback_set_details("round_end_result","win - heads overthrown")
|
||||
world << "\red <FONT size = 3><B> The heads of staff were overthrown! The revolutionaries win!</B></FONT>"
|
||||
else if(finished == 2)
|
||||
feedback_set_details("round_end_result","loss - revolution stopped")
|
||||
world << "\red <FONT size = 3><B> The heads of staff managed to stop the revolution!</B></FONT>"
|
||||
..()
|
||||
return 1
|
||||
|
||||
/datum/game_mode/revolution/proc/is_convertible(mob/M)
|
||||
for(var/obj/item/weapon/implant/loyalty/L in M)//Checking that there is a loyalty implant in the contents
|
||||
if(L.imp_in == M)//Checking that it's actually implanted
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/RevConvert(mob/M as mob in oview(src))
|
||||
set name = "Rev-Convert"
|
||||
set category = "IC"
|
||||
if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries)))
|
||||
if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries))
|
||||
src << "\red <b>[M] is already be a revolutionary!</b>"
|
||||
else if(!ticker.mode:is_convertible(M))
|
||||
src << "\red <b>[M] is implanted with a loyalty implant - Remove it first!</b>"
|
||||
else
|
||||
if(world.time < M.mind.rev_cooldown)
|
||||
src << "\red Wait five seconds before reconversion attempt."
|
||||
return
|
||||
src << "\red Attempting to convert [M]..."
|
||||
log_admin("[src]([src.ckey]) attempted to convert [M].")
|
||||
message_admins("\red [src]([src.ckey]) attempted to convert [M].")
|
||||
var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!")
|
||||
if(choice == "Yes!")
|
||||
ticker.mode:add_revolutionary(M.mind)
|
||||
M << "\blue You join the revolution!"
|
||||
src << "\blue <b>[M] joins the revolution!</b>"
|
||||
else if(choice == "No!")
|
||||
M << "\red You reject this traitorous cause!"
|
||||
src << "\red <b>[M] does not support the revolution!</b>"
|
||||
M.mind.rev_cooldown = world.time+50
|
||||
|
||||
/datum/game_mode/revolution/rp_revolution/process()
|
||||
// only perform rev checks once in a while
|
||||
if(tried_to_add_revheads < world.time)
|
||||
tried_to_add_revheads = world.time+50
|
||||
var/active_revs = 0
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
if(rev_mind.current.client && rev_mind.current.client.inactivity <= 10*60*20) // 20 minutes inactivity are OK
|
||||
active_revs++
|
||||
|
||||
if(active_revs == 0)
|
||||
log_admin("There are zero active head revolutionists, trying to add some..")
|
||||
message_admins("There are zero active head revolutionists, trying to add some..")
|
||||
var/added_heads = 0
|
||||
for(var/mob/living/carbon/human/H in world) if(H.client && H.mind && H.client.inactivity <= 10*60*20 && H.mind in revolutionaries)
|
||||
head_revolutionaries += H.mind
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
var/datum/objective/mutiny/rp/rev_obj = new
|
||||
rev_obj.owner = H.mind
|
||||
rev_obj.target = head_mind
|
||||
rev_obj.explanation_text = "Assassinate or capture [head_mind.name], the [head_mind.assigned_role]."
|
||||
H.mind.objectives += rev_obj
|
||||
|
||||
update_rev_icons_added(H.mind)
|
||||
H.verbs += /mob/living/carbon/human/proc/RevConvert
|
||||
|
||||
H << "\red Congratulations, yer heads of revolution are all gone now, so yer earned yourself a promotion."
|
||||
added_heads = 1
|
||||
break
|
||||
|
||||
if(added_heads)
|
||||
log_admin("Managed to add new heads of revolution.")
|
||||
message_admins("Managed to add new heads of revolution.")
|
||||
else
|
||||
log_admin("Unable to add new heads of revolution.")
|
||||
message_admins("Unable to add new heads of revolution.")
|
||||
tried_to_add_revheads = world.time + 6000 // wait 10 minutes
|
||||
|
||||
return ..()
|
||||
@@ -262,9 +262,6 @@
|
||||
if(!D.hidden[SCANNER])
|
||||
dat += text("<font color='red'><B>Warning: [D.form] Detected</B>\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]</FONT><BR>")
|
||||
|
||||
if (occupant.virus2 || occupant.reagents.reagent_list.len > 0)
|
||||
dat += text("<font color='red'>Warning: Foreign substances detected in bloodstream.</FONT>")
|
||||
|
||||
dat += "<HR><table border='1'>"
|
||||
dat += "<tr>"
|
||||
dat += "<th>Organ</th>"
|
||||
@@ -273,8 +270,7 @@
|
||||
dat += "<th>Other Wounds</th>"
|
||||
dat += "</tr>"
|
||||
|
||||
for(var/name in occupant.organs)
|
||||
var/datum/organ/external/e = occupant.organs[name]
|
||||
for(var/datum/organ/external/e in occupant.organs)
|
||||
dat += "<tr>"
|
||||
var/AN = ""
|
||||
var/open = ""
|
||||
@@ -282,6 +278,10 @@
|
||||
var/imp = ""
|
||||
var/bled = ""
|
||||
var/splint = ""
|
||||
var/internal_bleeding = ""
|
||||
for(var/datum/wound/W in e.wounds) if(W.internal)
|
||||
internal_bleeding = "Internal Bleeding:"
|
||||
break
|
||||
if(e.status & ORGAN_SPLINTED)
|
||||
splint = "Splinted:"
|
||||
if(e.status & ORGAN_BLEEDING)
|
||||
@@ -295,7 +295,7 @@
|
||||
if(!AN && !open && !infected & !imp)
|
||||
AN = "None"
|
||||
if(!(e.status & ORGAN_DESTROYED))
|
||||
dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[bled][AN][splint][open][infected][imp]</td>"
|
||||
dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[bled][AN][splint][open][infected][imp][internal_bleeding]</td>"
|
||||
else
|
||||
dat += "<td>[e.display_name]</td><td>-</td><td>-</td><td>Not Found</td>"
|
||||
dat += "</tr>"
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
<TT><B>Automatic Station Cleaner v1.0</B></TT><BR><BR>
|
||||
Status: []<BR>
|
||||
Behaviour controls are [src.locked ? "locked" : "unlocked"]<BR>
|
||||
Maintenance panel panel is [src.open ? "opened" : "closed"]"},
|
||||
Maintenance panel is [src.open ? "opened" : "closed"]"},
|
||||
text("<A href='?src=\ref[src];operation=start'>[src.on ? "On" : "Off"]</A>"))
|
||||
if(!src.locked)
|
||||
dat += text({"<BR>Cleans Blood: []<BR>"}, text("<A href='?src=\ref[src];operation=blood'>[src.blood ? "Yes" : "No"]</A>"))
|
||||
@@ -301,6 +301,7 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
target_types += /obj/effect/decal/cleanable/vomit
|
||||
target_types += /obj/effect/decal/cleanable/robot_debris
|
||||
target_types += /obj/effect/decal/cleanable/crayon
|
||||
target_types += /obj/effect/decal/cleanable/liquid_fuel
|
||||
|
||||
if(src.blood)
|
||||
target_types += /obj/effect/decal/cleanable/xenoblood/
|
||||
|
||||
@@ -84,6 +84,8 @@
|
||||
dat += "<br><b>Medical Robots:</b>"
|
||||
var/bdat = null
|
||||
for(var/obj/machinery/bot/medbot/M in world)
|
||||
if(!M)
|
||||
continue
|
||||
var/turf/bl = get_turf(M)
|
||||
bdat += "[M.name] - <b>\[[bl.x],[bl.y]\]</b> - [M.on ? "Online" : "Offline"]<br>"
|
||||
if((!isnull(M.reagent_glass)) && M.use_beaker)
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
user << "\blue You start to add cables to the frame."
|
||||
if(do_after(user, 20))
|
||||
if(!P)
|
||||
user << "\blue You realize the cable coil no longer exist."
|
||||
return;
|
||||
P:amount -= 5
|
||||
if(!P:amount) del(P)
|
||||
user << "\blue You add cables to the frame."
|
||||
|
||||
@@ -828,7 +828,15 @@ About the new airlock wires panel:
|
||||
src.aiHacking = 0
|
||||
src.attack_ai(user)
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if (src.isElectrified())
|
||||
if (istype(mover, /obj/item))
|
||||
var/obj/item/i = mover
|
||||
if (i.m_amt)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
return ..()
|
||||
/obj/machinery/door/airlock/attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
var/tp = text2num(href_list["tp"])
|
||||
var/timeleft = timeleft()
|
||||
timeleft += tp
|
||||
timeleft = min(max(round(timeleft), 0), 600)
|
||||
timeleft = min(max(round(timeleft), 0), 3600)
|
||||
timeset(timeleft)
|
||||
//src.timing = 1
|
||||
//src.closedoor()
|
||||
|
||||
112
code/game/machinery/iv_drip.dm
Normal file
@@ -0,0 +1,112 @@
|
||||
/obj/machinery/iv_drip
|
||||
name = "\improper IV drip"
|
||||
icon = 'icons/obj/iv_drip.dmi'
|
||||
anchored = 0
|
||||
density = 1
|
||||
|
||||
/obj/machinery/iv_drip/var/mob/living/carbon/human/attached = null
|
||||
/obj/machinery/iv_drip/var/obj/item/weapon/reagent_containers/beaker = null
|
||||
|
||||
/obj/machinery/iv_drip/update_icon()
|
||||
if(src.attached)
|
||||
icon_state = "hooked"
|
||||
else
|
||||
icon_state = ""
|
||||
|
||||
overlays = null
|
||||
|
||||
if(beaker)
|
||||
var/datum/reagents/reagents = beaker.reagents
|
||||
if(reagents.total_volume)
|
||||
var/image/filling = image('icons/obj/iv_drip.dmi', src, "reagent")
|
||||
|
||||
var/percent = round((reagents.total_volume / beaker.volume) * 100)
|
||||
switch(percent)
|
||||
if(0 to 9) filling.icon_state = "reagent0"
|
||||
if(10 to 24) filling.icon_state = "reagent10"
|
||||
if(25 to 49) filling.icon_state = "reagent25"
|
||||
if(50 to 74) filling.icon_state = "reagent50"
|
||||
if(75 to 79) filling.icon_state = "reagent75"
|
||||
if(80 to 90) filling.icon_state = "reagent80"
|
||||
if(91 to INFINITY) filling.icon_state = "reagent100"
|
||||
|
||||
filling.icon += mix_color_from_reagents(reagents.reagent_list)
|
||||
overlays += filling
|
||||
|
||||
/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location)
|
||||
..()
|
||||
|
||||
if(attached)
|
||||
visible_message("[src.attached] is detached from \the [src]")
|
||||
src.attached = null
|
||||
src.update_icon()
|
||||
return
|
||||
|
||||
if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1)
|
||||
visible_message("[usr] attaches \the [src] to \the [over_object].")
|
||||
src.attached = over_object
|
||||
src.update_icon()
|
||||
|
||||
|
||||
/obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/reagent_containers))
|
||||
if(!isnull(src.beaker))
|
||||
user << "There is already a reagent container loaded!"
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
src.beaker = W
|
||||
user << "You attach \the [W] to \the [src]."
|
||||
src.update_icon()
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/iv_drip/process()
|
||||
set background = 1
|
||||
|
||||
..()
|
||||
if(src.attached && src.beaker && src.beaker.volume > 0)
|
||||
if(!(get_dist(src, src.attached) <= 1))
|
||||
visible_message("The needle is ripped out of [src.attached], doesn't that hurt?")
|
||||
src.attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
|
||||
src.attached = null
|
||||
src.update_icon()
|
||||
return
|
||||
|
||||
var/transfer_amount = REAGENTS_METABOLISM
|
||||
if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood))
|
||||
// speed up transfer on blood packs
|
||||
transfer_amount = 4
|
||||
src.beaker.reagents.trans_to(src.attached, transfer_amount)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/iv_drip/attack_hand(mob/user as mob)
|
||||
if(src.beaker)
|
||||
src.beaker.loc = get_turf(src)
|
||||
src.beaker = null
|
||||
update_icon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/iv_drip/examine()
|
||||
set src in view()
|
||||
..()
|
||||
if (!(usr in view(2)) && usr!=src.loc) return
|
||||
|
||||
if(beaker)
|
||||
usr << "\blue Attached is \a [beaker] with:"
|
||||
if(beaker.reagents && beaker.reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in beaker.reagents.reagent_list)
|
||||
usr << "\blue [R.volume] units of [R.name]"
|
||||
else
|
||||
usr << "\blue Attached is an empty [beaker]."
|
||||
else
|
||||
usr << "\blue No chemicals are attached."
|
||||
|
||||
if(attached)
|
||||
usr << "\blue [attached] is attached."
|
||||
else
|
||||
usr << "\blue No one is attached."
|
||||
58
code/game/objects/effects/decals/Cleanable/fuel.dm
Normal file
@@ -0,0 +1,58 @@
|
||||
obj/effect/decal/cleanable/liquid_fuel
|
||||
//Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "fuel"
|
||||
layer = TURF_LAYER+0.2
|
||||
anchored = 1
|
||||
var/amount = 1 //Basically moles.
|
||||
|
||||
New(newLoc,amt=1)
|
||||
src.amount = amt
|
||||
|
||||
//Be absorbed by any other liquid fuel in the tile.
|
||||
for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
|
||||
if(other != src)
|
||||
other.amount += src.amount
|
||||
spawn other.Spread()
|
||||
del src
|
||||
|
||||
Spread()
|
||||
. = ..()
|
||||
|
||||
proc/Spread()
|
||||
//Allows liquid fuels to sometimes flow into other tiles.
|
||||
if(amount < 0.5) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
for(var/d in cardinal)
|
||||
if(S.air_check_directions & d)
|
||||
if(rand(25))
|
||||
var/turf/simulated/O = get_step(src,d)
|
||||
var/can_pass = 1
|
||||
for (var/obj/machinery/door/airlock/door in O)
|
||||
if (door.density)
|
||||
can_pass = 0
|
||||
if (can_pass)
|
||||
if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in O)
|
||||
new/obj/effect/decal/cleanable/liquid_fuel(O,amount*0.25)
|
||||
amount *= 0.75
|
||||
|
||||
flamethrower_fuel
|
||||
icon_state = "mustard"
|
||||
anchored = 0
|
||||
New(newLoc, amt = 1, d = 0)
|
||||
dir = d //Setting this direction means you won't get torched by your own flamethrower.
|
||||
. = ..()
|
||||
Spread()
|
||||
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
|
||||
if(amount < 0.1) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
|
||||
for(var/d in list(turn(dir,90),turn(dir,-90)))
|
||||
if(S.air_check_directions & d)
|
||||
var/turf/simulated/O = get_step(S,d)
|
||||
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
|
||||
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
|
||||
|
||||
amount *= 0.5
|
||||
@@ -179,28 +179,22 @@
|
||||
|
||||
if (!istype(M)) // not sure if this is the right thing...
|
||||
return
|
||||
|
||||
//if(istype(M) &&((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(50))))
|
||||
if(istype(M,/mob/living/carbon))
|
||||
if (user.a_intent == "help")
|
||||
if(surgery_steps == null) build_surgery_steps_list()
|
||||
for(var/datum/surgery_step/S in surgery_steps)
|
||||
var/have_correct_tool = 0
|
||||
if(istype(S.required_tool, /list))
|
||||
for(var/T in S.required_tool) if(istype(src, T))
|
||||
have_correct_tool = 1
|
||||
break
|
||||
else
|
||||
have_correct_tool = (istype(src, S.required_tool))
|
||||
if(!have_correct_tool) continue
|
||||
if(S.can_use(user, M, user.zone_sel.selecting, src))
|
||||
S.begin_step(user, M, user.zone_sel.selecting, src)
|
||||
if(do_mob(user, M, rand(S.min_duration, S.max_duration)))
|
||||
S.end_step(user, M, user.zone_sel.selecting, src)
|
||||
else
|
||||
S.fail_step(user, M, user.zone_sel.selecting, src)
|
||||
return //don't want to do weapony things after surgery
|
||||
|
||||
if (can_operate(M)) //Checks if mob is lying down on table for surgery
|
||||
if(istype(M,/mob/living/carbon))
|
||||
if (user.a_intent == "help" || (user.a_intent != "harm" && is_surgery_tool(src)))
|
||||
if(surgery_steps == null) build_surgery_steps_list()
|
||||
for(var/datum/surgery_step/S in surgery_steps)
|
||||
//check if tool is right or close enough
|
||||
if(istype(src, S.required_tool) || (S.allowed_tools && src.type in S.allowed_tools ))
|
||||
if(S.can_use(user, M, user.zone_sel.selecting, src)) //is this step possible?
|
||||
S.begin_step(user, M, user.zone_sel.selecting, src)
|
||||
if(do_mob(user, M, rand(S.min_duration, S.max_duration)))
|
||||
S.end_step(user, M, user.zone_sel.selecting, src)
|
||||
else
|
||||
S.fail_step(user, M, user.zone_sel.selecting, src)
|
||||
return //don't want to do weapony things after surgery
|
||||
if (is_surgery_tool(src))
|
||||
return
|
||||
|
||||
var/messagesource = M
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
if (!connection)
|
||||
return
|
||||
|
||||
Broadcast_Message(connection, new /mob/living/silicon/ai(src),
|
||||
Broadcast_Message(connection, new /mob/living/silicon/ai(src,null,null,1),
|
||||
0, "*garbled automated announcement*", src,
|
||||
message, from, "Automated Announcement", from, "synthesized voice",
|
||||
4, 0, 1)
|
||||
|
||||
@@ -109,7 +109,7 @@ MASS SPECTROMETER
|
||||
user.show_message("\blue Localized Damage, Brute/Burn:",1)
|
||||
if(length(damaged)>0)
|
||||
for(var/datum/organ/external/org in damaged)
|
||||
user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1)
|
||||
user.show_message(text("\blue \t []: []\blue-[][]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0, (org.status & ORGAN_BLEEDING)?"\red (bleeding)":""),1)
|
||||
else
|
||||
user.show_message("\blue \t Limbs are OK.",1)
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
else if (M.gender == FEMALE)
|
||||
t_him = "her"
|
||||
user << "\red \The [M] is dead, you cannot help [t_him]!"
|
||||
return
|
||||
return 1
|
||||
|
||||
if (!istype(M))
|
||||
user << "\red \The [src] cannot be applied to [M]!"
|
||||
@@ -21,28 +21,14 @@
|
||||
user << "\red You don't have the dexterity to do this!"
|
||||
return 1
|
||||
|
||||
if (user)
|
||||
if (M != user)
|
||||
user.visible_message( \
|
||||
"\blue [M] has been applied with [src] by [user].", \
|
||||
"\blue You apply \the [src] to [M]." \
|
||||
)
|
||||
else
|
||||
var/t_himself = "itself"
|
||||
if (user.gender == MALE)
|
||||
t_himself = "himself"
|
||||
else if (user.gender == FEMALE)
|
||||
t_himself = "herself"
|
||||
|
||||
user.visible_message( \
|
||||
"\blue [M] applied [src] on [t_himself].", \
|
||||
"\blue You apply \the [src] on yourself." \
|
||||
)
|
||||
|
||||
if (istype(M, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/datum/organ/external/affecting = H.get_organ("chest")
|
||||
|
||||
if(affecting.status & ORGAN_ROBOT)
|
||||
user << "\red This isn't useful at all on a robotic limb.."
|
||||
return 1
|
||||
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/user2 = user
|
||||
affecting = H.get_organ(check_zone(user2.zone_sel.selecting))
|
||||
@@ -65,16 +51,20 @@
|
||||
if(src.heal_brute)
|
||||
if(!affecting.bandage() && !child.bandage())
|
||||
user << "\red The wounds on this limb have already been bandaged."
|
||||
return 1
|
||||
else if(src.heal_burn)
|
||||
if(!affecting.salve() && !child.salve())
|
||||
user << "\red The wounds on this limb have already been salved."
|
||||
return 1
|
||||
else
|
||||
if(src.heal_brute)
|
||||
if(!affecting.bandage())
|
||||
user << "\red The wounds on this limb have already been bandaged."
|
||||
return 1
|
||||
else if(src.heal_burn)
|
||||
if(!affecting.salve())
|
||||
user << "\red The wounds on this limb have already been salved."
|
||||
return 1
|
||||
|
||||
H.UpdateDamageIcon()
|
||||
M.updatehealth()
|
||||
@@ -82,3 +72,21 @@
|
||||
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
|
||||
|
||||
use(1)
|
||||
|
||||
if (user)
|
||||
if (M != user)
|
||||
user.visible_message( \
|
||||
"\blue [M] has been applied with [src] by [user].", \
|
||||
"\blue You apply \the [src] to [M]." \
|
||||
)
|
||||
else
|
||||
var/t_himself = "itself"
|
||||
if (user.gender == MALE)
|
||||
t_himself = "himself"
|
||||
else if (user.gender == FEMALE)
|
||||
t_himself = "herself"
|
||||
|
||||
user.visible_message( \
|
||||
"\blue [M] applied [src] on [t_himself].", \
|
||||
"\blue You apply \the [src] on yourself." \
|
||||
)
|
||||
|
||||
@@ -284,9 +284,12 @@
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.shoes)
|
||||
var/datum/organ/external/affecting = H.get_organ(pick("l_leg", "r_leg"))
|
||||
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
|
||||
if(affecting.status & ORGAN_ROBOT)
|
||||
return
|
||||
|
||||
H.Weaken(3)
|
||||
if(affecting.take_damage(5, 0))
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -404,7 +404,10 @@ ZIPPO
|
||||
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src].</span>")
|
||||
else
|
||||
user << "<span class='warning'>You burn yourself while lighting the lighter.</span>"
|
||||
user.adjustFireLoss(2)
|
||||
if (user.l_hand == src)
|
||||
user.apply_damage(2,BURN,"l_hand")
|
||||
else
|
||||
user.apply_damage(2,BURN,"r_hand")
|
||||
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src], they however burn their finger in the process.</span>")
|
||||
|
||||
user.SetLuminosity(user.luminosity + 2)
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
log_attack("<font color='red'> [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])</font>")
|
||||
user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!")
|
||||
|
||||
log_admin("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])")
|
||||
msg_admin_attack("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") //BS12 EDIT ALG
|
||||
log_admin("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])")
|
||||
msg_admin_attack("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") //BS12 EDIT ALG
|
||||
|
||||
if(do_after(user, 50) && in_range(user, target))
|
||||
user.drop_item()
|
||||
|
||||
@@ -46,6 +46,11 @@
|
||||
if(crit_fail)
|
||||
user << "\red The Bluespace generator isn't working."
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
|
||||
user << "\red The Bluespace interfaces of the two devices conflict and malfunction."
|
||||
del(W)
|
||||
return
|
||||
/* //BoH+BoH=Singularity, commented out.
|
||||
if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
|
||||
investigate_log("has become a singularity. Caused by [user.key]","singulo")
|
||||
user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!"
|
||||
@@ -56,6 +61,7 @@
|
||||
log_game("[key_name(user)] detonated a bag of holding")
|
||||
del(src)
|
||||
return
|
||||
*/
|
||||
..()
|
||||
|
||||
proc/failcheck(mob/user as mob)
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
T.status &= ~ORGAN_ATTACHABLE
|
||||
T.status &= ~ORGAN_DESTROYED
|
||||
T.status |= ORGAN_ROBOT
|
||||
M.update_body()
|
||||
H.update_body()
|
||||
M.updatehealth()
|
||||
M.UpdateDamageIcon()
|
||||
del(src)
|
||||
|
||||
@@ -9,572 +9,11 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Retractor
|
||||
*/
|
||||
/obj/item/weapon/retractor/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(50))))
|
||||
return ..()
|
||||
HAHA, SUCK IT, 2000 LINES OF SPAGHETTI CODE!
|
||||
|
||||
if(user.zone_sel.selecting == "groin")
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
switch(M:appendix_op_stage)
|
||||
if(2.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [user] retracts the flap in [M]'s abdomen cut open with [src].", 1)
|
||||
M << "\red [user] begins to retract the flap in your abdomen with [src]!"
|
||||
user << "\red You retract the flap in [M]'s abdomen with [src]!"
|
||||
M:appendix_op_stage = 3.0
|
||||
return
|
||||
NOW YOUR JOB IOS DONE BY ONLY 500 LINES OF SPAGHETTI CODE!
|
||||
|
||||
if (user.zone_sel.selecting == "eyes")
|
||||
LOOK FOR SURGERY.DM
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && ( \
|
||||
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
||||
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
||||
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
var/mob/living/carbon/monkey/Mo = M
|
||||
if(istype(Mo) && ( \
|
||||
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
||||
user << "\red You cannot locate any eyes on this creature!"
|
||||
return
|
||||
|
||||
switch(M.eye_op_stage)
|
||||
if(1.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] is having his eyes retracted by [user].", 1)
|
||||
M << "\red [user] begins to seperate your eyes with [src]!"
|
||||
user << "\red You seperate [M]'s eyes with [src]!"
|
||||
else
|
||||
user.visible_message( \
|
||||
"\red [user] begins to have his eyes retracted.", \
|
||||
"\red You begin to pry open your eyes with [src]!" \
|
||||
)
|
||||
if(M == user && prob(25))
|
||||
user << "\red You mess up!"
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
if(affecting.take_damage(15))
|
||||
M:UpdateDamageIcon()
|
||||
M.updatehealth()
|
||||
else
|
||||
M.take_organ_damage(15)
|
||||
|
||||
M:eye_op_stage = 2.0
|
||||
|
||||
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
||||
return ..()
|
||||
|
||||
return
|
||||
|
||||
/*
|
||||
* Hemostat
|
||||
*/
|
||||
/obj/item/weapon/hemostat/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
|
||||
return ..()
|
||||
|
||||
if(user.zone_sel.selecting == "groin")
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
switch(M:appendix_op_stage)
|
||||
if(1.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [user] is beginning to clamp bleeders in [M]'s abdomen cut open with [src].", 1)
|
||||
M << "\red [user] begins to clamp bleeders in your abdomen with [src]!"
|
||||
user << "\red You clamp bleeders in [M]'s abdomen with [src]!"
|
||||
M:appendix_op_stage = 2.0
|
||||
if(4.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [user] is removing [M]'s appendix with [src].", 1)
|
||||
M << "\red [user] begins to remove your appendix with [src]!"
|
||||
user << "\red You remove [M]'s appendix with [src]!"
|
||||
for(var/datum/disease/D in M.viruses)
|
||||
if(istype(D, /datum/disease/appendicitis))
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed(get_turf(M))
|
||||
M:appendix_op_stage = 5.0
|
||||
return
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(M))
|
||||
M:appendix_op_stage = 5.0
|
||||
return
|
||||
|
||||
if (user.zone_sel.selecting == "eyes")
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && ( \
|
||||
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
||||
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
||||
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
var/mob/living/carbon/monkey/Mo = M
|
||||
if(istype(Mo) && ( \
|
||||
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
|
||||
user << "\red You cannot locate any eyes on this creature!"
|
||||
return
|
||||
|
||||
switch(M.eye_op_stage)
|
||||
if(2.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] is having his eyes mended by [user].", 1)
|
||||
M << "\red [user] begins to mend your eyes with [src]!"
|
||||
user << "\red You mend [M]'s eyes with [src]!"
|
||||
else
|
||||
user.visible_message( \
|
||||
"\red [user] begins to have his eyes mended.", \
|
||||
"\red You begin to mend your eyes with [src]!" \
|
||||
)
|
||||
if(M == user && prob(25))
|
||||
user << "\red You mess up!"
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
if(affecting.take_damage(15))
|
||||
M:UpdateDamageIcon()
|
||||
M.updatehealth()
|
||||
else
|
||||
M.take_organ_damage(15)
|
||||
M:eye_op_stage = 3.0
|
||||
|
||||
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
||||
return ..()
|
||||
|
||||
return
|
||||
|
||||
/*
|
||||
* Cautery
|
||||
*/
|
||||
/obj/item/weapon/cautery/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
|
||||
return ..()
|
||||
|
||||
if(user.zone_sel.selecting == "groin")
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
switch(M:appendix_op_stage)
|
||||
if(5.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [user] is beginning to cauterize the incision in [M]'s abdomen with [src].", 1)
|
||||
M << "\red [user] begins to cauterize the incision in your abdomen with [src]!"
|
||||
user << "\red You cauterize the incision in [M]'s abdomen with [src]!"
|
||||
M:appendix_op_stage = 6.0
|
||||
for(var/datum/disease/appendicitis in M.viruses)
|
||||
appendicitis.cure()
|
||||
M.resistances += appendicitis
|
||||
return
|
||||
|
||||
if (user.zone_sel.selecting == "eyes")
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && ( \
|
||||
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
||||
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
||||
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
var/mob/living/carbon/monkey/Mo = M
|
||||
if(istype(Mo) && ( \
|
||||
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
|
||||
user << "\red You cannot locate any eyes on this creature!"
|
||||
return
|
||||
|
||||
switch(M.eye_op_stage)
|
||||
if(3.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] is having his eyes cauterized by [user].", 1)
|
||||
M << "\red [user] begins to cauterize your eyes!"
|
||||
user << "\red You cauterize [M]'s eyes with [src]!"
|
||||
else
|
||||
user.visible_message( \
|
||||
"\red [user] begins to have his eyes cauterized.", \
|
||||
"\red You begin to cauterize your eyes!" \
|
||||
)
|
||||
if(M == user && prob(25))
|
||||
user << "\red You mess up!"
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
if(affecting.take_damage(15))
|
||||
M:UpdateDamageIcon()
|
||||
M.updatehealth()
|
||||
else
|
||||
M.take_organ_damage(15)
|
||||
M.sdisabilities &= ~BLIND
|
||||
M.eye_stat = 0
|
||||
M:eye_op_stage = 0.0
|
||||
|
||||
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
||||
return ..()
|
||||
|
||||
return
|
||||
|
||||
/*
|
||||
* Surgical Drill
|
||||
*/
|
||||
//obj/item/weapon/surgicaldrill
|
||||
|
||||
|
||||
/*
|
||||
* Scalpel
|
||||
*/
|
||||
/obj/item/weapon/scalpel/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M))
|
||||
return ..()
|
||||
|
||||
//if(M.mutations & HUSK) return ..()
|
||||
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
M = user
|
||||
return eyestab(M,user)
|
||||
|
||||
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
|
||||
return ..()
|
||||
|
||||
src.add_fingerprint(user)
|
||||
|
||||
if(user.zone_sel.selecting == "groin")
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
switch(M:appendix_op_stage)
|
||||
if(0.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] is beginning to have his abdomen cut open with [src] by [user].", 1)
|
||||
M << "\red [user] begins to cut open your abdomen with [src]!"
|
||||
user << "\red You cut [M]'s abdomen open with [src]!"
|
||||
M:appendix_op_stage = 1.0
|
||||
if(3.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] is beginning to have his appendix seperated with [src] by [user].", 1)
|
||||
M << "\red [user] begins to seperate your appendix with [src]!"
|
||||
user << "\red You seperate [M]'s appendix with [src]!"
|
||||
M:appendix_op_stage = 4.0
|
||||
return
|
||||
|
||||
if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && ( \
|
||||
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
||||
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
||||
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
var/mob/living/carbon/monkey/Mo = M
|
||||
if(istype(Mo) && ( \
|
||||
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
switch(M:brain_op_stage)
|
||||
if(0.0)
|
||||
if(istype(M, /mob/living/carbon/metroid))
|
||||
if(M.stat == 2)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M.name] is beginning to have its flesh cut open with [src] by [user].", 1)
|
||||
M << "\red [user] begins to cut open your flesh with [src]!"
|
||||
user << "\red You cut [M]'s flesh open with [src]!"
|
||||
M:brain_op_stage = 1.0
|
||||
|
||||
return
|
||||
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] is beginning to have his head cut open with [src] by [user].", 1)
|
||||
M << "\red [user] begins to cut open your head with [src]!"
|
||||
user << "\red You cut [M]'s head open with [src]!"
|
||||
else
|
||||
user.visible_message( \
|
||||
"\red [user] begins to cut open his skull with [src]!", \
|
||||
"\red You begin to cut open your head with [src]!" \
|
||||
)
|
||||
|
||||
if(M == user && prob(25))
|
||||
user << "\red You mess up!"
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
if(affecting.take_damage(15))
|
||||
M:UpdateDamageIcon()
|
||||
else
|
||||
M.take_organ_damage(15)
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
affecting.take_damage(7)
|
||||
else
|
||||
M.take_organ_damage(7)
|
||||
|
||||
M.updatehealth()
|
||||
M:brain_op_stage = 1.0
|
||||
|
||||
if(1)
|
||||
if(istype(M, /mob/living/carbon/metroid))
|
||||
if(M.stat == 2)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M.name] is having its silky inndards cut apart with [src] by [user].", 1)
|
||||
M << "\red [user] begins to cut apart your innards with [src]!"
|
||||
user << "\red You cut [M]'s silky innards apart with [src]!"
|
||||
M:brain_op_stage = 2.0
|
||||
return
|
||||
if(2.0)
|
||||
if(istype(M, /mob/living/carbon/metroid))
|
||||
if(M.stat == 2)
|
||||
var/mob/living/carbon/metroid/Metroid = M
|
||||
if(Metroid.cores > 0)
|
||||
if(istype(M, /mob/living/carbon/metroid))
|
||||
user << "\red You attempt to remove [M]'s core, but [src] is ineffective!"
|
||||
return
|
||||
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] is having his connections to the brain delicately severed with [src] by [user].", 1)
|
||||
M << "\red [user] begins to cut open your head with [src]!"
|
||||
user << "\red You cut [M]'s head open with [src]!"
|
||||
else
|
||||
user.visible_message( \
|
||||
"\red [user] begin to delicately remove the connections to his brain with [src]!", \
|
||||
"\red You begin to cut open your head with [src]!" \
|
||||
)
|
||||
if(M == user && prob(25))
|
||||
user << "\red You nick an artery!"
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
if(affecting.take_damage(75))
|
||||
M:UpdateDamageIcon()
|
||||
else
|
||||
M.take_organ_damage(75)
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
affecting.take_damage(7)
|
||||
else
|
||||
M.take_organ_damage(7)
|
||||
|
||||
M.updatehealth()
|
||||
M:brain_op_stage = 3.0
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
else if(user.zone_sel.selecting == "eyes")
|
||||
user << "\blue So far so good."
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && ( \
|
||||
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
||||
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
||||
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
var/mob/living/carbon/monkey/Mo = M
|
||||
if(istype(Mo) && ( \
|
||||
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
||||
user << "\red You cannot locate any eyes on this creature!"
|
||||
return
|
||||
|
||||
switch(M:eye_op_stage)
|
||||
if(0.0)
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] is beginning to have his eyes incised with [src] by [user].", 1)
|
||||
M << "\red [user] begins to cut open your eyes with [src]!"
|
||||
user << "\red You make an incision around [M]'s eyes with [src]!"
|
||||
else
|
||||
user.visible_message( \
|
||||
"\red [user] begins to cut around his eyes with [src]!", \
|
||||
"\red You begin to cut open your eyes with [src]!" \
|
||||
)
|
||||
if(M == user && prob(25))
|
||||
user << "\red You mess up!"
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
if(affecting.take_damage(15))
|
||||
M:UpdateDamageIcon()
|
||||
else
|
||||
M.take_organ_damage(15)
|
||||
|
||||
user << "\blue So far so good before."
|
||||
M.updatehealth()
|
||||
M:eye_op_stage = 1.0
|
||||
user << "\blue So far so good after."
|
||||
else
|
||||
return ..()
|
||||
/* wat
|
||||
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
||||
return ..()
|
||||
*/
|
||||
return
|
||||
|
||||
|
||||
/*
|
||||
* Circular Saw
|
||||
*/
|
||||
/obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M))
|
||||
return ..()
|
||||
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
M = user
|
||||
return eyestab(M,user)
|
||||
|
||||
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50))))
|
||||
return ..()
|
||||
|
||||
src.add_fingerprint(user)
|
||||
|
||||
if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(istype(H) && ( \
|
||||
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
||||
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
||||
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
var/mob/living/carbon/monkey/Mo = M
|
||||
if(istype(Mo) && ( \
|
||||
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
||||
))
|
||||
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
||||
return
|
||||
|
||||
switch(M:brain_op_stage)
|
||||
if(1.0)
|
||||
if(istype(M, /mob/living/carbon/metroid))
|
||||
return
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] has his skull sawed open with [src] by [user].", 1)
|
||||
M << "\red [user] begins to saw open your head with [src]!"
|
||||
user << "\red You saw [M]'s head open with [src]!"
|
||||
else
|
||||
user.visible_message( \
|
||||
"\red [user] saws open his skull with [src]!", \
|
||||
"\red You begin to saw open your head with [src]!" \
|
||||
)
|
||||
if(M == user && prob(25))
|
||||
user << "\red You mess up!"
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
if(affecting.take_damage(40))
|
||||
M:UpdateDamageIcon()
|
||||
M.updatehealth()
|
||||
else
|
||||
M.take_organ_damage(40)
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/datum/organ/external/affecting = M:get_organ("head")
|
||||
affecting.take_damage(7)
|
||||
else
|
||||
M.take_organ_damage(7)
|
||||
|
||||
M.updatehealth()
|
||||
M:brain_op_stage = 2.0
|
||||
|
||||
if(2.0)
|
||||
if(istype(M, /mob/living/carbon/metroid))
|
||||
if(M.stat == 2)
|
||||
var/mob/living/carbon/metroid/Metroid = M
|
||||
if(Metroid.cores > 0)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M.name] is having one of its cores sawed out with [src] by [user].", 1)
|
||||
|
||||
Metroid.cores--
|
||||
M << "\red [user] begins to remove one of your cores with [src]! ([Metroid.cores] cores remaining)"
|
||||
user << "\red You cut one of [M]'s cores out with [src]! ([Metroid.cores] cores remaining)"
|
||||
|
||||
new/obj/item/metroid_core(M.loc)
|
||||
|
||||
if(Metroid.cores <= 0)
|
||||
M.icon_state = "baby roro dead-nocore"
|
||||
|
||||
return
|
||||
|
||||
if(3.0)
|
||||
if(M.mind && M.mind.changeling)
|
||||
user << "\red The neural tissue regrows before your eyes as you cut it."
|
||||
return
|
||||
|
||||
if(M != user)
|
||||
for(var/mob/O in (viewers(M) - user - M))
|
||||
O.show_message("\red [M] has his spine's connection to the brain severed with [src] by [user].", 1)
|
||||
M << "\red [user] severs your brain's connection to the spine with [src]!"
|
||||
user << "\red You sever [M]'s brain's connection to the spine with [src]!"
|
||||
else
|
||||
user.visible_message( \
|
||||
"\red [user] severs his brain's connection to the spine with [src]!", \
|
||||
"\red You sever your brain's connection to the spine with [src]!" \
|
||||
)
|
||||
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
log_admin("ATTACK: [user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
|
||||
msg_admin_attack("ATTACK: [user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG
|
||||
|
||||
var/obj/item/brain/B = new(M.loc)
|
||||
B.transfer_identity(M)
|
||||
|
||||
M:brain_op_stage = 4.0
|
||||
M.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
|
||||
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
else
|
||||
return ..()
|
||||
/*
|
||||
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
||||
return ..()
|
||||
*/
|
||||
return
|
||||
|
||||
@@ -231,9 +231,8 @@
|
||||
message_admins("[key_name_admin(user)] triggered a fueltank explosion.")
|
||||
log_game("[key_name(user)] triggered a fueltank explosion.")
|
||||
user << "\red That was stupid of you."
|
||||
explosion(O.loc,-1,0,2)
|
||||
if(O)
|
||||
del(O)
|
||||
var/obj/structure/reagent_dispensers/fueltank/tank = O
|
||||
tank.explode()
|
||||
return
|
||||
if (src.welding)
|
||||
remove_fuel(1)
|
||||
@@ -393,4 +392,24 @@
|
||||
var/gen_amount = ((world.time-last_gen)/25)
|
||||
reagents += (gen_amount)
|
||||
if(reagents > max_fuel)
|
||||
reagents = max_fuel
|
||||
reagents = max_fuel
|
||||
|
||||
/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob)
|
||||
if(hasorgans(M))
|
||||
var/datum/organ/external/S = M:organs[user.zone_sel.selecting]
|
||||
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
|
||||
return ..()
|
||||
if(S.brute_dam)
|
||||
S.heal_damage(15,0,0,1)
|
||||
if(user != M)
|
||||
user.visible_message("\red You patch some dents on \the [M]'s [S.display_name]",\
|
||||
"\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src]",\
|
||||
"You hear a welder.")
|
||||
else
|
||||
user.visible_message("\red You patch some dents on your [S.display_name]",\
|
||||
"\red \The [user] patches some dents on their [S.display_name] with \the [src]",\
|
||||
"You hear a welder.")
|
||||
else
|
||||
user << "Nothing to fix!"
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -176,6 +176,8 @@
|
||||
new /obj/item/clothing/under/det(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/clothing/suit/det_suit(src)
|
||||
new /obj/item/clothing/suit/forensics/blue(src)
|
||||
new /obj/item/clothing/suit/forensics/red(src)
|
||||
new /obj/item/clothing/gloves/black(src)
|
||||
new /obj/item/clothing/head/det_hat(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
|
||||
@@ -101,6 +101,16 @@
|
||||
if (istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
else
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/cable/C = T.get_cable_node()
|
||||
if(C)
|
||||
if (C.powernet.avail)
|
||||
if (istype(mover, /obj/item))
|
||||
var/obj/item/i = mover
|
||||
if (i.m_amt)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
return !src.density
|
||||
|
||||
|
||||
|
||||
@@ -478,6 +478,15 @@
|
||||
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
if(istype(ticker.mode, /datum/game_mode/anti_revolution) && ticker.mode:heads.len)
|
||||
dat += "<br><table cellspacing=5><tr><td><B>Corrupt Heads</B></td><td></td></tr>"
|
||||
for(var/datum/mind/N in ticker.mode:heads)
|
||||
var/mob/M = N.current
|
||||
if(M)
|
||||
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
|
||||
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
if(ticker.mode.traitors.len > 0)
|
||||
dat += "<br><table cellspacing=5><tr><td><B>Traitors</B></td><td></td><td></td></tr>"
|
||||
for(var/datum/mind/traitor in ticker.mode.traitors)
|
||||
|
||||
@@ -14,9 +14,10 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali
|
||||
if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
|
||||
return
|
||||
|
||||
src.verbs -= /client/verb/adminhelp
|
||||
/**src.verbs -= /client/verb/adminhelp
|
||||
spawn(1200)
|
||||
src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps
|
||||
src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps//Go to hell
|
||||
**/
|
||||
|
||||
if(!msg) return
|
||||
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
if(!..()) return 0//Cooldown check
|
||||
var/turf/location = get_turf(loc)
|
||||
if(location) location.hotspot_expose(1000,1000)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
var/played = 0
|
||||
var/be_alien = 0 //Check if that guy wants to be an alien
|
||||
var/be_pai = 1 //Consider client when searching for players to recruit as a pAI
|
||||
var/be_syndicate = 1 //Consider client for late-game autotraitor
|
||||
var/activeslot = 1 //Default active slot!
|
||||
var/STFU_ghosts //80+ people rounds are fun to admin when text flies faster than airport security
|
||||
var/STFU_radio //80+ people rounds are fun to admin when text flies faster than airport security
|
||||
|
||||
@@ -66,6 +66,25 @@
|
||||
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/cigpacket,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
|
||||
armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
//Forensics
|
||||
/obj/item/clothing/suit/forensics
|
||||
name = "jacket"
|
||||
desc = "A forensics technician jacket."
|
||||
item_state = "det_suit"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/cigpacket,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
|
||||
armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/suit/forensics/red
|
||||
name = "red jacket"
|
||||
desc = "A red forensics technician jacket."
|
||||
icon_state = "forensics_red"
|
||||
|
||||
/obj/item/clothing/suit/forensics/blue
|
||||
name = "blue jacket"
|
||||
desc = "A blue forensics technician jacket."
|
||||
icon_state = "forensics_blue"
|
||||
|
||||
//Engineering
|
||||
/obj/item/clothing/suit/hazardvest
|
||||
name = "hazard vest"
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/mob/living/carbon/
|
||||
gender = MALE
|
||||
var/list/stomach_contents = list()
|
||||
|
||||
var/brain_op_stage = 0.0
|
||||
/*
|
||||
var/eye_op_stage = 0.0
|
||||
var/appendix_op_stage = 0.0
|
||||
|
||||
*/
|
||||
var/antibodies = 0
|
||||
|
||||
var/silent = null //Can't talk. Value goes down every life proc.
|
||||
|
||||
@@ -243,17 +243,6 @@
|
||||
else if(!client && brain_op_stage != 4 && stat != DEAD)
|
||||
msg += "[t_He] [t_has] a vacant, braindead stare...\n"
|
||||
|
||||
msg += "<span class='warning'>"
|
||||
|
||||
if(nutrition < 100)
|
||||
msg += "[t_He] [t_is] severely malnourished.\n"
|
||||
else if(nutrition >= 500)
|
||||
if(usr.nutrition < 100)
|
||||
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] quite chubby.\n"
|
||||
msg += "</span>"
|
||||
|
||||
var/list/wound_flavor_text = list()
|
||||
var/list/is_destroyed = list()
|
||||
var/list/is_bleeding = list()
|
||||
@@ -285,6 +274,7 @@
|
||||
else if(temp.wounds.len > 0)
|
||||
var/list/wound_descriptors = list()
|
||||
for(var/datum/wound/W in temp.wounds)
|
||||
if(W.internal && !temp.open) continue // can't see internal wounds
|
||||
var/this_wound_desc = W.desc
|
||||
if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]"
|
||||
else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]"
|
||||
|
||||
@@ -401,6 +401,26 @@
|
||||
var/turf/location = M.loc
|
||||
if (istype(location, /turf/simulated))
|
||||
location.add_blood(M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/H = M
|
||||
var/blood_volume = round(H:vessel.get_reagent_amount("blood"))
|
||||
if(blood_volume > 0)
|
||||
H:vessel.remove_reagent("blood",1)
|
||||
if(prob(5))
|
||||
M.adjustBruteLoss(1)
|
||||
visible_message("\red \The [M]'s wounds open more from being dragged!")
|
||||
if(M.pull_damage())
|
||||
if(prob(25))
|
||||
M.adjustBruteLoss(2)
|
||||
visible_message("\red \The [M]'s wounds worsen terribly from being dragged!")
|
||||
var/turf/location = M.loc
|
||||
if (istype(location, /turf/simulated))
|
||||
location.add_blood(M)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/H = M
|
||||
var/blood_volume = round(H:vessel.get_reagent_amount("blood"))
|
||||
if(blood_volume > 0)
|
||||
H:vessel.remove_reagent("blood",1)
|
||||
|
||||
|
||||
step(pulling, get_dir(pulling.loc, T))
|
||||
|
||||
@@ -150,6 +150,8 @@
|
||||
|
||||
/mob/living/carbon/human/proc/get_organ(var/zone)
|
||||
if(!zone) zone = "chest"
|
||||
if (zone in list( "eyes", "mouth" ))
|
||||
zone = "head"
|
||||
return organs_by_name[zone]
|
||||
|
||||
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0)
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT)
|
||||
continue
|
||||
for(var/datum/wound/W in temp.wounds) if(W.bleeding())
|
||||
blood_max += W.damage / 2
|
||||
blood_max += W.damage / 4
|
||||
if(temp.status & ORGAN_DESTROYED && !(temp.status & ORGAN_GAUZED))
|
||||
blood_max += 20 //Yer missing a fucking limb.
|
||||
drip(blood_max)
|
||||
@@ -1053,7 +1053,8 @@
|
||||
|
||||
if(stuttering)
|
||||
stuttering = max(stuttering-1, 0)
|
||||
|
||||
if (src.slurring)
|
||||
stuttering = max(slurring-1, 0)
|
||||
if(silent)
|
||||
silent = max(silent-1, 0)
|
||||
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
return
|
||||
|
||||
if(src.dna)
|
||||
if(src.dna.mutantrace == "lizard")
|
||||
/*if(src.dna.mutantrace == "lizard") //Soghun stutterss-s-ss-sss.
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
message = dd_replacetext(message, "s", stutter("ss"))
|
||||
|
||||
*/
|
||||
if(src.dna.mutantrace == "metroid" && prob(5))
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
if(copytext(message, 1, 2) == ";")
|
||||
@@ -117,6 +117,8 @@
|
||||
message = dd_replacetext(message, ".", "")
|
||||
message = lowertext(message)
|
||||
*/
|
||||
if (src.slurring)
|
||||
message = slur(message)
|
||||
..(message)
|
||||
|
||||
/mob/living/carbon/human/say_understands(var/other)
|
||||
|
||||
@@ -570,6 +570,17 @@ var/list/slot_equipment_priority = list( \
|
||||
return
|
||||
|
||||
|
||||
/mob/proc/pull_damage()
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.health - H.halloss <= config.health_threshold_crit)
|
||||
for(var/name in H.organs_by_name)
|
||||
var/datum/organ/external/e = H.organs_by_name[name]
|
||||
if((H.lying) && ((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
|
||||
return 1
|
||||
break
|
||||
return 0
|
||||
|
||||
/mob/MouseDrop(mob/M as mob)
|
||||
..()
|
||||
if(M != usr) return
|
||||
|
||||
@@ -185,6 +185,28 @@ proc/hasorgans(A)
|
||||
p++
|
||||
return t
|
||||
|
||||
proc/slur(phrase)
|
||||
phrase = html_decode(phrase)
|
||||
var/leng=lentext(phrase)
|
||||
var/counter=lentext(phrase)
|
||||
var/newphrase=""
|
||||
var/newletter=""
|
||||
while(counter>=1)
|
||||
newletter=copytext(phrase,(leng-counter)+1,(leng-counter)+2)
|
||||
if(rand(1,3)==3)
|
||||
if(lowertext(newletter)=="o") newletter="u"
|
||||
if(lowertext(newletter)=="s") newletter="ch"
|
||||
if(lowertext(newletter)=="a") newletter="ah"
|
||||
if(lowertext(newletter)=="c") newletter="k"
|
||||
switch(rand(1,15))
|
||||
if(1,3,5,8) newletter="[lowertext(newletter)]"
|
||||
if(2,4,6,15) newletter="[uppertext(newletter)]"
|
||||
if(7) newletter+="'"
|
||||
//if(9,10) newletter="<b>[newletter]</b>"
|
||||
//if(11,12) newletter="<big>[newletter]</big>"
|
||||
//if(13) newletter="<small>[newletter]</small>"
|
||||
newphrase+="[newletter]";counter-=1
|
||||
return newphrase
|
||||
|
||||
/proc/stutter(n)
|
||||
var/te = html_decode(n)
|
||||
@@ -382,4 +404,4 @@ var/list/intents = list("help","disarm","grab","hurt")
|
||||
if(a_intent == "hurt")
|
||||
hud_used.action_intent.icon_state = "harm"
|
||||
else
|
||||
hud_used.action_intent.icon_state = "help"
|
||||
hud_used.action_intent.icon_state = "help"
|
||||
|
||||
@@ -372,6 +372,11 @@
|
||||
character.loc = pick(latejoin)
|
||||
character.lastarea = get_area(loc)
|
||||
|
||||
if(character.client)
|
||||
character.client.be_syndicate = preferences.be_special
|
||||
|
||||
ticker.mode.latespawn(character)
|
||||
|
||||
if(character.mind.assigned_role != "Cyborg")
|
||||
data_core.manifest_inject(character)
|
||||
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
|
||||
@@ -391,13 +396,16 @@
|
||||
|
||||
proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
|
||||
if (ticker.current_state == GAME_STATE_PLAYING)
|
||||
var/mob/living/silicon/ai/announcer = new (null)
|
||||
var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null)// BS12 EDIT Arrivals Announcement Computer, rather than the AI.
|
||||
a.autosay("\"[character.real_name],[character.wear_id.assignment ? " [character.wear_id.assignment]," : "" ] has arrived on the station.\"", "Arrivals Announcement Computer")
|
||||
del(a)
|
||||
/*
|
||||
var/mob/living/silicon/ai/announcer = new (null)
|
||||
announcer.name = "Arrivals Announcement Computer"
|
||||
announcer.real_name = "Arrivals Announcement Computer"
|
||||
a.autosay("\"[character.real_name],[character.wear_id.assignment ? " [character.wear_id.assignment]," : "" ] has arrived on the station.\"", announcer)
|
||||
del(a)
|
||||
del(announcer)
|
||||
*/
|
||||
|
||||
proc/LateChoices()
|
||||
var/mills = world.time // 1/10 of a second, not real milliseconds but whatever
|
||||
|
||||
@@ -296,6 +296,35 @@ datum/preferences
|
||||
dat += "Blood Type: <a href='byond://?src=\ref[user];preference=b_type;task=input'>[b_type]</a><br>"
|
||||
dat += "Skin Tone: <a href='byond://?src=\ref[user];preference=s_tone;task=input'>[-s_tone + 35]/220<br></a>"
|
||||
|
||||
dat += "Limbs: <a href='byond://?src=\ref[user];preference=limbs;task=input'>Adjust Limbs</a><br>"
|
||||
for(var/name in organ_data)
|
||||
var/status = organ_data[name]
|
||||
var/organ_name = null
|
||||
switch(name)
|
||||
if("l_arm")
|
||||
organ_name = "left arm"
|
||||
if("r_arm")
|
||||
organ_name = "right arm"
|
||||
if("l_leg")
|
||||
organ_name = "left leg"
|
||||
if("r_leg")
|
||||
organ_name = "right leg"
|
||||
if("l_foot")
|
||||
organ_name = "left foot"
|
||||
if("r_foot")
|
||||
organ_name = "right foot"
|
||||
if("l_hand")
|
||||
organ_name = "left hand"
|
||||
if("r_hand")
|
||||
organ_name = "right hand"
|
||||
|
||||
if(status == "cyborg")
|
||||
dat += "\tRobotical [organ_name] prothesis<br>"
|
||||
if(status == "amputated")
|
||||
dat += "\tAmputated [organ_name]<br>"
|
||||
dat+="<br>"
|
||||
|
||||
|
||||
if(gender == MALE)
|
||||
dat += "Underwear: <a href =\"byond://?src=\ref[user];preference=underwear;task=input\"><b>[underwear_m[underwear]]</b></a><br>"
|
||||
else
|
||||
@@ -814,10 +843,6 @@ datum/preferences
|
||||
var/list/valid_hairstyles = list()
|
||||
for(var/hairstyle in hair_styles_list)
|
||||
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
|
||||
if(gender == MALE && !S.choose_male)
|
||||
continue
|
||||
if(gender == FEMALE && !S.choose_female)
|
||||
continue
|
||||
if( !(species in S.species_allowed))
|
||||
continue
|
||||
|
||||
@@ -938,6 +963,57 @@ datum/preferences
|
||||
sec_record = secmsg
|
||||
SetRecords(user)
|
||||
|
||||
if("limbs")
|
||||
var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand")
|
||||
if(!limb_name) return
|
||||
|
||||
var/limb = null
|
||||
var/second_limb = null // if you try to change the arm, the hand should also change
|
||||
var/third_limb = null // if you try to unchange the hand, the arm should also change
|
||||
switch(limb_name)
|
||||
if("Left Leg")
|
||||
limb = "l_leg"
|
||||
second_limb = "l_foot"
|
||||
if("Right Leg")
|
||||
limb = "r_leg"
|
||||
second_limb = "r_foot"
|
||||
if("Left Arm")
|
||||
limb = "l_arm"
|
||||
second_limb = "l_hand"
|
||||
if("Right Arm")
|
||||
limb = "r_arm"
|
||||
second_limb = "r_hand"
|
||||
if("Left Foot")
|
||||
limb = "l_foot"
|
||||
third_limb = "l_leg"
|
||||
if("Right Foot")
|
||||
limb = "r_foot"
|
||||
third_limb = "r_leg"
|
||||
if("Left Hand")
|
||||
limb = "l_hand"
|
||||
third_limb = "l_arm"
|
||||
if("Right Hand")
|
||||
limb = "r_hand"
|
||||
third_limb = "r_arm"
|
||||
|
||||
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in list("Normal","Amputated","Prothesis")
|
||||
if(!new_state) return
|
||||
|
||||
switch(new_state)
|
||||
if("Normal")
|
||||
organ_data[limb] = null
|
||||
if(third_limb)
|
||||
organ_data[third_limb] = null
|
||||
if("Amputated")
|
||||
organ_data[limb] = "amputated"
|
||||
if(second_limb)
|
||||
organ_data[second_limb] = "amputated"
|
||||
if("Prothesis")
|
||||
organ_data[limb] = "cyborg"
|
||||
if(second_limb)
|
||||
organ_data[second_limb] = "cyborg"
|
||||
|
||||
|
||||
else
|
||||
switch(href_list["preference"])
|
||||
if("gender")
|
||||
@@ -1087,6 +1163,22 @@ datum/preferences
|
||||
character.h_style = h_style
|
||||
character.f_style = f_style
|
||||
|
||||
character.skills = skills
|
||||
|
||||
// Destroy/cyborgize organs
|
||||
for(var/name in organ_data)
|
||||
var/datum/organ/external/O = character.organs[name]
|
||||
if(!O) continue
|
||||
|
||||
var/status = organ_data[name]
|
||||
if(status == "amputated")
|
||||
O.amputated = 1
|
||||
O.status |= ORGAN_DESTROYED
|
||||
O.destspawn = 1
|
||||
else if(status == "cyborg")
|
||||
O.status |= ORGAN_ROBOT
|
||||
|
||||
|
||||
switch(UI_style)
|
||||
if("Orange")
|
||||
character.UI = 'icons/mob/screen1_Orange.dmi'
|
||||
@@ -1128,6 +1220,7 @@ datum/preferences
|
||||
C.midis = src.midis
|
||||
C.be_alien = be_special & BE_ALIEN
|
||||
C.be_pai = be_special & BE_PAI
|
||||
C.be_syndicate = be_special & BE_TRAITOR
|
||||
if(isnull(src.ghost_ears)) src.ghost_ears = 1 //There were problems where the default was null before someone saved their profile.
|
||||
C.ghost_ears = src.ghost_ears
|
||||
C.ghost_sight = src.ghost_sight
|
||||
|
||||
@@ -215,7 +215,29 @@ datum/preferences
|
||||
else if(species == "Skrell")
|
||||
preview_icon = new /icon('icons/effects/species.dmi', "skrell_[g]_s")
|
||||
else
|
||||
preview_icon = new /icon('icons/mob/human.dmi', "body_[g]_s")
|
||||
preview_icon = new /icon('human.dmi', "torso_[g]_s")
|
||||
|
||||
preview_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY)
|
||||
|
||||
if(organ_data["head"] != "amputated")
|
||||
preview_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY)
|
||||
|
||||
for(var/name in list("l_arm","r_arm","l_leg","r_leg","l_foot","r_foot","l_hand","r_hand"))
|
||||
// make sure the organ is added to the list so it's drawn
|
||||
if(organ_data[name] == null)
|
||||
organ_data[name] = null
|
||||
|
||||
for(var/name in organ_data)
|
||||
if(organ_data[name] == "amputated") continue
|
||||
|
||||
var/icon/temp = new /icon('human.dmi', "[name]_s")
|
||||
if(organ_data[name] == "cyborg")
|
||||
temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
|
||||
preview_icon.Blend(temp, ICON_OVERLAY)
|
||||
|
||||
preview_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY)
|
||||
|
||||
|
||||
// Skin tone
|
||||
if(species == "Human")
|
||||
|
||||
@@ -127,6 +127,8 @@ datum/preferences/proc/savefile_save(mob/user)
|
||||
F["slotname"] << src.slot_name
|
||||
F["lobby_music"] << src.lobby_music
|
||||
|
||||
F["organ_data"] << src.organ_data
|
||||
|
||||
return 1
|
||||
|
||||
// loads the savefile corresponding to the mob's ckey
|
||||
@@ -260,6 +262,9 @@ datum/preferences/proc/savefile_load(mob/user)
|
||||
if(isnull(metadata))
|
||||
metadata = ""
|
||||
|
||||
F["organ_data"] >> src.organ_data
|
||||
if(!src.organ_data) src.organ_data = list()
|
||||
|
||||
//NOTE: Conversion things go inside this if statement
|
||||
//When updating the save file remember to add 1 to BOTH the savefile constants
|
||||
//Also take the old conversion things that no longer apply out of this if
|
||||
|
||||
@@ -63,10 +63,22 @@
|
||||
name = "Shoulder-length Hair"
|
||||
icon_state = "hair_b"
|
||||
|
||||
longalt
|
||||
name = "Shoulder-length Hair Alt"
|
||||
icon_state = "hair_longfringe"
|
||||
|
||||
longish
|
||||
name = "Longer Hair"
|
||||
icon_state = "hair_b2"
|
||||
|
||||
longer
|
||||
name = "Long Hair"
|
||||
icon_state = "hair_vlong"
|
||||
|
||||
longeralt
|
||||
name = "Long Hair Alt"
|
||||
icon_state = "hair_vlongfringe"
|
||||
|
||||
longest
|
||||
name = "Very Long Hair"
|
||||
icon_state = "hair_longest"
|
||||
|
||||
@@ -523,3 +523,24 @@ obj/structure/cable/proc/cableColor(var/colorC)
|
||||
icon = 'icons/obj/power_cond_cyan.dmi'
|
||||
if("white")
|
||||
icon = 'icons/obj/power_cond_white.dmi'
|
||||
|
||||
|
||||
/obj/item/weapon/cable_coil/attack(mob/M as mob, mob/user as mob)
|
||||
if(hasorgans(M))
|
||||
var/datum/organ/external/S = M:organs[user.zone_sel.selecting]
|
||||
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
|
||||
return ..()
|
||||
if(S.burn_dam > 0)
|
||||
S.heal_damage(0,15,0,1)
|
||||
if(user != M)
|
||||
user.visible_message("\red \The [user] repairs some burn damage on their [S.display_name] with \the [src]",\
|
||||
"\red You repair some burn damage on your [S.display_name]",\
|
||||
"You hear wires being cut.")
|
||||
else
|
||||
user.visible_message("\red \The [user] repairs some burn damage on their [S.display_name] with \the [src]",\
|
||||
"\red You repair some burn damage on your [S.display_name]",\
|
||||
"You hear wires being cut.")
|
||||
else
|
||||
user << "Nothing to fix!"
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -88,9 +88,14 @@ datum
|
||||
var/current_reagent_transfer = current_reagent.volume * part
|
||||
if(preserve_data)
|
||||
trans_data = current_reagent.data
|
||||
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
|
||||
src.remove_reagent(current_reagent.id, current_reagent_transfer)
|
||||
|
||||
if((current_reagent.id == "blood" && !ishuman(target)) || current_reagent.id != "blood")
|
||||
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
|
||||
src.remove_reagent(current_reagent.id, current_reagent_transfer)
|
||||
else if(current_reagent.id == "blood" && ishuman(target)) // can never be sure
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.vessel.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
|
||||
src.remove_reagent(current_reagent.id, current_reagent_transfer)
|
||||
H.vessel.update_total()
|
||||
src.update_total()
|
||||
R.update_total()
|
||||
R.handle_reactions()
|
||||
|
||||
36
code/modules/reagents/reagent_containers/blood_pack.dm
Normal file
@@ -0,0 +1,36 @@
|
||||
/obj/item/weapon/reagent_containers/blood
|
||||
name = "BloodPack"
|
||||
desc = "Contains blood used for transfusion."
|
||||
icon = 'icons/obj/bloodpack.dmi'
|
||||
volume = 200
|
||||
|
||||
var/blood_type = null
|
||||
|
||||
New()
|
||||
..()
|
||||
if(blood_type != null)
|
||||
name = "BloodPack [blood_type]"
|
||||
reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/APlus
|
||||
blood_type = "A+"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/AMinus
|
||||
blood_type = "A-"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/BPlus
|
||||
blood_type = "B+"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/BMinus
|
||||
blood_type = "B-"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/OPlus
|
||||
blood_type = "O+"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/OMinus
|
||||
blood_type = "O-"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/empty
|
||||
name = "Empty BloodPack"
|
||||
desc = "Seems pretty useless... Maybe if there were a way to fill it?"
|
||||
icon_state = "empty"
|
||||
@@ -26,7 +26,8 @@
|
||||
/obj/machinery/bot/medbot,
|
||||
/obj/machinery/computer/pandemic,
|
||||
/obj/item/weapon/secstorage/ssafe,
|
||||
/obj/machinery/disposal
|
||||
/obj/machinery/disposal,
|
||||
/obj/machinery/iv_drip
|
||||
)
|
||||
|
||||
examine()
|
||||
@@ -222,4 +223,4 @@
|
||||
..()
|
||||
reagents.add_reagent("fluorosurfactant", 20)
|
||||
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -93,22 +93,18 @@
|
||||
..()
|
||||
reagents.add_reagent("fuel",1000)
|
||||
|
||||
|
||||
bullet_act(var/obj/item/projectile/Proj)
|
||||
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
|
||||
explosion(src.loc,-1,0,2)
|
||||
if(src)
|
||||
del(src)
|
||||
|
||||
|
||||
explode()
|
||||
|
||||
blob_act()
|
||||
explosion(src.loc,0,1,5,7,10)
|
||||
if(src)
|
||||
del(src)
|
||||
explode()
|
||||
|
||||
ex_act()
|
||||
explosion(src.loc,-1,0,2)
|
||||
explode()
|
||||
|
||||
proc/explode()
|
||||
explosion(src.loc,1,2,4)
|
||||
if(src)
|
||||
del(src)
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
abi79 - Game Master
|
||||
arcalane - Game Admin
|
||||
asanadas - Game Admin
|
||||
bobbehluvspropane - Game Admin
|
||||
cacophony - Game Admin
|
||||
cajoes - Game Admin
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
; just add the ckey (lowercase) of every moderator on a separate line
|
||||
; lines starting with ; are comments and will be ignored
|
||||
asanadas
|
||||
botanistpower
|
||||
bowlsoldier
|
||||
chinsky
|
||||
cubejackal
|
||||
dakonic
|
||||
densane
|
||||
@@ -17,5 +15,6 @@ roaper
|
||||
searif
|
||||
sparklysheep
|
||||
themij
|
||||
chinsky
|
||||
; Why u no keep list in alphabetical order?! Lazies! Lazies! -Abi
|
||||
; Imma best alphabetiser - Erthilo
|
||||
; Imma best alphabetiser - Erthilo
|
||||
|
||||
@@ -56,6 +56,44 @@ Stuff which is in development and not yet visible to players or just code relate
|
||||
should be listed in the changelog upon commit though. Thanks. -->
|
||||
|
||||
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
|
||||
<div class="commit sansserif">
|
||||
|
||||
|
||||
<h2 class="date">October 18th</h2>
|
||||
<h3 class="author">CIB updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Added a new type of wound, internal wounds. These should later be treated with surgery, though for now bicardine works.</li>
|
||||
<li class="tweak">Appendicitis now has a fourth stage in which the appendix burst and an internal wound is inflicted.</li>
|
||||
<li class="rscadd">The full body scanner is back.</li>
|
||||
</ul>
|
||||
<h3 class="author">Chinsky updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Buffed up welder fuel tanks for all your nefarious needs.</li>
|
||||
<li class="tweak">Replaced evac hallway lights with less.. party ones.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="commit sansserif">
|
||||
|
||||
|
||||
<h2 class="date">17.10.2012</h2>
|
||||
<h3 class="author">CIB updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Ported limb selection on startup. Note that this may still be bugged, so use at own risk.</li>
|
||||
<li class="tweak">You can now select opposite gender hairstyles.</li>
|
||||
</ul>
|
||||
<h3 class="author">Chinsky updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixed arrivals announcment.</li>
|
||||
<li class="bugfix">Slur will properly fade away with time now.</li>
|
||||
<li class="bugfix">Anti-alco chem will get rid of slur now.</li>
|
||||
<li class="tweak">Throwing metal item at eletrified grilles and doors will cause them to spark.</li>
|
||||
<li class="rscadd">Added forensics tech jackets.</li>
|
||||
<li class="rscadd">Ported some hairstyles from pre-merge code.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="commit sansserif">
|
||||
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">October 13th, 2012</h2>
|
||||
|
||||
|
Before Width: | Height: | Size: 187 KiB After Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 228 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 103 KiB |
BIN
icons/obj/bloodpack.dmi
Normal file
|
After Width: | Height: | Size: 901 B |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 55 KiB |
BIN
icons/obj/iv_drip.dmi
Normal file
|
After Width: | Height: | Size: 881 B |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 8.0 KiB |