From ccf77c65f1446d171cb70e601d6d4472a545971d Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Sun, 24 Jun 2018 23:42:40 -0400 Subject: [PATCH] Add support for a mouse. Add a license. --- LICENSE | 21 + a2sudoku.xcodeproj/project.pbxproj | 8 + .../UserInterfaceState.xcuserstate | Bin 20247 -> 32387 bytes a2sudoku/Makefile | 2 +- a2sudoku/make/V2Make.scpt | Bin 4906 -> 4906 bytes a2sudoku/mouseWrapper.c | 79 ++++ a2sudoku/mouseWrapper.h | 30 ++ a2sudoku/ui.c | 388 +++++++++--------- 8 files changed, 342 insertions(+), 186 deletions(-) create mode 100644 LICENSE create mode 100644 a2sudoku/mouseWrapper.c create mode 100644 a2sudoku/mouseWrapper.h diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..71b9c9b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Jeremy Rand + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/a2sudoku.xcodeproj/project.pbxproj b/a2sudoku.xcodeproj/project.pbxproj index f077549..a19f773 100644 --- a/a2sudoku.xcodeproj/project.pbxproj +++ b/a2sudoku.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 9D3B394020E082580055431C /* mouseWrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 9D3B393E20E082580055431C /* mouseWrapper.c */; }; 9D3FF4AF20DA05C2006A5F8A /* AppleCommander.jar in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D3FF4AE20DA05C2006A5F8A /* AppleCommander.jar */; }; 9D3FF4B120DA05C2006A5F8A /* createDiskImage in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D3FF4B020DA05C2006A5F8A /* createDiskImage */; }; 9D3FF4B320DA05C2006A5F8A /* DevApple.vii in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D3FF4B220DA05C2006A5F8A /* DevApple.vii */; }; @@ -44,6 +45,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 9D3B393D20E0821B0055431C /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + 9D3B393E20E082580055431C /* mouseWrapper.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mouseWrapper.c; sourceTree = ""; }; + 9D3B393F20E082580055431C /* mouseWrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mouseWrapper.h; sourceTree = ""; }; 9D3FF4A620DA05C2006A5F8A /* doNotBuild */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = doNotBuild; sourceTree = BUILT_PRODUCTS_DIR; }; 9D3FF4AE20DA05C2006A5F8A /* AppleCommander.jar */ = {isa = PBXFileReference; lastKnownFileType = archive.jar; name = AppleCommander.jar; path = make/AppleCommander.jar; sourceTree = ""; }; 9D3FF4B020DA05C2006A5F8A /* createDiskImage */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = createDiskImage; path = make/createDiskImage; sourceTree = ""; }; @@ -85,6 +89,7 @@ children = ( 9D3FF4CA20DA05E4006A5F8A /* a2sudoku.png */, 9D3FF4C920DA05E3006A5F8A /* README.md */, + 9D3B393D20E0821B0055431C /* LICENSE */, 9D3FF4A820DA05C2006A5F8A /* a2sudoku */, 9D3FF4A720DA05C2006A5F8A /* Products */, ); @@ -107,6 +112,8 @@ 9D3FF4CC20DA05F2006A5F8A /* main.c */, 9D3FF4CF20DA05F3006A5F8A /* ui.c */, 9D3FF4D420DA05F3006A5F8A /* ui.h */, + 9D3B393E20E082580055431C /* mouseWrapper.c */, + 9D3B393F20E082580055431C /* mouseWrapper.h */, 9D3FF4DA20DA0622006A5F8A /* puzzles */, 9D3FF4AD20DA05C2006A5F8A /* make */, 9D3FF4BE20DA05C2006A5F8A /* Supporting Files */, @@ -227,6 +234,7 @@ 9D3FF4D920DA05F3006A5F8A /* Makefile in Sources */, 9D3FF4D620DA05F3006A5F8A /* main.c in Sources */, 9D3FF4D820DA05F3006A5F8A /* game.c in Sources */, + 9D3B394020E082580055431C /* mouseWrapper.c in Sources */, 9D3FF4D720DA05F3006A5F8A /* ui.c in Sources */, 9D3FF4D520DA05F3006A5F8A /* puzzles.c in Sources */, ); diff --git a/a2sudoku.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate b/a2sudoku.xcodeproj/project.xcworkspace/xcuserdata/jrand.xcuserdatad/UserInterfaceState.xcuserstate index 726a0a8b51165edc560815d02ee0aaf1ecdc99d3..25639549898f2fb9a151c7aca7de8fbabbd4fd93 100644 GIT binary patch delta 16339 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 delta 8326 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 diff --git a/a2sudoku/Makefile b/a2sudoku/Makefile index 843f2d0..b93ca55 100644 --- a/a2sudoku/Makefile +++ b/a2sudoku/Makefile @@ -151,7 +151,7 @@ DRIVERS += hiresgr # If you want to link the mouse driver with your executable, # uncomment the next line. -# DRIVERS += mouse +DRIVERS += mouse # # To use the mouse driver, add code which looks like this to your # project: diff --git a/a2sudoku/make/V2Make.scpt b/a2sudoku/make/V2Make.scpt index 43f0fd9bef2d997bc525081831214a047e6d7a6a..11e20ee5e20be957b4464729777944ff3a416b63 100644 GIT binary patch delta 194 zcma)#F$%*l3`PIYG0EBslxzYS3n_*!F}6E*?A{ys7MTh?MUK$hRCF(7`TYN$K-;{{ zuRNStZBdm#TpE+akSNzR_Q$Ya{x~Y8YDuf)$i0o%8$)4OJQacf0;8aLlJDpwdCRC+ ZeUUr+-I{ZCD()h<@8k2()AxP)oWA?#CHMdU delta 194 zcmZ3bwn}Y-6OXuyv!#)> MOUSE_POS_SHIFT, + mouseInfo.pos.y >> MOUSE_POS_SHIFT); + gMouseInPoll = false; +} + + +void moveMouseToPos(tPos newX, tPos newY) +{ + if (!gMouseInstalled) + return; + + if (gMouseInPoll) + return; + + mouse_move(newX << MOUSE_POS_SHIFT, newY << MOUSE_POS_SHIFT); +} diff --git a/a2sudoku/mouseWrapper.h b/a2sudoku/mouseWrapper.h new file mode 100644 index 0000000..82add86 --- /dev/null +++ b/a2sudoku/mouseWrapper.h @@ -0,0 +1,30 @@ +// +// mouseWrapper.h +// a2sudoku +// +// Created by Jeremy Rand on 2018-06-24. +// Copyright © 2018 Jeremy Rand. All rights reserved. +// + +#ifndef _GUARD_PROJECTa2sudoku_FILEmouseWrapper_ +#define _GUARD_PROJECTa2sudoku_FILEmouseWrapper_ + +#include + +#include "puzzles.h" + + +// Typedefs + +typedef void (*tMouseCallback)(tPos newX, tPos newY); + + +// API + +extern bool initMouse(tMouseCallback callback); +extern void shutdownMouse(void); +extern void pollMouse(void); +extern void moveMouseToPos(tPos newX, tPos newY); + + +#endif /* define _GUARD_PROJECTa2sudoku_FILEmouseWrapper_ */ diff --git a/a2sudoku/ui.c b/a2sudoku/ui.c index 4fcc953..dbc34c8 100644 --- a/a2sudoku/ui.c +++ b/a2sudoku/ui.c @@ -16,6 +16,7 @@ #include "game.h" #include "ui.h" +#include "mouseWrapper.h" #include "drivers/a2_hires_drv.h" @@ -118,6 +119,31 @@ void drawGrid(void) } +void setCursorPos(tPos newX, tPos newY) +{ + tPos oldX = cursorX; + tPos oldY = cursorY; + + if (newX >= BOARD_SIZE) + newX = BOARD_SIZE - 1; + + if (newY >= BOARD_SIZE) + newY = BOARD_SIZE - 1; + + if ((cursorX == newX) && + (cursorY == newY)) + return; + + cursorX = newX; + cursorY = newY; + + refreshPos(cursorX, cursorY); + refreshPos(oldX, oldY); + + moveMouseToPos(cursorX, cursorY); +} + + void initUI(void) { static bool tgi_inited = false; @@ -131,6 +157,8 @@ void initUI(void) tgi_init(); tgi_inited = true; + + initMouse(setCursorPos); } @@ -166,6 +194,7 @@ void shutdownUI(void) { // Uninstall drivers tgi_uninstall(); + shutdownMouse(); } @@ -269,8 +298,8 @@ void displayInstructions(void) "\n" "The goal is to get the numbers from 1 to" "9 uniquely in each column, row and 3x3\n" - "subsquare. Move the cursor with I-J-K-L" - "or the arrow keys. Press a number key\n" + "subsquare. Move the cursor with arrow\n" + "keys, IJKM or mouse. Press a number key" "to enter a value. Press a number key\n" "while holding shift or open apple to\n" "toggle a scratch value. Press 0 to\n" @@ -592,191 +621,180 @@ bool playGame(void) graphicsMode(); while (true) { - bool shouldNotBeep = true; + pollMouse(); - if (isPuzzleSolved()) { - youWon(); - return true; - } - - ch = cgetc(); - - switch (ch) { - case 'h': - case 'H': - textMode(); - displayInstructions(); - graphicsMode(); - break; - - case 'o': - case 'O': - textMode(); - if (setOptions()) - refreshAllPos(); - graphicsMode(); - break; - - case 'r': - case 'R': - shouldSave = false; - restartGame(); - break; - - case 'n': - case 'N': + if (kbhit()) { + bool shouldNotBeep = true; + ch = cgetc(); + + switch (ch) { + case 'h': + case 'H': + textMode(); + displayInstructions(); + graphicsMode(); + break; + + case 'o': + case 'O': + textMode(); + if (setOptions()) + refreshAllPos(); + graphicsMode(); + break; + + case 'r': + case 'R': + shouldSave = false; + restartGame(); + break; + + case 'n': + case 'N': + return true; + + case 'q': + case 'Q': + case CH_ESC: + shutdownUI(); + if (shouldSave) { + clrscr(); + printf("\n\nSaving your puzzle so you can continue\n later..."); + saveGame(); + } + return false; + + case 'i': + case 'I': + case 0x0B: // Only defined with apple2enh targts, CH_CURS_UP: + if (cursorY != 0) { + setCursorPos(cursorX, cursorY - 1); + } else { + setCursorPos(cursorX, BOARD_SIZE - 1); + } + break; + + case 'j': + case 'J': + case CH_CURS_LEFT: + if (cursorX != 0) { + setCursorPos(cursorX - 1, cursorY); + } else { + setCursorPos(BOARD_SIZE - 1, cursorY); + } + break; + + case 'k': + case 'K': + case CH_CURS_RIGHT: + if (cursorX < BOARD_SIZE - 1) { + setCursorPos(cursorX + 1, cursorY); + } else { + setCursorPos(0, cursorY); + } + break; + + case 'm': + case 'M': + case 0x0A: // Only defined with apple2enh targts, CH_CURS_DOWN: + if (cursorY < BOARD_SIZE - 1) { + setCursorPos(cursorX, cursorY + 1); + } else { + setCursorPos(cursorX, 0); + } + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (*button0 > 127) + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, ch - '0'); + else + shouldNotBeep = setValueAtPos(cursorX, cursorY, ch - '0'); + if (shouldNotBeep) + shouldSave = true; + break; + + case '!': + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 1); + if (shouldNotBeep) + shouldSave = true; + break; + + case '@': + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 2); + if (shouldNotBeep) + shouldSave = true; + break; + + case '#': + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 3); + if (shouldNotBeep) + shouldSave = true; + break; + + case '$': + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 4); + if (shouldNotBeep) + shouldSave = true; + break; + + case '%': + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 5); + if (shouldNotBeep) + shouldSave = true; + break; + + case '^': + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 6); + if (shouldNotBeep) + shouldSave = true; + break; + + case '&': + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 7); + if (shouldNotBeep) + shouldSave = true; + break; + + case '*': + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 8); + if (shouldNotBeep) + shouldSave = true; + break; + + case '(': + shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 9); + if (shouldNotBeep) + shouldSave = true; + break; + + case 'u': + case 'U': + shouldNotBeep = undoLastMove(); + break; + + default: + shouldNotBeep = false; + break; + } + + if (!shouldNotBeep) { + printf("\007"); + } + + if (isPuzzleSolved()) { + youWon(); return true; - - case 'q': - case 'Q': - case CH_ESC: - shutdownUI(); - if (shouldSave) { - clrscr(); - printf("\n\nSaving your puzzle so you can continue\n later..."); - saveGame(); - } - return false; - - case 'i': - case 'I': - case 0x0B: // Only defined with apple2enh targts, CH_CURS_UP: - if (cursorY != 0) { - cursorY--; - refreshPos(cursorX, cursorY); - refreshPos(cursorX, cursorY + 1); - } else { - cursorY = BOARD_SIZE - 1; - refreshPos(cursorX, cursorY); - refreshPos(cursorX, 0); - } - break; - - case 'j': - case 'J': - case CH_CURS_LEFT: - if (cursorX != 0) { - cursorX--; - refreshPos(cursorX, cursorY); - refreshPos(cursorX + 1, cursorY); - } else { - cursorX = BOARD_SIZE - 1; - refreshPos(cursorX, cursorY); - refreshPos(0, cursorY); - } - break; - - case 'k': - case 'K': - case CH_CURS_RIGHT: - if (cursorX < BOARD_SIZE - 1) { - cursorX++; - refreshPos(cursorX, cursorY); - refreshPos(cursorX - 1, cursorY); - } else { - cursorX = 0; - refreshPos(cursorX, cursorY); - refreshPos(BOARD_SIZE - 1, cursorY); - } - break; - - case 'm': - case 'M': - case 0x0A: // Only defined with apple2enh targts, CH_CURS_DOWN: - if (cursorY < BOARD_SIZE - 1) { - cursorY++; - refreshPos(cursorX, cursorY); - refreshPos(cursorX, cursorY - 1); - } else { - cursorY = 0; - refreshPos(cursorX, cursorY); - refreshPos(cursorX, BOARD_SIZE - 1); - } - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (*button0 > 127) - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, ch - '0'); - else - shouldNotBeep = setValueAtPos(cursorX, cursorY, ch - '0'); - if (shouldNotBeep) - shouldSave = true; - break; - - case '!': - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 1); - if (shouldNotBeep) - shouldSave = true; - break; - - case '@': - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 2); - if (shouldNotBeep) - shouldSave = true; - break; - - case '#': - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 3); - if (shouldNotBeep) - shouldSave = true; - break; - - case '$': - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 4); - if (shouldNotBeep) - shouldSave = true; - break; - - case '%': - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 5); - if (shouldNotBeep) - shouldSave = true; - break; - - case '^': - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 6); - if (shouldNotBeep) - shouldSave = true; - break; - - case '&': - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 7); - if (shouldNotBeep) - shouldSave = true; - break; - - case '*': - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 8); - if (shouldNotBeep) - shouldSave = true; - break; - - case '(': - shouldNotBeep = toggleScratchValueAtPos(cursorX, cursorY, 9); - if (shouldNotBeep) - shouldSave = true; - break; - - case 'u': - case 'U': - shouldNotBeep = undoLastMove(); - break; - - default: - shouldNotBeep = false; - break; - } - if (!shouldNotBeep) { - printf("\007"); + } + } }