private void AddLockChain(Map <Template, Room> map, ref int tick, Template current, Skid keys) { if (Roll() <= 10) { // () - R - L - key // \-(k)- L - () var r = map.CreateTemplate(TemplateType.RoomChooser); var keyL = map.CreateTemplate(TemplateType.LayoutChooser); var lockedL = map.CreateTemplate(TemplateType.LayoutChooser); int key = keys.Next(); current.SwapLeft(r); r.ConnectTo(keyL); r.ConnectTo(lockedL).Lock = new Key(key); keyL.ConnectTo(map.CreateRoom(RoomType.Key, key)); current.SwapRight(lockedL); } else { tick++; // () - r - K - () // \ - K - GB var r = map.CreateTemplate(TemplateType.RoomChooser); var newK = map.CreateTemplate(TemplateType.LockChain); var gb = map.CreateTemplate(TemplateType.BonusGoal); current.SwapLeft(r); r.ConnectTo(current); r.ConnectTo(newK); newK.ConnectTo(gb); map.Track(current); // Reuse key sequence } }
private void AddSwitchedSection(Map <Template, Room> map, Template current, Skid switches) { int state = switches.Next(); var r = current.ReplaceWith(map.CreateTemplate(TemplateType.RoomChooser)); foreach (var hall in r.Exit) { hall.Lock = new Switch(state); // seal the normal exits } r.ConnectTo(map.CreateTemplate(TemplateType.SwitchSeq, state)); if (Roll() > 10) { // Add switch-lock var sl = map.CreateTemplate(TemplateType.SwitchLockSeq, state); var gb = map.CreateTemplate(TemplateType.BonusGoal); r.ConnectTo(sl); sl.ConnectTo(gb); } }