From ea5452c6d91b0793109ba0e1bf9aa77dcca5ec65 Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Mon, 8 Dec 2025 15:38:45 +0100 Subject: [PATCH 01/14] Add keycopier.js for key copying functionality It is a key maker program similar to the one that runs on flipper zero devices! --- bruce-emulator/Keycopier/keycopier.js | 292 ++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 bruce-emulator/Keycopier/keycopier.js diff --git a/bruce-emulator/Keycopier/keycopier.js b/bruce-emulator/Keycopier/keycopier.js new file mode 100644 index 0000000..ef16227 --- /dev/null +++ b/bruce-emulator/Keycopier/keycopier.js @@ -0,0 +1,292 @@ +var display = require('display'); +var keyboard = require('keyboard'); +var storage = require('storage'); + +function main() { + + // --- Képernyő --- + var dw = display.width(); + var dh = display.height(); + var sprite = display.createSprite(dw, dh); + + // --- Színek --- + var bg_color = display.color(255, 130, 0); + var fg_color = display.color(0, 0, 0); + + // --- Adatok --- + var cursor = 0; + var code = [1, 1, 1, 1, 1, 1]; + var maxDepth = 7; + + // --- MENTÉS HELYE --- + var FILE_PATH = "/KeyCopier/key_copier.code"; + + var showMenu = false; + var menuCursor = 0; + var menuItems = ["Save", "Load", "Exit"]; + + var statusMsg = ""; + var msgTimer = 0; + + keyboard.setLongPress(true); + + // --- GRAFIKA --- + var TANGENT = 0.84; + var PIN_HALF_WIDTH = 3; + var DEPTH_STEP = 4; + var numY = 25; + var TOP_Y = 55; + var keySpineY = 95; + + while (true) { + + if (msgTimer > 0) msgTimer--; + if (msgTimer === 0) statusMsg = ""; + + // --- BEMENET --- + + if (showMenu) { + // *** MENÜ *** + if (keyboard.getPrevPress(true)) showMenu = false; + + if (keyboard.getNextPress(true)) { + menuCursor++; + if (menuCursor >= menuItems.length) menuCursor = 0; + } + + if (keyboard.getSelPress(true)) { + if (menuCursor === 0) { + // ********************************** + // *** SAVE (FELÜLÍRÁS "write" MÓDDAL) *** + // ********************************** + try { + // CSV formátum + var csvData = code.join(","); + + // JAVÍTÁS: Itt adjuk át a "write" paramétert! + // Ez biztosítja, hogy felülírja a fájlt, ne hozzáfűzzön. + var success = storage.write(FILE_PATH, csvData, "write"); + + if (success) statusMsg = "Saved!"; + else statusMsg = "Write: False"; + + } catch (e) { + statusMsg = "Sys Err"; + } + msgTimer = 30; + showMenu = false; + } + else if (menuCursor === 1) { + // ********************************** + // *** LOAD (BETÖLTÉS) *** + // ********************************** + var raw = undefined; + var loaded = false; + + try { + // Közvetlen olvasás + raw = storage.read(FILE_PATH); + } catch (e) { + statusMsg = "IO Err"; + } + + if (raw !== undefined && raw !== null) { + try { + var str = String(raw).trim(); + // Ha esetleg maradtak benne sortörések, csak az első sort vesszük + // Ez extra védelem, ha régebben appendelt fájlt olvasunk be + var lines = str.split("\n"); + if (lines.length > 0) str = lines[lines.length-1]; // Az utolsó sort vesszük (a legfrissebbet) + + var parts = str.split(","); + + var tempCode = []; + for (var k = 0; k < parts.length; k++) { + var val = parseInt(parts[k].trim()); + if (!isNaN(val)) tempCode.push(val); + } + + // Mivel lehet, hogy a fájlban több sor van (a régi hibás mentések miatt), + // csak az utolsó 6 számot vesszük figyelembe, ha több lenne. + if (tempCode.length >= 6) { + // Az utolsó 6 elemet töltjük be + var startIdx = tempCode.length - 6; + code = tempCode.slice(startIdx, startIdx + 6); + statusMsg = "Loaded!"; + loaded = true; + } else { + statusMsg = "Bad Len"; + } + } catch (e) { + statusMsg = "Parse Err"; + } + + if (!loaded && statusMsg === "") statusMsg = "Bad Data"; + + } else { + if (statusMsg === "") statusMsg = "No File"; + } + + msgTimer = 30; + showMenu = false; + } + else if (menuCursor === 2) { + break; // Exit + } + } + + } else { + // *** SZERKESZTŐ *** + if (keyboard.getPrevPress(true)) { + showMenu = true; + menuCursor = 0; + } + if (keyboard.getSelPress(true)) { + cursor++; + if (cursor > 5) cursor = 0; + } + if (keyboard.getNextPress(true)) { + code[cursor]++; + if (code[cursor] > maxDepth) code[cursor] = 1; + } + } + + // --- RAJZOLÁS --- + sprite.fill(bg_color); + sprite.setTextColor(fg_color, bg_color); + + sprite.setTextSize(2); + sprite.drawText("Key Copier", 5, 2); + + var availableWidth = dw - 20; + var pinSpacing = Math.floor(availableWidth / 6); + var startX = 10; + + sprite.setTextSize(2); + for(var i=0; i<6; i++) { + var pinCenterX = startX + (i * pinSpacing) + (pinSpacing/2); + var textStr = code[i].toString(); + + if (i === cursor && !showMenu) { + textStr = "[" + textStr + "]"; + sprite.drawText(textStr, pinCenterX - 14, numY); + } else { + sprite.drawText(textStr, pinCenterX - 5, numY); + } + } + + var keyEnd = dw - 5; + sprite.drawLine(0, keySpineY, keyEnd, keySpineY, fg_color); + sprite.drawLine(0, keySpineY, 0, TOP_Y, fg_color); + sprite.drawLine(keyEnd, keySpineY, keyEnd, TOP_Y + 10, fg_color); + + for(var j=0; j<6; j++) { + var cx = startX + (j * pinSpacing) + (pinSpacing/2); + var currentDepthPx = (code[j] - 1) * DEPTH_STEP; + var bottomY = TOP_Y + currentDepthPx; + + sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, cx + PIN_HALF_WIDTH, bottomY, fg_color); + + var prevDepthPx = 0; + if (j > 0) prevDepthPx = (code[j-1] - 1) * DEPTH_STEP; + var myLeftWidth = PIN_HALF_WIDTH + (currentDepthPx * TANGENT); + var prevRightWidth = PIN_HALF_WIDTH + (prevDepthPx * TANGENT); + var distToPrev = (j === 0) ? 999 : pinSpacing; + + if (j === 0) { + var slopeEndX = cx - myLeftWidth; + if (slopeEndX < 0) slopeEndX = 0; + sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, slopeEndX, TOP_Y, fg_color); + if (slopeEndX > 0) sprite.drawLine(0, TOP_Y, slopeEndX, TOP_Y, fg_color); + } else { + if ((myLeftWidth + prevRightWidth) > distToPrev) { + var ratio = currentDepthPx / (currentDepthPx + prevDepthPx); + if (currentDepthPx + prevDepthPx === 0) ratio = 0.5; + var peakDistX = ratio * distToPrev; + var peakX = cx - peakDistX; + var rise = (peakDistX - PIN_HALF_WIDTH) / TANGENT; + var peakY = bottomY - rise; + sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, peakX, peakY, fg_color); + } else { + var slopeTopX = cx - myLeftWidth; + sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, slopeTopX, TOP_Y, fg_color); + var prevCx = cx - pinSpacing; + var prevSlopeTopX = prevCx + prevRightWidth; + sprite.drawLine(prevSlopeTopX, TOP_Y, slopeTopX, TOP_Y, fg_color); + } + } + + var nextDepthPx = 0; + if (j < 5) nextDepthPx = (code[j+1] - 1) * DEPTH_STEP; + var myRightWidth = PIN_HALF_WIDTH + (currentDepthPx * TANGENT); + var nextLeftWidth = PIN_HALF_WIDTH + (nextDepthPx * TANGENT); + var distToNext = (j === 5) ? 999 : pinSpacing; + + if (j === 5) { + var slopeEndX = cx + myRightWidth; + sprite.drawLine(cx + PIN_HALF_WIDTH, bottomY, slopeEndX, TOP_Y, fg_color); + sprite.drawLine(slopeEndX, TOP_Y, keyEnd, TOP_Y, fg_color); + } else { + if ((myRightWidth + nextLeftWidth) > distToNext) { + var ratio = currentDepthPx / (currentDepthPx + nextDepthPx); + if (currentDepthPx + nextDepthPx === 0) ratio = 0.5; + var peakDistX = ratio * distToNext; + var myPeakDistX = distToNext - peakDistX; + var peakX = cx + myPeakDistX; + var rise = (myPeakDistX - PIN_HALF_WIDTH) / TANGENT; + var peakY = bottomY - rise; + sprite.drawLine(cx + PIN_HALF_WIDTH, bottomY, peakX, peakY, fg_color); + } else { + var slopeTopX = cx + myRightWidth; + sprite.drawLine(cx + PIN_HALF_WIDTH, bottomY, slopeTopX, TOP_Y, fg_color); + } + } + } + + // --- Menü --- + if (showMenu) { + var menuW = 80; + var menuH = 55; + var menuX = (dw - menuW) / 2; + var menuY = (dh - menuH) / 2; + + sprite.drawFillRect(menuX, menuY, menuW, menuH, fg_color); + + sprite.drawLine(menuX, menuY, menuX + menuW, menuY, bg_color); + sprite.drawLine(menuX, menuY + menuH, menuX + menuW, menuY + menuH, bg_color); + sprite.drawLine(menuX, menuY, menuX, menuY + menuH, bg_color); + sprite.drawLine(menuX + menuW, menuY, menuX + menuW, menuY + menuH, bg_color); + + sprite.setTextSize(1); + sprite.setTextColor(bg_color, fg_color); + + for (var m = 0; m < menuItems.length; m++) { + var itemY = menuY + 12 + (m * 12); + var itemText = menuItems[m]; + if (m === menuCursor) itemText = "> " + itemText + " <"; + sprite.drawText(itemText, menuX + 15, itemY); + } + } + + // --- Üzenet --- + if (statusMsg !== "") { + var msgH = 20; + sprite.drawFillRect(0, dh - msgH, dw, msgH, fg_color); + sprite.drawLine(0, dh - msgH, dw, dh - msgH, bg_color); + sprite.setTextColor(bg_color, fg_color); + sprite.setTextSize(1); + sprite.drawText(statusMsg, (dw/2) - (statusMsg.length*3), dh - 15); + } + else if (!showMenu) { + sprite.setTextSize(1); + sprite.drawText("Back: Menu | Next: Cut", 5, dh - 12); + } + + sprite.pushSprite(); + delay(50); + } + + keyboard.setLongPress(false); +} + +main(); From 55eef3fef2272be238c6dd3fe40024b6f08e9663 Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Tue, 9 Dec 2025 10:09:02 +0100 Subject: [PATCH 02/14] Add key copier functionality with save/load menu --- examples/key copier/keycopier.js | 292 +++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 examples/key copier/keycopier.js diff --git a/examples/key copier/keycopier.js b/examples/key copier/keycopier.js new file mode 100644 index 0000000..ef16227 --- /dev/null +++ b/examples/key copier/keycopier.js @@ -0,0 +1,292 @@ +var display = require('display'); +var keyboard = require('keyboard'); +var storage = require('storage'); + +function main() { + + // --- Képernyő --- + var dw = display.width(); + var dh = display.height(); + var sprite = display.createSprite(dw, dh); + + // --- Színek --- + var bg_color = display.color(255, 130, 0); + var fg_color = display.color(0, 0, 0); + + // --- Adatok --- + var cursor = 0; + var code = [1, 1, 1, 1, 1, 1]; + var maxDepth = 7; + + // --- MENTÉS HELYE --- + var FILE_PATH = "/KeyCopier/key_copier.code"; + + var showMenu = false; + var menuCursor = 0; + var menuItems = ["Save", "Load", "Exit"]; + + var statusMsg = ""; + var msgTimer = 0; + + keyboard.setLongPress(true); + + // --- GRAFIKA --- + var TANGENT = 0.84; + var PIN_HALF_WIDTH = 3; + var DEPTH_STEP = 4; + var numY = 25; + var TOP_Y = 55; + var keySpineY = 95; + + while (true) { + + if (msgTimer > 0) msgTimer--; + if (msgTimer === 0) statusMsg = ""; + + // --- BEMENET --- + + if (showMenu) { + // *** MENÜ *** + if (keyboard.getPrevPress(true)) showMenu = false; + + if (keyboard.getNextPress(true)) { + menuCursor++; + if (menuCursor >= menuItems.length) menuCursor = 0; + } + + if (keyboard.getSelPress(true)) { + if (menuCursor === 0) { + // ********************************** + // *** SAVE (FELÜLÍRÁS "write" MÓDDAL) *** + // ********************************** + try { + // CSV formátum + var csvData = code.join(","); + + // JAVÍTÁS: Itt adjuk át a "write" paramétert! + // Ez biztosítja, hogy felülírja a fájlt, ne hozzáfűzzön. + var success = storage.write(FILE_PATH, csvData, "write"); + + if (success) statusMsg = "Saved!"; + else statusMsg = "Write: False"; + + } catch (e) { + statusMsg = "Sys Err"; + } + msgTimer = 30; + showMenu = false; + } + else if (menuCursor === 1) { + // ********************************** + // *** LOAD (BETÖLTÉS) *** + // ********************************** + var raw = undefined; + var loaded = false; + + try { + // Közvetlen olvasás + raw = storage.read(FILE_PATH); + } catch (e) { + statusMsg = "IO Err"; + } + + if (raw !== undefined && raw !== null) { + try { + var str = String(raw).trim(); + // Ha esetleg maradtak benne sortörések, csak az első sort vesszük + // Ez extra védelem, ha régebben appendelt fájlt olvasunk be + var lines = str.split("\n"); + if (lines.length > 0) str = lines[lines.length-1]; // Az utolsó sort vesszük (a legfrissebbet) + + var parts = str.split(","); + + var tempCode = []; + for (var k = 0; k < parts.length; k++) { + var val = parseInt(parts[k].trim()); + if (!isNaN(val)) tempCode.push(val); + } + + // Mivel lehet, hogy a fájlban több sor van (a régi hibás mentések miatt), + // csak az utolsó 6 számot vesszük figyelembe, ha több lenne. + if (tempCode.length >= 6) { + // Az utolsó 6 elemet töltjük be + var startIdx = tempCode.length - 6; + code = tempCode.slice(startIdx, startIdx + 6); + statusMsg = "Loaded!"; + loaded = true; + } else { + statusMsg = "Bad Len"; + } + } catch (e) { + statusMsg = "Parse Err"; + } + + if (!loaded && statusMsg === "") statusMsg = "Bad Data"; + + } else { + if (statusMsg === "") statusMsg = "No File"; + } + + msgTimer = 30; + showMenu = false; + } + else if (menuCursor === 2) { + break; // Exit + } + } + + } else { + // *** SZERKESZTŐ *** + if (keyboard.getPrevPress(true)) { + showMenu = true; + menuCursor = 0; + } + if (keyboard.getSelPress(true)) { + cursor++; + if (cursor > 5) cursor = 0; + } + if (keyboard.getNextPress(true)) { + code[cursor]++; + if (code[cursor] > maxDepth) code[cursor] = 1; + } + } + + // --- RAJZOLÁS --- + sprite.fill(bg_color); + sprite.setTextColor(fg_color, bg_color); + + sprite.setTextSize(2); + sprite.drawText("Key Copier", 5, 2); + + var availableWidth = dw - 20; + var pinSpacing = Math.floor(availableWidth / 6); + var startX = 10; + + sprite.setTextSize(2); + for(var i=0; i<6; i++) { + var pinCenterX = startX + (i * pinSpacing) + (pinSpacing/2); + var textStr = code[i].toString(); + + if (i === cursor && !showMenu) { + textStr = "[" + textStr + "]"; + sprite.drawText(textStr, pinCenterX - 14, numY); + } else { + sprite.drawText(textStr, pinCenterX - 5, numY); + } + } + + var keyEnd = dw - 5; + sprite.drawLine(0, keySpineY, keyEnd, keySpineY, fg_color); + sprite.drawLine(0, keySpineY, 0, TOP_Y, fg_color); + sprite.drawLine(keyEnd, keySpineY, keyEnd, TOP_Y + 10, fg_color); + + for(var j=0; j<6; j++) { + var cx = startX + (j * pinSpacing) + (pinSpacing/2); + var currentDepthPx = (code[j] - 1) * DEPTH_STEP; + var bottomY = TOP_Y + currentDepthPx; + + sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, cx + PIN_HALF_WIDTH, bottomY, fg_color); + + var prevDepthPx = 0; + if (j > 0) prevDepthPx = (code[j-1] - 1) * DEPTH_STEP; + var myLeftWidth = PIN_HALF_WIDTH + (currentDepthPx * TANGENT); + var prevRightWidth = PIN_HALF_WIDTH + (prevDepthPx * TANGENT); + var distToPrev = (j === 0) ? 999 : pinSpacing; + + if (j === 0) { + var slopeEndX = cx - myLeftWidth; + if (slopeEndX < 0) slopeEndX = 0; + sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, slopeEndX, TOP_Y, fg_color); + if (slopeEndX > 0) sprite.drawLine(0, TOP_Y, slopeEndX, TOP_Y, fg_color); + } else { + if ((myLeftWidth + prevRightWidth) > distToPrev) { + var ratio = currentDepthPx / (currentDepthPx + prevDepthPx); + if (currentDepthPx + prevDepthPx === 0) ratio = 0.5; + var peakDistX = ratio * distToPrev; + var peakX = cx - peakDistX; + var rise = (peakDistX - PIN_HALF_WIDTH) / TANGENT; + var peakY = bottomY - rise; + sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, peakX, peakY, fg_color); + } else { + var slopeTopX = cx - myLeftWidth; + sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, slopeTopX, TOP_Y, fg_color); + var prevCx = cx - pinSpacing; + var prevSlopeTopX = prevCx + prevRightWidth; + sprite.drawLine(prevSlopeTopX, TOP_Y, slopeTopX, TOP_Y, fg_color); + } + } + + var nextDepthPx = 0; + if (j < 5) nextDepthPx = (code[j+1] - 1) * DEPTH_STEP; + var myRightWidth = PIN_HALF_WIDTH + (currentDepthPx * TANGENT); + var nextLeftWidth = PIN_HALF_WIDTH + (nextDepthPx * TANGENT); + var distToNext = (j === 5) ? 999 : pinSpacing; + + if (j === 5) { + var slopeEndX = cx + myRightWidth; + sprite.drawLine(cx + PIN_HALF_WIDTH, bottomY, slopeEndX, TOP_Y, fg_color); + sprite.drawLine(slopeEndX, TOP_Y, keyEnd, TOP_Y, fg_color); + } else { + if ((myRightWidth + nextLeftWidth) > distToNext) { + var ratio = currentDepthPx / (currentDepthPx + nextDepthPx); + if (currentDepthPx + nextDepthPx === 0) ratio = 0.5; + var peakDistX = ratio * distToNext; + var myPeakDistX = distToNext - peakDistX; + var peakX = cx + myPeakDistX; + var rise = (myPeakDistX - PIN_HALF_WIDTH) / TANGENT; + var peakY = bottomY - rise; + sprite.drawLine(cx + PIN_HALF_WIDTH, bottomY, peakX, peakY, fg_color); + } else { + var slopeTopX = cx + myRightWidth; + sprite.drawLine(cx + PIN_HALF_WIDTH, bottomY, slopeTopX, TOP_Y, fg_color); + } + } + } + + // --- Menü --- + if (showMenu) { + var menuW = 80; + var menuH = 55; + var menuX = (dw - menuW) / 2; + var menuY = (dh - menuH) / 2; + + sprite.drawFillRect(menuX, menuY, menuW, menuH, fg_color); + + sprite.drawLine(menuX, menuY, menuX + menuW, menuY, bg_color); + sprite.drawLine(menuX, menuY + menuH, menuX + menuW, menuY + menuH, bg_color); + sprite.drawLine(menuX, menuY, menuX, menuY + menuH, bg_color); + sprite.drawLine(menuX + menuW, menuY, menuX + menuW, menuY + menuH, bg_color); + + sprite.setTextSize(1); + sprite.setTextColor(bg_color, fg_color); + + for (var m = 0; m < menuItems.length; m++) { + var itemY = menuY + 12 + (m * 12); + var itemText = menuItems[m]; + if (m === menuCursor) itemText = "> " + itemText + " <"; + sprite.drawText(itemText, menuX + 15, itemY); + } + } + + // --- Üzenet --- + if (statusMsg !== "") { + var msgH = 20; + sprite.drawFillRect(0, dh - msgH, dw, msgH, fg_color); + sprite.drawLine(0, dh - msgH, dw, dh - msgH, bg_color); + sprite.setTextColor(bg_color, fg_color); + sprite.setTextSize(1); + sprite.drawText(statusMsg, (dw/2) - (statusMsg.length*3), dh - 15); + } + else if (!showMenu) { + sprite.setTextSize(1); + sprite.drawText("Back: Menu | Next: Cut", 5, dh - 12); + } + + sprite.pushSprite(); + delay(50); + } + + keyboard.setLongPress(false); +} + +main(); From d0cf014a750d01d14a9982f991754ea2fc9d754f Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Tue, 9 Dec 2025 10:11:51 +0100 Subject: [PATCH 03/14] Create README for M5 stick KEY Copier tool Added README for M5 stick KEY Copier tool with usage details. --- examples/key copier/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 examples/key copier/README.md diff --git a/examples/key copier/README.md b/examples/key copier/README.md new file mode 100644 index 0000000..07730ad --- /dev/null +++ b/examples/key copier/README.md @@ -0,0 +1,10 @@ + + +# M5 stick KEY Copier tool +I wrote some code in Bruce JavaScript. The idea came from the code running on Flipper Zero! + +### The application allows you to copy and create keys using the screen! +You can save and restore the saved key! + +# important !!! +# The application is optimized for the M5 stick display! From 7cdc0e0df94df703ac22326d3f4e6059c1db202b Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Tue, 9 Dec 2025 10:14:23 +0100 Subject: [PATCH 04/14] Add resistor calculator functionality in resistor.js --- examples/resistor-calulator/resistor.js | 282 ++++++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 examples/resistor-calulator/resistor.js diff --git a/examples/resistor-calulator/resistor.js b/examples/resistor-calulator/resistor.js new file mode 100644 index 0000000..6b7fd1f --- /dev/null +++ b/examples/resistor-calulator/resistor.js @@ -0,0 +1,282 @@ +var display = require('display'); +var keyboard = require('keyboard'); +var storage = require('storage'); + +function main() { + + // --- KÉPERNYŐ --- + var dw = display.width(); + var dh = display.height(); + var sprite = display.createSprite(dw, dh); + + // --- SZÍNEK (R, G, B formátum 0-255) --- + var C_BLACK = display.color(0, 0, 0); + var C_BROWN = display.color(165, 42, 42); + var C_RED = display.color(255, 0, 0); + var C_ORANGE = display.color(255, 165, 0); + var C_YELLOW = display.color(255, 255, 0); + var C_GREEN = display.color(0, 255, 0); + var C_BLUE = display.color(0, 0, 255); + var C_VIOLET = display.color(255, 0, 255); + var C_GRAY = display.color(128, 128, 128); + var C_WHITE = display.color(255, 255, 255); + + var C_GOLD = display.color(255, 215, 0); + var C_SILVER = display.color(192, 192, 192); + + var C_BG = C_BLACK; + var C_TXT = C_WHITE; + + // Sáv színek (0-9) + var bandColors = [ + C_BLACK, C_BROWN, C_RED, C_ORANGE, C_YELLOW, + C_GREEN, C_BLUE, C_VIOLET, C_GRAY, C_WHITE + ]; + + var txtColors = [ + C_WHITE, C_WHITE, C_WHITE, C_BLACK, C_BLACK, + C_BLACK, C_WHITE, C_WHITE, C_WHITE, C_BLACK + ]; + + var multColors = bandColors.concat([C_GOLD, C_SILVER]); + + var multLabels = [ + "x1", "x10", "x100", "x1K", "x10K", + "x100K", "x1M", "x10M", "x100M", "x1G", + "x0.1", "x0.01" + ]; + + var tolColors = [C_BROWN, C_RED, C_GOLD, C_SILVER]; + var tolValues = ["1%", "2%", "5%", "10%"]; + + // --- Adatok --- + var band1 = 1; + var band2 = 0; + var mult = 2; + var tol = 2; + + var focus = 0; + var FILE_PATH = "/data/resistor.txt"; + + // Betöltés + try { + if (storage.exists(FILE_PATH)) { + var raw = storage.read(FILE_PATH); + if (raw) { + var parts = String(raw).trim().split(","); + if (parts.length === 4) { + band1 = parseInt(parts[0]); + band2 = parseInt(parts[1]); + mult = parseInt(parts[2]); + tol = parseInt(parts[3]); + } + } + } + } catch(e) {} + + keyboard.setLongPress(true); + + // --- FÜGGVÉNYEK --- + + function formatResistor(val) { + if (val < 1) return val.toFixed(2); + if (val < 10) return val.toFixed(1); + if (val >= 1000000000) return (val / 1000000000).toFixed(2) + "G"; + if (val >= 1000000) return (val / 1000000).toFixed(2) + "M"; + if (val >= 1000) return (val / 1000).toFixed(2) + "K"; + return val.toFixed(0); + } + + function calculate() { + var base = (band1 * 10) + band2; + var factor = 1; + if (mult < 10) factor = Math.pow(10, mult); + else if (mult === 10) factor = 0.1; + else if (mult === 11) factor = 0.01; + return base * factor; + } + + function saveState() { + try { + var data = band1 + "," + band2 + "," + mult + "," + tol; + storage.write(FILE_PATH, data, "write"); + } catch(e) {} + } + + while (true) { + + // --- GOMBKEZELÉS --- + var btnEsc = keyboard.getPrevPress(true); + var btnNext = keyboard.getNextPress(true); + var btnSel = keyboard.getSelPress(true); + + if (btnEsc && btnNext) { + return; + } + + if (btnEsc && !btnNext) { + focus++; + if (focus > 3) focus = 0; + } + + if (btnSel || (btnNext && !btnEsc)) { + if (focus === 0) { + band1++; if (band1 > 9) band1 = 0; + } + else if (focus === 1) { + band2++; if (band2 > 9) band2 = 0; + } + else if (focus === 2) { + mult++; if (mult > 11) mult = 0; + } + else if (focus === 3) { + tol++; if (tol > 3) tol = 0; + } + saveState(); + } + + // --- RAJZOLÁS --- + sprite.fill(C_BG); + sprite.setTextSize(1); + + // ========================================== + // 1. BAL OLDALI OSZLOPOK (Mindig látszik a keret) + // ========================================== + var colH = 13; + var startY = 3; + var col1X = 2; + var col2X = 24; + var colW = 20; + + for (var i = 0; i <= 9; i++) { + var y = startY + (i * colH); + var c = bandColors[i]; + var numCol = txtColors[i]; + + // -- 1. OSZLOP -- + if (band1 === i) { + // Ha ez az oszlop aktív, akkor FEHÉR, ha nem, akkor SZÜRKE a keret + var boxColor = (focus === 0) ? C_WHITE : C_GRAY; + sprite.drawRect(col1X - 2, y, colW + 4, colH, boxColor); + } + + sprite.drawFillRect(col1X, y + 1, colW, colH - 2, c); + sprite.setTextColor(numCol, c); + sprite.drawText(i.toString(), col1X + 7, y + 2); + + // -- 2. OSZLOP -- + if (band2 === i) { + var boxColor = (focus === 1) ? C_WHITE : C_GRAY; + sprite.drawRect(col2X - 2, y, colW + 4, colH, boxColor); + } + + sprite.drawFillRect(col2X, y + 1, colW, colH - 2, c); + sprite.setTextColor(numCol, c); + sprite.drawText(i.toString(), col2X + 7, y + 2); + } + + // ========================================== + // 2. SZORZÓ OSZLOP (Mindig látszik a keret) + // ========================================== + var multBoxX = 225; + var multTxtRightX = 222; + var multH = 11; + + for (var m = 0; m <= 11; m++) { + var my = startY + (m * multH); + var mc = multColors[m]; + var txt = multLabels[m]; + + // Aktív az, amit éppen szerkesztünk (focus===2), de a keret mindig kirajzolódik + var isSelected = (mult === m); + var isFocused = (focus === 2); + + // Szöveg szín + // Ha épp ezen a soron vagyunk (fókusz), akkor PIROS, amúgy alap + var txtColor = (isSelected && isFocused) ? C_RED : C_TXT; + + sprite.setTextColor(txtColor, C_BG); + sprite.drawText(txt, multTxtRightX - (txt.length * 6), my + 1); + + if (isSelected) { + var boxColor = isFocused ? C_WHITE : C_GRAY; + sprite.drawRect(multBoxX - 1, my, 14, multH, boxColor); + } + + sprite.drawFillRect(multBoxX, my + 1, 12, multH - 2, mc); + } + + // ========================================== + // 3. ELLENÁLLÁS TEST + // ========================================== + var centerX = 135; + var resY = 40; + var bodyColor = display.color(222, 184, 135); + + sprite.drawLine(centerX - 55, resY + 10, centerX + 55, resY + 10, C_SILVER); + sprite.drawFillRect(centerX - 40, resY, 80, 20, bodyColor); + + sprite.drawFillRect(centerX - 30, resY, 10, 20, bandColors[band1]); + sprite.drawFillRect(centerX - 10, resY, 10, 20, bandColors[band2]); + sprite.drawFillRect(centerX + 10, resY, 10, 20, multColors[mult]); + sprite.drawFillRect(centerX + 30, resY, 10, 20, tolColors[tol]); + + // ========================================== + // 4. EREDMÉNY DOBOZ + // ========================================== + var ohmVal = calculate(); + var valStr = formatResistor(ohmVal); + + var boxX = 61; + var boxW = 130; + var boxCenterX = boxX + (boxW / 2); + + sprite.drawFillRect(boxX, 75, boxW, 30, C_BLUE); + sprite.setTextSize(2); + sprite.setTextColor(C_WHITE, C_BLUE); + + var valTxtW = valStr.length * 12; + sprite.drawText(valStr, boxCenterX - (valTxtW/2) - 10, 83); + sprite.setTextSize(1); + sprite.drawText("ohm", boxCenterX + (valTxtW/2), 90); + + // ========================================== + // 5. TOLERANCIA (Mindig látszik a keret) + // ========================================== + var tolY = 118; + + var tolItemW = 19; + var tolStart = 85; + var tolH = 15; + var tolSelH = 19; + + for (var t = 0; t < 4; t++) { + var tx = tolStart + (t * (tolItemW + 5)); + var tc = tolColors[t]; + var tVal = tolValues[t]; + + // Keret kirajzolása, ha ez a kiválasztott érték + if (tol === t) { + var boxColor = (focus === 3) ? C_WHITE : C_GRAY; + sprite.drawRect(tx - 2, tolY - 2, tolItemW + 4, tolSelH, boxColor); + } + + sprite.drawFillRect(tx, tolY, tolItemW, tolH, tc); + + var tTxtCol = C_WHITE; + if (t === 2 || t === 3) tTxtCol = C_BLACK; + + sprite.setTextColor(tTxtCol, tc); + sprite.drawText(tVal, tx + 1, tolY + 3); + } + + // Fejléc + sprite.setTextColor(C_WHITE, C_BG); + sprite.drawText("R-Calc", centerX - 20, 5); + + sprite.pushSprite(); + try { delay(50); } catch(e) {} + } +} + +main(); From dedc166ab131533d3294e11117c4f696869dddea Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Wed, 10 Dec 2025 07:52:43 +0100 Subject: [PATCH 05/14] Update keycopier.js --- examples/key copier/keycopier.js | 299 ++++++++++++++++++++++--------- 1 file changed, 212 insertions(+), 87 deletions(-) diff --git a/examples/key copier/keycopier.js b/examples/key copier/keycopier.js index ef16227..4bba7b7 100644 --- a/examples/key copier/keycopier.js +++ b/examples/key copier/keycopier.js @@ -2,6 +2,107 @@ var display = require('display'); var keyboard = require('keyboard'); var storage = require('storage'); +// --- OpenSCAD KÓD GENERÁLÓ FÜGGVÉNY (KWIKSET KW1 5-PIN IMPERIAL) --- +function generateSCADScript(keyCodes) { + + var PIN_COUNT = 5; + var shoulder = 0.247; + var pin_spacing = 0.150; + var depth_inc = 0.023; + + var convertedBits = []; + for (var i = 0; i < PIN_COUNT; i++) { + var bitValue = Math.max(0, keyCodes[i] - 1); + convertedBits.push(bitValue); + } + + var SCAD = ""; + + SCAD += "// Generated for 3D Printing by KeyCopier\n"; + SCAD += "// Key code: kw1(" + JSON.stringify(convertedBits) + ")\n"; + SCAD += "// NOTE: Using Kwikset KW1 5-PIN IMPERIAL standards.\n"; + SCAD += "\n"; + + SCAD += "function mm(i) = i*25.4;\n"; + + // A modulok definíciója + SCAD += "module rounded(size, r) {\n"; + SCAD += " union() {\n"; + SCAD += " translate([r, 0, 0]) cube([size[0]-2*r, size[1], size[2]]);\n"; + SCAD += " translate([0, r, 0]) cube([size[0], size[1]-2*r, size[2]]);\n"; + SCAD += " translate([r, r, 0]) cylinder(h=size[2], r=r);\n"; + SCAD += " translate([size[0]-r, r, 0]) cylinder(h=size[2], r=r);\n"; + SCAD += " translate([r, size[1]-r, 0]) cylinder(h=size[2], r=r);\n"; + SCAD += " translate([size[0]-r, size[1]-r, 0]) cylinder(h=size[2], r=r);\n"; + SCAD += " }\n"; + SCAD += "}\n"; + + SCAD += "module bit() {\n"; + SCAD += " w = mm(1/4);\n"; + SCAD += " difference() {\n"; + SCAD += " translate([-w/2, 0, 0]) cube([w, mm(1), w]);\n"; + SCAD += " translate([-mm(5/128), 0, 0]) rotate([0, 0, 135]) cube([w, w, w]);\n"; + SCAD += " translate([mm(5/128), 0, 0]) rotate([0, 0, -45]) cube([w, w, w]);\n"; + SCAD += " }\n"; + SCAD += "}\n"; + + SCAD += "module kw1(bits) {\n"; + SCAD += " thickness = mm(0.080);\n"; + SCAD += " length = mm(1.500);\n"; + SCAD += " width = mm(.337);\n"; + SCAD += " shoulder = mm(" + shoulder.toFixed(3) + ");\n"; + SCAD += " pin_spacing = mm(" + pin_spacing.toFixed(3) + ");\n"; + SCAD += " depth_inc = mm(" + depth_inc.toFixed(3) + ");\n"; + SCAD += " fudge = 0.5;\n"; + SCAD += " h_l = mm(1); h_w = mm(1); h_d = mm(1/16);\n"; + + SCAD += " difference() {\n"; + SCAD += " // blade and key handle\n"; + SCAD += " union() {\n"; + SCAD += " translate([-h_l, -h_w/2 + width/2, 0]) rounded([h_l, h_w, thickness], mm(1/4));\n"; + SCAD += " // cut a little off the tip to avoid going too long\n"; + SCAD += " cube([length - mm(1/64), width, thickness]);\n"; + SCAD += " }\n"; + SCAD += " \n"; + SCAD += " // chamfer the tip\n"; + SCAD += " translate([length, mm(1/8), 0]) {\n"; + SCAD += " rotate([0, 0, 45]) cube([10, 10, thickness]);\n"; + SCAD += " rotate([0, 0, 225]) cube([10, 10, thickness]);\n"; + SCAD += " }\n"; + SCAD += " \n"; + SCAD += " // put in a hole for keychain use\n"; + SCAD += " translate([-h_l + mm(3/16), width/2, 0]) cylinder(h=thickness, r=mm(1/8));\n"; + SCAD += " \n"; + SCAD += " // cut the channels in the key. designed more for printability than accuracy\n"; + SCAD += " union() {\n"; + SCAD += " translate([-h_d, mm(.105), mm(.025)]) rotate([225, 0, 0]) cube([length + h_d, width, width]);\n"; + SCAD += " translate([-h_d, mm(.105), mm(.05)]) rotate([260, 0, 0]) cube([length + h_d, thickness/2, mm(1/32)]);\n"; + SCAD += " translate([-h_d, mm(.105), 0]) cube([length + h_d, mm(7/128), mm(.05)]);\n"; + SCAD += " translate([-h_d, mm(.105) + mm(7/128), mm(.05)]) rotate([225, 0, 0]) cube([length + h_d, mm(3/64), thickness]);\n"; + SCAD += " }\n"; + SCAD += " \n"; + SCAD += " translate([-h_d, width - mm(9/64), mm(.043)]) {\n"; + SCAD += " cube([length + h_d, width - (width - mm(10/64)), thickness]);\n"; + SCAD += " rotate([50, 0, 0]) cube([length + h_d, width, thickness]);\n"; + SCAD += " }\n"; + SCAD += " \n"; + SCAD += " union() {\n"; + SCAD += " translate([-h_d, mm(0.015), mm(.03)]) cube([length + h_d, mm(15/256), thickness]);\n"; + SCAD += " translate([-h_d, mm(0.015) + mm(13/256), thickness - mm(1/64)]) rotate([45, 0, 0]) cube([length + h_d, mm(1/16), mm(1/16)]);\n"; + SCAD += " }\n"; + SCAD += " \n"; + SCAD += " // Do the actual bitting\n"; + SCAD += " for (b = [0:4]) {\n"; + SCAD += " translate([shoulder + fudge + b*pin_spacing, width - mm(.008) - bits[b]*depth_inc - fudge, 0]) bit();\n"; + SCAD += " }\n"; + SCAD += " }\n"; + SCAD += "}\n"; + + SCAD += "kw1(" + JSON.stringify(convertedBits) + ");\n"; + + return SCAD; +} +// --- FŐ PROGRAM --- function main() { // --- Képernyő --- @@ -11,15 +112,16 @@ function main() { // --- Színek --- var bg_color = display.color(255, 130, 0); - var fg_color = display.color(0, 0, 0); + var fg_color = display.color(0, 0, 0); // --- Adatok --- var cursor = 0; - var code = [1, 1, 1, 1, 1, 1]; + var code = [1, 1, 1, 1, 1, 1]; // 6 hely, de csak 5-öt használunk var maxDepth = 7; // --- MENTÉS HELYE --- - var FILE_PATH = "/KeyCopier/key_copier.code"; + var CODE_FILE_PATH = "/KeyCopier/key_copier.code"; + var SCAD_FILE_PATH = "/KeyCopier/key_model.scad"; var showMenu = false; var menuCursor = 0; @@ -30,13 +132,32 @@ function main() { keyboard.setLongPress(true); - // --- GRAFIKA --- + // --- GRAFIKAI PARAMÉTEREK (5 PIN VIZUALIZÁCIÓ) --- + // Skálázáshoz használt valós értékek (mm) + var PIN_COUNT_REAL = 6; + var DEPTH_INC_REAL = 0.58; + var PIN_SPACING_REAL = 3.81; + var FIRST_PIN_START_X = 6.27; + + // Teljes hossz számítása a skálázáshoz + var VISUAL_TOTAL_REAL_MM = FIRST_PIN_START_X + (PIN_COUNT_REAL - 1) * PIN_SPACING_REAL + PIN_SPACING_REAL; + var TANGENT = 0.84; var PIN_HALF_WIDTH = 3; - var DEPTH_STEP = 4; + var VISUAL_SCALE_FACTOR = 8; + var DEPTH_STEP = Math.round(DEPTH_INC_REAL * VISUAL_SCALE_FACTOR); + + var TOP_Y = 55; + var keySpineY = TOP_Y + 77; // Vastagság: 77 pixel var numY = 25; - var TOP_Y = 55; - var keySpineY = 95; + var availableWidth = dw - 20; + var scaleRatio = availableWidth / VISUAL_TOTAL_REAL_MM; + + // A Tip rajzolásához szükséges fix pozíciók + var X_GERINC_END_PX = 220; + var X_TIP_END_PX = 240; + var Y_TIP_OFFSET = 35; + var tipStartY = keySpineY - Y_TIP_OFFSET; while (true) { @@ -46,9 +167,7 @@ function main() { // --- BEMENET --- if (showMenu) { - // *** MENÜ *** if (keyboard.getPrevPress(true)) showMenu = false; - if (keyboard.getNextPress(true)) { menuCursor++; if (menuCursor >= menuItems.length) menuCursor = 0; @@ -56,94 +175,67 @@ function main() { if (keyboard.getSelPress(true)) { if (menuCursor === 0) { - // ********************************** - // *** SAVE (FELÜLÍRÁS "write" MÓDDAL) *** - // ********************************** + // *** SAVE *** try { - // CSV formátum - var csvData = code.join(","); + var csvData = code.slice(0, 5).join(","); + var csvSuccess = storage.write(CODE_FILE_PATH, csvData, "write"); - // JAVÍTÁS: Itt adjuk át a "write" paramétert! - // Ez biztosítja, hogy felülírja a fájlt, ne hozzáfűzzön. - var success = storage.write(FILE_PATH, csvData, "write"); + var scadData = generateSCADScript(code); + var scadSuccess = storage.write(SCAD_FILE_PATH, scadData, "write"); - if (success) statusMsg = "Saved!"; - else statusMsg = "Write: False"; - - } catch (e) { - statusMsg = "Sys Err"; - } + if (csvSuccess && scadSuccess) statusMsg = "Saved & SCAD!"; + else statusMsg = "Save Error"; + } catch (e) { statusMsg = "Sys Err"; } msgTimer = 30; showMenu = false; } else if (menuCursor === 1) { - // ********************************** - // *** LOAD (BETÖLTÉS) *** - // ********************************** + // *** LOAD (JAVÍTVA) *** var raw = undefined; var loaded = false; - - try { - // Közvetlen olvasás - raw = storage.read(FILE_PATH); - } catch (e) { - statusMsg = "IO Err"; - } - + try { raw = storage.read(CODE_FILE_PATH); } catch (e) { statusMsg = "IO Err"; } + if (raw !== undefined && raw !== null) { try { var str = String(raw).trim(); - // Ha esetleg maradtak benne sortörések, csak az első sort vesszük - // Ez extra védelem, ha régebben appendelt fájlt olvasunk be var lines = str.split("\n"); - if (lines.length > 0) str = lines[lines.length-1]; // Az utolsó sort vesszük (a legfrissebbet) - + if (lines.length > 0) str = lines[lines.length-1]; var parts = str.split(","); - var tempCode = []; for (var k = 0; k < parts.length; k++) { var val = parseInt(parts[k].trim()); if (!isNaN(val)) tempCode.push(val); } - - // Mivel lehet, hogy a fájlban több sor van (a régi hibás mentések miatt), - // csak az utolsó 6 számot vesszük figyelembe, ha több lenne. - if (tempCode.length >= 6) { - // Az utolsó 6 elemet töltjük be - var startIdx = tempCode.length - 6; - code = tempCode.slice(startIdx, startIdx + 6); + + // JAVÍTÁS: For ciklus használata spread operátor helyett + if (tempCode.length >= 5) { + var startIdx = tempCode.length - 5; + for (var i = 0; i < 5; i++) { + code[i] = tempCode[startIdx + i]; + } statusMsg = "Loaded!"; loaded = true; - } else { - statusMsg = "Bad Len"; - } - } catch (e) { - statusMsg = "Parse Err"; - } + } else { statusMsg = "Bad Len"; } + } catch (e) { statusMsg = "Parse Err"; } if (!loaded && statusMsg === "") statusMsg = "Bad Data"; - - } else { - if (statusMsg === "") statusMsg = "No File"; - } + } else { if (statusMsg === "") statusMsg = "No File"; } msgTimer = 30; showMenu = false; } - else if (menuCursor === 2) { - break; // Exit - } + else if (menuCursor === 2) { break; } } } else { - // *** SZERKESZTŐ *** + // *** SZERKESZTŐ (5 PIN) *** if (keyboard.getPrevPress(true)) { showMenu = true; menuCursor = 0; } if (keyboard.getSelPress(true)) { cursor++; - if (cursor > 5) cursor = 0; + if (cursor > 4) cursor = 0; // Csak 5 pin (0-4) } if (keyboard.getNextPress(true)) { code[cursor]++; @@ -158,13 +250,12 @@ function main() { sprite.setTextSize(2); sprite.drawText("Key Copier", 5, 2); - var availableWidth = dw - 20; - var pinSpacing = Math.floor(availableWidth / 6); - var startX = 10; - + // Számértékek (5 db) sprite.setTextSize(2); - for(var i=0; i<6; i++) { - var pinCenterX = startX + (i * pinSpacing) + (pinSpacing/2); + for(var i=0; i<5; i++) { + var pinRealX = FIRST_PIN_START_X + (i * PIN_SPACING_REAL); + var pinCenterX = 10 + Math.round(pinRealX * scaleRatio); + var textStr = code[i].toString(); if (i === cursor && !showMenu) { @@ -175,66 +266,101 @@ function main() { } } - var keyEnd = dw - 5; - sprite.drawLine(0, keySpineY, keyEnd, keySpineY, fg_color); - sprite.drawLine(0, keySpineY, 0, TOP_Y, fg_color); - sprite.drawLine(keyEnd, keySpineY, keyEnd, TOP_Y + 10, fg_color); + // --- KERET RAJZOLÁSA --- + + // 1. Vízszintes alsó gerinc 220 px-ig + sprite.drawLine(0, keySpineY, X_GERINC_END_PX, keySpineY, fg_color); + // 2. Függőleges nyak + sprite.drawLine(0, keySpineY, 0, TOP_Y, fg_color); + + // 3. FERDE KULCS VÉG (TIP) - Jobbra, felfelé + sprite.drawLine(X_GERINC_END_PX, keySpineY, X_TIP_END_PX, tipStartY, fg_color); + + // 4. A kulcs tetejének lezárása a Tip felett + sprite.drawLine(X_GERINC_END_PX, TOP_Y, X_TIP_END_PX, TOP_Y, fg_color); - for(var j=0; j<6; j++) { - var cx = startX + (j * pinSpacing) + (pinSpacing/2); + // --- KULCS PROFIL (5 PIN) --- + var startDrawX = 10; // X eltolás a rajzoláshoz + + for(var j=0; j<5; j++) { + var pinRealX = FIRST_PIN_START_X + (j * PIN_SPACING_REAL); + var cx = startDrawX + Math.round(pinRealX * scaleRatio); + var currentDepthPx = (code[j] - 1) * DEPTH_STEP; var bottomY = TOP_Y + currentDepthPx; + // Pin alja sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, cx + PIN_HALF_WIDTH, bottomY, fg_color); + // Bal oldali kapcsolat (Előző pinhez vagy elejéhez) var prevDepthPx = 0; - if (j > 0) prevDepthPx = (code[j-1] - 1) * DEPTH_STEP; + var prevCx = 0; + if (j > 0) { + prevDepthPx = (code[j-1] - 1) * DEPTH_STEP; + var prevPinRealX = FIRST_PIN_START_X + (j-1) * PIN_SPACING_REAL; + prevCx = startDrawX + Math.round(prevPinRealX * scaleRatio); + } + var myLeftWidth = PIN_HALF_WIDTH + (currentDepthPx * TANGENT); var prevRightWidth = PIN_HALF_WIDTH + (prevDepthPx * TANGENT); - var distToPrev = (j === 0) ? 999 : pinSpacing; + var distToPrev = (j === 0) ? 999 : (cx - prevCx); if (j === 0) { + // Első pin eleje var slopeEndX = cx - myLeftWidth; if (slopeEndX < 0) slopeEndX = 0; sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, slopeEndX, TOP_Y, fg_color); if (slopeEndX > 0) sprite.drawLine(0, TOP_Y, slopeEndX, TOP_Y, fg_color); } else { + // Csatlakozás az előző pinhez if ((myLeftWidth + prevRightWidth) > distToPrev) { var ratio = currentDepthPx / (currentDepthPx + prevDepthPx); if (currentDepthPx + prevDepthPx === 0) ratio = 0.5; var peakDistX = ratio * distToPrev; var peakX = cx - peakDistX; - var rise = (peakDistX - PIN_HALF_WIDTH) / TANGENT; - var peakY = bottomY - rise; + var peakY = bottomY - ((peakDistX - PIN_HALF_WIDTH) / TANGENT); sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, peakX, peakY, fg_color); } else { var slopeTopX = cx - myLeftWidth; sprite.drawLine(cx - PIN_HALF_WIDTH, bottomY, slopeTopX, TOP_Y, fg_color); - var prevCx = cx - pinSpacing; var prevSlopeTopX = prevCx + prevRightWidth; sprite.drawLine(prevSlopeTopX, TOP_Y, slopeTopX, TOP_Y, fg_color); } } - var nextDepthPx = 0; - if (j < 5) nextDepthPx = (code[j+1] - 1) * DEPTH_STEP; + // Jobb oldali kapcsolat (Következő pinhez VAGY Tiphez) var myRightWidth = PIN_HALF_WIDTH + (currentDepthPx * TANGENT); - var nextLeftWidth = PIN_HALF_WIDTH + (nextDepthPx * TANGENT); - var distToNext = (j === 5) ? 999 : pinSpacing; - if (j === 5) { + if (j === 4) { + // ** UTOLSÓ PIN (5.) LEZÁRÁSA ** + // Ez volt a vizuális hiba forrása. Most fixen a gerinc végéig húzzuk. var slopeEndX = cx + myRightWidth; + + // Felfelé húzzuk a vonalat a kulcs tetejéig (TOP_Y) sprite.drawLine(cx + PIN_HALF_WIDTH, bottomY, slopeEndX, TOP_Y, fg_color); - sprite.drawLine(slopeEndX, TOP_Y, keyEnd, TOP_Y, fg_color); + + // Onnan pedig vízszintesen a Tip kezdetéig (X_GERINC_END_PX) + // (Ha a slopeEndX túlmegy, akkor nem rajzolunk visszafelé) + if (slopeEndX < X_GERINC_END_PX) { + sprite.drawLine(slopeEndX, TOP_Y, X_GERINC_END_PX, TOP_Y, fg_color); + } + } else { + // Normál köztes pin kapcsolat (j < 4) + var nextDepthPx = (code[j+1] - 1) * DEPTH_STEP; + var nextPinRealX = FIRST_PIN_START_X + (j+1) * PIN_SPACING_REAL; + var nextCx = startDrawX + Math.round(nextPinRealX * scaleRatio); + + var nextLeftWidth = PIN_HALF_WIDTH + (nextDepthPx * TANGENT); + var distToNext = nextCx - cx; + if ((myRightWidth + nextLeftWidth) > distToNext) { var ratio = currentDepthPx / (currentDepthPx + nextDepthPx); if (currentDepthPx + nextDepthPx === 0) ratio = 0.5; var peakDistX = ratio * distToNext; var myPeakDistX = distToNext - peakDistX; var peakX = cx + myPeakDistX; - var rise = (myPeakDistX - PIN_HALF_WIDTH) / TANGENT; - var peakY = bottomY - rise; + var peakY = bottomY - ((myPeakDistX - PIN_HALF_WIDTH) / TANGENT); sprite.drawLine(cx + PIN_HALF_WIDTH, bottomY, peakX, peakY, fg_color); } else { var slopeTopX = cx + myRightWidth; @@ -251,7 +377,6 @@ function main() { var menuY = (dh - menuH) / 2; sprite.drawFillRect(menuX, menuY, menuW, menuH, fg_color); - sprite.drawLine(menuX, menuY, menuX + menuW, menuY, bg_color); sprite.drawLine(menuX, menuY + menuH, menuX + menuW, menuY + menuH, bg_color); sprite.drawLine(menuX, menuY, menuX, menuY + menuH, bg_color); From 7942782d9cd4d16d5394951e1b3e4d2855cb5b0c Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Wed, 10 Dec 2025 10:07:52 +0100 Subject: [PATCH 06/14] Add key copier SCAD maker functionality This file implements a key copying application in JavaScript, including a database of key specifications and a SCAD generation function for creating key models. --- .../key copier SCAD maker/keycopier_scad.js | 313 ++++++++++++++++++ 1 file changed, 313 insertions(+) create mode 100644 examples/key copier SCAD maker/keycopier_scad.js diff --git a/examples/key copier SCAD maker/keycopier_scad.js b/examples/key copier SCAD maker/keycopier_scad.js new file mode 100644 index 0000000..da5ed84 --- /dev/null +++ b/examples/key copier SCAD maker/keycopier_scad.js @@ -0,0 +1,313 @@ +var display = require('display'); +var keyboard = require('keyboard'); +var storage = require('storage'); + +// ========================================== +// 1. TELJES KULCS ADATBÁZIS +// ========================================== +var KEY_DB = [ + { manufacturer: "Kwikset", format_name: "KW1", first_pin_inch: 0.247, last_pin_inch: 0.847, pin_increment_inch: 0.15, pin_num: 5, pin_width_inch: 0.084, elbow_inch: 0.15, drill_angle: 90, uncut_depth_inch: 0.329, deepest_depth_inch: 0.191, depth_step_inch: 0.023, min_depth_ind: 1, max_depth_ind: 7 }, + { manufacturer: "Schlage", format_name: "SC4", first_pin_inch: 0.231, last_pin_inch: 1.012, pin_increment_inch: 0.1562, pin_num: 6, pin_width_inch: 0.031, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.335, deepest_depth_inch: 0.2, depth_step_inch: 0.015, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "Arrow", format_name: "AR4", first_pin_inch: 0.265, last_pin_inch: 1.040, pin_increment_inch: 0.155, pin_num: 6, pin_width_inch: 0.060, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.312, deepest_depth_inch: 0.186, depth_step_inch: 0.014, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "Master Lock", format_name: "M1", first_pin_inch: 0.185, last_pin_inch: 0.689, pin_increment_inch: 0.126, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.276, deepest_depth_inch: 0.171, depth_step_inch: 0.015, min_depth_ind: 0, max_depth_ind: 7 }, + { manufacturer: "American", format_name: "AM7", first_pin_inch: 0.157, last_pin_inch: 0.781, pin_increment_inch: 0.125, pin_num: 6, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.283, deepest_depth_inch: 0.173, depth_step_inch: 0.016, min_depth_ind: 1, max_depth_ind: 8 }, + { manufacturer: "Yale", format_name: "Y2", first_pin_inch: 0.200, last_pin_inch: 1.025, pin_increment_inch: 0.165, pin_num: 6, pin_width_inch: 0.054, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.320, deepest_depth_inch: 0.149, depth_step_inch: 0.019, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "Yale", format_name: "Y11", first_pin_inch: 0.124, last_pin_inch: 0.502, pin_increment_inch: 0.095, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.246, deepest_depth_inch: 0.167, depth_step_inch: 0.020, min_depth_ind: 1, max_depth_ind: 5 }, + { manufacturer: "Sargent", format_name: "S22", first_pin_inch: 0.216, last_pin_inch: 0.996, pin_increment_inch: 0.156, pin_num: 6, pin_width_inch: 0.063, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.328, deepest_depth_inch: 0.148, depth_step_inch: 0.020, min_depth_ind: 1, max_depth_ind: 10 }, + { manufacturer: "National", format_name: "NA25", first_pin_inch: 0.250, last_pin_inch: 0.874, pin_increment_inch: 0.156, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.304, deepest_depth_inch: 0.191, depth_step_inch: 0.012, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "Corbin", format_name: "CO88", first_pin_inch: 0.250, last_pin_inch: 1.030, pin_increment_inch: 0.156, pin_num: 6, pin_width_inch: 0.047, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.343, deepest_depth_inch: 0.217, depth_step_inch: 0.014, min_depth_ind: 1, max_depth_ind: 10 }, + { manufacturer: "Lockwood", format_name: "LW4", first_pin_inch: 0.245, last_pin_inch: 0.870, pin_increment_inch: 0.1562, pin_num: 5, pin_width_inch: 0.031, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.344, deepest_depth_inch: 0.203, depth_step_inch: 0.014, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "Lockwood", format_name: "LW5", first_pin_inch: 0.245, last_pin_inch: 1.0262, pin_increment_inch: 0.1562, pin_num: 6, pin_width_inch: 0.031, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.344, deepest_depth_inch: 0.203, depth_step_inch: 0.014, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "National", format_name: "NA12", first_pin_inch: 0.150, last_pin_inch: 0.710, pin_increment_inch: 0.140, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.270, deepest_depth_inch: 0.157, depth_step_inch: 0.013, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "Russwin", format_name: "RU45", first_pin_inch: 0.250, last_pin_inch: 1.030, pin_increment_inch: 0.156, pin_num: 6, pin_width_inch: 0.053, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.343, deepest_depth_inch: 0.203, depth_step_inch: 0.028, min_depth_ind: 1, max_depth_ind: 6 }, + { manufacturer: "Weiser", format_name: "WR3", first_pin_inch: 0.237, last_pin_inch: 0.861, pin_increment_inch: 0.156, pin_num: 5, pin_width_inch: 0.090, elbow_inch: 0.150, drill_angle: 90, uncut_depth_inch: 0.315, deepest_depth_inch: 0.153, depth_step_inch: 0.018, min_depth_ind: 0, max_depth_ind: 10 } +]; + +// ========================================== +// 2. SCAD GENERÁLÁS (Template alapú) +// ========================================== +function generateSCAD(keyCodes, format) { + var bits = []; + for(var i=0; i 0) msgTimer--; + if (msgTimer === 0) statusMsg = ""; + + var format = KEY_DB[currentKeyIdx]; + + // --- BEMENET KEZELÉS --- + if (mode === MODE_MENU) { + if (keyboard.getPrevPress(true)) mode = MODE_EDIT; + if (keyboard.getNextPress(true)) { + menuCursor++; + if (menuCursor >= menuItems.length) menuCursor = 0; + } + + if (keyboard.getSelPress(true)) { + if (menuCursor === 0) { // SAVE + try { + var saveArr = code.slice(0, format.pin_num); + saveArr.push(currentKeyIdx); + var csvData = saveArr.join(","); + storage.write(CODE_FILE, csvData, "write"); + var scadContent = generateSCAD(code, format); + storage.write(SCAD_FILE, scadContent, "write"); + statusMsg = "Saved!"; + } catch(e) { statusMsg = "Err"; } + msgTimer = 30; mode = MODE_EDIT; + } + else if (menuCursor === 1) { // LOAD + try { + var raw = storage.read(CODE_FILE); + if (raw) { + var str = String(raw).trim(); + var parts = str.split(","); + if (parts.length > 1) { + var savedIdx = parseInt(parts[parts.length-1]); + if (!isNaN(savedIdx) && savedIdx < KEY_DB.length) { + currentKeyIdx = savedIdx; + format = KEY_DB[currentKeyIdx]; + initCodeForFormat(currentKeyIdx); + parts.pop(); + } + } + for(var i=0; i= KEY_DB.length) currentKeyIdx = 0; + initCodeForFormat(currentKeyIdx); + statusMsg = "Type: " + KEY_DB[currentKeyIdx].format_name; + msgTimer = 30; + } + else if (menuCursor === 3) { break; } + } + } + else { + // *** EDIT *** + if (keyboard.getPrevPress(true)) { mode = MODE_MENU; menuCursor = 0; } + if (keyboard.getSelPress(true)) { + cursor++; + if (cursor >= format.pin_num) cursor = 0; + } + if (keyboard.getNextPress(true)) { + code[cursor]++; + if (code[cursor] > format.max_depth_ind) code[cursor] = format.min_depth_ind; + } + } + + // --- RAJZOLÁS --- + sprite.fill(bg_color); + sprite.setTextColor(fg_color, bg_color); + + sprite.setTextSize(1); + sprite.drawText(format.manufacturer + " " + format.format_name, 2, 2); + + // --- MARÁS SZIMULÁCIÓ (Pixel Sweep) --- + var shoulderX = 0; + var spineY = 100; + var maxDisplayWidth = dw; + var keyTotalLenInch = format.last_pin_inch + format.elbow_inch; + var ppi = maxDisplayWidth / (keyTotalLenInch + 0.1); + var bladeHeightPx = format.uncut_depth_inch * ppi; + var topY = spineY - bladeHeightPx; + + var keyEndPx = Math.round(keyTotalLenInch * ppi); + var tipStartX = Math.round(format.last_pin_inch * ppi); + + // Gerinc és Váll + sprite.drawLine(shoulderX, spineY, keyEndPx, spineY, fg_color); + sprite.drawLine(shoulderX, spineY, shoulderX, Math.round(topY), fg_color); + + // Előkészítjük a vágás profilját minden pixelre + // Ez a "Pixel Sweep" módszer, ami szimulálja a marást (boolean kivonás) + + var lastY = topY; // Kezdő magasság (váll) + + // Pixelről pixelre végigmegyünk a kulcs hosszán + for (var x = 0; x <= keyEndPx; x++) { + // Alapértelmezett magasság a nyers kulcs teteje + var maxY = topY; // Képernyőn a legmagasabb pont a legkisebb Y érték + + // Ellenőrizzük az összes marófej hatását erre a pixelre + for (var i = 0; i < format.pin_num; i++) { + // A marás középpontja pixelben + var pinCenterInch = format.first_pin_inch + (i * format.pin_increment_inch); + var pinCenterPx = pinCenterInch * ppi; + + // A marás mélysége (Y) pixelben + var depthInd = code[i] - format.min_depth_ind; + var cutDepthInch = depthInd * format.depth_step_inch; + var cutCenterY = topY + (cutDepthInch * ppi); + + // Milyen széles a vágás alja (lapos rész) + var halfFlatW = (format.pin_width_inch * ppi) / 2; + + // Távolság a marás közepétől + var dist = Math.abs(x - pinCenterPx); + + var thisY = topY; // Alap + + if (dist <= halfFlatW) { + // A lapos részen vagyunk + thisY = cutCenterY; + } else { + // A ferde részen vagyunk (V alak) + // 90 fokos fúró esetén a lejtés 1:1 (45 fok) + // Tehát ahogy távolodunk, úgy emelkedik az Y (csökken az értéke) + var rise = dist - halfFlatW; + thisY = cutCenterY - rise; + } + + // Mivel a képernyőn lefelé nő az Y, a "mélyebb" vágás nagyobb Y értéket jelent. + // A végső profil az a pont, ami a LEGMÉLYEBBEN van (legnagyobb Y), + // de nem mehet lejjebb, mint amit a legmélyebb vágás diktál ezen a ponton. + // A valóságban a marás KIVON anyagot. Tehát minél nagyobb az Y, annál több anyag hiányzik. + // A profil vonal az, ami megmarad. + // Tehát minden ponton a maximális Y értéket keressük, ami a marások uniója. + + if (thisY > maxY) maxY = thisY; + } + + // Tip (Hegy) kezelése: Az utolsó pin után lecsapjuk + if (x > tipStartX) { + // Egyenesen vágjuk le a végét vagy ferdén? Legyen ferde. + var distFromLast = x - tipStartX; + var tipCutY = topY + distFromLast; // 45 fokos letörés a végén + // De a tip emelkedik a gerinctől? A kérés szerint: + // "Tip (Hegy) - Felhúzás az utolsó vágásból" + // A fenti ciklus automatikusan kezeli a felhúzást, mert távolodunk az utolsó pintől. + // Csak korlátozni kell, hogy ne menjen vissza teljesen 'topY'-ra, ha a hegy lecsapott. + // Hagyjuk, hogy a marás logika kifusson. + } + + // Korlátozzuk, hogy ne menjen a gerinc alá (bár nem kéne) + if (maxY > spineY) maxY = spineY; + + // Vonal húzása az előző pixel Y-tól a mostaniig (folytonosságért) + // Az első pixelnél nincs előző + if (x > 0) { + sprite.drawLine(x - 1, Math.round(lastY), x, Math.round(maxY), fg_color); + } + lastY = maxY; + } + + // Számok kiírása (külön ciklusban, hogy a vonal fölött legyen) + sprite.setTextSize(2); + for(var i=0; i Date: Wed, 10 Dec 2025 10:34:15 +0100 Subject: [PATCH 07/14] Add SCAD model for Arrow AR4 key --- examples/key copier SCAD maker/AR4.scad | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 examples/key copier SCAD maker/AR4.scad diff --git a/examples/key copier SCAD maker/AR4.scad b/examples/key copier SCAD maker/AR4.scad new file mode 100644 index 0000000..3644c66 --- /dev/null +++ b/examples/key copier SCAD maker/AR4.scad @@ -0,0 +1,26 @@ +// Generated by KeyCopier for Arrow AR4 +function mm(i) = i*25.4; + +module rounded(size, r) { union() { translate([r, 0, 0]) cube([size[0]-2*r, size[1], size[2]]); translate([0, r, 0]) cube([size[0], size[1]-2*r, size[2]]); translate([r, r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([size[0]-r, r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([r, size[1]-r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([size[0]-r, size[1]-r, 0]) cylinder(h=size[2], r=r, $fn=16); } } +module bit() { w = mm(1/4); difference() { translate([-w/2, 0, 0]) cube([w, mm(1), w]); translate([-mm(5/128), 0, 0]) rotate([0, 0, 135]) cube([w, w, w]); translate([mm(5/128), 0, 0]) rotate([0, 0, -45]) cube([w, w, w]); } } +module key(bits) { + thickness = mm(0.080); + length = mm(1.140); + width = mm(0.312); + shoulder = mm(0.265); + pin_spacing = mm(0.155); + depth_inc = mm(0.014); + fudge = 0.5; + h_l = mm(1); h_w = mm(1); h_d = mm(1/16); + difference() { + union() { translate([-h_l, -h_w/2 + width/2, 0]) rounded([h_l, h_w, thickness], mm(1/4)); cube([length - mm(1/64), width, thickness]); } + translate([length, mm(1/8), 0]) { rotate([0, 0, 45]) cube([10, 10, thickness]); rotate([0, 0, 225]) cube([10, 10, thickness]); } + translate([-h_l + mm(3/16), width/2, 0]) cylinder(h=thickness, r=mm(1/8), $fn=16); + union() { translate([-h_d, mm(.105), mm(.025)]) rotate([225, 0, 0]) cube([length + h_d, width, width]); translate([-h_d, mm(.105), mm(.05)]) rotate([260, 0, 0]) cube([length + h_d, thickness/2, mm(1/32)]); translate([-h_d, mm(.105), 0]) cube([length + h_d, mm(7/128), mm(.05)]); translate([-h_d, mm(.105) + mm(7/128), mm(.05)]) rotate([225, 0, 0]) cube([length + h_d, mm(3/64), thickness]); } + for (b = [0:5]) { + translate([shoulder + fudge + b*pin_spacing, width - mm(.008) - (bits[b] - 0)*depth_inc - fudge, 0]) bit(); + } + } +} + +key([3,4,5,1,4,0]); From c8582c5d6e176efa365dbafea727347c17df7cca Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Wed, 10 Dec 2025 11:13:05 +0100 Subject: [PATCH 08/14] Enhance key database and SCAD generation logic Expanded the key database with additional key formats and manufacturers, including Elzett, Universal, Yale, and others. Updated comments and improved SCAD generation logic for better clarity and functionality. --- .../key copier SCAD maker/keycopier_scad.js | 133 +++++++++--------- 1 file changed, 70 insertions(+), 63 deletions(-) diff --git a/examples/key copier SCAD maker/keycopier_scad.js b/examples/key copier SCAD maker/keycopier_scad.js index da5ed84..c60b953 100644 --- a/examples/key copier SCAD maker/keycopier_scad.js +++ b/examples/key copier SCAD maker/keycopier_scad.js @@ -2,27 +2,48 @@ var display = require('display'); var keyboard = require('keyboard'); var storage = require('storage'); -// ========================================== -// 1. TELJES KULCS ADATBÁZIS -// ========================================== +// =================================================================================== +// 1. TELJES KULCS ADATBÁZIS (Bővítve: Elzett & JMA/Universal) +// =================================================================================== var KEY_DB = [ + // --- MAGYAR / EURÓPAI KULCSOK --- + { + manufacturer: "Elzett", + format_name: "751 (Euro)", + pin_num: 5, + // 4.5mm start, 4.0mm köz, 0.5mm mélység lépés + first_pin_inch: 0.177, last_pin_inch: 0.807, pin_increment_inch: 0.1575, + pin_width_inch: 0.039, elbow_inch: 0.118, drill_angle: 90, + uncut_depth_inch: 0.338, deepest_depth_inch: 0.197, depth_step_inch: 0.0197, + min_depth_ind: 1, max_depth_ind: 6 + }, + { + manufacturer: "Universal", + format_name: "JMA / Euro", + pin_num: 5, + // Szabványos Euro profil (gyakran JMA U-5D) + // Kicsit szűkebb kezdés (4.0mm) mint az Elzettnél + first_pin_inch: 0.157, last_pin_inch: 0.787, pin_increment_inch: 0.1575, + pin_width_inch: 0.039, elbow_inch: 0.118, drill_angle: 90, + uncut_depth_inch: 0.335, deepest_depth_inch: 0.197, depth_step_inch: 0.020, + min_depth_ind: 1, max_depth_ind: 6 + }, + + // --- AMERIKAI / NEMZETKÖZI KULCSOK --- { manufacturer: "Kwikset", format_name: "KW1", first_pin_inch: 0.247, last_pin_inch: 0.847, pin_increment_inch: 0.15, pin_num: 5, pin_width_inch: 0.084, elbow_inch: 0.15, drill_angle: 90, uncut_depth_inch: 0.329, deepest_depth_inch: 0.191, depth_step_inch: 0.023, min_depth_ind: 1, max_depth_ind: 7 }, { manufacturer: "Schlage", format_name: "SC4", first_pin_inch: 0.231, last_pin_inch: 1.012, pin_increment_inch: 0.1562, pin_num: 6, pin_width_inch: 0.031, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.335, deepest_depth_inch: 0.2, depth_step_inch: 0.015, min_depth_ind: 0, max_depth_ind: 9 }, - { manufacturer: "Arrow", format_name: "AR4", first_pin_inch: 0.265, last_pin_inch: 1.040, pin_increment_inch: 0.155, pin_num: 6, pin_width_inch: 0.060, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.312, deepest_depth_inch: 0.186, depth_step_inch: 0.014, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "Yale", format_name: "Y11", first_pin_inch: 0.124, last_pin_inch: 0.502, pin_increment_inch: 0.095, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.246, deepest_depth_inch: 0.167, depth_step_inch: 0.020, min_depth_ind: 1, max_depth_ind: 5 }, + { manufacturer: "Yale", format_name: "Y2", first_pin_inch: 0.200, last_pin_inch: 1.025, pin_increment_inch: 0.165, pin_num: 6, pin_width_inch: 0.054, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.320, deepest_depth_inch: 0.149, depth_step_inch: 0.019, min_depth_ind: 0, max_depth_ind: 9 }, { manufacturer: "Master Lock", format_name: "M1", first_pin_inch: 0.185, last_pin_inch: 0.689, pin_increment_inch: 0.126, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.276, deepest_depth_inch: 0.171, depth_step_inch: 0.015, min_depth_ind: 0, max_depth_ind: 7 }, + { manufacturer: "Arrow", format_name: "AR4", first_pin_inch: 0.265, last_pin_inch: 1.040, pin_increment_inch: 0.155, pin_num: 6, pin_width_inch: 0.060, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.312, deepest_depth_inch: 0.186, depth_step_inch: 0.014, min_depth_ind: 0, max_depth_ind: 9 }, { manufacturer: "American", format_name: "AM7", first_pin_inch: 0.157, last_pin_inch: 0.781, pin_increment_inch: 0.125, pin_num: 6, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.283, deepest_depth_inch: 0.173, depth_step_inch: 0.016, min_depth_ind: 1, max_depth_ind: 8 }, - { manufacturer: "Yale", format_name: "Y2", first_pin_inch: 0.200, last_pin_inch: 1.025, pin_increment_inch: 0.165, pin_num: 6, pin_width_inch: 0.054, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.320, deepest_depth_inch: 0.149, depth_step_inch: 0.019, min_depth_ind: 0, max_depth_ind: 9 }, - { manufacturer: "Yale", format_name: "Y11", first_pin_inch: 0.124, last_pin_inch: 0.502, pin_increment_inch: 0.095, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.246, deepest_depth_inch: 0.167, depth_step_inch: 0.020, min_depth_ind: 1, max_depth_ind: 5 }, { manufacturer: "Sargent", format_name: "S22", first_pin_inch: 0.216, last_pin_inch: 0.996, pin_increment_inch: 0.156, pin_num: 6, pin_width_inch: 0.063, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.328, deepest_depth_inch: 0.148, depth_step_inch: 0.020, min_depth_ind: 1, max_depth_ind: 10 }, - { manufacturer: "National", format_name: "NA25", first_pin_inch: 0.250, last_pin_inch: 0.874, pin_increment_inch: 0.156, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.304, deepest_depth_inch: 0.191, depth_step_inch: 0.012, min_depth_ind: 0, max_depth_ind: 9 }, { manufacturer: "Corbin", format_name: "CO88", first_pin_inch: 0.250, last_pin_inch: 1.030, pin_increment_inch: 0.156, pin_num: 6, pin_width_inch: 0.047, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.343, deepest_depth_inch: 0.217, depth_step_inch: 0.014, min_depth_ind: 1, max_depth_ind: 10 }, { manufacturer: "Lockwood", format_name: "LW4", first_pin_inch: 0.245, last_pin_inch: 0.870, pin_increment_inch: 0.1562, pin_num: 5, pin_width_inch: 0.031, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.344, deepest_depth_inch: 0.203, depth_step_inch: 0.014, min_depth_ind: 0, max_depth_ind: 9 }, - { manufacturer: "Lockwood", format_name: "LW5", first_pin_inch: 0.245, last_pin_inch: 1.0262, pin_increment_inch: 0.1562, pin_num: 6, pin_width_inch: 0.031, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.344, deepest_depth_inch: 0.203, depth_step_inch: 0.014, min_depth_ind: 0, max_depth_ind: 9 }, - { manufacturer: "National", format_name: "NA12", first_pin_inch: 0.150, last_pin_inch: 0.710, pin_increment_inch: 0.140, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.270, deepest_depth_inch: 0.157, depth_step_inch: 0.013, min_depth_ind: 0, max_depth_ind: 9 }, - { manufacturer: "Russwin", format_name: "RU45", first_pin_inch: 0.250, last_pin_inch: 1.030, pin_increment_inch: 0.156, pin_num: 6, pin_width_inch: 0.053, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.343, deepest_depth_inch: 0.203, depth_step_inch: 0.028, min_depth_ind: 1, max_depth_ind: 6 }, { manufacturer: "Weiser", format_name: "WR3", first_pin_inch: 0.237, last_pin_inch: 0.861, pin_increment_inch: 0.156, pin_num: 5, pin_width_inch: 0.090, elbow_inch: 0.150, drill_angle: 90, uncut_depth_inch: 0.315, deepest_depth_inch: 0.153, depth_step_inch: 0.018, min_depth_ind: 0, max_depth_ind: 10 } ]; + // ========================================== // 2. SCAD GENERÁLÁS (Template alapú) // ========================================== @@ -38,10 +59,8 @@ function generateSCAD(keyCodes, format) { scad += "module rounded(size, r) { union() { translate([r, 0, 0]) cube([size[0]-2*r, size[1], size[2]]); translate([0, r, 0]) cube([size[0], size[1]-2*r, size[2]]); translate([r, r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([size[0]-r, r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([r, size[1]-r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([size[0]-r, size[1]-r, 0]) cylinder(h=size[2], r=r, $fn=16); } }\n"; - // Bit modul scad += "module bit() { w = mm(1/4); difference() { translate([-w/2, 0, 0]) cube([w, mm(1), w]); translate([-mm(5/128), 0, 0]) rotate([0, 0, 135]) cube([w, w, w]); translate([mm(5/128), 0, 0]) rotate([0, 0, -45]) cube([w, w, w]); } }\n"; - // Kulcs Modul scad += "module key(bits) {\n"; scad += " thickness = mm(0.080);\n"; var len = format.last_pin_inch + format.elbow_inch; @@ -58,6 +77,8 @@ function generateSCAD(keyCodes, format) { scad += " translate([length, mm(1/8), 0]) { rotate([0, 0, 45]) cube([10, 10, thickness]); rotate([0, 0, 225]) cube([10, 10, thickness]); }\n"; scad += " translate([-h_l + mm(3/16), width/2, 0]) cylinder(h=thickness, r=mm(1/8), $fn=16);\n"; scad += " union() { translate([-h_d, mm(.105), mm(.025)]) rotate([225, 0, 0]) cube([length + h_d, width, width]); translate([-h_d, mm(.105), mm(.05)]) rotate([260, 0, 0]) cube([length + h_d, thickness/2, mm(1/32)]); translate([-h_d, mm(.105), 0]) cube([length + h_d, mm(7/128), mm(.05)]); translate([-h_d, mm(.105) + mm(7/128), mm(.05)]) rotate([225, 0, 0]) cube([length + h_d, mm(3/64), thickness]); }\n"; + scad += " translate([-h_d, width - mm(9/64), mm(.043)]) { cube([length + h_d, width - (width - mm(10/64)), thickness]); rotate([50, 0, 0]) cube([length + h_d, width, thickness]); }\n"; + scad += " union() { translate([-h_d, mm(0.015), mm(.03)]) cube([length + h_d, mm(15/256), thickness]); translate([-h_d, mm(0.015) + mm(13/256), thickness - mm(1/64)]) rotate([45, 0, 0]) cube([length + h_d, mm(1/16), mm(1/16)]); }\n"; scad += " for (b = [0:" + (format.pin_num - 1) + "]) {\n"; scad += " translate([shoulder + fudge + b*pin_spacing, width - mm(.008) - (bits[b] - " + format.min_depth_ind + ")*depth_inc - fudge, 0]) bit();\n"; @@ -186,103 +207,89 @@ function main() { sprite.setTextSize(1); sprite.drawText(format.manufacturer + " " + format.format_name, 2, 2); - // --- MARÁS SZIMULÁCIÓ (Pixel Sweep) --- + // --- SKÁLÁZÁS (M5STICK) --- var shoulderX = 0; - var spineY = 100; var maxDisplayWidth = dw; + // Gerinc alul (hogy ne lógjanak bele a számok) + var spineY = dh - 20; + var keyTotalLenInch = format.last_pin_inch + format.elbow_inch; + // PPI úgy, hogy beleférjen a képernyőbe var ppi = maxDisplayWidth / (keyTotalLenInch + 0.1); + var bladeHeightPx = format.uncut_depth_inch * ppi; var topY = spineY - bladeHeightPx; - var keyEndPx = Math.round(keyTotalLenInch * ppi); - var tipStartX = Math.round(format.last_pin_inch * ppi); - - // Gerinc és Váll - sprite.drawLine(shoulderX, spineY, keyEndPx, spineY, fg_color); + // 1. Gerinc és Váll + var keyEndPx = keyTotalLenInch * ppi; + sprite.drawLine(shoulderX, spineY, Math.round(keyEndPx), spineY, fg_color); sprite.drawLine(shoulderX, spineY, shoulderX, Math.round(topY), fg_color); - // Előkészítjük a vágás profilját minden pixelre - // Ez a "Pixel Sweep" módszer, ami szimulálja a marást (boolean kivonás) + var lastY = topY; - var lastY = topY; // Kezdő magasság (váll) + // --- MARÁS SZIMULÁCIÓ (Pixel Sweep) --- + // Ez biztosítja a pontos, V-alakú vágásokat és a helyes kezdőpozíciót - // Pixelről pixelre végigmegyünk a kulcs hosszán for (var x = 0; x <= keyEndPx; x++) { - // Alapértelmezett magasság a nyers kulcs teteje - var maxY = topY; // Képernyőn a legmagasabb pont a legkisebb Y érték + var maxY = topY; // Alap: nyers magasság (felső él) - // Ellenőrizzük az összes marófej hatását erre a pixelre for (var i = 0; i < format.pin_num; i++) { - // A marás középpontja pixelben var pinCenterInch = format.first_pin_inch + (i * format.pin_increment_inch); var pinCenterPx = pinCenterInch * ppi; - // A marás mélysége (Y) pixelben var depthInd = code[i] - format.min_depth_ind; var cutDepthInch = depthInd * format.depth_step_inch; - var cutCenterY = topY + (cutDepthInch * ppi); - // Milyen széles a vágás alja (lapos rész) - var halfFlatW = (format.pin_width_inch * ppi) / 2; + // Mennyire mély a vágás pixelben (fentről lefelé mérve) + var cutDepthPx = cutDepthInch * ppi; + var cutBottomY = topY + cutDepthPx; - // Távolság a marás közepétől + var halfFlatW = (format.pin_width_inch * ppi) / 2; var dist = Math.abs(x - pinCenterPx); - var thisY = topY; // Alap + var thisY = topY; if (dist <= halfFlatW) { - // A lapos részen vagyunk - thisY = cutCenterY; + // Lapos alj + thisY = cutBottomY; } else { - // A ferde részen vagyunk (V alak) - // 90 fokos fúró esetén a lejtés 1:1 (45 fok) - // Tehát ahogy távolodunk, úgy emelkedik az Y (csökken az értéke) + // Ferde oldal (V-alak) + // 90 fok -> 45 fokos oldalfal -> 1:1 emelkedés var rise = dist - halfFlatW; - thisY = cutCenterY - rise; + thisY = cutBottomY - rise; } - // Mivel a képernyőn lefelé nő az Y, a "mélyebb" vágás nagyobb Y értéket jelent. - // A végső profil az a pont, ami a LEGMÉLYEBBEN van (legnagyobb Y), - // de nem mehet lejjebb, mint amit a legmélyebb vágás diktál ezen a ponton. - // A valóságban a marás KIVON anyagot. Tehát minél nagyobb az Y, annál több anyag hiányzik. - // A profil vonal az, ami megmarad. - // Tehát minden ponton a maximális Y értéket keressük, ami a marások uniója. - + // Boolean kivonás: A legmélyebb vágás érvényesül az adott ponton + // Mivel Y lefelé nő, a nagyobb Y = mélyebb vágás. if (thisY > maxY) maxY = thisY; } - // Tip (Hegy) kezelése: Az utolsó pin után lecsapjuk - if (x > tipStartX) { - // Egyenesen vágjuk le a végét vagy ferdén? Legyen ferde. - var distFromLast = x - tipStartX; - var tipCutY = topY + distFromLast; // 45 fokos letörés a végén - // De a tip emelkedik a gerinctől? A kérés szerint: - // "Tip (Hegy) - Felhúzás az utolsó vágásból" - // A fenti ciklus automatikusan kezeli a felhúzást, mert távolodunk az utolsó pintől. - // Csak korlátozni kell, hogy ne menjen vissza teljesen 'topY'-ra, ha a hegy lecsapott. - // Hagyjuk, hogy a marás logika kifusson. - } - - // Korlátozzuk, hogy ne menjen a gerinc alá (bár nem kéne) + // Csak a gerincig mehet le if (maxY > spineY) maxY = spineY; - // Vonal húzása az előző pixel Y-tól a mostaniig (folytonosságért) - // Az első pixelnél nincs előző + // Vonal húzása if (x > 0) { sprite.drawLine(x - 1, Math.round(lastY), x, Math.round(maxY), fg_color); } lastY = maxY; } - // Számok kiírása (külön ciklusban, hogy a vonal fölött legyen) + // Tip (Hegy) lezárása + // Egy függőleges vonal a végén a gerincig + sprite.drawLine(Math.round(keyEndPx), Math.round(lastY), Math.round(keyEndPx), spineY, fg_color); + + // Számok kiírása sprite.setTextSize(2); for(var i=0; i Date: Wed, 10 Dec 2025 11:14:14 +0100 Subject: [PATCH 09/14] Add SCAD model for Elzett 751 key --- examples/key copier SCAD maker/elzet.scad | 28 +++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 examples/key copier SCAD maker/elzet.scad diff --git a/examples/key copier SCAD maker/elzet.scad b/examples/key copier SCAD maker/elzet.scad new file mode 100644 index 0000000..e4b7bec --- /dev/null +++ b/examples/key copier SCAD maker/elzet.scad @@ -0,0 +1,28 @@ +// Generated by KeyCopier for Elzett 751 (Euro) +function mm(i) = i*25.4; + +module rounded(size, r) { union() { translate([r, 0, 0]) cube([size[0]-2*r, size[1], size[2]]); translate([0, r, 0]) cube([size[0], size[1]-2*r, size[2]]); translate([r, r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([size[0]-r, r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([r, size[1]-r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([size[0]-r, size[1]-r, 0]) cylinder(h=size[2], r=r, $fn=16); } } +module bit() { w = mm(1/4); difference() { translate([-w/2, 0, 0]) cube([w, mm(1), w]); translate([-mm(5/128), 0, 0]) rotate([0, 0, 135]) cube([w, w, w]); translate([mm(5/128), 0, 0]) rotate([0, 0, -45]) cube([w, w, w]); } } +module key(bits) { + thickness = mm(0.080); + length = mm(0.925); + width = mm(0.338); + shoulder = mm(0.177); + pin_spacing = mm(0.158); + depth_inc = mm(0.020); + fudge = 0.5; + h_l = mm(1); h_w = mm(1); h_d = mm(1/16); + difference() { + union() { translate([-h_l, -h_w/2 + width/2, 0]) rounded([h_l, h_w, thickness], mm(1/4)); cube([length - mm(1/64), width, thickness]); } + translate([length, mm(1/8), 0]) { rotate([0, 0, 45]) cube([10, 10, thickness]); rotate([0, 0, 225]) cube([10, 10, thickness]); } + translate([-h_l + mm(3/16), width/2, 0]) cylinder(h=thickness, r=mm(1/8), $fn=16); + union() { translate([-h_d, mm(.105), mm(.025)]) rotate([225, 0, 0]) cube([length + h_d, width, width]); translate([-h_d, mm(.105), mm(.05)]) rotate([260, 0, 0]) cube([length + h_d, thickness/2, mm(1/32)]); translate([-h_d, mm(.105), 0]) cube([length + h_d, mm(7/128), mm(.05)]); translate([-h_d, mm(.105) + mm(7/128), mm(.05)]) rotate([225, 0, 0]) cube([length + h_d, mm(3/64), thickness]); } + translate([-h_d, width - mm(9/64), mm(.043)]) { cube([length + h_d, width - (width - mm(10/64)), thickness]); rotate([50, 0, 0]) cube([length + h_d, width, thickness]); } + union() { translate([-h_d, mm(0.015), mm(.03)]) cube([length + h_d, mm(15/256), thickness]); translate([-h_d, mm(0.015) + mm(13/256), thickness - mm(1/64)]) rotate([45, 0, 0]) cube([length + h_d, mm(1/16), mm(1/16)]); } + for (b = [0:4]) { + translate([shoulder + fudge + b*pin_spacing, width - mm(.008) - (bits[b] - 1)*depth_inc - fudge, 0]) bit(); + } + } +} + +key([5,6,2,3,2]); From 286a176cf8a8a76efb97f2babe98a5d4bf8ad2a1 Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Wed, 10 Dec 2025 11:16:40 +0100 Subject: [PATCH 10/14] Add files via upload --- examples/key copier SCAD maker/elezt 751.stl | Bin 0 -> 15884 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/key copier SCAD maker/elezt 751.stl diff --git a/examples/key copier SCAD maker/elezt 751.stl b/examples/key copier SCAD maker/elezt 751.stl new file mode 100644 index 0000000000000000000000000000000000000000..e7857edd2b4843145a3ace5d7859202fa394eebb GIT binary patch literal 15884 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 C{-kgK literal 0 HcmV?d00001 From 8aedc0ac42a22db96d02cec7b505fd4526439f2b Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Wed, 10 Dec 2025 11:47:41 +0100 Subject: [PATCH 11/14] Add SCAD model for Rittal 3524 E key copier --- .../key copier SCAD maker/Rittal 3524 E.scad | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 examples/key copier SCAD maker/Rittal 3524 E.scad diff --git a/examples/key copier SCAD maker/Rittal 3524 E.scad b/examples/key copier SCAD maker/Rittal 3524 E.scad new file mode 100644 index 0000000..5bc6a27 --- /dev/null +++ b/examples/key copier SCAD maker/Rittal 3524 E.scad @@ -0,0 +1,28 @@ +// Generated by KeyCopier for Rittal 3524 E +function mm(i) = i*25.4; + +module rounded(size, r) { union() { translate([r, 0, 0]) cube([size[0]-2*r, size[1], size[2]]); translate([0, r, 0]) cube([size[0], size[1]-2*r, size[2]]); translate([r, r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([size[0]-r, r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([r, size[1]-r, 0]) cylinder(h=size[2], r=r, $fn=16); translate([size[0]-r, size[1]-r, 0]) cylinder(h=size[2], r=r, $fn=16); } } +module bit() { w = mm(1/4); difference() { translate([-w/2, 0, 0]) cube([w, mm(1), w]); translate([-mm(5/128), 0, 0]) rotate([0, 0, 135]) cube([w, w, w]); translate([mm(5/128), 0, 0]) rotate([0, 0, -45]) cube([w, w, w]); } } +module key(bits) { + thickness = mm(0.080); + length = mm(0.750); + width = mm(0.331); + shoulder = mm(0.138); + pin_spacing = mm(0.138); + depth_inc = mm(0.031); + fudge = 0.5; + h_l = mm(1); h_w = mm(1); h_d = mm(1/16); + difference() { + union() { translate([-h_l, -h_w/2 + width/2, 0]) rounded([h_l, h_w, thickness], mm(1/4)); cube([length - mm(1/64), width, thickness]); } + translate([length, mm(1/8), 0]) { rotate([0, 0, 45]) cube([10, 10, thickness]); rotate([0, 0, 225]) cube([10, 10, thickness]); } + translate([-h_l + mm(3/16), width/2, 0]) cylinder(h=thickness, r=mm(1/8), $fn=16); + union() { translate([-h_d, mm(.105), mm(.025)]) rotate([225, 0, 0]) cube([length + h_d, width, width]); translate([-h_d, mm(.105), mm(.05)]) rotate([260, 0, 0]) cube([length + h_d, thickness/2, mm(1/32)]); translate([-h_d, mm(.105), 0]) cube([length + h_d, mm(7/128), mm(.05)]); translate([-h_d, mm(.105) + mm(7/128), mm(.05)]) rotate([225, 0, 0]) cube([length + h_d, mm(3/64), thickness]); } + translate([-h_d, width - mm(9/64), mm(.043)]) { cube([length + h_d, width - (width - mm(10/64)), thickness]); rotate([50, 0, 0]) cube([length + h_d, width, thickness]); } + union() { translate([-h_d, mm(0.015), mm(.03)]) cube([length + h_d, mm(15/256), thickness]); translate([-h_d, mm(0.015) + mm(13/256), thickness - mm(1/64)]) rotate([45, 0, 0]) cube([length + h_d, mm(1/16), mm(1/16)]); } + for (b = [0:3]) { + translate([shoulder + fudge + b*pin_spacing, width - mm(.008) - (bits[b] - 1)*depth_inc - fudge, 0]) bit(); + } + } +} + +key([3,5,2,4]); From 4b11d43403517b6cc5bdb3e98d72300d840c8b90 Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Wed, 10 Dec 2025 11:48:23 +0100 Subject: [PATCH 12/14] Enhance key database and update comments Updated key database to include Rittal and improved comments. --- .../key copier SCAD maker/keycopier_scad.js | 79 +++++++------------ 1 file changed, 27 insertions(+), 52 deletions(-) diff --git a/examples/key copier SCAD maker/keycopier_scad.js b/examples/key copier SCAD maker/keycopier_scad.js index c60b953..ba1f218 100644 --- a/examples/key copier SCAD maker/keycopier_scad.js +++ b/examples/key copier SCAD maker/keycopier_scad.js @@ -3,33 +3,12 @@ var keyboard = require('keyboard'); var storage = require('storage'); // =================================================================================== -// 1. TELJES KULCS ADATBÁZIS (Bővítve: Elzett & JMA/Universal) +// 1. TELJES KULCS ADATBÁZIS (Bővítve: Elzett & JMA/Universal & Rittal) // =================================================================================== var KEY_DB = [ - // --- MAGYAR / EURÓPAI KULCSOK --- - { - manufacturer: "Elzett", - format_name: "751 (Euro)", - pin_num: 5, - // 4.5mm start, 4.0mm köz, 0.5mm mélység lépés - first_pin_inch: 0.177, last_pin_inch: 0.807, pin_increment_inch: 0.1575, - pin_width_inch: 0.039, elbow_inch: 0.118, drill_angle: 90, - uncut_depth_inch: 0.338, deepest_depth_inch: 0.197, depth_step_inch: 0.0197, - min_depth_ind: 1, max_depth_ind: 6 - }, - { - manufacturer: "Universal", - format_name: "JMA / Euro", - pin_num: 5, - // Szabványos Euro profil (gyakran JMA U-5D) - // Kicsit szűkebb kezdés (4.0mm) mint az Elzettnél - first_pin_inch: 0.157, last_pin_inch: 0.787, pin_increment_inch: 0.1575, - pin_width_inch: 0.039, elbow_inch: 0.118, drill_angle: 90, - uncut_depth_inch: 0.335, deepest_depth_inch: 0.197, depth_step_inch: 0.020, - min_depth_ind: 1, max_depth_ind: 6 - }, - - // --- AMERIKAI / NEMZETKÖZI KULCSOK --- + { manufacturer: "Elzett", format_name: "751 (Euro)", pin_num: 5, first_pin_inch: 0.177, last_pin_inch: 0.807, pin_increment_inch: 0.1575, pin_width_inch: 0.039, elbow_inch: 0.118, drill_angle: 90, uncut_depth_inch: 0.338, deepest_depth_inch: 0.197, depth_step_inch: 0.0197, min_depth_ind: 1, max_depth_ind: 6 }, + { manufacturer: "Universal", format_name: "JMA / Euro", pin_num: 5, first_pin_inch: 0.157, last_pin_inch: 0.787, pin_increment_inch: 0.1575, pin_width_inch: 0.039, elbow_inch: 0.118, drill_angle: 90, uncut_depth_inch: 0.335, deepest_depth_inch: 0.197, depth_step_inch: 0.020, min_depth_ind: 1, max_depth_ind: 6 }, + { manufacturer: "Rittal", format_name: "3524 E", pin_num: 4, first_pin_inch: 0.138, last_pin_inch: 0.650, pin_increment_inch: 0.138, pin_width_inch: 0.060, elbow_inch: 0.100, drill_angle: 90, uncut_depth_inch: 0.331, deepest_depth_inch: 0.177, depth_step_inch: 0.031, min_depth_ind: 1, max_depth_ind: 5 }, { manufacturer: "Kwikset", format_name: "KW1", first_pin_inch: 0.247, last_pin_inch: 0.847, pin_increment_inch: 0.15, pin_num: 5, pin_width_inch: 0.084, elbow_inch: 0.15, drill_angle: 90, uncut_depth_inch: 0.329, deepest_depth_inch: 0.191, depth_step_inch: 0.023, min_depth_ind: 1, max_depth_ind: 7 }, { manufacturer: "Schlage", format_name: "SC4", first_pin_inch: 0.231, last_pin_inch: 1.012, pin_increment_inch: 0.1562, pin_num: 6, pin_width_inch: 0.031, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.335, deepest_depth_inch: 0.2, depth_step_inch: 0.015, min_depth_ind: 0, max_depth_ind: 9 }, { manufacturer: "Yale", format_name: "Y11", first_pin_inch: 0.124, last_pin_inch: 0.502, pin_increment_inch: 0.095, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.246, deepest_depth_inch: 0.167, depth_step_inch: 0.020, min_depth_ind: 1, max_depth_ind: 5 }, @@ -40,12 +19,15 @@ var KEY_DB = [ { manufacturer: "Sargent", format_name: "S22", first_pin_inch: 0.216, last_pin_inch: 0.996, pin_increment_inch: 0.156, pin_num: 6, pin_width_inch: 0.063, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.328, deepest_depth_inch: 0.148, depth_step_inch: 0.020, min_depth_ind: 1, max_depth_ind: 10 }, { manufacturer: "Corbin", format_name: "CO88", first_pin_inch: 0.250, last_pin_inch: 1.030, pin_increment_inch: 0.156, pin_num: 6, pin_width_inch: 0.047, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.343, deepest_depth_inch: 0.217, depth_step_inch: 0.014, min_depth_ind: 1, max_depth_ind: 10 }, { manufacturer: "Lockwood", format_name: "LW4", first_pin_inch: 0.245, last_pin_inch: 0.870, pin_increment_inch: 0.1562, pin_num: 5, pin_width_inch: 0.031, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.344, deepest_depth_inch: 0.203, depth_step_inch: 0.014, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "Lockwood", format_name: "LW5", first_pin_inch: 0.245, last_pin_inch: 1.0262, pin_increment_inch: 0.1562, pin_num: 6, pin_width_inch: 0.031, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.344, deepest_depth_inch: 0.203, depth_step_inch: 0.014, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "National", format_name: "NA12", first_pin_inch: 0.150, last_pin_inch: 0.710, pin_increment_inch: 0.140, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.270, deepest_depth_inch: 0.157, depth_step_inch: 0.013, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "National", format_name: "NA25", first_pin_inch: 0.250, last_pin_inch: 0.874, pin_increment_inch: 0.156, pin_num: 5, pin_width_inch: 0.039, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.304, deepest_depth_inch: 0.191, depth_step_inch: 0.012, min_depth_ind: 0, max_depth_ind: 9 }, + { manufacturer: "Russwin", format_name: "RU45", first_pin_inch: 0.250, last_pin_inch: 1.030, pin_increment_inch: 0.156, pin_num: 6, pin_width_inch: 0.053, elbow_inch: 0.1, drill_angle: 90, uncut_depth_inch: 0.343, deepest_depth_inch: 0.203, depth_step_inch: 0.028, min_depth_ind: 1, max_depth_ind: 6 }, { manufacturer: "Weiser", format_name: "WR3", first_pin_inch: 0.237, last_pin_inch: 0.861, pin_increment_inch: 0.156, pin_num: 5, pin_width_inch: 0.090, elbow_inch: 0.150, drill_angle: 90, uncut_depth_inch: 0.315, deepest_depth_inch: 0.153, depth_step_inch: 0.018, min_depth_ind: 0, max_depth_ind: 10 } ]; - // ========================================== -// 2. SCAD GENERÁLÁS (Template alapú) +// 2. SCAD GENERÁLÁS (TEMPLATE ALAPÚ) // ========================================== function generateSCAD(keyCodes, format) { var bits = []; @@ -181,7 +163,14 @@ function main() { currentKeyIdx++; if (currentKeyIdx >= KEY_DB.length) currentKeyIdx = 0; initCodeForFormat(currentKeyIdx); - statusMsg = "Type: " + KEY_DB[currentKeyIdx].format_name; + + // Rittal Auto-Set + if (KEY_DB[currentKeyIdx].manufacturer === "Rittal") { + code[0] = 3; code[1] = 5; code[2] = 2; code[3] = 4; + statusMsg = "Auto: Rittal 3524"; + } else { + statusMsg = "Type: " + KEY_DB[currentKeyIdx].format_name; + } msgTimer = 30; } else if (menuCursor === 3) { break; } @@ -207,31 +196,27 @@ function main() { sprite.setTextSize(1); sprite.drawText(format.manufacturer + " " + format.format_name, 2, 2); - // --- SKÁLÁZÁS (M5STICK) --- + // --- SKÁLÁZÁS --- var shoulderX = 0; - var maxDisplayWidth = dw; - // Gerinc alul (hogy ne lógjanak bele a számok) - var spineY = dh - 20; + var spineY = dh - 20; // Gerinc alul + var maxDisplayWidth = dw; var keyTotalLenInch = format.last_pin_inch + format.elbow_inch; - // PPI úgy, hogy beleférjen a képernyőbe var ppi = maxDisplayWidth / (keyTotalLenInch + 0.1); var bladeHeightPx = format.uncut_depth_inch * ppi; var topY = spineY - bladeHeightPx; - // 1. Gerinc és Váll + // Gerinc és Váll var keyEndPx = keyTotalLenInch * ppi; sprite.drawLine(shoulderX, spineY, Math.round(keyEndPx), spineY, fg_color); sprite.drawLine(shoulderX, spineY, shoulderX, Math.round(topY), fg_color); var lastY = topY; - // --- MARÁS SZIMULÁCIÓ (Pixel Sweep) --- - // Ez biztosítja a pontos, V-alakú vágásokat és a helyes kezdőpozíciót - + // --- MARÁS SZIMULÁCIÓ --- for (var x = 0; x <= keyEndPx; x++) { - var maxY = topY; // Alap: nyers magasság (felső él) + var maxY = topY; for (var i = 0; i < format.pin_num; i++) { var pinCenterInch = format.first_pin_inch + (i * format.pin_increment_inch); @@ -239,8 +224,6 @@ function main() { var depthInd = code[i] - format.min_depth_ind; var cutDepthInch = depthInd * format.depth_step_inch; - - // Mennyire mély a vágás pixelben (fentről lefelé mérve) var cutDepthPx = cutDepthInch * ppi; var cutBottomY = topY + cutDepthPx; @@ -250,35 +233,27 @@ function main() { var thisY = topY; if (dist <= halfFlatW) { - // Lapos alj thisY = cutBottomY; } else { - // Ferde oldal (V-alak) - // 90 fok -> 45 fokos oldalfal -> 1:1 emelkedés var rise = dist - halfFlatW; thisY = cutBottomY - rise; } - // Boolean kivonás: A legmélyebb vágás érvényesül az adott ponton - // Mivel Y lefelé nő, a nagyobb Y = mélyebb vágás. if (thisY > maxY) maxY = thisY; } - // Csak a gerincig mehet le if (maxY > spineY) maxY = spineY; - // Vonal húzása if (x > 0) { sprite.drawLine(x - 1, Math.round(lastY), x, Math.round(maxY), fg_color); } lastY = maxY; } - // Tip (Hegy) lezárása - // Egy függőleges vonal a végén a gerincig + // Tip lezárása sprite.drawLine(Math.round(keyEndPx), Math.round(lastY), Math.round(keyEndPx), spineY, fg_color); - // Számok kiírása + // Számok kiírása (JAVÍTVA: Soha nem megy ki a képből) sprite.setTextSize(2); for(var i=0; i Date: Wed, 10 Dec 2025 13:48:53 +0100 Subject: [PATCH 13/14] Create browser_bruce_M5.js --- examples/M5Stick JS bruce/browser_bruce_M5.js | 185 ++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 examples/M5Stick JS bruce/browser_bruce_M5.js diff --git a/examples/M5Stick JS bruce/browser_bruce_M5.js b/examples/M5Stick JS bruce/browser_bruce_M5.js new file mode 100644 index 0000000..4f05508 --- /dev/null +++ b/examples/M5Stick JS bruce/browser_bruce_M5.js @@ -0,0 +1,185 @@ +var dialog = require('dialog'); +var wifi = require('wifi'); +var display = require('display'); +var keyboard = require('keyboard'); + +var tftWidth = display.width(); +var tftHeight = display.height(); + +var request = { body: '' }; + +function drawWindow(title) { + display.fill(0); + var boxColor = 0xFFFF; + if (typeof BRUCE_PRICOLOR !== 'undefined') { + boxColor = BRUCE_PRICOLOR; + } + display.drawRoundRect(5, 5, tftWidth - 10, tftHeight - 10, 5, boxColor); + + display.setTextSize(2); + display.setTextAlign('center', 'top'); + + var safeTitle = title; + if (safeTitle.length > 15) safeTitle = safeTitle.substring(0, 15) + ".."; + display.drawText(safeTitle, tftWidth / 2, 5); + + display.setTextAlign('left', 'top'); + display.setTextSize(1); + display.drawText('Loading...', 20, 35); +} + +var textViewer = dialog.createTextViewer(request.body, { + fontSize: 1, + startX: 10, + startY: 25, + width: tftWidth - 20, + height: tftHeight - 35, + indentWrappedLines: true, +}); + +var history = []; + +// Egyszerű HTML tag eltávolító (hogy ne krix-kraxot láss) +function stripHtml(html) { + var tmp = html; + // Cseréljük a
és

jeleket új sorra + tmp = tmp.replace(//gi, "\n"); + tmp = tmp.replace(/<\/p>/gi, "\n\n"); + // Minden más <...> taget törlünk + tmp = tmp.replace(/<[^>]*>/g, ""); + // Üres sorok ritkítása + tmp = tmp.replace(/\n\s*\n/g, "\n"); + return tmp; +} + +function goToPage(url) { + var title = url; + if (title.indexOf('://') > -1) { + title = title.substring(title.indexOf('://') + 3); + } + + drawWindow(title); + textViewer.clear(); + textViewer.setText("Connecting direct...\n" + url); + textViewer.draw(); + + try { + // KÖZVETLEN LEKÉRÉS (Nincs W3C közvetítő) + console.log("Direct fetch: " + url); + + var response = wifi.httpFetch(url, { + method: 'GET', + headers: { "User-Agent": "curl/7.64.1" } // A 'curl' álcázás segít a wttr.in-nek + }); + + if (response && response.body) { + // Ha ez az időjárás oldal, nem kell tisztítani + if (url.indexOf("wttr.in") !== -1) { + request = { body: response.body }; + } else { + // Ha sima weboldal, leszedjük a HTML tageket + var cleanText = stripHtml(response.body); + request = { body: cleanText }; + } + } else { + request = { body: 'Error: Empty response.' }; + } + + } catch (e) { + var err = String(e); + request = { body: 'Direct Error: ' + err + '\n(Try http instead of https)' }; + } + + history.push(url); + textViewer.setText(request.body); + textViewer.draw(); +} + +var websites = [ + 'http://wttr.in/Budapest?format=3', // 1. EZT PRÓBÁLD! (Tiszta szöveg) + 'http://wttr.in/Budapest?0', // 2. Részletes időjárás + 'http://example.com', // 3. Egyszerű teszt oldal + 'http://info.cern.ch', // 4. Az első weboldal (nagyon egyszerű) +]; + +function selectWebsite() { + var websitesChoice = {}; + for (var index = 0; index < websites.length; index++) { + // Rövidítjük a nevet a menüben + var label = websites[index]; + if (label.indexOf("wttr.in") !== -1) label = "Idojaras (BP)"; + if (label.indexOf("example") !== -1) label = "Example.com"; + if (label.indexOf("cern") !== -1) label = "CERN Info"; + + websitesChoice[label] = websites[index]; + } + websitesChoice['Cancel'] = 'Cancel'; + websitesChoice['Quit'] = 'Quit'; + return dialog.choice(websitesChoice); +} + +// ... (A selectSection és main függvények ugyanazok maradtak, csak a main hívja a selectWebsite-ot) + +function selectSection() { + var websitesSections = {}; + var getMaxLines = textViewer.getMaxLines(); + var limit = getMaxLines > 50 ? 50 : getMaxLines; + + for (var index = 0; index < limit; index++) { + var lineText = textViewer.getLine(index); + if (lineText && lineText.length > 0 && lineText[0] !== ' ') { + var key = lineText; + if (key.length > 20) key = key.substring(0, 20) + ".."; + websitesSections[key] = String(index); + } + } + websitesSections['Cancel'] = 'Cancel'; + var choice = dialog.choice(websitesSections); + return choice === 'Cancel' ? -1 : parseInt(choice, 10); +} + +function main() { + var url = selectWebsite(); + if (url === 'Quit' || url === 'Cancel') return; + + goToPage(url); + + var redraw = true; + + while (true) { + if (keyboard.getSelPress()) { + // Egyszerűsített menü + var choice = dialog.choice(['Select Website', 'Quit', 'Cancel']); + + if (choice === 'Quit') break; + if (choice === 'Cancel') redraw = true; + if (choice === 'Select Website') { + var newUrl = selectWebsite(); + if (newUrl !== 'Cancel' && newUrl !== 'Quit') { + goToPage(newUrl); + } else if (newUrl === 'Quit') break; + else redraw = true; + } + } + + if (keyboard.getPrevPress()) { + textViewer.scrollUp(); + textViewer.draw(); + redraw = false; + } + if (keyboard.getNextPress()) { + textViewer.scrollDown(); + textViewer.draw(); + redraw = false; + } + + if (redraw) { + textViewer.draw(); + redraw = false; + } + + delay(100); + } +} + +main(); From 2a5b157bd3bf71d23b6a6c37b661564cef3d12ce Mon Sep 17 00:00:00 2001 From: vargatamasop Date: Wed, 10 Dec 2025 13:50:04 +0100 Subject: [PATCH 14/14] Add files via upload --- .../M5stickcplus2_arcade-games.js | 2340 +++++++++++++++++ .../M5stickcplus2_calculator.js | 398 +++ examples/M5Stick JS bruce/dino_game_M5.js | 508 ++++ .../M5Stick JS bruce/gifs/half_patrick.gif | Bin 0 -> 46951 bytes .../M5Stick JS bruce/gifs/half_rainbow.gif | Bin 0 -> 204895 bytes examples/M5Stick JS bruce/gifs/half_rick.gif | Bin 0 -> 87022 bytes .../M5Stick JS bruce/gifs/half_spongebob.gif | Bin 0 -> 59774 bytes examples/M5Stick JS bruce/gifs_M5.js | 83 + examples/M5Stick JS bruce/highway_racer_M5.js | 253 ++ examples/M5Stick JS bruce/space_shooter_M5.js | 315 +++ examples/M5Stick JS bruce/tamagochi_M5.js | 354 +++ 11 files changed, 4251 insertions(+) create mode 100644 examples/M5Stick JS bruce/M5stickcplus2_arcade-games.js create mode 100644 examples/M5Stick JS bruce/M5stickcplus2_calculator.js create mode 100644 examples/M5Stick JS bruce/dino_game_M5.js create mode 100644 examples/M5Stick JS bruce/gifs/half_patrick.gif create mode 100644 examples/M5Stick JS bruce/gifs/half_rainbow.gif create mode 100644 examples/M5Stick JS bruce/gifs/half_rick.gif create mode 100644 examples/M5Stick JS bruce/gifs/half_spongebob.gif create mode 100644 examples/M5Stick JS bruce/gifs_M5.js create mode 100644 examples/M5Stick JS bruce/highway_racer_M5.js create mode 100644 examples/M5Stick JS bruce/space_shooter_M5.js create mode 100644 examples/M5Stick JS bruce/tamagochi_M5.js diff --git a/examples/M5Stick JS bruce/M5stickcplus2_arcade-games.js b/examples/M5Stick JS bruce/M5stickcplus2_arcade-games.js new file mode 100644 index 0000000..9aeac8f --- /dev/null +++ b/examples/M5Stick JS bruce/M5stickcplus2_arcade-games.js @@ -0,0 +1,2340 @@ +var display = require('display'); +var keyboardApi = require('keyboard'); + +var fillScreen = display.fill; +var drawRect = display.drawRect; +var drawFillRect = display.drawFillRect; +var drawString = display.drawString; +var setTextColor = display.setTextColor; +var setTextSize = display.setTextSize; + +var getPrevPress = keyboardApi.getPrevPress; +var getSelPress = keyboardApi.getSelPress; +var getNextPress = keyboardApi.getNextPress; + +var WIDTH = 240 +var HEIGHT = 135; +var BLACK = 0; +var WHITE = 16777215; +var GREEN = 65280; +var BLUE = 255; +var YELLOW = 16776960; +var CYAN = 65535; +var MAGENTA = 16711935; +var ORANGE = 16753920; +var PURPLE = 8388736; +var DARKBLUE = 128; +var DARKRED = 8388608; +var LIGHTGREEN = 8453888; +var LIGHTBLUE = 10025880; +var GRAY = 8421504; +var GOLD = 16766720; +var BROWN = 10824234; +var RED = 255; +var STATE_MAIN_MENU = 0; +var STATE_BREAKOUT = 1; +var STATE_SNAKE = 2; +var STATE_SPACE_SHOOTER = 3; +var STATE_SLOTS = 4; +var STATE_FLAPPY_BIRD = 5; +var STATE_BLACKJACK = 6; +var STATE_PAUSED = 10; +var STATE_GAME_OVER = 11; +var STATE_LEVEL_UP = 12; +var STATE_EXIT_CONFIRM = 13; +var gameState = STATE_MAIN_MENU; +var prevGameState = -1; +var menuSelection = 0; +var pauseMenuSelection = 0; +var exitConfirmSelection = 0; +var staticDrawn = false; +var mainMenuStaticDrawn = false; +var pauseStaticDrawn = false; +var frameCounter = 0; +var menuLastSelState = false; +var mainMenuScroll = 0; +var MENU_VISIBLE_ITEMS = 5; +var menuOptions = ["BREAKOUT", "SNAKE", "SPACE SHOOTER", "SLOTS", "FLAPPY BIRD", "BLACKJACK", "QUIT"]; +function drawMainMenu() { + if (!mainMenuStaticDrawn || menuSelection !== menuLastSelection) { + fillScreen(BLACK); + setTextSize(3); + setTextColor(YELLOW); + drawString("ARCADE GAMES", 15, 15); + drawFillRect(10, 40, WIDTH - 20, HEIGHT - 50, BLACK); + drawRect(9, 39, WIDTH - 18, HEIGHT - 48, WHITE); + setTextSize(1); + setTextColor(WHITE); + if (menuSelection >= mainMenuScroll + MENU_VISIBLE_ITEMS) { + mainMenuScroll = menuSelection - MENU_VISIBLE_ITEMS + 1; + } else if (menuSelection < mainMenuScroll) { + mainMenuScroll = menuSelection; + } + var startY = 50; + var itemHeight = 15; + for (var i = 0; i < menuOptions.length; i++) { + if (i < mainMenuScroll || i >= mainMenuScroll + MENU_VISIBLE_ITEMS) continue; + var displayIdx = i - mainMenuScroll; + if (i === menuSelection) { + setTextColor(GREEN); + drawFillRect(55, startY + displayIdx * itemHeight - 2, 130, 15, GRAY); + drawString("> " + menuOptions[i], 60, startY + 4 + displayIdx * itemHeight); + } else { + setTextColor(WHITE); + drawString(" " + menuOptions[i], 60, startY + 4 + displayIdx * itemHeight); + } + } + if (mainMenuScroll > 0) { + setTextColor(YELLOW); + drawString("▲", WIDTH / 2 - 5, startY - 8); + } + if (mainMenuScroll + MENU_VISIBLE_ITEMS < menuOptions.length) { + setTextColor(YELLOW); + drawString("▼", WIDTH / 2 - 5, startY + MENU_VISIBLE_ITEMS * itemHeight + 8); + } + + setTextColor(CYAN); + drawString("Developed by msi", WIDTH - 95, HEIGHT - 10); + + mainMenuStaticDrawn = true; + menuLastSelection = menuSelection; + } +} +function drawPauseMenu() { + if (!pauseStaticDrawn || pauseMenuSelection !== menuLastSelection) { + fillScreen(BLACK); + setTextSize(2); + setTextColor(WHITE); + drawString("PAUSED", 80, 40); + var options = ["CONTINUE", "MAIN MENU", "QUIT"]; + setTextSize(1); + for (var i = 0; i < options.length; i++) { + if (i === pauseMenuSelection) { + setTextColor(YELLOW); + drawFillRect(70, 60 + i * 15, 100, 12, GRAY); + drawString("> " + options[i], 75, 65 + i * 15); + } else { + setTextColor(WHITE); + drawString(" " + options[i], 75, 65 + i * 15); + } + } + setTextColor(CYAN); + drawString("Developed by msi", WIDTH - 95, HEIGHT - 10); + pauseStaticDrawn = true; + menuLastSelection = pauseMenuSelection; + } +} +function drawGameOverMenu() { + if (!staticDrawn) { + fillScreen(BLACK); + setTextSize(2); + setTextColor(YELLOW); + drawString("GAME OVER", 65, 20); + setTextColor(WHITE); + setTextSize(1); + if (prevGameState === STATE_FLAPPY_BIRD) drawString("Score: " + flappyScore, 90, 47); + else if (prevGameState === STATE_SNAKE) drawString("Score: " + snakeScore, 90, 47); + else if (prevGameState === STATE_SPACE_SHOOTER) drawString("Score: " + spaceScore, 90, 47); + else if (prevGameState === STATE_BREAKOUT) drawString("Score: " + breakoutScore, 90, 47); + var options = ["RESTART", "MAIN MENU", "QUIT"]; + for (var i = 0; i < options.length; i++) { + if (i === pauseMenuSelection) { + setTextColor(YELLOW); + drawFillRect(70, 60 + i * 15, 100, 12, GRAY); + drawString("> " + options[i], 75, 65 + i * 15); + } else { + setTextColor(WHITE); + drawString(" " + options[i], 75, 65 + i * 15); + } + } + + setTextColor(CYAN); + drawString("Developed by msi", WIDTH - 95, HEIGHT - 10); + + staticDrawn = true; + } +} +function drawLevelUpMenu() { + if (!staticDrawn) { + fillScreen(BLACK); + setTextSize(2); + setTextColor(GREEN); + drawString("LEVEL UP", 75, 40); + var options = ["CONTINUE", "MAIN MENU", "QUIT"]; + setTextSize(1); + for (var i = 0; i < options.length; i++) { + if (i === pauseMenuSelection) { + setTextColor(YELLOW); + drawFillRect(70, 60 + i * 15, 100, 12, GRAY); + drawString("> " + options[i], 75, 65 + i * 15); + } else { + setTextColor(WHITE); + drawString(" " + options[i], 75, 65 + i * 15); + } + } + + setTextColor(CYAN); + drawString("Developed by msi", WIDTH - 95, HEIGHT - 10); + + staticDrawn = true; + } +} +function drawExitConfirm() { + fillScreen(BLACK); + setTextSize(2); + setTextColor(YELLOW); + drawString("EXIT?", 90, 40); + setTextSize(1); + var options = ["YES", "NO"]; + for (var i = 0; i < options.length; i++) { + if (i === exitConfirmSelection) { + setTextColor(GREEN); + var highlightWidth = 40; + var highlightHeight = 15; + drawFillRect(70 + i * 60, 80, highlightWidth, highlightHeight, GRAY); + drawString("> " + options[i], 75 + i * 60, 85); + } else { + setTextColor(WHITE); + drawString(" " + options[i], 75 + i * 60, 85); + } + } + + setTextColor(CYAN); + drawString("Developed by msi", WIDTH - 95, HEIGHT - 10); + + staticDrawn = true; +} +var PADDLE_WIDTH = 40; +var PADDLE_HEIGHT = 6; +var BALL_SIZE = 5; +var BRICK_WIDTH = 20; +var BRICK_HEIGHT = 10; +var BRICK_MARGIN = 2; +var BRICK_ROWS = 5; +var BRICK_COLS = 10; +var BRICK_COLORS = [YELLOW, ORANGE, YELLOW, GREEN, BLUE, PURPLE]; +var BREAKOUT_STATE_START = 0; +var BREAKOUT_STATE_PLAYING = 1; +var BREAKOUT_STATE_GAME_OVER = 2; +var BREAKOUT_STATE_WIN = 3; +var BREAKOUT_STATE_NEXT_LEVEL = 4; +var breakoutState = BREAKOUT_STATE_START; +var paddle = { x: WIDTH / 2 - PADDLE_WIDTH / 2, y: HEIGHT - 15, width: PADDLE_WIDTH, height: PADDLE_HEIGHT, speed: 12, color: WHITE, lastX: WIDTH / 2 - PADDLE_WIDTH / 2, lastY: HEIGHT - 15 }; +var ball = { x: WIDTH / 2, y: HEIGHT - 20 - BALL_SIZE, size: BALL_SIZE, speedX: 0, speedY: 0, color: WHITE, stuck: true, lastX: WIDTH / 2, lastY: HEIGHT - 20 - BALL_SIZE }; +var bricks = []; +var breakoutScore = 0; +var breakoutLives = 3; +var breakoutLevel = 1; +var breakoutStaticDrawn = false; +var breakoutLastStaticDrawnState = -1; +var breakoutSelPressCount = 0; +var breakoutSelPressWindowStart = -1; +var breakoutSelPressWindow = 400; +var breakoutSelPressThreshold = 4; +var breakoutLastSelState = false; +var breakoutIsPaused = false; +var breakoutPauseCooldown = 0; +var lastScoreDrawn = -1; +var lastLivesDrawn = -1; +function resetBreakout() { + paddle.x = WIDTH / 2 - PADDLE_WIDTH / 2; + ball.x = paddle.x + paddle.width / 2; + ball.y = paddle.y - ball.size; + ball.stuck = true; + resetBall(); + if (breakoutState === BREAKOUT_STATE_START || breakoutState === BREAKOUT_STATE_GAME_OVER) { + breakoutScore = 0; + breakoutLives = 3; + breakoutLevel = 1; + } + createBricks(); + breakoutState = BREAKOUT_STATE_PLAYING; + breakoutPauseCooldown = 0; + breakoutStaticDrawn = false; + breakoutLastStaticDrawnState = -1; +} +function resetBall() { + ball.speedX = (Math.random() * 2 - 1) * 2; + ball.speedY = -3; +} +function createBricks() { + bricks = []; + for (var i = 0; i < BRICK_ROWS; i++) { + for (var j = 0; j < BRICK_COLS; j++) { + var colorIndex = i % BRICK_COLORS.length; + var strength = 1; + if (Math.random() < 0.1 * breakoutLevel) strength = 2; + bricks.push({ x: j * (BRICK_WIDTH + BRICK_MARGIN) + 10, y: i * (BRICK_HEIGHT + BRICK_MARGIN) + 20, width: BRICK_WIDTH, height: BRICK_HEIGHT, color: BRICK_COLORS[colorIndex], strength: strength, hit: false, changed: true }); + } + } +} +function breakoutNextLevel() { + breakoutLevel++; + paddle.width = Math.max(PADDLE_WIDTH - (breakoutLevel - 1) * 3, 20); + resetBall(); + ball.stuck = true; + breakoutState = BREAKOUT_STATE_NEXT_LEVEL; + breakoutStaticDrawn = false; + breakoutLastStaticDrawnState = -1; + tone(700, 200); + tone(900, 200); +} +function drawBreakout() { + switch (breakoutState) { + case BREAKOUT_STATE_START: drawBreakoutStartScreen(); break; + case BREAKOUT_STATE_PLAYING: + if (!breakoutIsPaused) { + drawBreakoutPlayScreen(); + } + break; + case BREAKOUT_STATE_GAME_OVER: drawBreakoutGameOverScreen(); break; + case BREAKOUT_STATE_WIN: drawBreakoutWinScreen(); break; + case BREAKOUT_STATE_NEXT_LEVEL: drawBreakoutNextLevelScreen(); break; + } +} +function drawBreakoutStartScreen() { + if (!breakoutStaticDrawn || breakoutState !== breakoutLastStaticDrawnState) { + fillScreen(BLACK); + setTextSize(2); + setTextColor(YELLOW); + drawString("BREAKOUT", WIDTH / 2 - 48, 10); + setTextSize(1); + setTextColor(WHITE); + drawString("PREV: Go Left", WIDTH / 2 - 39, 45); + drawString("NEXT: Go Right", WIDTH / 2 - 42, 61); + drawString("M5 (Press): Release Ball", WIDTH / 2 - 69, 77); + drawString("M5 (Hold): Pause", WIDTH / 2 - 48, 93); + setTextColor(GREEN); + drawString("Press M5 to Begin", WIDTH / 2 - 51, 125); + breakoutStaticDrawn = true; + breakoutLastStaticDrawnState = breakoutState; + } +} +function drawBreakoutPlayScreen() { + if (!breakoutStaticDrawn || breakoutState !== breakoutLastStaticDrawnState || + breakoutScore !== lastScoreDrawn || breakoutLives !== lastLivesDrawn) { + if (breakoutScore !== lastScoreDrawn || breakoutLives !== lastLivesDrawn) { + drawFillRect(0, 0, WIDTH, 20, BLACK); + setTextSize(1); + setTextColor(WHITE); + drawString("Score: " + breakoutScore, 10, 5); + drawString("Level: " + breakoutLevel, 100, 5); + drawString("Lives:", 180, 5); + for (var i = 0; i < breakoutLives; i++) drawFillRect(215 + i * 8, 5, 5, 5, GREEN); + lastScoreDrawn = breakoutScore; + lastLivesDrawn = breakoutLives; + } else { + fillScreen(BLACK); + setTextSize(1); + setTextColor(WHITE); + drawString("Score: " + breakoutScore, 10, 5); + drawString("Level: " + breakoutLevel, 100, 5); + drawString("Lives:", 180, 5); + for (var i = 0; i < breakoutLives; i++) drawFillRect(215 + i * 8, 5, 5, 5, GREEN); + for (var i = 0; i < bricks.length; i++) { + if (!bricks[i].hit) { + drawFillRect(bricks[i].x, bricks[i].y, bricks[i].width, bricks[i].height, bricks[i].color); + if (bricks[i].strength > 1) drawRect(bricks[i].x + 2, bricks[i].y + 2, bricks[i].width - 4, bricks[i].height - 4, WHITE); + } + } + breakoutStaticDrawn = true; + } + breakoutLastStaticDrawnState = breakoutState; + } + for (var i = 0; i < bricks.length; i++) { + if (bricks[i].hit && bricks[i].changed) { + drawFillRect(bricks[i].x, bricks[i].y, BRICK_WIDTH, BRICK_HEIGHT, BLACK); + bricks[i].changed = false; + } + } + drawFillRect(paddle.lastX, paddle.lastY, paddle.width, paddle.height, BLACK); + drawFillRect(paddle.x, paddle.y, paddle.width, paddle.height, paddle.color); + paddle.lastX = paddle.x; + paddle.lastY = paddle.y; + + drawFillRect(ball.lastX - ball.size / 2, ball.lastY - ball.size / 2, ball.size, ball.size, BLACK); + if (ball.y - ball.size / 2 < 20) ball.y = 20 + ball.size / 2; + drawFillRect(ball.x - ball.size / 2, ball.y - ball.size / 2, ball.size, ball.size, ball.color); + ball.lastX = ball.x; + ball.lastY = ball.y; +} +function drawBreakoutGameOverScreen() { + if (!breakoutStaticDrawn || breakoutState !== breakoutLastStaticDrawnState) { + fillScreen(BLACK); + setTextSize(2); + setTextColor(WHITE); + drawString("GAME OVER", WIDTH / 2 - 54, 40); + setTextSize(1); + setTextColor(WHITE); + drawString("Score: " + breakoutScore, WIDTH / 2 - 24, 80); + setTextColor(YELLOW); + drawString("M5 to Play Again", 72, 100); + drawString("PREV to Menu", 84, 115); + breakoutStaticDrawn = true; + breakoutLastStaticDrawnState = breakoutState; + tone(400, 300); + tone(300, 300); + } +} +function drawBreakoutWinScreen() { + if (!breakoutStaticDrawn || breakoutState !== breakoutLastStaticDrawnState) { + fillScreen(BLACK); + setTextSize(2); + setTextColor(GREEN); + drawString("YOU WIN!", WIDTH / 2 - 48, 40); + setTextSize(1); + setTextColor(WHITE); + drawString("Score: " + breakoutScore, WIDTH / 2 - 24, 80); + setTextColor(YELLOW); + drawString("M5 to Play Again", WIDTH / 2 - 66, 100); + drawString("PREV to Menu", WIDTH / 2 - 30, 115); + breakoutStaticDrawn = true; + breakoutLastStaticDrawnState = breakoutState; + tone(800, 200); + tone(1000, 200); + } +} +function drawBreakoutNextLevelScreen() { + if (!breakoutStaticDrawn || breakoutState !== breakoutLastStaticDrawnState) { + fillScreen(BLACK); + setTextSize(2); + setTextColor(GREEN); + drawString("LEVEL UP!", WIDTH / 2 - 48, 40); + setTextSize(1); + setTextColor(WHITE); + drawString("Score: " + breakoutScore, WIDTH / 2 - 24, 80); + setTextColor(YELLOW); + drawString("M5 to Continue", WIDTH / 2 - 66, 100); + breakoutStaticDrawn = true; + breakoutLastStaticDrawnState = breakoutState; + } +} +function updateBreakout() { + if (breakoutState !== BREAKOUT_STATE_PLAYING || breakoutIsPaused) return; + if (getPrevPress()) paddle.x -= paddle.speed; + else if (getNextPress()) paddle.x += paddle.speed; + if (paddle.x < 0) paddle.x = 0; + if (paddle.x + paddle.width > WIDTH) paddle.x = WIDTH - paddle.width; + if (ball.stuck) { + ball.x = paddle.x + paddle.width / 2; + ball.y = paddle.y - ball.size; + return; + } + ball.x += ball.speedX; + ball.y += ball.speedY; + if (ball.x - ball.size / 2 < 0 || ball.x + ball.size / 2 > WIDTH) { + ball.speedX = -ball.speedX; + tone(500, 100); + } + if (ball.y - ball.size / 2 < 0) { + ball.speedY = -ball.speedY; + tone(500, 100); + } + if (ball.y - ball.size / 2 < 20) { + ball.y = 20 + ball.size / 2; + ball.speedY = Math.abs(ball.speedY); + tone(500, 100); + } + if (ball.y + ball.size / 2 > HEIGHT) { + breakoutLives--; + tone(200, 300); + if (breakoutLives <= 0) breakoutState = BREAKOUT_STATE_GAME_OVER; + else ball.stuck = true; + return; + } + if (ball.y + ball.size / 2 > paddle.y - 2 && ball.y - ball.size / 2 < paddle.y + paddle.height && ball.x + ball.size / 2 > paddle.x && ball.x - ball.size / 2 < paddle.x + paddle.width) { + var hitPos = (ball.x - (paddle.x + paddle.width / 2)) / (paddle.width / 2); + ball.speedX = hitPos * 4; + ball.speedY = -Math.abs(ball.speedY) * 1.05; + tone(600, 150); + } + for (var i = 0; i < bricks.length; i++) { + if (!bricks[i].hit && ball.x + ball.size / 2 > bricks[i].x && ball.x - ball.size / 2 < bricks[i].x + bricks[i].width && ball.y + ball.size / 2 > bricks[i].y && ball.y - ball.size / 2 < bricks[i].y + bricks[i].height) { + bricks[i].strength--; + bricks[i].changed = true; + if (bricks[i].strength <= 0) { + bricks[i].hit = true; + breakoutScore += 10 * breakoutLevel; + tone(700, 100); + } else { + breakoutScore += 5; + tone(650, 100); + } + var overlapLeft = ball.x + ball.size / 2 - bricks[i].x; + var overlapRight = bricks[i].x + bricks[i].width - (ball.x - ball.size / 2); + var overlapTop = ball.y + ball.size / 2 - bricks[i].y; + var overlapBottom = bricks[i].y + bricks[i].height - (ball.y - ball.size / 2); + var minOverlap = Math.min(overlapLeft, overlapRight, overlapTop, overlapBottom); + if (minOverlap === overlapLeft || minOverlap === overlapRight) ball.speedX = -ball.speedX; + else ball.speedY = -ball.speedY; + break; + } + } + var remainingBricks = 0; + for (var i = 0; i < bricks.length; i++) if (!bricks[i].hit) remainingBricks++; + if (remainingBricks === 0) { + if (breakoutLevel < 5) breakoutNextLevel(); + else breakoutState = BREAKOUT_STATE_WIN; + } +} +var GRID_SIZE = 10; +var HUD_HEIGHT = 20; +var COLS = Math.floor(WIDTH / GRID_SIZE); +var ROWS = Math.floor((HEIGHT - HUD_HEIGHT) / GRID_SIZE); +var cApple = 10079232; +var SNAKE_STATE_MENU = 0; +var SNAKE_STATE_GAME = 1; +var SNAKE_STATE_PAUSED = 2; +var SNAKE_STATE_GAME_OVER = 3; +var snakeState = SNAKE_STATE_MENU; +var snake = []; +var direction = 0; +var nextDirection = 0; +var food = { x: 8, y: 4 }; +var snakeScore = 0; +var snakeHighScore = 0; +var snakeFrameCounter = 0; +var snakeSpeed = 10; +var snakeSpeedIncrease = true; +var snakeStaticDrawn = false; +var snakeLastStaticDrawnState = -1; +var snakeLastSelState = false; +var snakeTotalDelay = 300; +var snakeDelayTime = snakeTotalDelay; +var snakeCanMove = true; +var snakeTime = now(); +var snakePrevTime = now(); +var snakeErasePos = null; +var snakeLastScore = -1; +var snakeLastHighScore = -1; +var snakeForceHudRedraw = false; +function resetSnake() { + snake = [ + { x: 4, y: 4 }, + { x: 3, y: 4 }, + { x: 2, y: 4 }, + { x: 1, y: 4 } + ]; + direction = 3; + nextDirection = 3; + snakeScore = 0; + snakeFrameCounter = 0; + placeFood(); + snakeState = SNAKE_STATE_GAME; + snakeStaticDrawn = false; + snakeLastStaticDrawnState = -1; + snakeDelayTime = snakeTotalDelay; + snakeErasePos = null; + snakeLastScore = -1; + snakeLastHighScore = -1; + snakeForceHudRedraw = true; +} +function placeFood() { + var validPos = false; + var maxAttempts = 100; + var attempts = 0; + + + var minX = 1; + var maxX = COLS - 2; + var minY = 1; + var maxY = ROWS - 2; + + while (!validPos && attempts < maxAttempts) { + attempts++; + var newX = Math.floor(Math.random() * (maxX - minX)) + minX; + var newY = Math.floor(Math.random() * (maxY - minY)) + minY; + + validPos = true; + + + for (var i = 0; i < snake.length; i++) { + if (snake[i].x === newX && snake[i].y === newY) { + validPos = false; + break; + } + } + + if (validPos) { + food.x = newX; + food.y = newY; + break; + } + } + + + if (!validPos) { + food.x = 10; + food.y = 10; + } +} +function drawSnake() { + switch (snakeState) { + case SNAKE_STATE_MENU: + drawSnakeMenu(); + break; + case SNAKE_STATE_GAME: + if (!snakeStaticDrawn || snakeState !== snakeLastStaticDrawnState) { + fillScreen(BLACK); + snakeStaticDrawn = true; + snakeLastStaticDrawnState = snakeState; + snakeForceHudRedraw = true; + } + + if (snakeErasePos) { + drawFillRect(snakeErasePos.x * GRID_SIZE, snakeErasePos.y * GRID_SIZE + HUD_HEIGHT, GRID_SIZE, GRID_SIZE, BLACK); + snakeErasePos = null; + } + + if (snake.length > 0) { + drawFillRect(snake[0].x * GRID_SIZE, snake[0].y * GRID_SIZE + HUD_HEIGHT, GRID_SIZE, GRID_SIZE, YELLOW); + for (var i = 1; i < snake.length; i++) { + drawFillRect(snake[i].x * GRID_SIZE, snake[i].y * GRID_SIZE + HUD_HEIGHT, GRID_SIZE, GRID_SIZE, GREEN); + } + } + + drawFillRect(food.x * GRID_SIZE, food.y * GRID_SIZE + HUD_HEIGHT, GRID_SIZE, GRID_SIZE, cApple); + + if (snakeScore !== snakeLastScore || snakeHighScore !== snakeLastHighScore || snakeForceHudRedraw) { + drawSnakeScore(); + snakeLastScore = snakeScore; + snakeLastHighScore = snakeHighScore; + snakeForceHudRedraw = false; + } + break; + case SNAKE_STATE_PAUSED: + break; + case SNAKE_STATE_GAME_OVER: + break; + } +} +function drawSnakeMenu() { + if (!snakeStaticDrawn || snakeState !== snakeLastStaticDrawnState) { + fillScreen(BLACK); + setTextSize(3); + setTextColor(GREEN); + drawString("SNAKE", 75, 10); + setTextSize(1); + setTextColor(WHITE); + drawString("PRESS M5 TO START", 66, 55); + drawString("PREV: TURN LEFT", 75, 80); + drawString("NEXT: TURN RIGHT", 72, 95); + drawString("M5: PAUSE", 90, 110); + snakeStaticDrawn = true; + snakeLastStaticDrawnState = snakeState; + } +} +function drawSnakeScore() { + drawFillRect(0, 0, WIDTH, HUD_HEIGHT, BLACK); + setTextSize(1); + setTextColor(WHITE); + drawString("SCORE: " + snakeScore, 5, 5); + drawString("HIGH SCORE: " + snakeHighScore, 150, 5); +} +function updateSnakeDelayTime() { + var timePassed = snakeTime - snakePrevTime; + if (timePassed == 0) { + snakeTime = now(); + return; + } + snakePrevTime = snakeTime; + snakeTime = now(); + snakeDelayTime -= timePassed; +} +function updateSnake() { + if (snakeState !== SNAKE_STATE_GAME || snake.length === 0) return; + updateSnakeDelayTime(); + if (snakeDelayTime < 0) { + snakeCanMove = true; + + var newHeadX = snake[0].x; + var newHeadY = snake[0].y; + + switch (direction) { + case 0: newHeadY -= 1; break; + case 1: newHeadY += 1; break; + case 2: newHeadX -= 1; break; + case 3: newHeadX += 1; break; + } + + if (newHeadX < 0 || newHeadX >= COLS || newHeadY < 0 || newHeadY >= ROWS) { + snakeGameOver(); + return; + } + + for (var i = 0; i < snake.length; i++) { + if (newHeadX === snake[i].x && newHeadY === snake[i].y) { + snakeGameOver(); + return; + } + } + + snake.unshift({ x: newHeadX, y: newHeadY }); + + if (newHeadX === food.x && newHeadY === food.y) { + snakeScore += 10; + if (snakeScore > snakeHighScore) snakeHighScore = snakeScore; + + placeFood(); + + tone(600, 150); + } else { + var tail = snake.pop(); + snakeErasePos = { x: tail.x, y: tail.y }; + } + + direction = nextDirection; + snakeDelayTime = snakeTotalDelay; + } +} +function snakeGameOver() { + snakeState = SNAKE_STATE_GAME_OVER; + gameState = STATE_GAME_OVER; + prevGameState = STATE_SNAKE; + staticDrawn = false; + snakeStaticDrawn = false; + if (snakeScore > snakeHighScore) snakeHighScore = snakeScore; +} +var PLAYER_SIZE = 16; +var ENEMY_SIZE = 14; +var BULLET_SIZE = 5; +var POWERUP_SIZE = 10; +var EXPLOSION_MAX_SIZE = 22; +var SPACE_STATE_MENU = 0; +var SPACE_STATE_GAME = 1; +var SPACE_STATE_GAME_OVER = 2; +var SPACE_STATE_LEVEL_UP = 3; +var spaceState = SPACE_STATE_MENU; +var player = { x: WIDTH / 2, y: HEIGHT - 25, width: PLAYER_SIZE, height: PLAYER_SIZE, speed: 10, lives: 3, weaponLevel: 1, weaponTime: 0, invincible: false, invincibleTime: 0, lastX: WIDTH / 2, lastY: HEIGHT - 25 }; +var bullets = []; +var enemies = []; +var enemyBullets = []; +var explosions = []; +var stars = []; +var powerups = []; +var spaceScore = 0; +var spaceHighScore = 0; +var spaceLevel = 1; +var spaceFrameCounter = 0; +var enemySpawnRate = 50; +var enemyShootRate = 100; +var bossActive = false; +var boss = null; +var killCount = 0; +var levelUpThreshold = 20; +var fireRate = 6; +var lastFireTime = 0; +var spaceLastSelState = false; +var spaceIsPaused = false; +var spaceStaticDrawn = false; +var spaceLastStaticDrawnState = -1; +function resetSpaceShooter() { + player.x = WIDTH / 2; + player.y = HEIGHT - 25; + player.lastX = player.x; + player.lastY = player.y; + player.lives = 3; + player.weaponLevel = 1; + player.weaponTime = 0; + player.invincible = false; + player.invincibleTime = 0; + bullets = []; + enemies = []; + enemyBullets = []; + explosions = []; + powerups = []; + boss = null; + spaceScore = 0; + spaceLevel = 1; + spaceFrameCounter = 0; + enemySpawnRate = 50; + enemyShootRate = 100; + bossActive = false; + killCount = 0; + lastFireTime = 0; + spaceLastSelState = false; + spaceIsPaused = false; + createStars(); + spaceState = SPACE_STATE_GAME; + spaceStaticDrawn = false; + spaceLastStaticDrawnState = -1; +} +function createStars() { + stars = []; + for (var i = 0; i < 60; i++) stars.push({ x: Math.random() * WIDTH, y: Math.random() * HEIGHT, size: Math.random() * 2.5 + 1, speed: Math.random() * 0.8 + 0.3, lastX: 0, lastY: 0 }); +} +function updateStars() { + for (var i = 0; i < stars.length; i++) { + var star = stars[i]; + star.y += star.speed * 0.1; + if (star.y > HEIGHT) star.y -= HEIGHT; + } +} +function drawStars() { + for (var i = 0; i < stars.length; i++) { + var star = stars[i]; + drawFillRect(star.lastX - 1, star.lastY - 1, star.size + 2, star.size + 2, BLACK); + var brightness = (spaceFrameCounter + i * 10) % 100; + var color = brightness < 50 ? WHITE : CYAN; + if (i % 7 === 0) color = YELLOW; + if (i % 11 === 0) color = MAGENTA; + drawFillRect(star.x, star.y, star.size, star.size, color); + star.lastX = star.x; + star.lastY = star.y; + } +} +function drawSpaceShooter() { + switch (spaceState) { + case SPACE_STATE_MENU: drawSpaceMenu(); break; + case SPACE_STATE_GAME: + if (!spaceIsPaused) drawSpaceGameplay(); + break; + case SPACE_STATE_GAME_OVER: break; + case SPACE_STATE_LEVEL_UP: break; + } +} +function drawSpaceMenu() { + if (!spaceStaticDrawn || spaceState !== spaceLastStaticDrawnState) { + fillScreen(BLACK); + setTextSize(3); + setTextColor(CYAN); + drawString("SPACE", 75, 15); + setTextColor(ORANGE); + drawString("SHOOTER", 60, 40); + setTextSize(1); + setTextColor(WHITE); + drawString("PREV: GO LEFT", 10, 100); + drawString("NEXT: GO RIGHT", 140, 100); + drawString("M5: PAUSE", 105, 120); + if (spaceFrameCounter % 30 < 20) { + setTextColor(WHITE); + drawString("PRESS M5 TO START", 70, 75); + } + spaceStaticDrawn = true; + spaceLastStaticDrawnState = spaceState; + } +} +function drawSpaceGameplay() { + if (!spaceStaticDrawn || spaceState !== spaceLastStaticDrawnState) { + fillScreen(BLACK); + spaceStaticDrawn = true; + spaceLastStaticDrawnState = spaceState; + } + if (spaceFrameCounter % 10 === 0) { + updateStars(); + drawStars(); + } + drawEnemies(); + drawBullets(); + drawEnemyBullets(); + drawExplosions(); + drawPowerups(); + if (player.x !== player.lastX || player.y !== player.lastY) { + drawFillRect(player.lastX - player.width/2 - 6, player.lastY - 5, player.width + 12, player.height + 15, BLACK); + player.lastX = player.x; + player.lastY = player.y; + } + drawPlayer(player.x, player.y, player.weaponLevel); + drawSpaceHUD(); +} +function drawPlayer(x, y, weaponLevel) { + drawFillRect(x - player.width/2, y, player.width, player.height, BLUE); + drawFillRect(x - player.width/2 + 3, y + 3, player.width - 6, player.height - 8, CYAN); + drawFillRect(x - 4, y - 5, 8, 5, WHITE); + if (spaceFrameCounter % 6 < 3) { + drawFillRect(x - 6, y + player.height, 12, 4, YELLOW); + drawFillRect(x - 4, y + player.height + 4, 8, 3, YELLOW); + } else { + drawFillRect(x - 5, y + player.height, 10, 5, YELLOW); + drawFillRect(x - 3, y + player.height + 3, 6, 2, YELLOW); + } + if (weaponLevel > 1) { + drawFillRect(x - player.width/2 - 4, y + 3, 4, 4, YELLOW); + drawFillRect(x + player.width/2, y + 3, 4, 4, YELLOW); + drawFillRect(x - player.width/2 - 2, y + 5, 2, 6, YELLOW); + drawFillRect(x + player.width/2 + 1, y + 5, 2, 6, YELLOW); + } + if (weaponLevel > 2) { + drawFillRect(x - player.width/2 - 4, y + 10, 4, 4, YELLOW); + drawFillRect(x + player.width/2, y + 10, 4, 4, YELLOW); + } + if (player.invincible && spaceFrameCounter % 6 < 3) drawRect(x - player.width/2 - 2, y - 2, player.width + 4, player.height + 4, WHITE); +} +function drawEnemies() { + for (var i = 0; i < enemies.length; i++) { + var enemy = enemies[i]; + if (enemy && enemy.active) { + drawFillRect(enemy.lastX - 5, enemy.lastY - 5, enemy.width + 10, enemy.height + 10, BLACK); + drawFillRect(enemy.x, enemy.y, enemy.width, enemy.height, enemy.type.color); + enemy.lastX = enemy.x; + enemy.lastY = enemy.y; + } + } + if (bossActive && boss) { + drawFillRect(boss.lastX - 5, boss.lastY - 5, boss.width + 10, boss.height + 10, BLACK); + drawFillRect(boss.x, boss.y, boss.width, boss.height, MAGENTA); + boss.lastX = boss.x; + boss.lastY = boss.y; + } +} +function drawBullets() { + for (var i = 0; i < bullets.length; i++) { + var bullet = bullets[i]; + if (bullet && bullet.active) { + if (!bullet.lastX) bullet.lastX = bullet.x; + if (!bullet.lastY) bullet.lastY = bullet.y; + if (bullet.x !== bullet.lastX || bullet.y !== bullet.lastY) { + drawFillRect(bullet.lastX - bullet.width / 2, bullet.lastY, bullet.width, bullet.height + 2, BLACK); + drawFillRect(bullet.x - bullet.width / 2, bullet.y, bullet.width, bullet.height, GREEN); + bullet.lastX = bullet.x; + bullet.lastY = bullet.y; + } + } + } +} +function drawEnemyBullets() { + for (var i = 0; i < enemyBullets.length; i++) { + var bullet = enemyBullets[i]; + if (bullet && bullet.active) { + if (!bullet.lastX) bullet.lastX = bullet.x; + if (!bullet.lastY) bullet.lastY = bullet.y; + if (bullet.x !== bullet.lastX || bullet.y !== bullet.lastY) { + drawFillRect(bullet.lastX - bullet.width / 2, bullet.lastY, bullet.width, bullet.height, BLACK); + drawFillRect(bullet.x - bullet.width / 2, bullet.y, bullet.width, bullet.height, YELLOW); + bullet.lastX = bullet.x; + bullet.lastY = bullet.y; + } + } + } +} +function drawExplosions() { + for (var i = 0; i < explosions.length; i++) { + var explosion = explosions[i]; + if (explosion && explosion.active) drawFillRect(explosion.x - explosion.size / 2, explosion.y - explosion.size / 2, explosion.size, explosion.size, YELLOW); + } +} +function drawPowerups() { + for (var i = 0; i < powerups.length; i++) { + var powerup = powerups[i]; + if (powerup && powerup.active) { + if (!powerup.lastX) powerup.lastX = powerup.x; + if (!powerup.lastY) powerup.lastY = powerup.y; + if (powerup.x !== powerup.lastX || powerup.y !== powerup.lastY) { + drawFillRect(powerup.lastX - powerup.width / 2 - 2, powerup.lastY - 2, powerup.width + 4, powerup.height + 4, BLACK); + drawFillRect(powerup.x - powerup.width / 2, powerup.y, powerup.width, powerup.height, powerup.type.color); + powerup.lastX = powerup.x; + powerup.lastY = powerup.y; + } + } + } +} +function drawSpaceHUD() { + drawFillRect(0, 0, WIDTH, 10, BLACK); + setTextSize(1); + setTextColor(WHITE); + drawString("SCORE: " + spaceScore, 5, 5); + drawString("LEVEL: " + spaceLevel, 100, 5); + drawString("LIVES: " + player.lives, 180, 5); +} +function updateSpaceShooter() { + if (spaceState !== SPACE_STATE_GAME || spaceIsPaused) return; + spaceFrameCounter++; + if (spaceFrameCounter - lastFireTime >= fireRate) { + fireBullet(); + lastFireTime = spaceFrameCounter; + } + updateBullets(); + updateEnemies(); + updateEnemyBullets(); + updateExplosions(); + updatePowerups(); + checkCollisions(); + checkLevelProgress(); +} +function updateBullets() { + for (var i = 0; i < bullets.length; i++) { + if (bullets[i] && bullets[i].active) { + bullets[i].y -= bullets[i].speed; + if (bullets[i].y + bullets[i].height < 0) bullets[i].active = false; + } + } +} +function updateEnemies() { + if (spaceFrameCounter % enemySpawnRate === 0 && !bossActive) spawnEnemy(); + for (var i = 0; i < enemies.length; i++) { + if (enemies[i] && enemies[i].active) { + enemies[i].y += enemies[i].type.speed; + if (enemies[i].y > HEIGHT) { + drawFillRect(enemies[i].lastX - 5, enemies[i].lastY - 5, enemies[i].width + 10, enemies[i].height + 10, BLACK); + enemies[i].active = false; + } + if (enemies[i].type.shootRate > 0 && spaceFrameCounter % enemies[i].type.shootRate === 0) spawnEnemyBullet(enemies[i].x + enemies[i].width / 2, enemies[i].y + enemies[i].height); + } + } + if (bossActive && boss) { + boss.y += boss.speed; + if (boss.y + boss.height > HEIGHT) { + boss.y = HEIGHT - boss.height; + boss.speed = -1.5; + } else if (boss.y < 0) { + boss.y = 0; + boss.speed = 1.5; + } + if (spaceFrameCounter % 50 === 0) spawnEnemyBullet(boss.x + boss.width / 2, boss.y + boss.height); + } +} +function updateEnemyBullets() { + for (var i = 0; i < enemyBullets.length; i++) { + if (enemyBullets[i] && enemyBullets[i].active) { + enemyBullets[i].y += enemyBullets[i].speed; + if (enemyBullets[i].y > HEIGHT) enemyBullets[i].active = false; + } + } +} +function updateExplosions() { + for (var i = 0; i < explosions.length; i++) { + if (explosions[i] && explosions[i].active && explosions[i].life > 0) { + explosions[i].life--; + if (explosions[i].life <= 0) { + explosions[i].active = false; + drawFillRect(explosions[i].x - explosions[i].size / 2, explosions[i].y - explosions[i].size / 2, explosions[i].size, explosions[i].size, BLACK); + } + } + } +} +function updatePowerups() { + for (var i = 0; i < powerups.length; i++) { + if (powerups[i] && powerups[i].active) { + powerups[i].y += 1; + if (powerups[i].y > HEIGHT) powerups[i].active = false; + } + } +} +var enemyTypes = [ + { color: BLUE, detailColor: PURPLE, health: 1, speed: 1.2, points: 10, shootRate: 0, shape: "triangle" }, + { color: LIGHTGREEN, detailColor: DARKBLUE, health: 2, speed: 1.8, points: 20, shootRate: 100, shape: "square" }, + { color: ORANGE, detailColor: MAGENTA, health: 1, speed: 2.5, points: 15, shootRate: 0, shape: "diamond" }, + { color: BLUE, detailColor: YELLOW, health: 3, speed: 0.9, points: 30, shootRate: 70, shape: "circle" } +]; +var powerupTypes = [ + { type: "health", color: WHITE }, + { type: "weapon", color: YELLOW } +]; +function spawnEnemy() { + var type = enemyTypes[Math.floor(Math.random() * enemyTypes.length)]; + enemies.push({ x: Math.random() * (WIDTH - ENEMY_SIZE), y: 0, width: ENEMY_SIZE, height: ENEMY_SIZE, type: type, active: true, lastX: 0, lastY: 0 }); +} +function spawnEnemyBullet(x, y) { + enemyBullets.push({ x: x, y: y, width: BULLET_SIZE, height: BULLET_SIZE, speed: 3, active: true, lastX: 0, lastY: 0 }); +} +function spawnBoss() { + var bossWidth = Math.min(28 + (spaceLevel - 1) * 4, 56); + var bossHeight = Math.min(28 + (spaceLevel - 1) * 4, 56); + boss = { x: WIDTH / 2 - bossWidth / 2, y: -bossHeight, width: bossWidth, height: bossHeight, health: 25 * spaceLevel, active: true, speed: 1.5, lastX: WIDTH / 2 - bossWidth / 2, lastY: -bossHeight }; + bossActive = true; +} +function spawnPowerup(x, y) { + if (powerups.length < 5 && Math.random() < 0.1) { + var type = powerupTypes[Math.floor(Math.random() * powerupTypes.length)]; + powerups.push({ x: x, y: y, width: POWERUP_SIZE, height: POWERUP_SIZE, type: type, active: true, lastX: x, lastY: y }); + } +} +function fireBullet() { + bullets.push({ x: player.x, y: player.y - player.height / 2, width: BULLET_SIZE, height: BULLET_SIZE, speed: 5, active: true, lastX: player.x, lastY: player.y - player.height / 2 }); +} +function checkCollisions() { + for (var i = 0; i < bullets.length; i++) { + if (!bullets[i] || !bullets[i].active) continue; + var bullet = bullets[i]; + for (var j = 0; j < enemies.length; j++) { + if (!enemies[j] || !enemies[j].active) continue; + var enemy = enemies[j]; + if (checkCollision(bullet.x - bullet.width/2, bullet.y - bullet.height/2, bullet.width, bullet.height, enemy.x, enemy.y, enemy.width, enemy.height)) { + bullet.active = false; + drawFillRect(bullet.lastX - bullet.width / 2, bullet.lastY, bullet.width, bullet.height + 2, BLACK); + enemy.active = false; + drawFillRect(enemy.lastX - 5, enemy.lastY - 5, enemy.width + 10, enemy.height + 10, BLACK); + spaceScore += enemy.type.points; + killCount++; + createExplosion(enemy.x + enemy.width/2, enemy.y + enemy.height/2); + spawnPowerup(enemy.x, enemy.y); + } + } + if (bossActive && boss && checkCollision(bullet.x - bullet.width/2, bullet.y - bullet.height/2, bullet.width, bullet.height, boss.x, boss.y, boss.width, boss.height)) { + bullet.active = false; + drawFillRect(bullet.lastX - bullet.width / 2, bullet.lastY, bullet.width, bullet.height + 2, BLACK); + boss.health--; + if (boss.health <= 0) { + bossActive = false; + spaceScore += 500; + killCount += 5; + createExplosion(boss.x + boss.width/2, boss.y + boss.height/2); + spaceLevelUp(); + } + } + } + if (!player.invincible) { + for (var j = 0; j < enemies.length; j++) { + if (!enemies[j] || !enemies[j].active) continue; + var enemy = enemies[j]; + if (checkCollision(player.x - player.width/2, player.y, player.width, player.height, enemy.x, enemy.y, enemy.width, enemy.height)) { + enemy.active = false; + drawFillRect(enemy.lastX - 5, enemy.lastY - 5, enemy.width + 10, enemy.height + 10, BLACK); + player.lives--; + createExplosion(player.x, player.y + player.height, true); + player.invincible = true; + player.invincibleTime = 60; + tone(500, 200); + if (player.lives <= 0) { + spaceState = SPACE_STATE_GAME_OVER; + gameState = STATE_GAME_OVER; + prevGameState = STATE_SPACE_SHOOTER; + staticDrawn = false; + if (spaceScore > spaceHighScore) spaceHighScore = spaceScore; + spaceStaticDrawn = false; + } + break; + } + } + for (var j = 0; j < enemyBullets.length; j++) { + if (!enemyBullets[j] || !enemyBullets[j].active) continue; + var bullet = enemyBullets[j]; + if (checkCollision(player.x - player.width/2, player.y, player.width, player.height, bullet.x - bullet.width/2, bullet.y, bullet.width, bullet.height)) { + bullet.active = false; + player.lives--; + createExplosion(player.x, player.y + player.height, true); + player.invincible = true; + player.invincibleTime = 60; + tone(500, 200); + if (player.lives <= 0) { + spaceState = SPACE_STATE_GAME_OVER; + gameState = STATE_GAME_OVER; + prevGameState = STATE_SPACE_SHOOTER; + staticDrawn = false; + if (spaceScore > spaceHighScore) spaceHighScore = spaceScore; + spaceStaticDrawn = false; + } + break; + } + } + if (bossActive && boss && checkCollision(player.x - player.width/2, player.y, player.width, player.height, boss.x, boss.y, boss.width, boss.height)) { + player.lives--; + createExplosion(player.x, player.y + player.height, true); + player.invincible = true; + player.invincibleTime = 60; + tone(500, 200); + if (player.lives <= 0) { + spaceState = SPACE_STATE_GAME_OVER; + gameState = STATE_GAME_OVER; + prevGameState = STATE_SPACE_SHOOTER; + staticDrawn = false; + if (spaceScore > spaceHighScore) spaceHighScore = spaceScore; + spaceStaticDrawn = false; + } + } + } + for (var i = 0; i < powerups.length; i++) { + if (!powerups[i] || !powerups[i].active) continue; + var powerup = powerups[i]; + if (checkCollision(player.x - player.width/2, player.y, player.width, player.height, powerup.x - powerup.width/2, powerup.y, powerup.width, powerup.height)) { + powerup.active = false; + drawFillRect(powerup.lastX - powerup.width / 2 - 2, powerup.lastY - 2, powerup.width + 4, powerup.height + 4, BLACK); + if (powerup.type.type === "health" && player.lives < 3) player.lives++; + else if (powerup.type.type === "weapon" && player.weaponLevel < 3) { + player.weaponLevel++; + player.weaponTime = 300; + } + } + } + if (player.invincible) { + player.invincibleTime--; + if (player.invincibleTime <= 0) player.invincible = false; + } + if (player.weaponTime > 0) { + player.weaponTime--; + if (player.weaponTime <= 0) player.weaponLevel = 1; + } +} +function checkLevelProgress() { + if (!bossActive && killCount >= levelUpThreshold) spawnBoss(); +} +function spaceLevelUp() { + spaceLevel++; + killCount = 0; + spaceScore += spaceLevel * 100; + enemies = []; + enemyBullets = []; + enemySpawnRate = Math.max(20, 50 - spaceLevel * 5); + enemyShootRate = Math.max(40, 100 - spaceLevel * 10); + spaceState = SPACE_STATE_LEVEL_UP; +} +function createExplosion(x, y, isPlayerExplosion) { + if (explosions.length < 10) { + var explosion = { x: x, y: y, size: EXPLOSION_MAX_SIZE, active: true, life: 10 }; + if (isPlayerExplosion) explosion.size = 16; + explosions.push(explosion); + tone(600, 150); + } +} +function checkCollision(x1, y1, w1, h1, x2, y2, w2, h2) { + return x1 < x2 + w2 && x1 + w1 > x2 && y1 < y2 + h2 && y1 + h1 > y2; +} +var SLOT_STATE_MENU = 0; +var SLOT_STATE_SPIN = 1; +var SLOT_STATE_GAME_OVER = 2; +var SLOT_STATE_PAUSED = 3; +var slotState = SLOT_STATE_MENU; +var slotMoney = 300; +var slotBetOptions = [1, 2, 3, 5, 10, 20]; +var slotBetIndex = 0; +var slotReels = [0, 0, 0]; +var slotSymbols = ["7", "BAR", "Bell", "Chy", "Lem"]; +var slotWeights = [15, 15, 20, 25, 25]; +var slotStaticDrawn = false; +var slotLastSelState = false; +var slotMessage = ""; +var slotMessageTimer = 0; +function resetSlots() { + slotMoney = 500; + slotBetIndex = 0; + slotReels = [0, 0, 0]; + slotState = SLOT_STATE_SPIN; + slotStaticDrawn = false; + slotMessage = ""; + slotMessageTimer = 0; +} +function drawSlots() { + if (!slotStaticDrawn) { + fillScreen(BLACK); + setTextSize(1); + if (slotState === SLOT_STATE_MENU) { + setTextSize(2); + setTextColor(YELLOW); + drawString("SLOTS", 90, 20); + setTextSize(1); + setTextColor(WHITE); + drawString("M5: Bet", 100, 50); + drawString("NEXT: Bet Change", 95, 70); + drawString("Press M5 to Start", 80, 90); + } else if (slotState === SLOT_STATE_SPIN) { + setTextColor(WHITE); + drawString("Money: " + slotMoney, 10, 10); + drawString("PREV: Menu", 10, 30); + drawString("Bet: " + slotBetOptions[slotBetIndex], 100, 10); + setTextSize(2); + setTextColor(CYAN); + var reel1 = slotSymbols[slotReels[0]].length === 1 ? " " + slotSymbols[slotReels[0]] + " " : slotSymbols[slotReels[0]]; + var reel2 = slotSymbols[slotReels[1]].length === 1 ? " | " + slotSymbols[slotReels[1]] + " |" : " |" + slotSymbols[slotReels[1]] + "|"; + var reel3 = slotSymbols[slotReels[2]].length === 1 ? " " + slotSymbols[slotReels[2]] + " " : slotSymbols[slotReels[2]]; + var reelWidth = 45; + var totalReelWidth = reelWidth * 3 + 30; + var startX = (WIDTH - totalReelWidth) / 2 - 20; + drawString(String.fromCharCode(91), startX, 60); + drawString(reel1, startX + 10, 60); + drawString(reel2, startX + 55, 60); + drawString(reel3, startX + 135, 60); + drawString(String.fromCharCode(93), startX + 180, 60); + setTextSize(1); + setTextColor(WHITE); + drawString("M5: Spin", 10, 110); + drawString("NEXT: Bet Change", 145, 110); + if (slotMessageTimer > 0 && slotMessage !== "") { + setTextColor(YELLOW); + setTextSize(2); + var centerX = 120 - 20; + if (slotMessage === "JACKPOT!") drawString(slotMessage, centerX - 40, 110); + else if (slotMessage === "WIN!") drawString(slotMessage, centerX - 20, 110); + else if (slotMessage === "Pair!") drawString(slotMessage, centerX - 20, 110); + else if (slotMessage === "So Close!") drawString(slotMessage, centerX - 40, 110); + slotMessageTimer--; + if (slotMessageTimer <= 0) slotMessage = ""; + } + } else if (slotState === SLOT_STATE_GAME_OVER) { + setTextSize(2); + setTextColor(MAGENTA); + drawString("BUSTED!", 80, 50); + setTextSize(1); + setTextColor(WHITE); + drawString("M5 to Retry", 70, 90); + drawString("PREV to Menu", 70, 110); + } else if (slotState === SLOT_STATE_PAUSED) { + drawSlotsPausedMenu(); + } + slotStaticDrawn = true; + } +} +function drawSlotsPausedMenu() { + if (!slotStaticDrawn || pauseMenuSelection !== menuLastSelection) { + fillScreen(BLACK); + var frameX = (WIDTH - 100) / 2; + var frameY = (HEIGHT - 60) / 2; + drawRect(frameX, frameY, 100, 60, WHITE); + var optionYStart = frameY + 10; + var options = ["Resume", "Main Menu", "Exit"]; + for (var i = 0; i < 3; i++) { + if (i === pauseMenuSelection) { + setTextColor(YELLOW); + drawFillRect(frameX + 5, optionYStart + i * 15, 90, 12, GRAY); + drawString("> " + options[i], frameX + 10, optionYStart + 5 + i * 15); + } else { + setTextColor(WHITE); + drawString(" " + options[i], frameX + 10, optionYStart + 5 + i * 15); + } + } + slotStaticDrawn = true; + menuLastSelection = pauseMenuSelection; + } +} +function getWeightedRandom(weights) { + var totalWeight = weights.reduce(function(sum, w) { return sum + w; }, 0); + var roll = Math.random() * totalWeight; + var cumulative = 0; + for (var i = 0; i < weights.length; i++) { + cumulative += weights[i]; + if (roll < cumulative) return i; + } + return weights.length - 1; +} +function updateSlots(selPressed) { + if (slotState !== SLOT_STATE_SPIN) return; + var bet = slotBetOptions[slotBetIndex]; + if (slotMoney < bet) slotBetIndex = Math.max(0, slotBetIndex - 1); + if (selPressed) { + slotMoney -= bet; + slotReels = [ + getWeightedRandom(slotWeights), + getWeightedRandom(slotWeights), + getWeightedRandom(slotWeights) + ]; + slotMessage = ""; + if (slotReels[0] === 0 && slotReels[1] === 0 && slotReels[2] === 0) { + slotMoney += bet * 40; + slotMessage = "JACKPOT!"; + slotMessageTimer = 30; + tone(1000, 500); + } else if (slotReels[0] === slotReels[1] && slotReels[1] === slotReels[2]) { + var multiplier; + switch (slotReels[0]) { + case 0: multiplier = 40; break; + case 1: multiplier = 20; break; + case 2: multiplier = 15; break; + case 3: multiplier = 10; break; + case 4: multiplier = 5; break; + } + slotMoney += bet * multiplier; + slotMessage = "WIN!"; + slotMessageTimer = 20; + tone(800, 300); + } else if (slotReels[0] === slotReels[1] || slotReels[1] === slotReels[2]) { + slotMoney += bet * 1; + slotMessage = "Pair!"; + slotMessageTimer = 15; + tone(600, 200); + } + if (slotMoney <= 0) slotState = SLOT_STATE_GAME_OVER; + slotStaticDrawn = false; + } +} +var BIRD_WIDTH = 16; +var BIRD_HEIGHT = 12; +var PIPE_WIDTH = 30; +var PIPE_GAP = 60; +var PIPE_SPEED = 1.5; +var GRAVITY = 0.18; +var FLAP_POWER = 3.2; +var GROUND_HEIGHT = 15; +var bird = { x: 60, y: HEIGHT / 2, width: BIRD_WIDTH, height: BIRD_HEIGHT, velocity: 0, lastY: 0 }; +var pipes = []; +var flappyScore = 0; +var flappyHighScore = 0; +var pipeSpawnTimer = 0; +var groundOffset = 0; +var FLAPPY_STATE_MENU = 0; +var FLAPPY_STATE_GAME = 1; +var FLAPPY_STATE_PAUSED = 2; +var flappyState = FLAPPY_STATE_MENU; +var suppressGameOverSound = false; +var flappyStaticDrawn = false; +var flappyLastSelState = false; +function resetFlappyBird() { + bird.y = HEIGHT / 2; + bird.velocity = 0; + bird.lastY = bird.y; + pipes = []; + flappyScore = 0; + pipeSpawnTimer = 0; + groundOffset = 0; + clouds = []; + initializeClouds(); + spawnPipe(); + flappyState = FLAPPY_STATE_MENU; + flappyStaticDrawn = false; + staticDrawn = false; +} +function spawnPipe() { + var gapY = Math.random() * (HEIGHT - PIPE_GAP - GROUND_HEIGHT - 40) + 20; + pipes.push({ x: WIDTH, y: gapY, width: PIPE_WIDTH, height: PIPE_GAP, passed: false }); +} +function drawFlappyMenu() { + if (!flappyStaticDrawn) { + fillScreen(BLACK); + setTextSize(3); + setTextColor(YELLOW); + drawString("FLAPPY BIRD", 25, 30); + setTextSize(1); + setTextColor(WHITE); + drawString("PREV/NEXT: Pause", 72, 70); + drawString("M5: Flap", 96, 85); + setTextColor(GREEN); + drawString("Press M5 to Start", 72, 120); + flappyStaticDrawn = true; + } +} +var clouds = []; + +function initializeClouds() { + clouds = []; + for (var i = 0; i < 5; i++) { + clouds.push({ + x: Math.random() * WIDTH, + y: Math.random() * 40 + 5, + width: Math.random() * 30 + 20, + height: Math.random() * 10 + 10, + speed: Math.random() * 0.3 + 0.1, + lastX: 0 + }); + } +} + +function updateClouds() { + for (var i = 0; i < clouds.length; i++) { + var cloud = clouds[i]; + cloud.x -= cloud.speed; + if (cloud.x + cloud.width < 0) { + cloud.x = WIDTH; + cloud.y = Math.random() * 40 + 5; + cloud.width = Math.random() * 30 + 20; + cloud.height = Math.random() * 10 + 10; + } + } +} + +function drawClouds() { + for (var i = 0; i < clouds.length; i++) { + var cloud = clouds[i]; + if (cloud.lastX > 0) { + drawFillRect(cloud.lastX, cloud.y, cloud.width, cloud.height, BLACK); + } + drawFillRect(cloud.x, cloud.y, cloud.width, cloud.height, GRAY); + cloud.lastX = cloud.x; + } +} + +function drawFlappyBird() { + switch (flappyState) { + case FLAPPY_STATE_MENU: + drawFlappyMenu(); + break; + case FLAPPY_STATE_GAME: + if (!flappyStaticDrawn) { + fillScreen(BLACK); + drawFillRect(0, HEIGHT - GROUND_HEIGHT, WIDTH, GROUND_HEIGHT, BROWN); + drawFillRect(0, HEIGHT - GROUND_HEIGHT, WIDTH, 3, GREEN); + if (clouds.length === 0) { + initializeClouds(); + } + flappyStaticDrawn = true; + } + + updateClouds(); + drawClouds(); + + for (var i = 0; i < pipes.length; i++) { + var clearWidth = pipes[i].width + PIPE_SPEED + 2; + drawFillRect(pipes[i].x, 0, clearWidth, pipes[i].y, BLACK); + drawFillRect(pipes[i].x, pipes[i].y + pipes[i].height, clearWidth, HEIGHT - pipes[i].y - pipes[i].height - GROUND_HEIGHT, BLACK); + } + + drawFillRect(WIDTH / 2 - 15, 20, 30, 24, BLACK); + setTextSize(2); + setTextColor(WHITE); + drawString("" + flappyScore, WIDTH / 2 - 5, 30); + + for (var i = 0; i < pipes.length; i++) { + drawFillRect(pipes[i].x, 0, pipes[i].width, pipes[i].y, GREEN); + drawFillRect(pipes[i].x, pipes[i].y + pipes[i].height, pipes[i].width, HEIGHT - pipes[i].y - pipes[i].height - GROUND_HEIGHT, GREEN); + } + + drawFillRect(0, HEIGHT - GROUND_HEIGHT + 5, WIDTH, 2, YELLOW); + drawFillRect(bird.x - bird.width / 2, bird.lastY - bird.height / 2, bird.width, bird.height, BLACK); + drawFillRect(bird.x - bird.width / 2, bird.y - bird.height / 2, bird.width, bird.height, YELLOW); + break; + case FLAPPY_STATE_PAUSED: + break; + } +} +function updateFlappyBird() { + if (flappyState !== FLAPPY_STATE_GAME) return; + bird.lastY = bird.y; + bird.velocity += GRAVITY; + bird.y += bird.velocity; + if (bird.y < 0) { + bird.y = 0; + bird.velocity = 0; + } + if (bird.y > HEIGHT - GROUND_HEIGHT - BIRD_HEIGHT / 2) { + prevGameState = STATE_FLAPPY_BIRD; + gameState = STATE_GAME_OVER; + if (!suppressGameOverSound) { + tone(400, 300); tone(300, 300); + } + suppressGameOverSound = false; + flappyState = FLAPPY_STATE_MENU; + staticDrawn = false; + if (flappyScore > flappyHighScore) flappyHighScore = flappyScore; + return; + } + pipeSpawnTimer++; + if (pipeSpawnTimer >= 100) { + spawnPipe(); + pipeSpawnTimer = 0; + } + for (var i = 0; i < pipes.length; i++) { + pipes[i].x -= PIPE_SPEED; + if (pipes[i].x + pipes[i].width < 0) { + pipes.splice(i, 1); + i--; + continue; + } + if (!pipes[i].passed && pipes[i].x + pipes[i].width < bird.x - BIRD_WIDTH / 2) { + pipes[i].passed = true; + flappyScore++; + tone(800, 100); + } + if (checkCollision(bird.x - BIRD_WIDTH / 2, bird.y - BIRD_HEIGHT / 2, BIRD_WIDTH, BIRD_HEIGHT, + pipes[i].x, 0, pipes[i].width, pipes[i].y) || + checkCollision(bird.x - BIRD_WIDTH / 2, bird.y - BIRD_HEIGHT / 2, BIRD_WIDTH, BIRD_HEIGHT, + pipes[i].x, pipes[i].y + pipes[i].height, pipes[i].width, HEIGHT - pipes[i].y - pipes[i].height - GROUND_HEIGHT)) { + prevGameState = STATE_FLAPPY_BIRD; + gameState = STATE_GAME_OVER; + if (!suppressGameOverSound) { + tone(400, 300); + } + suppressGameOverSound = false; + flappyState = FLAPPY_STATE_MENU; + staticDrawn = false; + if (flappyScore > flappyHighScore) flappyHighScore = flappyScore; + return; + } + } + groundOffset = (groundOffset + 1) % 20; +} +var blackjack = { + playerMoney: 1000, + currentBet: 0, + deck: [], + playerHand: [], + dealerHand: [], + playerBust: false, + dealerBust: false, + playerBlackjack: false, + dealerBlackjack: false, + state: 0, + resultMessage: "" +}; +var BET_OPTIONS = [10, 25, 50, 100]; +var selectedBetIndex = 0; +var lastBet = 10; +var SUITS = ['H', 'D', 'S', 'C']; +var VALUES = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']; +function resetBlackjack() { + blackjack.playerMoney = 1000; + blackjack.currentBet = 0; + blackjack.deck = []; + blackjack.playerHand = []; + blackjack.dealerHand = []; + blackjack.playerBust = false; + blackjack.dealerBust = false; + blackjack.playerBlackjack = false; + blackjack.state = 1; + blackjack.resultMessage = ""; + selectedBetIndex = 0; + staticDrawn = false; + drawBlackjack.firstDraw = true; + drawBlackjack.lastMoney = -1; + drawBlackjack.lastBetIndex = -1; + drawBlackjack.lastPauseSelection = -1; + drawBlackjack.lastState = -1; + if (typeof blackjack.prevState === 'undefined') { + blackjack.prevState = -1; + } +} +function createBlackjackDeck() { + blackjack.deck = []; + for (var i = 0; i < SUITS.length; i++) { + for (var j = 0; j < VALUES.length; j++) { + blackjack.deck.push({ suit: SUITS[i], value: VALUES[j] }); + } + } + shuffleBlackjackDeck(); +} +function shuffleBlackjackDeck() { + for (var i = blackjack.deck.length - 1; i > 0; i--) { + var j = Math.floor(Math.random() * (i + 1)); + var temp = blackjack.deck[i]; + blackjack.deck[i] = blackjack.deck[j]; + blackjack.deck[j] = temp; + } +} +function drawBlackjackCard() { + if (typeof blackjack.deck === 'undefined' || blackjack.deck.length === 0) { + createBlackjackDeck(); + } + return blackjack.deck.pop(); +} +function calculateHandValue(hand) { + if (!hand || hand.length === 0) return 0; + var value = 0; + var aces = 0; + for (var i = 0; i < hand.length; i++) { + var card = hand[i]; + if (card.value === 'A') { + aces++; + value += 11; + } else if (card.value === 'J' || card.value === 'Q' || card.value === 'K') { + value += 10; + } else { + value += parseInt(card.value); + } + } + while (value > 21 && aces > 0) { + value -= 10; + aces--; + } + return value; +} +function startBlackjackGame(betAmount) { + if (typeof blackjack.deck === 'undefined' || blackjack.deck.length === 0) { + createBlackjackDeck(); + } + if (blackjack.playerMoney < betAmount) return false; + blackjack.currentBet = betAmount; + blackjack.playerMoney -= betAmount; + lastBet = betAmount; + blackjack.state = 2; + blackjack.playerHand = [drawBlackjackCard(), drawBlackjackCard()]; + blackjack.dealerHand = [drawBlackjackCard(), drawBlackjackCard()]; + blackjack.playerBlackjack = calculateHandValue(blackjack.playerHand) === 21; + blackjack.dealerBlackjack = calculateHandValue(blackjack.dealerHand) === 21; + if (blackjack.playerBlackjack || blackjack.dealerBlackjack) { + dealerTurn(); + } + staticDrawn = false; + return true; +} +function hit() { + if (blackjack.state !== 2) return; + var card = drawBlackjackCard(); + if (!card) { + createBlackjackDeck(); + card = drawBlackjackCard(); + } + if (card) { + blackjack.playerHand.push(card); + var handValue = calculateHandValue(blackjack.playerHand); + if (handValue > 21) { + blackjack.playerBust = true; + dealerTurn(); + } else if (handValue === 21) { + dealerTurn(); + } + staticDrawn = false; + } +} +function stand() { + if (blackjack.state !== 2) return; + if (!blackjack.dealerHand || blackjack.dealerHand.length === 0) { + blackjack.dealerHand = []; + } + dealerTurn(); + staticDrawn = false; +} +function dealerTurn() { + if (blackjack.dealerBlackjack) { + determineWinner(); + return; + } + if (!blackjack.playerBust && !blackjack.playerBlackjack) { + if (!blackjack.dealerHand) { + blackjack.dealerHand = []; + } + var dealerValue = calculateHandValue(blackjack.dealerHand); + while (dealerValue < 17) { + var card = drawBlackjackCard(); + if (!card) { + createBlackjackDeck(); + card = drawBlackjackCard(); + } + if (card) { + blackjack.dealerHand.push(card); + dealerValue = calculateHandValue(blackjack.dealerHand); + staticDrawn = false; + delay(500); + } else { + break; + } + } + if (dealerValue > 21) blackjack.dealerBust = true; + } + determineWinner(); +} +function determineWinner() { + blackjack.state = 3; + var playerValue = calculateHandValue(blackjack.playerHand); + var dealerValue = calculateHandValue(blackjack.dealerHand || []); + + if (blackjack.playerBlackjack && blackjack.dealerBlackjack) { + blackjack.playerMoney += blackjack.currentBet; + blackjack.resultMessage = "Push (Blackjack vs. Blackjack)"; + } else if (blackjack.playerBlackjack) { + blackjack.playerMoney += Math.floor(blackjack.currentBet * 2.5); + blackjack.resultMessage = "Blackjack! You Win!"; + tone(800, 300); + } else if (blackjack.dealerBlackjack) { + blackjack.resultMessage = "Dealer Blackjack! You Lose!"; + tone(500, 200); + } else if (blackjack.playerBust) { + blackjack.resultMessage = "Bust! You Lose!"; + tone(500, 200); + } else if (blackjack.dealerBust || playerValue > dealerValue) { + blackjack.playerMoney += blackjack.currentBet * 2; + blackjack.resultMessage = "You Win!"; + tone(800, 300); + } else if (playerValue === dealerValue) { + blackjack.playerMoney += blackjack.currentBet; + blackjack.resultMessage = "Push!"; + } else { + blackjack.resultMessage = "You Lose!"; + tone(500, 200); + } + + if (!blackjack.resultMessage.includes(" ")) { + blackjack.resultMessage = blackjack.resultMessage + " Game"; + } + + staticDrawn = false; +} +function drawBlackjackPauseMenu() { + fillScreen(BLACK); + setTextSize(2); + setTextColor(GOLD); + drawString("PAUSED", 70, 20); + drawRect(90, 40, 60, 60, GRAY); + setTextSize(1); + var options = ["Resume", "Main Menu", "Quit"]; + for (var i = 0; i < options.length; i++) { + if (i === pauseMenuSelection) { + setTextColor(YELLOW); + drawFillRect(95, 48 + i * 15, 50, 12, GRAY); + drawString("> " + options[i], 100, 55 + i * 15); + } else { + setTextColor(WHITE); + drawString(" " + options[i], 100, 55 + i * 15); + } + } +} +function drawBlackjack() { + if (!staticDrawn || blackjack.state !== drawBlackjack.lastState || + (blackjack.state === 2 && blackjack.playerHand.length !== drawBlackjack.lastPlayerHandLength)) { + fillScreen(BLACK); + staticDrawn = true; + + if (blackjack.state === 0) { + setTextSize(2); + setTextColor(GOLD); + drawString("BLACKJACK", 70, 20); + setTextSize(1); + setTextColor(WHITE); + drawString("Money: " + blackjack.playerMoney, 70, 50); + drawString("M5: Play", 70, 70); + } else if (blackjack.state === 1) { + setTextSize(2); + setTextColor(GOLD); + drawString("PLACE YOUR BET", 50, 20); + setTextSize(1); + setTextColor(WHITE); + drawString("Money: " + blackjack.playerMoney, 10, 50); + for (var i = 0; i < BET_OPTIONS.length; i++) { + if (i === selectedBetIndex) { + setTextColor(YELLOW); + drawString("> " + BET_OPTIONS[i], 100, 50 + i * 15); + } else { + setTextColor(WHITE); + drawString(" " + BET_OPTIONS[i], 100, 50 + i * 15); + } + } + setTextColor(WHITE); + drawString("PREV/NEXT: Change", 10, 115); + drawString("M5: Confirm", 150, 115); + } else if (blackjack.state === 2) { + setTextSize(1); + setTextColor(WHITE); + drawString("Money: " + blackjack.playerMoney, 5, 10); + drawString("Bet: " + blackjack.currentBet, 190, 10); + drawString("Dealer's Hand:", 5, 25); + for (var i = 0; i < blackjack.dealerHand.length; i++) { + if (i === 1 && !blackjack.playerBust && blackjack.dealerHand.length === 2 && + calculateHandValue(blackjack.playerHand) !== 21) { + drawFillRect(5 + i * 30, 40, 20, 30, GRAY); + } else if (blackjack.dealerHand[i]) { + drawFillRect(5 + i * 30, 40, 20, 30, WHITE); + setTextColor(blackjack.dealerHand[i].suit === 'H' || + blackjack.dealerHand[i].suit === 'D' ? GRAY : BLACK); + drawString(blackjack.dealerHand[i].value + blackjack.dealerHand[i].suit, 7 + i * 30, 55); + } + } + setTextColor(YELLOW); + drawString("Your Hand: " + calculateHandValue(blackjack.playerHand), 5, 75); + setTextColor(WHITE); + for (var i = 0; i < blackjack.playerHand.length; i++) { + if (blackjack.playerHand[i]) { + drawFillRect(5 + i * 30, 90, 20, 30, WHITE); + setTextColor(blackjack.playerHand[i].suit === 'H' || + blackjack.playerHand[i].suit === 'D' ? GRAY : BLACK); + drawString(blackjack.playerHand[i].value + blackjack.playerHand[i].suit, 7 + i * 30, 105); + } + } + if (!blackjack.playerBust && !blackjack.playerBlackjack) { + setTextSize(1); + setTextColor(WHITE); + drawString("PREV: Menu", 15, 125); + drawString("M5: Stand", 95, 125); + drawString("NEXT: Hit", 170, 125); + } + } else if (blackjack.state === 3) { + setTextSize(1); + setTextColor(WHITE); + drawString("Money: " + blackjack.playerMoney, 5, 10); + drawString("Bet: " + blackjack.currentBet, 190, 10); + drawString("Dealer's Hand: " + calculateHandValue(blackjack.dealerHand), 5, 25); + for (var i = 0; i < blackjack.dealerHand.length; i++) { + if (blackjack.dealerHand[i]) { + drawFillRect(5 + i * 30, 40, 20, 30, WHITE); + setTextColor(blackjack.dealerHand[i].suit === 'H' || + blackjack.dealerHand[i].suit === 'D' ? GRAY : BLACK); + drawString(blackjack.dealerHand[i].value + blackjack.dealerHand[i].suit, 7 + i * 30, 55); + } + } + setTextColor(YELLOW); + drawString("Your Hand: " + calculateHandValue(blackjack.playerHand), 5, 75); + setTextColor(WHITE); + for (var i = 0; i < blackjack.playerHand.length; i++) { + if (blackjack.playerHand[i]) { + drawFillRect(5 + i * 30, 90, 20, 30, WHITE); + setTextColor(blackjack.playerHand[i].suit === 'H' || + blackjack.playerHand[i].suit === 'D' ? GRAY : BLACK); + drawString(blackjack.playerHand[i].value + blackjack.playerHand[i].suit, 7 + i * 30, 105); + } + } + + setTextSize(2); + setTextColor(blackjack.resultMessage.includes("Win") ? GRAY : + blackjack.resultMessage.includes("Lose") ? YELLOW : WHITE); + + try { + var lines = blackjack.resultMessage.split(" "); + if (lines.length >= 2) { + drawString(lines[0], 180 - (lines[0].length * 10) / 2, 60); + drawString(lines[1], 180 - (lines[1].length * 10) / 2, 80); + } else { + drawString(blackjack.resultMessage, 180 - (blackjack.resultMessage.length * 10) / 2, 70); + } + } catch (e) { + drawString("Game Over", 70, 70); + } + + setTextSize(1); + setTextColor(WHITE); + var nextHandText = "M5: Next Hand"; + var nextHandX = 120 - (nextHandText.length * 5) / 2; + drawString(nextHandText, nextHandX, 125); + } else if (blackjack.state === 4) { + fillScreen(BLACK); + drawRect(60, 30, 120, 70, GRAY); + setTextSize(1); + var options = ["Resume", "Main Menu", "Quit"]; + for (var i = 0; i < options.length; i++) { + if (i === pauseMenuSelection) { + setTextColor(YELLOW); + drawFillRect(95, 47 + i * 15, 50, 10, GRAY); + drawString("> " + options[i], 100, 50 + i * 15); + } else { + setTextColor(WHITE); + drawString(" " + options[i], 100, 50 + i * 15); + } + } + } + drawBlackjack.lastState = blackjack.state; + drawBlackjack.lastPlayerHandLength = blackjack.playerHand.length; + } +} +drawBlackjack.lastState = -1; +drawBlackjack.lastPlayerHandLength = 0; + +function updateBlackjack() { + if (gameState !== STATE_BLACKJACK) return; + if (blackjack.state === 2 && (blackjack.playerBust || blackjack.playerBlackjack || blackjack.dealerBlackjack)) { + dealerTurn(); + } +} +function handleInput() { + var currentSelState = getSelPress(); + var prevPressed = getPrevPress(); + var nextPressed = getNextPress(); + var shouldExit = false; + switch (gameState) { + case STATE_MAIN_MENU: + if (prevPressed) { + menuSelection = (menuSelection - 1 + menuOptions.length) % menuOptions.length; + mainMenuStaticDrawn = false; + } + if (nextPressed) { + menuSelection = (menuSelection + 1) % menuOptions.length; + mainMenuStaticDrawn = false; + } + if (currentSelState && !menuLastSelState) { + if (menuSelection === 0) gameState = STATE_BREAKOUT; + else if (menuSelection === 1) gameState = STATE_SNAKE; + else if (menuSelection === 2) gameState = STATE_SPACE_SHOOTER; + else if (menuSelection === 3) { resetSlots(); gameState = STATE_SLOTS; } + else if (menuSelection === 4) { resetFlappyBird(); gameState = STATE_FLAPPY_BIRD; } + else if (menuSelection === 5) { resetBlackjack(); gameState = STATE_BLACKJACK; } + else if (menuSelection === 6) { gameState = STATE_EXIT_CONFIRM; exitConfirmSelection = 1; } + staticDrawn = false; + mainMenuStaticDrawn = false; + menuLastSelState = false; + breakoutLastSelState = false; + snakeLastSelState = false; + spaceLastSelState = false; + slotLastSelState = false; + } + menuLastSelState = currentSelState; + break; + case STATE_BREAKOUT: + if (currentSelState && !breakoutLastSelState) { + breakoutSelPressCount++; + if (breakoutSelPressCount === 1) breakoutSelPressWindowStart = Date.now(); + if (Date.now() - breakoutSelPressWindowStart <= breakoutSelPressWindow) { + if (breakoutSelPressCount >= breakoutSelPressThreshold) { + breakoutIsPaused = true; + gameState = STATE_PAUSED; + prevGameState = STATE_BREAKOUT; + breakoutSelPressCount = 0; + breakoutSelPressWindowStart = -1; + breakoutPauseCooldown = 30; + pauseStaticDrawn = false; + } + } else { + breakoutSelPressCount = 1; + breakoutSelPressWindowStart = Date.now(); + } + if (breakoutState === BREAKOUT_STATE_START) { + resetBreakout(); + } else if (breakoutState === BREAKOUT_STATE_PLAYING && ball.stuck) { + ball.stuck = false; + resetBall(); + } else if (breakoutState === BREAKOUT_STATE_GAME_OVER || breakoutState === BREAKOUT_STATE_WIN) { + resetBreakout(); + } else if (breakoutState === BREAKOUT_STATE_NEXT_LEVEL) { + resetBreakout(); + } + } else if (!currentSelState && breakoutLastSelState) { + breakoutLastSelState = false; + } + if (prevPressed && (breakoutState === BREAKOUT_STATE_GAME_OVER || breakoutState === BREAKOUT_STATE_WIN)) { + gameState = STATE_MAIN_MENU; + staticDrawn = false; + mainMenuStaticDrawn = false; + menuLastSelState = false; + breakoutLastSelState = false; + } + if (breakoutState === BREAKOUT_STATE_PLAYING && !breakoutIsPaused) { + if (prevPressed) paddle.x -= paddle.speed; + if (nextPressed) paddle.x += paddle.speed; + if (paddle.x < 0) paddle.x = 0; + if (paddle.x + paddle.width > WIDTH) paddle.x = WIDTH - paddle.width; + } + breakoutLastSelState = currentSelState; + break; + case STATE_SNAKE: + if (currentSelState && !snakeLastSelState) { + if (snakeState === SNAKE_STATE_MENU) resetSnake(); + else if (snakeState === SNAKE_STATE_GAME) { + snakeState = SNAKE_STATE_PAUSED; + gameState = STATE_PAUSED; + prevGameState = STATE_SNAKE; + pauseStaticDrawn = false; + } + } + if (prevPressed && snakeState === SNAKE_STATE_GAME) { + switch (direction) { + case 0: nextDirection = 2; break; + case 1: nextDirection = 3; break; + case 2: nextDirection = 1; break; + case 3: nextDirection = 0; break; + } + } + if (nextPressed && snakeState === SNAKE_STATE_GAME) { + switch (direction) { + case 0: nextDirection = 3; break; + case 1: nextDirection = 2; break; + case 2: nextDirection = 0; break; + case 3: nextDirection = 1; break; + } + } + snakeLastSelState = currentSelState; + break; + case STATE_SPACE_SHOOTER: + if (currentSelState && !spaceLastSelState) { + if (spaceState === SPACE_STATE_MENU) resetSpaceShooter(); + else if (spaceState === SPACE_STATE_GAME) { + spaceIsPaused = true; + gameState = STATE_PAUSED; + prevGameState = STATE_SPACE_SHOOTER; + pauseStaticDrawn = false; + } + } + if (prevPressed) player.x -= player.speed; + if (nextPressed) player.x += player.speed; + if (player.x < player.width / 2) player.x = player.width / 2; + if (player.x > WIDTH - player.width / 2) player.x = WIDTH - player.width / 2; + spaceLastSelState = currentSelState; + break; + case STATE_SLOTS: + if (currentSelState && !slotLastSelState) { + if (slotState === SLOT_STATE_MENU) resetSlots(); + else if (slotState === SLOT_STATE_SPIN) updateSlots(true); + else if (slotState === SLOT_STATE_GAME_OVER) resetSlots(); + else if (slotState === SLOT_STATE_PAUSED) { + if (pauseMenuSelection === 0) { + slotState = SLOT_STATE_SPIN; + slotStaticDrawn = false; + } else if (pauseMenuSelection === 1) { + gameState = STATE_MAIN_MENU; + resetSlots(); + staticDrawn = false; + mainMenuStaticDrawn = false; + menuLastSelState = false; + breakoutLastSelState = false; + snakeLastSelState = false; + spaceLastSelState = false; + slotLastSelState = false; + } else if (pauseMenuSelection === 2) { + gameState = STATE_EXIT_CONFIRM; + prevGameState = STATE_SLOTS; + exitConfirmSelection = 1; + staticDrawn = false; + } + } + } + if (slotState === SLOT_STATE_SPIN) { + if (prevPressed) { + slotState = SLOT_STATE_PAUSED; + pauseMenuSelection = 0; + slotStaticDrawn = false; + } + if (nextPressed) { + slotBetIndex = (slotBetIndex + 1) % slotBetOptions.length; + slotStaticDrawn = false; + } + } else if (slotState === SLOT_STATE_PAUSED) { + if (prevPressed) { + pauseMenuSelection = (pauseMenuSelection - 1 + 3) % 3; + slotStaticDrawn = false; + } + if (nextPressed) { + pauseMenuSelection = (pauseMenuSelection + 1) % 3; + slotStaticDrawn = false; + } + } else if (slotState === SLOT_STATE_GAME_OVER) { + if (prevPressed) { + gameState = STATE_MAIN_MENU; + staticDrawn = false; + mainMenuStaticDrawn = false; + menuLastSelState = false; + slotLastSelState = false; + } + } + slotLastSelState = currentSelState; + break; + case STATE_FLAPPY_BIRD: + if (currentSelState && !flappyLastSelState) { + if (flappyState === FLAPPY_STATE_MENU) { + flappyState = FLAPPY_STATE_GAME; + flappyStaticDrawn = false; + } else if (flappyState === FLAPPY_STATE_GAME) { + bird.velocity = -FLAP_POWER; + tone(600, 150); + } + } + if (prevPressed && flappyState === FLAPPY_STATE_GAME) { + flappyState = FLAPPY_STATE_PAUSED; + gameState = STATE_PAUSED; + prevGameState = STATE_FLAPPY_BIRD; + pauseStaticDrawn = false; + } + if (nextPressed && flappyState === FLAPPY_STATE_GAME) { + flappyState = FLAPPY_STATE_PAUSED; + gameState = STATE_PAUSED; + prevGameState = STATE_FLAPPY_BIRD; + pauseStaticDrawn = false; + } + flappyLastSelState = currentSelState; + break; + case STATE_BLACKJACK: + var betMenuSelection = selectedBetIndex; + if (typeof blackjack.prevState === 'undefined') { + blackjack.prevState = -1; + } + if (currentSelState && !menuLastSelState) { + if (blackjack.state === 1) { + startBlackjackGame(BET_OPTIONS[betMenuSelection]); + } else if (blackjack.state === 2) { + stand(); + } else if (blackjack.state === 3) { + if (blackjack.playerMoney <= 0) { + prevGameState = STATE_BLACKJACK; + gameState = STATE_GAME_OVER; + staticDrawn = false; + } else { + blackjack.dealerHand = []; + blackjack.playerHand = []; + blackjack.currentBet = 0; + blackjack.playerBust = false; + blackjack.dealerBust = false; + blackjack.playerBlackjack = false; + blackjack.state = 1; + betMenuSelection = 0; + staticDrawn = false; + } + } else if (blackjack.state === 4) { + if (pauseMenuSelection === 0) { + blackjack.state = blackjack.prevState; + staticDrawn = false; + } else if (pauseMenuSelection === 1) { + gameState = STATE_MAIN_MENU; + resetBlackjack(); + staticDrawn = false; + mainMenuStaticDrawn = false; + menuLastSelState = false; + } else if (pauseMenuSelection === 2) { + gameState = STATE_EXIT_CONFIRM; + prevGameState = STATE_BLACKJACK; + exitConfirmSelection = 1; + staticDrawn = false; + } + } + } + if (nextPressed && blackjack.state === 1) { + betMenuSelection = (betMenuSelection + 1) % BET_OPTIONS.length; + staticDrawn = false; + } + if (prevPressed && blackjack.state === 1) { + betMenuSelection = (betMenuSelection - 1 + BET_OPTIONS.length) % BET_OPTIONS.length; + staticDrawn = false; + } + if (prevPressed && blackjack.state === 2) { + blackjack.prevState = blackjack.state; + blackjack.state = 4; + pauseMenuSelection = 0; + staticDrawn = false; + } + if (blackjack.state === 4) { + if (prevPressed) { + pauseMenuSelection = (pauseMenuSelection - 1 + 3) % 3; + staticDrawn = false; + } + if (nextPressed) { + pauseMenuSelection = (pauseMenuSelection + 1) % 3; + staticDrawn = false; + } + } + if (nextPressed && blackjack.state === 2 && !blackjack.playerBust && !blackjack.playerBlackjack) { + hit(); + } + selectedBetIndex = betMenuSelection; + menuLastSelState = currentSelState; + break; + case STATE_PAUSED: + if (prevPressed) { + pauseMenuSelection = (pauseMenuSelection - 1 + 3) % 3; + pauseStaticDrawn = false; + } + if (nextPressed) { + pauseMenuSelection = (pauseMenuSelection + 1) % 3; + pauseStaticDrawn = false; + } + if (currentSelState && !menuLastSelState && (prevGameState !== STATE_BREAKOUT || breakoutPauseCooldown <= 0)) { + if (pauseMenuSelection === 0) { + gameState = prevGameState; + if (prevGameState === STATE_BREAKOUT) { + breakoutIsPaused = false; + breakoutStaticDrawn = false; + breakoutLastStaticDrawnState = -1; + } + if (prevGameState === STATE_SPACE_SHOOTER) { + spaceIsPaused = false; + spaceStaticDrawn = false; + spaceLastStaticDrawnState = -1; + } + if (prevGameState === STATE_SNAKE) { + snakeState = SNAKE_STATE_GAME; + snakeStaticDrawn = false; + snakeLastStaticDrawnState = -1; + } + if (prevGameState === STATE_FLAPPY_BIRD) { + flappyState = FLAPPY_STATE_GAME; + flappyStaticDrawn = false; + } + staticDrawn = false; + pauseStaticDrawn = false; + } else if (pauseMenuSelection === 1) { + gameState = STATE_MAIN_MENU; + staticDrawn = false; + mainMenuStaticDrawn = false; + menuLastSelState = false; + breakoutLastSelState = false; + snakeLastSelState = false; + spaceLastSelState = false; + slotLastSelState = false; + flappyLastSelState = false; + snakeState = SNAKE_STATE_MENU; + if (prevGameState === STATE_SPACE_SHOOTER) resetSpaceShooter(); + if (prevGameState === STATE_FLAPPY_BIRD) flappyState = FLAPPY_STATE_MENU; + prevGameState = -1; + } else if (pauseMenuSelection === 2) { + gameState = STATE_EXIT_CONFIRM; + exitConfirmSelection = 1; + staticDrawn = false; + } + } + menuLastSelState = currentSelState; + if (prevGameState === STATE_BREAKOUT && breakoutPauseCooldown > 0) breakoutPauseCooldown--; + break; + case STATE_GAME_OVER: + if (prevPressed) { + pauseMenuSelection = (pauseMenuSelection - 1 + 3) % 3; + staticDrawn = false; + } + if (nextPressed) { + pauseMenuSelection = (pauseMenuSelection + 1) % 3; + staticDrawn = false; + } + if (currentSelState && !menuLastSelState) { + if (pauseMenuSelection === 0) { + if (prevGameState === STATE_FLAPPY_BIRD) resetFlappyBird(); + else if (prevGameState === STATE_SNAKE) resetSnake(); + else if (prevGameState === STATE_SPACE_SHOOTER) resetSpaceShooter(); + else if (prevGameState === STATE_BREAKOUT) resetBreakout(); + else if (prevGameState === STATE_BLACKJACK) resetBlackjack(); + gameState = prevGameState; + staticDrawn = false; + } else if (pauseMenuSelection === 1) { + gameState = STATE_MAIN_MENU; + staticDrawn = false; + mainMenuStaticDrawn = false; + menuLastSelState = false; + breakoutLastSelState = false; + snakeLastSelState = false; + spaceLastSelState = false; + slotLastSelState = false; + snakeState = SNAKE_STATE_MENU; + if (prevGameState === STATE_SPACE_SHOOTER) resetSpaceShooter(); + prevGameState = -1; + } else if (pauseMenuSelection === 2) { + gameState = STATE_EXIT_CONFIRM; + exitConfirmSelection = 1; + staticDrawn = false; + } + } + menuLastSelState = currentSelState; + if (gameState === STATE_MAIN_MENU) menuLastSelState = false; + break; + case STATE_LEVEL_UP: + if (prevPressed) { + gameState = STATE_MAIN_MENU; + staticDrawn = false; + mainMenuStaticDrawn = false; + menuLastSelState = false; + breakoutLastSelState = false; + snakeLastSelState = false; + spaceLastSelState = false; + slotLastSelState = false; + } + if (currentSelState && !menuLastSelState) { + if (prevGameState === STATE_SPACE_SHOOTER) { + spaceState = SPACE_STATE_GAME; + gameState = prevGameState; + spaceStaticDrawn = false; + } else if (prevGameState === STATE_BREAKOUT) { + resetBreakout(); + gameState = prevGameState; + breakoutStaticDrawn = false; + } + } + menuLastSelState = currentSelState; + break; + case STATE_EXIT_CONFIRM: + if (prevPressed) { + exitConfirmSelection = (exitConfirmSelection - 1 + 2) % 2; + staticDrawn = false; + } + if (nextPressed) { + exitConfirmSelection = (exitConfirmSelection + 1) % 2; + staticDrawn = false; + } + if (currentSelState && !menuLastSelState) { + if (exitConfirmSelection === 0) { + shouldExit = true; + } else { + gameState = STATE_MAIN_MENU; + staticDrawn = false; + mainMenuStaticDrawn = false; + menuLastSelState = false; + breakoutLastSelState = false; + snakeLastSelState = false; + spaceLastSelState = false; + slotLastSelState = false; + flappyLastSelState = false; + } + } + menuLastSelState = currentSelState; + break; + } + return shouldExit; +} +function main() { + gameState = STATE_MAIN_MENU; + createStars(); + while (true) { + var startTime = Date.now(); + if (handleInput()) break; + switch (gameState) { + case STATE_MAIN_MENU: drawMainMenu(); break; + case STATE_BREAKOUT: updateBreakout(); drawBreakout(); break; + case STATE_SNAKE: updateSnake(); drawSnake(); break; + case STATE_SPACE_SHOOTER: updateSpaceShooter(); drawSpaceShooter(); break; + case STATE_SLOTS: updateSlots(false); drawSlots(); break; + case STATE_FLAPPY_BIRD: updateFlappyBird(); drawFlappyBird(); break; + case STATE_BLACKJACK: updateBlackjack(); drawBlackjack(); break; + case STATE_PAUSED: drawPauseMenu(); break; + case STATE_GAME_OVER: drawGameOverMenu(); break; + case STATE_LEVEL_UP: drawLevelUpMenu(); break; + case STATE_EXIT_CONFIRM: drawExitConfirm(); break; + } + frameCounter++; + var frameTime = Date.now() - startTime; + delay(Math.max(1, 33 - frameTime)); + } +} +main() diff --git a/examples/M5Stick JS bruce/M5stickcplus2_calculator.js b/examples/M5Stick JS bruce/M5stickcplus2_calculator.js new file mode 100644 index 0000000..8eaf8f9 --- /dev/null +++ b/examples/M5Stick JS bruce/M5stickcplus2_calculator.js @@ -0,0 +1,398 @@ +var displayApi = require('display'); +var keyboardApi = require('keyboard'); + +var width = displayApi.width; +var height = displayApi.height; +var color = displayApi.color; +var drawFillRect = displayApi.drawFillRect; +var drawRect = displayApi.drawRect; +var drawString = displayApi.drawString; +var setTextColor = displayApi.setTextColor; +var setTextSize = displayApi.setTextSize; + +var getPrevPress = keyboardApi.getPrevPress; +var getNextPress = keyboardApi.getNextPress; +var getSelPress = keyboardApi.getSelPress; + +var screenWidth = width(); +var screenHeight = height(); + +var COLOR_BLACK = color(0, 0, 0); +var COLOR_WHITE = color(255, 255, 255); +var COLOR_GRAY = color(128, 128, 128); +var COLOR_BLUE = color(0, 100, 200); +var COLOR_GREEN = color(0, 150, 0); +var COLOR_RED = color(200, 0, 0); +var COLOR_ORANGE = color(255, 165, 0); + +var display = "0"; +var currentNumber = ""; +var previousNumber = ""; +var operator = ""; +var waitingForNewNumber = false; + +var keyboard = [ + ["C", "DEL", "+/-", "*"], + ["7", "8", "9", "/"], + ["4", "5", "6", "-"], + ["1", "2", "3", "+"], + ["0", ".", "=", "EXIT"] +]; + +var selectedRow = 0; +var selectedCol = 0; + +var KEY_WIDTH = 30; +var KEY_HEIGHT = 16; +var KEY_SPACING = 3; +var KEYBOARD_START_Y = 45; +var KEYBOARD_START_X = 10; + +var redraw = true; +var shouldExit = false; + +function exit() { + shouldExit = true; +} + +function setupScreen() { + drawFillRect(0, 0, screenWidth, screenHeight, COLOR_BLACK); + drawTitle(); + drawDisplay(); + drawKeyboard(); +} + +function drawTitle() { + setTextColor(COLOR_WHITE); + setTextSize(1); + drawString("Calculator", 55, 5); +} + +function drawDisplay() { + var displayWidth = screenWidth - 20; + var displayX = 10; + drawFillRect(displayX, 18, displayWidth, 25, COLOR_WHITE); + drawRect(displayX, 18, displayWidth, 25, COLOR_GRAY); + + setTextColor(COLOR_BLACK); + setTextSize(1); + + var displayText = display; + if (displayText.length > 18) { + displayText = displayText.substring(displayText.length - 18); + } + + var textWidth = displayText.length * 6; + var textX = displayX + displayWidth - textWidth - 5; + if (textX < displayX + 5) textX = displayX + 5; + + drawString(displayText, textX, 28); +} + +function drawKeyboard() { + for (var row = 0; row < keyboard.length; row++) { + for (var col = 0; col < keyboard[row].length; col++) { + var key = keyboard[row][col]; + if (key === "") continue; + + var x = KEYBOARD_START_X + col * (KEY_WIDTH + KEY_SPACING); + var y = KEYBOARD_START_Y + row * (KEY_HEIGHT + KEY_SPACING); + + var keyColor = COLOR_WHITE; + var textColor = COLOR_BLACK; + + if (row === selectedRow && col === selectedCol) { + keyColor = COLOR_BLUE; + textColor = COLOR_WHITE; + } + + if (key === "C") { + keyColor = (row === selectedRow && col === selectedCol) ? COLOR_RED : color(255, 200, 200); + } else if (key === "=") { + keyColor = (row === selectedRow && col === selectedCol) ? COLOR_GREEN : color(200, 255, 200); + } else if (key === "EXIT") { + keyColor = (row === selectedRow && col === selectedCol) ? COLOR_RED : color(255, 150, 150); + } else if ("+-*/".indexOf(key) >= 0 || key === "+/-") { + keyColor = (row === selectedRow && col === selectedCol) ? COLOR_ORANGE : color(255, 230, 200); + } + + drawFillRect(x, y, KEY_WIDTH, KEY_HEIGHT, keyColor); + drawRect(x, y, KEY_WIDTH, KEY_HEIGHT, COLOR_GRAY); + + setTextColor(textColor); + setTextSize(1); + + var textX = x + KEY_WIDTH / 2 - 3; + var textY = y + KEY_HEIGHT / 2 - 3; + + if (key === "EXIT") { + textX = x + 3; + textY = y + KEY_HEIGHT / 2 - 3; + } + + drawString(key, textX, textY); + } + } +} + +function moveSelection(direction) { + if (direction === "up") { + if (selectedRow > 0) { + selectedRow--; + } else { + selectedRow = keyboard.length - 1; + } + } else if (direction === "down") { + if (selectedRow < keyboard.length - 1) { + selectedRow++; + } else { + selectedRow = 0; + } + } else if (direction === "left") { + if (selectedCol > 0) { + selectedCol--; + } else { + selectedCol = keyboard[selectedRow].length - 1; + } + } else if (direction === "right") { + if (selectedCol < keyboard[selectedRow].length - 1) { + selectedCol++; + } else { + selectedCol = 0; + } + } + + while (keyboard[selectedRow][selectedCol] === "") { + if (direction === "right" || direction === "down") { + selectedCol++; + if (selectedCol >= keyboard[selectedRow].length) { + selectedCol = 0; + selectedRow++; + if (selectedRow >= keyboard.length) { + selectedRow = 0; + } + } + } else { + selectedCol--; + if (selectedCol < 0) { + selectedRow--; + if (selectedRow < 0) { + selectedRow = keyboard.length - 1; + } + selectedCol = keyboard[selectedRow].length - 1; + } + } + } +} + +function pressKey() { + var key = keyboard[selectedRow][selectedCol]; + if (key === "") return; + + if (key === "C") { + clear(); + } else if (key === "DEL") { + backspace(); + } else if (key === "=") { + calculate(); + } else if (key === "+/-") { + toggleSign(); + } else if (key === "EXIT") { + exit(); + } else if ("+-*/".indexOf(key) >= 0) { + setOperator(key); + } else if (key === ".") { + addDecimal(); + } else { + addNumber(key); + } + + redraw = true; +} + +function toggleSign() { + if (currentNumber !== "" && currentNumber !== "0") { + if (currentNumber.indexOf("-") === 0) { + currentNumber = currentNumber.substring(1); + } else { + currentNumber = "-" + currentNumber; + } + display = currentNumber; + } +} + +function addNumber(num) { + if (waitingForNewNumber) { + currentNumber = num; + waitingForNewNumber = false; + } else { + if (currentNumber === "0") { + currentNumber = num; + } else { + currentNumber += num; + } + } + display = currentNumber; +} + +function addDecimal() { + if (waitingForNewNumber) { + currentNumber = "0."; + waitingForNewNumber = false; + } else { + if (currentNumber.indexOf(".") === -1) { + currentNumber += "."; + } + } + display = currentNumber; +} + +function setOperator(op) { + if (operator !== "" && !waitingForNewNumber) { + calculate(); + } + + previousNumber = currentNumber; + operator = op; + waitingForNewNumber = true; + display = currentNumber; +} + +function calculate() { + if (operator === "" || waitingForNewNumber) return; + + var prev = parseFloat(previousNumber); + var curr = parseFloat(currentNumber); + var result = 0; + + try { + switch (operator) { + case "+": + result = prev + curr; + break; + case "-": + result = prev - curr; + break; + case "*": + result = prev * curr; + break; + case "/": + if (curr === 0) { + display = "Error: Div by 0"; + clear(); + return; + } + result = prev / curr; + break; + } + + if (result.toString().length > 12) { + if (Math.abs(result) >= 1000000 || Math.abs(result) < 0.001) { + result = result.toExponential(3); + } else { + result = result.toPrecision(6); + } + } + + currentNumber = result.toString(); + display = currentNumber; + operator = ""; + waitingForNewNumber = true; + + } catch (e) { + display = "Error"; + clear(); + } +} + +function clear() { + display = "0"; + currentNumber = ""; + previousNumber = ""; + operator = ""; + waitingForNewNumber = false; +} + +function backspace() { + if (currentNumber.length > 1) { + currentNumber = currentNumber.slice(0, -1); + display = currentNumber; + } else { + currentNumber = "0"; + display = "0"; + } +} + +function updateDisplay() { + var displayWidth = screenWidth - 20; + var displayX = 10; + drawFillRect(displayX, 18, displayWidth, 25, COLOR_WHITE); + drawRect(displayX, 18, displayWidth, 25, COLOR_GRAY); + + setTextColor(COLOR_BLACK); + setTextSize(1); + + var displayText = display; + if (displayText.length > 18) { + displayText = displayText.substring(displayText.length - 18); + } + + var textWidth = displayText.length * 6; + var textX = displayX + displayWidth - textWidth - 5; + if (textX < displayX + 5) textX = displayX + 5; + + drawString(displayText, textX, 28); + + drawKeyboard(); +} + +function showHelp() { + drawFillRect(0, 0, screenWidth, screenHeight, COLOR_BLACK); + setTextColor(COLOR_WHITE); + setTextSize(1); + + drawString("Bruce Calculator", 40, 10); + drawString("Developed by MSI", 40, 25); + + drawString("Prev: Down", 50, 50); + drawString("Next: Right", 48, 65); + drawString("Sel: Press", 48, 80); + + drawString("Press any key to continue", 25, 120); + + while (true) { + if (getPrevPress() || getNextPress() || getSelPress()) { + while (getPrevPress() || getNextPress() || getSelPress()) { + delay(50); + } + break; + } + delay(50); + } + + setupScreen(); +} + +setTextSize(1); +showHelp(); + +while (!shouldExit) { + if (getPrevPress()) { + moveSelection("down"); + redraw = true; + } + if (getNextPress()) { + moveSelection("right"); + redraw = true; + } + if (getSelPress()) { + pressKey(); + } + + if (redraw) { + updateDisplay(); + redraw = false; + } + + delay(50); +} diff --git a/examples/M5Stick JS bruce/dino_game_M5.js b/examples/M5Stick JS bruce/dino_game_M5.js new file mode 100644 index 0000000..b92cc7d --- /dev/null +++ b/examples/M5Stick JS bruce/dino_game_M5.js @@ -0,0 +1,508 @@ +var display = require('display'); +var keyboard = require('keyboard'); +var audio = require('audio'); + +// I am putting all code in function to optimise, if variables are outside +// functions they are put in global namespace, and it's slower to get +// But if you store too much in one function you can cause stackoverflow +function main() { + // This is XBM format, you can convert images to this format using: + // https://www.online-utility.org/image/convert/to/XBM + // dinoRun: 40x43 + var dinoRunWidth = 40; + var dinoRunHeight = 43; + var dinoRunSprite = [ + new Uint8Array([ + 0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, 0x00, + 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xfc, 0xff, 0x00, 0x00, 0xf0, 0xfc, + 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0x3f, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x00, + 0xf0, 0xff, 0x0f, 0x03, 0x00, 0xfc, 0x0f, 0x00, 0x03, 0x00, 0xfc, 0x0f, + 0x00, 0x03, 0x80, 0xff, 0x0f, 0x00, 0x03, 0x80, 0xff, 0x0f, 0x00, 0x0f, + 0xf0, 0xff, 0xff, 0x00, 0x0f, 0xf0, 0xff, 0xff, 0x00, 0x3f, 0xfc, 0xff, + 0xcf, 0x00, 0x3f, 0xfc, 0xff, 0xcf, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0xff, 0x03, + 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0xc0, + 0xff, 0xff, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x3c, + 0x30, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + ]), + new Uint8Array([ + 0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, 0x00, + 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xfc, 0xff, 0x00, 0x00, 0xf0, 0xfc, + 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0x3f, 0x00, + 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x00, + 0xf0, 0xff, 0x0f, 0x03, 0x00, 0xfc, 0x0f, 0x00, 0x03, 0x00, 0xfc, 0x0f, + 0x00, 0x03, 0x80, 0xff, 0x0f, 0x00, 0x03, 0x80, 0xff, 0x0f, 0x00, 0x0f, + 0xf0, 0xff, 0xff, 0x00, 0x0f, 0xf0, 0xff, 0xff, 0x00, 0x3f, 0xfc, 0xff, + 0xcf, 0x00, 0x3f, 0xfc, 0xff, 0xcf, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0xff, 0x03, + 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0xc0, + 0xff, 0xff, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x30, 0x00, 0x00, + 0x00, 0xfc, 0x30, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x00, 0x00, 0x00, 0x3c, + 0xf0, 0x00, 0x00, 0x00, 0x0c, 0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + ]), + ]; + // dino_duck: 55x26 + var dinoDuckSprite = [ + new Uint8Array([ + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0x1f, 0x3f, 0xc0, 0xff, 0x7f, 0xe0, 0xff, 0x1f, 0x3f, 0xc0, 0xff, + 0x7f, 0xf8, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xc0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xe1, 0xff, 0x07, 0x00, 0xfc, 0xff, + 0xff, 0xe1, 0xff, 0x07, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, + ]), + new Uint8Array([ + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0x1f, 0x3f, 0xc0, 0xff, 0x7f, 0xe0, 0xff, 0x1f, 0x3f, 0xc0, 0xff, + 0x7f, 0xf8, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xc0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xe1, 0xff, 0x07, 0x00, 0xfc, 0xff, + 0xff, 0xe1, 0xff, 0x07, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xe1, 0x63, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xe1, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x78, 0x00, 0xe0, + 0x01, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x00, 0x00, + ]), + ]; + // ground: 623x12 + var groundSprite = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x60, + 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x60, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x60, 0x00, 0x00, 0x00, 0x80, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ]); + var bird1Sprite = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + ]); + var bird2Sprite = new Uint8Array([ + 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x0f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3f, 0x00, 0x00, 0x00, + 0xc0, 0x0f, 0xff, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0xff, 0x00, 0x00, 0x00, + 0xf0, 0x3f, 0xff, 0x03, 0x00, 0x00, 0xf0, 0x3f, 0xff, 0x03, 0x00, 0x00, + 0xfc, 0x3f, 0xff, 0x0f, 0x00, 0x00, 0xfc, 0x3f, 0xff, 0x0f, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ]); + var cactusSmallSprite = new Uint8Array([ + 0xc0, 0x01, 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x23, 0xe0, 0x73, + 0xe0, 0x73, 0xe0, 0x73, 0xe2, 0x73, 0xe7, 0x73, 0xe7, 0x73, 0xe7, 0x73, + 0xe7, 0x73, 0xe7, 0x73, 0xe7, 0x73, 0xe7, 0x7f, 0xe7, 0x3f, 0xe7, 0x1f, + 0xe7, 0x03, 0xff, 0x03, 0xfe, 0x03, 0xfc, 0x03, 0xe0, 0x03, 0xe0, 0x03, + 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x03, + 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x03, + ]); + var cactusBigSprite = new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x0e, 0x7f, 0x00, 0x1f, 0x7f, 0x00, + 0x1f, 0x7f, 0x00, 0x1f, 0x7f, 0x00, 0x1f, 0x7f, 0x00, 0x1f, 0x7f, 0x38, + 0x1f, 0x7f, 0x7c, 0x1f, 0x7f, 0x7c, 0x1f, 0x7f, 0x7c, 0x1f, 0x7f, 0x7c, + 0x1f, 0x7f, 0x7c, 0x1f, 0x7f, 0x7c, 0x1f, 0x7f, 0x7c, 0x1f, 0x7f, 0x7c, + 0x1f, 0x7f, 0x7c, 0xff, 0x7f, 0x7c, 0xfe, 0x7f, 0x7c, 0xfc, 0x7f, 0x7c, + 0xf8, 0x7f, 0x7c, 0xf0, 0x7f, 0x7c, 0x00, 0x7f, 0x7c, 0x00, 0xff, 0x3f, + 0x00, 0xff, 0x1f, 0x00, 0xff, 0x0f, 0x00, 0xff, 0x07, 0x00, 0x7f, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x04, 0xd0, 0x7f, 0x00, + ]); + // cloud: 46x13 + var cloudSprite = new Uint8Array([ + 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x73, 0x00, 0x00, + 0x00, 0x00, 0x18, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x80, 0x07, 0x00, 0x00, 0x00, 0x02, 0x80, 0xfc, 0x00, + 0x00, 0xc0, 0x03, 0x40, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x07, + 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x36, 0x02, 0x00, 0x00, 0x00, 0x20, + 0x03, 0xfc, 0xff, 0xff, 0xff, 0x3f, + ]); + var obstacles = [ + { + isAnimated: true, + spawnsY: [88, 62, 45], + width: 42, + height: 36, + sprites: [bird1Sprite, bird2Sprite], + }, + { + isAnimated: false, + spawnsY: [92], + width: 15, + height: 33, + sprites: [cactusSmallSprite], + }, + { + isAnimated: false, + spawnsY: [78], + width: 23, + height: 47, + sprites: [cactusBigSprite], + }, + ]; + var black = display.color(0, 0, 0); + var white = display.color(255, 255, 255); + var grey = display.color(100, 100, 100); + var gravity = 700; + + // Dino properties + var dinoY = 82; // Initial position + var dinoVelocity = 0; + var dinoJumpStrength = -350; + var dinoIsJumping = false; + var dinoIsDucking = false; + + // Obstacle properties + var obstacleX = 300; // Start off-screen + var obstacle = obstacles[1]; + var obstacleY = obstacle.spawnsY[0]; + + // Ground properties + var groundX = 0; // Track ground position + var groundSpeed = 4; // Speed of ground movement + var sprite = display.createSprite(); + + var deltaTime = 0; + var nowTime = now(); + var oldTime = nowTime; + var startTime = nowTime; + + var playPointSound = 0; + + var dayInterval = 700; + var dayTransitionRange = 10; + var baseColorValue = 0; + var baseColorInverted = Math.abs(baseColorValue - 255); + + var displayWidth = display.width(); + var displayHeight = display.height(); + + var clouds = [ + { x: random(displayWidth, displayWidth + 100), y: random(0, 50) }, + { x: random(displayWidth + 200, displayWidth + 300), y: random(0, 50) }, + { x: random(displayWidth + 400, displayWidth + 500), y: random(0, 50) } + ]; + var foreground = black; + var background = white; + + var score = 0; + + sprite.fill(background); + sprite.setTextColor(foreground); + sprite.setTextSize(2); + sprite.setTextAlign(2); + keyboard.setLongPress(true); + while (true) { + if (keyboard.getPrevPress(true)) { + break; // Exits the game when a prev button is pressed. + } + + var selPressed = keyboard.getSelPress(true); + if (selPressed && !dinoIsJumping && !dinoIsDucking) { + dinoVelocity = dinoJumpStrength; // Start the jump + dinoIsJumping = true; + audio.tone(494, 40, true); + } + + var nextPressed = keyboard.getNextPress(true) || keyboard.getEscPress(true); + if (nextPressed && !dinoIsJumping) { + dinoIsDucking = true; + } + + if (!nextPressed && dinoIsDucking) { + dinoIsDucking = false; + } + + nowTime = now(); + deltaTime = (nowTime - oldTime) / 1000; + oldTime = nowTime; + + score = Math.floor((nowTime - startTime) / 100); + + if (playPointSound === 0 && score % 100 < 10 && score > 50) { + playPointSound = 1; + audio.tone(784, 80, true); + } else if (playPointSound === 1) { + audio.tone(784, 220, true); + playPointSound = 2; + } else if (score % 100 > 50 && playPointSound === 2) { + playPointSound = 0; + } + + // Apply gravity + dinoVelocity += gravity * deltaTime; + dinoY += dinoVelocity * deltaTime; + + // Prevent dino from falling below ground + if (dinoY > 82) { + dinoY = 82; + dinoIsJumping = false; // Allow jumping again + dinoVelocity = 0; + } + + groundSpeed = 4 + Math.floor(score / 200); + // Move the ground + groundX -= groundSpeed; + if (groundX <= -383) { + groundX = 0; // Reset position for seamless looping + } + + // Move the obstacle + obstacleX -= groundSpeed; + // Reset obstacle + if (obstacleX < -obstacle.width) { + obstacleX = displayWidth + random(0, 100); // Random respawn + obstacle = obstacles[random(0, 3)]; + obstacleY = obstacle.spawnsY[random(0, obstacle.spawnsY.length)]; + } + + // Move clouds + for (var i = 0; i < 2; i++) { + clouds[i].x -= groundSpeed - 2; + if (clouds[i].x < -46) { + clouds[i].x = displayWidth + 50; + clouds[i].y = random(0, 50); + } + } + + // Day/night cycle + var modScore = score % (dayInterval * 2); + baseColorValue = 0; + baseColorInverted = 255; + if (modScore % dayInterval >= dayInterval - dayTransitionRange) { + baseColorValue = Math.round( + 255 * + (((modScore % dayInterval) - (dayInterval - dayTransitionRange)) / + dayTransitionRange) + ); + baseColorInverted = Math.abs(baseColorValue - 255); + } + if (modScore < dayInterval) { + foreground = display.color( + baseColorValue, + baseColorValue, + baseColorValue + ); + background = display.color( + baseColorInverted, + baseColorInverted, + baseColorInverted + ); + } else { + foreground = display.color( + baseColorInverted, + baseColorInverted, + baseColorInverted + ); + background = display.color( + baseColorValue, + baseColorValue, + baseColorValue + ); + } + + // Draw the scene + sprite.fill(background); + for (var i = 0; i < 2; i++) { + sprite.drawXBitmap(clouds[i].x, clouds[i].y, cloudSprite, 46, 13, grey); + } + sprite.drawXBitmap(groundX, 118, groundSprite, 623, 12, foreground); + if ((displayWidth > 240) && ((623 + groundX) < displayWidth)) { + sprite.drawXBitmap(623 + groundX, 118, groundSprite, 623, 12, foreground); + } + sprite.drawXBitmap( + obstacleX, + obstacleY, + obstacle.sprites[ + obstacle.isAnimated ? Math.floor((nowTime % 500) / 250) : 0 + ], + obstacle.width, + obstacle.height, + foreground + ); + if (dinoIsDucking) { + sprite.drawXBitmap( + 10, + dinoY + 17, + dinoDuckSprite[Math.floor((nowTime % 200) / 100)], + 55, + 26, + foreground + ); + } else { + sprite.drawXBitmap( + 10, + dinoY, + dinoRunSprite[Math.floor((nowTime % 200) / 100)], + dinoRunWidth, + dinoRunHeight, + foreground + ); + } + sprite.setTextColor(foreground); + sprite.drawText(score, 235, 5); + sprite.pushSprite(); + + // Collision detection + if ( + 20 < obstacleX + obstacle.width && + 40 > obstacleX && + dinoY + dinoRunHeight - 20 /* dinoBottom */ > obstacleY + ) { + // Game over + if (obstacleY < 78) { + if (obstacleY < 50) { + if (!dinoIsJumping) continue; + } else { + if (dinoIsDucking) continue; + } + } + + audio.tone(60, 100); // 50 + delay(20); + audio.tone(60, 180); // 90 + display.setTextColor(foreground); + display.setTextSize(2); + display.setTextAlign(0); + display.drawText('GAME OVER', 70, 40); + delay(500); + while (!keyboard.getAnyPress()) { + delay(10); + } + + obstacleX = displayWidth + 50; + delay(500); + startTime = now(); + } + } + keyboard.setLongPress(false); +} +main(); diff --git a/examples/M5Stick JS bruce/gifs/half_patrick.gif b/examples/M5Stick JS bruce/gifs/half_patrick.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3bac8b21968124e6f9608410df7bc606fa07800 GIT binary patch literal 46951 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 AWB>pF literal 0 HcmV?d00001 diff --git a/examples/M5Stick JS bruce/gifs/half_rick.gif b/examples/M5Stick JS bruce/gifs/half_rick.gif new file mode 100644 index 0000000000000000000000000000000000000000..83c405b50c2a830958afd8ba06db732c6d7fd350 GIT binary patch literal 87022 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 literal 0 HcmV?d00001 diff --git a/examples/M5Stick JS bruce/gifs/half_spongebob.gif b/examples/M5Stick JS bruce/gifs/half_spongebob.gif new file mode 100644 index 0000000000000000000000000000000000000000..35f7dd10597f11f7955df46cb33c4009e29c8460 GIT binary patch literal 59774 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 l_!H)vV#cL~;Iivnf 0) fps = frames / elapsed; + } + + // --- KILÉPÉS --- + // Csak az oldalsó gomb (Next) vagy ESC (Prev) + if (keyboard.getNextPress() || keyboard.getPrevPress()) { + + display.fill(0); + println("Closing..."); + + // *** A HIBAJAVÍTÁS LÉNYEGE: *** + // Megpróbáljuk szépen bezárni őket, de ha hiba van, elnyomjuk azt. + try { + if (gif1) gif1.close(); + } catch (e) { /* Hiba elnyomása */ } + + try { + if (gif2) gif2.close(); + } catch (e) { /* Hiba elnyomása */ } + + try { + if (gif3) gif3.close(); + } catch (e) { /* Hiba elnyomása */ } + + delay(100); // Pici várakozás + break; + } + } +} + +main(); \ No newline at end of file diff --git a/examples/M5Stick JS bruce/highway_racer_M5.js b/examples/M5Stick JS bruce/highway_racer_M5.js new file mode 100644 index 0000000..fe2d9b3 --- /dev/null +++ b/examples/M5Stick JS bruce/highway_racer_M5.js @@ -0,0 +1,253 @@ +var display = require('display'); +var keyboard = require('keyboard'); + +// --- API Hivatkozások --- +var width = display.width; +var height = display.height; +var drawFillRect = display.drawFillRect; +var drawString = display.drawString; +var setTextSize = display.setTextSize; + +// --- Kijelző Méretek --- +var screenWidth = width(); +var screenHeight = height(); + +// --- Konfiguráció --- +var LANE_COUNT = 4; +var LANE_WIDTH = Math.floor(screenWidth / LANE_COUNT); +var CAR_WIDTH = Math.floor(LANE_WIDTH * 0.5); +var CAR_HEIGHT = Math.floor(LANE_WIDTH * 0.8); + +// A JÁTÉKOS Y POZÍCIÓJA (FIX) +var PLAYER_Y = screenHeight - CAR_HEIGHT - 10; + +// Színek +var COLOR_PLAYER = 0x0066FF; +var COLOR_ENEMY1 = 0xFF0000; +var COLOR_ENEMY2 = 0x00FF00; +var COLOR_ENEMY3 = 0xFFFF00; +var COLOR_ROAD = 0x202020; +var COLOR_LINE = 0xFFFFFF; + +// --- Játék Állapot --- +var playerLane = 1; +var playerX = 0; +var playerTargetX = 0; +var playerScore = 0; +var gameSpeed = 4; + +var cars = []; +var carSpawnTimer = 0; +var roadLines = []; + +var gameState = "START"; // START, PLAY, GAMEOVER +var menuSelection = 0; + +// --- Inicializálás --- +function initGame() { + playerLane = 1; + updatePlayerPosTarget(); + playerX = playerTargetX; + playerScore = 0; + cars = []; + carSpawnTimer = 0; + gameSpeed = 4; + gameState = "PLAY"; + + roadLines = []; + var numLines = Math.floor(screenHeight / 30) + 2; + for (var i = 0; i < numLines; i++) { + roadLines.push({ y: i * 30 }); + } +} + +function updatePlayerPosTarget() { + playerTargetX = (playerLane * LANE_WIDTH) + (LANE_WIDTH / 2); +} + +// --- Logika --- + +function updatePhysics() { + // Játékos mozgás + if (playerX !== playerTargetX) { + var diff = playerTargetX - playerX; + var step = Math.ceil(Math.abs(diff) / 3); + if (Math.abs(diff) <= step) { + playerX = playerTargetX; + } else { + playerX += diff > 0 ? step : -step; + } + } + + // Út mozgatása + for (var i = 0; i < roadLines.length; i++) { + roadLines[i].y += gameSpeed; + if (roadLines[i].y > screenHeight) { + roadLines[i].y = -30; + } + } + + // Ellenségek spawnolása + carSpawnTimer++; + var spawnThreshold = Math.max(15, 50 - (gameSpeed * 2)); + + if (carSpawnTimer > spawnThreshold) { + if (Math.random() > 0.3) { + spawnCar(); + carSpawnTimer = 0; + } + } + + // Autók mozgatása és ütközés + for (var i = cars.length - 1; i >= 0; i--) { + var car = cars[i]; + car.y += (car.speed + gameSpeed * 0.8); + + // Törlés ha kiment a képernyőről + if (car.y > screenHeight) { + cars.splice(i, 1); + playerScore++; + // Sebesség növelés + if (playerScore % 5 === 0 && gameSpeed < 12) { + gameSpeed += 0.5; + } + continue; + } + + // Ütközésvizsgálat + var dx = Math.abs(playerX - car.x); + + // ITT VOLT A HIBA: playerY helyett PLAYER_Y kell! + var dy = Math.abs(PLAYER_Y - car.y); + + // Ha ütközés van + if (dx < (CAR_WIDTH * 0.8) && dy < (CAR_HEIGHT * 0.8)) { + gameState = "GAMEOVER"; + } + } +} + +function spawnCar() { + var lane = Math.floor(Math.random() * LANE_COUNT); + + for (var i = 0; i < cars.length; i++) { + if (cars[i].lane === lane && cars[i].y < 60) return; + } + + var type = Math.floor(Math.random() * 3); + var cColor = type === 0 ? COLOR_ENEMY1 : type === 1 ? COLOR_ENEMY2 : COLOR_ENEMY3; + + cars.push({ + x: (lane * LANE_WIDTH) + (LANE_WIDTH / 2), + y: -40, + lane: lane, + speed: 2 + Math.random() * 2, + color: cColor + }); +} + +// --- Rajzolás --- + +function drawCar(x, y, color, isPlayer) { + var w = CAR_WIDTH; + var h = CAR_HEIGHT; + var left = Math.floor(x - w / 2); + var top = Math.floor(y - h / 2); + + drawFillRect(left, top, w, h, color); + drawFillRect(left + 2, top + (h/4), w - 4, h/2, 0x000000); + + var lightColor = isPlayer ? 0xFF0000 : 0xFFFF00; + var lightY = isPlayer ? top + h - 2 : top; + + drawFillRect(left + 1, lightY, 3, 2, lightColor); + drawFillRect(left + w - 4, lightY, 3, 2, lightColor); +} + +function drawGame() { + drawFillRect(0, 0, screenWidth, screenHeight, COLOR_ROAD); + + for (var i = 1; i < LANE_COUNT; i++) { + var lx = i * LANE_WIDTH; + for (var j = 0; j < roadLines.length; j++) { + drawFillRect(lx - 1, roadLines[j].y, 2, 15, COLOR_LINE); + } + } + + for (var i = 0; i < cars.length; i++) { + drawCar(cars[i].x, cars[i].y, cars[i].color, false); + } + + // Játékos kirajzolása (PLAYER_Y változóval) + drawCar(playerX, PLAYER_Y, COLOR_PLAYER, true); + + setTextSize(1); + drawString("Score: " + playerScore, 2, 2); +} + +function drawMenu(title, subtitle) { + drawFillRect(0, 0, screenWidth, screenHeight, 0x000000); + setTextSize(2); + drawString(title, (screenWidth/2) - (title.length*6), 30); + setTextSize(1); + drawString(subtitle, (screenWidth/2) - (subtitle.length*3), 60); + drawString("[A] Start [B] Lane", 10, screenHeight - 20); +} + +function drawGameOver() { + var boxW = screenWidth - 40; + var boxH = 80; + var boxX = 20; + var boxY = (screenHeight / 2) - 40; + + drawFillRect(boxX, boxY, boxW, boxH, 0x330000); + drawFillRect(boxX+2, boxY+2, boxW-4, boxH-4, 0xFF0000); + + setTextSize(2); + drawString("CRASH!", boxX + 25, boxY + 20); + setTextSize(1); + drawString("Score: " + playerScore, boxX + 35, boxY + 45); + drawString("Press [A] to Retry", boxX + 15, boxY + 65); +} + +// --- Fő Loop --- + +drawMenu("RACER", "M5Stick Edition"); + +while (true) { + var btnA = keyboard.getSelPress(); // Nagy gomb + var btnB = keyboard.getNextPress(); // Oldalsó gomb + var btnEsc = keyboard.getEscPress(); // CardKB ESC + + if (btnEsc) break; + + if (gameState === "START") { + if (btnA) initGame(); + } + + else if (gameState === "GAMEOVER") { + if (btnA) initGame(); + } + + else if (gameState === "PLAY") { + // BALRA: A gomb vagy Prev + if ((btnA || keyboard.getPrevPress()) && playerLane > 0) { + playerLane--; + updatePlayerPosTarget(); + } + + // JOBBRA: B gomb vagy Next + if ((btnB || keyboard.getNextPress()) && playerLane < LANE_COUNT - 1) { + playerLane++; + updatePlayerPosTarget(); + } + + updatePhysics(); + drawGame(); + } + + delay(33); +} + +display.fill(0); +drawString("Bye!", 60, 60); \ No newline at end of file diff --git a/examples/M5Stick JS bruce/space_shooter_M5.js b/examples/M5Stick JS bruce/space_shooter_M5.js new file mode 100644 index 0000000..d386fc5 --- /dev/null +++ b/examples/M5Stick JS bruce/space_shooter_M5.js @@ -0,0 +1,315 @@ +var display = require('display'); +var keyboard = require('keyboard'); + +// --- API Hivatkozások --- +var width = display.width; +var height = display.height; +var fillScreen = display.fill; +var drawFillRect = display.drawFillRect; +var drawString = display.drawString; +var setTextSize = display.setTextSize; + +// --- Kijelző Méretek --- +var screenWidth = width(); +var screenHeight = height(); + +// --- Játék Beállítások --- +var PLAYER_WIDTH = 12; +var PLAYER_HEIGHT = 8; +var PLAYER_SPEED = 8; +var RELOAD_SPEED = 4; + +// Színek +var COLOR_PLAYER = 0x00FF00; +var COLOR_BULLET = 0xFFFF00; +var COLOR_ENEMY = 0xFF0000; +var COLOR_ENEMY_BULLET = 0xFF6600; +var COLOR_BOSS = 0xFF00FF; +var COLOR_BG = 0x000000; +var COLOR_STAR = 0xAAAAAA; + +// --- Változók --- +var playerX = screenWidth / 2; +var playerY = screenHeight - 20; +var playerLives = 3; +var playerScore = 0; +var playerReloadTimer = 0; + +var bullets = []; +var enemies = []; +var enemyBullets = []; +var bosses = []; +var stars = []; + +var level = 1; +var enemySpawnTimer = 0; +var bossSpawnTimer = 0; + +var gameRunning = true; +var gameOver = false; +var gameState = "START"; + +// --- CSILLAGOK --- +function initStars() { + stars = []; + for (var i = 0; i < 15; i++) { + stars.push({ + x: Math.floor(Math.random() * screenWidth), + y: Math.floor(Math.random() * screenHeight), + speed: 1 + Math.random() * 2 + }); + } +} + +function updateAndDrawStars() { + for (var i = 0; i < stars.length; i++) { + drawFillRect(Math.floor(stars[i].x), Math.floor(stars[i].y), 1, 1, COLOR_BG); + stars[i].y += stars[i].speed; + if (stars[i].y > screenHeight) { + stars[i].y = 0; + stars[i].x = Math.random() * screenWidth; + } + drawFillRect(Math.floor(stars[i].x), Math.floor(stars[i].y), 1, 1, COLOR_STAR); + } +} + +// --- LÖVEDÉKEK --- +function createBullet(x, y, isPlayer) { + if (isPlayer) { + bullets.push({x: x, y: y, speed: 6, width: 2, height: 6}); + } else { + enemyBullets.push({x: x, y: y, speed: 3, width: 2, height: 4}); + } +} + +// --- ELLENSÉGEK --- +function createEnemy(type) { + var enemy = { + x: Math.random() * (screenWidth - 16), + y: -10, + width: 12, height: 8, + speed: 1 + level * 0.2, + health: 1, type: type, shootTimer: 0 + }; + if (type === 2) { + enemy.width = 16; enemy.height = 12; + enemy.health = 3; enemy.speed = 0.5 + level * 0.1; + } + enemies.push(enemy); +} + +function createBoss() { + var boss = { + x: screenWidth / 2 - 20, y: -40, + width: 40, height: 25, speed: 1, + health: 20 + (level * 5), maxHealth: 20 + (level * 5), + type: 1, shootTimer: 0, moveDir: 1 + }; + bosses.push(boss); +} + +// --- LOGIKA --- + +function updatePlayer(btnLeft, btnRight, btnFire) { + // Balra (Prev) + if (btnLeft && playerX > 0) { + playerX -= PLAYER_SPEED; + } + + // Jobbra (Next) + if (btnRight && playerX < screenWidth - PLAYER_WIDTH) { + playerX += PLAYER_SPEED; + } + + // Tűz (Sel) + if (playerReloadTimer > 0) playerReloadTimer--; + + if (btnFire && playerReloadTimer === 0) { + createBullet(playerX + PLAYER_WIDTH / 2 - 1, playerY - 2, true); + playerReloadTimer = RELOAD_SPEED; + } +} + +function updateGameObjects() { + // Lövedékek + for (var i = bullets.length - 1; i >= 0; i--) { + bullets[i].y -= bullets[i].speed; + if (bullets[i].y < -10) { bullets.splice(i, 1); continue; } + + for (var j = enemies.length - 1; j >= 0; j--) { + var e = enemies[j]; + if (bullets[i] && e && + bullets[i].x < e.x + e.width && bullets[i].x + bullets[i].width > e.x && + bullets[i].y < e.y + e.height && bullets[i].y + bullets[i].height > e.y) { + bullets.splice(i, 1); + e.health--; + if (e.health <= 0) { enemies.splice(j, 1); playerScore += 10; } + break; + } + } + if (bullets[i]) { + for (var b = 0; b < bosses.length; b++) { + var boss = bosses[b]; + if (bullets[i].x < boss.x + boss.width && bullets[i].x + bullets[i].width > boss.x && + bullets[i].y < boss.y + boss.height && bullets[i].y + bullets[i].height > boss.y) { + bullets.splice(i, 1); + boss.health--; + if (boss.health <= 0) { + bosses.splice(b, 1); playerScore += 500; level++; playerLives++; + } + break; + } + } + } + } + + // Ellenségek + enemySpawnTimer++; + if (bosses.length === 0 && enemySpawnTimer > Math.max(20, 60 - level * 5)) { + enemySpawnTimer = 0; + createEnemy(Math.random() > 0.8 ? 2 : 1); + } + bossSpawnTimer++; + if (bosses.length === 0 && playerScore > level * 500 && bossSpawnTimer > 200) { + createBoss(); bossSpawnTimer = 0; + } + + for (var i = enemies.length - 1; i >= 0; i--) { + var e = enemies[i]; + e.y += e.speed; + e.shootTimer++; + if (e.shootTimer > 80 - level) { + e.shootTimer = 0; + if (Math.random() > 0.5) createBullet(e.x + e.width/2, e.y + e.height, false); + } + if (e.y > screenHeight) { enemies.splice(i, 1); continue; } + if (e.x < playerX + PLAYER_WIDTH && e.x + e.width > playerX && + e.y < playerY + PLAYER_HEIGHT && e.y + e.height > playerY) { + playerLives--; enemies.splice(i, 1); + if (playerLives <= 0) gameState = "GAMEOVER"; + } + } + + // Boss + for (var i = 0; i < bosses.length; i++) { + var boss = bosses[i]; + if (boss.y < 20) boss.y++; + boss.x += boss.speed * boss.moveDir; + if (boss.x <= 0 || boss.x >= screenWidth - boss.width) boss.moveDir *= -1; + boss.shootTimer++; + if (boss.shootTimer > 20) { + createBullet(boss.x + boss.width/2, boss.y + boss.height, false); + if (level > 2) { + createBullet(boss.x, boss.y + boss.height, false); + createBullet(boss.x + boss.width, boss.y + boss.height, false); + } + boss.shootTimer = 0; + } + } + + // Ellenség lövedék + for (var i = enemyBullets.length - 1; i >= 0; i--) { + var eb = enemyBullets[i]; + eb.y += eb.speed; + if (eb.y > screenHeight) { enemyBullets.splice(i, 1); continue; } + if (eb.x < playerX + PLAYER_WIDTH && eb.x + eb.width > playerX && + eb.y < playerY + PLAYER_HEIGHT && eb.y + eb.height > playerY) { + enemyBullets.splice(i, 1); playerLives--; + if (playerLives <= 0) gameState = "GAMEOVER"; + } + } +} + +// --- RAJZOLÁS --- +function drawGame() { + fillScreen(COLOR_BG); + updateAndDrawStars(); + + drawFillRect(Math.floor(playerX), Math.floor(playerY), PLAYER_WIDTH, PLAYER_HEIGHT, COLOR_PLAYER); + drawFillRect(Math.floor(playerX + PLAYER_WIDTH/2 - 2), Math.floor(playerY - 2), 4, 2, COLOR_PLAYER); + + for (var i = 0; i < bullets.length; i++) drawFillRect(Math.floor(bullets[i].x), Math.floor(bullets[i].y), bullets[i].width, bullets[i].height, COLOR_BULLET); + for (var i = 0; i < enemyBullets.length; i++) drawFillRect(Math.floor(enemyBullets[i].x), Math.floor(enemyBullets[i].y), enemyBullets[i].width, enemyBullets[i].height, COLOR_ENEMY_BULLET); + + for (var i = 0; i < enemies.length; i++) { + var e = enemies[i]; + drawFillRect(Math.floor(e.x), Math.floor(e.y), e.width, e.height, COLOR_ENEMY); + drawFillRect(Math.floor(e.x + 2), Math.floor(e.y + 2), 2, 2, 0xFFFFFF); + drawFillRect(Math.floor(e.x + e.width - 4), Math.floor(e.y + 2), 2, 2, 0xFFFFFF); + } + for (var i = 0; i < bosses.length; i++) { + var b = bosses[i]; + drawFillRect(Math.floor(b.x), Math.floor(b.y), b.width, b.height, COLOR_BOSS); + var hpBar = (b.health / b.maxHealth) * b.width; + drawFillRect(Math.floor(b.x), Math.floor(b.y - 4), Math.floor(hpBar), 2, 0x00FF00); + } + + setTextSize(1); + drawString("Score: " + playerScore, 2, 2); + drawString("HP: " + playerLives, screenWidth - 40, 2); +} + +function drawMenu(title, sub) { + fillScreen(0x000000); + setTextSize(2); drawString(title, 20, 30); + setTextSize(1); drawString(sub, 20, 60); + drawString("[Prev] Left [Next] Right", 5, screenHeight - 20); + drawString("[M5] Fire [Prev+Next] Exit", 5, screenHeight - 10); +} + +function drawGameOver() { + fillScreen(0x000000); + drawFillRect(20, 30, screenWidth - 40, 80, 0x330000); + setTextSize(2); drawString("GAME OVER", 35, 45); + setTextSize(1); drawString("Score: " + playerScore, 50, 70); + drawString("Press [M5] to Retry", 30, 90); +} + +// --- FŐ CIKLUS --- + +// FONTOS: Kikapcsoljuk a hosszú nyomást, hogy ne zavarjon +keyboard.setLongPress(false); + +initStars(); +drawMenu("SPACE", "SHOOTER"); + +while (true) { + // Először eltároljuk a gombok állapotát + var btnFire = keyboard.getSelPress(); // M5 Nagy gomb + var btnLeft = keyboard.getPrevPress(); // Felső (Prev) + var btnRight = keyboard.getNextPress(); // Alsó (Next) + + // KILÉPÉS: Ha mindkettőt egyszerre nyomod (Prev + Next) + // Megjegyzés: Egyszerre kell lenyomni őket! + if (btnLeft && btnRight) { + break; + } + + if (gameState === "START") { + if (btnFire) { + gameState = "PLAY"; + playerX = screenWidth / 2; + playerLives = 3; + playerScore = 0; + level = 1; + enemies = []; bullets = []; bosses = []; enemyBullets = []; + } + } + else if (gameState === "GAMEOVER") { + if (btnFire) gameState = "START"; + } + else if (gameState === "PLAY") { + // Átadjuk a gombok állapotát a játékos frissítésnek + updatePlayer(btnLeft, btnRight, btnFire); + updateGameObjects(); + drawGame(); + } + + if (gameState === "START") drawMenu("SPACE", "SHOOTER"); + if (gameState === "GAMEOVER") drawGameOver(); + + delay(30); +} + +fillScreen(0); +drawString("Bye!", 60, 60); \ No newline at end of file diff --git a/examples/M5Stick JS bruce/tamagochi_M5.js b/examples/M5Stick JS bruce/tamagochi_M5.js new file mode 100644 index 0000000..7382831 --- /dev/null +++ b/examples/M5Stick JS bruce/tamagochi_M5.js @@ -0,0 +1,354 @@ +// created by hxd57. V2 +// repository: https://github.com/HawkstoNGriM/m5-bruce-tamagochi-lite +var dbStore = {fs: "sd", path: "/pet.json"}; // fs can be "sd" or "littlefs" +var storage = require("storage"); +var display = require('display'); +var keyboardApi = require('keyboard'); +var dialog = require('dialog'); +var serialApi = require('serial'); + +var width = display.width; +var height = display.height; +var color = display.color; +var fillScreen = display.fill; +var drawString = display.drawString; +var setTextColor = display.setTextColor; +var setTextSize = display.setTextSize; + +var keyboardPrompt = keyboardApi.keyboard; +var getNextPress = keyboardApi.getNextPress; + +var dialogMessage = dialog.message; +var dialogError = dialog.error; +var dialogChoice = dialog.choice; + +var serialCmd = serialApi.cmd; +var pastelColors = { + "Peach": color(255, 223, 186), + "Mint": color(186, 255, 201), + "Pink": color(255, 186, 255), + "Blue": color(186, 225, 255), + "Yellow": color(255, 255, 186), + "White": color(255, 255, 255), + "Lavender": color(230, 230, 250), + "Coral": color(255, 127, 80), + "Aqua": color(127, 255, 212), + "Beige": color(245, 245, 220) +}; +var currentBgColor = pastelColors["Peach"]; + +var faceColors = { + "Black": color(0, 0, 0), + "White": color(255, 255, 255), + "Red": color(255, 0, 0), + "Blue": color(0, 0, 255), + "Green": color(0, 255, 0), + "Purple": color(128, 0, 128) +}; +var faceColor = faceColors["Black"]; // Default face color + +function Pet(name, type, hunger, cleanliness, happiness, timeLastFed, timeLastPet, timeLastCleaned) { + this.name = name || "gotchi"; // Changed default name to "gotchi" + this.type = type || "cat"; + this.hunger = Math.min(100, Math.max(0, hunger !== undefined ? hunger : 0)); // Ensure hunger is between 0% and 100% + this.cleanliness = Math.min(100, Math.max(0, cleanliness !== undefined ? cleanliness : 100)); // Ensure cleanliness is between 0% and 100% + this.happiness = Math.min(100, Math.max(0, happiness !== undefined ? happiness : 50)); // Ensure happiness is between 0% and 100% + var time = now(); + this.timeLastFed = timeLastFed || time; + this.timeLastPet = timeLastPet || time; + this.timeLastCleaned = timeLastCleaned || time; // Track cleaning time +} + +Pet.prototype = { + feed: function() { + this.hunger = Math.max(0, this.hunger - 10); // Reduce hunger by 10%, but not below 0% + this.timeLastFed = now(); + this.happiness = Math.min(100, this.happiness + 20); // Increase happiness by 20%, but not above 100% + display.fill(currentBgColor); + dialogMessage(this.name + " has been fed!"); + }, + clean: function() { + this.cleanliness = 100; // Fully clean + this.timeLastCleaned = now(); + display.fill(currentBgColor); + dialogMessage(this.name + " is now clean!"); + }, + pet: function() { + this.happiness = Math.min(100, this.happiness + 10); // Reduced happiness gain + this.timeLastPet = now(); + display.fill(currentBgColor); + dialogMessage(this.name + " loves your petting!"); + }, + updateHunger: function() { + var time = now(); + var elapsed = time - this.timeLastFed; + this.hunger = Math.min(100, Math.max(0, this.hunger + Math.floor(elapsed / 7200000) * 10)); // Ensure hunger is between 0% and 100% + }, + updateHappiness: function() { + var time = now(); + var elapsed = time - this.timeLastPet; + this.happiness = Math.max(0, this.happiness - Math.floor(elapsed / 3600000) * 5); // Ensure happiness is between 0% and 100% + }, + updateCleanliness: function() { + var time = now(); + var elapsed = time - this.timeLastCleaned; + var hours = elapsed / 3600000; + this.cleanliness = Math.max(0, 100 - Math.floor(hours * 5)); // Ensure cleanliness is between 0% and 100% + }, + save: function() { + var petData = { + name: this.name, + type: this.type, + hunger: this.hunger, + cleanliness: this.cleanliness, + happiness: this.happiness, + timeLastFed: this.timeLastFed, + timeLastPet: this.timeLastPet, + timeLastCleaned: this.timeLastCleaned // Save cleaning time + }; + var jsonString = JSON.stringify(petData) + "\n"; + storage.write(dbStore, jsonString); + } +}; + + +function loadPet() { + var data = null; + try { + data = storage.read(dbStore); + } catch (e) { + return null; + } + + if (data) { + try { + var lines = data.split("\n"); + // Filter out empty lines + var nonEmptyLines = []; + for (var i = 0; i < lines.length; i++) { + if (lines[i].trim() !== "") nonEmptyLines.push(lines[i]); + } + var lastLine = nonEmptyLines[nonEmptyLines.length - 1]; + if (lastLine) { + var obj = JSON.parse(lastLine); + // Ensure timeLastFed and timeLastPet are numbers + obj.timeLastFed = Number(obj.timeLastFed); + obj.timeLastPet = Number(obj.timeLastPet); + // Handle old saves without timeLastCleaned + if (obj.timeLastCleaned === undefined) { + var hoursAgo = (100 - obj.cleanliness) / 5; + obj.timeLastCleaned = now() - hoursAgo * 3600000; + } else { + obj.timeLastCleaned = Number(obj.timeLastCleaned); + } + return new Pet(obj.name, obj.type, obj.hunger, obj.cleanliness, + obj.happiness, obj.timeLastFed, obj.timeLastPet, obj.timeLastCleaned); + } + } catch (e) { + display.fill(currentBgColor); + dialogError("Failed to load pet data: " + e.message); + return null; + } + } + return null; // No pet file found +} + +function drawPet(pet) { + var screenWidth = width(); + var screenHeight = height(); + var textYSpacing = 14; + + var faces = { + cat: [" >_< ", "=^_^=", " ^-^ "], + dog: [" T_T ", " o_o ", " ^_^ "], + bird: [" x_x ", " -_- ", " ^v^ "] + }; + + fillScreen(currentBgColor); + setTextColor(faceColor); + setTextSize(2); + + // Include cleanliness in state calculation + var stateIndex = (pet.hunger >= 70 || pet.happiness <= 30 || pet.cleanliness <= 30) ? 0 : + (pet.hunger >= 30 || pet.happiness <= 50 || pet.cleanliness <= 50) ? 1 : 2; + + var face = faces[pet.type][stateIndex]; + var faceWidth = face.length * 12; + var faceX = Math.floor((screenWidth - faceWidth) / 2); + var faceY = Math.floor(screenHeight * 0.3); + + var time = now(); + if (time % 4000 < 200) { + face = face.replace(/[^\s]/g, "-"); + } + if (stateIndex === 2 && time % 1000 < 500) { + faceX += Math.sin(time / 200) * (screenWidth * 0.1); + } + + drawString(face, faceX, faceY); + drawString(face, faceX + 1, faceY); + + var happyText = "Happy: " + pet.happiness + "%"; + var happyWidth = happyText.length * 12; + var happyX = Math.floor((screenWidth - happyWidth) / 2); + drawString(happyText, happyX, 10); + + var statusY = screenHeight - 60; + drawString("Hngr: " + pet.hunger + "%", 10, statusY); + drawString("Clean: " + pet.cleanliness + "%", 10, statusY + textYSpacing); + + var fedHrs = Math.floor((time - pet.timeLastFed) / 3600000); + var petHrs = Math.floor((time - pet.timeLastPet) / 3600000); + drawString("Fed:" + fedHrs + "h Pet:" + petHrs + "h", 10, screenHeight - 30); +} + + + +function showHeartAnimation() { + var screenWidth = width(); + var screenHeight = height(); + var heartText = "<3-<3"; + var heartWidth = heartText.length * 12; + var heartX = Math.floor((screenWidth - heartWidth) / 2); + var heartY = Math.floor(screenHeight * 0.5); + + // Use the current background color + fillScreen(currentBgColor); + setTextColor(faceColor); + setTextSize(1); + + // Draw the heart + drawString(heartText, heartX, heartY); + + delay(1000); + + var heartWidth2 = 7 * 12; + var heartX = Math.floor((screenWidth - heartWidth2) / 2); + var heartY = Math.floor(screenHeight * 0.5); + fillScreen(currentBgColor); + setTextColor(faceColor); + setTextSize(1); + drawString(heartText, heartX, heartY); + + delay(1000); + + var heartWidth2 = 3 * 12; + var heartX = Math.floor((screenWidth - heartWidth2) / 2); + var heartY = Math.floor(screenHeight * 0.5); + fillScreen(currentBgColor); + setTextColor(color(255, 0, 0)); + setTextSize(1); + drawString(heartText, heartX, heartY); + + delay(1000); + + // Restore the original background color + fillScreen(currentBgColor); +} + +var pet = loadPet(); + +if (!pet) { + fillScreen(currentBgColor); + setTextColor(faceColor); + setTextSize(2); + var name = keyboardPrompt("", 12, "Pet's name?") || "gotchi"; // Default to "gotchi" + var type = dialogChoice({["Cat"]:"cat", ["Dog"]:"dog", ["Bird"]:"bird"}) || "cat"; + pet = new Pet(name, type); + pet.save(); +} + +var updateTime=0; +while (true) { + if(now()-updateTime>500){ + pet.updateHunger(); + pet.updateHappiness(); + pet.updateCleanliness(); + drawPet(pet); + updateTime = now(); + } + + if (getNextPress()) { + var choice = dialogChoice({ + ["Pet"]: "pet", + ["Feed"]: "feed", + ["Clean"]: "clean", + ["Heart"]: "heart", + ["Settings"]: "settings", + ["New Pet"]: "newpet", + ["Exit"]: "exit" + }) || ""; + + if (choice === "exit") { + pet.save(); // Save before exiting + break; + } + + if (choice === "settings") { + var setting = dialogChoice({ + ["Change BG Color"]: "bgcolor", + ["Face Color"]: "facecolor", + ["Back"]: "back" + }); + + if (setting === "bgcolor") { + var colorChoice = dialogChoice([ + "Peach", + "Mint", + "Pink", + "Blue", + "Yellow", + "White", + "Lavender",, + "Coral", + "Aqua", + "Beige" + ]); + if (colorChoice && pastelColors[colorChoice]) { + currentBgColor = pastelColors[colorChoice]; + } + } + else if (setting === "facecolor") { + var fc = dialogChoice({ + ["Black"]: "black", + ["White"]: "white", + ["Red"]: "red", + ["Blue"]: "blue", + ["Green"]: "green", + ["Purple"]: "purple" + }); + faceColor = faceColors[fc]; + } + } + else if (choice === "newpet") { + var confirm = dialogChoice({ + ["Yes (will delete old pet)"]: "yes", + ["No (cancel)"]: "no" + }); + + if (confirm === "yes") { + serialCmd("storage remove JS-scripts/bruce_0.sub"); + serialCmd("storage remove pet.json"); + + // Create a new pet + fillScreen(currentBgColor); + setTextColor(faceColor); + setTextSize(2); + var name = keyboardPrompt("", 12, "Pet's name?") || "gotchi"; // Default to "gotchi" + var type = dialogChoice({["Cat"]:"cat", ["Dog"]:"dog", ["Bird"]:"bird"}) || "cat"; + pet = new Pet(name, type); + pet.save(); + } + } + else if (choice === "heart") { + showHeartAnimation(); + } + else if (choice && pet[choice]) { + pet[choice](); + delay(1000); + } + pet.save(); // Save after performing an action + } + + delay(10); +}