Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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: 11 additions & 8 deletions code/game/objects/items/devices/PDA/PDA.dm
Original file line number Diff line number Diff line change
Expand Up @@ -259,22 +259,25 @@ GLOBAL_LIST_EMPTY(PDAs)
if (cartridge)
if(cartridge.bot_access_flags)
dat += "<li><a href='byond://?src=[REF(src)];choice=54'><img src=pda_medbot.png>Bots Access</a></li>"
if (cartridge.access & CART_JANITOR)
if(cartridge.access & CART_JANITOR)
dat += "<li><a href='byond://?src=[REF(src)];choice=49'><img src=pda_bucket.png>Custodial Locator</a></li>"
if (istype(cartridge.radio))
if(istype(cartridge.radio))
dat += "<li><a href='byond://?src=[REF(src)];choice=40'><img src=pda_signaler.png>Signaler System</a></li>"
if (cartridge.access & CART_NEWSCASTER)
if(cartridge.access & CART_NEWSCASTER)
dat += "<li><a href='byond://?src=[REF(src)];choice=53'><img src=pda_notes.png>Newscaster Access </a></li>"
if (cartridge.access & CART_REAGENT_SCANNER)
if(cartridge.access & CART_REAGENT_SCANNER)
dat += "<li><a href='byond://?src=[REF(src)];choice=Reagent Scan'><img src=pda_reagent.png>[scanmode == 3 ? "Disable" : "Enable"] Reagent Scanner</a></li>"
if (cartridge.access & CART_ENGINE)
if(cartridge.access & CART_ENGINE)
dat += "<li><a href='byond://?src=[REF(src)];choice=Halogen Counter'><img src=pda_reagent.png>[scanmode == 4 ? "Disable" : "Enable"] Halogen Counter</a></li>"
if (cartridge.access & CART_ATMOS)
if(cartridge.access & CART_ATMOS)
dat += "<li><a href='byond://?src=[REF(src)];choice=Gas Scan'><img src=pda_reagent.png>[scanmode == 5 ? "Disable" : "Enable"] Gas Scanner</a></li>"
if (cartridge.access & CART_REMOTE_DOOR)
if(cartridge.access & CART_REMOTE_DOOR)
dat += "<li><a href='byond://?src=[REF(src)];choice=Toggle Door'><img src=pda_rdoor.png>Toggle Remote Door</a></li>"
if (cartridge.access & CART_DRONEPHONE)
if(cartridge.access & CART_DRONEPHONE)
dat += "<li><a href='byond://?src=[REF(src)];choice=Drone Phone'><img src=pda_dronephone.png>Drone Phone</a></li>"
if(cartridge.access & CART_MINDSLAVE)
dat += "<li><a href='byond://?src=[REF(src)];choice=48'><img src=pda_signaler.png> Slavemaster 2000</a></li>"

dat += "<li><a href='byond://?src=[REF(src)];choice=3'><img src=pda_atmos.png>Atmospheric Scan</a></li>"
dat += "<li><a href='byond://?src=[REF(src)];choice=Light'><img src=pda_flashlight.png>[fon ? "Disable" : "Enable"] Flashlight</a></li>"
if (pai)
Expand Down
25 changes: 25 additions & 0 deletions code/game/objects/items/devices/PDA/cart.dm
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#define CART_QUARTERMASTER (1<<12)
#define CART_HYDROPONICS (1<<13)
#define CART_DRONEPHONE (1<<14)
#define CART_MINDSLAVE (1<<15)


/obj/item/cartridge
Expand Down Expand Up @@ -190,6 +191,12 @@
..()
radio = new(src)

/obj/item/cartridge/slavemaster
name = "\improper Slavemaster-2000 cartridge"
var/obj/item/implant/mindslave/imp = null
access = CART_MINDSLAVE


/obj/item/cartridge/proc/post_status(command, data1, data2)

var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
Expand Down Expand Up @@ -448,6 +455,15 @@ Code:
menu += "<li>#[SO.id] - [SO.pack.name] requested by [SO.orderer]</li>"
menu += "</ol><font size=\"-3\">Upgrade NOW to Space Parts & Space Vendors PLUS for full remote order control and inventory management."

if(48) //slavermaster2000
menu = "<h4><img src=pda_signaller.png> Slave Controller</h4>"

menu += "<BR><B>Available Slaves: </B><BR>"
if(src:imp.imp_in)
menu += "<ul><li>[src:imp.imp_in]<A href='byond://?src=\ref[src];choice=Detonate Slave'> *Detonate*</a></li></ul>"
else
menu += "No slaves detected."

if (49) //janitorial locator
menu = "<h4><img src=pda_bucket.png> Persistent Custodial Object Locator</h4>"

Expand Down Expand Up @@ -622,6 +638,15 @@ Code:
current_channel = host_pda.msg_input()
host_pda.Topic(null,list("choice"=num2text(host_pda.mode)))
return
if("Detonate Slave")
if(istype(src, /obj/item/cartridge/slavemaster))
if(src:imp)
if(ismob(src.loc))
var/mob/detonator = src.loc
if(ismob(src:imp.loc))
var/mob/detonated = src:imp.loc
log_game("[detonator.ckey]/([detonator] has detonated [detonated.ckey]/([detonated]) with a mindslave implant");
src:imp.activate()

//Bot control section! Viciously ripped from radios for being laggy and terrible.
if(href_list["op"])
Expand Down
3 changes: 3 additions & 0 deletions code/game/objects/items/implants/implant_loyality.dm
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@

