diff options
Diffstat (limited to 'source/tapes.c')
-rw-r--r-- | source/tapes.c | 258 |
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; + } + } +} + |