diff options
6 files changed, 172 insertions, 37 deletions
diff --git a/data/personaldb.json b/data/personaldb.json index 069f15b..5ba73ac 100644 --- a/data/personaldb.json +++ b/data/personaldb.json @@ -1,36 +1,21 @@ [ { - "username": "happy", - "passwordHash": 1234567890, - "fullName": "Happy Gilmore", - "rounds": [ + "username": "john_doe", + "passwordHash": 12345, + "fullName": "John Doe", + "courses": [], + "rounds": [], + "clubs": [ { - "dateTime": "2025-10-02T14:35:00", - "startingHole": { "number": 1, "par": 4 }, - "plays": [ - { - "distance": 260, - "swings": [ - { - "distance": 240, - "clubUsed": { - "manufacture": "Titleist", - "nickname": "Big Dog", - "clubType": "Driver" - } - }, - { - "distance": 20, - "clubUsed": { - "manufacture": "Cleveland", - "nickname": "RTX ZipCore", - "clubType": "SandWedge" - } - } - ] - } - ] + "manufacture": "TaylorMade", + "nickname": "Old Faithful", + "clubType": "DRIVER" + }, + { + "manufacture": "Callaway", + "nickname": "Lucky Seven", + "clubType": "IRON" } ] } -] +]
\ No newline at end of file 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..cf6f4b1 --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java @@ -0,0 +1,50 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; +import design.controller.userinput.Session; +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; + +public class CourseSelectMenu extends Menu { + + @Override + public String getTitle() { + return "course select"; + } + + @Override + public List<MenuOption> getMenuOptions() { + List<MenuOption> opts = new ArrayList<>(); + + // 0) 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 = Session.MDB.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(); + })); + + // 1) back + opts.add(new MenuOption("back to main menu", a -> new MainMenu().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..63447e2 --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -0,0 +1,88 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; +import design.controller.userinput.Session; +import design.model.Club; +import design.model.Round; +import design.model.holeplay.HolePlayContext; + +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, Session.PDB); + } + + @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 fb3cee9..bbf008e 100644 --- a/src/main/java/design/controller/userinput/menus/MainMenu.java +++ b/src/main/java/design/controller/userinput/menus/MainMenu.java @@ -16,8 +16,8 @@ public class MainMenu extends Menu { return List.of( new MenuOption("user settings...", (a) -> new UserSettings().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..d93e687 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.controller.userinput.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..187c2d2 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,8 @@ public class JSONPersonalDatabase implements PersonalDatabase { this.cache = new HashMap<>(); this.mapper = new ObjectMapper(); + mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + SimpleModule module = new SimpleModule(); module.addDeserializer(Course.class, new CourseIdDeserializer()); module.addSerializer(Course.class, new CourseIdSerializer()); @@ -58,9 +61,12 @@ 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]; + Collection<Golfer> golfers = cache.values(); + Golfer[] array = golfers.toArray(new Golfer[golfers.size()]); + return array; } @Override |
