//The Adventures of Tintin: The Secret of the Unicorn Autosplitter by blazie //version 1.4.1 for both game versions date 20. 11. 2024 Changes: Fixed some splitting issues state("TINTIN"){ bool cutscene: "binkw32.dll", 0x2A91C; // direct, true if the game is playing a video cutscene (bink) bool loadRemove: "TINTIN.exe", 0x000223DC, 0x7D4; // pointer float posX: "TINTIN.exe", 0x5EE5F8; // direct float posY: "TINTIN.exe", 0x005FEBAC, 0x1CC, 0xEDC; // pointer float posZ: "TINTIN.exe", 0x5EE660; // direct } startup{ settings.Add("S", true, "Batch Split (split after exiting the book screen)"); settings.Add("BOOK1", true, "After 1st Batch of chapters (Flea Market)", "S"); settings.Add("BOOK2", true, "After 2nd Batch of chapters (Moulinsart)", "S"); settings.Add("BOOK3", true, "After 3rd Batch of chapters (Karaboudjan)", "S"); settings.Add("BOOK4", true, "After 4th Batch of chapters (Bagghar)", "S"); settings.Add("BOOK5", true, "After 5th Batch of chapters (Brittany)", "S"); settings.Add("ES", false, "In-Chapter Splits"); settings.Add("MS1", true, "Moulinsart: The Salons", "ES"); settings.Add("KB1", true, "Karaboudjan: Up to the Wheelhouse (after cutscene)", "ES"); settings.Add("KB2", true, "Karaboudjan: The Shipwreck (after cutscene)", "ES"); settings.Add("BH1", true, "Bagghar: Find an Entrance to the Palace", "ES"); settings.Add("BH2", true, "Bagghar: Omar Ben Salaad's Palace (underground)", "ES"); settings.Add("BH3", true, "Bagghar: Palace Roofs", "ES"); settings.Add("BH4", true, "Bagghar: After opening the Unicorn", "ES"); settings.Add("BH5", true, "Bagghar: Escape from the Palace", "ES"); settings.Add("BT1", true, "Brittany: After reuniting with Haddock", "ES"); settings.Add("BT2", true, "Brittany: Climbing the tower (after cutscene)", "ES"); settings.Add("BT3", true, "Brittany: Looking for Haddock (after parrot sequence)", "ES"); settings.Add("BT4", true, "Brittany: After Allan bossfight", "ES"); settings.Add("BT5", true, "Brittany: Cutscene after discovering the coordinates", "ES"); settings.Add("FINS", false, "Individual chapter final splits (split when reaching the book screen)"); settings.Add("FMFin", true, "Flea Market", "FINS"); settings.Add("MSFin", true, "Moulinsart", "FINS"); settings.Add("KBFin", true, "Karaboudjan", "FINS"); settings.Add("BHFin", true, "Bagghar", "FINS"); settings.Add("BTFin", true, "Brittany", "FINS"); } init{ vars.splitTriggered = false; // if this is set true, all flags reset and it sets itself to false again vars.bookFleaMarket = false; vars.bookMoulinsart = false; vars.bookKaraboudjan = false; vars.bookBagghar = false; vars.bookBrittany = false; vars.finalSplit = false; vars.gameFinished = false; vars.splitMS1 = false; vars.splitKB1 = false; vars.splitKB2 = false; vars.splitBH1 = false; vars.splitBH2 = false; vars.splitBH3 = false; vars.splitBH4 = false; vars.splitBH5 = false; vars.splitBT1 = false; vars.splitBT2 = false; vars.splitBT3 = false; vars.splitBT4 = false; vars.splitBT5 = false; vars.E1splitted = false; // these just check for logic conflicts with two book splits vars.E2splitted = false; vars.E3splitted = false; vars.E4splitted = false; vars.E5splitted = false; } update{ if (vars.splitTriggered == true) { vars.splitTriggered = false; vars.bookFleaMarket = false; vars.bookMoulinsart = false; vars.bookKaraboudjan = false; vars.bookBagghar = false; vars.bookBrittany = false; vars.finalSplit = false; vars.gameFinished = false; vars.splitMS1 = false; vars.splitKB1 = false; vars.splitKB2 = false; vars.splitBH1 = false; vars.splitBH2 = false; vars.splitBH3 = false; vars.splitBH4 = false; vars.splitBH5 = false; vars.splitBT1 = false; vars.splitBT2 = false; vars.splitBT3 = false; vars.splitBT4 = false; vars.splitBT5 = false; vars.E1splitted = false; vars.E2splitted = false; vars.E3splitted = false; vars.E4splitted = false; vars.E5splitted = false; } //BOOK SPLITS //Flea Market if (current.posX > 7 && current.posX < 7.4 && current.posY > 5.9 && current.posY < 6.1 && current.posZ > 8 && current.posZ < 8.2 && vars.bookFleaMarket == false) { vars.bookFleaMarket = true; } //Moulinsart if (current.posX > -25 && current.posX < -21 && current.posY > -8 && current.posY < -7 && current.posZ > -110 && current.posZ < -100 && vars.bookMoulinsart == false) { vars.bookMoulinsart = true; } //Karaboudjan if (current.posX > -250 && current.posX < -50 && current.posY > 625 && current.posY < 825 && current.posZ > -1600 && current.posZ < -1400 && vars.bookKaraboudjan == false) { vars.bookKaraboudjan = true; } //Bagghar if (current.posX > 3300 && current.posX < 3500 && current.posY > 300 && current.posY < 500 && current.posZ > -300 && current.posZ < -100 && vars.bookBagghar == false) { vars.bookBagghar = true; } //Brittany if (current.posX > 100 && current.posX < 200 && current.posY > 160 && current.posY < 220 && current.posZ > -270 && current.posZ < -210 && vars.bookBrittany == false) { vars.bookBrittany = true; } //Final Split if (current.posX > 308 && current.posX < 312 && current.posY > -16 && current.posY < -14 && current.posZ > -11 && current.posZ < -7 && vars.finalSplit == false && vars.gameFinished == false) { vars.finalSplit = true; } //ADDITIONAL SPLITS if ((current.posX > 233 && current.posX < 243 && // MS1 current.posY > 32 && current.posY < 35 && current.posZ > 1.8 && current.posZ < 2.2) && vars.splitMS1 == false) { vars.splitMS1 = true; } if ((current.posX > 31 && current.posX < 34 && // KB1 current.posY > -7 && current.posY < -4 && current.posZ > -38 && current.posZ < -33) && vars.splitKB1 == false) { vars.splitKB1 = true; } if ((current.posX > -6 && current.posX < 10 && // KB2 current.posY > 0 && current.posY < 10 && current.posZ > 85 && current.posZ < 95) && vars.splitKB2 == false) { vars.splitKB2 = true; } if ((current.posX > 50 && current.posX < 85 && // BH1 current.posY > 15 && current.posY < 25 && current.posZ > -410 && current.posZ < -370) && vars.splitBH1 == false) { vars.splitBH1 = true; } if ((current.posX > 100 && current.posX < 105 && // BH2 current.posY > -65 && current.posY < -50 && current.posZ > 6 && current.posZ < 8) && vars.splitBH2 == false) { vars.splitBH2 = true; } if ((current.posX > 125 && current.posX < 135 && // BH3 current.posY > 75 && current.posY < 85 && current.posZ > 5 && current.posZ < 7) && vars.splitBH3 == false) { vars.splitBH3 = true; } if ((current.posX > 275 && current.posX < 285 && // BH4 (primes all the way back at the start of the Allan bossfight, since the unicorn coords were very common) current.posY > -35 && current.posY < -25 && current.posZ > 0 && current.posZ < 3) && vars.splitBH4 == false) { vars.splitBH4 = true; } if ((current.posX > -40 && current.posX < -30 && // BH5 current.posY > -1 && current.posY < 1 && current.posZ > 155 && current.posZ < 170) && vars.splitBH5 == false) { vars.splitBH5 = true; } if ((current.posX > 360 && current.posX < 370 && // BT1 current.posY > 34 && current.posY < 38 && current.posZ > 9 && current.posZ < 13) && vars.splitBT1 == false) { vars.splitBT1 = true; } if ((current.posX > 278 && current.posX < 288 && // BT2 current.posY > -50 && current.posY < -39 && current.posZ > 17 && current.posZ < 23) && vars.splitBT2 == false && current.cutscene == false) { vars.splitBT2 = true; } if ((current.posX > 520 && current.posX < 530 && // BT3 current.posY > 55 && current.posY < 65 && current.posZ > 8 && current.posZ < 10) && vars.splitBT3 == false) { vars.splitBT3 = true; } if ((current.posX > 279 && current.posX < 283 && // BT4 current.posY > -43 && current.posY < -39 && current.posZ > 11 && current.posZ < 14) && vars.splitBT4 == false) { vars.splitBT4 = true; } if ((current.posX > 0 && current.posX < 3 && // BT5 current.posY > 2 && current.posY < 4 && current.posZ > 50 && current.posZ < 54) && vars.splitBT5 == false) { vars.splitBT5 = true; } } start{ return current.cutscene && !old.cutscene; } split{ // Ending split if (vars.finalSplit == true && current.cutscene == true) { vars.finalSplit = false; vars.gameFinished = true; vars.splitTriggered = true; return true; } //BOOK SPLITS if ( (old.posX > 22 && old.posX < 22.5 && // Checks for book coordinates old.posY > 13 && old.posY < 13.1 && old.posZ > 14.8 && old.posZ < 15) && (current.posX < 22 || current.posX > 22.5 || current.posY < 13 || current.posY > 13.1 || current.posZ < 14.8 || current.posZ > 15)) { // Flea Market if (vars.bookFleaMarket == true && settings["BOOK1"]) { vars.bookFleaMarket = false; vars.splitTriggered = true; return settings["BOOK1"]; } // Moulinsart else if (vars.bookMoulinsart == true && settings["BOOK2"]) { vars.bookMoulinsart = false; vars.splitTriggered = true; return settings["BOOK2"]; } // Karaboudjan else if (vars.bookKaraboudjan == true && settings["BOOK3"]) { vars.bookKaraboudjan = false; vars.splitTriggered = true; return settings["BOOK3"]; } //Bagghar else if (vars.bookBagghar == true && settings["BOOK4"]) { vars.bookBagghar = false; vars.splitTriggered = true; return settings["BOOK4"]; } //Brittany else if (vars.bookBrittany == true && settings["BOOK5"]) { vars.bookBrittany = false; vars.splitTriggered = true; return settings["BOOK5"]; } } // INDIVIDUAL CHAPTERS FINAL SPLITS if(old.posX > 22 && old.posX < 22.5 && // Checks for book coordinates old.posY > 13 && old.posY < 13.1 && old.posZ > 14.8 && old.posZ < 15 ) { // Flea Market if (vars.bookFleaMarket == true && settings["FMFin"] && !vars.E1splitted) { if (!settings["BOOK1"]){ vars.bookFleaMarket = false; vars.splitTriggered = true;} vars.E1splitted = true; return settings["FMFin"]; } // Moulinsart else if (vars.bookMoulinsart == true && settings["MSFin"] && !vars.E2splitted) { if (!settings["BOOK2"]){ vars.bookMoulinsart = false; vars.splitTriggered = true;} vars.E2splitted = true; return settings["MSFin"]; } // Karaboudjan else if (vars.bookKaraboudjan == true && settings["KBFin"] && !vars.E3splitted) { if (!settings["BOOK3"]){ vars.bookKaraboudjan = false; vars.splitTriggered = true;} vars.E3splitted = true; return settings["KBFin"]; } //Bagghar else if (vars.bookBagghar == true && settings["BHFin"] && !vars.E4splitted) { if (!settings["BOOK4"]){ vars.bookBagghar = false; vars.splitTriggered = true;} vars.E4splitted = true; return settings["BHFin"]; } //Brittany else if (vars.bookBrittany == true && settings["BTFin"] && !vars.E5splitted) { if (!settings["BOOK5"]){ vars.bookBrittany = false; vars.splitTriggered = true;} vars.E5splitted = true; return settings["BTFin"]; } } // IN-CHAPTER SPLITS if ( (current.posX > 10 && current.posX < 12 && // MS1 current.posY > -1 && current.posY < 1 && current.posZ > 5 && current.posZ < 7) && vars.splitMS1 == true) { vars.splitMS1 = false; vars.splitTriggered = true; return settings["MS1"]; } if ( (current.posX > 2 && current.posX < 3 && // KB1 current.posY > 0 && current.posY < 1 && current.posZ > 3 && current.posZ < 5) && vars.splitKB1 == true) { vars.splitKB1 = false; vars.splitTriggered = true; return settings["KB1"]; } if ( (current.posX > -59 && current.posX < -55 && // KB2 current.posY > -1 && current.posY < 1 && current.posZ > 7 && current.posZ < 8) && vars.splitKB2 == true) { vars.splitKB2 = false; vars.splitTriggered = true; return settings["KB2"]; } if ( (current.posX > -755 && current.posX < -735 && // BH1 current.posY > -10 && current.posY < -7 && current.posZ > 945 && current.posZ < 965) && vars.splitBH1 == true) { vars.splitBH1 = false; vars.splitTriggered = true; return settings["BH1"]; } if ( (current.posX > -195 && current.posX < -185 && // BH2 current.posY > 35 && current.posY < 45 && current.posZ > 9 && current.posZ < 11) && vars.splitBH2 == true) { vars.splitBH2 = false; vars.splitTriggered = true; return settings["BH2"]; } if ( (current.posX > -70 && current.posX < -60 && // BH3 current.posY > -4 && current.posY < 0 && current.posZ > -1 && current.posZ < 1) && vars.splitBH3 == true) { vars.splitBH3 = false; vars.splitTriggered = true; return settings["BH3"]; } if ( (current.posX > -135 && current.posX < -125 && // BH4 current.posY > 6 && current.posY < 8 && current.posZ > 1 && current.posZ < 3) && vars.splitBH4 == true) { vars.splitBH4 = false; vars.splitTriggered = true; return settings["BH4"]; } if ( (current.posX > -375 && current.posX < -365 && // BH5 current.posY > -25 && current.posY < -15 && current.posZ > -110 && current.posZ < -95) && vars.splitBH5 == true) { vars.splitBH5 = false; vars.splitTriggered = true; return settings["BH5"]; } if ( (current.posX > 6 && current.posX < 8 && // BT1 current.posY > 50 && current.posY < 56 && current.posZ > 7 && current.posZ < 9) && vars.splitBT1 == true) { vars.splitBT1 = false; vars.splitTriggered = true; return settings["BT1"]; } if ( (current.posX > 278 && current.posX < 288 && // BT2, works differently (starts at a cutscene) current.posY > -50 && current.posY < -39 && current.posZ > 17 && current.posZ < 23) && vars.splitBT2 == true && current.cutscene == true) { vars.splitBT2 = false; vars.splitTriggered = true; return settings["BT2"]; } if ( (current.posX > -4 && current.posX < 0 && // BT3 current.posY > 1 && current.posY < 2 && current.posZ > 21 && current.posZ < 25) && vars.splitBT3 == true) { vars.splitBT3 = false; vars.splitTriggered = true; return settings["BT3"]; } if ( (current.posX > 71 && current.posX < 73 && // BT4 current.posY > 7.5 && current.posY < 8.5 && current.posZ > 9 && current.posZ < 11) && vars.splitBT4 == true) { vars.splitBT4 = false; vars.splitTriggered = true; return settings["BT4"]; } if ( (current.posX > 1 && current.posX < 1.5 && // BT5 current.posY > 0 && current.posY < 0.5 && current.posZ > 0 && current.posZ < 1) && vars.splitBT5 == true && current.cutscene == true) { vars.splitBT5 = false; vars.splitTriggered = true; return settings["BT5"]; } } isLoading{ return current.loadRemove && !current.cutscene; } onReset{ vars.splitTriggered = true; vars.gameFinished = false; } exit{ vars.splitTriggered = true; vars.gameFinished = false; }