diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 8fe3d57a7b..2fa1b0d889 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -10556,12 +10556,6 @@
},
/turf/open/floor/plasteel/dark,
/area/slavers)
-"xD" = (
-/obj/structure/closet,
-/obj/effect/turf_decal/bot,
-/obj/machinery/computer/communications,
-/turf/open/floor/plasteel/dark,
-/area/slavers)
"xG" = (
/obj/structure/closet/syndicate/personal,
/obj/effect/turf_decal/stripes/line{
@@ -17394,7 +17388,7 @@
name = "skeletal minibar"
},
/obj/machinery/chem_dispenser/drinks/beer{
- dir = 8
+ dir = 1
},
/turf/open/floor/wood,
/area/slavers)
@@ -20173,6 +20167,12 @@
/obj/machinery/computer/slavery{
dir = 4
},
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/slavers)
"Zc" = (
@@ -20224,7 +20224,7 @@
name = "skeletal minibar"
},
/obj/machinery/chem_dispenser/drinks{
- dir = 8
+ dir = 1
},
/turf/open/floor/wood,
/area/slavers)
@@ -78476,7 +78476,7 @@ Zm
Zm
MY
sm
-xD
+Ml
VZ
tk
WZ
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 7fd88c5fe1..88bc5814fd 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -10,6 +10,7 @@
#define ROLE_TRAITOR "traitor"
#define ROLE_OPERATIVE "operative"
#define ROLE_SLAVER "slaver"
+#define ROLE_SLAVER_LEADER "slave master"
#define ROLE_CHANGELING "changeling"
#define ROLE_WIZARD "wizard"
#define ROLE_MALF "malf AI"
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 662e122419..6face8321d 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -27,6 +27,7 @@ GLOBAL_LIST_EMPTY(apcs_list) //list of all Area Power Controller machines, s
GLOBAL_LIST_EMPTY(tracked_implants) //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
GLOBAL_LIST_EMPTY(tracked_chem_implants) //list of implants the prisoner console can track and send inject commands too
GLOBAL_LIST_EMPTY(tracked_slaves) //list of mobs with slaver collars equipped.
+GLOBAL_LIST_EMPTY(tracked_slave_consoles) //list of slave management consoles.
GLOBAL_LIST_EMPTY(poi_list) //list of points of interest for observe/follow
GLOBAL_LIST_EMPTY(pinpointer_list) //list of all pinpointers. Used to change stuff they are pointing to all at once.
GLOBAL_LIST_EMPTY(zombie_infection_list) // A list of all zombie_infection organs, for any mass "animation"
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index f1dd603a3d..7705b5fe4d 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -559,7 +559,7 @@ If not set, defaults to check_completion instead. Set it. It's used by cryo.
/datum/objective/slaver
name = "slave trading"
- explanation_text = "Earn 20,000 credits through slave trading."
+ explanation_text = "Earn 30,000 credits through slave trading."
/datum/objective/slaver/check_completion()
// if(SSticker && SSticker.mode && SSticker.mode.station_was_nuked)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 9e6f916711..b060ed4add 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -353,10 +353,17 @@
bank.adjust_money(C.price)
GLOB.slavers_credits_deposits -= C.price
C.bought = FALSE
+
+ for(var/obj/machinery/computer/slavery/tracked_slave_console in GLOB.tracked_slave_consoles)
+ tracked_slave_console.radioAnnounce("The station has recalled the ransom funds for [C.loc.name]")
+
} else {
bank.adjust_money(-C.price)
GLOB.slavers_credits_deposits += C.price
C.bought = TRUE
+
+ for(var/obj/machinery/computer/slavery/tracked_slave_console in GLOB.tracked_slave_consoles)
+ tracked_slave_console.radioAnnounce("The station has paid the ransom funds for [C.loc.name]")
}
break
diff --git a/code/game/machinery/computer/slavery.dm b/code/game/machinery/computer/slavery.dm
index 3e0eea54c9..7bfbb7c695 100644
--- a/code/game/machinery/computer/slavery.dm
+++ b/code/game/machinery/computer/slavery.dm
@@ -7,6 +7,7 @@
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
req_access = list(ACCESS_SLAVER)
light_color = LIGHT_COLOR_RED
+ var/obj/item/radio/headset/radio
var/selected_cat
/// Dictates if the compact mode of the interface is on or off
var/compact_mode = FALSE
@@ -15,7 +16,14 @@
/obj/machinery/computer/slavery/Initialize(mapload)
. = ..()
+ GLOB.tracked_slave_consoles += src
possible_gear = get_slaver_gear()
+ radio = new /obj/item/radio/headset/syndicate(src)
+
+/obj/machinery/computer/slavery/Destroy()
+ GLOB.tracked_slave_consoles -= src
+ QDEL_NULL(radio)
+ ..()
/obj/machinery/computer/slavery/proc/get_slaver_gear()
var/list/filtered_modules = list()
@@ -144,6 +152,8 @@
if(..())
return
+ playsound(src, "terminal_type", 25, 0)
+
var/collarID = params["id"]
var/obj/item/electropack/shockcollar/slave/collar
@@ -155,63 +165,37 @@
break
switch(action)
-
-
if ("makePriorityAnnouncement")
- // priority_announce("Announcement.", sender_override = "Beep Beep upgate")
- var/datum/bank_account/bank = SSeconomy.get_dep_account(ACCOUNT_CAR)
- priority_announce("Station credits: [bank.account_balance], Deposit: [GLOB.slavers_credits_deposits], Balance: [GLOB.slavers_credits_balance], Total: [GLOB.slavers_credits_total]", sender_override = "Bank status")
- // var/is_ai = issilicon(user)
- // if(!SScommunications.can_announce(user, is_ai))
- // to_chat(user, "Intercomms recharging. Please stand by.")
- // return
- // var/input = stripped_input(user, "Please choose a message to announce to the station crew.", "What?")
- // if(!input || !user.canUseTopic(src, !issilicon(usr)))
- // return
- // if(!(user.can_speak())) //No more cheating, mime/random mute guy!
- // input = "..."
- // to_chat(user, "You find yourself unable to speak.")
- // else
- // input = user.treat_message(input) //Adds slurs and so on. Someone should make this use languages too.
- // SScommunications.make_announcement(user, is_ai, input)
- // deadchat_broadcast(" made a priority announcement from [get_area_name(usr, TRUE)].", "[user.real_name]", user)
+ if (world.time < GLOB.slavers_last_announcement + 300)
+ say("Intercomms recharging. Please stand by.")
+ return
- if("purchaseSupplies")
- priority_announce("Purchase Supplies.", sender_override = "Beep Beep upgate")
+ var/mob/living/user = usr
+
+ var/input = stripped_input(user, "Please choose a message to announce to the station crew.", "What?")
+
+ if(!input || !user.canUseTopic(src, !issilicon(usr)))
+ return
+ if(!(user.can_speak())) //No more cheating, mime/random mute guy!
+ to_chat(user, "You find yourself unable to speak.")
+ return
+
+ input = user.treat_message(input) //Adds slurs and so on. Someone should make this use languages too.
+ priority_announce(input, sender_override = "[GLOB.slavers_team_name] Transmission")
+ deadchat_broadcast(" sent a transmission to the station from [get_area_name(usr, TRUE)].", "[user.real_name]", user)
+ GLOB.slavers_last_announcement = world.time
if("setPrice")
- var/newPrice = input(usr, "The station will need to pay this to get the slave back.", "Set slave price", 4000) as num
+ var/newPrice = input(usr, "The station will need to pay this to get the slave back.", "Set slave price", 5000) as num
if(!newPrice)
- priority_announce("New price empty.", sender_override = "Set price")
+ return
newPrice = clamp(round(newPrice), 1, 1000000)
collar.price = newPrice
+ var/mob/living/M = collar.loc
+ priority_announce("[M.real_name] has been captured. Send us [newPrice]cr to get them back!.", sender_override = "[GLOB.slavers_team_name] Transmission")
if("export")
- // var/area/curr = get_area(get_turf(collar.loc))
-
- // if (istype(curr, /area/slavers/export))
- // priority_announce("EXPORTING...", sender_override = "Set price")
- // var/area/thearea = /area/slavers/export
-
- // if(!curr)
- // priority_announce("No area found", sender_override = "Set price")
- // return
-
- // var/list/L = list()
- // for(var/turf/T in get_area_turfs(curr.type))
- // L+=T
- // if(!L || !L.len)
- // say("Error: No destination found.")
- // return
-
- // var/slaver_crew_name = /datum/antagonist/slaver.get_team().slaver_crew_name
- // var/datum/antagonist/slaver.get_team()
- // priority_announce("The [GLOB.slavers_team_name]", sender_override = "Set price")
-
- // var/datum/bank_account/bank = SSeconomy.get_dep_account(ACCOUNT_CAR)
- // if(bank)
- // bank.adjust_money(-1000)
GLOB.slavers_credits_deposits -= collar.price
GLOB.slavers_credits_balance += collar.price
GLOB.slavers_credits_total += collar.price
@@ -219,9 +203,6 @@
new /obj/effect/temp_visual/dir_setting/ninja(get_turf(collar.loc), collar.loc.dir)
- // var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- // s.set_up(3, 1, collar.loc)
- // s.start()
playsound(get_turf(src.loc), 'sound/effects/bamf.ogg', 50, 1)
visible_message("[collar.loc] vanishes into the droppod.", \
@@ -230,16 +211,14 @@
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
var/mob/living/M = collar.loc
- priority_announce("[M.real_name] has been returned to the station.", sender_override = "[GLOB.slavers_team_name] Transmission")
+ priority_announce("[M.real_name] has been returned to the station for [collar.price]cr.", sender_override = "[GLOB.slavers_team_name] Transmission")
var/obj/structure/closet/supplypod/centcompod/exportPod = new(pick(get_area_turfs(pod_storage_area)))
var/obj/effect/landmark/observer_start/dropzone = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list
- M.forceMove(exportPod) //and forceMove any atom/moveable into the supplypod
+ M.forceMove(exportPod)
- new /obj/effect/pod_landingzone(dropzone.loc, exportPod) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location
+ new /obj/effect/pod_landingzone(dropzone.loc, exportPod)
qdel(collar)
- // else
- // priority_announce("Nope", sender_override = "Set price")
if("shock")
var/datum/signal/signal = new /datum/signal
@@ -270,15 +249,15 @@
return
GLOB.slavers_credits_balance -= SG.cost
- say("Supplies inbound!")
+ radioAnnounce("Supplies inbound: [SG.name]")
addtimer(CALLBACK(src, .proc/dropSupplies, SG.build_path), rand(4,8) * 10)
- // dropSupplies(SG.build_path)
return TRUE
-
+/obj/machinery/computer/slavery/proc/radioAnnounce(message)
+ radio.talk_into(src, message, RADIO_CHANNEL_SYNDICATE)
/obj/machinery/computer/slavery/proc/dropSupplies(item)
@@ -294,15 +273,5 @@
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
var/obj/structure/closet/supplypod/centcompod/exportPod = new(pick(get_area_turfs(pod_storage_area)))
- // imp_in.forceMove(pick(L))
new item(exportPod)
-
-
- // var/mob/living/M = collar.loc
-
-
- // var/obj/effect/landmark/observer_start/dropzone = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list
- // M.forceMove(exportPod) //and forceMove any atom/moveable into the supplypod
- new /obj/effect/pod_landingzone(drop_location, exportPod) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location
-
- // Find References(exportPod)
+ new /obj/effect/pod_landingzone(drop_location, exportPod)
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index e8e78c545d..775aca6ce9 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -261,7 +261,7 @@
// return 1
/datum/admins/proc/makeSlaverTeam()
- var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for the slave trader crew entering the sector?", ROLE_SLAVER)
+ var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for the slave trader crew?", ROLE_SLAVER)
var/list/mob/chosen = list()
var/mob/theghost = null
diff --git a/code/modules/antagonists/slaver/equipment/orderable_gear.dm b/code/modules/antagonists/slaver/equipment/orderable_gear.dm
index b247cbeab2..74cf995ec8 100644
--- a/code/modules/antagonists/slaver/equipment/orderable_gear.dm
+++ b/code/modules/antagonists/slaver/equipment/orderable_gear.dm
@@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "slave_collar"
build_path = /obj/item/storage/box/slave_collars
category = "Slaving"
- cost = 2//000
+ cost = 3000
/datum/slaver_gear/jammers
name = "Radio Jammers"
@@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "jammers"
build_path = /obj/item/storage/box/jammers
category = "Slaving"
- cost = 3//000
+ cost = 4000
/datum/slaver_gear/gloves
name = "Combat Krav Maga Gloves"
@@ -36,7 +36,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "gloves"
build_path = /obj/item/storage/box/krav_gloves
category = "Slaving"
- cost = 6//000
+ cost = 7000
/datum/slaver_gear/pens
name = "Sleepy Pens"
@@ -44,7 +44,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "pens"
build_path = /obj/item/storage/box/pens
category = "Slaving"
- cost = 3//000
+ cost = 3500
/datum/slaver_gear/codespeak
name = "Codespeak Manual"
@@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "codespeak"
build_path = /obj/item/codespeak_manual/unlimited
category = "Slaving"
- cost = 3//000
+ cost = 3000
/datum/slaver_gear/slaver_gear
name = "Slaver Gear"
@@ -60,7 +60,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "slaver_gear"
build_path = /obj/structure/closet/crate/slaver_loadout
category = "Slaving"
- cost = 3//000
+ cost = 3500
/datum/slaver_gear/emag
name = "Cryptographic Sequencer"
@@ -68,7 +68,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "emag"
build_path = /obj/item/card/emag
category = "Advanced"
- cost = 4//000
+ cost = 5500
/datum/slaver_gear/implant_teleport
name = "Emergency Teleport Implants"
@@ -76,7 +76,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "implant_teleport"
build_path = /obj/item/storage/box/slaver_teleport
category = "Advanced"
- cost = 12//000
+ cost = 15000
/datum/slaver_gear/hardsuits
name = "Combat Hardsuits"
@@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "hardsuits"
build_path = /obj/structure/closet/crate/slaver_hardsuits
category = "Advanced"
- cost = 8//000
+ cost = 10000
/datum/slaver_gear/medic
name = "Medic Kit"
@@ -92,7 +92,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "implant_teleport"
build_path = /obj/item/storage/firstaid/tactical/slaver
category = "Advanced"
- cost = 8//000
+ cost = 8500
/datum/slaver_gear/marksman
name = "Marksman Kit"
@@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "marksman"
build_path = /obj/structure/closet/crate/slaver_marksman
category = "Advanced"
- cost = 15//000
+ cost = 17500
/datum/slaver_gear/mech
name = "Gygax 'Riot-Control' Exosuit"
@@ -108,7 +108,7 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "mech"
build_path = /obj/structure/closet/crate/slaver_mech
category = "Mech"
- cost = 35//000
+ cost = 45000
/datum/slaver_gear/mech_ammo
name = "Gygax Exosuit Ammo"
@@ -116,4 +116,4 @@ GLOBAL_LIST_INIT(slaver_gear, subtypesof(/datum/slaver_gear))
id = "mech_ammo"
build_path = /obj/structure/closet/crate/slaver_mech_ammo
category = "Mech"
- cost = 15//000
+ cost = 17000
diff --git a/code/modules/antagonists/slaver/slaver.dm b/code/modules/antagonists/slaver/slaver.dm
index 38da3d42b4..f1396b111d 100644
--- a/code/modules/antagonists/slaver/slaver.dm
+++ b/code/modules/antagonists/slaver/slaver.dm
@@ -1,8 +1,9 @@
GLOBAL_VAR_INIT(slavers_team_name, "Slave Traders")
GLOBAL_VAR_INIT(slavers_credits_deposits, 0)
-GLOBAL_VAR_INIT(slavers_credits_balance, 2000)
+GLOBAL_VAR_INIT(slavers_credits_balance, 7000)
GLOBAL_VAR_INIT(slavers_credits_total, 0)
GLOBAL_VAR_INIT(slavers_slaves_sold, 0)
+GLOBAL_VAR_INIT(slavers_last_announcement, 0)
/datum/antagonist/slaver
name = "Slave Trader"
@@ -13,7 +14,7 @@ GLOBAL_VAR_INIT(slavers_slaves_sold, 0)
threat = 7
show_to_ghosts = TRUE
var/datum/team/slavers/slaver_team = new /datum/team/slavers
- var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint.
+ // var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint.
var/slaver_outfit = /datum/outfit/slaver
/datum/antagonist/slaver/proc/update_slaver_icons_added(mob/living/M)
@@ -43,16 +44,17 @@ GLOBAL_VAR_INIT(slavers_slaves_sold, 0)
return TRUE
/datum/antagonist/slaver/greet()
+ owner.assigned_role = ROLE_SLAVER
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/slavers.ogg',100,0)
to_chat(owner, "You are a slave trader!")
owner.announce_objectives()
+
/datum/antagonist/slaver/on_gain()
forge_objectives()
. = ..()
equip_slaver()
- if(send_to_spawnpoint)
- move_to_spawnpoint()
+ move_to_spawnpoint()
/datum/antagonist/slaver/get_team()
return slaver_team
@@ -84,6 +86,7 @@ GLOBAL_VAR_INIT(slavers_slaves_sold, 0)
slaver_outfit = /datum/outfit/slaver/leader
/datum/antagonist/slaver/leader/greet()
+ owner.assigned_role = ROLE_SLAVER_LEADER
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/slavers.ogg',100,0)
to_chat(owner, "You are the Slave Master for this collection job. You are responsible for organising your team and your ID is the only one who can open the launch bay doors.")
to_chat(owner, "If you feel you are not up to this task, give your ID to another slaver.")
@@ -123,20 +126,30 @@ GLOBAL_VAR_INIT(slavers_slaves_sold, 0)
var/text = " The crew were:"
var/slavesSold = GLOB.slavers_slaves_sold
- var/slavesUnsold = GLOB.tracked_slaves.len
var/earnedMoney = GLOB.slavers_credits_total
+ var/slavesUnsold = 0
+ var/all_dead = TRUE
+ for(var/datum/mind/M in members)
+ if(considered_alive(M))
+ all_dead = FALSE
+
+ for(var/obj/item/electropack/shockcollar/slave/collar in GLOB.tracked_slaves)
+ if (isliving(collar.loc))
+ slavesUnsold++
+
+ text += " "
text += printplayerlist(members)
text += " "
- text += "Slaves sold: [slavesSold]"
- text += "Slaves not sold: [slavesUnsold]"
- text += "Total money earned: [earnedMoney]"
+ text += "Slaves sold: [slavesSold] "
+ text += "Slaves not sold: [slavesUnsold] "
+ text += "Total money earned: [earnedMoney]cr (needed at least 30,000cr)"
- var/datum/objective/slaver/O = locate() in objectives
- if(O.check_completion())
- parts += "The slaver crew were successful!"
+ // var/datum/objective/slaver/O = locate() in objectives
+ if(GLOB.slavers_credits_total >= 30000 && !all_dead)
+ parts += "The slaver crew were successful!"
else
- parts += "The slaver crew have failed."
+ parts += "The slaver crew have failed."
parts += text
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole.js b/tgui/packages/tgui/interfaces/CommunicationsConsole.js
index f1de642019..1b8e559481 100644
--- a/tgui/packages/tgui/interfaces/CommunicationsConsole.js
+++ b/tgui/packages/tgui/interfaces/CommunicationsConsole.js
@@ -1,7 +1,7 @@
import { sortBy } from "common/collections";
import { capitalize } from "common/string";
import { useBackend, useLocalState } from "../backend";
-import { Blink, Box, Button, Dimmer, Flex, Stack, Icon, Input, Modal, Section, TextArea, Table, Fragment } from "../components";
+import { Blink, Box, Button, Dimmer, Flex, Icon, Input, Modal, Section, TextArea, Table, LabeledList } from "../components";
import { Window } from "../layouts";
import { sanitizeText } from "../sanitize";
@@ -475,49 +475,54 @@ export const PageMain = (props, context) => {
{!!slaves.length && (
-
-
- Cargo credits: {cargocredits}cr
- {"The credits will only be sent once the slave is delivered back to the station."}
-
-
-
- {slaves.map(slave => (
-
+
+
+
+ {cargocredits}cr
+
+
+ {"The credits will only be sent once the slave is delivered back to the station."}
+
+
-
- {slave.name}
-
+