public async Task GenerateDungeon(IUser user, [Remainder] string name) { if (await IsGMLevel(3)) { Player player = Player.Load(user.Id); Area dungeon; if (name.Length > 0) { dungeon = Dungeons.ManualDungeon(StringM.UpperAt(name), player.AreaInfo.floor, player.Area); } else { dungeon = Dungeons.Generate(player.AreaInfo.floor, player.Area); } if (dungeon != null) { await player.SetArea(dungeon); await player.NewUI(await ReplyAsync(embed: dungeon.AreaInfo(player.AreaInfo.floor).Build()), MsgType.Main); } else { await ReplyAsync("Dungeon not Found"); } } }
public static void Defragment() { if (_Defragmenting) { return; } _Defragmenting = true; var now = DateTime.UtcNow; Dungeons.Values.Where(d => d != null && !d.Deleted).ForEach(d => { d.Defragment(); if (d.Zones.Count == 0 || d.Deadline < now || (d.Group.Count == 0 && (now - d.Created).TotalHours > 1)) { d.Delete(); } }); Dungeons.RemoveValueRange(d => d == null || d.Deleted); Maps.Values.Where(map => map != null && !map.Deleted).ForEach(map => { map.Defragment(); var del = map.InstanceRegions.Count == 0; if (!del) { del = map.InstanceRegions.All(r => { if (r == null || r.Deleted) { return(true); } if (r is DungeonZone) { var z = (DungeonZone)r; return(z.Dungeon == null || z.Dungeon.Deleted); } return(false); }); } if (del) { map.Delete(); } }); Maps.RemoveValueRange(m => m == null || m.Deleted); _Defragmenting = false; }
public Dungeon(string name, List<Room> rooms) : base() { //ID = Guid.NewGuid(); Name = name; Rooms = rooms; Dungeons.Add(this); }
public DungeonViewModel(PitWorldTemplate world) { World = world; Dungeons = World.DungeonTemplates; var pitDungeonTemplate = Dungeons.FirstOrDefault(d => d.IsStartingDungeon); string startId = pitDungeonTemplate != null ? pitDungeonTemplate.TemplateId : DefaultDungeonId; SelectedDungeon = World.GetDungeon(startId); }
private static void CSLoad() { Maps.Import(); Dungeons.Import(); Lockouts.Import(); Restore(); DefragmentTimer.Start(); }
private static void CSSave() { IndexFile.Serialize(SaveIndex); Maps.Export(); Dungeons.Export(); Lockouts.Export(); RestoreFile.Serialize(SaveRestore); RestoreFile.SetHidden(true); }
internal static async Task EnterDungeon(Player player, IMessageChannel chan) { player.EndEncounter(); Area dungeon = Dungeons.Generate(player.AreaInfo.floor, player.Area); await player.SetArea(dungeon, player.AreaInfo.floor); player.QuestTrigger(Quest.QuestTrigger.Enter, "Dungeon"); player.EggPocketTrigger(NPCSystems.Companions.Egg.EggChallenge.Exploration); EmbedBuilder areaInfo = player.UserEmbedColor(player.Area.AreaInfo(player.AreaInfo.floor)); await player.NewUI(await chan.SendMessageAsync("You've entered " + player.Area.name, embed: areaInfo.Build()), MsgType.Main); }
internal static async Task EnterFLoor(Player player, ISocketMessageChannel chan) { EmbedBuilder result; string message = null; MsgType uiType = MsgType.Main; player.EndEncounter(); player.EggPocketTrigger(NPCSystems.Companions.Egg.EggChallenge.Exploration); if (AMIData.Events.OngoingEvent.Ongoing != null) { AMIData.Events.OngoingEvent.Ongoing.EventBounty(player.Area, player.AreaInfo.floor); } if (player.Area.type == AreaType.Dungeon && player.AreaInfo.floor + 1 >= player.Area.floors) { player.AreaInfo.floor++; NPCSystems.NPC mob = Dungeons.GetBoss(player.Area); player.NewEncounter(new Encounter("Mob", player) { mobs = new NPCSystems.NPC[] { mob } }); result = DUtils.BuildEmbed("Boss Battle", "You've encountered a " + mob.name, null, player.userSettings.Color, DUtils.NewField(mob.displayName, "Level: " + mob.level + Environment.NewLine + "Rank: " + mob.Rank() + Environment.NewLine + $"Health: {mob.health}/{mob.Health()}" + Environment.NewLine )); uiType = MsgType.Combat; } else { // Calc the amount of floors to go: // (if lower than area level, only ever 1 [else] difference of player's level and area's lvl capped at 6) capped at available floors int floors = FloorIncrease(player); player.AreaInfo.floor += floors; result = player.Area.AreaInfo(player.AreaInfo.floor).WithColor(player.userSettings.Color); message = $"You've advanced {floors} floors " + player.Area.name; } player.QuestTrigger(Quest.QuestTrigger.EnterFloor, $"{player.AreaInfo.path};{player.AreaInfo.floor}"); await player.NewUI(await chan.SendMessageAsync(message, embed: result.Build()), uiType); }
private void ComposeDungeons() { int teleportindex = -1; HashSet <SCTeleport> usedEnterTeles = new HashSet <SCTeleport>(new SCTEleportTargetEqualityComparer()); foreach (var et in enter.Select(e => new SCTeleport(e, SCPointOfInterestType.OwEntrance))) { teleportindex++; if (usedEnterTeles.Contains(et)) { continue; } Dungeons.Add(new SCDungeon(et, (OverworldTeleportIndex)teleportindex, scmaps, usedEnterTeles)); } }
public void Add(Play play, int begin, int end) { var playes = Plays.SingleOrDefault(p => p.Name == play.Name); if (playes == null) { Plays.Add(play); var dungeon = new Dungeon(begin, end, play, user); Dungeons.Add(dungeon); } else { var dungeon = new Dungeon(begin, end, play, user); Dungeons.Add(dungeon); } Save(); }
//private IslandController lastIslandToggle = null; private void HandleKeyDown() { var isShiftDown = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift); var isControlDown = isShiftDown || Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl); if (Input.GetKeyUp(KeyCode.Q)) { LogoCensor = !LogoCensor; } if (Input.GetKeyUp(KeyCode.I)) { playerList.ToggleExpRate(); } if (isControlDown && Input.GetKeyUp(KeyCode.F)) { playerSearchHandler.Show(); } if (isControlDown && Input.GetKeyUp(KeyCode.S)) { SavePlayersAsync(); } if (Input.GetKeyUp(KeyCode.Space)) { var player = Players.FindPlayers("zerratar").FirstOrDefault(); if (player) { var def = JsonConvert.DeserializeObject <RavenNestPlayer>(JsonConvert.SerializeObject(player.Definition)); def.UserId = UnityEngine.Random.Range(12345, 99999).ToString(); def.Name += def.UserId; def.UserName += def.UserId; var p = SpawnPlayer(def); if (raidManager.Started) { raidManager.Join(p); } } } if (isControlDown && Input.GetKeyUp(KeyCode.O)) { Dungeons.ActivateDungeon(); } if (isControlDown && Input.GetKeyUp(KeyCode.P)) { Dungeons.ForceStartDungeon(); } if (isControlDown && Input.GetKeyUp(KeyCode.R)) { raidManager.StartRaid(); } if (Permissions.IsAdministrator || Application.isEditor) { if (isControlDown && Input.GetKeyDown(KeyCode.Delete)) { subEventManager.Reset(); } if (isControlDown && Input.GetKeyUp(KeyCode.A)) { subEventManager.Activate(); } if (isControlDown && Input.GetKeyUp(KeyCode.X)) { Twitch.OnSubscribe(new TwitchSubscription(null, null, null, null, 1, true)); } if (isControlDown && Input.GetKeyUp(KeyCode.C)) { Twitch.OnSubscribe(new TwitchSubscription(null, null, null, null, -1, true)); } } }
public static void Quest() { City.currentPlotState = City.QuestState.Completed; switch (questNum) { case 1: Console.Clear(); RPG.Dialogue("Вы дошли до синего источника"); RPG.Dialogue("Как и ожидалось, всё здесь синее."); RPG.Dialogue("Источник представлял из себя небольшую речку, начало которой виднелось на горизонте."); RPG.Dialogue("Вы проходите вглубь, ощущая свежесть окружающего воздуха."); RPG.Dialogue("Вы чувствуете расслабление и решаете присесть."); RPG.Dialogue("\n..."); RPG.Dialogue("\nИз-за деревьев выходит Страж."); RPG.Dialogue("\nЧёрт, подумали вы."); monster = new Monster[1] { new Monster { HP = 100 + 20 * LVL, Damage = 20 + 2 * LVL, Name = "Страж", Type = Monster.MType.Standart, } }; Fight.Init(monster, true); break; case 2: Console.Clear(); RPG.Dialogue("Вы следуете по маршруту торговца, уходя глубоко в лес."); RPG.Dialogue("С каждым шагом окружающая тишина становится всё подозрительнее."); RPG.Dialogue("Туман густеет."); RPG.Dialogue("Давление обстановки растёт."); RPG.Dialogue("Вы наткнулись на следы колёс."); RPG.Dialogue("Последовать по ним кажется хорошей идеей."); RPG.Dialogue("\n..."); RPG.Dialogue("\nЭто будет долгий поход."); Dungeons.Init(questNum); RPG.Dialogue("\nВы подошли к разрушенной повозке."); RPG.Dialogue("\nА рядом с ней..."); RPG.Dialogue("\nМёртвый торговец."); RPG.Dialogue("\nСледов нападения не видно."); RPG.Dialogue("Исследовав повозку, вы не нашли ни одного товара."); RPG.Dialogue("Только много гари."); RPG.Dialogue("Возможно, повозка загорелась, и торговец не смог спастись?"); RPG.Dialogue("Возможно, торговец вёз взрывчатку."); RPG.Dialogue("\nСтранное дело."); RPG.Dialogue("\n..."); RPG.Dialogue("\nВы заметили медальон на торговце."); RPG.Dialogue("Вы его взяли, без особой цели. Он не выглядит дорогостоящим."); RPG.Dialogue("Кроме красного камня посередине. Но его достать оттуда пркатически невозможно."); RPG.Dialogue("\nНа обратной стороне медальона написано '963'"); RPG.Dialogue("\nЧто бы это не значило."); RPG.Dialogue("\nВы начали возвращаться."); Dungeons.Init(questNum, 1); RPG.Dialogue("\nПеред вами стоит монстр."); RPG.Dialogue("Что не удивительно."); monster = new Monster[1] { new Monster { HP = 400 + 30 * LVL, Damage = 30 + 3 * LVL, Name = "Заградитель", Type = Monster.MType.Fire } }; Fight.Init(monster, true); break; case 3: Console.Clear(); RPG.Dialogue("Вход в подвал находится снаружи."); RPG.Dialogue("Видимо, так удобнее?"); RPG.Dialogue("Вы спустились в подвал таверны."); RPG.Dialogue("Здесь довольно темно."); RPG.Dialogue("Единственное освещение это свет из открытой двери."); RPG.Dialogue("В конце подвала видно только чёрный туман."); RPG.Dialogue("\nВы начинаете движение в его сторону."); Dungeons.Init(questNum); RPG.Dialogue("\nКак и ожидалось:"); RPG.Dialogue("Внутри тумана монстр."); monster = new Monster[1] { new Monster { HP = 600 + 40 * LVL, Damage = 40 + 8 * LVL, Name = "Туманный зверь", Type = Monster.MType.Dark } }; Fight.Init(monster, true); RPG.Dialogue("Тело монстра рассеялось в тумане."); RPG.Dialogue("Время возвращаться."); Dungeons.Init(questNum, 1); RPG.Dialogue("\nПохоже, что дверь заклинило."); RPG.Dialogue("Можно попробовать найти другой выход."); RPG.Dialogue("Можно выломать дверь."); Console.WriteLine("Что делать?" + "\n1 - Выломать" + "\n2 - Найти другой выход"); if (Console.ReadLine() == "1") { brokeOut = true; RPG.Dialogue("\nВы успешно выломали дверь."); RPG.Dialogue("Будет очень неприятно снова встретить Охру."); } else { RPG.Dialogue("\nНет, ломать дверь действительно не стоит."); RPG.Dialogue("Ведь из подвала есть ещё один выход в город."); Dungeons.Init(questNum, 2); RPG.Dialogue("\nНу вот."); RPG.Dialogue("И не нужно никакой излишней жестокости!"); } break; default: Console.WriteLine("Хз чёт"); break; } }
static public void GetRandomEvent() { Fancies(); Monster test = new Monster(); Console.WriteLine("\nИгрок:" + $"\nHP: {HP}/{MaxHP} [{HPLine}]"); if (LVL != 15) { Console.WriteLine($"УР {LVL}: {XP}/{MaxXP} [{XPLine}]"); } else { Dialogue($"LVL {LVL}: {XP}/{MaxXP} [{XPLine}] " + $"\nОчки мастерства: {MasteryPoints}", true, ConsoleColor.Yellow); } Console.WriteLine($"Деньги: {Player.Money}"); Console.WriteLine("\nЛес - 1, Задание - 2, Город - 3"); if (towerLoc) { Console.WriteLine("Заброшенная башня - 9"); } Console.WriteLine("Сохранить игру - s, Загрузить игру - l, Достижения - a, Инвентарь - i"); switch (Console.ReadLine()) { case "1": Console.Clear(); int Event = rnd.Next(0, 10); if (Event < 5) { Console.WriteLine("Тут ничего"); } else if (Event == 5) { Money = rnd.Next(0, 10) + 2 * LVL; Player.Money += Money; Dialogue("Ого, сундук" + "\nВы получили " + Money + " монет", true, ConsoleColor.Yellow); } else { Fight.Init(); } break; case "2": Console.Clear(); if (City.currentPlotState == City.QuestState.Accepted) { Console.WriteLine("Доступно сюжетное задание."); switch (questNum) { case 1: Console.WriteLine("Рекомендуемый уровень: 4"); break; case 2: Console.WriteLine("Рекомендуемый уровень: 7"); break; case 3: Console.WriteLine("Рекомендуемый уровень: 8"); break; } Console.WriteLine("Вы хотите начать это задание? Да - 1, Нет - 2"); if (Console.ReadLine() == "1") { PlotQuests.Quest(); } } else { Console.WriteLine("Нет доступных заданий."); } break; case "3": City.GoToCity(); break; case "4": Dungeons.Init(0); Console.Clear(); break; case "9": if (towerLoc) { Tower.Entry(); Console.Clear(); } else { goto default; } break; case "a": AchievementMenu.ShowList(); Console.Clear(); break; case "i": InventoryMenu.ShowMenu(); break; case "l": LoadProgress(false); Console.Clear(); break; case "s": SaveProgress(true); Console.Clear(); break; case "fight poison": test.Type = Monster.MType.Poisonous; goto case "fight"; case "fight explosive": test.Type = Monster.MType.Explosive; goto case "fight"; case "fight thorned": test.Type = Monster.MType.Thorned; goto case "fight"; case "fight fire": test.Type = Monster.MType.Fire; goto case "fight"; case "fight ice": test.Type = Monster.MType.Ice; goto case "fight"; case "fight dark": test.Type = Monster.MType.Dark; goto case "fight"; case "fight light": test.Type = Monster.MType.Luminous; goto case "fight"; case "fight": test.HP = 262260; test.Damage = 0; test.Name = "тестовый монстр-босс"; Fight.Init(new Monster[1] { test }, true); break; case "fight 2": Fight.Init(2); break; case "bring balance": for (int i = 0; i < Passive_Inventory.Length; i++) { if (Passive_Inventory[i].ID == 0) { Passive_Inventory[i] = new Yang_W(); break; } } for (int i = 0; i < Passive_Inventory.Length; i++) { if (Passive_Inventory[i].ID == 0) { Passive_Inventory[1] = new Ying_A(); break; } } break; case "scrooge": Console.Clear(); Player.Money += 1000000; break; case "gototavern": if (questNum == 0) { questNum = 1; } City.GoToTavern(); break; case "lvlup": LvlUp(true); break; case "gearupg": City.GearUpgrade(true); break; case "allthexp": //Дать максимальный уровень. //Кол-во опыта считается так: a*(1 + 2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 ... + 2^n-3), где a - начальное кол-во опыта, n - необходимый уровень XP = 204800; LvlUp(); break; case "questscomplete": //"Выполнить" квесты Console.Clear(); questNum = 15; break; case "cheatsheet": //Список отладочных команд Console.Clear(); Console.WriteLine("scrooge - +1.000.000 монет\n" + "gototavern - пойти в таверну\n" + "lvlup - повысить уровень\n" + "gearupg - улучшить экипировку\n" + "allthexp - получить двадцатый уровень\n" + "questscomplete - выполнить все квесты (без награды)"); break; default: Console.Clear(); Console.WriteLine("Нет команды."); break; } GetRandomEvent(); }
public static bool EnterDungeon(PlayerMobile pm, DungeonInfo info, bool confirm) { if (pm == null || pm.Deleted || info == null || info.ID == DungeonID.None) { return(false); } if (confirm) { var html = new StringBuilder(); html.AppendLine(info.Desc.WrapUOHtmlColor(Color.PaleGoldenrod)); html.AppendLine(); html.AppendLine("You are about to enter {0}.", info.Name); html.AppendLine( "You have {0} to complete your raid...", info.Duration.ToSimpleString("!d# days #h# hours #m# minutes and #s# seconds#")); html.AppendLine(); html.AppendLine("Click OK to enter {0}!", info.Name); new ConfirmDialogGump(pm) { Width = 500, Height = 400, Title = info.Name, Html = html.ToString(), HtmlColor = Color.White, AcceptHandler = b => EnterDungeon(pm, info, false) }.Send(); return(false); } if (info.Expansion != Expansion.None && pm.NetState != null && !pm.NetState.SupportsExpansion(info.Expansion, false)) { pm.SendMessage(0x22, "The {0} expansion is required to enter {1}.", info.Expansion, info.Name); return(false); } TimeSpan lockout; if (IsLockedOut(pm, info.ID, out lockout)) { pm.SendMessage( 0x22, "You must wait {0} before you can enter {1} again.", lockout.ToSimpleString("!d# days #h# hours #m# minutes and #s# seconds#"), info.Name); var ui = new TimeBoostsUI(pm, null, TimeBoosts.TimeBoosts.EnsureProfile(pm)) { Title = info.Name, SubTitle = "Reduce Wait?", SummaryText = "Next Raid", GetTime = () => GetLockout(pm, info.ID), SetTime = t => SetLockout(pm, info.ID, t) }; ui.BoostUsed = b => { if (IsLockedOut(pm, info.ID, out lockout)) { pm.SendMessage( 0x22, "You must wait {0} before you can enter {1} again.", lockout.ToSimpleString("!d# days #h# hours #m# minutes and #s# seconds#"), info.Name); } else { ui.Close(true); EnterDungeon(pm, info, false); } }; ui.Send(); return(false); } var party = Party.Get(pm); var isParty = false; Dungeon dungeon = null; if (party != null && party.Leader is PlayerMobile && party.Leader != pm) { isParty = true; var pl = (PlayerMobile)party.Leader; dungeon = Dungeons.Values.FirstOrDefault( d => d != null && !d.Deleted && d.ID == info.ID && (d.Group.Count == 0 || d.Group.Contains(pl))); } if (dungeon == null && isParty) { pm.SendMessage(0x22, "Your party leader must be the first to enter {0}.", info.Name); return(false); } if (dungeon == null) { dungeon = Dungeons.Values.FirstOrDefault( d => d != null && !d.Deleted && d.ID == info.ID && (d.Group.Count == 0 || d.Group.Contains(pm))); } if (dungeon != null && dungeon.Group.Count(gp => gp != null && gp != pm && gp.Map == dungeon.Map) >= dungeon.GroupMax) { pm.SendMessage(0x22, "{0} is currently at maximum capacity.", info.Name); return(false); } if (dungeon == null || dungeon.Deleted) { dungeon = info.Type.CreateInstanceSafe <Dungeon>(); if (dungeon != null && !dungeon.Deleted) { Dungeons.Add(dungeon.Serial, dungeon); } } if (dungeon != null && !dungeon.Deleted) { dungeon.Init(); var lifespan = dungeon.Deadline - DateTime.UtcNow; if (dungeon.Map == null || dungeon.Map.Deleted || lifespan <= TimeSpan.Zero) { pm.SendMessage(0x22, "A rip in the fabric of reality prevents you from entering {0}.", info.Name); if (dungeon.Group.Count == 0 || (dungeon.Group.Count == 1 && dungeon.Group.Contains(pm))) { dungeon.Delete(); } return(false); } if (dungeon.Entrance == Point3D.Zero || !dungeon.CanEnterDungeon(pm)) { pm.SendMessage(0x22, "Mystical forces prevent you from entering {0}.", info.Name); if (dungeon.Group.Count == 0 || (dungeon.Group.Count == 1 && dungeon.Group.Contains(pm))) { dungeon.Delete(); } return(false); } string time = lifespan.ToSimpleString("!d# days #h# hours #m# minutes and #s# seconds#"); /*if (lifespan.TotalDays > 1.0) * { * time = String.Format("{0:#,0} days", (int)lifespan.TotalDays); * } * else if (lifespan.TotalHours > 1.0) * { * time = String.Format("{0:#,0} hours", (int)lifespan.TotalHours); * } * else if (lifespan.TotalMinutes > 1.0) * { * time = String.Format("{0:#,0} minutes", (int)lifespan.TotalMinutes); * } * else * { * time = String.Format("{0:#,0} seconds", (int)lifespan.TotalSeconds); * }*/ pm.SendMessage(0x55, "You have {0} before reality breaks down and {1} ceases to exist.", time, info.Name); dungeon.Teleport(pm, dungeon.Entrance, dungeon.Map); dungeon.OnEnterDungeon(pm); return(true); } pm.SendMessage(0x22, "{0} is currently unavailable.", info.Name); return(false); }
public static Dungeon FindDungeon(DungeonSerial serial) { return(Dungeons.GetValue(serial)); }