// Silent Hill 2 PC Enhanced Edition - Auto Splitter // Category: Any% Main Game - Dog Ending state("sh2pc", "PAL") { float GameTimer: 0x19BEB94; byte RoomID: 0x6C7228; byte GameplayEvent: 0x532178; byte Campaign: 0x19BC00C; byte CutsceneID: 0x1B7A7C4; uint Inventory0: 0x1B7A7E0; uint Inventory1: 0x1B7A7E4; uint Inventory2: 0x1B7A7E8; } state("sh2pc", "NTSC") { float GameTimer: 0x19BBF94; byte RoomID: 0x6C7228; byte GameplayEvent: 0x532178; byte Campaign: 0x19BC00C; byte CutsceneID: 0x1B7A7C4; uint Inventory0: 0x1B7A7E0; uint Inventory1: 0x1B7A7E4; uint Inventory2: 0x1B7A7E8; } state("sh2pc", "Faulty NTSC") { float GameTimer: 0x19BFB94; byte RoomID: 0x6C7228; byte GameplayEvent: 0x532178; byte Campaign: 0x19BC00C; byte CutsceneID: 0x1B7A7C4; uint Inventory0: 0x1B7A7E0; uint Inventory1: 0x1B7A7E4; uint Inventory2: 0x1B7A7E8; } state("sh2pc", "WSF or cracked NTSC") { float GameTimer: 0x19BBF94; byte RoomID: 0x6C7228; byte GameplayEvent: 0x532178; byte Campaign: 0x19BC00C; byte CutsceneID: 0x1B7A7C4; uint Inventory0: 0x1B7A7E0; uint Inventory1: 0x1B7A7E4; uint Inventory2: 0x1B7A7E8; } startup { // Room splits settings.Add("rooms", true, "Room Splits"); settings.Add("r_observatory", true, "Observatory [R2]", "rooms"); settings.Add("r_forest", true, "Forest / Cemetery [R3]", "rooms"); settings.Add("r_eastsv", true, "East South Vale [R4]", "rooms"); settings.Add("r_woodside", true, "Wood Side Apartments [R16]","rooms"); settings.Add("r_bluecreek", true, "Blue Creek Apts [R39]", "rooms"); settings.Add("r_westsv", true, "West South Vale [R8]", "rooms"); settings.Add("r_hospital", true, "Brookhaven Hospital [R51]","rooms"); settings.Add("r_historical", true, "Historical Society [R92]", "rooms"); settings.Add("r_prison", true, "Toluca Prison [R103]", "rooms"); settings.Add("r_labyrinth", true, "The Labyrinth [R132]", "rooms"); settings.Add("r_eddie", true, "Eddie Boss [R143]", "rooms"); settings.Add("r_hotel", true, "Lake View Hotel [R146]", "rooms"); settings.Add("r_ph_boss", true, "Pyramid Head Boss [R172]", "rooms"); settings.Add("r_dog_room", true, "Dog Ending Room [R189]", "rooms"); settings.Add("items", true, "Item Splits"); // INV0 settings.Add("i0_radio", true, "Radio", "items"); settings.Add("i0_handgun", true, "Handgun", "items"); settings.Add("i0_flashlight", true, "Flashlight", "items"); settings.Add("i0_ws_key", true, "WoodSide Apartments Key", "items"); settings.Add("i0_202_key", true, "202 Room Key", "items"); settings.Add("i0_clock_key", true, "Clock Key", "items"); settings.Add("i0_yard_key", true, "Courtyard Key", "items"); settings.Add("i0_escape_key", true, "Fire Escape Key", "items"); settings.Add("i0_lyne_key", true, "Lyne House Key", "items"); settings.Add("i0_ang_knife", true, "Angela's Knife", "items"); settings.Add("i0_dog_key", true, "Dog Key", "items"); settings.Add("i0_lauras_ltr", true, "Laura's Letter", "items"); settings.Add("i0_video_tape", true, "Video Tape", "items"); // INV1 settings.Add("i1_canned", true, "Canned Juice", "items"); settings.Add("i1_coin_snake", true, "Coin [Snake]", "items"); settings.Add("i1_coin_old", true, "Coin [Old Man]", "items"); settings.Add("i1_coin_pris", true, "Coin [Prisoner]", "items"); settings.Add("i1_roof_key", true, "Roof Key", "items"); settings.Add("i1_bull_key", true, "Purple Bull Key", "items"); settings.Add("i1_lapis_key", true, "Lapis Eye Key", "items"); settings.Add("i1_elev_key", true, "Elevator Key", "items"); settings.Add("i1_bsmt_key", true, "Basement Storeroom Key", "items"); settings.Add("i1_lobby_key", true, "Hospital Lobby Key", "items"); settings.Add("i1_bronze_key", true, "Old Bronze Key", "items"); settings.Add("i1_spiral_key", true, "Spiral Writing Key", "items"); settings.Add("i1_pers_key", true, "Key of Persecuted", "items"); settings.Add("i1_dry_cell", true, "Dry Cell Battery", "items"); settings.Add("i1_copper_ring", true, "Copper Ring", "items"); settings.Add("i1_lead_ring", true, "Lead Ring", "items"); settings.Add("i1_wrench", true, "Wrench", "items"); settings.Add("i1_tab_pig", true, "Tablet of Gluttonous Pig", "items"); settings.Add("i1_tab_sed", true, "Tablet of The Seductress", "items"); settings.Add("i1_tab_opp", true, "Tablet of The Oppressor", "items"); settings.Add("i1_horseshoe", true, "Horseshoe", "items"); settings.Add("i1_lighter", true, "Lighter", "items"); settings.Add("i1_bent_needle", true, "Bent Needle", "items"); settings.Add("i1_piece_hair", true, "Piece of Hair", "items"); settings.Add("i1_fish_key", true, "Fish Key", "items"); settings.Add("i1_h204_key", true, "Room 204 Key", "items"); settings.Add("i1_emp_elev", true, "Employee Elevator Key", "items"); settings.Add("i1_bar_key", true, "Hotel Bar Key", "items"); settings.Add("i1_stair_key", true, "Hotel Stairway Key", "items"); settings.Add("i1_h312_key", true, "Hotel Room 312 Key", "items"); // INV2 settings.Add("i2_wax_doll", true, "Wax Doll", "items"); settings.Add("i2_wire_cutter", true, "Wire Cutter", "items"); settings.Add("i2_thinner", true, "Thinner", "items"); settings.Add("i2_mermaid", true, "Little Mermaid Music Box", "items"); settings.Add("i2_cinder", true, "Cinderella Music Box", "items"); settings.Add("i2_snow", true, "Snow White Music Box", "items"); settings.Add("i2_can_opener", true, "Can Opener", "items"); settings.Add("i2_light_bulb", true, "Light Bulb", "items"); settings.Add("i2_rust_egg", true, "Rust Coloured Egg", "items"); settings.Add("i2_scarlet_egg", true, "Scarlet Egg", "items"); } init { int moduleSize = modules.First().ModuleMemorySize; switch (moduleSize) { case 34910208: version = "PAL"; break; case 34959360: version = "NTSC"; break; case 34263040: version = "Faulty NTSC"; break; default: version = "WSF or cracked NTSC"; break; } print("[SH2] module=" + moduleSize + " ver=" + version); vars.splitRoomsTemplate = new int[] { 2, // Observatory (leave bathroom) 3, // Forest (leave observatory) 4, // East S.Vale (leave forest) 7, // Wood Side court yard (external) 16, // Wood Side Apartments SW staircase (entry) 39, // Blue Creek (0x27, room 203) 8, // West S.Vale (0x08) 51, // Hospital (0x33 main lobby) 92, // Historical (0x5C) 103, // Prison (0x67) 121, // Labyrinth 1F - entry save point hallway 132, // Labyrinth 1F actual entry (0x84) 143, // Eddie boss (0x8F) 146, // Hotel lobby (0x92) 172, // PH boss (0xAC) 189, // Dog Ending room (0xBD) }; vars.pendingRooms = new System.Collections.Generic.HashSet(vars.splitRoomsTemplate); vars.splitQueue = new System.Collections.Generic.Queue(); vars.started = false; vars.mainMenuFrames = 0; // Cutscene flags vars.c_angela = false; vars.c_radio = false; vars.c_rpt = false; vars.c_maria = false; vars.c_laura = false; vars.c_althosp = false; vars.c_rowboat = false; vars.c_videotape = false; vars.c_boss = false; vars.c_ending = false; vars.c_vhs_dog = false; // Dog Ending: VHS insertion cutscene vars.f_results = false; // Results screen fired // Item flags - INV0 vars.f_radio = false; vars.f_handgun = false; vars.f_flashlight = false; vars.f_ws_key = false; vars.f_202_key = false; vars.f_clock_key = false; vars.f_yard_key = false; vars.f_escape_key= false; vars.f_lyne_key = false; vars.f_ang_knife = false; vars.f_dog_key = false; vars.f_lauras_ltr= false; vars.f_video_tape = false; // INV1 vars.f_canned = false; vars.f_coin_snake= false; vars.f_coin_old = false; vars.f_coin_pris = false; vars.f_roof_key = false; vars.f_bull_key = false; vars.f_lapis_key = false; vars.f_elev_key = false; vars.f_bsmt_key = false; vars.f_lobby_key = false; vars.f_bronze_key = false; vars.f_spiral_key= false; vars.f_pers_key = false; vars.f_dry_cell = false; vars.f_copper_ring = false; vars.f_lead_ring = false; vars.f_wrench = false; vars.f_tab_pig = false; vars.f_tab_sed = false; vars.f_tab_opp = false; vars.f_horseshoe = false; vars.f_lighter = false; vars.f_bent_needle = false; vars.f_piece_hair= false; vars.f_fish_key = false; vars.f_h204_key = false; vars.f_emp_elev = false; vars.f_bar_key = false; vars.f_stair_key = false; vars.f_h312_key = false; // INV2 vars.f_wax_doll = false; vars.f_wire_cut = false; vars.f_thinner = false; vars.f_mermaid = false; vars.f_cinder = false; vars.f_snow = false; vars.f_can_opener = false; vars.f_light_bulb= false; vars.f_rust_egg = false; vars.f_scarlet = false; } start { // CutsceneID 1 = James in bathroom -> ends at 0 = player gets control if (current.Campaign == 0 && old.CutsceneID == 1 && current.CutsceneID == 0) { vars.pendingRooms = new System.Collections.Generic.HashSet(vars.splitRoomsTemplate); vars.splitQueue = new System.Collections.Generic.Queue(); vars.started = true; vars.mainMenuFrames = 0; // reset cutscene flags vars.c_angela=false; vars.c_radio=false; vars.c_rpt=false; vars.c_maria=false; vars.c_laura=false; vars.c_althosp=false; vars.c_rowboat=false; vars.c_videotape=false; vars.c_boss=false; vars.c_ending=false; vars.c_vhs_dog=false; vars.f_results=false; // reset item flags vars.f_radio=false; vars.f_handgun=false; vars.f_flashlight=false; vars.f_ws_key=false; vars.f_202_key=false; vars.f_clock_key=false; vars.f_yard_key=false; vars.f_escape_key=false; vars.f_lyne_key=false; vars.f_ang_knife=false; vars.f_dog_key=false; vars.f_lauras_ltr=false; vars.f_video_tape=false; vars.f_canned=false; vars.f_coin_snake=false; vars.f_coin_old=false; vars.f_coin_pris=false; vars.f_roof_key=false; vars.f_bull_key=false; vars.f_lapis_key=false; vars.f_elev_key=false; vars.f_bsmt_key=false; vars.f_lobby_key=false; vars.f_bronze_key=false; vars.f_spiral_key=false; vars.f_pers_key=false; vars.f_dry_cell=false; vars.f_copper_ring=false; vars.f_lead_ring=false; vars.f_wrench=false; vars.f_tab_pig=false; vars.f_tab_sed=false; vars.f_tab_opp=false; vars.f_horseshoe=false; vars.f_lighter=false; vars.f_bent_needle=false; vars.f_piece_hair=false; vars.f_fish_key=false; vars.f_h204_key=false; vars.f_emp_elev=false; vars.f_bar_key=false; vars.f_stair_key=false; vars.f_h312_key=false; vars.f_wax_doll=false; vars.f_wire_cut=false; vars.f_thinner=false; vars.f_mermaid=false; vars.f_cinder=false; vars.f_snow=false; vars.f_can_opener=false; vars.f_light_bulb=false; vars.f_rust_egg=false; vars.f_scarlet=false; print("[SH2] STARTED room=" + current.RoomID); return true; } return false; } reset { if (current.GameplayEvent == 2) { vars.mainMenuFrames++; } else { vars.mainMenuFrames = 0; } if (vars.mainMenuFrames >= 30) { vars.mainMenuFrames = 0; vars.started = false; print("[SH2] RESET"); return true; } return false; } split { if (!vars.started) return false; // Log every room change for debugging if (old.RoomID != current.RoomID) print("[SH2] Room: " + old.RoomID + " -> " + current.RoomID); // Log every cutscene change for debugging if (old.CutsceneID != current.CutsceneID) print("[SH2] Cut: " + old.CutsceneID + " -> " + current.CutsceneID); // Drain queue one per frame if (vars.splitQueue.Count > 0) { print("[SH2] SPLIT: " + vars.splitQueue.Dequeue()); return true; } // ── CUTSCENE SPLITS ──────────────────────────────────────────────── if (!vars.c_angela && old.CutsceneID != 3 && current.CutsceneID == 3) { vars.c_angela = true; vars.splitQueue.Enqueue("Angela Cemetery [C3]"); } if (!vars.c_radio && old.CutsceneID != 6 && current.CutsceneID == 6) { vars.c_radio = true; vars.splitQueue.Enqueue("Radio Found [C6]"); } if (!vars.c_rpt && old.CutsceneID != 19 && current.CutsceneID == 19) { vars.c_rpt = true; vars.splitQueue.Enqueue("RPT Fight [C19]"); } if (!vars.c_maria && old.CutsceneID != 21 && current.CutsceneID == 21) { vars.c_maria = true; vars.splitQueue.Enqueue("Maria Park [C21]"); } if (!vars.c_laura && old.CutsceneID != 39 && current.CutsceneID == 39) { vars.c_laura = true; vars.splitQueue.Enqueue("Find Laura [C39]"); } if (!vars.c_althosp && old.CutsceneID != 43 && current.CutsceneID == 43) { vars.c_althosp = true; vars.splitQueue.Enqueue("Nightmare Hospital [C43]"); } if (!vars.c_rowboat && old.CutsceneID != 76 && current.CutsceneID == 76) { vars.c_rowboat = true; vars.splitQueue.Enqueue("Rowboat [C76]"); } if (!vars.c_videotape && old.CutsceneID != 82 && current.CutsceneID == 82) { vars.c_videotape = true; vars.splitQueue.Enqueue("Videotape [C82]"); } if (!vars.c_boss && old.CutsceneID != 87 && current.CutsceneID == 87) { vars.c_boss = true; vars.splitQueue.Enqueue("Final Boss Dead [C87]"); } if (!vars.c_ending && old.CutsceneID != 98 && current.CutsceneID == 98) { vars.c_ending = true; vars.splitQueue.Enqueue("Observation Room [C98]"); } // Dog Ending: split when VHS insertion cutscene plays (CutsceneID 81). // No RoomID guard — C81 should be unique to this moment in the run. if (!vars.c_vhs_dog && old.CutsceneID != 81 && current.CutsceneID == 81) { vars.c_vhs_dog = true; vars.splitQueue.Enqueue("VHS Dog Ending [C81]"); } // ── ROOM SPLITS ──────────────────────────────────────────────────── if (settings["rooms"] && old.RoomID != current.RoomID && current.RoomID != 0) { if (settings["r_observatory"] && current.RoomID == 2 && vars.pendingRooms.Contains(2)) { vars.pendingRooms.Remove(2); vars.splitQueue.Enqueue("Observatory [R2]"); } if (settings["r_forest"] && current.RoomID == 3 && vars.pendingRooms.Contains(3)) { vars.pendingRooms.Remove(3); vars.splitQueue.Enqueue("Forest [R3]"); } if (settings["r_eastsv"] && current.RoomID == 4 && vars.pendingRooms.Contains(4)) { vars.pendingRooms.Remove(4); vars.splitQueue.Enqueue("East South Vale [R4]"); } if (settings["r_woodside"] && current.RoomID == 16 && vars.pendingRooms.Contains(16)) { vars.pendingRooms.Remove(16); vars.splitQueue.Enqueue("Wood Side Apartments [R16]"); } if (settings["r_bluecreek"] && current.RoomID == 39 && vars.pendingRooms.Contains(39)) { vars.pendingRooms.Remove(39); vars.splitQueue.Enqueue("Blue Creek Apts [R39]"); } if (settings["r_westsv"] && current.RoomID == 8 && vars.pendingRooms.Contains(8)) { vars.pendingRooms.Remove(8); vars.splitQueue.Enqueue("West South Vale [R8]"); } if (settings["r_hospital"] && current.RoomID == 51 && vars.pendingRooms.Contains(51)) { vars.pendingRooms.Remove(51); vars.splitQueue.Enqueue("Brookhaven Hospital [R51]"); } if (settings["r_historical"] && current.RoomID == 92 && vars.pendingRooms.Contains(92)) { vars.pendingRooms.Remove(92); vars.splitQueue.Enqueue("Historical Society [R92]"); } if (settings["r_prison"] && current.RoomID == 103 && vars.pendingRooms.Contains(103)) { vars.pendingRooms.Remove(103); vars.splitQueue.Enqueue("Toluca Prison [R103]"); } if (settings["r_labyrinth"] && current.RoomID == 132 && vars.pendingRooms.Contains(132)) { vars.pendingRooms.Remove(132); vars.splitQueue.Enqueue("The Labyrinth [R132]"); } if (settings["r_eddie"] && current.RoomID == 143 && vars.pendingRooms.Contains(143)) { vars.pendingRooms.Remove(143); vars.splitQueue.Enqueue("Eddie Boss [R143]"); } if (settings["r_hotel"] && current.RoomID == 146 && vars.pendingRooms.Contains(146)) { vars.pendingRooms.Remove(146); vars.splitQueue.Enqueue("Lake View Hotel [R146]"); } if (settings["r_ph_boss"] && current.RoomID == 172 && vars.pendingRooms.Contains(172)) { vars.pendingRooms.Remove(172); vars.splitQueue.Enqueue("Pyramid Head Boss [R172]"); } if (settings["r_dog_room"] && current.RoomID == 189 && vars.pendingRooms.Contains(189)) { vars.pendingRooms.Remove(189); vars.splitQueue.Enqueue("Dog Ending Room [R189]"); } } // ── LAST SPLIT: Results Screen ───────────────────────────────────── // GameplayEvent 11 fires only after all dog ending cutscenes complete, // so a simple old->current transition is sufficient. if (!vars.f_results && old.GameplayEvent != 11 && current.GameplayEvent == 11) { vars.f_results = true; vars.splitQueue.Enqueue("Results Screen [E11]"); } if (settings["items"]) { uint i0 = current.Inventory0; uint i1 = current.Inventory1; uint i2 = current.Inventory2; uint o0 = old.Inventory0; uint o1 = old.Inventory1; uint o2 = old.Inventory2; // INV0 if (settings["i0_radio"] && !vars.f_radio && (o0 & 0x80000u) == 0 && (i0 & 0x80000u) != 0) { vars.f_radio = true; vars.splitQueue.Enqueue("Radio"); } if (settings["i0_handgun"] && !vars.f_handgun && (o0 & 0x10u) == 0 && (i0 & 0x10u) != 0) { vars.f_handgun = true; vars.splitQueue.Enqueue("Handgun"); } if (settings["i0_flashlight"] && !vars.f_flashlight && (o0 & 0x40000u) == 0 && (i0 & 0x40000u) != 0) { vars.f_flashlight = true; vars.splitQueue.Enqueue("Flashlight"); } if (settings["i0_ws_key"] && !vars.f_ws_key && (o0 & 0x4000000u) == 0 && (i0 & 0x4000000u) != 0) { vars.f_ws_key = true; vars.splitQueue.Enqueue("WoodSide Apartments Key"); } if (settings["i0_202_key"] && !vars.f_202_key && (o0 & 0x8000000u) == 0 && (i0 & 0x8000000u) != 0) { vars.f_202_key = true; vars.splitQueue.Enqueue("202 Room Key"); } if (settings["i0_clock_key"] && !vars.f_clock_key && (o0 & 0x10000000u) == 0 && (i0 & 0x10000000u) != 0) { vars.f_clock_key = true; vars.splitQueue.Enqueue("Clock Key"); } if (settings["i0_yard_key"] && !vars.f_yard_key && (o0 & 0x20000000u) == 0 && (i0 & 0x20000000u) != 0) { vars.f_yard_key = true; vars.splitQueue.Enqueue("Courtyard Key"); } if (settings["i0_escape_key"] && !vars.f_escape_key && (o0 & 0x40000000u) == 0 && (i0 & 0x40000000u) != 0) { vars.f_escape_key = true; vars.splitQueue.Enqueue("Fire Escape Key"); } if (settings["i0_lyne_key"] && !vars.f_lyne_key && (o0 & 0x80000000u) == 0 && (i0 & 0x80000000u) != 0) { vars.f_lyne_key = true; vars.splitQueue.Enqueue("Lyne House Key"); } if (settings["i0_ang_knife"] && !vars.f_ang_knife && (o0 & 0x1000000u) == 0 && (i0 & 0x1000000u) != 0) { vars.f_ang_knife = true; vars.splitQueue.Enqueue("Angela's Knife"); } if (settings["i0_dog_key"] && !vars.f_dog_key && (o0 & 0x2000000u) == 0 && (i0 & 0x2000000u) != 0) { vars.f_dog_key = true; vars.splitQueue.Enqueue("Dog Key"); } if (settings["i0_lauras_ltr"] && !vars.f_lauras_ltr && (o0 & 0x400000u) == 0 && (i0 & 0x400000u) != 0) { vars.f_lauras_ltr = true; vars.splitQueue.Enqueue("Laura's Letter"); } if (settings["i0_video_tape"] && !vars.f_video_tape && (o0 & 0x800000u) == 0 && (i0 & 0x800000u) != 0) { vars.f_video_tape = true; vars.splitQueue.Enqueue("Video Tape"); } // INV1 if (settings["i1_canned"] && !vars.f_canned && (o1 & 0x20000u) == 0 && (i1 & 0x20000u) != 0) { vars.f_canned = true; vars.splitQueue.Enqueue("Canned Juice"); } // Coins - room guards to prevent false triggers on room load // Coin [Snake] only in Wood Side area (rooms 7-31) if (settings["i1_coin_snake"] && !vars.f_coin_snake && current.RoomID >= 7 && current.RoomID <= 31 && (o1 & 0x40000u) == 0 && (i1 & 0x40000u) != 0) { vars.f_coin_snake = true; vars.splitQueue.Enqueue("Coin [Snake]"); } // Coin [Old Man] only in Wood Side area (rooms 7-31) if (settings["i1_coin_old"] && !vars.f_coin_old && (o1 & 0x80000u) == 0 && (i1 & 0x80000u) != 0) { vars.f_coin_old = true; vars.splitQueue.Enqueue("Coin [Old Man]"); } // Coin [Prisoner] only in Blue Creek area (rooms 32-40) if (settings["i1_coin_pris"] && !vars.f_coin_pris && current.RoomID >= 32 && current.RoomID <= 40 && (o1 & 0x100000u) == 0 && (i1 & 0x100000u) != 0) { vars.f_coin_pris = true; vars.splitQueue.Enqueue("Coin [Prisoner]"); } if (settings["i1_roof_key"] && !vars.f_roof_key && (o1 & 0x4u) == 0 && (i1 & 0x4u) != 0) { vars.f_roof_key = true; vars.splitQueue.Enqueue("Roof Key"); } if (settings["i1_bull_key"] && !vars.f_bull_key && (o1 & 0x8u) == 0 && (i1 & 0x8u) != 0) { vars.f_bull_key = true; vars.splitQueue.Enqueue("Purple Bull Key"); } if (settings["i1_lapis_key"] && !vars.f_lapis_key && (o1 & 0x10u) == 0 && (i1 & 0x10u) != 0) { vars.f_lapis_key = true; vars.splitQueue.Enqueue("Lapis Eye Key"); } if (settings["i1_elev_key"] && !vars.f_elev_key && (o1 & 0x20u) == 0 && (i1 & 0x20u) != 0) { vars.f_elev_key = true; vars.splitQueue.Enqueue("Elevator Key"); } if (settings["i1_bsmt_key"] && !vars.f_bsmt_key && (o1 & 0x40u) == 0 && (i1 & 0x40u) != 0) { vars.f_bsmt_key = true; vars.splitQueue.Enqueue("Basement Storeroom Key"); } if (settings["i1_lobby_key"] && !vars.f_lobby_key && (o1 & 0x80u) == 0 && (i1 & 0x80u) != 0) { vars.f_lobby_key = true; vars.splitQueue.Enqueue("Hospital Lobby Key"); } if (settings["i1_bronze_key"] && !vars.f_bronze_key && (o1 & 0x100u) == 0 && (i1 & 0x100u) != 0) { vars.f_bronze_key = true; vars.splitQueue.Enqueue("Old Bronze Key"); } if (settings["i1_spiral_key"] && !vars.f_spiral_key && (i1 & 0x200u) != 0) { vars.f_spiral_key = true; vars.splitQueue.Enqueue("Spiral Writing Key"); } if (settings["i1_pers_key"] && !vars.f_pers_key && (o1 & 0x400u) == 0 && (i1 & 0x400u) != 0) { vars.f_pers_key = true; vars.splitQueue.Enqueue("Key of Persecuted"); } if (settings["i1_dry_cell"] && !vars.f_dry_cell && (o1 & 0x800000u) == 0 && (i1 & 0x800000u) != 0) { vars.f_dry_cell = true; vars.splitQueue.Enqueue("Dry Cell Battery"); } if (settings["i1_copper_ring"] && !vars.f_copper_ring && (o1 & 0x1000000u) == 0 && (i1 & 0x1000000u) != 0) { vars.f_copper_ring = true; vars.splitQueue.Enqueue("Copper Ring"); } if (settings["i1_lead_ring"] && !vars.f_lead_ring && (o1 & 0x2000000u) == 0 && (i1 & 0x2000000u) != 0) { vars.f_lead_ring = true; vars.splitQueue.Enqueue("Lead Ring"); } if (settings["i1_wrench"] && !vars.f_wrench && (o1 & 0x4000000u) == 0 && (i1 & 0x4000000u) != 0) { vars.f_wrench = true; vars.splitQueue.Enqueue("Wrench"); } if (settings["i1_tab_pig"] && !vars.f_tab_pig && (o1 & 0x10000000u) == 0 && (i1 & 0x10000000u) != 0) { vars.f_tab_pig = true; vars.splitQueue.Enqueue("Tablet of Gluttonous Pig"); } if (settings["i1_tab_sed"] && !vars.f_tab_sed && (o1 & 0x20000000u) == 0 && (i1 & 0x20000000u) != 0) { vars.f_tab_sed = true; vars.splitQueue.Enqueue("Tablet of The Seductress"); } if (settings["i1_tab_opp"] && !vars.f_tab_opp && (o1 & 0x8000000u) == 0 && (i1 & 0x8000000u) != 0) { vars.f_tab_opp = true; vars.splitQueue.Enqueue("Tablet of The Oppressor"); } if (settings["i1_horseshoe"] && !vars.f_horseshoe && (o1 & 0x40000000u) == 0 && (i1 & 0x40000000u) != 0) { vars.f_horseshoe = true; vars.splitQueue.Enqueue("Horseshoe"); } if (settings["i1_lighter"] && !vars.f_lighter && (o1 & 0x80000000u) == 0 && (i1 & 0x80000000u) != 0) { vars.f_lighter = true; vars.splitQueue.Enqueue("Lighter"); } if (settings["i1_bent_needle"] && !vars.f_bent_needle && (o1 & 0x400000u) == 0 && (i1 & 0x400000u) != 0) { vars.f_bent_needle = true; vars.splitQueue.Enqueue("Bent Needle"); } if (settings["i1_piece_hair"] && !vars.f_piece_hair && (o1 & 0x200000u) == 0 && (i1 & 0x200000u) != 0) { vars.f_piece_hair = true; vars.splitQueue.Enqueue("Piece of Hair"); } if (settings["i1_fish_key"] && !vars.f_fish_key && (o1 & 0x8000u) == 0 && (i1 & 0x8000u) != 0) { vars.f_fish_key = true; vars.splitQueue.Enqueue("Fish Key"); } if (settings["i1_h204_key"] && !vars.f_h204_key && (o1 & 0x1000u) == 0 && (i1 & 0x1000u) != 0) { vars.f_h204_key = true; vars.splitQueue.Enqueue("Room 204 Key"); } if (settings["i1_emp_elev"] && !vars.f_emp_elev && (o1 & 0x2000u) == 0 && (i1 & 0x2000u) != 0) { vars.f_emp_elev = true; vars.splitQueue.Enqueue("Employee Elevator Key"); } if (settings["i1_bar_key"] && !vars.f_bar_key && (o1 & 0x4000u) == 0 && (i1 & 0x4000u) != 0) { vars.f_bar_key = true; vars.splitQueue.Enqueue("Hotel Bar Key"); } if (settings["i1_stair_key"] && !vars.f_stair_key && (o1 & 0x10000u) == 0 && (i1 & 0x10000u) != 0) { vars.f_stair_key = true; vars.splitQueue.Enqueue("Hotel Stairway Key"); } if (settings["i1_h312_key"] && !vars.f_h312_key && (o1 & 0x800u) == 0 && (i1 & 0x800u) != 0) { vars.f_h312_key = true; vars.splitQueue.Enqueue("Hotel Room 312 Key"); } // INV2 if (settings["i2_wax_doll"] && !vars.f_wax_doll && (o2 & 0x1u) == 0 && (i2 & 0x1u) != 0) { vars.f_wax_doll = true; vars.splitQueue.Enqueue("Wax Doll"); } if (settings["i2_wire_cutter"] && !vars.f_wire_cut && (o2 & 0x2u) == 0 && (i2 & 0x2u) != 0) { vars.f_wire_cut = true; vars.splitQueue.Enqueue("Wire Cutter"); } if (settings["i2_thinner"] && !vars.f_thinner && (o2 & 0x4u) == 0 && (i2 & 0x4u) != 0) { vars.f_thinner = true; vars.splitQueue.Enqueue("Thinner"); } if (settings["i2_mermaid"] && !vars.f_mermaid && (o2 & 0x8u) == 0 && (i2 & 0x8u) != 0) { vars.f_mermaid = true; vars.splitQueue.Enqueue("Little Mermaid Music Box"); } if (settings["i2_cinder"] && !vars.f_cinder && (o2 & 0x10u) == 0 && (i2 & 0x10u) != 0) { vars.f_cinder = true; vars.splitQueue.Enqueue("Cinderella Music Box"); } if (settings["i2_snow"] && !vars.f_snow && (o2 & 0x20u) == 0 && (i2 & 0x20u) != 0) { vars.f_snow = true; vars.splitQueue.Enqueue("Snow White Music Box"); } if (settings["i2_can_opener"] && !vars.f_can_opener && (o2 & 0x40u) == 0 && (i2 & 0x40u) != 0) { vars.f_can_opener = true; vars.splitQueue.Enqueue("Can Opener"); } if (settings["i2_light_bulb"] && !vars.f_light_bulb && (o2 & 0x80u) == 0 && (i2 & 0x80u) != 0) { vars.f_light_bulb = true; vars.splitQueue.Enqueue("Light Bulb"); } if (settings["i2_rust_egg"] && !vars.f_rust_egg && (o2 & 0x100u) == 0 && (i2 & 0x100u) != 0) { vars.f_rust_egg = true; vars.splitQueue.Enqueue("Rust Coloured Egg"); } if (settings["i2_scarlet_egg"] && !vars.f_scarlet && (o2 & 0x200u) == 0 && (i2 & 0x200u) != 0) { vars.f_scarlet = true; vars.splitQueue.Enqueue("Scarlet Egg"); } } if (vars.splitQueue.Count > 0) { print("[SH2] SPLIT: " + vars.splitQueue.Dequeue()); return true; } return false; } isLoading { return true; } gameTime { // Freeze timer on results screen. // f_results is set at the same moment the split fires (GameplayEvent 11 transition). if (vars.f_results) return TimeSpan.FromSeconds(old.GameTimer); return TimeSpan.FromSeconds(current.GameTimer); }