DashFlag 2026.0.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ .gitignore
2
+ __pycache__*
3
+ pyproject.toml
4
+ .env
5
+ dist*
@@ -0,0 +1,42 @@
1
+ Metadata-Version: 2.5
2
+ Name: DashFlag
3
+ Version: 2026.0.6
4
+ Summary: A Terminal Puzzle Game
5
+ Requires-Python: >=3.9
6
+ Description-Content-Type: text/markdown
7
+
8
+ # DashFlag
9
+
10
+ Terminal Based Puzzle Game.
11
+ ```
12
+
13
+ ▀▀▀▀▀ ▀ ▀▀▀▄ ▀▀▀▀▀
14
+ ▀▀▀▀ ▀▀▀▀ ▄ ▀▀ █ ▄ ▀▀█ ▄ ▀▀█
15
+ █ ▀▄▄▄ ▀ ▀ ▀▄▄▀
16
+ ```
17
+ ## How to Installing
18
+
19
+ Install from: `pip install dashflag` command.
20
+
21
+ Or: `Releases` > download > `pip install <path>`.
22
+
23
+ ## Playing
24
+
25
+ Run `DashFlag` in terminal. > `New` Game > Enter `Save Name` > Start!
26
+
27
+ ## Tips
28
+
29
+ ### Hints
30
+ Entering `hint` in the question input will give a hint. You can request multiple times. Diffrent questions have diffrent numbers of hints.
31
+
32
+ ### Loading Saves
33
+
34
+ Run `DashFlag` in terminal. > `Load` Game > Enter Save `Number`> Play. (Or `DashFlag load`)
35
+
36
+ ### Deleting Saves
37
+
38
+ Run `DashFlag` in terminal. > `Load` Game > `Delete` > Enter Save `Number`> Confirm. (Or `DashFlag delete`)
39
+
40
+ ### Closing
41
+
42
+ Games save after every level. Current level is displayed next to save number in load game. (`Exit` From most menus. `Ctrl + C` always exits, but may not shut down safely.)
@@ -0,0 +1,35 @@
1
+ # DashFlag
2
+
3
+ Terminal Based Puzzle Game.
4
+ ```
5
+
6
+ ▀▀▀▀▀ ▀ ▀▀▀▄ ▀▀▀▀▀
7
+ ▀▀▀▀ ▀▀▀▀ ▄ ▀▀ █ ▄ ▀▀█ ▄ ▀▀█
8
+ █ ▀▄▄▄ ▀ ▀ ▀▄▄▀
9
+ ```
10
+ ## How to Installing
11
+
12
+ Install from: `pip install dashflag` command.
13
+
14
+ Or: `Releases` > download > `pip install <path>`.
15
+
16
+ ## Playing
17
+
18
+ Run `DashFlag` in terminal. > `New` Game > Enter `Save Name` > Start!
19
+
20
+ ## Tips
21
+
22
+ ### Hints
23
+ Entering `hint` in the question input will give a hint. You can request multiple times. Diffrent questions have diffrent numbers of hints.
24
+
25
+ ### Loading Saves
26
+
27
+ Run `DashFlag` in terminal. > `Load` Game > Enter Save `Number`> Play. (Or `DashFlag load`)
28
+
29
+ ### Deleting Saves
30
+
31
+ Run `DashFlag` in terminal. > `Load` Game > `Delete` > Enter Save `Number`> Confirm. (Or `DashFlag delete`)
32
+
33
+ ### Closing
34
+
35
+ Games save after every level. Current level is displayed next to save number in load game. (`Exit` From most menus. `Ctrl + C` always exits, but may not shut down safely.)
@@ -0,0 +1,16 @@
1
+ [build-system]
2
+ requires = ["hatchling >= 1.26"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "DashFlag"
7
+ version = "2026.0.6"
8
+ description = "A Terminal Puzzle Game"
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+
12
+ [tool.hatch.build.targets.wheel]
13
+ packages = ["src/DashFlag"]
14
+
15
+ [project.scripts]
16
+ DashFlag = "DashFlag.cli:main"
File without changes
@@ -0,0 +1,3 @@
1
+ from src.DashFlag.cli import main
2
+
3
+ main()
@@ -0,0 +1,4 @@
1
+ from . import game
2
+
3
+ def main():
4
+ game.main()
@@ -0,0 +1,349 @@
1
+ import json
2
+ import shutil
3
+ import time
4
+ import os
5
+ import sys
6
+ import re
7
+ import subprocess
8
+ from datetime import datetime
9
+ from pathlib import Path
10
+ First = True
11
+ powershell_path = shutil.which("powershell.exe")
12
+
13
+ SRCDir = Path(__file__).parent.resolve()
14
+ levels = SRCDir / "levels.json"
15
+
16
+ def runLevel(Title, question, answers, hints=(), setup=(), case_sensitive=False, run=False, check=None):
17
+ global First
18
+
19
+ if First is False:
20
+ os.system('cls' if os.name == 'nt' else 'clear')
21
+
22
+ logo = r"""
23
+
24
+ ▀▀▀▀▀ ▀ ▀▀▀▄ ▀▀▀▀▀
25
+ ▀▀▀▀ ▀▀▀▀ ▄ ▀▀ █ ▄ ▀▀█ ▄ ▀▀█
26
+ █ ▀▄▄▄ ▀ ▀ ▀▄▄▀
27
+
28
+ """
29
+
30
+ print(f"{logo}")
31
+ First = False
32
+ time.sleep(.5)
33
+ print(f"== {Title} ==")
34
+ print(f"{question}\n")
35
+
36
+ if setup:
37
+ for s in setup:
38
+ subprocess.run(s, shell=True, executable=powershell_path)
39
+ print(s)
40
+
41
+ norm = (lambda s: s.strip()) if case_sensitive else (lambda s: s.strip().lower())
42
+ accepted = {norm(a) for a in answers}
43
+ hintsUsed = 0
44
+
45
+ while True:
46
+ try:
47
+ responce = input(">> ")
48
+ except (EOFError, KeyboardInterrupt):
49
+ print()
50
+ return(False)
51
+
52
+ cmd = responce.strip().lower()
53
+ if cmd == "clear":
54
+ os.system('cls' if os.name == 'nt' else 'clear')
55
+
56
+ logo = r"""
57
+
58
+ ▀▀▀▀▀ ▀ ▀▀▀▄ ▀▀▀▀▀
59
+ ▀▀▀▀ ▀▀▀▀ ▄ ▀▀ █ ▄ ▀▀█ ▄ ▀▀█
60
+ █ ▀▄▄▄ ▀ ▀ ▀▄▄▀
61
+
62
+ """
63
+
64
+ print(f"{logo}")
65
+ time.sleep(.5)
66
+ print(f"== {Title} ==")
67
+ print(f"{question}\n")
68
+ continue
69
+ if cmd == "help":
70
+ print("For a Hint, respond 'hint'.\nTo reset the question,'reset' For these keywords, 'help'\nTo Close, 'quit' or 'exit'.\n")
71
+ continue
72
+ if cmd in ("quit", "exit"):
73
+ print("Goodbye!")
74
+ time.sleep(.5)
75
+ return False
76
+ if cmd == "hint":
77
+ if hintsUsed < len(hints):
78
+ print(f"Hint {hintsUsed +1}: {hints[hintsUsed]}")
79
+ hintsUsed += 1
80
+ else:
81
+ print("Final hint given" if hints else "No hints available.")
82
+ continue
83
+ if not responce.strip():
84
+ continue
85
+
86
+ correct = check(responce) if check else norm(responce) in accepted
87
+ if correct:
88
+ print("Correct!")
89
+
90
+ for i in range(1, 4):
91
+ dots = "." * (i % 4)
92
+
93
+ print(f"\rLoading{dots.ljust(3)}", end="", flush=True)
94
+ time.sleep(0.5)
95
+
96
+ #if run == True:
97
+ # print(subprocess.run(answers, shell=True))
98
+
99
+ return True
100
+
101
+ print("Sorry, try again. \n")
102
+
103
+ def run(save):
104
+ global First
105
+
106
+ os.system('cls' if os.name == 'nt' else 'clear')
107
+
108
+ logo = r"""
109
+
110
+
111
+ ▀▀▀▀▀ ▀ ▀▀▀▄ ▀▀▀▀▀
112
+ ▀▀▀▀ ▀▀▀▀ ▄ ▀▀ █ ▄ ▀▀█ ▄ ▀▀█
113
+ █ ▀▄▄▄ ▀ ▀ ▀▄▄▀
114
+
115
+ """
116
+
117
+ print(f"{logo}")
118
+ time.sleep(.5)
119
+ print("For a Hint, respond 'hint'.\nTo reset the question,'reset' For these keywords, 'help'\nTo Close, 'quit' or 'exit'.\n")
120
+
121
+ with open(levels, "r", encoding="utf-8") as f:
122
+ LEVELS = json.load(f)
123
+
124
+ currentLevel = save["level"]
125
+
126
+ if currentLevel >= len(LEVELS):
127
+ print("This save is compleated.")
128
+ return
129
+
130
+
131
+ for i in range(currentLevel, len(LEVELS)):
132
+ if not runLevel(**LEVELS[i]):
133
+ print("Exiting...")
134
+ return
135
+
136
+ save_game(save["name"], i + 1, i + 1 >= len(LEVELS))
137
+
138
+ print("You have beat the game!")
139
+
140
+
141
+ def new_game():
142
+
143
+ print("== New Game ==")
144
+
145
+ try:
146
+ name = input("Save Name: ")
147
+ except (EOFError, KeyboardInterrupt):
148
+ print()
149
+ return(False)
150
+
151
+ if not name:
152
+ name = "Player"
153
+
154
+ if any(s["name"].lower() == name.lower() for s in get_saves()):
155
+ print("Save already Exists")
156
+ return
157
+
158
+ save = {
159
+ "name": name,
160
+ "level": 0,
161
+ "completed": False
162
+ }
163
+
164
+ save_game(name, 0)
165
+ run(save)
166
+
167
+
168
+
169
+
170
+ def save_dir():
171
+ if os.name == "nt":
172
+ base = Path(os.getenv("APPDATA", Path.home()))
173
+ elif sys.platform == "darwin":
174
+ base = Path.home() / "Library" / "Application Support"
175
+ else:
176
+ base = Path(os.getenv("XDG_DATA_HOME", Path.home() / ".local" / "share"))
177
+
178
+ folder = base / "DashFlag" / "saves"
179
+ folder.mkdir(parents=True, exist_ok=True)
180
+ return folder
181
+
182
+ def save_game(name, level, completed=False):
183
+ folder = save_dir()
184
+
185
+ filename = re.sub(r"[^a-zA-Z0-9_-]", "_", name)
186
+ path = folder / f"{filename}.json"
187
+
188
+ data = {
189
+ "name": name,
190
+ "level": level,
191
+ "completed": completed,
192
+ "last_played": datetime.now().isoformat(timespec="seconds")
193
+ }
194
+
195
+ tempPath = path.with_suffix(".tmp")
196
+ with open(tempPath, "w", encoding="utf-8") as f:
197
+ json.dump(data, f, indent=4)
198
+
199
+ tempPath.replace(path)
200
+
201
+ def get_saves():
202
+ folder = save_dir()
203
+ saves = []
204
+
205
+ for path in folder.glob("*.json"):
206
+ try:
207
+ with open(path, "r", encoding="utf-8") as f:
208
+ data = json.load(f)
209
+ data["path"] = path
210
+ saves.append(data)
211
+ except (json.JSONDecodeError, OSError):
212
+ continue
213
+ return sorted(saves, key=lambda s: s.get("last_played", ""), reverse=True)
214
+
215
+ def delete():
216
+ saves = get_saves()
217
+
218
+ print("== Delete Saves==\n")
219
+
220
+ if not saves:
221
+ print("No saves found.")
222
+ return
223
+ for i, save in enumerate(saves, 1):
224
+ status = "Completed" if save["completed"] else f"Level {save['level'] + 1}"
225
+ print(f"{i} | {save['name']} - {status}")
226
+
227
+ print("\n Enter save number to delete, or 'exit'.")
228
+
229
+ while True:
230
+ try:
231
+ responce = input(">> ").strip().lower()
232
+ except (EOFError, KeyboardInterrupt):
233
+ print()
234
+ return
235
+ if responce == "exit":
236
+ return
237
+ if not responce.isdigit() or not 1 <= int(responce) <= len(saves):
238
+ print("Invalid.")
239
+ continue
240
+
241
+ save = saves[int(responce) - 1]
242
+
243
+ try:
244
+ confirm = input(
245
+ f"Delete save '{save['name']}'? This cannot be undone. (y/N): "
246
+ ).strip().lower()
247
+ except (EOFError, KeyboardInterrupt):
248
+ print()
249
+ return
250
+ if confirm == "y":
251
+ try:
252
+ save["path"].unlink()
253
+ print(f"Save '{save['name']}' deleted.")
254
+ except OSError as error:
255
+ print(f"Failed to delete save '{save['name']}'. {error}")
256
+ return
257
+ elif confirm == "n" or confirm == "":
258
+ print("Deletion cancelled.")
259
+ return
260
+
261
+
262
+ def load():
263
+ saves = get_saves()
264
+
265
+ os.system('cls' if os.name == 'nt' else 'clear')
266
+
267
+ logo = r"""
268
+
269
+
270
+ ▀▀▀▀▀ ▀ ▀▀▀▄ ▀▀▀▀▀
271
+ ▀▀▀▀ ▀▀▀▀ ▄ ▀▀ █ ▄ ▀▀█ ▄ ▀▀█
272
+ █ ▀▄▄▄ ▀ ▀ ▀▄▄▀
273
+
274
+ """
275
+
276
+ print(f"{logo}")
277
+ time.sleep(.5)
278
+ print("== Load Save ==\n")
279
+
280
+
281
+ if not saves:
282
+ print("No saves found.")
283
+
284
+ return None
285
+
286
+ for i, save in enumerate(saves, 1):
287
+ status = "Completed" if save["completed"] else f"Level {save['level'] + 1}"
288
+
289
+ print(f"{i} | {save['name']} - {status}")
290
+
291
+ print("\n Enter save number to load, 'delete' or 'exit'.")
292
+
293
+ while True:
294
+ try:
295
+ responce = input(">> ").strip().lower()
296
+ except (EOFError, KeyboardInterrupt):
297
+ print()
298
+ return(False)
299
+
300
+ if responce == "exit":
301
+ return None
302
+
303
+ if responce.isdigit() and 1<= int(responce) <= len(saves):
304
+ return saves[int(responce) - 1]
305
+
306
+ if responce == "delete":
307
+ delete()
308
+ return None
309
+
310
+ print("Invalid.")
311
+
312
+ def main():
313
+
314
+ command = sys.argv[1].lower() if len(sys.argv) > 1 else ""
315
+
316
+ if command:
317
+ if command == "load":
318
+ save = load()
319
+
320
+ if save:
321
+ run(save)
322
+
323
+ elif command == "new":
324
+ new_game()
325
+
326
+ elif command == "delete":
327
+ delete()
328
+
329
+ else:
330
+ print("Invalid.")
331
+ else:
332
+
333
+ try:
334
+ command = input("Ḻoad(L) or ṉew (L/n)? ")
335
+ except (EOFError, KeyboardInterrupt):
336
+ print()
337
+ return(False)
338
+
339
+ if command == "l" or command == "load" or command == "":
340
+ save = load()
341
+
342
+ if save:
343
+ run(save)
344
+
345
+ elif command == "n" or command == "new":
346
+ new_game()
347
+
348
+ else:
349
+ print("Invalid.")
@@ -0,0 +1,266 @@
1
+ [
2
+ {
3
+ "Title": "Level 1 // A slashing start.",
4
+ "question": "Move down the load!",
5
+ "answers": ["cd ~/downloads"],
6
+ "hints": ["cd","squiggle!"]
7
+ },
8
+ {
9
+ "Title": "Level 2 // console.Log",
10
+ "question": "Can you mark where you are?",
11
+ "answers": ["pwd"],
12
+ "hints": ["Print it for me?", "Your directory, please."]
13
+ },
14
+ {
15
+ "Title": "Level 3 // Starting anew",
16
+ "question": "Let's make a new project.",
17
+ "answers": ["mkdir new"],
18
+ "hints": ["folder", "wordplay", "a what project?"]
19
+ },
20
+ {
21
+ "Title": "Level 4 // You know this.",
22
+ "question": "Making it is no good if we can't use it.",
23
+ "answers": ["cd new"],
24
+ "hints": ["How did we get here?", "back to basics", "the first one."]
25
+ },
26
+ {
27
+ "Title": "Level 5 // Making anew.",
28
+ "question": "Now we can use it, let's tell the world.",
29
+ "answers": ["echo Hello World > anew.txt","echo Hello World>anew.txt","echo \"Hello World\" > anew.txt"],
30
+ "hints": ["Hello to you too.", "Text is the way to go.", "it's in the title.", "anew, anew, anew..."]
31
+ },
32
+ {
33
+ "Title": "Level 6 // Let's get personal",
34
+ "question": "Name's Flag, -- Flag.",
35
+ "answers": ["whoami"],
36
+ "hints": ["r u?", "USER"]
37
+ },
38
+ {
39
+ "Title": "Level 7 // Directory?",
40
+ "question": "Installing some Minecraft mods from here?",
41
+ "answers": ["cd %appdata%"],
42
+ "hints": ["cd","percents? In this economy!"]
43
+ },
44
+ {
45
+ "Title": "Level 8 // Do you know the machine?",
46
+ "question": "How many versions can there be?",
47
+ "answers": ["winver","systeminfo"],
48
+ "hints": ["Can you win any more?", "du du du duh,"]
49
+ },
50
+ {
51
+ "Title": "Level 9 // Finnish this first?",
52
+ "question": "Should you shut the system down?",
53
+ "answers": ["systeminfo | find \"System Boot Time\"","systeminfo | findstr \"Boot Time\""],
54
+ "hints": ["Wouldn't be anything other than system info.", "Can you find Boot Time?"]
55
+ },
56
+ {
57
+ "Title": "Level 10 // Pong",
58
+ "question": "Is google responding?",
59
+ "answers": ["ping google.com","ping www.google.com"],
60
+ "hints": ["table tennis"]
61
+ },
62
+ {
63
+ "Title": "Level 11 // Radio Check, Radio Check.",
64
+ "question": "Loud And Clear, clear...",
65
+ "answers": ["Echo Loud and clear","Echo \"Loud and clear\""],
66
+ "hints": ["Did you repeat yourself?","You don't need to 10-9.","Is there an echo?"]
67
+ },
68
+ {
69
+ "Title": "Level 12 // I won't forget.",
70
+ "question": "Quick, write this down!",
71
+ "answers": ["notepad","notepad.exe","start notepad"],
72
+ "hints": ["Where would I write it?","You've already got it.","Just write down the text for your editor."]
73
+ },
74
+ {
75
+ "Title": "Level 13 // From sea to shining ̷s̷e̷a mountain.",
76
+ "question": "Is there a wiki page for this hidden star?",
77
+ "answers": ["PNG",".PNG"],
78
+ "hints": ["you shine like the star","What file does it make?","Initials?","Hey, Pap(u)a!"]
79
+ },
80
+ {
81
+ "Title": "Level 14 // That's a bit awkward.",
82
+ "question": "I won't come to your house, will Dan?",
83
+ "answers": ["minecon 2015"],
84
+ "hints": ["Very CONvincing","Full name please"]
85
+ },
86
+ {
87
+ "Title": "Level 15 // Odd Flag.",
88
+ "question": "Need to govern those mountains.",
89
+ "answers": ["Nepal"],
90
+ "hints": ["Try to climb."]
91
+ },
92
+ {
93
+ "Title": "Level 16 // But made in china.",
94
+ "question": "Talk'n bout apples pods.",
95
+ "answers": ["Designed in California"],
96
+ "hints": ["Cast it?","Relay","Upgrade"]
97
+ },
98
+ {
99
+ "Title": "Level 17 // Easthamlet.",
100
+ "question": "Have fun at R2PH+X2...",
101
+ "answers": ["Cape Cod National Seashore", "Salt Pond Visitor Center","Cape Cod National Seashore Salt Pond Visitor Center"],
102
+ "hints": ["Plus the code.","Picture it Eastham,"]
103
+ },
104
+ {
105
+ "Title": "Level 18 // Brewing Altitude",
106
+ "question": "__ runs on dunkin",
107
+ "answers": ["Jetblue","Jetblue runs on dunkin"],
108
+ "hints": ["KBOS", "Blu"]
109
+ },
110
+ {
111
+ "Title": "Level 19 // WhatAmI?",
112
+ "question": "What am I going for? (CXRC+X7 Stavelot, Belgium)",
113
+ "answers": ["Belgian Grand Prix","Belgian GP"],
114
+ "hints": ["Car go Vroom", "Formula Uno","event name"]
115
+ },
116
+ {
117
+ "Title": "Level 20 // Float your Goat?",
118
+ "question": "First draft of Cape Liberty.",
119
+ "answers": ["28","8.5"],
120
+ "hints": ["google maps/earth", "satellite coverage","10/16/25"]
121
+ },
122
+ {
123
+ "Title": "Level 21A // Document This",
124
+ "question": "Your mission, is to find the code.",
125
+ "answers": ["484F5720414C495645"],
126
+ "hints": ["When would I document it?", "Is there a new file?","10/16/25"],
127
+ "setup": ["cd ([Environment]::GetFolderPath('MyDocuments')); echo 484F5720414C495645 > riddle.txt"]
128
+ },
129
+ {
130
+ "Title": "Level 21B // Space Pirates!",
131
+ "question": "Where am I from?",
132
+ "answers": ["The Martian"],
133
+ "hints": ["Decode the string.", "Colors, in HEX","Book, and Film."],
134
+ "setup": ["cd ([Environment]::GetFolderPath('MyDocuments')); del riddle.txt"]
135
+
136
+ },
137
+ {
138
+ "Title": "Level 22 // Gold In Space",
139
+ "question": "What Java is on the record?",
140
+ "answers": ["Kinds of Flowers","Robert Brown"],
141
+ "hints": ["On this Voyage we go.", "Music to my ears","NASA"]
142
+ },
143
+ {
144
+ "Title": "Level 23 // The next Alexandria",
145
+ "question": "Everything is here.",
146
+ "answers": ["The British Library","British Library"],
147
+ "hints": ["Books? Books!", "Publication and all."]
148
+ },
149
+ {
150
+ "Title": "Level 24 // DATETIME",
151
+ "question": "When does time start?",
152
+ "answers": ["1 January 1970","1/1/1970","January 1, 1970"],
153
+ "hints": ["For computers."]
154
+ },
155
+ {
156
+ "Title": "Level 25 // Men's 200m Breaststroke.",
157
+ "question": "World records in 16'",
158
+ "answers": ["Marco Koch"],
159
+ "hints": ["Not FIFA, but.", "Berlin."]
160
+ },
161
+ {
162
+ "Title": "Level 26 // Monaco, but for Monaco.",
163
+ "question": "Your name, please.",
164
+ "answers": ["Grand Prix de Monaco Historique", "Monaco Historic Grand Prix"],
165
+ "hints": ["Old and rich.", "It's been 20 years!","The real one is in 2 weeks."]
166
+ },
167
+ {
168
+ "Title": "Level 27 // A segue, to our...",
169
+ "question": "...British bag?",
170
+ "answers": ["British Millerain"],
171
+ "hints": ["___Store.com", "Bag for Commuting","A Tech Sack too."]
172
+ },
173
+ {
174
+ "Title": "Level 28 // Cape? Third time's the charm.",
175
+ "question": "A bend in the reeds.",
176
+ "answers": ["Cape Canaveral", "Canaveral", "Cape Kennedy", "Cape Canaveral Space Force Station"],
177
+ "hints": ["Explosions, for science!","That's a lot of Gs","What goes up must come down."]
178
+ },
179
+ {
180
+ "Title": "Level 29 // Round and Round we go.",
181
+ "question": "To Infinity and, Park.",
182
+ "answers": ["Apple Park", "1 Infinite Loop"],
183
+ "hints": ["Rainbows and sunshine.","'Hair Force One clear for land.'","iBuilding"]
184
+ },
185
+ {
186
+ "Title": "Level 30 // Not gold.",
187
+ "question": "-gate, a scandal.",
188
+ "answers": ["Golden Gate Bridge"],
189
+ "hints": ["Title + Question"]
190
+ },
191
+ {
192
+ "Title": "Level 31A // Flashing Green.",
193
+ "question": "Where do the Green Lights Flash?",
194
+ "answers": ["BC", "British Columbia", "Vancouver"],
195
+ "hints": ["Expensive Rent next to Coal"]
196
+ },
197
+ {
198
+ "Title": "Level 31B // #Van",
199
+ "question": "9 o'clock shots.",
200
+ "answers": ["Stanley Park"],
201
+ "hints": ["marvel camio", "cannon"]
202
+ },
203
+ {
204
+ "Title": "Level 32 // Island Income",
205
+ "question": "Expensive top level tourist store.",
206
+ "answers": [".ai", "ai", "Anguilla"],
207
+ "hints": ["not in my domain", "caribean", "centre de données"]
208
+ },
209
+ {
210
+ "Title": "Level 33 // Not one Game",
211
+ "question": "Select player one?",
212
+ "answers": ["Roblox"],
213
+ "hints": ["What game has games?", "The OG"]
214
+ },
215
+ {
216
+ "Title": "Level 34 // Break the Curse?",
217
+ "question": "Modify it.",
218
+ "answers": ["CurseForge"],
219
+ "hints": ["Forge it.", "overwolf"]
220
+ },
221
+ {
222
+ "Title": "Level 35 // looks Like,",
223
+ "question": "google it.",
224
+ "answers": [
225
+ "Invoke-WebRequest \"https://google.com\"",
226
+ "Invoke-WebRequest https://google.com",
227
+ "Invoke-WebRequest -Uri https://google.com",
228
+ "Invoke-WebRequest -Uri \"https://google.com\"",
229
+ "iwr https://google.com",
230
+ "iwr google.com",
231
+ "curl https://google.com",
232
+ "curl google.com"
233
+ ],
234
+ "hints": ["google.com", "powershell"]
235
+ },
236
+ {
237
+ "Title": "Level 36 // Point Away",
238
+ "question": "Point where?",
239
+ "answers": ["Nemo", "Point Nemo"],
240
+ "hints": ["Not a Fish"]
241
+ },
242
+ {
243
+ "Title": "Level 37 // Mathematics",
244
+ "question": "144, 233, 610",
245
+ "answers": ["377"],
246
+ "hints": ["Don't fib.","skipping"]
247
+ },
248
+ {
249
+ "Title": "Level 38 // Decode, Please.",
250
+ "question": "Show your work.",
251
+ "answers": ["certutil -decode", "certutil"],
252
+ "hints": ["Just the work.", "base of 4 carrot 3"]
253
+ },
254
+ {
255
+ "Title": "Level 39 // Rescue Mission",
256
+ "question": "Five",
257
+ "answers": ["BRM5","BRM","Blackhawk Rescue Mission 5","Blackhawk Rescue Mission"],
258
+ "hints": ["Doesn't look like roblox", "helicopter", "platinum"]
259
+ },
260
+ {
261
+ "Title": "Level 40 // Set Sail",
262
+ "question": "cjNneDJ1eA==",
263
+ "answers": ["sydney opera house", "the sydney opera house", "bennelong point"],
264
+ "hints": ["geohash, is it?"]
265
+ }
266
+ ]