use super::super::resources::ResourceType;
use super::ActionLogTarget;
use crate::data::RoomName;
with_update_struct! {
#[derive(serde_derive::Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CreepPart {
pub hits: i32,
#[serde(rename = "type")]
pub part_type: CreepPartType,
pub boost: Option<ResourceType>,
}
#[derive(serde_derive::Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CreepPartUpdate { ... }
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(rename_all = "snake_case")]
pub enum CreepPartType {
Move,
Work,
Carry,
Attack,
Heal,
RangedAttack,
Tough,
Claim,
}
basic_updatable!(CreepPartType);
with_update_struct! {
#[derive(serde_derive::Deserialize, Default, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CreepMessage {
pub is_public: bool,
pub message: String,
}
#[derive(serde_derive::Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CreepMessageUpdate { ... }
}
with_update_struct! {
#[derive(serde_derive::Deserialize, Default, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct CreepActions {
pub harvest: Option<ActionLogTarget>,
pub build: Option<ActionLogTarget>,
pub repair: Option<ActionLogTarget>,
pub attack: Option<ActionLogTarget>,
pub heal: Option<ActionLogTarget>,
pub ranged_attack: Option<ActionLogTarget>,
pub ranged_heal: Option<ActionLogTarget>,
pub ranged_mass_attack: Option<ActionLogTarget>,
pub reserve_controller: Option<ActionLogTarget>,
pub upgrade_controller: Option<ActionLogTarget>,
pub attacked: Option<ActionLogTarget>,
pub healed: Option<ActionLogTarget>,
pub say: Option<CreepMessage>,
}
#[derive(serde_derive::Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CreepActionsUpdate { ... }
}
with_resource_fields_and_update_struct! {
{
crate::websocket::types::room::resources::ResourceType;
Energy => energy => "energy"
=> Some(crate::websocket::types::room::resources::ResourceType::Power);
Power => power => "power"
=> Some(crate::websocket::types::room::resources::ResourceType::Hydrogen);
Hydrogen => hydrogen => "H"
=> Some(crate::websocket::types::room::resources::ResourceType::Oxygen);
Oxygen => oxygen => "O"
=> Some(crate::websocket::types::room::resources::ResourceType::Utrium);
Utrium => utrium => "U"
=> Some(crate::websocket::types::room::resources::ResourceType::Lemergium);
Lemergium => lemergium => "L"
=> Some(crate::websocket::types::room::resources::ResourceType::Keanium);
Keanium => keanium => "K"
=> Some(crate::websocket::types::room::resources::ResourceType::Zynthium);
Zynthium => zynthium => "Z"
=> Some(crate::websocket::types::room::resources::ResourceType::Catalyst);
Catalyst => catalyst => "X"
=> Some(crate::websocket::types::room::resources::ResourceType::Ghodium);
Ghodium => ghodium => "G"
=> Some(crate::websocket::types::room::resources::ResourceType::Hydroxide);
Hydroxide => hydroxide => "OH"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumKeanite);
ZynthiumKeanite => zynthium_keanite => "ZK"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumLemergite);
UtriumLemergite => utrium_lemergite => "UL"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumHydride);
UtriumHydride => utrium_hydride => "UH"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumOxide);
UtriumOxide => utrium_oxide => "UO"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumHydride);
KeaniumHydride => keanium_hydride => "KH"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumOxide);
KeaniumOxide => keanium_oxide => "KO"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumHydride);
LemergiumHydride => lemergium_hydride => "LH"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumOxide);
LemergiumOxide => lemergium_oxide => "LO"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumHydride);
ZynthiumHydride => zynthium_hydride => "ZH"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumOxide);
ZynthiumOxide => zynthium_oxide => "ZO"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumHydride);
GhodiumHydride => ghodium_hydride => "GH"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumOxide);
GhodiumOxide => ghodium_oxide => "GO"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumAcid);
UtriumAcid => utrium_acid => "UH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumAlkalide);
UtriumAlkalide => utrium_alkalide => "UHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumAcid);
KeaniumAcid => keanium_acid => "KH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumAlkalide);
KeaniumAlkalide => keanium_alkalide => "KHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumAcid);
LemergiumAcid => lemergium_acid => "LH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumAlkalide);
LemergiumAlkalide => lemergium_alkalide => "LHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumAcid);
ZynthiumAcid => zynthium_acid => "ZH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumAlkalide);
ZynthiumAlkalide => zynthium_alkalide => "ZHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumAcid);
GhodiumAcid => ghodium_acid => "GH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumAlkalide);
GhodiumAlkalide => ghodium_alkalide => "GHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedUtriumAcid);
CatalyzedUtriumAcid => catalyzed_utrium_acid => "XUH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedUtriumAlkalide);
CatalyzedUtriumAlkalide => catalyzed_utrium_alkalide => "XUHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedKeaniumAcid);
CatalyzedKeaniumAcid => catalyzed_keanium_acid => "XKH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedKeaniumAlkalide);
CatalyzedKeaniumAlkalide => catalyzed_keanium_alkalide => "XKHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedLemergiumAcid);
CatalyzedLemergiumAcid => catalyzed_lemergium_acid => "XLH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedLemergiumAlkalide);
CatalyzedLemergiumAlkalide => catalyzed_lemergium_alkalide => "XLHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedZynthiumAcid);
CatalyzedZynthiumAcid => catalyzed_zynthium_acid => "XZH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedZynthiumAlkalide);
CatalyzedZynthiumAlkalide => catalyzed_zynthium_alkalide => "XZHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedGhodiumAcid);
CatalyzedGhodiumAcid => catalyzed_ghodium_acid => "XGH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedGhodiumAlkalide);
CatalyzedGhodiumAlkalide => catalyzed_ghodium_alkalide => "XGHO2"
=> None;
}
#[derive(Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct Creep {
#[serde(default)]
pub hits: i32,
#[serde(default)]
pub hits_max: i32,
pub user: String,
#[serde(default)]
pub spawning: bool,
#[serde(rename = "energyCapacity")]
pub capacity: i32,
#[serde(default)]
pub notify_when_attacked: bool,
pub name: String,
pub fatigue: i32,
pub age_time: Option<u32>,
pub body: Vec<CreepPart>,
#[serde(default)]
pub action_log: CreepActions,
}
#[derive(Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CreepUpdate {
- hits: i32,
- hits_max: i32,
- user: String,
- spawning: bool,
#[serde(rename = "energyCapacity")]
- capacity: i32,
- notify_when_attacked: bool,
- name: String,
- fatigue: i32,
- age_time: Option<u32>,
- body: Vec<CreepPart>,
- action_log: CreepActions,
}
}
resource_iterator_for! {
{
crate::websocket::types::room::resources::ResourceType;
Energy => energy => "energy"
=> Some(crate::websocket::types::room::resources::ResourceType::Power);
Power => power => "power"
=> Some(crate::websocket::types::room::resources::ResourceType::Hydrogen);
Hydrogen => hydrogen => "H"
=> Some(crate::websocket::types::room::resources::ResourceType::Oxygen);
Oxygen => oxygen => "O"
=> Some(crate::websocket::types::room::resources::ResourceType::Utrium);
Utrium => utrium => "U"
=> Some(crate::websocket::types::room::resources::ResourceType::Lemergium);
Lemergium => lemergium => "L"
=> Some(crate::websocket::types::room::resources::ResourceType::Keanium);
Keanium => keanium => "K"
=> Some(crate::websocket::types::room::resources::ResourceType::Zynthium);
Zynthium => zynthium => "Z"
=> Some(crate::websocket::types::room::resources::ResourceType::Catalyst);
Catalyst => catalyst => "X"
=> Some(crate::websocket::types::room::resources::ResourceType::Ghodium);
Ghodium => ghodium => "G"
=> Some(crate::websocket::types::room::resources::ResourceType::Hydroxide);
Hydroxide => hydroxide => "OH"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumKeanite);
ZynthiumKeanite => zynthium_keanite => "ZK"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumLemergite);
UtriumLemergite => utrium_lemergite => "UL"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumHydride);
UtriumHydride => utrium_hydride => "UH"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumOxide);
UtriumOxide => utrium_oxide => "UO"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumHydride);
KeaniumHydride => keanium_hydride => "KH"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumOxide);
KeaniumOxide => keanium_oxide => "KO"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumHydride);
LemergiumHydride => lemergium_hydride => "LH"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumOxide);
LemergiumOxide => lemergium_oxide => "LO"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumHydride);
ZynthiumHydride => zynthium_hydride => "ZH"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumOxide);
ZynthiumOxide => zynthium_oxide => "ZO"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumHydride);
GhodiumHydride => ghodium_hydride => "GH"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumOxide);
GhodiumOxide => ghodium_oxide => "GO"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumAcid);
UtriumAcid => utrium_acid => "UH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumAlkalide);
UtriumAlkalide => utrium_alkalide => "UHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumAcid);
KeaniumAcid => keanium_acid => "KH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumAlkalide);
KeaniumAlkalide => keanium_alkalide => "KHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumAcid);
LemergiumAcid => lemergium_acid => "LH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumAlkalide);
LemergiumAlkalide => lemergium_alkalide => "LHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumAcid);
ZynthiumAcid => zynthium_acid => "ZH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumAlkalide);
ZynthiumAlkalide => zynthium_alkalide => "ZHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumAcid);
GhodiumAcid => ghodium_acid => "GH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumAlkalide);
GhodiumAlkalide => ghodium_alkalide => "GHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedUtriumAcid);
CatalyzedUtriumAcid => catalyzed_utrium_acid => "XUH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedUtriumAlkalide);
CatalyzedUtriumAlkalide => catalyzed_utrium_alkalide => "XUHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedKeaniumAcid);
CatalyzedKeaniumAcid => catalyzed_keanium_acid => "XKH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedKeaniumAlkalide);
CatalyzedKeaniumAlkalide => catalyzed_keanium_alkalide => "XKHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedLemergiumAcid);
CatalyzedLemergiumAcid => catalyzed_lemergium_acid => "XLH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedLemergiumAlkalide);
CatalyzedLemergiumAlkalide => catalyzed_lemergium_alkalide => "XLHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedZynthiumAcid);
CatalyzedZynthiumAcid => catalyzed_zynthium_acid => "XZH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedZynthiumAlkalide);
CatalyzedZynthiumAlkalide => catalyzed_zynthium_alkalide => "XZHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedGhodiumAcid);
CatalyzedGhodiumAcid => catalyzed_ghodium_acid => "XGH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedGhodiumAlkalide);
CatalyzedGhodiumAlkalide => catalyzed_ghodium_alkalide => "XGHO2"
=> None;
}
#[derive(Debug)]
pub struct CreepContents(Creep);
}
impl Creep {
pub fn carry_contents(&self) -> CreepContents {
CreepContents::new(self)
}
}
#[cfg(test)]
mod test {
use serde::Deserialize;
use crate::data::RoomName;
use super::{Creep, CreepActions, CreepPartType};
#[test]
fn parse_creep() {
let json = json!({
"_id": "5969704a55d1b111cbe6b150",
"actionLog": {
"attack": null,
"attacked": null,
"build": null,
"harvest": null,
"heal": null,
"healed": null,
"rangedAttack": null,
"rangedHeal": null,
"rangedMassAttack": null,
"repair": null,
"reserveController": null,
"say": null,
"upgradeController": null
},
"ageTime": 20236257,
"body": [
{
"hits": 100,
"type": "carry"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "work"
},
{
"hits": 100,
"type": "carry"
},
{
"hits": 100,
"type": "move"
},
{
"hits": 100,
"type": "move"
},
{
"hits": 100,
"type": "move"
},
{
"hits": 100,
"type": "move"
},
{
"hits": 100,
"type": "move"
},
{
"hits": 100,
"type": "move"
},
{
"hits": 100,
"type": "move"
},
{
"hits": 100,
"type": "move"
},
{
"hits": 100,
"type": "move"
},
{
"hits": 100,
"type": "move"
}
],
"energy": 0,
"energyCapacity": 100,
"fatigue": 0,
"hits": 2900,
"hitsMax": 2900,
"name": "b873",
"notifyWhenAttacked": true,
"room": "W65N19",
"spawning": false,
"type": "creep",
"user": "57874d42d0ae911e3bd15bbc",
"x": 27,
"y": 38
});
let obj = Creep::deserialize(json).unwrap();
match obj {
Creep {
ref id,
ref room,
x: 27,
y: 38,
energy: 0,
ghodium: 0,
capacity: 100,
hits: 2900,
hits_max: 2900,
age_time: Some(20236257),
ref name,
notify_when_attacked: true,
spawning: false,
action_log:
CreepActions {
attack: None,
attacked: None,
build: None,
harvest: None,
heal: None,
healed: None,
ranged_attack: None,
ranged_heal: None,
ranged_mass_attack: None,
repair: None,
reserve_controller: None,
say: None,
upgrade_controller: None,
},
ref body,
ref user,
..
} => {
if user != "57874d42d0ae911e3bd15bbc"
|| id != "5969704a55d1b111cbe6b150"
|| *room != RoomName::new("W65N19").unwrap()
|| name != "b873"
|| body
.iter()
.map(|part| {
if part.part_type == CreepPartType::Carry {
1
} else {
0
}
})
.sum::<i32>()
!= 2
|| body
.iter()
.map(|part| {
if part.part_type == CreepPartType::Work {
1
} else {
0
}
})
.sum::<i32>()
!= 17
|| body
.iter()
.map(|part| {
if part.part_type == CreepPartType::Move {
1
} else {
0
}
})
.sum::<i32>()
!= 10
|| !body.iter().all(|part| {
part.part_type == CreepPartType::Move
|| part.part_type == CreepPartType::Work
|| part.part_type == CreepPartType::Carry
})
{
panic!("some fields wrong from pre-set Creep: {:#?}", obj);
}
}
other => panic!("expected pre-set Creep to match, found {:#?}", other),
}
assert_eq!(obj.carry_contents().collect::<Vec<_>>(), vec![]);
}
}