planet-wars/frontend/src/lib.rs

121 lines
2.9 KiB
Rust
Raw Normal View History

2019-09-13 21:18:11 +00:00
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
2019-09-17 11:46:20 +00:00
extern crate octoon_math;
use octoon_math::{Mat3, Vec3};
2019-09-13 21:18:11 +00:00
2019-09-13 20:54:21 +00:00
mod utils;
2019-09-13 21:18:11 +00:00
mod types;
2019-09-13 20:54:21 +00:00
use wasm_bindgen::prelude::*;
// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
// allocator.
#[cfg(feature = "wee_alloc")]
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
2019-09-14 08:48:20 +00:00
#[wasm_bindgen]
pub struct Game {
2019-09-17 11:46:20 +00:00
states: Vec<types::State>,
turn: usize,
2019-09-14 09:13:17 +00:00
2019-09-14 08:48:20 +00:00
/* put extra shit here */
2019-09-18 10:29:56 +00:00
planets: Vec<Vec3<f32>>,
view_box: Vec<f32>,
2019-09-17 11:46:20 +00:00
2019-09-18 10:29:56 +00:00
ship_locations: Vec<Mat3<f32>>,
current_planet_colours: Vec<Vec3<f32>>,
2019-09-13 21:18:11 +00:00
}
2019-09-13 20:54:21 +00:00
#[wasm_bindgen]
2019-09-14 08:48:20 +00:00
impl Game {
pub fn new(file: &str) -> Self {
utils::set_panic_hook();
// First line is fucked but we just filter out things that cannot parse
2019-09-17 11:46:20 +00:00
let states: Vec<types::State> = file.split("\n").filter_map(|line|
2019-09-14 08:48:20 +00:00
serde_json::from_str(line).ok()
).collect();
Self {
2019-09-18 10:29:56 +00:00
planets: utils::get_planets(&states[0].planets, 2.0),
2019-09-17 11:46:20 +00:00
view_box: utils::caclulate_viewbox(&states[0].planets),
turn: 0,
2019-09-14 09:13:17 +00:00
states,
2019-09-17 11:46:20 +00:00
ship_locations: Vec::new(),
current_planet_colours: Vec::new(),
2019-09-14 08:48:20 +00:00
}
}
2019-09-18 10:29:56 +00:00
pub fn get_viewbox(&self) -> *const f32 {
2019-09-17 11:46:20 +00:00
self.view_box.as_ptr()
}
2019-09-18 10:29:56 +00:00
pub fn get_planets(&self) -> *const Vec3<f32> {
2019-09-17 11:46:20 +00:00
self.planets.as_ptr()
}
2019-09-18 10:29:56 +00:00
pub fn get_planet_colors(&self) -> *const Vec3<f32> {
2019-09-17 11:46:20 +00:00
self.current_planet_colours.as_ptr()
}
pub fn get_planet_count(&self) -> usize {
self.planets.len()
}
2019-09-14 08:48:20 +00:00
pub fn turn_count(&self) -> usize {
self.states.len()
}
2019-09-14 09:13:17 +00:00
2019-09-17 11:46:20 +00:00
pub fn update_turn(&mut self, turn: usize) {
2019-09-18 10:29:56 +00:00
self.turn = turn.min(self.states.len() -1);
2019-09-17 11:46:20 +00:00
self.update_planet_colours();
self.update_ship_locations()
}
fn update_planet_colours(&mut self) {
2019-09-19 16:27:56 +00:00
let mut new_vec = Vec::new();
let planets_now = self.states[self.turn].planets.iter();
let planets_later = self.states[(self.turn + 1).min(self.states.len() - 1)].planets.iter();
for (p1, p2) in planets_now.zip(planets_later) {
new_vec.push(
utils::COLORS[p1.owner.unwrap_or(0) as usize % utils::COLORS.len()].into()
);
new_vec.push(
utils::COLORS[p2.owner.unwrap_or(0) as usize % utils::COLORS.len()].into()
);
}
self.current_planet_colours = new_vec;
2019-09-14 09:13:17 +00:00
}
2019-09-17 11:46:20 +00:00
fn update_ship_locations(&mut self) {
}
2019-09-18 10:29:56 +00:00
// pub fn add_location(&mut self, x: f32, y: f32, angle: f32) {
2019-09-17 11:46:20 +00:00
// self.current_turn.push(
// Location { x, y, angle}
// );
// }
2019-09-14 09:13:17 +00:00
pub fn location_count(&self) -> usize {
2019-09-17 11:46:20 +00:00
self.ship_locations.len()
2019-09-14 09:13:17 +00:00
}
2019-09-18 10:29:56 +00:00
pub fn get_ship_locations(&self) -> *const Mat3<f32> {
2019-09-17 11:46:20 +00:00
self.ship_locations.as_ptr()
2019-09-14 09:13:17 +00:00
}
2019-09-13 20:54:21 +00:00
}
2019-09-14 08:48:20 +00:00
2019-09-13 20:54:21 +00:00
#[wasm_bindgen]
2019-09-14 08:48:20 +00:00
extern {
fn alert(s: &str);
2019-09-13 20:54:21 +00:00
}