/*This file is part of FFB Arcade Plugin. FFB Arcade Plugin is free software : you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. FFB Arcade Plugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with FFB Arcade Plugin.If not, see < https://www.gnu.org/licenses/>. */ #include #include #include "Mame.h" #include "math.h" static int sanfran(int ffsan) { switch (ffsan) { case 0xFF: return 232; case 0xFE: return 231; case 0xFD: return 230; case 0xFC: return 229; case 0xFB: return 228; case 0xFA: return 227; case 0xF9: return 226; case 0xF8: return 225; case 0xF7: return 224; case 0xF6: return 223; case 0xF5: return 222; case 0xF4: return 221; case 0xF3: return 220; case 0xF2: return 219; case 0xF1: return 218; case 0xEF: return 217; case 0xEE: return 216; case 0xED: return 215; case 0xEC: return 214; case 0xEB: return 213; case 0xEA: return 212; case 0xE9: return 211; case 0xE8: return 210; case 0xE7: return 209; case 0xE6: return 208; case 0xE5: return 207; case 0xE4: return 206; case 0xE3: return 205; case 0xE2: return 204; case 0xE1: return 203; case 0xDF: return 202; case 0xDE: return 201; case 0xDD: return 200; case 0xDC: return 199; case 0xDB: return 198; case 0xDA: return 197; case 0xD9: return 196; case 0xD8: return 195; case 0xD7: return 194; case 0xD6: return 193; case 0xD5: return 192; case 0xD4: return 191; case 0xD3: return 190; case 0xD2: return 189; case 0xD1: return 188; case 0xCF: return 187; case 0xCE: return 186; case 0xCD: return 185; case 0xCC: return 184; case 0xCB: return 183; case 0xCA: return 182; case 0xC9: return 181; case 0xC8: return 180; case 0xC7: return 179; case 0xC6: return 178; case 0xC5: return 177; case 0xC4: return 176; case 0xC3: return 175; case 0xC2: return 174; case 0xC1: return 173; case 0xBF: return 172; case 0xBE: return 171; case 0xBD: return 170; case 0xBC: return 169; case 0xBB: return 168; case 0xBA: return 167; case 0xB9: return 166; case 0xB8: return 165; case 0xB7: return 164; case 0xB6: return 163; case 0xB5: return 162; case 0xB4: return 161; case 0xB3: return 160; case 0xB2: return 159; case 0xB1: return 158; case 0xAF: return 157; case 0xAE: return 156; case 0xAD: return 155; case 0xAC: return 154; case 0xAB: return 153; case 0xAA: return 152; case 0xA9: return 151; case 0xA8: return 150; case 0xA7: return 149; case 0xA6: return 148; case 0xA5: return 147; case 0xA4: return 146; case 0xA3: return 145; case 0xA2: return 144; case 0xA1: return 143; case 0x9F: return 142; case 0x9E: return 141; case 0x9D: return 140; case 0x9C: return 139; case 0x9B: return 138; case 0x9A: return 137; case 0x99: return 136; case 0x98: return 135; case 0x97: return 134; case 0x96: return 133; case 0x95: return 132; case 0x94: return 131; case 0x93: return 130; case 0x92: return 129; case 0x91: return 128; case 0x8F: return 127; case 0x8E: return 126; case 0x8D: return 125; case 0x8C: return 124; case 0x8B: return 123; case 0x8A: return 122; case 0x89: return 121; case 0x88: return 120; case 0x87: return 119; case 0x86: return 118; case 0x85: return 117; case 0x84: return 116; case 0x83: return 115; case 0x82: return 114; case 0x81: return 113; case 0x7F: return 112; case 0x7E: return 111; case 0x7D: return 110; case 0x7C: return 109; case 0x7B: return 108; case 0x7A: return 107; case 0x79: return 106; case 0x78: return 105; case 0x77: return 104; case 0x76: return 103; case 0x75: return 102; case 0x74: return 101; case 0x73: return 100; case 0x72: return 99; case 0x71: return 98; case 0x6F: return 97; case 0x6E: return 96; case 0x6D: return 95; case 0x6C: return 94; case 0x6B: return 93; case 0x6A: return 92; case 0x69: return 91; case 0x68: return 90; case 0x67: return 89; case 0x66: return 88; case 0x65: return 87; case 0x64: return 86; case 0x63: return 85; case 0x62: return 84; case 0x61: return 83; case 0x5F: return 82; case 0x5E: return 81; case 0x5D: return 80; case 0x5C: return 79; case 0x5B: return 78; case 0x5A: return 77; case 0x59: return 76; case 0x58: return 75; case 0x57: return 74; case 0x56: return 73; case 0x55: return 72; case 0x54: return 71; case 0x53: return 70; case 0x52: return 69; case 0x51: return 68; case 0x4F: return 67; case 0x4E: return 66; case 0x4D: return 65; case 0x4C: return 64; case 0x4B: return 63; case 0x4A: return 62; case 0x49: return 61; case 0x48: return 60; case 0x47: return 59; case 0x46: return 58; case 0x45: return 57; case 0x44: return 56; case 0x43: return 55; case 0x42: return 54; case 0x41: return 53; case 0x3F: return 52; case 0x3E: return 51; case 0x3D: return 50; case 0x3C: return 49; case 0x3B: return 48; case 0x3A: return 47; case 0x39: return 46; case 0x38: return 45; case 0x37: return 44; case 0x36: return 43; case 0x35: return 42; case 0x34: return 41; case 0x33: return 40; case 0x32: return 39; case 0x31: return 38; case 0x29: return 37; case 0x28: return 36; case 0x27: return 35; case 0x26: return 34; case 0x25: return 33; case 0x24: return 32; case 0x23: return 31; case 0x22: return 30; case 0x21: return 29; case 0x1F: return 28; case 0x1E: return 27; case 0x1D: return 26; case 0x1C: return 25; case 0x1B: return 24; case 0x1A: return 23; case 0x19: return 22; case 0x18: return 21; case 0x17: return 20; case 0x16: return 19; case 0x15: return 18; case 0x14: return 17; case 0x13: return 16; case 0x12: return 15; case 0x11: return 14; case 0x0F: return 13; case 0x0E: return 12; case 0x0D: return 11; case 0x0C: return 10; case 0x0B: return 9; case 0x0A: return 8; case 0x09: return 7; case 0x08: return 6; case 0x07: return 5; case 0x06: return 4; case 0x05: return 3; case 0x04: return 2; case 0x03: return 1; default: return 0; } } static int crusnwld(int ffcru) { switch (ffcru) { case 0xFF: return 225; case 0xFE: return 224; case 0xFD: return 223; case 0xFC: return 222; case 0xFB: return 221; case 0xFA: return 220; case 0xF9: return 219; case 0xF8: return 218; case 0xF7: return 217; case 0xF6: return 216; case 0xF5: return 215; case 0xF4: return 214; case 0xF3: return 213; case 0xF2: return 212; case 0xF1: return 211; case 0xEF: return 210; case 0xEE: return 209; case 0xED: return 208; case 0xEC: return 207; case 0xEB: return 206; case 0xEA: return 205; case 0xE9: return 204; case 0xE8: return 203; case 0xE7: return 202; case 0xE6: return 201; case 0xE5: return 200; case 0xE4: return 199; case 0xE3: return 198; case 0xE2: return 197; case 0xE1: return 196; case 0xDF: return 195; case 0xDE: return 194; case 0xDD: return 193; case 0xDC: return 192; case 0xDB: return 191; case 0xDA: return 190; case 0xD9: return 189; case 0xD8: return 188; case 0xD7: return 187; case 0xD6: return 186; case 0xD5: return 185; case 0xD4: return 184; case 0xD3: return 183; case 0xD2: return 182; case 0xD1: return 181; case 0xCF: return 180; case 0xCE: return 179; case 0xCD: return 178; case 0xCC: return 177; case 0xCB: return 176; case 0xCA: return 175; case 0xC9: return 174; case 0xC7: return 173; case 0xC6: return 172; case 0xC5: return 171; case 0xC3: return 170; case 0xBF: return 169; case 0xBE: return 168; case 0xBD: return 167; case 0xBC: return 166; case 0xBB: return 165; case 0xBA: return 164; case 0xB9: return 163; case 0xB8: return 162; case 0xB7: return 161; case 0xB6: return 160; case 0xB5: return 159; case 0xB4: return 158; case 0xB3: return 157; case 0xB2: return 156; case 0xB1: return 155; case 0xAF: return 154; case 0xAE: return 153; case 0xAD: return 152; case 0xAC: return 151; case 0xAB: return 150; case 0xAA: return 149; case 0xA9: return 148; case 0xA8: return 147; case 0xA7: return 146; case 0xA6: return 145; case 0xA5: return 144; case 0xA4: return 143; case 0xA3: return 142; case 0xA2: return 141; case 0xA1: return 140; case 0x9F: return 139; case 0x9E: return 138; case 0x9D: return 137; case 0x9C: return 136; case 0x9B: return 135; case 0x9A: return 134; case 0x99: return 133; case 0x98: return 132; case 0x97: return 131; case 0x96: return 130; case 0x95: return 129; case 0x94: return 128; case 0x93: return 127; case 0x92: return 126; case 0x91: return 125; case 0x8F: return 124; case 0x8E: return 123; case 0x8D: return 122; case 0x8C: return 121; case 0x8B: return 120; case 0x8A: return 119; case 0x89: return 118; case 0x88: return 117; case 0x87: return 116; case 0x86: return 115; case 0x85: return 114; case 0x84: return 113; case 0x83: return 112; case 0x82: return 111; case 0x7E: return 110; case 0x7D: return 109; case 0x7C: return 108; case 0x7B: return 107; case 0x7A: return 106; case 0x79: return 105; case 0x78: return 104; case 0x77: return 103; case 0x76: return 102; case 0x75: return 101; case 0x74: return 100; case 0x73: return 99; case 0x72: return 98; case 0x71: return 97; case 0x6F: return 96; case 0x6E: return 95; case 0x6D: return 94; case 0x6C: return 93; case 0x6B: return 92; case 0x6A: return 91; case 0x69: return 90; case 0x68: return 89; case 0x67: return 88; case 0x66: return 87; case 0x65: return 86; case 0x64: return 85; case 0x63: return 84; case 0x62: return 83; case 0x61: return 82; case 0x5F: return 81; case 0x5E: return 80; case 0x5D: return 79; case 0x5C: return 78; case 0x5B: return 77; case 0x5A: return 76; case 0x59: return 75; case 0x58: return 74; case 0x57: return 73; case 0x56: return 72; case 0x55: return 71; case 0x54: return 70; case 0x53: return 69; case 0x52: return 68; case 0x51: return 67; case 0x4F: return 66; case 0x4E: return 65; case 0x4D: return 64; case 0x4C: return 63; case 0x4B: return 62; case 0x4A: return 61; case 0x49: return 60; case 0x48: return 59; case 0x47: return 58; case 0x46: return 57; case 0x45: return 56; case 0x44: return 55; case 0x43: return 54; case 0x42: return 53; case 0x41: return 52; case 0x3F: return 51; case 0x3E: return 50; case 0x3D: return 49; case 0x3C: return 48; case 0x3B: return 47; case 0x3A: return 46; case 0x39: return 45; case 0x38: return 44; case 0x37: return 43; case 0x36: return 42; case 0x35: return 41; case 0x34: return 40; case 0x33: return 39; case 0x32: return 38; case 0x31: return 37; case 0x29: return 36; case 0x28: return 35; case 0x27: return 34; case 0x26: return 33; case 0x25: return 32; case 0x24: return 31; case 0x23: return 30; case 0x22: return 29; case 0x21: return 28; case 0x1F: return 27; case 0x1E: return 26; case 0x1D: return 25; case 0x1C: return 24; case 0x1B: return 23; case 0x1A: return 22; case 0x19: return 21; case 0x18: return 20; case 0x17: return 19; case 0x16: return 18; case 0x15: return 17; case 0x14: return 16; case 0x13: return 15; case 0x12: return 14; case 0x11: return 13; case 0x0F: return 12; case 0x0E: return 11; case 0x0D: return 10; case 0x0C: return 9; case 0x0B: return 8; case 0x0A: return 7; case 0x09: return 6; case 0x07: return 5; case 0x06: return 4; case 0x05: return 3; case 0x03: return 2; case 0x01: return 1; default: return 0; } } static int crusnusa(int ffusa) { switch (ffusa) { case 0xFF: return 214; case 0xFE: return 213; case 0xFC: return 212; case 0xFB: return 211; case 0xFA: return 210; case 0xF9: return 209; case 0xF8: return 208; case 0xF7: return 207; case 0xF6: return 206; case 0xF5: return 205; case 0xF4: return 204; case 0xF3: return 203; case 0xF2: return 202; case 0xF1: return 201; case 0xEF: return 200; case 0xEE: return 199; case 0xED: return 198; case 0xEC: return 197; case 0xEB: return 196; case 0xEA: return 195; case 0xE9: return 194; case 0xE8: return 193; case 0xE7: return 192; case 0xE6: return 191; case 0xE5: return 190; case 0xE4: return 189; case 0xE3: return 188; case 0xE2: return 187; case 0xE1: return 186; case 0xDF: return 185; case 0xDE: return 184; case 0xDD: return 183; case 0xDC: return 182; case 0xDB: return 181; case 0xDA: return 180; case 0xD9: return 179; case 0xD8: return 178; case 0xD7: return 177; case 0xD3: return 176; case 0xD2: return 175; case 0xD1: return 174; case 0xCF: return 173; case 0xCE: return 172; case 0xCD: return 171; case 0xCC: return 170; case 0xCB: return 169; case 0xCA: return 168; case 0xC9: return 167; case 0xC7: return 166; case 0xC6: return 165; case 0xC5: return 164; case 0xC3: return 163; case 0xBF: return 162; case 0xBE: return 161; case 0xBD: return 160; case 0xBC: return 159; case 0xBB: return 158; case 0xBA: return 157; case 0xB9: return 156; case 0xB8: return 155; case 0xB7: return 154; case 0xB6: return 153; case 0xB5: return 152; case 0xB4: return 151; case 0xB3: return 150; case 0xB2: return 149; case 0xB1: return 148; case 0xAF: return 147; case 0xAE: return 146; case 0xAD: return 145; case 0xAC: return 144; case 0xAB: return 143; case 0xAA: return 142; case 0xA9: return 141; case 0xA8: return 140; case 0xA7: return 139; case 0xA6: return 138; case 0xA5: return 137; case 0xA4: return 136; case 0xA3: return 135; case 0xA2: return 134; case 0xA1: return 133; case 0x9F: return 132; case 0x9E: return 131; case 0x9D: return 130; case 0x9C: return 129; case 0x9B: return 128; case 0x9A: return 127; case 0x99: return 126; case 0x98: return 125; case 0x97: return 124; case 0x96: return 123; case 0x95: return 122; case 0x94: return 121; case 0x93: return 120; case 0x92: return 119; case 0x91: return 118; case 0x8F: return 117; case 0x8E: return 116; case 0x8D: return 115; case 0x8C: return 114; case 0x8B: return 113; case 0x8A: return 112; case 0x89: return 111; case 0x88: return 110; case 0x87: return 109; case 0x86: return 108; case 0x84: return 107; case 0x83: return 106; case 0x82: return 105; case 0x7E: return 104; case 0x7D: return 103; case 0x7C: return 102; case 0x7B: return 101; case 0x7A: return 100; case 0x79: return 99; case 0x78: return 98; case 0x77: return 97; case 0x76: return 96; case 0x75: return 95; case 0x74: return 94; case 0x73: return 93; case 0x71: return 92; case 0x6F: return 91; case 0x6E: return 90; case 0x6D: return 89; case 0x6C: return 88; case 0x6B: return 87; case 0x6A: return 86; case 0x69: return 85; case 0x68: return 84; case 0x67: return 83; case 0x66: return 82; case 0x65: return 81; case 0x64: return 80; case 0x63: return 79; case 0x62: return 78; case 0x61: return 77; case 0x5F: return 76; case 0x5E: return 75; case 0x5D: return 74; case 0x5C: return 73; case 0x5B: return 72; case 0x5A: return 71; case 0x59: return 70; case 0x58: return 69; case 0x57: return 68; case 0x56: return 67; case 0x55: return 66; case 0x54: return 65; case 0x53: return 64; case 0x52: return 63; case 0x51: return 62; case 0x4F: return 61; case 0x4E: return 60; case 0x4D: return 59; case 0x4C: return 58; case 0x4B: return 57; case 0x4A: return 56; case 0x49: return 55; case 0x48: return 54; case 0x47: return 53; case 0x46: return 52; case 0x45: return 51; case 0x44: return 50; case 0x43: return 49; case 0x42: return 48; case 0x41: return 47; case 0x3F: return 46; case 0x3E: return 45; case 0x3D: return 44; case 0x3B: return 43; case 0x3A: return 42; case 0x39: return 41; case 0x38: return 40; case 0x37: return 39; case 0x36: return 38; case 0x35: return 37; case 0x34: return 36; case 0x33: return 35; case 0x32: return 34; case 0x31: return 33; case 0x29: return 32; case 0x28: return 31; case 0x27: return 30; case 0x26: return 29; case 0x25: return 28; case 0x24: return 27; case 0x23: return 26; case 0x22: return 25; case 0x21: return 24; case 0x1F: return 23; case 0x1E: return 22; case 0x1D: return 21; case 0x1B: return 20; case 0x1A: return 19; case 0x19: return 18; case 0x18: return 17; case 0x17: return 16; case 0x16: return 15; case 0x15: return 14; case 0x14: return 13; case 0x13: return 12; case 0x12: return 11; case 0x11: return 10; case 0x0F: return 9; case 0x0D: return 8; case 0x0C: return 7; case 0x0B: return 6; case 0x09: return 5; case 0x07: return 4; case 0x06: return 3; case 0x03: return 2; case 0x01: return 1; default: return 0; } } static int raveracer(int ffRaw) { switch (ffRaw) { //case 0xFE: //return 128; case 0x7E: return 123; //case 0xBE: //return 126; case 0x3E: return 122; case 0xDE: return 121; case 0x5E: return 120; case 0x9E: return 119; case 0x1E: return 118; case 0xEE: return 117; case 0x6E: return 116; case 0xAE: return 115; case 0xCE: return 114; case 0x2E: return 113; case 0x4E: return 112; case 0x8E: return 111; case 0x0E: return 110; case 0xF6: return 109; case 0x76: return 108; case 0xB6: return 107; case 0x36: return 106; case 0xD6: return 105; case 0x56: return 104; case 0x96: return 103; case 0x16: return 102; case 0xE6: return 101; case 0x66: return 100; case 0xA6: return 99; case 0xC6: return 98; case 0x26: return 97; case 0x46: return 96; case 0x86: return 95; case 0x06: return 94; case 0xFA: return 93; case 0x7A: return 92; case 0xBA: return 91; case 0x3A: return 90; case 0xDA: return 89; case 0x5A: return 88; case 0x9A: return 87; case 0x1A: return 86; case 0xEA: return 85; case 0x6A: return 84; case 0xAA: return 83; case 0xCA: return 82; case 0x2A: return 81; case 0x4A: return 80; case 0x8A: return 79; case 0x0A: return 78; case 0xF2: return 77; case 0x72: return 76; case 0xB2: return 75; case 0x32: return 74; case 0xD2: return 73; case 0x52: return 72; case 0x92: return 71; case 0x12: return 70; case 0xE2: return 69; case 0x62: return 68; case 0xA2: return 67; case 0xC2: return 66; case 0x22: return 65; case 0x42: return 64; case 0x82: return 63; case 0x02: return 62; case 0x80: return 61; case 0x40: return 60; case 0x20: return 59; case 0xC0: return 58; case 0xA0: return 57; case 0x60: return 56; case 0xE0: return 55; case 0x10: return 54; case 0x90: return 53; case 0x50: return 52; case 0xD0: return 51; case 0x30: return 50; case 0xB0: return 49; case 0x70: return 48; case 0xF0: return 47; case 0x08: return 46; case 0x88: return 45; case 0x48: return 44; case 0x28: return 43; case 0xC8: return 42; case 0xA8: return 41; case 0x68: return 40; case 0xE8: return 39; case 0x18: return 38; case 0x98: return 37; case 0x58: return 36; case 0xD8: return 35; case 0x38: return 34; case 0xB8: return 33; case 0x78: return 32; case 0xF8: return 31; case 0x04: return 30; case 0x84: return 29; case 0x44: return 28; case 0x24: return 27; case 0xC4: return 26; case 0xA4: return 25; case 0x64: return 24; case 0xE4: return 23; case 0x14: return 22; case 0x94: return 21; case 0x54: return 20; case 0xD4: return 19; case 0x34: return 18; case 0xB4: return 17; case 0x74: return 16; case 0xF4: return 15; case 0x0C: return 14; case 0x8C: return 13; case 0x4C: return 12; case 0x2C: return 11; case 0xCC: return 10; case 0xAC: return 9; case 0x6C: return 8; case 0xEC: return 7; case 0x1C: return 6; case 0x9C: return 5; case 0x5C: return 4; case 0xDC: return 3; case 0x3C: return 2; //case 0xBC: //return 3; case 0x7C: return 1; //case 0xFC: //return 1; } } UINT8 FFB; void Mame::FFBLoop(EffectConstants* constants, Helpers* helpers, EffectTriggers* triggers) { HWND hWnds = FindWindow(NULL, _T("MAME: San Francisco Rush 2049 [sf2049]")); HWND hWnd = FindWindowA(0, ("MAME: San Francisco Rush: The Rock (boot rom L 1.0, GUTS Oct 6 1997 / MAIN Oct 16 1997) [sfrushrk]")); HWND hWnd1 = FindWindowA(0, ("MAME: San Francisco Rush (boot rom L 1.0) [sfrush]")); HWND hWnd2 = FindWindowA(0, ("MAME: San Francisco Rush: The Rock (Wavenet, boot rom L 1.38, GUTS Aug 6 1997 / MAIN Aug 5 1997) [sfrushrkwo]")); HWND hWnd3 = FindWindowA(0, ("MAME: San Francisco Rush 2049: Special Edition [sf2049se]")); HWND hWnd4 = FindWindowA(0, ("MAME: Rave Racer (Rev. RV2, World) [raveracw]")); HWND hWnd5 = FindWindowA(0, ("MAME: Rave Racer (Rev. RV1 Ver.B, Japan) [raveracj]")); HWND hWnd6 = FindWindowA(0, ("MAME: Rave Racer (Rev. RV1, Japan) [raveracja]")); HWND hWnd7 = FindWindowA(0, ("MAME: San Francisco Rush (boot rom L 1.06A) [sfrusha]")); HWND hWnd8 = FindWindowA(0, ("MAME: San Francisco Rush 2049: Tournament Edition [sf2049te]")); HWND hWnd9 = FindWindowA(0, ("MAME: California Speed (Version 2.1a Apr 17 1998, GUTS 1.25 Apr 17 1998 / MAIN Apr 17 1998) [calspeed]")); HWND hWnd10 = FindWindowA(0, ("MAME: California Speed (Version 1.0r8 Mar 10 1998, GUTS Mar 10 1998 / MAIN Mar 10 1998) [calspeeda]")); HWND hWnd11 = FindWindowA(0, ("MAME: California Speed (Version 1.0r7a Mar 4 1998, GUTS Mar 3 1998 / MAIN Jan 19 1998) [calspeedb]")); HWND hWnd12 = FindWindowA(0, ("MAME: Cruis'n World (rev L2.5) [crusnwld]")); HWND hWnd13 = FindWindowA(0, ("MAME: Cruis'n World (rev L2.4) [crusnwld24]")); HWND hWnd14 = FindWindowA(0, ("MAME: Cruis'n World (rev L2.3) [crusnwld23]")); HWND hWnd15 = FindWindowA(0, ("MAME: Cruis'n World (rev L2.0) [crusnwld20]")); HWND hWnd16 = FindWindowA(0, ("MAME: Cruis'n World (rev L1.9) [crusnwld19]")); HWND hWnd17 = FindWindowA(0, ("MAME: Cruis'n World (rev L1.7) [crusnwld17]")); HWND hWnd18 = FindWindowA(0, ("MAME: Cruis'n World (rev L1.3) [crusnwld13]")); HWND hWnd19 = FindWindowA(0, ("MAME: Cruis'n USA (rev L4.1) [crusnusa]")); HWND hWnd20 = FindWindowA(0, ("MAME: Cruis'n USA (rev L4.0) [crusnusa40]")); HWND hWnd21 = FindWindowA(0, ("MAME: Cruis'n USA (rev L2.1) [crusnusa21]")); HWND hWnd22 = FindWindowA(0, ("MAME: Off Road Challenge (v1.63) [offroadc]")); HWND hWnd23 = FindWindowA(0, ("MAME: Off Road Challenge (v1.63) [offroadc]")); HWND hWnd24 = FindWindowA(0, ("MAME: Off Road Challenge (v1.40) [offroadc4]")); HWND hWnd25 = FindWindowA(0, ("MAME: Off Road Challenge (v1.30) [offroadc3]")); HWND hWnd26 = FindWindowA(0, ("MAME: Off Road Challenge (v1.10) [offroadc1]")); char MameVersionChar[256]; GetPrivateProfileStringA("Settings", "MameVersion", "", MameVersionChar, 256, ".\\FFBplugin.ini"); std::string Mame019932bit("MAME019932bit"); std::string Mame019964bit("MAME019964bit"); std::string Mame019964bitHack("MAME019964bitHack"); std::string Mame0199UI64bit("MAME0199UI64bit"); std::string Mame020632bit("MAME020632bit"); std::string Mame020664bit("MAME020664bit"); std::string Mame0206UI64bit("MAME0206UI64bit"); std::string mameversion(MameVersionChar); if ((hWnd > NULL) || (hWnd1 > NULL) || (hWnd2 > NULL) || (hWnd7 > NULL)) //Sfrush { int ffsanfranrush = 0; { if (mameversion.compare(Mame019932bit) == 0) { INT_PTR ff = helpers->ReadIntPtr(0x0096D760, true); INT_PTR ff1 = helpers->ReadIntPtr(ff + 0x34C, false); INT_PTR ff2 = helpers->ReadIntPtr(ff1 + 0x34, false); INT_PTR ff3 = helpers->ReadIntPtr(ff2 + 0x18, false); INT_PTR ff4 = helpers->ReadIntPtr(ff3 + 0x1C, false); FFB = helpers->ReadByte(ff4 + 0x70C, false); } if (mameversion.compare(Mame019964bit) == 0) { INT_PTR ff64 = helpers->ReadIntPtr(0x0C5E4FE8, true); INT_PTR ff164 = helpers->ReadIntPtr(ff64 + 0x48, false); INT_PTR ff264 = helpers->ReadIntPtr(ff164 + 0x48, false); INT_PTR ff364 = helpers->ReadIntPtr(ff264 + 0x668, false); INT_PTR ff464 = helpers->ReadIntPtr(ff364 + 0x90, false); FFB = helpers->ReadByte(ff464 + 0x764, false); } if (mameversion.compare(Mame019964bitHack) == 0) { INT_PTR ff64hack = helpers->ReadIntPtr(0x0C50CFE8, true); INT_PTR ff164hack = helpers->ReadIntPtr(ff64hack + 0x48, false); INT_PTR ff264hack = helpers->ReadIntPtr(ff164hack + 0x48, false); INT_PTR ff364hack = helpers->ReadIntPtr(ff264hack + 0x48, false); INT_PTR ff464hack = helpers->ReadIntPtr(ff364hack + 0x90, false); FFB = helpers->ReadByte(ff464hack + 0x764, false); } if (mameversion.compare(Mame0199UI64bit) == 0) { INT_PTR ff64ui = helpers->ReadIntPtr(0x0C075FB8, true); INT_PTR ff164ui = helpers->ReadIntPtr(ff64ui + 0x1A0, false); INT_PTR ff264ui = helpers->ReadIntPtr(ff164ui + 0x10, false); INT_PTR ff364ui = helpers->ReadIntPtr(ff264ui + 0x8, false); INT_PTR ff464ui = helpers->ReadIntPtr(ff364ui + 0x18, false); FFB = helpers->ReadByte(ff464ui + 0x54, false); } if (mameversion.compare(Mame020632bit) == 0) { INT_PTR ff = helpers->ReadIntPtr(0x0E2B20A4, true); INT_PTR ff1 = helpers->ReadIntPtr(ff + 0x134, false); INT_PTR ff2 = helpers->ReadIntPtr(ff1 + 0x5D8, false); INT_PTR ff3 = helpers->ReadIntPtr(ff2 + 0x564, false); FFB = helpers->ReadByte(ff3 + 0x550, false); } if (mameversion.compare(Mame020664bit) == 0) { INT_PTR ff64 = helpers->ReadIntPtr(0x0E198068, true); INT_PTR ff164 = helpers->ReadIntPtr(ff64 + 0x48, false); INT_PTR ff264 = helpers->ReadIntPtr(ff164 + 0x40, false); INT_PTR ff364 = helpers->ReadIntPtr(ff264 + 0x540, false); INT_PTR ff464 = helpers->ReadIntPtr(ff364 + 0x68, false); FFB = helpers->ReadByte(ff464 + 0x7DC, false); } if (mameversion.compare(Mame0206UI64bit) == 0) { INT_PTR ff64ui = helpers->ReadIntPtr(0x0DBCF058, true); INT_PTR ff164ui = helpers->ReadIntPtr(ff64ui + 0x48, false); INT_PTR ff264ui = helpers->ReadIntPtr(ff164ui + 0x40, false); INT_PTR ff364ui = helpers->ReadIntPtr(ff264ui + 0x5A0, false); INT_PTR ff464ui = helpers->ReadIntPtr(ff364ui + 0x8, false); FFB = helpers->ReadByte(ff464ui + 0x7DC, false); } ffsanfranrush = sanfran(FFB); if ((ffsanfranrush > 112)& (ffsanfranrush < 233)) { helpers->log("moving wheel left"); double percentForce = (233 - ffsanfranrush) / 119.0; double percentLength = 100; triggers->Rumble(0, percentForce, percentLength); triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); } else if ((ffsanfranrush > 0)& (ffsanfranrush < 113)) { helpers->log("moving wheel right"); double percentForce = (ffsanfranrush) / 112.0; double percentLength = 100; triggers->Rumble(percentForce, 0, percentLength); triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); } } } if ((hWnd4 > NULL) || (hWnd5 > NULL) || (hWnd6 > NULL)) //Rave Racer { int ffrave = 0; { if (mameversion.compare(Mame019932bit) == 0) { INT_PTR ffrave0 = helpers->ReadIntPtr(0x078D624C, true); INT_PTR ffrave1 = helpers->ReadIntPtr(ffrave0 + 0x10, false); INT_PTR ffrave2 = helpers->ReadIntPtr(ffrave1 + 0x90, false); INT_PTR ffrave3 = helpers->ReadIntPtr(ffrave2 + 0x18, false); INT_PTR ffrave4 = helpers->ReadIntPtr(ffrave3 + 0x3D8, false); FFB = helpers->ReadByte(ffrave4 + 0x42, false); } if (mameversion.compare(Mame019964bit) == 0) { INT_PTR ffrave640 = helpers->ReadIntPtr(0x0C5E4FE8, true); INT_PTR ffrave641 = helpers->ReadIntPtr(ffrave640 + 0x90, false); INT_PTR ffrave642 = helpers->ReadIntPtr(ffrave641 + 0x8, false); INT_PTR ffrave643 = helpers->ReadIntPtr(ffrave642 + 0x130, false); INT_PTR ffrave644 = helpers->ReadIntPtr(ffrave643 + 0x720, false); FFB = helpers->ReadByte(ffrave644 + 0x42, false); } if (mameversion.compare(Mame0199UI64bit) == 0) { INT_PTR ffraveui640 = helpers->ReadIntPtr(0x0C075FB8, true); INT_PTR ffraveui641 = helpers->ReadIntPtr(ffraveui640 + 0x48, false); INT_PTR ffraveui642 = helpers->ReadIntPtr(ffraveui641 + 0x48, false); INT_PTR ffraveui643 = helpers->ReadIntPtr(ffraveui642 + 0x740, false); INT_PTR ffraveui644 = helpers->ReadIntPtr(ffraveui643 + 0x1F8, false); FFB = helpers->ReadByte(ffraveui644 + 0x42, false); } if (mameversion.compare(Mame020632bit) == 0) { INT_PTR ffrave0 = helpers->ReadIntPtr(0x02426C78, true); INT_PTR ffrave1 = helpers->ReadIntPtr(ffrave0 + 0x388, false); INT_PTR ffrave2 = helpers->ReadIntPtr(ffrave1 + 0x1A0, false); INT_PTR ffrave3 = helpers->ReadIntPtr(ffrave2 + 0x358, false); FFB = helpers->ReadByte(ffrave3 + 0x40, false); } if (mameversion.compare(Mame020664bit) == 0) { INT_PTR ffrave640 = helpers->ReadIntPtr(0x0E198068, true); INT_PTR ffrave641 = helpers->ReadIntPtr(ffrave640 + 0x2E8, false); INT_PTR ffrave642 = helpers->ReadIntPtr(ffrave641 + 0x28, false); INT_PTR ffrave643 = helpers->ReadIntPtr(ffrave642 + 0x0, false); FFB = helpers->ReadByte(ffrave643 + 0x40, false); } if (mameversion.compare(Mame0206UI64bit) == 0) { INT_PTR ffraveui640 = helpers->ReadIntPtr(0x0DBCF058, true); INT_PTR ffraveui641 = helpers->ReadIntPtr(ffraveui640 + 0x48, false); INT_PTR ffraveui642 = helpers->ReadIntPtr(ffraveui641 + 0x40, false); INT_PTR ffraveui643 = helpers->ReadIntPtr(ffraveui642 + 0x2D8, false); INT_PTR ffraveui644 = helpers->ReadIntPtr(ffraveui643 + 0x630, false); FFB = helpers->ReadByte(ffraveui644 + 0x40, false); } ffrave = raveracer(FFB); } if ((ffrave > 61) && (ffrave < 124)) { helpers->log("moving wheel right"); double percentForce = (124 - ffrave) / 61.0; double percentLength = 100; triggers->Rumble(percentForce, 0, percentLength); triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); } else if ((ffrave > 0) && (ffrave < 62)) { helpers->log("moving wheel left"); double percentForce = (ffrave) / 61.0; double percentLength = 100; triggers->Rumble(0, percentForce, percentLength); triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); } } if ((hWnd3 > NULL) || (hWnd8 > NULL) || (hWnds > NULL)) //Sfrush2049 { if (mameversion.compare(Mame019932bit) == 0) { INT_PTR ff2049 = helpers->ReadIntPtr(0x078D624C, true); INT_PTR ff20491 = helpers->ReadIntPtr(ff2049 + 0x10, false); INT_PTR ff20492 = helpers->ReadIntPtr(ff20491 + 0x34, false); INT_PTR ff20493 = helpers->ReadIntPtr(ff20492 + 0x18, false); INT_PTR ff20494 = helpers->ReadIntPtr(ff20493 + 0x54, false); FFB = helpers->ReadByte(ff20494 + 0x4E8, false); } if (mameversion.compare(Mame019964bit) == 0) { INT_PTR ff204964 = helpers->ReadIntPtr(0x0C5E4FE8, true); INT_PTR ff2049164 = helpers->ReadIntPtr(ff204964 + 0x48, false); INT_PTR ff2049264 = helpers->ReadIntPtr(ff2049164 + 0x48, false); INT_PTR ff2049364 = helpers->ReadIntPtr(ff2049264 + 0x310, false); INT_PTR ff2049464 = helpers->ReadIntPtr(ff2049364 + 0x130, false); FFB = helpers->ReadByte(ff2049464 + 0x79C, false); } if (mameversion.compare(Mame0199UI64bit) == 0) { INT_PTR ff204964ui = helpers->ReadIntPtr(0x0CF9F7D0, true); INT_PTR ff2049164ui = helpers->ReadIntPtr(ff204964ui + 0x48, false); INT_PTR ff2049264ui = helpers->ReadIntPtr(ff2049164ui + 0x48, false); INT_PTR ff2049364ui = helpers->ReadIntPtr(ff2049264ui + 0x10, false); INT_PTR ff2049464ui = helpers->ReadIntPtr(ff2049364ui + 0x2D0, false); FFB = helpers->ReadByte(ff2049464ui + 0x79C, false); } if (mameversion.compare(Mame020632bit) == 0) { INT_PTR ff2049 = helpers->ReadIntPtr(0x02426C78, true); INT_PTR ff20491 = helpers->ReadIntPtr(ff2049 + 0x388, false); INT_PTR ff20492 = helpers->ReadIntPtr(ff20491 + 0x6C4, false); FFB = helpers->ReadByte(ff20492 + 0x7C, false); } if (mameversion.compare(Mame020664bit) == 0) { INT_PTR ff204964 = helpers->ReadIntPtr(0x0E198068, true); INT_PTR ff2049164 = helpers->ReadIntPtr(ff204964 + 0x48, false); INT_PTR ff2049264 = helpers->ReadIntPtr(ff2049164 + 0x40, false); INT_PTR ff2049364 = helpers->ReadIntPtr(ff2049264 + 0x540, false); FFB = helpers->ReadByte(ff2049364 + 0x7FC, false); } if (mameversion.compare(Mame0206UI64bit) == 0) { INT_PTR ff204964ui = helpers->ReadIntPtr(0x0DBCF058, true); INT_PTR ff2049164ui = helpers->ReadIntPtr(ff204964ui + 0x48, false); INT_PTR ff2049264ui = helpers->ReadIntPtr(ff2049164ui + 0x40, false); INT_PTR ff2049364ui = helpers->ReadIntPtr(ff2049264ui + 0x7F0, false); INT_PTR ff2049464ui = helpers->ReadIntPtr(ff2049364ui + 0x48, false); FFB = helpers->ReadByte(ff2049464ui + 0x62C, false); } if ((FFB > 0x80)& (FFB < 0x100)) { helpers->log("moving wheel left"); double percentForce = (255 - FFB) / 126.0; double percentLength = 100; triggers->Rumble(0, percentForce, percentLength); triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); } else if ((FFB > 0x00)& (FFB < 0x80)) { helpers->log("moving wheel right"); double percentForce = (FFB) / 126.0; double percentLength = 100; triggers->Rumble(percentForce, 0, percentLength); triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); } } if ((hWnd9 > NULL) || (hWnd10 > NULL) || (hWnd11 > NULL)) //CaliforniaSpeed { if (mameversion.compare(Mame019932bit) == 0) { INT_PTR ffcal1 = helpers->ReadIntPtr(0x078D624C, true); INT_PTR ffcal2 = helpers->ReadIntPtr(ffcal1 + 0x10, false); INT_PTR ffcal3 = helpers->ReadIntPtr(ffcal2 + 0xE4, false); INT_PTR ffcal4 = helpers->ReadIntPtr(ffcal3 + 0x4, false); INT_PTR ffcal5 = helpers->ReadIntPtr(ffcal4 + 0xC, false); FFB = helpers->ReadByte(ffcal5 + 0x1F8, false); } if (mameversion.compare(Mame019964bit) == 0) { INT_PTR ffcal164 = helpers->ReadIntPtr(0x0C5E4FE8, true); INT_PTR ffcal264 = helpers->ReadIntPtr(ffcal164 + 0x48, false); INT_PTR ffcal364 = helpers->ReadIntPtr(ffcal264 + 0x48, false); INT_PTR ffcal464 = helpers->ReadIntPtr(ffcal364 + 0x310, false); INT_PTR ffcal564 = helpers->ReadIntPtr(ffcal464 + 0x398, false); FFB = helpers->ReadByte(ffcal564 + 0x5AC, false); } if (mameversion.compare(Mame0199UI64bit) == 0) { INT_PTR ffcal164ui = helpers->ReadIntPtr(0x0C075FB8, true); INT_PTR ffcal264ui = helpers->ReadIntPtr(ffcal164ui + 0x48, false); INT_PTR ffcal364ui = helpers->ReadIntPtr(ffcal264ui + 0x48, false); INT_PTR ffcal464ui = helpers->ReadIntPtr(ffcal364ui + 0x140, false); INT_PTR ffcal564ui = helpers->ReadIntPtr(ffcal464ui + 0x408, false); FFB = helpers->ReadByte(ffcal564ui + 0x5AC, false); } if (mameversion.compare(Mame020632bit) == 0) { INT_PTR ffcal1 = helpers->ReadIntPtr(0x02426C78, true); INT_PTR ffcal2 = helpers->ReadIntPtr(ffcal1 + 0x388, false); INT_PTR ffcal3 = helpers->ReadIntPtr(ffcal2 + 0x640, false); FFB = helpers->ReadByte(ffcal3 + 0x104, false); } if (mameversion.compare(Mame020664bit) == 0) { INT_PTR ffcal164 = helpers->ReadIntPtr(0x0E198068, true); INT_PTR ffcal264 = helpers->ReadIntPtr(ffcal164 + 0x48, false); INT_PTR ffcal364 = helpers->ReadIntPtr(ffcal264 + 0x40, false); INT_PTR ffcal464 = helpers->ReadIntPtr(ffcal364 + 0x570, false); FFB = helpers->ReadByte(ffcal464 + 0x7E4, false); } if (mameversion.compare(Mame0206UI64bit) == 0) { INT_PTR ffcal164ui = helpers->ReadIntPtr(0x0DBCF058, true); INT_PTR ffcal264ui = helpers->ReadIntPtr(ffcal164ui + 0x48, false); INT_PTR ffcal364ui = helpers->ReadIntPtr(ffcal264ui + 0x40, false); INT_PTR ffcal464ui = helpers->ReadIntPtr(ffcal364ui + 0x5A0, false); FFB = helpers->ReadByte(ffcal464ui + 0x7B4, false); } if ((FFB > 0x80)& (FFB < 0x100)) { helpers->log("moving wheel left"); double percentForce = (255 - FFB) / 126.0; double percentLength = 100; triggers->Rumble(0, percentForce, percentLength); triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); } else if ((FFB > 0x00)& (FFB < 0x80)) { helpers->log("moving wheel right"); double percentForce = (FFB) / 126.0; double percentLength = 100; triggers->Rumble(percentForce, 0, percentLength); triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); } } if ((hWnd12 > NULL) || (hWnd13 > NULL) || (hWnd14 > NULL) || (hWnd15 > NULL) || (hWnd16 > NULL) || (hWnd17 > NULL) || (hWnd18 > NULL)) { int ffcrusnwld = 0; { if (mameversion.compare(Mame019932bit) == 0) { INT_PTR ffcru1 = helpers->ReadIntPtr(0x0C61E0A4, true); INT_PTR ffcru2 = helpers->ReadIntPtr(ffcru1 + 0x134, false); INT_PTR ffcru3 = helpers->ReadIntPtr(ffcru2 + 0x2E8, false); INT_PTR ffcru4 = helpers->ReadIntPtr(ffcru3 + 0x0, false); INT_PTR ffcru5 = helpers->ReadIntPtr(ffcru4 + 0x20, false); FFB = helpers->ReadByte(ffcru5 + 0x5A0, false); } if (mameversion.compare(Mame019964bit) == 0) { INT_PTR ffcru164 = helpers->ReadIntPtr(0x0C5E4FE8, true); INT_PTR ffcru264 = helpers->ReadIntPtr(ffcru164 + 0x48, false); INT_PTR ffcru364 = helpers->ReadIntPtr(ffcru264 + 0x48, false); INT_PTR ffcru464 = helpers->ReadIntPtr(ffcru364 + 0xF0, false); INT_PTR ffcru564 = helpers->ReadIntPtr(ffcru464 + 0x1F0, false); FFB = helpers->ReadByte(ffcru564 + 0x774, false); } if (mameversion.compare(Mame0199UI64bit) == 0) { INT_PTR ffcru1ui = helpers->ReadIntPtr(0x0C075FB8, true); INT_PTR ffcru2ui = helpers->ReadIntPtr(ffcru1ui + 0x48, false); INT_PTR ffcru3ui = helpers->ReadIntPtr(ffcru2ui + 0x48, false); INT_PTR ffcru4ui = helpers->ReadIntPtr(ffcru3ui + 0xF0, false); INT_PTR ffcru5ui = helpers->ReadIntPtr(ffcru4ui + 0x1F0, false); FFB = helpers->ReadByte(ffcru5ui + 0x774, false); } if (mameversion.compare(Mame020632bit) == 0) { INT_PTR ffcru1 = helpers->ReadIntPtr(0x02426C78, true); INT_PTR ffcru2 = helpers->ReadIntPtr(ffcru1 + 0x290, false); INT_PTR ffcru3 = helpers->ReadIntPtr(ffcru2 + 0x650, false); FFB = helpers->ReadByte(ffcru3 + 0x248, false); } if (mameversion.compare(Mame020664bit) == 0) { INT_PTR ffcru164 = helpers->ReadIntPtr(0x0E198068, true); INT_PTR ffcru264 = helpers->ReadIntPtr(ffcru164 + 0xB8, false); INT_PTR ffcru364 = helpers->ReadIntPtr(ffcru264 + 0x8, false); INT_PTR ffcru464 = helpers->ReadIntPtr(ffcru364 + 0x0, false); INT_PTR ffcru564 = helpers->ReadIntPtr(ffcru464 + 0x0, false); FFB = helpers->ReadByte(ffcru564 + 0x54, false); } if (mameversion.compare(Mame0206UI64bit) == 0) { INT_PTR ffcru1ui = helpers->ReadIntPtr(0x0DBCF058, true); INT_PTR ffcru2ui = helpers->ReadIntPtr(ffcru1ui + 0x48, false); INT_PTR ffcru3ui = helpers->ReadIntPtr(ffcru2ui + 0x40, false); INT_PTR ffcru4ui = helpers->ReadIntPtr(ffcru3ui + 0x10, false); INT_PTR ffcru5ui = helpers->ReadIntPtr(ffcru4ui + 0x2B8, false); FFB = helpers->ReadByte(ffcru5ui + 0x7A4, false); } ffcrusnwld = crusnwld(FFB); if ((ffcrusnwld > 110)& (ffcrusnwld < 226)) { helpers->log("moving wheel left"); double percentForce = (225 - FFB) / 114.0; double percentLength = 100; triggers->Rumble(0, percentForce, percentLength); triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); } else if ((ffcrusnwld > 0)& (ffcrusnwld < 111)) { helpers->log("moving wheel right"); double percentForce = (FFB) / 110.0; double percentLength = 100; triggers->Rumble(percentForce, 0, percentLength); triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); } } } if ((hWnd19 > NULL) || (hWnd20 > NULL) || (hWnd21 > NULL)) //Crusn USA { int ffcrusnusa = 0; { if (mameversion.compare(Mame019932bit) == 0) { INT_PTR ffcru1 = helpers->ReadIntPtr(0x0C61E0A4, true); INT_PTR ffcru2 = helpers->ReadIntPtr(ffcru1 + 0x134, false); INT_PTR ffcru3 = helpers->ReadIntPtr(ffcru2 + 0x2E8, false); INT_PTR ffcru4 = helpers->ReadIntPtr(ffcru3 + 0x0, false); INT_PTR ffcru5 = helpers->ReadIntPtr(ffcru4 + 0x20, false); FFB = helpers->ReadByte(ffcru5 + 0x5A0, false); } if (mameversion.compare(Mame019964bit) == 0) { INT_PTR ffcru164 = helpers->ReadIntPtr(0x0C5E4FE8, true); INT_PTR ffcru264 = helpers->ReadIntPtr(ffcru164 + 0x48, false); INT_PTR ffcru364 = helpers->ReadIntPtr(ffcru264 + 0x48, false); INT_PTR ffcru464 = helpers->ReadIntPtr(ffcru364 + 0xF0, false); INT_PTR ffcru564 = helpers->ReadIntPtr(ffcru464 + 0x1F0, false); FFB = helpers->ReadByte(ffcru564 + 0x774, false); } if (mameversion.compare(Mame0199UI64bit) == 0) { INT_PTR ffcru1ui = helpers->ReadIntPtr(0x0C075FB8, true); INT_PTR ffcru2ui = helpers->ReadIntPtr(ffcru1ui + 0x48, false); INT_PTR ffcru3ui = helpers->ReadIntPtr(ffcru2ui + 0x48, false); INT_PTR ffcru4ui = helpers->ReadIntPtr(ffcru3ui + 0xF0, false); INT_PTR ffcru5ui = helpers->ReadIntPtr(ffcru4ui + 0x1F0, false); FFB = helpers->ReadByte(ffcru5ui + 0x774, false); } if (mameversion.compare(Mame020632bit) == 0) { INT_PTR ffcru1 = helpers->ReadIntPtr(0x02426C78, true); INT_PTR ffcru2 = helpers->ReadIntPtr(ffcru1 + 0x290, false); INT_PTR ffcru3 = helpers->ReadIntPtr(ffcru2 + 0x650, false); FFB = helpers->ReadByte(ffcru3 + 0x248, false); } if (mameversion.compare(Mame020664bit) == 0) { INT_PTR ffcru164 = helpers->ReadIntPtr(0x0E198068, true); INT_PTR ffcru264 = helpers->ReadIntPtr(ffcru164 + 0xB8, false); INT_PTR ffcru364 = helpers->ReadIntPtr(ffcru264 + 0x8, false); INT_PTR ffcru464 = helpers->ReadIntPtr(ffcru364 + 0x0, false); INT_PTR ffcru564 = helpers->ReadIntPtr(ffcru464 + 0x0, false); FFB = helpers->ReadByte(ffcru564 + 0x54, false); } if (mameversion.compare(Mame0206UI64bit) == 0) { INT_PTR ffcru1ui = helpers->ReadIntPtr(0x0DBCF058, true); INT_PTR ffcru2ui = helpers->ReadIntPtr(ffcru1ui + 0x48, false); INT_PTR ffcru3ui = helpers->ReadIntPtr(ffcru2ui + 0x40, false); INT_PTR ffcru4ui = helpers->ReadIntPtr(ffcru3ui + 0x10, false); INT_PTR ffcru5ui = helpers->ReadIntPtr(ffcru4ui + 0x2B8, false); FFB = helpers->ReadByte(ffcru5ui + 0x7A4, false); } ffcrusnusa = crusnusa(FFB); if ((ffcrusnusa > 104) & (ffcrusnusa < 215)) { helpers->log("moving wheel left"); double percentForce = (215 - FFB) / 110.0; double percentLength = 100; triggers->Rumble(0, percentForce, percentLength); triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); } else if ((ffcrusnusa > 0) & (ffcrusnusa < 105)) { helpers->log("moving wheel right"); double percentForce = (FFB) / 104.0; double percentLength = 100; triggers->Rumble(percentForce, 0, percentLength); triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); } } } if ((hWnd22 > NULL) || (hWnd23 > NULL) || (hWnd24 > NULL) || (hWnd25 > NULL) || (hWnd26 > NULL)) //OffRoadChallenge { if (mameversion.compare(Mame019932bit) == 0) { INT_PTR ffoff1 = helpers->ReadIntPtr(0x0C61E0A4, true); INT_PTR ffoff2 = helpers->ReadIntPtr(ffoff1 + 0x60, false); INT_PTR ffoff3 = helpers->ReadIntPtr(ffoff2 + 0x4, false); INT_PTR ffoff4 = helpers->ReadIntPtr(ffoff3 + 0x40, false); INT_PTR ffoff5 = helpers->ReadIntPtr(ffoff4 + 0x0, false); FFB = helpers->ReadByte(ffoff5 + 0x3C, false); } if (mameversion.compare(Mame019964bit) == 0) { INT_PTR ffoff164 = helpers->ReadIntPtr(0x0C5E4FE8, true); INT_PTR ffoff264 = helpers->ReadIntPtr(ffoff164 + 0xB8, false); INT_PTR ffoff364 = helpers->ReadIntPtr(ffoff264 + 0x8, false); INT_PTR ffoff464 = helpers->ReadIntPtr(ffoff364 + 0x0, false); INT_PTR ffoff564 = helpers->ReadIntPtr(ffoff464 + 0x0, false); FFB = helpers->ReadByte(ffoff564 + 0x54, false); } if (mameversion.compare(Mame0199UI64bit) == 0) { INT_PTR ffoff164UI = helpers->ReadIntPtr(0x0C075FB8, true); INT_PTR ffoff264UI = helpers->ReadIntPtr(ffoff164UI + 0xB8, false); INT_PTR ffoff364UI = helpers->ReadIntPtr(ffoff264UI + 0x8, false); INT_PTR ffoff464UI = helpers->ReadIntPtr(ffoff364UI + 0x40, false); INT_PTR ffoff564UI = helpers->ReadIntPtr(ffoff464UI + 0x0, false); FFB = helpers->ReadByte(ffoff564UI + 0x54, false); } if (mameversion.compare(Mame020632bit) == 0) { INT_PTR ffoff1 = helpers->ReadIntPtr(0x02426C78, true); INT_PTR ffoff2 = helpers->ReadIntPtr(ffoff1 + 0x290, false); INT_PTR ffoff3 = helpers->ReadIntPtr(ffoff2 + 0x650, false); FFB = helpers->ReadByte(ffoff3 + 0x248, false); } if (mameversion.compare(Mame020664bit) == 0) { INT_PTR ffoff164 = helpers->ReadIntPtr(0x0E198068, true); INT_PTR ffoff264 = helpers->ReadIntPtr(ffoff164 + 0x48, false); INT_PTR ffoff364 = helpers->ReadIntPtr(ffoff264 + 0x40, false); INT_PTR ffoff464 = helpers->ReadIntPtr(ffoff364 + 0x120, false); INT_PTR ffoff564 = helpers->ReadIntPtr(ffoff464 + 0x1A8, false); FFB = helpers->ReadByte(ffoff564 + 0x7A4, false); } if (mameversion.compare(Mame0206UI64bit) == 0) { INT_PTR ffoff164UI = helpers->ReadIntPtr(0x0DBCF058, true); INT_PTR ffoff264UI = helpers->ReadIntPtr(ffoff164UI + 0x48, false); INT_PTR ffoff364UI = helpers->ReadIntPtr(ffoff264UI + 0x40, false); INT_PTR ffoff464UI = helpers->ReadIntPtr(ffoff364UI + 0x588, false); FFB = helpers->ReadByte(ffoff464UI + 0x4CC, false); } if ((FFB > 0x83)& (FFB < 0x100)) { helpers->log("moving wheel left"); double percentForce = (255 - FFB) / 124.0; double percentLength = 100; triggers->Rumble(0, percentForce, percentLength); triggers->Constant(constants->DIRECTION_FROM_RIGHT, percentForce); } else if ((FFB > 0x00)& (FFB < 0x7D)) { helpers->log("moving wheel right"); double percentForce = (FFB) / 124.0; double percentLength = 100; triggers->Rumble(percentForce, 0, percentLength); triggers->Constant(constants->DIRECTION_FROM_LEFT, percentForce); } } }