summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/java/design/controller/userinput/Menu.java2
-rw-r--r--src/main/java/design/controller/userinput/menus/CourseSelectMenu.java52
-rw-r--r--src/main/java/design/controller/userinput/menus/HolePlayMenu.java89
-rw-r--r--src/main/java/design/controller/userinput/menus/MainMenu.java5
-rw-r--r--src/main/java/design/controller/userinput/menus/SelectUser.java12
-rw-r--r--src/main/java/design/persistence/JSONPersonalDatabase.java8
-rw-r--r--src/main/java/design/persistence/PersonalDatabase.java5
-rw-r--r--src/main/java/design/runtime/Session.java15
8 files changed, 179 insertions, 9 deletions
diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java
index 7677793..605b640 100644
--- a/src/main/java/design/controller/userinput/Menu.java
+++ b/src/main/java/design/controller/userinput/Menu.java
@@ -21,7 +21,7 @@ public abstract class Menu {
try {
int i = Integer.parseInt(split[0]);
menuOptions.get(i).onCommand(Arrays.copyOfRange(split, 1, split.length));
- } catch (Exception ex) {
+ } catch (ArrayIndexOutOfBoundsException ex) {
System.err.printf("Invalid option \"%s\"\n", line);
present();
}
diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java
new file mode 100644
index 0000000..881c393
--- /dev/null
+++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java
@@ -0,0 +1,52 @@
+package design.controller.userinput.menus;
+
+import design.controller.userinput.Menu;
+import design.controller.userinput.MenuOption;
+import design.model.Course;
+import design.model.Hole;
+import design.model.Round;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+import design.persistence.MasterDatabase;
+import design.runtime.Session;
+
+public class CourseSelectMenu extends Menu {
+
+ @Override
+ public String getTitle() {
+ return "course select";
+ }
+
+ @Override
+ public List<MenuOption> getMenuOptions() {
+ List<MenuOption> opts = new ArrayList<>();
+
+ // 0) back
+ opts.add(new MenuOption("back to main menu", a -> new MainMenu().present()));
+
+ // 1) pick course by number TODO: add error checking
+ opts.add(new MenuOption("pick course by number (1..1000)", a -> {
+ Scanner sc = new Scanner(System.in);
+
+ System.out.print("Course number (1..1000): ");
+ int n = Integer.parseInt(sc.nextLine().trim());
+ Course c = MasterDatabase.INSTANCE.getCourse(n - 1);
+
+ System.out.print("Starting hole (1..18, blank=1): ");
+ String s = sc.nextLine().trim();
+ int start = s.isEmpty() ? 1 : Integer.parseInt(s);
+
+ Hole startHole = c.getHoles().get(start - 1);
+
+ Round r = new Round(c, LocalDateTime.now(), startHole);
+ Session.getCurrentGolfer().addRound(r);
+ new HolePlayMenu(r).present();
+ }));
+
+ return opts;
+ }
+}
diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java
new file mode 100644
index 0000000..bcd7560
--- /dev/null
+++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java
@@ -0,0 +1,89 @@
+package design.controller.userinput.menus;
+
+import design.controller.userinput.Menu;
+import design.controller.userinput.MenuOption;
+import design.runtime.Session;
+import design.model.Club;
+import design.model.Round;
+import design.model.holeplay.HolePlayContext;
+import design.persistence.PersonalDatabase;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+public class HolePlayMenu extends Menu {
+
+ private final Round round;
+ private final HolePlayContext ctx;
+
+ public HolePlayMenu(Round round) {
+ this.round = round;
+ this.ctx = new HolePlayContext(Session.getCurrentGolfer(), round, PersonalDatabase.INSTANCE);
+ }
+
+ @Override
+ public String getTitle() {
+ return String.format("hole play - %s | hole %d", round.getCourse().getName(),
+ round.getCurrentHole().getNumber());
+ }
+
+ @Override
+ public List<MenuOption> getMenuOptions() {
+ List<MenuOption> opts = new ArrayList<>();
+
+ boolean inSetup = (ctx.getCurrentPlay() == null);
+
+ if (inSetup) {
+ // 0) Start hole
+ opts.add(new MenuOption("start hole", (a) -> {
+ ctx.startHole();
+ System.out.println("Started hole " + round.getCurrentHole().getNumber() + ".");
+ this.present();
+ }));
+ } else {
+ // 0) Take a shot
+ opts.add(new MenuOption("take a shot", (a) -> {
+ // Gets club
+ Scanner sc = new Scanner(System.in);
+ System.out.print("Club nickname: ");
+ String nick = sc.nextLine().trim();
+ // Defaulted to Driver for now
+ // TODO update logic
+ Club club = new Club("Generic", nick, Club.ClubType.DRIVER);
+
+ // Get shot distance (defaults to 0 of not stated)
+ System.out.print("Distance (yds, blank=0): ");
+ String ds = sc.nextLine().trim();
+ int dist = 0;
+ if (!ds.isEmpty()) {
+ dist = Integer.parseInt(ds);
+ }
+
+ // Records shot
+ ctx.recordShot(club, dist);
+ System.out.println("Shot recorded: " + dist + " yds with " + club.getNickname());
+
+ this.present();
+ }));
+
+ // 1) Hole out
+ opts.add(new MenuOption("hole out", (a) -> {
+ // Precedes to next hole
+ int prev = round.getCurrentHole().getNumber();
+ ctx.holeOut();
+ System.out.println("Holed out on " + prev + ". Next: " + round.getCurrentHole().getNumber());
+ this.present();
+ }));
+ }
+
+ // End round (always shown)
+ opts.add(new MenuOption("end round", (a) -> {
+ ctx.endRoundNow();
+ System.out.println("Round ended.");
+ new MainMenu().present();
+ }));
+
+ return opts;
+ }
+}
diff --git a/src/main/java/design/controller/userinput/menus/MainMenu.java b/src/main/java/design/controller/userinput/menus/MainMenu.java
index f2c9c21..8ee872e 100644
--- a/src/main/java/design/controller/userinput/menus/MainMenu.java
+++ b/src/main/java/design/controller/userinput/menus/MainMenu.java
@@ -17,8 +17,7 @@ public class MainMenu extends Menu {
new MenuOption("user settings...", (a) -> new UserSettings().present()),
new MenuOption("add course to profile...", (a) -> new SearchMenu().present()),
new MenuOption("statistics...", (a) -> new StatisticsMenu().present()),
- new MenuOption("log round...", (a) -> {}),
- new MenuOption("quit", (a) -> {})
- );
+ new MenuOption("log round...", (a) -> new CourseSelectMenu().present()),
+ new MenuOption("quit", (a) -> {}));
}
}
diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java
index 1963f1d..2f1a867 100644
--- a/src/main/java/design/controller/userinput/menus/SelectUser.java
+++ b/src/main/java/design/controller/userinput/menus/SelectUser.java
@@ -2,6 +2,7 @@ package design.controller.userinput.menus;
import design.controller.userinput.Menu;
import design.controller.userinput.MenuOption;
+import design.runtime.Session;
import design.persistence.PersonalDatabase;
import java.util.ArrayList;
@@ -19,9 +20,14 @@ public class SelectUser extends Menu {
@Override
public List<MenuOption> getMenuOptions() {
var l = new ArrayList<MenuOption>();
- l.addAll(Arrays.stream(personalDB.getGolfers())
- .map(i -> new MenuOption(i.getUsername(), (a) -> {})).toList());
- l.add(new MenuOption("<create>", (a) -> {}));
+ // Sets user in Session too
+ l.addAll(Arrays.stream(personalDB.getGolfers()).map(i -> new MenuOption(i.getUsername(), (a) -> {
+ Session.setCurrentGolfer(i);
+ System.out.printf("Loaded user: %s%n", i.getUsername());
+ new UserSettings().present();
+ })).toList());
+ l.add(new MenuOption("<create>", (a) -> {
+ }));
return l;
}
}
diff --git a/src/main/java/design/persistence/JSONPersonalDatabase.java b/src/main/java/design/persistence/JSONPersonalDatabase.java
index 0efa362..b034680 100644
--- a/src/main/java/design/persistence/JSONPersonalDatabase.java
+++ b/src/main/java/design/persistence/JSONPersonalDatabase.java
@@ -16,6 +16,7 @@ import design.model.Golfer;
import java.io.File;
import java.io.IOException;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@@ -30,6 +31,10 @@ public class JSONPersonalDatabase implements PersonalDatabase {
this.cache = new HashMap<>();
this.mapper = new ObjectMapper();
+ // TODO: Once the saved JSON matches the model, consider removing.
+ // TEMP: tolerate unknown props while the model stabilizes
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
SimpleModule module = new SimpleModule();
module.addDeserializer(Course.class, new CourseIdDeserializer());
module.addSerializer(Course.class, new CourseIdSerializer());
@@ -58,9 +63,10 @@ public class JSONPersonalDatabase implements PersonalDatabase {
mapper.writer(new CustomPrettyPrinter()).writeValue(file, data);
}
+ // turns that collection into a real array of golfers
@Override
public Golfer[] getGolfers() {
- return new Golfer[0];
+ return cache.values().toArray(Golfer[]::new);
}
@Override
diff --git a/src/main/java/design/persistence/PersonalDatabase.java b/src/main/java/design/persistence/PersonalDatabase.java
index a045d59..428694b 100644
--- a/src/main/java/design/persistence/PersonalDatabase.java
+++ b/src/main/java/design/persistence/PersonalDatabase.java
@@ -1,15 +1,18 @@
package design.persistence;
import design.model.Golfer;
-
import java.io.IOException;
public interface PersonalDatabase {
PersonalDatabase INSTANCE = new JSONPersonalDatabase("data/personaldb.json");
Golfer[] getGolfers();
+
Golfer getGolfer(String name);
+
void addGolfer(Golfer golfer) throws IOException;
+
void removeGolfer(Golfer golfer) throws IOException;
+
void updateGolfer(Golfer golfer) throws IOException;
}
diff --git a/src/main/java/design/runtime/Session.java b/src/main/java/design/runtime/Session.java
new file mode 100644
index 0000000..fbf4b9c
--- /dev/null
+++ b/src/main/java/design/runtime/Session.java
@@ -0,0 +1,15 @@
+package design.runtime;
+
+import design.model.Golfer;
+
+public final class Session {
+ private static Golfer currentGolfer;
+
+ public static Golfer getCurrentGolfer() {
+ return currentGolfer;
+ }
+
+ public static void setCurrentGolfer(Golfer currentGolfer) {
+ Session.currentGolfer = currentGolfer;
+ }
+}