diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index a26914aa8a6..79b182afd37 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -732,7 +732,7 @@ var/list/datum/dna/hivemind_bank = list() src << "We return our vocal glands to their original location." return - var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text + var/mimic_voice = stripped_input(usr, "Enter a name to mimic.", "Mimic Voice", null, MAX_NAME_LEN) if(!mimic_voice) return diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 78db5e77846..de7bc051054 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -226,7 +226,7 @@ proc/issyndicate(mob/living/M as mob) /datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob) var/radio_freq = SYND_FREQ - var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(synd_mob) + var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(synd_mob) R.set_frequency(radio_freq) synd_mob.equip_to_slot_or_del(R, slot_l_ear) diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index f5b1cac68f6..65b1d1ce2b0 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -24,7 +24,7 @@ if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) if(4) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - H.equip_or_collect(new /obj/item/device/radio/headset/heads/hos(H), slot_l_ear) + H.equip_or_collect(new /obj/item/device/radio/headset/heads/hos/alt(H), slot_l_ear) H.equip_or_collect(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform) H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_or_collect(new /obj/item/clothing/suit/armor/hos(H), slot_wear_suit) @@ -64,7 +64,7 @@ equip(var/mob/living/carbon/human/H) if(!H) return 0 - H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear) + H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear) switch(H.backbag) if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) @@ -111,7 +111,7 @@ minimal_player_age = 14 equip(var/mob/living/carbon/human/H) if(!H) return 0 - H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear) + H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear) switch(H.backbag) if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) @@ -166,7 +166,7 @@ minimal_player_age = 14 equip(var/mob/living/carbon/human/H) if(!H) return 0 - H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear) + H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear) switch(H.backbag) if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) @@ -205,7 +205,7 @@ equip(var/mob/living/carbon/human/H) if(!H) return 0 - H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear) + H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear) switch(H.backbag) if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/medic(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back) @@ -242,7 +242,7 @@ minimal_player_age = 7 equip(var/mob/living/carbon/human/H) if(!H) return 0 - H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear) + H.equip_or_collect(new /obj/item/device/radio/headset/headset_sec/alt(H), slot_l_ear) switch(H.backbag) if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/security(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back) diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 1c19e8c7253..d0dd51fb59f 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -13,7 +13,7 @@ minimal_player_age = 30 equip(var/mob/living/carbon/human/H) if(!H) return 0 - H.equip_or_collect(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear) + H.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(H), slot_l_ear) switch(H.backbag) if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack/captain(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_cap(H), slot_back) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index b30205339de..6de87e93a12 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -287,6 +287,11 @@ ) /obj/machinery/alarm/proc/master_is_operating() + + + if (! alarm_area) + alarm_area = areaMaster + return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN)) @@ -892,6 +897,15 @@ update_icon() return + if(istype(W, /obj/item/weapon/wirecutters)) // cutting the wires out + if (wires.wires_status == 31) // all wires cut + var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil() + new_coil.amount = 5 + new_coil.loc = user.loc + buildstage = 1 + update_icon() + return + if (wiresexposed && ((istype(W, /obj/item/device/multitool) || istype(W, /obj/item/weapon/wirecutters)))) return attack_hand(user) @@ -906,6 +920,8 @@ updateUsrDialog() else user << "\red Access denied." + + return if(1) @@ -1475,4 +1491,4 @@ Code shamelessly copied from apc_frame else usr << browse(null, "window=partyalarm") return - return + return diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 7afabaa849d..7c7ea673335 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -202,9 +202,10 @@ update_flag return /obj/machinery/portable_atmospherics/canister/bullet_act(var/obj/item/projectile/Proj) - if(Proj.damage) - src.health -= round(Proj.damage / 2) - healthcheck() + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + if(Proj.damage) + src.health -= round(Proj.damage / 2) + healthcheck() ..() /obj/machinery/portable_atmospherics/canister/meteorhit(var/obj/O as obj) @@ -252,7 +253,7 @@ update_flag /obj/machinery/portable_atmospherics/canister/attack_paw(var/mob/user as mob) return src.attack_hand(user) - + /obj/machinery/portable_atmospherics/canister/attack_alien(mob/living/carbon/alien/humanoid/user) return diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 668a875d9b6..9dab90e6ed3 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -63,10 +63,10 @@ /obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj) if(prob(Proj.damage)) - set_broken() + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + set_broken() ..() - /obj/machinery/computer/blob_act() if (prob(75)) for(var/x in verbs) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 24076937260..9ec64ff61c5 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -284,23 +284,23 @@ name = "Secure Armory Airlock" hackProof = 1 aiControlDisabled = 1 - + /obj/machinery/door/airlock/alien name = "Alien Airlock" desc = "A mysterious alien airlock with a complicated opening mechanism." hackProof = 1 icon = 'icons/obj/doors/Doorplasma.dmi' - -/obj/machinery/door/airlock/alien/bumpopen(mob/living/user as mob) + +/obj/machinery/door/airlock/alien/bumpopen(mob/living/user as mob) if(istype(user,/mob/living/carbon/alien) || isrobot(user) || isAI(user)) ..(user) else user << "You do not know how to operate this airlock's mechanism." return - + /obj/machinery/door/airlock/alien/attackby(C as obj, mob/user as mob) if(isalien(user) || isrobot(user) || isAI(user)) - ..(C, user) + ..(C, user) else user << "You do not know how to operate this airlock's mechanism." return @@ -512,8 +512,8 @@ About the new airlock wires panel: if(src.emergency) t1 += text("Emergency Access Override is enabled. Disable?
\n", src) else - t1 += text("Emergency Access Override is disabled. Enable?
\n", src) - + t1 += text("Emergency Access Override is disabled. Enable?
\n", src) + if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1)) t1 += text("Main Power Input wire is cut.
\n") if(src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2)) @@ -1094,28 +1094,9 @@ About the new airlock wires panel: if(locate(/mob/living) in turf) // playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) //THE BUZZING IT NEVER STOPS -Pete spawn (60) - close() + autoclose() return - for(var/turf/turf in locs) - for(var/mob/living/M in turf) - if(isrobot(M)) - M.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - else - M.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - M.SetStunned(5) - M.SetWeakened(5) - var/obj/effect/stop/S - S = new /obj/effect/stop - S.victim = M - S.loc = M.loc - spawn(20) - del(S) - M.emote("scream") - var/turf/location = src.loc - if(istype(location, /turf/simulated)) - location.add_blood(M) - use_power(50) if(forced) playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1) @@ -1131,7 +1112,28 @@ About the new airlock wires panel: if (W) W.destroy() - ..() + if(density) + return 1 + operating = 1 + door_animate("closing") + src.layer = 3.1 + sleep(5) + src.density = 1 + if(!safe) + crush() + sleep(5) + update_icon() + if(visible && !glass) + SetOpacity(1) + operating = 0 + update_nearby_tiles() + if(locate(/mob/living) in get_turf(src)) + open() + + //I shall not add a check every x ticks if a door has closed over some fire. + var/obj/fire/fire = locate() in loc + if(fire) + del fire return /obj/machinery/door/airlock/proc/lock(var/forced=0) @@ -1230,7 +1232,7 @@ About the new airlock wires panel: return else return - + /obj/machinery/door/airlock/CanAStarPass(var/obj/item/weapon/card/id/ID) //Airlock is passable if it is open (!density), bot has access, and is not bolted shut) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2aefc60be27..88d72fbf8b9 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -227,24 +227,27 @@ /obj/machinery/door/proc/open() - if(!density) return 1 - if(operating > 0) return - if(!ticker) return 0 + if(!density) + return 1 + if(operating > 0) + return + if(!ticker) + return 0 if(!operating) operating = 1 door_animate("opening") icon_state = "door0" src.SetOpacity(0) - sleep(10) - src.layer = 2.7 + sleep(5) src.density = 0 + sleep(5) + src.layer = 2.7 explosion_resistance = 0 update_icon() SetOpacity(0) + operating = 0 update_nearby_tiles() - if(operating) operating = 0 - if(autoclose && normalspeed) spawn(150) autoclose() @@ -256,15 +259,18 @@ /obj/machinery/door/proc/close() - if(density) return 1 - if(operating > 0) return + if(density) + return 1 + if(operating > 0) + return operating = 1 door_animate("closing") - src.density = 1 explosion_resistance = initial(explosion_resistance) - src.layer = 3.0 - sleep(10) + src.layer = 3.1 + sleep(5) + src.density = 1 + sleep(5) update_icon() if(visible && !glass) SetOpacity(1) //caaaaarn! @@ -277,6 +283,24 @@ del fire return +/obj/machinery/door/proc/crush() + for(var/mob/living/L in get_turf(src)) + if(isalien(L)) //For xenos + L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. + L.emote("roar") + else if(ishuman(L)) //For humans + L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + L.emote("scream") + L.Weaken(5) + else if(ismonkey(L)) //For monkeys + L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + L.Weaken(5) + else //for simple_animals & borgs + L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + var/turf/location = src.loc + if(istype(location, /turf/simulated)) //add_blood doesn't work for borgs/xenos, but add_blood_floor does. + location.add_blood(L) + /obj/machinery/door/proc/requiresID() return 1 diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index bad76ca8ef0..eeceaf2de18 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -14,7 +14,7 @@ /obj/machinery/door/poddoor/four_tile_ver/ name = "Large Pod Door" icon = 'icons/obj/doors/1x4blast_vert.dmi' - + /obj/machinery/door/poddoor/three_tile_ver/ name = "Large Pod Door" icon = 'icons/obj/doors/1x3blast_vert.dmi' @@ -51,8 +51,9 @@ flick("pdoorc0", src) src.icon_state = "pdoor0" src.SetOpacity(0) - sleep(10) + sleep(5) src.density = 0 + sleep(5) update_nearby_tiles() if(operating == 1) //emag again @@ -68,11 +69,13 @@ src.operating = 1 flick("pdoorc1", src) src.icon_state = "pdoor1" - src.density = 1 src.SetOpacity(initial(opacity)) update_nearby_tiles() + sleep(5) + crush() + src.density = 1 + sleep(5) - sleep(10) src.operating = 0 return @@ -153,7 +156,7 @@ spawn(150) autoclose() return 1 - + /obj/machinery/door/poddoor/three_tile_hor/close() if (src.operating) return @@ -332,7 +335,7 @@ sleep(10) src.operating = 0 - return + return /obj/machinery/door/poddoor/four_tile_ver/open() if (src.operating == 1) //doors can still open when emag-disabled @@ -364,7 +367,7 @@ spawn(150) autoclose() return 1 - + /obj/machinery/door/poddoor/four_tile_ver/close() if (src.operating) return @@ -454,7 +457,7 @@ del f2 del f3 ..() - + /obj/machinery/door/poddoor/three_tile_ver var/obj/machinery/door/poddoor/filler_object/f1 var/obj/machinery/door/poddoor/filler_object/f2 @@ -477,8 +480,8 @@ del f1 del f2 del f3 - ..() - + ..() + /obj/machinery/door/poddoor/four_tile_hor var/obj/machinery/door/poddoor/filler_object/f1 var/obj/machinery/door/poddoor/filler_object/f2 diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 564e25f1aad..8213c2f8879 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -369,8 +369,11 @@ Status: []
"}, sleep(60) attacked = 0 - src.health -= Proj.damage + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + health -= Proj.damage + ..() + if(prob(45) && Proj.damage > 0) src.spark_system.start() if (src.health <= 0) src.die() // the death process :( diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index fa7c83ff2b8..6bb718ea8eb 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -275,12 +275,13 @@ popping = 0 /obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj) - src.health -= Proj.damage - ..() - if(prob(45) && Proj.damage > 0) src.spark_system.start() - del (Proj) - if (src.health <= 0) - src.die() + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + src.health -= Proj.damage + ..() + if(prob(45) && Proj.damage > 0) src.spark_system.start() + del(Proj) + if (src.health <= 0) + src.die() return /obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 6a3f81c461c..d34d2bb0f2e 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -260,7 +260,7 @@ if(do_after(melee_cooldown)) melee_can_hit = 1 return - + /obj/mecha/proc/mech_toxin_damage(mob/living/target) playsound(src, 'sound/effects/spray2.ogg', 50, 1) if(target.reagents) @@ -554,8 +554,10 @@ return if(istype(Proj, /obj/item/projectile/beam/pulse)) ignore_threshold = 1 - src.take_damage(Proj.damage,Proj.flag) - src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold) + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + src.take_damage(Proj.damage,Proj.flag) + src.visible_message("[src.name] is hit by [Proj].") + src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold) Proj.on_hit(src) return diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 7a21d472b82..64c29246834 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -19,6 +19,43 @@ return */ +/obj/mecha/working/ripley/Destroy() + while(src.damage_absorption.["brute"] < 0.6) + new /obj/item/asteroid/goliath_hide(src.loc) + src.damage_absorption.["brute"] = src.damage_absorption.["brute"] + 0.1 //If a goliath-plated ripley gets killed, all the plates drop + for(var/atom/movable/A in src.cargo) + A.loc = loc + step_rand(A) + cargo.Cut() + ..() + +/obj/mecha/working/ripley/go_out() + ..() + if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3) + src.overlays = null + src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-open") + else if (src.damage_absorption.["brute"] == 0.3) + src.overlays = null + src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full-open") + +/obj/mecha/working/ripley/moved_inside(var/mob/living/carbon/human/H as mob) + ..() + if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3) + src.overlays = null + src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g") + else if (src.damage_absorption.["brute"] == 0.3) + src.overlays = null + src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full") + +/obj/mecha/working/ripley/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob) + ..() + if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3) + src.overlays = null + src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g") + else if (src.damage_absorption.["brute"] == 0.3) + src.overlays = null + src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full") + /obj/mecha/working/ripley/firefighter desc = "Standart APLU chassis was refitted with additional thermal protection and cistern." name = "APLU \"Firefighter\"" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index de3422e168f..fb6ca1b2fa4 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -31,6 +31,15 @@ /obj/item/device/radio/headset/syndicate origin_tech = "syndicate=3" + +/obj/item/device/radio/headset/syndicate/alt //undisguised bowman with flash protection + name = "syndicate headset" + desc = "A syndicate headset that can be used to hear all radio frequencies. Protects ears from flashbangs. \nTo access the syndicate channel, use ; before speaking." + flags = EARBANGPROTECT + origin_tech = "syndicate=3" + icon_state = "syndie_headset" + item_state = "syndie_headset" + /obj/item/device/radio/headset/syndicate/New() ..() del(keyslot1) @@ -53,6 +62,13 @@ item_state = "headset" keyslot1 = new /obj/item/device/encryptionkey/headset_sec +/obj/item/device/radio/headset/headset_sec/alt + name = "security bowman headset" + desc = "This is used by your elite security force. Protects ears from flashbangs. \nTo access the security channel, use :s." + flags = EARBANGPROTECT + icon_state = "sec_headset_alt" + item_state = "sec_headset_alt" + /obj/item/device/radio/headset/headset_eng name = "engineering radio headset" desc = "When the engineers wish to chat like girls. To access the engineering channel, use :e. " @@ -102,6 +118,13 @@ item_state = "headset" keyslot1 = new /obj/item/device/encryptionkey/heads/captain +/obj/item/device/radio/headset/heads/captain/alt + name = "\proper the captain's bowman headset" + desc = "The headset of the boss. Protects ears from flashbangs. \nChannels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science." + flags = EARBANGPROTECT + icon_state = "com_headset_alt" + item_state = "com_headset_alt" + /obj/item/device/radio/headset/heads/rd name = "Research Director's headset" desc = "Headset of the researching God. To access the science channel, use :n. For command, use :c." @@ -116,6 +139,13 @@ item_state = "headset" keyslot1 = new /obj/item/device/encryptionkey/heads/hos +/obj/item/device/radio/headset/heads/hos/alt + name = "\proper the head of security's bowman headset" + desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs. \nTo access the security channel, use :s. For command, use :c." + flags = EARBANGPROTECT + icon_state = "com_headset_alt" + item_state = "com_headset_alt" + /obj/item/device/radio/headset/heads/ce name = "chief engineer's headset" desc = "The headset of the guy who is in charge of morons. To access the engineering channel, use :e. For command, use :c." diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index a6f18c378e7..b1d0e0783fe 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -436,6 +436,7 @@ desc = "A colourful crayon. Looks tasty. Mmmm..." icon = 'icons/obj/crayons.dmi' icon_state = "crayonred" + slot_flags = SLOT_EARS w_class = 1.0 attack_verb = list("attacked", "coloured") var/colour = "#FF0000" //RGB diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index fe457888911..2229c5bc00f 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -57,6 +57,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = "cigoff" throw_speed = 0.5 item_state = "cigoff" + slot_flags = SLOT_EARS w_class = 1 body_parts_covered = null attack_verb = list("burnt", "singed") diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 26372ce5700..601e4d5a8f7 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -5,109 +5,68 @@ origin_tech = "materials=2;combat=1" var/banglet = 0 - prime() - ..() - for(var/obj/structure/closet/L in hear(7, get_turf(src))) - if(locate(/mob/living/carbon/, L)) - for(var/mob/living/carbon/M in L) - bang(get_turf(src), M) - - - for(var/mob/living/carbon/M in hear(7, get_turf(src))) - bang(get_turf(src), M) - - for(var/obj/effect/blob/B in hear(8,get_turf(src))) //Blob damage here - var/damage = round(30/(get_dist(B,get_turf(src))+1)) - B.health -= damage - B.update_icon() - - new/obj/effect/effect/smoke/flashbang(src.loc) - del(src) +/obj/item/weapon/grenade/flashbang/prime() + update_mob() + var/flashbang_turf = get_turf(src) + if(!flashbang_turf) return + for(var/mob/living/M in hearers(7, flashbang_turf)) + bang(get_turf(M), M) - proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged. - if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging - for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions. - S.active = 0 // -- Polymorph - S.icon_state = "shield0" + for(var/obj/effect/blob/B in hear(8,flashbang_turf)) //Blob damage here + var/damage = round(30/(get_dist(B,get_turf(src))+1)) + B.health -= damage + B.update_icon() + del(src) - M << "\red BANG" - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) +/obj/item/weapon/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M) + M.show_message("BANG", 2) + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) //Checking for protections - var/eye_safety = 0 - var/ear_safety = 0 - if(iscarbon(M)) - eye_safety = M.eyecheck() - if(ishuman(M)) - if(istype(M:l_ear, /obj/item/clothing/ears/earmuffs) || istype(M:r_ear, /obj/item/clothing/ears/earmuffs)) - ear_safety += 2 - if(M_HULK in M.mutations) - ear_safety += 1 - if(istype(M:head, /obj/item/clothing/head/helmet)) - ear_safety += 1 + var/eye_safety = 0 + var/ear_safety = 0 + var/distance = max(1,get_dist(src,T)) + if(iscarbon(M)) + var/mob/living/carbon/C = M + eye_safety = C.eyecheck() + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) + ear_safety++ -//Flashing everyone - if(eye_safety < 1) - flick("e_flash", M.flash) - M.Stun(2) - M.Weaken(10) - - - -//Now applying sound - if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M)) - if(ear_safety > 0) - M.Stun(2) - M.Weaken(1) - else - M.Stun(10) - M.Weaken(3) - if ((prob(14) || (M == src.loc && prob(70)))) - M.ear_damage += rand(1, 10) - else - M.ear_damage += rand(0, 5) - M.ear_deaf = max(M.ear_deaf,15) - - else if(get_dist(M, T) <= 5) - if(!ear_safety) - M.Stun(8) - M.ear_damage += rand(0, 3) - M.ear_deaf = max(M.ear_deaf,10) - - else if(!ear_safety) - M.Stun(4) - M.ear_damage += rand(0, 1) - M.ear_deaf = max(M.ear_deaf,5) - -//This really should be in mob not every check - if(ishuman(M)) - var/mob/living/carbon/human/H = M - var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] - if (E.damage >= E.min_bruised_damage) - M << "\red Your eyes start to burn badly!" - if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) - if (E.damage >= E.min_broken_damage) - M << "\red You can't see anything!" - if (M.ear_damage >= 15) - M << "\red Your ears start to ring badly!" +//Flash + if(!eye_safety) + var/mob/living/carbon/human/H = M + var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] + flick("e_flash", M.flash) + E.damage += rand(1, 3) + M.Stun(max(10/distance, 3)) + M.Weaken(max(10/distance, 3)) + if (E.damage >= E.min_bruised_damage) + M << "Your eyes start to burn badly!" if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) - if (prob(M.ear_damage - 10 + 5)) - M << "\red You can't hear anything!" - M.sdisabilities |= DEAF + if (E.damage >= E.min_broken_damage) + M << "You can't see anything!" + +//Bang + if((src.loc == M) || src.loc == M.loc)//Holding on person or being exactly where lies is significantly more dangerous and voids protection + M.Stun(10) + M.Weaken(10) + if(!ear_safety) + M.Stun(max(10/distance, 3)) + M.Weaken(max(10/distance, 3)) + M.ear_damage += rand(0, 5) + M.ear_deaf = max(M.ear_deaf,15) + if (M.ear_damage >= 15) + M << "Your ears start to ring badly!" + if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) + if(prob(M.ear_damage - 10 + 5)) + M << "You can't hear anything!" + M.disabilities |= DEAF else if (M.ear_damage >= 5) - M << "\red Your ears start to ring!" - M.update_icons() - -/obj/effect/effect/smoke/flashbang - name = "illumination" - opacity = 0 - icon_state = "sparks" - -/obj/effect/effect/smoke/flashbang/New() - ..() - SetLuminosity(15) + M << "Your ears start to ring!" /obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve desc = "Use of this weapon may constiute a war crime in your area, consult your local captain." @@ -116,6 +75,7 @@ icon_state = "clusterbang" /obj/item/weapon/grenade/flashbang/clusterbang/prime() + update_mob() var/numspawned = rand(4,8) var/again = 0 for(var/more = numspawned,more > 0,more--) @@ -132,9 +92,7 @@ spawn(0) new /obj/item/weapon/grenade/flashbang/clusterbang/segment(src.loc)//Creates a 'segment' that launches a few more flashbangs playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(0) - del(src) - return + del(src) /obj/item/weapon/grenade/flashbang/clusterbang/segment desc = "A smaller segment of a clusterbang. Better run." @@ -145,7 +103,6 @@ /obj/item/weapon/grenade/flashbang/clusterbang/segment/New()//Segments should never exist except part of the clusterbang, since these immediately 'do their thing' and asplode icon_state = "clusterbang_segment_active" active = 1 - banglet = 1 var/stepdist = rand(1,4)//How far to step var/temploc = src.loc//Saves the current location to know where to step away from walk_away(src,temploc,stepdist)//I must go, my people need me @@ -155,6 +112,7 @@ ..() /obj/item/weapon/grenade/flashbang/clusterbang/segment/prime() + update_mob() var/numspawned = rand(4,8) for(var/more = numspawned,more > 0,more--) if(prob(35)) @@ -164,19 +122,16 @@ spawn(0) new /obj/item/weapon/grenade/flashbang/cluster(src.loc) playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(0) - del(src) - return + del(src) /obj/item/weapon/grenade/flashbang/cluster/New()//Same concept as the segments, so that all of the parts don't become reliant on the clusterbang - spawn(0) - icon_state = "flashbang_active" - active = 1 - banglet = 1 - var/stepdist = rand(1,3) - var/temploc = src.loc - walk_away(src,temploc,stepdist) - var/dettime = rand(15,60) - spawn(dettime) - prime() - ..() \ No newline at end of file + ..() + icon_state = "flashbang_active" + active = 1 + banglet = 1 + var/stepdist = rand(1,3) + var/temploc = src.loc + walk_away(src,temploc,stepdist) + var/dettime = rand(15,60) + spawn(dettime) + prime() \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 63f318ba89c..e206fc37408 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -155,13 +155,13 @@ qdel(src) /obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage ..() - if(health <= 0) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - del(src) - + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + health -= Proj.damage + if(health <= 0) + for(var/atom/movable/A as mob|obj in src) + A.loc = src.loc + del(src) return /obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob) @@ -273,7 +273,7 @@ else if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(src == user.loc) - user << "You can not [welded?"unweld":"weld"] the locker from inside." + user << "You can not [welded?"unweld":"weld"] the locker from inside." return if(!WT.remove_fuel(0,user)) user << "You need more welding fuel to complete this task." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index f2e064ecc11..917c8feb815 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -23,7 +23,7 @@ new /obj/item/clothing/suit/armor/vest/capcarapace(src) new /obj/item/weapon/cartridge/captain(src) new /obj/item/clothing/shoes/brown(src) - new /obj/item/device/radio/headset/heads/captain(src) + new /obj/item/device/radio/headset/heads/captain/alt(src) new /obj/item/clothing/gloves/color/captain(src) new /obj/item/weapon/gun/energy/gun(src) return @@ -101,7 +101,7 @@ else new /obj/item/weapon/storage/backpack/satchel_sec(src) new /obj/item/weapon/cartridge/hos(src) - new /obj/item/device/radio/headset/heads/hos(src) + new /obj/item/device/radio/headset/heads/hos/alt(src) new /obj/item/clothing/under/rank/head_of_security(src) new /obj/item/clothing/under/rank/head_of_security/formal(src) new /obj/item/clothing/suit/armor/hos(src) @@ -139,7 +139,7 @@ new /obj/item/weapon/storage/backpack/security(src) else new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/device/radio/headset/headset_sec(src) + new /obj/item/device/radio/headset/headset_sec/alt(src) new /obj/item/clothing/suit/armor/vest/warden(src) new /obj/item/clothing/head/warden(src) new /obj/item/clothing/suit/armor/vest/warden/alt(src) @@ -178,7 +178,7 @@ else new /obj/item/weapon/storage/backpack/satchel_sec(src) new /obj/item/clothing/suit/armor/vest/security(src) - new /obj/item/device/radio/headset/headset_sec(src) + new /obj/item/device/radio/headset/headset_sec/alt(src) new /obj/item/clothing/head/beret/sec(src) new /obj/item/weapon/reagent_containers/spray/pepper(src) new /obj/item/device/flash(src) @@ -301,7 +301,7 @@ new /obj/item/clothing/shoes/brown(src) new /obj/item/weapon/storage/box/evidence(src) new /obj/item/weapon/clipboard(src) - new /obj/item/device/radio/headset/headset_sec(src) + new /obj/item/device/radio/headset/headset_sec/alt(src) new /obj/item/device/detective_scanner(src) new /obj/item/clothing/suit/armor/vest/det_suit(src) new /obj/item/ammo_box/c38(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index e477868a72e..577e28c02f9 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -69,16 +69,16 @@ /obj/structure/displaycase/captains_laser name = "captain's display case" - desc = "A display case for the captain's antique laser gun. It taunts you to kick it." + desc = "A display case for the captain's antique laser gun. It taunts you to kick it." /obj/structure/displaycase/captains_laser/New() req_access = list(access_captain) occupant = new /obj/item/weapon/gun/energy/laser/captain(src) locked = 1 update_icon() - + /obj/structure/proc/getPrint(mob/user as mob) - return md5(user:dna:uni_identity) + return md5(user:dna:uni_identity) /obj/structure/displaycase/examine() ..() @@ -112,12 +112,12 @@ /obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + health -= Proj.damage ..() src.healthcheck() return - /obj/structure/displaycase/blob_act() if (prob(75)) getFromPool(/obj/item/weapon/shard, loc) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index efda3d2e00e..b02fb0f0c86 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -128,16 +128,13 @@ return !density /obj/structure/grille/bullet_act(var/obj/item/projectile/Proj) - - if(!Proj) return - - //Tasers and the like should not damage grilles. - if(Proj.damage_type == STAMINA) + if(!Proj) return - - src.health -= Proj.damage*0.2 - healthcheck() - return 0 + ..() + if((Proj.damage_type != STAMINA)) //Grilles can't be exhausted to death + src.health -= Proj.damage*0.3 + healthcheck() + return /obj/structure/grille/attackby(obj/item/weapon/W as obj, mob/user as mob) if(iswirecutter(W)) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 3b24d5cc057..e77672df358 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -58,11 +58,9 @@ var/global/wcColored // var/icon/silicateIcon = null // the silicated icon /obj/structure/window/bullet_act(var/obj/item/projectile/Proj) - //Tasers and the like should not damage windows. - if(Proj.damage_type == STAMINA) - return - - health -= Proj.damage + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + health -= Proj.damage + update_nearby_icons() ..() if(health <= 0) var/pdiff=performWallPressureCheck(src.loc) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 54fcd327470..2991d32164c 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -828,7 +828,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform) M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes) M.equip_if_possible(new /obj/item/clothing/gloves/color/white(M), slot_gloves) - M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) + M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear) M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head) var/obj/item/device/pda/centcom/pda = new(M) @@ -853,7 +853,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform) M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes) M.equip_if_possible(new /obj/item/clothing/gloves/color/white(M), slot_gloves) - M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) + M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear) M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head) var/obj/item/device/pda/centcom/pda = new(M) diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 73be9adbebf..90a54ad0391 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -129,7 +129,7 @@ var/global/sent_syndicate_strike_team = 0 /mob/living/carbon/human/proc/equip_syndicate_commando(syndicate_leader_selected = 0) - var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(src) + var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(src) R.set_frequency(SYND_FREQ) //Same frequency as the syndicate team in Nuke mode. equip_to_slot_or_del(R, slot_l_ear) equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(src), slot_w_uniform) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 099d828e182..cd646e76e77 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -163,7 +163,7 @@ var/cost = href_list["KarmaRefundCost"] src.karmarefund(type,job,cost) return - + switch(href_list["_src_"]) if("holder") hsrc = holder if("usr") hsrc = mob @@ -412,5 +412,6 @@ 'icons/stamp_icons/large_stamp-qm.png', 'icons/stamp_icons/large_stamp-law.png', 'icons/stamp_icons/large_stamp-cent.png', - 'html/talisman.png' + 'html/talisman.png', + 'html/images/ntlogo.png' ) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 154790ce338..ca66eaf0ca9 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -119,6 +119,7 @@ desc = "Protects your hearing from loud noises, and quiet ones as well." icon_state = "earmuffs" item_state = "earmuffs" + flags = EARBANGPROTECT //Glasses diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 1da4ae739c3..bf1baad2081 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -2,7 +2,7 @@ name = "helmet" desc = "Standard Security gear. Protects the head from impacts." icon_state = "helmet" - flags = FPRINT | TABLEPASS | HEADCOVERSEYES + flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADBANGPROTECT item_state = "helmet" armor = list(melee = 50, bullet = 15, laser = 50,energy = 10, bomb = 25, bio = 0, rad = 0) flags_inv = HIDEEARS|HIDEEYES @@ -18,7 +18,7 @@ desc = "It's a helmet specifically designed to protect against close range attacks." icon_state = "riot" item_state = "helmet" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH + flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|HEADBANGPROTECT armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0) flags_inv = HIDEEARS siemens_coefficient = 0.7 @@ -59,6 +59,7 @@ /obj/item/clothing/head/helmet/roman name = "roman helmet" desc = "An ancient helmet made of bronze and leather." + flags = HEADCOVERSEYES armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0) icon_state = "roman" item_state = "roman" @@ -73,7 +74,7 @@ name = "gladiator helmet" desc = "Ave, Imperator, morituri te salutant." icon_state = "gladiator" - flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR item_state = "gladiator" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES siemens_coefficient = 1 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 02654e9a23b..37b168ddec8 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -433,7 +433,6 @@ icon_state = "roman" _color = "roman" item_state = "armor" - armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0) /obj/item/clothing/under/maid name = "maid costume" diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index d57940852f6..f1aa5bea66b 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -182,7 +182,12 @@ /mob/living/carbon/slime/proc/handle_chemicals_in_body() if(reagents) reagents.metabolize(src) - + if (reagents.get_reagent_amount("plasma")>=5) + mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50% + reagents.remove_reagent("plasma", 5) + if (reagents.get_reagent_amount("inaprovaline")>=5) + mutation_chance = max(mutation_chance - 5,0) //Prevents muation chance going <0% + reagents.remove_reagent("inaprovaline", 5) src.updatehealth() return //TODO: DEFERRED diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index b7146e208a4..cb5be464681 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -534,14 +534,23 @@ return /mob/living/carbon/slime/attackby(obj/item/W, mob/user) - if(W.force > 0) + if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Lets you feed slimes plasma. + if (user in Friends) + ++Friends[user] + else + Friends[user] = 1 + user << "You feed the slime the plasma. It chirps happily." + var/obj/item/stack/sheet/mineral/plasma/S = W + S.use(1) + return + else if(W.force > 0) attacked += 10 if(prob(25)) user << "[W] passes right through [src]!" return if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? Discipline = 0 - if(W.force >= 3) + else if(W.force >= 3) if(is_adult) if(prob(5 + round(W.force/2))) if(Victim || Target) @@ -613,7 +622,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 Target = null ++Discipline return - + /mob/living/carbon/slime/can_use_vents() if(Victim) return "You cannot ventcrawl while feeding." diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 39505b7ee40..0c8f61569b4 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -179,7 +179,8 @@ if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) var/reflectchance = 80 - round(P.damage/3) if(prob(reflectchance)) - adjustBruteLoss(P.damage * 0.5) + if((P.damage_type == BRUTE || P.damage_type == BURN)) + adjustBruteLoss(P.damage * 0.5) visible_message("The [P.name] gets reflected by [src]'s shell!", \ "The [P.name] gets reflected by [src]'s shell!") diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 47300bcd973..1cc7a8fff7d 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -11,7 +11,7 @@ var/projectiletype var/projectilesound var/casingtype - var/move_to_delay = 2 //delay for the automated movement. + var/move_to_delay = 3 //delay for the automated movement. var/list/friends = list() var/vision_range = 9 //How big of an area to search for targets in, a vision of 9 attempts to find targets as soon as they walk into screen view diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 6a22c22cb04..65ee9f5629b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -32,8 +32,8 @@ /mob/living/simple_animal/hostile/asteroid/bullet_act(var/obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills if(!stat) Aggro() - if(P.damage < 30) - P.damage = (P.damage / 2) + if(P.damage < 30 && P.damage_type != BRUTE) + P.damage = (P.damage / 3) visible_message("The [P] has a reduced effect on [src]!") ..() @@ -42,7 +42,7 @@ var/obj/item/T = AM if(!stat) Aggro() - if(T.throwforce <= 15) + if(T.throwforce <= 20) visible_message("The [T.name] [src.throw_message] [src.name]!") return ..() @@ -76,6 +76,7 @@ ranged_cooldown_cap = 4 aggro_vision_range = 9 idle_vision_range = 2 + turns_per_move = 5 /obj/item/projectile/temp/basilisk name = "freezing blast" @@ -123,13 +124,13 @@ icon_aggro = "Goldgrub_alert" icon_dead = "Goldgrub_dead" icon_gib = "syndicate_gib" - vision_range = 3 + vision_range = 2 aggro_vision_range = 9 - idle_vision_range = 3 - move_to_delay = 3 + idle_vision_range = 2 + move_to_delay = 5 friendly = "harmlessly rolls into" - maxHealth = 60 - health = 60 + maxHealth = 45 + health = 45 harm_intent_damage = 5 melee_damage_lower = 0 melee_damage_upper = 0 @@ -208,6 +209,10 @@ Reward() ..() +/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(var/damage) + idle_vision_range = 9 + ..() + /mob/living/simple_animal/hostile/asteroid/hivelord name = "hivelord" desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original." @@ -293,7 +298,7 @@ icon_dead = "Hivelordbrood" icon_gib = "syndicate_gib" mouse_opacity = 2 - move_to_delay = 0 + move_to_delay = 1 friendly = "buzzes near" vision_range = 10 speed = 3 @@ -328,9 +333,10 @@ mouse_opacity = 2 move_to_delay = 40 ranged = 1 + ranged_cooldown = 2 //By default, start the Goliath with his cooldown off so that people can run away quickly on first sight ranged_cooldown_cap = 8 friendly = "wails at" - vision_range = 5 + vision_range = 4 speed = 3 maxHealth = 300 health = 300 @@ -341,18 +347,50 @@ throw_message = "does nothing to the rocky hide of the" aggro_vision_range = 9 idle_vision_range = 5 + anchored = 1 //Stays anchored until death as to be unpullable + var/pre_attack = 0 + +/mob/living/simple_animal/hostile/asteroid/goliath/Life() + ..() + handle_preattack() + +/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack() + if(ranged_cooldown <= 2 && !pre_attack) + pre_attack++ + if(!pre_attack || stat || stance == HOSTILE_STANCE_IDLE) + return + icon_state = "Goliath_preattack" + +/mob/living/simple_animal/hostile/asteroid/goliath/revive() + anchored = 1 + ..() + +/mob/living/simple_animal/hostile/asteroid/goliath/Die() + anchored = 0 + ..() /mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() - visible_message("The [src.name] digs its tentacles under [target.name]!") var/tturf = get_turf(target) - new /obj/effect/goliath_tentacle/original(tturf) - ranged_cooldown = ranged_cooldown_cap + if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen + visible_message("The [src.name] digs its tentacles under [target.name]!") + new /obj/effect/goliath_tentacle/original(tturf) + ranged_cooldown = ranged_cooldown_cap + icon_state = icon_aggro + pre_attack = 0 return /mob/living/simple_animal/hostile/asteroid/goliath/adjustBruteLoss(var/damage) ranged_cooldown-- + handle_preattack() ..() +/mob/living/simple_animal/hostile/asteroid/goliath/Aggro() + vision_range = aggro_vision_range + handle_preattack() + if(icon_state != icon_aggro) + icon_state = icon_aggro + return + /obj/effect/goliath_tentacle/ name = "Goliath tentacle" icon = 'icons/mob/animal.dmi' @@ -369,6 +407,9 @@ /obj/effect/goliath_tentacle/original /obj/effect/goliath_tentacle/original/New() + for(var/obj/effect/goliath_tentacle/original/O in loc)//No more GG NO RE from 2+ goliaths simultaneously tentacling you + if(O != src) + qdel(src) var/list/directions = cardinal.Copy() var/counter for(counter = 1, counter <= 3, counter++) @@ -378,6 +419,7 @@ new /obj/effect/goliath_tentacle(T) ..() + /obj/effect/goliath_tentacle/proc/Trip() for(var/mob/living/M in src.loc) M.Weaken(5) @@ -400,6 +442,7 @@ desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna." icon = 'icons/obj/items.dmi' icon_state = "goliath_hide" + flags = NOBLUDGEON w_class = 3 layer = 4 @@ -408,10 +451,31 @@ if(istype(target, /obj/item/clothing/suit/space/rig/mining) || istype(target, /obj/item/clothing/head/helmet/space/rig/mining)) var/obj/item/clothing/C = target var/current_armor = C.armor - if(current_armor.["melee"] < 90) - current_armor.["melee"] = min(current_armor.["melee"] + 10, 90) + if(current_armor.["melee"] < 80) + current_armor.["melee"] = min(current_armor.["melee"] + 10, 80) user << "You strengthen [target], improving its resistance against melee attacks." del(src) else user << "You can't improve [C] any further." - return + return + if(istype(target, /obj/mecha/working/ripley)) + var/obj/mecha/D = target + var/list/damage_absorption = D.damage_absorption + if(damage_absorption.["brute"] > 0.3) + damage_absorption.["brute"] = max(damage_absorption.["brute"] - 0.1, 0.3) + user << "You strengthen [target], improving its resistance against melee attacks." + qdel(src) + if(D.icon_state == "ripley-open") + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open") + D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates." + else + user << "You can't add armour onto the mech while someone is inside!" + if(damage_absorption.["brute"] == 0.3) + if(D.icon_state == "ripley-open") + D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open") + D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter." + else + user << "You can't add armour onto the mech while someone is inside!" + else + user << "You can't improve [D] any further." + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 3d43d4628fb..df1f903f21f 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -75,7 +75,8 @@ /mob/living/simple_animal/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj) if(!Proj) return if(prob(65)) - src.health -= Proj.damage + if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + src.health -= Proj.damage else visible_message("\red [src] blocks [Proj] with its shield!") return 0 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 801ebbbe387..7becc36cfa2 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -56,7 +56,7 @@ var/friendly = "nuzzles" //If the mob does no damage with it's attack var/environment_smash = 0 //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls - var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster + var/speed = 1 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster var/can_hide = 0 //Hot simple_animal baby making vars @@ -251,8 +251,11 @@ adjustBruteLoss(damage) /mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) - if(!Proj) return - adjustBruteLoss(Proj.damage) + if(!Proj) + return + if((Proj.damage_type != STAMINA)) + adjustBruteLoss(Proj.damage) + Proj.on_hit(src, 0) return 0 /mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 90c5c422ad8..976d8da1ca6 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -231,7 +231,7 @@ t = replacetext(t, "\[/grid\]", "") t = replacetext(t, "\[row\]", "") t = replacetext(t, "\[cell\]", "") - t = replacetext(t, "\[logo\]", "") + t = replacetext(t, "\[logo\]", "") t = "[t]" else // If it is a crayon, and he still tries to use these, make them empty! @@ -552,47 +552,47 @@ /obj/item/weapon/paper/sop name = "paper- 'Standard Operating Procedure'" info = "Alert Levels:
\nBlue- Emergency
\n\t1. Caused by fire
\n\t2. Caused by manual interaction
\n\tAction:
\n\t\tClose all fire doors. These can only be opened by reseting the alarm
\nRed- Ejection/Self Destruct
\n\t1. Caused by module operating computer.
\n\tAction:
\n\t\tAfter the specified time the module will eject completely.
\n
\nEngine Maintenance Instructions:
\n\tShut off ignition systems:
\n\tActivate internal power
\n\tActivate orbital balance matrix
\n\tRemove volatile liquids from area
\n\tWear a fire suit
\n
\n\tAfter
\n\t\tDecontaminate
\n\t\tVisit medical examiner
\n
\nToxin Laboratory Procedure:
\n\tWear a gas mask regardless
\n\tGet an oxygen tank.
\n\tActivate internal atmosphere
\n
\n\tAfter
\n\t\tDecontaminate
\n\t\tVisit medical examiner
\n
\nDisaster Procedure:
\n\tFire:
\n\t\tActivate sector fire alarm.
\n\t\tMove to a safe area.
\n\t\tGet a fire suit
\n\t\tAfter:
\n\t\t\tAssess Damage
\n\t\t\tRepair damages
\n\t\t\tIf needed, Evacuate
\n\tMeteor Shower:
\n\t\tActivate fire alarm
\n\t\tMove to the back of ship
\n\t\tAfter
\n\t\t\tRepair damage
\n\t\t\tIf needed, Evacuate
\n\tAccidental Reentry:
\n\t\tActivate fire alarms in front of ship.
\n\t\tMove volatile matter to a fire proof area!
\n\t\tGet a fire suit.
\n\t\tStay secure until an emergency ship arrives.
\n
\n\t\tIf ship does not arrive-
\n\t\t\tEvacuate to a nearby safe area!" - + /obj/item/weapon/paper/blueshield name = "paper- 'Blueshield Mission Briefing'" - info = "Blueshield Mission Briefing
You are charged with the defence of any persons of importance within the station. This includes but is not limited to The Captain, The Heads of Staff and Central Command staff. You answer directly to the Head of Security who will assist you in achieving your mission.
Where required to achieve your primary responsibility you should liaise with security and share resources, however the day to day security operations of the station are outside of your jurisdiction.
Monitor the health and safety of your principals, identify any potential risks and threats then alert the proper departments to resolve the situation. You are authorized to act as bodyguard to any of the station heads that you determine are most in need of protection, however additional access to their departments shall be granted solely at their discretion.
Observe the station alert system and carry your armaments only as required by the situation or when authorized by the Head of Security or Captain in exceptional cases.
Remember, as an agent of Nanotrasen it is your responsibility to conduct yourself appropriately and you will be held to the highest standard. You will be held accountable for your actions. Security is authorized to search, interrogate or detain you as required by their own procedures. Internal affairs will also monitor and observe your conduct and their mandate applies equally to security and Blueshield operations." - + info = "Blueshield Mission Briefing
You are charged with the defence of any persons of importance within the station. This includes but is not limited to The Captain, The Heads of Staff and Central Command staff. You answer directly to the Head of Security who will assist you in achieving your mission.
Where required to achieve your primary responsibility you should liaise with security and share resources, however the day to day security operations of the station are outside of your jurisdiction.
Monitor the health and safety of your principals, identify any potential risks and threats then alert the proper departments to resolve the situation. You are authorized to act as bodyguard to any of the station heads that you determine are most in need of protection, however additional access to their departments shall be granted solely at their discretion.
Observe the station alert system and carry your armaments only as required by the situation or when authorized by the Head of Security or Captain in exceptional cases.
Remember, as an agent of Nanotrasen it is your responsibility to conduct yourself appropriately and you will be held to the highest standard. You will be held accountable for your actions. Security is authorized to search, interrogate or detain you as required by their own procedures. Internal affairs will also monitor and observe your conduct and their mandate applies equally to security and Blueshield operations." + /obj/item/weapon/paper/ntrep name = "paper- 'Nanotrasen Representative Mission Briefing'" info = "Nanotrasen Representative Mission Briefing

