Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
0a996b6
ERT uplink init
ynot01 Aug 18, 2022
277e173
add oxy tank to ert backpack
ynot01 Aug 18, 2022
37bb4f1
add ds hardsuits & fix m1911 mag
ynot01 Aug 18, 2022
b3c181a
set to just "Commander"
ynot01 Aug 18, 2022
a382c5c
adds eshield, teleshield, and ds mask to uplink
ynot01 Aug 18, 2022
2761cde
add medbeam gun, remove duplicate
ynot01 Aug 18, 2022
1b781c9
restrict discounts & limit stock
ynot01 Aug 18, 2022
bd044e8
fix wt dupe
ynot01 Aug 18, 2022
d803492
makes the tommygun wildly inaccurate
ynot01 Aug 18, 2022
fa7ca9a
tommy cheaper cause inaccurate also desc
ynot01 Aug 18, 2022
f9e67d9
lets you have two tommy guns
ynot01 Aug 18, 2022
749cb49
makes toolbelt 1 wc
ynot01 Aug 18, 2022
34a7c3f
makes tommy actually inaccurate
ynot01 Aug 18, 2022
164403d
poke turdis
ynot01 Aug 18, 2022
884829f
fixes
ynot01 Aug 18, 2022
1942343
adds ap and incen saber ammo
ynot01 Aug 18, 2022
3674eca
add laser rifle, cap eguns
ynot01 Aug 18, 2022
28ed885
ds get a little more
ynot01 Aug 18, 2022
8af8ae7
reduce industrial RCD price to 5WC
ynot01 Aug 18, 2022
a2ab0a5
reduce RCD to 2 and combat RCD to 4
ynot01 Aug 18, 2022
e04ec99
reduce medbeam by 1 and limit stock
ynot01 Aug 18, 2022
1c0e557
ERT leader gets 5 extra WC
ynot01 Aug 18, 2022
37e5a26
leader gets fancy hat
ynot01 Aug 18, 2022
a589561
Update ert.dm
ynot01 Aug 18, 2022
8bfa8d9
fix laser rifle overwriting tac eguns
ynot01 Aug 18, 2022
82ecd35
set default uplink type
ynot01 Aug 18, 2022
e251826
add mini e gun
ynot01 Aug 18, 2022
7cd467e
add nt mantis blades
ynot01 Aug 18, 2022
e6ebbbe
fix nt mantis
ynot01 Aug 18, 2022
f4c44cb
efficiency or something
ynot01 Aug 18, 2022
f3570fb
actually mini
ynot01 Aug 19, 2022
01beea0
lower mantis to 7
ynot01 Aug 19, 2022
7c15889
add armors
ynot01 Aug 22, 2022
cf9b8e2
update teleshield desc
ynot01 Aug 22, 2022
de076d7
add bowman
ynot01 Aug 22, 2022
bc9e267
fix paths
ynot01 Aug 22, 2022
64061ab
add poster box
ynot01 Aug 22, 2022
e6ed9bf
Update uplink_items.dm
ynot01 Aug 24, 2022
62f324a
lower recharger cost to 2 WC
ynot01 Aug 24, 2022
8ab26b4
add exclusivity to ert commander hardsuit
ynot01 Aug 30, 2022
4e33f39
fixes stupid tommygun code
ynot01 Aug 30, 2022
7d340e1
Update smg.dm
ynot01 Aug 30, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions code/datums/components/uplink.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ GLOBAL_LIST_EMPTY(uplinks)
/datum/component/uplink
dupe_mode = COMPONENT_DUPE_UNIQUE
var/name = "syndicate uplink"
var/js_ui = "Uplink"
var/obj/item/stack/currency = /obj/item/stack/telecrystal
var/active = FALSE
var/lockable = TRUE
var/locked = TRUE
Expand Down Expand Up @@ -53,7 +55,7 @@ GLOBAL_LIST_EMPTY(uplinks)
RegisterSignal(parent, COMSIG_PEN_ROTATED, .proc/pen_rotation)

GLOB.uplinks += src
uplink_items = get_uplink_items(_gamemode, TRUE, allow_restricted)
uplink_items = get_uplink_items(_gamemode, TRUE, allow_restricted, js_ui)

if(_owner)
owner = _owner
Expand Down Expand Up @@ -87,7 +89,7 @@ GLOBAL_LIST_EMPTY(uplinks)
purchase_log = null
return ..()

