From c353004717da1ef7ba8be6e9a3ce10002c7d6d66 Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Sun, 8 Aug 2021 12:55:47 -0400 Subject: set up save and load w/o writes and reads --- source/app.d | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 4 deletions(-) diff --git a/source/app.d b/source/app.d index 4006188..943b9d0 100644 --- a/source/app.d +++ b/source/app.d @@ -4,6 +4,7 @@ import core.stdc.locale; import std.format; import board; import spots; +import std.stdio; void main() { @@ -19,10 +20,6 @@ void main() scrollok(stdscr, true); // allows scrolling in up/down arrows nonl(); // "return" goes through input - int x; - int y; - getmaxyx(stdscr, y, x); - auto overlay = new OverlaySource(new RandomSource()); auto board = new Board(overlay); auto disp = new BoardDisplay(board, stdscr); @@ -73,8 +70,136 @@ void main() break; case 'q': break outer; + case 's': + auto filename = stdscr.readquery("Save:"); + try + { + auto file = File(filename, "wb"); + + } + catch (ErrnoException e) + { + } + disp.print(); + break; + case 'l': + auto filename = stdscr.readquery("Load:"); + try + { + auto file = File(filename); + } + catch (ErrnoException e) + { + } + disp.print(); + break; default: continue; } } } + +import std.range.interfaces : InputRange; + +class Reader : InputRange!char +{ + + private int _front; + private bool _empty; + // Might could be implemented with a larger getnstr + + this() + { + _front = getch(); + } + + char moveFront() + in + { + assert(!_empty); + } + do + { + auto ret = front(); + popFront(); + return ret; + } + + @property char front() + in + { + assert(!_empty); + } + do + { + return cast(char) _front; + } + + void popFront() + in + { + assert(!_empty); + } + do + { + _front = getch(); + if (_front == -1) + _empty = true; + } + + @property bool empty() + { + return _empty; + } + + int opApply(scope int delegate(char) run) + { + for (; !_empty; popFront()) + { + if (run(front())) + return 1; + } + + return 0; + } + + int opApply(scope int delegate(size_t, char) run) + { + for (size_t i = 0; !_empty; popFront(), i++) + { + if (run(i, front())) + return 1; + } + return 0; + } +} + +string readquery(WINDOW* stdscr, string query) +{ + import std.range : replicate; + import std.conv : to; + import std.array : appender; + + int height; + int width; + getmaxyx(stdscr, height, width); + + mvprintw(height, 0, toStringz(query ~ " ".replicate(width - query.length))); + move(height, cast(int) query.length + 1); + + echo(); + scrollok(stdscr, false); + auto build = appender!string; + + auto reader = new Reader(); + + while (!reader.empty && reader.front != '\r') + { + build ~= reader.front; + reader.popFront; + } + noecho(); + scrollok(stdscr, true); + + return build.data; +} -- cgit