1use super::*;
2use crate::parser::{Position, RlError};
3use std::collections::HashMap;
4
5#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Default)]
6pub struct EventId(pub usize);
7impl Id for EventId {
8 fn index(&self) -> usize {
9 self.0
10 }
11}
12
13#[derive(Debug, Clone)]
14pub struct Event {
15 id: EventId,
16 name: String,
17 guard: Option<Expr>,
18 effects: Vec<Effect>,
19 position: Option<Position>,
20}
21
22impl Event {
23 pub fn new<S: Into<String>>(
24 name: S,
25 guard: Option<Expr>,
26 effects: Vec<Effect>,
27 position: Option<Position>,
28 ) -> Self {
29 let id = EventId::default();
30 let name = name.into();
31 Self {
32 id,
33 name,
34 guard,
35 effects,
36 position,
37 }
38 }
39
40 pub fn guard(&self) -> &Option<Expr> {
41 &self.guard
42 }
43
44 pub fn effects(&self) -> &Vec<Effect> {
45 &self.effects
46 }
47
48 pub fn resolve_resource(&mut self, map: &HashMap<String, ResourceId>) -> Result<(), RlError> {
51 match &mut self.guard {
52 Some(e) => {
53 e.resolve_resource(map)?;
54 }
55 None => {}
56 }
57 for x in self.effects.iter_mut() {
58 x.resolve_resource(map)?;
59 }
60 Ok(())
61 }
62
63 pub fn resolve_state(&mut self, map: &HashMap<String, StateId>) -> Result<(), RlError> {
64 match &mut self.guard {
65 Some(e) => {
66 e.resolve_state(map)?;
67 }
68 None => {}
69 }
70 for x in self.effects.iter_mut() {
71 x.resolve_state(map)?;
72 }
73 Ok(())
74 }
75}
76
77impl Named<EventId> for Event {
78 fn id(&self) -> EventId {
79 self.id
80 }
81
82 fn set_id(&mut self, id: EventId) {
83 self.id = id;
84 }
85
86 fn name(&self) -> &str {
87 &self.name
88 }
89 fn position(&self) -> Option<Position> {
90 self.position.clone()
91 }
92}
93
94impl ToLang for Event {
95 fn to_lang(&self, skillset: &Skillset) -> String {
96 let mut s = String::new();
97 s.push_str(&format!("\t\t{} {{\n", self.name));
98 match &self.guard {
100 Some(guard) => s.push_str(&format!("\t\t\tguard {}\n", guard.to_lang(skillset))),
101 None => {}
102 }
103 if !self.effects.is_empty() {
105 s.push_str("\t\t\teffect {\n");
106 for x in self.effects.iter() {
107 s.push_str(&format!("\t\t\t\t{}\n", x.to_lang(skillset)))
108 }
109 s.push_str("\t\t\t}\n");
110 }
111 s.push_str("\t\t}\n");
113 s
114 }
115}
116
117impl std::fmt::Display for Event {
118 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
119 write!(f, "{}", self.name())
120 }
121}