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>
This commit is contained in:
Cael_Aislinn
2012-10-21 01:25:04 +10:00
77 changed files with 10392 additions and 9860 deletions

View File

@@ -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"

View File

@@ -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)

View File

@@ -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?

View File

@@ -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

View File

@@ -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--

View File

@@ -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()

View File

@@ -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()

View File

@@ -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()

View File

@@ -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)

View File

@@ -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

View File

@@ -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..."

View File

@@ -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

View File

@@ -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()

View File

@@ -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")

View File

@@ -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

View File

@@ -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()

View 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."

View File

@@ -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)
///////////////////////////

View File

@@ -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))

View 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 ..()

View File

@@ -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>"

View File

@@ -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/

View File

@@ -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)

View File

@@ -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."

View File

@@ -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)

View File

@@ -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()

View 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."

View 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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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." \
)

View File

@@ -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()
..()
..()

View File

@@ -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)

View File

@@ -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()

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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 ..()

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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))

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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.

View File

@@ -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]"

View File

@@ -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))

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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")

View File

@@ -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

View File

@@ -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"

View File

@@ -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 ..()

View File

@@ -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()

File diff suppressed because it is too large Load Diff

View 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"

View File

@@ -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)
*/
*/

View File

@@ -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)

View File

@@ -1,5 +1,6 @@
abi79 - Game Master
arcalane - Game Admin
asanadas - Game Admin
bobbehluvspropane - Game Admin
cacophony - Game Admin
cajoes - Game Admin

View File

@@ -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

View File

@@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 103 KiB

BIN
icons/obj/bloodpack.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 901 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 55 KiB

BIN
icons/obj/iv_drip.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 881 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

File diff suppressed because it is too large Load Diff