public static void Update(GameTime gameTime) { for (var node = _list.First; node != null;) { var npc = node.Value; var next = node.Next; npc.Update(gameTime); if (npc.IsDeath) { if (npc.IsBodyIniOk && !npc.IsNodAddBody && npc.SummonedByMagicSprite == null) //Not summoned npc { npc.BodyIni.PositionInWorld = npc.PositionInWorld; npc.BodyIni.CurrentDirection = npc.CurrentDirection; ObjManager.AddObj(npc.BodyIni); } ObjManager.AddObj(GoodDrop.GetDropObj(npc)); DeleteNpc(node); } node = next; } for (var node = DeathInfos.First; node != null;) { var info = node.Value; var next = node.Next; info.LeftFrameToKeep--; if (info.LeftFrameToKeep <= 0) { DeathInfos.Remove(node); } node = next; } }
public override bool HasObstacle(Vector2 tilePosition) { if (Kind == (int)CharacterKind.Flyer) { return(false); } return(NpcManager.IsObstacle(tilePosition) || ObjManager.IsObstacle(tilePosition) || MagicManager.IsObstacle(tilePosition) || Globals.ThePlayer.TilePosition == tilePosition); }
private void UpdatePlaying(GameTime gameTime) { if (Globals.IsInSuperMagicMode) { Globals.SuperModeMagicSprite.Update(gameTime); if (Globals.SuperModeMagicSprite.IsDestroyed) { Globals.IsInSuperMagicMode = false; Globals.SuperModeMagicSprite = null; } return;//Just update super magic } else if (TimeStoperMagicSprite != null) { TimeStoperMagicSprite.BelongCharacter.Update(gameTime); TimeStoperMagicSprite.Update(gameTime); MapBase.Instance.Update(gameTime); MagicManager.UpdateMagicSpritesInView(); NpcManager.UpdateNpcsInView(); ObjManager.UpdateObjsInView(); return; } //Player Globals.ThePlayer.Update(gameTime); //Magic list MagicManager.Update(gameTime); MagicManager.UpdateMagicSpritesInView(); //Npc list NpcManager.Update(gameTime); NpcManager.UpdateNpcsInView(); //Obj list ObjManager.Update(gameTime); ObjManager.UpdateObjsInView(); //Map MapBase.Instance.Update(gameTime); //Weather WeatherManager.Update(gameTime); }
/// <summary> /// Use magic. /// </summary> /// <param name="user">The magic user.</param> /// <param name="magic">Magic to use.</param> /// <param name="origin">Magic initial pixel postion in world.</param> /// <param name="destination">Magic destination pixel postiont in world.</param> /// <param name="target">Magic target</param> /// <param name="recursiveCounter"></param> public static void UseMagic(Character user, Magic magic, Vector2 origin, Vector2 destination, Character target = null, int recursiveCounter = 0) { if (user == null || magic == null) { return; } if (magic.SecondMagicFile != null) { AddUseMagicItem(new UseMagicInfoItem(magic.SecondMagicDelay, user, magic.SecondMagicFile, origin, destination, target)); } if (magic.BodyRadius > 0 && target != null && recursiveCounter == 0) { foreach (var body in ObjManager.GetBodyInRaidus(target.TilePosition, magic.BodyRadius, true)) { UseMagic(user, magic, body.PositionInWorld, destination, target, recursiveCounter + 1); } return; } _maigicSpriteIndex = 0; if (magic.FlyingSound != null) { magic.FlyingSound.Play(); } if (magic.BeginAtMouse > 0) { var dir = origin - destination; if (dir != Vector2.Zero) { dir.Normalize(); } origin = destination + dir; } else if (magic.BeginAtUser > 0) { destination = origin; } else if (magic.BeginAtUserAddDirectionOffset > 0) { var dir = destination - origin; if (dir != Vector2.Zero) { dir.Normalize(); } destination = origin + dir; } else if (magic.BeginAtUserAddUserDirectionOffset > 0) { var dir = Utils.GetDirection8(user.CurrentDirection); destination = origin + dir; } if (magic.MeteorMove > 0) { origin = destination; } switch (magic.MoveKind) { case 1: AddFixedPositionMagicSprite(user, magic, destination, true); break; case 2: AddMagicSprite(GetMoveMagicSprite(user, magic, origin, destination, false, GetSpeedRatio(destination - origin))); break; case 3: AddLineMoveMagicSprite(user, magic, origin, destination, false); break; case 4: AddCircleMoveMagicSprite(user, magic, origin, false); break; case 5: AddHeartMoveMagicSprite(user, magic, origin, false); break; case 6: AddSpiralMoveMagicSprite(user, magic, origin, destination, false); break; case 7: AddSectorMoveMagicSprite(user, magic, origin, destination, false); break; case 8: AddRandomSectorMoveMagicSprite(user, magic, origin, destination, false); break; case 9: AddFixedWallMagicSprite(user, magic, origin, destination, true); break; case 10: AddWallMoveMagicSprite(user, magic, origin, destination, false); break; case 11: { switch (magic.Region) { case 1: AddSquareFixedPositionMagicSprite(user, magic, destination, true); break; case 2: AddCrossFixedPositionMagicSprite(user, magic, origin, true); break; case 3: AddRegtangleFixedPositionMagicSprite(user, magic, origin, destination, true); break; case 4: AddIsoscelesTriangleMagicSprite(user, magic, origin, destination, true); break; case 5: AddVTypeFixedPOsitionMagicSprite(user, magic, origin, destination, true); break; case 6: AddRegionFileMagicSprite(user, magic, origin, destination, true); break; } break; } case 13: case 23: AddFollowCharacterMagicSprite(user, magic, origin, true, target); break; case 15: AddSuperModeMagic(user, magic, origin, true); break; case 16: AddFollowEnemyMagicSprite(user, magic, origin, destination, false); break; case 17: AddThrowMagicSprite(user, magic, origin, destination, true); break; case 18: //Empty break; case 19: { var info = new Kind19MagicInfo(magic.KeepMilliseconds, magic, user); _kind19Magics.AddLast(info); } break; case 20: { //Can't use transport magic when in transport if (!user.IsInTransport) { user.IsInTransport = true; AddFixedPositionMagicSprite(user, magic, destination, true); } } break; case 21: { var player = user as Player; if (player != null && target != null && !target.IsDeathInvoked && // Can't control dead people target.Level <= magic.MaxLevel ) { player.ControledCharacter = target; AddFixedPositionMagicSprite(user, magic, user.PositionInWorld, true); } } break; case 22: { AddFixedPositionMagicSprite(user, magic, destination, true); } break; } //Magic side effect if (magic.SideEffectProbability > 0 && Globals.TheRandom.Next(0, 100) < magic.SideEffectProbability) { var amount = ((GetEffectAmount(magic, user) + GetEffectAmount2(magic, user)) * magic.SideEffectPercent) / 100; switch ((Magic.SideEffectDamageType)magic.SideEffectType) { case Magic.SideEffectDamageType.Life: user.DecreaseLifeAddHurt(amount); break; case Magic.SideEffectDamageType.Mana: user.AddMana(-amount); break; case Magic.SideEffectDamageType.Thew: user.AddThew(-amount); break; default: throw new ArgumentOutOfRangeException(); } } if (magic.DieAfterUse > 0) { user.Death(); } }
public override bool HasObstacle(Vector2 tilePosition) { return(NpcManager.IsObstacle(tilePosition) || ObjManager.IsObstacle(tilePosition) || MagicManager.IsObstacle(tilePosition)); }