Skip to main content

nil_core/npc/precursor/
a.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use crate::capital::Capital;
5use crate::continent::coord::Coord;
6use crate::continent::size::ContinentSize;
7use crate::ethic::{EthicPowerAxis, EthicTruthAxis, Ethics};
8use crate::npc::precursor::PrecursorId;
9use crate::resources::Resources;
10use crate::resources::gold::Gold;
11use crate::resources::influence::Influence;
12use nil_core_macros::Precursor;
13use serde::{Deserialize, Serialize};
14
15#[derive(Precursor, Clone, Debug, Deserialize, Serialize)]
16#[serde(rename_all = "camelCase")]
17pub struct A {
18  origin: Coord,
19  capital: Capital,
20  resources: Resources,
21  gold: Gold,
22  influence: Influence,
23}
24
25impl A {
26  pub const ID: PrecursorId = PrecursorId::A;
27  pub const ETHICS: Ethics = Ethics::builder()
28    .power(EthicPowerAxis::Militarist)
29    .truth(EthicTruthAxis::FanaticMaterialist)
30    .build();
31
32  pub fn new(size: ContinentSize) -> Self {
33    let origin = origin(size);
34    Self {
35      origin,
36      capital: Capital::new(origin),
37      resources: Resources::PRECURSOR,
38      gold: Gold::MIN,
39      influence: Influence::MAX,
40    }
41  }
42}
43
44const fn origin(size: ContinentSize) -> Coord {
45  let size = u8::from(size);
46  let radius = size.div_ceil(20).next_multiple_of(2);
47  Coord::splat(0) + Coord::splat(radius)
48}