package samplegame.customscripts; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.event.KeyEvent; import java.io.File; import java.util.List; import samplegame.SampleGame; import toritools.dialog.DialogNode; import toritools.entity.Entity; import toritools.entity.Level; import toritools.entity.sprite.AbstractSprite; import toritools.math.Vector2; import toritools.scripting.EntityScript; import toritools.scripting.ScriptUtils; /** * This entity displays and controls a DialogNode. * * @author toriscope * */ public class DialogEntity extends Entity { private List<String> currentDisplay; /** * Spawn a DialogEntity that will display a given dialog, run it's action * when needed and advance its text as required. * * @param dialogNode * the dialog node to control/display. * @param entityToTrack * the entity that the word bubble will track. */ public DialogEntity(final DialogNode dialogNode, final Entity entityToTrack) { setPos(new Vector2(300, 300)); setDim(new Vector2(500, 75)); addScript(new EntityScript() { @Override public void onSpawn(Entity self, Level level) { SampleGame.inDialog = true; } @Override public void onUpdate(Entity self, float time, Level level) { SampleGame.setDisplayPrompt("Next <SPACE>"); if (entityToTrack != null) { self.setPos(entityToTrack.getPos().add(new Vector2(5, -(self.getDim().y + 10)))); } if (getCurrentDisplay() == null || ScriptUtils.getKeyHolder().isPressedThenRelease(KeyEvent.VK_SPACE)) { setCurrentDisplay(dialogNode.getNextLines(3)); if (getCurrentDisplay().isEmpty()) { level.despawnEntity(self); } } } @Override public void onDeath(Entity self, Level level, boolean isRoomExit) { SampleGame.inDialog = false; dialogNode.doAction(level); } }); setLayer(0); setSprite(new AbstractSprite() { @Override public void draw(final Graphics2D g, final Entity self) { List<String> displayString = getCurrentDisplay(); if (displayString == null) { return; } g.setColor(Color.GRAY); int[] x = new int[] { (int) pos.x, (int) pos.x + 30, (int) pos.x + 5 }; int[] y = new int[] { (int) pos.y, (int) pos.y + 30, (int) (pos.y + dim.y + 15) }; g.fillPolygon(x, y, 3); g.fillRoundRect((int) pos.x, (int) pos.y, (int) dim.x, (int) dim.y, 4, 4); g.setColor(Color.WHITE); for (int i = 0; i < displayString.size(); i++) { g.drawString(displayString.get(i), (int) pos.x + 20, (int) pos.y + 20 + i * 20); } } public void nextFrame() {} public void nextFrameAbsolute() {} public void setFrame(int frame) {} public void setCycle(int cycle) {} public void set(int frame, int cycle) {} public void setTimeStretch(int timeStretch) {} public void setsizeOffset(int sizeOffset) {} public Dimension getTileDimension() {return null;} public File getImageIndex() {return null;} }); } private List<String> getCurrentDisplay() { return currentDisplay; } private void setCurrentDisplay(List<String> currentDisplay) { this.currentDisplay = currentDisplay; } }