BangleApps/apps/tabanchi/app.js

1586 lines
36 KiB
JavaScript
Raw Normal View History

// GPL TAMAGOTCHI CLONE FOR THE BANGLEJS2 SMARTWATCH BY pancake 2022
// TABANCHI -- たばんち
const scale = 6;
const w = g.getWidth();
const h = g.getHeight();
const yy = 34;
const y = 40 - scale;
let tool = -1;
let hd = 1;
let vd = 1;
let x = 20;
let sx = 0; // screen scroll x position
let cacaLevel = 0;
let cacaBirth = null;
let angryState = 0;
let animated = true;
let transition = false;
let caca = null;
let egg = null;
let mode = '';
let evolution = 1;
let callForAttention = false; // TODO : move into tama{}
let useAmPm = true;
let oldMode = '';
let gameChoice = 0;
let gameTries = 0;
let gameWins = 0;
let statusMode = 0;
let lightSelect = 0;
let lightMode = 0; // on is zero
let frame = 0;
const tama = {
age: 0,
weight: 1,
aspect: 6,
discipline: 0,
happy: 3,
sick: false,
hungry: 3,
cacas: 0,
// hidden
sickness: 0,
defenses: 100,
tummy: 100,
awake: 3
};
g.setBgColor(0);
const sun = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('773nW9rnvfc=')
};
const tama06eat0 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('/////4A/vd+B7+N3g/e714P39/f39/f3++/8H/////8=')
};
const meal0 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('gXp6tbW1tYE=')
};
const meal1 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('v19htbW1tYE=')
};
const meal2 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/////5+htYE=')
};
const snack0 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('358D08vA+fs=')
};
const snack1 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('///708vA+fs=')
};
const snack2 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/////+vA+fs=')
};
const angry0 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/////8/Pv/8=')
};
const angry1 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('8/Dg4fn/v/8=')
};
const right = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('7+eDgYPn7/8=')
};
const left = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('9+fBgcHn9/8=')
};
const img_on = {
width: 16,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('//+M73VvdW91r3Wvjc///w==')
};
const img_off = {
width: 16,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('//+MIXXvdGN173Xvje///w==')
};
const right0 = {
width: 3,
height: 5,
bpp: 1,
transparent: 1,
buffer: atob('d1Y=')
};
const right1 = {
width: 3,
height: 5,
bpp: 1,
transparent: 1,
buffer: atob('ZBY=')
};
const am = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('w7mBuf+Rqak=')
};
const pm = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('g52Dn/+Rqak=')
};
const numbers = [
{ // 0
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('lmZmnw==')
}, { // 1
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('2d3d3w==')
}, { // 2
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('lu23Dw==')
}, { // 3
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('Hu3uHw==')
}, { // 4
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('lVVQ3w==')
}, { // 5
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('B3HuHw==')
}, { // 6
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('l3Fmnw==')
}, { // 7
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('Bm7d3w==')
}, { // 8
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('lmlmnw==')
}, { // 9
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('lmjunw==')
}
];
const snumbers = [
{ // 0
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/4qqjw==')
}, { // 1
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/93d3w==')
}, { // 2
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/46Ljw==')
}, { // 3
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/46Ojw==')
}, { // 4
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/6qO7w==')
}, { // 5
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/4uOjw==')
}, { // 6
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/4uKjw==')
}, { // 7
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/4ru7w==')
}, { // 8
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/4qKjw==')
}, { // 9
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/4qOjw==')
}
];
const colon = {
width: 4,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/f/9/w==')
};
const egg00 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('/////////D/7n/GP8e/n9+537nfvx/OP+Z/wD/////8=')
};
const h24 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('ldWxnf/bw9s=')
};
const discipline = {
width: 32,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('///v/x//7/9v/i//akqqI27erqtqWiqja1rqrxpK6qM=')
};
const linebar = {
width: 32,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/////4AAAA9////3f///93////d////3f///94AAAA8=')
};
const hungry = {
width: 32,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/////2////9qiKr/aqqa/wqquv9qqLz/aK6+/2/4+f8=')
};
const happy = {
width: 32,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/////2/iP/9v6qv/bGqr/w9iK/9obvP/a277/2yu5/8=')
};
const vs = {
width: 16,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('Uf9V/1f/W/9d/7X/sf///w==')
};
const egg01 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('///////////8P/uf8Y/x7+P37nfud/PP+Z/gB/////8=')
};
const tama06no0 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('//////w/+9/3gey974Hv3e/B7/fv9+/39+/4H/////8=')
};
const tama06no1 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('//////w/+9+B7703gfe794P37/fv9+/39+/4H/////8=')
};
const caca00 = {
width: 12,
height: 12,
bpp: 1,
transparent: 1,
buffer: atob('/////733v72/+f4vw3wH////')
};
const caca01 = {
width: 12,
height: 12,
bpp: 1,
transparent: 1,
buffer: atob('////v/33v7+3+f4v0HwH////')
};
const tama00 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('///////////8H/vv9oHvveuB793vwd/34A////////8=')
};
const tama01 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('/////////AH7vfeB7sfvwevd78Hv7+/v7+/33/g///8=')
};
const tool00 = {
width: 30,
height: 30,
bpp: 1,
transparent: 1,
buffer: atob('//////7v4f8zHwP8zHwP8zHwP8zHwP8THwP8DHwP8BHgP8AHgP8AHgP+AHgP+APgP/AfAP/g/AP/x/AP/x/AP/x/AP/w/gP/w/8P/w/8P/gf8P/gf8P/AP8P/AP4P/AP4P/gf4P/wf4P/4/8f/////A=')
};
const tool01 = {
width: 30,
height: 30,
bpp: 1,
transparent: 1,
buffer: atob('///////D///fD4/+Pn4/+P/4//P/7/v+Af3n4APjDwAHDjgADP/AGD//DPh/+H/h/+O5x/GOkxxCOkxBOG8xh/GYz//HBz//jBn//xjmPw4/ODx///Dx+AfH/8AP///////+Af//8AP///////////A=')
};
const tool02 = {
width: 30,
height: 30,
bpp: 1,
transparent: 1,
buffer: atob('///////////////+D///4B///x8///xUf/hmTf+An/f4AmTfwAmTfgAl8fABx8+AD4B8AH8D4AP//wAf//gA///AB//+AH//8AP//4A///wD//8AP//4A///4H///4H///8H///+P/////////////A=')
};
const tool03 = {
width: 30,
height: 30,
bpp: 1,
transparent: 1,
buffer: atob('/////////////x////g////gf//fwP/+P4P/+OMH/+GEH/8DCD/4BjB/wxhB/h4xg/D8Qw8H8Yw4H+M5wH+H/gD/H/gD/D/wB8B/wAwB/wAAz/wAD//gAH//CAf//PB////n//////////////////A=')
};
const tool10 = {
width: 30,
height: 30,
bpp: 1,
transparent: 1,
buffer: atob('////////////////wf///AH//yAD/Dkfh8B0/wAA8/wA44vnD545Bgx8ZA4x4H58xznP8RjjH8ZnmP8ZmGPw5gPAB58fAHx8fw/x4///j8///j8f//D8f/8H+D/gf/AAA//gAD//+Af///////////A=')
};
const tool11 = {
width: 30,
height: 30,
bpp: 1,
transparent: 1,
buffer: atob('//////////////////////B///wAD/+AAA/8D/wPwfz+Hg/z/Dj7z3xH5znYM5znIM5TmIOdT8YGeL85GOP45neP/xj+P/zz+P/zx+H/nx+H/n4///H4/h/P8QAGP+AAAf/D/g////////////////A=')
};
const tool12 = {
width: 30,
height: 30,
bpp: 1,
transparent: 1,
buffer: atob('/////////////////////////////z////5////5///94///48/g/8c8AH8M4AGcEwAOEEgAyAgAAwAgAB4YwAH8YwAH+c4AH/c4AAf84gAB/4gAB/5wAB/54AD//8AH///gf/////////////////A=')
};
const tool13 = {
width: 30,
height: 30,
bpp: 1,
transparent: 1,
buffer: atob('/////////////////////////+A///8AP//weH//x/jg/j/yAPnPwOHnM4/jnM9/5n8//5k/+fkk/vHEmPPgMjAbgcxxjmc4fD/48AB/4+AQ/x//4fj//+AH///AP/////////////////////////A=')
};
const shower = {
width: 8,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('5cuXy+XLl8vly5fL5cuXyw==')
};
const tools = [
tool00, tool01, tool02, tool03,
tool10, tool11, tool12, tool13
];
const tamabg = {
width: 176,
height: 176,
bpp: 8,
buffer: require('heatshrink').decompress(atob('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
};
const tama06happy = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('/////4Afvm+Hd+B74duDq7v7g/vv++/79/f4D/////8=')
};
const battery = {
width: 32,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/////x/t//9vxP//bG2arx9taa9obQuPa2177xy2i58=')
};
const snack = {
width: 24,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('z//7t//7vDGbzb1q9aF5ta1qzbKa////')
};
const meal = {
width: 24,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('////k//fqzjfqt7fqhDfqvbfuxlf////')
};
const face = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/8OlgZmBw/8=')
};
const year = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/6qpq8vrn/8=')
};
const weight = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/34A54G9pQA=')
};
const weight_g = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('49vj+cO7x/8=')
};
const heart0 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('yba+vt3r9/8=')
};
const heart1 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('yaCgoMHj9/8=')
};
g.clear();
g.setColor(1, 1, 1);
g.fillRect(0, 0, 200, 200);
g.setColor(0);
g.drawString('Loading...', 10, 10);
egg = egg00;
n = tama00;
function drawHearts (n) {
for (i = 0; i < 4; i++) {
const himg = (i < n) ? heart1 : heart0;
g.drawImage(himg, 1 + (scale * (8 * i)) - scale - scale, 40 + (scale * 8), { scale: (scale) });
}
}
function drawLinebar (n, arrow) { // 0-100
g.drawImage(linebar, 0, yy + (scale * 8), { scale: scale });
let wop = scale * 2; // (frame++%2)? scale*3:scale*2;
if (frame % 2) {
wop += scale;
}
let twelve = 12;
if (arrow) {
twelve = 11;
}
const val = (n * twelve) / 100;
const max = val || twelve;
for (let i = 0; i < max; i++) {
g.setColor(0, 0, 0);
if (arrow) {
const x = wop + (i * scale * 2) + ((i % 2) * scale);
const y = yy + (scale * 11);
g.fillRect(x + (scale * 2), y, x + (scale * 3), y + scale);
g.fillRect(x + scale, y + scale, x + (scale * 2), y + (scale * 2));
g.fillRect(x, y + (scale * 2), x + scale, y + (scale * 3));
} else {
const x = (i * scale * 2) + (scale * 2);
const y = yy + (scale * 11);
g.fillRect(x, y, x + scale, y + scale * 3);
}
}
}
function drawStatus () {
switch (statusMode) {
case 0:
g.drawImage(face, scale, yy, { scale: scale });
g.drawImage(weight, scale, yy + (scale * 8), { scale: scale });
g.drawImage(numbers[0], w - (scale * 14), yy, { scale: scale });
g.drawImage(year, w - (scale * 8), yy, { scale: scale });
g.drawImage(numbers[1], w - (scale * 14), yy + (scale * 9), { scale: scale });
g.drawImage(weight_g, w - (scale * 8), yy + (scale * 9), { scale: scale });
break;
case 1: // discipline
g.drawImage(discipline, 0, yy, { scale: scale });
drawLinebar(tama.discipline, false);
break;
case 2: // hungry
g.drawImage(hungry, scale, yy, { scale: scale });
drawHearts(tama.hungry);
break;
case 3: // happy
g.drawImage(happy, scale, yy, { scale: scale });
drawHearts(tama.happy);
break;
case 5: // battery
g.drawImage(battery, scale, yy, { scale: scale });
drawLinebar(E.getBattery(), true);
break;
default:
statusMode = 0;
drawStatus();
break;
}
}
function drawScene () {
if (Bangle.isLocked()) {
tool = -1;
}
g.setColor(0, 0, 0);
g.fillRect(0, 0, 200, 200);
g.drawImage(tamabg, 0, 0, { scale: 1 });
g.setColor(1, 1, 1);
if (evolution == 0) {
g.drawImage(egg, w / 4, 32, { scale: scale });
return;
}
if (callForAttention) {
g.drawImage(tool13, 10 + 30 + 10 + 30 + 10 + 30 + 10, 135);
}
if (mode == 'game') {
drawGame();
if (!transition) {
if (gameChoice == 2) {
g.drawImage(right, w - (scale * 7), 40 + (scale * 4), { scale: scale });
} else if (gameChoice == 1) {
g.drawImage(left, 0, 40 + (scale * 4), { scale: scale });
}
return;
}
}
if (gameTries > 4) {
mode = '';
oldMode = '';
const s0 = numbers[gameWins];
const s1 = numbers[(5 - gameWins)];
g.drawImage(s0, (scale * 5), 60, { scale: scale });
g.drawImage(vs, (scale * 12), 60, { scale: scale });
g.drawImage(s1, (scale * 22), 60, { scale: scale });
gameTries++;
if (gameTries > 10) {
const winrar = (gameWins > 2);
gameTries = 0;
gameWins = 0;
oldMode = '';
mode = '';
if (winrar) {
tama.happy++;
animateHappy();
}
}
return;
}
if (mode == 'clock') {
drawClock();
if (!transition) {
return;
}
}
drawTools();
if (mode == 'status') {
drawStatus();
return;
}
if (mode == 'food') {
drawFoodMenu();
return;
}
if (mode == 'light') {
drawLight();
return;
}
if (mode == 'happy') {
drawHappy();
return;
}
if (mode == 'angry') {
drawAngry();
return;
}
if (mode == 'medicine') {
if (tama.sick > 0) {
drawMedicine();
} else {
animateAngry();
}
return;
}
if (mode == 'eating') {
if (lightSelect == 0 && tama.hungry > 4) {
drawEatingNo();
} else {
drawEating();
}
return;
}
if (lightMode) {
// just dark screen and maybe zZz if its sleeping
g.setColor(0, 0, 0);
g.fillRect(0, 38, w + sx, h - 50);
if (tama.sleep) {
drawCaca();
}
} else {
// draw tamagotchi
g.drawImage(n, x + sx, y, { scale: scale });
// draw caca
drawCaca();
}
}
function drawAngry () {
const one = angryState % 2;
g.drawImage(one ? tama06no0 : tama06no1, (scale * 5), 40, { scale: scale });
g.drawImage(one ? angry0 : angry1, (scale * 20), 40, { scale: scale });
}
function drawHappy () {
const one = angryState % 2;
g.drawImage(one ? tama06happy : tama06no1, (scale * 5), 40, { scale: scale });
if (one) {
g.drawImage(sun, (scale * 20), 46, { scale: scale });
}
}
function drawEatingNo () { // food eating animation
const one = angryState % 2;
g.drawImage(lightSelect ? snack0 : meal0, scale, 40 + (scale * 7), { scale: scale });
g.drawImage(one ? tama06no0 : tama06no1, (scale * 10), 40, { scale: scale });
}
const med0 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('///4P/1//X/9f+AP+7/4P/o/+j/4P/g//H/+//7///8=')
};
const med1 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('//////g//X/9f+AP+z/7P/o/+D/7P/g//H/+//7///8=')
};
const med2 = {
width: 16,
height: 16,
bpp: 1,
transparent: 1,
buffer: atob('////////+D/9f+AP+j/7P/s/+z/7v/g//H/+//7///8=')
};
function drawMedicine () { // food eating animation
const med = [med0, med1, med2];
const img = med[0 | ((frame / 2) % 3)];
if (img) {
g.drawImage(img, 0, 34, { scale: scale });
}
g.drawImage(tama06no0, (scale * 10), 40, { scale: scale });
}
function drawEating () { // food eating animation
const one = angryState % 2;
const snack = [snack0, snack1, snack2];
const meal = [meal0, meal1, meal2];
const img = lightSelect ? snack[0 | (frame / 2)] : meal[0 | (frame / 2)];
if (img) {
g.drawImage(img, scale, 40 + (scale * 7), { scale: scale });
}
g.drawImage(one ? tama06no1 : tama06eat0, (scale * 10), 40, { scale: scale });
}
function drawFoodMenu () { // food menu
if (lightSelect == 0) {
g.drawImage(right, -scale, 40, { scale: scale });
} else {
g.drawImage(right, -scale, 40 + (7 * scale), { scale: scale });
}
g.drawImage(meal, scale * 5, 34, { scale: scale });
g.drawImage(snack, scale * 5, 40 + (7 * scale), { scale: scale });
}
function drawLight () {
if (lightSelect == 0) {
g.drawImage(right, 2, 40, { scale: scale });
} else {
g.drawImage(right, 2, 40 + (7 * scale), { scale: scale });
}
g.drawImage(img_on, scale * 8, 34, { scale: scale });
g.drawImage(img_off, scale * 8, 40 + (7 * scale), { scale: scale });
}
function drawTools () {
if (tool >= 0) {
// top actions
if (tool == 0) { g.drawImage(tool00, 10, 2); }
if (tool == 1) { g.drawImage(tool01, 10 + 30 + 10, 2); }
if (tool == 2) { g.drawImage(tool02, 10 + 30 + 10 + 30 + 10, 2); }
if (tool == 3) { g.drawImage(tool03, 10 + 30 + 10 + 30 + 10 + 30 + 10, 2); }
// bottom actions
if (tool == 4) { g.drawImage(tool10, 10, 135); }
if (tool == 5) { g.drawImage(tool11, 10 + 30 + 10, 135); }
if (tool == 6) { g.drawImage(tool12, 10 + 30 + 10 + 30 + 10, 135); }
}
}
// this function is executed once per second. so the animations look stable and consistent
function updateAnimation () {
frame++;
if (evolution == 0) {
// animate the egg
egg = (egg == egg00) ? egg01 : egg00;
return;
}
if (mode == 'game') {
// console.log("update Animation");
if (transition) {
const beep = frame % 4;
if (beep == 0) {
Bangle.beep(150, 4000);
} else if (beep == 2) {
Bangle.beep(150, 3200);
}
} else {
Bangle.beep(100);
}
if (gameChoice != 0) {
// do things
gameChoice = 0;
if ((0 | (Math.random() * 3)) > 0) {
animateHappy();
gameWins++;
} else {
animateAngry();
}
}
return;
}
if (mode == 'medicine') {
if (frame > 3) {
mode = '';
tama.sick = 0;
}
}
x += (scale) * hd;
if (x + (tama00.width * scale) >= w) {
hd = -hd;
}
if (x < 0) {
hd = -hd;
}
caca = (caca == caca00) ? caca01 : caca00;
// y += vd * scale;
vd = -vd;
const width = (w / scale);
if (tama.sleep) {
n = tama00;
x = (width / 2);
} else {
n = n == tama00 ? tama01 : tama00;
if (tama.cacas > 0 || tama.sick > 0) {
if (x > (width / 2)) {
hd = -1;
x = (width / 2);
}
}
}
}
function nextItem () {
tool++;
if (tool > 6) tool = 0;
}
function prevItem () {
tool--;
if (tool < 0) tool = 7;
}
function activateItem () {
if (mode != '') {
return;
}
switch (tool) {
case -1:
animateToClock();
break;
case 0: // food
if (tama.sleep) {
} else {
// evolution = 0;
mode = 'food';
lightSelect = 0;
}
break;
case 1: // onoff
mode = 'light';
break;
case 2: // game
if (tama.sleep) {
} else {
animateToGame();
}
break;
case 3: // vax
if (tama.sleep) {
// cant medicate if sleeping
} else {
mode = 'medicine';
frame = 0;
angryState = 0;
}
break;
case 4: // shower
if (tama.sleep) {
tama.happy = 0;
}
tama.awake = 10; // time to go to sleep again if in time
tama.sleep = false;
animateShower();
break;
case 5: // status
mode = 'status';
statusMode = 0;
break;
case 6: // blame
if (tama.sleep) {
tama.happy = 0;
tama.sleep = false;
} else if (callForAttention) {
if (tama.happy > 0 && tama.hungry > 0 && tama.sick < 1) {
tama.discipline += 2;
callForAttention = false;
} else if (tama.sick > 0) {
tama.discipline--;
}
}
animateAngry();
break;
}
}
const skull = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('gwFtARGDq/8=')
};
const zz0 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('//H9+/fRf/8=')
};
const zz1 = {
width: 8,
height: 8,
bpp: 1,
transparent: 1,
buffer: atob('/8P79+/fw/8=')
};
const zz2 = {
width: 8,
height: 8,
bpp: 1,
transparent: 0,
buffer: atob('AA4CBAgugAA=')
};
const zz3 = {
width: 8,
height: 8,
bpp: 1,
transparent: 0,
buffer: atob('ADwECBAgPAA=')
};
function drawCaca () {
if (mode == 'game') {
return;
}
if (!caca) {
caca = caca00;
}
let zz = [zz0, zz1];
if (lightMode) {
zz = [zz2, zz3];
g.setColor(1, 1, 1);
var fi = ((frame) / 2) % 2;
g.drawImage(zz[fi ? 1 : 0], sx + w - (scale * 9), 40, { scale: scale });
return;
}
g.setColor(0, 0, 0);
if (tama.sleep) {
var fi = ((frame) / 2) % 2;
g.drawImage(zz[fi ? 1 : 0], sx + w - (scale * 9), 34, { scale: scale });
if (tama.sick > 0) {
g.drawImage(skull, sx + w - (scale * 9), 34 + (scale * 6), { scale: scale });
} else if (tama.cacas > 0) {
g.drawImage(caca, sx + w - (scale * 11), 32 + (scale * 6), { scale: scale });
}
} else if (tama.sick > 0) {
g.drawImage(skull, sx + w - (scale * 9), 34 + scale, { scale: scale });
if (tama.cacas > 0) {
g.drawImage(caca, sx + w - (scale * 11), 32 + (scale * 6), { scale: scale });
}
} else {
if (tama.cacas > 0) {
g.drawImage(caca, sx + w - (scale * 11), 34 + (scale * 6), { scale: scale });
}
if (tama.cacas > 1) {
g.drawImage(caca, sx + w - (scale * 11), 24, { scale: scale });
}
}
}
function animateHappy () {
if (transition || mode == 'happy') {
return;
}
angryState = 0;
mode = 'happy';
transition = true;
const width = w / scale;
const cx = w;
var iv = setInterval(function () {
angryState++;
if (angryState > 3) {
clearInterval(iv);
transition = false;
angryState = 0;
mode = oldMode;
if (mode == 'game') {
gameTries++;
}
}
drawScene();
}, 1000);
}
function animateAngry () {
if (transition || mode == 'angry') {
return;
}
angryState = 0;
mode = 'angry';
transition = true;
const width = w / scale;
const cx = w;
var iv = setInterval(function () {
angryState++;
if (angryState > 3) {
clearInterval(iv);
transition = false;
angryState = 0;
mode = oldMode;
if (mode == 'game') {
gameTries++;
}
}
drawScene();
}, 1000);
}
function animateFood () {
if (transition || mode == 'eating') {
return;
}
// XXX TODO this is printing the angry state not the eating one
angryState = 0;
mode = 'eating';
tama.hungry++;
if (lightSelect == 1) { // snack
tama.happy++;
tama.hungry++;
tama.sickness += 2;
}
frame = 0;
transition = true;
const width = w / scale;
const cx = w;
var iv = setInterval(function () {
angryState++;
if (angryState > 3) {
clearInterval(iv);
transition = false;
angryState = 0;
mode = 'food';
}
drawScene();
}, 1000);
}
function animateShower () {
if (transition) {
return;
}
transition = true;
const width = w / scale;
let cx = w;
var iv = setInterval(function () {
sx -= scale * 4;
drawScene();
cx -= scale * 4;
g.setColor(1, 1, 1);
g.drawImage(shower, cx, 40 - scale, { scale: scale });
if (cx < 0) {
clearInterval(iv);
mode = '';
transition = false;
animated = true;
sx += width;
if (sx < 0) sx = 0;
if (tama.cacas > 0) {
// if it was dirty, play the happy animation
}
tama.cacas = 0;
drawScene();
}
}, 100);
}
function animateToGame () {
if (transition || mode === 'game') {
return;
}
mode = 'game';
gameChoice = 0;
transition = true;
let cx = 0;
sx = -w;
animated = false;
var iv = setInterval(function () {
sx += scale * 2;
updateAnimation();
drawScene();
cx += scale * 2;
if (cx > w) {
clearInterval(iv);
sx = 0;
animated = true;
transition = false;
drawScene();
}
}, 100);
}
function animateToClock () {
if (transition) {
return;
}
if (mode == 'clock') {
return;
}
mode = 'clock';
transition = true;
const width = w / scale;
let cx = w;
sx = 0;
animated = false;
var iv = setInterval(function () {
sx -= scale * 4;
drawScene();
cx -= scale * 4;
g.setColor(0, 0, 0);
if (cx < 0) {
clearInterval(iv);
mode = 'clock';
transition = false;
animated = true;
drawScene();
}
}, 100);
}
function animateFromClock () {
if (transition) {
return;
}
if (mode != 'clock') {
return;
}
transition = true;
let cx = 0;
const width = w / scale;
animated = false;
var iv = setInterval(function () {
sx += scale * 4;
drawScene();
cx += scale * 4;
if (cx > w) {
clearInterval(iv);
mode = '';
sx = 0;
animated = true;
transition = false;
drawScene();
}
}, 100);
}
function button (n) {
if (evolution == 0) {
if (n == 3) {
evolution = 1;
return;
}
}
if (mode == 'happy' || mode == 'angry') {
return;
}
if (mode == 'game') {
switch (n) {
case 1:
// pick left
gameChoice = 1;
drawScene();
oldMode = 'game';
break;
case 2:
// pick right
gameChoice = 2;
drawScene();
oldMode = 'game';
break;
case 3:
mode = '';
// exit game
break;
}
return;
}
if (mode == 'eating') {
Bangle.buzz();
return;
}
Bangle.beep(150);
switch (n) {
case 1:
switch (mode) {
case 'clock':
useAmPm = !useAmPm;
drawScene();
break;
case 'food':
case 'light':
lightSelect = lightSelect ? 0 : 1;
drawScene();
break;
case 'status':
if (oldMode != 'clock') {
statusMode++;
drawScene();
}
break;
default:
nextItem();
drawScene();
break;
}
break;
case 2:
switch (mode) {
case 'clock':
animateFromClock();
break;
case 'status':
if (oldMode != 'clock') {
statusMode++;
drawScene();
}
break;
case 'food':
animateFood();
break;
case 'light':
mode = '';
lightMode = lightSelect;
drawScene();
break;
default:
activateItem();
tool = -1;
drawScene();
}
break;
case 3:
switch (mode) {
case 'clock':
animateFromClock();
break;
case 'light':
case 'food':
mode = '';
lightState = 0;
drawScene();
break;
case 'status':
if (oldMode == 'clock') {
mode = 'clock';
oldMode = '';
} else {
mode = '';
statusMode = 0;
drawScene();
}
break;
default:
mode = '';
tool = -1;
drawScene();
break;
}
break;
}
}
function drawGame () {
g.setColor(0, 0, 0);
let one = frame % 2;
if (transition) {
one = 0;
g.drawImage(heart1, sx + w + (scale * 6), 40, { scale: scale });
g.drawImage(heart1, sx + w + (scale * 16), 40, { scale: scale });
g.drawImage(heart0, sx + w, 40 + (scale * 8), { scale: scale });
g.drawImage(heart0, sx + w + (scale * 12), 40 + (scale * 8), { scale: scale });
} else {
if (gameTries > 4) {
if (oldMode != '') {
if (gameWins > 2) {
animateHappy();
}
}
mode = oldMode;
oldMode = '';
} else {
g.drawImage(one ? tama06no1 : tama06no0, (scale * 7) + sx, 40, { scale: scale });
}
}
}
function drawClock () {
const d = new Date();
let hh = '';
if (useAmPm) {
const h = (d.getHours() > 12) ? d.getHours() - 12 : d.getHours();
hh = (h < 10) ? ' ' + h : '' + h;
} else {
hh = (d.getHours() < 10) ? ' ' + d.getHours() : '' + d.getHours();
}
const mm = (d.getMinutes() < 10) ? '0' + d.getMinutes() : '' + d.getMinutes();
const ss = (d.getSeconds() < 10) ? '0' + d.getSeconds() : '' + d.getSeconds();
const ts = hh + ':' + mm;
const useVector = false;
const wsx = w + sx + ((2.4) * scale);
if (useVector) {
g.setFont('Vector', 60);
g.setColor(0, 0, 0);
g.drawString(ts, w + sx + 30, 54);
g.setFont('Vector', 24);
g.setColor(0, 0, 0);
g.drawString(ss, w + sx + (w - 20), 104);
} else {
const s0 = numbers[ts[0] - '0'];
const s1 = numbers[ts[1] - '0'];
const s2 = numbers[ts[3] - '0'];
const s3 = numbers[ts[4] - '0'];
// hours
if (s0) {
g.drawImage(s0, wsx, yy, { scale: scale });
}
g.drawImage(s1, wsx + (5 * scale), yy, { scale: scale });
g.drawImage(colon, wsx + (scale + scale + scale + (5 * scale)), yy, { scale: scale });
// minutes
g.drawImage(s2, wsx + (2 * scale) + (5 * 2 * scale), yy, { scale: scale });
g.drawImage(s3, wsx + (2 * scale) + (5 * 3 * scale), yy, { scale: scale });
// seconds
const s4 = snumbers[ss[0] - '0'];
const s5 = snumbers[ss[1] - '0'];
g.drawImage(s4, wsx + (3 * scale) + (3 * 6 * scale), yy, { scale: scale });
g.drawImage(s5, wsx + scale + (4 * 6 * scale), yy, { scale: scale });
const arrows = [
'00000',
'10000',
'11000',
'11100',
'11110',
'11111',
'01111',
'00111',
'00011',
'00001'
];
// arrow
for (let i = 0; i < 5; i++) {
const n = d.getSeconds() % 10;
const arrow = arrows[n];
const img = (arrow[i] == '1') ? right1 : right0;
g.drawImage(img, wsx + (3 * i * scale) + (scale * 14), yy + (10 * scale), { scale: scale });
}
}
if (useAmPm) {
if (d.getHours() < 13) {
g.drawImage(am, wsx, yy + (8 * scale), { scale: scale });
} else {
g.drawImage(pm, wsx, yy + (8 * scale), { scale: scale });
}
} else {
g.drawImage(h24, wsx, yy + (8 * scale), { scale: scale });
// show something from tamagotchi stats
}
}
setInterval(function () {
updateAnimation();
drawScene();
}, 1000);
function pooMaker() {
if (tama.hungry > 0 && !tama.sleep) {
const a = 0 | (cacaLevel / tama.tummy);
const b = 0 | ((cacaLevel + tama.hungry) / tama.tummy);
cacaLevel += tama.hungry;
if (a != b) {
if (tama.cacas == 0) {
cacaBirth = new Date();
}
tama.hungry--;
tama.cacas++;
}
}
const d = new Date();
const h = d.getHours();
tama.sleep = (h > 22 || h < 8);
if (tama.awake > 0) {
tama.awake--;
tama.sleep = false;
}
}
function sickMaker() {
if (tama.sleep) {
return;
}
callForAttention = false;
// health check
tama.sickness += tama.cacas;
if (tama.hungry == 0) {
callForAttention = true;
// tama.sickness++;
}
if (tama.hungry == 4) {
// tama.sickness++;
}
if (tama.sickness > tama.defenses) {
tama.sickness = 0;
tama.sick++;
}
if (tama.sick > 0) {
callForAttention = true;
}
}
setInterval(pooMaker, 5e3);
setInterval(sickMaker, 2e3);
updateAnimation();
Bangle.on('touch', function (r, s) {
const w4 = w / 3;
if (s.x > w - w4) {
if (s.y < 50) {
Bangle.beep(150);
if (oldMode == 'clock') {
oldMode = '';
mode = 'clock';
} else
if (mode == 'clock') {
mode = 'status';
oldMode = 'clock';
statusMode = 5; // battery
} else {
evolution = !evolution;
tool = -1;
}
drawScene();
} else {
button(3);
}
} else if (s.x < w4) {
button(1);
} else {
button(2);
}
});