Nanotrasen Central Command has dispatched you to this station in order to liaise with command staff on their behalf. As experienced field officers, the staff on the station are experts in handling their own fields. It is your job however to consider the bigger picture and to direct the staff towards Nanotrasen's corporate interests.
As a civilian, you should consider yourself an advisor, diplomat and intermediary. The command staff do not answer to you directly and are not required to follow your orders nor do you have disciplinary authority over personnel. In all station internal matters you answer to the Head of Personnel who will direct you in your conduct within the station. However you also answer to Central Command who may, as required, direct you in acting on company interests.
Central Command may dispatch orders to the staff through you which you are responsible to communicate, however enforcement of these orders is not your mandate and will be handled directly by Central Command or authorized Nanotrasen personnel. When not specifically directed by Central Command, assist the head of personnel in evaluation of the station and receiving departmental reports.
Your office has been provided with a direct link to Central Command, through which you can issue any urgent reports or requests for Nanotrasen intervention. Remember that any direct intervention is a costly exercise and should be used only when the situation justifies the request. You will be held accountable for any unnecessary usage of Nanotrasen resources.
" - + /obj/item/weapon/paper/armory name = "paper- 'Armory Inventory'" - info = "4 Deployable Barriers
4 Portable Flashers
1 Mechanical Toolbox
2 Boxes of Spare Handcuffs
1 Box of Flashbangs
1 Box of Spare R.O.B.U.S.T. Cartridges
1 Tracking Implant Kit
1 Chemical Implant Kit
1 Box of Tear Gas Grenades
1 Explosive Ordnance Disposal Suit
1 Biohazard Suit
3 Gas Masks
1 Lockbox of Loyalty Implants
1 Ion Rifle
3 Sets of Riot Equipment
2 Sets of Security Hardsuits
1 Ablative Armor Vest
3 Bulletproof Vests
3 Helmets

