ld46 0.2.7

Fermi Paradox - my entry for Ludum Dare 46
use crate::{enemy::EnemyType, random, sprite};
use specs_blit::SpriteRef;
use sprite_gen::{MaskValue::*, Options};

pub struct Ships {
    enemy_small: Vec<SpriteRef>,
    enemy_medium: Vec<SpriteRef>,
    enemy_big: Vec<SpriteRef>,
}

impl Ships {
    pub fn generate() -> Self {
        Self {
            enemy_small: Ships::gen_enemy_small(),
            enemy_medium: Ships::gen_enemy_medium(),
            enemy_big: Ships::gen_enemy_big(),
        }
    }

    pub fn enemy(&self, type_: EnemyType) -> SpriteRef {
        match type_ {
            EnemyType::Small => random::index(&self.enemy_small),
            EnemyType::Medium => random::index(&self.enemy_medium),
            EnemyType::Big => random::index(&self.enemy_big),
        }
        .clone()
    }

    fn gen_enemy_small() -> Vec<SpriteRef> {
        let (width, _height, mut options) = (
            10,
            8,
            Options {
                mirror_x: false,
                mirror_y: true,
                colored: true,
                edge_brightness: 0.018196218,
                color_variations: 0.23466119,
                brightness_noise: 0.83068764,
                saturation: 0.6434743,
                seed: quad_rand::rand() as u64,
            },
        );
        let data = [
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty,
            Empty, Empty, Empty, Empty, Empty, Body1, Body1, Empty, Empty, Empty, Empty, Empty,
            Empty, Empty, Body1, Body1, Body1, Body1, Empty, Empty, Empty, Empty, Empty, Empty,
            Empty, Body1, Body2, Body1, Empty, Empty, Empty, Empty, Body1, Body1, Body1, Body1,
            Body2, Body1, Empty, Empty, Body1, Body1, Body1, Body1, Body1, Body2, Body1, Body1,
            Empty, Body1, Body1, Body2, Body2, Body2, Body1, Body1, Body1, Body1, Body1, Body1,
            Body1, Body1, Body2, Body2, Body2, Body2, Body1, Body1,
        ];

        (1..4)
            .map(|_| {
                options.seed = quad_rand::rand() as u64;
                sprite::generate(width, options, &data).expect("Could not generate ship")
            })
            .collect()
    }

    fn gen_enemy_medium() -> Vec<SpriteRef> {
        let (width, _height, mut options) = (
            13,
            10,
            Options {
                mirror_x: false,
                mirror_y: true,
                colored: true,
                edge_brightness: 0.018196218,
                color_variations: 0.23466119,
                brightness_noise: 0.83068764,
                saturation: 0.6434743,
                seed: quad_rand::rand() as u64,
            },
        );
        let data = [
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty,
            Empty, Empty, Empty, Empty, Empty, Body1, Body1, Body1, Body1, Body1, Body1, Body1,
            Body1, Empty, Empty, Empty, Empty, Empty, Body1, Body1, Body2, Body2, Body2, Body2,
            Body2, Body1, Empty, Empty, Empty, Empty, Empty, Empty, Body1, Body1, Body1, Body1,
            Body1, Body2, Body1, Empty, Empty, Empty, Empty, Empty, Body1, Body1, Body1, Body1,
            Body1, Body1, Body2, Body1, Empty, Empty, Empty, Empty, Body1, Body1, Body1, Body1,
            Body1, Body1, Body1, Body2, Body1, Empty, Empty, Empty, Body1, Body1, Body1, Body1,
            Body1, Body1, Body1, Body1, Body2, Body1, Empty, Empty, Empty, Body1, Body1, Body2,
            Body2, Body2, Body2, Body1, Body1, Body2, Body1, Empty, Empty, Empty, Body1, Body2,
            Body1, Body1, Body1, Body1, Body2, Body1, Body2, Body1, Empty, Empty, Body1, Body1,
            Body2, Body1, Body1, Body1, Body1, Body2, Body1, Body2, Body1, Empty,
        ];

        (1..4)
            .map(|_| {
                options.seed = quad_rand::rand() as u64;
                sprite::generate(width, options, &data).expect("Could not generate ship")
            })
            .collect()
    }

    fn gen_enemy_big() -> Vec<SpriteRef> {
        let (width, _height, mut options) = (
            22,
            12,
            Options {
                mirror_x: false,
                mirror_y: true,
                colored: true,
                edge_brightness: 0.0,
                color_variations: 0.35297588,
                brightness_noise: 0.57201767,
                saturation: 0.7861507,
                seed: quad_rand::rand() as u64,
            },
        );
        let data = [
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty,
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty,
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Body1, Body1, Body2,
            Body2, Body2, Body2, Body2, Body2, Body1, Body1, Empty, Empty, Empty, Empty, Empty,
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty,
            Empty, Body1, Body1, Body1, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty,
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Body1,
            Body1, Body1, Body1, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty,
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Body2, Body1, Body1, Body1,
            Body2, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty,
            Body1, Body1, Body1, Body1, Body1, Body1, Body1, Body2, Body2, Empty, Empty, Empty,
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Body1, Body1, Body1, Body2,
            Body2, Body1, Body1, Body1, Body1, Body1, Empty, Empty, Empty, Empty, Empty, Empty,
            Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Body1, Body2, Body1, Body1,
            Body1, Body1, Body1, Body1, Body1, Body1, Body1, Empty, Empty, Empty, Empty, Empty,
            Empty, Body1, Body1, Body1, Body1, Body1, Body1, Body2, Body1, Body1, Body1, Body1,
            Body1, Body1, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Body1, Body1,
            Body1, Body1, Body2, Body2, Body2, Body2, Body2, Body2, Body1, Body1, Body1, Body2,
            Body1, Body1, Empty, Empty, Empty, Empty, Body1, Body1, Body1, Body1, Body1, Body2,
            Body2, Body1, Body1, Body1, Body1, Body2, Body2, Body2, Body2, Body2, Empty, Empty,
            Empty, Empty, Empty, Body1, Body1, Body1, Body2, Body1, Body1, Body1, Body1, Body1,
            Body2, Body1, Body1, Body1, Body1, Body1, Body1, Body1, Body2, Body2, Empty, Empty,
        ];

        (1..4)
            .map(|_| {
                options.seed = quad_rand::rand() as u64;
                sprite::generate(width, options, &data).expect("Could not generate ship")
            })
            .collect()
    }
}