aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHolden Rohrer <hr@hrhr.dev>2021-08-08 12:55:47 -0400
committerHolden Rohrer <hr@hrhr.dev>2021-08-08 12:55:47 -0400
commitc353004717da1ef7ba8be6e9a3ce10002c7d6d66 (patch)
tree79155f8e6f545639d423b8715ac5d459fb47962e
parent5f974d83677fc6d7ee229e6a2e2720a45677e4e0 (diff)
set up save and load w/o writes and reads
-rw-r--r--source/app.d133
1 files 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;
+}