Changed way substitute tools are handled.

Now all tools have chance of success. Proper ones have 100.
If tool has less than 100 chance of success, it can fail the step.
This commit is contained in:
Chinsky
2013-05-28 18:16:11 +04:00
parent 6a4a58df61
commit c84ce517e3
11 changed files with 206 additions and 99 deletions

View File

@@ -18,8 +18,11 @@
return 1
/datum/surgery_step/appendectomy/cut_appendix
required_tool = /obj/item/weapon/scalpel
allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 70
max_duration = 90
@@ -45,8 +48,11 @@
groin.createwound(CUT, 50, 1)
/datum/surgery_step/appendectomy/remove_appendix
required_tool = /obj/item/weapon/hemostat
allowed_tools = list(/obj/item/weapon/wirecutters)
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/wirecutters = 75, \
/obj/item/weapon/kitchen/utensil/fork = 20
)
min_duration = 60
max_duration = 80

View File

@@ -4,9 +4,10 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/glue_bone
priority = 2
required_tool = /obj/item/weapon/bonegel
allowed_tools = list(/obj/item/weapon/screwdriver)
allowed_tools = list(
/obj/item/weapon/bonegel = 100, \
/obj/item/weapon/screwdriver = 75
)
can_infect = 1
blood_level = 1
@@ -37,8 +38,10 @@
"\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
allowed_tools = list(/obj/item/weapon/wrench)
allowed_tools = list(
/obj/item/weapon/bonesetter = 100, \
/obj/item/weapon/wrench = 75 \
)
min_duration = 60
max_duration = 70
@@ -72,8 +75,10 @@
affected.createwound(BRUISE, 5)
/datum/surgery_step/mend_skull
required_tool = /obj/item/weapon/bonesetter
allowed_tools = list(/obj/item/weapon/wrench)
allowed_tools = list(
/obj/item/weapon/bonesetter = 100, \
/obj/item/weapon/wrench = 75 \
)
min_duration = 60
max_duration = 70
@@ -102,8 +107,10 @@
h.disfigured = 1
/datum/surgery_step/finish_bone
required_tool = /obj/item/weapon/bonegel
allowed_tools = list(/obj/item/weapon/screwdriver)
allowed_tools = list(
/obj/item/weapon/bonegel = 100, \
/obj/item/weapon/screwdriver = 75
)
can_infect = 1
blood_level = 1

View File

@@ -10,7 +10,10 @@
return target_zone == "head" && hasorgans(target)
/datum/surgery_step/brain/saw_skull
required_tool = /obj/item/weapon/circular_saw
allowed_tools = list(
/obj/item/weapon/circular_saw = 100, \
/obj/item/weapon/hatchet = 75
)
min_duration = 50
max_duration = 70
@@ -31,11 +34,14 @@
fail_step(mob/living/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")
target.apply_damage(max(10, tool.force), BRUTE, "head")
/datum/surgery_step/brain/cut_brain
required_tool = /obj/item/weapon/scalpel
allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 80
max_duration = 100
@@ -59,7 +65,10 @@
target.apply_damage(50, BRUTE, "head", 1)
/datum/surgery_step/brain/saw_spine
required_tool = /obj/item/weapon/circular_saw
allowed_tools = list(
/obj/item/weapon/circular_saw = 100, \
/obj/item/weapon/hatchet = 75
)
min_duration = 50
max_duration = 70
@@ -103,8 +112,11 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/brain/bone_chips
required_tool = /obj/item/weapon/hemostat
allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork)
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/wirecutters = 75, \
/obj/item/weapon/kitchen/utensil/fork = 20
)
min_duration = 80
max_duration = 100
@@ -129,8 +141,10 @@
target.apply_damage(30, BRUTE, "head", 1)
/datum/surgery_step/brain/hematoma
required_tool = /obj/item/weapon/FixOVein
allowed_tools = list(/obj/item/weapon/cable_coil)
allowed_tools = list(
/obj/item/weapon/FixOVein , \
/obj/item/weapon/cable_coil
)
min_duration = 90
max_duration = 110
@@ -165,8 +179,11 @@
return istype(target, /mob/living/carbon/slime/) && target.stat == 2
/datum/surgery_step/slime/cut_flesh
required_tool = /obj/item/weapon/scalpel
allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 30
max_duration = 50
@@ -188,8 +205,11 @@
"\red Your hand slips, tearing [target]'s flesh with \the [tool]!")
/datum/surgery_step/slime/cut_innards
required_tool = /obj/item/weapon/scalpel
allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 30
max_duration = 50
@@ -211,7 +231,10 @@
"\red Your hand slips, tearing [target]'s innards with \the [tool]!")
/datum/surgery_step/slime/saw_core
required_tool = /obj/item/weapon/circular_saw
allowed_tools = list(
/obj/item/weapon/circular_saw = 100, \
/obj/item/weapon/hatchet = 75
)
min_duration = 50
max_duration = 70

