Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reworks infiltrators and converts them into a midround antagonist #22802

Open
wants to merge 30 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
7e1cea1
A start
Oblisk234 Nov 4, 2024
b597cb9
10 TC
Oblisk234 Nov 6, 2024
b38711b
Fixes PDAs and gives them the rest of the chameleon kit
Oblisk234 Nov 8, 2024
8994341
Fixes chameleon hardsuits and them unduly calling their own proc hund…
Oblisk234 Nov 9, 2024
3a76e3a
Helmet light respects sprites
Oblisk234 Nov 9, 2024
d552719
Surgery dufflebag
Oblisk234 Nov 10, 2024
e855a6d
Fixes the infiltrator cutter's bolt airlocks button
Oblisk234 Nov 10, 2024
624d148
Puts it back to the old preview
Oblisk234 Nov 12, 2024
901ec4f
Escape disguised objective
Oblisk234 Nov 13, 2024
5d2d248
Chameleon copying
Oblisk234 Nov 14, 2024
e342e6f
Revert "Chameleon copying"
Oblisk234 Nov 14, 2024
00cea31
Do not go to the base to end the round
Oblisk234 Nov 18, 2024
8c907d8
Back to chameleon copying, I guess
Oblisk234 Nov 19, 2024
8b682ef
Actually make it do something
Oblisk234 Nov 19, 2024
bc4e49d
This is why I need to think sometimes
Oblisk234 Nov 19, 2024
69d76d1
Even more of a mess
Oblisk234 Nov 20, 2024
f0afe83
Semi working but still not working
Oblisk234 Nov 21, 2024
397575c
Back to atoms I guess
Oblisk234 Nov 21, 2024
7acb94a
Just to confirm it isn't this
Oblisk234 Nov 21, 2024
13851bf
Finally works
Oblisk234 Nov 23, 2024
7b55b8c
Chameleon working, but badly
Oblisk234 Nov 25, 2024
89461c7
Might be more reasonable
Oblisk234 Nov 25, 2024
7c2d2c7
Moves it to 10 seconds instead
Oblisk234 Nov 25, 2024
ac064eb
Keeps chameleon copy to one proc
Oblisk234 Nov 27, 2024
2e4beb5
Refinements
Oblisk234 Dec 2, 2024
8cbf791
Adds chameleon copy sprite
Oblisk234 Dec 14, 2024
1801cb4
Gives them break machinery
Oblisk234 Dec 15, 2024
c25e981
Makes bad hardsuit list static
Oblisk234 Dec 20, 2024
1faa6f9
Prevents chameleon copy duplicating
Oblisk234 Dec 23, 2024
118f796
Okay, maybe I should have checked the typepath
Oblisk234 Dec 23, 2024
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
18 changes: 5 additions & 13 deletions _maps/shuttles/infiltrator_cutter.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
dir = 2
},
/obj/machinery/door/airlock/external{
id_tag = "syndicatecutter_bolt_port"
id_tag = "bolt_port"
},
/obj/docking_port/mobile{
callTime = 150;
Expand Down Expand Up @@ -69,7 +69,7 @@
dir = 1
},
/obj/machinery/door/airlock/external{
id_tag = "syndicatecutter_bolt_port"
id_tag = "bolt_port"
},
/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
/turf/open/floor/plating,
Expand Down Expand Up @@ -204,13 +204,6 @@
/area/shuttle/yogs/stealthcruiser)
"aC" = (
/obj/structure/table,
/obj/item/circular_saw,
/obj/item/scalpel{
pixel_y = 12
},
/obj/item/cautery{
pixel_x = 4
},
/obj/machinery/light/small{
dir = 8
},
Expand Down Expand Up @@ -312,8 +305,7 @@
/area/shuttle/yogs/stealthcruiser)
"aN" = (
/obj/structure/table,
/obj/item/retractor,
/obj/item/hemostat,
/obj/item/storage/backpack/duffelbag/med/surgery,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
/area/shuttle/yogs/stealthcruiser)
Expand Down Expand Up @@ -757,7 +749,7 @@
},
/obj/effect/mapping_helpers/airlock/locked,
/obj/machinery/door/airlock/external{
id_tag = "syndicatecutter_bolt_starboard"
id_tag = "bolt_starboard"
},
/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
/turf/open/floor/plating,
Expand All @@ -780,7 +772,7 @@
},
/obj/effect/mapping_helpers/airlock/locked,
/obj/machinery/door/airlock/external{
id_tag = "syndicatecutter_bolt_starboard"
id_tag = "bolt_starboard"
},
/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
/turf/open/floor/plating,
Expand Down
103 changes: 101 additions & 2 deletions code/modules/clothing/chameleon.dm
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,89 @@
return TRUE


