Makes IAA good (Spawn more IAA, No more TC, Anti-tampering dust implant) (#19327)

Internal Affairs Agents now drop a special item on death. To get your kill reward as a syndicate, you must pick this item up and use it. Doing this spawns another Internal Affairs Agent.
Internal Affairs kill reward is now a random syndicate item instead of 5TC
Internal Affairs dusting implant now activates automatically if tampered with
Internal Affairs dusting implant is now automatically removed (safely) when the antag status is removed
This commit is contained in:
ynot01
2023-06-28 01:45:48 -04:00
committed by GitHub
parent 75c922430f
commit 98360ba4bb
7 changed files with 102 additions and 17 deletions

View File

@@ -43,7 +43,7 @@
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
restricted_jobs += "Assistant"
if(CONFIG_GET(flag/protect_AI_from_traitor))
restricted_jobs += "AI"
@@ -77,7 +77,7 @@
/datum/game_mode/traitor/post_setup()
for(var/datum/mind/traitor in pre_traitors)
addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/game_mode/traitor, add_traitor_delayed), traitor, null), rand(1 MINUTES, (3 MINUTES + 10 SECONDS)))
if(!exchange_blue)
exchange_blue = -1 //Block latejoiners from getting exchange objectives
..()
@@ -133,9 +133,9 @@
continue
if(!applicant.stat != CONSCIOUS)
continue
if(applicant.mind.assigned_role in protected_jobs)
if(applicant.mind.assigned_role in protected_jobs)
continue
if(applicant.mind.assigned_role in restricted_jobs)
if(applicant.mind.assigned_role in restricted_jobs)
continue
if(!(applicant.mind.assigned_role in GLOB.command_positions + GLOB.engineering_positions + GLOB.medical_positions + GLOB.science_positions + GLOB.supply_positions + GLOB.civilian_positions + GLOB.security_positions + list("AI", "Cyborg")))
continue
@@ -152,13 +152,14 @@
potential_candidates += applicant
if(!potential_candidates.len)
message_admins("Failed to find new antag after original one left! Check the antag balance please.")
return
return FALSE
var/mob/living/carbon/human/picked = pick(potential_candidates)
if(!picked || !picked.client)
return
return FALSE
var/datum/antagonist/traitor/new_antag = new antag_datum()
picked.mind.add_antag_datum(new_antag)
picked.mind.special_role = traitor_name
return TRUE
/datum/game_mode/traitor/proc/add_latejoin_traitor(datum/mind/character)
var/datum/antagonist/traitor/new_antag = new antag_datum()

View File

@@ -11,7 +11,7 @@
/obj/item/stack/telecrystal/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
@@ -33,7 +33,7 @@
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/telecrystal/attack(mob/target, mob/user)

View File

