From 2ed57e0cc663d52954748cdb6c0e587bedfdf48d Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Thu, 2 Feb 2012 00:32:35 -0700 Subject: [PATCH] Finished up the last parts of my fingerprints work. Added a rag which lets you smudge away prints, and sinks do the same. Added hallucinations properly. Added LSD (with hallucinations.) Remapped slightly. --- baystation12.dme | 2 +- code/WorkInProgress/detective_work.dm | 46 +- code/WorkInProgress/virus2/base.dm | 12 + code/datums/diseases/flu.dm | 5 + code/defines/mob/mob.dm | 4 + code/defines/procs/helpers.dm | 2 +- code/game/atom_procs.dm | 30 +- code/game/gamemodes/traitor/traitor.dm | 6 +- code/game/machinery/cloning.dm | 50 +- code/game/machinery/doors/airlock.dm | 5 + code/game/machinery/sink.dm | 80 +- code/game/objects/items/weapons/cards_ids.dm | 11 +- code/game/vote.dm | 3 + code/modules/chemical/Chemistry-Reagents.dm | 13 + code/modules/chemical/Chemistry-Recipes.dm | 6 + code/modules/flufftext/Hallucination.dm | 221 +- code/modules/mob/living/carbon/human/death.dm | 6 + code/modules/mob/living/carbon/human/life.dm | 30 +- code/modules/mob/living/living.dm | 2 +- .../items/weapons => unused}/toilets.dm | 190 +- icons/obj/toy.dmi | Bin 5191 -> 1600 bytes maps/tgstation.2.0.8.dmm | 2376 ++++++++--------- 22 files changed, 1733 insertions(+), 1367 deletions(-) rename code/{game/objects/items/weapons => unused}/toilets.dm (96%) diff --git a/baystation12.dme b/baystation12.dme index 3cbe22830d9..cf5a652545b 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -683,7 +683,6 @@ #include "code\game\objects\items\weapons\table_rack_parts.dm" #include "code\game\objects\items\weapons\teleportation.dm" #include "code\game\objects\items\weapons\tiles_wires.dm" -#include "code\game\objects\items\weapons\toilets.dm" #include "code\game\objects\items\weapons\tools.dm" #include "code\game\objects\items\weapons\twohanded.dm" #include "code\game\objects\items\weapons\implants\implant.dm" @@ -799,6 +798,7 @@ #include "code\modules\critters\critters.dm" #include "code\modules\critters\hivebots\hivebot.dm" #include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\TextFilters.dm" #include "code\modules\food\food.dm" #include "code\modules\food\recipes_microwave.dm" diff --git a/code/WorkInProgress/detective_work.dm b/code/WorkInProgress/detective_work.dm index 9c2e126c863..be5b9138830 100644 --- a/code/WorkInProgress/detective_work.dm +++ b/code/WorkInProgress/detective_work.dm @@ -631,20 +631,21 @@ turf/Entered(mob/living/carbon/human/M) M.shoes.track_blood-- src.add_bloody_footprints(M.shoes.track_blood_mob,0,M.dir,M.shoes.name) - for(var/obj/effect/decal/cleanable/blood/B in src) - if(B.track_amt <= 0) continue - if(B.type != /obj/effect/decal/cleanable/blood/tracks) - if(istype(M,/mob/living/carbon/human)) - if(M.shoes) - M.shoes.add_blood(B.blood_owner) - M.shoes.track_blood_mob = B.blood_owner - M.shoes.track_blood = max(M.shoes.track_blood,8) - else - M.add_blood(B.blood_owner) - M.track_blood_mob = B.blood_owner - M.track_blood = max(M.track_blood,rand(4,8)) - B.track_amt-- - break +//REMOVED until we improve it. +// for(var/obj/effect/decal/cleanable/blood/B in src) +// if(B.track_amt <= 0) continue +// if(B.type != /obj/effect/decal/cleanable/blood/tracks) +// if(istype(M,/mob/living/carbon/human)) +// if(M.shoes) +// M.shoes.add_blood(B.blood_owner) +// M.shoes.track_blood_mob = B.blood_owner +// M.shoes.track_blood = max(M.shoes.track_blood,8) +// else +// M.add_blood(B.blood_owner) +// M.track_blood_mob = B.blood_owner +// M.track_blood = max(M.track_blood,rand(4,8)) +// B.track_amt-- +// break . = ..() turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info) @@ -694,4 +695,19 @@ proc/blood_incompatible(donor,receiver) if("O") if(donor_antigen != "O") return 1 //AB is a universal receiver. - return 0 \ No newline at end of file + return 0 + +/obj/item/weapon/rag + name = "damp rag" + desc = "For cleaning up messes, I suppose." + w_class = 1 + icon = 'toy.dmi' + icon_state = "rag" + + afterattack(atom/A as obj|turf|area, mob/user as mob) + if(istype(A)) + user.visible_message("[user] starts to wipe the prints off of [A] with \the [src]!") + if(do_after(user,30)) + user.visible_message("[user] finishes wiping away the evidence!") + A.clean_blood() + return \ No newline at end of file diff --git a/code/WorkInProgress/virus2/base.dm b/code/WorkInProgress/virus2/base.dm index 039aa7934a5..d5520802310 100644 --- a/code/WorkInProgress/virus2/base.dm +++ b/code/WorkInProgress/virus2/base.dm @@ -322,6 +322,12 @@ proc/airborne_can_reach(turf/source, turf/target) activate(var/mob/living/carbon/mob,var/multiplier) mob.gib() +/datum/disease2/effect/greater/hallucinations + name = "Hallucinational Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.hallucination += 25 + /datum/disease2/effect/greater/radian name = "Radian's syndrome" stage = 4 @@ -452,6 +458,12 @@ proc/airborne_can_reach(turf/source, turf/target) mob.suiciding = 0 // lesser syndromes, partly just copypastes +/datum/disease2/effect/lesser/hallucinations + name = "Hallucinational Syndrome" + stage = 3 + activate(var/mob/living/carbon/mob,var/multiplier) + mob.hallucination += 5 + /datum/disease2/effect/lesser/mind name = "Lazy mind syndrome" stage = 3 diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 13f9e04d666..0606d4a208d 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -51,4 +51,9 @@ if(prob(20)) affected_mob.adjustToxLoss(1) affected_mob.updatehealth() + if(prob(25)) + affected_mob << "\red The world around you feels surreal" + if(prob(50)) + affected_mob.hallucination += 100 + shake_camera(affected_mob,20) return diff --git a/code/defines/mob/mob.dm b/code/defines/mob/mob.dm index a20e0b28f98..0119cbbf265 100644 --- a/code/defines/mob/mob.dm +++ b/code/defines/mob/mob.dm @@ -247,6 +247,10 @@ the mob is also allowed to move without any sort of restriction. For instance, i // var/obj/effect/organstructure/organStructure = null //for dem organs var/list/organs = list( ) //List of organs. +//Yes, yes I did. --SkyMarshal + var/list/atom/hallucinations = list() + var/halloss = 0 + var/hallucination = 0 /mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1) // world << "Contract_disease called by [src] with virus [virus]" diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm index 92e06cea72d..b85669488ee 100644 --- a/code/defines/procs/helpers.dm +++ b/code/defines/procs/helpers.dm @@ -1519,7 +1519,7 @@ proc/get_opposite(var/checkdir) if(!text || !character) return 0 var/count = 0 - for(var/i = 1, i < lentext(text), i++) + for(var/i = 1, i <= lentext(text), i++) var/a = copytext(text,i,i+1) if(a == character) count++ diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm index 311fa63548c..dbcc4a4b881 100644 --- a/code/game/atom_procs.dm +++ b/code/game/atom_procs.dm @@ -107,7 +107,16 @@ prints = L[num2text(2)] break else - src.fingerprints[i] = "1=" + L[num2text(1)] + "&2=" + stars(L[num2text(2)], rand(80,90)) + var/test_print = stars(L[num2text(2)], rand(80,90)) + if(stringpercent(test_print) == 32) + if(src.fingerprints.len == 1) + src.fingerprints = list() + else + for(var/j = (i + 1), j < (src.fingerprints.len), j++) + src.fingerprints[j-1] = src.fingerprints[j] + src.fingerprints.len-- + else + src.fingerprints[i] = "1=" + L[num2text(1)] + "&2=" + test_print else var/turf/T = get_turf(src) for (var/mob/N in world) @@ -245,6 +254,25 @@ source2.blood_DNA = null var/icon/I = new /icon(source2.icon_old, source2.icon_state) source2.icon = I + if(src.fingerprints && src.fingerprints.len) + var/done = 0 + while(!done) + done = 1 + for(var/i = 1, i < (src.fingerprints.len + 1), i++) + var/list/prints = params2list(src.fingerprints[i]) + var/test_print = prints["2"] + var/new_print = stars(test_print, rand(1,20)) + if(stringpercent(new_print) == 32) + if(src.fingerprints.len == 1) + src.fingerprints = list() + else + for(var/j = (i + 1), j < (src.fingerprints.len), j++) + src.fingerprints[j-1] = src.fingerprints[j] + src.fingerprints.len-- + done = 0 + break + else + src.fingerprints[i] = "1=" + prints["1"] + "&2=" + new_print return /atom/MouseDrop(atom/over_object as mob|obj|turf|area) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 52071fc0f52..dca6d7b4b41 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -101,7 +101,7 @@ var/datum/objective/assassinate/kill_objective = new kill_objective.owner = traitor kill_objective.find_target() - for(var/j, j < traitor.objectives.len, j++) + for(var/j, j < (traitor.objectives.len + 1), j++) var/compare = istype(traitor.objectives[j],/datum/objective/assassinate) if(compare) var/datum/objective/assassinate/test = traitor.objectives[j] @@ -129,7 +129,7 @@ var/datum/objective/protect/protect_objective = new protect_objective.owner = traitor protect_objective.find_target() - for(var/j, j < traitor.objectives.len, j++) + for(var/j, j < (traitor.objectives.len + 1), j++) var/compare = istype(traitor.objectives[j],/datum/objective/assassinate) if(compare) var/datum/objective/assassinate/test = traitor.objectives[j] @@ -157,7 +157,7 @@ var/datum/objective/steal/steal_objective = new steal_objective.owner = traitor steal_objective.find_target() - for(var/j, j < traitor.objectives.len, j++) + for(var/j, j < (traitor.objectives.len + 1), j++) var/compare = istype(traitor.objectives[j],/datum/objective/steal) if(compare) var/datum/objective/steal/test = traitor.objectives[j] diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 22ab01630dd..9027ed0023c 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -68,7 +68,8 @@ /obj/machinery/computer/cloning/New() ..() spawn(5) - src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir)) + updatemodules() + /*src.scanner = locate(/obj/machinery/dna_scannernew, get_step(src, scandir)) src.pod1 = locate(/obj/machinery/clonepod, get_step(src, poddir)) src.temp = "" @@ -80,10 +81,54 @@ src.pod1.connected = src if (src.temp == "") - src.temp = "System ready." + src.temp = "System ready."*/ return return +/obj/machinery/computer/cloning/proc/updatemodules() + //world << "UPDATING MODULES" + src.scanner = findscanner()//locate(/obj/machinery/dna_scannernew, get_step(src, WEST)) + src.pod1 = findcloner()//locate(/obj/machinery/clonepod, get_step(src, EAST)) + //world << "SEARCHING FOR MACHEIN" + //src.temp = "" + //if (isnull(src.scanner)) + // src.temp += " SCNR-ERROR" + if (!isnull(src.pod1) && !wantspod) + src.pod1.connected = src + // src.temp += " POD1-ERROR" + //else + + //if (src.temp == "") + // src.temp = "System ready." + +/obj/machinery/computer/cloning/proc/findscanner() + //..() + //world << "SEARCHING FOR SCANNER" + var/obj/machinery/dna_scannernew/scannerf = null + for(dir in list(NORTH,EAST,SOUTH,WEST)) + //world << "SEARCHING IN [dir]" + scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) + if (!isnull(scannerf)) + //world << "FOUND" + break + if(isnull(scannerf) && wantsscan) + src.temp += " SCNR-ERROR" + return scannerf + +/obj/machinery/computer/cloning/proc/findcloner() + //..() + //world << "SEARCHING FOR POD" + var/obj/machinery/clonepod/podf = null + for(dir in list(NORTH,EAST,SOUTH,WEST)) + //world << "SEARCHING IN [dir]" + podf = locate(/obj/machinery/clonepod, get_step(src, dir)) + if (!isnull(podf)) + //world << "FOUND" + break + if(isnull(podf) && wantspod) + src.temp += " POD1-ERROR" + return podf + /obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES if (!src.diskette) @@ -110,6 +155,7 @@ if(stat & (BROKEN|NOPOWER)) return + updatemodules() var/dat = "

