aboutsummaryrefslogtreecommitdiff
path: root/games/rstnode/src/gens.rs
diff options
context:
space:
mode:
Diffstat (limited to 'games/rstnode/src/gens.rs')
-rw-r--r--games/rstnode/src/gens.rs92
1 files changed, 92 insertions, 0 deletions
diff --git a/games/rstnode/src/gens.rs b/games/rstnode/src/gens.rs
new file mode 100644
index 000000000000..7374731c826d
--- /dev/null
+++ b/games/rstnode/src/gens.rs
@@ -0,0 +1,92 @@
+//! Helpers to determine if a node can send a particular packet.
+
+/// These functions are unfortunately all a bit stringly typed atm
+pub mod can_send {
+ use crate::data::{Level, PacketType, Upgrade};
+ use Level::*;
+
+ #[inline]
+ pub fn base() -> Vec<&'static str> {
+ vec!["ping", "capture"]
+ }
+
+ /// Guard nodes are the most versatile
+ #[inline]
+ pub fn guard(lvl: Level) -> Vec<&'static str> {
+ match lvl {
+ // This is just kinda gross
+ One => {
+ let mut p = base();
+ p.append(&mut vec!["payload", "cns", "reset"]);
+ p
+ }
+ Two => {
+ let mut p = guard(One);
+ p.append(&mut vec!["nitm", "virus"]);
+ p
+ }
+ Three => {
+ let mut p = guard(Two);
+ p.append(&mut vec!["takeover"]);
+ p
+ }
+ }
+ }
+
+ /// Compute nodes can ping and compute but not capture
+ pub fn compute() -> Vec<&'static str> {
+ vec!["ping", "compute"]
+ }
+
+ /// Relays only relay!
+ pub fn relay() -> Vec<&'static str> {
+ vec![]
+ }
+}
+
+pub mod send {
+ use crate::{
+ data::{
+ Level::*,
+ PacketType as Pkt,
+ Upgrade::{self, *},
+ },
+ stats::strengths,
+ };
+
+ /// Turn the string type identifier into a packet
+ ///
+ /// This function makes heavy use of the stats module, which is
+ /// responsible for balancing all of these values.
+ pub fn build_packet(node: Upgrade, type_: &'static str, prev: Option<Pkt>) -> Pkt {
+ match (prev, node, type_) {
+ // All pings are the same
+ (None, _, "ping") => Pkt::Ping,
+
+ // TODO: captures should improve
+ (None, Base, "capture") | (None, Guard(_), "capture") => Pkt::Capture,
+
+ (None, Compute(lvl), "compute") => Pkt::Compute {
+ curr: Default::default(),
+ max: strengths::compute_max(lvl),
+ step: strengths::compute_step(lvl),
+ },
+
+ (Some(prev), Guard(lvl), "payload") => Pkt::Payload {
+ inner: Box::new(prev),
+ reward: strengths::payload_reward(lvl),
+ },
+
+ (None, Guard(_), "cns") => Pkt::CNS,
+ (None, Guard(_), "reset") => Pkt::Reset,
+ (None, Guard(_), "nitm") => Pkt::Nitm,
+ (None, Guard(_), "virus") => Pkt::Virus,
+
+ // Only level 3 guards can send takeovers
+ (None, Guard(Three), "takeover") => Pkt::TakeOver,
+
+ // Can't touch this
+ (_, _, _) => unreachable!(),
+ }
+ }
+}