public Level(SerializationInfo info, StreamingContext context) { mLevelTitle = (string)info.GetValue("mLevelTitle", typeof(string)); mLevelStory = (string)info.GetValue("mLevelStory", typeof(string)); mLumberjacks = (ActorBatch)info.GetValue("mLumberjacks", typeof(ActorBatch)); mDoubleAxeKillers = (ActorBatch)info.GetValue("mDoubleAxeKillers", typeof(ActorBatch)); mSilverback = (Silverback)info.GetValue("mSilverback", typeof(Silverback)); mBaboonBatch = (ActorBatch)info.GetValue("mBaboonBatch", typeof(ActorBatch)); mCapuchinBatch = (ActorBatch)info.GetValue("mCapuchinBatch", typeof(ActorBatch)); mChimpanezzeBatch = (ActorBatch)info.GetValue("mChimpanezzeBatch", typeof(ActorBatch)); mGibbonBatch = (ActorBatch)info.GetValue("mGibbonBatch", typeof(ActorBatch)); mOrangutanBatch = (ActorBatch)info.GetValue("mOrangutanBatch", typeof(ActorBatch)); mSilverbackBatch = (ActorBatch)info.GetValue("mSilverbackBatch", typeof(ActorBatch)); mSilverbackMesh = (Mesh)info.GetValue("mSilverbackMesh", typeof(Mesh)); mBaboonMesh = (Mesh)info.GetValue("mBaboonMesh", typeof(Mesh)); mCapuchinMesh = (Mesh)info.GetValue("mCapuchinMesh", typeof(Mesh)); mOrangUtanMesh = (Mesh)info.GetValue("mOrangUtanMesh", typeof(Mesh)); mGibbonMesh = (Mesh)info.GetValue("mGibbonMesh", typeof(Mesh)); mChimpanezzeMesh = (Mesh)info.GetValue("mChimpanezzeMesh", typeof(Mesh)); mHutMesh = (Mesh)info.GetValue("mHutMesh", typeof(Mesh)); mLumberjackMesh = (Mesh)info.GetValue("mLumberjackMesh", typeof(Mesh)); mDoubleAxeKillerMesh = (Mesh)info.GetValue("mDoubleAxeKillerMesh", typeof(Mesh)); mAxeMesh = (Mesh)info.GetValue("mAxeMesh", typeof(Mesh)); mHuts = (List <Hut>)info.GetValue("mHuts", typeof(List <Hut>)); mEditMode = (bool)info.GetValue("mEditMode", typeof(bool)); }
public OrangUtan(Mesh m, Terrain terrain, Silverback silverBack, Scene scene, ref Random rand) { IsApe = true; HP = 150; mMaxHP = HP; mDamage = 6; mRange = 2; mCoolDown = 1200; IsAlive = true; IsHealer = false; Actor = new Actor(m, this); Actor.mAnimator.SetStandardAnimation("idle"); mRandom = rand; mIsAttacking = false; mHasAttacked = false; mScene = scene; mQuadTree = scene.mQuadTree; mTimeElapsed = 0; mInRangeActors = new List <Actor>(); mSilverback = silverBack; mTerrain = terrain; Actor.ModelMatrix = Matrix.CreateTranslation(GenerateSilverbackVector()); mTargetPosition = new Vector3(0.0f); mDirection = new Vector2(0.0f); mLastSilverbackLocation = mSilverback.Actor.ModelMatrix.Translation; IsMoving = false; }
public DoubleAxeKiller(Mesh m, Terrain terrain, QuadTree <Actor> quadTree, Vector3 hutPosition, float innerRange, float outerRange, Scene scene, Silverback silver) { IsApe = false; mSilverback = silver; mQuadTree = quadTree; IsAlive = true; HP = 250; mMaxHP = HP; mDamage = 12; mCoolDown = 1000; mRange = 8; mView = 8; Actor = new Actor(m, this); Actor.mAnimator.SetStandardAnimation("idle"); mTerrain = terrain; mIsAttacked = false; IsHealer = false; mTimeHighlighted = 0; mHutPosition = hutPosition; mInnerRange = innerRange; mOuterRange = outerRange; mScene = scene; Actor.ModelMatrix = Matrix.CreateTranslation(GetOffsetInRange(innerRange, outerRange) + hutPosition); // Lets check if we can spawn there while (true) { var nearby = mQuadTree.QueryRectangle(Actor.mBoundingRectangle.GetAxisAlignedRectangle(1)); bool collides = false; foreach (var actor in nearby) { if (actor.mBoundingRectangle.IntersectsRectangle(Actor.mBoundingRectangle, true)) { collides = true; } } if (!collides) { break; } else { Actor.ModelMatrix = Matrix.CreateTranslation(GetOffsetInRange(innerRange, outerRange) + hutPosition); } } mHasAttacked = false; IsMoving = false; }
public Hut(SerializationInfo info, StreamingContext context) { mNumLumberjacks = (int)info.GetValue("mNumLumberjacks", typeof(int)); mSpawned = (bool)info.GetValue("mSpawned", typeof(bool)); mScene = (Scene)info.GetValue("mScene", typeof(Scene)); mLumberjackMesh = (Mesh)info.GetValue("mLumberjackMesh", typeof(Mesh)); mDoubleAxeKillerMesh = (Mesh)info.GetValue("mDoubleAxeKillerMesh", typeof(Mesh)); mAxeMesh = (Mesh)info.GetValue("mAxeMesh", typeof(Mesh)); mSilverback = (Silverback)info.GetValue("mSilverback", typeof(Silverback)); mDistanceSilverbackHut = (float)info.GetValue("mDistanceSilverbackHut", typeof(float)); mWasInInnerRange = (bool)info.GetValue("mWasInInnerRange", typeof(bool)); mLumberjacks = (List <Lumberjack.Lumberjack>)info.GetValue("mLumberjacks", typeof(List <Lumberjack.Lumberjack>)); mDoubleAxeKillers = (List <DoubleAxeKiller>)info.GetValue("mDoubleAxeKillers", typeof(List <DoubleAxeKiller>)); HP = (int)info.GetValue("HP", typeof(int)); IsAlive = (bool)info.GetValue("IsAlive", typeof(bool)); Actor = (Actor)info.GetValue("Actor", typeof(Actor)); Name = (string)info.GetValue("Name", typeof(string)); HasSoundEmitter = (bool)info.GetValue("HasSoundEmitter", typeof(bool)); }
public Hut(Mesh hut, Mesh lumberjack, Mesh doubleAxeKiller, Mesh axeMesh, Silverback silverback, Scene scene, int hp, float innerRange, float outerRange, bool techdemo) { mTechDemo = techdemo; mId = mAmount++; // HP of the hut are equal to the number of the lumberjacks that were spawned at this hut. // Each time one of the spawned lumberjacks dies, the hut loses 1 HP. // The number of lumberjacks that a hut can spawn should be dynamic based on the level (different levels could allow the player // to have a different number of apes to summon) HP = hp; mSpawned = false; mSilverback = silverback; mLumberjackMesh = lumberjack; mDoubleAxeKillerMesh = doubleAxeKiller; mAxeMesh = axeMesh; mScene = scene; Actor = new Actor(hut, this); mInnerRange = innerRange; mOuterRange = outerRange; mLumberjacks = new List <Lumberjack.Lumberjack>(); mDoubleAxeKillers = new List <DoubleAxeKiller>(); }
public void LoadContent(GraphicsDeviceManager deviceManager, ContentManager contentManager, int windowWidth, int windowHeight) { var currentDirectoryPath = Directory.GetCurrentDirectory(); Directory.SetCurrentDirectory("../../../../Content"); var graphicsDevice = deviceManager.GraphicsDevice; // Create a new content manager so we can unload all its content later mContentManager = new ContentManager(contentManager.ServiceProvider, contentManager.RootDirectory); mSpriteBatch = new SpriteBatch(graphicsDevice); var font = mContentManager.Load <SpriteFont>("Font"); var modelLoader = new ModelLoader(graphicsDevice); var texture2D = UIv2.Menu.CreateTexture2D(graphicsDevice, 50, 30, pixel => Color.Black); mMenu = new UIv2.Menu(graphicsDevice, 0, 0, 100, 4); mMenu.NonSolid(); mLabel = new UIv2.Components.Label(graphicsDevice, 0, 0, 25, 100, "", font, Color.Orange); mLabel.AddTo(mMenu); var backButton = new UIv2.Components.Button(graphicsDevice, 90, 0, 10, 100, texture2D, "Back", font, Color.White); backButton.AddTo(mMenu); backButton.AddListener(MouseButtons.Left, InputState.Pressed, () => { ScreenManager.Remove(this); IsVisible = false; }); mRenderTarget = new RenderTarget(graphicsDevice, Options.ResolutionWidth, Options.ResolutionHeight, 1); mMasterRenderer = new MasterRenderer(graphicsDevice, mContentManager) { DebugMode = false }; mCamera = new Camera(farPlane: Options.ViewingDistance, nearPlane: 0.5f, thirdPerson: true, location: new Vector3(0.0f, 0.0f, -110.0f)); mCameraHandler = new CameraHandler(mCamera, 4.0f, 2.0f, .3f); mScene = new Scene(); var staticObjectsRectangles = new List <CollisionRectangle>(); mScene.mQuadTree = new QuadTree <Actor>(new Rectangle(-128, -128, 256, 256), 4, 10); mScene.mTerrain = new Terrain(mContentManager, graphicsDevice, "Terrain/level1 heightmap.png", "Terrain/techdemoTexture.png"); mScene.Add(mScene.mTerrain); var obstacleMesh = modelLoader.LoadMesh("Mesh/beerbottle2.obj"); var random = new Random(); for (var i = 0; i < ObstacleCount; i++) { var x = (2.0f * (float)random.NextDouble() - 1.0f) * ObstacleRadius; var z = (2.0f * (float)random.NextDouble() - 1.0f) * ObstacleRadius; var vector = new Vector3(x, 0.0f, z) + new Vector3(20.0f, 0.0f, -100.0f); vector.Y = mScene.mTerrain.GetHeight(vector); var actor = new Actor(obstacleMesh) { ModelMatrix = Matrix.CreateTranslation(vector) }; mScene.Add(actor); mScene.mQuadTree.Insert(actor, actor.mBoundingRectangle.GetAxisAlignedRectangle(1)); staticObjectsRectangles.Add(actor.mBoundingRectangle); } mScene.mVisibilityGraph = new Pathfinding.VisibilityGraph(staticObjectsRectangles, new Rectangle(-128, -128, 256, 256), 0.0f, false); var hutMesh = modelLoader.LoadMesh("Mesh/spawningcabin_scaled 0.015.fbx"); var lumberjackMesh = modelLoader.LoadMesh("Mesh/lumberjack_minimal_noanimation.obj"); var doubleAxeKillerMesh = modelLoader.LoadMesh("Mesh/lumberjack_distance_idle.fbx"); modelLoader.LoadAnimation(doubleAxeKillerMesh, "Mesh/lumberjack_distance_walk.fbx"); modelLoader.LoadAnimation(doubleAxeKillerMesh, "Mesh/lumberjack_distance_hit.fbx"); modelLoader.LoadAnimation(doubleAxeKillerMesh, "Mesh/lumberjack_distance_run.fbx"); var axeMesh = modelLoader.LoadMesh("Mesh/axe.fbx"); var silverbackMesh = modelLoader.LoadMesh("Mesh/gorilla_idle.fbx"); modelLoader.LoadAnimation(silverbackMesh, "Mesh/gorilla_walking.fbx"); modelLoader.LoadAnimation(silverbackMesh, "Mesh/gorilla_smash.fbx"); var capuchinMesh = modelLoader.LoadMesh("Mesh/kapuziner_idle.fbx"); modelLoader.LoadAnimation(capuchinMesh, "Mesh/kapuziner_walk.fbx"); modelLoader.LoadAnimation(capuchinMesh, "Mesh/kapuziner_heal.fbx"); mSilverback = new Silverback(new Vector3(0.0f, 0.0f, -110.0f), new Vector2(0.0f), silverbackMesh); mScene.Add(mSilverback); var otherSilverback = new Silverback(new Vector3(0.0f, 0.0f, -110.0f), new Vector2(0.0f), silverbackMesh); mSubApe = new Capuchin(capuchinMesh, mScene.mTerrain, otherSilverback, mScene, ref random); mScene.Add(mSubApe); var hut = new Hut(hutMesh, lumberjackMesh, doubleAxeKillerMesh, axeMesh, mSilverback, mScene, 1000, 100.0f, 110.0f, true); mScene.Add(hut); mScene.mPostProcessing.mBloom.Activated = false; mScene.mPostProcessing.mFxaa.Activated = false; mScene.mSky.Light.mShadow.mActivated = false; mCamera.UpdatePerspective(); Directory.SetCurrentDirectory(currentDirectoryPath); }
public Level(ContentManager contentManager, SoundManager soundManager, GraphicsDevice device, bool editMode) : base() { mContentManager = contentManager; mSoundManager = soundManager; mDevice = device; mEditMode = editMode; var currentDirectoryPath = Directory.GetCurrentDirectory(); if (!currentDirectoryPath.EndsWith("Content") && !currentDirectoryPath.EndsWith("Content/") && !currentDirectoryPath.EndsWith("Content\\")) { Directory.SetCurrentDirectory("../../../../Content"); } mModelLoader = new ModelLoader(device); mQuadTree = new QuadTree <Actor>(new Rectangle(-128, -128, 256, 256), 4, 7); // Load silverback mSilverback = new Silverback(new Vector3(0.0f), new Vector2(0.0f), mModelLoader.LoadMesh("Mesh/gorilla_idle.fbx")); mSilverback.mQuadTree = mQuadTree; mHutMesh = mModelLoader.LoadMesh("Mesh/spawningcabin_scaled 0.015.fbx"); mHuts = new List <Hut>(); Hut.mAmount = 0; mGlobalSoundSourceBuffer = new AudioBuffer("Audio/ForestSoundMono.wav"); mGlobalSoundSource = new AudioSource(mGlobalSoundSourceBuffer); mGlobalSoundSource.Relative = true; mSoundManager.AddSound(mGlobalSoundSource); mInitialSilverbackLocation = new Vector3(0.0f); if (!mEditMode) { mSilverback.Actor.mAnimator.SetStandardAnimation("idle"); mModelLoader.LoadAnimation(mSilverback.Actor.mMesh, "Mesh/gorilla_walking.fbx"); mModelLoader.LoadAnimation(mSilverback.Actor.mMesh, "Mesh/gorilla_smash.fbx"); Add(mSilverback); mQuadTree.Insert(mSilverback.Actor, mSilverback.Actor.mBoundingRectangle.GetAxisAlignedRectangle(1)); // Load all the other meshes // Load Lumberjack mesh mLumberjackMesh = mModelLoader.LoadMesh("Mesh/lumberjack_idle.fbx"); mModelLoader.LoadAnimation(mLumberjackMesh, "Mesh/lumberjack_walk.fbx"); mModelLoader.LoadAnimation(mLumberjackMesh, "Mesh/lumberjack_hit.fbx"); mModelLoader.LoadAnimation(mLumberjackMesh, "Mesh/lumberjack_run.fbx"); mLumberjacks = new ActorBatch(mLumberjackMesh, true); mActorBatches.Add(mLumberjacks); // Load DoubleAxeKiller mesh mDoubleAxeKillerMesh = mModelLoader.LoadMesh("Mesh/lumberjack_distance_idle.fbx"); mModelLoader.LoadAnimation(mDoubleAxeKillerMesh, "Mesh/lumberjack_distance_walk.fbx"); mModelLoader.LoadAnimation(mDoubleAxeKillerMesh, "Mesh/lumberjack_distance_hit.fbx"); mModelLoader.LoadAnimation(mDoubleAxeKillerMesh, "Mesh/lumberjack_distance_run.fbx"); mDoubleAxeKillers = new ActorBatch(mDoubleAxeKillerMesh, true); mActorBatches.Add(mDoubleAxeKillers); // Load Baboon Mesh mBaboonMesh = mModelLoader.LoadMesh("Mesh/gibbon_idle.fbx"); mModelLoader.LoadAnimation(mBaboonMesh, "Mesh/gibbon_walk.fbx"); mModelLoader.LoadAnimation(mBaboonMesh, "Mesh/gibbon_singing.fbx"); mBaboonBatch = new ActorBatch(mBaboonMesh, true); mActorBatches.Add(mBaboonBatch); // Load Capuchin Mesh mCapuchinMesh = mModelLoader.LoadMesh("Mesh/kapuziner_idle.fbx"); mModelLoader.LoadAnimation(mCapuchinMesh, "Mesh/kapuziner_walk.fbx"); mModelLoader.LoadAnimation(mCapuchinMesh, "Mesh/kapuziner_heal.fbx"); mCapuchinBatch = new ActorBatch(mCapuchinMesh, true); mActorBatches.Add(mCapuchinBatch); // Load Chimpanezze Mesh mChimpanezzeMesh = mModelLoader.LoadMesh("Mesh/chimp_idle.fbx"); mModelLoader.LoadAnimation(mChimpanezzeMesh, "Mesh/chimp_walk.fbx"); mModelLoader.LoadAnimation(mChimpanezzeMesh, "Mesh/chimp_attack.fbx"); mChimpanezzeBatch = new ActorBatch(mChimpanezzeMesh, true); mActorBatches.Add(mChimpanezzeBatch); // Load Gibbon Mesh mGibbonMesh = mModelLoader.LoadMesh("Mesh/Gibbon_idle.fbx"); mModelLoader.LoadAnimation(mGibbonMesh, "Mesh/Gibbon_walk.fbx"); mModelLoader.LoadAnimation(mGibbonMesh, "Mesh/Gibbon_singing.fbx"); mGibbonBatch = new ActorBatch(mGibbonMesh, true); mActorBatches.Add(mGibbonBatch); // Load Orang Utan Mesh mOrangUtanMesh = mModelLoader.LoadMesh("Mesh/orangutan_idle.fbx"); mModelLoader.LoadAnimation(mOrangUtanMesh, "Mesh/orangutan_walk.fbx"); mModelLoader.LoadAnimation(mOrangUtanMesh, "Mesh/orangutan_throw.fbx"); mOrangutanBatch = new ActorBatch(mOrangUtanMesh, true); mActorBatches.Add(mOrangutanBatch); mAxeMesh = mModelLoader.LoadMesh("Mesh/axe.fbx"); } mPostProcessing.mBloom.Activated = Options.Bloom; mPostProcessing.mBloom.mPasses = Options.BloomPasses; mPostProcessing.mFxaa.Activated = Options.Fxaa; mSky.Light.mShadow.mActivated = Options.Shadows; mSky.Light.mShadow.mDistance = Options.ShadowDistance; mSky.Light.mShadow.mNumSamples = Options.ShadowSamples; mSky.Light.mShadow.mBias = Options.ShadowBias; Directory.SetCurrentDirectory(currentDirectoryPath); }
public static string ReinitialseSavegame(ref HudScreen hudScreen) { if (!File.Exists(PauseScreen.GetSavedGamesPath() + "\\Camera.xml") || !File.Exists(PauseScreen.GetSavedGamesPath() + "\\CapuchinPositions.xml") || !File.Exists(PauseScreen.GetSavedGamesPath() + "\\ChimpPositions.xml") || !File.Exists(PauseScreen.GetSavedGamesPath() + "\\GibbonPositions.xml") || !File.Exists(PauseScreen.GetSavedGamesPath() + "\\HudScreen.xml") || !File.Exists(PauseScreen.GetSavedGamesPath() + "\\Huts.xml") || !File.Exists(PauseScreen.GetSavedGamesPath() + "\\Level.xml") || !File.Exists(PauseScreen.GetSavedGamesPath() + "\\OrangPositions.xml") || !File.Exists(PauseScreen.GetSavedGamesPath() + "\\Silverback.xml")) { return("There are missing files"); } var serializer = new XmlSerializer(typeof(Camera)); using (var fs = File.OpenRead(GetSavedGamesPath() + "\\Camera.xml")) { Camera camera = null; try { camera = (Camera)serializer.Deserialize(fs); } catch (Exception ex) { return(ex.ToString()); } hudScreen.mGameScreen.mCamera = camera; hudScreen.mGameScreen.mCameraHandler.mCamera = camera; fs.Close(); } serializer = new XmlSerializer(typeof(Level), new XmlRootAttribute("Level")); using (var fs = File.OpenRead(GetSavedGamesPath() + "\\Level.xml")) { Level level = null; try { level = (Level)serializer.Deserialize(fs); } catch (Exception ex) { return(ex.ToString()); } hudScreen.mGameScreen.mLevel.Dispose(); hudScreen.mGameScreen.mLevel = level; hudScreen.mGameScreen.mLevel?.Load(level?.mLevelFilename); fs.Close(); } if (hudScreen.mGameScreen.mLevel != null) { var oldSilverback = hudScreen.mGameScreen.mLevel.mSilverback; } serializer = new XmlSerializer(typeof(Silverback)); using (var fs = File.OpenRead(PauseScreen.GetSavedGamesPath() + "\\Silverback.xml")) { Silverback silverback = null; try { silverback = (Silverback)serializer.Deserialize(fs); } catch (Exception ex) { return(ex.ToString()); } if (hudScreen.mGameScreen.mLevel != null) { if (silverback != null) { hudScreen.mGameScreen.mLevel.mSilverback.HP = silverback.HP; } } fs.Close(); } serializer = new XmlSerializer(typeof(List <Matrix>)); using (var fs = File.OpenRead(PauseScreen.GetSavedGamesPath() + "\\CapuchinPositions.xml")) { var positions = new List <Matrix>(); try { positions = (List <Matrix>)serializer.Deserialize(fs); var rand = new Random(); foreach (var matrix in positions) { if (hudScreen.mGameScreen.mLevel != null) { var mcapuchin = new Capuchin(hudScreen.mGameScreen.mLevel.mCapuchinMesh, hudScreen.mGameScreen.mLevel.mTerrain, hudScreen.mGameScreen.mLevel.mSilverback, hudScreen.mGameScreen.mLevel, ref rand); mcapuchin.Actor.ModelMatrix = matrix; hudScreen.mGameScreen.mLevel.Add(mcapuchin); } LumberChoice.AddApe(3); } } catch (Exception) { // ignored } fs.Close(); } using (var fs = File.OpenRead(PauseScreen.GetSavedGamesPath() + "\\GibbonPositions.xml")) { var positions = new List <Matrix>(); try { positions = (List <Matrix>)serializer.Deserialize(fs); var rand = new Random(); foreach (var matrix in positions) { if (hudScreen.mGameScreen.mLevel != null) { var gibbon = new Gibbon(hudScreen.mGameScreen.mLevel.mGibbonMesh, hudScreen.mGameScreen.mLevel.mTerrain, hudScreen.mGameScreen.mLevel.mSilverback, hudScreen.mGameScreen.mLevel, ref rand); gibbon.Actor.ModelMatrix = matrix; hudScreen.mGameScreen.mLevel.Add(gibbon); } LumberChoice.AddApe(4); } } catch (Exception) { // ignored } fs.Close(); } using (var fs = File.OpenRead(PauseScreen.GetSavedGamesPath() + "\\ChimpPositions.xml")) { var positions = new List <Matrix>(); try { positions = (List <Matrix>)serializer.Deserialize(fs); var rand = new Random(); foreach (var matrix in positions) { if (hudScreen.mGameScreen.mLevel != null) { var chimp = new Chimpanezee(hudScreen.mGameScreen.mLevel.mChimpanezzeMesh, hudScreen.mGameScreen.mLevel.mTerrain, hudScreen.mGameScreen.mLevel.mSilverback, hudScreen.mGameScreen.mLevel, ref rand); chimp.Actor.ModelMatrix = matrix; hudScreen.mGameScreen.mLevel.Add(chimp); } LumberChoice.AddApe(1); } } catch (Exception) { // ignored } fs.Close(); } using (var fs = File.OpenRead(PauseScreen.GetSavedGamesPath() + "\\OrangPositions.xml")) { var positions = new List <Matrix>(); try { positions = (List <Matrix>)serializer.Deserialize(fs); var rand = new Random(); foreach (var matrix in positions) { if (hudScreen.mGameScreen.mLevel != null) { var orang = new OrangUtan(hudScreen.mGameScreen.mLevel.mOrangUtanMesh, hudScreen.mGameScreen.mLevel.mTerrain, hudScreen.mGameScreen.mLevel.mSilverback, hudScreen.mGameScreen.mLevel, ref rand); orang.Actor.ModelMatrix = matrix; hudScreen.mGameScreen.mLevel.Add(orang); } LumberChoice.AddApe(2); } } catch (Exception) { // ignored } fs.Close(); } serializer = new XmlSerializer(typeof(List <Hut>)); using (var fs = File.OpenRead(PauseScreen.GetSavedGamesPath() + "\\Huts.xml")) { try { Hut.mAmount = 0; var huts = (List <Hut>)serializer.Deserialize(fs) ?? new List <Hut>(); if (hudScreen.mGameScreen.mLevel != null) { // hudScreen.mGameScreen.mLevel.mHuts = hudScreen.mGameScreen.mLevel.mHuts.Except(huts).ToList(); if (hudScreen.mGameScreen.mLevel != null) { // Remove dead huts from ...mLevel.mHuts var tmpHuts = new List <Hut>(); // Yeah this is bad foreach (var h in huts) { foreach (var hut in hudScreen.mGameScreen.mLevel.mHuts) { if (h.mId == hut.mId) { tmpHuts.Add(hut); } } } hudScreen.mGameScreen.mLevel.mHuts.Clear(); hudScreen.mGameScreen.mLevel.mHuts.AddRange(tmpHuts); var screen = hudScreen; var hutActorBatch = hudScreen.mGameScreen.mLevel.mActorBatches.Find(ele => ele.mMesh == screen.mGameScreen.mLevel.mHutMesh); var tmpActors = new List <Actor>(); foreach (var actor in hutActorBatch.mActors) { foreach (var hut in hudScreen.mGameScreen.mLevel.mHuts) { if (hut.Actor == actor) { tmpActors.Add(actor); } } } hutActorBatch.mActors.Clear(); hutActorBatch.mActors.AddRange(tmpActors); var i = 0; foreach (var hut in hudScreen.mGameScreen.mLevel.mHuts) { // var contains = false; // foreach (var h in huts) // { // if (h.mId == hut.mId) // { // contains = true; // } // } // // if (!contains) // { // hudScreen.mGameScreen.mLevel.mHuts.Remove(hut); // continue; // } hut.mSilverback = hudScreen.mGameScreen.mLevel.mSilverback; hut.mAxeMesh = hudScreen.mGameScreen.mLevel.mAxeMesh; hut.mDoubleAxeKillerMesh = hudScreen.mGameScreen.mLevel.mDoubleAxeKillerMesh; hut.mScene = hudScreen.mGameScreen.mLevel; hut.mLumberjackMesh = hudScreen.mGameScreen.mLevel.mLumberjackMesh; hut.HP = huts[i++].HP; } } } } catch (Exception) { // ignored } fs.Close(); } Hut.mAmount = 0; return(""); }