/obj/item/implant/mindshield/implant(mob/living/target, mob/user, silent = FALSE)
if(..())
var/obj/item/implant/mindslave/imp = locate(/obj/item/implant/mindslave) in target
if(imp)
imp.removed(target)
if(!target.mind)
return TRUE

Expand Down
93 changes: 93 additions & 0 deletions code/game/objects/items/implants/implant_mindslave.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/obj/item/implant/mindslave
name = "mindslave implant"
desc = "Turn a crewmate into your eternal slave"
activated = FALSE

/obj/item/implant/mindslave/get_data()
var/dat = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> Syndicate Loyalty Implant<BR>
<b>Life:</b> Single use<BR>
<b>Important Notes:</b> <font color='red'>Illegal</font><BR>
<HR>
<b>Implant Details:</b> <BR>
<b>Function:</b> Makes the injected a slave to the owner of the implant.<HR>"}
return dat

/obj/item/implant/mindslave/implant(mob/source, mob/user)

if(!source.mind)
to_chat(user.mind, "<span class='notice'>[source] doesn't posses the mental capabilities to be a slave.</span>")
return FALSE

var/mob/living/carbon/human/target = source
var/mob/living/carbon/human/holder = user

if(target == holder)
to_chat(holder, "<span class='notice'>You can't implant yourself!</span>")
return FALSE

if(locate(src.type) in source)
to_chat(holder, "<span class='warning'>[target] is already a slave!</span>")
return FALSE

if(target.isloyal())
to_chat(holder, "<span class='warning'>[target] seems to resist the implant!</span>")
return FALSE

if(target.mind.has_antag_datum(/datum/antagonist/changeling))
to_chat(holder, "<span class='warning'>[target]'s skin thickens where you try to inject them. Odd...</span>")
to_chat(target, "<span class='warning'>We instinctively prevent [holder]'s injector from penetrating our skin.</span>")
return FALSE

to_chat(target, "<span class='userdanger'><FONT size = 3>You feel a strange urge to serve [holder.real_name]. A simple thought about disobeying his/her commands makes your head feel like it is going to explode. You feel like you dont want to know what will happen if you actually disobey your new master.</FONT></span>")

var/datum/objective/mindslave/serve_objective = new
serve_objective.owner = target
serve_objective.explanation_text = "Serve [holder.real_name] no matter what!"
serve_objective.completed = TRUE
source.mind.objectives += serve_objective
if(!SSticker.mode.traitors.Find(source.mind))
SSticker.mode.traitors += source.mind

log_game("[holder.ckey] enslaved [target.ckey] with a Mindslave implant")

return ..()

/obj/item/implant/mindslave/removed(mob/target)
if(..())

for(var/datum/objective/mindslave/objective in target.mind.objectives)
target.mind.objectives -= objective

if(target.mind.objectives.len == 0)
SSticker.mode.traitors -= target.mind

if(target.stat != DEAD)
target.visible_message("<span class='notice'>[target] looks like they have just been released from slavery!</span>", "<span class='boldnotice'>You feel as if you have just been released from eternal slavery. Yet you cant seem to remember anything at all!</span>")
return TRUE

/obj/item/implant/mindslave/activate()
var/turf/T = get_turf(loc)

if (ismob(loc))
var/mob/M = loc
to_chat(M, "<span class='danger'>Your master has decided to detonate you!</span>")

if(T)
T.hotspot_expose(1200,240)

explosion(T, 1, 2, 3, 3)

qdel(src)
return

/obj/item/implanter/mindslave
name = "implanter (mindslave)"

/obj/item/implanter/mindslave/New()
imp = new /obj/item/implant/mindslave(src)
..()

/datum/objective/mindslave
martyr_compatible = TRUE
5 changes: 5 additions & 0 deletions code/game/objects/items/storage/uplink_kits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,11 @@
/obj/item/storage/box/syndie_kit/imp_radio/PopulateContents()
new /obj/item/implanter/radio/syndicate(src)

/obj/item/storage/box/syndie_kit/imp_mindslave/PopulateContents()
var/obj/item/implanter/mindslave/M = new(src)
var/obj/item/cartridge/slavemaster/S = new(src)
S.imp = M.imp

/obj/item/storage/box/syndie_kit/centcom_costume/PopulateContents()
new /obj/item/clothing/under/rank/centcom_officer(src)
new /obj/item/clothing/shoes/sneakers/black(src)
Expand Down
6 changes: 6 additions & 0 deletions code/modules/uplink/uplink_items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1148,6 +1148,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/box/syndie_kit/imp_radio
cost = 4

/datum/uplink_item/implants/mindslave
name = "Mindslave Implant"
desc = "An implant injected into a targets body. Will cause the target to obey your every command whilst the target is implanted. Implant can be removed by surgery!"
item = /obj/item/storage/box/syndie_kit/imp_mindslave
cost = 12


// Cybernetics
/datum/uplink_item/cyber_implants
Expand Down
1 change: 1 addition & 0 deletions yogstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,7 @@
#include "code\game\objects\items\implants\implant_freedom.dm"
#include "code\game\objects\items\implants\implant_krav_maga.dm"
#include "code\game\objects\items\implants\implant_loyality.dm"
#include "code\game\objects\items\implants\implant_mindslave.dm"
#include "code\game\objects\items\implants\implant_misc.dm"
#include "code\game\objects\items\implants\implant_spell.dm"
#include "code\game\objects\items\implants\implant_storage.dm"
Expand Down