public override void Initialize(ItemLocationMap _, GCM gameContentManager)
        {
            GameContentManager = gameContentManager;

            var saveFile      = (GameSave)Dynamic.SaveFile;
            var seed          = saveFile.GetSeed();
            var fillingMethod = saveFile.GetFillingMethod();

            if (!seed.HasValue)
            {
                seed = Seed.Zero;
            }

            Console.Out.WriteLine($"Seed: {seed}");

            seedOptions = seed.Value.Options;

            ItemLocations = Randomizer.Randomize(seed.Value, fillingMethod);
            ItemLocations.BaseOnSave(Level.GameSave);

            ItemTrackerUplink.UpdateState(ItemTrackerState.FromItemLocationMap(ItemLocations));

            LevelReflected._random = new DeRandomizer(LevelReflected._random, seed.Value);

            ItemManipulator.Initialize(ItemLocations);
        }
        void LoadObtainedProgressionItemsFromSave(Level level)
        {
            var itemsInMap = this.Select(l => l.ItemInfo.Identifier)
                             .Distinct().ToHashSet();

            var updateTracker = false;

            foreach (var progressionItem in UnlockingMap.AllProgressionItems)
            {
                if (level.GameSave.HasItem(progressionItem) && !itemsInMap.Contains(progressionItem))
                {
                    var item = new SingleItemInfo(UnlockingMap, progressionItem);

                    item.OnPickup(level);

                    Add(new ExternalItemLocation(item));

                    updateTracker = true;
                }
            }

            if (updateTracker)
            {
                ItemTrackerUplink.UpdateState(ItemTrackerState.FromItemLocationMap(this));
            }
        }
        public void Parralel_read_and_writes_should_not_throw_exception()
        {
            var originalState = new ItemTrackerState
            {
                CardA       = true,
                Dash        = true,
                FireRing    = true,
                DoubleJump  = true,
                Timestop    = false,
                CardB       = false,
                PyramidKeys = false,
                DinsFire    = false
            };

            ItemTrackerUplink.UpdateState(originalState);
            ItemTrackerUplink.LoadState();

            var writer = Task.Factory.StartNew(() => {
                for (int i = 0; i < 1000; i++)
                {
                    ItemTrackerUplink.UpdateState(originalState);
                }
            });

            var reader = Task.Factory.StartNew(() => {
                for (int i = 0; i < 1000; i++)
                {
                    var retreivedState = ItemTrackerUplink.LoadState();
                    Assert.IsTrue(retreivedState.CardA);
                }
            });

            Task.WaitAll(writer, reader);
        }
        public void Should_save_and_read_item_tracker_state()
        {
            var originalState = new ItemTrackerState
            {
                CardA       = true,
                Dash        = true,
                FireRing    = true,
                DoubleJump  = true,
                Timestop    = false,
                CardB       = false,
                PyramidKeys = false,
                DinsFire    = false
            };

            ItemTrackerUplink.UpdateState(originalState);

            var retreivedState = ItemTrackerUplink.LoadState();

            Assert.IsTrue(retreivedState.CardA);
            Assert.IsTrue(retreivedState.Dash);
            Assert.IsTrue(retreivedState.FireRing);
            Assert.IsTrue(retreivedState.DoubleJump);
            Assert.IsFalse(retreivedState.Timestop);
            Assert.IsFalse(retreivedState.CardB);
            Assert.IsFalse(retreivedState.PyramidKeys);
            Assert.IsFalse(retreivedState.DinsFire);
        }
