Skip to main content

nil_core/world/cheat/
resources.rs

1// Copyright (C) Call of Nil contributors
2// SPDX-License-Identifier: AGPL-3.0-only
3
4use crate::bail_if_cheats_are_not_allowed;
5use crate::error::Result;
6use crate::resources::prelude::*;
7use crate::ruler::Ruler;
8use crate::world::World;
9
10pub fn get_resources(world: &World, ruler: &Ruler) -> Result<Resources> {
11  bail_if_cheats_are_not_allowed!(world);
12  world
13    .ruler(ruler)
14    .map(|ruler| ruler.resources())
15}
16
17pub fn set_resources(world: &mut World, ruler: &Ruler, resources: Resources) -> Result<()> {
18  bail_if_cheats_are_not_allowed!(world);
19
20  world
21    .ruler_mut(ruler)?
22    .resources_mut()
23    .replace(resources);
24
25  world.emit_ruler(ruler)?;
26
27  Ok(())
28}
29
30#[inline]
31pub fn set_max_resources(world: &mut World, ruler: &Ruler) -> Result<()> {
32  update_resources(world, ruler, |resources| *resources = Resources::MAX)
33}
34
35pub fn set_max_silo_resources(world: &mut World, ruler: &Ruler) -> Result<()> {
36  update_resources(world, ruler, |resources| {
37    resources.food = Food::MAX;
38  })
39}
40
41pub fn set_max_warehouse_resources(world: &mut World, ruler: &Ruler) -> Result<()> {
42  update_resources(world, ruler, |resources| {
43    resources.iron = Iron::MAX;
44    resources.stone = Stone::MAX;
45    resources.wood = Wood::MAX;
46  })
47}
48
49#[inline]
50pub fn set_food(world: &mut World, ruler: &Ruler, food: Food) -> Result<()> {
51  update_resources(world, ruler, |resources| resources.food = food)
52}
53
54#[inline]
55pub fn set_max_food(world: &mut World, ruler: &Ruler) -> Result<()> {
56  update_resources(world, ruler, |resources| resources.food = Food::MAX)
57}
58
59#[inline]
60pub fn set_iron(world: &mut World, ruler: &Ruler, iron: Iron) -> Result<()> {
61  update_resources(world, ruler, |resources| resources.iron = iron)
62}
63
64#[inline]
65pub fn set_max_iron(world: &mut World, ruler: &Ruler) -> Result<()> {
66  update_resources(world, ruler, |resources| resources.iron = Iron::MAX)
67}
68
69#[inline]
70pub fn set_stone(world: &mut World, ruler: &Ruler, stone: Stone) -> Result<()> {
71  update_resources(world, ruler, |resources| resources.stone = stone)
72}
73
74#[inline]
75pub fn set_max_stone(world: &mut World, ruler: &Ruler) -> Result<()> {
76  update_resources(world, ruler, |resources| resources.stone = Stone::MAX)
77}
78
79#[inline]
80pub fn set_wood(world: &mut World, ruler: &Ruler, wood: Wood) -> Result<()> {
81  update_resources(world, ruler, |resources| resources.wood = wood)
82}
83
84#[inline]
85pub fn set_max_wood(world: &mut World, ruler: &Ruler) -> Result<()> {
86  update_resources(world, ruler, |resources| resources.wood = Wood::MAX)
87}
88
89fn update_resources(
90  world: &mut World,
91  ruler: &Ruler,
92  f: impl FnOnce(&mut Resources),
93) -> Result<()> {
94  let mut resources = world.ruler(ruler)?.resources();
95  f(&mut resources);
96  set_resources(world, ruler, resources)
97}