2 Riot Shotguns
2 Boxes of Beanbag Shells
3 Laser Guns
3 Energy Guns
3 Advanced Tasers" + info = "4 Deployable Barriers
4 Portable Flashers
1 Mechanical Toolbox
2 Boxes of Spare Handcuffs
1 Box of Flashbangs
1 Box of Spare R.O.B.U.S.T. Cartridges
1 Tracking Implant Kit
1 Chemical Implant Kit
1 Box of Tear Gas Grenades
1 Explosive Ordnance Disposal Suit
1 Biohazard Suit
3 Gas Masks
1 Lockbox of Loyalty Implants
1 Ion Rifle
3 Sets of Riot Equipment
2 Sets of Security Hardsuits
1 Ablative Armor Vest
3 Bulletproof Vests
3 Helmets

2 Riot Shotguns
2 Boxes of Beanbag Shells
3 Laser Guns
3 Energy Guns
3 Advanced Tasers" /obj/item/weapon/paper/firingrange - name = "paper- 'Firing Range Instructions'" + name = "paper- 'Firing Range Instructions'" info = "Directions:
First you'll want to make sure there is a target stake in the center of the magnetic platform. Next, take an aluminum target from the crates back there and slip it into the stake. Make sure it clicks! Next, there should be a control console mounted on the wall somewhere in the room.

This control console dictates the behaviors of the magnetic platform, which can move your firing target around to simulate real-world combat situations. From here, you can turn off the magnets or adjust their electromagnetic levels and magnetic fields. The electricity level dictates the strength of the pull - you will usually want this to be the same value as the speed. The magnetic field level dictates how far the magnetic pull reaches.

Speed and path are the next two settings. Speed is associated with how fast the machine loops through the designated path. Paths dictate where the magnetic field will be centered at what times. There should be a pre-fabricated path input already. You can enable moving to observe how the path affects the way the stake moves. To script your own path, look at the following key:


N: North
S: South
E: East
W: West
C: Center
R: Random (results may vary)
; or &: separators. They are not necessary but can make the path string better visible." - + /obj/item/weapon/paper/holodeck - name = "paper- 'Holodeck Disclaimer'" + name = "paper- 'Holodeck Disclaimer'" info = "Brusies sustained in the holodeck can be healed simply by sleeping." - + /obj/item/weapon/paper/spells - name = "paper- 'List of Available Spells (READ)'" - info = "

LIST OF SPELLS AVAILABLE

Magic Missile:
This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.

Fireball:
This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.

Disintegrate:
This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.

Disable Technology:
This spell disables all weapons, cameras and most other technology in range.

Smoke:
This spell spawns a cloud of choking smoke at your location and does not require wizard garb.

Blind:
This spell temporarly blinds a single person and does not require wizard garb.

Forcewall:
This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.

Blink:
This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.

Teleport:
This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.

Mutate:
This spell causes you to turn into a hulk, and gain telekinesis for a short while.

Ethereal Jaunt:
This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.

Knock:
This spell opens nearby doors and does not require wizard garb.

" - + name = "paper- 'List of Available Spells (READ)'" + info = "

LIST OF SPELLS AVAILABLE

Magic Missile:
This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.

Fireball:
This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you.

Disintegrate:
This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown.

Disable Technology:
This spell disables all weapons, cameras and most other technology in range.

Smoke:
This spell spawns a cloud of choking smoke at your location and does not require wizard garb.

Blind:
This spell temporarly blinds a single person and does not require wizard garb.

Forcewall:
This spell creates an unbreakable wall that lasts for 30 seconds and does not require wizard garb.

Blink:
This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.

Teleport:
This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.

Mutate:
This spell causes you to turn into a hulk, and gain telekinesis for a short while.

Ethereal Jaunt:
This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.

Knock:
This spell opens nearby doors and does not require wizard garb.

" + /obj/item/weapon/paper/syndimemo - name = "paper- 'Memo'" - info = "GET DAT FUKKEN DISK" + name = "paper- 'Memo'" + info = "GET DAT FUKKEN DISK" /obj/item/weapon/paper/russiantraitorobj - name = "paper- 'Mission Objectives'" - info = "The Syndicate have cunningly disguised a Syndicate Uplink as your PDA. Simply enter the code \"678 Bravo\" into the ringtone select to unlock its hidden features.

Objective #1. Kill the God damn AI in a fire blast that it rocks the station. Success!
Objective #2. Escape alive. Failed." - + name = "paper- 'Mission Objectives'" + info = "The Syndicate have cunningly disguised a Syndicate Uplink as your PDA. Simply enter the code \"678 Bravo\" into the ringtone select to unlock its hidden features.

Objective #1. Kill the God damn AI in a fire blast that it rocks the station. Success!
Objective #2. Escape alive. Failed." + /obj/item/weapon/paper/russiannuclearoperativeobj - name = "paper- 'Objectives of a Nuclear Operative'" - info = "Objective #1: Destroy the station with a nuclear device." - + name = "paper- 'Objectives of a Nuclear Operative'" + info = "Objective #1: Destroy the station with a nuclear device." + /obj/item/weapon/paper/clownship - name = "paper- 'Note'" + name = "paper- 'Note'" info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!" - + /obj/item/weapon/paper/crumpled name = "paper scrap" icon_state = "scrap" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 6b6332eb65e..99dd27d88d6 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -222,19 +222,33 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. /obj/item/weapon/gun/energy/kinetic_accelerator name = "proto-kinetic accelerator" - desc = "According to Nanotrasen accounting, this is mining equipment. It's been modified to the legal limit on power output, and often serves as a miner's first defense against hostile alien life; it's not very powerful unless used in a low pressure environment." - icon_state = "freezegun" - item_state = "shotgun" + desc = "According to Nanotrasen accounting, this is mining equipment. It's been modified for extreme power output to crush rocks, but often serves as a miner's first defense against hostile alien life; it's not very powerful unless used in a low pressure environment." + icon_state = "kineticgun" + item_state = "kineticgun" + icon_override = 'icons/mob/in-hand/guns.dmi' projectile_type = "/obj/item/projectile/kinetic" - cell_type = "/obj/item/weapon/cell/crap" + fire_sound = 'sound/weapons/Kenetic_accel.ogg' charge_cost = 5000 + cell_type = "/obj/item/weapon/cell/crap" + var/overheat = 0 + var/recent_reload = 1 + +/obj/item/weapon/gun/energy/kinetic_accelerator/Fire() + overheat = 1 + spawn(20) + overheat = 0 + recent_reload = 0 + ..() /obj/item/weapon/gun/energy/kinetic_accelerator/attack_self(var/mob/living/user/L) + if(overheat || recent_reload) + return power_supply.give(5000) - playsound(src.loc, 'sound/weapons/shotgunpump.ogg', 60, 1) + playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) + recent_reload = 1 + update_icon() return - /obj/item/weapon/gun/energy/disabler name = "disabler" desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse." diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index ec20788aaed..e2e643a1111 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -187,38 +187,15 @@ obj/item/projectile/kinetic/New() range-- if(range <= 0) new /obj/item/effect/kinetic_blast(src.loc) - delete() + del(src) -/obj/item/projectile/kinetic/on_hit(var/atom/target) +/obj/item/projectile/kinetic/on_hit(atom/target) var/turf/target_turf= get_turf(target) if(istype(target_turf, /turf/simulated/mineral)) var/turf/simulated/mineral/M = target_turf M.GetDrilled() new /obj/item/effect/kinetic_blast(target_turf) - ..(target,blocked) - -/obj/item/projectile/kinetic/Bump(atom/A as mob|obj|turf|area) - if(!loc) return - if(A == firer) - loc = A.loc - return - - if(src)//Do not add to this if() statement, otherwise the meteor won't delete them - - if(A) - var/turf/target_turf = get_turf(A) - //testing("Bumped [A.type], on [target_turf.type].") - if(istype(target_turf, /turf/unsimulated/mineral)) - var/turf/simulated/mineral/M = target_turf - M.GetDrilled() - // Now we bump as a bullet, if the atom is a non-turf. - if(!isturf(A)) - ..(A) - qdel(src) // Comment this out if you want to shoot through the asteroid, ERASER-style. - return 1 - else - qdel(src) - return 0 + ..() /obj/item/effect/kinetic_blast name = "kinetic explosion" @@ -228,5 +205,4 @@ obj/item/projectile/kinetic/New() /obj/item/effect/kinetic_blast/New() spawn(4) - del(src) - + del(src) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 4c6c95129a5..2e38631ce6f 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -646,6 +646,7 @@ datum if((M.mind in ticker.mode.cult) && prob(10)) M << "\blue A cooling sensation from inside you brings you an untold calmness." ticker.mode.remove_cultist(M.mind) + ticker.mode.remove_all_cult_icons_from_client(M.client) // fixes the deconverted's own client not removing their mob's cult icon for(var/mob/O in viewers(M, null)) O.show_message(text("\blue []'s eyes blink and become clearer.", M), 1) // So observers know it worked. // Vamps react to this like acid diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 6a38b825a35..500703563e8 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1032,6 +1032,18 @@ datum S.loc = get_turf_loc(holder.my_atom) + slimeinaprov + name = "Slime Inaprovaline" + id = "m_inaprov" + result = "inaprovaline" + required_reagents = list("water" = 5) + result_amount = 3 + required_other = 1 + required_container = /obj/item/slime_extract/grey + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + + slimemonkey name = "Slime Monkey" id = "m_monkey" @@ -1119,6 +1131,59 @@ datum // for(var/mob/O in viewers(get_turf_loc(holder.my_atom), null)) // O.show_message(text("\red The slime core fizzles disappointingly,"), 1) + + slimecritlesser + name = "Slime Crit Lesser" + id = "m_tele3" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 + on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + + if(holder && holder.my_atom) + + var/blocked = list(/mob/living/simple_animal/hostile, + /mob/living/simple_animal/hostile/pirate, + /mob/living/simple_animal/hostile/pirate/ranged, + /mob/living/simple_animal/hostile/russian, + /mob/living/simple_animal/hostile/russian/ranged, + /mob/living/simple_animal/hostile/syndicate, + /mob/living/simple_animal/hostile/syndicate/melee, + /mob/living/simple_animal/hostile/syndicate/melee/space, + /mob/living/simple_animal/hostile/syndicate/ranged, + /mob/living/simple_animal/hostile/syndicate/ranged/space, + /mob/living/simple_animal/hostile/alien/queen/large, + /mob/living/simple_animal/hostile/retaliate, + /mob/living/simple_animal/hostile/retaliate/clown, + /mob/living/simple_animal/hostile/mushroom, + /mob/living/simple_animal/hostile/asteroid, + /mob/living/simple_animal/hostile/asteroid/basilisk, + /mob/living/simple_animal/hostile/asteroid/goldgrub, + /mob/living/simple_animal/hostile/asteroid/goliath, + /mob/living/simple_animal/hostile/asteroid/hivelord, + /mob/living/simple_animal/hostile/asteroid/hivelordbrood, + /mob/living/simple_animal/hostile/carp/holocarp, + /mob/living/simple_animal/hostile/mining_drone + )//exclusion list for things you don't want the reaction to create. + var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) + + var/chosen = pick(critters) + var/mob/living/simple_animal/hostile/C = new chosen + C.faction |= "neutral" + C.loc = get_turf(holder.my_atom) + //Silver slimebork name = "Slime Bork" diff --git a/code/setup.dm b/code/setup.dm index b138b2f2cd6..ab6e81d477c 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -211,6 +211,9 @@ var/MAX_EXPLOSION_RANGE = 14 #define MASKCOVERSMOUTH 2048 // on other items, these are just for mask/head #define HEADCOVERSMOUTH 2048 +#define HEADBANGPROTECT 4096 +#define EARBANGPROTECT 1024 + #define NOSLIP 1024 //prevents from slipping on wet floors, in space etc #define OPENCONTAINER 4096 // is an open container for chemistry purposes diff --git a/html/images/ntlogo.png b/html/images/ntlogo.png new file mode 100644 index 00000000000..d5614a964ee Binary files /dev/null and b/html/images/ntlogo.png differ diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi index 8f1e3ff0990..f056d9068c4 100644 Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index c4050aed844..f3d08f645c3 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/in-hand/guns.dmi b/icons/mob/in-hand/guns.dmi index 99093c521cf..9609c6d23f7 100644 Binary files a/icons/mob/in-hand/guns.dmi and b/icons/mob/in-hand/guns.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index f6ce90f5790..a105ed232af 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 1e6d7e6b731..3bac44a808a 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 14b94a22744..c4ecd1b70f3 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index e87c6c34222..d4049be0bb3 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ diff --git a/paradise.dme b/paradise.dme index f970e3cccba..69918097b9c 100644 --- a/paradise.dme +++ b/paradise.dme @@ -18,6 +18,7 @@ #define FILE_DIR "code/WorkInProgress/IndexLP" #define FILE_DIR "code/WorkInProgress/Susan" #define FILE_DIR "html" +#define FILE_DIR "html/images" #define FILE_DIR "icons" #define FILE_DIR "icons/48x48" #define FILE_DIR "icons/ass" diff --git a/sound/weapons/Kenetic_accel.ogg b/sound/weapons/Kenetic_accel.ogg new file mode 100644 index 00000000000..ab525baf9af Binary files /dev/null and b/sound/weapons/Kenetic_accel.ogg differ diff --git a/sound/weapons/kenetic_reload.ogg b/sound/weapons/kenetic_reload.ogg new file mode 100644 index 00000000000..7f2c779fa62 Binary files /dev/null and b/sound/weapons/kenetic_reload.ogg differ