/datum/action/cooldown/chameleon_copy
name = "Copy person"
button_icon = 'yogstation/icons/mob/actions.dmi'
button_icon_state = "chameleon_copy"
var/target_range = 3
var/syndicate = FALSE
var/active = FALSE
var/copying = FALSE
var/in_use = FALSE

/datum/action/cooldown/chameleon_copy/InterceptClickOn(mob/living/caller, params, atom/target)
click_with_power(target)

/datum/action/cooldown/chameleon_copy/Grant(mob/M)
if(syndicate)
owner_has_control = is_syndicate(M)
. = ..()

/datum/action/cooldown/chameleon_copy/proc/toggle_button()
if(active)
active = FALSE
background_icon_state = "bg_default"
build_all_button_icons()
unset_click_ability(owner)
return FALSE
active = TRUE
background_icon_state = "bg_default_on"
build_all_button_icons()
set_click_ability(owner)

/datum/action/cooldown/chameleon_copy/Trigger(trigger_flags, atom/target)
if(active)
toggle_button()
else
to_chat(owner, span_announce("Whom shall your chameleon kit copy?")) //Bad wording, need to improve it
toggle_button()


/datum/action/cooldown/chameleon_copy/proc/CheckValidTarget(atom/target)
if(target == owner)
return FALSE
if(!ishuman(target))
return FALSE
return TRUE

/datum/action/cooldown/chameleon_copy/proc/click_with_power(atom/target_atom)
if(in_use || !CheckValidTarget(target_atom))
return FALSE
in_use = TRUE
FireTargetedPower(target_atom)
in_use = FALSE
return TRUE

/datum/action/cooldown/chameleon_copy/proc/FireTargetedPower(atom/target_atom)
var/mob/living/carbon/human/T = target_atom
var/datum/outfit/O = new()
to_chat(owner, span_notice("Attempting to copy [T]..."))
if(!do_after(owner, 10 SECONDS, target_atom))
return
O.uniform = T.w_uniform
O.suit = T.wear_suit
O.head = T.head
O.shoes = T.shoes
O.gloves = T.gloves
O.ears = T.ears
O.glasses = T.glasses
O.mask = T.wear_mask
O.back = T.back
var/list/types = O.get_chameleon_disguise_info()
for(var/Y in types)
for(var/V in owner.chameleon_item_actions)
var/datum/action/item_action/chameleon/change/A = V
var/obj/item/I = Y
if(A.chameleon_blacklist[Y] || (initial(I.item_flags) & ABSTRACT || !initial(I.icon_state)))
continue
if(istype(Y, A.chameleon_type)) //Need to make sure it's the right type, wouldn't want to wear an armour vest on your head.
A.update_look(owner, Y)
A.copying = TRUE
A.copy_target = T
to_chat(owner, span_notice("Successfully copied [T]!"))
toggle_button()


/datum/action/item_action/chameleon/change
name = "Chameleon Change"
var/list/chameleon_blacklist = list() //This is a typecache
Expand All @@ -152,6 +235,8 @@
var/emp_timer
var/current_disguise = null
var/syndicate = FALSE
var/copying = FALSE
var/mob/living/copy_target

/datum/action/item_action/chameleon/change/Grant(mob/M)
if(M && (owner != M))
Expand All @@ -160,6 +245,9 @@
var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit()
O.syndicate = syndicate
O.Grant(M)
var/datum/action/cooldown/chameleon_copy/C = new /datum/action/cooldown/chameleon_copy()
C.syndicate = syndicate
C.Grant(M)
else
M.chameleon_item_actions |= src
if(syndicate)
Expand All @@ -172,6 +260,8 @@
if(!LAZYLEN(M.chameleon_item_actions))
var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions
qdel(O)
var/datum/action/cooldown/chameleon_copy/C = locate(/datum/action/cooldown/chameleon_copy) in M.actions
qdel(C)
return ..()

