public static void Backward() { if (Prior == null) { return; } S = new State(Prior); XSSR.SetState(S.XSSRState); }
public static T RandomElement <T>(this T[,] mat) { if (mat.Length == 0) { return(default(T)); } return(mat[XSSR.Next(mat.GetLength(0)), XSSR.Next(mat.GetLength(1))]); }
public static void Remember() { if (S == null) { return; } S.XSSRState = XSSR.GetState(); Prior = new ImmutableState(S); }
public static T RandomElement <T>(this T[] arr) { if (arr.Length == 0) { return(default(T)); } return(arr[XSSR.Next(arr.Length)]); }
public static void Run() { bool initialized = false; if (File.Exists("Savefile.sav")) { try { using (FileStream fs = new FileStream("Savefile.sav", FileMode.Open, FileAccess.Read)) { BinaryFormatter bf = new BinaryFormatter(); if (fs.Length < 64) { initialized = false; } else { Object obj = bf.Deserialize(fs); Self = new Entry(((State)obj).Fix()); initialized = true; } } if (!initialized) { File.Delete("Savefile.sav"); } // Self = new Entry(JsonConvert.DeserializeObject<State>(File.ReadAllText("Savefile.json"))); } catch (Exception e) { initialized = false; throw e; } } if (!initialized) { XSSR.Seed(System.DateTime.UtcNow.Ticks); //0x1337FEEDBEEFBA5E Self = new Entry(); } Terminal.Open(); Terminal.Set("log: level=trace"); Terminal.Set("window: title='Dungeon Rising', size=90x30; font: Rogue-Zodiac-12x24.png, size=12x24, codepage=custom.txt; output: vsync=true"); Self._animationThread = new Thread(() => { Self._timer = Stopwatch.StartNew(); Self._now = Self._timer.ElapsedMilliseconds; while (true) { Self.Render(Self._timer.ElapsedMilliseconds, Self._now); } }); Self._animationThread.IsBackground = true; Self._animationThread.Start(); Self.RunEntry(); }
public State Fix() { XSSR.SetState(XSSRState); Dijkstra.Rand = new XSRandom(); Dijkstra.Height = DungeonStart.Height; Dijkstra.Width = DungeonStart.Width; Dijkstra.PhysicalMap = DungeonStart.LogicWorld; foreach (Entity e in Entities) { e.Seeker.CombinedMap = Dijkstra.PhysicalMap.Replicate(); // e.Seeker.SetGoal(e.Pos.Y, e.Pos.X); // e.Seeker.Scan(); } return(this); }
private void FinishMove() { H.S.StepsTaken = 0; Entity e = H.S.Entities[H.S.CurrentActor]; List <Position> adj = e.AdjacentToEnemy(e.Pos); if (adj.Count > 0) { Position rpos = adj[XSSR.Next(adj.Count)]; BeingDamaged.Add(H.S.Entities[rpos].Name, true); message = H.S.Entities.Attack(e.Pos, rpos); H.S.CurrentReason = WaitReason.AttackAnimating; } else { message = ""; } }
public static Position RandomMatch <T>(this T[,] mat, T test) where T : IEquatable <T> { if (mat.Length == 0) { return(new Position(-1, -1)); } int frustration = 0; int span0 = mat.GetLength(0), span1 = mat.GetLength(1); int coord0 = XSSR.Next(span0), coord1 = XSSR.Next(span1); while (frustration < 20 && !(test.Equals(mat[coord0, coord1]))) //System.Collections.Generic.EqualityComparer<T>.Default.Equals { coord0 = XSSR.Next(span0); coord1 = XSSR.Next(span1); frustration++; } if (frustration >= 20) { List <int> iii = new List <int>(span0 * span1), jjj = new List <int>(span0 * span1); for (int i = 0; i < span0; i++) { for (int j = 0; j < span1; j++) { if (test.Equals(mat[i, j])) { iii.Add(i); jjj.Add(j); } } } if (iii.Count == 0) { return(new Position(-1, -1)); } else { int idx = XSSR.Next(iii.Count); return(new Position(iii[idx], jjj[idx])); } } return(new Position(coord0, coord1)); }
//private static XSRandom XSSR = new XSRandom(); public static T RandomElement <T>(this IEnumerable <T> coll) { var list = coll.ToList(); if (!list.Any()) { return(default(T)); } int idx = 0, tgt = XSSR.Next(list.Count()); foreach (T t in list) { if (tgt == idx) { return(t); } idx++; } return(default(T)); }
public Entry() { State s = new State(); s.Entities = new EntityDictionary(); s.Initiative = new Schedule(); s.TurnsLeft = 0; s.DungeonStart = new Dungeon(TilesetType.DEFAULT_DUNGEON, 40, 40); //ROUND_ROOMS_DIAGONAL_CORRIDORS var spawnPoint = s.DungeonStart.LogicWorld.RandomMatch(Dungeon.Floor); Seeker = new Dijkstra(s.DungeonStart.LogicWorld); VisualRandom = new XSRandom(); BeingDamaged = new Dictionary <string, bool>(); // Player.Seeker.SetGoal(Player.Pos.Y, Player.Pos.X); // Player.Seeker.Scan(); for (int i = 0; i < 6; i++) { do { if (s.Entities.Contains(spawnPoint)) { spawnPoint = s.DungeonStart.LogicWorld.RandomMatch(Dungeon.Floor); continue; } Entity player = new Entity("Hero " + ((char)(65 + i)), "@" + WeaponGlyphs[i], _playerColors[i], spawnPoint.Y, spawnPoint.X, 5, 3 + XSSR.Next(4), 0).UpdateStats(health: new Gauge(10), damage: 3); // \u1202 player.Seeker = new Dijkstra(s.DungeonStart.LogicWorld); s.Entities.Add(player); spawnPoint = s.DungeonStart.LogicWorld.RandomMatch(Dungeon.Floor); break; } while (true); } for (int i = 0; i < 25; i++) { spawnPoint = s.DungeonStart.LogicWorld.RandomMatch(Dungeon.Floor); if (spawnPoint.Y >= 0 && !s.Entities.Contains(spawnPoint)) { Entity baddie = new Entity("Baddie " + (char)(65 + i), "b" + IconGlyphs.RandomElement(), _bloodRed, spawnPoint.Y, spawnPoint.X, 4, XSSR.Next(1, 5), -1); baddie.Seeker = new Dijkstra(s.DungeonStart.LogicWorld); // baddie.Seeker.SetGoal(baddie.Pos.Y, baddie.Pos.X); // baddie.Seeker.Scan(); s.Entities.Add(baddie); } } foreach (var k in s.Entities.NameToEntity.Keys) { IEnumerable <Position> foes = s.Entities.NameToEntity.Where(kv => kv.Value.Faction != s.Entities[k].Faction) .Select(e => e.Value.Pos); s.Entities[k] = s.Entities[k].AddEnemies(foes); IEnumerable <Position> friends = s.Entities.NameToEntity.Where(kv => kv.Value.Faction == s.Entities[k].Faction) .Select(e => e.Value.Pos); s.Entities[k] = s.Entities[k].AddAllies(friends); } s.StepsTaken = 0; s.XSSRState = XSSR.GetState(); H.S = s; H.ResetInitiative(); Entity first = H.S.Entities[H.S.Initiative.PeekTurn().Actor]; H.S.CurrentActor = first.Name; H.S.Cursor = first.Pos; H.S.Camera = first.Pos; if (first.Faction == 0) { Seeker.SetGoal(first.Pos.Y, first.Pos.X); Seeker.Scan(first); H.S.CurrentReason = WaitReason.Receiving; H.Remember(); } // Player.Seeker.GetPath(Player.Y, Player.X); }
public void RunEntry() { do { if (Terminal.HasInput()) { Input = Terminal.Read(); } else { continue; } if (Input == Terminal.TK_S) { H.S.XSSRState = XSSR.GetState(); using (FileStream fs = new FileStream("Savefile.sav", FileMode.Create, FileAccess.Write)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, H.S); } // File.WriteAllText("Savefile.json", JsonConvert.SerializeObject(S)); } else if (Input == Terminal.TK_LBRACKET) { continue; } else if (Input == Terminal.TK_RBRACKET) { continue; } switch (H.S.CurrentReason) { case WaitReason.WalkAnimating: { } break; case WaitReason.Receiving: { Entity acting = H.S.Entities[H.S.CurrentActor]; switch (Input) { case Terminal.TK_MOUSE_LEFT: { Position temp = new Position((Terminal.State(Terminal.TK_MOUSE_Y) - 1) + OffsetY, (Terminal.State(Terminal.TK_MOUSE_X) - 1) / 2 + OffsetX); H.S.Cursor = temp; //if (H.S.Cursor.Validate(H.S.DungeonStart.Height, H.S.DungeonStart.Width)) // acting.Seeker.GetPath(acting, acting.Pos, H.S.Cursor, acting.Stats.MoveSpeed); H.S.Cursor.MakeValid(H.S.DungeonStart.Height, H.S.DungeonStart.Width); if (acting.Seeker.Path.Contains(H.S.Cursor)) { Seeker.ClearGoals(); H.S.CurrentReason = WaitReason.WalkAnimating; } else if (H.S.Cursor == acting.Pos) { acting.Seeker.Path.Add(acting.Pos); Seeker.ClearGoals(); H.S.CurrentReason = WaitReason.WalkAnimating; } } break; case Terminal.TK_MOUSE_MOVE: { Position temp = new Position((Terminal.State(Terminal.TK_MOUSE_Y) - 1) + OffsetY, (Terminal.State(Terminal.TK_MOUSE_X) - 1) / 2 + OffsetX); H.S.Cursor = temp; if (H.S.Cursor.Validate(H.S.DungeonStart.Height, H.S.DungeonStart.Width)) { acting.Seeker.GetPath(acting, acting.Pos, H.S.Cursor, acting.Stats.MoveSpeed); } H.S.Cursor.MakeValid(H.S.DungeonStart.Height, H.S.DungeonStart.Width); } break; case Terminal.TK_LEFT: case Terminal.TK_KP_4: case Terminal.TK_H: { if (H.S.DungeonStart.LogicWorld[H.S.Entities[H.S.CurrentActor].Pos.Y, H.S.Entities[H.S.CurrentActor].Pos.X - 1] == Dungeon.Floor) { H.S.Entities.Move(H.S.CurrentActor, 0, -1); FinishMove(); } } break; case Terminal.TK_RIGHT: case Terminal.TK_KP_6: case Terminal.TK_L: { if (H.S.DungeonStart.LogicWorld[H.S.Entities[H.S.CurrentActor].Pos.Y, H.S.Entities[H.S.CurrentActor].Pos.X + 1] == Dungeon.Floor) { H.S.Entities.Move(H.S.CurrentActor, 0, 1); FinishMove(); } } break; case Terminal.TK_UP: case Terminal.TK_KP_8: case Terminal.TK_K: { if (H.S.DungeonStart.LogicWorld[H.S.Entities[H.S.CurrentActor].Pos.Y - 1, H.S.Entities[H.S.CurrentActor].Pos.X] == Dungeon.Floor) { H.S.Entities.Move(H.S.CurrentActor, -1, 0); FinishMove(); } } break; case Terminal.TK_DOWN: case Terminal.TK_KP_2: case Terminal.TK_J: { if (H.S.DungeonStart.LogicWorld[H.S.Entities[H.S.CurrentActor].Pos.Y + 1, H.S.Entities[H.S.CurrentActor].Pos.X] == Dungeon.Floor) { H.S.Entities.Move(H.S.CurrentActor, 1, 0); FinishMove(); } } break; } } break; } } while (Input != Terminal.TK_CLOSE && Input != Terminal.TK_Q); Terminal.Close(); // terminal_close(); }