1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
extern crate csv;
use std::collections::HashSet;
mod types;
pub use self::types::*;
mod adjudicate;
pub use self::adjudicate::*;
mod adjusts;
pub use self::adjusts::*;
mod orders;
pub use self::orders::*;
mod parse;
pub use self::parse::*;
mod retreats;
pub use self::retreats::*;
mod svg;
pub use self::svg::*;
mod util;
pub use self::util::*;
impl Stpsyr {
pub fn new(mapfile: &'static str) -> Stpsyr {
let mut reader = csv::Reader::from_file(mapfile).unwrap();
let mut map: Vec<MapRegion> = Vec::new();
for region in reader.decode::<(
String,
bool,
Option<String>,
Option<String>,
String,
String
)>() {
let region = region.unwrap();
let province = Province::from(region.0.clone());
let fleet_borders: Vec<Province> = region.4.split_whitespace().map(|p| {
let mut border = Province::from(p);
if let Some(coast) = province.coast {
border.from_coast = Some(coast);
}
border
}).collect();
let army_borders = region.5.split_whitespace().map(Province::from)
.collect();
if let Some(existing_region) = map.iter_mut()
.find(|r| r.province == province) {
existing_region.fleet_borders.extend(fleet_borders.iter().cloned());
continue;
}
map.push(MapRegion {
province: province,
sc: region.1,
owner: region.2.clone().map(Power::from),
home_power: region.2.clone().map(Power::from),
unit: region.3.as_ref().map(|unit_type| Unit {
owner: Power::from(region.2.clone().unwrap()),
unit_type: match &unit_type[..] {
"Army" => UnitType::Army,
"Fleet" => UnitType::Fleet,
_ => panic!("unit type must be Army or Fleet")
}
}),
fleet_borders: fleet_borders,
army_borders: army_borders
});
};
Stpsyr {
map: map,
orders: vec![],
retreats: vec![],
adjusts: vec![],
dependencies: vec![],
dislodged: vec![],
contested: HashSet::new(),
phase: Phase::SpringDiplomacy,
year: 1901
}
}
}