├── .gitattributes ├── .gitignore ├── PPTTools.sln ├── PPTTools ├── .gitignore ├── FinesseHelper.cs ├── GameHelper.cs ├── MainForm.Designer.cs ├── MainForm.cs ├── MainForm.resx ├── Modules │ ├── APC │ │ ├── APC.cs │ │ ├── APCForm.Designer.cs │ │ ├── APCForm.cs │ │ └── APCForm.resx │ ├── APM │ │ ├── APM.cs │ │ ├── APMForm.Designer.cs │ │ ├── APMForm.cs │ │ └── APMForm.resx │ ├── Duration │ │ ├── Duration.cs │ │ ├── DurationForm.Designer.cs │ │ ├── DurationForm.cs │ │ └── DurationForm.resx │ ├── FTX │ │ ├── FTX.cs │ │ ├── FTXForm.Designer.cs │ │ ├── FTXForm.cs │ │ └── FTXForm.resx │ ├── Finesse │ │ ├── Finesse.cs │ │ ├── FinesseForm.Designer.cs │ │ ├── FinesseForm.cs │ │ └── FinesseForm.resx │ ├── Inputs │ │ ├── Inputs.cs │ │ ├── InputsForm.Designer.cs │ │ ├── InputsForm.cs │ │ └── InputsForm.resx │ ├── KPP │ │ ├── KPP.cs │ │ ├── KPPForm.Designer.cs │ │ ├── KPPForm.cs │ │ └── KPPForm.resx │ ├── Module.cs │ ├── PPS │ │ ├── PPS.cs │ │ ├── PPSForm.Designer.cs │ │ ├── PPSForm.cs │ │ └── PPSForm.resx │ └── Rating │ │ ├── Rating.cs │ │ ├── RatingForm.Designer.cs │ │ ├── RatingForm.cs │ │ └── RatingForm.resx ├── PPTTools.csproj ├── PPTTools.csproj.user ├── Program.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── Resources │ ├── icon.ico │ ├── key0_0.png │ ├── key0_1.png │ ├── key1_0.png │ ├── key1_1.png │ ├── key2_0.png │ ├── key2_1.png │ ├── key3_0.png │ ├── key3_1.png │ ├── key4_0.png │ ├── key4_1.png │ ├── key5_0.png │ ├── key5_1.png │ ├── key6_0.png │ └── key6_1.png ├── VAMemory.dll └── app.config └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vs -------------------------------------------------------------------------------- /PPTTools.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.28010.2019 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PPTTools", "PPTTools\PPTTools.csproj", "{23A2F118-FF17-423A-B57F-6DE28B808AC1}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {23A2F118-FF17-423A-B57F-6DE28B808AC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {23A2F118-FF17-423A-B57F-6DE28B808AC1}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {23A2F118-FF17-423A-B57F-6DE28B808AC1}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {23A2F118-FF17-423A-B57F-6DE28B808AC1}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {38E97F27-2539-48A7-9CC7-CFA3990E28D1} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /PPTTools/.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | obj -------------------------------------------------------------------------------- /PPTTools/FinesseHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | namespace PPTTools { 6 | class FinesseHelper { 7 | private static readonly List[][][] finesse = new List[7][][] { 8 | new List[2][] { // S 9 | new List[8] { // Orientation A 10 | new List(new int[] {0}), 11 | new List(new int[] {0, 0}), 12 | new List(new int[] {0}), 13 | new List(), 14 | new List(new int[] {1}), 15 | new List(new int[] {1, 1}), 16 | new List(new int[] {1, 0}), 17 | new List(new int[] {1}) 18 | }, 19 | new List[9] { // Orientation B 20 | new List(new int[] {4, 0}), 21 | new List(new int[] {0, 5}), 22 | new List(new int[] {4, 0}), 23 | new List(new int[] {4}), 24 | new List(new int[] {5}), 25 | new List(new int[] {5, 1}), 26 | new List(new int[] {5, 1, 1}), 27 | new List(new int[] {1, 4}), 28 | new List(new int[] {5, 1}) 29 | } 30 | }, 31 | new List[2][] { // Z 32 | new List[8] { // Orientation A 33 | new List(new int[] {0}), 34 | new List(new int[] {0, 0}), 35 | new List(new int[] {0}), 36 | new List(), 37 | new List(new int[] {1}), 38 | new List(new int[] {1, 1}), 39 | new List(new int[] {1, 0}), 40 | new List(new int[] {1}) 41 | }, 42 | new List[9] { // Orientation B 43 | new List(new int[] {4, 0}), 44 | new List(new int[] {0, 5}), 45 | new List(new int[] {4, 0}), 46 | new List(new int[] {4}), 47 | new List(new int[] {5}), 48 | new List(new int[] {5, 1}), 49 | new List(new int[] {5, 1, 1}), 50 | new List(new int[] {1, 4}), 51 | new List(new int[] {5, 1}) 52 | } 53 | }, 54 | new List[4][] { // J 55 | new List[8] { // Orientation A 56 | new List(new int[] {0}), 57 | new List(new int[] {0, 0}), 58 | new List(new int[] {0}), 59 | new List(), 60 | new List(new int[] {1}), 61 | new List(new int[] {1, 1}), 62 | new List(new int[] {1, 0}), 63 | new List(new int[] {1}) 64 | }, 65 | new List[9] { // Orientation C 66 | new List(new int[] {5, 0}), 67 | new List(new int[] {0, 5}), 68 | new List(new int[] {5, 0, 0}), 69 | new List(new int[] {5, 0}), 70 | new List(new int[] {5}), 71 | new List(new int[] {5, 1}), 72 | new List(new int[] {5, 1, 1}), 73 | new List(new int[] {5, 1, 0}), 74 | new List(new int[] {5, 1}) 75 | }, 76 | new List[8] { // Orientation D 77 | new List(new int[] {0, 4, 4}), 78 | new List(new int[] {0, 0, 4, 4}), 79 | new List(new int[] {0, 4, 4}), 80 | new List(new int[] {4, 4}), 81 | new List(new int[] {1, 4, 4}), 82 | new List(new int[] {1, 1, 4, 4}), 83 | new List(new int[] {1, 0, 4, 4}), 84 | new List(new int[] {1, 4, 4}) 85 | }, 86 | new List[9] { // Orientation B 87 | new List(new int[] {4, 0}), 88 | new List(new int[] {4, 0, 0}), 89 | new List(new int[] {4, 0}), 90 | new List(new int[] {4}), 91 | new List(new int[] {4, 1}), 92 | new List(new int[] {4, 1, 1}), 93 | new List(new int[] {1, 0, 4}), 94 | new List(new int[] {1, 4}), 95 | new List(new int[] {4, 1}) 96 | } 97 | }, 98 | new List[4][] { // L 99 | new List[8] { // Orientation A 100 | new List(new int[] {0}), 101 | new List(new int[] {0, 0}), 102 | new List(new int[] {0}), 103 | new List(), 104 | new List(new int[] {1}), 105 | new List(new int[] {1, 1}), 106 | new List(new int[] {1, 0}), 107 | new List(new int[] {1}) 108 | }, 109 | new List[9] { // Orientation B 110 | new List(new int[] {5, 0}), 111 | new List(new int[] {0, 5}), 112 | new List(new int[] {5, 0, 0}), 113 | new List(new int[] {5, 0}), 114 | new List(new int[] {5}), 115 | new List(new int[] {5, 1}), 116 | new List(new int[] {5, 1, 1}), 117 | new List(new int[] {5, 1, 0}), 118 | new List(new int[] {5, 1}) 119 | }, 120 | new List[8] { // Orientation D 121 | new List(new int[] {0, 4, 4}), 122 | new List(new int[] {0, 0, 4, 4}), 123 | new List(new int[] {0, 4, 4}), 124 | new List(new int[] {4, 4}), 125 | new List(new int[] {1, 4, 4}), 126 | new List(new int[] {1, 1, 4, 4}), 127 | new List(new int[] {1, 0, 4, 4}), 128 | new List(new int[] {1, 4, 4}) 129 | }, 130 | new List[9] { // Orientation C 131 | new List(new int[] {4, 0}), 132 | new List(new int[] {4, 0, 0}), 133 | new List(new int[] {4, 0}), 134 | new List(new int[] {4}), 135 | new List(new int[] {4, 1}), 136 | new List(new int[] {4, 1, 1}), 137 | new List(new int[] {1, 0, 4}), 138 | new List(new int[] {1, 4}), 139 | new List(new int[] {4, 1}) 140 | } 141 | }, 142 | new List[4][] { // T 143 | new List[8] { // Orientation A 144 | new List(new int[] {0}), 145 | new List(new int[] {0, 0}), 146 | new List(new int[] {0}), 147 | new List(), 148 | new List(new int[] {1}), 149 | new List(new int[] {1, 1}), 150 | new List(new int[] {1, 0}), 151 | new List(new int[] {1}) 152 | }, 153 | new List[9] { // Orientation B 154 | new List(new int[] {5, 0}), 155 | new List(new int[] {0, 5}), 156 | new List(new int[] {5, 0, 0}), 157 | new List(new int[] {5, 0}), 158 | new List(new int[] {5}), 159 | new List(new int[] {5, 1}), 160 | new List(new int[] {5, 1, 1}), 161 | new List(new int[] {5, 1, 0}), 162 | new List(new int[] {5, 1}) 163 | }, 164 | new List[8] { // Orientation D 165 | new List(new int[] {0, 4, 4}), 166 | new List(new int[] {0, 0, 4, 4}), 167 | new List(new int[] {0, 4, 4}), 168 | new List(new int[] {4, 4}), 169 | new List(new int[] {1, 4, 4}), 170 | new List(new int[] {1, 1, 4, 4}), 171 | new List(new int[] {1, 0, 4, 4}), 172 | new List(new int[] {1, 4, 4}) 173 | }, 174 | new List[9] { // Orientation C 175 | new List(new int[] {4, 0}), 176 | new List(new int[] {4, 0, 0}), 177 | new List(new int[] {4, 0}), 178 | new List(new int[] {4}), 179 | new List(new int[] {4, 1}), 180 | new List(new int[] {4, 1, 1}), 181 | new List(new int[] {1, 0, 4}), 182 | new List(new int[] {1, 4}), 183 | new List(new int[] {4, 1}) 184 | } 185 | }, 186 | new List[1][] { // O 187 | new List[9] { // Orientation A 188 | new List(new int[] {0}), 189 | new List(new int[] {0, 1}), 190 | new List(new int[] {0, 0}), 191 | new List(new int[] {0}), 192 | new List(), 193 | new List(new int[] {1}), 194 | new List(new int[] {1, 1}), 195 | new List(new int[] {1, 0}), 196 | new List(new int[] {1}) 197 | } 198 | }, 199 | new List[2][] { // I 200 | new List[7] { // Orientation A 201 | new List(new int[] {0}), 202 | new List(new int[] {0, 0}), 203 | new List(new int[] {0}), 204 | new List(), 205 | new List(new int[] {1}), 206 | new List(new int[] {1, 1}), 207 | new List(new int[] {1}) 208 | }, 209 | new List[10] { // Orientation B 210 | new List(new int[] {4, 0}), 211 | new List(new int[] {0, 4}), 212 | new List(new int[] {0, 5}), 213 | new List(new int[] {0, 4}), 214 | new List(new int[] {4}), 215 | new List(new int[] {5}), 216 | new List(new int[] {1, 5}), 217 | new List(new int[] {1, 4}), 218 | new List(new int[] {1, 5}), 219 | new List(new int[] {5, 1}) 220 | } 221 | } 222 | }; 223 | 224 | public static int Errors(int piece, List keys, int pos, int rot) { 225 | keys = keys.Skip(keys.IndexOf(6) + 1).ToList(); 226 | keys.RemoveAll(x => x == 6); 227 | 228 | int orient = rot; // L, J, T 229 | int placement = pos; 230 | 231 | switch (piece) { 232 | case 0: // S 233 | case 1: // Z 234 | case 6: // I 235 | orient = rot % 2; 236 | break; 237 | 238 | case 5: // O 239 | orient = 0; 240 | break; 241 | } 242 | 243 | switch (piece) { 244 | case 0: // S 245 | case 1: // Z 246 | case 2: // J 247 | case 3: // L 248 | case 4: // T 249 | if (rot != 1) 250 | placement--; 251 | break; 252 | 253 | case 5: // O 254 | if (rot > 2) 255 | placement--; 256 | break; 257 | 258 | case 6: // I 259 | if (rot == 0) 260 | placement--; 261 | if (rot == 2) 262 | placement += -2; 263 | break; 264 | } 265 | 266 | return Math.Max(0, keys.Count - finesse[piece][orient][placement].Count); 267 | } 268 | } 269 | } 270 | -------------------------------------------------------------------------------- /PPTTools/GameHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.Windows.Forms; 4 | 5 | namespace PPTTools { 6 | class GameHelper { 7 | public static VAMemory Game; 8 | 9 | public static class GameState { 10 | public static int playerIndex = 0; 11 | 12 | public static Modules.FTX _FTX; 13 | public static Modules.PPS _PPS; 14 | public static Modules.APM _APM; 15 | public static Modules.APC _APC; 16 | public static Modules.KPP _KPP; 17 | public static Modules.Finesse _Finesse; 18 | public static Modules.Rating _Rating; 19 | public static Modules.Duration _Duration; 20 | public static Modules.Inputs _Inputs; 21 | 22 | private static Timer Scan = new Timer(); 23 | 24 | public static bool EnsureGame() { 25 | if (Game == null) { 26 | if (Process.GetProcessesByName("puyopuyotetris").Length != 0) { 27 | Game = new VAMemory("puyopuyotetris"); 28 | 29 | _FTX = new Modules.FTX(); 30 | _PPS = new Modules.PPS(); 31 | _APM = new Modules.APM(); 32 | _APC = new Modules.APC(); 33 | _KPP = new Modules.KPP(); 34 | _Finesse = new Modules.Finesse(); 35 | _Rating = new Modules.Rating(); 36 | _Duration = new Modules.Duration(); 37 | _Inputs = new Modules.Inputs(); 38 | 39 | } else { 40 | return false; 41 | } 42 | 43 | } else if (Process.GetProcessesByName("puyopuyotetris").Length == 0) { 44 | Game = null; 45 | return false; 46 | } 47 | 48 | return true; 49 | } 50 | 51 | public static void Update(object sender, EventArgs e) { 52 | if (EnsureGame()) { 53 | playerIndex = FindPlayer(); 54 | 55 | if (BigFrames() < 140) { 56 | // Don't Reset FTX, it regulates itself 57 | _PPS.Reset(); 58 | _APM.Reset(); 59 | _APC.Reset(); 60 | _KPP.Reset(); 61 | _Finesse.Reset(); 62 | // Don't Reset Rating, it regulates itself 63 | _Duration.Reset(); 64 | _Inputs.Reset(); 65 | } else { 66 | _FTX.Update(); 67 | _PPS.Update(); 68 | _APM.Update(); 69 | _APC.Update(); 70 | _KPP.Update(); 71 | _Finesse.Update(); 72 | _Rating.Update(); 73 | _Duration.Update(); 74 | _Inputs.Update(); 75 | } 76 | } 77 | } 78 | 79 | public static void Reset() { 80 | if (EnsureGame()) { 81 | _FTX.Reset(); 82 | _PPS.Reset(); 83 | _APM.Reset(); 84 | _APC.Reset(); 85 | _KPP.Reset(); 86 | _Finesse.Reset(); 87 | _Rating.Reset(); 88 | _Duration.Reset(); 89 | _Inputs.Reset(); 90 | } 91 | } 92 | 93 | static GameState() { 94 | EnsureGame(); 95 | 96 | Update(null, EventArgs.Empty); 97 | 98 | Scan.Interval = 1; 99 | Scan.Enabled = true; 100 | Scan.Tick += Update; 101 | } 102 | } 103 | 104 | public static int Score(int index) => Game.ReadByte(new IntPtr( 105 | Game.ReadInt32(new IntPtr( 106 | 0x14057F048 107 | )) + 0x38 + index * 0x04 108 | )); 109 | 110 | public static int PieceDropped(int index) { 111 | switch (index) { 112 | case 0: 113 | return Game.ReadByte(new IntPtr( 114 | Game.ReadInt32(new IntPtr( 115 | Game.ReadInt32(new IntPtr( 116 | Game.ReadInt32(new IntPtr( 117 | Game.ReadInt32(new IntPtr( 118 | Game.ReadInt32(new IntPtr( 119 | 0x140460C08 120 | )) + 0x18 121 | )) + 0x268 122 | )) + 0x38 123 | )) + 0x3C8 124 | )) + 0x1C 125 | )); 126 | 127 | case 1: 128 | return Game.ReadByte(new IntPtr( 129 | Game.ReadInt32(new IntPtr( 130 | Game.ReadInt32(new IntPtr( 131 | Game.ReadInt32(new IntPtr( 132 | Game.ReadInt32(new IntPtr( 133 | Game.ReadInt32(new IntPtr( 134 | 0x1405989D0 135 | )) + 0x78 136 | )) + 0x20 137 | )) + 0xA8 138 | )) + 0x3C8 139 | )) + 0x1C 140 | )); 141 | } 142 | 143 | return -1; 144 | } 145 | 146 | public static int GarbageSent(int index) { 147 | switch (index) { 148 | case 0: 149 | return Game.ReadInt32(new IntPtr( 150 | Game.ReadInt32(new IntPtr( 151 | Game.ReadInt32(new IntPtr( 152 | Game.ReadInt32(new IntPtr( 153 | Game.ReadInt32(new IntPtr( 154 | 0x140461B20 155 | )) + 0x378 156 | )) + 0x28 157 | )) + 0xD0 158 | )) + 0x3C 159 | )); 160 | 161 | case 1: 162 | return Game.ReadInt32(new IntPtr( 163 | Game.ReadInt32(new IntPtr( 164 | Game.ReadInt32(new IntPtr( 165 | Game.ReadInt32(new IntPtr( 166 | Game.ReadInt32(new IntPtr( 167 | Game.ReadInt32(new IntPtr( 168 | 0x140461B20 169 | )) + 0x378 170 | )) + 0x28 171 | )) + 0x18 172 | )) + 0xD0 173 | )) + 0x64 174 | )); 175 | } 176 | 177 | return -1; 178 | } 179 | 180 | public static int Keystroke(int index) => Game.ReadByte(new IntPtr( 181 | Game.ReadInt32(new IntPtr( 182 | Game.ReadInt32(new IntPtr( 183 | Game.ReadInt32(new IntPtr( 184 | 0x140461B20 185 | )) + 0x378 186 | )) + 0xB0 187 | )) + 0x3A + index * 0x02 188 | )); 189 | 190 | public static int CurrentPiece(int index) { 191 | switch (index) { 192 | case 0: 193 | return Game.ReadByte(new IntPtr( 194 | Game.ReadInt32(new IntPtr( 195 | Game.ReadInt32(new IntPtr( 196 | Game.ReadInt32(new IntPtr( 197 | Game.ReadInt32(new IntPtr( 198 | 0x140461B20 199 | )) + 0x378 200 | )) + 0xC0 201 | )) + 0x120 202 | )) + 0x110 203 | )); 204 | 205 | case 1: 206 | return Game.ReadByte(new IntPtr( 207 | Game.ReadInt32(new IntPtr( 208 | Game.ReadInt32(new IntPtr( 209 | Game.ReadInt32(new IntPtr( 210 | Game.ReadInt32(new IntPtr( 211 | 0x140461B20 212 | )) + 0x378 213 | )) + 0x20 214 | )) + 0x40 215 | )) + 0x400 216 | )); 217 | } 218 | 219 | return -1; 220 | } 221 | 222 | public static int NextPiece(int index) { 223 | switch (index) { 224 | case 0: 225 | return Game.ReadByte(new IntPtr( 226 | Game.ReadInt32(new IntPtr( 227 | Game.ReadInt32(new IntPtr( 228 | Game.ReadInt32(new IntPtr( 229 | 0x140461B20 230 | )) + 0x378 231 | )) + 0xB8 232 | )) + 0x15C 233 | )); 234 | 235 | case 1: 236 | return Game.ReadByte(new IntPtr( 237 | Game.ReadInt32(new IntPtr( 238 | Game.ReadInt32(new IntPtr( 239 | Game.ReadInt32(new IntPtr( 240 | Game.ReadInt32(new IntPtr( 241 | 0x1405989D0 242 | )) + 0x78 243 | )) + 0x28 244 | )) + 0xB8 245 | )) + 0x15C 246 | )); 247 | } 248 | 249 | return -1; 250 | } 251 | 252 | public static int FarPiece(int index) { 253 | switch (index) { 254 | case 0: 255 | return Game.ReadByte(new IntPtr( 256 | Game.ReadInt32(new IntPtr( 257 | Game.ReadInt32(new IntPtr( 258 | Game.ReadInt32(new IntPtr( 259 | 0x140461B20 260 | )) + 0x378 261 | )) + 0xB8 262 | )) + 0x160 263 | )); 264 | 265 | case 1: 266 | return Game.ReadByte(new IntPtr( 267 | Game.ReadInt32(new IntPtr( 268 | Game.ReadInt32(new IntPtr( 269 | Game.ReadInt32(new IntPtr( 270 | Game.ReadInt32(new IntPtr( 271 | 0x1405989D0 272 | )) + 0x78 273 | )) + 0x28 274 | )) + 0xB8 275 | )) + 0x160 276 | )); 277 | } 278 | 279 | return -1; 280 | } 281 | 282 | public static int NextPointer(int index) { 283 | switch (index) { 284 | case 0: 285 | return Game.ReadInt32(new IntPtr( 286 | Game.ReadInt32(new IntPtr( 287 | Game.ReadInt32(new IntPtr( 288 | 0x140461B20 289 | )) + 0x378 290 | )) + 0xB8 291 | )) + 0x15C; 292 | 293 | case 1: 294 | return Game.ReadInt32(new IntPtr( 295 | Game.ReadInt32(new IntPtr( 296 | Game.ReadInt32(new IntPtr( 297 | Game.ReadInt32(new IntPtr( 298 | 0x1405989D0 299 | )) + 0x78 300 | )) + 0x28 301 | )) + 0xB8 302 | )) + 0x15C; 303 | } 304 | 305 | return -1; 306 | } 307 | 308 | public static int PiecePosition(int index) { 309 | switch (index) { 310 | case 0: 311 | return Game.ReadByte(new IntPtr( 312 | Game.ReadInt32(new IntPtr( 313 | Game.ReadInt32(new IntPtr( 314 | Game.ReadInt32(new IntPtr( 315 | 0x140461B20 316 | )) + 0x378 317 | )) + 0x40 318 | )) + 0x100 319 | )); 320 | 321 | case 1: 322 | return Game.ReadByte(new IntPtr( 323 | Game.ReadInt32(new IntPtr( 324 | Game.ReadInt32(new IntPtr( 325 | Game.ReadInt32(new IntPtr( 326 | Game.ReadInt32(new IntPtr( 327 | 0x140461B20 328 | )) + 0x380 329 | )) + 0xC0 330 | )) + 0x120 331 | )) + 0x1E 332 | )); 333 | } 334 | 335 | return -1; 336 | } 337 | 338 | public static int PieceRotation(int index) { 339 | switch (index) { 340 | case 0: 341 | return Game.ReadByte(new IntPtr( 342 | Game.ReadInt32(new IntPtr( 343 | Game.ReadInt32(new IntPtr( 344 | Game.ReadInt32(new IntPtr( 345 | Game.ReadInt32(new IntPtr( 346 | Game.ReadInt32(new IntPtr( 347 | 0x140460C08 348 | )) + 0x18 349 | )) + 0x268 350 | )) + 0x38 351 | )) + 0x3C8 352 | )) + 0x18 353 | )); 354 | 355 | case 1: 356 | return Game.ReadByte(new IntPtr( 357 | Game.ReadInt32(new IntPtr( 358 | Game.ReadInt32(new IntPtr( 359 | Game.ReadInt32(new IntPtr( 360 | Game.ReadInt32(new IntPtr( 361 | Game.ReadInt32(new IntPtr( 362 | 0x1405989D0 363 | )) + 0x78 364 | )) + 0x20 365 | )) + 0xA8 366 | )) + 0x3C8 367 | )) + 0x18 368 | )); 369 | } 370 | 371 | return -1; 372 | } 373 | 374 | public static int LinesCleared(int index) { 375 | switch (index) { 376 | case 0: 377 | return Game.ReadByte(new IntPtr( 378 | Game.ReadInt32(new IntPtr( 379 | Game.ReadInt32(new IntPtr( 380 | Game.ReadInt32(new IntPtr( 381 | 0x140461B20 382 | )) + 0x378 383 | )) + 0xA8 384 | )) + 0x2F8 385 | )); 386 | 387 | case 1: 388 | return Game.ReadByte(new IntPtr( 389 | Game.ReadInt32(new IntPtr( 390 | Game.ReadInt32(new IntPtr( 391 | Game.ReadInt32(new IntPtr( 392 | Game.ReadInt32(new IntPtr( 393 | Game.ReadInt32(new IntPtr( 394 | 0x140461B20 395 | )) + 0x378 396 | )) + 0xA8 397 | )) + 0x270 398 | )) + 0x20 399 | )) + 0x2F8 400 | )); 401 | } 402 | 403 | return -1; 404 | } 405 | 406 | public static int HoldPointer(int index) { 407 | switch (index) { 408 | case 0: 409 | return Game.ReadInt32(new IntPtr( 410 | Game.ReadInt32(new IntPtr( 411 | Game.ReadInt32(new IntPtr( 412 | 0x140598A20 413 | )) + 0x38 414 | )) + 0x3D0 415 | )) + 0x8; 416 | 417 | case 1: 418 | return Game.ReadInt32(new IntPtr( 419 | Game.ReadInt32(new IntPtr( 420 | Game.ReadInt32(new IntPtr( 421 | Game.ReadInt32(new IntPtr( 422 | 0x1405989D0 423 | )) + 0x270 424 | )) + 0x20 425 | )) + 0x3D0 426 | )) + 0x8; 427 | } 428 | 429 | return -1; 430 | } 431 | 432 | public static int HoldPiece(int index) => Game.ReadInt32(new IntPtr( 433 | HoldPointer(index) 434 | )); 435 | 436 | public static int BigFrames() => Game.ReadInt32(new IntPtr( 437 | Game.ReadInt32(new IntPtr( 438 | Game.ReadInt32(new IntPtr( 439 | Game.ReadInt32(new IntPtr( 440 | Game.ReadInt32(new IntPtr( 441 | 0x140460C08 442 | )) + 0x18 443 | )) + 0x268 444 | )) + 0x140 445 | )) + 0x58 446 | )); 447 | 448 | public static int SmallFrames() => Game.ReadInt32(new IntPtr( 449 | Game.ReadInt32(new IntPtr( 450 | 0x1405989F0 451 | )) + 0x594 452 | )); 453 | 454 | public static int Rating() => Game.ReadInt16(new IntPtr( 455 | 0x140599FF0 456 | )); 457 | 458 | public static int PlayerCount() => Game.ReadInt32(new IntPtr( 459 | Game.ReadInt32(new IntPtr( 460 | Game.ReadInt32(new IntPtr( 461 | 0x140473760 462 | )) + 0x20 463 | )) + 0xB4 464 | )); 465 | 466 | public static int LocalSteam() => Game.ReadInt32(new IntPtr( 467 | 0x1405A2010 468 | )); 469 | 470 | public static int PlayerSteam(int index) => Game.ReadInt32(new IntPtr( 471 | Game.ReadInt32(new IntPtr( 472 | Game.ReadInt32(new IntPtr( 473 | 0x140473760 474 | )) + 0x20 475 | )) + 0x118 + index * 0x50 476 | )); 477 | 478 | public static int FindPlayer() { 479 | if (PlayerCount() < 2) 480 | return 0; 481 | 482 | int localSteam = LocalSteam(); 483 | 484 | for (int i = 0; i < 2; i++) 485 | if (localSteam == PlayerSteam(i)) 486 | return i; 487 | 488 | return 0; 489 | } 490 | 491 | private enum MatchState { 492 | Menu, 493 | Match, 494 | Finished 495 | } 496 | private static MatchState matchState = MatchState.Menu; 497 | 498 | public static bool EnsureMatch() { 499 | if (Game.ReadInt32(new IntPtr(0x140573A78)) != 0x0) { 500 | if (matchState == MatchState.Match) { 501 | matchState = MatchState.Finished; 502 | } 503 | } 504 | 505 | int scoreAddress = Game.ReadInt32(new IntPtr(0x14057F048)); 506 | 507 | if (scoreAddress == 0x0) { 508 | if (matchState == MatchState.Finished) 509 | matchState = MatchState.Menu; 510 | 511 | } else if (matchState == MatchState.Menu) 512 | matchState = MatchState.Match; 513 | 514 | return matchState == MatchState.Match; 515 | } 516 | } 517 | } 518 | -------------------------------------------------------------------------------- /PPTTools/MainForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class MainForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); 27 | this.buttonFTX = new System.Windows.Forms.Button(); 28 | this.buttonPPS = new System.Windows.Forms.Button(); 29 | this.buttonKPP = new System.Windows.Forms.Button(); 30 | this.buttonAPM = new System.Windows.Forms.Button(); 31 | this.buttonAPC = new System.Windows.Forms.Button(); 32 | this.buttonFinesse = new System.Windows.Forms.Button(); 33 | this.buttonDuration = new System.Windows.Forms.Button(); 34 | this.buttonRating = new System.Windows.Forms.Button(); 35 | this.buttonInputs = new System.Windows.Forms.Button(); 36 | this.SuspendLayout(); 37 | // 38 | // buttonFTX 39 | // 40 | this.buttonFTX.Location = new System.Drawing.Point(6, 6); 41 | this.buttonFTX.Name = "buttonFTX"; 42 | this.buttonFTX.Size = new System.Drawing.Size(71, 32); 43 | this.buttonFTX.TabIndex = 0; 44 | this.buttonFTX.Text = "FTX"; 45 | this.buttonFTX.UseVisualStyleBackColor = true; 46 | this.buttonFTX.Click += new System.EventHandler(this.buttonFTX_Click); 47 | this.buttonFTX.MouseUp += new System.Windows.Forms.MouseEventHandler(this.buttonFTX_RightClick); 48 | // 49 | // buttonPPS 50 | // 51 | this.buttonPPS.Location = new System.Drawing.Point(83, 6); 52 | this.buttonPPS.Name = "buttonPPS"; 53 | this.buttonPPS.Size = new System.Drawing.Size(71, 32); 54 | this.buttonPPS.TabIndex = 0; 55 | this.buttonPPS.Text = "PPS"; 56 | this.buttonPPS.UseVisualStyleBackColor = true; 57 | this.buttonPPS.Click += new System.EventHandler(this.buttonPPS_Click); 58 | this.buttonPPS.MouseUp += new System.Windows.Forms.MouseEventHandler(this.buttonPPS_RightClick); 59 | // 60 | // buttonKPP 61 | // 62 | this.buttonKPP.Location = new System.Drawing.Point(160, 6); 63 | this.buttonKPP.Name = "buttonKPP"; 64 | this.buttonKPP.Size = new System.Drawing.Size(71, 32); 65 | this.buttonKPP.TabIndex = 0; 66 | this.buttonKPP.Text = "KPP"; 67 | this.buttonKPP.UseVisualStyleBackColor = true; 68 | this.buttonKPP.Click += new System.EventHandler(this.buttonKPP_Click); 69 | this.buttonKPP.MouseUp += new System.Windows.Forms.MouseEventHandler(this.buttonKPP_RightClick); 70 | // 71 | // buttonAPM 72 | // 73 | this.buttonAPM.Location = new System.Drawing.Point(6, 44); 74 | this.buttonAPM.Name = "buttonAPM"; 75 | this.buttonAPM.Size = new System.Drawing.Size(71, 32); 76 | this.buttonAPM.TabIndex = 0; 77 | this.buttonAPM.Text = "APM"; 78 | this.buttonAPM.UseVisualStyleBackColor = true; 79 | this.buttonAPM.Click += new System.EventHandler(this.buttonAPM_Click); 80 | this.buttonAPM.MouseUp += new System.Windows.Forms.MouseEventHandler(this.buttonAPM_RightClick); 81 | // 82 | // buttonAPC 83 | // 84 | this.buttonAPC.Location = new System.Drawing.Point(83, 44); 85 | this.buttonAPC.Name = "buttonAPC"; 86 | this.buttonAPC.Size = new System.Drawing.Size(71, 32); 87 | this.buttonAPC.TabIndex = 0; 88 | this.buttonAPC.Text = "APC"; 89 | this.buttonAPC.UseVisualStyleBackColor = true; 90 | this.buttonAPC.Click += new System.EventHandler(this.buttonAPC_Click); 91 | this.buttonAPC.MouseUp += new System.Windows.Forms.MouseEventHandler(this.buttonAPC_RightClick); 92 | // 93 | // buttonFinesse 94 | // 95 | this.buttonFinesse.Location = new System.Drawing.Point(160, 44); 96 | this.buttonFinesse.Name = "buttonFinesse"; 97 | this.buttonFinesse.Size = new System.Drawing.Size(71, 32); 98 | this.buttonFinesse.TabIndex = 0; 99 | this.buttonFinesse.Text = "Finesse"; 100 | this.buttonFinesse.UseVisualStyleBackColor = true; 101 | this.buttonFinesse.Click += new System.EventHandler(this.buttonFinesse_Click); 102 | this.buttonFinesse.MouseUp += new System.Windows.Forms.MouseEventHandler(this.buttonFinesse_RightClick); 103 | // 104 | // buttonDuration 105 | // 106 | this.buttonDuration.Location = new System.Drawing.Point(6, 81); 107 | this.buttonDuration.Name = "buttonDuration"; 108 | this.buttonDuration.Size = new System.Drawing.Size(71, 32); 109 | this.buttonDuration.TabIndex = 0; 110 | this.buttonDuration.Text = "Duration"; 111 | this.buttonDuration.UseVisualStyleBackColor = true; 112 | this.buttonDuration.Click += new System.EventHandler(this.buttonDuration_Click); 113 | this.buttonDuration.MouseUp += new System.Windows.Forms.MouseEventHandler(this.buttonDuration_RightClick); 114 | // 115 | // buttonRating 116 | // 117 | this.buttonRating.Location = new System.Drawing.Point(83, 81); 118 | this.buttonRating.Name = "buttonRating"; 119 | this.buttonRating.Size = new System.Drawing.Size(71, 32); 120 | this.buttonRating.TabIndex = 0; 121 | this.buttonRating.Text = "Rating"; 122 | this.buttonRating.UseVisualStyleBackColor = true; 123 | this.buttonRating.Click += new System.EventHandler(this.buttonRating_Click); 124 | this.buttonRating.MouseUp += new System.Windows.Forms.MouseEventHandler(this.buttonRating_RightClick); 125 | // 126 | // buttonInputs 127 | // 128 | this.buttonInputs.Location = new System.Drawing.Point(160, 81); 129 | this.buttonInputs.Name = "buttonInputs"; 130 | this.buttonInputs.Size = new System.Drawing.Size(71, 32); 131 | this.buttonInputs.TabIndex = 0; 132 | this.buttonInputs.Text = "Inputs"; 133 | this.buttonInputs.UseVisualStyleBackColor = true; 134 | this.buttonInputs.Click += new System.EventHandler(this.buttonInputs_Click); 135 | // 136 | // MainForm 137 | // 138 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 139 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 140 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 141 | this.ClientSize = new System.Drawing.Size(237, 119); 142 | this.Controls.Add(this.buttonFinesse); 143 | this.Controls.Add(this.buttonKPP); 144 | this.Controls.Add(this.buttonInputs); 145 | this.Controls.Add(this.buttonRating); 146 | this.Controls.Add(this.buttonAPC); 147 | this.Controls.Add(this.buttonPPS); 148 | this.Controls.Add(this.buttonDuration); 149 | this.Controls.Add(this.buttonAPM); 150 | this.Controls.Add(this.buttonFTX); 151 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 152 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 153 | this.MaximizeBox = false; 154 | this.Name = "MainForm"; 155 | this.Text = "PPT Tools"; 156 | this.TopMost = true; 157 | this.Load += new System.EventHandler(this.MainForm_Load); 158 | this.ResumeLayout(false); 159 | 160 | } 161 | 162 | #endregion 163 | 164 | private System.Windows.Forms.Button buttonFTX; 165 | private System.Windows.Forms.Button buttonPPS; 166 | private System.Windows.Forms.Button buttonKPP; 167 | private System.Windows.Forms.Button buttonAPM; 168 | private System.Windows.Forms.Button buttonAPC; 169 | private System.Windows.Forms.Button buttonFinesse; 170 | private System.Windows.Forms.Button buttonDuration; 171 | private System.Windows.Forms.Button buttonRating; 172 | private System.Windows.Forms.Button buttonInputs; 173 | } 174 | } 175 | 176 | -------------------------------------------------------------------------------- /PPTTools/MainForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Windows.Forms; 4 | 5 | namespace PPTTools { 6 | public partial class MainForm: Form { 7 | public MainForm() { 8 | InitializeComponent(); 9 | } 10 | 11 | private void MainForm_Load(object sender, EventArgs e) { 12 | GameHelper.GameState.Reset(); 13 | } 14 | 15 | private void fileSelect(Modules.Module module) { 16 | SaveFileDialog sfd = new SaveFileDialog { 17 | Filter = "Text Files|*.txt", 18 | FileName = module.filename 19 | }; 20 | 21 | if (sfd.ShowDialog() == DialogResult.OK) { 22 | if (!sfd.CheckFileExists) { 23 | FileStream fs = File.Create(sfd.FileName); 24 | fs.Close(); 25 | } 26 | module.filename = sfd.FileName; 27 | } 28 | 29 | sfd.Dispose(); 30 | } 31 | 32 | private void buttonFTX_Click(object sender, EventArgs e) { 33 | new FTXForm().Show(); 34 | } 35 | 36 | private void buttonFTX_RightClick(object sender, MouseEventArgs e) { 37 | if (e.Button == MouseButtons.Right && ((Button)sender).ClientRectangle.Contains(e.Location)) { 38 | fileSelect(GameHelper.GameState._FTX); 39 | } 40 | } 41 | 42 | private void buttonPPS_Click(object sender, EventArgs e) { 43 | new PPSForm().Show(); 44 | } 45 | 46 | private void buttonPPS_RightClick(object sender, MouseEventArgs e) { 47 | if (e.Button == MouseButtons.Right && ((Button)sender).ClientRectangle.Contains(e.Location)) { 48 | fileSelect(GameHelper.GameState._PPS); 49 | } 50 | } 51 | 52 | private void buttonKPP_Click(object sender, EventArgs e) { 53 | new KPPForm().Show(); 54 | } 55 | 56 | private void buttonKPP_RightClick(object sender, MouseEventArgs e) { 57 | if (e.Button == MouseButtons.Right && ((Button)sender).ClientRectangle.Contains(e.Location)) { 58 | fileSelect(GameHelper.GameState._KPP); 59 | } 60 | } 61 | 62 | private void buttonAPM_Click(object sender, EventArgs e) { 63 | new APMForm().Show(); 64 | } 65 | 66 | private void buttonAPM_RightClick(object sender, MouseEventArgs e) { 67 | if (e.Button == MouseButtons.Right && ((Button)sender).ClientRectangle.Contains(e.Location)) { 68 | fileSelect(GameHelper.GameState._APM); 69 | } 70 | } 71 | 72 | private void buttonAPC_Click(object sender, EventArgs e) { 73 | new APCForm().Show(); 74 | } 75 | 76 | private void buttonAPC_RightClick(object sender, MouseEventArgs e) { 77 | if (e.Button == MouseButtons.Right && ((Button)sender).ClientRectangle.Contains(e.Location)) { 78 | fileSelect(GameHelper.GameState._APC); 79 | } 80 | } 81 | 82 | private void buttonFinesse_Click(object sender, EventArgs e) { 83 | new FinesseForm().Show(); 84 | } 85 | 86 | private void buttonFinesse_RightClick(object sender, MouseEventArgs e) { 87 | if (e.Button == MouseButtons.Right && ((Button)sender).ClientRectangle.Contains(e.Location)) { 88 | fileSelect(GameHelper.GameState._Finesse); 89 | } 90 | } 91 | 92 | private void buttonDuration_Click(object sender, EventArgs e) { 93 | new DurationForm().Show(); 94 | } 95 | 96 | private void buttonDuration_RightClick(object sender, MouseEventArgs e) { 97 | if (e.Button == MouseButtons.Right && ((Button)sender).ClientRectangle.Contains(e.Location)) { 98 | fileSelect(GameHelper.GameState._Duration); 99 | } 100 | } 101 | 102 | private void buttonRating_Click(object sender, EventArgs e) { 103 | new RatingForm().Show(); 104 | } 105 | 106 | private void buttonRating_RightClick(object sender, MouseEventArgs e) { 107 | if (e.Button == MouseButtons.Right && ((Button)sender).ClientRectangle.Contains(e.Location)) { 108 | fileSelect(GameHelper.GameState._Rating); 109 | } 110 | } 111 | 112 | private void buttonInputs_Click(object sender, EventArgs e) { 113 | new InputsForm().Show(); 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /PPTTools/MainForm.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | 123 | 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 649 | RK5CYII= 650 | 651 | 652 | -------------------------------------------------------------------------------- /PPTTools/Modules/APC/APC.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | 4 | namespace PPTTools { 5 | namespace Modules { 6 | public class APC: Module { 7 | private static readonly string ModuleIdentifier = "apc"; 8 | 9 | private int currentSent, totalSent, currentCleared, totalCleared; 10 | 11 | public delegate void APCEventHandler(Decimal APC); 12 | public event APCEventHandler Changed; 13 | 14 | private void Raise() { 15 | if (Changed != null) { 16 | if (totalCleared == 0) { 17 | Changed.Invoke(0); 18 | } else { 19 | Changed.Invoke(Decimal.Divide(totalSent, totalCleared)); 20 | } 21 | } 22 | } 23 | 24 | public void Reset() { 25 | totalSent = totalCleared = 0; 26 | 27 | Raise(); 28 | } 29 | 30 | public void Update() { 31 | int garbage = GameHelper.GarbageSent(GameHelper.GameState.playerIndex); 32 | 33 | if (garbage != currentSent) { 34 | if (garbage > currentSent) { 35 | totalSent += garbage - currentSent; 36 | } 37 | 38 | currentSent = garbage; 39 | } 40 | 41 | int lines = GameHelper.LinesCleared(GameHelper.GameState.playerIndex); 42 | 43 | if (lines != currentCleared) { 44 | if (lines > currentCleared) 45 | totalCleared += lines; 46 | 47 | currentCleared = lines; 48 | } 49 | 50 | Raise(); 51 | } 52 | 53 | public APC(): base(ModuleIdentifier) { 54 | Reset(); 55 | Changed += Write; 56 | } 57 | 58 | private void Write(Decimal apc) { 59 | if (File.Exists(filename)) { 60 | StreamWriter sw = new StreamWriter(filename); 61 | sw.WriteLine(apc.ToString("0.000 APC")); 62 | sw.Flush(); 63 | sw.Close(); 64 | } 65 | } 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /PPTTools/Modules/APC/APCForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class APCForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(APCForm)); 27 | this.labelAPC = new System.Windows.Forms.Label(); 28 | this.SuspendLayout(); 29 | // 30 | // labelAPC 31 | // 32 | this.labelAPC.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 33 | this.labelAPC.ForeColor = System.Drawing.Color.Gainsboro; 34 | this.labelAPC.Location = new System.Drawing.Point(49, 11); 35 | this.labelAPC.Name = "labelAPC"; 36 | this.labelAPC.Size = new System.Drawing.Size(165, 26); 37 | this.labelAPC.TabIndex = 2; 38 | this.labelAPC.Text = "0.000 APC"; 39 | this.labelAPC.TextAlign = System.Drawing.ContentAlignment.TopRight; 40 | // 41 | // APCForm 42 | // 43 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 44 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 45 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 46 | this.ClientSize = new System.Drawing.Size(218, 47); 47 | this.Controls.Add(this.labelAPC); 48 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 49 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 50 | this.MaximizeBox = false; 51 | this.Name = "APCForm"; 52 | this.Text = "PPT APC"; 53 | this.TopMost = true; 54 | this.Load += new System.EventHandler(this.APCForm_Load); 55 | this.ResumeLayout(false); 56 | 57 | } 58 | 59 | #endregion 60 | 61 | private System.Windows.Forms.Label labelAPC; 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /PPTTools/Modules/APC/APCForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace PPTTools { 5 | public partial class APCForm : Form { 6 | public APCForm() { 7 | InitializeComponent(); 8 | } 9 | 10 | private void OnChanged(Decimal apc) { 11 | labelAPC.Text = apc.ToString("0.000 APC"); 12 | } 13 | 14 | private void APCForm_Load(object sender, EventArgs e) { 15 | GameHelper.GameState._APC.Changed += OnChanged; 16 | GameHelper.GameState._APC.Update(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /PPTTools/Modules/APM/APM.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | 4 | namespace PPTTools { 5 | namespace Modules { 6 | public class APM: Module { 7 | private static readonly string ModuleIdentifier = "apm"; 8 | 9 | private int current, total, frames; 10 | 11 | public delegate void APMEventHandler(Decimal APM); 12 | public event APMEventHandler Changed; 13 | 14 | private void Raise() { 15 | if (Changed != null) { 16 | if (frames == 0) { 17 | Changed.Invoke(0); 18 | } else { 19 | Changed.Invoke(Decimal.Divide(total, frames) * 3600); 20 | } 21 | } 22 | } 23 | 24 | public void Reset() { 25 | total = 0; 26 | 27 | Raise(); 28 | } 29 | 30 | public void Update() { 31 | frames = GameHelper.SmallFrames(); 32 | int garbage = GameHelper.GarbageSent(GameHelper.GameState.playerIndex); 33 | 34 | if (garbage != current) { 35 | if (garbage > current) { 36 | total += garbage - current; 37 | } 38 | 39 | current = garbage; 40 | } 41 | 42 | Raise(); 43 | } 44 | 45 | public APM(): base(ModuleIdentifier) { 46 | Reset(); 47 | Changed += Write; 48 | } 49 | 50 | private void Write(Decimal apm) { 51 | if (File.Exists(filename)) { 52 | StreamWriter sw = new StreamWriter(filename); 53 | sw.WriteLine(apm.ToString("0.000 APM")); 54 | sw.Flush(); 55 | sw.Close(); 56 | } 57 | } 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /PPTTools/Modules/APM/APMForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class APMForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(APMForm)); 27 | this.labelAPM = new System.Windows.Forms.Label(); 28 | this.SuspendLayout(); 29 | // 30 | // labelAPM 31 | // 32 | this.labelAPM.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 33 | this.labelAPM.ForeColor = System.Drawing.Color.Gainsboro; 34 | this.labelAPM.Location = new System.Drawing.Point(49, 11); 35 | this.labelAPM.Name = "labelAPM"; 36 | this.labelAPM.Size = new System.Drawing.Size(165, 26); 37 | this.labelAPM.TabIndex = 2; 38 | this.labelAPM.Text = "0.000 APM"; 39 | this.labelAPM.TextAlign = System.Drawing.ContentAlignment.TopRight; 40 | // 41 | // APMForm 42 | // 43 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 44 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 45 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 46 | this.ClientSize = new System.Drawing.Size(218, 47); 47 | this.Controls.Add(this.labelAPM); 48 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 49 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 50 | this.MaximizeBox = false; 51 | this.Name = "APMForm"; 52 | this.Text = "PPT APM"; 53 | this.TopMost = true; 54 | this.Load += new System.EventHandler(this.APMForm_Load); 55 | this.ResumeLayout(false); 56 | 57 | } 58 | 59 | #endregion 60 | 61 | private System.Windows.Forms.Label labelAPM; 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /PPTTools/Modules/APM/APMForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace PPTTools { 5 | public partial class APMForm : Form { 6 | public APMForm() { 7 | InitializeComponent(); 8 | } 9 | 10 | private void OnChanged(Decimal apm) { 11 | labelAPM.Text = apm.ToString("0.000 APM"); 12 | } 13 | 14 | private void APMForm_Load(object sender, EventArgs e) { 15 | GameHelper.GameState._APM.Changed += OnChanged; 16 | GameHelper.GameState._APM.Update(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /PPTTools/Modules/Duration/Duration.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | 4 | namespace PPTTools { 5 | namespace Modules { 6 | public class Duration: Module { 7 | private static readonly string ModuleIdentifier = "duration"; 8 | 9 | int frames; 10 | 11 | public delegate void DurationEventHandler(string Time); 12 | public event DurationEventHandler Changed; 13 | 14 | private void Raise() { 15 | if (Changed != null) { 16 | Changed.Invoke(new TimeSpan((long)(frames * 166666.6666666667)).ToString("mm':'ss'.'fff")); 17 | } 18 | } 19 | 20 | public void Reset() { 21 | frames = 0; 22 | Raise(); 23 | } 24 | 25 | public void Update() { 26 | frames = GameHelper.SmallFrames(); 27 | Raise(); 28 | } 29 | 30 | public Duration(): base(ModuleIdentifier) { 31 | Reset(); 32 | Changed += Write; 33 | } 34 | 35 | private void Write(string time) { 36 | if (File.Exists(filename)) { 37 | StreamWriter sw = new StreamWriter(filename); 38 | sw.WriteLine(time); 39 | sw.Flush(); 40 | sw.Close(); 41 | } 42 | } 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /PPTTools/Modules/Duration/DurationForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class DurationForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DurationForm)); 27 | this.labelDuration = new System.Windows.Forms.Label(); 28 | this.SuspendLayout(); 29 | // 30 | // labelDuration 31 | // 32 | this.labelDuration.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 33 | this.labelDuration.ForeColor = System.Drawing.Color.Gainsboro; 34 | this.labelDuration.Location = new System.Drawing.Point(10, 11); 35 | this.labelDuration.Name = "labelDuration"; 36 | this.labelDuration.Size = new System.Drawing.Size(198, 26); 37 | this.labelDuration.TabIndex = 2; 38 | this.labelDuration.Text = "00:00.000"; 39 | this.labelDuration.TextAlign = System.Drawing.ContentAlignment.TopCenter; 40 | // 41 | // DurationForm 42 | // 43 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 44 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 45 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 46 | this.ClientSize = new System.Drawing.Size(218, 47); 47 | this.Controls.Add(this.labelDuration); 48 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 49 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 50 | this.MaximizeBox = false; 51 | this.Name = "DurationForm"; 52 | this.Text = "PPT Duration"; 53 | this.TopMost = true; 54 | this.Load += new System.EventHandler(this.DurationForm_Load); 55 | this.ResumeLayout(false); 56 | 57 | } 58 | 59 | #endregion 60 | 61 | private System.Windows.Forms.Label labelDuration; 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /PPTTools/Modules/Duration/DurationForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace PPTTools { 5 | public partial class DurationForm : Form { 6 | public DurationForm() { 7 | InitializeComponent(); 8 | } 9 | 10 | private void OnChanged(string time) { 11 | labelDuration.Text = time; 12 | } 13 | 14 | private void DurationForm_Load(object sender, EventArgs e) { 15 | GameHelper.GameState._Duration.Changed += OnChanged; 16 | GameHelper.GameState._Duration.Update(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /PPTTools/Modules/FTX/FTX.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | 3 | namespace PPTTools { 4 | namespace Modules { 5 | public class FTX: Module { 6 | private static readonly string ModuleIdentifier = "ftx"; 7 | 8 | private int[] score, total; 9 | 10 | public delegate void FTXEventHandler(int[] Score); 11 | public event FTXEventHandler Changed; 12 | 13 | private void Raise() { 14 | if (Changed != null) { 15 | Changed.Invoke(total); 16 | } 17 | } 18 | 19 | public void Reset() { 20 | score = new int[2] { 0, 0 }; 21 | total = new int[2] { 0, 0 }; 22 | 23 | Raise(); 24 | } 25 | 26 | public void Update() { 27 | if (GameHelper.EnsureMatch()) { 28 | for (int i = 0; i < 2; i++) { 29 | int temp = GameHelper.Score(i); 30 | 31 | if (temp > score[i]) 32 | total[i]++; 33 | 34 | score[i] = temp; 35 | } 36 | 37 | Raise(); 38 | 39 | } else { 40 | Reset(); 41 | } 42 | } 43 | 44 | public FTX(): base(ModuleIdentifier) { 45 | Reset(); 46 | Changed += Write; 47 | } 48 | 49 | private void Write(int[] score) { 50 | if (File.Exists(filename)) { 51 | StreamWriter sw = new StreamWriter(filename); 52 | sw.WriteLine($"{score[0]} - {score[1]}"); 53 | sw.Flush(); 54 | sw.Close(); 55 | } 56 | } 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /PPTTools/Modules/FTX/FTXForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class FTXForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FTXForm)); 27 | this.labelP1 = new System.Windows.Forms.Label(); 28 | this.labelP2 = new System.Windows.Forms.Label(); 29 | this.labelDelimiter = new System.Windows.Forms.Label(); 30 | this.SuspendLayout(); 31 | // 32 | // labelP1 33 | // 34 | this.labelP1.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 35 | this.labelP1.ForeColor = System.Drawing.Color.Gainsboro; 36 | this.labelP1.Location = new System.Drawing.Point(26, 11); 37 | this.labelP1.Name = "labelP1"; 38 | this.labelP1.Size = new System.Drawing.Size(78, 26); 39 | this.labelP1.TabIndex = 0; 40 | this.labelP1.Text = "0"; 41 | this.labelP1.TextAlign = System.Drawing.ContentAlignment.TopRight; 42 | // 43 | // labelP2 44 | // 45 | this.labelP2.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 46 | this.labelP2.ForeColor = System.Drawing.Color.Gainsboro; 47 | this.labelP2.Location = new System.Drawing.Point(117, 11); 48 | this.labelP2.Name = "labelP2"; 49 | this.labelP2.Size = new System.Drawing.Size(76, 26); 50 | this.labelP2.TabIndex = 0; 51 | this.labelP2.Text = "0"; 52 | // 53 | // labelDelimiter 54 | // 55 | this.labelDelimiter.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 56 | this.labelDelimiter.ForeColor = System.Drawing.Color.Gainsboro; 57 | this.labelDelimiter.Location = new System.Drawing.Point(81, 11); 58 | this.labelDelimiter.Name = "labelDelimiter"; 59 | this.labelDelimiter.Size = new System.Drawing.Size(59, 26); 60 | this.labelDelimiter.TabIndex = 0; 61 | this.labelDelimiter.Text = "-"; 62 | this.labelDelimiter.TextAlign = System.Drawing.ContentAlignment.TopCenter; 63 | // 64 | // FTXForm 65 | // 66 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 67 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 68 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 69 | this.ClientSize = new System.Drawing.Size(218, 47); 70 | this.Controls.Add(this.labelP2); 71 | this.Controls.Add(this.labelP1); 72 | this.Controls.Add(this.labelDelimiter); 73 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 74 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 75 | this.MaximizeBox = false; 76 | this.Name = "FTXForm"; 77 | this.Text = "PPT Score"; 78 | this.TopMost = true; 79 | this.Load += new System.EventHandler(this.FTXForm_Load); 80 | this.ResumeLayout(false); 81 | 82 | } 83 | 84 | #endregion 85 | 86 | private System.Windows.Forms.Label labelP1; 87 | private System.Windows.Forms.Label labelP2; 88 | private System.Windows.Forms.Label labelDelimiter; 89 | } 90 | } 91 | 92 | -------------------------------------------------------------------------------- /PPTTools/Modules/FTX/FTXForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace PPTTools { 5 | public partial class FTXForm : Form { 6 | public FTXForm() { 7 | InitializeComponent(); 8 | } 9 | 10 | private void OnChanged(int[] score) { 11 | labelP1.Text = score[0].ToString(); 12 | labelP2.Text = score[1].ToString(); 13 | } 14 | 15 | private void FTXForm_Load(object sender, EventArgs e) { 16 | GameHelper.GameState._FTX.Changed += OnChanged; 17 | GameHelper.GameState._FTX.Update(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /PPTTools/Modules/Finesse/Finesse.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | 6 | namespace PPTTools { 7 | namespace Modules { 8 | public class Finesse: Module { 9 | private static readonly string ModuleIdentifier = "finesse"; 10 | 11 | private int[] keyStates = new int[7] { 0, 0, 0, 0, 0, 0, 0 }, queue; 12 | private List finesseKeys = new List(); 13 | 14 | private bool register, door; 15 | private int errors, cPiece, cPiecePos, cPieceRot, state, holdPtr, piece; 16 | private int? cHold; 17 | 18 | public delegate void FinesseEventHandler(int Errors); 19 | public event FinesseEventHandler Changed; 20 | 21 | private void Raise() { 22 | if (Changed != null) { 23 | Changed.Invoke(errors); 24 | } 25 | } 26 | 27 | public void Reset() { 28 | errors = state = 0; 29 | holdPtr = GameHelper.HoldPointer(GameHelper.GameState.playerIndex); 30 | cPiece = GameHelper.NextPiece(GameHelper.GameState.playerIndex); 31 | cHold = GameHelper.FarPiece(GameHelper.GameState.playerIndex); 32 | queue = new int[5]; 33 | piece = 255; 34 | register = true; 35 | door = false; 36 | 37 | Raise(); 38 | } 39 | 40 | public void Update() { 41 | int drop = GameHelper.PieceDropped(GameHelper.GameState.playerIndex); 42 | 43 | if (drop == 1) { 44 | if (drop != state) { 45 | int hold = GameHelper.HoldPointer(GameHelper.GameState.playerIndex); 46 | 47 | errors += FinesseHelper.Errors((holdPtr == hold)? cPiece : cHold.Value, finesseKeys, cPiecePos, cPieceRot); 48 | 49 | finesseKeys.Clear(); 50 | cPiece = GameHelper.NextPiece(GameHelper.GameState.playerIndex); 51 | cHold = (hold < 0x0800000)? GameHelper.FarPiece(GameHelper.GameState.playerIndex) : GameHelper.HoldPiece(GameHelper.GameState.playerIndex); 52 | holdPtr = hold; 53 | 54 | register = true; 55 | } 56 | } else { 57 | int current = GameHelper.CurrentPiece(GameHelper.GameState.playerIndex); 58 | int piecesAddress = GameHelper.NextPointer(GameHelper.GameState.playerIndex); 59 | int[] cQueue = new int[5]; 60 | for (int i = 0; i < 5; i++) { 61 | cQueue[i] = GameHelper.Game.ReadByte(new IntPtr(piecesAddress + i * 0x04)); 62 | } 63 | 64 | if ((register && !cQueue.SequenceEqual(queue) && current == queue[0]) || (current != piece && piece == 255)) { 65 | door = true; 66 | register = false; 67 | } 68 | 69 | if (door) { 70 | for (int i = 0; i < 7; i++) { 71 | int key = GameHelper.Keystroke(i); 72 | 73 | if (key != keyStates[i]) { 74 | if (key == 1 && GameHelper.BigFrames() >= 147) { 75 | if (i != 2 && i != 3) { 76 | finesseKeys.Add(i); 77 | } 78 | } 79 | 80 | keyStates[i] = key; 81 | } 82 | } 83 | } 84 | 85 | piece = current; 86 | 87 | if (!register) 88 | queue = (int[])cQueue.Clone(); 89 | } 90 | 91 | state = drop; 92 | 93 | cPiecePos = GameHelper.PiecePosition(GameHelper.GameState.playerIndex); 94 | cPieceRot = GameHelper.PieceRotation(GameHelper.GameState.playerIndex); 95 | 96 | Raise(); 97 | } 98 | 99 | public Finesse(): base(ModuleIdentifier) { 100 | Reset(); 101 | Changed += Write; 102 | } 103 | 104 | private void Write(int errors) { 105 | if (File.Exists(filename)) { 106 | StreamWriter sw = new StreamWriter(filename); 107 | sw.WriteLine($"Finesse: {errors.ToString()}"); 108 | sw.Flush(); 109 | sw.Close(); 110 | } 111 | } 112 | } 113 | } 114 | } -------------------------------------------------------------------------------- /PPTTools/Modules/Finesse/FinesseForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class FinesseForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FinesseForm)); 27 | this.labelFinesse = new System.Windows.Forms.Label(); 28 | this.SuspendLayout(); 29 | // 30 | // labelFinesse 31 | // 32 | this.labelFinesse.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 33 | this.labelFinesse.ForeColor = System.Drawing.Color.Gainsboro; 34 | this.labelFinesse.Location = new System.Drawing.Point(10, 11); 35 | this.labelFinesse.Name = "labelFinesse"; 36 | this.labelFinesse.Size = new System.Drawing.Size(198, 26); 37 | this.labelFinesse.TabIndex = 2; 38 | this.labelFinesse.Text = "Finesse: 0"; 39 | // 40 | // FinesseForm 41 | // 42 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 43 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 44 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 45 | this.ClientSize = new System.Drawing.Size(218, 47); 46 | this.Controls.Add(this.labelFinesse); 47 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 48 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 49 | this.MaximizeBox = false; 50 | this.Name = "FinesseForm"; 51 | this.Text = "PPT Finesse"; 52 | this.TopMost = true; 53 | this.Load += new System.EventHandler(this.FinesseForm_Load); 54 | this.ResumeLayout(false); 55 | 56 | } 57 | 58 | #endregion 59 | 60 | private System.Windows.Forms.Label labelFinesse; 61 | } 62 | } 63 | 64 | -------------------------------------------------------------------------------- /PPTTools/Modules/Finesse/FinesseForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace PPTTools { 5 | public partial class FinesseForm : Form { 6 | public FinesseForm() { 7 | InitializeComponent(); 8 | } 9 | 10 | private void OnChanged(int errors) { 11 | labelFinesse.Text = $"Finesse: {errors.ToString()}"; 12 | } 13 | 14 | private void FinesseForm_Load(object sender, EventArgs e) { 15 | GameHelper.GameState._Finesse.Changed += OnChanged; 16 | GameHelper.GameState._Finesse.Update(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /PPTTools/Modules/Inputs/Inputs.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | namespace Modules { 3 | public class Inputs: Module { 4 | private static readonly string ModuleIdentifier = "inputs"; 5 | 6 | private int[] keyStates = new int[7] {0, 0, 0, 0, 0, 0, 0}; 7 | 8 | public delegate void InputsEventHandler(int[] keyStates); 9 | public event InputsEventHandler Changed; 10 | 11 | private void Raise() { 12 | if (Changed != null) { 13 | Changed.Invoke(keyStates); 14 | } 15 | } 16 | 17 | public void Reset() { 18 | Raise(); 19 | } 20 | 21 | public void Update() { 22 | for (int i = 0; i < 7; i++) 23 | keyStates[i] = GameHelper.Keystroke(i); 24 | 25 | Raise(); 26 | } 27 | 28 | public Inputs(): base(ModuleIdentifier) { 29 | Reset(); 30 | } 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /PPTTools/Modules/Inputs/InputsForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class InputsForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InputsForm)); 27 | this.pictureKey6 = new System.Windows.Forms.PictureBox(); 28 | this.pictureKey5 = new System.Windows.Forms.PictureBox(); 29 | this.pictureKey4 = new System.Windows.Forms.PictureBox(); 30 | this.pictureKey3 = new System.Windows.Forms.PictureBox(); 31 | this.pictureKey2 = new System.Windows.Forms.PictureBox(); 32 | this.pictureKey1 = new System.Windows.Forms.PictureBox(); 33 | this.pictureKey0 = new System.Windows.Forms.PictureBox(); 34 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey6)).BeginInit(); 35 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey5)).BeginInit(); 36 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey4)).BeginInit(); 37 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey3)).BeginInit(); 38 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey2)).BeginInit(); 39 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey1)).BeginInit(); 40 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey0)).BeginInit(); 41 | this.SuspendLayout(); 42 | // 43 | // pictureKey6 44 | // 45 | this.pictureKey6.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureKey6.BackgroundImage"))); 46 | this.pictureKey6.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 47 | this.pictureKey6.Location = new System.Drawing.Point(12, 46); 48 | this.pictureKey6.Name = "pictureKey6"; 49 | this.pictureKey6.Size = new System.Drawing.Size(66, 30); 50 | this.pictureKey6.TabIndex = 0; 51 | this.pictureKey6.TabStop = false; 52 | // 53 | // pictureKey5 54 | // 55 | this.pictureKey5.BackgroundImage = global::PPTTools.Properties.Resources.key5_0; 56 | this.pictureKey5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 57 | this.pictureKey5.Location = new System.Drawing.Point(48, 12); 58 | this.pictureKey5.Name = "pictureKey5"; 59 | this.pictureKey5.Size = new System.Drawing.Size(30, 30); 60 | this.pictureKey5.TabIndex = 0; 61 | this.pictureKey5.TabStop = false; 62 | // 63 | // pictureKey4 64 | // 65 | this.pictureKey4.BackgroundImage = global::PPTTools.Properties.Resources.key4_0; 66 | this.pictureKey4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 67 | this.pictureKey4.Location = new System.Drawing.Point(12, 12); 68 | this.pictureKey4.Name = "pictureKey4"; 69 | this.pictureKey4.Size = new System.Drawing.Size(30, 30); 70 | this.pictureKey4.TabIndex = 0; 71 | this.pictureKey4.TabStop = false; 72 | // 73 | // pictureKey3 74 | // 75 | this.pictureKey3.BackgroundImage = global::PPTTools.Properties.Resources.key2_0; 76 | this.pictureKey3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 77 | this.pictureKey3.Location = new System.Drawing.Point(142, 46); 78 | this.pictureKey3.Name = "pictureKey3"; 79 | this.pictureKey3.Size = new System.Drawing.Size(30, 30); 80 | this.pictureKey3.TabIndex = 0; 81 | this.pictureKey3.TabStop = false; 82 | // 83 | // pictureKey2 84 | // 85 | this.pictureKey2.BackgroundImage = global::PPTTools.Properties.Resources.key2_0; 86 | this.pictureKey2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 87 | this.pictureKey2.Location = new System.Drawing.Point(142, 12); 88 | this.pictureKey2.Name = "pictureKey2"; 89 | this.pictureKey2.Size = new System.Drawing.Size(30, 30); 90 | this.pictureKey2.TabIndex = 0; 91 | this.pictureKey2.TabStop = false; 92 | // 93 | // pictureKey1 94 | // 95 | this.pictureKey1.BackgroundImage = global::PPTTools.Properties.Resources.key1_0; 96 | this.pictureKey1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 97 | this.pictureKey1.Location = new System.Drawing.Point(176, 46); 98 | this.pictureKey1.Name = "pictureKey1"; 99 | this.pictureKey1.Size = new System.Drawing.Size(30, 30); 100 | this.pictureKey1.TabIndex = 0; 101 | this.pictureKey1.TabStop = false; 102 | // 103 | // pictureKey0 104 | // 105 | this.pictureKey0.BackgroundImage = global::PPTTools.Properties.Resources.key0_0; 106 | this.pictureKey0.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 107 | this.pictureKey0.Location = new System.Drawing.Point(108, 46); 108 | this.pictureKey0.Name = "pictureKey0"; 109 | this.pictureKey0.Size = new System.Drawing.Size(30, 30); 110 | this.pictureKey0.TabIndex = 0; 111 | this.pictureKey0.TabStop = false; 112 | // 113 | // InputsForm 114 | // 115 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 116 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 117 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 118 | this.ClientSize = new System.Drawing.Size(218, 88); 119 | this.Controls.Add(this.pictureKey6); 120 | this.Controls.Add(this.pictureKey5); 121 | this.Controls.Add(this.pictureKey4); 122 | this.Controls.Add(this.pictureKey3); 123 | this.Controls.Add(this.pictureKey2); 124 | this.Controls.Add(this.pictureKey1); 125 | this.Controls.Add(this.pictureKey0); 126 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 127 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 128 | this.MaximizeBox = false; 129 | this.Name = "InputsForm"; 130 | this.Text = "PPT Inputs"; 131 | this.TopMost = true; 132 | this.Load += new System.EventHandler(this.FTXForm_Load); 133 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey6)).EndInit(); 134 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey5)).EndInit(); 135 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey4)).EndInit(); 136 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey3)).EndInit(); 137 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey2)).EndInit(); 138 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey1)).EndInit(); 139 | ((System.ComponentModel.ISupportInitialize)(this.pictureKey0)).EndInit(); 140 | this.ResumeLayout(false); 141 | 142 | } 143 | 144 | #endregion 145 | 146 | private System.Windows.Forms.PictureBox pictureKey0; 147 | private System.Windows.Forms.PictureBox pictureKey1; 148 | private System.Windows.Forms.PictureBox pictureKey2; 149 | private System.Windows.Forms.PictureBox pictureKey3; 150 | private System.Windows.Forms.PictureBox pictureKey4; 151 | private System.Windows.Forms.PictureBox pictureKey5; 152 | private System.Windows.Forms.PictureBox pictureKey6; 153 | } 154 | } 155 | 156 | -------------------------------------------------------------------------------- /PPTTools/Modules/Inputs/InputsForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Windows.Forms; 4 | 5 | namespace PPTTools { 6 | public partial class InputsForm : Form { 7 | public InputsForm() { 8 | InitializeComponent(); 9 | } 10 | 11 | private void OnChanged(int[] keys) { 12 | for (int i = 0; i < 7; i++) 13 | ((PictureBox)this.Controls[$"pictureKey{i}"]).BackgroundImage = (Image)PPTTools.Properties.Resources.ResourceManager.GetObject($"key{i}_{keys[i]}"); 14 | } 15 | 16 | private void FTXForm_Load(object sender, EventArgs e) { 17 | GameHelper.GameState._Inputs.Changed += OnChanged; 18 | GameHelper.GameState._Inputs.Update(); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /PPTTools/Modules/KPP/KPP.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Linq; 4 | 5 | namespace PPTTools { 6 | namespace Modules { 7 | public class KPP: Module { 8 | private static readonly string ModuleIdentifier = "kpp"; 9 | 10 | private int[] keyStates = new int[7] {0, 0, 0, 0, 0, 0, 0}, queue = new int[5]; 11 | private int keystrokes, state, pieces, piece; 12 | private bool register = false, door = false; 13 | 14 | public delegate void KPPEventHandler(Decimal KPP); 15 | public event KPPEventHandler Changed; 16 | 17 | private void Raise() { 18 | if (Changed != null) { 19 | if (pieces == 0) { 20 | Changed.Invoke(0); 21 | } else { 22 | Changed.Invoke(Decimal.Divide(keystrokes, pieces)); 23 | } 24 | } 25 | } 26 | 27 | public void Reset() { 28 | keystrokes = pieces = 0; 29 | queue = new int[5]; 30 | piece = 255; 31 | register = door = false; 32 | 33 | Raise(); 34 | } 35 | 36 | public void Update() { 37 | int drop = GameHelper.PieceDropped(GameHelper.GameState.playerIndex); 38 | 39 | if (drop != state) { 40 | if (drop == 1) { 41 | pieces++; 42 | register = true; 43 | door = false; 44 | 45 | if (keyStates[2] == 0) { 46 | keystrokes++; 47 | } 48 | } 49 | 50 | state = drop; 51 | } 52 | 53 | int current = GameHelper.CurrentPiece(GameHelper.GameState.playerIndex); 54 | int piecesAddress = GameHelper.NextPointer(GameHelper.GameState.playerIndex); 55 | int[] cQueue = new int[5]; 56 | for (int i = 0; i < 5; i++) { 57 | cQueue[i] = GameHelper.Game.ReadByte(new IntPtr(piecesAddress + i * 0x04)); 58 | } 59 | 60 | if ((register && !cQueue.SequenceEqual(queue) && current == queue[0]) || (current != piece && piece == 255)) { 61 | door = true; 62 | register = false; 63 | } 64 | 65 | if (door) { 66 | for (int i = 0; i < 7; i++) { 67 | int key = GameHelper.Keystroke(i); 68 | 69 | if (key != keyStates[i]) { 70 | if (key == 1 && GameHelper.BigFrames() >= 147) 71 | keystrokes++; 72 | 73 | keyStates[i] = key; 74 | } 75 | } 76 | } 77 | 78 | piece = current; 79 | 80 | if (!register) 81 | queue = (int[])cQueue.Clone(); 82 | 83 | Raise(); 84 | } 85 | 86 | public KPP(): base(ModuleIdentifier) { 87 | Reset(); 88 | Changed += Write; 89 | } 90 | 91 | private void Write(Decimal kpp) { 92 | if (File.Exists(filename)) { 93 | StreamWriter sw = new StreamWriter(filename); 94 | sw.WriteLine(kpp.ToString("0.000 KPP")); 95 | sw.Flush(); 96 | sw.Close(); 97 | } 98 | } 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /PPTTools/Modules/KPP/KPPForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class KPPForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(KPPForm)); 27 | this.labelKPP = new System.Windows.Forms.Label(); 28 | this.SuspendLayout(); 29 | // 30 | // labelKPP 31 | // 32 | this.labelKPP.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 33 | this.labelKPP.ForeColor = System.Drawing.Color.Gainsboro; 34 | this.labelKPP.Location = new System.Drawing.Point(49, 11); 35 | this.labelKPP.Name = "labelKPP"; 36 | this.labelKPP.Size = new System.Drawing.Size(165, 26); 37 | this.labelKPP.TabIndex = 2; 38 | this.labelKPP.Text = "0.000 KPP"; 39 | this.labelKPP.TextAlign = System.Drawing.ContentAlignment.TopRight; 40 | // 41 | // KPPForm 42 | // 43 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 44 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 45 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 46 | this.ClientSize = new System.Drawing.Size(218, 47); 47 | this.Controls.Add(this.labelKPP); 48 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 49 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 50 | this.MaximizeBox = false; 51 | this.Name = "KPPForm"; 52 | this.Text = "PPT KPP"; 53 | this.TopMost = true; 54 | this.Load += new System.EventHandler(this.KPPForm_Load); 55 | this.ResumeLayout(false); 56 | 57 | } 58 | 59 | #endregion 60 | 61 | private System.Windows.Forms.Label labelKPP; 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /PPTTools/Modules/KPP/KPPForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace PPTTools { 5 | public partial class KPPForm : Form { 6 | public KPPForm() { 7 | InitializeComponent(); 8 | } 9 | 10 | private void OnChanged(Decimal kpp) { 11 | labelKPP.Text = kpp.ToString("0.000 KPP"); 12 | } 13 | 14 | private void KPPForm_Load(object sender, EventArgs e) { 15 | GameHelper.GameState._KPP.Changed += OnChanged; 16 | GameHelper.GameState._KPP.Update(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /PPTTools/Modules/Module.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace PPTTools { 7 | namespace Modules { 8 | public abstract class Module { 9 | public readonly string Identifier; 10 | private string _filename = ""; 11 | public string filename { 12 | get { return _filename; } 13 | set { 14 | _filename = value; 15 | Properties.Settings.Default[Identifier] = value; 16 | Properties.Settings.Default.Save(); 17 | } 18 | } 19 | 20 | public Module(string identifier) { 21 | Identifier = identifier; 22 | filename = (string)Properties.Settings.Default[Identifier]; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /PPTTools/Modules/PPS/PPS.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | 4 | namespace PPTTools { 5 | namespace Modules { 6 | public class PPS: Module { 7 | private static readonly string ModuleIdentifier = "pps"; 8 | 9 | private int pieces, state, frames; 10 | 11 | public delegate void PPSEventHandler(Decimal PPS); 12 | public event PPSEventHandler Changed; 13 | 14 | private void Raise() { 15 | if (Changed != null) { 16 | if (frames == 0) { 17 | Changed.Invoke(0); 18 | } else { 19 | Changed.Invoke(Decimal.Divide(pieces, frames) * 60); 20 | } 21 | } 22 | } 23 | 24 | public void Reset() { 25 | pieces = state = 0; 26 | 27 | Raise(); 28 | } 29 | 30 | public void Update() { 31 | frames = GameHelper.SmallFrames(); 32 | int drop = GameHelper.PieceDropped(GameHelper.GameState.playerIndex); 33 | 34 | if (drop != state) { 35 | if (drop == 1) 36 | pieces++; 37 | 38 | state = drop; 39 | } 40 | 41 | Raise(); 42 | } 43 | 44 | public PPS(): base(ModuleIdentifier) { 45 | Reset(); 46 | Changed += Write; 47 | } 48 | 49 | private void Write(Decimal pps) { 50 | if (File.Exists(filename)) { 51 | StreamWriter sw = new StreamWriter(filename); 52 | sw.WriteLine(pps.ToString("0.000 PPS")); 53 | sw.Flush(); 54 | sw.Close(); 55 | } 56 | } 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /PPTTools/Modules/PPS/PPSForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class PPSForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PPSForm)); 27 | this.labelPPS = new System.Windows.Forms.Label(); 28 | this.SuspendLayout(); 29 | // 30 | // labelPPS 31 | // 32 | this.labelPPS.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 33 | this.labelPPS.ForeColor = System.Drawing.Color.Gainsboro; 34 | this.labelPPS.Location = new System.Drawing.Point(49, 11); 35 | this.labelPPS.Name = "labelPPS"; 36 | this.labelPPS.Size = new System.Drawing.Size(165, 26); 37 | this.labelPPS.TabIndex = 2; 38 | this.labelPPS.Text = "0.000 PPS"; 39 | this.labelPPS.TextAlign = System.Drawing.ContentAlignment.TopRight; 40 | // 41 | // PPSForm 42 | // 43 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 44 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 45 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 46 | this.ClientSize = new System.Drawing.Size(218, 47); 47 | this.Controls.Add(this.labelPPS); 48 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 49 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 50 | this.MaximizeBox = false; 51 | this.Name = "PPSForm"; 52 | this.Text = "PPT PPS"; 53 | this.TopMost = true; 54 | this.Load += new System.EventHandler(this.PPSForm_Load); 55 | this.ResumeLayout(false); 56 | 57 | } 58 | 59 | #endregion 60 | 61 | private System.Windows.Forms.Label labelPPS; 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /PPTTools/Modules/PPS/PPSForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace PPTTools { 5 | public partial class PPSForm : Form { 6 | public PPSForm() { 7 | InitializeComponent(); 8 | } 9 | 10 | private void OnChanged(Decimal pps) { 11 | labelPPS.Text = pps.ToString("0.000 PPS"); 12 | } 13 | 14 | private void PPSForm_Load(object sender, EventArgs e) { 15 | GameHelper.GameState._PPS.Changed += OnChanged; 16 | GameHelper.GameState._PPS.Update(); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /PPTTools/Modules/Rating/Rating.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | 3 | namespace PPTTools { 4 | namespace Modules { 5 | public class Rating: Module { 6 | private static readonly string ModuleIdentifier = "rating"; 7 | 8 | private int start, current; 9 | 10 | public delegate void RatingEventHandler(int StartRating, int CurrentRating); 11 | public event RatingEventHandler Changed; 12 | 13 | private void Raise() { 14 | if (Changed != null) { 15 | Changed.Invoke(start, current); 16 | } 17 | } 18 | 19 | public void Reset() { 20 | start = current = GameHelper.Rating(); 21 | Raise(); 22 | } 23 | 24 | public void Update() { 25 | int rating = GameHelper.Rating(); 26 | 27 | if (rating != current) 28 | current = rating; 29 | 30 | Raise(); 31 | } 32 | 33 | public Rating(): base(ModuleIdentifier) { 34 | Reset(); 35 | Changed += Write; 36 | } 37 | 38 | private void Write(int start, int current) { 39 | if (File.Exists(filename)) { 40 | StreamWriter sw = new StreamWriter(filename); 41 | sw.WriteLine($"{start} > {current}"); 42 | sw.Flush(); 43 | sw.Close(); 44 | } 45 | } 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /PPTTools/Modules/Rating/RatingForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace PPTTools { 2 | partial class RatingForm { 3 | /// 4 | /// Required designer variable. 5 | /// 6 | private System.ComponentModel.IContainer components = null; 7 | 8 | /// 9 | /// Clean up any resources being used. 10 | /// 11 | /// true if managed resources should be disposed; otherwise, false. 12 | protected override void Dispose(bool disposing) { 13 | if (disposing && (components != null)) { 14 | components.Dispose(); 15 | } 16 | base.Dispose(disposing); 17 | } 18 | 19 | #region Windows Form Designer generated code 20 | 21 | /// 22 | /// Required method for Designer support - do not modify 23 | /// the contents of this method with the code editor. 24 | /// 25 | private void InitializeComponent() { 26 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RatingForm)); 27 | this.labelStart = new System.Windows.Forms.Label(); 28 | this.labelCurrent = new System.Windows.Forms.Label(); 29 | this.labelDelimiter = new System.Windows.Forms.Label(); 30 | this.SuspendLayout(); 31 | // 32 | // labelStart 33 | // 34 | this.labelStart.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 35 | this.labelStart.ForeColor = System.Drawing.Color.Gainsboro; 36 | this.labelStart.Location = new System.Drawing.Point(4, 11); 37 | this.labelStart.Name = "labelStart"; 38 | this.labelStart.Size = new System.Drawing.Size(100, 26); 39 | this.labelStart.TabIndex = 0; 40 | this.labelStart.Text = "0"; 41 | this.labelStart.TextAlign = System.Drawing.ContentAlignment.TopRight; 42 | // 43 | // labelCurrent 44 | // 45 | this.labelCurrent.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 46 | this.labelCurrent.ForeColor = System.Drawing.Color.Gainsboro; 47 | this.labelCurrent.Location = new System.Drawing.Point(117, 11); 48 | this.labelCurrent.Name = "labelCurrent"; 49 | this.labelCurrent.Size = new System.Drawing.Size(96, 26); 50 | this.labelCurrent.TabIndex = 0; 51 | this.labelCurrent.Text = "0"; 52 | // 53 | // labelDelimiter 54 | // 55 | this.labelDelimiter.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 56 | this.labelDelimiter.ForeColor = System.Drawing.Color.Gainsboro; 57 | this.labelDelimiter.Location = new System.Drawing.Point(81, 11); 58 | this.labelDelimiter.Name = "labelDelimiter"; 59 | this.labelDelimiter.Size = new System.Drawing.Size(59, 26); 60 | this.labelDelimiter.TabIndex = 0; 61 | this.labelDelimiter.Text = ">"; 62 | this.labelDelimiter.TextAlign = System.Drawing.ContentAlignment.TopCenter; 63 | // 64 | // RatingForm 65 | // 66 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 67 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 68 | this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10))))); 69 | this.ClientSize = new System.Drawing.Size(218, 47); 70 | this.Controls.Add(this.labelCurrent); 71 | this.Controls.Add(this.labelStart); 72 | this.Controls.Add(this.labelDelimiter); 73 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 74 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 75 | this.MaximizeBox = false; 76 | this.Name = "RatingForm"; 77 | this.Text = "PPT Rating"; 78 | this.TopMost = true; 79 | this.Load += new System.EventHandler(this.RatingForm_Load); 80 | this.ResumeLayout(false); 81 | 82 | } 83 | 84 | #endregion 85 | 86 | private System.Windows.Forms.Label labelStart; 87 | private System.Windows.Forms.Label labelCurrent; 88 | private System.Windows.Forms.Label labelDelimiter; 89 | } 90 | } 91 | 92 | -------------------------------------------------------------------------------- /PPTTools/Modules/Rating/RatingForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace PPTTools { 5 | public partial class RatingForm : Form { 6 | public RatingForm() { 7 | InitializeComponent(); 8 | } 9 | 10 | private void OnChanged(int start, int current) { 11 | labelStart.Text = start.ToString(); 12 | labelCurrent.Text = current.ToString(); 13 | } 14 | 15 | private void RatingForm_Load(object sender, EventArgs e) { 16 | GameHelper.GameState._Rating.Changed += OnChanged; 17 | GameHelper.GameState._Rating.Update(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /PPTTools/PPTTools.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {23A2F118-FF17-423A-B57F-6DE28B808AC1} 8 | WinExe 9 | PPTTools 10 | PPTTools 11 | v4.0 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | Resources\icon.ico 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | .\VAMemory.dll 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | Form 58 | 59 | 60 | DurationForm.cs 61 | 62 | 63 | 64 | Form 65 | 66 | 67 | FinesseForm.cs 68 | 69 | 70 | 71 | Form 72 | 73 | 74 | InputsForm.cs 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | Form 83 | 84 | 85 | RatingForm.cs 86 | 87 | 88 | Form 89 | 90 | 91 | KPPForm.cs 92 | 93 | 94 | Form 95 | 96 | 97 | APCForm.cs 98 | 99 | 100 | 101 | Form 102 | 103 | 104 | FTXForm.cs 105 | 106 | 107 | 108 | Form 109 | 110 | 111 | MainForm.cs 112 | 113 | 114 | Form 115 | 116 | 117 | APMForm.cs 118 | 119 | 120 | Form 121 | 122 | 123 | PPSForm.cs 124 | 125 | 126 | 127 | 128 | DurationForm.cs 129 | 130 | 131 | FinesseForm.cs 132 | 133 | 134 | InputsForm.cs 135 | 136 | 137 | RatingForm.cs 138 | 139 | 140 | KPPForm.cs 141 | 142 | 143 | APCForm.cs 144 | 145 | 146 | FTXForm.cs 147 | 148 | 149 | MainForm.cs 150 | 151 | 152 | APMForm.cs 153 | 154 | 155 | PPSForm.cs 156 | 157 | 158 | ResXFileCodeGenerator 159 | Resources.Designer.cs 160 | Designer 161 | 162 | 163 | True 164 | Resources.resx 165 | True 166 | 167 | 168 | 169 | SettingsSingleFileGenerator 170 | Settings.Designer.cs 171 | 172 | 173 | True 174 | Settings.settings 175 | True 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | Always 196 | 197 | 198 | 199 | 200 | -------------------------------------------------------------------------------- /PPTTools/PPTTools.csproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | ShowAllFiles 5 | 6 | -------------------------------------------------------------------------------- /PPTTools/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | 4 | namespace PPTTools { 5 | static class Program { 6 | [STAThread] 7 | static void Main() { 8 | Application.EnableVisualStyles(); 9 | Application.SetCompatibleTextRenderingDefault(false); 10 | Application.Run(new MainForm()); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /PPTTools/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("PPTTools")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("mat1jaczyyy")] 12 | [assembly: AssemblyProduct("PPTTools")] 13 | [assembly: AssemblyCopyright("Copyright © 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("23a2f118-ff17-423a-b57f-6de28b808ac1")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /PPTTools/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace PPTTools.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PPTTools.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized resource of type System.Drawing.Bitmap. 65 | /// 66 | internal static System.Drawing.Bitmap key0_0 { 67 | get { 68 | object obj = ResourceManager.GetObject("key0_0", resourceCulture); 69 | return ((System.Drawing.Bitmap)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Looks up a localized resource of type System.Drawing.Bitmap. 75 | /// 76 | internal static System.Drawing.Bitmap key0_1 { 77 | get { 78 | object obj = ResourceManager.GetObject("key0_1", resourceCulture); 79 | return ((System.Drawing.Bitmap)(obj)); 80 | } 81 | } 82 | 83 | /// 84 | /// Looks up a localized resource of type System.Drawing.Bitmap. 85 | /// 86 | internal static System.Drawing.Bitmap key1_0 { 87 | get { 88 | object obj = ResourceManager.GetObject("key1_0", resourceCulture); 89 | return ((System.Drawing.Bitmap)(obj)); 90 | } 91 | } 92 | 93 | /// 94 | /// Looks up a localized resource of type System.Drawing.Bitmap. 95 | /// 96 | internal static System.Drawing.Bitmap key1_1 { 97 | get { 98 | object obj = ResourceManager.GetObject("key1_1", resourceCulture); 99 | return ((System.Drawing.Bitmap)(obj)); 100 | } 101 | } 102 | 103 | /// 104 | /// Looks up a localized resource of type System.Drawing.Bitmap. 105 | /// 106 | internal static System.Drawing.Bitmap key2_0 { 107 | get { 108 | object obj = ResourceManager.GetObject("key2_0", resourceCulture); 109 | return ((System.Drawing.Bitmap)(obj)); 110 | } 111 | } 112 | 113 | /// 114 | /// Looks up a localized resource of type System.Drawing.Bitmap. 115 | /// 116 | internal static System.Drawing.Bitmap key2_1 { 117 | get { 118 | object obj = ResourceManager.GetObject("key2_1", resourceCulture); 119 | return ((System.Drawing.Bitmap)(obj)); 120 | } 121 | } 122 | 123 | /// 124 | /// Looks up a localized resource of type System.Drawing.Bitmap. 125 | /// 126 | internal static System.Drawing.Bitmap key3_0 { 127 | get { 128 | object obj = ResourceManager.GetObject("key3_0", resourceCulture); 129 | return ((System.Drawing.Bitmap)(obj)); 130 | } 131 | } 132 | 133 | /// 134 | /// Looks up a localized resource of type System.Drawing.Bitmap. 135 | /// 136 | internal static System.Drawing.Bitmap key3_1 { 137 | get { 138 | object obj = ResourceManager.GetObject("key3_1", resourceCulture); 139 | return ((System.Drawing.Bitmap)(obj)); 140 | } 141 | } 142 | 143 | /// 144 | /// Looks up a localized resource of type System.Drawing.Bitmap. 145 | /// 146 | internal static System.Drawing.Bitmap key4_0 { 147 | get { 148 | object obj = ResourceManager.GetObject("key4_0", resourceCulture); 149 | return ((System.Drawing.Bitmap)(obj)); 150 | } 151 | } 152 | 153 | /// 154 | /// Looks up a localized resource of type System.Drawing.Bitmap. 155 | /// 156 | internal static System.Drawing.Bitmap key4_1 { 157 | get { 158 | object obj = ResourceManager.GetObject("key4_1", resourceCulture); 159 | return ((System.Drawing.Bitmap)(obj)); 160 | } 161 | } 162 | 163 | /// 164 | /// Looks up a localized resource of type System.Drawing.Bitmap. 165 | /// 166 | internal static System.Drawing.Bitmap key5_0 { 167 | get { 168 | object obj = ResourceManager.GetObject("key5_0", resourceCulture); 169 | return ((System.Drawing.Bitmap)(obj)); 170 | } 171 | } 172 | 173 | /// 174 | /// Looks up a localized resource of type System.Drawing.Bitmap. 175 | /// 176 | internal static System.Drawing.Bitmap key5_1 { 177 | get { 178 | object obj = ResourceManager.GetObject("key5_1", resourceCulture); 179 | return ((System.Drawing.Bitmap)(obj)); 180 | } 181 | } 182 | 183 | /// 184 | /// Looks up a localized resource of type System.Drawing.Bitmap. 185 | /// 186 | internal static System.Drawing.Bitmap key6_0 { 187 | get { 188 | object obj = ResourceManager.GetObject("key6_0", resourceCulture); 189 | return ((System.Drawing.Bitmap)(obj)); 190 | } 191 | } 192 | 193 | /// 194 | /// Looks up a localized resource of type System.Drawing.Bitmap. 195 | /// 196 | internal static System.Drawing.Bitmap key6_1 { 197 | get { 198 | object obj = ResourceManager.GetObject("key6_1", resourceCulture); 199 | return ((System.Drawing.Bitmap)(obj)); 200 | } 201 | } 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /PPTTools/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\Resources\key0_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | 125 | ..\Resources\key0_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 126 | 127 | 128 | ..\Resources\key1_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 129 | 130 | 131 | ..\Resources\key1_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 132 | 133 | 134 | ..\Resources\key2_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 135 | 136 | 137 | ..\Resources\key2_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 138 | 139 | 140 | ..\Resources\key3_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 141 | 142 | 143 | ..\Resources\key3_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 144 | 145 | 146 | ..\Resources\key4_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 147 | 148 | 149 | ..\Resources\key4_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 150 | 151 | 152 | ..\Resources\key5_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 153 | 154 | 155 | ..\Resources\key5_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 156 | 157 | 158 | ..\Resources\key6_0.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 159 | 160 | 161 | ..\Resources\key6_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 162 | 163 | -------------------------------------------------------------------------------- /PPTTools/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace PPTTools.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.UserScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("")] 29 | public string apc { 30 | get { 31 | return ((string)(this["apc"])); 32 | } 33 | set { 34 | this["apc"] = value; 35 | } 36 | } 37 | 38 | [global::System.Configuration.UserScopedSettingAttribute()] 39 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 40 | [global::System.Configuration.DefaultSettingValueAttribute("")] 41 | public string apm { 42 | get { 43 | return ((string)(this["apm"])); 44 | } 45 | set { 46 | this["apm"] = value; 47 | } 48 | } 49 | 50 | [global::System.Configuration.UserScopedSettingAttribute()] 51 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 52 | [global::System.Configuration.DefaultSettingValueAttribute("")] 53 | public string duration { 54 | get { 55 | return ((string)(this["duration"])); 56 | } 57 | set { 58 | this["duration"] = value; 59 | } 60 | } 61 | 62 | [global::System.Configuration.UserScopedSettingAttribute()] 63 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 64 | [global::System.Configuration.DefaultSettingValueAttribute("")] 65 | public string finesse { 66 | get { 67 | return ((string)(this["finesse"])); 68 | } 69 | set { 70 | this["finesse"] = value; 71 | } 72 | } 73 | 74 | [global::System.Configuration.UserScopedSettingAttribute()] 75 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 76 | [global::System.Configuration.DefaultSettingValueAttribute("")] 77 | public string ftx { 78 | get { 79 | return ((string)(this["ftx"])); 80 | } 81 | set { 82 | this["ftx"] = value; 83 | } 84 | } 85 | 86 | [global::System.Configuration.UserScopedSettingAttribute()] 87 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 88 | [global::System.Configuration.DefaultSettingValueAttribute("")] 89 | public string inputs { 90 | get { 91 | return ((string)(this["inputs"])); 92 | } 93 | set { 94 | this["inputs"] = value; 95 | } 96 | } 97 | 98 | [global::System.Configuration.UserScopedSettingAttribute()] 99 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 100 | [global::System.Configuration.DefaultSettingValueAttribute("")] 101 | public string kpp { 102 | get { 103 | return ((string)(this["kpp"])); 104 | } 105 | set { 106 | this["kpp"] = value; 107 | } 108 | } 109 | 110 | [global::System.Configuration.UserScopedSettingAttribute()] 111 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 112 | [global::System.Configuration.DefaultSettingValueAttribute("")] 113 | public string pps { 114 | get { 115 | return ((string)(this["pps"])); 116 | } 117 | set { 118 | this["pps"] = value; 119 | } 120 | } 121 | 122 | [global::System.Configuration.UserScopedSettingAttribute()] 123 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 124 | [global::System.Configuration.DefaultSettingValueAttribute("")] 125 | public string rating { 126 | get { 127 | return ((string)(this["rating"])); 128 | } 129 | set { 130 | this["rating"] = value; 131 | } 132 | } 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /PPTTools/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /PPTTools/Resources/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/icon.ico -------------------------------------------------------------------------------- /PPTTools/Resources/key0_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key0_0.png -------------------------------------------------------------------------------- /PPTTools/Resources/key0_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key0_1.png -------------------------------------------------------------------------------- /PPTTools/Resources/key1_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key1_0.png -------------------------------------------------------------------------------- /PPTTools/Resources/key1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key1_1.png -------------------------------------------------------------------------------- /PPTTools/Resources/key2_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key2_0.png -------------------------------------------------------------------------------- /PPTTools/Resources/key2_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key2_1.png -------------------------------------------------------------------------------- /PPTTools/Resources/key3_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key3_0.png -------------------------------------------------------------------------------- /PPTTools/Resources/key3_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key3_1.png -------------------------------------------------------------------------------- /PPTTools/Resources/key4_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key4_0.png -------------------------------------------------------------------------------- /PPTTools/Resources/key4_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key4_1.png -------------------------------------------------------------------------------- /PPTTools/Resources/key5_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key5_0.png -------------------------------------------------------------------------------- /PPTTools/Resources/key5_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key5_1.png -------------------------------------------------------------------------------- /PPTTools/Resources/key6_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key6_0.png -------------------------------------------------------------------------------- /PPTTools/Resources/key6_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/Resources/key6_1.png -------------------------------------------------------------------------------- /PPTTools/VAMemory.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZetrisAI/PPT-Tools/b32107f2ff21cf2c7493560f4f07e72fceba555f/PPTTools/VAMemory.dll -------------------------------------------------------------------------------- /PPTTools/app.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 |
6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PPT Tools (DEPRECATED) 2 | 3 | These were my first effort on reverse engineering PPT, I've learned better since then, however other solutions have surpassed me and I have no interest in continuing this project. See https://github.com/bayoen. 4 | 5 | Puyo Puyo Tetris tools enhance your streaming or playing experience by providing you with useful statistics about your gameplay. 6 | 7 | ## FTX 8 | 9 | FTX is a total games won counter for Free Play games ("First to X") format. This format is usually used for professional matches. This solves the problem of having to count the wins manually, usually in Twitch stream chat. 10 | 11 | ## PPS 12 | 13 | PPS (pieces per second) counter for Tetris in Sprint, Solo and Online games. This allows streamers and competitors to track their in-game speed, follow their progress as they get faster and generally to show off. 14 | 15 | ## APM 16 | 17 | APM (attack per minute) counter for Tetris in Solo and Online games. This allows streamers and competitors to track their damange output, mostly to see how effective their gameplay actually is. 18 | --------------------------------------------------------------------------------