Skip to main content

nil_core/world/
event.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use 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  /// Emits the event to all players.
20  fn broadcast(&self, event: Event) {
21    self.emitter.broadcast(event);
22  }
23
24  /// Emits the event for a specific player.
25  fn emit_to(&self, target: PlayerId, event: Event) {
26    self.emitter.emit_to(target, event);
27  }
28
29  /// Emits the event to the owner of the city at the specified coordinate, if any.
30  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  /// Emits [`Event::ChatUpdated`].
50  pub(super) fn emit_chat_updated(&self, message: ChatMessage) {
51    self.broadcast(Event::ChatUpdated { message });
52  }
53
54  /// Emits [`Event::CityUpdated`].
55  pub(super) fn emit_city_updated(&self, coord: Coord) {
56    self.emit_to_owner(coord, Event::CityUpdated { coord });
57  }
58
59  /// Emits [`Event::MilitaryUpdated`].
60  pub(super) fn emit_military_updated(&self, player: PlayerId) {
61    self.emit_to(player.clone(), Event::MilitaryUpdated { player });
62  }
63
64  /// Emits [`Event::PlayerUpdated`].
65  pub(super) fn emit_player_updated(&self, player: PlayerId) {
66    self.emit_to(player.clone(), Event::PlayerUpdated { player });
67  }
68
69  /// Emits [`Event::PublicCityUpdated`].
70  pub(super) fn emit_public_city_updated(&self, coord: Coord) {
71    self.broadcast(Event::PublicCityUpdated { coord });
72  }
73
74  /// Emits [`Event::Report`].
75  pub(super) fn emit_report(&self, player: PlayerId, report: ReportId) {
76    self.emit_to(player, Event::Report { report });
77  }
78
79  /// Emits [`Event::RoundUpdated`].
80  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}