171 lines
6.5 KiB
Rust
171 lines
6.5 KiB
Rust
use rust_rl::*;
|
|
use specs::prelude::*;
|
|
use specs::saveload::{ SimpleMarker, SimpleMarkerAllocator };
|
|
use bracket_lib::prelude::*;
|
|
|
|
const DISPLAYWIDTH: i32 = 100;
|
|
const DISPLAYHEIGHT: i32 = 56;
|
|
|
|
fn main() -> BError {
|
|
// Embedded resources for use in wasm build
|
|
{
|
|
const WORLD_16_16_BYTES: &[u8] = include_bytes!("../resources/world16x16.png");
|
|
const CURSES_16_16_BYTES: &[u8] = include_bytes!("../resources/curses16x16.png");
|
|
const CURSES_8_16_BYTES: &[u8] = include_bytes!("../resources/curses8x16.png");
|
|
const SINGLE_1_1_BYTES: &[u8] = include_bytes!("../resources/healthbar22x2.png");
|
|
let mut lock = bracket_lib::terminal::EMBED.lock();
|
|
lock.add_resource("resources/world16x16.png".to_string(), WORLD_16_16_BYTES);
|
|
lock.add_resource("resources/curses16x16.png".to_string(), CURSES_16_16_BYTES);
|
|
lock.add_resource("resources/curses8x16.png".to_string(), CURSES_8_16_BYTES);
|
|
lock.add_resource("resources/healthbar22x2.png".to_string(), SINGLE_1_1_BYTES);
|
|
}
|
|
|
|
let world_sheet = SpriteSheet {
|
|
filename: "resources/world16x16.png".to_string(),
|
|
sprites: register_spritesheet(16, 16, 19, 16),
|
|
backing: None,
|
|
};
|
|
|
|
let mut context = BTermBuilder::new()
|
|
.with_title("rust-rl")
|
|
.with_dimensions(DISPLAYWIDTH, DISPLAYHEIGHT)
|
|
.with_font("curses16x16.png", 16, 16)
|
|
.with_font("curses8x16.png", 8, 16)
|
|
.with_font("healthbar22x2.png", 1, 1)
|
|
.with_tile_dimensions(16, 16)
|
|
.with_gutter(2)
|
|
.with_sprite_console(DISPLAYWIDTH * 16, DISPLAYHEIGHT * 16, 0)
|
|
.with_sprite_sheet(world_sheet)
|
|
.with_simple_console_no_bg(DISPLAYWIDTH, DISPLAYHEIGHT, "curses16x16.png")
|
|
.with_simple_console_no_bg(DISPLAYWIDTH, DISPLAYHEIGHT, "curses16x16.png")
|
|
.with_sparse_console(DISPLAYWIDTH * 2, DISPLAYHEIGHT, "curses8x16.png")
|
|
.with_sparse_console(DISPLAYWIDTH * 16, DISPLAYHEIGHT * 16, "healthbar22x2.png")
|
|
.build()?;
|
|
if config::CONFIG.visuals.with_scanlines {
|
|
context.with_post_scanlines(config::CONFIG.visuals.with_screen_burn);
|
|
}
|
|
|
|
let mut gs = State {
|
|
ecs: World::new(),
|
|
mapgen_next_state: Some(RunState::MainMenu {
|
|
menu_selection: gui::MainMenuSelection::NewGame,
|
|
}),
|
|
mapgen_index: 0,
|
|
mapgen_history: Vec::new(),
|
|
mapgen_timer: 0.0,
|
|
};
|
|
|
|
gs.ecs.register::<Position>();
|
|
gs.ecs.register::<OtherLevelPosition>();
|
|
gs.ecs.register::<Renderable>();
|
|
gs.ecs.register::<Burden>();
|
|
gs.ecs.register::<Prop>();
|
|
gs.ecs.register::<Player>();
|
|
gs.ecs.register::<HasAncestry>();
|
|
gs.ecs.register::<HasClass>();
|
|
gs.ecs.register::<Chasing>();
|
|
gs.ecs.register::<Faction>();
|
|
gs.ecs.register::<Clock>();
|
|
gs.ecs.register::<Quips>();
|
|
gs.ecs.register::<Mind>();
|
|
gs.ecs.register::<Viewshed>();
|
|
gs.ecs.register::<Telepath>();
|
|
gs.ecs.register::<Name>();
|
|
gs.ecs.register::<ObfuscatedName>();
|
|
gs.ecs.register::<BlocksTile>();
|
|
gs.ecs.register::<BlocksVisibility>();
|
|
gs.ecs.register::<Door>();
|
|
gs.ecs.register::<Pools>();
|
|
gs.ecs.register::<Attributes>();
|
|
gs.ecs.register::<Skills>();
|
|
gs.ecs.register::<HungerClock>();
|
|
gs.ecs.register::<WantsToMelee>();
|
|
gs.ecs.register::<Item>();
|
|
gs.ecs.register::<Beatitude>();
|
|
gs.ecs.register::<IdentifiedItem>();
|
|
gs.ecs.register::<IdentifiedBeatitude>();
|
|
gs.ecs.register::<MagicItem>();
|
|
gs.ecs.register::<GrantsXP>();
|
|
gs.ecs.register::<LootTable>();
|
|
gs.ecs.register::<Energy>();
|
|
gs.ecs.register::<TakingTurn>();
|
|
gs.ecs.register::<Equippable>();
|
|
gs.ecs.register::<EquipmentChanged>();
|
|
gs.ecs.register::<Equipped>();
|
|
gs.ecs.register::<MeleeWeapon>();
|
|
gs.ecs.register::<NaturalAttacks>();
|
|
gs.ecs.register::<ArmourClassBonus>();
|
|
gs.ecs.register::<ToHitBonus>();
|
|
gs.ecs.register::<MoveMode>();
|
|
gs.ecs.register::<ProvidesHealing>();
|
|
gs.ecs.register::<InflictsDamage>();
|
|
gs.ecs.register::<Ranged>();
|
|
gs.ecs.register::<AOE>();
|
|
gs.ecs.register::<Digger>();
|
|
gs.ecs.register::<Confusion>();
|
|
gs.ecs.register::<Blind>();
|
|
gs.ecs.register::<MagicMapper>();
|
|
gs.ecs.register::<InBackpack>();
|
|
gs.ecs.register::<WantsToApproach>();
|
|
gs.ecs.register::<WantsToFlee>();
|
|
gs.ecs.register::<WantsToPickupItem>();
|
|
gs.ecs.register::<WantsToDropItem>();
|
|
gs.ecs.register::<WantsToRemoveItem>();
|
|
gs.ecs.register::<WantsToUseItem>();
|
|
gs.ecs.register::<Consumable>();
|
|
gs.ecs.register::<SingleActivation>();
|
|
gs.ecs.register::<Charges>();
|
|
gs.ecs.register::<ProvidesNutrition>();
|
|
gs.ecs.register::<Destructible>();
|
|
gs.ecs.register::<Hidden>();
|
|
gs.ecs.register::<EntryTrigger>();
|
|
gs.ecs.register::<EntityMoved>();
|
|
gs.ecs.register::<MultiAttack>();
|
|
gs.ecs.register::<ProvidesRemoveCurse>();
|
|
gs.ecs.register::<ProvidesIdentify>();
|
|
gs.ecs.register::<KnownSpells>();
|
|
gs.ecs.register::<GrantsSpell>();
|
|
gs.ecs.register::<Bleeds>();
|
|
gs.ecs.register::<ParticleLifetime>();
|
|
gs.ecs.register::<SpawnParticleSimple>();
|
|
gs.ecs.register::<SpawnParticleBurst>();
|
|
gs.ecs.register::<SpawnParticleLine>();
|
|
gs.ecs.register::<HasDamageModifiers>();
|
|
gs.ecs.register::<Intrinsics>();
|
|
gs.ecs.register::<SimpleMarker<SerializeMe>>();
|
|
gs.ecs.register::<SerializationHelper>();
|
|
gs.ecs.register::<DMSerializationHelper>();
|
|
gs.ecs.insert(SimpleMarkerAllocator::<SerializeMe>::new());
|
|
|
|
raws::load_raws();
|
|
|
|
// Insert calls
|
|
gs.ecs.insert(RandomNumberGenerator::new());
|
|
gs.ecs.insert(map::MasterDungeonMap::new()); // Master map list
|
|
gs.ecs.insert(Map::new(true, 1, 64, 64, 0, "New Map", "N", 0)); // Map
|
|
gs.ecs.insert(Point::new(0, 0)); // Player pos
|
|
gs.ecs.insert(gui::Ancestry::Human); // ancestry
|
|
let player_entity = spawner::player(&mut gs.ecs, 0, 0);
|
|
gs.ecs.insert(player_entity); // Player entity
|
|
gs.ecs.insert(RunState::MapGeneration {}); // RunState
|
|
gs.ecs.insert(particle_system::ParticleBuilder::new());
|
|
gs.ecs.insert(rex_assets::RexAssets::new());
|
|
|
|
gamelog::setup_log();
|
|
gamelog::record_event(data::events::EVENT::Level(1));
|
|
gs.generate_world_map(1, TileType::Floor);
|
|
|
|
main_loop(context, gs)
|
|
}
|
|
|
|
fn register_spritesheet(width: i32, height: i32, rows: i32, columns: i32) -> Vec<Sprite> {
|
|
let mut sprites: Vec<Sprite> = Vec::new();
|
|
for y in 0..rows {
|
|
for x in 0..columns {
|
|
sprites.push(
|
|
Sprite::new(Rect::with_size(x * width + 1, y * height + 1, width, height))
|
|
);
|
|
}
|
|
}
|
|
sprites
|
|
}
|