summaryrefslogtreecommitdiff
path: root/source/tapes.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/tapes.c')
-rw-r--r--source/tapes.c258
1 files changed, 258 insertions, 0 deletions
diff --git a/source/tapes.c b/source/tapes.c
new file mode 100644
index 0000000..98652d0
--- /dev/null
+++ b/source/tapes.c
@@ -0,0 +1,258 @@
+/*
+ 3ds81 - Nintendo 3DS ZX81 emulator.
+
+ Copyright (C) 2021 Ian Cowburn <ianc@noddybox.co.uk>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 3
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>
+
+ $Id: tapes.c 61 2008-11-03 17:07:32Z ianc $
+*/
+
+#include <3ds.h>
+
+#include "tapes.h"
+#include "framebuffer.h"
+#include "keyboard.h"
+#include "zx81.h"
+
+#include "maze_bin.h"
+#include "cpatrol_bin.h"
+#include "sabotage_bin.h"
+#include "mazogs_bin.h"
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+
+/* ---------------------------------------- STATIC DATA
+*/
+typedef struct
+{
+ const u8 *tape;
+ const u8 *tape_end;
+ FB_Image img;
+ SoftKey *keys;
+ const char *text;
+} Tape;
+
+#define NO_TAPES 4
+
+static SoftKey maze_keys[]=
+ {
+ SK_PAD_UP, SK_7,
+ SK_PAD_LEFT, SK_5,
+ SK_PAD_RIGHT, SK_8,
+ SK_PAD_START, SK_C,
+ SK_PAD_SELECT, SK_A,
+ NUM_SOFT_KEYS
+ };
+
+static SoftKey cpatrol_keys[]=
+ {
+ SK_PAD_UP, SK_F,
+ SK_PAD_RIGHT, SK_J,
+ SK_PAD_LEFT, SK_N,
+ SK_PAD_DOWN, SK_V,
+ SK_PAD_R, SK_N,
+ SK_PAD_L, SK_J,
+ SK_PAD_A, SK_0,
+ SK_PAD_B, SK_NEWLINE,
+ NUM_SOFT_KEYS
+ };
+
+static SoftKey sabotage_keys[]=
+ {
+ SK_PAD_UP, SK_W,
+ SK_PAD_LEFT, SK_H,
+ SK_PAD_RIGHT, SK_J,
+ SK_PAD_DOWN, SK_S,
+ SK_PAD_A, SK_E,
+ SK_PAD_R, SK_1,
+ SK_PAD_L, SK_2,
+ SK_PAD_START, SK_0,
+ NUM_SOFT_KEYS
+ };
+
+static SoftKey mazogs_keys[]=
+ {
+ SK_PAD_UP, SK_W,
+ SK_PAD_LEFT, SK_H,
+ SK_PAD_RIGHT, SK_J,
+ SK_PAD_DOWN, SK_S,
+ SK_PAD_A, SK_NEWLINE,
+ SK_PAD_R, SK_R,
+ SK_PAD_L, SK_L,
+ SK_PAD_START, SK_Y,
+ SK_PAD_SELECT, SK_V,
+ NUM_SOFT_KEYS
+ };
+
+static Tape tapes[NO_TAPES]=
+ {
+ {
+ maze_bin,
+ maze_bin_end,
+ IMG_3D_MONSTER_MAZE_INLAY,
+ maze_keys,
+ "\0013D Monster maze\001\n"
+ "(c) 1983 Malcolm E. Evans\n\n"
+ "Escape the maze and its T-Rex\n\n"
+ "Use joypad for turning and to\n"
+ "move forward.\n"
+ "\001START\001 to start.\n"
+ "\001SELECT\001 to appeal.\n\n"
+ "\001Note\001 when the screen goes grey\n"
+ "this is not a problem - the game\n"
+ "is creating the maze."
+ },
+ {
+ mazogs_bin,
+ mazogs_bin_end,
+ IMG_MAZOGS_INLAY,
+ mazogs_keys,
+ "\001Mazogs\001\n"
+ "(c) 1981 Don Priestley\n\n"
+ "Find the treasure and\n"
+ "return to the start.\n"
+ "Avoid the \001Mazogs\001 that roam\n"
+ "the maze.\n\n"
+ "Use joypad to move.\n"
+ "\001SELECT\001 to view map.\n"
+ "\001START\001 to quit.\n"
+ "\001L\001 or \001R\001 shoulder to select\n"
+ "direction at start."
+ },
+ {
+ cpatrol_bin,
+ cpatrol_bin_end,
+ IMG_CITY_PATROL_INLAY,
+ cpatrol_keys,
+ "\001City Patrol\001\n"
+ "(c) 1982 Don Priestley\n\n"
+ "Defend the city from the aliens.\n\n"
+ "yes - that parallax city was\n"
+ "done with a text mode and the\n"
+ "equivalent of a 0.8mhz z80\n\n"
+ "the joypad controls the cursor.\n"
+ "hold \001L\001 or \001R\001 shoulder buttons\n"
+ "to move fast when moving in the\n"
+ "same direction.\n\n"
+ "\001A\001 fires when moving.\n"
+ "\001B\001 fires when still.\n\n"
+ "sorry about that, but the keys\n"
+ "are a bit odd in this game."
+ },
+ {
+ sabotage_bin,
+ sabotage_bin_end,
+ IMG_SABOTAGE_INLAY,
+ sabotage_keys,
+ "\001Sabotage\001\n"
+ "(c) 1982 Don Priestley\n\n"
+ "Destroy the boxes before the\n"
+ "guard finds you.\n\n"
+ "Or find the saboteur as the\n"
+ "guard.\n\n"
+ "While this game may not feature\n"
+ "the dazzling graphics of other\n"
+ "ZX81 games it more than makes\n"
+ "up with a simply joyous\n"
+ "gameplay mechanic.\n\n"
+ "The joypad controls the player.\n"
+ "\001A\001 plants a bomb. \001L\001 shoulder\n"
+ "to play as the guard, \001R\001 as\n"
+ "the saboteur."
+ }
+ };
+
+
+static int current=0;
+
+/* ---------------------------------------- PRIVATE INTERFACES
+*/
+static void DisplayTape(Tape *t, Framebuffer *upper, Framebuffer *lower)
+{
+ FB_Clear(upper,COL_WHITE);
+ FB_Clear(lower,COL_BLACK);
+
+ FB_Blit(lower,t->img,lower->width-195,0);
+
+ FB_Print(lower,"LEFT/RIGHT",0,lower->height-1,COL_WHITE,COL_TRANSPARENT);
+ FB_Print(lower,"to choose",0,lower->height-10,COL_WHITE,COL_TRANSPARENT);
+ FB_Print(lower,"A to select",0,lower->height-30,COL_WHITE,COL_TRANSPARENT);
+ FB_Print(lower,"B to cancel",0,lower->height-40,COL_WHITE,COL_TRANSPARENT);
+ FB_Print(lower,"REMEMBER TO",0,lower->height-60,COL_WHITE,COL_TRANSPARENT);
+ FB_Print(lower,"LOAD \"\"",0,lower->height-70,COL_WHITE,COL_TRANSPARENT);
+ FB_Print(lower,"ON THE ZX81!",0,lower->height-80,COL_WHITE,COL_TRANSPARENT);
+
+ FB_Print(upper, t->text, 0, upper->height-1, COL_BLACK,COL_TRANSPARENT);
+}
+
+/* ---------------------------------------- PUBLIC INTERFACES
+*/
+void SelectTape(void)
+{
+ int done=FALSE;
+ Framebuffer upper;
+ Framebuffer lower;
+
+ while(!done)
+ {
+ u32 key=0;
+
+
+ do
+ {
+ FB_StartFrame(&upper, &lower);
+ DisplayTape(tapes+current, &upper, &lower);
+ FB_EndFrame();
+ } while(!(key=hidKeysDownRepeat()));
+
+ if (key & KEY_LEFT)
+ {
+ if (--current<0)
+ {
+ current=NO_TAPES-1;
+ }
+ }
+ else if (key & KEY_RIGHT)
+ {
+ current=(current+1)%NO_TAPES;
+ }
+ else if (key & KEY_A)
+ {
+ int f;
+
+ done=TRUE;
+ ZX81SetTape(tapes[current].tape,
+ tapes[current].tape_end - tapes[current].tape);
+
+ for(f=0;tapes[current].keys[f]!=NUM_SOFT_KEYS;f+=2)
+ {
+ SK_DefinePad(tapes[current].keys[f],
+ tapes[current].keys[f+1]);
+ }
+ }
+ else if (key & KEY_B)
+ {
+ done=TRUE;
+ }
+ }
+}
+