bracket-lib 0.8.7

Meta-crate holding the entirety of bracket-lib (and exposing it). Use this for the full roguelike toolkit experience.
Documentation
# Hello Terminal


You can get to `hello terminal` pretty quickly:

## Create a New Project


Find the directory in which you want to start developing, and type `cargo init my_project` to create a new project.

## Link Bracket-Lib


Open `Cargo.toml` in the newly created project, and expand the `[dependencies]` section as follows:

```toml
[dependencies]
bracket-lib = "0.8"
```

## Hello Minimal Terminal


The following code prints "Hello Bracket World" in a new simple console:

```rust
use bracket_lib::prelude::*;

struct State {}

impl GameState for State {
    fn tick(&mut self, ctx: &mut BTerm) {
        ctx.print(1, 1, "Hello Bracket World");
    }
}

fn main() -> BError {
    let context = BTermBuilder::simple80x50()
        .with_title("Hello Minimal Bracket World")
        .build()?;

    let gs: State = State {};
    main_loop(context, gs)
}
```

This provides what you need for a minimal start:

1. Importing the `prelude` from `bracket_lib` makes the various types and functions available.
2. You have to create a `State` object. This is where your ongoing game state is stored.
3. Implementing `GameState` provides `bracket-lib` with a `tick` function to call on every frame.
4. Your `main` function constructs a terminal---in this case an 80x50 text console.
5. You create a `State` object, even though it doesn't have much state to store.
6. Launching `main_loop` hands control over to `bracket-lib`, and runs the `tick` function on every rendered frame.

## Bouncy Hello World


Another example (`hello_terminal` in the `bracket-lib` source) provides a bouncing "Hello World". Let's use it to explore some of the features available in the library:

```rust
use bracket_lib::prelude::*;

struct State {
    y: i32,
    going_down: bool,
}

impl GameState for State {
    fn tick(&mut self, ctx: &mut BTerm) {
        let col1 = RGB::named(CYAN);
        let col2 = RGB::named(YELLOW);
        let percent: f32 = self.y as f32 / 50.0;
        let fg = col1.lerp(col2, percent);

        ctx.cls();
        ctx.printer(
            40,
            49,
            "#[blue]Hello #[pink]Bracket#[] world.",
            TextAlign::Center,
            Some(RGBA::from_u8(200, 200, 200, 255)),
        );

        ctx.print_color(
            1,
            self.y,
            fg,
            RGB::named(BLACK),
            "♫ ♪ Hello Bracket World ☺",
        );

        if self.going_down {
            self.y += 1;
            if self.y > 48 {
                self.going_down = false;
            }
        } else {
            self.y -= 1;
            if self.y < 2 {
                self.going_down = true;
            }
        }

        ctx.draw_box(39, 0, 20, 3, RGB::named(WHITE), RGB::named(BLACK));
        ctx.printer(
            58,
            1,
            &format!("#[pink]FPS: #[]{}", ctx.fps),
            TextAlign::Right,
            None,
        );
        ctx.printer(
            58,
            2,
            &format!("#[pink]Frame Time: #[]{} ms", ctx.frame_time_ms),
            TextAlign::Right,
            None,
        );
    }
}

fn main() -> BError {
    let context = BTermBuilder::simple80x50()
        .with_title("Hello Bracket World")
        .build()?;

    let gs: State = State {
        y: 1,
        going_down: true,
    };

    register_palette_color("blue", RGB::named(BLUE));
    register_palette_color("pink", RGB::named(MAGENTA));

    main_loop(context, gs)
}
```

There's quite a lot to unwrap here, so let's go through a quick tour of using `bracket-lib`.

### The State Structure


Everything your program needs to retain during execution lives in your state structure (well, you could use globals and lazy-statics). In this case, we're storing two variables in `State`:

* `y` stores the current vertical location of the bouncing "Hello Bracket World".
* `going_down` stores whether the words are going up or down at the moment. It changes direction at the top and bottom of the screen.

### Setup


In the `main` function, we start by initializing `bracket-terminal`. We ask for a simple 80x50 console, and title the window. The `build()` function actually creates the window; the other chained functions return an object *describing* what you want. There's a lot of options you can choose, documented elsewhere in this guide.

We initialize `State` with some starting values for the bouncing text. Then we call `register_palette_color`---more on that in "pretty printing", below. Finally, we call `main_loop` to begin running the program---and calling `tick` every frame.

### Printing to the Console


1. The `tick` function starts by defining some colors. The `RGB::named(xxx)` functions return a color object. The library defines all of the W3C named colors; you can also use `from_rgb` to specify one yourself. These colors are then used in various printing functions.
2. Then it does a little dance to figure out where to draw the bouncing hello world.
3. `ctx.cls()` clears the console.
4. `ctx.printer` is then used to "pretty print" the words "Hello Bracket World". 
    1. The decorators `#[blue]`, `#[pink]` specify that text following that marker should be in the color that was registered wih the `register_palette_color` label.
    2. The two numbers (40, 49) are screen coordinates.
    3. `TextAlign::center` will center the text horizontally around the specified coordinates.
    4. `Some(RGBA::from_u8(200, 200, 200, 255))` describes a background color for the text.
5. Then we use the `print_color` commands, which is a simpler way to put single-color text on the console.
6. Some more `printer` calls, demonstrating different alignments and color settings.

Notice that in the text, we use unicode. `♫ ♪ Hello Bracket World ☺` is valid, because the characters are part of the codepage-437 set---and `bracket-terminal` automatically translates them.

You'll find more detailed usage instructions throughout this document.