mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-25 16:03:02 +00:00
105 lines
4 KiB
C#
105 lines
4 KiB
C#
using Microsoft.Xna.Framework;
|
|
using ProjectZ.InGame.GameObjects.Base;
|
|
using ProjectZ.InGame.GameObjects.Base.CObjects;
|
|
using ProjectZ.InGame.GameObjects.Base.Components;
|
|
using ProjectZ.InGame.SaveLoad;
|
|
using ProjectZ.InGame.Things;
|
|
|
|
namespace ProjectZ.InGame.GameObjects.Things
|
|
{
|
|
class ObjBook : GameObject
|
|
{
|
|
private readonly BodyComponent _body;
|
|
private readonly CSprite _sprite;
|
|
private readonly DictAtlasEntry _spriteBook;
|
|
private readonly DictAtlasEntry _spriteBookOpen;
|
|
private readonly string _strKey;
|
|
private readonly string _dialogKey;
|
|
// when the dialogKey + "_open" key is set the book sprite will be shown as opened
|
|
private readonly string _openBookKey;
|
|
private bool _hasFallen;
|
|
|
|
public ObjBook() : base("book_0") { }
|
|
|
|
public ObjBook(Map.Map map, int posX, int posY, string strKey, string dialogKey, int spriteIndex) : base(map)
|
|
{
|
|
EntityPosition = new CPosition(posX + 8, posY + 16, 0);
|
|
EntitySize = new Rectangle(-8, -16, 16, 18);
|
|
|
|
_strKey = strKey;
|
|
_dialogKey = dialogKey;
|
|
_openBookKey = dialogKey + "_open";
|
|
|
|
spriteIndex = MathHelper.Clamp(spriteIndex, 0, 3);
|
|
|
|
// has the book already fallen down?
|
|
if (!string.IsNullOrEmpty(_strKey) && Game1.GameManager.SaveManager.GetString(_strKey) != "1")
|
|
{
|
|
EntityPosition.Z = 30;
|
|
EntitySize = new Rectangle(-Values.FieldWidth / 2, -32, Values.FieldWidth, Values.FieldHeight);
|
|
}
|
|
else
|
|
_hasFallen = true;
|
|
|
|
_spriteBook = Resources.GetSprite("book_" + spriteIndex);
|
|
_spriteBookOpen = Resources.GetSprite("book_open");
|
|
_sprite = new CSprite(_spriteBook, EntityPosition, new Vector2(-4, -11));
|
|
|
|
var tileRectangle = map.GetField(posX, posY);
|
|
_body = new BodyComponent(EntityPosition, -4, -11, 8, 11, 8)
|
|
{
|
|
IsActive = false,
|
|
Gravity = -0.125f,
|
|
Bounciness = 0.45f,
|
|
};
|
|
|
|
var interactionBox = new CBox(EntityPosition, -6, -11, 0, 12, 13, 8);
|
|
if (!_hasFallen)
|
|
{
|
|
var hitBox = new CBox(EntityPosition.X + EntitySize.X, EntityPosition.Y + EntitySize.Y, 0, EntitySize.Width, EntitySize.Height, 16);
|
|
AddComponent(HittableComponent.Index, new HittableComponent(hitBox, OnHit));
|
|
}
|
|
AddComponent(BodyComponent.Index, _body);
|
|
AddComponent(InteractComponent.Index, new InteractComponent(interactionBox, OnInteract));
|
|
AddComponent(KeyChangeListenerComponent.Index, new KeyChangeListenerComponent(OnKeyChange));
|
|
AddComponent(DrawComponent.Index, new DrawCSpriteComponent(_sprite, Values.LayerBottom));
|
|
}
|
|
|
|
private void OnKeyChange()
|
|
{
|
|
var keyState = Game1.GameManager.SaveManager.GetString(_openBookKey);
|
|
var openBook = keyState == "1";
|
|
_sprite.SetSprite(openBook ? _spriteBookOpen : _spriteBook);
|
|
_sprite.DrawOffset.X = -_sprite.SourceRectangle.Width / 2 * _sprite.Scale;
|
|
_sprite.DrawOffset.Y = -11;
|
|
}
|
|
|
|
private bool OnInteract()
|
|
{
|
|
Game1.GameManager.StartDialogPath(_dialogKey);
|
|
|
|
return true;
|
|
}
|
|
|
|
private Values.HitCollision OnHit(GameObject gameObject, Vector2 direction, HitType damageType, int damage, bool pieceOfPower)
|
|
{
|
|
if (_hasFallen)
|
|
return Values.HitCollision.None;
|
|
|
|
if (damageType == HitType.PegasusBootsPush)
|
|
StartFalling();
|
|
|
|
return Values.HitCollision.None;
|
|
}
|
|
|
|
private void StartFalling()
|
|
{
|
|
_hasFallen = true;
|
|
_body.IsActive = true;
|
|
|
|
if (!string.IsNullOrEmpty(_strKey))
|
|
Game1.GameManager.SaveManager.SetString(_strKey, "1");
|
|
}
|
|
}
|
|
}
|