/datum/component/uplink/proc/LoadTC(mob/user, obj/item/stack/telecrystal/TC, silent = FALSE)
/datum/component/uplink/proc/LoadTC(mob/user, obj/item/stack/TC, silent = FALSE)
if(!silent)
to_chat(user, span_notice("You slot [TC] into [parent] and charge its internal uplink."))
var/amt = TC.amount
Expand All @@ -96,12 +98,12 @@ GLOBAL_LIST_EMPTY(uplinks)

/datum/component/uplink/proc/set_gamemode(_gamemode)
gamemode = _gamemode
uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted)
uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted, js_ui)

/datum/component/uplink/proc/OnAttackBy(datum/source, obj/item/I, mob/user)
if(!active)
return //no hitting everyone/everything just to try to slot tcs in!
if(istype(I, /obj/item/stack/telecrystal))
if(istype(I, currency))
LoadTC(user, I)
return
var/datum/component/refundable/R = I.GetComponent(/datum/component/refundable)
Expand Down Expand Up @@ -129,7 +131,7 @@ GLOBAL_LIST_EMPTY(uplinks)
active = TRUE
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Uplink", name)
ui = new(user, src, js_ui, name)
// This UI is only ever opened by one person,
// and never is updated outside of user input.
ui.set_autoupdate(FALSE)
Expand Down Expand Up @@ -331,3 +333,10 @@ GLOBAL_LIST_EMPTY(uplinks)
return
explosion(T,1,2,3)
qdel(parent) //Alternatively could brick the uplink.


/// NT Uplink
/datum/component/uplink/nanotrasen
name = "nanotrasen uplink"
js_ui = "NTUplink"
currency = /obj/item/stack/ore/bluespace_crystal/refined/nt
9 changes: 9 additions & 0 deletions code/datums/ert.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
var/teamsize = 5
var/polldesc

// this can be safely set as default because it doesnt do anything unless specifically making uplinked ERT
var/obj/item/uplinktype = /obj/item/ntuplink/official

/datum/ert/New()
if (!polldesc)
polldesc = "a Code [code] Nanotrasen Emergency Response Team"
Expand Down Expand Up @@ -109,6 +112,12 @@
rename_team = "CentCom Grand Admirals"
polldesc = "a CentCom Grand Admiral"

/datum/ert/uplinked
leader_role = /datum/antagonist/ert/common/leader
roles = list(/datum/antagonist/ert/common)
rename_team = "Uplinked Emergency Response Team"
polldesc = "an Uplink-Equipped ERT"

/datum/ert/inquisition
roles = list(/datum/antagonist/ert/chaplain/inquisitor, /datum/antagonist/ert/security/inquisitor, /datum/antagonist/ert/medic/inquisitor)
leader_role = /datum/antagonist/ert/commander/inquisitor
Expand Down
10 changes: 10 additions & 0 deletions code/game/objects/items/devices/radio/headset.dm
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,16 @@ GLOBAL_LIST_INIT(channel_tokens, list(
/obj/item/radio/headset/headset_cent/alt
keyslot = new /obj/item/encryptionkey/heads/captain

/obj/item/radio/headset/headset_cent/bowman // No captain key
name = "\improper CentCom bowman headset"
desc = "A headset especially for emergency response personnel. Protects ears from flashbangs."
icon_state = "cent_headset_alt"
item_state = "cent_headset_alt"

/obj/item/radio/headset/headset_cent/bowman/ComponentInitialize()
. = ..()
AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS))

/obj/item/radio/headset/headset_cent/commander
name = "\improper CentCom bowman headset"
desc = "A headset especially for emergency response personnel. Protects ears from flashbangs."
Expand Down
39 changes: 39 additions & 0 deletions code/game/objects/items/stacks/bscrystal.dm
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,45 @@
points = 0
refined_type = null

/obj/item/stack/ore/bluespace_crystal/refined/nt // NT's telecrystal
name = "warpcrystal"
desc = "The culmination of Nanotrasen's sacrifices in pursuing technological advancement. Highly top-secret."
materials = list(/datum/material/bluespace=MINERAL_MATERIAL_AMOUNT*2.5) // more potent

/obj/item/stack/ore/bluespace_crystal/refined/nt/five
amount = 5

/obj/item/stack/ore/bluespace_crystal/refined/nt/twenty
amount = 20

/obj/item/stack/ore/bluespace_crystal/refined/nt/attack_self(mob/user)
if(!isliving(user))
return

var/mob/living/L = user

var/turf/destination = get_teleport_loc(loc, L, rand(3,6)) // Gets 3-6 tiles in the user's direction