View File

@@ -15,8 +15,11 @@
return target_zone == "eyes"
/datum/surgery_step/eye/cut_open
required_tool = /obj/item/weapon/scalpel
allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 90
max_duration = 110
@@ -41,8 +44,10 @@
affected.createwound(CUT, 10)
/datum/surgery_step/eye/lift_eyes
required_tool = /obj/item/weapon/retractor
allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
allowed_tools = list(
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/kitchen/utensil/fork = 50
)
min_duration = 30
max_duration = 40
@@ -67,8 +72,11 @@
target.apply_damage(10, BRUTE, affected)
/datum/surgery_step/eye/mend_eyes
required_tool = /obj/item/weapon/hemostat
allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/cable_coil = 75, \
/obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity.
)
min_duration = 80
max_duration = 100
@@ -93,8 +101,12 @@
target.apply_damage(10, BRUTE, affected)
/datum/surgery_step/eye/cauterize
required_tool = /obj/item/weapon/cautery
allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
allowed_tools = list(
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
/obj/item/weapon/weldingtool = 25
)
min_duration = 70
max_duration = 100

View File

@@ -15,8 +15,11 @@
return target_zone == "mouth"
/datum/surgery_step/generic/cut_face
required_tool = /obj/item/weapon/scalpel
allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 90
max_duration = 110
@@ -42,8 +45,11 @@
target.losebreath += 10
/datum/surgery_step/face/mend_vocal
required_tool = /obj/item/weapon/hemostat
allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/cable_coil = 75, \
/obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity.
)
min_duration = 70
max_duration = 90
@@ -67,8 +73,10 @@
target.losebreath += 10
/datum/surgery_step/face/fix_face
required_tool = /obj/item/weapon/retractor
allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
allowed_tools = list(
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 55, \
/obj/item/weapon/kitchen/utensil/fork = 75)
min_duration = 80
max_duration = 100
@@ -93,8 +101,12 @@
target.apply_damage(10, BRUTE, affected)
/datum/surgery_step/face/cauterize
required_tool = /obj/item/weapon/cautery
allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
allowed_tools = list(
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
/obj/item/weapon/weldingtool = 25
)
min_duration = 70
max_duration = 100

View File

@@ -20,8 +20,11 @@
return 1
/datum/surgery_step/generic/cut_open
required_tool = /obj/item/weapon/scalpel
allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 90
max_duration = 110
@@ -53,8 +56,11 @@
affected.createwound(CUT, 10)
/datum/surgery_step/generic/clamp_bleeders
required_tool = /obj/item/weapon/hemostat
allowed_tools = list(/obj/item/weapon/cable_coil, /obj/item/device/assembly/mousetrap)
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/cable_coil = 75, \
/obj/item/device/assembly/mousetrap = 20
)
min_duration = 40
max_duration = 60
@@ -84,8 +90,11 @@
affected.createwound(CUT, 10)
/datum/surgery_step/generic/retract_skin
required_tool = /obj/item/weapon/retractor
allowed_tools = list(/obj/item/weapon/crowbar,/obj/item/weapon/kitchen/utensil/fork)
allowed_tools = list(
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75, \
/obj/item/weapon/kitchen/utensil/fork = 50
)
min_duration = 30
max_duration = 40
@@ -135,8 +144,12 @@
target.apply_damage(12, BRUTE, affected)
/datum/surgery_step/generic/cauterize
required_tool = /obj/item/weapon/cautery
allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
allowed_tools = list(
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
/obj/item/weapon/weldingtool = 25
)
min_duration = 70
max_duration = 100
@@ -167,7 +180,10 @@
target.apply_damage(3, BURN, affected)
/datum/surgery_step/generic/cut_limb
required_tool = /obj/item/weapon/circular_saw
allowed_tools = list(
/obj/item/weapon/circular_saw = 100, \
/obj/item/weapon/hatchet = 75
)
min_duration = 110
max_duration = 160

