2017-05-27

[Tutorial] Play Pokemon GO and Mario RUN on Lineage OS or CyanogenMod

Hi there,

I finally managed to run Mario Run and some other Nintendo Games (Mario RUN, Magikarp Jump, Pokemon Shuffle; including Pokemon GO, which is made by Niantic and not Nintendo) on my Samsung Galaxy Note II with Lineage OS 14.1 / Android 7.1.

Look no further, here is what you have to do :) Unfortunately you might have to reinstall your custom ROM, so backup all your data or enable Google App Data Saving.

  1. remove all other SU tools and SU-hiding apps
  2. (optional) if in the Developer Settings Root Access only shows ADB / Deactivate, you have to re-flash your Custom ROM and GApps
  3. Enable Developer Settings and set Root Access to "Apps and ADB"
  4. Download iSU and install it
  5. Give Root Access to iSU, when you run it the first time
  6. in iSU: change to tab "Controls" and set "Change SU state" to "Deactivated"
  7. in iSU: change to tab "Props" > "Force set all Known props" > "Safe Value"
  8. in iSU: (optional) tab "Checks" > "Safety Net test"
  9. launch Mario RUN, Pokemon GO or whatever needs positive SafetyNet Check
Everything fine with SafetyNet

Time to show bowser, who's the boss.



Have fun :)

2017-05-18

JavaScript ES6 Game Loop Design Pattern

Get Started

This is just a short overview how to setup a very simple game loop with ES6 (JavaScript) using classes.

The following code sections are pretty easy to understand

Note that in many cases you need to use ES6's arrow operator => to make sure, you are accessing the correct this. Otherwise you will often get the error "this.method is not a function". That happens because when accessing this from anonymous methods, this points to the object of the anonymous method, not the object your calling it from.

In the HTML snippet, we set up a simple X3D scene with a ground and a small bar.

In the JavaScript main.js we create a game object. In Game.js the constructor sets up the game object and initializes the game loop to be triggered every 10 ms. We keep track of the pressed buttons (WASD) with booleans and move the bar accordingly.

This is what you will see, you can move the bar around with the WASD keys.



Have fun :)

PS: To develop this into a real game, have a look at the tutorial at MDN Developers, which is for 2D games with canvas, but much of it can be applied to our system as well: Tutorial

HTML Base Project


Here is the HTML frame:


<!doctype html>
<html>
  <!-- ......................................................................... HEAD -->
  <head>
    <title>LinuVerse Simple Game Loop Example</title>
    <meta charset="utf-8" />
    <script
      type='text/javascript'
      src='http://www.x3dom.org/download/x3dom.js'></script>
    <link
      rel='stylesheet'
      type='text/css'
      href='http://www.x3dom.org/download/x3dom.css'></link>
  </head>
  <!-- ......................................................................... BODY -->
  <body>
    <h1>LinuVerse Simple Game Loop Example</h1>
    <!-- ....................................................................... x3d -->
    <x3d width="800px" height="600px">
      <scene>
        <Viewpoint position="0,5,20" orientation="1,0,0,-.2"></Viewpoint>
        
        <!-- Scene ......................................................... -->
        <!-- Bar -->
        <transform id="bar" translation="0 -3 0">
          <shape>
            <appearance>
              <material diffuseColor=".9 .9 .9" />
            </appearance>
            <box size="5 1 1" />
          </shape>
        </transform>

        <!-- Scene ground -->
        <transform translation="0 -4 0">
          <shape>
            <appearance>
              <material diffuseColor=".8 .8 .8" />
            </appearance>
            <box size="20 1 20" />
          </shape>
        </transform>
      </scene>
    </x3d>

    <!-- ....................................................................... SCRIPTS -->
    <script type='text/javascript' src='Game.js'></script>
    <script type='text/javascript' src='main.js'></script>
    <script>
      main();
    </script>
  </body>
</html>

JavaScript Code


The Main JavaScript-File:
var game;

function main(args) {
  game = new Game();
}
And the Game Class:
'use strict'

class Game {

  constructor() {
    this.bar = document.getElementById('bar');
    this.barPos = [0,-3,0];

    this.upKeyPressed = false;
    this.downKeyPressed = false;
    this.leftKeyPressed = false;
    this.rightKeyPressed = false;

    document.addEventListener('keydown', event => this.onKeyDown(event));
    document.addEventListener('keyup', event => this.onKeyUp(event));

    setInterval(() => this.render(), 10);
  }

