Enable collecting items from map to equipment
This commit is contained in:
BIN
data.mv.db
BIN
data.mv.db
Binary file not shown.
Binary file not shown.
@@ -1,10 +1,12 @@
|
||||
package com.bartlomiejpluta.demo.entity;
|
||||
|
||||
import com.bartlomiejpluta.base.api.character.Character;
|
||||
import com.bartlomiejpluta.demo.world.item.Item;
|
||||
import lombok.NonNull;
|
||||
import org.joml.Vector2i;
|
||||
|
||||
public class Player extends Creature {
|
||||
private final Item[] equipment = new Item[4 * 4];
|
||||
|
||||
public Player(@NonNull Character entity) {
|
||||
super(entity);
|
||||
@@ -14,13 +16,35 @@ public class Player extends Creature {
|
||||
|
||||
public void interact() {
|
||||
var coords = getCoordinates().add(getFaceDirection().vector, new Vector2i());
|
||||
for (var entity : getLayer().getEntities()) {
|
||||
if (entity.getCoordinates().equals(coords) && entity instanceof MapObject) {
|
||||
((MapObject) entity).interact(this);
|
||||
var entities = getLayer().getEntities();
|
||||
for (var i=0; i< entities.size(); ++i) {
|
||||
var entity = entities.get(i);
|
||||
|
||||
if (entity.getCoordinates().equals(coords) && entity instanceof MapObject object) {
|
||||
object.interact(this);
|
||||
return;
|
||||
}
|
||||
|
||||
if (entity.getCoordinates().equals(getCoordinates()) && entity instanceof Item item) {
|
||||
pushItemToEquipment(item);
|
||||
getLayer().removeEntity(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void pushItemToEquipment(@NonNull Item item) {
|
||||
for(int i=0; i<equipment.length; ++i) {
|
||||
if(equipment[i] == null) {
|
||||
equipment[i] = item;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Item getEquipmentItem(int index) {
|
||||
return equipment[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void die() {
|
||||
super.die();
|
||||
|
||||
@@ -2,11 +2,35 @@ package com.bartlomiejpluta.demo.gui;
|
||||
|
||||
import com.bartlomiejpluta.base.api.context.Context;
|
||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||
import com.bartlomiejpluta.base.api.gui.Ref;
|
||||
import com.bartlomiejpluta.base.api.gui.WindowManager;
|
||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||
import com.bartlomiejpluta.base.lib.gui.VGridOptionChoice;
|
||||
import com.bartlomiejpluta.demo.entity.Player;
|
||||
import com.bartlomiejpluta.demo.runner.DemoRunner;
|
||||
|
||||
|
||||
public class EquipmentWindow extends DecoratedWindow {
|
||||
private final DemoRunner runner;
|
||||
private final Player player;
|
||||
|
||||
@Ref("eq")
|
||||
private VGridOptionChoice eqGrid;
|
||||
|
||||
public EquipmentWindow(Context context, GUI gui) {
|
||||
super(context, gui);
|
||||
this.runner = (DemoRunner) context.getGameRunner();
|
||||
this.player = runner.getPlayer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOpen(WindowManager manager) {
|
||||
super.onOpen(manager);
|
||||
|
||||
var i = 0;
|
||||
for(var child : eqGrid.getChildren()) {
|
||||
var slot = (ItemIconView) child;
|
||||
slot.setIcon(player.getEquipmentItem(i++));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -79,12 +79,8 @@ public class HUD extends BorderLayout {
|
||||
logVisibilityDuration = 0;
|
||||
}
|
||||
|
||||
if (player.getWeapon() != null && player.getWeapon() != currentWeapon) {
|
||||
weapon.setIcon(player.getWeapon().getIcon());
|
||||
this.currentWeapon = player.getWeapon();
|
||||
} else if (player.getWeapon() == null) {
|
||||
this.currentWeapon = null;
|
||||
}
|
||||
|
||||
this.currentWeapon = player.getWeapon();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
43
src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java
Normal file
43
src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java
Normal file
@@ -0,0 +1,43 @@
|
||||
package com.bartlomiejpluta.demo.gui;
|
||||
|
||||
import com.bartlomiejpluta.base.api.context.Context;
|
||||
import com.bartlomiejpluta.base.api.gui.Color;
|
||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||
import com.bartlomiejpluta.base.lib.gui.IconView;
|
||||
|
||||
public class ItemIconView extends IconView {
|
||||
private final Color normal;
|
||||
private final Color hover;
|
||||
|
||||
public ItemIconView(Context context, GUI gui) {
|
||||
super(context, gui);
|
||||
this.normal = gui.createColor();
|
||||
this.hover = gui.createColor();
|
||||
|
||||
normal.setRGBA(0x444444FF);
|
||||
hover.setRGBA(0x888888FF);
|
||||
super.setScale(2f);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getContentWidth() {
|
||||
return 68f;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getContentHeight() {
|
||||
return 68f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Screen screen, GUI gui) {
|
||||
gui.beginPath();
|
||||
gui.drawRectangle(x, y, getWidth(), getHeight());
|
||||
gui.setFillColor(focused ? hover : normal);
|
||||
gui.fill();
|
||||
gui.closePath();
|
||||
|
||||
super.draw(screen, gui);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.bartlomiejpluta.demo.world.item;
|
||||
|
||||
import com.bartlomiejpluta.base.api.icon.Icon;
|
||||
|
||||
public interface Item extends Icon {
|
||||
String getName();
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import com.bartlomiejpluta.base.api.context.ContextHolder;
|
||||
import com.bartlomiejpluta.base.api.icon.Icon;
|
||||
import com.bartlomiejpluta.base.lib.animation.AnimationRunner;
|
||||
import com.bartlomiejpluta.base.lib.animation.RandomAnimationsRunner;
|
||||
import com.bartlomiejpluta.base.lib.icon.IconDelegate;
|
||||
import com.bartlomiejpluta.base.util.random.DiceRoller;
|
||||
import com.bartlomiejpluta.demo.entity.Creature;
|
||||
import com.bartlomiejpluta.demo.event.HitEvent;
|
||||
@@ -14,15 +15,12 @@ import org.joml.Vector2i;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class MeleeWeapon implements Weapon {
|
||||
private final Random random = new Random();
|
||||
public class MeleeWeapon extends IconDelegate implements Weapon {
|
||||
private final Context context;
|
||||
private final DiceRoller roller;
|
||||
private final AnimationRunner animation;
|
||||
private final String sound;
|
||||
@Getter
|
||||
private final Icon icon;
|
||||
@Getter
|
||||
private final String name;
|
||||
@Getter
|
||||
private final int cooldown;
|
||||
@@ -32,22 +30,21 @@ public class MeleeWeapon implements Weapon {
|
||||
}
|
||||
|
||||
public MeleeWeapon(@NonNull DB.model.MeleeWeaponModel template) {
|
||||
super(createIcon(template));
|
||||
|
||||
this.context = ContextHolder.INSTANCE.getContext();
|
||||
this.name = template.getName();
|
||||
this.roller = DiceRoller.of(template.getDamage());
|
||||
this.cooldown = template.getCooldown();
|
||||
this.animation = new RandomAnimationsRunner(2).nRange(0, 2f).nScale(0.2f, 0.15f).uAnimationSpeed(0.5f, 1f).nRotation(0, 10).offset(0, -10).uDelay(250, 500).with(A.animations.get(template.getAnimation()).uid);
|
||||
this.sound = A.sounds.get(template.getSound()).uid;
|
||||
var icons = template.getIcon().split(",");
|
||||
this.icon = context.createIcon(A.iconsets.get(icons[0]).uid, Integer.valueOf(icons[1]), Integer.valueOf(icons[2]));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean attack(Creature attacker) {
|
||||
var facingNeighbour = attacker.getCoordinates().add(attacker.getFaceDirection().vector, new Vector2i());
|
||||
for (var entity : attacker.getLayer().getEntities()) {
|
||||
if (entity.getCoordinates().equals(facingNeighbour) && entity.isBlocking() && entity instanceof Creature) {
|
||||
var character = (Creature) entity;
|
||||
if (entity.getCoordinates().equals(facingNeighbour) && entity.isBlocking() && entity instanceof Creature character) {
|
||||
var damage = roller.roll();
|
||||
character.hit(attacker, damage);
|
||||
animation.run(context, character.getLayer(), character);
|
||||
@@ -59,4 +56,9 @@ public class MeleeWeapon implements Weapon {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static Icon createIcon(DB.model.MeleeWeaponModel template) {
|
||||
var icons = template.getIcon().split(",");
|
||||
return ContextHolder.INSTANCE.getContext().createIcon(A.iconsets.get(icons[0]).uid, Integer.parseInt(icons[1]), Integer.parseInt(icons[2]));
|
||||
}
|
||||
}
|
||||
@@ -9,16 +9,14 @@ import com.bartlomiejpluta.base.api.move.Movable;
|
||||
import com.bartlomiejpluta.base.lib.animation.AnimationRunner;
|
||||
import com.bartlomiejpluta.base.lib.animation.BulletAnimationRunner;
|
||||
import com.bartlomiejpluta.base.lib.animation.SimpleAnimationRunner;
|
||||
import com.bartlomiejpluta.base.lib.icon.IconDelegate;
|
||||
import com.bartlomiejpluta.base.util.random.DiceRoller;
|
||||
import com.bartlomiejpluta.demo.entity.Creature;
|
||||
import com.bartlomiejpluta.demo.event.HitEvent;
|
||||
import lombok.Getter;
|
||||
import lombok.NonNull;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class RangedWeapon implements Weapon {
|
||||
private final Random random = new Random();
|
||||
public class RangedWeapon extends IconDelegate implements Weapon {
|
||||
private final Context context;
|
||||
private final DiceRoller dmgRoller;
|
||||
private final DiceRoller rangeRoller;
|
||||
@@ -29,8 +27,6 @@ public class RangedWeapon implements Weapon {
|
||||
private final AnimationRunner missAnimation;
|
||||
private final String missSound;
|
||||
@Getter
|
||||
private final Icon icon;
|
||||
@Getter
|
||||
private final String name;
|
||||
@Getter
|
||||
private final int cooldown;
|
||||
@@ -40,6 +36,8 @@ public class RangedWeapon implements Weapon {
|
||||
}
|
||||
|
||||
public RangedWeapon(@NonNull DB.model.RangedWeaponModel template) {
|
||||
super(createIcon(template));
|
||||
|
||||
this.context = ContextHolder.INSTANCE.getContext();
|
||||
this.name = template.getName();
|
||||
this.dmgRoller = DiceRoller.of(template.getDamage());
|
||||
@@ -51,14 +49,11 @@ public class RangedWeapon implements Weapon {
|
||||
this.punchSound = A.sounds.get(template.getPunchSound()).uid;
|
||||
this.missAnimation = new SimpleAnimationRunner(A.animations.get(template.getMissAnimation()).uid).scale(0.4f);
|
||||
this.missSound = A.sounds.get(template.getMissSound()).uid;
|
||||
var icons = template.getIcon().split(",");
|
||||
this.icon = context.createIcon(A.iconsets.get(icons[0]).uid, Integer.valueOf(icons[1]), Integer.valueOf(icons[2]));
|
||||
}
|
||||
|
||||
private void onHit(Movable attacker, Entity target) {
|
||||
if (target.isBlocking() && target instanceof Creature) {
|
||||
if (target.isBlocking() && target instanceof Creature character) {
|
||||
var namedAttacker = (Creature) attacker;
|
||||
var character = (Creature) target;
|
||||
var damage = dmgRoller.roll();
|
||||
character.hit(namedAttacker, damage);
|
||||
punchAnimation.run(context, character.getLayer(), character);
|
||||
@@ -79,4 +74,9 @@ public class RangedWeapon implements Weapon {
|
||||
animation.range(rangeRoller.roll()).direction(direction).rotation(direction.xAngle - 180).run(context, attacker.getLayer(), attacker);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static Icon createIcon(DB.model.RangedWeaponModel template) {
|
||||
var icons = template.getIcon().split(",");
|
||||
return ContextHolder.INSTANCE.getContext().createIcon(A.iconsets.get(icons[0]).uid, Integer.parseInt(icons[1]), Integer.parseInt(icons[2]));
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,9 @@
|
||||
package com.bartlomiejpluta.demo.world.weapon;
|
||||
|
||||
import com.bartlomiejpluta.base.api.icon.Icon;
|
||||
import com.bartlomiejpluta.demo.entity.Creature;
|
||||
import com.bartlomiejpluta.demo.world.item.Item;
|
||||
|
||||
public interface Weapon {
|
||||
String getName();
|
||||
|
||||
Icon getIcon();
|
||||
public interface Weapon extends Item {
|
||||
|
||||
int getCooldown();
|
||||
|
||||
|
||||
@@ -21,31 +21,23 @@
|
||||
fontSize="30f">Equipment
|
||||
</base:Label>
|
||||
|
||||
<base:VGridOptionChoice columns="4"
|
||||
scrollSpeed="0.2f"
|
||||
widthMode="SizeMode.ABSOLUTE"
|
||||
width="4 * 68f"
|
||||
heightMode="SizeMode.ABSOLUTE"
|
||||
height="4 * 68f">
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="0" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="1" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="2" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="3" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="4" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="5" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="6" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="7" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="8" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="9" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="5" iconSetColumn="10" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="6" iconSetColumn="0" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="7" iconSetColumn="1" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="8" iconSetColumn="2" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="9" iconSetColumn="3" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="10" iconSetColumn="4" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="11" iconSetColumn="5" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="11" iconSetColumn="6" scale="2f"/>
|
||||
<base:IconView iconSet="A.iconsets.generic.uid" iconSetRow="11" iconSetColumn="7" scale="2f"/>
|
||||
<base:VGridOptionChoice ref="eq" columns="4" widthMode="SizeMode.AUTO" heightMode="SizeMode.AUTO">
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
<demo:ItemIconView margin="5f" />
|
||||
</base:VGridOptionChoice>
|
||||
</base:VLayout>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user