diff --git a/aurorastation.dme b/aurorastation.dme index b651b6b17b7..a698d829b80 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -348,6 +348,7 @@ #include "code\datums\uplink\implants.dm" #include "code\datums\uplink\medical.dm" #include "code\datums\uplink\ninja_modules.dm" +#include "code\datums\uplink\revolution.dm" #include "code\datums\uplink\specialty.dm" #include "code\datums\uplink\stealth and camouflage items.dm" #include "code\datums\uplink\stealthy and inconspicuous weapons.dm" @@ -761,7 +762,6 @@ #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\debugger.dm" #include "code\game\objects\items\devices\dociler.dm" -#include "code\game\objects\items\devices\drilldroptargetter.dm" #include "code\game\objects\items\devices\flash.dm" #include "code\game\objects\items\devices\floor_painter.dm" #include "code\game\objects\items\devices\hacktool.dm" @@ -792,6 +792,8 @@ #include "code\game\objects\items\devices\uplink_random_lists.dm" #include "code\game\objects\items\devices\violin.dm" #include "code\game\objects\items\devices\whistle.dm" +#include "code\game\objects\items\devices\drop_targeter\_droptargeter.dm" +#include "code\game\objects\items\devices\drop_targeter\orbital_drops.dm" #include "code\game\objects\items\devices\lighting\flare.dm" #include "code\game\objects\items\devices\lighting\flashlight.dm" #include "code\game\objects\items\devices\lighting\glowstick.dm" diff --git a/code/datums/outfits/outfit_antag.dm b/code/datums/outfits/outfit_antag.dm index 19f5341c133..5e8022a2f32 100644 --- a/code/datums/outfits/outfit_antag.dm +++ b/code/datums/outfits/outfit_antag.dm @@ -142,7 +142,7 @@ rig.dnaLock = H.dna H.equip_to_slot_or_del(rig, slot_l_hand) - H.equip_to_slot_or_del(new /obj/item/device/ninja_uplink(H, H.mind), slot_l_store) + H.equip_to_slot_or_del(new /obj/item/device/special_uplink/ninja(H, H.mind), slot_l_store) /datum/outfit/admin/syndicate/mercenary name = "Mercenary" diff --git a/code/datums/trading/ai.dm b/code/datums/trading/ai.dm index 8dc250236ec..7bf05d2fc0f 100644 --- a/code/datums/trading/ai.dm +++ b/code/datums/trading/ai.dm @@ -50,7 +50,7 @@ They sell generic supplies and ask for generic supplies. /obj/item/device/contract_uplink = TRADER_BLACKLIST, // Traitor stuff /obj/item/device/uplink = TRADER_BLACKLIST_ALL, // Traitor stuff /obj/item/device/announcer = TRADER_BLACKLIST, // Rev item - /obj/item/device/ninja_uplink = TRADER_BLACKLIST, // Ninja item + /obj/item/device/special_uplink = TRADER_BLACKLIST, /obj/item/device/onetankbomb = TRADER_BLACKLIST, // Not weapons trader /obj/item/device/kinetic_analyzer = TRADER_BLACKLIST, // Not KA trader /obj/item/device/camera = TRADER_BLACKLIST_SUB, // a lot of ai/drone/cyborg/fluff items diff --git a/code/datums/uplink/revolution.dm b/code/datums/uplink/revolution.dm new file mode 100644 index 00000000000..965ac304510 --- /dev/null +++ b/code/datums/uplink/revolution.dm @@ -0,0 +1,32 @@ +/datum/uplink_item/item/revolution + category = /datum/uplink_category/revolution + +/datum/uplink_item/item/revolution/armory + name = "Armory Dropper" + desc = "A device that can be used to drop in an armory-worth of guns. Can only be used outside station areas, unless emagged, which is hazardous." + item_cost = 45 + path = /obj/item/device/orbital_dropper/armory/syndicate + +/datum/uplink_item/item/revolution/mecha + name = "Mecha Dropper" + desc = "A device that can be used to drop in a combat exosuit. Can only be used outside station areas, unless emagged, which is hazardous." + item_cost = 40 + path = /obj/item/device/orbital_dropper/mecha + +/datum/uplink_item/item/revolution/implants + name = "Box of Aggression Implants" + desc = "A box containing implants that will make their owners increasingly aggressive." + item_cost = 10 + path = /obj/item/storage/box/aggression + +/datum/uplink_item/item/revolution/encryption_keys + name = "Box of Encryption Keys" + desc = "A box of encryption keys that gives the user a safe channel to chatter in. Access safe channel with :x." + item_cost = 15 + path = /obj/item/storage/box/encryption_key + +/datum/uplink_item/item/revolution/softsuits + name = "Crate of Softsuits" + desc = "A crate containing six softsuits, their helmets, and oxygen tanks. Useful for getting out of a pinch." + item_cost = 10 + path = /obj/structure/closet/crate/secure/gear_loadout/syndicate_softsuits \ No newline at end of file diff --git a/code/datums/uplink/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm index 7fd6485c266..20360fc5edf 100644 --- a/code/datums/uplink/uplink_categories.dm +++ b/code/datums/uplink/uplink_categories.dm @@ -65,4 +65,8 @@ /datum/uplink_category/gear_loadout name = "Gear Loadout" - antag_roles = list(MODE_MERCENARY) \ No newline at end of file + antag_roles = list(MODE_MERCENARY) + +/datum/uplink_category/revolution + name = "Revolution Items" + antag_roles = list(MODE_REVOLUTIONARY) \ No newline at end of file diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm index 32290b6e4f2..868012d1209 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/code/game/antagonist/station/revolutionary.dm @@ -7,7 +7,7 @@ var/datum/antagonist/revolutionary/revs bantype = "revolutionary" feedback_tag = "rev_objective" antag_indicator = "rev_head" - welcome_text = "Down with the capitalists! Down with the Bourgeoise!" + welcome_text = "You are a Head Revolutionary! Your goal is to create and progress a story. Use the uplink disguised as a station-bounced radio in your backpack to help start your story!" victory_text = "The heads of staff were relieved of their posts! The revolutionaries win!" loss_text = "The heads of staff managed to stop the revolution!" victory_feedback_tag = "win - heads killed" @@ -26,7 +26,7 @@ var/datum/antagonist/revolutionary/revs faction_verb = /mob/living/proc/convert_to_rev faction_welcome = "Help the cause overturn the ruling class. Do not harm your fellow freedom fighters." faction_indicator = "rev" - faction_invisible = 1 + faction_invisible = TRUE restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Security Cadet", "Warden", "Detective", "Forensic Technician", "Head of Personnel", "Chief Engineer", "Research Director", "Chief Medical Officer", "Captain", "Head of Security", "Internal Affairs Agent") @@ -41,7 +41,7 @@ var/datum/antagonist/revolutionary/revs return global_objectives = list() for(var/mob/living/carbon/human/player in mob_list) - if(!player.mind || player.stat==2 || !(player.mind.assigned_role in command_positions)) + if(!player.mind || player.stat == DEAD || !(player.mind.assigned_role in command_positions)) continue var/datum/objective/rev/rev_obj = new rev_obj.target = player.mind @@ -50,18 +50,26 @@ var/datum/antagonist/revolutionary/revs /datum/antagonist/revolutionary/can_become_antag(var/datum/mind/player) if(!..()) - return 0 + return FALSE for(var/obj/item/implant/loyalty/L in player.current) - if(L && (L.imp_in == player.current)) - return 0 - return 1 + if(L?.imp_in == player.current) + return FALSE + return TRUE /datum/antagonist/revolutionary/equip(var/mob/living/carbon/human/player) if(!..()) - return 0 + return FALSE + if(!player.back) + player.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(player), slot_back) // if they have no backpack, spawn one player.equip_to_slot_or_del(new /obj/item/device/announcer(player), slot_in_backpack) + player.equip_to_slot_or_del(new /obj/item/device/special_uplink/rev(player), slot_in_backpack) give_codewords(player) - return 1 + alert(player, "As a Head Revolutionary, you are given an uplink with a lot of telecrystals. \ + Your goal is to create and progress a story. Use the announcement device you spawn with to whip people into a frenzy, \ + and the uplink disguised as a radio to equip them. DO NOT PLAY THIS ROLE AS A SUPER TRAITOR. \ + Doing so may lead to administrative action being taken.", + "Antagonist Introduction", "I understand.") + return TRUE \ No newline at end of file diff --git a/code/game/objects/items/devices/drilldroptargetter.dm b/code/game/objects/items/devices/drilldroptargetter.dm deleted file mode 100644 index 2b485220adf..00000000000 --- a/code/game/objects/items/devices/drilldroptargetter.dm +++ /dev/null @@ -1,118 +0,0 @@ -/obj/item/device/drill_dropper - name = "laser targeting dropper" - desc = "This drill literally pierces the heavens." - icon = 'icons/obj/device.dmi' - icon_state = "drillpointer" - item_state = "binoculars" - slot_flags = SLOT_BELT - w_class = 2 - var/has_dropped = 0 - var/tileoffset = 8 - var/viewsize = 7 - var/emagged = FALSE - -/obj/item/device/drill_dropper/attack_self(mob/user) - zoom(user,tileoffset,viewsize) - -/obj/item/device/drill_dropper/attack(mob/living/M, mob/user) - laser_act(M, user) - -/obj/item/device/drill_dropper/afterattack(var/atom/target, var/mob/living/user, flag, params) - if(flag) //we're placing the object on a table or in backpack - return - laser_act(target, user) - -/obj/item/device/drill_dropper/proc/laser_act(var/atom/target, var/mob/living/user) - - if(has_dropped >= 2) - to_chat(user, "You can't use this device again!") - return - - var/turf/targloc = get_turf(target) - if(!emagged) - for(var/turf/t in block(locate(targloc.x+2,targloc.y+2,targloc.z),locate(targloc.x-2,targloc.y-2,targloc.z))) - if (!istype(t.loc, /area/mine)) - to_chat(user, "You can't do this so close to the station, point the laser further into the mine!") - return - if (!isfloor(targloc)) - to_chat(user, "You cannot request a drill on unstable flooring!") - return - for(var/turf/t2 in block(locate(targloc.x+2,targloc.y+2,targloc.z+1),locate(targloc.x-2,targloc.y-2,targloc.z+1))) - if (!istype(t2.loc, /area/mine)) - to_chat(user, "You can't do this beneath the station, point the laser further away from it!") - return - if(!(user in (viewers(14,target))) ) - to_chat(user, "You can't paint the target that far away!") - return - if (!user.IsAdvancedToolUser()) - to_chat(user, "You don't have the dexterity to do this!") - return - add_fingerprint(user) - - //laser pointer image - icon_state = "drillpointer_on" - var/list/showto = list() - for(var/mob/M in viewers(targloc)) - if(M.client) - showto += M.client - var/image/I = image('icons/obj/projectiles.dmi',targloc,"red_laser",10) - I.pixel_x = target.pixel_x + rand(-5,5) - I.pixel_y = target.pixel_y + rand(-5,5) - - to_chat(user, "You paint the target at [target].") - - var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null) - announcer.config(list("Supply" = 0, "Common" = 0)) - if(announcer) - if(!emagged) - announcer.autosay("Stand by for drillfall, ETA ten seconds, clear the targetted area.", "Mining Requests Console", "Supply") - else - announcer.autosay("St%n^ b* for dr$llfa#l, ETA t@n s*c%&ds, RUN.", "Mining Requests Console", "Common") - - has_dropped++ - addtimer(CALLBACK(GLOBAL_PROC, /proc/explosion, targloc, 1, 2, 4, 6), 100) //YEEHAW - addtimer(CALLBACK(src, .proc/drill_drop, targloc), 105) - - flick_overlay(I, showto, 20) //2 seconds of the red dot appearing - icon_state = "drillpointer" - -/obj/item/device/drill_dropper/proc/drill_drop(var/turf/target) - - var/turf/lefttarget = locate(target.x-1, target.y, target.z) - var/turf/righttarget = locate(target.x+1, target.y, target.z) - - var/turf/aboveturfleft = GetAbove(lefttarget) - var/turf/aboveturf = GetAbove(target) - var/turf/aboveturfright = GetAbove(righttarget) - - var/has_crashed = FALSE - - if(aboveturf) - if(!aboveturf.is_hole) - aboveturf.ChangeTurf(/turf/space) - target.visible_message("The drill parts crash through the roof!") - has_crashed = TRUE - if(aboveturfleft) - if(!aboveturfleft.is_hole) - aboveturfleft.ChangeTurf(/turf/space) - if(!has_crashed) - target.visible_message("The drill parts crash through the roof!") - has_crashed = TRUE - if(aboveturfright) - if(!aboveturfright.is_hole) - aboveturfright.ChangeTurf(/turf/space) - if(!has_crashed) - target.visible_message("The drill parts crash through the roof!") - has_crashed = TRUE - - new /obj/machinery/mining/brace(lefttarget) - new /obj/machinery/mining/drill(target) - new /obj/machinery/mining/brace(righttarget) - -/obj/item/device/drill_dropper/emag_act(var/remaining_charges, var/mob/user) - if(!emagged) - emagged = TRUE - to_chat(user, "You override \the [src]'s area safety checks!") - return 1 - else - to_chat(user, "\The [src]'s area safety checks have already been disabled.") diff --git a/code/game/objects/items/devices/drop_targeter/_droptargeter.dm b/code/game/objects/items/devices/drop_targeter/_droptargeter.dm new file mode 100644 index 00000000000..9c283550e6c --- /dev/null +++ b/code/game/objects/items/devices/drop_targeter/_droptargeter.dm @@ -0,0 +1,100 @@ +/obj/item/device/orbital_dropper + name = "laser targeting dropper" + desc = "A device used to paint a target, which will then promptly orbitally drop the requested items." + icon = 'icons/obj/device.dmi' + icon_state = "drillpointer" + item_state = "binoculars" + slot_flags = SLOT_BELT + w_class = ITEMSIZE_SMALL + var/has_dropped = 0 // Counter of how many times the targeter has been used + var/drop_amount = 2 // How many times can this item be used? + + var/tileoffset = 8 // How far can you zoom with these binocular targeters + var/viewsize = 7 // How large the view is when you zoom + + var/paint_distance = 14 // From how far away can you paint a target? + + var/emagged = FALSE // If emagged, things can be dropped in on station areas + + var/drop_message = "Orbital package inbound, clear the targetted area immediately!" + var/drop_message_emagged = "O*b$ital p&ck@ge in#)und, c-c-c-!" + var/announcer_name = "Mining Requests Console" + var/announcer_channel = "Supply" // If not emagged, will announce to this channel. If emagged, will always announce on the common channel. + + var/template_name + +/obj/item/device/orbital_dropper/attack_self(mob/user) + zoom(user, tileoffset, viewsize) + +/obj/item/device/orbital_dropper/attack(mob/living/M, mob/user) + laser_act(M, user) + +/obj/item/device/orbital_dropper/afterattack(var/atom/target, var/mob/living/user, flag, params) + if(flag) //we're placing the targetter on a table or in backpack + return + laser_act(target, user) + +/obj/item/device/orbital_dropper/proc/laser_act(var/atom/target, var/mob/living/user) + if(has_dropped >= drop_amount) + to_chat(user, span("warning", "You can't use this device again!")) + return + + var/turf/targloc = get_turf(target) + if(!emagged) + for(var/turf/t in block(locate(targloc.x+3,targloc.y+3,targloc.z), locate(targloc.x-3,targloc.y-3,targloc.z))) + if (!istype(t.loc, /area/mine)) + to_chat(user, span("warning", "You can't do this so close to the station, point the laser further into the mine!")) + return + if (!isfloor(targloc)) + to_chat(user, span("warning", "You cannot request this on unstable flooring!")) + return + if(!(user in (viewers(paint_distance, target))) ) + to_chat(user, span("warning", "You can't paint the target that far away!")) + return + if (!user.IsAdvancedToolUser()) + to_chat(user, span("warning", "You don't have the dexterity to do this!")) + return + add_fingerprint(user) + + //laser pointer image + icon_state = "drillpointer_on" + var/list/showto = list() + for(var/mob/M in viewers(targloc)) + if(M.client) + showto += M.client + var/image/I = image('icons/obj/projectiles.dmi', targloc, "red_laser", 10) + I.pixel_x = target.pixel_x + rand(-5,5) + I.pixel_y = target.pixel_y + rand(-5,5) + + to_chat(user, span("notice", "You paint the target at [target].")) + + var/obj/item/device/radio/intercom/announcer = new /obj/item/device/radio/intercom(null) + announcer.config(list("Common" = FALSE, "Entertainment" = FALSE, "Response Team" = FALSE, "Science" = FALSE, "Command" = FALSE, "Medical" = FALSE, "Engineering" = FALSE, "Security" = FALSE, "Supply" = FALSE, "Service" = FALSE, "Mercenary" = FALSE, "Raider" = FALSE, "Ninja" = FALSE, "AI Private" = FALSE)) + if(announcer) + if(!emagged) + announcer.autosay(drop_message, announcer_name, announcer_channel) + else + announcer.autosay(drop_message_emagged, announcer_name, "Common") + + has_dropped++ + addtimer(CALLBACK(GLOBAL_PROC, /proc/explosion, targloc, 1, 2, 4, 6), 100) //YEEHAW + addtimer(CALLBACK(src, .proc/orbital_drop, targloc, user), 105) + + flick_overlay(I, showto, 20) //2 seconds of the red dot appearing + icon_state = "drillpointer" + +/obj/item/device/orbital_dropper/proc/orbital_drop(var/turf/target, var/user) + var/dmm_suite/maploader = new + if(!maploader) + log_debug("Error, unable to load maploader in proc orbital_drop!") + return + log_and_message_admins("[key_name_admin(src)] has used a [src] at JMP.") + maploader.load_map(file("maps/templates/orbital/" + template_name), target.x, target.y, target.z, no_changeturf = TRUE) + +/obj/item/device/orbital_dropper/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + emagged = TRUE + to_chat(user, span("danger", "You override \the [src]'s area safety checks!")) + return TRUE + else + to_chat(user, span("danger", "\The [src]'s area safety checks have already been disabled.")) \ No newline at end of file diff --git a/code/game/objects/items/devices/drop_targeter/orbital_drops.dm b/code/game/objects/items/devices/drop_targeter/orbital_drops.dm new file mode 100644 index 00000000000..e8f9dcf84ab --- /dev/null +++ b/code/game/objects/items/devices/drop_targeter/orbital_drops.dm @@ -0,0 +1,39 @@ +/obj/item/device/orbital_dropper/drill + name = "drill dropper" + desc = "A device used to paint a target, which will then promptly orbitally drop the requested items. This drill literally pierces the heavens." + + drop_message = "Stand by for drillfall, ETA ten seconds, clear the targetted area." + drop_message_emagged = "St%n^ b* for dr$llfa#l, ETA t@n s*c%&ds, RUN." + + template_name = "drill.dmm" + +/obj/item/device/orbital_dropper/mecha + name = "mecha dropper" + desc = "A device used to paint a target, which will then promptly orbitally drop the requested items. This one feels vaguely familiar..." + + drop_amount = 1 + + drop_message = "Mech coming in hot!" + drop_message_emagged = "Mech comin- SHIT! WHO PAINTED THAT?" + announcer_name = "Respawn Mech Industries" + announcer_channel = "Common" + + template_name = "combat-mecha.dmm" + +/obj/item/device/orbital_dropper/armory + name = "armory dropper" + desc = "A device used to paint a target, which will then promptly orbitally drop the requested items. Who's ready to raise hell?" + + drop_amount = 1 + + drop_message = "The cavalry has arrived!" + drop_message_emagged = "The cav-cav-cav-BzzzZZTTT!" + announcer_name = "GunCourier Industries Autodrone" + announcer_channel = "Common" + + template_name = "mini-armory.dmm" + +/obj/item/device/orbital_dropper/armory/syndicate + description_antag = "This is a stealthy variant of the standard armory orbital drop. It will not report itself dropping on common, unless emagged." + announcer_name = "Syndicate Autodrone" + announcer_channel = "Mercenary" \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 8f3d3449bc0..14213e86d89 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -19,6 +19,7 @@ icon_state = "cypherkey" channels = list("Mercenary" = 1) origin_tech = list(TECH_ILLEGAL = 3) + description_antag = "An encryption key that allows you to intercept comms and speak on private non-station channels. Use :t to access the private channel." syndie = 1//Signifies that it de-crypts Syndicate transmissions /obj/item/device/encryptionkey/raider @@ -149,3 +150,10 @@ /obj/item/device/encryptionkey/entertainment name = "entertainment radio key" channels = list("Entertainment" = 1) + +/obj/item/device/encryptionkey/rev + name = "standard encryption key" + desc = "An encryption key for a radio headset. Contains cypherkeys." + channels = list("Raider" = 1) + origin_tech = list(TECH_ILLEGAL = 2) + description_antag = "An encryption key that allows you to speak on private non-station channels. Use :x to access the private channel." \ No newline at end of file diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index d87e79d128f..c7e59010789 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -387,21 +387,34 @@ A list of items and costs is stored under the datum of every game mode, alongsid discord_bot.send_to_cciaa("Announcer - Fake announcement:`[title]` - `[message]`, sent by [user]!") qdel(src) -//ninja -/obj/item/device/ninja_uplink - name = "infiltrator uplink" - desc = "A small device used for access to a restricted cache of specialized items." +/obj/item/device/special_uplink + name = "special uplink" + desc = "A small device with knobs and switches." + description_antag = "This is hidden uplink! Use it in-hand to access the uplink interface and spend telecrystals to beam in items. Make sure to do it in private, it could look suspicious!" icon = 'icons/obj/radio.dmi' icon_state = "radio" flags = CONDUCT - w_class = 2 + w_class = ITEMSIZE_SMALL + var/starting_telecrystals // how much telecrystals the uplink should spawn with, defaults to default amount if not set -/obj/item/device/ninja_uplink/New(var/loc, var/mind) +/obj/item/device/special_uplink/New(var/loc, var/mind) ..() hidden_uplink = new(src, mind) - hidden_uplink.uses = DEFAULT_TELECRYSTAL_AMOUNT + if(!starting_telecrystals) + hidden_uplink.uses = DEFAULT_TELECRYSTAL_AMOUNT + else + hidden_uplink.uses = starting_telecrystals hidden_uplink.nanoui_menu = 1 -/obj/item/device/ninja_uplink/attack_self(mob/user as mob) - if (hidden_uplink) +/obj/item/device/special_uplink/attack_self(mob/user as mob) + if(hidden_uplink) hidden_uplink.trigger(user) + +/obj/item/device/special_uplink/ninja + name = "infiltrator uplink" + +/obj/item/device/special_uplink/rev + name = "station bounced radio" + desc = null // SBRs have no desc + icon_state = "walkietalkie" // more incognito + starting_telecrystals = DEFAULT_TELECRYSTAL_AMOUNT * 2 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 222d930157d..00711071b1d 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -393,10 +393,6 @@ the implant may become unstable and either pre-maturely inject the subject or si spawn(20) malfunction-- -/obj/item/implant/loyalty/implanted(mob/source as mob) - //mobname = source.real_name - return 1 - /obj/item/implant/loyalty/ipc name = "loyalty chip" desc = "A device that sets directives programmed for loyalty to NanoTrasen on the synthetic subject. Will not work on organics." @@ -576,3 +572,57 @@ the implant may become unstable and either pre-maturely inject the subject or si /obj/item/implant/compressed/islegal() return 0 + +/obj/item/implant/aggression + name = "aggression implant" + desc = "An implant that microdoses its user with chemicals that induce anger." + +/obj/item/implant/aggression/get_data() + . = {" + Implant Specifications:
+ Name: Aggression Implant
+ Life: N/A.
+ Important Notes: Users injected with this device get increasingly angry to a breaking point. Users tend to expire before the implant does.
+
+ Implant Details:
+ Function: Contains a small pod of nanobots that manipulate the host's mental functions.
+ Integrity: Implant will last so long as the nanobots are inside the bloodstream."} + +/obj/item/implant/aggression/implanted(mob/M) + if(!istype(M, /mob/living/carbon/human)) + return FALSE + + var/mob/living/carbon/human/H = M + + for(var/obj/item/implant/loyalty/I in H) + if(I.implanted) + to_chat(H, span("danger", "Rage surges through your body, but the nanobots from your loyalty implant stop it soon after it starts!")) + return TRUE + + var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role) + if(antag_data?.flags & ANTAG_IMPLANT_IMMUNE) + H.visible_message("[H] seems to resist the implant!", "You feel rage overtake your body, but you manage to fend it off by sheer will!") + log_and_message_admins("[key_name(H)] was implanted by an aggression implant, but was not effected.", H) + else if(antag_data?.id == MODE_LOYALIST) + clear_antag_roles(H.mind, 1) + to_chat(H, span("danger", "You feel a surge of rage override your loyalty!")) + log_and_message_admins("[key_name(H)] was implanted by an aggression implant, clearing their loyalist status!", H) + else + to_chat(H, span("danger", "You feel a surge of rage course through your body and very soul!")) + log_and_message_admins("[key_name(H)] was implanted by an aggression implant!", H) + return TRUE + +/obj/item/implant/aggression/emp_act(severity) + if(malfunction) + return + malfunction = MALFUNCTION_TEMPORARY + + activate("emp") + if(severity == 1) + if(prob(50)) + meltdown() + else if(prob(50)) + malfunction = MALFUNCTION_PERMANENT + return + spawn(20) + malfunction-- diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index 20791080cf8..1cf50ec3d5b 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -159,3 +159,14 @@ src.imp = new /obj/item/implant/health( src ) ..() return + + +/obj/item/implantcase/aggression + name = "glass case - 'aggression'" + desc = "A case containing an aggression inducing implant." + icon_state = "implantcase-b" + +/obj/item/implantcase/aggression/New() + src.imp = new /obj/item/implant/aggression(src) + ..() + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index e2672178a8f..0c59394e960 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -778,4 +778,15 @@ /obj/item/storage/box/fountainpens name = "box of fountain pens" - starts_with = list(/obj/item/pen/fountain = 7) \ No newline at end of file + starts_with = list(/obj/item/pen/fountain = 7) + +/obj/item/storage/box/aggression + name = "box" + description_antag = "This box contains various implants that will make their owners increasingly aggressive." + max_storage_space = 12 + starts_with = list(/obj/item/implantcase/aggression = 6, /obj/item/implanter = 1, /obj/item/implantpad = 1) + +/obj/item/storage/box/encryption_key + name = "box" + description_antag = "This box contains encryption keys that gives the user a safe channel to chatter in. Access the safe comms with :x." + starts_with = list(/obj/item/device/encryptionkey/rev = 8) \ No newline at end of file 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 e0dea9a2bc5..3617295aed2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -44,7 +44,7 @@ new /obj/item/clothing/head/soft(src) new /obj/item/modular_computer/tablet/preset/custom_loadout/advanced/cargo_delivery(src) new /obj/item/export_scanner(src) - new /obj/item/device/drill_dropper(src) + new /obj/item/device/orbital_dropper/drill(src) /obj/structure/closet/secure_closet/merchant name = "merchant locker" diff --git a/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm b/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm index 14ad84dd512..2924823c1f3 100644 --- a/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm +++ b/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm @@ -153,3 +153,12 @@ new /obj/item/ammo_magazine/c762/sol(src) new /obj/item/gun/projectile/pistol/sol(src) new /obj/item/ammo_magazine/mc9mm(src) + +/obj/structure/closet/crate/secure/gear_loadout/syndicate_softsuits + req_access = list() + +/obj/structure/closet/crate/secure/gear_loadout/syndicate_softsuits/fill() + for(var/i in 1 to 6) + new /obj/item/clothing/head/helmet/space/syndicate/black/orange(src) + new /obj/item/clothing/suit/space/syndicate/black/orange(src) + new /obj/item/tank/emergency_oxygen/double(src) \ No newline at end of file diff --git a/html/changelogs/geeves - bigdaddyrev.yml b/html/changelogs/geeves - bigdaddyrev.yml new file mode 100644 index 00000000000..c488dd937b5 --- /dev/null +++ b/html/changelogs/geeves - bigdaddyrev.yml @@ -0,0 +1,13 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Added a new category to the traitor uplink, which is only available to revolutionaries." + - rscadd: "Head Revolutionaries now spawn with an uplink that has 50 TC, they also get an alert telling them to not abuse it." + - rscadd: "Revamped the drill dropper into a generic orbital dropper, capable of dropping ANY sort of item you wish it to." + - rscadd: "Added a Mech orbital dropper. Added an Armory orbital dropper." + - bugfix: "Made loyalty implants display their text correctly when they implant someone." + - rscadd: "Added aggression implants, which makes whoever it is implanted into extremely aggressive. Quite useful for starting a revolution." + - rscadd: "Added some description_antag to mercenary cipherkeys, informing the reader that the mercenary radio key is :t." + - rscadd: "Added a gear crate (not for mercs) which is just six syndicate softsuits. Useful in a pinch." diff --git a/maps/templates/orbital/combat-mecha.dmm b/maps/templates/orbital/combat-mecha.dmm new file mode 100644 index 00000000000..8b17f237785 --- /dev/null +++ b/maps/templates/orbital/combat-mecha.dmm @@ -0,0 +1,5 @@ +"a" = (/mob/living/heavy_vehicle/premade/combat,/turf/simulated/floor/reinforced/airless,/area/security/armoury) + +(1,1,1) = {" +a +"} diff --git a/maps/templates/orbital/drill.dmm b/maps/templates/orbital/drill.dmm new file mode 100644 index 00000000000..068e6fade55 --- /dev/null +++ b/maps/templates/orbital/drill.dmm @@ -0,0 +1,9 @@ +"a" = (/turf/simulated/floor/reinforced/airless,/area/mine/explored) +"b" = (/obj/machinery/mining/brace,/turf/simulated/floor/reinforced/airless,/area/mine/explored) +"c" = (/obj/machinery/mining/drill,/turf/simulated/floor/reinforced/airless,/area/mine/explored) + +(1,1,1) = {" +aaa +bcb +aaa +"} diff --git a/maps/templates/orbital/mini-armory.dmm b/maps/templates/orbital/mini-armory.dmm new file mode 100644 index 00000000000..47eb70d7369 --- /dev/null +++ b/maps/templates/orbital/mini-armory.dmm @@ -0,0 +1,13 @@ +"a" = (/obj/structure/table/rack,/obj/item/gun/projectile/automatic/mini_uzi,/obj/item/gun/projectile/silenced,/turf/simulated/floor/reinforced/airless,/area/security/armoury) +"b" = (/turf/simulated/floor/reinforced/airless,/area/security/armoury) +"c" = (/obj/structure/table/rack,/obj/item/gun/energy/rifle/icelance,/obj/item/gun/projectile/shotgun/pump/combat,/turf/simulated/floor/reinforced/airless,/area/security/armoury) +"d" = (/obj/structure/table/rack,/obj/item/gun/projectile/dragunov,/obj/item/gun/energy/rifle/icelance,/turf/simulated/floor/reinforced/airless,/area/security/armoury) +"e" = (/obj/structure/table/rack,/obj/item/gun/projectile/tanto,/obj/item/gun/projectile/automatic/mini_uzi,/turf/simulated/floor/reinforced/airless,/area/security/armoury) +"f" = (/obj/structure/table/rack,/obj/item/gun/projectile/shotgun/pump/combat,/obj/item/gun/projectile/tanto,/turf/simulated/floor/reinforced/airless,/area/security/armoury) +"g" = (/obj/structure/table/rack,/obj/item/gun/projectile/automatic/rifle/sts35,/obj/item/gun/projectile/silenced,/turf/simulated/floor/reinforced/airless,/area/security/armoury) + +(1,1,1) = {" +abc +dbe +fbg +"}