diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 5a8c8cef1e..8b269ae253 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -11,11 +11,11 @@ Please follow the house rules to have a bigger chance of your contribution being
- If you want to modify the CSS, please edit the SCSS files present in `style/`: `main.scss` and others. Don't edit the `main.css`, because it's supposed to be generated.
In order to compile your SCSS modifications, you need to use the `sass` gem (install it by running `gem install sass` once Ruby is installed).
To run SASS, simply use the following command:
- `sass --watch style/main.scss`
+ `sass --unix-newlines --watch style/main.scss`
SASS will automatically recompile your css when changed.
- `Rakefile` contains some tasks that help during development. Feel free to add useful tasks if needed.
- Please use 2-space indentation when editing the JavaScript. A `.jshintrc` file is present, which will help your code to follow the guidelines if you install and run `jshint`.
- - Please test your modification thouroughly before submitting your Pull Request.
+ - Please test your modification thoroughly before submitting your Pull Request.
### Changes that might not be accepted
We have to be conservative with the core game. This means that some modifications won't be merged, or will have to be evaluated carefully before being merged:
diff --git a/README.md b/README.md
index dac8af33f5..6b1da38794 100644
--- a/README.md
+++ b/README.md
@@ -3,19 +3,25 @@ A small clone of [1024](https://play.google.com/store/apps/details?id=com.veewo.
Made just for fun. [Play it here!](http://gabrielecirulli.github.io/2048/)
+The official app can also be found on the [Play Store](https://play.google.com/store/apps/details?id=com.gabrielecirulli.app2048) and [App Store!](https://itunes.apple.com/us/app/2048-by-gabriele-cirulli/id868076805)
+
### Contributions
+[Anna Harren](https://github.com/iirelu/) and [sigod](https://github.com/sigod) are maintainers for this repository.
+
+Other notable contributors:
+
- [TimPetricola](https://github.com/TimPetricola) added best score storage
- [chrisprice](https://github.com/chrisprice) added custom code for swipe handling on mobile
- - [elektryk](https://github.com/elektryk) made swipes work on Windows Phone
- - [mgarciaisaia](https://github.com/mgarciaisaia) addes support for Android 2.3
+ - [marcingajda](https://github.com/marcingajda) made swipes work on Windows Phone
+ - [mgarciaisaia](https://github.com/mgarciaisaia) added support for Android 2.3
Many thanks to [rayhaanj](https://github.com/rayhaanj), [Mechazawa](https://github.com/Mechazawa), [grant](https://github.com/grant), [remram44](https://github.com/remram44) and [ghoullier](https://github.com/ghoullier) for the many other good contributions.
### Screenshot
-
+
That screenshot is fake, by the way. I never reached 2048 :smile:
diff --git a/index.html b/index.html
index 8d188c160b..0da0ee0e1b 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,10 @@
+
+
+
diff --git a/js/game_manager.js b/js/game_manager.js
index aea99f335a..1c13d15bd6 100644
--- a/js/game_manager.js
+++ b/js/game_manager.js
@@ -28,11 +28,7 @@ GameManager.prototype.keepPlaying = function () {
// Return true if the game is lost, or has won and the user hasn't kept playing
GameManager.prototype.isGameTerminated = function () {
- if (this.over || (this.won && !this.keepPlaying)) {
- return true;
- } else {
- return false;
- }
+ return this.over || (this.won && !this.keepPlaying);
};
// Set up the game
diff --git a/js/keyboard_input_manager.js b/js/keyboard_input_manager.js
index 32a177a47d..ca01b3ce89 100644
--- a/js/keyboard_input_manager.js
+++ b/js/keyboard_input_manager.js
@@ -79,7 +79,7 @@ KeyboardInputManager.prototype.listen = function () {
gameContainer.addEventListener(this.eventTouchstart, function (event) {
if ((!window.navigator.msPointerEnabled && event.touches.length > 1) ||
- event.targetTouches > 1) {
+ event.targetTouches.length > 1) {
return; // Ignore if touching with more than 1 finger
}
@@ -100,7 +100,7 @@ KeyboardInputManager.prototype.listen = function () {
gameContainer.addEventListener(this.eventTouchend, function (event) {
if ((!window.navigator.msPointerEnabled && event.touches.length > 0) ||
- event.targetTouches > 0) {
+ event.targetTouches.length > 0) {
return; // Ignore if still touching with one or more fingers
}
diff --git a/js/local_storage_manager.js b/js/local_storage_manager.js
index 776e94b1ab..2ca9cc3006 100644
--- a/js/local_storage_manager.js
+++ b/js/local_storage_manager.js
@@ -28,9 +28,9 @@ function LocalStorageManager() {
LocalStorageManager.prototype.localStorageSupported = function () {
var testKey = "test";
- var storage = window.localStorage;
try {
+ var storage = window.localStorage;
storage.setItem(testKey, "1");
storage.removeItem(testKey);
return true;
diff --git a/meta/apple-touch-startup-image-640x1096.png b/meta/apple-touch-startup-image-640x1096.png
new file mode 100644
index 0000000000..5a68ba0bcb
Binary files /dev/null and b/meta/apple-touch-startup-image-640x1096.png differ
diff --git a/meta/apple-touch-startup-image-640x920.png b/meta/apple-touch-startup-image-640x920.png
new file mode 100644
index 0000000000..17bc9d8322
Binary files /dev/null and b/meta/apple-touch-startup-image-640x920.png differ
diff --git a/style/helpers.scss b/style/helpers.scss
index 7b4445b37b..72693ee20d 100644
--- a/style/helpers.scss
+++ b/style/helpers.scss
@@ -48,6 +48,7 @@
@mixin transform($args...) {
-webkit-transform: $args;
-moz-transform: $args;
+ -ms-transform: $args;
transform: $args;
}
diff --git a/style/main.css b/style/main.css
index 0f2d37754a..ea3cb19fca 100644
--- a/style/main.css
+++ b/style/main.css
@@ -231,70 +231,86 @@ hr {
.tile, .tile .tile-inner {
width: 107px;
height: 107px;
- line-height: 116.25px; }
+ line-height: 107px; }
.tile.tile-position-1-1 {
-webkit-transform: translate(0px, 0px);
-moz-transform: translate(0px, 0px);
+ -ms-transform: translate(0px, 0px);
transform: translate(0px, 0px); }
.tile.tile-position-1-2 {
-webkit-transform: translate(0px, 121px);
-moz-transform: translate(0px, 121px);
+ -ms-transform: translate(0px, 121px);
transform: translate(0px, 121px); }
.tile.tile-position-1-3 {
-webkit-transform: translate(0px, 242px);
-moz-transform: translate(0px, 242px);
+ -ms-transform: translate(0px, 242px);
transform: translate(0px, 242px); }
.tile.tile-position-1-4 {
-webkit-transform: translate(0px, 363px);
-moz-transform: translate(0px, 363px);
+ -ms-transform: translate(0px, 363px);
transform: translate(0px, 363px); }
.tile.tile-position-2-1 {
-webkit-transform: translate(121px, 0px);
-moz-transform: translate(121px, 0px);
+ -ms-transform: translate(121px, 0px);
transform: translate(121px, 0px); }
.tile.tile-position-2-2 {
-webkit-transform: translate(121px, 121px);
-moz-transform: translate(121px, 121px);
+ -ms-transform: translate(121px, 121px);
transform: translate(121px, 121px); }
.tile.tile-position-2-3 {
-webkit-transform: translate(121px, 242px);
-moz-transform: translate(121px, 242px);
+ -ms-transform: translate(121px, 242px);
transform: translate(121px, 242px); }
.tile.tile-position-2-4 {
-webkit-transform: translate(121px, 363px);
-moz-transform: translate(121px, 363px);
+ -ms-transform: translate(121px, 363px);
transform: translate(121px, 363px); }
.tile.tile-position-3-1 {
-webkit-transform: translate(242px, 0px);
-moz-transform: translate(242px, 0px);
+ -ms-transform: translate(242px, 0px);
transform: translate(242px, 0px); }
.tile.tile-position-3-2 {
-webkit-transform: translate(242px, 121px);
-moz-transform: translate(242px, 121px);
+ -ms-transform: translate(242px, 121px);
transform: translate(242px, 121px); }
.tile.tile-position-3-3 {
-webkit-transform: translate(242px, 242px);
-moz-transform: translate(242px, 242px);
+ -ms-transform: translate(242px, 242px);
transform: translate(242px, 242px); }
.tile.tile-position-3-4 {
-webkit-transform: translate(242px, 363px);
-moz-transform: translate(242px, 363px);
+ -ms-transform: translate(242px, 363px);
transform: translate(242px, 363px); }
.tile.tile-position-4-1 {
-webkit-transform: translate(363px, 0px);
-moz-transform: translate(363px, 0px);
+ -ms-transform: translate(363px, 0px);
transform: translate(363px, 0px); }
.tile.tile-position-4-2 {
-webkit-transform: translate(363px, 121px);
-moz-transform: translate(363px, 121px);
+ -ms-transform: translate(363px, 121px);
transform: translate(363px, 121px); }
.tile.tile-position-4-3 {
-webkit-transform: translate(363px, 242px);
-moz-transform: translate(363px, 242px);
+ -ms-transform: translate(363px, 242px);
transform: translate(363px, 242px); }
.tile.tile-position-4-4 {
-webkit-transform: translate(363px, 363px);
-moz-transform: translate(363px, 363px);
+ -ms-transform: translate(363px, 363px);
transform: translate(363px, 363px); }
.tile {
@@ -383,36 +399,42 @@ hr {
opacity: 0;
-webkit-transform: scale(0);
-moz-transform: scale(0);
+ -ms-transform: scale(0);
transform: scale(0); }
100% {
opacity: 1;
-webkit-transform: scale(1);
-moz-transform: scale(1);
+ -ms-transform: scale(1);
transform: scale(1); } }
@-moz-keyframes appear {
0% {
opacity: 0;
-webkit-transform: scale(0);
-moz-transform: scale(0);
+ -ms-transform: scale(0);
transform: scale(0); }
100% {
opacity: 1;
-webkit-transform: scale(1);
-moz-transform: scale(1);
+ -ms-transform: scale(1);
transform: scale(1); } }
@keyframes appear {
0% {
opacity: 0;
-webkit-transform: scale(0);
-moz-transform: scale(0);
+ -ms-transform: scale(0);
transform: scale(0); }
100% {
opacity: 1;
-webkit-transform: scale(1);
-moz-transform: scale(1);
+ -ms-transform: scale(1);
transform: scale(1); } }
.tile-new .tile-inner {
-webkit-animation: appear 200ms ease 100ms;
@@ -426,46 +448,55 @@ hr {
0% {
-webkit-transform: scale(0);
-moz-transform: scale(0);
+ -ms-transform: scale(0);
transform: scale(0); }
50% {
-webkit-transform: scale(1.2);
-moz-transform: scale(1.2);
+ -ms-transform: scale(1.2);
transform: scale(1.2); }
100% {
-webkit-transform: scale(1);
-moz-transform: scale(1);
+ -ms-transform: scale(1);
transform: scale(1); } }
@-moz-keyframes pop {
0% {
-webkit-transform: scale(0);
-moz-transform: scale(0);
+ -ms-transform: scale(0);
transform: scale(0); }
50% {
-webkit-transform: scale(1.2);
-moz-transform: scale(1.2);
+ -ms-transform: scale(1.2);
transform: scale(1.2); }
100% {
-webkit-transform: scale(1);
-moz-transform: scale(1);
+ -ms-transform: scale(1);
transform: scale(1); } }
@keyframes pop {
0% {
-webkit-transform: scale(0);
-moz-transform: scale(0);
+ -ms-transform: scale(0);
transform: scale(0); }
50% {
-webkit-transform: scale(1.2);
-moz-transform: scale(1.2);
+ -ms-transform: scale(1.2);
transform: scale(1.2); }
100% {
-webkit-transform: scale(1);
-moz-transform: scale(1);
+ -ms-transform: scale(1);
transform: scale(1); } }
.tile-merged .tile-inner {
z-index: 20;
@@ -633,70 +664,86 @@ hr {
.tile, .tile .tile-inner {
width: 58px;
height: 58px;
- line-height: 67.5px; }
+ line-height: 58px; }
.tile.tile-position-1-1 {
-webkit-transform: translate(0px, 0px);
-moz-transform: translate(0px, 0px);
+ -ms-transform: translate(0px, 0px);
transform: translate(0px, 0px); }
.tile.tile-position-1-2 {
-webkit-transform: translate(0px, 67px);
-moz-transform: translate(0px, 67px);
+ -ms-transform: translate(0px, 67px);
transform: translate(0px, 67px); }
.tile.tile-position-1-3 {
-webkit-transform: translate(0px, 135px);
-moz-transform: translate(0px, 135px);
+ -ms-transform: translate(0px, 135px);
transform: translate(0px, 135px); }
.tile.tile-position-1-4 {
-webkit-transform: translate(0px, 202px);
-moz-transform: translate(0px, 202px);
+ -ms-transform: translate(0px, 202px);
transform: translate(0px, 202px); }
.tile.tile-position-2-1 {
-webkit-transform: translate(67px, 0px);
-moz-transform: translate(67px, 0px);
+ -ms-transform: translate(67px, 0px);
transform: translate(67px, 0px); }
.tile.tile-position-2-2 {
-webkit-transform: translate(67px, 67px);
-moz-transform: translate(67px, 67px);
+ -ms-transform: translate(67px, 67px);
transform: translate(67px, 67px); }
.tile.tile-position-2-3 {
-webkit-transform: translate(67px, 135px);
-moz-transform: translate(67px, 135px);
+ -ms-transform: translate(67px, 135px);
transform: translate(67px, 135px); }
.tile.tile-position-2-4 {
-webkit-transform: translate(67px, 202px);
-moz-transform: translate(67px, 202px);
+ -ms-transform: translate(67px, 202px);
transform: translate(67px, 202px); }
.tile.tile-position-3-1 {
-webkit-transform: translate(135px, 0px);
-moz-transform: translate(135px, 0px);
+ -ms-transform: translate(135px, 0px);
transform: translate(135px, 0px); }
.tile.tile-position-3-2 {
-webkit-transform: translate(135px, 67px);
-moz-transform: translate(135px, 67px);
+ -ms-transform: translate(135px, 67px);
transform: translate(135px, 67px); }
.tile.tile-position-3-3 {
-webkit-transform: translate(135px, 135px);
-moz-transform: translate(135px, 135px);
+ -ms-transform: translate(135px, 135px);
transform: translate(135px, 135px); }
.tile.tile-position-3-4 {
-webkit-transform: translate(135px, 202px);
-moz-transform: translate(135px, 202px);
+ -ms-transform: translate(135px, 202px);
transform: translate(135px, 202px); }
.tile.tile-position-4-1 {
-webkit-transform: translate(202px, 0px);
-moz-transform: translate(202px, 0px);
+ -ms-transform: translate(202px, 0px);
transform: translate(202px, 0px); }
.tile.tile-position-4-2 {
-webkit-transform: translate(202px, 67px);
-moz-transform: translate(202px, 67px);
+ -ms-transform: translate(202px, 67px);
transform: translate(202px, 67px); }
.tile.tile-position-4-3 {
-webkit-transform: translate(202px, 135px);
-moz-transform: translate(202px, 135px);
+ -ms-transform: translate(202px, 135px);
transform: translate(202px, 135px); }
.tile.tile-position-4-4 {
-webkit-transform: translate(202px, 202px);
-moz-transform: translate(202px, 202px);
+ -ms-transform: translate(202px, 202px);
transform: translate(202px, 202px); }
.tile .tile-inner {
diff --git a/style/main.scss b/style/main.scss
index cce393fa78..b0ec8da9cc 100644
--- a/style/main.scss
+++ b/style/main.scss
@@ -111,7 +111,7 @@ h1.title {
}
.best-container:after {
- content: "Best"
+ content: "Best";
}
p {
@@ -292,7 +292,7 @@ hr {
&, .tile-inner {
width: ceil($tile-size);
height: ceil($tile-size);
- line-height: $tile-size + 10px;
+ line-height: ceil($tile-size);
}
// Build position classes