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} - +
+ {slaves.map(slave => ( + - - {slave.bought - ? "Ransom paid" - : ""} - + + {slave.name} + - -
-
-
+ +