From f7bdd339e4067c3c63772cc3adef29e03be41eb6 Mon Sep 17 00:00:00 2001 From: Collin Smith Date: Thu, 21 Nov 2019 04:11:16 -0800 Subject: [PATCH] Added support for item entities Created ItemLoaderSystem to defer flippy file loading Item entities are selectable only after their flippy file has been loaded since they have no bbox Changed implementations from EntityListener to EntityAdapter --- core/src/com/riiablo/engine/Engine.java | 27 ++++++++++ .../engine/component/ItemComponent.java | 18 +++++++ .../engine/system/ItemLoaderSystem.java | 50 +++++++++++++++++++ .../engine/system/SelectableSystem.java | 20 +++++--- 4 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 core/src/com/riiablo/engine/component/ItemComponent.java create mode 100644 core/src/com/riiablo/engine/system/ItemLoaderSystem.java diff --git a/core/src/com/riiablo/engine/Engine.java b/core/src/com/riiablo/engine/Engine.java index 25912a36..d276e063 100644 --- a/core/src/com/riiablo/engine/Engine.java +++ b/core/src/com/riiablo/engine/Engine.java @@ -5,12 +5,15 @@ import com.badlogic.ashley.core.ComponentMapper; import com.badlogic.ashley.core.Entity; import com.badlogic.ashley.core.PooledEngine; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.IntIntMap; import com.riiablo.CharData; import com.riiablo.Riiablo; import com.riiablo.codec.COF; +import com.riiablo.codec.DC6; import com.riiablo.codec.excel.Levels; import com.riiablo.codec.excel.LvlWarp; import com.riiablo.codec.excel.MonStats; @@ -26,6 +29,7 @@ import com.riiablo.engine.component.CofComponent; import com.riiablo.engine.component.DS1Component; import com.riiablo.engine.component.IdComponent; import com.riiablo.engine.component.InteractableComponent; +import com.riiablo.engine.component.ItemComponent; import com.riiablo.engine.component.LabelComponent; import com.riiablo.engine.component.MapComponent; import com.riiablo.engine.component.MonsterComponent; @@ -39,6 +43,7 @@ import com.riiablo.engine.component.TypeComponent; import com.riiablo.engine.component.VelocityComponent; import com.riiablo.engine.component.WarpComponent; import com.riiablo.engine.component.ZoneAwareComponent; +import com.riiablo.item.Item; import com.riiablo.map.DS1; import com.riiablo.map.DT1; import com.riiablo.map.Map; @@ -488,6 +493,28 @@ public class Engine extends PooledEngine { return entity; } + public Entity createItem(Item item, Vector2 position) { + TypeComponent typeComponent = createComponent(TypeComponent.class); + typeComponent.type = TypeComponent.Type.ITM; + + AssetDescriptor flippyDescriptor = new AssetDescriptor<>(TypeComponent.Type.ITM.PATH + "\\" + item.getFlippyFile() + ".dc6", DC6.class); + Riiablo.assets.load(flippyDescriptor); + + ItemComponent itemComponent = createComponent(ItemComponent.class); + itemComponent.item = item; + itemComponent.flippyDescriptor = flippyDescriptor; + + PositionComponent positionComponent = createComponent(PositionComponent.class); + positionComponent.position.set(position); + + Entity entity = createEntity("item"); + entity.add(typeComponent); + entity.add(itemComponent); + entity.add(positionComponent); + + return entity; + } + public static T getOrCreateComponent(Entity entity, com.badlogic.ashley.core.Engine engine, Class componentType, ComponentMapper componentMapper) { T instance = componentMapper.get(entity); if (instance == null) entity.add(instance = engine.createComponent(componentType)); diff --git a/core/src/com/riiablo/engine/component/ItemComponent.java b/core/src/com/riiablo/engine/component/ItemComponent.java new file mode 100644 index 00000000..44f78842 --- /dev/null +++ b/core/src/com/riiablo/engine/component/ItemComponent.java @@ -0,0 +1,18 @@ +package com.riiablo.engine.component; + +import com.badlogic.ashley.core.Component; +import com.badlogic.gdx.assets.AssetDescriptor; +import com.badlogic.gdx.utils.Pool; +import com.riiablo.codec.DC6; +import com.riiablo.item.Item; + +public class ItemComponent implements Component, Pool.Poolable { + public Item item; + public AssetDescriptor flippyDescriptor; + + @Override + public void reset() { + item = null; + flippyDescriptor = null; + } +} diff --git a/core/src/com/riiablo/engine/system/ItemLoaderSystem.java b/core/src/com/riiablo/engine/system/ItemLoaderSystem.java new file mode 100644 index 00000000..23f205dd --- /dev/null +++ b/core/src/com/riiablo/engine/system/ItemLoaderSystem.java @@ -0,0 +1,50 @@ +package com.riiablo.engine.system; + +import com.badlogic.ashley.core.ComponentMapper; +import com.badlogic.ashley.core.Entity; +import com.badlogic.ashley.core.Family; +import com.badlogic.ashley.systems.IteratingSystem; +import com.riiablo.Riiablo; +import com.riiablo.codec.Animation; +import com.riiablo.codec.DC6; +import com.riiablo.codec.util.BBox; +import com.riiablo.engine.component.AnimationComponent; +import com.riiablo.engine.component.BBoxComponent; +import com.riiablo.engine.component.ItemComponent; +import com.riiablo.engine.component.LabelComponent; +import com.riiablo.graphics.BlendMode; + +public class ItemLoaderSystem extends IteratingSystem { + private final ComponentMapper itemComponent = ComponentMapper.getFor(ItemComponent.class); + + public ItemLoaderSystem() { + super(Family.all(ItemComponent.class).exclude(AnimationComponent.class, BBoxComponent.class).get()); + } + + @Override + protected void processEntity(Entity entity, float delta) { + ItemComponent itemComponent = this.itemComponent.get(entity); + if (!Riiablo.assets.isLoaded(itemComponent.flippyDescriptor)) return; + + DC6 flippy = Riiablo.assets.get(itemComponent.flippyDescriptor); + + Animation animation = Animation.builder() + .layer(flippy, BlendMode.ID, (byte) ((itemComponent.item.base.Transform << 5) | (itemComponent.item.charColorIndex & 0x1F))) + .build(); + animation.setMode(Animation.Mode.CLAMP); + + AnimationComponent animationComponent = getEngine().createComponent(AnimationComponent.class); + animationComponent.animation = animation; + entity.add(animationComponent); + + BBox box = flippy.getBox(0, flippy.getNumFramesPerDir() - 1); + BBoxComponent boxComponent = getEngine().createComponent(BBoxComponent.class); + boxComponent.box = box; + entity.add(boxComponent); + + LabelComponent labelComponent = getEngine().createComponent(LabelComponent.class); + labelComponent.actor = itemComponent.item.details().header; + labelComponent.offset.set(box.xMin + box.width / 2, -box.yMax + box.height + labelComponent.actor.getHeight() / 2); + entity.add(labelComponent); + } +} diff --git a/core/src/com/riiablo/engine/system/SelectableSystem.java b/core/src/com/riiablo/engine/system/SelectableSystem.java index 89f98312..8ab54ddd 100644 --- a/core/src/com/riiablo/engine/system/SelectableSystem.java +++ b/core/src/com/riiablo/engine/system/SelectableSystem.java @@ -7,7 +7,9 @@ import com.badlogic.ashley.core.EntityListener; import com.badlogic.ashley.core.EntitySystem; import com.badlogic.ashley.core.Family; import com.badlogic.ashley.utils.ImmutableArray; +import com.riiablo.engine.EntityAdapter; import com.riiablo.engine.component.CofComponent; +import com.riiablo.engine.component.ItemComponent; import com.riiablo.engine.component.MonsterComponent; import com.riiablo.engine.component.ObjectComponent; import com.riiablo.engine.component.SelectableComponent; @@ -20,7 +22,7 @@ public class SelectableSystem extends EntitySystem { private ImmutableArray objectEntities; private final Family monsterFamily = Family.all(MonsterComponent.class).get(); - private final EntityListener monsterListener = new EntityListener() { + private final EntityListener monsterListener = new EntityAdapter() { private final ComponentMapper monsterComponent = ComponentMapper.getFor(MonsterComponent.class); @Override @@ -28,20 +30,22 @@ public class SelectableSystem extends EntitySystem { MonsterComponent monsterComponent = this.monsterComponent.get(entity); setSelectable(entity, monsterComponent.monstats2.isSel); } - - @Override - public void entityRemoved(Entity entity) {} }; - private final Family warpFamily = Family.all(WarpComponent.class).get(); - private final EntityListener warpListener = new EntityListener() { + private final Family itemFamily = Family.all(ItemComponent.class).get(); + private final EntityListener itemListener = new EntityAdapter() { @Override public void entityAdded(Entity entity) { setSelectable(entity, true); } + }; + private final Family warpFamily = Family.all(WarpComponent.class).get(); + private final EntityListener warpListener = new EntityAdapter() { @Override - public void entityRemoved(Entity entity) {} + public void entityAdded(Entity entity) { + setSelectable(entity, true); + } }; private final ComponentMapper selectableComponent = ComponentMapper.getFor(SelectableComponent.class); @@ -56,6 +60,7 @@ public class SelectableSystem extends EntitySystem { objectEntities = engine.getEntitiesFor(objectFamily); engine.addEntityListener(monsterFamily, monsterListener); engine.addEntityListener(warpFamily, warpListener); + engine.addEntityListener(itemFamily, itemListener); } @Override @@ -64,6 +69,7 @@ public class SelectableSystem extends EntitySystem { objectEntities = null; engine.removeEntityListener(monsterListener); engine.removeEntityListener(warpListener); + engine.removeEntityListener(itemListener); } @Override