not really known
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

316 lines
8.0 KiB

function Game(stage,xocolor,doc,datastore,activity,sizepalette){
this.margin = 0;
this.radius = 0;
this.circleswidth = 0;
this.circlesheight = 0;
this.colours = [xocolor.stroke,xocolor.fill];
this.level = 4;
this.turns = 1;
this.gridwidth = 7;
this.gridheight = 7;
this.numFlips = 14;
this.startgridwidth = 4;
this.startgridheight = 4;
this.dots = [];
this.stack = [];
this.solveTimeout;
this.newGameTimeout;
//Helper functions
this.radiusFromX = function(){
this.margin = 1/50*stage.canvas.width;
var diameter = (stage.canvas.width-(this.margin*(this.gridwidth+1)))/this.gridwidth;
var radius = diameter/2;
return radius;
}
this.radiusFromY = function(){
this.margin = 1/50*stage.canvas.height;
var diameter = (stage.canvas.height-(this.margin*(this.gridheight+1)))/this.gridheight;
var radius = diameter/2;
return radius;
}
this.canDoFromX = function(){
var rad = this.radiusFromX();
this.margin = 1/50*stage.canvas.width;
if ((((rad*2)*this.gridheight)+(this.margin*(this.gridheight+1)))<=stage.canvas.height){
return rad;
} else {
return false;
}
}
this.checkGameOver = function(){
var fgWin = true;
var bgWin = true;
for (var x = 0; x<this.startgridwidth; x++){
for (var y = 0; y<this.startgridheight; y++){
if (this.dots[x][y].colour!=0){
bgWin = false;
}
if (this.dots[x][y].colour!=1){
fgWin = false;
}
}
}
if(bgWin || fgWin) {
return true;
} else {
return false;
}
}
//Flipping
this.flip = function(x,y,playing,stack){
this.turns = this.turns+1;
document.getElementById("turnno").innerHTML = " " + (this.turns);
this.drawIndicator();
if (playing===undefined){playing=true;}
if (stack===undefined){stack=true;}
if (stack){
this.stack.push([x,y]);
}
//console.log("flipdots");
this.dots[x][y].flipSelf();
if (0<y){
this.dots[x][y-1].flipSelf();
}
if (0<x){
this.dots[x-1][y].flipSelf();
}
if (y<this.startgridheight-1){
this.dots[x][y+1].flipSelf();
}
if (x<this.startgridwidth-1){
this.dots[x+1][y].flipSelf();
}
if (playing){
if (this.checkGameOver()){
this.gameOver();
}
}
}
this.drawIndicator = function() {
diffind = this.turns - this.level*3;
console.log(diffind);
switch(diffind){
case 40:
document.getElementById("fliptext").style.borderBottom = "5px solid #f00";
break;
case 30:
document.getElementById("fliptext").style.borderBottom = "5px solid #ff410b";
break;
case 20:
document.getElementById("fliptext").style.borderBottom = "5px solid #ff7e00";
break;
case 10:
document.getElementById("fliptext").style.borderBottom = "5px solid #c7ff00";
break;
case 5:
document.getElementById("fliptext").style.borderBottom = "5px solid #00ff1b";
console.log("12");
break;
}
}
this.getRandomInt = function(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
this.flipRandomDot = function(){
this.flip(this.getRandomInt(0,this.startgridwidth-1),this.getRandomInt(0,this.startgridheight-1),false);
}
//Solve
this.solve = function(){
if (this.stack.length == 0){
return;
} else {
var dot = this.stack.pop();
this.flip(dot[0],dot[1],false,false);
//var t = this;
//this.solveTimeout = setTimeout(function(){t.solve();},750);
}
if(this.checkGameOver()) {
this.gameOver();
}
}
//Game Over
this.gameOver = function(){
for (var x = 0; x<this.startgridwidth; x++){
for (var y = 0; y<this.startgridheight; y++){
this.dots[x][y].showSmile();
this.dots[x][y].clickable = false;
}
}
if (this.startgridwidth<this.gridwidth){
this.startgridwidth++;
this.startgridheight++;
}
this.palette.setUsed();
var t = this;
this.newGameTimeout = setTimeout(function(){t.newGame();},2000);
}
//Save
this.stop = function(){
//store stack, dots, startgridwidth, startgridheight
var arr = {};
arr.stack = this.stack;
arr.startgridwidth = this.startgridwidth;
arr.startgridheight = this.startgridheight;
arr.dots = [];
arr.turns = this.turns;
arr.indcolour = document.getElementById("fliptext").style.borderBottom;
for (var x = 0; x<this.startgridwidth; x++){
temparr = [];
for (var y = 0; y<this.startgridheight; y++){
temparr.push(this.dots[x][y].colour);
}
arr.dots.push(temparr);
}
//console.log(arr);
var js = JSON.stringify(arr);
//console.log(js);
activity.getDatastoreObject().setDataAsText(js);
activity.getDatastoreObject().save(function(){
activity.close();
});
}
//Init
this.initialiseFromArray = function(){
clearTimeout(this.newGameTimeout);
clearTimeout(this.solveTimeout);
stage.removeAllChildren();
this.calculateDimensions();
var incr = (this.radius*2+this.margin);
var xp = (stage.canvas.width-this.circleswidth)/2+this.margin;
var yp = this.margin;
for (var x = 0; x<this.startgridwidth; x++){
yp = this.margin;
for (var y = 0; y<this.startgridheight; y++){
this.dots[x][y].radius = this.radius;
this.dots[x][y].x = xp+this.radius;
this.dots[x][y].y = yp+this.radius;
this.dots[x][y].init();
yp+=incr;
}
xp+=incr;
}
}
this.initDots = function(dotsindex){
this.dots = [];
var temparr = [];
var incr = (this.radius*2+this.margin);
var xp = (stage.canvas.width-this.circleswidth)/2+this.margin;
var yp = this.margin;
for (var x = 0; x<this.startgridwidth; x++){
temparr = [];
yp = this.margin;
for (var y = 0; y<this.startgridheight; y++){
//console.log(x);
//console.log(y);
var ind = 0;
if (dotsindex!=undefined){
ind = dotsindex[x][y];
}
var s = new Dot(stage,xp+this.radius,yp+this.radius,this.colours,ind,this.radius,this,x,y);
s.init();
temparr.push(s);
//console.log(s);
yp+=incr;
}
this.dots.push(temparr);
xp+=incr;
}
//console.log(this.dotsarr);
}
this.calculateDimensions = function(){
var rad = this.canDoFromX();
if (rad===false){
rad = this.radiusFromY();
}
this.radius = rad;
this.circleswidth = this.radius*2*this.startgridwidth+this.margin*(this.startgridwidth+1);
this.circlesheight = this.radius*2*this.startgridheight+this.margin*(this.startgridheight+1);
}
this.newGame = function(){
clearTimeout(this.newGameTimeout);
clearTimeout(this.solveTimeout);
stage.removeAllChildren();
this.calculateDimensions();
this.initDots();
//console.log(this.dots);
this.stack = [];
for (var i = 0; i<14; i++){
this.flipRandomDot();
}
this.turns = 1;
document.getElementById("turnno").innerHTML = " " + (this.turns);
document.getElementById("fliptext").style.borderBottom = "5px solid #00ff1b";
}
this.setSize = function(size){
this.startgridwidth = size;
this.startgridheight = size;
this.newGame();
this.level = size;
}
this.init = function(){
//console.log("init");
//console.log(activity.getDatastoreObject());
this.palette = new sizepalette.SizePalette(this,doc.getElementById('size-button'),undefined);
activity.getDatastoreObject().getMetadata(this.init_canaccessdatastore.bind(this));
document.getElementById("turnno").innerHTML = " " + (this.turns);
this.drawIndicator();
this.palette.setUsed();
}
this.init_canaccessdatastore = function(error,mdata){
//console.log("datastore check");
var d = new Date().getTime();
if (Math.abs(d-mdata.creation_time)<2000){
//console.log("Time too short");
this.newGame();
} else {
activity.getDatastoreObject().loadAsText(this.init_getdatastore.bind(this));
}
}
this.init_getdatastore = function(error,metadata,data){
if (error==null&&data!=null){
data = JSON.parse(data);
this.restoreFromDatastore(data);
} else {
this.newGame();
}
}
this.restoreFromDatastore = function(data){
this.stack = data.stack;
this.startgridwidth = data.startgridwidth;
this.startgridheight = data.startgridheight;
this.turns = data.turns;
document.getElementById("fliptext").style.borderBottom = data.indcolour;
clearTimeout(this.newGameTimeout);
clearTimeout(this.solveTimeout);
stage.removeAllChildren();
this.calculateDimensions();
this.initDots(data.dots);
}
}