if(!istype(destination))
return

L.visible_message(span_warning("[L] crushes [src]!"), span_danger("You crush [src]!"))
new /obj/effect/particle_effect/sparks(loc)
playsound(loc, "sparks", 50, 1)

if(!do_teleport(L, destination, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE))
L.visible_message(span_warning("[src] refuses to be crushed by [L]! There must be something interfering!"), span_danger("[src] suddenly hardens in your hand! There must be something interfering!"))
return

// Throws you one additional tile, giving it that cool "exit portal" effect and also throwing people very far if they are in space
L.throw_at(get_edge_target_turf(L, L.dir), 1, 3, spin = FALSE, diagonals_first = TRUE)
if(iscarbon(L))
var/mob/living/carbon/C = L
// Half as debilitating than a bluespace crystal, as this is a precious resource you're using
C.adjust_disgust(15)

use(1)

/obj/item/stack/ore/bluespace_crystal/Initialize()
. = ..()
pixel_x = rand(-5, 5)
Expand Down
10 changes: 9 additions & 1 deletion code/game/objects/items/storage/briefcase.dm
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,12 @@
/obj/item/storage/briefcase/syndie_mantis/PopulateContents()
..()
new /obj/item/autosurgeon/organ/syndicate/syndie_mantis(src)
new /obj/item/autosurgeon/organ/syndicate/syndie_mantis/l(src)
new /obj/item/autosurgeon/organ/syndicate/syndie_mantis/l(src)

/obj/item/storage/briefcase/nt_mantis
desc = "A sleek briefcase. It has the letters H.E.P.H.A.E.S.T.U.S. on it"

/obj/item/storage/briefcase/nt_mantis/PopulateContents()
..()
new /obj/item/autosurgeon/nt_mantis(src)
new /obj/item/autosurgeon/nt_mantis/l(src)
8 changes: 8 additions & 0 deletions code/game/objects/items/storage/uplink_kits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -634,3 +634,11 @@
/obj/item/storage/box/syndie_kit/bee_grenades/PopulateContents()
for(var/i in 1 to 3)
new /obj/item/grenade/spawnergrenade/buzzkill(src)

/obj/item/storage/box/official_posters
name = "poster box"
desc = "A box filled with posters."

/obj/item/storage/box/official_posters/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/poster/random_official(src)
8 changes: 8 additions & 0 deletions code/modules/admin/topic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,14 @@
else
message_admins("[key_name_admin(usr)] tried to create a CentCom response team. Unfortunately, there were not enough candidates available.")
log_admin("[key_name(usr)] failed to create a CentCom response team.")
if("centcom_custom")
message_admins("[key_name(usr)] is creating a Uplinked CentCom response team...")
if(src.makeUplinkEmergencyResponseTeam())
message_admins("[key_name(usr)] created a Uplinked CentCom response team.")
log_admin("[key_name(usr)] created a Uplinked CentCom response team.")
else
message_admins("[key_name_admin(usr)] tried to create a Uplinked CentCom response team. Unfortunately, there were not enough candidates available.")
log_admin("[key_name(usr)] failed to create a Uplinked CentCom response team.")
if("abductors")
message_admins("[key_name(usr)] is creating an abductor team...")
if(src.makeAbductorTeam())
Expand Down
115 changes: 115 additions & 0 deletions code/modules/admin/verbs/one_click_antag.dm
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<a href='?src=[REF(src)];[HrefToken()];makeAntag=blob'>Make Blob</a><br>
<a href='?src=[REF(src)];[HrefToken()];makeAntag=wizard'>Make Wizard (Requires Ghosts)</a><br>
<a href='?src=[REF(src)];[HrefToken()];makeAntag=nukeops'>Make Nuke Team (Requires Ghosts)</a><br>
<a href='?src=[REF(src)];[HrefToken()];makeAntag=centcom_custom'>Make Uplink CentCom Response Team (Requires Ghosts)</a><br>
<a href='?src=[REF(src)];[HrefToken()];makeAntag=centcom'>Make CentCom Response Team (Requires Ghosts)</a><br>
<a href='?src=[REF(src)];[HrefToken()];makeAntag=abductors'>Make Abductor Team (Requires Ghosts)</a><br>
<a href='?src=[REF(src)];[HrefToken()];makeAntag=revenant'>Make Revenant (Requires Ghost)</a><br>
Expand Down Expand Up @@ -491,6 +492,120 @@

return