Cloning System Control

" dat += "Refresh" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index d5144e09d02..5331787cd48 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -211,6 +211,11 @@ About the new airlock wires panel: return else /*if (src.justzap)*/ return + else if(user.hallucination > 50 && prob(10) && src.operating == 0) + user << "\red You feel a powerful shock course through your body!" + user.halloss += 10 + user.stunned += 10 + return ..(user) diff --git a/code/game/machinery/sink.dm b/code/game/machinery/sink.dm index d488b9235d7..d0319d4de42 100644 --- a/code/game/machinery/sink.dm +++ b/code/game/machinery/sink.dm @@ -11,44 +11,38 @@ if(busy) M << "\red Someone's already washing something here." return - - var/turf/location = M.loc - if(!isturf(location)) return usr << "\blue You start washing up." busy = 1 - sleep(40) + if(do_after(M,40)) + M.clean_blood() + if(istype(M, /mob/living/carbon)) + var/mob/living/carbon/C = M + C.clean_blood() + /* + if(C.r_hand) + C.r_hand.clean_blood() // The hand you attack with is empty anyway, the other one should not be washed while doing this. + if(C.l_hand) + C.l_hand.clean_blood() + + if(C.wear_mask) + C.wear_mask.clean_blood() //- NOPE, Washing machine -Errorage + */ + if(istype(M, /mob/living/carbon/human)) + /*if(C:w_uniform) + C:w_uniform.clean_blood() //- NOPE, Washing machine -Errorage + if(C:wear_suit) + C:wear_suit.clean_blood() //- NOPE, Washing machine -Errorage + if(C:shoes) + C:shoes.clean_blood()*/ //- NOPE, Washing machine -Errorage + if(C:gloves) + C:gloves.clean_blood() + /*if(C:head) + C:head.clean_blood()*/ //- NOPE, Washing machine -Errorage + for(var/mob/V in viewers(src, null)) + V.show_message(text("\blue [M] washes up using \the [src].")) busy = 0 - if(M.loc != location) return //Person has moved away from the sink - - M.clean_blood() - if(istype(M, /mob/living/carbon)) - var/mob/living/carbon/C = M - C.clean_blood() - /* - if(C.r_hand) - C.r_hand.clean_blood() // The hand you attack with is empty anyway, the other one should not be washed while doing this. - if(C.l_hand) - C.l_hand.clean_blood() - - if(C.wear_mask) - C.wear_mask.clean_blood() //- NOPE, Washing machine -Errorage - */ - if(istype(M, /mob/living/carbon/human)) - /*if(C:w_uniform) - C:w_uniform.clean_blood() //- NOPE, Washing machine -Errorage - if(C:wear_suit) - C:wear_suit.clean_blood() //- NOPE, Washing machine -Errorage - if(C:shoes) - C:shoes.clean_blood()*/ //- NOPE, Washing machine -Errorage - if(C:gloves) - C:gloves.clean_blood() - /*if(C:head) - C:head.clean_blood()*/ //- NOPE, Washing machine -Errorage - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue [M] washes up using \the [src].")) - attackby(var/obj/item/O as obj, var/mob/user as mob) if(busy) @@ -83,27 +77,21 @@ "\red You have wet \the [O], it shocks you!") return - var/turf/location = user.loc - if(!isturf(location)) return - var/obj/item/I = O if(!I || !istype(I,/obj/item)) return usr << "\blue You start washing up." busy = 1 - sleep(40) + if(do_after(user,40)) + if(!I) return //Item's been destroyed while washing + + O.clean_blood() + user.visible_message( \ + "\blue [user] washes \a [I] using \the [src].", \ + "\blue You wash \a [I] using \the [src].") busy = 0 - if(user.loc != location) return //User has moved - if(!I) return //Item's been destroyed while washing - if(user.get_active_hand() != I) return //Person has switched hands or the item in their hands - - O.clean_blood() - user.visible_message( \ - "\blue [user] washes \a [I] using \the [src].", \ - "\blue You wash \a [I] using \the [src].") - shower name = "Shower" desc = "This is dumb." diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 482271c349b..14566b53fb7 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -45,13 +45,10 @@ FINGERPRINT CARD return /obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob) - if(!src.registered) - src.registered = input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name) - src.assignment = input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant") - src.name = "[src.registered]'s ID Card ([src.assignment])" - user << "\blue You successfully forge the ID card." - else - ..() + src.registered = input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name) + src.assignment = input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant") + src.name = "[src.registered]'s ID Card ([src.assignment])" + user << "\blue You successfully forge the ID card." /obj/item/weapon/card/id/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() diff --git a/code/game/vote.dm b/code/game/vote.dm index 7741f2c1828..8e43a0c56b5 100644 --- a/code/game/vote.dm +++ b/code/game/vote.dm @@ -56,6 +56,9 @@ M << browse(null, "window=vote") M.client.showvote = 0 + if(winner == "none") + winner = "default" + calcwin() if(mode == 2) diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index 8bafb59cc9d..b95d019cd77 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -1531,6 +1531,19 @@ datum for(var/mob/living/carbon/metroid/M in T) M.adjustToxLoss(rand(15,30)) + LSD + name = "LSD" + id = "LSD" + description = "A hallucinogen" + reagent_state = LIQUID + color = "#B31008" // rgb: 139, 166, 233 + + on_mob_life(var/mob/M) + if(!M) M = holder.my_atom + M:hallucination += 5 + ..() + return + /////////////////////////////////////////////////////////////////////////////////////////////////////////////// nanites diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm index 250c3222221..617ccde9384 100644 --- a/code/modules/chemical/Chemistry-Recipes.dm +++ b/code/modules/chemical/Chemistry-Recipes.dm @@ -417,6 +417,12 @@ datum required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5) result_amount = 2 + LSD + name = "LSD" + id = "LSD" + result = "LSD" + required_reagents = list("silicon" = 1, "hydrogen" = 1, "anti_toxin" = 1) + result_amount = 5 /////////////////////////////////////////////////////////////////////////////////// // foam and foam precursor diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 83d46443fc2..6dc7f313356 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -13,15 +13,17 @@ Gunshots/explosions/opening doors/less rare audio (done) mob/living/carbon/var image/halimage + image/halbody obj/halitem hal_screwyhud = 0 //1 - critical, 2 - dead, 3 - oxygen indicator, 4 - toxin indicator handling_hal = 0 + hal_crit = 0 mob/living/carbon/proc/handle_hallucinations() if(handling_hal) return handling_hal = 1 while(hallucination > 20) - sleep(rand(200,500)) + sleep(rand(200,500)/(hallucination/10)) var/halpick = rand(1,100) switch(halpick) if(0 to 15) @@ -103,7 +105,7 @@ mob/living/carbon/proc/handle_hallucinations() if(41 to 65) //Strange audio - src << "Strange Audio" + //src << "Strange Audio" switch(rand(1,12)) if(1) src << 'airlock.ogg' if(2) @@ -133,6 +135,30 @@ mob/living/carbon/proc/handle_hallucinations() if(2) src << 'ghost2.ogg' if(3) src << 'Heart Beat.ogg' if(4) src << 'screech.ogg' + if(66 to 70) + //Flashes of danger + //src << "Danger Flash" + var/possible_points = list() + for(var/turf/simulated/floor/F in view(src,world.view)) + possible_points += F + var/turf/simulated/floor/target = pick(possible_points) + halbody = image('human.dmi',target,"husk_l",TURF_LAYER) + + if(client) client.images += halbody + spawn(rand(50,80)) //Only seen for a brief moment. + if(client) client.images -= halbody + halbody = null + if(71 to 80) + //Fake death + src.sleeping_willingly = 1 + src.sleeping = 1 + hal_crit = 1 + hal_screwyhud = 1 + spawn(rand(50,100)) + src.sleeping_willingly = 0 + src.sleeping = 0 + hal_crit = 0 + hal_screwyhud = 0 handling_hal = 0 @@ -172,4 +198,193 @@ proc/check_panel(mob/M) if (istype(M, /mob/living/carbon/human) || istype(M, /mob/living/silicon/ai)) if(M.hallucination < 15) return 1 - return 0*/ \ No newline at end of file + return 0 */ + +/obj/fake_attacker + icon = null + icon_state = null + name = "" + desc = "" + density = 0 + anchored = 1 + opacity = 0 + var/mob/living/carbon/human/my_target = null + var/weapon_name = null + var/obj/item/weap = null + var/image/stand_icon = null + var/image/currentimage = null + var/icon/base = null + var/s_tone + var/mob/living/clone = null + var/image/left + var/image/right + var/image/up + var/collapse + var/image/down + + var/health = 100 + + attackby(var/obj/item/weapon/P as obj, mob/user as mob) + step_away(src,my_target,2) + for(var/mob/M in oviewers(world.view,my_target)) + M << "\red [my_target] flails around wildly." + my_target.show_message("\red [src] has been attacked by [my_target] ", 1) //Lazy. + + //src.health -= P.power + + + return + + HasEntered(var/mob/M, somenumber) + if(M == my_target) + step_away(src,my_target,2) + if(prob(30)) + for(var/mob/O in oviewers(world.view , my_target)) + O << "\red [my_target] stumbles around." + + New() + spawn(300) + if(my_target) + my_target.hallucinations -= src + del(src) + step_away(src,my_target,2) + proccess() + + + proc/updateimage() + // del src.currentimage + + + if(src.dir == NORTH) + del src.currentimage + src.currentimage = new /image(up,src) + else if(src.dir == SOUTH) + del src.currentimage + src.currentimage = new /image(down,src) + else if(src.dir == EAST) + del src.currentimage + src.currentimage = new /image(right,src) + else if(src.dir == WEST) + del src.currentimage + src.currentimage = new /image(left,src) + my_target << currentimage + + + proc/proccess() + if(!my_target) spawn(5) .() + if(src.health < 0) + collapse() + return + if(get_dist(src,my_target) > 1) + src.dir = get_dir(src,my_target) + step_towards(src,my_target) + updateimage() + else + if(prob(15)) + if(weapon_name) + my_target << sound(pick('genhit1.ogg', 'genhit2.ogg', 'genhit3.ogg')) + my_target.show_message("\red [my_target] has been attacked with [weapon_name] by [src.name] ", 1) + my_target.halloss += 8 + if(prob(20)) my_target.eye_blurry += 3 + if(prob(33)) + if(!locate(/obj/effect/overlay) in my_target.loc) + fake_blood(my_target) + else + my_target << sound(pick('punch1.ogg','punch2.ogg','punch3.ogg','punch4.ogg')) + my_target.show_message("\red [src.name] has punched [my_target]!", 1) + my_target.halloss += 4 + if(prob(33)) + if(!locate(/obj/effect/overlay) in my_target.loc) + fake_blood(my_target) + + if(prob(15)) + step_away(src,my_target,2) + spawn(5) .() + + proc/collapse() + collapse = 1 + updateimage() + +/proc/fake_blood(var/mob/target) + var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc) + O.name = "blood" + var/image/I = image('blood.dmi',O,"floor[rand(1,7)]",O.dir,1) + target << I + spawn(300) + del(O) + return + +var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_magazine/a357,\ + /obj/item/weapon/gun/energy/crossbow, /obj/item/weapon/melee/energy/sword,\ + /obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/emp_kit,\ + /obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ + /obj/item/clothing/shoes/syndigaloshes, /obj/item/weapon/card/id/syndicate,\ + /obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\ + /obj/item/device/chameleon, /obj/item/weapon/card/emag, /obj/item/device/hacktool,\ + /obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\ + /obj/item/device/radio/headset/traitor, /obj/item/weapon/plastique,\ + /obj/item/weapon/syndie/c4explosive, /obj/item/device/powersink,\ + /obj/machinery/singularity_beacon/syndicate, /obj/item/weapon/storage/syndie_kit,\ + /obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\ + /obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\ + /obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\ + /obj/item/clothing/shoes/magboots, /obj/item/blueprints, /obj/item/weapon/disk/nuclear,\ + /obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank) + +/proc/fake_attack(var/mob/target) + var/list/possible_clones = new/list() + var/mob/living/carbon/human/clone = null + var/clone_weapon = null + + for(var/mob/living/carbon/human/H in world) + if(H.stat || H.lying) continue + possible_clones += H + + if(!possible_clones.len) return + clone = pick(possible_clones) + //var/obj/fake_attacker/F = new/obj/fake_attacker(outside_range(target)) + var/obj/fake_attacker/F = new/obj/fake_attacker(target.loc) + if(clone.l_hand) + if(!(locate(clone.l_hand) in non_fakeattack_weapons)) + clone_weapon = clone.l_hand.name + F.weap = clone.l_hand + else if (clone.r_hand) + if(!(locate(clone.r_hand) in non_fakeattack_weapons)) + clone_weapon = clone.r_hand.name + F.weap = clone.r_hand + + F.name = clone.name + F.my_target = target + F.weapon_name = clone_weapon + target.hallucinations += F + + + F.left = image(clone,dir = WEST) + F.right = image(clone,dir = EAST) + F.up = image(clone,dir = NORTH) + F.down = image(clone,dir = SOUTH) + +// F.base = new /icon(clone.stand_icon) +// F.currentimage = new /image(clone) + +/* + + + + F.left = new /icon(clone.stand_icon,dir=WEST) + for(var/icon/i in clone.overlays) + F.left.Blend(i) + F.up = new /icon(clone.stand_icon,dir=NORTH) + for(var/icon/i in clone.overlays) + F.up.Blend(i) + F.down = new /icon(clone.stand_icon,dir=SOUTH) + for(var/icon/i in clone.overlays) + F.down.Blend(i) + F.right = new /icon(clone.stand_icon,dir=EAST) + for(var/icon/i in clone.overlays) + F.right.Blend(i) + + target << F.up + */ + + F.updateimage() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 0892d7ea1a4..2fd08fb4cb5 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -1,4 +1,10 @@ /mob/living/carbon/human/death(gibbed) + if(halloss > 0 && (!gibbed)) + //hallucination = 0 + halloss = 0 + // And the suffocation was a hallucination (lazy) + //oxyloss = 0 + return if(src.stat == 2) return if(src.healths) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 096737be634..f5db92ac0b9 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -150,6 +150,24 @@ handle_disabilities() + if(hallucination > 0) + + if(hallucinations.len == 0 && hallucination >= 20 && health > 0) + if(prob(5)) + fake_attack(src) + //for(var/atom/a in hallucinations) + // a.hallucinate(src) + if(!handling_hal && hallucination > 20) + spawn handle_hallucinations() //The not boring kind! + hallucination -= 1 + //if(health < 0) + // for(var/obj/a in hallucinations) + // del a + else + halloss = 0 + for(var/atom/a in hallucinations) + del a + if (disabilities & 2) if ((prob(1) && paralysis < 1 && r_epil < 1)) src << "\red You have a seizure!" @@ -724,7 +742,7 @@ if(sleeping) Paralyse(3) - if (prob(10) && health) spawn(0) emote("snore") + if (prob(10) && health && !hal_crit) spawn(0) emote("snore") if(!src.sleeping_willingly) src.sleeping-- @@ -953,7 +971,7 @@ - if (src.sleep) + if (src.sleep && !hal_crit) src.sleep.icon_state = text("sleep[]", src.sleeping > 0 ? 1 : 0) src.sleep.overlays = null if(src.sleeping_willingly) @@ -979,6 +997,10 @@ healths.icon_state = "health6" else healths.icon_state = "health7" + if(hal_screwyhud == 1) + healths.icon_state = "health6" + if(hal_screwyhud == 2) + healths.icon_state = "health7" if (nutrition_icon) switch(nutrition) @@ -998,8 +1020,8 @@ if(resting || lying || sleeping) rest.icon_state = "rest[(resting || lying || sleeping) ? 1 : 0]" - if (toxin) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" - if (oxygen) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" + if (toxin || hal_screwyhud == 4) toxin.icon_state = "tox[toxins_alert ? 1 : 0]" + if (oxygen || hal_screwyhud == 3) oxygen.icon_state = "oxy[oxygen_alert ? 1 : 0]" if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]" //NOTE: the alerts dont reset when youre out of danger. dont blame me, //blame the person who coded them. Temporary fix added. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 65f228af505..991df4346b8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -8,7 +8,7 @@ /mob/living/proc/updatehealth() if(!src.nodamage) - src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() - src.cloneloss + src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() - src.cloneloss - src.halloss else src.health = 100 src.stat = 0 diff --git a/code/game/objects/items/weapons/toilets.dm b/code/unused/toilets.dm similarity index 96% rename from code/game/objects/items/weapons/toilets.dm rename to code/unused/toilets.dm index 5aa5e0d1690..d378181c397 100644 --- a/code/game/objects/items/weapons/toilets.dm +++ b/code/unused/toilets.dm @@ -1,96 +1,96 @@ -/* -CONTAINS: -TOILET - -/obj/item/weapon/storage/toilet - name = "toilet" - w_class = 4.0 - anchored = 1.0 - density = 0.0 - var/status = 0.0 - var/clogged = 0.0 - anchored = 1.0 - icon = 'stationobjs.dmi' - icon_state = "toilet" - item_state = "syringe_kit" - -/obj/item/weapon/storage/toilet/attackby(obj/item/weapon/W as obj, mob/user as mob) - ..() - if (src.contents.len >= 7) - user << "The toilet is clogged!" - return - if (istype(W, /obj/item/weapon/disk/nuclear)) - user << "This is far too important to flush!" - return - if (istype(W, /obj/item/weapon/storage/)) - return - if (istype(W, /obj/item/weapon/grab)) - playsound(src.loc, 'slosh.ogg', 50, 1) - for(var/mob/O in viewers(user, null)) - O << text("\blue [] gives [] a swirlie!", user, W) - return - var/t - for(var/obj/item/weapon/O in src) - t += O.w_class - t += W.w_class - if (t > 30) - user << "You cannot fit the item inside." - return - user.u_equip(W) - W.loc = src - if ((user.client && user.s_active != src)) - user.client.screen -= W - src.orient2hud(user) - W.dropped(user) - add_fingerprint(user) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\blue [] has put [] in []!", user, W, src), 1) - return - -/obj/item/weapon/storage/toilet/MouseDrop_T(mob/M as mob, mob/user as mob) - if (!ticker) - user << "You can't help relieve anyone before the game starts." - return - if ((!( istype(M, /mob) ) || get_dist(src, user) > 1 || M.loc != src.loc || user.restrained() || usr.stat)) - return - if (M == usr) - for(var/mob/O in viewers(user, null)) - if ((O.client && !( O.blinded ))) - O << text("\blue [] sits on the toilet.", user) - else - for(var/mob/O in viewers(user, null)) - if ((O.client && !( O.blinded ))) - O << text("\blue [] is seated on the toilet by []!", M, user) - M.anchored = 1 - M.buckled = src - M.loc = src.loc - src.add_fingerprint(user) - return - -/obj/item/weapon/storage/toilet/attack_hand(mob/user as mob) - for(var/mob/M in src.loc) - if (M.buckled) - if (M != user) - for(var/mob/O in viewers(user, null)) - if ((O.client && !( O.blinded ))) - O << text("\blue [] is zipped up by [].", M, user) - else - for(var/mob/O in viewers(user, null)) - if ((O.client && !( O.blinded ))) - O << text("\blue [] zips up.", M) -// world << "[M] is no longer buckled to [src]" - M.anchored = 0 - M.buckled = null - src.add_fingerprint(user) - if((src.clogged < 1) || (src.contents.len < 7) || (user.loc != src.loc)) - for(var/mob/O in viewers(user, null)) - O << text("\blue [] flushes the toilet.", user) - src.clogged = 0 - src.contents.len = 0 - else if((src.clogged >= 1) || (src.contents.len >= 7) || (user.buckled != src.loc)) - for(var/mob/O in viewers(user, null)) - O << text("\blue The toilet is clogged!") - return - - +/* +CONTAINS: +TOILET + +/obj/item/weapon/storage/toilet + name = "toilet" + w_class = 4.0 + anchored = 1.0 + density = 0.0 + var/status = 0.0 + var/clogged = 0.0 + anchored = 1.0 + icon = 'stationobjs.dmi' + icon_state = "toilet" + item_state = "syringe_kit" + +/obj/item/weapon/storage/toilet/attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + if (src.contents.len >= 7) + user << "The toilet is clogged!" + return + if (istype(W, /obj/item/weapon/disk/nuclear)) + user << "This is far too important to flush!" + return + if (istype(W, /obj/item/weapon/storage/)) + return + if (istype(W, /obj/item/weapon/grab)) + playsound(src.loc, 'slosh.ogg', 50, 1) + for(var/mob/O in viewers(user, null)) + O << text("\blue [] gives [] a swirlie!", user, W) + return + var/t + for(var/obj/item/weapon/O in src) + t += O.w_class + t += W.w_class + if (t > 30) + user << "You cannot fit the item inside." + return + user.u_equip(W) + W.loc = src + if ((user.client && user.s_active != src)) + user.client.screen -= W + src.orient2hud(user) + W.dropped(user) + add_fingerprint(user) + for(var/mob/O in viewers(user, null)) + O.show_message(text("\blue [] has put [] in []!", user, W, src), 1) + return + +/obj/item/weapon/storage/toilet/MouseDrop_T(mob/M as mob, mob/user as mob) + if (!ticker) + user << "You can't help relieve anyone before the game starts." + return + if ((!( istype(M, /mob) ) || get_dist(src, user) > 1 || M.loc != src.loc || user.restrained() || usr.stat)) + return + if (M == usr) + for(var/mob/O in viewers(user, null)) + if ((O.client && !( O.blinded ))) + O << text("\blue [] sits on the toilet.", user) + else + for(var/mob/O in viewers(user, null)) + if ((O.client && !( O.blinded ))) + O << text("\blue [] is seated on the toilet by []!", M, user) + M.anchored = 1 + M.buckled = src + M.loc = src.loc + src.add_fingerprint(user) + return + +/obj/item/weapon/storage/toilet/attack_hand(mob/user as mob) + for(var/mob/M in src.loc) + if (M.buckled) + if (M != user) + for(var/mob/O in viewers(user, null)) + if ((O.client && !( O.blinded ))) + O << text("\blue [] is zipped up by [].", M, user) + else + for(var/mob/O in viewers(user, null)) + if ((O.client && !( O.blinded ))) + O << text("\blue [] zips up.", M) +// world << "[M] is no longer buckled to [src]" + M.anchored = 0 + M.buckled = null + src.add_fingerprint(user) + if((src.clogged < 1) || (src.contents.len < 7) || (user.loc != src.loc)) + for(var/mob/O in viewers(user, null)) + O << text("\blue [] flushes the toilet.", user) + src.clogged = 0 + src.contents.len = 0 + else if((src.clogged >= 1) || (src.contents.len >= 7) || (user.buckled != src.loc)) + for(var/mob/O in viewers(user, null)) + O << text("\blue The toilet is clogged!") + return + + */ \ No newline at end of file diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 9ee65d27bf127a31158876b00f9dc3625ba971a7..ad351e8fafb6d311b1a93eee39ab232f6e9f1a81 100644 GIT binary patch delta 1572 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