/datum/action/item_action/chameleon/change/proc/initialize_disguises()
Expand All @@ -195,6 +285,7 @@
if(!picked_item)
return
update_look(user, picked_item)
copying = FALSE

/datum/action/item_action/chameleon/change/proc/random_look(mob/user)
var/picked_name = pick(chameleon_list)
Expand Down Expand Up @@ -275,10 +366,16 @@
if(istype(atom_target, /obj/item/clothing/suit/space/hardsuit/infiltration)) //YOGS START
var/obj/item/clothing/suit/space/hardsuit/infiltration/I = target
var/obj/item/clothing/suit/space/hardsuit/HS = picked_item
var/obj/item/clothing/head/helmet/helmet = initial(HS.helmettype)
var/obj/item/clothing/head/helmet/space/hardsuit/helmet = initial(HS.helmettype)
I.head_piece.initial_state = initial(helmet.icon_state)
update_item(helmet, I.head_piece)
I.head_piece.update_appearance(UPDATE_ICON)
I.head_piece.current_disguise = picked_item
I.head_piece.new_type = helmet.hardsuit_type
var/datum/action/A
for(var/X in I.actions)
A = X
A.build_all_button_icons()

qdel(helmet)
//YOGS END

Expand Down Expand Up @@ -616,6 +713,8 @@
chameleon_action.emp_randomise(INFINITY)

/obj/item/clothing/mask/chameleon/attack_self(mob/user)
if(!is_syndicate(user)) //Wouldn't want someone to randomly find a switch on a mask, would we?
return
vchange = !vchange
to_chat(user, span_notice("The voice changer is now [vchange ? "on" : "off"]!"))
if(vchange)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,11 +233,17 @@
)
return ..()

//for inside one of the nukie lockers
//for inside one of the nukie lockers and the ones infiltrators spawn with
/obj/item/modular_computer/tablet/pda/preset/syndicate
desc = "Based off Nanotrasen's PDAs, this one has been reverse-engineered and loaded with illegal software provided by the Syndicate."
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#A80001#5C070F#000000"
starting_components = list( /obj/item/computer_hardware/processor_unit/small,
/obj/item/stock_parts/cell/computer,
/obj/item/computer_hardware/hard_drive/small/syndicate,
/obj/item/computer_hardware/network_card/advanced,
/obj/item/computer_hardware/card_slot,
/obj/item/computer_hardware/printer/mini)

/obj/item/modular_computer/tablet/pda/preset/syndicate/Initialize(mapload)
obj_flags |= EMAGGED //starts emagged
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
starting_components = list( /obj/item/computer_hardware/processor_unit/small,
/obj/item/stock_parts/cell/computer,
/obj/item/computer_hardware/hard_drive/small/nukeops,
/obj/item/computer_hardware/network_card)
/obj/item/computer_hardware/network_card/advanced)

