123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- #include "door.h"
- #include "space.h"
- #include <iostream>
- #include <random>
- #include <string>
- int user_score = 0;
- void adjust_score(int by) { user_score += by; }
- door::Panel make_timeout(int mx, int my) {
- door::ANSIColor yellowred =
- door::ANSIColor(door::COLOR::YELLOW, door::COLOR::RED, door::ATTR::BOLD);
- std::string line_text("Sorry, you've been inactive for too long.");
- int msgWidth = line_text.length() + (2 * 3);
- door::Panel timeout((mx - (msgWidth)) / 2, my / 2 + 4, msgWidth);
-
- timeout.setStyle(door::BorderStyle::DOUBLE);
- timeout.setColor(yellowred);
- door::Line base(line_text);
- base.setColor(yellowred);
- std::string pad1(3, ' ');
-
- base.setPadding(pad1, yellowred);
-
- std::unique_ptr<door::Line> stuff = std::make_unique<door::Line>(base);
- timeout.addLine(std::make_unique<door::Line>(base));
- return timeout;
- }
- door::Menu make_main_menu(void) {
- door::Menu m(5, 5, 25);
- door::Line mtitle("Space-Ace Main Menu");
- door::ANSIColor border_color(door::COLOR::CYAN, door::COLOR::BLUE);
- door::ANSIColor title_color(door::COLOR::CYAN, door::COLOR::BLUE,
- door::ATTR::BOLD);
- m.setColor(border_color);
- mtitle.setColor(title_color);
- mtitle.setPadding(" ", title_color);
- m.setTitle(std::make_unique<door::Line>(mtitle), 1);
-
- m.setRender(true, door::Menu::makeRender(
- door::ANSIColor(door::COLOR::CYAN, door::ATTR::BOLD),
- door::ANSIColor(door::COLOR::BLUE, door::ATTR::BOLD),
- door::ANSIColor(door::COLOR::CYAN, door::ATTR::BOLD),
- door::ANSIColor(door::COLOR::BLUE, door::ATTR::BOLD)));
-
- m.setRender(false, door::Menu::makeRender(
- door::ANSIColor(door::COLOR::YELLOW, door::COLOR::BLUE,
- door::ATTR::BOLD),
- door::ANSIColor(door::COLOR::WHITE, door::COLOR::BLUE,
- door::ATTR::BOLD),
- door::ANSIColor(door::COLOR::YELLOW, door::COLOR::BLUE,
- door::ATTR::BOLD),
- door::ANSIColor(door::COLOR::CYAN, door::COLOR::BLUE,
- door::ATTR::BOLD)));
- m.addSelection('1', "Play Cards");
- m.addSelection('2', "View Scores");
- m.addSelection('3', "Drop to DOS");
- m.addSelection('4', "Chat with BUGZ");
- m.addSelection('H', "Help");
- m.addSelection('A', "About this game");
- m.addSelection('Q', "Quit");
- return m;
- }
- door::Panel make_about(void) {
- door::Panel about(2, 2, 60);
- about.setStyle(door::BorderStyle::DOUBLE_SINGLE);
- about.setColor(door::ANSIColor(door::COLOR::YELLOW, door::COLOR::BLUE,
- door::ATTR::BOLD));
- about.addLine(std::make_unique<door::Line>("About This Door", 60));
-
- about.addLine(
- std::make_unique<door::Line>("This door was written by Bugz.", 60));
- about.addLine(std::make_unique<door::Line>("", 60));
- about.addLine(std::make_unique<door::Line>(
- "It is written in c++, only support Linux, and replaces", 60));
- about.addLine(std::make_unique<door::Line>("opendoors.", 60));
- return about;
- }
- void display_starfield(int mx, int my, door::Door &door, std::mt19937 &rng) {
- door << door::reset << door::cls;
-
- const char *stars[2];
- stars[0] = ".";
- if (door::unicode) {
- stars[1] = "\u2219";
- } else {
- stars[1] = "\xf9";
- };
- {
-
- std::uniform_int_distribution<int> uni_x(1, mx);
- std::uniform_int_distribution<int> uni_y(1, my);
- door::ANSIColor white(door::COLOR::WHITE);
- door::ANSIColor dark(door::COLOR::BLACK, door::ATTR::BRIGHT);
- for (int x = 0; x < (mx * my / 100); x++) {
- door::Goto star_at(uni_x(rng), uni_y(rng));
- door << star_at;
- if (x % 5 < 2)
- door << dark;
- else
- door << white;
- if (x % 2 == 0)
- door << stars[0];
- else
- door << stars[1];
- }
- }
- }
- void display_space_ace(int mx, int my, door::Door &door) {
-
- int sa_x = (mx - 72) / 2;
- int sa_y = (my - 6) / 2;
-
- for (const auto s : space) {
- door::Goto sa_at(sa_x, sa_y);
- door << sa_at;
- if (door::unicode) {
- std::string unicode;
- door::cp437toUnicode(s, unicode);
- door << unicode;
- } else
- door << s;
- sa_y++;
- }
-
- door.sleep_key(5);
- }
- void display_starfield_space_ace(int mx, int my, door::Door &door,
- std::mt19937 &rng) {
- display_starfield(mx, my, door, rng);
- display_space_ace(mx, my, door);
- door << door::reset;
- }
- int main(int argc, char *argv[]) {
- door::Door door("space-ace", argc, argv);
-
- door::ANSIColor ac(door::COLOR::YELLOW, door::ATTR::BOLD);
-
- std::random_device rd;
- std::mt19937 rng(
- rd());
-
- int mx, my;
- if (door.width == 0) {
-
- mx = 80;
- my = 23;
- } else {
- mx = door.width;
- my = door.height;
- }
-
- display_starfield_space_ace(mx, my, door, rng);
-
- door.inactivity = 10;
- door::Panel timeout = make_timeout(mx, my);
- door::Menu m = make_main_menu();
- int r = m.choose(door);
-
- door << door::reset;
- if (r == -1) {
- TIMEOUT:
- door.log("TIMEOUT");
-
- door::ANSIColor yellowred = door::ANSIColor(
- door::COLOR::YELLOW, door::COLOR::RED, door::ATTR::BOLD);
- std::string line_text("Sorry, you've been inactive for too long.");
- int msgWidth = line_text.length() + (2 * 3);
- door::Panel timeout((mx - (msgWidth)) / 2, my / 2 + 4, msgWidth);
-
- timeout.setStyle(door::BorderStyle::DOUBLE);
- timeout.setColor(yellowred);
- door::Line base(line_text);
- base.setColor(yellowred);
- std::string pad1(3, ' ');
-
- base.setPadding(pad1, yellowred);
-
- std::unique_ptr<door::Line> stuff = std::make_unique<door::Line>(base);
- timeout.addLine(std::make_unique<door::Line>(base));
- door << timeout << door::reset << door::nl << door::nl;
- return 0;
- }
- display_starfield(mx, my, door, rng);
-
- door << door::Goto(1, 9);
- door << "Hello, " << door.username << ", you chose option " << r << "!"
- << door::nl;
- door << "Press a key...";
- r = door.sleep_key(door.inactivity);
- if (r == -1)
- goto TIMEOUT;
- door << door::nl;
- door::Panel about = make_about();
- about.set((mx - 60) / 2, (my - 5) / 2);
- door << about;
- door << door::reset << door::nl << "Press another key...";
- r = door.sleep_key(door.inactivity);
- if (r == -1)
- goto TIMEOUT;
- door << door::nl;
-
- display_starfield(mx, my, door, rng);
- door << m << door::reset << door::nl << "This is what the menu looked liked!"
- << door::nl;
-
- door << door::nl << "Returning you to the BBS, please wait..." << door::nl;
- sleep(2);
- return 0;
- }
|