Skip to content

Sailing Races⚓︎

This section compiles all the sailing races encountered during my journey through the Holiday Hack Challenge.

Starting Locations⚓︎

The coordinates are aligned with a spherical minimap, where the top-left corner corresponds to (0,0), and the bottom-right corner is represented as (2000,2000).

From viewing h: data in Websocket traffic, See BONUS! Fishing Mastery for more detail.

ws_h
[
  {
    "name": "Island Shuffle",
    "type": "race",
    "x": 482.98790195035826,
    "y": 1664.8771491360346,
    "r": 4
  },
  {
    "name": "The Goose",
    "type": "race",
    "x": 1212.7510648618652,
    "y": 1672.3237726652726,
    "r": 4
  },
  {
    "name": "Zipper",
    "type": "race",
    "x": 978.8558379719042,
    "y": 833.5328060088125,
    "r": 4
  },
  {
    "name": "Trench Run",
    "type": "race",
    "x": 339.0468175513332,
    "y": 384.34469101166866,
    "r": 4
  },
  {
    "name": "Thread the Needle",
    "type": "race",
    "x": 714.521036015623,
    "y": 1040.2029814594011,
    "r": 4
  },
  {
    "name": "The Big Dipper",
    "type": "race",
    "x": 718.8149909812448,
    "y": 1178.254000928796,
    "r": 4
  },
  {
    "name": "BRUHmuda",
    "type": "race",
    "x": 1981.8043832489109,
    "y": 1112.2173208736335,
    "r": 4
  },
  {
    "name": "The Grand Tour",
    "type": "race",
    "x": 786.8047564500714,
    "y": 162.19489262253794,
    "r": 4
  }
]

I generated a plot using the waypoints acquired from the Websocket traffic labeled e:, as illustrated below. Each pertinent plot corresponding to different races is presented in the subsequent sections.

