435 lines
13 KiB
Rust
435 lines
13 KiB
Rust
use bracket_lib::prelude::*;
|
||
|
||
use crate::graphics::vga_color as vga;
|
||
|
||
#[derive(Eq, PartialEq, Copy, Clone)]
|
||
pub struct TileData {
|
||
pub glyph: FontCharType,
|
||
pub color_fg: (u8, u8, u8),
|
||
pub color_bg: (u8, u8, u8),
|
||
pub serialized_char: char,
|
||
}
|
||
|
||
#[derive(Eq, PartialEq, Copy, Clone, Hash)]
|
||
pub enum TileType {
|
||
Floor, // 0
|
||
Slow, // 1
|
||
Medium, // 2
|
||
Fast, // 3
|
||
Block, // 4
|
||
Whip, // 5
|
||
Stairs, // 6
|
||
Chest, // 7
|
||
SlowTime, // 8
|
||
Gem, // 9
|
||
Invisible, // 10
|
||
Teleport, // 11
|
||
Key, // 12
|
||
Door, // 13
|
||
Wall, // 14
|
||
SpeedTime, // 15
|
||
Trap, // 16
|
||
River, // 17
|
||
Power, // 18
|
||
Forest, // 19
|
||
Tree, // 20, 252
|
||
Bomb, // 21
|
||
Lava, // 22
|
||
Pit, // 23
|
||
Tome, // 24
|
||
Tunnel, // 25
|
||
Freeze, // 26
|
||
Nugget, // 27
|
||
Quake, // 28
|
||
InvisibleBlock, // 29
|
||
InvisibleWall, // 30
|
||
InvisibleDoor, // 31
|
||
Stop, // 32
|
||
Zap, // 34
|
||
Create, // 35
|
||
Generator, // 36
|
||
Trap2, // 33
|
||
Trap3, // 37
|
||
Trap4, // 39
|
||
Trap5, // 67
|
||
Trap6, // 224
|
||
Trap7, // 225
|
||
Trap8, // 226
|
||
Trap9, // 227
|
||
Trap10, // 228
|
||
Trap11, // 229
|
||
Trap12, // 230
|
||
Trap13, // 231
|
||
Player, // 40
|
||
Punctuation, // 222
|
||
Letter(char),
|
||
}
|
||
|
||
pub fn tile_data(tile: TileType) -> TileData {
|
||
match tile {
|
||
TileType::Floor => TileData {
|
||
glyph: 0,
|
||
serialized_char: ' ',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Slow => TileData {
|
||
glyph: 0,
|
||
serialized_char: '1',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Medium => TileData {
|
||
glyph: 0,
|
||
serialized_char: '2',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Fast => TileData {
|
||
glyph: 0,
|
||
serialized_char: '3',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Block => TileData {
|
||
glyph: to_cp437('▓'),
|
||
serialized_char: 'X',
|
||
color_fg: vga::YELLOW,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Whip => TileData {
|
||
glyph: to_cp437('⌠'),
|
||
serialized_char: 'W',
|
||
color_fg: vga::WHITE_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Stairs => TileData {
|
||
glyph: to_cp437('≡'),
|
||
serialized_char: 'L',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::WHITE,
|
||
},
|
||
TileType::Chest => TileData {
|
||
glyph: to_cp437('C'),
|
||
serialized_char: 'C',
|
||
color_fg: vga::YELLOW_BRIGHT,
|
||
color_bg: vga::RED,
|
||
},
|
||
TileType::SlowTime => TileData {
|
||
glyph: to_cp437('Φ'),
|
||
serialized_char: 'S',
|
||
color_fg: vga::CYAN_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Gem => TileData {
|
||
glyph: to_cp437('♦'),
|
||
serialized_char: '+',
|
||
color_fg: vga::WHITE,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Invisible => TileData {
|
||
glyph: to_cp437('¡'),
|
||
serialized_char: 'I',
|
||
color_fg: vga::GREEN,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Teleport => TileData {
|
||
glyph: to_cp437('↑'),
|
||
serialized_char: 'T',
|
||
color_fg: vga::MAGENTA_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Key => TileData {
|
||
glyph: to_cp437('î'),
|
||
serialized_char: 'K',
|
||
color_fg: vga::RED_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Door => TileData {
|
||
glyph: to_cp437('∞'),
|
||
serialized_char: 'D',
|
||
color_fg: vga::CYAN,
|
||
color_bg: vga::MAGENTA,
|
||
},
|
||
TileType::Wall => TileData {
|
||
glyph: to_cp437('█'),
|
||
serialized_char: '#',
|
||
color_fg: vga::YELLOW,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::SpeedTime => TileData {
|
||
glyph: to_cp437('Θ'),
|
||
serialized_char: 'F',
|
||
color_fg: vga::CYAN_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap => TileData {
|
||
glyph: to_cp437('∙'),
|
||
serialized_char: '.',
|
||
color_fg: vga::WHITE,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::River => TileData {
|
||
glyph: to_cp437('≈'),
|
||
serialized_char: 'R',
|
||
color_fg: vga::BLUE_BRIGHT,
|
||
color_bg: vga::BLUE,
|
||
},
|
||
TileType::Power => TileData {
|
||
glyph: to_cp437('○'),
|
||
serialized_char: 'Q',
|
||
color_fg: vga::WHITE_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Forest => TileData {
|
||
glyph: to_cp437('█'),
|
||
serialized_char: '/',
|
||
color_fg: vga::GREEN,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Tree => TileData {
|
||
glyph: to_cp437('♣'),
|
||
serialized_char: '\\',
|
||
color_fg: vga::YELLOW,
|
||
color_bg: vga::GREEN,
|
||
},
|
||
TileType::Bomb => TileData {
|
||
glyph: to_cp437('¥'),
|
||
serialized_char: 'B',
|
||
color_fg: vga::WHITE_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Lava => TileData {
|
||
glyph: to_cp437('▓'),
|
||
serialized_char: 'V',
|
||
color_fg: vga::RED_BRIGHT,
|
||
color_bg: vga::RED,
|
||
},
|
||
TileType::Pit => TileData {
|
||
glyph: to_cp437('░'),
|
||
serialized_char: '=',
|
||
color_fg: vga::WHITE,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Tome => TileData {
|
||
glyph: to_cp437('♀'),
|
||
serialized_char: 'A',
|
||
color_fg: vga::WHITE_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Tunnel => TileData {
|
||
glyph: to_cp437('∩'),
|
||
serialized_char: 'U',
|
||
color_fg: vga::WHITE_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Freeze => TileData {
|
||
glyph: to_cp437('ƒ'),
|
||
serialized_char: 'Z',
|
||
color_fg: vga::CYAN_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Nugget => TileData {
|
||
glyph: to_cp437('☼'),
|
||
serialized_char: '*',
|
||
color_fg: vga::YELLOW_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Quake => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'E',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::InvisibleBlock => TileData {
|
||
glyph: 0,
|
||
serialized_char: ';',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::InvisibleWall => TileData {
|
||
glyph: 0,
|
||
serialized_char: ':',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::InvisibleDoor => TileData {
|
||
glyph: 0,
|
||
serialized_char: '`',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Stop => TileData {
|
||
glyph: 0,
|
||
serialized_char: '-',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Zap => TileData {
|
||
glyph: to_cp437('▲'),
|
||
serialized_char: '%',
|
||
color_fg: vga::RED_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Create => TileData {
|
||
glyph: to_cp437('▼'),
|
||
serialized_char: ']',
|
||
color_fg: vga::WHITE_BRIGHT,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Generator => TileData {
|
||
glyph: to_cp437('♠'),
|
||
serialized_char: 'G',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap2 => TileData {
|
||
glyph: 0,
|
||
serialized_char: '@',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap3 => TileData {
|
||
glyph: 0,
|
||
serialized_char: ')',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap4 => TileData {
|
||
glyph: 0,
|
||
serialized_char: '(',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap5 => TileData {
|
||
glyph: 0,
|
||
serialized_char: '$', // Unsure about this
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap6 => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'α',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap7 => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'ß',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap8 => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'Γ',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap9 => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'π',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap10 => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'Σ',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap11 => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'σ',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap12 => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'µ',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Trap13 => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'τ',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Player => TileData {
|
||
glyph: 0,
|
||
serialized_char: 'P',
|
||
color_fg: vga::BLACK,
|
||
color_bg: vga::BLACK,
|
||
},
|
||
TileType::Punctuation => TileData {
|
||
glyph: to_cp437('!'),
|
||
serialized_char: '!',
|
||
color_fg: vga::WHITE_BRIGHT,
|
||
color_bg: vga::YELLOW,
|
||
},
|
||
TileType::Letter(c) => TileData {
|
||
glyph: to_cp437(c.to_ascii_uppercase()),
|
||
serialized_char: c,
|
||
color_fg: vga::WHITE_BRIGHT,
|
||
color_bg: vga::YELLOW,
|
||
},
|
||
}
|
||
}
|
||
|
||
impl From<char> for TileType {
|
||
fn from(c: char) -> Self {
|
||
match c {
|
||
' ' => TileType::Floor,
|
||
'1' => TileType::Slow,
|
||
'2' => TileType::Medium,
|
||
'3' => TileType::Fast,
|
||
'X' => TileType::Block,
|
||
'W' => TileType::Whip,
|
||
'L' => TileType::Stairs,
|
||
'C' => TileType::Chest,
|
||
'S' => TileType::SlowTime,
|
||
'+' => TileType::Gem,
|
||
'I' => TileType::Invisible,
|
||
'T' => TileType::Teleport,
|
||
'K' => TileType::Key,
|
||
'D' => TileType::Door,
|
||
'#' => TileType::Wall,
|
||
'F' => TileType::SpeedTime,
|
||
'.' => TileType::Trap,
|
||
'R' => TileType::River,
|
||
'Q' => TileType::Power,
|
||
'/' => TileType::Forest,
|
||
'\\' => TileType::Tree,
|
||
'B' => TileType::Bomb,
|
||
'V' => TileType::Lava,
|
||
'=' => TileType::Pit,
|
||
'A' => TileType::Tome,
|
||
'U' => TileType::Tunnel,
|
||
'Z' => TileType::Freeze,
|
||
'*' => TileType::Nugget,
|
||
'E' => TileType::Quake,
|
||
';' => TileType::InvisibleBlock,
|
||
':' => TileType::InvisibleWall,
|
||
'`' => TileType::InvisibleDoor,
|
||
'-' => TileType::Stop,
|
||
'%' => TileType::Zap,
|
||
']' => TileType::Create,
|
||
'G' => TileType::Generator,
|
||
'@' => TileType::Trap2,
|
||
')' => TileType::Trap3,
|
||
'(' => TileType::Trap4,
|
||
'$' => TileType::Trap5,
|
||
'α' => TileType::Trap6,
|
||
'ß' => TileType::Trap7,
|
||
'Γ' => TileType::Trap8,
|
||
'π' => TileType::Trap9,
|
||
'Σ' => TileType::Trap10,
|
||
'σ' => TileType::Trap11,
|
||
'µ' => TileType::Trap12,
|
||
'τ' => TileType::Trap13,
|
||
'P' => TileType::Player,
|
||
'!' => TileType::Punctuation,
|
||
_ => TileType::Letter(c),
|
||
}
|
||
}
|
||
}
|