1use crate::chat::ChatMessage;
5use crate::continent::Coord;
6use crate::event::{Event, Listener};
7use crate::player::PlayerId;
8use crate::report::battle::BattleReport;
9use crate::report::support::SupportReport;
10use crate::report::{Report, ReportId};
11use crate::world::World;
12
13impl World {
14 #[inline]
15 pub fn subscribe(&self) -> Listener {
16 self.emitter.subscribe()
17 }
18
19 fn broadcast(&self, event: Event) {
21 self.emitter.broadcast(event);
22 }
23
24 fn emit_to(&self, target: PlayerId, event: Event) {
26 self.emitter.emit_to(target, event);
27 }
28
29 fn emit_to_owner(&self, coord: Coord, event: Event) {
31 if let Ok(city) = self.city(coord)
32 && let Some(player) = city.player()
33 {
34 self.emitter.emit_to(player, event);
35 }
36 }
37
38 pub(super) fn emit_battle_report(&self, report: &BattleReport) {
39 if let Some(attacker) = report.attacker().player().cloned() {
40 self.emit_report(attacker, report.id());
41 }
42
43 if let Some(defender) = report.defender().player().cloned() {
44 debug_assert_ne!(report.attacker().player(), Some(&defender));
45 self.emit_report(defender, report.id());
46 }
47 }
48
49 pub(super) fn emit_chat_updated(&self, message: ChatMessage) {
51 self.broadcast(Event::ChatUpdated { message });
52 }
53
54 pub(super) fn emit_city_updated(&self, coord: Coord) {
56 self.emit_to_owner(coord, Event::CityUpdated { coord });
57 }
58
59 pub(super) fn emit_military_updated(&self, player: PlayerId) {
61 self.emit_to(player.clone(), Event::MilitaryUpdated { player });
62 }
63
64 pub(super) fn emit_player_updated(&self, player: PlayerId) {
66 self.emit_to(player.clone(), Event::PlayerUpdated { player });
67 }
68
69 pub(super) fn emit_public_city_updated(&self, coord: Coord) {
71 self.broadcast(Event::PublicCityUpdated { coord });
72 }
73
74 pub(super) fn emit_report(&self, player: PlayerId, report: ReportId) {
76 self.emit_to(player, Event::Report { report });
77 }
78
79 pub(super) fn emit_round_updated(&self) {
81 let round = self.round.clone();
82 self.broadcast(Event::RoundUpdated { round });
83 }
84
85 pub(super) fn emit_support_report(&self, report: &SupportReport) {
86 if let Some(sender) = report.sender().player().cloned() {
87 self.emit_report(sender, report.id());
88 }
89
90 if let Some(receiver) = report.receiver().player().cloned() {
91 debug_assert_ne!(report.sender().player(), Some(&receiver));
92 self.emit_report(receiver, report.id());
93 }
94 }
95}