  /**
   * Main Render Cycle
   */
  render() {
    this.moveBar();
  }

  moveBar() {
    if(this.upKeyPressed){
      this.barPos[2] -= .1;
    }
    if(this.downKeyPressed){
      this.barPos[2] += .1;
    }
    if(this.leftKeyPressed){
      this.barPos[0] -= .1;
    }
    if(this.rightKeyPressed){
      this.barPos[0] += .1;
    }
    this.bar.setAttribute('translation', this.barPos);
  }

  onKeyDown(event) {
    switch(event.keyCode) {
      case 87: this.upKeyPressed = true; break;
      case 83: this.downKeyPressed = true; break;
      case 65: this.leftKeyPressed = true; break;
      default: this.rightKeyPressed = true; break;
    }
  }

  onKeyUp(event) {
    switch(event.keyCode) {
      case 87: this.upKeyPressed = false; break;
      case 83: this.downKeyPressed = false; break;
      case 65: this.leftKeyPressed = false; break;
      default: this.rightKeyPressed = false; break;
    }
  }
}

2017-03-05

Game Development: Construction Method (Java Design Pattern)

If you want to extend a Class and do some stuff, before the super constructor gets called, you can do the following:

Create static methods, which return everything your super constructor needs.
Here is a simple example from LibGDX. I wanted to extend ScrollPane and provide some additional predefined values.

What I wanted to do is:
  • children of my ScrollableWidget should always sit in the middle
  • both scrollbars should always be active
  • children should always sit in the middle of a bigger container (overscrolling)


public class ScrollableWidget extends ScrollPane {

    public ScrollableWidget( 

        int scrollWidth, int scrollHeight, 

        int childWidth, int childHeight, Actor child, Skin skin) {

 

        super(construct(childWidth, childHeight, child), skin);
        setSize(scrollWidth, scrollHeight);
        setScrollBarPositions(true, true);
        layout();
        setScrollPercentX(.5f);
        setScrollPercentY(.5f);

    }

    private static Actor construct( 

        int width, int height, Actor child) {

 

        Group container = new Group();
        container.setSize(width,height);
        child.setPosition(width/2-child.getWidth()/2,height/2-child.getHeight()/2, Align.bottomLeft);
        container.addActor(child);

        return container;
    }
}

2017-01-06

Nintendo new 3DS Bildschirm Flackern / Flimmern beheben

Wenn bei eurem Nintendo new 3DS der Bildschirm flimmert, solltet ihr Automatische Helligkeit und Energiesparmodus abschalten, dann hört das flackern wieder auf.

Frohes Spielen :)

2016-12-22

Ubuntu 16.04 USB-Stick - "Das Ziel ist schreibgeschützt" lösen

Es gibt Dinge, die dürfen in einem nutzerfreundlichen Betriebssystem einfach nicht passieren. Vor allem dürfen Sie aber nicht monatelang bestehen bleiben.

Mit Ubuntu 16.04 kann ich Freunden und Bekannten Ubuntu einfach nicht mehr empfehlen, wenn selbst ich an einfachsten Aufgaben scheitere.

Gemeint ist hier das Kopieren von Dateien auf USB-Sticks. Trotz jahrelanger Ubuntu/Linux-Erfahrung gelang es mir erst nach gründlicher Recherche das Problem zu beheben. Ein Laie hat hier keine Chance. Damit ihr nicht lange suchen müsst, hier das Problem samt Lösung:

Problem

Datei oder Ordner auf Fat32-USB-Stick kopieren oder anlegen schlägt fehl mit der Meldung "Das Ziel ist schreibgeschützt".

Lösung

das Paket fuse-posixovl installieren und Ubuntu neu starten



sudo apt-get install fuse-posixovl

Viel Erfolg

2016-09-14

[Tutorial] Smartphone unroot (Root entfernen) für Pokemon GO 0.37.0

Einleitung

UPDATE: dieser Workaround funktioniert mit aktuellem SafetyNet nicht mehr.

ENGLISH: How to Play Pokemon GO 0.37.0 on rooted Android and CyanogenMod 

Diese Anleitung zeigt euch, wie ihr den Root-Zugriff auf eurem Handy komplett entfernt um Pokemon GO 0.37.0 mit Buddy-Funktion spielen zu können. Wenn ihr euren Root-Zugriff behalten wollt oder CyanogenMod nutzt, seht euch mein anderes Tutorial an.

Diese Variante hier geht am schnellsten und ist am sichersten.

