mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-07-05 07:48:05 +07:00
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
This commit is contained in:
@ -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<DC6> 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 extends Component> T getOrCreateComponent(Entity entity, com.badlogic.ashley.core.Engine engine, Class<T> componentType, ComponentMapper<T> componentMapper) {
|
||||
T instance = componentMapper.get(entity);
|
||||
if (instance == null) entity.add(instance = engine.createComponent(componentType));
|
||||
|
18
core/src/com/riiablo/engine/component/ItemComponent.java
Normal file
18
core/src/com/riiablo/engine/component/ItemComponent.java
Normal file
@ -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<DC6> flippyDescriptor;
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
item = null;
|
||||
flippyDescriptor = null;
|
||||
}
|
||||
}
|
50
core/src/com/riiablo/engine/system/ItemLoaderSystem.java
Normal file
50
core/src/com/riiablo/engine/system/ItemLoaderSystem.java
Normal file
@ -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> 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);
|
||||
}
|
||||
}
|
@ -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<Entity> 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> 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> 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
|
||||
|
Reference in New Issue
Block a user