View File

@@ -31,8 +31,11 @@
return ""
/datum/surgery_step/cavity/make_space
required_tool = /obj/item/weapon/surgicaldrill
allowed_tools = list(/obj/item/weapon/pen,/obj/item/stack/rods)
allowed_tools = list(
/obj/item/weapon/surgicaldrill = 100, \
/obj/item/weapon/pen = 75, \
/obj/item/stack/rods = 50
)
min_duration = 60
max_duration = 80
@@ -62,8 +65,12 @@
/datum/surgery_step/cavity/close_space
priority = 2
required_tool = /obj/item/weapon/cautery
allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
allowed_tools = list(
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
/obj/item/weapon/weldingtool = 25
)
min_duration = 60
max_duration = 80
@@ -93,7 +100,7 @@
/datum/surgery_step/cavity/place_item
priority = 0
required_tool = /obj/item
allowed_tools = list(/obj/item = 100)
min_duration = 80
max_duration = 100
@@ -136,8 +143,11 @@
//////////////////////////////////////////////////////////////////
/datum/surgery_step/cavity/implant_removal
required_tool = /obj/item/weapon/hemostat
allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork)
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/wirecutters = 75, \
/obj/item/weapon/kitchen/utensil/fork = 20
)
min_duration = 80
max_duration = 100
@@ -159,8 +169,6 @@
find_prob +=60
else
find_prob +=40
if (isright(tool))
find_prob +=20
if (prob(find_prob))
user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.display_name] with \the [tool].", \
"\blue You take something out of incision on [target]'s [affected.display_name]s with \the [tool]." )
@@ -189,8 +197,7 @@
affected.createwound(CUT, 20)
if (affected.implants.len)
var/fail_prob = 10
if (!isright(tool))
fail_prob += 30
fail_prob += 100 - tool_quality(tool)
if (prob(fail_prob))
var/obj/item/weapon/implant/imp = affected.implants[1]
user.visible_message("\red Something beeps inside [target]'s [affected.display_name]!")

View File

@@ -6,8 +6,10 @@
/datum/surgery_step/fix_vein
priority = 2
required_tool = /obj/item/weapon/FixOVein
allowed_tools = list(/obj/item/weapon/cable_coil)
allowed_tools = list(
/obj/item/weapon/circular_saw = 100, \
/obj/item/weapon/hatchet = 75
)
can_infect = 1
blood_level = 1

View File

@@ -10,7 +10,10 @@
return target_zone == "chest"
/datum/surgery_step/ribcage/saw_ribcage
required_tool = /obj/item/weapon/circular_saw
allowed_tools = list(
/obj/item/weapon/circular_saw = 100, \
/obj/item/weapon/hatchet = 75
)
min_duration = 50
max_duration = 70
@@ -41,8 +44,11 @@
/datum/surgery_step/ribcage/retract_ribcage
required_tool = /obj/item/weapon/retractor
allowed_tools = list(/obj/item/weapon/crowbar)
allowed_tools = list(
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75, \
/obj/item/weapon/kitchen/utensil/fork = 20
)
min_duration = 30
max_duration = 40
@@ -77,8 +83,12 @@
affected.fracture()
/datum/surgery_step/ribcage/close_ribcage
required_tool = /obj/item/weapon/retractor
allowed_tools = list(/obj/item/weapon/crowbar)
allowed_tools = list(
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75, \
/obj/item/weapon/kitchen/utensil/fork = 20
)
min_duration = 20
max_duration = 40
@@ -112,7 +122,10 @@
target.rupture_lung()
/datum/surgery_step/ribcage/mend_ribcage
required_tool = /obj/item/weapon/bonegel
allowed_tools = list(
/obj/item/weapon/bonegel = 100, \
/obj/item/weapon/screwdriver = 75
)
min_duration = 20
max_duration = 40
@@ -127,7 +140,6 @@
target.custom_pain("Something hurts horribly in your chest!",1)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "\blue [user] applied \the [tool] to [target]'s ribcage."
var/self_msg = "\blue You applied \the [tool] to [target]'s ribcage."
@@ -139,7 +151,11 @@
// ALIEN EMBRYO SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/ribcage/remove_embryo
required_tool = /obj/item/weapon/hemostat
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/wirecutters = 75, \
/obj/item/weapon/kitchen/utensil/fork = 20
)
blood_level = 2
min_duration = 80
@@ -171,8 +187,11 @@
// CHEST INTERNAL ORGAN SURGERY //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/ribcage/fix_chest_internal
required_tool = /obj/item/weapon/scalpel
allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 70
max_duration = 90

