diff --git a/.travis.yml b/.travis.yml index 5895a706b17..4171bbe84ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,5 +17,5 @@ install: - cd .. script: - - (! grep -q 'step_[xy]' maps/tgstation2.dmm) + - $(for i in 1 2 3 4 5 6; do (grep -q 'step_[xy]' maps/exodus-$i.dmm; if [ $? -eq 1 ]; then exit 0; else exit 1; fi) done) - DreamMaker baystation12.dme 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/WorkInProgress/computer3/computers/medical.dm b/code/WorkInProgress/computer3/computers/medical.dm index 5cb984ee362..f7e6167e1df 100644 --- a/code/WorkInProgress/computer3/computers/medical.dm +++ b/code/WorkInProgress/computer3/computers/medical.dm @@ -377,6 +377,8 @@ src.active1.fields["p_stat"] = "Physically Unfit" if("disabled") src.active1.fields["p_stat"] = "Disabled" + if(PDA_Manifest.len) + PDA_Manifest.Cut() if (href_list["m_stat"]) if (src.active1) @@ -525,4 +527,4 @@ src.printing = null interact() - return + return \ No newline at end of file diff --git a/code/WorkInProgress/computer3/computers/security.dm b/code/WorkInProgress/computer3/computers/security.dm index f3a3d3ae2bb..1c409da853e 100644 --- a/code/WorkInProgress/computer3/computers/security.dm +++ b/code/WorkInProgress/computer3/computers/security.dm @@ -594,6 +594,8 @@ What a mess.*/ R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released") if(5) R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") + if(PDA_Manifest.len) + PDA_Manifest.Cut() if(6) R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") continue @@ -606,4 +608,4 @@ What a mess.*/ /obj/machinery/computer3/secure_data/detective_computer icon = 'icons/obj/computer.dmi' - icon_state = "messyfiles" + icon_state = "messyfiles" \ No newline at end of file diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 1612f1ce7bf..cfac858e252 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -50,8 +50,10 @@ placeholder = 2 if (!( isnum(num) )) return - if (!( num )) - return "0" + if (num == 0) + var/final = "" + for(var/i=1 to placeholder) final = "[final]0" + return final var/hex = "" var/i = 0 while(16 ** i < num) 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/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 7f115404b3d..3f7ddbceb2a 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1040,6 +1040,7 @@ var/list/ghostteleportlocs = list() /area/holodeck/source_space name = "\improper Holodeck - Space" + has_gravity = 0 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/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 961f38fc0d9..52f1ff6286e 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -2,6 +2,7 @@ icon_state = "paper_talisman" var/imbue = null var/uses = 0 + info = "