plot_race.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""This script is used to plot the race coordinates onto the minimap.
Holiday Hack 2023 - Overlay Coords
"""

# Imports
import matplotlib.pyplot as plt
from PIL import Image
import requests
from io import BytesIO


def download_minimap(url):
    response = requests.get(url)
    return Image.open(BytesIO(response.content))


def calculate_arrowhead_size(ax, x1, y1, x2, y2):
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    data_width = xlim[1] - xlim[0]
    data_height = ylim[1] - ylim[0]

    head_width = data_width * 0.02  # You can adjust this factor as needed
    head_length = data_height * 0.02  # You can adjust this factor as needed

    return head_width, head_length


def plot_coordinates(coordinates, title, minimap_data):
    # Set the dimensions of the minimap
    min_x, min_y = 0, 0
    max_x, max_y = 2000, 2000

    # Calculate axis limits based on the perimeter of the points
    min_x_limit = min(coordinates, key=lambda coord: coord["x"])["x"] - 100
    max_x_limit = max(coordinates, key=lambda coord: coord["x"])["x"] + 100
    min_y_limit = min(coordinates, key=lambda coord: coord["y"])["y"] - 100
    max_y_limit = max(coordinates, key=lambda coord: coord["y"])["y"] + 100

    # Create a scatter plot
    _, ax = plt.subplots(figsize=(10, 10))
    ax.imshow(minimap_data, extent=[min_x, max_x, max_y, min_y])  # Note the inversion of y-axis

    # Set axis limits
    ax.set_xlim(min_x_limit, max_x_limit)
    ax.set_ylim(min_y_limit, max_y_limit)

    # Calculate arrowhead size based on overall data range
    head_width, head_length = calculate_arrowhead_size(ax, min_x_limit, min_y_limit, max_x_limit, max_y_limit)

    # Plot the coordinates
    for i, waypoint in enumerate(coordinates[:-1]):
        x1, y1 = waypoint["x"], waypoint["y"]
        x2, y2 = coordinates[i + 1]["x"], coordinates[i + 1]["y"]

        # Plot the between points
        if i != 0:
            ax.plot(x1, y1, "ro")  # Red dot for each waypoint
            ax.text(x1, y1, str(i + 1), color="black", fontsize=8, ha="center", va="center")

        ax.arrow(x1, y1, x2 - x1, y2 - y1, fc="blue", ec="blue", head_width=head_width, head_length=head_length)

    # Plot the last/first waypoint
    x_last, y_last = coordinates[-1]["x"], coordinates[-1]["y"]
    ax.plot(x_last, y_last, "mo", label="End Point")  # Red dot for the end point
    ax.text(x_last, y_last, str(len(coordinates)), color="black", fontsize=8, ha="center", va="center")

    x_first, y_first = coordinates[0]["x"], coordinates[0]["y"]
    ax.plot(x_first, y_first, "go", label="Start Point")  # Green dot for the start point
    ax.text(x_first, y_first, "1", color="black", fontsize=8, ha="center", va="center")

    # Reverse the y-axis
    ax.invert_yaxis()

    # Set labels, title, and show the plot
    ax.set_title(title)
    ax.set_xlabel("X-coordinate")
    ax.set_ylabel("Y-coordinate")
    ax.legend()
    ax.grid(True)


# Download minimap
minimap_url = "https://2023.holidayhackchallenge.com/sea/assets/minimap.png"
minimap = download_minimap(minimap_url)

# Plot charts
# e: - coordinates provided in race [coordinates]
# h: - Race starting locations
wrap_max = 2000  # For wrapping (spherical coordinates)
data_dict = {
    "1 - Island Shuffle": [
        {"x": 482.98790195035826, "y": 1664.8771491360346},
        {"x": 416.3212352836916, "y": 1664.8771491360346},
        {"x": 454.52123528369157, "y": 1641.4104824693682},
        {"x": 442.72123528369156, "y": 1661.4771491360348},
        {"x": 470.1212352836916, "y": 1692.2771491360347},
        {"x": 471.4545686170249, "y": 1638.5438158027014},
        {"x": 417.1212352836916, "y": 1668.810482469368},
        {"x": 482.98790195035826, "y": 1664.8771491360346},
    ],
    "2 - The Goose": [
        {"x": 1212.7510648618652, "y": 1672.3237726652726},
        {"x": 1287.6843981951986, "y": 1622.7237726652727},
        {"x": 1410.6177315285317, "y": 1683.257105998606},
        {"x": 1433.2843981951985, "y": 1662.457105998606},
        {"x": 1451.151064861865, "y": 1719.7904393319393},
        {"x": 1499.198002474542, "y": 1644.5765038838347},
        {"x": 1540.3060424199157, "y": 1596.5145616007512},
        {"x": 1475.1127691302318, "y": 1556.5944683430876},
        {"x": 1362.104536399726, "y": 1551.8280055943922},
        {"x": 1243.5792004367845, "y": 1596.5732087524577},
        {"x": 1212.7510648618652, "y": 1672.3237726652726},
    ],
    "3 - Zipper": [
        {"x": 978.8558379719042, "y": 833.5328060088125},
        {"x": 942.4558379719042, "y": 847.1994726754792},
        {"x": 977.9891713052375, "y": 847.9994726754792},
        {"x": 950.7225046385709, "y": 861.3328060088126},
        {"x": 979.5225046385708, "y": 863.1994726754792},
        {"x": 960.1891713052376, "y": 873.6661393421458},
        {"x": 978.7891713052376, "y": 874.6661393421458},
        {"x": 972.5891713052375, "y": 880.6661393421458},
    ],
    "4 - Trench Run": [
        {"x": 339.0468175513332, "y": 384.34469101166866},
        {"x": 452.19259730717283, "y": 409.5808053971302},
        {"x": 461.11863647645947, "y": 371.51738119150633},
        {"x": 346.8063055788408, "y": 330.8851975072226},
    ],
    "5 - Thread the Needle": [
        {"x": 714.521036015623, "y": 1040.2029814594011},
        {"x": 737.7210360156231, "y": 1076.2029814594011},
        {"x": 712.7210360156231, "y": 1073.0029814594013},
        {"x": 717.321036015623, "y": 1027.8029814594013},
        {"x": 638.1210360156231, "y": 1019.0029814594012},
        {"x": 730.7210360156231, "y": 1021.6029814594012},
    ],
    "6 - The Big Dipper": [
        {"x": 718.8149909812448, "y": 1178.254000928796},
        {"x": 671.8816576479115, "y": 1166.7873342621294},
        {"x": 672.1483243145782, "y": 1180.9206675954626},
        {"x": 755.6149909812449, "y": 1176.9206675954626},
        {"x": 763.8816576479115, "y": 1248.654000928796},
        {"x": 803.6149909812449, "y": 1248.3873342621293},
        {"x": 802.0149909812449, "y": 1225.9873342621293},
        {"x": 823.6149909812449, "y": 1196.1206675954627},
        {"x": 836.6816576479115, "y": 1166.7873342621294},
        {"x": 811.8816576479115, "y": 1187.854000928796},
        {"x": 754.2816576479115, "y": 1177.1873342621293},
    ],
    "7 - BRUHmuda": [
        {"x": 1981.8043832489109, "y": 1112.2173208736335},
        {"x": 33.5377165822442 + wrap_max, "y": 1071.150654206967},
        {"x": 34.0710499155775 + wrap_max, "y": 1117.2839875403001},
        {"x": 1973.5377165822442, "y": 1074.8839875403003},
        {"x": 13.2710499155776 + wrap_max, "y": 1054.8839875403003},
        {"x": 1991.937716582244, "y": 1125.550654206967},
        {"x": 47.4043832489108 + wrap_max, "y": 1078.6173208736336},
        {"x": 1979.937716582244, "y": 1078.6173208736336},
        {"x": 32.4710499155776 + wrap_max, "y": 1121.0173208736335},
    ],
    "8 - The Grand Tour": [
        {"x": 786.8047564500714, "y": 162.19489262253794},
        {"x": 549.6299289280247, "y": 336.78111387645083},
        {"x": 354.48051693144345, "y": 669.9095114720957},
        {"x": 351.6131851636, "y": 1656.8237757791446},
        {"x": 760.3191889860796, "y": 702.1628507442036},
        {"x": 1057.0435141942905, "y": 659.6697535837518},
        {"x": 1632.5696560003048, "y": 210.46586312286473},
        {"x": 1824.7170728927533, "y": 901.45000704784},
        {"x": 1388.2330313889415, "y": 1719.006705388743},
        {"x": 951.3989446657206, "y": 1204.1533301081556},
    ],
}

for title, coordinates in data_dict.items():
    print(f"Plotting {title} ...")
    plot_coordinates(coordinates, title, minimap)


# Show the plots
plt.show()

1 - Island Shuffle⚓︎

I discovered the Island Shuffle racing minigame located south of Christmas Island near Frosty's Beach Port. This exciting race challenges players to navigate through various checkpoints within a specified time frame, utilizing arrow keys for control.

islandshuffle

Here are the coordinates of the race:

coordinates
[
    {"x": 482.98790195035826, "y": 1664.8771491360346},
    {"x": 416.3212352836916, "y": 1664.8771491360346},
    {"x": 454.52123528369157, "y": 1641.4104824693682},
    {"x": 442.72123528369156, "y": 1661.4771491360348},
    {"x": 470.1212352836916, "y": 1692.2771491360347},
    {"x": 471.4545686170249, "y": 1638.5438158027014},
    {"x": 417.1212352836916, "y": 1668.810482469368},
    {"x": 482.98790195035826, "y": 1664.8771491360346},
]

Here is my best score:

Top Scores:

19.534164064 seconds, by seafallen
19.536011951 seconds, by apok (+0.0018)
19.867042022 seconds, by noodlebox (+0.3329)
19.998033261 seconds, by jwachuta (+0.4639)
20.097155972 seconds, by TorvinenJ (+0.5630)
20.261942131 seconds, by Volty (+0.7278)
20.264651219 seconds, by BrickHouse (+0.7305)
20.359501575 seconds, by wekuenfuiwhuewi (+0.8253)
20.460021769 seconds, by iMAXX1337 (+0.9259)
20.557239505 seconds, by Konchu (+1.0231)

2 - The Goose⚓︎

I stumbled upon The Goose racing minigame situated west of Misfit Island, near the Scaredy Kite Heights dock. This engaging challenge requires players to navigate through designated checkpoints within a set time, employing arrow keys for control.

thegoose

Here are the coordinates of the race:

coordinates
[
    {"x": 1212.7510648618652, "y": 1672.3237726652726},
    {"x": 1287.6843981951986, "y": 1622.7237726652727},
    {"x": 1410.6177315285317, "y": 1683.257105998606},
    {"x": 1433.2843981951985, "y": 1662.457105998606},
    {"x": 1451.151064861865, "y": 1719.7904393319393},
    {"x": 1499.198002474542, "y": 1644.5765038838347},
    {"x": 1540.3060424199157, "y": 1596.5145616007512},
    {"x": 1475.1127691302318, "y": 1556.5944683430876},
    {"x": 1362.104536399726, "y": 1551.8280055943922},
    {"x": 1243.5792004367845, "y": 1596.5732087524577},
    {"x": 1212.7510648618652, "y": 1672.3237726652726},
]

Here is my best score:

thegoose

Top Scores:

50.257264444 seconds, by seafallen
50.456921957 seconds, by skynetDev (+0.1997)
50.621634543 seconds, by apok (+0.3644)
52.172840881 seconds, by ahojnicki (+1.9156)
52.205967563 seconds, by BrickHouse (+1.9487)
52.834404042 seconds, by Sorenweatherston (+2.5771)
52.930350842 seconds, by ZhyCo (+2.6731)
53.45993582 seconds, by batteryboss (+3.2027)
53.823033536 seconds, by BrendenPerdue (+3.5658)
54.119918533 seconds, by chriselgee (+3.8627)

3 - Zipper⚓︎

I came across the Zipper racing minigame located to the north of Steampunk Island, near Coggoggle Marina Port. This thrilling race demands players to swiftly reach each checkpoint within a designated time, utilizing arrow keys for navigation.

zipper

Here are the coordinates of the race:

coordinates
[
    {"x": 978.8558379719042, "y": 833.5328060088125},
    {"x": 942.4558379719042, "y": 847.1994726754792},
    {"x": 977.9891713052375, "y": 847.9994726754792},
    {"x": 950.7225046385709, "y": 861.3328060088126},
    {"x": 979.5225046385708, "y": 863.1994726754792},
    {"x": 960.1891713052376, "y": 873.6661393421458},
    {"x": 978.7891713052376, "y": 874.6661393421458},
    {"x": 972.5891713052375, "y": 880.6661393421458},
]

Here is my best score:

zipper

Top Scores:

11.680319659 seconds, by seafallen
11.747929597 seconds, by ZhyCo (+0.0676)
11.747988923 seconds, by skynetDev (+0.0677)
12.077908092 seconds, by apok (+0.3976)
12.143882522 seconds, by LukeIsCool (+0.4636)
12.34190991 seconds, by raffer91 (+0.6616)
12.605075124 seconds, by jhalpin (+0.9248)
12.605923599 seconds, by BoomerG (+0.9256)
12.637877072 seconds, by LateM00N (+0.9576)
12.704601941 seconds, by kruczy (+1.0243)

4 - Trench Run⚓︎

I discovered the Trench Run racing minigame situated northwest of Space Island, near Spaceport Point Port. This exhilarating race necessitates players to skillfully navigate through each checkpoint within a specified time, employing arrow keys for precise control.

trenchrun

Here are the coordinates of the race:

coordinates
[
    {"x": 339.0468175513332, "y": 384.34469101166866},
    {"x": 452.19259730717283, "y": 409.5808053971302},
    {"x": 461.11863647645947, "y": 371.51738119150633},
    {"x": 346.8063055788408, "y": 330.8851975072226},
]

Here is my best score:

trenchrun

Top Scores:

17.587774331 seconds, by skynetDev
19.834568669 seconds, by seafallen (+2.2468)
20.591909164 seconds, by apok (+3.0041)
24.354035824 seconds, by TheGreenNinja (+6.7663)
25.378421632 seconds, by BrendenPerdue (+7.7906)
25.675141608 seconds, by ahojnicki (+8.0874)
26.068749668 seconds, by BrickHouse (+8.4810)
27.026591818 seconds, by mooneyk (+9.4388)
27.652763674 seconds, by Konchu (+10.0650)
28.742924647 seconds, by puckerfest (+11.1552)

5 - Thread the Needle⚓︎

I located the Thread the Needle racing minigame situated west of Steampunk Island, near Rusty Quay Port. This fast-paced race challenges players to navigate through each checkpoint within a designated time frame, utilizing arrow keys for precise control.

threadtheneedle

Here are the coordinates of the race:

coordinates
[
    {"x": 714.521036015623, "y": 1040.2029814594011},
    {"x": 737.7210360156231, "y": 1076.2029814594011},
    {"x": 712.7210360156231, "y": 1073.0029814594013},
    {"x": 717.321036015623, "y": 1027.8029814594013},
    {"x": 638.1210360156231, "y": 1019.0029814594012},
    {"x": 730.7210360156231, "y": 1021.6029814594012},
]

Here is my best score:

threadtheneedle

Top Scores:

15.079904972 seconds, by apok
15.146924184 seconds, by seafallen (+0.0670)
15.148671474 seconds, by ahojnicki (+0.0688)
15.345002682 seconds, by BoomerG (+0.2651)
15.442551052 seconds, by bg13 (+0.3626)
15.476936527 seconds, by skynetDev (+0.3970)
15.673776546 seconds, by Mal0rt (+0.5939)
15.773984795 seconds, by masterlake (+0.6941)
15.806819718 seconds, by BrickHouse (+0.7269)
15.80701053 seconds, by mooneyk (+0.7271)

6 - The Big Dipper⚓︎

I came across The Big Dipper racing minigame situated southwest of Steampunk Island, near Rusty Quay Port. In this exhilarating challenge, players must navigate through each checkpoint within a specified time using arrow keys for precise control.

thebigdipper

Here are the coordinates of the race:

coordinates
[
    {"x": 718.8149909812448, "y": 1178.254000928796},
    {"x": 671.8816576479115, "y": 1166.7873342621294},
    {"x": 672.1483243145782, "y": 1180.9206675954626},
    {"x": 755.6149909812449, "y": 1176.9206675954626},
    {"x": 763.8816576479115, "y": 1248.654000928796},
    {"x": 803.6149909812449, "y": 1248.3873342621293},
    {"x": 802.0149909812449, "y": 1225.9873342621293},
    {"x": 823.6149909812449, "y": 1196.1206675954627},
    {"x": 836.6816576479115, "y": 1166.7873342621294},
    {"x": 811.8816576479115, "y": 1187.854000928796},
    {"x": 754.2816576479115, "y": 1177.1873342621293},
]

Here is my best score:

thebigdipper

Top Scores:

22.208915553 seconds, by seafallen
22.275887684 seconds, by apok (+0.0670)
22.571051172 seconds, by skynetDev (+0.3621)
23.101061331 seconds, by BoomerG (+0.8921)
23.167035232 seconds, by mooneyk (+0.9581)
23.659447692 seconds, by BrickHouse (+1.4505)
24.022480665 seconds, by ahojnicki (+1.8136)
24.023946258 seconds, by bg13 (+1.8150)
24.418535275 seconds, by GyatJaydenRizz (+2.2096)
24.848556426 seconds, by TheGreenNinja (+2.6396)

7 - BRUHmuda⚓︎

I stumbled upon the BRUHmuda racing minigame situated to the east of Film Noir Island, near Chiaroscuro City Port. This timed race, navigated using arrow keys, comes with a unique challenge: exercise caution with your bearing line. The race is based on the minimap, which doesn't precisely depict the full global perspective. Envision the minimap as a globe, enabling movement to its opposite side, but bear in mind that your bearing line might not accurately capture this phenomenon.

BRUHmuda

Here are the coordinates of the race:

coordinates
[
    {"x": 1981.8043832489109, "y": 1112.2173208736335},
    {"x": 33.5377165822442, "y": 1071.150654206967},
    {"x": 34.0710499155775, "y": 1117.2839875403001},
    {"x": 1973.5377165822442, "y": 1074.8839875403003},
    {"x": 13.2710499155776, "y": 1054.8839875403003},
    {"x": 1991.937716582244, "y": 1125.550654206967},
    {"x": 47.4043832489108, "y": 1078.6173208736336},
    {"x": 1979.937716582244, "y": 1078.6173208736336},
    {"x": 32.4710499155776, "y": 1121.0173208736335},
]

Here is my best score:

bruhmuda

Top Scores:

26.003970507 seconds, by skynetDev
26.234922815 seconds, by seafallen (+0.2310)
26.531983487 seconds, by apok (+0.5280)
27.619003562 seconds, by BrickHouse (+1.6150)
28.412990145 seconds, by vexinc (+2.4090)
30.229555219 seconds, by mooneyk (+4.2256)
30.425865676 seconds, by ahojnicki (+4.4219)
30.427664539 seconds, by FG371 (+4.4237)
31.879203343 seconds, by chriselgee (+5.8752)
32.273711926 seconds, by mrx227 (+6.2697)

8 - The Grand Tour⚓︎

I discovered The Grand Tour racing minigame located to the north of Space Island, near Cape Cosmic Port. This timed race, requiring players to utilize arrow keys for navigation, takes them on a thrilling journey to every island in the vicinity.

thegrandtour

Here are the coordinates of the race:

waypoints
[
    {"x": 786.8047564500714, "y": 162.19489262253794},
    {"x": 549.6299289280247, "y": 336.78111387645083},
    {"x": 354.48051693144345, "y": 669.9095114720957},
    {"x": 351.6131851636, "y": 1656.8237757791446},
    {"x": 760.3191889860796, "y": 702.1628507442036},
    {"x": 1057.0435141942905, "y": 659.6697535837518},
    {"x": 1632.5696560003048, "y": 210.46586312286473},
    {"x": 1824.7170728927533, "y": 901.45000704784},
    {"x": 1388.2330313889415, "y": 1719.006705388743},
    {"x": 951.3989446657206, "y": 1204.1533301081556},
]

Here is my best score:

the grand tour

Top Scores:

306.635978167 seconds, by seafallen
309.96891392 seconds, by apok (+3.3329)
311.552779832 seconds, by noodlebox (+4.9168)
311.849881126 seconds, by BrickHouse (+5.2139)
331.583981738 seconds, by mooneyk (+24.9480)
333.002862456 seconds, by skynetDev (+26.3669)
337.457940571 seconds, by vaderrob88 (+30.8220)
337.722540803 seconds, by ahojnicki (+31.0866)
338.086126513 seconds, by seaelk (+31.4501)
339.569679302 seconds, by cleverusername (+32.9337)