Warnung: Wie immer, ich übernehme keine Haftung, wenn Ihr Daten verliert oder euer Gerät beschädigt.

Anleitung

Los geht's.

Unroot

  1. Pokemon Go komplett deinstallieren (keine Angst, Spielstand geht NICHT verloren)
  2. Alle vorhandenen Root-Apps deinstallieren
  3. (Optional) SafetyNet Helper installieren
  4. Chainfires SuperSu installieren
  5. In SuperSu auf Zahnrad-Symbol > Vollständiges Unroot
  6. Handy startet eventuell mehrfach neu

 Pokemon GO 0.37.0 installieren

  1. (Optional) SafetyNet-Helper starten
  2. Pokemon GO 0.37.0 installieren
Schritt 1: SafetyNet-Test
Schritt 2: Pokemon GO starten

Sollte alles scheitern, könnt ihr immernoch das Hersteller-ROM flashen, dabei gehen allerdings all eure Daten die nicht in der Google-Cloud sind verloren - also schön Daten sichern!

Geschafft :)

Lasst mich eure Erfahrungen wissen. Viel Spaß beim Spielen.

2016-09-13

[Tutorial KURZ] Pokemon Go 0.37.0 auf Smartphones mit Root oder CyanogenMod

Einleitung

 

Update: neues Tutorial

 

UPDATE: dieser Workaround funktioniert mit aktuellem SafetyNet nicht mehr.


ENGLISH: How to Play Pokemon GO 0.37.0 on rooted Android and CyanogenMod 

Lange Version: Es gibt auch eine ausführliche Version dieses Tutorials, für alle, die sich mit der Materie noch nicht auskennen AUSFÜHRLICHES TUTORIAL 

Nur Unroot: Wenn ihr kein CyanogenMod habt und einfach nur Root entfernen wollt, kommt ihr mit diesem Tutorial am schnellsten ans Ziel: ANDROID UNROOT 

Eines Vorweg: Dieses Tutorial ist NICHT für Cheater. Ihr macht anderen das Spiel kaputt und dieser Workaround ermöglicht keine Cheats bei denen ROOT gebraucht wird.

Warnung: Wie immer, ich übernehme keine Haftung, wenn Ihr Daten verliert oder euer Gerät beschädigt.

Im Laufe des Tutorials werdet ihr euer Android Smartphone unrooten und eine App installieren, die es euch ermöglicht Root bei Bedarf an und aus zu schalten.  Ob ihr SuperSu oder phh's Superuser installiert, bleibt euch überlassen. Bei mit hat die ganze Prozedur jedoch nur mit SuperSu funktioniert

Anleitung

Los geht's.

Unroot

  1. Pokemon Go komplett deinstallieren
  2. (Nur CyanogenMod) Root-Zugriff in den Entwickleroptionen deaktivieren
  3. (Optional) unSU-Skript herunterladen
  4. Magisk herunterladen (erster Post)
  5. SuperSu HIER herunterladen (zweiter Post)
  6. SafetyNet Helper installieren
  7. Chainfires SuperSu installieren
  8. In SuperSu auf Zahnrad-Symbol > Vollständiges Unroot
  9. Entwickleroptionen > Root-Zugriff deaktivieren

Magisk installieren

  1. Entwickleroptionen > erweiterte Neustartmenü aktivieren
  2. Neustart in Recovery-Modus
  3. (Optional) erneut Kernel, das Custom ROM und GApps flashen
  4. Wipe Cache und Wipe Dalvik
  5. Flash Update-unSU.zip
  6. Flash Magisk-vX.zip
  7. Flash SuperSu-magisk.zip
  8. Reboot
  9. Pokemon GO 0.37.0 herunterladen
  10. Einstellungen > Entwickleroptionen > Root-Zugriff > Nur Apps
  11. Magisk Manager App installieren
  12. Magisk Manager öffnen und dauerhaft Root-Zugriff gewähren
  13. Root-Schalter auf Aus stellen
Schritt 15: Root vorübergehend deaktivieren

Pokemon GO 0.37.0 installieren

  1. (Optional) SafetyNet-Helper starten
  2. Pokemon GO 0.37.0 installieren
  3. (Optional) wann immer ihr Root braucht, Pokemon GO beenden und im Magisk Manager Root wieder aktivieren 
Schritt 1: SafetyNet-Test
Schritt 2: Pokemon GO starten


Geschafft :)

Lasst mich eure Erfahrungen wissen. Viel Spaß beim Spielen.