diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 2bacc94c913a..b1a65b185e67 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -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() diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 05fc5bd400bf..b8a237277130 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -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) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index ced3b7e0c1a2..da2e13ae9faf 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -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, diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm index 726924602f72..ecdbd6917c4a 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -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() diff --git a/yogstation/code/game/gamemodes/traitor/internal_affairs.dm b/yogstation/code/game/gamemodes/traitor/internal_affairs.dm index 7b86564abe15..f2bd321ecad2 100644 --- a/yogstation/code/game/gamemodes/traitor/internal_affairs.dm +++ b/yogstation/code/game/gamemodes/traitor/internal_affairs.dm @@ -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) diff --git a/yogstation/code/game/objects/items/implants/implant_dusting.dm b/yogstation/code/game/objects/items/implants/implant_dusting.dm index e3f756980f40..be1bf02668cd 100644 --- a/yogstation/code/game/objects/items/implants/implant_dusting.dm +++ b/yogstation/code/game/objects/items/implants/implant_dusting.dm @@ -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.")) diff --git a/yogstation/code/modules/uplink/uplink_item.dm b/yogstation/code/modules/uplink/uplink_item.dm index 01d7577f476e..efcf21d19a5c 100644 --- a/yogstation/code/modules/uplink/uplink_item.dm +++ b/yogstation/code/modules/uplink/uplink_item.dm @@ -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."