" attack_self(mob/living/user as mob) if(iscultist(user)) 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/adv_med.dm b/code/game/machinery/adv_med.dm index 97e61e5707b..98ebc5a6265 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -330,9 +330,9 @@ dat += text("Inaprovaline: [] units
", occ["inaprovaline_amount"]) dat += text("Soporific: [] units
", occ["stoxin_amount"]) - dat += text("[]\tDermaline: [] units
", (occ["dermaline"] < 30 ? "" : ""), occ["dermaline"]) - dat += text("[]\tBicaridine: [] units
", (occ["bicaridine"] < 30 ? "" : ""), occ["bicaridine"]) - dat += text("[]\tDexalin: [] units
", (occ["dexalin"] < 30 ? "" : ""), occ["dexalin"]) + dat += text("[]\tDermaline: [] units
", (occ["dermaline_amount"] < 30 ? "" : ""), occ["dermaline_amount"]) + dat += text("[]\tBicaridine: [] units
", (occ["bicaridine_amount"] < 30 ? "" : ""), occ["bicaridine_amount"]) + dat += text("[]\tDexalin: [] units
", (occ["dexalin_amount"] < 30 ? "" : ""), occ["dexalin_amount"]) for(var/datum/disease/D in occ["tg_diseases_list"]) if(!D.hidden[SCANNER]) diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index 984d6816ce4..1c9fe7cfe5a 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -19,11 +19,19 @@ var/global/list/holodeck_programs = list( name = "Holodeck Control Computer" desc = "A computer used to control a nearby holodeck." icon_state = "holocontrol" + + use_power = 1 + active_power_usage = 8000 //8kW for the scenery + 500W per holoitem + var/item_power_usage = 500 + var/area/linkedholodeck = null var/area/target = null var/active = 0 var/list/holographic_items = list() + var/list/holographic_mobs = list() var/damaged = 0 + var/safety_disabled = 0 + var/mob/last_to_emag = null var/last_change = 0 var/list/supported_programs = list( \ "Empty Court" = "emptycourt", \ @@ -38,84 +46,111 @@ var/global/list/holodeck_programs = list( "Theatre" = "theatre", \ "Meeting Hall" = "meetinghall" \ ) - var/list/restricted_programs = list("Atmospheric Burn Simulation" = "burntest", "ildlife Simulation" = "wildlifecarp") + var/list/restricted_programs = list("Atmospheric Burn Simulation" = "burntest", "Wildlife Simulation" = "wildlifecarp") - attack_ai(var/mob/user as mob) - return src.attack_hand(user) +/obj/machinery/computer/HolodeckControl/attack_ai(var/mob/user as mob) + return src.attack_hand(user) - attack_hand(var/mob/user as mob) +/obj/machinery/computer/HolodeckControl/attack_hand(var/mob/user as mob) - if(..()) - return - user.set_machine(src) - var/dat + if(..()) + return + user.set_machine(src) + var/dat - dat += "Holodeck Control System
" - dat += "
Current Loaded Programs:
" - for(var/prog in supported_programs) - dat += "(([prog]))
" + dat += "Holodeck Control System
" + dat += "
Current Loaded Programs:
" + for(var/prog in supported_programs) + dat += "(([prog]))
" - dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
" + dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
" - if(issilicon(user)) - if(emagged) - dat += "(Re-Enable Safety Protocols?)
" + if(issilicon(user)) + if(safety_disabled) + if (emagged) + dat += "ERROR: Cannot re-enable Safety Protocols.
" else - dat += "(Override Safety Protocols?)
" - - if(emagged) - for(var/prog in restricted_programs) - dat += "(Begin [prog])
" - dat += "Ensure the holodeck is empty before testing.
" - dat += "
" - dat += "Safety Protocols are DISABLED
" + dat += "(Re-Enable Safety Protocols?)
" else - dat += "Safety Protocols are ENABLED
" + dat += "(Override Safety Protocols?)
" - user << browse(dat, "window=computer;size=400x500") - onclose(user, "computer") + if(safety_disabled) + for(var/prog in restricted_programs) + dat += "(Begin [prog])
" + dat += "Ensure the holodeck is empty before testing.
" + dat += "
" + dat += "Safety Protocols are DISABLED
" + else + dat += "Safety Protocols are ENABLED
" + user << browse(dat, "window=computer;size=400x500") + onclose(user, "computer") + + return + + +/obj/machinery/computer/HolodeckControl/Topic(href, href_list) + if(..()) return + if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + usr.set_machine(src) + if(href_list["program"]) + var/prog = href_list["program"] + if(prog in holodeck_programs) + target = locate(holodeck_programs[prog]) + if(target) + loadProgram(target) - Topic(href, href_list) - if(..()) - return - if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) - usr.set_machine(src) + else if(href_list["AIoverride"]) + if(!issilicon(usr)) + return + + if(safety_disabled && emagged) + return //if a traitor has gone through the trouble to emag the thing, let them keep it. + + safety_disabled = !safety_disabled + update_projections() + if(safety_disabled) + message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") + log_game("[key_name(usr)] overrided the holodeck's safeties") + else + message_admins("[key_name_admin(usr)] restored the holodeck's safeties") + log_game("[key_name(usr)] restored the holodeck's safeties") - if(href_list["program"]) - var/prog = href_list["program"] - if(prog in holodeck_programs) - target = locate(holodeck_programs[prog]) - if(target) - loadProgram(target) - - else if(href_list["AIoverride"]) - if(!issilicon(usr)) return - emagged = !emagged - if(emagged) - message_admins("[key_name_admin(usr)] overrode the holodeck's safeties") - log_game("[key_name(usr)] overrided the holodeck's safeties") - else - message_admins("[key_name_admin(usr)] restored the holodeck's safeties") - log_game("[key_name(usr)] restored the holodeck's safeties") - - src.add_fingerprint(usr) - src.updateUsrDialog() - return - - -/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) - if(istype(D, /obj/item/weapon/card/emag) && !emagged) - playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) - emagged = 1 - user << "\blue You vastly increase projector power and override the safety and security protocols." - user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator." - log_game("[key_name(usr)] emagged the Holodeck Control Computer") + src.add_fingerprint(usr) src.updateUsrDialog() return +/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) + if(istype(D, /obj/item/weapon/card/emag)) + playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) + last_to_emag = user //emag again to change the owner + if (!emagged) + emagged = 1 + safety_disabled = 1 + update_projections() + user << "You vastly increase projector power and override the safety and security protocols." + user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator." + log_game("[key_name(usr)] emagged the Holodeck Control Computer") + src.updateUsrDialog() + return + +/obj/machinery/computer/HolodeckControl/proc/update_projections() + if (safety_disabled) + item_power_usage = 2500 + for(var/obj/item/weapon/holo/esword/H in linkedholodeck) + H.damtype = BRUTE + else + item_power_usage = initial(item_power_usage) + for(var/obj/item/weapon/holo/esword/H in linkedholodeck) + H.damtype = initial(H.damtype) + + for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs) + C.set_safety(!safety_disabled) + if (last_to_emag) + C.friends = list(last_to_emag) + /obj/machinery/computer/HolodeckControl/New() ..() linkedholodeck = locate(/area/holodeck/alphadeck) @@ -148,14 +183,27 @@ var/global/list/holodeck_programs = list( emergencyShutdown() ..() +/obj/machinery/computer/HolodeckControl/power_change() + var/oldstat + ..() + if (stat != oldstat && active && (stat & NOPOWER)) + emergencyShutdown() + /obj/machinery/computer/HolodeckControl/process() for(var/item in holographic_items) // do this first, to make sure people don't take items out when power is down. if(!(get_turf(item) in linkedholodeck)) derez(item, 0) - + + if (!safety_disabled) + for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs) + if (get_area(C.loc) != linkedholodeck) + holographic_mobs -= C + C.derez() + if(!..()) return if(active) + use_power(item_power_usage * (holographic_items.len + holographic_mobs.len)) if(!checkInteg(linkedholodeck)) damaged = 1 @@ -163,6 +211,7 @@ var/global/list/holodeck_programs = list( if(target) loadProgram(target) active = 0 + use_power = 1 for(var/mob/M in range(10,src)) M.show_message("The holodeck overloads!") @@ -199,6 +248,7 @@ var/global/list/holodeck_programs = list( return 1 +//Why is it called toggle if it doesn't toggle? /obj/machinery/computer/HolodeckControl/proc/togglePower(var/toggleOn = 0) if(toggleOn) @@ -218,12 +268,14 @@ var/global/list/holodeck_programs = list( T.hotspot_expose(50000,50000,1) active = 1 + use_power = 2 else for(var/item in holographic_items) derez(item) var/area/targetsource = locate(/area/holodeck/source_plating) targetsource.copy_contents_to(linkedholodeck , 1) active = 0 + use_power = 1 /obj/machinery/computer/HolodeckControl/proc/loadProgram(var/area/A) @@ -238,22 +290,20 @@ var/global/list/holodeck_programs = list( last_change = world.time active = 1 + use_power = 2 for(var/item in holographic_items) derez(item) + for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs) + holographic_mobs -= C + C.derez() + for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck) del(B) - for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck) - del(C) - holographic_items = A.copy_contents_to(linkedholodeck , 1) - if(emagged) - for(var/obj/item/weapon/holo/esword/H in linkedholodeck) - H.damtype = BRUTE - spawn(30) for(var/obj/effect/landmark/L in linkedholodeck) if(L.name=="Atmospheric Test Start") @@ -266,13 +316,22 @@ var/global/list/holodeck_programs = list( T.temperature = 5000 T.hotspot_expose(50000,50000,1) if(L.name=="Holocarp Spawn") - new /mob/living/simple_animal/hostile/carp(L.loc) + holographic_mobs += new /mob/living/simple_animal/hostile/carp/holodeck(L.loc) + + if(L.name=="Holocarp Spawn Random") + if (prob(4)) //With 4 spawn points, carp should only appear 15% of the time. + holographic_mobs += new /mob/living/simple_animal/hostile/carp/holodeck(L.loc) + + update_projections() /obj/machinery/computer/HolodeckControl/proc/emergencyShutdown() //Get rid of any items for(var/item in holographic_items) derez(item) + for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs) + holographic_mobs -= C + C.derez() //Turn it back to the regular non-holographic room target = locate(/area/holodeck/source_plating) if(target) @@ -281,6 +340,7 @@ var/global/list/holodeck_programs = list( var/area/targetsource = locate(/area/holodeck/source_plating) targetsource.copy_contents_to(linkedholodeck , 1) active = 0 + use_power = 1 @@ -327,17 +387,6 @@ var/global/list/holodeck_programs = list( /obj/structure/table/holotable/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) - var/obj/item/weapon/grab/G = W - if(G.state<2) - user << "\red You need a better grip to do that!" - return - G.affecting.loc = src.loc - G.affecting.Weaken(5) - visible_message("\red [G.assailant] puts [G.affecting] on the table.") - del(W) - return - if (istype(W, /obj/item/weapon/wrench)) user << "It's a holotable! There are no bolts!" return @@ -424,13 +473,13 @@ var/global/list/holodeck_programs = list( icon_state = "sword[item_color]" w_class = 4 playsound(user, 'sound/weapons/saberon.ogg', 50, 1) - user << "\blue [src] is now active." + user << "[src] is now active." else force = 3 icon_state = "sword0" w_class = 2 playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) - user << "\blue [src] can now be concealed." + user << "[src] can now be concealed." if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user @@ -463,16 +512,16 @@ var/global/list/holodeck_programs = list( if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) var/obj/item/weapon/grab/G = W if(G.state<2) - user << "\red You need a better grip to do that!" + user << "You need a better grip to do that!" return G.affecting.loc = src.loc G.affecting.Weaken(5) - visible_message("\red [G.assailant] dunks [G.affecting] into the [src]!", 3) + visible_message("[G.assailant] dunks [G.affecting] into the [src]!", 3) del(W) return else if (istype(W, /obj/item) && get_dist(src,user)<2) user.drop_item(src) - visible_message("\blue [user] dunks [W] into the [src]!", 3) + visible_message("[user] dunks [W] into the [src]!", 3) return /obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -482,9 +531,9 @@ var/global/list/holodeck_programs = list( return if(prob(50)) I.loc = src.loc - visible_message("\blue Swish! \the [I] lands in \the [src].", 3) + visible_message("Swish! \the [I] lands in \the [src].", 3) else - visible_message("\red \the [I] bounces off of \the [src]'s rim!", 3) + visible_message("\The [I] bounces off of \the [src]'s rim!", 3) return 0 else return ..(mover, target, height, air_group) @@ -577,4 +626,40 @@ var/global/list/holodeck_programs = list( /obj/structure/rack/holorack/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/wrench)) user << "It's a holorack! You can't unwrench it!" - return \ No newline at end of file + return + +//Holocarp + +/mob/living/simple_animal/hostile/carp/holodeck + icon = 'icons/mob/AI.dmi' + icon_state = "holo4" + icon_living = "holo4" + icon_dead = "holo4" + icon_gib = null + meat_amount = 0 + meat_type = null + +/mob/living/simple_animal/hostile/carp/holodeck/proc/set_safety(var/safe) + if (safe) + faction = "neutral" + melee_damage_lower = 0 + melee_damage_upper = 0 + wall_smash = 0 + destroy_surroundings = 0 + else + faction = "carp" + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + wall_smash = initial(wall_smash) + destroy_surroundings = initial(destroy_surroundings) + +/mob/living/simple_animal/hostile/carp/holodeck/gib() + derez() //holograms can't gib + +/mob/living/simple_animal/hostile/carp/holodeck/death() + ..() + derez() + +/mob/living/simple_animal/hostile/carp/holodeck/proc/derez() + visible_message("\The [src] fades away!") + del(src) 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 f21322a3e20..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 @@ -364,6 +364,8 @@ src.active1.fields["p_stat"] = "Physically Unfit" if("disabled") src.active1.fields["p_stat"] = "Disabled" + if(PDA_Manifest.len) + PDA_Manifest.Cut() if (href_list["m_stat"]) if (src.active1) @@ -533,6 +535,8 @@ R.fields["b_type"] = pick("A-", "B-", "AB-", "O-", "A+", "B+", "AB+", "O+") if(5) R.fields["p_stat"] = pick("*SSD*", "Active", "Physically Unfit", "Disabled") + if(PDA_Manifest.len) + PDA_Manifest.Cut() if(6) R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") continue @@ -547,4 +551,4 @@ /obj/machinery/computer/med_data/laptop name = "Medical Laptop" desc = "Cheap Nanotrasen Laptop." - icon_state = "medlaptop" + icon_state = "medlaptop" \ No newline at end of file diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index f1f866864a7..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 @@ -598,6 +598,8 @@ What a mess.*/ R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released") if(5) R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") + if(PDA_Manifest.len) + PDA_Manifest.Cut() if(6) R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") continue @@ -610,4 +612,4 @@ What a mess.*/ /obj/machinery/computer/secure_data/detective_computer icon = 'icons/obj/computer.dmi' - icon_state = "messyfiles" + icon_state = "messyfiles" \ No newline at end of file diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 21d584fe8bc..98c75daf570 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -401,6 +401,8 @@ What a mess.*/ R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released") if(5) R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") + if(PDA_Manifest.len) + PDA_Manifest.Cut() if(6) R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") continue @@ -409,4 +411,4 @@ What a mess.*/ del(R) continue - ..(severity) + ..(severity) \ No newline at end of file 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/admin.dm b/code/modules/admin/admin.dm index 93b2824ebe1..07bca599952 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -169,17 +169,29 @@ var/global/floorIsLava = 0 Shade
"} - - if (M.client) - body += {"

+ body += {"

Other actions:
- Forcesay | + Forcesay + "} + if (M.client) + body += {" | Thunderdome 1 | Thunderdome 2 | Thunderdome Admin | Thunderdome Observer | "} + // language toggles + body += "

Languages:
" + var/f = 1 + for(var/k in all_languages) + var/datum/language/L = all_languages[k] + if(!f) body += " | " + else f = 0 + if(L in M.languages) + body += "[k]" + else + body += "[k]" body += {"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 6c417a35e12..134d0e0c8db 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1496,14 +1496,11 @@ //open a browse window listing the contents instead var/data = "" var/obj/item/weapon/paper_bundle/B = fax - + for (var/page = 1, page <= B.amount, page++) var/obj/pageobj = B.contents[page] data += "Page [page] - [pageobj.name]
" - - world << data - world << "usr = [usr]" - + usr << browse(data, "window=[B.name]") else usr << "\red The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]" @@ -1511,9 +1508,9 @@ else if (href_list["AdminFaxViewPage"]) var/page = text2num(href_list["AdminFaxViewPage"]) var/obj/item/weapon/paper_bundle/bundle = locate(href_list["paper_bundle"]) - + if (!bundle) return - + if (istype(bundle.contents[page], /obj/item/weapon/paper)) var/obj/item/weapon/paper/P = bundle.contents[page] P.show_content(src.owner, 1) @@ -1530,13 +1527,13 @@ if(!input) return var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null - + // Create the reply message var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( null ) //hopefully the null loc won't cause trouble for us P.name = "[command_name()]- [customname]" P.info = input P.update_icon() - + // Stamps var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') stampoverlay.icon_state = "paper_stamp-cent" @@ -1552,7 +1549,7 @@ message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(sender)]", 1) else src.owner << "\red Message reply failed." - + spawn(100) del(P) return @@ -2757,6 +2754,24 @@ if(href_list["vsc"] == "default") vsc.SetDefault(usr) + else if(href_list["toglang"]) + if(check_rights(R_SPAWN)) + var/mob/M = locate(href_list["toglang"]) + if(!istype(M)) + usr << "[M] is illegal type, must be /mob!" + return + var/lang2toggle = href_list["lang"] + var/datum/language/L = all_languages[lang2toggle] + + if(L in M.languages) + if(!M.remove_language(lang2toggle)) + usr << "Failed to remove language '[lang2toggle]' from \the [M]!" + else + if(!M.add_language(lang2toggle)) + usr << "Failed to add language '[lang2toggle]' from \the [M]!" + + show_player_panel(M) + // player info stuff if(href_list["add_player_info"]) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 8695dc2f470..39a5fa778cd 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -1,9 +1,18 @@ - +#define AHELP_ADMIN 1 +#define AHELP_MENTOR 2 +#define AHELP_DEV 3 //This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as") -/client/verb/adminhelp(msg as null|text) +var/list/adminhelp_categories = list("Mentor - Gameplay/Roleplay question" = AHELP_MENTOR,\ + "Admin - Rule/Gameplay issue" = AHELP_ADMIN,\ + "Dev - Bug report" = AHELP_DEV) + +/client/proc/adminhelp_admin(message) + adminhelp("Admin - Rule/Gameplay issue", message) + +/client/verb/adminhelp(selected_type in adminhelp_categories, msg as text) set category = "Admin" set name = "Adminhelp" @@ -24,12 +33,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps//Go to hell **/ - var/list/type = list ("Gameplay/Roleplay question", "Rule/Gameplay issue", "Bug report") - var/selected_type = input("Pick a category.", "Admin Help", null, null) as null|anything in type - if(!selected_type) - return - if(!msg) - msg = input("Please enter your message:", "Admin Help", null, null) as text if(!msg || alert("The following message will be sent to staff that administers\n the '[selected_type]' category:\n\n[msg]\n", "Admin Help", "Ok", "Cancel") == "Cancel") return @@ -130,8 +133,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(X.is_afk()) admin_number_afk++ - switch(selected_type) - if("Gameplay/Roleplay question") + switch(adminhelp_categories[selected_type]) + if(AHELP_MENTOR) if(mentorholders.len) for(var/client/X in mentorholders) // Mentors get a message without buttons and no character name if(X.prefs.toggles & SOUND_ADMINHELP) @@ -142,13 +145,13 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if(X.prefs.toggles & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' X << msg - if("Rule/Gameplay issue") + if(AHELP_ADMIN) if(adminholders.len) for(var/client/X in adminholders) // Admins of course get everything in their helps if(X.prefs.toggles & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' X << msg - if("Bug report") + if(AHELP_DEV) if(debugholders.len) for(var/client/X in debugholders) if(R_ADMIN | R_MOD & X.holder.rights) // Admins get every button & special highlights in theirs @@ -183,3 +186,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," send2adminirc("[selected_upper] from [key_name(src)]: [html_decode(original_msg)]") feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return + +#undef AHELP_ADMIN +#undef AHELP_MENTOR +#undef AHELP_DEV \ No newline at end of file diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 1c358c8cf4e..0b3f82aaa1d 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -96,7 +96,7 @@ if(sender) C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them else - adminhelp(reply) //sender has left, adminhelp instead + adminhelp_admin(reply) //sender has left, adminhelp instead return src << "" + create_text_tag("pm_out_alt", "PM", src) + " to [get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1)]: [msg]" C << "" + create_text_tag("pm_in", "", C) + " \[[recieve_pm_type] PM\] [get_options_bar(src, C.holder ? 1 : 0, C.holder ? 1 : 0, 1)]: [msg]" 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/client/client procs.dm b/code/modules/client/client procs.dm index eae64acc1ef..4fa4db8b188 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -299,5 +299,6 @@ 'icons/spideros_icons/sos_12.png', 'icons/spideros_icons/sos_13.png', 'icons/spideros_icons/sos_14.png', - 'html/images/ntlogo.png' + 'html/images/ntlogo.png', + 'html/images/talisman.png' ) 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 7765cda9289..ee53cd5bacb 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,19 +16,26 @@ 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 +<<<<<<< HEAD +======= + + var/style = "body" + +>>>>>>> upstream/dev //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) +<<<<<<< HEAD if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages if(!say_understands(speaker,language)) @@ -37,6 +44,18 @@ message = pick(S.speak) else 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) + else + message = stars(message) + + if(language) + style = language.colour +>>>>>>> upstream/dev var/speaker_name = speaker.name if(istype(speaker, /mob/living/carbon/human)) @@ -87,12 +106,15 @@ if (language && (language.flags & NONVERBAL)) if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src))) message = stars(message) - + if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages 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) @@ -174,7 +196,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 5ba78b33c51..5fee93197ce 100755 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -100,7 +100,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/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 90efe34a47d..086a1ef0aa4 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -101,7 +101,7 @@ if(!attack.is_usable(H)) return 0 - var/damage = rand(1, attack.damage) + var/damage = rand(1, 5) + attack.damage var/block = 0 var/accurate = 0 var/hit_zone = H.zone_sel.selecting @@ -128,6 +128,22 @@ var/miss_type = 0 var/attack_message if(!accurate) + /* + This is kind of convoluted, but it seems to break down like this: + (note that the chance to miss is exaggerated here since ran_zone() might roll "chest" + + If aiming for chest: + 80% chance you hit your target + 17% chance you hit a random zone + 3% chance you miss + + If aiming for something else: + 68% chance you hit your target + 17% chance you hit a random zone + 15% chance you miss + + Why don't we just use get_zone_with_miss_chance() ??? + */ if(prob(80)) hit_zone = ran_zone(hit_zone) if(prob(15) && hit_zone != "chest") // Missed! diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index b9cde0c192b..064819b2cd8 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -59,7 +59,7 @@ var/used_skillpoints = 0 var/skill_specialization = null - var/list/skills = null + var/list/skills = list() var/icon/stand_icon = null var/icon/lying_icon = null diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index c15ef31be70..67eb8f86e09 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -222,7 +222,7 @@ language = "Sinta'unathi" tail = "sogtail" unarmed_type = /datum/unarmed_attack/claws - secondary_unarmed_type = /datum/unarmed_attack/bite/strong + secondary_unarmed_type = /datum/unarmed_attack/bite/sharp primitive = /mob/living/carbon/monkey/unathi darksight = 3 gluttonous = 1 @@ -250,7 +250,7 @@ language = "Siik'tajr" tail = "tajtail" unarmed_type = /datum/unarmed_attack/claws - secondary_unarmed_type = /datum/unarmed_attack/bite/eye_tooth + secondary_unarmed_type = /datum/unarmed_attack/bite/sharp darksight = 8 cold_level_1 = 200 //Default 260 @@ -546,4 +546,4 @@ if(slot_w_uniform in equip_slots) equip_slots |= slot_tie - equip_slots |= slot_legcuffed \ No newline at end of file + equip_slots |= slot_legcuffed diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index 7e17ea5ed75..b96d9b6fdb5 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -35,7 +35,7 @@ switch(zone) // strong punches can have effects depending on where they hit if("head", "mouth", "eyes") // Induce blurriness - target.visible_message("[target] stares blankly for a few moments.", "You see stars.") + target.visible_message("[target] looks dazed.", "You see stars.") target.apply_effect(attack_damage*2, EYE_BLUR, armour) if("l_arm", "l_hand") if (target.l_hand) @@ -49,7 +49,7 @@ target.drop_r_hand() if("chest") if(!target.lying) - target.visible_message("[pick("[target] was sent flying backward a few metres!", "[target] staggers back from the impact!")]") + target.visible_message("[pick("[target] was sent flying backward!", "[target] staggers back from the impact!")]") var/turf/T = step(src, get_dir(get_turf(user), get_turf(target))) if(T.density) // This will need to be expanded to check for structures etc. target.visible_message("[target] slams into [T]!") @@ -76,15 +76,15 @@ playsound(user.loc, attack_sound, 25, 1, -1) /datum/unarmed_attack/bite - attack_verb = list("bite") // 'x has biteed y', needs work. + attack_verb = list("bit") attack_sound = 'sound/weapons/bite.ogg' shredding = 0 - damage = 3 + damage = 0 sharp = 0 edge = 0 -/datum/unarmed_attack/bite/eye_tooth - attack_verb = list("bite") // 'x has biteed y', needs work. +/datum/unarmed_attack/bite/sharp //eye teeth + attack_verb = list("bit", "chomped on") attack_sound = 'sound/weapons/bite.ogg' shredding = 0 damage = 5 @@ -97,9 +97,9 @@ return 1 /datum/unarmed_attack/punch - attack_verb = list("punch") + attack_verb = list("punched") attack_noun = list("fist") - damage = 3 + damage = 0 /datum/unarmed_attack/punch/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) var/skill = user.skills["combat"] @@ -109,7 +109,7 @@ if(!skill) skill = 1 if(target == user) - user.visible_message("[user] [pick(attack_verb)]ed \himself in the [organ]!") + user.visible_message("[user] [pick(attack_verb)] \himself in the [organ]!") return 0 if(!target.lying) @@ -124,8 +124,8 @@ // -- UPPER BODY -- // switch(attack_damage) if(1 to 2) user.visible_message("[user] slapped [target]'s [organ]!") - if(3 to 4) user.visible_message("[user] [findtext(zone, "hand")?"[pick(attack_verb)]ed":pick("[pick(attack_verb)]ed", "shoulders")] [target] in \his [organ]!") - if(5) user.visible_message("[user] rammed \his [pick(attack_noun)] into [target]'s [organ]!") + if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") + if(5) user.visible_message("[user] slams \his [pick(attack_noun)] into [target]'s [organ]!") if("groin", "l_leg", "r_leg") // -- LOWER BODY -- // switch(attack_damage) @@ -138,18 +138,18 @@ if(1 to 4) user.visible_message("[user] kicked [target] in \his [organ]!") if(5) user.visible_message("[user] stomped down hard on [target]'s [organ]!") else if (user.loc != target.loc) - user.visible_message("[user] [pick("stomped down hard on", "kicked against", "gave a strong kick against", "rams their foot into")] [target]'s [organ]!") + user.visible_message("[user] [pick("stomped down hard on", "kicked against", "gave a strong kick against", "slams their foot into")] [target]'s [organ]!") else user.visible_message("[user] [pick("punched", "threw a punch", "struck", "slapped", "rammed their [pick(attack_noun)] into")] [target]'s [organ]!") /datum/unarmed_attack/diona - attack_verb = list("lash", "bludgeon") + attack_verb = list("lashed", "bludgeoned") attack_noun = list("tendril") damage = 5 /datum/unarmed_attack/claws - attack_verb = list("scratch", "claw", "goug") + attack_verb = list("scratched", "clawed", "slashed") attack_noun = list("claws") attack_sound = 'sound/weapons/slice.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' @@ -165,7 +165,7 @@ attack_damage = Clamp(attack_damage, 1, 5) if(target == user) - user.visible_message("[user] [pick(attack_verb)]ed \himself in the [affecting.display_name]!") + user.visible_message("[user] [pick(attack_verb)] \himself in the [affecting.display_name]!") return 0 switch(zone) @@ -173,14 +173,14 @@ // ----- HEAD ----- // switch(damage) if(1 to 2) user.visible_message("[user] scratched [target] across \his cheek!") - if(3 to 4) user.visible_message("[user] [pick(attack_verb)]ed [pick("", "the side of")][target] [pick("head", "neck")][pick("", " with spread [pick(attack_noun)]")]!") - if(5) user.visible_message("[user] [pick(attack_verb)]ed [target] across \his face!") + if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target]'s [pick("head", "neck")] [pick("", "", "", "with spread [pick(attack_noun)]")]!") + if(5) user.visible_message("[pick("[user] [pick(attack_verb)] [target] across \his face!", "[user] rakes \his [pick(attack_noun)] across [target]'s face!")]") if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_leg", "l_foot", "r_foot") // ----- BODY ----- // switch(damage) if(1 to 2) user.visible_message("[user] scratched [target]'s [affecting.display_name]!") - if(3 to 4) user.visible_message("[user] [pick(attack_verb)]ed [pick("", "the side of")][target]'s [affecting.display_name]!") - if(5) user.visible_message("[user] digs \his [pick(attack_noun)] deep into [target]'s [affecting.display_name]!") + if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [pick("", "", "the side of")] [target]'s [affecting.display_name]!") + if(5) user.visible_message("[user] tears \his [pick(attack_noun)] deep into [target]'s [affecting.display_name]!") /datum/unarmed_attack/claws/strong attack_verb = list("slash") @@ -190,4 +190,4 @@ /datum/unarmed_attack/bite/strong attack_verb = list("maul") damage = 15 - shredding = 1 \ No newline at end of file + shredding = 1 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/metroid/subtypes.dm b/code/modules/mob/living/carbon/metroid/subtypes.dm index 3b7e0107abb..9db9e7b02f9 100644 --- a/code/modules/mob/living/carbon/metroid/subtypes.dm +++ b/code/modules/mob/living/carbon/metroid/subtypes.dm @@ -31,24 +31,24 @@ proc/mutation_table(var/colour) //Tier 3 if("dark blue") slime_mutation[1] = "purple" - slime_mutation[2] = "blue" - slime_mutation[3] = "cerulean" - slime_mutation[4] = "cerulean" + slime_mutation[2] = "purple" + slime_mutation[3] = "blue" + slime_mutation[4] = "blue" if("dark purple") slime_mutation[1] = "purple" - slime_mutation[2] = "orange" - slime_mutation[3] = "sepia" - slime_mutation[4] = "sepia" + slime_mutation[2] = "purple" + slime_mutation[3] = "orange" + slime_mutation[4] = "orange" if("yellow") slime_mutation[1] = "metal" - slime_mutation[2] = "orange" - slime_mutation[3] = "bluespace" - slime_mutation[4] = "bluespace" + slime_mutation[2] = "metal" + slime_mutation[3] = "orange" + slime_mutation[4] = "orange" if("silver") slime_mutation[1] = "metal" - slime_mutation[2] = "blue" - slime_mutation[3] = "pyrite" - slime_mutation[4] = "pyrite" + slime_mutation[2] = "metal" + slime_mutation[3] = "blue" + slime_mutation[4] = "blue" //Tier 4 if("pink") slime_mutation[1] = "pink" 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 892f129f11b..a22bcfd02d9 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) @@ -252,3 +258,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() 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] - +