diff --git a/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm b/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm index 4ebc9469da3..dbfa94043ec 100644 --- a/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm +++ b/code/WorkInProgress/Chinsky/overmap/ships/computers/shuttle.dm @@ -83,7 +83,7 @@ shuttle_status = "Standing-by at station." else shuttle_status = "Standing-by at offsite location." - if(WAIT_LAUNCH) + if(WAIT_LAUNCH, FORCE_LAUNCH) shuttle_status = "Shuttle has recieved command and will depart shortly." if(WAIT_ARRIVE) shuttle_status = "Proceeding to destination." diff --git a/code/WorkInProgress/computer3/component.dm b/code/WorkInProgress/computer3/component.dm index 18cf2de1c76..f484e04c645 100644 --- a/code/WorkInProgress/computer3/component.dm +++ b/code/WorkInProgress/computer3/component.dm @@ -215,9 +215,12 @@ if(reader) reader.loc = loc if(istype(L) && !L.get_active_hand()) - L.put_in_hands(reader) + if(istype(L,/mob/living/carbon/human)) + L.put_in_hands(reader) + else + reader.loc = get_turf(computer) else - reader.loc = computer.loc + reader.loc = get_turf(computer) reader = null return 1 return 0 @@ -226,16 +229,16 @@ if(writer && dualslot) writer.loc = loc if(istype(L) && !L.get_active_hand()) - L.put_in_hands(writer) + if(istype(L,/mob/living/carbon/human)) + L.put_in_hands(writer) + else + writer.loc = get_turf(computer) else - writer.loc = computer.loc + writer.loc = get_turf(computer) writer = null return 1 return 0 - - - // Authorizes the user based on the computer's requirements proc/authenticate() return computer.check_access(reader) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index e69ed4b5ddd..3df48454de7 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -794,6 +794,9 @@ client var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages + if(!new_language) + return + if(!H) usr << "Mob doesn't exist anymore" return @@ -817,6 +820,9 @@ client var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages + if(!rem_language) + return + if(!H) usr << "Mob doesn't exist anymore" return diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 6de75c2b9df..79074cfbe68 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -634,4 +634,4 @@ icon = 'icons/obj/stock_parts.dmi' icon_state = "capacitor" desc = "A debug item for research." - origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8" + origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8;phorontech=8;engineering=8" diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 0309eccee0b..d353c77ad06 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -457,7 +457,7 @@ changeling.chem_charges -= 20 // restore us to health - C.rejuvenate() + C.revive() // remove our fake death flag C.status_flags &= ~(FAKEDEATH) diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm index 1bf2406db5b..3dac9f21488 100644 --- a/code/game/gamemodes/events/space_ninja.dm +++ b/code/game/gamemodes/events/space_ninja.dm @@ -531,20 +531,31 @@ As such, it's hard-coded for now. No reason for it not to be, really. else equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform) + equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask) + equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt) + var/obj/item/weapon/rig/light/ninja/ninjasuit = new(src) // Make sure the ninja can actually equip the suit. if(src.dna && src.dna.unique_enzymes) - src << "Suit hardware locked to your DNA hash." ninjasuit.locked_dna = src.dna.unique_enzymes + spawn(10) + src << "Suit hardware locked to your DNA hash." else ninjasuit.req_access = list() equip_to_slot_or_del(ninjasuit,slot_back) + + if(istype(wear_suit,/obj/item/weapon/rig)) + var/obj/item/weapon/rig/rig = wear_suit + if(rig.air_supply) + internal = rig.air_supply + if(!internal && s_store) + internal = s_store + if(internal) + internals.icon_state = "internal1" + spawn(10) ninjasuit.toggle_seals(src,1) - equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask) - equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt) - equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(src), slot_s_store) - return 1 + return 1 \ No newline at end of file diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 085ca17a80b..b3c6ad7e98f 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -27,16 +27,14 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) - H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) if(H.backbag == 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 - - + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) /datum/job/doctor title = "Medical Doctor" @@ -54,6 +52,8 @@ equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) switch(H.backbag) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back) @@ -90,14 +90,12 @@ else H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) - H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) if(H.backbag == 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) return 1 @@ -123,13 +121,13 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit) switch(H.backbag) if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit) return 1 @@ -153,48 +151,15 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) switch(H.backbag) if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - return 1 - -/*/datum/job/virologist - title = "Virologist" - flag = VIROLOGIST - department_flag = MEDSCI - faction = "Station" - total_positions = 1 - spawn_positions = 1 - supervisors = "the chief medical officer" - selection_color = "#ffeef0" - access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) - minimal_access = list(access_medical, access_virology) - alt_titles = list("Pathologist","Microbiologist") - - - equip(var/mob/living/carbon/human/H) - if(!H) return 0 - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear) - switch(H.backbag) - if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) - if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back) - if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/pda/viro(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) - if(H.backbag == 1) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - return 1*/ + return 1 /datum/job/psychiatrist title = "Psychiatrist" @@ -224,10 +189,10 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform) else H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt) if(H.backbag == 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) \ No newline at end of file diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index b18e8b8ec16..e387e0d4be0 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -25,7 +25,6 @@ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand) switch(H.backbag) if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) @@ -33,6 +32,7 @@ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) return 1 @@ -58,13 +58,13 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit) switch(H.backbag) if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit) return 1 @@ -89,16 +89,15 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit) switch(H.backbag) if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit) return 1 - /datum/job/roboticist title = "Roboticist" flag = ROBOTICIST @@ -122,11 +121,10 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/roboticist(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) -// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) H.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(H), slot_l_hand) if(H.backbag == 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) - return 1 + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) + return 1 \ No newline at end of file diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index cc0628c2849..6d25f7fe58b 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -106,17 +106,8 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt) -/* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H) - CIG.light("") - H.equip_to_slot_or_del(CIG, slot_wear_mask) */ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) - if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician") - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit) - else - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head) H.equip_to_slot_or_del(new /obj/item/weapon/flame/lighter/zippo(H), slot_l_store) - if(H.backbag == 1)//Why cant some of these things spawn in his office? H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand) @@ -125,7 +116,11 @@ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack) - + if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician") + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit) + else + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head) return 1 diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 326f705a5da..b3918713e79 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -379,16 +379,17 @@ var/global/datum/controller/occupations/job_master continue if(G.slot && !(G.slot in custom_equip_slots)) - if(H.equip_to_slot_or_del(new G.path(H), G.slot)) + // This is a miserable way to fix the loadout overwrite bug, but the alternative requires + // adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z + if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head) + custom_equip_leftovers += thing + else if(H.equip_to_slot_or_del(new G.path(H), G.slot)) H << "\blue Equipping you with [thing]!" custom_equip_slots.Add(G.slot) else custom_equip_leftovers.Add(thing) - else spawn_in_storage += thing - - //Equip job items. job.equip(H) job.apply_fingerprints(H) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 4342778f9af..76d1e0fb939 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -40,13 +40,13 @@ if(scan) usr << "You remove \the [scan] from \the [src]." scan.loc = get_turf(src) - if(!usr.get_active_hand()) + if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) usr.put_in_hands(scan) scan = null else if(modify) usr << "You remove \the [modify] from \the [src]." modify.loc = get_turf(src) - if(!usr.get_active_hand()) + if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) usr.put_in_hands(modify) modify = null else diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index a03edba52ad..1a7a8ea33a2 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -26,7 +26,7 @@ if(scan) usr << "You remove \the [scan] from \the [src]." scan.loc = get_turf(src) - if(!usr.get_active_hand()) + if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) usr.put_in_hands(scan) scan = null else diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e97d9f6865d..5aed27cc564 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -32,7 +32,7 @@ if(scan) usr << "You remove \the [scan] from \the [src]." scan.loc = get_turf(src) - if(!usr.get_active_hand()) + if(!usr.get_active_hand() && istype(usr,/mob/living/carbon/human)) usr.put_in_hands(scan) scan = null else diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 40a38621bef..847663ee4a1 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -341,7 +341,7 @@ if(slot_w_uniform) if(H.w_uniform) return 0 - if(H.wear_suit) + if(H.wear_suit && (H.wear_suit.body_parts_covered & src.body_parts_covered)) if(!disable_warning) H << "\The [H.wear_suit] is in the way." return 0 diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 6945729b5fe..7767ecd3074 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -67,7 +67,7 @@ /obj/item/device/aicard/Topic(href, href_list) var/mob/U = usr - if (!(get_turf(U) == get_turf(src)) || U.machine != src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else). + if (get_dist(get_turf(U),get_turf(src)) > 1 || U.machine != src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else). U << browse(null, "window=aicard") U.unset_machine() return diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index fc41725ef46..3b7e66b7dfd 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -309,4 +309,10 @@ /obj/item/device/paicard/emp_act(severity) for(var/mob/M in src) M.emp_act(severity) - ..() \ No newline at end of file + ..() + +/obj/item/device/paicard/ex_act(severity) + if(pai) + pai.ex_act(severity) + else + del(src) diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index 3dc57db6549..03776c78ded 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -3,128 +3,159 @@ /obj/item/weapon/implantcase name = "Glass Case" desc = "A case containing an implant." + icon = 'icons/obj/items.dmi' icon_state = "implantcase-0" item_state = "implantcase" throw_speed = 1 throw_range = 5 w_class = 1.0 var/obj/item/weapon/implant/imp = null - proc - update() +/obj/item/weapon/implantcase/proc/update() + if (src.imp) + src.icon_state = text("implantcase-[]", src.imp.item_color) + else + src.icon_state = "implantcase-0" + return - update() - if (src.imp) - src.icon_state = text("implantcase-[]", src.imp.item_color) +/obj/item/weapon/implantcase/attackby(obj/item/weapon/I as obj, mob/user as mob) + ..() + if (istype(I, /obj/item/weapon/pen)) + var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text + if (user.get_active_hand() != I) + return + if((!in_range(src, usr) && src.loc != user)) + return + t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + if(t) + src.name = text("Glass Case - '[]'", t) else - src.icon_state = "implantcase-0" - return - - - attackby(obj/item/weapon/I as obj, mob/user as mob) - ..() - if (istype(I, /obj/item/weapon/pen)) - var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text - if (user.get_active_hand() != I) + src.name = "Glass Case" + else if(istype(I, /obj/item/weapon/reagent_containers/syringe)) + if(!src.imp) return + if(!src.imp.allow_reagents) return + if(src.imp.reagents.total_volume >= src.imp.reagents.maximum_volume) + user << "\red [src] is full." + else + spawn(5) + I.reagents.trans_to(src.imp, 5) + user << "\blue You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units." + else if (istype(I, /obj/item/weapon/implanter)) + var/obj/item/weapon/implanter/M = I + if (M.imp) + if ((src.imp || M.imp.implanted)) return - if((!in_range(src, usr) && src.loc != user)) - return - t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) - if(t) - src.name = text("Glass Case- '[]'", t) - else - src.name = "Glass Case" - else if(istype(I, /obj/item/weapon/reagent_containers/syringe)) - if(!src.imp) return - if(!src.imp.allow_reagents) return - if(src.imp.reagents.total_volume >= src.imp.reagents.maximum_volume) - user << "\red [src] is full." - else - spawn(5) - I.reagents.trans_to(src.imp, 5) - user << "\blue You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units." - else if (istype(I, /obj/item/weapon/implanter)) - if (I:imp) - if ((src.imp || I:imp.implanted)) + M.imp.loc = src + src.imp = M.imp + M.imp = null + src.update() + M.update() + else + if (src.imp) + if (M.imp) return - I:imp.loc = src - src.imp = I:imp - I:imp = null - src.update() - I:update() - else - if (src.imp) - if (I:imp) - return - src.imp.loc = I - I:imp = src.imp - src.imp = null - update() - I:update() - return - + src.imp.loc = M + M.imp = src.imp + src.imp = null + update() + M.update() + return /obj/item/weapon/implantcase/tracking - name = "Glass Case- 'Tracking'" + name = "Glass Case - 'Tracking'" desc = "A case containing a tracking implant." - icon = 'icons/obj/items.dmi' icon_state = "implantcase-b" - - New() - src.imp = new /obj/item/weapon/implant/tracking( src ) - ..() - return - +/obj/item/weapon/implantcase/tracking/New() + src.imp = new /obj/item/weapon/implant/tracking( src ) + ..() + return /obj/item/weapon/implantcase/explosive - name = "Glass Case- 'Explosive'" + name = "Glass Case - 'Explosive'" desc = "A case containing an explosive implant." - icon = 'icons/obj/items.dmi' icon_state = "implantcase-r" - - New() - src.imp = new /obj/item/weapon/implant/explosive( src ) - ..() - return - +/obj/item/weapon/implantcase/explosive/New() + src.imp = new /obj/item/weapon/implant/explosive( src ) + ..() + return /obj/item/weapon/implantcase/chem - name = "Glass Case- 'Chem'" + name = "Glass Case - 'Chem'" desc = "A case containing a chemical implant." - icon = 'icons/obj/items.dmi' icon_state = "implantcase-b" -/obj/item/weapon/implantcase/chem/New() +/obj/item/weapon/implantcase/chem/New() src.imp = new /obj/item/weapon/implant/chem( src ) ..() return /obj/item/weapon/implantcase/loyalty - name = "Glass Case- 'Loyalty'" + name = "Glass Case - 'Loyalty'" desc = "A case containing a loyalty implant." - icon = 'icons/obj/items.dmi' icon_state = "implantcase-r" - - New() - src.imp = new /obj/item/weapon/implant/loyalty( src ) - ..() - return +/obj/item/weapon/implantcase/loyalty/New() + src.imp = new /obj/item/weapon/implant/loyalty( src ) + ..() + return /obj/item/weapon/implantcase/death_alarm - name = "Glass Case- 'Death Alarm'" + name = "Glass Case - 'Death Alarm'" desc = "A case containing a death alarm implant." - icon = 'icons/obj/items.dmi' icon_state = "implantcase-b" - New() - src.imp = new /obj/item/weapon/implant/death_alarm( src ) - ..() - return +/obj/item/weapon/implantcase/death_alarm/New() + src.imp = new /obj/item/weapon/implant/death_alarm( src ) + ..() + return + + +/obj/item/weapon/implantcase/freedom + name = "Glass Case - 'Freedom'" + desc = "A case containing a freedom implant." + icon_state = "implantcase-r" + +/obj/item/weapon/implantcase/freedom/New() + src.imp = new /obj/item/weapon/implant/freedom( src ) + ..() + return + + +/obj/item/weapon/implantcase/adrenalin + name = "Glass Case - 'Adrenalin'" + desc = "A case containing an adrenalin implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/adrenalin/New() + src.imp = new /obj/item/weapon/implant/adrenalin( src ) + ..() + return + + +/obj/item/weapon/implantcase/dexplosive + name = "Glass Case - 'Explosive'" + desc = "A case containing an explosive." + icon_state = "implantcase-r" + +/obj/item/weapon/implantcase/dexplosive/New() + src.imp = new /obj/item/weapon/implant/dexplosive( src ) + ..() + return + + +/obj/item/weapon/implantcase/health + name = "Glass Case - 'Health'" + desc = "A case containing a health tracking implant." + icon_state = "implantcase-b" + +/obj/item/weapon/implantcase/health/New() + src.imp = new /obj/item/weapon/implant/health( src ) + ..() + return \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 3d21575c749..e67fea38494 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -1,4 +1,5 @@ //Alium nests. Essentially beds with an unbuckle delay that only aliums can buckle mobs to. +#define NEST_RESIST_TIME 1200 /obj/structure/stool/bed/nest name = "alien nest" @@ -19,12 +20,16 @@ buckled_mob.old_y = 0 unbuckle() else + if(world.time <= buckled_mob.last_special+NEST_RESIST_TIME) + return + buckled_mob.last_special = world.time buckled_mob.visible_message(\ "[buckled_mob.name] struggles to break free of the gelatinous resin...",\ "You struggle to break free from the gelatinous resin...",\ "You hear squelching...") - spawn(1200) + spawn(NEST_RESIST_TIME) if(user && buckled_mob && user.buckled == src) + buckled_mob.last_special = world.time buckled_mob.pixel_y = 0 buckled_mob.old_y = 0 unbuckle() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 4ac8aa6c465..608bd782dc7 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -163,31 +163,32 @@ /obj/structure/window/attackby(obj/item/W as obj, mob/user as mob) if(!istype(W)) return//I really wish I did not need this - if(W.flags & NOBLUDGEON) return - if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) var/obj/item/weapon/grab/G = W - if (istype(G.affecting, /mob/living)) + if(istype(G.affecting,/mob/living)) var/mob/living/M = G.affecting var/state = G.state del(W) //gotta delete it here because if window breaks, it won't get deleted switch (state) if(1) + M.visible_message("[user] slams [M] against \the [src]!") M.apply_damage(7) hit(10) - visible_message("\red [user] slams [M] against \the [src]!") if(2) + M.visible_message("[user] bashes [M] against \the [src]!") if (prob(50)) M.Weaken(1) M.apply_damage(10) hit(25) - visible_message("\red [user] bashes [M] against \the [src]!") if(3) + M.visible_message("[user] crushes [M] against \the [src]!") M.Weaken(5) M.apply_damage(20) hit(50) - visible_message("\red [user] crushes [M] against \the [src]!") return + + if(W.flags & NOBLUDGEON) return + if(istype(W, /obj/item/weapon/screwdriver)) if(reinf && state >= 1) state = 3 - state diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 80a70d5c049..d2cd7a18d54 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -86,7 +86,7 @@ //Finally, check objects/mobs to block entry that are not on the border for(var/atom/movable/obstacle in src) - if(obstacle.flags & ~ON_BORDER) + if(!(obstacle.flags & ON_BORDER)) if(!obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != obstacle)) mover.Bump(obstacle, 1) return 0 diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 9461b9477c4..721becf039f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -460,8 +460,6 @@ Traitors and the like can also be revived with the previous role mostly intact. call(/datum/game_mode/proc/equip_syndicate)(new_character) if("Ninja") new_character.equip_space_ninja() - new_character.internal = new_character.s_store - new_character.internals.icon_state = "internal1" if(ninjastart.len == 0) new_character << "\red A proper starting location for you could not be found, please report this bug!" new_character << "\red Attempting to place at a carpspawn." diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 7b7e2374d4c..71293ef4503 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -138,11 +138,15 @@ if(ai_card) if(istype(ai_card, /obj/item/device/aicard)) - if(integrated_ai && integrated_ai.client) + if(integrated_ai && !integrated_ai.stat) if(user) user << "You cannot eject your currently stored AI. Purge it manually." return 0 - del(ai_card) + user << "You purge the remaining scraps of data from your previous AI, freeing it for use." + if(integrated_ai) + integrated_ai.ghostize() + del(integrated_ai) + if(ai_card) del(ai_card) else if(user) user.put_in_hands(ai_card) else diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 06a72bc3525..3a09ad41b16 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -58,7 +58,9 @@ desc = "You think it's called an Elder Sarsparilla or something." interface_name = "Alden-Saraspova counter" interface_desc = "An exotic particle detector commonly used by xenoarchaeologists." - selectable = 1 + engage_string = "Begin Scan" + usable = 1 + selectable = 0 device_type = /obj/item/device/ano_scanner /obj/item/rig_module/device/orescanner @@ -66,12 +68,9 @@ desc = "A clunky old ore scanner." interface_name = "ore detector" interface_desc = "A sonar system for detecting large masses of ore." - engage_string = "Begin Scan" - usable = 1 selectable = 0 - device_type = /obj/item/weapon/mining_scanner /obj/item/rig_module/device/rcd diff --git a/code/modules/hydroponics/hydro_tray.dm b/code/modules/hydroponics/hydro_tray.dm index ba5f4dbc310..75169cd30cc 100644 --- a/code/modules/hydroponics/hydro_tray.dm +++ b/code/modules/hydroponics/hydro_tray.dm @@ -129,8 +129,6 @@ create_reagents(200) connect() update_icon() - if(closed_system) - flags &= ~OPENCONTAINER /obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj) @@ -777,11 +775,6 @@ closed_system = !closed_system usr << "You [closed_system ? "close" : "open"] the tray's lid." - if(closed_system) - flags &= ~OPENCONTAINER - else - flags |= OPENCONTAINER - update_icon() /obj/machinery/portable_atmospherics/hydroponics/soil diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index a08de942d01..9fe3702eac4 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -25,7 +25,7 @@ /datum/seed/proc/request_player(var/mob/living/host) if(!host) return for(var/mob/dead/observer/O in player_list) - if(jobban_isbanned(O, "Dionaea") || (!is_alien_whitelisted(O, "Diona") && config.usealienwhitelist)) + if(jobban_isbanned(O, "Dionaea")) continue if(O.client) if(O.client.prefs.be_special & BE_PLANT && !(O.client in currently_querying)) diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index dc1ca257276..ab9c64eebfe 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -1,31 +1,31 @@ //This is the proc for gibbing a mob. Cannot gib ghosts. //added different sort of gibs and animations. N -/mob/proc/gib() +/mob/proc/gib(anim="gibbed-m",do_gibs) death(1) - var/atom/movable/overlay/animation = null monkeyizing = 1 canmove = 0 icon = null invisibility = 101 + update_canmove() + dead_mob_list -= src + var/atom/movable/overlay/animation = null animation = new(loc) animation.icon_state = "blank" animation.icon = 'icons/mob/mob.dmi' animation.master = src -// flick("gibbed-m", animation) - gibs(loc, viruses, dna) + flick(anim, animation) + if(do_gibs) gibs(loc, viruses, dna) - dead_mob_list -= src spawn(15) if(animation) del(animation) if(src) del(src) - //This is the proc for turning a mob into ash. Mostly a copy of gib code (above). //Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here. //Dusting robots does not eject the MMI, so it's a bit more powerful than gib() /N -/mob/proc/dust() +/mob/proc/dust(anim="dust-m",remains=/obj/effect/decal/cleanable/ash) death(1) var/atom/movable/overlay/animation = null monkeyizing = 1 @@ -38,8 +38,8 @@ animation.icon = 'icons/mob/mob.dmi' animation.master = src -// flick("dust-m", animation) - new /obj/effect/decal/cleanable/ash(loc) + flick(anim, animation) + new remains(loc) dead_mob_list -= src spawn(15) @@ -47,17 +47,45 @@ if(src) del(src) -/mob/proc/death(gibbed) +/mob/proc/death(gibbed,deathmessage="seizes up and falls limp...") + + if(stat == DEAD) + return 0 + + if(!gibbed) + src.visible_message("\The [src.name] [deathmessage]") + + stat = DEAD + + update_canmove() + + dizziness = 0 + jitteriness = 0 + + layer = MOB_LAYER + + if(blind && client) + blind.layer = 0 + + sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO - //Quick fix for corpses kept propped up in chairs. ~Z drop_r_hand() drop_l_hand() - //End of fix. + + if(healths) + healths.icon_state = "health6" timeofdeath = world.time - - var/tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) + if(mind) mind.store_memory("Time of death: [worldtime2text()]", 0) living_mob_list -= src - dead_mob_list += src - return ..(gibbed) + dead_mob_list |= src + + updateicon() + + if(ticker && ticker.mode) + ticker.mode.check_win() + + + return 1 diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 04fa4273a07..ffe9df9839b 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -8,7 +8,7 @@ //Does the speaker have a client? It's either random stuff that observers won't care about (Experiment 97B says, 'EHEHEHEHEHEHEHE') //Or someone snoring. So we make it where they won't hear it. return - + //make sure the air can transmit speech - hearer's side var/turf/T = get_turf(src) if (T) @@ -16,22 +16,22 @@ var/pressure = (environment)? environment.return_pressure() : 0 if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1) return - + if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet italics = 1 sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact - + if(sleeping || stat == 1) hear_sleep(message) return var/style = "body" - + //non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet. if (language && (language.flags & NONVERBAL)) if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src))) message = stars(message) - + if(!say_understands(speaker,language)) if(istype(speaker,/mob/living/simple_animal)) var/mob/living/simple_animal/S = speaker @@ -89,11 +89,14 @@ if (language && (language.flags & NONVERBAL)) if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src))) message = stars(message) - + if(!say_understands(speaker,language)) if(istype(speaker,/mob/living/simple_animal)) var/mob/living/simple_animal/S = speaker - message = pick(S.speak) + if(S.speak && S.speak.len) + message = pick(S.speak) + else + return else message = stars(message) @@ -173,7 +176,7 @@ /mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null) if(!client) return - + if(say_understands(speaker, language)) message = "[src] [verb], \"[message]\"" else diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index d1adff7de2c..1b8cf6eee6f 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -58,6 +58,7 @@ desc = "It's a tiny plant critter." icon_state = "nymph" origin_tech = "magnets=3;biotech=5" + slot_flags = SLOT_HEAD | SLOT_OCLOTHING /obj/item/weapon/holder/drone name = "maintenance drone" diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 2e627330a06..b3ac9864874 100755 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -81,7 +81,7 @@ ask_verb = "creels" exclaim_verb = "SHRIEKS" colour = "vox" - key = "v" + key = "5" flags = RESTRICTED /datum/language/diona diff --git a/code/modules/mob/living/blob/blob.dm b/code/modules/mob/living/blob/blob.dm index ec90c4fb7ff..2b82ccbedbf 100644 --- a/code/modules/mob/living/blob/blob.dm +++ b/code/modules/mob/living/blob/blob.dm @@ -52,14 +52,8 @@ death(gibbed) - if(key) - var/mob/dead/observer/ghost = new(src) - ghost.name = ghost_name - ghost.real_name = ghost_name - ghost.key = key - if (ghost.client) - ghost.client.eye = ghost - return ..(gibbed) + ghostize() + ..(gibbed) blob_act() diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 7dfd2cc0ebc..3c561652137 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -1,13 +1,4 @@ /mob/living/carbon/alien/death(gibbed) - - if(stat == DEAD) return - if(healths) healths.icon_state = "health6" - stat = DEAD - - if(dead_icon) icon_state = dead_icon - - if(!gibbed) - update_canmove() - if(client) blind.layer = 0 - - return ..(gibbed) \ No newline at end of file + if(!gibbed && dead_icon) + icon_state = dead_icon + return ..(gibbed,"lets out a waning guttural screech, green blood bubbling from its maw.") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm index a91f55d4b6b..d2e362269ad 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona.dm @@ -12,8 +12,8 @@ var/list/donors = list() var/last_checked_stage = 0 - universal_understand = 0 // Dionaea do not need to speak to people - universal_speak = 0 // before becoming an adult. Use *chirp. + universal_understand = 1 + universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea. holder_type = /obj/item/weapon/holder/diona /mob/living/carbon/alien/diona/New() diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm index b8a47501a8f..bac7c75d2bf 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm @@ -5,6 +5,9 @@ set name = "Merge with gestalt" set desc = "Merge with another diona." + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + if(istype(src.loc,/mob/living/carbon)) src.verbs -= /mob/living/carbon/alien/diona/proc/merge return @@ -40,6 +43,9 @@ set name = "Split from gestalt" set desc = "Split away from your gestalt as a lone nymph." + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + if(!(istype(src.loc,/mob/living/carbon))) src.verbs -= /mob/living/carbon/alien/diona/proc/split return @@ -64,6 +70,9 @@ set name = "Steal Blood" set desc = "Take a blood sample from a suitable donor." + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + var/list/choices = list() for(var/mob/living/carbon/human/H in oview(1,src)) if(src.Adjacent(H)) diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm index 0efcae7c911..b3b0ae53c18 100644 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ b/code/modules/mob/living/carbon/alien/emote.dm @@ -36,6 +36,9 @@ if (!muzzled) message = "[src] burps." m_type = 2 + if("deathgasp") + message = "The [src.name] lets out a waning guttural screech, green blood bubbling from its maw." + m_type = 2 if("scratch") if (!src.restrained()) message = "The [src.name] scratches." diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 7a51069fe87..67488df9ebc 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -61,28 +61,28 @@ silent = 0 else updatehealth() - + handle_stunned() + handle_weakened() if(health <= 0) death() blinded = 1 silent = 0 return 1 - if(paralysis) - AdjustParalysis(-1) + if(paralysis && paralysis > 0) + handle_paralysed() blinded = 1 stat = UNCONSCIOUS if(halloss > 0) adjustHalLoss(-3) - else if(sleeping) + if(sleeping) adjustHalLoss(-3) if (mind) if((mind.active && client != null) || immune_to_ssd) sleeping = max(sleeping-1, 0) blinded = 1 stat = UNCONSCIOUS - else if(resting) if(halloss > 0) adjustHalLoss(-3) diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index 897b03c8a14..ecb729ece90 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -1,43 +1,12 @@ /mob/living/carbon/brain/death(gibbed) - if(stat == DEAD) return - if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container. - for(var/mob/O in viewers(container, null)) - O.show_message(text("\red []'s MMI flatlines!", src), 1, "\red You hear something flatline.", 2) + if(!gibbed && istype(container, /obj/item/device/mmi)) //If not gibbed but in a container. container.icon_state = "mmi_dead" - stat = DEAD - - if(blind) blind.layer = 0 - sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) //mind. ? - - return ..(gibbed) + return ..(gibbed,"beeps shrilly as the MMI flatlines!") /mob/living/carbon/brain/gib() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - -// flick("gibbed-m", animation) - gibs(loc, viruses, dna) - - dead_mob_list -= src - if(container && istype(container, /obj/item/device/mmi)) + if(istype(container, /obj/item/device/mmi)) del(container)//Gets rid of the MMI if there is one if(loc) if(istype(loc,/obj/item/organ/brain)) del(loc)//Gets rid of the brain item - spawn(15) - if(animation) del(animation) - if(src) del(src) \ No newline at end of file + ..(null,1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 67197567440..e1e43926c31 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -57,7 +57,7 @@ for(var/mob/N in viewers(src, null)) if(N.client) N.show_message(text("\red [M] bursts out of [src]!"), 2) - . = ..() + . = ..(null,1) /mob/living/carbon/attack_hand(mob/M as mob) if(!istype(M, /mob/living/carbon)) return diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm index 7dc0f45087a..6f52ac106c5 100644 --- a/code/modules/mob/living/carbon/carbon_powers.dm +++ b/code/modules/mob/living/carbon/carbon_powers.dm @@ -6,6 +6,9 @@ set name = "Fertilize plant" set desc = "Turn your food into nutrients for plants." + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + var/list/trays = list() for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1)) if(tray.nutrilevel < 10 && src.Adjacent(tray)) @@ -25,6 +28,9 @@ set name = "Eat Weeds" set desc = "Clean the weeds out of soil or a hydroponics tray." + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + var/list/trays = list() for(var/obj/machinery/portable_atmospherics/hydroponics/tray in range(1)) if(tray.weedlevel > 0 && src.Adjacent(tray)) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index d8f4e313c6d..d71404e624a 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -1,15 +1,4 @@ /mob/living/carbon/human/gib() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src for(var/datum/organ/external/E in src.organs) if(istype(E, /datum/organ/external/chest)) @@ -19,49 +8,25 @@ // Override the current limb status and don't cause an explosion E.droplimb(1,1) + ..(species ? species.gibbed_anim : "gibbed-h") + if(species) - flick(species.gibbed_anim, animation) hgibs(loc, viruses, dna, species.flesh_color, species.blood_color) else - flick("gibbed-h", animation) hgibs(loc, viruses, dna) - spawn(15) - if(animation) del(animation) - if(src) del(src) - /mob/living/carbon/human/dust() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - - flick(species.dusted_anim, animation) - new species.remains_type(loc) - - spawn(15) - if(animation) del(animation) - if(src) del(src) - + if(species) + ..(species.dusted_anim, species.remains_type) + else + ..() /mob/living/carbon/human/death(gibbed) - if(stat == DEAD) return - if(healths) healths.icon_state = "health5" - stat = DEAD - dizziness = 0 - jitteriness = 0 + if(stat == DEAD) return hud_updateflag |= 1 << HEALTH_HUD hud_updateflag |= 1 << STATUS_HUD - handle_hud_list() //Handle species-specific deaths. @@ -88,30 +53,17 @@ callHook("death", list(src, gibbed)) - //Check for heist mode kill count. - if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist) ) ) - //Check for last assailant's mutantrace. - /*if( LAssailant && ( istype( LAssailant,/mob/living/carbon/human ) ) ) - var/mob/living/carbon/human/V = LAssailant - if (V.dna && (V.dna.mutantrace == "vox"))*/ //Not currently feasible due to terrible LAssailant tracking. - //world << "Vox kills: [vox_kills]" - vox_kills++ //Bad vox. Shouldn't be killing humans. + if(!gibbed && species.death_sound) + playsound(loc, species.death_sound, 80, 1, 1) - if(!gibbed) - emote("deathgasp") //let the world KNOW WE ARE DEAD // Doing this with the deathgasp emote seems odd. - if(species && species.death_sound) playsound(loc, species.death_sound, 80, 1, 1) - - update_canmove() - if(client) blind.layer = 0 - - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) if(ticker && ticker.mode) -// world.log << "k" sql_report_death(src) - ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now - return ..(gibbed) + ticker.mode.check_win() + if(istype(ticker.mode,/datum/game_mode/heist)) + vox_kills++ //Bad vox. Shouldn't be killing humans. + + return ..(gibbed,species.death_message) /mob/living/carbon/human/proc/makeSkeleton() if(SKELETON in src.mutations) return diff --git a/code/modules/mob/living/carbon/metroid/death.dm b/code/modules/mob/living/carbon/metroid/death.dm index b8e004e2016..2ebc5c576b5 100644 --- a/code/modules/mob/living/carbon/metroid/death.dm +++ b/code/modules/mob/living/carbon/metroid/death.dm @@ -1,4 +1,8 @@ /mob/living/carbon/slime/death(gibbed) + + if(stat == DEAD) return + stat = DEAD + if(!gibbed) if(is_adult) var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc) @@ -12,17 +16,7 @@ name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" return - if(stat == DEAD) return - stat = DEAD icon_state = "[colour] baby slime dead" - overlays.len = 0 - for(var/mob/O in viewers(src, null)) - O.show_message("The [name] seizes up and falls limp...", 1) //ded -- Urist - - update_canmove() - if(blind) blind.layer = 0 - - if(ticker && ticker.mode) - ticker.mode.check_win() + overlays.Cut() return ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm index 8e982eb9356..6d0c48c804c 100644 --- a/code/modules/mob/living/carbon/monkey/death.dm +++ b/code/modules/mob/living/carbon/monkey/death.dm @@ -1,56 +1,8 @@ /mob/living/carbon/monkey/gib() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - - flick("gibbed-m", animation) - gibs(loc, viruses, dna) - - spawn(15) - if(animation) del(animation) - if(src) del(src) + ..(null,1) /mob/living/carbon/monkey/dust() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - - flick("dust-m", animation) - new /obj/effect/decal/cleanable/ash(loc) - - spawn(15) - if(animation) del(animation) - if(src) del(src) - + ..("dust-m") /mob/living/carbon/monkey/death(gibbed) - if(stat == DEAD) return - if(healths) healths.icon_state = "health5" - stat = DEAD - - if(!gibbed) - for(var/mob/O in viewers(src, null)) - O.show_message("The [name] lets out a faint chimper as it collapses and stops moving...", 1) //ded -- Urist - - update_canmove() - if(blind) blind.layer = 0 - - ticker.mode.check_win() - - return ..(gibbed) \ No newline at end of file + ..(gibbed,"lets out a faint chimper as it collapses and stops moving...") \ No newline at end of file diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f883ce46ff1..5ca7d569dd3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -457,8 +457,9 @@ set name = "Resist" set category = "IC" - if(!isliving(usr) || usr.next_move > world.time) + if(usr.stat || !isliving(usr) || usr.next_move > world.time) return + usr.next_move = world.time + 20 var/mob/living/L = usr diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index d2a8e35320e..da94c1abdef 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -2,14 +2,20 @@ set name = "Crawl through Vent" set desc = "Enter an air vent and crawl through the pipe system." set category = "Abilities" + + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + handle_ventcrawl() - return /mob/living/proc/hide() set name = "Hide" set desc = "Allows to hide beneath tables or certain items. Toggled on or off." set category = "Abilities" + if(stat == DEAD || paralysis || weakened || stunned || restrained()) + return + if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 src << text("\blue You are now hiding.") diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 28404b3d8a9..622ee23bc7b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -13,7 +13,7 @@ var/list/department_radio_keys = list( ":t" = "Mercenary", "#t" = "Mercenary", ".t" = "Mercenary", ":u" = "Supply", "#u" = "Supply", ".u" = "Supply", ":v" = "Service", "#v" = "Service", ".v" = "Service", - ":o" = "AI Private", "#o" = "AI Private", ".o" = "AI Private", + ":p" = "AI Private", "#p" = "AI Private", ".p" = "AI Private", ":R" = "right ear", "#R" = "right ear", ".R" = "right ear", ":L" = "left ear", "#L" = "left ear", ".L" = "left ear", @@ -28,7 +28,7 @@ var/list/department_radio_keys = list( ":T" = "Mercenary", "#T" = "Mercenary", ".T" = "Mercenary", ":U" = "Supply", "#U" = "Supply", ".U" = "Supply", ":V" = "Service", "#V" = "Service", ".V" = "Service", - ":O" = "AI Private", "#O" = "AI Private", ".O" = "AI Private", + ":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private", //kinda localization -- rastaf0 //same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding. @@ -91,7 +91,7 @@ proc/get_radio_key_from_channel(var/channel) if (speaking.flags & SIGNLANG) return say_signlang(message, pick(speaking.signlang_verb), speaking) - + var/list/listening = list() var/list/listening_obj = list() @@ -101,11 +101,11 @@ proc/get_radio_key_from_channel(var/channel) var/pressure = (environment)? environment.return_pressure() : 0 if(pressure < SOUND_MINIMUM_PRESSURE) message_range = 1 - + if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet italics = 1 sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact - + var/list/hear = hear(message_range, T) var/list/hearturfs = list() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 77aa73cb72b..12b6301c4bc 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -421,13 +421,6 @@ var/list/ai_verbs_default = list( user.reset_view(camera) return 1 -/mob/living/silicon/ai/blob_act() - if (stat != 2) - adjustBruteLoss(60) - updatehealth() - return 1 - return 0 - /mob/living/silicon/ai/restrained() return 0 @@ -440,26 +433,6 @@ var/list/ai_verbs_default = list( ai_call_shuttle() ..() -/mob/living/silicon/ai/ex_act(severity) - if(!blinded) - flick("flash", flash) - - switch(severity) - if(1.0) - if (stat != 2) - adjustBruteLoss(100) - adjustFireLoss(100) - if(2.0) - if (stat != 2) - adjustBruteLoss(60) - adjustFireLoss(60) - if(3.0) - if (stat != 2) - adjustBruteLoss(30) - - updatehealth() - - /mob/living/silicon/ai/Topic(href, href_list) if(usr != src) return @@ -525,11 +498,6 @@ var/list/ai_verbs_default = list( updatehealth() return -/mob/living/silicon/ai/bullet_act(var/obj/item/projectile/Proj) - ..(Proj) - updatehealth() - return 2 - /mob/living/silicon/ai/reset_view(atom/A) if(camera) camera.SetLuminosity(0) diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 596b7c397c1..34281e8c0c0 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -1,20 +1,19 @@ /mob/living/silicon/ai/death(gibbed) - if(stat == DEAD) return - stat = DEAD + + if(stat == DEAD) + return + if (src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no. icon_state = "[ckey]-ai-crash" - else icon_state = "ai-crash" - update_canmove() + else + icon_state = "ai-crash" + if(src.eyeobj) src.eyeobj.setLoc(get_turf(src)) - if(blind) blind.layer = 0 - sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO + remove_ai_verbs(src) var/callshuttle = 0 - for(var/obj/machinery/computer/communications/commconsole in world) if(commconsole.z == 2) continue @@ -48,14 +47,11 @@ spawn(10) explosion(src.loc, 3, 6, 12, 15) - for(var/obj/machinery/ai_status_display/O in world) //change status + for(var/obj/machinery/ai_status_display/O in world) spawn( 0 ) O.mode = 2 if (istype(loc, /obj/item/device/aicard)) var/obj/item/device/aicard/card = loc card.update_icon() - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) - return ..(gibbed) diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 45b0268437d..2b56af75378 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -1,41 +1,12 @@ /mob/living/silicon/gib() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - -// flick("gibbed-r", animation) + ..("gibbed-r") robogibs(loc, viruses) - dead_mob_list -= src - spawn(15) - if(animation) del(animation) - if(src) del(src) - /mob/living/silicon/dust() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 + ..("dust-r", /obj/effect/decal/remains/robot) - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - -// flick("dust-r", animation) - new /obj/effect/decal/remains/robot(loc) - - dead_mob_list -= src - spawn(15) - if(animation) del(animation) - if(src) del(src) +/mob/living/silicon/death(gibbed,deathmessage) + if(in_contents_of(/obj/machinery/recharge_station))//exit the recharge station + var/obj/machinery/recharge_station/RC = loc + RC.go_out() + return ..(gibbed,deathmessage) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/decoy/death.dm b/code/modules/mob/living/silicon/decoy/death.dm index d3996e2fa70..b94a311ef7a 100644 --- a/code/modules/mob/living/silicon/decoy/death.dm +++ b/code/modules/mob/living/silicon/decoy/death.dm @@ -1,10 +1,8 @@ /mob/living/silicon/decoy/death(gibbed) if(stat == DEAD) return - stat = DEAD icon_state = "ai-crash" spawn(10) explosion(loc, 3, 6, 12, 15) - for(var/obj/machinery/ai_status_display/O in world) //change status O.mode = 2 return ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index 127091a854c..87e70393d0f 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -1,18 +1,13 @@ /mob/living/silicon/pai/death(gibbed) - if(stat == DEAD) return - stat = DEAD - canmove = 0 - if(blind) blind.layer = 0 - sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - - //var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch - //mind.store_memory("Time of death: [tod]", 0) - - //New pAI's get a brand new mind to prevent meta stuff from their previous life. This new mind causes problems down the line if it's not deleted here. - //Read as: I have no idea what I'm doing but asking for help got me nowhere so this is what you get. - Nodrak - if(mind) del(mind) - living_mob_list -= src + if(card) + card.removePersonality() + if(gibbed) + src.loc = get_turf(card) + del(card) + else + close_up() + if(mind) + del(mind) + ..(gibbed) ghostize() del(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 423287f60c1..6c099af932a 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -1,6 +1,8 @@ /mob/living/silicon/pai/Life() + if (src.stat == 2) return + if(src.cable) if(get_dist(src, src.cable) > 1) var/turf/T = get_turf_or_move(src.loc) @@ -9,20 +11,26 @@ del(src.cable) regular_hud_updates() + if(src.secHUD == 1) process_sec_hud(src, 1) + if(src.medHUD == 1) process_med_hud(src, 1) + if(silence_time) if(world.timeofday >= silence_time) silence_time = null src << "Communication circuit reinitialized. Speech and messaging functionality restored." + handle_statuses() + if(health <= 0) + death(null,"gives one shrill beep before falling lifeless.") + /mob/living/silicon/pai/updatehealth() if(status_flags & GODMODE) health = 100 stat = CONSCIOUS else - health = 100 - getBruteLoss() - getFireLoss() - + health = 100 - getBruteLoss() - getFireLoss() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index d8bf9706fd8..5f2926466b4 100755 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -169,28 +169,7 @@ if(3) src << "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all." -/mob/living/silicon/pai/ex_act(severity) - if(!blinded) - flick("flash", src.flash) - - switch(severity) - if(1.0) - if (src.stat != 2) - adjustBruteLoss(100) - adjustFireLoss(100) - if(2.0) - if (src.stat != 2) - adjustBruteLoss(60) - adjustFireLoss(60) - if(3.0) - if (src.stat != 2) - adjustBruteLoss(30) - - src.updatehealth() - - // See software.dm for Topic() - /mob/living/silicon/pai/meteorhit(obj/O as obj) for(var/mob/M in viewers(src, null)) M.show_message(text("\red [] has been hit by []", src, O), 1) @@ -201,10 +180,6 @@ src.updatehealth() return -//mob/living/silicon/pai/bullet_act(var/obj/item/projectile/Proj) - -///mob/living/silicon/pai/attack_hand(mob/living/carbon/M as mob) - /mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C) if(istype(usr, /mob/living)) var/mob/living/U = usr @@ -376,7 +351,8 @@ src.updatehealth() else visible_message("[user.name] bonks [src] harmlessly with [W].") - if(stat != 2) close_up() + spawn(1) + if(stat != 2) close_up() return /mob/living/silicon/pai/attack_hand(mob/user as mob) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index b16efbc34f7..ca3c80d3a74 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -1,72 +1,15 @@ -/mob/living/silicon/robot/gib() - //robots don't die when gibbed. instead they drop their MMI'd brain - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - - flick("gibbed-r", animation) - robogibs(loc, viruses) - - living_mob_list -= src - dead_mob_list -= src - spawn(15) - if(animation) del(animation) - if(src) del(src) - /mob/living/silicon/robot/dust() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - - flick("dust-r", animation) - new /obj/effect/decal/remains/robot(loc) - if(mmi) del(mmi) //Delete the MMI first so that it won't go popping out. - - dead_mob_list -= src - spawn(15) - if(animation) del(animation) - if(src) del(src) - + //Delete the MMI first so that it won't go popping out. + if(mmi) + del(mmi) + ..() /mob/living/silicon/robot/death(gibbed) - if(stat == DEAD) return - if(!gibbed) - emote("deathgasp") - stat = DEAD - update_canmove() if(camera) camera.status = 0 - - if(in_contents_of(/obj/machinery/recharge_station))//exit the recharge station - var/obj/machinery/recharge_station/RC = loc - RC.go_out() - + if(module) + var/obj/item/weapon/gripper/G = locate(/obj/item/weapon/gripper) in module + if(G) G.drop_item() remove_robot_verbs() - - if(blind) blind.layer = 0 - sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_LEVEL_TWO - updateicon() - - tod = worldtime2text() //weasellos time of death patch - if(mind) mind.store_memory("Time of death: [tod]", 0) - sql_report_cyborg_death(src) - - return ..(gibbed) \ No newline at end of file + ..(gibbed,"shudders violently for a moment, then becomes motionless, its eyes slowly darkening.") diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 505b2e47ffb..7443bd7464d 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -200,14 +200,6 @@ return ..() -/mob/living/silicon/robot/drone/death(gibbed) - - if(module) - var/obj/item/weapon/gripper/G = locate(/obj/item/weapon/gripper) in module - if(G) G.drop_item() - - ..(gibbed) - //DRONE MOVEMENT. /mob/living/silicon/robot/drone/Process_Spaceslipping(var/prob_slip) //TODO: Consider making a magboot item for drones to equip. ~Z diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index f2aa919eb00..8c1af389ad3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -515,13 +515,6 @@ var/list/robot_verbs_default = list( C.toggled = 1 src << "\red You enable [C.name]." -/mob/living/silicon/robot/blob_act() - if (stat != 2) - adjustBruteLoss(60) - updatehealth() - return 1 - return 0 - // this function shows information about the malf_ai gameplay type in the status screen /mob/living/silicon/robot/show_malf_ai() ..() @@ -575,29 +568,6 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/restrained() return 0 - -/mob/living/silicon/robot/ex_act(severity) - if(!blinded) - flick("flash", flash) - - switch(severity) - if(1.0) - if (stat != 2) - adjustBruteLoss(100) - adjustFireLoss(100) - gib() - return - if(2.0) - if (stat != 2) - adjustBruteLoss(60) - adjustFireLoss(60) - if(3.0) - if (stat != 2) - adjustBruteLoss(30) - - updatehealth() - - /mob/living/silicon/robot/meteorhit(obj/O as obj) for(var/mob/M in viewers(src, null)) M.show_message(text("\red [src] has been hit by [O]"), 1) @@ -609,14 +579,11 @@ var/list/robot_verbs_default = list( updatehealth() return - /mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj) ..(Proj) - updatehealth() if(prob(75) && Proj.damage > 0) spark_system.start() return 2 - /mob/living/silicon/robot/Bump(atom/movable/AM as mob|obj, yes) spawn( 0 ) if ((!( yes ) || now_pushing)) @@ -977,7 +944,7 @@ var/list/robot_verbs_default = list( return 1 return 0 -/mob/living/silicon/robot/proc/updateicon() +/mob/living/silicon/robot/updateicon() overlays.Cut() if(stat == 0) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 93d4438d7b4..65f2d93acca 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -75,8 +75,14 @@ /mob/living/silicon/IsAdvancedToolUser() return 1 -/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj) +/mob/living/silicon/blob_act() + if (src.stat != 2) + src.adjustBruteLoss(60) + src.updatehealth() + return 1 + return 0 +/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj) if(!Proj.nodamage) switch(Proj.damage_type) @@ -86,7 +92,7 @@ adjustFireLoss(Proj.damage) Proj.on_hit(src,2) - + updatehealth() return 2 /mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) @@ -251,3 +257,24 @@ return 1 return 0 + +/mob/living/silicon/ex_act(severity) + if(!blinded) + flick("flash", flash) + + switch(severity) + if(1.0) + if (stat != 2) + adjustBruteLoss(100) + adjustFireLoss(100) + if(!anchored) + gib() + if(2.0) + if (stat != 2) + adjustBruteLoss(60) + adjustFireLoss(60) + if(3.0) + if (stat != 2) + adjustBruteLoss(30) + + updatehealth() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 444c98ea387..24b556649a6 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -35,14 +35,10 @@ spell_list += new spell(src) /mob/living/simple_animal/construct/death() - ..() new /obj/item/weapon/ectoplasm (src.loc) - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [src] collapses in a shattered heap. ") + ..(null,"collapses in a shattered heap.") ghostize() del src - return /mob/living/simple_animal/construct/examine(mob/user) ..(user) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 9900249c34f..4cd203ee08a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -43,11 +43,8 @@ /mob/living/simple_animal/hostile/mimic/death() ..() - visible_message("\red [src] stops moving!") del(src) - - // // Crate Mimic // diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 65f4e6f7874..c6d3052b5d0 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -158,8 +158,7 @@ walk(src,0) /mob/living/simple_animal/hostile/retaliate/malf_drone/death() - src.visible_message("\blue \icon[src] [src] suddenly breaks apart.") - ..() + ..(null,"suddenly breaks apart.") del(src) /mob/living/simple_animal/hostile/retaliate/malf_drone/Del() diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 6a382021351..ebcdfc1194c 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -158,7 +158,5 @@ minbodytemp = 0 /mob/living/simple_animal/hostile/viscerator/death() - ..() - visible_message("\red [src] is smashed into pieces!") - del src - return \ No newline at end of file + ..(null,"is smashed into pieces!") + del src diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index a908af98688..50b2191d3ed 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -51,7 +51,6 @@ L.visible_message("\the [src] knocks down \the [L]!") /mob/living/simple_animal/hostile/tree/death() - ..() - visible_message("\red [src] is hacked into pieces!") + ..(null,"is hacked into pieces!") new /obj/item/stack/sheet/wood(loc) del(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 8695741ed82..831f3aa83a4 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -198,12 +198,10 @@ ..() /mob/living/simple_animal/gib() - if(icon_gib) - flick(icon_gib, src) if(meat_amount && meat_type) for(var/i = 0; i < meat_amount; i++) new meat_type(src.loc) - ..() + ..(icon_gib,1) /mob/living/simple_animal/emote(var/act, var/type, var/desc) if(act) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 6bf10756d0f..aee673df096 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1157,3 +1157,6 @@ mob/proc/yank_out_object() return I return 0 + +/mob/proc/updateicon() + return diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index b4d20155389..91e97c0cb5b 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -11,7 +11,7 @@ nanoui is used to open and update nano browser uis #define STATUS_UPDATE 1 // ORANGE Visability #define STATUS_DISABLED 0 // RED Visability -/datum/nanoui +/datum/nanoui // the user who opened this ui var/mob/user // the object this ui "belongs" to @@ -103,13 +103,13 @@ nanoui is used to open and update nano browser uis add_script("libraries.min.js") // A JS file comprising of jQuery, doT.js and jQuery Timer libraries (compressed together) add_script("nano_utility.js") // The NanoUtility JS, this is used to store utility functions. add_script("nano_template.js") // The NanoTemplate JS, this is used to render templates. - add_script("nano_state_manager.js") // The NanoStateManager JS, it handles updates from the server and passes data to the current state - add_script("nano_state.js") // The NanoState JS, this is the base state which all states must inherit from - add_script("nano_state_default.js") // The NanoStateDefault JS, this is the "default" state (used by all UIs by default), which inherits from NanoState + add_script("nano_state_manager.js") // The NanoStateManager JS, it handles updates from the server and passes data to the current state + add_script("nano_state.js") // The NanoState JS, this is the base state which all states must inherit from + add_script("nano_state_default.js") // The NanoStateDefault JS, this is the "default" state (used by all UIs by default), which inherits from NanoState add_script("nano_base_callbacks.js") // The NanoBaseCallbacks JS, this is used to set up (before and after update) callbacks which are common to all UIs add_script("nano_base_helpers.js") // The NanoBaseHelpers JS, this is used to set up template helpers which are common to all UIs add_stylesheet("shared.css") // this CSS sheet is common to all UIs - add_stylesheet("icons.css") // this CSS sheet is common to all UIs + add_stylesheet("icons.css") // this CSS sheet is common to all UIs /** * Set the current status (also known as visibility) of this ui. @@ -127,7 +127,7 @@ nanoui is used to open and update nano browser uis update() else status = state - if (push_update || status == 0) + if (push_update || status == 0) push_data(null, 1) // Update the UI, force the update in case the status is 0, data is null so that previous data is used /** @@ -138,7 +138,7 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/update_status(var/push_update = 0) - if (istype(user, /mob/living/silicon/ai)) + if (istype(user, /mob/living/silicon/ai) || (get_dist(get_turf(user),get_turf(src_object)) <= 1)) set_status(STATUS_INTERACTIVE, push_update) // interactive (green visibility) else if (istype(user, /mob/living/silicon/robot)) if (src_object in view(7, user)) // robots can see and interact with things they can see within 7 tiles @@ -151,12 +151,12 @@ nanoui is used to open and update nano browser uis if (dist > 4) close() return - + if ((allowed_user_stat > -1) && (user.stat > allowed_user_stat)) set_status(STATUS_DISABLED, push_update) // no updates, completely disabled (red visibility) else if (user.restrained() || user.lying) set_status(STATUS_UPDATE, push_update) // update only (orange visibility) - else if (istype(src_object, /obj/item/device/uplink/hidden)) // You know what if they have the uplink open let them use the UI + else if (istype(src_object, /obj/item/device/uplink/hidden)) // You know what if they have the uplink open let them use the UI set_status(STATUS_INTERACTIVE, push_update) // Will build in distance checks on the topics for sanity. else if (!(src_object in view(4, user))) // If the src object is not in visable, set status to 0 set_status(STATUS_DISABLED, push_update) // interactive (green visibility) @@ -203,7 +203,7 @@ nanoui is used to open and update nano browser uis "showMap" = show_map, "mapZLevel" = map_z_level, "user" = list("name" = user.name) - ) + ) return config_data /** @@ -215,12 +215,12 @@ nanoui is used to open and update nano browser uis */ /datum/nanoui/proc/get_send_data(var/list/data) var/list/config_data = get_config_data() - + var/list/send_data = list("config" = config_data) - + if (!isnull(data)) send_data["data"] = data - + return send_data /** @@ -267,11 +267,11 @@ nanoui is used to open and update nano browser uis */ /datum/nanoui/proc/add_template(key, filename) templates[key] = filename - + /** * Set the layout key for use in the frontend Javascript * The layout key is the basic layout key for the page - * Two files are loaded on the client based on the layout key varable: + * Two files are loaded on the client based on the layout key varable: * -> a template in /nano/templates with the filename "layout_.tmpl * -> a CSS stylesheet in /nano/css with the filename "layout_.css * @@ -301,7 +301,7 @@ nanoui is used to open and update nano browser uis */ /datum/nanoui/proc/set_auto_update_content(nstate) auto_update_content = nstate - + /** * Set the state key for use in the frontend Javascript * @@ -310,8 +310,8 @@ nanoui is used to open and update nano browser uis * @return nothing */ /datum/nanoui/proc/set_state_key(nstate_key) - state_key = nstate_key - + state_key = nstate_key + /** * Toggle showing the map ui * @@ -321,7 +321,7 @@ nanoui is used to open and update nano browser uis */ /datum/nanoui/proc/set_show_map(nstate) show_map = nstate - + /** * Toggle showing the map ui * @@ -352,15 +352,15 @@ nanoui is used to open and update nano browser uis // before the UI opens, add the layout files based on the layout key add_stylesheet("layout_[layout_key].css") add_template("layout", "layout_[layout_key].tmpl") - + var/head_content = "" - + for (var/filename in scripts) head_content += " " - + for (var/filename in stylesheets) head_content += " " - + var/template_data_json = "{}" // An empty JSON object if (templates.len > 0) template_data_json = list2json(templates) @@ -378,7 +378,7 @@ nanoui is used to open and update nano browser uis [head_content] - +