mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
176 lines
7.1 KiB
C#
176 lines
7.1 KiB
C#
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using ProjectZ.InGame.GameObjects.Base;
|
|
using ProjectZ.InGame.GameObjects.Base.CObjects;
|
|
using ProjectZ.InGame.GameObjects.Base.Components;
|
|
using ProjectZ.InGame.GameObjects.Base.Components.AI;
|
|
using ProjectZ.InGame.Map;
|
|
using ProjectZ.InGame.SaveLoad;
|
|
using ProjectZ.InGame.Things;
|
|
|
|
namespace ProjectZ.InGame.GameObjects.Things
|
|
{
|
|
internal class ObjSwordSpawner : GameObject
|
|
{
|
|
private Animator _animator;
|
|
private CSprite _sprite;
|
|
private SpriteShader _spriteShader;
|
|
|
|
private ObjItem _objSword;
|
|
private BodyComponent _swordBody;
|
|
private bool _swordHitFloor;
|
|
|
|
private DictAtlasEntry _thunder;
|
|
|
|
private float _counter;
|
|
private int _thunderIndex;
|
|
private bool _drawThunder = true;
|
|
|
|
private float _animationCounter;
|
|
private bool _animationStarted;
|
|
|
|
private bool _spawnedSword;
|
|
|
|
private float _thunderCounter;
|
|
private bool _soundEffect;
|
|
|
|
public ObjSwordSpawner() : base("sword_spawn") { }
|
|
|
|
public ObjSwordSpawner(Map.Map map, int posX, int posY) : base(map)
|
|
{
|
|
EntityPosition = new CPosition(posX + 8, posY + 8, 0);
|
|
EntitySize = new Rectangle(-8, -8, 16, 16);
|
|
|
|
_animator = AnimatorSaveLoad.LoadAnimator("Objects/sword spawn");
|
|
|
|
_thunder = Resources.GetSprite("sword_thunder_0");
|
|
|
|
_sprite = new CSprite(EntityPosition);
|
|
|
|
AddComponent(BaseAnimationComponent.Index, new AnimationComponent(_animator, _sprite, Vector2.Zero));
|
|
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
|
|
AddComponent(DrawComponent.Index, new DrawComponent(Draw, Values.LayerBottom, EntityPosition));
|
|
}
|
|
|
|
private void SpawnSword()
|
|
{
|
|
_spawnedSword = true;
|
|
_objSword = new ObjItem(Map, (int)EntityPosition.X - 8, (int)EntityPosition.Y, null, "sword2", "sword2", null);
|
|
((DrawComponent)_objSword.Components[DrawComponent.Index]).IsActive = false;
|
|
_swordBody = ((BodyComponent)_objSword.Components[BodyComponent.Index]);
|
|
_swordBody.OffsetY -= 1;
|
|
_swordBody.Bounciness2D = 0.5f;
|
|
Map.Objects.SpawnObject(_objSword);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
_counter += Game1.DeltaTime;
|
|
_animationCounter += Game1.DeltaTime;
|
|
|
|
if (!_spawnedSword)
|
|
{
|
|
MapManager.ObjLink.FreezePlayer();
|
|
Game1.GameManager.InGameOverlay.DisableInventoryToggle = true;
|
|
}
|
|
|
|
if (_animationCounter > 2200 && !_soundEffect)
|
|
{
|
|
_soundEffect = true;
|
|
Game1.GameManager.PlaySoundEffect("D370-30-1E");
|
|
}
|
|
|
|
if (_drawThunder)
|
|
{
|
|
_thunderCounter -= Game1.DeltaTime;
|
|
if (_thunderCounter < 0)
|
|
{
|
|
_thunderCounter += 66;
|
|
Game1.GameManager.PlaySoundEffect("D378-51-33");
|
|
}
|
|
}
|
|
|
|
if (_animationCounter > 2750 && !_animationStarted)
|
|
{
|
|
_animationStarted = true;
|
|
_animator.Play("idle");
|
|
}
|
|
|
|
if (_drawThunder && _animationCounter > 2750 + 4500)
|
|
{
|
|
_drawThunder = false;
|
|
_thunderIndex = -1;
|
|
}
|
|
|
|
// finished playing?
|
|
if (_animationCounter > 2750 && !_animator.IsPlaying && !_spawnedSword)
|
|
{
|
|
SpawnSword();
|
|
}
|
|
|
|
_spriteShader = _counter % (AiDamageState.BlinkTime * 2) >= AiDamageState.BlinkTime ? Resources.DamageSpriteShader0 : null;
|
|
|
|
if (_counter > AiDamageState.BlinkTime * 2)
|
|
{
|
|
_counter -= AiDamageState.BlinkTime * 2;
|
|
_thunderIndex += Game1.RandomNumber.Next(1, 4);
|
|
_thunderIndex %= 4;
|
|
}
|
|
|
|
if (_objSword != null && !_swordHitFloor)
|
|
{
|
|
if (_swordBody.Velocity.Y < 0)
|
|
{
|
|
_swordHitFloor = true;
|
|
((DrawComponent)_objSword.Components[DrawComponent.Index]).IsActive = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Draw(SpriteBatch spriteBatch)
|
|
{
|
|
if (_spriteShader != null)
|
|
{
|
|
spriteBatch.End();
|
|
ObjectManager.SpriteBatchBegin(spriteBatch, _spriteShader);
|
|
}
|
|
|
|
// draw the blinking sword
|
|
if (_objSword != null && !_swordHitFloor)
|
|
_objSword.Draw(spriteBatch);
|
|
|
|
if (_animator.IsPlaying)
|
|
_sprite.Draw(spriteBatch);
|
|
|
|
if (_drawThunder)
|
|
{
|
|
if (_thunderIndex == 0)
|
|
{
|
|
spriteBatch.Draw(_thunder.Texture, new Vector2(EntityPosition.X, EntityPosition.Y), _thunder.ScaledRectangle, Color.White, 0, _thunder.Origin, _thunder.Scale, SpriteEffects.None, 0);
|
|
spriteBatch.Draw(_thunder.Texture, new Vector2(EntityPosition.X, EntityPosition.Y), _thunder.ScaledRectangle, Color.White, 0, Vector2.Zero, _thunder.Scale, SpriteEffects.FlipHorizontally | SpriteEffects.FlipVertically, 0);
|
|
}
|
|
else if (_thunderIndex == 1)
|
|
{
|
|
spriteBatch.Draw(_thunder.Texture, new Vector2(EntityPosition.X + 16, EntityPosition.Y), _thunder.ScaledRectangle, Color.White, 0, _thunder.Origin, _thunder.Scale, SpriteEffects.FlipVertically, 0);
|
|
spriteBatch.Draw(_thunder.Texture, new Vector2(EntityPosition.X - 16, EntityPosition.Y), _thunder.ScaledRectangle, Color.White, 0, Vector2.Zero, _thunder.Scale, SpriteEffects.FlipHorizontally, 0);
|
|
}
|
|
else if (_thunderIndex == 2)
|
|
{
|
|
spriteBatch.Draw(_thunder.Texture, new Vector2(EntityPosition.X + 16, EntityPosition.Y), _thunder.ScaledRectangle, Color.White, 0, _thunder.Origin, _thunder.Scale, SpriteEffects.FlipHorizontally | SpriteEffects.FlipVertically, 0);
|
|
spriteBatch.Draw(_thunder.Texture, new Vector2(EntityPosition.X - 16, EntityPosition.Y), _thunder.ScaledRectangle, Color.White, 0, Vector2.Zero, _thunder.Scale, SpriteEffects.None, 0);
|
|
}
|
|
else if (_thunderIndex == 3)
|
|
{
|
|
spriteBatch.Draw(_thunder.Texture, new Vector2(EntityPosition.X + 32, EntityPosition.Y), _thunder.ScaledRectangle, Color.White, 0, _thunder.Origin, _thunder.Scale, SpriteEffects.FlipHorizontally, 0);
|
|
spriteBatch.Draw(_thunder.Texture, new Vector2(EntityPosition.X - 32, EntityPosition.Y), _thunder.ScaledRectangle, Color.White, 0, Vector2.Zero, _thunder.Scale, SpriteEffects.FlipVertically, 0);
|
|
}
|
|
}
|
|
|
|
if (_spriteShader != null)
|
|
{
|
|
spriteBatch.End();
|
|
ObjectManager.SpriteBatchBegin(spriteBatch, null);
|
|
}
|
|
}
|
|
}
|
|
} |