diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..e96534f
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/Assignment 2/src/ca/cosc3p91/a2/Main.java b/Assignment 2/src/ca/cosc3p91/a2/Main.java
index 18130b1..e808fc1 100644
--- a/Assignment 2/src/ca/cosc3p91/a2/Main.java
+++ b/Assignment 2/src/ca/cosc3p91/a2/Main.java
@@ -1,12 +1,30 @@
package ca.cosc3p91.a2;
import ca.cosc3p91.a2.game.GameEngine;
+import ca.cosc3p91.a2.util.Print;
public class Main {
public static void main(String[] args) {
GameEngine engine = new GameEngine();
+ Print test = new Print("Hello There", 2, 500);
+
+ test.addColumn(new Print.Column("I am value 1"));
+ test.addColumn(new Print.Column("Super Value"));
+ test.addColumn(new Print.Column("SOLD!"));
+
+ Print.Row row = new Print.Row();
+ row.add("HelloThere");
+ row.add("Goodbye");
+ row.add("3");
+
+ test.addRow(row);
+ test.addRow(row);
+ test.addRow(row);
+
+ Print.print(test.createTable());
+
engine.run();
}
diff --git a/Assignment 2/src/ca/cosc3p91/a2/util/Print.java b/Assignment 2/src/ca/cosc3p91/a2/util/Print.java
index 0cf0ac4..e8dd54f 100644
--- a/Assignment 2/src/ca/cosc3p91/a2/util/Print.java
+++ b/Assignment 2/src/ca/cosc3p91/a2/util/Print.java
@@ -1,7 +1,209 @@
package ca.cosc3p91.a2.util;
+import java.util.ArrayList;
+
+/**
+ * Ported from blt::TableFormatter (C++)
+ * https://github.com/Tri11Paragon/BLT/
+ */
public class Print {
+ public static class Row {
+ private final ArrayList values;
+ public Row(ArrayList row) {
+ this.values = row;
+ }
+
+ public Row(){
+ this.values = new ArrayList<>();
+ }
+
+ public void add(String value){
+ values.add(value);
+ }
+ }
+
+ public static class Column {
+ private final String columnName;
+ private long maxColumnLength = 0;
+
+ public Column(String columnName){
+ this.columnName = columnName;
+ }
+ }
+
+ private final ArrayList rows = new ArrayList<>();
+ private final ArrayList columns = new ArrayList<>();
+
+ private String tableName;
+ private int columnPadding;
+ private int maxColumnWidth;
+
+ public Print(String tableName, int columnPadding, int maxColumnWidth){
+ this.tableName = tableName;
+ this.columnPadding = columnPadding;
+ this.maxColumnWidth = maxColumnWidth;
+ }
+
+ public Print(){
+ this("", 2, 500);
+ }
+
+ private String createPadding(int amount) {
+ StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < amount; i++){
+ builder.append(' ');
+ }
+ return builder.toString();
+ }
+
+ private String generateTopSelector(long size) {
+ long sizeOfName = tableName.isEmpty() ? 0 : tableName.length() + 4;
+ long sizeNameRemoved = size - sizeOfName;
+
+ StringBuilder halfWidthLeftSeparator = new StringBuilder();
+ StringBuilder halfWidthRightSeparator = new StringBuilder();
+
+ long sizeNameFloor = (long) Math.floor((double)sizeNameRemoved / 2.0);
+ long sizeNameCeil = (long) Math.ceil((double)sizeNameRemoved / 2.0);
+
+ halfWidthLeftSeparator.append('+');
+
+ for (int i = 0; i < sizeNameFloor - 1; i++)
+ halfWidthLeftSeparator.append('-');
+ for (int i = 0; i < sizeNameCeil - 1; i++)
+ halfWidthRightSeparator.append('-');
+
+ halfWidthRightSeparator.append('+');
+
+ StringBuilder separator = new StringBuilder();
+ separator.append(halfWidthLeftSeparator.toString());
+ if (sizeOfName != 0){
+ separator.append("{ ");
+ separator.append(tableName);
+ separator.append(" }");
+ }
+ separator.append(halfWidthRightSeparator);
+ return separator.toString();
+ }
+
+ private String generateColumnHeader(){
+ updateColumnLengths();
+ StringBuilder header = new StringBuilder();
+ header.append('|');
+
+ for (int i = 0; i < columns.size(); i++){
+ Column column = columns.get(i);
+ double columnPaddingLength = ((int)(column.maxColumnLength) - (int)(column.columnName.length()))/2.0;
+ header.append(createPadding((int)(columnPadding + (int)Math.floor(columnPaddingLength))));
+
+ header.append(column.columnName);
+
+ header.append(createPadding((int)(columnPadding + (int)Math.ceil(columnPaddingLength))));
+ if (i < columns.size()-1)
+ header.append('|');
+ }
+ header.append('|');
+
+ return header.toString();
+ }
+
+ private String generateSeparator(long size) {
+ int nextIndex = 0;
+ int currentColumnIndex = 0;
+ StringBuilder wholeWidthSeparator = new StringBuilder();
+ for (int i = 0; i < size; i++) {
+ if (i == nextIndex) {
+ System.out.println(currentColumnIndex + " " + nextIndex + " " + size);
+ int currentColumnSize = (int) (columns.get(currentColumnIndex++).maxColumnLength + columnPadding*2);
+ nextIndex += currentColumnSize + 1;
+ wholeWidthSeparator.append('+');
+ } else
+ wholeWidthSeparator.append('-');
+ }
+ wholeWidthSeparator.append('+');
+ return wholeWidthSeparator.toString();
+ }
+
+ private void updateColumnLengths() {
+ for (int i = 0; i < columns.size(); i++) {
+ Column column = columns.get(i);
+ column.maxColumnLength = column.columnName.length();
+ for (Row row : rows) {
+ column.maxColumnLength = Math.max(column.maxColumnLength, row.values.get(i).length() - 1);
+ }
+ }
+ }
+
+ public long columnSize(Column column) {
+ return column.columnName.length() + columnPadding * 2L;
+ }
+
+ public Print addColumn(Column column){
+ columns.add(column);
+ return this;
+ }
+
+ public Print addRow(Row row) {
+ if (row.values.size() > columns.size())
+ throw new RuntimeException("Unable to create row with more values than columns!");
+ if (row.values.size() < columns.size())
+ for (int i = row.values.size(); i < columns.size(); i++)
+ row.values.add("");
+ rows.add(row);
+ return this;
+ }
+
+ public Print addRow(ArrayList row){
+ return addRow(new Row(row));
+ }
+
+ public ArrayList createTable(boolean top, boolean bottom, boolean separators){
+ ArrayList lines = new ArrayList<>();
+
+ String header = generateColumnHeader();
+ String topSeparator = generateTopSelector(header.length());
+ String lineSeparator = generateSeparator(header.length() - 1);
+
+ if (top)
+ lines.add(topSeparator);
+
+ lines.add(header);
+ lines.add(lineSeparator);
+
+ for (Row row : rows) {
+ StringBuilder rowLine = new StringBuilder();
+ rowLine.append('|');
+ for (int i = 0; i < row.values.size(); i++){
+ String value = row.values.get(i);
+ Column column = columns.get(i);
+ int spaceLeft = (int)(column.maxColumnLength - value.length());
+ rowLine.append(createPadding((int)Math.floor(spaceLeft / 2.0) + columnPadding));
+ rowLine.append(value);
+ rowLine.append(createPadding((int)Math.ceil(spaceLeft / 2.0) + columnPadding));
+ rowLine.append('|');
+ }
+ lines.add(rowLine.toString());
+ }
+
+ if (bottom)
+ lines.add(lineSeparator);
+
+ return lines;
+ }
+
+ public ArrayList createBox(){
+ return new ArrayList<>();
+ }
+
+ public ArrayList createTable() {
+ return createTable(true, true, true);
+ }
+
+ public static void print(ArrayList lines){
+ for (String line : lines)
+ System.out.println(line);
+ }
}
diff --git a/Assignment 2/src/ca/cosc3p91/a2/util/Time.java b/Assignment 2/src/ca/cosc3p91/a2/util/Time.java
index d006449..60d5f93 100644
--- a/Assignment 2/src/ca/cosc3p91/a2/util/Time.java
+++ b/Assignment 2/src/ca/cosc3p91/a2/util/Time.java
@@ -4,12 +4,16 @@ public class Time {
private long timeSeconds;
+ public Time() {
+ this.timeSeconds = 0;
+ }
+
protected Time(long timeSeconds) {
this.timeSeconds = timeSeconds;
}
- public Time offsetSeconds(long seconds){
- timeSeconds += seconds;
+ public Time offsetSeconds(long seconds) {
+ this.timeSeconds += seconds;
return this;
}
@@ -21,27 +25,31 @@ public class Time {
return offsetMinutes(hours * 60);
}
- public Time offsetDays(long days){
+ public Time offsetDays(long days) {
return offsetHours(days * 24);
}
- public long get(){
+ public Time offsetTime(Time time) {
+ return offsetSeconds(time.timeSeconds);
+ }
+
+ public long get() {
return timeSeconds;
}
public static class FutureTime {
private final Time futureTime;
- public FutureTime(Time futureTime){
+ public FutureTime(Time futureTime) {
this.futureTime = futureTime;
}
- public boolean occurred(){
+ public boolean occurred() {
return getTime().timeSeconds >= futureTime.timeSeconds;
}
}
- public static Time getTime(){
+ public static Time getTime() {
return new Time(System.currentTimeMillis() / 1000);
}