Пример #1
0
 public static void Backward()
 {
     if (Prior == null)
     {
         return;
     }
     S = new State(Prior);
     XSSR.SetState(S.XSSRState);
 }
Пример #2
0
        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))]);
        }
Пример #3
0
 public static void Remember()
 {
     if (S == null)
     {
         return;
     }
     S.XSSRState = XSSR.GetState();
     Prior       = new ImmutableState(S);
 }
Пример #4
0
        public static T RandomElement <T>(this T[] arr)
        {
            if (arr.Length == 0)
            {
                return(default(T));
            }

            return(arr[XSSR.Next(arr.Length)]);
        }
Пример #5
0
        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();
        }
Пример #6
0
        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);
        }
Пример #7
0
        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 = "";
            }
        }
Пример #8
0
        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));
        }
Пример #9
0
        //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));
        }
Пример #10
0
        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);
        }
Пример #11
0
        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();
        }