Beispiel #5
0
        public override void Initialize(ItemLocationMap itemLocationMap, GCM gameContentManager)
        {
            Action <GameSave> originalReloadSaveAction = Dynamic._reloadSaveAction;

            void ReloadSave(GameSave gameSave)
            {
                itemLocationMap.Initialize(gameSave);

                ItemTrackerUplink.UpdateState(ItemTrackerState.FromItemLocationMap(itemLocationMap));

                originalReloadSaveAction(gameSave);
            }

            Dynamic._reloadSaveAction = (Action <GameSave>)ReloadSave;
        }
        void ReceiveItem(NetworkItem networkItem, Level level)
        {
            if (TryGetLocation(networkItem, out var location) && networkItem.Player == slot)
            {
                //ignore message if its from my slot and a location i already picked up
                if (location.IsPickedUp && personalLocationItemKeys.Contains(location.Key))
                {
                    return;
                }
            }
            else
            {
                location = new ExternalItemLocation();

                Add(location);
            }

            if (!TryGetItemIdentifier(networkItem, out var itemIdentifier))
            {
                return;
            }

            // itemInfoProvider's cache is out of date here when it comes to pyramid unlocks
            var item = new SingleItemInfo(UnlockingMap, itemIdentifier);

            location.SetItem(item);

            location.IsPickedUp = true;
            item.OnPickup(level);

            level.GameSave.AddItem(level, itemIdentifier);

            if (itemIdentifier.LootType == LootType.ConstRelic)
            {
                level.AsDynamic().UnlockRelic(itemIdentifier.Relic);
            }

            if (!firstPass || item.IsProgression)
            {
                level.ShowItemAwardPopup(itemIdentifier);
            }

            if (item.IsProgression)
            {
                ItemTrackerUplink.UpdateState(ItemTrackerState.FromItemLocationMap(this));
            }
        }
Beispiel #7
0
        protected override void Update(GameTime gameTime)
        {
            if (oneTimeSetup)
            {
                Window.AllowUserResizing  = true;
                Window.ClientSizeChanged += Window_ClientSizeChanged;
                oneTimeSetup              = false;
            }

            if (IsActive)
            {
                mouseInputHandler.Update(gameTime);
            }

            trackerUpdateTimer += gameTime.ElapsedGameTime.TotalMilliseconds;
            if (trackerUpdateTimer > 1000)
            {
                trackerState = ItemTrackerUplink.LoadState();

                trackerUpdateTimer = 0;
            }

            base.Update(gameTime);
        }
Beispiel #8
0
        public override void Initialize(ItemLocationMap _, GCM gameContentManager)
        {
            GameContentManager = gameContentManager;

            var saveFile      = Save;
            var seed          = saveFile.GetSeed();
            var fillingMethod = saveFile.GetFillingMethod();
            var settings      = saveFile.GetSettings();

            ScreenManager.Log.SetSettings(settings);
            gameContentManager.UpdateMinimapColors(settings);

            if (!seed.HasValue)
            {
                seed = Seed.Zero;
            }

            Console.Out.WriteLine($"Seed: {seed}");

            seedOptions = seed.Value.Options;
            Settings    = settings;

            try
            {
                ItemLocations = Randomizer.Randomize(seed.Value, fillingMethod, Level.GameSave);
            }
            catch (ConnectionFailedException e)
            {
                SendBackToMainMenu(e.Message);
                return;
            }

            ItemLocations.Initialize(Level.GameSave);

            ItemTrackerUplink.UpdateState(ItemTrackerState.FromItemLocationMap(ItemLocations));

            LevelReflected._random = new DeRandomizer(LevelReflected._random, seed.Value);

            ItemManipulator.Initialize(ItemLocations);

            if (settings.DamageRando.Value != "Off")
            {
                OrbDamageManager.PopulateOrbLookups(Level.GameSave, settings.DamageRando.Value, settings.DamageRandoOverrides.Value);
            }

            BestiaryManager.UpdateBestiary(Level, settings);
            if (!saveFile.GetSaveBool("IsFightingBoss"))
            {
                BestiaryManager.RefreshBossSaveFlags(Level);
            }

            if (seedOptions.Archipelago)
            {
                Client.SetStatus(ArchipelagoClientState.ClientPlaying);

                deathLinkService = new DeathLinker(settings, Client.GetDeathLinkService());
            }

#if DEBUG
            ScreenManager.Console.AddCommand(new TeleportCommand(() => Level));
            ScreenManager.Console.AddCommand(new GiveRelicCommand(() => Level));
            ScreenManager.Console.AddCommand(new GiveOrbCommand(() => Level));
            ScreenManager.Console.AddCommand(new GiveFamiliarCommand(() => Level));
#endif
        }