Page on my attempts to speedun the Madoka Magica TPS games. So far, I am currently speedrunning Mami Tomoe TPS.

Mami Tomoe TPS

Records

A personal leaderboard containing my times in the game. Scores from modded versions of the TPS games won't be counted but I'll still add them. Scores I achieved without screenshot or video proof will not be added. I plan to eventually get some of these scores to speedrun.com at some point.

NC=Not Counted

Stage 1

# Time Date Platform
1 38.60 seconds May 7, 2024 Android
2 39.00 seconds April 9, 2024 Android
3 41.03 seconds April 7, 2024 Android
4 42.53 seconds April 6, 2024 Emulator (Nox)
5 46.53 seconds July 10, 2022 Android
NC 54.86 seconds August 29, 2023 Android (Modded; Battler TPS)

Stage 2

# Time Date Platform
1 1:21.16 May 7, 2024 Android

Stage 3

Stage 4

Stage 5

Stage 6

Stage 7

Stage 8

Stage 9

Stage 10

Overall

TBD

Technical Information

Important note: After defeating a boss, there is some extra time spent waiting for the health bar to go down, this is in fact counted as part of the in-game timer. The moment you load into the game before the fade-in to the actual level is also counted by the timer.


Variable values
  • DIFFICULTY_EASY=0
  • DIFFICULTY_NORMAL = 1
  • DIFFICULTY_HARD = 2
  • DIFFICULTY_MAX = 3
  • RANK_S = 0
  • RANK_A = 1
  • RANK_B = 2
  • RANK_C = 3
  • saveFileName = "save.sav"
  • saveFileSize = 512
Save and Load Mechanism
        public static boolean saveSaveData() {
        ByteReaderWriter bw = new ByteReaderWriter(saveFileSize);
        bw.writeInt(0);
        bw.writeInt(continueStage);
        bw.writeInt(continueDifficulty);
        bw.writeInt(continueScore);
        bw.writeInt(continueTime);
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 10; j++) {
                bw.writeInt(bestScore[i][j]);
                bw.writeInt(bestTime[i][j]);
                bw.writeInt(bestRank[i][j]);
            }
        }
        boolean ret = CommonHelper.writeStorage(saveFileName, bw.getData());
        bw.close();
        return ret;
    }

    public static boolean loadSaveData() {
        byte[] data = CommonHelper.readStorage(saveFileName);
        if (data == null) {
            return false;
        }
        ByteReader br = new ByteReader(data);
        int readInt = br.readInt();
        continueStage = br.readInt();
        continueDifficulty = br.readInt();
        continueScore = br.readInt();
        continueTime = br.readInt();
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 10; j++) {
                bestScore[i][j] = br.readInt();
                bestTime[i][j] = br.readInt();
                bestRank[i][j] = br.readInt();
            }
        }
        br.close();
        return true;
    }
                

Loading Level Files

The game loads in a .mgm binary file from the /raw/ folder in the .apk. The game takes the current level from a variable which starts at 0 and ends at 9 (stage0 seems to count as a tutorial, so only 9 levels are counted?). From there, it calls the file for that level. It turns the file from a resource into a byte array and reads the data as integers. It constructs level data based on how many textures there are, what textures, what values for the textures, etc. The .java file handling this is GameField.java

Strategies and Notes

Bomb Usage

I save all Tiro Finale bombs for the final boss.

Enemy Weapon Drops

Certain enemies drop certain weapons and other pickups. The things I prioritize most is the Tiro Finale bomb pickup, the next being the Shot weapon, then the Fire weapon. I disregard the rest of the item drops.

Notes

Unlike Homura TPS, Mami Tomoe can only jump when prompted.

Homura Akemi TPS

Stage 1

# Time Date Platform
1 1:21.36 May 8, 2024 Android
2 1:24.86 May 5, 2024 Android
3 1:25.20 May 5, 2024 Android
4 1:29.06 May 5, 2024 Android

Stage 2

# Time Date Platform
1 2:01.66 May 8, 2024 Android
2 2:15.43 May 5, 2024 Android

Stage 3

Stage 4

Stage 5

Stage 6

Stage 7

Stage 8

Stage 9

Stage 10

# Time Date Platform
1 2:34.10 May 7, 2024 Android
2 3:38.76 May 5, 2024 Android

Overall

May 5 total: ~28 minutes

Technical Information

Version 1.1 and Version 1.2 are functionally exactly the same. In my opinion, either of these can be used for speedrunning interchangeably. Version 1.2 does not alter any of the levels, it only adds new voicelines.

Strategies and Notes

Don't use the Pipe Bombs

what the title says. The pipe bombs do less damage than the Spread weapon and also slows you down when killing a boss.

Weapon Management

The only weapons you should ever get are Rapid and Spread. Everything else will just slow you down. If you pickup a third weapon, it overrides whatever you were using at the time, so it's optimal to avoid any rougue pickups dropped by enemies and witches.

Enemy Spawn Order

Not killing enemies will result in only half of the intended amount of enemies to spawn; killing the first few enemies in the first level spawns a few more, and then a few more, not killing the first set skips those two other spawns. Though if you're willing to take a risk, certain enemies can be killed in order to spawn other enemies, if done right, you can get extra ammo for the Rapid and Spread this way.

Notes

  • Homura jumping doesn't make any sort of difference on speed.
  • The witch Patricia can't be damaged by the Ring weapon.
  • The render distance is pityfully small, except for certain points in the side.
  • In all three TPS games, getting an A rank and S rank in a level unlocks a photo in the gallery.