mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-14 17:36:52 +01:00
Revolution Improvements (#7878)
- Added a new category to the traitor uplink, which is only available to revolutionaries. - Head Revolutionaries now spawn with an uplink that has 50 TC, they also get an alert telling them to not abuse it. - Revamped the drill dropper into a generic orbital dropper, capable of dropping ANY sort of item you wish it to. - Added a Mech orbital dropper. Added an Armory orbital dropper. - Made loyalty implants display their text correctly when they implant someone. - Added aggression implants, which makes whoever it is implanted into extremely aggressive. Quite useful for starting a revolution. - Added some description_antag to mercenary cipherkeys, informing the reader that the mercenary radio key is :t. - Added a gear crate (not for mercs) which is just six syndicate softsuits. Useful in a pinch.
This commit is contained in:
+3
-1
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -65,4 +65,8 @@
|
||||
|
||||
/datum/uplink_category/gear_loadout
|
||||
name = "Gear Loadout"
|
||||
antag_roles = list(MODE_MERCENARY)
|
||||
antag_roles = list(MODE_MERCENARY)
|
||||
|
||||
/datum/uplink_category/revolution
|
||||
name = "Revolution Items"
|
||||
antag_roles = list(MODE_REVOLUTIONARY)
|
||||
@@ -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. <b>Use the uplink disguised as a station-bounced radio in your backpack to help start your story!</b>"
|
||||
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
|
||||
@@ -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, "<span class='warning'>You can't use this device again!</span>")
|
||||
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, "<span class='warning'>You can't do this so close to the station, point the laser further into the mine!</span>")
|
||||
return
|
||||
if (!isfloor(targloc))
|
||||
to_chat(user, "<span class='warning'>You cannot request a drill on unstable flooring!</span>")
|
||||
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, "<span class='warning'>You can't do this beneath the station, point the laser further away from it!</span>")
|
||||
return
|
||||
if(!(user in (viewers(14,target))) )
|
||||
to_chat(user, "<span class='warning'>You can't paint the target that far away!</span>")
|
||||
return
|
||||
if (!user.IsAdvancedToolUser())
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
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 class='notice'>You paint the target at [target].</span>")
|
||||
|
||||
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("<span class='danger'>The drill parts crash through the roof!</span>")
|
||||
has_crashed = TRUE
|
||||
if(aboveturfleft)
|
||||
if(!aboveturfleft.is_hole)
|
||||
aboveturfleft.ChangeTurf(/turf/space)
|
||||
if(!has_crashed)
|
||||
target.visible_message("<span class='danger'>The drill parts crash through the roof!</span>")
|
||||
has_crashed = TRUE
|
||||
if(aboveturfright)
|
||||
if(!aboveturfright.is_hole)
|
||||
aboveturfright.ChangeTurf(/turf/space)
|
||||
if(!has_crashed)
|
||||
target.visible_message("<span class='danger'>The drill parts crash through the roof!</span>")
|
||||
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, "<span class='danger'>You override \the [src]'s area safety checks!</span>")
|
||||
return 1
|
||||
else
|
||||
to_chat(user, "<span class='danger'>\The [src]'s area safety checks have already been disabled.</span>")
|
||||
@@ -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 <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[target.x];Y=[target.y];Z=[target.z]'>JMP</a>.")
|
||||
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."))
|
||||
@@ -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"
|
||||
@@ -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."
|
||||
@@ -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
|
||||
@@ -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()
|
||||
. = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Aggression Implant<BR>
|
||||
<b>Life:</b> N/A.<BR>
|
||||
<b>Important Notes:</b> Users injected with this device get increasingly angry to a breaking point. Users tend to expire before the implant does.<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b><BR>
|
||||
<b>Function:</b> Contains a small pod of nanobots that manipulate the host's mental functions.<BR>
|
||||
<b>Integrity:</b> 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--
|
||||
|
||||
@@ -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
|
||||
@@ -778,4 +778,15 @@
|
||||
|
||||
/obj/item/storage/box/fountainpens
|
||||
name = "box of fountain pens"
|
||||
starts_with = list(/obj/item/pen/fountain = 7)
|
||||
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)
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
@@ -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."
|
||||
@@ -0,0 +1,5 @@
|
||||
"a" = (/mob/living/heavy_vehicle/premade/combat,/turf/simulated/floor/reinforced/airless,/area/security/armoury)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
"}
|
||||
@@ -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
|
||||
"}
|
||||
@@ -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
|
||||
"}
|
||||
Reference in New Issue
Block a user