private void Game_KeyRelease(char key) { if (IsMoving) { return; } //I don't like this system, what with the key release events and such Dictionary <char, char> CtrlChars = new Dictionary <char, char> { { '\u001a', 'Z' }, { '\u0018', 'X' }, { '\u0003', 'C' }, }; if (CtrlChars.Keys.Contains(key)) { key = CtrlChars[key]; } key = char.ToUpper(key); if (key == 'Z' && !IsMoving && Reticle.ReticleOn != Tile.TileType.Grass && spriteIndex != "player_use") { ChangeAction("player_use"); Tile.ChangeTile(Reticle.GridX, Reticle.GridY, Tile.TileType.Grass); } else if (key == 'X' && !IsMoving && Reticle.ReticleOn != Tile.TileType.Water && GameObject.Objects.Find(x => x.GridX == Reticle.GridX && x.GridY == Reticle.GridY) == null && spriteIndex != "player_use") { ChangeAction("player_use"); Tile.ChangeTile(Reticle.GridX, Reticle.GridY, Tile.TileType.Dirt); } else if (key == 'C' && !IsMoving && StandingOn != Tile.TileType.Water && spriteIndex != "player_punch" && spriteIndex != "player_kick") { GameObject obj = GameObject.Objects.Find(x => x.GridX == Reticle.GridX && x.GridY == Reticle.GridY && x is IHittable); if (obj != null) { ChangeAction(Game.R.Next(2) == 0 ? "player_kick" : "player_punch"); ((IHittable)obj).Hit(Strength, this); } else { Character character = Characters.Find(x => x is IHittable && x.GridX == Reticle.GridX && x.GridY == Reticle.GridY); if (character != null) { new SoundPlayer(Properties.Resources.Hit_Hurt).Play(); ChangeAction(Game.R.Next(2) == 0 ? "player_kick" : "player_punch"); ((IHittable)character).Hit(Strength, this); } } } else if (key == 'I') { Dorf dorf = (Dorf)Characters.FirstOrDefault(x => x is Dorf && x.GridX == Reticle.GridX && x.GridY == Reticle.GridY); if (dorf != null) { InspectForm inspect = new InspectForm(dorf); inspect.Show(); } } }
public InspectForm(Dorf dorf) { InitializeComponent(); this.dorf = dorf; Text = dorf.Name; UpdateStats(); updateTmr.Interval = 100; updateTmr.Start(); updateTmr.Tick += UpdateTmr_Tick; }
public Egg(Dorf parent) : base(parent.GridX, parent.GridY) { if (Tile.Map[GridX, GridY].Type != Tile.TileType.Grass || Objects.Any(x => x.GridX == parent.GridX && x.GridY == parent.GridY)) { return; } Stamina = parent.Stamina; Hunger = parent.Hunger; Thirst = parent.Thirst; Generation = parent.Generation + 1; Radiation = parent.Radiation; Strength = parent.Strength; Intelligence = parent.Intelligence; Speed = parent.Speed; imageIndex = 0; Solid = true; StatusUpdate += Game.UpdateStatus; Objects.Add(this); }
private void Game_GameStep() { if (Keyboard.IsKeyDown(Key.S) && !Grabbing) { Dorf dorf = (Dorf)Character.Characters.FirstOrDefault(x => x is Dorf && x.GridX == GridX && x.GridY == GridY); if (dorf != null && dorf.Grab()) { Grabbing = true; return; } GameObject obj = GameObject.Objects.FirstOrDefault(x => x.GridX == GridX && x.GridY == GridY); if (obj is IGrabbable && ((IGrabbable)obj).Grab()) { Grabbing = true; return; } } else if (Keyboard.IsKeyUp(Key.S) && Grabbing) { Dorf dorf = (Dorf)Character.Characters.FirstOrDefault(x => x is Dorf && x.GridX == GridX && x.GridY == GridY); if (dorf != null && dorf.IsGrabbed) { dorf.LetGo(); Grabbing = false; return; } GameObject obj = GameObject.Objects.FirstOrDefault(x => x.GridX == GridX && x.GridY == GridY); if (obj is IGrabbable && ((IGrabbable)obj).Grab()) { ((IGrabbable)obj).LetGo(); Grabbing = false; return; } } }
protected override void Step() { base.Step(); if (animTimer % 10 == 0 && ++imageIndex > Sprites.CharacterRects[spriteIndex].Count - 1) { imageIndex = 0; if (currentState == PredState.Emerge) { nextState = PredState.Idle; } } if (currentState != nextState) { stateTimer = 0; } currentState = nextState; int xMove, yMove; switch (currentState) { case PredState.Emerge: ChangeSprite("pred_emerge"); break; case PredState.Idle: ChangeSprite("pred_idle"); if (!IsMoving) { Dorf foundFood = (Dorf)Characters.FirstOrDefault(x => x is Dorf && Math.Abs(x.GridX - GridX) < 5 && Math.Abs(x.GridY - GridY) < 5); if (foundFood != null) { nextState = PredState.ChaseDorf; } else { bool horizontal = Game.R.Next(2) == 0; Move(horizontal ? Game.R.Next(3) - 1 : 0, horizontal ? 0 : Game.R.Next(3) - 1); nextState = PredState.Wander; } } break; case PredState.Wander: ChangeSprite("pred_run"); if (!IsMoving) { nextState = PredState.Idle; } break; case PredState.ChaseDorf: ChangeSprite("pred_run"); if (!IsMoving) { Dorf foundFood = (Dorf)Characters.FirstOrDefault(x => x is Dorf && Math.Abs(x.GridX - GridX) + Math.Abs(x.GridY - GridY) == 1); if (foundFood != null && StandingOn != Tile.TileType.Water) { nextState = PredState.Attack; } else { if (localView.MoveToward(localView.GetNearestCharacter(typeof(Dorf)), out xMove, out yMove) && !Game.GridPointOccupied(GridX + xMove, GridY + yMove, true, this)) { Move(xMove, yMove); } else { //Move randomly until it can get to the Dorf bool horizontal = Game.R.Next(2) == 0; Move(horizontal ? Game.R.Next(3) - 1 : 0, horizontal ? 0 : Game.R.Next(3) - 1); } } } break; case PredState.Attack: ChangeSprite("pred_attack"); if (stateTimer == 0) { Dorf foundFood = (Dorf)Characters.FirstOrDefault(x => x is Dorf && Math.Abs(x.GridX - GridX) + Math.Abs(x.GridY - GridY) == 1); if (foundFood != null) { new SoundPlayer(Properties.Resources.Hit_Hurt2).Play(); foundFood.Hit(Strength, this); } } else if (stateTimer > 40) { nextState = PredState.Idle; } break; case PredState.Hurt: ChangeSprite("pred_hurt"); if (stateTimer >= 30) { nextState = PredState.Idle; } break; } }