// Uplink-equipped Centcom Response Team
/datum/admins/proc/makeUplinkEmergencyResponseTeam(var/datum/ert/ertemplate = null)
if (ertemplate)
ertemplate = new ertemplate
else
ertemplate = new /datum/ert/uplinked

var/list/settings = list(
"preview_callback" = CALLBACK(src, .proc/makeERTPreviewIcon),
"mainsettings" = list(
"template" = list("desc" = "Template", "type" = "datum", "path" = "/datum/ert/uplinked", "value" = "/datum/ert/uplinked"),
"uplink" = list("desc" = "Uplink Type", "type" = "datum", "path" = "/obj/item/ntuplink", "subtypesonly" = TRUE, "value" = ertemplate.uplinktype),
"teamsize" = list("desc" = "Team Size", "type" = "number", "value" = ertemplate.teamsize),
"mission" = list("desc" = "Mission", "type" = "string", "value" = ertemplate.mission),
"polldesc" = list("desc" = "Ghost poll description", "type" = "string", "value" = ertemplate.polldesc),
"enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(CONFIG_GET(flag/enforce_human_authority) ? "Yes" : "No")]"),
"open_armory" = list("desc" = "Open armory doors", "type" = "boolean", "value" = "[(ertemplate.opendoors ? "Yes" : "No")]"),
"open_mechbay" = list("desc" = "Open Mech Bay", "type" = "boolean", "value" = "[(ertemplate.openmech ? "Yes" : "No")]"),
)
)

var/list/prefreturn = presentpreflikepicker(usr,"Customize ERT", "Customize ERT", Button1="Ok", width = 600, StealFocus = 1,Timeout = 0, settings=settings)

if (isnull(prefreturn))
return FALSE

if (prefreturn["button"] == 1)
var/list/prefs = settings["mainsettings"]

ertemplate.uplinktype = prefs["uplink"]["value"]
ertemplate.teamsize = prefs["teamsize"]["value"]
ertemplate.mission = prefs["mission"]["value"]
ertemplate.polldesc = prefs["polldesc"]["value"]
ertemplate.enforce_human = prefs["enforce_human"]["value"] == "Yes" ? TRUE : FALSE
ertemplate.opendoors = prefs["open_armory"]["value"] == "Yes" ? TRUE : FALSE
ertemplate.openmech = prefs["open_mechbay"]["value"] == "Yes" ? TRUE : FALSE

var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null)
var/teamSpawned = FALSE

if(candidates.len > 0)
//Pick the (un)lucky players
var/numagents = min(ertemplate.teamsize,candidates.len)

//Create team
var/datum/team/ert/ert_team = new ertemplate.team
if(ertemplate.rename_team)
ert_team.name = ertemplate.rename_team

//Asign team objective
var/datum/objective/missionobj = new
missionobj.team = ert_team
missionobj.explanation_text = ertemplate.mission
missionobj.completed = TRUE
ert_team.objectives += missionobj
ert_team.mission = missionobj

var/list/spawnpoints = GLOB.emergencyresponseteamspawn
while(numagents && candidates.len)
if (numagents > spawnpoints.len)
numagents--
continue // This guy's unlucky, not enough spawn points, we skip him.
var/spawnloc = spawnpoints[numagents]
var/mob/dead/observer/chosen_candidate = pick(candidates)
candidates -= chosen_candidate
if(!chosen_candidate.key)
continue

//Spawn the body
var/mob/living/carbon/human/ERTOperative = new ertemplate.mobtype(spawnloc)
chosen_candidate.client.prefs.copy_to(ERTOperative)
ERTOperative.key = chosen_candidate.key

if(ertemplate.enforce_human || !(ERTOperative.dna.species.changesource_flags & ERT_SPAWN)) // Don't want any exploding plasmemes
ERTOperative.set_species(/datum/species/human)

//Give antag datum
var/datum/antagonist/ert/ert_antag

if(numagents == 1)
ert_antag = new ertemplate.leader_role
else
ert_antag = ertemplate.roles[WRAP(numagents,1,length(ertemplate.roles) + 1)]
ert_antag = new ert_antag

ERTOperative.mind.add_antag_datum(ert_antag,ert_team)
ERTOperative.mind.assigned_role = ert_antag.name

// Equip uplink
var/obj/item/upl = new ertemplate.uplinktype
if(istype(upl))
ERTOperative.equip_to_slot_or_del(upl, SLOT_IN_BACKPACK)

