{ "cells": [ { "cell_type": "markdown", "id": "c8e634f8-f5b1-4a93-ac99-2124a21183d2", "metadata": {}, "source": [ "# Most Valuable Materia\n", "\n", "I have a lot of Sacks of Nuts and Cracked Whateverclusters and I'd like to know which materia will give me the most money on the market board.\n", "I don't have any Cracked Whatevercrystals, so I don't care about non-combat materia.\n", "\n", "Powered by [Universalis](https://universalis.app/).\n", "\n", "Set the world and materia tiers you care about:" ] }, { "cell_type": "code", "execution_count": null, "id": "bbc35fe7-615a-44ac-81bd-3eb394e10365", "metadata": {}, "outputs": [], "source": [ "world = 'Jenova'\n", "tiers = [\"VII\", \"VIII\", \"IX\", \"X\"]" ] }, { "cell_type": "markdown", "id": "b5a49afe-1a0e-4370-9610-30b975ec6f5b", "metadata": {}, "source": [ "Then hit Run > Run All Cells, and the two most valuable materia at each tier should show up after all the code.\n", "If you're curious, you can click the hidden code cell below to see how it works." ] }, { "cell_type": "code", "execution_count": null, "id": "d87b9ff9-eb2c-403f-9432-20b22112ba93", "metadata": { "jupyter": { "source_hidden": true } }, "outputs": [], "source": [ "# useful constants\n", "ROMAN_NUMERALS = [\"I\", \"II\", \"III\", \"IV\", \"V\", \"VI\", \"VII\", \"VIII\", \"IX\", \"X\"]\n", "\n", "# grabbed by hand from XIVAPI\n", "MATERIA = {\n", " \"Piety\": [5629, 5630, 5631, 5632, 5633, 18011, 25186, 26727, 33917, 33930],\n", " \"Heavens' Eye\": [5664, 5665, 5666, 5667, 5668, 18018, 25187, 26728, 33918, 33931],\n", " \"Savage Aim\": [5669, 5670, 5671, 5672, 5673, 18019, 25188, 26729, 33919, 33932],\n", " \"Savage Might\": [5674, 5675, 5676, 5677, 5678, 18020, 25189, 26730, 33920, 33933],\n", " \"Battledance\": [5679, 5680, 5681, 5682, 5683, 18021, 25190, 26731, 33921, 33934],\n", " \"Quickarm\": [5714, 5715, 5716, 5717, 5718, 18028, 25197, 26738, 33928, 33941],\n", " \"Quicktongue\": [5719, 5720, 5721, 5722, 5723, 18029, 25198, 26739, 33929, 33942],\n", "}\n", "\n", "# 1. sort out the items to search for\n", "target_materia = dict()\n", "all_ids = []\n", "for tier in tiers:\n", " target_materia[tier] = dict()\n", " index = ROMAN_NUMERALS.index(tier)\n", " for materia_type in MATERIA:\n", " item_name = f\"{materia_type} Materia {tier}\"\n", " item_id = MATERIA[materia_type][index]\n", " target_materia[tier][item_id] = item_name\n", " all_ids.append(item_id)\n", "\n", "# 2. get prices\n", "import requests\n", "\n", "if len(target_materia) > 100:\n", " raise ValueError(\"Can't load market data for more than 100 items at a time\")\n", "\n", "universalis_url = f'https://universalis.app/api/v2/{world}/{\",\".join(str(x) for x in all_ids)}?listings=0&entries=0&noGst=1'\n", "\n", "response = requests.get(universalis_url)\n", "\n", "response.raise_for_status()\n", "\n", "response = response.json()\n", "\n", "if len(response[\"itemIDs\"]) != len(tiers) * len(MATERIA):\n", " print(\"Got back the wrong number of items for some reason\")\n", "\n", "prices = {item[\"itemID\"]: item[\"minPrice\"] for item in response[\"items\"].values()}\n", "\n", "# 3. sort prices\n", "from IPython.display import Markdown\n", "\n", "for tier in tiers:\n", " display(Markdown(f\"## Materia {tier}\"))\n", " targets = target_materia[tier]\n", " target_ids = list(targets.keys())\n", " best_ids = sorted(target_ids, key=lambda id: prices[id], reverse=True)\n", " for this_id in best_ids[:2]:\n", " name = targets[this_id]\n", " price = prices[this_id]\n", " display(Markdown(f\"- {name} - {price}g\"))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" } }, "nbformat": 4, "nbformat_minor": 5 }