added buildings and refactored buttons
This commit is contained in:
parent
31f8b55648
commit
cb33e97f0f
|
@ -0,0 +1,56 @@
|
||||||
|
package com.danitheskunk.skunkgame;
|
||||||
|
|
||||||
|
import com.danitheskunk.skunkworks.Vec2i;
|
||||||
|
|
||||||
|
public class Building {
|
||||||
|
private final String name;
|
||||||
|
private final String displayName;
|
||||||
|
private int count;
|
||||||
|
private Button button;
|
||||||
|
private final Cost cost;
|
||||||
|
|
||||||
|
public Building(String name, String displayName, Cost cost) {
|
||||||
|
this.name = name;
|
||||||
|
this.displayName = displayName;
|
||||||
|
this.cost = cost;
|
||||||
|
this.count = 0;
|
||||||
|
this.button = new Button(Vec2i.ZERO, displayName);
|
||||||
|
this.button.onClick(() -> {
|
||||||
|
if(canAfford()) {
|
||||||
|
buy();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setButtonPos(Vec2i pos) {
|
||||||
|
button.setPos(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canAfford() {
|
||||||
|
return cost.canAfford();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void buy() {
|
||||||
|
if(cost.canAfford()) {
|
||||||
|
cost.use();
|
||||||
|
count += 1;
|
||||||
|
button.setCount(count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isButtonVisible() {
|
||||||
|
return count > 0 || canAfford();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Button getButton() {
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCount() {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,9 +7,9 @@ import com.danitheskunk.skunkworks.gfx.vt.Terminal;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
public class Button {
|
public class Button {
|
||||||
private final Vec2i pos;
|
private Vec2i pos;
|
||||||
private static final Vec2i SIZE = new Vec2i(32, 3);
|
private static final Vec2i SIZE = new Vec2i(32, 3);
|
||||||
private final Recti rect;
|
private Recti rect;
|
||||||
private final String label;
|
private final String label;
|
||||||
private int count;
|
private int count;
|
||||||
private Runnable clickCallback;
|
private Runnable clickCallback;
|
||||||
|
@ -49,4 +49,9 @@ public class Button {
|
||||||
public void setCount(int count) {
|
public void setCount(int count) {
|
||||||
this.count = count;
|
this.count = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setPos(Vec2i pos) {
|
||||||
|
this.pos = pos;
|
||||||
|
this.rect = new Recti(this.pos, SIZE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.danitheskunk.skunkgame;
|
||||||
|
|
||||||
|
public class Cost {
|
||||||
|
private final CostElement[] elements;
|
||||||
|
|
||||||
|
public Cost(CostElement[] elements) {
|
||||||
|
this.elements = elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canAfford() {
|
||||||
|
for(var element : elements) {
|
||||||
|
if(element.getAmount() > SkunkGame.getRes(element.getRes())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void use() {
|
||||||
|
for(var element : elements) {
|
||||||
|
SkunkGame.addRes(element.getRes(), -element.getAmount());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.danitheskunk.skunkgame;
|
||||||
|
|
||||||
|
public class CostElement {
|
||||||
|
private final String res;
|
||||||
|
private final double amount;
|
||||||
|
|
||||||
|
public CostElement(String res, double amount) {
|
||||||
|
this.res = res;
|
||||||
|
this.amount = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRes() {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getAmount() {
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +0,0 @@
|
||||||
package com.danitheskunk.skunkgame;
|
|
||||||
|
|
||||||
public class Resources {
|
|
||||||
public double wood;
|
|
||||||
public int den;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.danitheskunk.skunkgame;
|
package com.danitheskunk.skunkgame;
|
||||||
|
|
||||||
import com.danitheskunk.skunkworks.BaseGame;
|
import com.danitheskunk.skunkworks.BaseGame;
|
||||||
import com.danitheskunk.skunkworks.Recti;
|
|
||||||
import com.danitheskunk.skunkworks.Vec2i;
|
import com.danitheskunk.skunkworks.Vec2i;
|
||||||
import com.danitheskunk.skunkworks.WindowStretchMode;
|
import com.danitheskunk.skunkworks.WindowStretchMode;
|
||||||
import com.danitheskunk.skunkworks.gfx.Color;
|
import com.danitheskunk.skunkworks.gfx.Color;
|
||||||
|
@ -9,57 +8,102 @@ import com.danitheskunk.skunkworks.gfx.IRenderContext;
|
||||||
import com.danitheskunk.skunkworks.gfx.vt.Terminal;
|
import com.danitheskunk.skunkworks.gfx.vt.Terminal;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Dictionary;
|
||||||
|
import java.util.Hashtable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class SkunkGame extends BaseGame {
|
public class SkunkGame extends BaseGame {
|
||||||
private Terminal term;
|
private Terminal term;
|
||||||
private double timeSinceLastUpdate;
|
private double timeSinceLastUpdate;
|
||||||
private double timePerUpdate;
|
private double timePerUpdate;
|
||||||
private Resources res;
|
public static Dictionary<String, Double> res;
|
||||||
|
private List<Building> buildings;
|
||||||
public static Vec2i mousePos;
|
public static Vec2i mousePos;
|
||||||
private List<Button> buttons;
|
private List<Button> actionButtons;
|
||||||
|
|
||||||
public SkunkGame() {
|
public SkunkGame() {
|
||||||
super(new Vec2i(1280, 700), "SkunkGame v0.0.0");
|
super(new Vec2i(1280, 700), "SkunkGame v0.0.0");
|
||||||
window.setStretchMode(WindowStretchMode.ASPECT);
|
window.setStretchMode(WindowStretchMode.ASPECT);
|
||||||
var font = window.loadFontTileset("fonts\\ega-8x14.png");
|
var font = window.loadFontTileset("fonts\\ega-8x14.png");
|
||||||
term = new Terminal(new Vec2i(160, 50), font);
|
term = new Terminal(new Vec2i(160, 50), font);
|
||||||
res = new Resources();
|
res = new Hashtable<>();
|
||||||
|
buildings = new ArrayList<>();
|
||||||
timePerUpdate = 1.0;
|
timePerUpdate = 1.0;
|
||||||
buttons = new ArrayList<>();
|
actionButtons = new ArrayList<>();
|
||||||
|
|
||||||
|
res.put("wood", 0.0);
|
||||||
|
|
||||||
|
addBuilding(
|
||||||
|
"den",
|
||||||
|
"Den",
|
||||||
|
new CostElement[]{new CostElement("wood", 10)}
|
||||||
|
);
|
||||||
|
|
||||||
var woodButton = new Button(new Vec2i(31, 0), "Gather Wood");
|
var woodButton = new Button(new Vec2i(31, 0), "Gather Wood");
|
||||||
woodButton.onClick(() -> res.wood += 1.0);
|
woodButton.onClick(() -> addRes("wood", 1.0));
|
||||||
buttons.add(woodButton);
|
actionButtons.add(woodButton);
|
||||||
|
|
||||||
|
|
||||||
var denButton = new Button(new Vec2i(31, 4), "Den");
|
|
||||||
denButton.onClick(() -> {
|
|
||||||
if(res.wood >= 10.0) {
|
|
||||||
res.wood -= 10.0;
|
|
||||||
res.den += 1;
|
|
||||||
denButton.setCount(res.den);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
buttons.add(denButton);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawScreen() {
|
private void drawScreen() {
|
||||||
term.clear(Color.BLACK);
|
term.clear(Color.BLACK);
|
||||||
drawResources();
|
drawResources();
|
||||||
term.drawVerticalSingleLine(new Vec2i(30, 0), term.getSize().getY());
|
term.drawVerticalSingleLine(new Vec2i(30, 0), term.getSize().getY());
|
||||||
|
|
||||||
|
var buttons = new ArrayList<Button>();
|
||||||
|
buttons.addAll(actionButtons);
|
||||||
|
for(var building : buildings) {
|
||||||
|
if(building.isButtonVisible()) {
|
||||||
|
buttons.add(building.getButton());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int i = 0;
|
||||||
for(var button : buttons) {
|
for(var button : buttons) {
|
||||||
|
button.setPos(Vec2i.add(new Vec2i(31, 0),
|
||||||
|
Vec2i.mul(new Vec2i(0, 3), i)
|
||||||
|
));
|
||||||
button.render(term);
|
button.render(term);
|
||||||
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawResources() {
|
private void drawResources() {
|
||||||
term.drawString(new Vec2i(0, 0), "Wood:");
|
term.drawString(new Vec2i(0, 0), "Wood:");
|
||||||
term.drawString(
|
term.drawString(new Vec2i(18, 0),
|
||||||
new Vec2i(18, 0),
|
String.format("%d", (int) getRes("wood"))
|
||||||
String.format("%d", (int) res.wood)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static double getRes(String name) {
|
||||||
|
return res.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setRes(String name, double count) {
|
||||||
|
res.put(name, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addRes(String name, double count) {
|
||||||
|
setRes(name, getRes(name) + count);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addBuilding(
|
||||||
|
String name, String displayName, CostElement[] cost
|
||||||
|
) {
|
||||||
|
buildings.add(new Building(name, displayName, new Cost(cost)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Building getBuilding(String name) {
|
||||||
|
//todo: optimise
|
||||||
|
for(var building : buildings) {
|
||||||
|
if(building.getName().equals(name)) {
|
||||||
|
return building;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void tick() {
|
private void tick() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -79,9 +123,14 @@ public class SkunkGame extends BaseGame {
|
||||||
}
|
}
|
||||||
mousePos = Vec2i.div(window.getMousePos(), term.getFullCharSize());
|
mousePos = Vec2i.div(window.getMousePos(), term.getFullCharSize());
|
||||||
if(window.isMouseClicked(0)) {
|
if(window.isMouseClicked(0)) {
|
||||||
for(var button : buttons) {
|
for(var button : actionButtons) {
|
||||||
button.processClick(mousePos);
|
button.processClick(mousePos);
|
||||||
}
|
}
|
||||||
|
for(var building : buildings) {
|
||||||
|
if(building.isButtonVisible()) {
|
||||||
|
building.getButton().processClick(mousePos);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue