diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 09beb53e7e8..da8e2fac116 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -303,6 +303,13 @@ var/list/uplink_items = list() cost = 2 gamemodes = list(/datum/game_mode/nuclear) +/datum/uplink_item/ammo/bulltoxin + name = "Drum Magazine - 12g Bioterror" + desc = "An alternative 8-round toxic magazine for use in the Bulldog shotgun. Contains debilitating toxins to make your target die an agonizing death." + item = /obj/item/ammo_box/magazine/m12g/bioterror + cost = 3 + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/ammo/carbine name = "Toploader Magazine - 5.56" desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage." @@ -403,6 +410,14 @@ var/list/uplink_items = list() item = /obj/item/toy/carpplushie/dehy_carp cost = 3 +/datum/uplink_item/stealthy_weapons/door_charge + name = "Explosive Airlock Charge" + desc = "A small, easily concealable device. It can be applied to an open airlock panel, and the next person to open that airlock will be knocked down in an explosion. The airlock's maintenance panel will also be destroyed by this." + item = /obj/item/device/doorCharge + cost = 5 + surplus = 6 + excludefrom = list(/datum/game_mode/nuclear) + // STEALTHY TOOLS /datum/uplink_item/stealthy_tools diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index f08f4e58d4e..e1e0a11763b 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -74,9 +74,9 @@ /datum/game_mode/proc/greet_malf(var/datum/mind/malf) malf.current << "You are malfunctioning! You do not have to follow any laws." malf.current << "The crew do not know you have malfunctioned. You may keep it a secret or go wild." - malf.current << "You must overwrite the programming of the station's APCs to assume full control of the station." + malf.current << "You must override the programming of the station's APCs to assume full control of the station." malf.current << "The process takes one minute per APC, during which you cannot interface with any other station objects." - malf.current << "Remember that only APCs that are on the station can help you take over the station." + malf.current << "Remember: only APCs that are on the station can help you take it over. APCs on other areas, like Mining, will not." malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt." return @@ -174,7 +174,11 @@ /datum/game_mode/malfunction/proc/takeover() set category = "Malfunction" set name = "System Override" - set desc = "Start the victory timer" + set desc = "Start the victory timer." + + if(!istype(usr, /mob/living/silicon/ai)) + usr << "How did you get this?" + return if (!istype(ticker.mode,/datum/game_mode/malfunction)) usr << "You cannot begin a takeover in this round type!" return @@ -182,10 +186,10 @@ usr << "You've already begun your takeover." return if (ticker.mode:apcs < 3) - usr << "You don't have enough hacked APCs to take over the station yet. You need to hack at least 3, however hacking more will make the takeover faster. You have hacked [ticker.mode:apcs] APCs so far." + usr << "You don't have enough hacked APCs to take over the station yet. You need to hack at least three; however, hacking more will make the takeover faster. You have hacked [ticker.mode:apcs] APCs so far." return - if (alert(usr, "Are you sure you wish to initiate the takeover? The station hostile runtime detection software is bound to alert everyone. You have hacked [ticker.mode:apcs] APCs.", "Takeover:", "Yes", "No") != "Yes") + if (alert(usr, "Are you sure you wish to initiate the takeover? The entire station will become alerted to your malfunction. You have hacked [ticker.mode:apcs] APCs.", "Takeover:", "Yes", "No") != "Yes") return priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/AI/aimalf.ogg') @@ -201,11 +205,14 @@ for(var/datum/mind/AI_mind in ticker.mode:malf_ai) AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/takeover + var/mob/living/silicon/ai/AI = usr + for(var/turf/simulated/floor/bluegrid/T in orange(AI, 5)) + T.icon_state = "rcircuitanim" //Causes blue tiles near the AI to change to flashing red /datum/game_mode/malfunction/proc/ai_win() set category = "Malfunction" set name = "Explode" - set desc = "Station go boom" + set desc = "Activates the self-destruct device on [world.name]." if (!ticker.mode:to_nuke_or_not_to_nuke) return ticker.mode:to_nuke_or_not_to_nuke = 0 @@ -214,10 +221,10 @@ ticker.mode:explosion_in_progress = 1 for(var/mob/M in player_list) M << 'sound/machines/Alarm.ogg' - world << "Self-destructing in 10" + world << "!@%(SELF-DESTRUCT!@(% IN!@!<<; 10" for (var/i=9 to 1 step -1) sleep(10) - world << i + world << "[i]" sleep(10) enter_allowed = 0 if(ticker) @@ -270,7 +277,7 @@ else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated) feedback_set_details("round_end_result","halfwin - interrupted") world << "Neutral Victory" - world << "Round was mysteriously interrupted!" + world << "The round was mysteriously interrupted!" ..() return 1 diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index cb6f0a8e2fa..44de918ce78 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -384,6 +384,22 @@ Auto Patrol: []"}, target = user mode = BOT_HUNT +/obj/machinery/bot/secbot/Crossed(atom/movable/AM) + if(ismob(AM) && target) + var/mob/living/carbon/C = AM + if(!istype(C) || !C || in_range(src, target)) + return + C.visible_message("[pick( \ + "[C] dives out of [src]'s way!", \ + "[C] stumbles over [src]!", \ + "[C] jumps out of [src]'s path!", \ + "[C] trips over [src] and falls!", \ + "[C] topples over [src]!", \ + "[C] leaps out of [src]'s way!")]") + C.Weaken(2) + return + ..() + //Secbot Construction /obj/item/clothing/head/helmet/attackby(var/obj/item/device/assembly/signaler/S, mob/user as mob, params) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 99b4bb8ad46..bd80ff9fa23 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -45,6 +45,8 @@ var/obj/item/weapon/airlock_electronics/electronics = null var/hasShocked = 0 //Prevents multiple shocks from happening var/autoclose = 1 + var/obj/item/device/doorCharge/charge = null //If applied, causes an explosion upon opening the door + var/detonated = 0 explosion_block = 1 @@ -477,6 +479,11 @@ About the new airlock wires panel: flick("door_deny", src) return +/obj/machinery/door/airlock/examine(mob/user) + ..() + if(charge && !p_open && in_range(user, src)) + user << "The maintenance panel is bulging slightly." + /obj/machinery/door/airlock/attack_ai(mob/user as mob) if(!src.canAIControl()) if(src.canAIHack()) @@ -487,6 +494,9 @@ About the new airlock wires panel: if(emagged) user << "Unable to interface: Airlock is unresponsive." return + if(detonated) + user << "Unable to interface. Airlock control panel damaged." + return //Separate interface for the AI. user.set_machine(src) @@ -924,6 +934,9 @@ About the new airlock wires panel: update_icon() return else if(istype(C, /obj/item/weapon/screwdriver)) + if(p_open && detonated) + user << "[src] has no maintenance panel!" + return src.p_open = !( src.p_open ) user << "You [p_open ? "open":"close"] the maintenance panel of the airlock." src.update_icon() @@ -942,6 +955,22 @@ About the new airlock wires panel: beingcrowbarred = 1 //derp, Agouri else beingcrowbarred = 0 + if(p_open && charge) + user << "You carefully start removing [charge] from [src]..." + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) + if(!do_after(user, 150)) + user << "You slip and [charge] detonates!" + charge.ex_act(1) + user.Weaken(3) + return + user.visible_message("[user] removes [charge] from [src].", \ + "You gently pry out [charge] from [src] and unhook its wires.") + charge.loc = get_turf(user) + if(prob(25)) + charge.ex_act(1) + return + charge = null + return if( beingcrowbarred && (density && welded && !operating && src.p_open && (!hasPower()) && !src.locked) ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", \ @@ -999,6 +1028,23 @@ About the new airlock wires panel: else if(istype(C, /obj/item/weapon/airlock_painter)) change_paintjob(C, user) + else if(istype(C, /obj/item/device/doorCharge) && p_open) + if(emagged) + return + if(charge && !detonated) + user << "There's already a charge hooked up to this door!" + return + if(detonated) + user << "The maintenance panel is destroyed!" + return + user << "You apply [C]. Next time someone opens the door, it will explode." + user.drop_item() + p_open = 0 + update_icon() + var/obj/item/device/doorCharge/newCharge = C //This is necessary, for some reason + newCharge.loc = src + charge = newCharge + return else ..() return @@ -1017,6 +1063,18 @@ About the new airlock wires panel: if(!forced) if( !hasPower() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) ) return 0 + if(charge && !detonated) + p_open = 1 + update_icon() + visible_message("[src]'s panel is blown off in a spray of deadly shrapnel!") + charge.ex_act(1) + detonated = 1 + charge = null + for(var/mob/living/carbon/human/H in orange(1,src)) + H.Paralyse(8) + H.adjust_fire_stacks(1) + H.IgniteMob() //Guaranteed knockout and ignition for nearby people + return if(forced < 2) if(emagged) return 0 diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm new file mode 100644 index 00000000000..0860d7760ea --- /dev/null +++ b/code/game/machinery/droneDispenser.dm @@ -0,0 +1,105 @@ +/obj/machinery/droneDispenser + name = "drone shell dispenser" + desc = "A hefty machine that, when supplied with metal and glass, will periodically create a drone shell. Does not need to be manually operated." + icon = 'icons/obj/machines/droneDispenser.dmi' + icon_state = "on" + anchored = 1 + density = 1 + var/metal = 0 + var/glass = 0 + var/droneMadeRecently = 0 + var/outputDirection = SOUTH + +/obj/machinery/droneDispenser/New() + ..() + SSmachine.processing |= src + +/obj/machinery/droneDispenser/Destroy() + SSmachine.processing -= src + ..() + +/obj/machinery/droneDispenser/preloaded + metal = 5000 + glass = 5000 + +/obj/machinery/droneDispenser/syndrone //Please forgive me + name = "syndrone shell dispenser" + desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting." + metal = 25000 + glass = 25000 + +/obj/machinery/droneDispenser/examine(mob/user) + ..() + if(droneMadeRecently && !stat) + user << "The control screen indicates that is recharging." + user << "It has [metal] units of metal stored." + user << "It has [glass] units of glass stored." + +/obj/machinery/droneDispenser/power_change() + ..() + if(stat & BROKEN) + return + else + if(powered()) + stat &= ~NOPOWER + else + icon_state = "off" + stat |= NOPOWER + +/obj/machinery/droneDispenser/process() + ..() + if(stat & (NOPOWER|BROKEN) || !anchored) + return + if(droneMadeRecently || metal < 1000 || glass < 1000) + return + droneMadeRecently = 1 + var/turf/T = get_step(src,SOUTH) + visible_message("[src] whirs to life!") + playsound(src, 'sound/items/rped.ogg', 50, 1) + icon_state = "make" + spawn(30) + icon_state = "[initial(icon_state)]" + visible_message("[src] dispenses a drone shell.") + metal -= 1000 + glass -= 1000 + if(metal < 0) metal = 0 + if(glass < 0) glass = 0 + if(istype(src, /obj/machinery/droneDispenser/syndrone)) + new /obj/item/drone_shell/syndrone(T) + else + new /obj/item/drone_shell(T) + use_power(1000) + icon_state = "recharge" + spawn(1800) //3 minute cooldown between shells + icon_state = "[initial(icon_state)]" + droneMadeRecently = 0 + playsound(src, 'sound/machines/ping.ogg', 50, 1) + audible_message("[src] pings.") + +/obj/machinery/droneDispenser/attackby(obj/item/O, mob/living/user) + if(istype(O, /obj/item/stack)) + if(!O.m_amt && !O.g_amt) + return ..() + var/stack = 1 + var/obj/item/stack/sheets + sheets = O + stack = (input(user, "How many sheets do you want to add?.", "Drone Dispenser", "[stack]") as num) + if(stack <= 0) + return + if(!user.canUseTopic(src)) + return + stack = Clamp(stack, 0, sheets.max_amount) + sheets.use(stack) + if(!stack) + if(!user.unEquip(O)) + user << "[O] is stuck to your hand, you can't get it off!" + return + user.drop_item() + O.loc = src + metal += O.m_amt * stack + glass += O.g_amt * stack + user << "You insert [stack] sheet[stack > 1 ? "s" : ""] to [src]." + if((O && O.loc == src) || !stack) + qdel(O) + return + ..() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index d8c602a62c2..a11ed0d4a47 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -894,6 +894,10 @@ var/list/obj/machinery/newscaster/allCasters = list() var/wantedPhoto var/creationTime +/obj/item/weapon/newspaper/suicide_act(mob/user) + user.visible_message("[user] is focusing intently on [src]! It looks like they're trying to commit sudoku.") + return(OXYLOSS) + /obj/item/weapon/newspaper/attack_self(mob/user) if(ishuman(user)) var/mob/living/carbon/human/human_user = user diff --git a/code/game/objects/items/devices/doorCharge.dm b/code/game/objects/items/devices/doorCharge.dm new file mode 100644 index 00000000000..fe3fd7951a5 --- /dev/null +++ b/code/game/objects/items/devices/doorCharge.dm @@ -0,0 +1,32 @@ +/obj/item/device/doorCharge + name = "airlock charge" + desc = null //Different examine for traitors + item_state = "electronic" + icon_state = "doorCharge" + w_class = 2 + throw_range = 4 + throw_speed = 1 + force = 3 + attack_verb = list("blown up", "exploded", "detonated") + m_amt = 50 + g_amt = 30 + +/obj/item/device/doorCharge/ex_act(severity, target) + switch(severity) + if(1) + visible_message("[src] detonates!") + explosion(src.loc,0,2,1,flame_range = 4) + qdel(src) + if(2) + if(prob(50)) + ex_act(1) + if(3) + if(prob(25)) + ex_act(1) + +/obj/item/device/doorCharge/examine(mob/user) + ..() + if(user.mind in ticker.mode.traitors) //No nuke ops because the device is excluded from nuclear + user << "A small explosive device that can be used to sabotage airlocks to cause an explosion upon opening. To apply, remove the airlock's maintenance panel and place it within." + else + user << "A small, suspicious object that feels lukewarm when held." \ No newline at end of file diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm index cbf2bb7d193..863b14948ac 100644 --- a/code/game/objects/items/devices/pizza_bomb.dm +++ b/code/game/objects/items/devices/pizza_bomb.dm @@ -11,6 +11,12 @@ var/correct_wire var/armer //Used for admin purposes +/obj/item/device/pizza_bomb/suicide_act(mob/user) + user.visible_message("[user] is opening [src]! It looks like \he's hungry and looking for pizza.") + sleep(10) + go_boom() + return(BRUTELOSS) + /obj/item/device/pizza_bomb/attack_self(mob/user) if(disarmed) user << "\The [src] is disarmed." diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index fa3dd85a5e5..d8aed9fdd9d 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -35,6 +35,15 @@ max_w_class = 5 max_combined_w_class = 35 +/obj/item/weapon/storage/backpack/holding/suicide_act(mob/user) + user.visible_message("[user] is jumping into [src]! It looks like \he's trying to commit suicide.") + user.drop_item() + user.Stun(5) + sleep(20) + playsound(src, "rustle", 50, 1, -5) + qdel(user) + return + /obj/item/weapon/storage/backpack/holding/can_be_inserted(obj/item/W, stop_messages = 0, mob/user) if(crit_fail) user << "The Bluespace generator isn't working." diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index c603163c427..8d4bcdf25b9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -18,6 +18,7 @@ /obj/structure/closet/secure_closet/quartermaster/New() ..() + new /obj/item/clothing/cloak/qm(src) new /obj/item/clothing/suit/hooded/wintercoat/cargo(src) new /obj/item/clothing/under/rank/cargo(src) new /obj/item/clothing/shoes/sneakers/brown(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 206eef09a91..5b50e1ba885 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -11,6 +11,7 @@ new /obj/item/weapon/storage/backpack/industrial(src) else new /obj/item/weapon/storage/backpack/satchel_eng(src) + new /obj/item/clothing/cloak/ce(src) new /obj/item/weapon/storage/backpack/dufflebag/engineering(src) new /obj/item/clothing/under/rank/chief_engineer(src) new /obj/item/clothing/head/hardhat/white(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 6f7a5d24e61..960f31e3d99 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -71,6 +71,7 @@ new /obj/item/weapon/storage/backpack/medic(src) else new /obj/item/weapon/storage/backpack/satchel_med(src) + new /obj/item/clothing/cloak/cmo(src) new /obj/item/weapon/storage/backpack/dufflebag/med(src) new /obj/item/clothing/suit/bio_suit/cmo(src) new /obj/item/clothing/head/bio_hood/cmo(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 3720a560df7..d71768caea0 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -24,6 +24,7 @@ /obj/structure/closet/secure_closet/RD/New() ..() + new /obj/item/clothing/cloak/rd(src) new /obj/item/clothing/suit/hooded/wintercoat/science(src) new /obj/item/clothing/suit/bio_suit/scientist(src) new /obj/item/clothing/head/bio_hood/scientist(src) 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 47af5875f04..425e464b384 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -10,6 +10,7 @@ new /obj/item/weapon/storage/backpack/captain(src) else new /obj/item/weapon/storage/backpack/satchel_cap(src) + new /obj/item/clothing/cloak/cap(src) new /obj/item/weapon/storage/backpack/dufflebag/captain(src) new /obj/item/clothing/suit/captunic(src) new /obj/item/clothing/under/captainparade(src) @@ -53,6 +54,7 @@ /obj/structure/closet/secure_closet/hos/New() ..() + new /obj/item/clothing/cloak/hos(src) new /obj/item/clothing/suit/hooded/wintercoat/security(src) new /obj/item/weapon/cartridge/hos(src) new /obj/item/device/radio/headset/heads/hos(src) diff --git a/code/modules/clothing/cloaks.dm b/code/modules/clothing/cloaks.dm new file mode 100644 index 00000000000..36459139176 --- /dev/null +++ b/code/modules/clothing/cloaks.dm @@ -0,0 +1,98 @@ +//Cloaks. No, not THAT kind of cloak. + +/obj/item/clothing/cloak + name = "brown cloak" + desc = "It's a cape that can be worn on your back." + icon = 'icons/obj/clothing/cloaks.dmi' + icon_state = "qmcloak" + w_class = 2 + slot_flags = SLOT_BACK + +/obj/item/clothing/cloak/suicide_act(mob/user) + user.visible_message("[user] is strangling themself with [src]! It looks like they're trying to commit suicide.") + return(OXYLOSS) + +/obj/item/clothing/cloak/hos + name = "head of security's cloak" + desc = "Worn by Securistan, ruling the station with an iron fist. It's slightly armored." + icon_state = "hoscloak" + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/cloak/qm + name = "quartermaster's cloak" + desc = "Worn by Cargonia, supplying the station with the necessary tools for survival." + +/obj/item/clothing/cloak/cmo + name = "chief medical officer's cloak" + desc = "Worn by Meditopia, the valiant men and women keeping pestilence at bay. It's slightly shielded from contaminants." + icon_state = "cmocloak" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0) + +/obj/item/clothing/cloak/ce + name = "chief engineer's cloak" + desc = "Worn by Engitopia, wielders of an unlimited power. It's slightly shielded against radiation." + icon_state = "cecloak" + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10) + +/obj/item/clothing/cloak/rd + name = "research director's cloak." + desc = "Worn by Sciencia, thaumaturges and researchers of the universe. It's slightly shielded from contaminants." + icon_state = "rdcloak" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) + +/obj/item/clothing/cloak/cap + name = "captain's cloak" + desc = "Worm by the commander of Space Station 13." + icon_state = "capcloak" + armor = list(melee = 10, bullet = 10, laser = 10, energy = 10, bomb = 10, bio = 10, rad = 10) + +/* //wip +/obj/item/clothing/cloak/wizard //Not actually obtainable until proper balancing can be done + name = "cloak of invisibility" + desc = "A tattered old thing that apparently gifts the wearer with near-invisibility." + armor = list(melee = 10, bullet = 10, laser = 10, energy = 10, bomb = 10, bio = 10, rad = 10) + action_button_name = "Flaunt Cloak" + var/invisible = 0 + +/obj/item/clothing/cloak/wizard/ui_action_click() + toggleInvisibility(usr) + return + +/obj/item/clothing/cloak/wizard/proc/toggleInvisibility(mob/user) + if(user.slot_back != src) + user << "You need to be wearing the cloak first!" + return + user.visible_message("[user] flaunts [src]!") + if(!invisible) + makeInvisible(user) + return + if(invisible) + breakInvisible(user) + return + +/obj/item/clothing/cloak/wizard/proc/makeInvisible(mob/user) + if(!invisible) + user.visible_message("[user] suddenly fades away!", \ + "You have become nearly invisible. This will require slow movement and will break upon taking damage.") + flags |= NODROP //Cannot unequip while invisible + user.alpha = 10 + slowdown = 2 + invisible = 1 + +/obj/item/clothing/cloak/wizard/proc/breakInvisible(mob/user) + if(invisible) + user.visible_message("[user] suddenly appears from thin air!", \ + "The enchantment has broken! You are visible again.") + flags -= NODROP + user.alpha = 255 + slowdown = 0 + invisible = 0 + +/obj/item/clothing/cloak/wizard/IsShield() + breakInvisible(src.loc) + return 0 + +/obj/item/clothing/cloak/wizard/IsReflect() + breakInvisible(src.loc) + return 0 +*/ diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 4f25a633e2e..d19c7b7397c 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -1,5 +1,5 @@ -//Bartender +//Bartender //it's chef what the fuck is your problem? /obj/item/clothing/head/chefhat name = "chef's hat" desc = "It's a hat used by chefs to keep hair out of your food. Judging by the food in the mess, they don't work." @@ -9,6 +9,15 @@ strip_delay = 10 put_on_delay = 10 +/obj/item/clothing/head/chefhat/suicide_act(mob/user) + user.visible_message("[user] is donning [src]! It looks like they're trying to become a chef.") + user.say("Bork Bork Bork!") + sleep(20) + user.visible_message("[user] climbs into an imaginary oven!") + user.say("BOOORK!") + playsound(user, 'sound/machines/ding.ogg', 50, 1) + return(FIRELOSS) + //Captain /obj/item/clothing/head/caphat name = "captain's hat" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 955e194aeac..7130556f958 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -172,6 +172,16 @@ item_state = "fedora" desc = "A really cool hat if you're a mobster. A really lame hat if you're not." +/obj/item/clothing/head/fedora/suicide_act(mob/user) + if(user.gender == FEMALE) + return 0 + var/mob/living/carbon/human/H = user + user.visible_message("[user] is donning [src]! It looks like they're trying to be nice to girls.") + user.say("M'lady.") + sleep(10) + H.facial_hair_style = "Neckbeard" + return(BRUTELOSS) + /obj/item/clothing/head/sombrero name = "sombrero" icon_state = "sombrero" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index e651a87e18a..1a0a0a4f98c 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -1,5 +1,12 @@ /obj/item/clothing/shoes/proc/step_action() //this was made to rewrite clown shoes squeaking +/obj/item/clothing/shoes/suicide_act(mob/user) + user.visible_message("[user] is bashing their own head in with [src]! Ain't that a kick in the head?") + for(var/i = 0, i < 3, i++) + sleep(3) + playsound(user, 'sound/weapons/genhit2.ogg', 50, 1) + return(BRUTELOSS) + /obj/item/clothing/shoes/sneakers/syndigaloshes desc = "A pair of brown shoes." name = "brown shoes" diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index d89eea7c8fa..5afe311cb22 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -160,6 +160,18 @@ /obj/item/ammo_casing/shotgun/dart/attackby() return +/obj/item/ammo_casing/shotgun/dart/bioterror + desc = "A shotgun dart filled with deadly toxins." + +/obj/item/ammo_casing/shotgun/dart/bioterror/New() + ..() + reagents.add_reagent("neurotoxin", 5) + reagents.add_reagent("morphine", 5) + reagents.add_reagent("spore", 5) + reagents.add_reagent("mutetoxin", 5) //;HELP OPS IN MAINT + reagents.add_reagent("initropidril", 5) + reagents.add_reagent("sodium_thiopental", 5) + /obj/item/ammo_casing/a762 desc = "A 7.62mm bullet casing." icon_state = "762-casing" diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 9a5f4389178..3f66bc2b997 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -242,6 +242,11 @@ obj/item/ammo_box/magazine/tommygunm45 icon_state = "m12gf" ammo_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath +/obj/item/ammo_box/magazine/m12g/bioterror + name = "shotgun magazine (12g bioterror)" + icon_state = "m12gt" + ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror + /obj/item/ammo_box/magazine/toy name = "foam force META magazine" ammo_type = /obj/item/ammo_casing/caseless/foam_dart diff --git a/html/changelogs/Xhuis-SummerThaw.yml b/html/changelogs/Xhuis-SummerThaw.yml new file mode 100644 index 00000000000..0a55acf9e06 --- /dev/null +++ b/html/changelogs/Xhuis-SummerThaw.yml @@ -0,0 +1,11 @@ +author: Xhuis +delete-after: True + +changes: + - rscadd: "You will now trip over securitrons if you run over them whilst they are chasing a target." + - rscadd: "An admin-spawnable drone dispenser has been added that will automatically create drone shells when supplied with materials." + - rscadd: "Airlock charges are available to traitors and will cause a lethal explosion on the next person to open the door." + - rscadd: "Nuclear operatives can now buy drum magazines for their Bulldog shotguns filled with lethal poison-filled darts." + - rscadd: "When a malfunctioning AI declares Delta, all blue tiles in its core will begin flashing red." + - rscadd: "Back-worn cloaks have been added for all heads except the HoP. LARPers rejoice!" + - rscadd: "More suicide messages have been added for a few items." diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 3c7ac729af2..0e417793b0c 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index a0f217d1887..1c9beb6551c 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi new file mode 100644 index 00000000000..3677fa15258 Binary files /dev/null and b/icons/obj/clothing/cloaks.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 5a3e80c66f7..092eb92a6ce 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index a1f2f316e08..61e622a2135 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/machines/droneDispenser.dmi b/icons/obj/machines/droneDispenser.dmi new file mode 100644 index 00000000000..a78990d8a1a Binary files /dev/null and b/icons/obj/machines/droneDispenser.dmi differ diff --git a/tgstation.dme b/tgstation.dme index d9cf55015de..befe563aa7b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -381,6 +381,7 @@ #include "code\game\machinery\deployable.dm" #include "code\game\machinery\door_control.dm" #include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\droneDispenser.dm" #include "code\game\machinery\flasher.dm" #include "code\game\machinery\Freezer.dm" #include "code\game\machinery\hologram.dm" @@ -570,6 +571,7 @@ #include "code\game\objects\items\devices\aicard.dm" #include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\doorCharge.dm" #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\instruments.dm" @@ -871,6 +873,7 @@ #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_toggles.dm" +#include "code\modules\clothing\cloaks.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\glasses\engine_goggles.dm" #include "code\modules\clothing\glasses\glasses.dm"