Skip to content

BONUS!⚓︎

The two bonus objectives I've completed are in this section.

Fishing Guide⚓︎

Difficulty:

Request

Catch twenty different species of fish that live around Geese Islands. When you're done, report your findings to Poinsettia McMittens on the Island of Misfit Toys.

Poinsettia McMittens @ Squarewheel Yard

Excuse me, but you're interrupting my fishing serenity. Oh, you'd like to know how to become as good at fishing as I am?
Well, first of all, thank you for noticing my flair for fishing. It's not just about looking good beside the lake, you know.
The key is in the details, much like crafting the perfect toy. Observe the water, the weather, and the fish’s habits - it's a science and an art.
Of course, it helps to have a natural charm. Fish seem to find me irresistible. Must be my sparkling personality... or maybe it's just the glitter of my allure.
Oh, the mysteries of the aquatic life around these islands are as elusive as, well, a clever compliment. But you'll get one if you probe enough.
Remember, patience is more than a virtue in fishing; it’s a strategy. Like waiting for the right time to use flattery, you wait for the right moment to strike.
Go see if you can catch, say, 20 different types of fish!

Become the Fish

From: Poinsettia McMittens
Objective: BONUS! Fishing Guide

Perhaps there are some clues about the local aquatic life located in the HTML source code.

To catch 20 different species of fish, simply go out in the open sea, cast line, wait for it to turn red and reel it in - the fish will be caught! Be patient if you get a duplicate.

Fish

Fishing Mastery⚓︎

Difficulty:

Request

Catch at least one of each species of fish that live around Geese islands. When you're done, report your findings to Poinsettia McMittens.

Poinsettia McMittens @ Squarewheel Yard

Hoy small fry, nice work!
Now, just imagine if we had an automatic fish catcher? It would be as ingenious as me on a good day!
I came across this fascinating article about such a device in a magazine during one of my more glamorous fishing sessions.
If only I could get my hands on it, I'd be the undisputed queen of catching them all!

Fishing Machine

From: Poinsettia McMittens
Objective: BONUS! Fishing Guide

There are a variety of strategies for automating repetative website tasks. Tools such as AutoKey and AutoIt allow you to programmatically examine elements on the screen and emulate user inputs.

I Am Become Data

From: Poinsettia McMittens
Objective: BONUS! Fishing Guide

One approach to automating web tasks entails the browser's developer console. Browsers' console allow us to manipulate objects, inspect code, and even interact with websockets.

I solved this challenge using Selenium browser automation and little bit of looking around through game's HTML. There's a reference to a "dev only" page https://2023.holidayhackchallenge.com/sea/fishdensityref.html which shows fish density.

DEV ONLY

The most important fish type density to look at is "Piscis Cyberneticus Skodo" since it's only present in very specific part of the sea. Save its image, then use something like OnTopReplica to move fish density PNG over the sea minimap, setting window opacity to 50%.

Map edges can be determined by crossing from one side to the other. You need to catch the rare fish type from the white spot on the map. It should look something like this.

Map

The Selenium browser automation code will do the trick - make sure to include your credentials in the .env file. XPATH's can be copied from within the browser in Inspect Element. Just want to acknowledge that this script is just quick & dirty Python to get the job done, it can probably be improved. 😜

fishing.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from dotenv import dotenv_values

# Get creds from .env
config = dotenv_values(".env")
USERNAME = config.get('USERNAME')
PASSWORD = config.get('PASSWORD')


def fish(driver):
    time.sleep(1)
    cast_line = driver.find_element(By.XPATH, '/html/body/div[2]/button[2]')
    time.sleep(1)
    cast_line.click()

    reel_it_in = driver.find_element(By.XPATH, '/html/body/div[2]/button[3]')
    reel_it_in_class = reel_it_in.get_attribute("class")

    # Check if caught every 0.03 sec
    while "reelitin" in reel_it_in_class:
        if reel_it_in_class == "reelitin":
            reel_it_in_class = reel_it_in.get_attribute("class")
            time.sleep(0.03)
        else:
            try:
                # Caught One - reel it in
                reel_it_in.click()
                break
            except:
                time.sleep(0.03)
                continue

    time.sleep(3)
    fish_name = driver.find_element(By.XPATH, '/html/body/div[3]/div[1]/h3').text
    total = driver.find_element(By.XPATH, '/html/body/div[3]/div[2]/div/span').text

    # Print name and total to console
    print("[+] CAUGHT ONE: " + str(fish_name))
    print("[*] TOTAL: " + str(total))
    print()
    time.sleep(5)

    # Close Pescadex
    close = driver.find_element(By.XPATH, '/html/body/div[3]/div[1]/button[1]')
    close.click()
    return True


def main():
    # Firefox driver
    driver = webdriver.Firefox()

    driver.get("https://2023.holidayhackchallenge.com/")
    assert "Holiday Hack Challenge 2023" in driver.title

    time.sleep(2)

    # Login
    elem = driver.find_element(By.XPATH, "/html/body/div/div[2]/div/div[1]/a")
    time.sleep(2)
    elem.click()

    signin = driver.find_element(By.XPATH, "/html/body/div/div[2]/div/div[2]/a[2]")
    signin.click()
    time.sleep(3)

    # Username
    username = driver.find_element(By.XPATH, '//*[@id="usernameOrEmail"]')
    for char in USERNAME:
        username.send_keys(char)
        time.sleep(0.2)

    # Password
    password = driver.find_element(By.XPATH, '//*[@id="login-password"]')
    for char in PASSWORD:
        password.send_keys(char)
        time.sleep(0.2)

    # Log in
    login = driver.find_element(By.XPATH, '/html/body/div/div[2]/div/div[3]/div[2]/form[1]/ul/li[3]/button')
    time.sleep(1)
    login.click()
    time.sleep(5)

    # Switch to iFrame context
    time.sleep(5)
    iframe = driver.find_element(By.XPATH, '/html/body/div/div[3]/iframe')
    driver.switch_to.frame(iframe)

    # Fish indefinitely
    while True:
        fish(driver)
        time.sleep(1)


if __name__ == '__main__':
    main()

Output keeps rolling:

Output

After running this for a while, you can move around the sea to adjust your density percentages. When you finally have 171 different types of fish, go talk to Poinsettia McMittens.

Last One

Poinsettia McMittens @ Squarewheel Yard

You managed to catch every fish? You're like the fishing version of a Christmas miracle!
Now, if only you could teach me your ways... but then again, I'm already pretty fabulous at everything I do.