*lev18: diff colour cats which only match themselves

This commit is contained in:
Rob Pearce 2016-08-31 17:45:15 +10:00
parent facceb304f
commit ce58f29754
5 changed files with 144 additions and 22 deletions

159
cat.html
View File

@ -408,7 +408,7 @@ function pathcomplete() {
if (curpath.length >= PARADELENGTH) { if (curpath.length >= PARADELENGTH) {
var lcount = 0,gcount = 0; var lcount = 0,gcount = 0;
var i; var i;
// includes <= 1 llama? // includes <= 1 llama or has a goat?
for (i = 1; i < curpath.length; i++) { for (i = 1; i < curpath.length; i++) {
if (curpath[i].type == "llama") { if (curpath[i].type == "llama") {
lcount++; lcount++;
@ -498,6 +498,7 @@ function isvalidpath(mypath) {
var gcount = 0; var gcount = 0;
var count = 0; var count = 0;
var i; var i;
var startcol = null;
for (i = 0; i < mypath.length - 1; i++) { for (i = 0; i < mypath.length - 1; i++) {
var thisone,nextone,dirtonext; var thisone,nextone,dirtonext;
@ -509,6 +510,10 @@ function isvalidpath(mypath) {
nextone = mypath[i+1]; nextone = mypath[i+1];
} }
*/ */
if (i == 0) {
startcol = thisone.catcol;
}
nextone = mypath[i+1]; nextone = mypath[i+1];
@ -529,14 +534,15 @@ function isvalidpath(mypath) {
firstcat = true; firstcat = true;
} }
if ((thisone.type == "cat") && (nextone.type == "cat")) { if ((thisone.type == "cat") && (nextone.type == "cat") && (nextone.catcol == startcol)) {
// no parades on level 1 // no parades on level 1
if (curlevel == 1) { if (curlevel == 1) {
return false; return false;
} }
// ...but otherwise lines of cats are ok // ...but otherwise lines of cats are ok if they're the right colour
} else if ((thisone.type == "goat") && (nextone.type == "cat" || nextone.type == "llama" || nextone.type == "goat")) { } else if ((thisone.type == "goat") &&
// goat can go to llama or cat ((nextone.type == "cat" && nextone.catcol == startcol) || nextone.type == "llama" || nextone.type == "goat")) {
// goat can go to llama or correctly coloured cat
// ok // ok
} else if ((nextone.type == "door") && (count >= PARADELENGTH) && (fcount == 0) && (count >= 3) && } else if ((nextone.type == "door") && (count >= PARADELENGTH) && (fcount == 0) && (count >= 3) &&
(thisone.type == "goat" || thisone.type == "cat" || thisone.type == "llama")) { (thisone.type == "goat" || thisone.type == "cat" || thisone.type == "llama")) {
@ -562,7 +568,7 @@ function isvalidpath(mypath) {
} }
} else if ((thisone.type == "cat") && nextone.type == "goat") { } else if ((thisone.type == "cat") && nextone.type == "goat") {
// cat -> goat is okay // cat -> goat is okay
} else if ((thisone.type == "llama") && (nextone.type == "cat" || nextone.type == "goat")) { } else if ((thisone.type == "llama") && ((nextone.type == "cat" && nextone.catcol == startcol) || nextone.type == "goat")) {
// no parades on level 1 // no parades on level 1
if (curlevel == 1) { if (curlevel == 1) {
return false; return false;
@ -580,8 +586,8 @@ function isvalidpath(mypath) {
// first cat -> toad is ok // first cat -> toad is ok
} else if ((i == 0) && (thisone.type == "cat") && (nextone.type == "whitecat")) { } else if ((i == 0) && (thisone.type == "cat") && (nextone.type == "whitecat")) {
// first cat -> whitecat is ok // first cat -> whitecat is ok
} else if ((i != 0) && firstcat && (thisone.type == "food")) { } else if ((i != 0) && firstcat && (thisone.type == "food") && (nextone.type == "food")) {
// not the first one, first one was a cat, this one is food // not the first one, first one was a cat, this one and next are food
} else { } else {
// not ok // not ok
valid = false; valid = false;
@ -840,7 +846,8 @@ function getmousexy(event) {
return [ adjustx, adjusty, x, y ]; return [ adjustx, adjusty, x, y ];
} }
function isadjacenttotype(what, wanttype, exceptionthing) { //
function isadjacenttotype(what, wanttype, exceptionthing, catcol) {
var newgridx,newgridy; var newgridx,newgridy;
var i; var i;
@ -851,7 +858,11 @@ function isadjacenttotype(what, wanttype, exceptionthing) {
if (isonscreen(newgridx,newgridy)) { if (isonscreen(newgridx,newgridy)) {
adjthing = getgridthing(newgridx, newgridy); adjthing = getgridthing(newgridx, newgridy);
if ((adjthing != undefined) && (adjthing.type == wanttype) && (adjthing != exceptionthing)) { if ((adjthing != undefined) && (adjthing.type == wanttype) && (adjthing != exceptionthing)) {
return true; if (catcol == undefined) {
return true;
} else if (adjthing.catcol == what.catcol) {
return true;
}
} }
} }
} }
@ -1425,6 +1436,7 @@ var game = {
mylevel.gridw = DEF_GRIDW; mylevel.gridw = DEF_GRIDW;
mylevel.gridh = DEF_GRIDH; mylevel.gridh = DEF_GRIDH;
mylevel.boardx = (SCREENW - (DEF_GRIDW * DEF_GRIDSIZE))/2; mylevel.boardx = (SCREENW - (DEF_GRIDW * DEF_GRIDSIZE))/2;
mylevel.catcols = 1;
} else { } else {
// default to size of previous one // default to size of previous one
mylevel.gridsize = this.levels[lev-1].gridsize; mylevel.gridsize = this.levels[lev-1].gridsize;
@ -1432,6 +1444,8 @@ var game = {
mylevel.gridw = this.levels[lev-1].gridw; mylevel.gridw = this.levels[lev-1].gridw;
mylevel.gridh = this.levels[lev-1].gridh; mylevel.gridh = this.levels[lev-1].gridh;
mylevel.boardx = this.levels[lev-1].boardx; mylevel.boardx = this.levels[lev-1].boardx;
// default to # cat colours from previous one
mylevel.catcols = this.levels[lev-1].catcols;
} }
mylevel.allowedthings = new Array(); mylevel.allowedthings = new Array();
@ -1500,6 +1514,12 @@ console.log("lev " + lev + " newwid " + newwid + " ratio " + ratio);
} }
}, },
setlevelcatcols : function (numcols) {
var lev;
lev = this.levels.length - 1;
this.levels[lev].catcols = numcols;
},
// goal1type goal1count goal2type goal2count etc... // goal1type goal1count goal2type goal2count etc...
addlevelgoals : function () { addlevelgoals : function () {
var i,idx,lev; var i,idx,lev;
@ -1771,11 +1791,16 @@ console.log("lev " + lev + " newwid " + newwid + " ratio " + ratio);
); );
this.addlevelgoals("brick", 4); this.addlevelgoals("brick", 4);
this.addlevel(17, false); this.addlevel(17, false);
this.addlevelbricks(0,4, 1,4, 2,4, 3,4, 4,4, 5,4, 6,4, 7,4); this.addlevelbricks(0,4, 1,4, 2,4, 3,4, 4,4, 5,4, 6,4, 7,4);
this.addlevelgoals("cat", 25); this.addlevelgoals("cat", 25);
this.addlevelgoals("llama", 6); this.addlevelgoals("llama", 6);
// introduce other coloured cats.
this.addlevel(18, true);
this.setlevelcatcols(2);
this.addlevelgoals("cat", 30);
/* /*
@ -3725,11 +3750,11 @@ console.log("lev " + lev + " newwid " + newwid + " ratio " + ratio);
shadowtext(ctx, "Suns set after reaching the the bottom of the play area.", HELPTEXTSIZE,helpcol, textxspace, cury); shadowtext(ctx, "Suns set after reaching the the bottom of the play area.", HELPTEXTSIZE,helpcol, textxspace, cury);
cury += HELPTEXTYSPACE; cury += HELPTEXTYSPACE;
} else if (curlevel == 12) { } else if (curlevel == 12) {
cury = this.drawhelpsubtitle(ctx, "White Cats", cury); cury = this.drawhelpsubtitle(ctx, "White Stuffed Cats", cury);
ctx.textAlign = "left"; ctx.textAlign = "left";
ctx.textBaseline = "bottom"; ctx.textBaseline = "bottom";
shadowtext(ctx, "Cats and white cat toys like fighting.", HELPTEXTSIZE,helpcol, textxspace, cury); shadowtext(ctx, "Cats and white stuffed cats like fighting.", HELPTEXTSIZE,helpcol, textxspace, cury);
cury += HELPTEXTYSPACE; cury += HELPTEXTYSPACE;
shadowtext(ctx, "Fights clear out all objects around the white cat.", HELPTEXTSIZE,helpcol, textxspace, cury); shadowtext(ctx, "Fights clear out all objects around the white cat.", HELPTEXTSIZE,helpcol, textxspace, cury);
cury += HELPTEXTYSPACE; cury += HELPTEXTYSPACE;
@ -4201,6 +4226,85 @@ console.log("lev " + lev + " newwid " + newwid + " ratio " + ratio);
ctx.textBaseline = "bottom"; ctx.textBaseline = "bottom";
shadowtext(ctx, "Toads and white cats can also break bricks.", HELPTEXTSIZE,helpcol, textxspace, cury); shadowtext(ctx, "Toads and white cats can also break bricks.", HELPTEXTSIZE,helpcol, textxspace, cury);
cury += HELPTEXTYSPACE; cury += HELPTEXTYSPACE;
} else if (curlevel == 18) {
var tempslashes;
cury = this.drawhelpsubtitle(ctx, "Multi-coloured Cats", cury);
ctx.textAlign = "left";
ctx.textBaseline = "bottom";
shadowtext(ctx, "Cats can only form parades with cats of the same colour.", HELPTEXTSIZE,helpcol, textxspace, cury);
cury += HELPTEXTYSPACE;
cury += HELPTEXTYSPACE * 1.5;
// bad example
x = imgsize;
y = cury;
row1y = y;
ctx.drawImage(image['cat'], x, y, imgsize, imgsize);
linex[0] = x + imgsize/2;
liney[0] = y + imgsize/2;
x += gridsize;
ctx.drawImage(image['cat'], x, y, imgsize, imgsize);
x += gridsize;
ctx.drawImage(image['cat1'], x, y, imgsize, imgsize);
linex[1] = x + imgsize/2;
liney[1] = y + imgsize/2;
x += gridsize*2;
drawarrow(ctx, linex[0], liney[0], linex[1], liney[1], PATHLINECOLBAD, LINEWIDTH, PATHARROWSIZE);
drawcross(ctx, x+imgsize/8, row1y+imgsize/8, x + imgsize-imgsize/8, row1y + imgsize-imgsize/8, PATHLINECOLBAD, 3);
y += gridsize;
cury = y;
// good example 1
x = imgsize;
row2y = y;
ctx.drawImage(image['cat'], x, y, imgsize, imgsize);
linex[0] = x + imgsize/2;
liney[0] = y + imgsize/2;
x += gridsize;
ctx.drawImage(image['cat'], x, y, imgsize, imgsize);
x += gridsize;
ctx.drawImage(image['cat'], x, y, imgsize, imgsize);
linex[1] = x + imgsize/2;
liney[1] = y + imgsize/2;
x += gridsize*2;
drawarrow(ctx, linex[0], liney[0], linex[1], liney[1], PATHLINECOLGOOD, LINEWIDTH, PATHARROWSIZE);
drawtick(ctx, x, row2y, x + imgsize, row2y + imgsize, PATHLINECOLGOOD, 3);
y += gridsize;
cury = y;
// good example 2
x = imgsize;
row2y = y;
ctx.drawImage(image['cat1'], x, y, imgsize, imgsize);
linex[0] = x + imgsize/2;
liney[0] = y + imgsize/2;
x += gridsize;
ctx.drawImage(image['cat1'], x, y, imgsize, imgsize);
x += gridsize;
ctx.drawImage(image['cat1'], x, y, imgsize, imgsize);
linex[1] = x + imgsize/2;
liney[1] = y + imgsize/2;
x += gridsize*2;
drawarrow(ctx, linex[0], liney[0], linex[1], liney[1], PATHLINECOLGOOD, LINEWIDTH, PATHARROWSIZE);
drawtick(ctx, x, row2y, x + imgsize, row2y + imgsize, PATHLINECOLGOOD, 3);
} }
ctx.textAlign = "center"; ctx.textAlign = "center";
@ -4877,7 +4981,9 @@ console.log("lev " + lev + " newwid " + newwid + " ratio " + ratio);
// start loading images // start loading images
var i; var i;
imagenames = ['cat', 'catfull', 'catscared', 'llama', 'cheese', 'title', imagenames = [ 'cat', 'catfull', 'catscared',
'cat1', 'catfull1', 'catscared1',
'llama', 'cheese', 'title',
'goat', 'lock','catwalkl','catwalkr','starfull','starempty', 'goat', 'lock','catwalkl','catwalkr','starfull','starempty',
'door', 'sunlight', 'toad', 'whitecat', // special things 'door', 'sunlight', 'toad', 'whitecat', // special things
'brick', // obstacles 'brick', // obstacles
@ -5391,6 +5497,13 @@ function thing(gridx, gridy, type, text, col) {
this.type = type; this.type = type;
if (this.type == "cat") {
this.catcol = rnd(game.levels[curlevel].catcols);
console.log("added cat with col = " + this.catcol + " / " + game.levels[curlevel].catcols);
} else {
this.catcol = null;
}
if (col == undefined) { if (col == undefined) {
switch (this.type) { switch (this.type) {
case "cat": case "cat":
@ -5568,16 +5681,16 @@ function thing(gridx, gridy, type, text, col) {
if (isonscreen(newx, newy)) { if (isonscreen(newx, newy)) {
adj = getgridthing(newx, newy); adj = getgridthing(newx, newy);
if (adj != undefined) { if (adj != undefined) {
if (adj.type == "cat") { if ((adj.type == "cat") && (adj.catcol == this.catcol)) {
// adjacent cat // adjacent cat
if (isadjacenttotype(adj, "llama", this) || if (isadjacenttotype(adj, "llama", this) ||
isadjacenttotype(adj, "cat", this) || isadjacenttotype(adj, "cat", this, catcol) ||
isadjacenttotype(adj, "goat", this)) { isadjacenttotype(adj, "goat", this)) {
return true; return true;
} }
} else if (adj.type == "llama") { } else if (adj.type == "llama") {
// adjacent llama // adjacent llama
if (isadjacenttotype(adj, "cat", this) || if (isadjacenttotype(adj, "cat", this, catcol) ||
isadjacenttotype(adj, "goat", this)) { isadjacenttotype(adj, "goat", this)) {
return true; return true;
} }
@ -5772,15 +5885,21 @@ function thing(gridx, gridy, type, text, col) {
} else { } else {
var myimage; var myimage;
if (this.type == "cat") { if (this.type == "cat") {
var imgname;
if (this.state == "parade") { if (this.state == "parade") {
myimage = image['cat']; imgname = 'cat';
} else if (this.isscared()) { } else if (this.isscared()) {
myimage = image['catscared']; imgname = 'catscared';
} else if (this.issleepy() == true) { } else if (this.issleepy() == true) {
myimage = image['catfull']; imgname = 'catfull';
} else { } else {
myimage = image['cat']; imgname = 'cat';
} }
if (this.catcol > 0) {
// ie. catfull1, catfull2 etc
imgname = imgname + this.catcol;
}
myimage = image[imgname];
} else if (this.type == "food") { } else if (this.type == "food") {
myimage = image['cheese']; myimage = image['cheese'];
} else { } else {

BIN
images/cat1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
images/catfull1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
images/catscared1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

7
todo
View File

@ -18,11 +18,15 @@ new door fell down on top of new goat!!
Powerup to break bricks (but only after bricks appear) Powerup to break bricks (but only after bricks appear)
other colour cats diff colour cats which only match themselves
*add
*only match themself
help
-------------- --------------
more goals: more goals:
form x parades of length y form x parades of length y
@ -32,7 +36,6 @@ more prizes: ???
arrow/signpost - cat parades bounce off and take out htings in the path arrow/signpost - cat parades bounce off and take out htings in the path
diff colour cats which only match themselves
actual fireworks when you achieve a goal rather than a flash. actual fireworks when you achieve a goal rather than a flash.
fireworks later. fireworks later.