@@ -401,6 +401,7 @@
new /obj/item/bodybag/environmental/prisoner/syndicate(src)
// All about 4 TC or less - some nukeops only items, but fit nicely to the theme.
// If you update this, consider updating yogstation/code/game/objects/items/implants/implant_dusting.dm reward
var/list/item_list = list(
/obj/item/storage/backpack/duffelbag/syndie/x4,
/obj/item/storage/box/syndie_kit/throwing_weapons,

View File

@@ -34,7 +34,7 @@
if(ishuman(owner.current))
var/mob/living/carbon/human/H = owner.current
var/obj/item/implant/dusting/E = new/obj/item/implant/dusting(H)
var/obj/item/implant/dusting/iaa/E = new(H)
E.implant(H)
company = pick(subtypesof(/datum/corporation/traitor))
@@ -42,7 +42,11 @@
.=..()
/datum/antagonist/traitor/internal_affairs/on_removal()
STOP_PROCESSING(SSprocessing,src)
for(var/obj/item/implant/dusting/iaa/iaa_implant in owner?.current?.implants)
iaa_implant.defused = TRUE
qdel(iaa_implant)
.=..()
/datum/antagonist/traitor/internal_affairs/process()
iaa_process()

View File

@@ -45,11 +45,6 @@
hijack_objective.owner = owner
add_objective(hijack_objective)
if(uplink_holder && owner.current && ishuman(owner.current))
var/datum/component/uplink/uplink = uplink_holder.GetComponent(/datum/component/uplink)
uplink.telecrystals += 5
to_chat(owner, span_notice("You have been given 5 TC as a reward for completing your objective!"))
owner.announce_objectives()
/datum/game_mode/traitor/internal_affairs/add_latejoin_traitor(datum/mind/character)

View File

@@ -39,7 +39,91 @@
/obj/item/implant/dusting/on_mob_death(mob/living/L, gibbed)
activate("death")
/obj/item/implant/dusting/emp_act()
return
/obj/item/implant/dusting/iaa
var/defused = FALSE // For safe removal, admin-only
/obj/item/implant/dusting/iaa/removed(mob/living/source, silent, special)
if(!defused)
activate("tampering")
else
. = ..()
/obj/item/implant/dusting/iaa/activate(cause)
. = ..()
var/turf/my_turf = get_turf(src)
var/obj/item/iaa_reward/drop = new(my_turf)
if(imp_in)
drop.desc = "A syndicate 'dog tag' with an inscription that reads [imp_in.real_name]. Seems like it would be a bad idea to let someone evil press this."
/obj/item/iaa_reward
name = "syndicate button"
desc = "A syndicate 'dog tag' with an unreadable inscription. Seems like it would be a bad idea to let someone evil press this."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
item_state = "electronic"
resistance_flags = INDESTRUCTIBLE // no cremation cheese!
/obj/item/iaa_reward/attack_self(mob/user)
. = ..()
if(is_syndicate(user))
// Reward
var/list/item_list = list( // Contract kit random items
/obj/item/storage/backpack/duffelbag/syndie/x4,
/obj/item/storage/box/syndie_kit/throwing_weapons,
/obj/item/gun/syringe/syndicate,
/obj/item/pen/edagger,
/obj/item/pen/sleepy,
/obj/item/flashlight/emp,
/obj/item/book/granter/crafting_recipe/weapons,
/obj/item/clothing/shoes/chameleon/noslip/syndicate,
/obj/item/storage/firstaid/tactical,
/obj/item/clothing/shoes/airshoes,
/obj/item/clothing/glasses/thermal/syndi,
/obj/item/camera_bug,
/obj/item/storage/box/syndie_kit/imp_radio,
/obj/item/storage/box/syndie_kit/imp_uplink,
/obj/item/clothing/gloves/krav_maga/combatglovesplus,
// /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot,
/obj/item/reagent_containers/syringe/stimulants,
/obj/item/storage/box/syndie_kit/imp_freedom,
/obj/item/storage/belt/chameleon/syndicate,
// From here is extra items
/obj/item/storage/belt/military/shadowcloak,
/obj/item/grenade/syndieminibomb/concussion/frag,
/obj/item/card/id/syndicate,
/obj/item/storage/pill_bottle/gummies/omnizine
)
// Pick one item from three random
item_list = shuffle(item_list)
var/list/icons_available = list()
var/obj/item/first_choice = item_list[1]
var/obj/item/second_choice = item_list[2]
var/obj/item/third_choice = item_list[3]
icons_available += list(initial(first_choice.name) = image(icon = initial(first_choice.icon), icon_state = initial(first_choice.icon_state)))
icons_available += list(initial(second_choice.name) = image(icon = initial(second_choice.icon), icon_state = initial(second_choice.icon_state)))
icons_available += list(initial(third_choice.name) = image(icon = initial(third_choice.icon), icon_state = initial(third_choice.icon_state)))
var/selection = show_radial_menu(user, src, icons_available, radius = 38, require_near = TRUE)
if(!selection || selection == initial(first_choice.name))
selection = first_choice
else if(selection == initial(second_choice.name))
selection = second_choice
else if(selection == initial(third_choice.name))
selection = third_choice
var/hand_index = user.get_held_index_of_item(src)
user.dropItemToGround(src, TRUE, TRUE)
var/obj/item/reward = new selection
to_chat(user, span_notice("\The [src] transforms into \a [reward]!"))
if(!user.put_in_hand(reward, hand_index))
reward.forceMove(get_turf(user))
// Spawn new IAA
if(istype(SSticker.mode, /datum/game_mode/traitor/internal_affairs))
var/datum/game_mode/traitor/internal_affairs/iaa_mode = SSticker.mode
if(iaa_mode.create_new_traitor())
to_chat(user, span_warning("You feel like someone is watching you... Keep on your guard."))
qdel(src)
else
to_chat(user, span_notice("\The [src] doesn't seem to do anything."))

View File

@@ -165,7 +165,7 @@
item = /obj/item/book/granter/martial/worldbreaker
manufacturer = /datum/corporation/traitor/vahlen
restricted_species = list("preternis")
/datum/uplink_item/race_restricted/explosive_fist_art
name = "Burned scroll"
desc = "An ancient scroll, containing a guide to an ancient plasmamen martial art."