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

Traitors 2.0: Priority directives #10745

Closed

Conversation

PowerfulBacon
Copy link
Member

@PowerfulBacon PowerfulBacon commented Mar 14, 2024

About The Pull Request

Implements priority directives, as defined by the design documents posted in the associated thread in discord.

Priority directives are optional missions given to traitors that can grant the traitor with additional TC if they complete the mission. The only catch is that other traitors may be trying to complete the same objectives, and only 1 person can claim the prize!

Here is a bullet point list of things:

  • New UI tab on the uplink, detailing assignments and priority directives.
  • You can now track assassinate and steal objectives via the uplink.
  • Priority directives will spawn at the 20-30 minute mark.
  • Priority directives can be every man for himself, team vs team, and can optionally involve security.
  • The uplink will now list the objectives of its owner, but only if those objectives relate to an antagonist that is in the syndicate faction. (becoming a cultist will not show your non-syndicate objectives in the uplink)

There will be 3 priority directives implemented with this update:

  • Secure deposit box: A trackable box containing a set amount of TC will be shown to all traitors, after the time limit expires the box will unlock and the holder of the box can take the TC from it. Will you work together and split the prize, or fight to take it all?
  • Communication Beacon: Team vs Team, half the traitors need to setup a beacon in a determined location, while the other half need to prevent the deployment of that beacon. TC is rewarded to the winners automatically at the end regardless of their participation. The catch is that you don't know who is on your team, and who you can trust.
  • Assassination: Independent vs Security: Security is informed of a suspect that has had a target placed on their back. All traitors are given the directive to eliminate them. Once a photo of their corpse is uploaded, then the reward can be claimed by the person who uploaded that photo.

TODO:

  • Make it so the notification bell appears when a directive is new.
  • Give a sound to any traitors holding their uplink when a directive comes in.
  • Fix the bottom left of the UI saying no reward when there is a reward.
  • Add in a security console that can support important directive notification with the future possibility for training exercise expansions.

Why It's Good For The Game

We currently suffer from a big issue with our antagonists where they are not acting until late in the round, and while I like people having the option to plan and strategically execute their plans, it often leads to rounds that consist primarilly of traitors to be incredibly boring to play with little drama to promote any meaningful gameplay or story.

This gains the following things:

  • Gameplay driven control over traitor progression, allowing options for giving antagonists more freedom within the rules without disrupting gameplay.
  • Ways for antagonists to have conflict, even if their objectives are completed in a stealthy manner or if the traitor is aiming to complete their objectives after the 1-hour mark.
  • Some things for security to watch over on shifts that are slower or lower population (for objectives that inform security about the directive).

This attempts to avoid the following things:

  • Gamey objectives that can be grinded by completing them rapidly.
  • Objectives that lead to no conflict and that don't develop the round.

Testing Photographs and Procedure

image

The new UI for uplinks. Shows the objectives of the owner, if those objectives are tied to a syndicate based antagonist role.

image

Non-trackable objectives.

image

Syndicate uplink base user interface.

image

Secure deaddrop mission.

image

Priority directive received

image

Beacon

image

Reputation system on the shop

Changelog

🆑
add: Priority directives, drama causing time-limited objectives that encourage you to maintain suspicions over your fellow traitors.
add: Certain traitor objectives are now trackable via the uplink.
tweak: Traitor TC reduced from 20 TC to 15 TC.
add: Traitor reputation system, reputation increases by completing directives and decreases slightly when failed.
balance: The cost and reputation requirements of various syndicate items has been altered.
/:cl:

@PowerfulBacon PowerfulBacon added the Strategic Milestone A long-term strategic development. PRs completed for issues with this tag will be high-priority. label Mar 14, 2024
@PowerfulBacon
Copy link
Member Author

The list of things left to do is small, should be testmergable in a few days

@github-actions github-actions bot added Administration TGUI-Changes Contains changes to TGUI. Make sure its up to date with TGUI 4.0 labels Mar 14, 2024
@PowerfulBacon PowerfulBacon changed the title Priority directives Traitors 2.0: Priority directives Mar 14, 2024
Copy link
Member

@EvilDragonfiend EvilDragonfiend left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prioritise merging this please:

MovedRelay component is broken, and this PR is necessary to fix that first.

code/controllers/subsystem/priority_directives.dm Outdated Show resolved Hide resolved
details = "We have identified a deaddrop that has been placed by a rival spy agency and have maintained an accurate track on the box. \
You have the option to track and secure the valuable items before anyone else gets to them. The items are stored in a trackable \
box which will automatically unlock after a set period of time."
var/obj/item/storage/deaddrop_box/target
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hard reference.

// Must be something that we can store in
if (!istype(stash.parent, /obj/item/storage))
continue
secret_bag = stash.parent
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

missing of break