//Logging and cleanup
//log_game("[key_name(ERTOperative)] has been selected as an [ert_antag.name]") | yogs - redundant
numagents--
teamSpawned++

if (teamSpawned)
message_admins("[ertemplate.polldesc] has spawned with the mission: [ertemplate.mission]")

//Open the Armory doors
if(ertemplate.opendoors)
for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
INVOKE_ASYNC(door, /obj/machinery/door/poddoor.proc/open)

//Open the Mech Bay
if(ertemplate.openmech)
for(var/obj/machinery/door/poddoor/deathsquad/door in GLOB.airlocks)
INVOKE_ASYNC(door, /obj/machinery/door/poddoor.proc/open)
return TRUE

return FALSE

//Abductors
/datum/admins/proc/makeAbductorTeam()
new /datum/round_event/ghost_role/abductor
Expand Down
8 changes: 8 additions & 0 deletions code/modules/antagonists/ert/ert.dm
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@
/datum/antagonist/ert/medic/red
outfit = /datum/outfit/ert/medic/alert

/datum/antagonist/ert/common
outfit = /datum/outfit/ert

/datum/antagonist/ert/common/leader
name = "Emergency Response Commander"
role = "Commander"
outfit = /datum/outfit/ert/commonleader

/datum/antagonist/ert/commander
role = "Commander"
outfit = /datum/outfit/ert/commander
Expand Down
15 changes: 15 additions & 0 deletions code/modules/clothing/outfits/ert.dm
Original file line number Diff line number Diff line change
@@ -1,12 +1,27 @@
/datum/outfit/ert
name = "ERT Common"

id = /obj/item/card/id/ert
back = /obj/item/storage/backpack
uniform = /obj/item/clothing/under/rank/centcom_officer
shoes = /obj/item/clothing/shoes/combat/swat
gloves = /obj/item/clothing/gloves/combat
ears = /obj/item/radio/headset/headset_cent/alt
implants = list(/obj/item/implant/mindshield)
backpack_contents = list(
/obj/item/clothing/mask/gas/sechailer/swat=1,
/obj/item/tank/internals/oxygen/tactical=1,
/obj/item/tank/internals/emergency_oxygen/double=1,
)

/datum/outfit/ert/commonleader
head = /obj/item/clothing/head/beret/sec
backpack_contents = list(
/obj/item/clothing/mask/gas/sechailer/swat=1,
/obj/item/tank/internals/oxygen/tactical=1,
/obj/item/tank/internals/emergency_oxygen/double=1,
/obj/item/stack/ore/bluespace_crystal/refined/nt/five=1
)

/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(visualsOnly)
Expand Down
1 change: 1 addition & 0 deletions code/modules/projectiles/guns/ballistic/automatic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@
fire_sound = 'sound/weapons/gunshot_smg.ogg'
can_suppress = FALSE
burst_size = 4
spread = 30
fire_delay = 1
bolt_type = BOLT_TYPE_OPEN

Expand Down
8 changes: 8 additions & 0 deletions code/modules/surgery/organs/augments_arms.dm
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,14 @@
zone = BODY_ZONE_L_ARM
syndicate_implant = TRUE

/obj/item/organ/cyberimp/arm/nt_mantis
name = "H.E.P.H.A.E.S.T.U.S. mantis blade implants"
desc = "Retractable arm-blade implants to get you out of a pinch. Wielding two will let you double-attack."
contents = newlist(/obj/item/mantis/blade/NT)

/obj/item/organ/cyberimp/arm/nt_mantis/l
zone = BODY_ZONE_L_ARM

/obj/item/organ/cyberimp/arm/power_cord
name = "power cord implant"
desc = "An internal power cord hooked up to a battery. Useful if you run on volts."
Expand Down
8 changes: 8 additions & 0 deletions code/modules/surgery/organs/autosurgeon.dm
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,14 @@
uses = 1
starting_organ = /obj/item/organ/cyberimp/arm/syndie_mantis/l

/obj/item/autosurgeon/nt_mantis
uses = 1
starting_organ = /obj/item/organ/cyberimp/arm/nt_mantis

/obj/item/autosurgeon/nt_mantis/l
uses = 1
starting_organ = /obj/item/organ/cyberimp/arm/nt_mantis/l

/obj/item/autosurgeon/plasmavessel //Yogs Start: Just an autosurgeon with a plasma vessel in it, used in /obj/item/storage/box/syndie_kit/xeno_organ_kit
uses = 3
starting_organ = /obj/item/organ/alien/plasmavessel //Yogs End
Loading