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); }
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)); } }
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); }
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 }