starting_files = list(new /datum/computer_file/program/radar/fission360)
initial_program = /datum/computer_file/program/radar/fission360
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const Infiltrator: Antagonist = {
`,
INFILTRATOR_MECHANICAL_DESCRIPTION,
],
category: Category.Roundstart,
category: Category.Midround,
priority: -1,
};

Expand Down
1 change: 0 additions & 1 deletion yogstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -4086,7 +4086,6 @@
#include "yogstation\code\game\gamemodes\clean_this_shit_up\blood_cult.dm"
#include "yogstation\code\game\gamemodes\clean_this_shit_up\clock_cult.dm"
#include "yogstation\code\game\gamemodes\clean_this_shit_up\other.dm"
#include "yogstation\code\game\gamemodes\infiltration\infiltration.dm"
#include "yogstation\code\game\machinery\suit_storage_unit.dm"
#include "yogstation\code\game\machinery\computer\arcade.dm"
#include "yogstation\code\game\machinery\computer\atmos_sim.dm"
Expand Down
54 changes: 0 additions & 54 deletions yogstation/code/game/gamemodes/infiltration/infiltration.dm

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
. = ..()
ADD_TRAIT(src, TRAIT_EMPPROOF_SELF, "innate_empproof")
ADD_TRAIT(src, TRAIT_EMPPROOF_CONTENTS, "innate_empproof")
var/datum/component/uplink/uplink = AddComponent(/datum/component/uplink, _owner, TRUE, FALSE, null, 20)
var/datum/component/uplink/uplink = AddComponent(/datum/component/uplink, _owner, TRUE, FALSE, null, 10)
uplink.set_antagonist(ROLE_INFILTRATOR)
alert_radio = new(src)
alert_radio.make_syndie()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team.
var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint.
var/dress_up = TRUE
preview_outfit = /datum/outfit/infiltrator
preview_outfit = /datum/outfit/infiltrator_preview

/datum/antagonist/infiltrator/apply_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current
Expand All @@ -24,7 +24,6 @@
to_chat(owner, span_notice("You also have an internal radio, for communicating with your team-mates at all times."))
to_chat(owner, span_notice("You have a dusting implant, to ensure that Nanotrasen does not get their hands on Syndicate gear. Only activate it, if you are compromised."))
to_chat(owner, span_boldnotice(span_italics("Do NOT kill or destroy needlessly, as this defeats the purpose of an 'infiltration'!")))
to_chat(owner, span_boldnotice("Once your objectives are complete, return to base, with all living infiltrators, to end the round."))
owner.announce_objectives()

/datum/antagonist/infiltrator/on_gain()
Expand Down
35 changes: 35 additions & 0 deletions yogstation/code/modules/antagonists/infiltrator/items/hardsuit.dm
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,48 @@
item_state = "eng_helm"
armor = list(MELEE = 35, BULLET = 15, LASER = 30,ENERGY = 10, BOMB = 10, BIO = 100, RAD = 50, FIRE = 75, ACID = 75)
syndicate = TRUE
var/current_disguise = /obj/item/clothing/suit/space/hardsuit/infiltration
var/new_type = "engineering"
var/static/list/bad_hardsuits = list(
/obj/item/clothing/suit/space/hardsuit/darktemplar,
/obj/item/clothing/suit/space/hardsuit/darktemplar/chap,
/obj/item/clothing/suit/space/hardsuit/cult,
/obj/item/clothing/suit/space/hardsuit/syndi,
/obj/item/clothing/suit/space/hardsuit/syndi/elite,
/obj/item/clothing/suit/space/hardsuit/syndi/owl,
/obj/item/clothing/suit/space/hardsuit/syndi/debug,
/obj/item/clothing/suit/space/hardsuit/carp,
/obj/item/clothing/suit/space/hardsuit/carp/dragon,
/obj/item/clothing/suit/space/hardsuit/swat,
/obj/item/clothing/suit/space/hardsuit/swat/captain,
/obj/item/clothing/suit/space/hardsuit/ert/paranormal,
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor,
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker,
/obj/item/clothing/suit/space/hardsuit/shielded/swat,
/obj/item/clothing/suit/space/hardsuit/shielded/swat/honk,
/obj/item/clothing/suit/space/hardsuit/deathsquad
)

/obj/item/clothing/head/helmet/space/hardsuit/infiltration/Initialize(mapload)
. = ..()
if(istype(loc, /obj/item/clothing/suit/space/hardsuit/infiltration))
var/obj/item/clothing/suit/space/hardsuit/infiltration/I = loc
I.head_piece = src

/obj/item/clothing/head/helmet/space/hardsuit/infiltration/attack_self(mob/user)
if(bad_hardsuits.Find(current_disguise))
to_chat(user, span_warning("You can't use the hardsuit's helmet light with this current disguise, change to another one!"))
else //Copied from original hardsuit attack_self and modified slightly
on = !on
icon_state = "[basestate][on]-[new_type]"
user.update_inv_head() //so our mob-overlays update

set_light_on(on)

for(var/X in actions)
var/datum/action/A = X
A.build_all_button_icons()

/obj/item/clothing/suit/space/hardsuit/infiltration
name = "engineering hardsuit"
icon_state = "hardsuit-engineering"
Expand Down
Loading
Loading