View File

@@ -20,8 +20,11 @@
/datum/surgery_step/limb/cut
required_tool = /obj/item/weapon/scalpel
allowed_tools = list(/obj/item/weapon/shard, /obj/item/weapon/kitchenknife)
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchenknife = 75, \
/obj/item/weapon/shard = 50, \
)
min_duration = 80
max_duration = 100
@@ -48,8 +51,10 @@
/datum/surgery_step/limb/mend
required_tool = /obj/item/weapon/retractor
allowed_tools = list(/obj/item/weapon/kitchen/utensil/fork)
allowed_tools = list(
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75, \
/obj/item/weapon/kitchen/utensil/fork = 50)
min_duration = 80
max_duration = 100
@@ -80,8 +85,12 @@
/datum/surgery_step/limb/prepare
required_tool = /obj/item/weapon/cautery
allowed_tools = list(/obj/item/weapon/weldingtool, /obj/item/clothing/mask/cigarette, /obj/item/weapon/lighter)
allowed_tools = list(
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
/obj/item/weapon/weldingtool = 25
)
min_duration = 60
max_duration = 70
@@ -115,7 +124,7 @@
/datum/surgery_step/limb/attach
required_tool = /obj/item/robot_parts
allowed_tools = list(/obj/item/robot_parts = 100)
can_infect = 0
min_duration = 80

View File

@@ -2,10 +2,8 @@
/datum/surgery_step
var/priority = 0 //steps with higher priority would be attempted first
// 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
// type path referencing tools that can be used for this step, and how well are they suited for it
var/list/allowed_tools = null
// duration of the step
@@ -17,16 +15,11 @@
//How much blood this step can get on surgeon. 1 - hands, 2 - full body.
var/blood_level = 0
//is it is a required surgical tool for this step
proc/isright(obj/item/tool)
return (istype(tool,required_tool))
//is it is an accepted replacement tool for this step
proc/isacceptable(obj/item/tool)
if (allowed_tools)
for (var/T in allowed_tools)
if (istype(tool,T))
return 1
//returns how well tool is suited for this step
proc/tool_quality(obj/item/tool)
for (var/T in allowed_tools)
if (istype(tool,T))
return allowed_tools[T]
return 0
// checks whether this step can be applied with the given user and target
@@ -69,10 +62,11 @@ proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool)
if (user.a_intent == "harm") //check for Hippocratic Oath
return 0
for(var/datum/surgery_step/S in surgery_steps)
if( (S.isright(tool) || S.isacceptable(tool)) && \
S.can_use(user, M, user.zone_sel.selecting, tool)) //check if tool is right or close enough and if this step is possible
S.begin_step(user, M, user.zone_sel.selecting, tool) //start on it
if(do_mob(user, M, rand(S.min_duration, S.max_duration))) //if user did nto move or changed hands
//check if tool is right or close enough and if this step is possible
if( S.tool_quality(tool) && S.can_use(user, M, user.zone_sel.selecting, tool))
S.begin_step(user, M, user.zone_sel.selecting, tool) //start on it
//We had proper tools! (or RNG smiled.) and User did not move or change hands.
if( prob(S.tool_quality(tool)) && do_mob(user, M, rand(S.min_duration, S.max_duration)))
S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully
else //or
S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~