// Level config FoodChain.learnLevels = [ { size: 2, count: 5, time: 10 }, // Level 1 { size: 2, count: 10, time: 15 }, // Level 2 { size: 2, count: 15, time: 20 }, // Level 3 { size: 3, count: 5, time: 10 }, // Level 4 { size: 3, count: 10, time: 15 }, // Level 5 { size: 3, count: 15, time: 20 } // Level 6 ]; // Learn Game class enyo.kind({ name: "FoodChain.LearnGame", kind: enyo.Control, published: {level: 1}, classes: "board", components: [ { name: "cards", components: [ // Level - Score - Time bar { components: [ { classes: "level-zone", components: [ { name: "textlevel", classes: "title level-value" }, { name: "level", content: "0", classes: "title level-value" } ]}, { classes: "score-zone", components: [ { name: "textscore", classes: "title score-text" }, { name: "score", content: "0000", classes: "title score-value" }, { name: "timercount", content: "0:0,0", classes: "title timer-value" } ]} ]}, // Board zone { name: "startbox", classes: "start-box", components: [] }, { components: [ { name: "herbbox", classes: "end-box", ontap: "chooseAsEnd", ondrop: "drop", ondragover: "dragover", components: [ { name: "herbname", classes: "box-name herb-color" } ]}, { name: "carnbox", classes: "end-box", ontap: "chooseAsEnd", ondrop: "drop", ondragover: "dragover", components: [ { name: "carnname", classes: "box-name" } ]}, { name: "omnibox", classes: "end-box omni-box-two", ontap: "chooseAsEnd", ondrop: "drop", ondragover: "dragover", components: [ { name: "omniname", classes: "box-name" } ]} ]}, // Buttons bar { name: "play", kind: "ShadowButton", img: "play", classes: "play", ontap: "play" }, { name: "pause", kind: "ShadowButton", img: "pause", classes: "play", ontap: "pause" }, { name: "forward", kind: "ShadowButton", img: "forward", classes: "restart", ontap: "next" }, { name: "home", kind: "ShadowButton", img: "home", classes: "home", ontap: "home" }, // End of sound event {kind: "Signals", onEndOfSound: "endSound"} ]} ], // Constructor create: function() { this.inherited(arguments); this.cardlist = null; this.nextaction = 0; this.createComponent({ name: "timer", kind: "Timer", paused: true, onTriggered: "updateTimer" }, {owner: this}); this.setLocale(); this.$.score.setContent(String("0000"+FoodChain.context.score).slice(-4)); FoodChain.context.game = this.kindName; this.levelChanged(); }, // Localization changed, update cards and string resource setLocale: function() { // Update string resources this.$.textlevel.setContent(__$FC("level")); this.$.textscore.setContent(__$FC("score")); this.$.herbname.setContent(__$FC(FoodChain.feedStrategy[0].name)); this.$.carnname.setContent(__$FC(FoodChain.feedStrategy[1].name)); this.$.omniname.setContent(__$FC(FoodChain.feedStrategy[2].name)); // Update cards enyo.forEach(this.$.startbox.getControls(), function(card) { card.setLocale(); }); }, // Level changed, init board then start game levelChanged: function() { // Box handling FoodChain.context.level = this.level; if (FoodChain.learnLevels[this.level-1].size == 2) { FoodChain.addRemoveClass(this.$.herbbox, "herb-box-two", "herb-box-three"); FoodChain.addRemoveClass(this.$.carnbox, "carn-box-two", "carn-box-three"); FoodChain.addRemoveClass(this.$.omnibox, "omni-box-two", "omni-box-three"); this.$.omnibox.hide(); } else { FoodChain.addRemoveClass(this.$.herbbox, "herb-box-three", "herb-box-two"); FoodChain.addRemoveClass(this.$.carnbox, "carn-box-three", "carn-box-two"); FoodChain.addRemoveClass(this.$.omnibox, "omni-box-three", "omni-box-two"); this.$.omnibox.show(); } this.dragobject = null; this.selectedobject = null; // Compute the card list to sort if (this.cardlist == null) { this.cardlist = FoodChain.randomFeedList(FoodChain.learnLevels[this.level-1].size, FoodChain.learnLevels[this.level-1].count); } // Display the first card this.currentcard = 0; var card = this.$.startbox.createComponent({ kind: "FoodChain.Card", cardname: this.cardlist[this.currentcard].cardname, x: 10, y: 10, ontap: "taped", ondragstart: "dragstart", ondragfinish: "dragfinish"}, {owner: this}); FoodChain.sound.play(card.sound); // Saving context FoodChain.saveContext(); // Button handling this.$.play.hide(); this.$.pause.show(); this.$.forward.hide(); this.$.home.hide(); // Timer and level init this.$.level.setContent(" "+this.level); this.timecount = {mins:0, secs:0, tenth:0}; this.$.timercount.removeClass("timer-overtime"); this.displayTimer(); this.render(); }, // Sound ended, start game endSound: function(e, s) { // What next ? if (this.nextaction == 1) { // Right play, next card or next level this.nextaction = 0; this.dragobject.getContainer().removeClass("box-win"); this.dragobject.destroy(); this.dragobject = null; // Next level if (this.currentcard+1 == this.cardlist.length) { this.computeLevelScore(); this.$.play.hide(); this.$.pause.hide(); this.$.home.show(); this.render(); if (this.level != FoodChain.learnLevels.length) this.$.forward.show(); // Display next card } else { this.currentcard = this.currentcard + 1; var card = this.$.startbox.createComponent({ kind: "FoodChain.Card", cardname: this.cardlist[this.currentcard].cardname, x: 5, y: 5, ontap: "taped", ondragstart: "dragstart", ondragfinish: "dragfinish"}, {owner: this}); FoodChain.sound.play(card.sound); this.render(); } return; } else if (this.nextaction == 2) { // Bad play, put card at start this.nextaction = 0; this.dragobject.getContainer().removeClass("box-lost"); this.dragobject.setContainer(this.$.startbox); this.dragobject = null; this.render(); } // Start timer this.$.timer.resume(); }, // Display timer value displayTimer: function() { this.$.timercount.setContent(this.timecount.mins+":"+String("00"+this.timecount.secs).slice(-2)+","+this.timecount.tenth); }, // Update timer updateTimer: function(s, e) { this.timecount.tenth = this.timecount.tenth + 1; if (this.timecount.tenth == 10) { this.timecount.tenth = 0; this.timecount.secs = this.timecount.secs + 1; var currentcount = this.timecount.mins * 60 + this.timecount.secs; if (currentcount >= FoodChain.learnLevels[this.level-1].time) { this.$.timercount.addClass("timer-overtime"); } if (this.timecount.secs == 60) { this.timecount.secs = 0; this.timecount.mins = this.timecount.mins + 1; } } this.displayTimer(); }, // Play sound when card taped, set card as selected (avoid need of drag&drop) taped: function(s, e) { if (this.$.timer.paused) return true; FoodChain.sound.play(s.sound); FoodChain.log(s.cardname+" taped"); this.selectedobject = s; s.addClass("card-dragged"); }, // Card drag start, change style to dragged dragstart: function(s, e) { if (this.$.timer.paused) return true; s.addClass("card-dragged"); this.$.startbox.addClass("box-dragging"); this.$.herbbox.addClass("box-dragging"); this.$.carnbox.addClass("box-dragging"); this.$.omnibox.addClass("box-dragging"); FoodChain.sound.play(s.sound); this.dragobject = s; this.selectedobject = null; }, // Card drag end, change style to not dragged dragfinish: function(s, e) { s.removeClass("card-dragged"); this.$.startbox.removeClass("box-dragging"); this.$.herbbox.removeClass("box-dragging"); this.$.carnbox.removeClass("box-dragging"); this.$.omnibox.removeClass("box-dragging"); }, // Drag over the box, allow dragging dragover: function(s, e) { if (this.dragobject == null) return true; e.preventDefault(); return false; }, // Choose the final box for the card, same as drop but without drag chooseAsEnd: function(s, e) { if (this.selectedobject == null) return true; this.selectedobject.removeClass("card-dragged"); this.dragobject = this.selectedobject; this.drop(s, e); this.selectedobject = null; }, // Dropped in the box, check if correct drop: function(s, e) { if (this.dragobject == null || this.$.timer.paused) return true; e.preventDefault(); // Draw in the new box this.dragobject.setContainer(s); this.dragobject.moveTo(5,0); this.render(); // Test if in the right box this.$.timer.pause(); var win = (s.name.substring(0,4) == FoodChain.feedStrategy[this.cardlist[this.currentcard].strategy].name.substring(0,4)); if (win) { this.nextaction = 1; this.addScore(1); FoodChain.sound.play("audio/applause"); s.addClass("box-win"); } else { this.nextaction = 2; FoodChain.sound.play("audio/disappointed"); s.addClass("box-lost"); } }, // Compute score addScore: function(score) { FoodChain.context.score += score; this.$.score.setContent(String("0000"+FoodChain.context.score).slice(-4)); }, // Compute score for this level computeLevelScore: function() { var score = 0; var currentcount = this.timecount.mins * 60 + this.timecount.secs; if (currentcount < FoodChain.learnLevels[this.level-1].time) { score += (FoodChain.learnLevels[this.level-1].time - currentcount); } this.addScore(score); }, // Resume game play: function() { // Show cards enyo.forEach(this.$.startbox.getControls(), function(card) { card.show(); }); // Show pause button, hide play button this.$.timer.resume(); this.$.play.hide(); this.$.pause.show(); this.$.home.hide(); }, // Pause game pause: function() { // Hide cards enyo.forEach(this.$.startbox.getControls(), function(card) { card.hide(); }); // Show play button, hide pause button this.$.timer.pause(); this.$.pause.hide(); this.$.play.show(); this.$.home.show(); }, // Go to the next level next: function() { this.level = this.level + 1; this.cardlist = null; this.levelChanged(); }, // Go to the home page of the app home: function() { this.$.timer.stop(); FoodChain.goHome(); } });