code/game/gamemodes/objectives/_objective.dm Show resolved Hide resolved
to_chat(receiver?.current, "<span class='notice bold'>You have a secret stash at [get_area(secret_bag)], more details are stored in your notes. (IC > Notes)</span>")
for (var/datum/mind/receiver in owners)
receiver.store_memory("You have a secret stash of items hidden on the station required for your objectives. It is hidden inside of [atom_text] ([secret_bag.loc]) located at [get_area(secret_bag.loc)] [COORD(secret_bag.loc)], you may have to search around for it. (Use alt click on the object the stash is inside to access it).")
to_chat(receiver?.current, "<span class='notice bold'>You have a secret stash at [get_area(secret_bag)], more details are stored in your notes. (IC > Notes)</span>")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there should be signalRegister with MobLogin for those who are somehow DC'ed at the moment

code/game/gamemodes/objectives/basic/steal.dm Show resolved Hide resolved
Copy link
Member

@EvilDragonfiend EvilDragonfiend left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe helpful, but I am not sure

Comment on lines +73 to +75
data["pos_x"] = uplink_turf?.x
data["pos_y"] = uplink_turf?.y
data["pos_z"] = uplink_turf?.z
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think ? is redundant. it's typechecked.

Comment on lines 77 to 109
if (uplink.owner)
var/list/known_objectives = list()
for (var/datum/antagonist/antagonist_type in uplink.owner.antag_datums)
// The syndicate uplink is only aware of syndicate-given objectives.
if (antagonist_type.faction != FACTION_SYNDICATE)
continue
for (var/datum/objective/objective in antagonist_type.objectives)
var/atom/tracking_target = objective.get_tracking_target(uplink_turf)
var/turf/tracking_turf = tracking_target && get_turf(tracking_target)
known_objectives += list(list(
"name" = objective.name,
"tasks" = list(objective.explanation_text),
"track_x" = tracking_turf?.x,
"track_y" = tracking_turf?.y,
"track_z" = tracking_turf?.z,
))
// Add the priority directive
if (active_directive)
var/atom/track_atom = active_directive.get_track_atom()
var/turf/track_turf = get_turf(track_atom)
known_objectives += list(list(
"name" = active_directive.name,
"tasks" = list(active_directive.get_explanation(uplink)),
"time" = active_directive.end_at,
"details" = active_directive.get_details(uplink),
"reward" = active_directive.tc_reward,
"track_x" = track_turf?.x,
"track_y" = track_turf?.y,
"track_z" = track_turf?.z,
"action" = active_directive.get_special_action()?.action_name
))
data["objectives"] = known_objectives
return data
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

z information isn't sufficient. people won't know if 1 is centcom, or 8 is multifloored station or away. try to use compare_z proc since it just tells if compared things are at the same z category.
(altho It looks I need to improve the proc a bit)

Comment on lines +196 to +209
/datum/atom_hud/alternate_appearance/basic/some_people
var/list/seers

/datum/atom_hud/alternate_appearance/basic/some_people/mobShouldSee(mob/M)
if(M in seers)
return TRUE
return FALSE

/datum/atom_hud/alternate_appearance/basic/some_people/New(key, image/I, list/mobs)
..(key, I, FALSE)
seers = mobs
for (var/mob/seer in mobs)
add_hud_to(seer)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

considering using this:

(Comment continued in stash component)

@@ -1,57 +1,64 @@
/datum/component/stash
dupe_mode = COMPONENT_DUPE_ALLOWED
var/atom/movable/stash_item
var/datum/mind/stash_owner
var/list/stash_minds
Copy link
Member

@EvilDragonfiend EvilDragonfiend Apr 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made change from your version to mix it with my client image system.
Please check: 493e0db

  • my client image system can keep client images to minds instead of mob based. This makes that you don't have to refresh mob based client images every time mind is changed or something. This is why I nuked transfer_mind() here.
    Even if they aghost or got brain-transfered, they keep this, and you don't have to send a signal here.
  • This can be easily expanded to allow non-stash owners see this (i.e. Detective)
    showing stash image won't be done through this component. You just need to find out which cimg_key is used, and just do validate_mob(stash_cimg_key, detective_mob) and then they'll be able to investigate it. (They won't be able to access. just can see it)
  • add_membership() and remove_membership() is likely necessary here because someone can be removed, or someone can be added to the party.
    Admin might want to add a new member to a stash when they have to fix or do some admeme.

The proc owner_deleted() in the original code calls create_owner_icon() everytime when alternative appearance should be updated, but my client image system can simplify this much.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

31e665a

Original stash code change example if this is too much

@EvilDragonfiend
Copy link
Member

EvilDragonfiend commented Apr 9, 2024

Also, please prioritise #10729

I am starting to forget the detail of the issue about why MovedRelay is broken.

@PowerfulBacon
Copy link
Member Author

Ready for TM

Copy link

github-actions bot commented May 7, 2024

This pull request has conflicts, please resolve those before we can evaluate the pull request.

Copy link

This pull request has conflicts, please resolve those before we can evaluate the pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Administration Balance/Rebalance Feature Merge Conflict Needs Testmerge Sprites Stale Strategic Milestone A long-term strategic development. PRs completed for issues with this tag will be high-priority. TGUI-Changes Contains changes to TGUI. Make sure its up to date with TGUI 4.0 Tweak
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants