/*--------------------------------------------------- ----------------------------------------------------- Filename: nibbles.m Version: 1.0 Type: maki Date: 23. Okt. 2006 - 21:11 Author: Martin Poehlmann aka Deimos E-Mail: martin@skinconsortium.com Internet: www.skinconsortium.com www.martin.deimos.de.vu ----------------------------------------------------- ---------------------------------------------------*/ #define GAME_SPEED 30 #define MAX_H 59 #define MAX_W 72 #define MAX_LLAMAS 9 function init_nibbles(); Function setLlama(); Function gotLlama(); Function showInfo(string s); Function showInfo2(); Function hideInfo2(); Function startGame(int level); Function setPos(layer l, int x, int y); Function checkforWalls(layer l); Function checkforLlama(layer l); Function checkforSammy(layer l); Function sammyDies (); Function addSammy(); Function syncSammy(); Function Layer createSammy(int num, int x, int y); Global group nibbles; Global Layer bg, llama, info, info2; Global Text infotxt, infotxt2a, infotxt2b, infotxt2c, infotxt2d; Global Layer sammy0; Global String gamestate = "startup"; Global String direction; Global Boolean gotkey = 0; Global Timer move; Global Boolean paused; Global map wall; Global int s_score, s_lives, s_level, currentllama; Global Text t_score, t_lives, t_level; Global int n_sammy, expn_sammy; Global List sammy, sammy_x, sammy_y; Global Group sammys; Global int cheat, nocheat; Global int cheat2, nocheat2; Global int cheat3, nocheat3; Global int evercheat; Global Text c1, c2, c3; init_nibbles() { sammy = new List; sammy_x = new List; sammy_y = new List; llama = nibbles.getObject("llama"); sammy0 = nibbles.getObject("sammy0"); info = nibbles.getObject("info"); infotxt = nibbles.getObject("infotxt"); sammys = nibbles.getObject("sammys"); bg = nibbles.getObject("bg"); info2 = nibbles.getObject("info2"); infotxt2a = nibbles.getObject("infotxt2a"); infotxt2b = nibbles.getObject("infotxt2b"); infotxt2c = nibbles.getObject("infotxt2c"); infotxt2d = nibbles.getObject("infotxt2d"); t_lives = nibbles.getObject("lives"); t_score = nibbles.getObject("score"); t_level = nibbles.getObject("level"); c1 = nibbles.getObject("c1"); c2 = nibbles.getObject("c2"); c3 = nibbles.getObject("c3"); gamestate = "startup"; n_sammy = 0; expn_sammy = 0; s_level = 1; s_score = 0; s_lives = 5; cheat = 0; nocheat = 0; cheat2 = 0; nocheat2 = 0; cheat3 = 0; nocheat3 = 0; evercheat = 0; move = new Timer; move.setDelay(GAME_SPEED); } System.onKeyDown (String key) { if (nibbles.isVisible() && nibbles.isActive()) { if (!gotkey) { if (strsearch(key, "up") != -1 && direction != "d" && direction != "u") { if (move.isRunning()) { gotkey = 1; direction = "u"; complete; return; } } else if (strsearch(key, "down") != -1 && direction != "u" && direction != "d") { if (move.isRunning()) { gotkey = 1; direction = "d"; complete; return; } } else if (strsearch(key, "left") != -1 && direction != "r" && direction != "l") { if (move.isRunning()) { gotkey = 1; direction = "l"; complete; return; } } else if (strsearch(key, "right") != -1 && direction != "l" && direction != "r") { if (move.isRunning()) { gotkey = 1; direction = "r"; complete; return; } } } /* Cheet on */ if (key == "n" && cheat == 0 && cheat3 != 4 && nocheat3 != 4 && cheat3 != 1 && nocheat3 != 1) { cheat = 1; complete; return; } else if (key == "o" && cheat == 1) { cheat = 2; complete; return; } else if (key == "s" && cheat == 2) { cheat = 3; complete; return; } else if (key == "a" && cheat == 3) { cheat = 4; complete; return; } else if (key == "m" && cheat == 4 && cheat != 5) { cheat = 5; complete; return; } else if (key == "m" && cheat == 5 && cheat != 4) { cheat = 6; complete; return; } else if (key == "y" && cheat == 6) { c1.setText("NOSAMMY"); cheat = 7; evercheat = 1; complete; return; } /* Cheet off */ else if (key == "n" && cheat == 7 && cheat3 != 4 && nocheat3 != 4 && cheat3 != 1 && nocheat3 != 1) { nocheat = 1; complete; return; } else if (key == "o" && nocheat == 1) { nocheat = 2; complete; return; } else if (key == "s" && nocheat == 2) { nocheat = 3; complete; return; } else if (key == "a" && nocheat == 3) { nocheat = 4; complete; return; } else if (key == "m" && nocheat == 4 && nocheat != 5) { nocheat = 5; complete; return; } else if (key == "m" && nocheat == 5 && nocheat != 4) { nocheat = 6; complete; return; } else if (key == "y" && nocheat == 6 && nocheat3 != 7) { c1.setText(""); cheat = 0; nocheat = 0; complete; return; } /* end cheat */ /* Cheet2 on */ else if (key == "f" && cheat2 == 0 && cheat3 != 2 && nocheat3 != 2) { cheat2 = 1; complete; return; } else if (key == "r" && cheat2 == 1) { cheat2 = 2; complete; return; } else if (key == "e" && cheat2 == 2 && cheat2 != 3) { cheat2 = 3; complete; return; } else if (key == "e" && cheat2 == 3 && cheat2 != 2) { cheat2 = 4; complete; return; } else if (key == "s" && cheat2 == 4) { cheat2 = 5; complete; return; } else if (key == "a" && cheat2 == 5) { cheat2 = 6; complete; return; } else if (key == "m" && cheat2 == 6) { c2.setText("FREESAM"); cheat2 = 7; evercheat = 1; complete; return; } /* Cheet2 off */ else if (key == "f" && cheat2 == 7 && cheat3 != 2 && nocheat3 != 2) { nocheat2 = 1; complete; return; } else if (key == "r" && nocheat2 == 1) { nocheat2 = 2; complete; return; } else if (key == "e" && nocheat2 == 2 && nocheat2 != 3) { nocheat2 = 3; complete; return; } else if (key == "e" && nocheat2 == 3 && nocheat2 != 2) { nocheat2 = 4; complete; return; } else if (key == "s" && nocheat2 == 4) { nocheat2 = 5; complete; return; } else if (key == "a" && nocheat2 == 5) { nocheat2 = 6; complete; return; } else if (key == "m" && nocheat2 == 6) { c2.setText(""); cheat2 = 0; nocheat2 = 0; complete; return; } /* end cheat2 */ /* Cheet3 on */ else if (key == "i" && cheat3 == 0 && cheat3 != 3 && cheat3 != 5) { cheat3 = 1; complete; return; } else if (key == "n" && cheat3 == 1 && cheat3 != 4) { cheat3 = 2; complete; return; } else if (key == "f" && cheat3 == 2) { cheat3 = 3; complete; return; } else if (key == "i" && cheat3 == 3 && cheat3 != 5 && cheat3 != 0) { cheat3 = 4; complete; return; } else if (key == "n" && cheat3 == 4 && cheat3 != 2) { cheat3 = 5; complete; return; } else if (key == "i" && cheat3 == 5 && cheat3 != 3 && cheat3 != 0) { cheat3 = 6; complete; return; } else if (key == "t" && cheat3 == 6) { cheat3 = 7; complete; return; } else if (key == "y" && cheat3 == 7) { c3.setText("INFINITY"); cheat3 = 8; evercheat = 1; complete; return; } /* Cheet3 off */ else if (key == "i" && cheat3 == 8 && nocheat3 != 3 && nocheat3 != 5) { nocheat3 = 1; complete; return; } else if (key == "n" && nocheat3 == 1 && nocheat3 != 4) { nocheat3 = 2; complete; return; } else if (key == "f" && nocheat3 == 2) { nocheat3 = 3; complete; return; } else if (key == "i" && nocheat3 == 3 && nocheat3 != 5 && nocheat3 != 0) { nocheat3 = 4; complete; return; } else if (key == "n" && nocheat3 == 4 && nocheat3 != 1) { nocheat3 = 5; complete; return; } else if (key == "i" && nocheat3 == 5 && nocheat3 != 3 && nocheat3 != 0) { nocheat3 = 6; complete; return; } else if (key == "t" && nocheat3 == 6) { nocheat3 = 7; complete; return; } else if (key == "y" && nocheat3 == 7 && nocheat != 6) { c3.setText(""); cheat3 = 0; nocheat3 = 0; complete; return; } /* end cheat3 */ else if (key == "space") { if (gamestate == "startup" || gamestate == "New Try" || gamestate == "Next level") { hideInfo2(); info.hide(); infotxt.hide(); gamestate = "running"; startGame(s_level); complete; return; } if (gamestate == "Game Over") { info.hide(); infotxt.hide(); showInfo2(); s_level = 1; complete; return; } if (gamestate == "Once Again") { s_level = 1; s_score = 0; s_lives = 5; hideInfo2(); info.hide(); infotxt.hide(); gamestate = "running"; startGame(s_level); complete; return; } if (move.isRunning()) { paused = 1; move.stop(); showInfo("Game Paused ... Push Space"); complete; return; } if (paused == 1) { paused = 0; info.hide(); infotxt.hide(); move.start(); complete; return; } } else { complete; return; } /* if (key == "up" && direction != "d") { if (move.isRunning()) { direction = "u"; complete; return; } } if (key == "down" && direction != "u") { if (move.isRunning()) { direction = "d"; complete; return; } } if (key == "left" && direction != "r") { if (move.isRunning()) { direction = "l"; complete; return; } } if (key == "right" && direction != "l") { if (move.isRunning()) { direction = "r"; complete; return; } }*/ } } startGame (int level) { if (level == 11) level = 10; if (wall) delete wall; wall = new map; wall.loadMap("level" + integerToString(level)); bg.setXmlParam("image", "level" + integerToString(level)); int n = sammy.getNumItems(); for ( int i = 1; i <= n; i++ ) { layer newsammy = sammy.enumItem(0); sammy.removeItem(0); newsammy.hide(); } currentllama = 0; t_lives.setText(translate("Lives: ") + integerToString(s_lives)); t_score.setText(translate("Score: ") + integerToString(s_score)); t_level.setText(translate("Level: ") + integerToString(s_level) + " [" + integerToString(currentllama) + "/" + integerToString(MAX_LLAMAS) + "]"); n_sammy = 0; expn_sammy = 5; gotkey = 1; if (level != 8) direction = "r"; else direction = "u"; setLlama(); sammy.removeAll(); sammy_x.removeAll(); sammy_y.removeAll(); sammy0.setXmlParam("x", "180"); sammy0.setXMLParam("y", "155"); sammy0.show(); move.start(); } move.onTimer () { if (n_sammy < expn_sammy) { addSammy(); } else { syncSammy(); } if (direction == "r") { setPos(sammy0, 1, 0); } else if (direction == "l") { setPos(sammy0, -1, 0); } else if (direction == "u") { setPos(sammy0, 0, -1); } else if (direction == "d") { setPos(sammy0, 0, 1); } checkForWalls (sammy0); checkForSammy (sammy0); checkForllama (sammy0); } setPos (layer l, int x, int y) { l.setXMLParam("x", integerToString(l.getGuiX() + x*5)); l.setXMLParam("y", integerToString(l.getGuiY() + y*5)); gotkey = 0; } setLlama () { int lx = 5+random(MAX_W-3)*5; int ly = 20+random(MAX_H-3)*5; int x = sammy0.getGuiX(); int y = sammy0.getGuiY(); if ((x == lx || x == lx + 5 || x == lx + 10) && (y == ly || y == ly + 5 || y == ly + 10)) { setLlama (); return; } if (wall.getValue(lx, ly) == 255 || wall.getValue(lx+5, ly) == 255 || wall.getValue(lx+10, ly) == 255 || wall.getValue(lx, ly+5) == 255 || wall.getValue(lx+5, ly+5) == 255 || wall.getValue(lx+10, ly+5) == 255 || wall.getValue(lx, ly+10) == 255 || wall.getValue(lx+5, ly+10) == 255 || wall.getValue(lx+10, ly+10) == 255 ) { setLlama (); return; } int n = sammy_x.getNumItems(); for ( int i = 0; i < n; i++ ) { x = sammy_x.enumItem(i); y = sammy_y.enumItem(i); if ((x == lx || x == lx + 5 || x == lx + 10) && (y == ly || y == ly + 5 || y == ly + 10)) { setLlama (); return; } } if ((x == lx || x == lx + 5 || x == lx + 10) && (y == ly || y == ly + 5 || y == ly + 10)) gotLlama(); llama.setXMLParam("x", integerToString(lx)); llama.setXMLParam("y", integerToString(ly)); llama.show(); } addSammy () { int x = sammy0.getGuiX(); int y = sammy0.getGuiY(); n_sammy++; layer newsammy = createSammy(n_sammy, x, y); sammy.addItem(newsammy); sammy_x.addItem(x); sammy_y.addItem(y); newsammy.setXMLParam("x", integerToString(x)); newsammy.setXMLParam("y", integerToString(y)); newsammy.show(); } Layer createSammy (int num, int x, int y) { layer l = new Layer; l.setXmlParam("id", "sammy" + integerToString(num)); l.setXmlParam("image", "sammy"); l.setXMLParam("x", integerToString(x)); l.setXMLParam("y", integerToString(y)); l.init(sammys); return l; } syncSammy () { layer newsammy = sammy.enumItem(0); sammy.removeItem(0); sammy_x.removeItem(0); sammy_y.removeItem(0); int x = sammy0.getGuiX(); int y = sammy0.getGuiY(); newsammy.setXMLParam("x", integerToString(x)); newsammy.setXMLParam("y", integerToString(y)); sammy.addItem(newsammy); sammy_x.addItem(x); sammy_y.addItem(y); } showInfo (string s) { infotxt.setText(s); info.show(); infotxt.show(); } checkForWalls (layer l) { if ( cheat2 == 7 ) return; int x = l.getGuiX(); int y = l.getGuiY(); if (wall.getValue(x, y) == 255) sammyDies(); } checkForLlama (layer l) { int x = l.getGuiX(); int y = l.getGuiY(); int lx = llama.getGuiX(); int ly = llama.getGuiY(); if ((x == lx || x == lx + 5 || x == lx + 10) && (y == ly || y == ly + 5 || y == ly + 10)) gotLlama(); } checkForSammy (layer l) { if ( cheat == 7 ) return; int x = l.getGuiX(); int y = l.getGuiY(); int n = sammy_x.getNumItems(); for ( int i = 0; i < n; i++ ) { if (sammy_x.enumItem(i) == x && sammy_y.enumItem(i) == y) { sammyDies (); } } } sammyDies () { llama.hide(); move.stop(); sammy0.hide(); s_lives--; s_score -= 1000; t_lives.setText(translate("Lives: ") + integerToString(s_lives)); t_score.setText(translate("Score: ") + integerToString(s_score)); t_level.setText(translate("Level: ") + integerToString(s_level) + " [" + integerToString(currentllama) + "/" + integerToString(MAX_LLAMAS) + "]"); gamestate = "New Try"; if (s_lives == 0) { gamestate = "Game Over"; } showInfo ("Sammy Dies! Push Space!"); } gotLlama () { currentllama++; s_score += 100 * currentllama; t_score.setText(translate("Score: ") + integerToString(s_score)); t_level.setText(translate("Level: ") + integerToString(s_level) + " [" + integerToString(currentllama) + "/" + integerToString(MAX_LLAMAS) + "]"); if (currentllama >= MAX_LLAMAS && cheat3 != 8) { move.stop(); s_level++; llama.hide(); gamestate = "Next Level"; showInfo (translate("Level: ") + integerToString(s_level) + translate(", Push Space")); } else { expn_sammy += 12; setLlama(); } } showInfo2 () { if (evercheat == 0) { if (s_score > getPrivateInt("Nibbles", "Personal Best", 0)) { setPrivateInt("Nibbles", "Personal Best", s_score); infotxt2d.setText("Congrats, New Highscore!"); } else infotxt2d.setText(translate("Highscore") +": " + integerToString(getPrivateInt("Nibbles", " ", 0))); } else { infotxt2d.setTExt("You have cheated!"); } if (cheat == 0 && cheat2 == 0 && cheat3 ==0) evercheat = 0; gamestate = "Once Again"; infotxt2b.setText(translate("Your Score") + ": " + integerToString(s_score)); info2.show(); infotxt2a.show(); infotxt2d.show(); infotxt2b.show(); infotxt2c.show(); } hideInfo2 () { info2.hide(); infotxt2a.hide(); infotxt2b.hide(); infotxt2c.hide(); infotxt2d.hide(); }