From d45073a5ab1a88682e1fd56e2e717da27c56eb74 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Tue, 28 May 2013 03:12:58 +0400 Subject: [PATCH 01/10] Added new item - hailer. Use in hand to make it say HALT! SECURITY! Should help in asking people to halt while running. --- baystation12.dme | 230 +-------------------- code/game/objects/items/devices/whistle.dm | 21 ++ sound/voice/halt.ogg | Bin 0 -> 10448 bytes 3 files changed, 25 insertions(+), 226 deletions(-) create mode 100644 code/game/objects/items/devices/whistle.dm create mode 100644 sound/voice/halt.ogg diff --git a/baystation12.dme b/baystation12.dme index 79f0e2de777..ef839733bc9 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -6,235 +6,14 @@ // BEGIN_FILE_DIR #define FILE_DIR . #define FILE_DIR "code" -#define FILE_DIR "code/__HELPERS" -#define FILE_DIR "code/ATMOSPHERICS" -#define FILE_DIR "code/ATMOSPHERICS/components" -#define FILE_DIR "code/ATMOSPHERICS/components/binary_devices" -#define FILE_DIR "code/ATMOSPHERICS/components/trinary_devices" -#define FILE_DIR "code/ATMOSPHERICS/components/unary" -#define FILE_DIR "code/controllers" -#define FILE_DIR "code/datums" -#define FILE_DIR "code/datums/diseases" -#define FILE_DIR "code/datums/diseases/advance" -#define FILE_DIR "code/datums/diseases/advance/symptoms" -#define FILE_DIR "code/datums/helper_datums" -#define FILE_DIR "code/datums/spells" -#define FILE_DIR "code/defines" -#define FILE_DIR "code/defines/obj" -#define FILE_DIR "code/defines/procs" -#define FILE_DIR "code/FEA" -#define FILE_DIR "code/game" -#define FILE_DIR "code/game/area" -#define FILE_DIR "code/game/gamemodes" -#define FILE_DIR "code/game/gamemodes/autotraitor" -#define FILE_DIR "code/game/gamemodes/blob" -#define FILE_DIR "code/game/gamemodes/blob/blobs" -#define FILE_DIR "code/game/gamemodes/changeling" -#define FILE_DIR "code/game/gamemodes/cult" -#define FILE_DIR "code/game/gamemodes/epidemic" -#define FILE_DIR "code/game/gamemodes/events" -#define FILE_DIR "code/game/gamemodes/events/holidays" -#define FILE_DIR "code/game/gamemodes/extended" -#define FILE_DIR "code/game/gamemodes/malfunction" -#define FILE_DIR "code/game/gamemodes/meme" -#define FILE_DIR "code/game/gamemodes/meteor" -#define FILE_DIR "code/game/gamemodes/nuclear" -#define FILE_DIR "code/game/gamemodes/revolution" -#define FILE_DIR "code/game/gamemodes/sandbox" -#define FILE_DIR "code/game/gamemodes/traitor" -#define FILE_DIR "code/game/gamemodes/wizard" -#define FILE_DIR "code/game/jobs" -#define FILE_DIR "code/game/jobs/job" -#define FILE_DIR "code/game/machinery" -#define FILE_DIR "code/game/machinery/atmoalter" -#define FILE_DIR "code/game/machinery/bots" -#define FILE_DIR "code/game/machinery/camera" -#define FILE_DIR "code/game/machinery/computer" -#define FILE_DIR "code/game/machinery/doors" -#define FILE_DIR "code/game/machinery/embedded_controller" -#define FILE_DIR "code/game/machinery/kitchen" -#define FILE_DIR "code/game/machinery/pipe" -#define FILE_DIR "code/game/machinery/telecomms" -#define FILE_DIR "code/game/magic" -#define FILE_DIR "code/game/mecha" -#define FILE_DIR "code/game/mecha/combat" -#define FILE_DIR "code/game/mecha/equipment" -#define FILE_DIR "code/game/mecha/equipment/tools" -#define FILE_DIR "code/game/mecha/equipment/weapons" -#define FILE_DIR "code/game/mecha/medical" -#define FILE_DIR "code/game/mecha/working" -#define FILE_DIR "code/game/objects" -#define FILE_DIR "code/game/objects/closets" -#define FILE_DIR "code/game/objects/closets/secure" -#define FILE_DIR "code/game/objects/effects" -#define FILE_DIR "code/game/objects/effects/decals" -#define FILE_DIR "code/game/objects/effects/decals/Cleanable" -#define FILE_DIR "code/game/objects/effects/spawners" -#define FILE_DIR "code/game/objects/items" -#define FILE_DIR "code/game/objects/items/devices" -#define FILE_DIR "code/game/objects/items/devices/PDA" -#define FILE_DIR "code/game/objects/items/devices/radio" -#define FILE_DIR "code/game/objects/items/robot" -#define FILE_DIR "code/game/objects/items/stacks" -#define FILE_DIR "code/game/objects/items/stacks/sheets" -#define FILE_DIR "code/game/objects/items/stacks/tiles" -#define FILE_DIR "code/game/objects/items/weapons" -#define FILE_DIR "code/game/objects/items/weapons/grenades" -#define FILE_DIR "code/game/objects/items/weapons/implants" -#define FILE_DIR "code/game/objects/items/weapons/melee" -#define FILE_DIR "code/game/objects/items/weapons/storage" -#define FILE_DIR "code/game/objects/items/weapons/tanks" -#define FILE_DIR "code/game/objects/storage" -#define FILE_DIR "code/game/objects/structures" -#define FILE_DIR "code/game/objects/structures/crates_lockers" -#define FILE_DIR "code/game/objects/structures/crates_lockers/closets" -#define FILE_DIR "code/game/objects/structures/crates_lockers/closets/secure" -#define FILE_DIR "code/game/objects/structures/stool_bed_chair_nest" -#define FILE_DIR "code/game/structure" -#define FILE_DIR "code/game/turfs" -#define FILE_DIR "code/game/turfs/simulated" -#define FILE_DIR "code/game/turfs/space" -#define FILE_DIR "code/game/turfs/unsimulated" -#define FILE_DIR "code/game/vehicles" -#define FILE_DIR "code/game/verbs" -#define FILE_DIR "code/js" -#define FILE_DIR "code/modules" -#define FILE_DIR "code/modules/admin" -#define FILE_DIR "code/modules/admin/DB ban" -#define FILE_DIR "code/modules/admin/permissionverbs" -#define FILE_DIR "code/modules/admin/verbs" -#define FILE_DIR "code/modules/assembly" -#define FILE_DIR "code/modules/awaymissions" -#define FILE_DIR "code/modules/awaymissions/maploader" -#define FILE_DIR "code/modules/client" -#define FILE_DIR "code/modules/clothing" -#define FILE_DIR "code/modules/clothing/glasses" -#define FILE_DIR "code/modules/clothing/gloves" -#define FILE_DIR "code/modules/clothing/head" -#define FILE_DIR "code/modules/clothing/masks" -#define FILE_DIR "code/modules/clothing/shoes" -#define FILE_DIR "code/modules/clothing/spacesuits" -#define FILE_DIR "code/modules/clothing/suits" -#define FILE_DIR "code/modules/clothing/under" -#define FILE_DIR "code/modules/clothing/under/jobs" -#define FILE_DIR "code/modules/customitems" -#define FILE_DIR "code/modules/destilery" -#define FILE_DIR "code/modules/DetectiveWork" -#define FILE_DIR "code/modules/events" -#define FILE_DIR "code/modules/flufftext" -#define FILE_DIR "code/modules/food" -#define FILE_DIR "code/modules/genetics" -#define FILE_DIR "code/modules/icon generation" -#define FILE_DIR "code/modules/library" -#define FILE_DIR "code/modules/liquid" -#define FILE_DIR "code/modules/maps" -#define FILE_DIR "code/modules/mining" -#define FILE_DIR "code/modules/mob" -#define FILE_DIR "code/modules/mob/dead" -#define FILE_DIR "code/modules/mob/dead/observer" -#define FILE_DIR "code/modules/mob/living" -#define FILE_DIR "code/modules/mob/living/blob" -#define FILE_DIR "code/modules/mob/living/carbon" -#define FILE_DIR "code/modules/mob/living/carbon/alien" -#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid" -#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste" -#define FILE_DIR "code/modules/mob/living/carbon/alien/larva" -#define FILE_DIR "code/modules/mob/living/carbon/alien/special" -#define FILE_DIR "code/modules/mob/living/carbon/brain" -#define FILE_DIR "code/modules/mob/living/carbon/human" -#define FILE_DIR "code/modules/mob/living/carbon/metroid" -#define FILE_DIR "code/modules/mob/living/carbon/monkey" -#define FILE_DIR "code/modules/mob/living/silicon" -#define FILE_DIR "code/modules/mob/living/silicon/ai" -#define FILE_DIR "code/modules/mob/living/silicon/ai/freelook" -#define FILE_DIR "code/modules/mob/living/silicon/decoy" -#define FILE_DIR "code/modules/mob/living/silicon/pai" -#define FILE_DIR "code/modules/mob/living/silicon/robot" -#define FILE_DIR "code/modules/mob/living/simple_animal" -#define FILE_DIR "code/modules/mob/living/simple_animal/friendly" -#define FILE_DIR "code/modules/mob/living/simple_animal/hostile" -#define FILE_DIR "code/modules/mob/living/simple_animal/hostile/retaliate" -#define FILE_DIR "code/modules/mob/new_player" -#define FILE_DIR "code/modules/organs" -#define FILE_DIR "code/modules/paperwork" -#define FILE_DIR "code/modules/power" -#define FILE_DIR "code/modules/power/antimatter" -#define FILE_DIR "code/modules/power/singularity" -#define FILE_DIR "code/modules/power/singularity/particle_accelerator" -#define FILE_DIR "code/modules/projectiles" -#define FILE_DIR "code/modules/projectiles/ammunition" -#define FILE_DIR "code/modules/projectiles/guns" -#define FILE_DIR "code/modules/projectiles/guns/energy" -#define FILE_DIR "code/modules/projectiles/guns/projectile" -#define FILE_DIR "code/modules/projectiles/projectile" -#define FILE_DIR "code/modules/reagents" -#define FILE_DIR "code/modules/reagents/reagent_containers" -#define FILE_DIR "code/modules/reagents/reagent_containers/food" -#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks" -#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks/bottle" -#define FILE_DIR "code/modules/reagents/reagent_containers/food/snacks" -#define FILE_DIR "code/modules/reagents/reagent_containers/glass" -#define FILE_DIR "code/modules/reagents/reagent_containers/glass/bottle" -#define FILE_DIR "code/modules/recycling" -#define FILE_DIR "code/modules/research" -#define FILE_DIR "code/modules/research/xenoarchaeology" -#define FILE_DIR "code/modules/research/xenoarchaeology/artifact" -#define FILE_DIR "code/modules/research/xenoarchaeology/artifact/effects" -#define FILE_DIR "code/modules/research/xenoarchaeology/finds" -#define FILE_DIR "code/modules/research/xenoarchaeology/machinery" -#define FILE_DIR "code/modules/research/xenoarchaeology/tools" -#define FILE_DIR "code/modules/scripting" -#define FILE_DIR "code/modules/scripting/AST" -#define FILE_DIR "code/modules/scripting/AST/Operators" -#define FILE_DIR "code/modules/scripting/Implementations" -#define FILE_DIR "code/modules/scripting/Interpreter" -#define FILE_DIR "code/modules/scripting/Parser" -#define FILE_DIR "code/modules/scripting/Scanner" -#define FILE_DIR "code/modules/security levels" -#define FILE_DIR "code/modules/surgery" #define FILE_DIR "code/TriDimension" -#define FILE_DIR "code/unused" -#define FILE_DIR "code/unused/beast" -#define FILE_DIR "code/unused/computer2" -#define FILE_DIR "code/unused/disease2" -#define FILE_DIR "code/unused/gamemodes" -#define FILE_DIR "code/unused/hivebot" -#define FILE_DIR "code/unused/mining" -#define FILE_DIR "code/unused/optics" -#define FILE_DIR "code/unused/pda2" -#define FILE_DIR "code/unused/powerarmor" -#define FILE_DIR "code/unused/spacecraft" #define FILE_DIR "code/WorkInProgress" -#define FILE_DIR "code/WorkInProgress/AI_Visibility" -#define FILE_DIR "code/WorkInProgress/animusstation" -#define FILE_DIR "code/WorkInProgress/Apples" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn" -#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Economy" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Jungle" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/ShieldGen" #define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter" -#define FILE_DIR "code/WorkInProgress/carn" -#define FILE_DIR "code/WorkInProgress/Chinsky" -#define FILE_DIR "code/WorkInProgress/Cib" -#define FILE_DIR "code/WorkInProgress/Cib/amorph" -#define FILE_DIR "code/WorkInProgress/Mini" -#define FILE_DIR "code/WorkInProgress/Mloc" -#define FILE_DIR "code/WorkInProgress/organs" -#define FILE_DIR "code/WorkInProgress/Ported" -#define FILE_DIR "code/WorkInProgress/Ported/Abi79" -#define FILE_DIR "code/WorkInProgress/Ported/Bureaucracy" -#define FILE_DIR "code/WorkInProgress/Ported/Spawners" -#define FILE_DIR "code/WorkInProgress/Sigyn" -#define FILE_DIR "code/WorkInProgress/Sigyn/Department Sec" -#define FILE_DIR "code/WorkInProgress/Sigyn/Softcurity" -#define FILE_DIR "code/WorkInProgress/SkyMarshal" #define FILE_DIR "code/WorkInProgress/Susan" -#define FILE_DIR "code/WorkInProgress/Tastyfish" -#define FILE_DIR "code/WorkInProgress/virus2" -#define FILE_DIR "code/WorkInProgress/virus2/Disease2" -#define FILE_DIR "code/WorkInProgress/Wrongnumber" -#define FILE_DIR "code/ZAS" #define FILE_DIR "html" #define FILE_DIR "icons" #define FILE_DIR "icons/48x48" @@ -257,9 +36,6 @@ #define FILE_DIR "icons/turf" #define FILE_DIR "icons/vending_icons" #define FILE_DIR "icons/xenoarch_icons" -#define FILE_DIR "interface" -#define FILE_DIR "maps" -#define FILE_DIR "maps/RandomZLevels" #define FILE_DIR "sound" #define FILE_DIR "sound/AI" #define FILE_DIR "sound/ambience" @@ -278,7 +54,8 @@ #define FILE_DIR "sound/voice/Serithi" #define FILE_DIR "sound/weapons" #define FILE_DIR "tools" -#define FILE_DIR "tools/Redirector" +#define FILE_DIR "tools/AddToChangelog" +#define FILE_DIR "tools/AddToChangelog/AddToChangelog" // END_FILE_DIR // BEGIN_PREFERENCES #define DEBUG @@ -718,6 +495,7 @@ #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplinks.dm" #include "code\game\objects\items\devices\violin.dm" +#include "code\game\objects\items\devices\whistle.dm" #include "code\game\objects\items\devices\PDA\cart.dm" #include "code\game\objects\items\devices\PDA\chatroom.dm" #include "code\game\objects\items\devices\PDA\PDA.dm" @@ -1013,7 +791,7 @@ #include "code\modules\DetectiveWork\detective_work.dm" #include "code\modules\DetectiveWork\evidence.dm" #include "code\modules\DetectiveWork\footprints_and_rag.dm" -#include "code\modules\detectivework\scanner.dm" +#include "code\modules\DetectiveWork\scanner.dm" #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm new file mode 100644 index 00000000000..c735f40264f --- /dev/null +++ b/code/game/objects/items/devices/whistle.dm @@ -0,0 +1,21 @@ +/obj/item/device/hailer + name = "hailer" + desc = "Used by obese officers to save their breath for running." + icon_state = "voice0" + item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang) + w_class = 1.0 + flags = FPRINT | TABLEPASS| CONDUCT + + var/spamcheck = 0 + + +/obj/item/device/hailer/attack_self(mob/living/carbon/user as mob) + if (spamcheck) + return + + playsound(get_turf(src), 'sound/voice/halt.ogg', 100, 1, vary = 0) + user.visible_message("[user]'s [name] rasps, \"Halt! Security!\"") + + spamcheck = 1 + spawn(20) + spamcheck = 0 \ No newline at end of file diff --git a/sound/voice/halt.ogg b/sound/voice/halt.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4885bc19483ec39e7ee03a97ae06542c7620d87d GIT binary patch literal 10448 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 Qfd9UELD>HD)&(j37v??a8~^|S literal 0 HcmV?d00001 From c84ce517e30ecf3b6a64f83cda00ffe857bb8da5 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Tue, 28 May 2013 18:16:11 +0400 Subject: [PATCH 02/10] 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. --- code/modules/surgery/appendix.dm | 14 ++++++--- code/modules/surgery/bones.dm | 25 +++++++++------ code/modules/surgery/braincore.dm | 51 ++++++++++++++++++++++--------- code/modules/surgery/eye.dm | 28 ++++++++++++----- code/modules/surgery/face.dm | 28 ++++++++++++----- code/modules/surgery/generic.dm | 34 +++++++++++++++------ code/modules/surgery/implant.dm | 29 +++++++++++------- code/modules/surgery/other.dm | 6 ++-- code/modules/surgery/ribcage.dm | 39 +++++++++++++++++------ code/modules/surgery/robolimbs.dm | 23 +++++++++----- code/modules/surgery/surgery.dm | 28 +++++++---------- 11 files changed, 206 insertions(+), 99 deletions(-) diff --git a/code/modules/surgery/appendix.dm b/code/modules/surgery/appendix.dm index 027e323c576..54a26427fcf 100644 --- a/code/modules/surgery/appendix.dm +++ b/code/modules/surgery/appendix.dm @@ -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 diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index e0eaab854ff..75e3b6e0997 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -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 diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm index b1a43d5a55f..16a7fb08d96 100644 --- a/code/modules/surgery/braincore.dm +++ b/code/modules/surgery/braincore.dm @@ -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 diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm index 8f100aee173..9f11b48c78f 100644 --- a/code/modules/surgery/eye.dm +++ b/code/modules/surgery/eye.dm @@ -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 diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index 90ce1d81349..e215487d0b7 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -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 diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index d9cdb79d0bf..5694a595b0b 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -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 diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 1a64f37cf2b..238bbc0a418 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -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]!") diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index d75bb538f3d..fd49b26b0e8 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -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 diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm index 591d6ab0f47..0ebe07a0199 100644 --- a/code/modules/surgery/ribcage.dm +++ b/code/modules/surgery/ribcage.dm @@ -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 diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm index 94d07eb3e24..9b8f42e4d76 100644 --- a/code/modules/surgery/robolimbs.dm +++ b/code/modules/surgery/robolimbs.dm @@ -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 diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 62b9afb52c0..2d8db6670cf 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -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~ From 9ab9631ae6d8d5e498f20100350f72209b6f30ad Mon Sep 17 00:00:00 2001 From: Chinsky Date: Tue, 28 May 2013 18:27:40 +0400 Subject: [PATCH 03/10] Since organ processing interval is so big, sets bleeding manually so hemostat step would work. --- code/modules/surgery/generic.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 5694a595b0b..7d7de430bfd 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -45,6 +45,7 @@ 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.status |= ORGAN_BLEEDING affected.createwound(CUT, 1) if (target_zone == "head") target.brain_op_stage = 1 From 6de8060545452c9be14c8298cd3df883e9e9f8f3 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 1 Jun 2013 08:34:31 +0400 Subject: [PATCH 04/10] Added hailers to the Sec closets. --- .../objects/structures/crates_lockers/closets/secure/security.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index f6ad799900d..413333f397c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -186,6 +186,7 @@ new /obj/item/weapon/gun/energy/taser(src) new /obj/item/clothing/glasses/sunglasses/sechud(src) new /obj/item/taperoll/police(src) + new /obj/item/device/hailer return From 5de37def3dc7003b60f6f6658622c03488867b79 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 1 Jun 2013 09:08:45 +0400 Subject: [PATCH 05/10] Moved blood compatibility check to the related file. --- .../DetectiveWork/footprints_and_rag.dm | 18 ----------------- code/modules/organs/blood.dm | 20 ++++++++++++++++++- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/code/modules/DetectiveWork/footprints_and_rag.dm b/code/modules/DetectiveWork/footprints_and_rag.dm index 5f8918c9074..7671dc543aa 100644 --- a/code/modules/DetectiveWork/footprints_and_rag.dm +++ b/code/modules/DetectiveWork/footprints_and_rag.dm @@ -10,24 +10,6 @@ var/transfer_blood = 0 var/mob/living/carbon/human/bloody_hands_mob -proc/blood_incompatible(donor,receiver) - if(!donor || !receiver) return 0 - var - donor_antigen = copytext(donor,1,lentext(donor)) - receiver_antigen = copytext(receiver,1,lentext(receiver)) - donor_rh = (findtext(donor,"+")>0) - receiver_rh = (findtext(receiver,"+")>0) - if(donor_rh && !receiver_rh) return 1 - switch(receiver_antigen) - if("A") - if(donor_antigen != "A" && donor_antigen != "O") return 1 - if("B") - if(donor_antigen != "B" && donor_antigen != "O") return 1 - if("O") - if(donor_antigen != "O") return 1 - //AB is a universal receiver. - return 0 - /obj/item/weapon/reagent_containers/glass/rag name = "damp rag" diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 6e3ac4feda4..882582e4a35 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -218,4 +218,22 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 for(var/datum/reagent/blood/D in container.reagent_list) if(D.data["donor"] == src) return D - return res \ No newline at end of file + return res + +proc/blood_incompatible(donor,receiver) + if(!donor || !receiver) return 0 + var + donor_antigen = copytext(donor,1,lentext(donor)) + receiver_antigen = copytext(receiver,1,lentext(receiver)) + donor_rh = (findtext(donor,"+")>0) + receiver_rh = (findtext(receiver,"+")>0) + if(donor_rh && !receiver_rh) return 1 + switch(receiver_antigen) + if("A") + if(donor_antigen != "A" && donor_antigen != "O") return 1 + if("B") + if(donor_antigen != "B" && donor_antigen != "O") return 1 + if("O") + if(donor_antigen != "O") return 1 + //AB is a universal receiver. + return 0 \ No newline at end of file From 0b9c9042524c45625b53b55f8497538808e32f61 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 1 Jun 2013 10:56:59 +0400 Subject: [PATCH 06/10] DRY BLOOD FOR THE BLOOD GOD. Blood will now dry up in around half an hour. Also moved blood drip define out of disposals. WTF. --- .../effects/decals/Cleanable/humans.dm | 22 ++++++++++++++++++- code/modules/recycling/disposal.dm | 10 --------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 516c0d74ca4..29f02fedfa7 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -1,3 +1,4 @@ +#define DRYING_TIME 5 * 60*10 //for 1 unit of depth in puddle (amount var) /obj/effect/decal/cleanable/blood name = "blood" desc = "It's red and gooey. Perhaps it's the chef's cooking?" @@ -11,6 +12,7 @@ var/list/viruses = list() blood_DNA = list() var/datum/disease2/disease/virus2 = null + var/amount = 5 /obj/effect/decal/cleanable/blood/Del() for(var/datum/disease/D in viruses) @@ -26,9 +28,20 @@ for(var/obj/effect/decal/cleanable/blood/B in src.loc) if(B != src) del(B) + spawn(DRYING_TIME * (amount+1)) + dry() + +/obj/effect/decal/cleanable/blood/proc/dry() + name = "dried [src]" + desc = "It's dark red and crusty. Someone is not doing their job." + var/icon/I = icon(icon,icon_state) + I.SetIntensity(0.5) + icon = I + amount = 0 /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") + amount = 2 /obj/effect/decal/cleanable/blood/tracks icon_state = "tracks" @@ -36,6 +49,13 @@ gender = PLURAL random_icon_states = null +/obj/effect/decal/cleanable/blood/drip + name = "drips of blood" + desc = "It's red." + gender = PLURAL + icon = 'drip.dmi' + icon_state = "1" + /obj/effect/decal/cleanable/blood/gibs name = "gibs" desc = "They look bloody and gruesome." @@ -89,4 +109,4 @@ icon = 'blood.dmi' icon_state = "mucus" random_icon_states = list("mucus") - var/datum/disease2/disease/virus2 = null + var/datum/disease2/disease/virus2 = null diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 32781e99ed6..9f7d9f9c8ee 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -1328,13 +1328,3 @@ dirs = alldirs.Copy() src.streak(dirs) - -/obj/effect/decal/cleanable/blood/drip - name = "drips of blood" - desc = "It's red." - gender = PLURAL - density = 0 - anchored = 1 - layer = 2 - icon = 'drip.dmi' - icon_state = "1" From 89fff29db1af147e91d94235ed447ba6a07e6b73 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 1 Jun 2013 12:24:43 +0400 Subject: [PATCH 07/10] Showed that huge proc in /atom what polymorphism' is. Now instead of huge condition line it's handled where it was supposed to be handled. --- .../datums/diseases/advance/symptoms/vomit.dm | 2 +- code/game/atoms.dm | 81 +------------------ code/game/objects/items.dm | 40 ++++++++- code/game/turfs/simulated.dm | 31 ++++++- code/modules/mob/living/carbon/human/human.dm | 13 ++- 5 files changed, 82 insertions(+), 85 deletions(-) diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index 79a3d82c7c4..1f62065ef99 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -89,6 +89,6 @@ Bonus if(brute_dam < 50) M.adjustBruteLoss(3) - var/turf/pos = get_turf(M) + var/turf/simulated/pos = get_turf(M) pos.add_blood_floor(M) playsound(pos, 'sound/effects/splat.ogg', 50, 1) \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 99bf21d9c5d..1d7d4bce3a6 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -420,6 +420,7 @@ its easier to just keep the beam vertical. //returns 1 if made bloody, returns 0 otherwise /atom/proc/add_blood(mob/living/carbon/human/M as mob) + .=1 if (!( istype(M, /mob/living/carbon/human) )) return 0 if (!istype(M.dna, /datum/dna)) @@ -431,55 +432,6 @@ its easier to just keep the beam vertical. if(!blood_DNA || !istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it. blood_DNA = list() - //adding blood to items - if (istype(src, /obj/item)&&!istype(src, /obj/item/weapon/melee/energy))//Only regular items. Energy melee weapon are not affected. - var/obj/item/O = src - - //if we haven't made our blood_overlay already - if( !O.blood_overlay ) - var/icon/I = new /icon(O.icon, O.icon_state) - I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD) //fills the icon_state with white (except where it's transparent) - I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - - //not sure if this is worth it. It attaches the blood_overlay to every item of the same type if they don't have one already made. - for(var/obj/item/A in world) - if(A.type == O.type && !A.blood_overlay) - A.blood_overlay = I - - //apply the blood-splatter overlay if it isn't already in there - if(!blood_DNA.len) - O.overlays += O.blood_overlay - - //if this blood isn't already in the list, add it - - if(blood_DNA[M.dna.unique_enzymes]) - return 0 //already bloodied with this blood. Cannot add more. - blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - return 1 //we applied blood to the item - - //adding blood to turfs - else if (istype(src, /turf/simulated)) - var/turf/simulated/T = src - - //get one blood decal and infect it with virus from M.viruses - for(var/obj/effect/decal/cleanable/blood/B in T.contents) - if(!B.blood_DNA[M.dna.unique_enzymes]) - B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - /*for(var/datum/disease/D in M.viruses) - var/datum/disease/newDisease = D.Copy(1) - B.viruses += newDisease - newDisease.holder = B*/ - return 1 //we bloodied the floor - - //if there isn't a blood decal already, make one. - var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(T) - newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - /*for(var/datum/disease/D in M.viruses) - var/datum/disease/newDisease = D.Copy(1) - newblood.viruses += newDisease - newDisease.holder = newblood*/ - return 1 //we bloodied the floor - //adding blood to humans else if (istype(src, /mob/living/carbon/human)) var/mob/living/carbon/human/H = src @@ -499,37 +451,6 @@ its easier to just keep the beam vertical. if(toxvomit) this.icon_state = "vomittox_[pick(1,4)]" - /*for(var/datum/disease/D in M.viruses) - var/datum/disease/newDisease = D.Copy(1) - this.viruses += newDisease - newDisease.holder = this*/ - -// Only adds blood on the floor -- Skie -/atom/proc/add_blood_floor(mob/living/carbon/M as mob) - if( istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/human)) - if( istype(src, /turf/simulated) ) - var/turf/simulated/source1 = src - var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source1) - this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type - /*for(var/datum/disease/D in M.viruses) - var/datum/disease/newDisease = D.Copy(1) - this.viruses += newDisease - newDisease.holder = this*/ - - else if( istype(M, /mob/living/carbon/alien )) - if( istype(src, /turf/simulated) ) - var/turf/simulated/source2 = src - var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(source2) - this.blood_DNA["UNKNOWN BLOOD"] = "X*" - /*for(var/datum/disease/D in M.viruses) - var/datum/disease/newDisease = D.Copy(1) - this.viruses += newDisease - newDisease.holder = this*/ - - else if( istype(M, /mob/living/silicon/robot )) - if( istype(src, /turf/simulated) ) - var/turf/simulated/source2 = src - new /obj/effect/decal/cleanable/oil(source2) /atom/proc/clean_blood() src.germ_level = 0 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8556b15abcf..78cf9617fd3 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -338,8 +338,8 @@ M.take_organ_damage(power) if (prob(33)) // Added blood for whacking non-humans too - var/turf/location = M.loc - if (istype(location, /turf/simulated)) + var/turf/simulated/location = M.loc + if (istype(location)) location.add_blood_floor(M) if("fire") if (!(COLD_RESISTANCE in M.mutations)) @@ -700,3 +700,39 @@ if(istype(src, /obj/item/clothing/gloves)) var/obj/item/clothing/gloves/G = src G.transfer_blood = 0 + + +/obj/item/add_blood(mob/living/carbon/human/M as mob) + if (!..()) + return 0 + + if(istype(src, /obj/item/weapon/melee/energy)) + return + + //if we haven't made our blood_overlay already + if( !blood_overlay ) + generate_blood_overlay() + + //apply the blood-splatter overlay if it isn't already in there + if(!blood_DNA.len) + overlays += blood_overlay + + //if this blood isn't already in the list, add it + + if(blood_DNA[M.dna.unique_enzymes]) + return 0 //already bloodied with this blood. Cannot add more. + blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + return 1 //we applied blood to the item + +/obj/item/proc/generate_blood_overlay() + if(blood_overlay) + return + + var/icon/I = new /icon(icon, icon_state) + I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD) //fills the icon_state with white (except where it's transparent) + I.Blend(new /icon('icons/effects/blood.dmi', "itemblood"),ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + + //not sure if this is worth it. It attaches the blood_overlay to every item of the same type if they don't have one already made. + for(var/obj/item/A in world) + if(A.type == type && !A.blood_overlay) + A.blood_overlay = I \ No newline at end of file diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 73bacff124f..0fb777c6b4c 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -72,4 +72,33 @@ playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) M.Weaken(10) - ..() \ No newline at end of file + ..() + +//returns 1 if made bloody, returns 0 otherwise +/turf/simulated/add_blood(mob/living/carbon/human/M as mob) + if (!..()) + return 0 + + for(var/obj/effect/decal/cleanable/blood/B in contents) + if(!B.blood_DNA[M.dna.unique_enzymes]) + B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + return 1 //we bloodied the floor + + //if there isn't a blood decal already, make one. + var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(src) + newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + return 1 //we bloodied the floor + + +// Only adds blood on the floor -- Skie +/turf/simulated/proc/add_blood_floor(mob/living/carbon/M as mob) + if( istype(M, /mob/living/carbon/monkey) || istype(M, /mob/living/carbon/human)) + var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(src) + this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + + else if( istype(M, /mob/living/carbon/alien )) + var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(src) + this.blood_DNA["UNKNOWN BLOOD"] = "X*" + + else if( istype(M, /mob/living/silicon/robot )) + new /obj/effect/decal/cleanable/oil(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index a73e6c21910..e0a54658d7f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1084,4 +1084,15 @@ if (germs == 2500) world << "Reached stage 3 in [ticks] ticks" world << "Mob took [tdamage] tox damage" -*/ \ No newline at end of file +*/ +//returns 1 if made bloody, returns 0 otherwise + +/mob/living/carbon/human/add_blood(mob/living/carbon/human/M as mob) + if (!..()) + return 0 + //if this blood isn't already in the list, add it + if(blood_DNA[M.dna.unique_enzymes]) + return 0 //already bloodied with this blood. Cannot add more. + blood_DNA[M.dna.unique_enzymes] = M.dna.b_type + src.update_inv_gloves() //handles bloody hands overlays and updating + return 1 //we applied blood to the item \ No newline at end of file From 3bbb25074973854d92c8d4f3be343f1f7b112d52 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 1 Jun 2013 14:30:05 +0400 Subject: [PATCH 08/10] Added bloody footprints. --- .../effects/decals/Cleanable/humans.dm | 37 ++++++++++++++++++- code/game/turfs/simulated.dm | 25 +++++++++++++ .../DetectiveWork/footprints_and_rag.dm | 7 ++-- code/modules/mob/living/carbon/human/human.dm | 8 +++- 4 files changed, 72 insertions(+), 5 deletions(-) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 29f02fedfa7..172eca9ae97 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -27,15 +27,40 @@ if(src.loc && isturf(src.loc)) for(var/obj/effect/decal/cleanable/blood/B in src.loc) if(B != src) + if (B.blood_DNA) + blood_DNA |= B.blood_DNA.Copy() del(B) spawn(DRYING_TIME * (amount+1)) dry() +/obj/effect/decal/cleanable/blood/HasEntered(mob/living/carbon/human/perp) + if (!istype(perp)) + return + if(amount < 1) + return + + if(perp.shoes) + perp.shoes:track_blood = max(amount,perp.shoes:track_blood) //Adding blood to shoes + if(!perp.shoes.blood_overlay) + perp.shoes.generate_blood_overlay() + if(!perp.shoes.blood_DNA) + perp.shoes.blood_DNA = list() + perp.shoes.overlays += perp.shoes.blood_overlay + perp.update_inv_shoes(1) + perp.shoes.blood_DNA |= blood_DNA.Copy() + else + perp.track_blood = max(amount,perp.track_blood) //Or feet + if(!perp.feet_blood_DNA) + perp.feet_blood_DNA = list() + perp.feet_blood_DNA |= blood_DNA.Copy() + + amount-- + /obj/effect/decal/cleanable/blood/proc/dry() name = "dried [src]" desc = "It's dark red and crusty. Someone is not doing their job." var/icon/I = icon(icon,icon_state) - I.SetIntensity(0.5) + I.SetIntensity(0.7) icon = I amount = 0 @@ -43,11 +68,20 @@ random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") amount = 2 +/obj/effect/decal/cleanable/blood/footprints + name = "bloody footprints" + desc = "Whoops..." + icon='icons/effects/footprints.dmi' + icon_state = "blood1" + amount = 0 + random_icon_states = null + /obj/effect/decal/cleanable/blood/tracks icon_state = "tracks" desc = "They look like tracks left by wheels." gender = PLURAL random_icon_states = null + amount = 0 /obj/effect/decal/cleanable/blood/drip name = "drips of blood" @@ -55,6 +89,7 @@ gender = PLURAL icon = 'drip.dmi' icon_state = "1" + amount = 0 /obj/effect/decal/cleanable/blood/gibs name = "gibs" diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 0fb777c6b4c..16d88a0ea0b 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -34,6 +34,31 @@ else playsound(src, "clownstep", 20, 1) + var/list/bloodDNA = null + if(H.shoes) + var/obj/item/clothing/shoes/S = H.shoes + if(S.track_blood && S.blood_DNA) + bloodDNA = S.blood_DNA + S.track_blood-- + else + if(H.track_blood && H.feet_blood_DNA) + bloodDNA = H.feet_blood_DNA + H.track_blood-- + + if (bloodDNA) + var/obj/effect/decal/cleanable/blood/footprints/here = new(src) + here.icon_state = "blood1" + here.dir = H.dir + here.blood_DNA |= bloodDNA.Copy() + var/turf/simulated/from = get_step(H,reverse_direction(H.dir)) + if(from) + var/obj/effect/decal/cleanable/blood/footprints/there = new(from) + there.icon_state = "blood2" + there.dir = H.dir + there.blood_DNA |= bloodDNA.Copy() + + bloodDNA = null + switch (src.wet) if(1) if(istype(M, /mob/living/carbon/human)) // Added check since monkeys don't have shoes diff --git a/code/modules/DetectiveWork/footprints_and_rag.dm b/code/modules/DetectiveWork/footprints_and_rag.dm index 7671dc543aa..6a1fd7abffe 100644 --- a/code/modules/DetectiveWork/footprints_and_rag.dm +++ b/code/modules/DetectiveWork/footprints_and_rag.dm @@ -1,15 +1,16 @@ /mob - var/bloody_hands = 0 var/mob/living/carbon/human/bloody_hands_mob - var/track_blood - var/mob/living/carbon/human/track_blood_mob + var/track_blood = 0 + var/list/feet_blood_DNA var/track_blood_type /obj/item/clothing/gloves var/transfer_blood = 0 var/mob/living/carbon/human/bloody_hands_mob +/obj/item/clothing/shoes/ + var/track_blood = 0 /obj/item/weapon/reagent_containers/glass/rag name = "damp rag" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e0a54658d7f..f20f5955d58 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1095,4 +1095,10 @@ return 0 //already bloodied with this blood. Cannot add more. blood_DNA[M.dna.unique_enzymes] = M.dna.b_type src.update_inv_gloves() //handles bloody hands overlays and updating - return 1 //we applied blood to the item \ No newline at end of file + return 1 //we applied blood to the item + +/mob/living/carbon/human/clean_blood() + .=..() + if(istype(feet_blood_DNA, /list) && feet_blood_DNA.len) + del(feet_blood_DNA) + return 1 \ No newline at end of file From d4495d45030cb79f678a0f2c7cf6b494880bf983 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 1 Jun 2013 14:35:11 +0400 Subject: [PATCH 09/10] Updated changelog. --- html/changelog.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/html/changelog.html b/html/changelog.html index 0ae9dc8d71f..a92bcc133ca 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -58,6 +58,14 @@ 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. --> +
+

1.06.2013

+

Chinsky updated:

+
    +
  • Bloody footprints! Now stepping in the puddle will dirty your shoes/feet and make you leave bloody footprints for a bit.
  • +
  • Blood now dries up after some time. Puddles take ~30 minutes, small things 5 minutes.
  • +
+

31.05.2013

From 88f5a2a3b55118d80f69de1d0ea1ca8180a6b92a Mon Sep 17 00:00:00 2001 From: Chinsky Date: Sat, 1 Jun 2013 17:20:13 +0400 Subject: [PATCH 10/10] Added this sound as emote to borgs. --- code/modules/mob/living/silicon/robot/emote.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 86d4e5d2f46..4fa8a543b98 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -198,6 +198,15 @@ m_type = 2 else src << "You are not THE LAW, pal." + + if("halt") + if (istype(module,/obj/item/weapon/robot_module/security)) + message = "[src]'s speakers skreech, \"Halt! Security!\"." + + playsound(src.loc, 'sound/voice/halt.ogg', 50, 0) + m_type = 2 + else + src << "You are not security." else src << text("Invalid Emote: []", act) if ((message && src.stat == 0))