initial commit
This commit is contained in:
328
quest_analyzer/experiments-1.ipynb
Normal file
328
quest_analyzer/experiments-1.ipynb
Normal file
@@ -0,0 +1,328 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "5c77481b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Requirements\n",
|
||||
"import numpy as np\n",
|
||||
"import pandas as pd\n",
|
||||
"import io\n",
|
||||
"import json\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d0b3427f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"path = rf\"D:\\Project\\Py\\WowheadScraper\\quest_analyzer\\resources\\quests.jsonl\"\n",
|
||||
"df = pd.read_json(path, lines=True)\n",
|
||||
"\n",
|
||||
"if df is None:\n",
|
||||
" raise Exception(\"DataFrame is None. Failed to read the CSV file.\")\n",
|
||||
"\n",
|
||||
"df.describe()\n",
|
||||
"\n",
|
||||
"horde_only_quests = df[(df[\"side\"] == \"Horde\") | (df[\"side\"] == \"Both\")]\n",
|
||||
"all_zones = df[[\"category\", \"category2\"]].drop_duplicates().to_dict(orient='records')\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def locations_contains_zone(row, zone_name):\n",
|
||||
" locations = row.get(\"locations\")\n",
|
||||
" if not isinstance(locations, list):\n",
|
||||
" return False\n",
|
||||
" for location in locations:\n",
|
||||
" if location.get(\"role\") == \"start\" and zone_name in location[\"zone\"]:\n",
|
||||
" return True\n",
|
||||
" if location.get(\"role\") == \"end\" and zone_name in location[\"zone\"]:\n",
|
||||
" return True\n",
|
||||
" return False\n",
|
||||
"\n",
|
||||
"def get_quests_by_zone(_df: pd.DataFrame, zone_name: str) -> pd.DataFrame:\n",
|
||||
" location_mask = _df.apply(lambda row: locations_contains_zone(row, zone_name), axis=1)\n",
|
||||
" category_mask = (_df[\"category\"] == zone_name) | (_df[\"category2\"] == zone_name)\n",
|
||||
" return _df[location_mask | category_mask]\n",
|
||||
"\n",
|
||||
"durotar_quests = get_quests_by_zone(horde_only_quests, \"Durotar\")\n",
|
||||
"mulgore_quests = get_quests_by_zone(horde_only_quests, \"Mulgore\")\n",
|
||||
"tirisfal_glades_quests = get_quests_by_zone(horde_only_quests, \"Tirisfal Glades\")\n",
|
||||
"zephras_quests = get_quests_by_zone(horde_only_quests, \"Zephras Isle\")\n",
|
||||
"\n",
|
||||
"print(f\"Total quests for each starting zone:\")\n",
|
||||
"print(f\"Durotar: {len(durotar_quests)}\")\n",
|
||||
"print(f\"Mulgore: {len(mulgore_quests)}\")\n",
|
||||
"print(f\"Tirisfal Glades: {len(tirisfal_glades_quests)}\")\n",
|
||||
"print(f\"Zephras Isle: {len(zephras_quests)}\")\n",
|
||||
"\n",
|
||||
"# Now we limit the search to level brackets 1-10 and 11-20 for each zone\n",
|
||||
"\n",
|
||||
"durotar_quests_1_10 = durotar_quests[(durotar_quests[\"level\"] >= 1) & (durotar_quests[\"level\"] <= 10)]\n",
|
||||
"durotar_quests_11_20 = durotar_quests[(durotar_quests[\"level\"] >= 11) & (durotar_quests[\"level\"] <= 20)]\n",
|
||||
"\n",
|
||||
"mulgore_quests_1_10 = mulgore_quests[(mulgore_quests[\"level\"] >= 1) & (mulgore_quests[\"level\"] <= 10)]\n",
|
||||
"mulgore_quests_11_20 = mulgore_quests[(mulgore_quests[\"level\"] >= 11) & (mulgore_quests[\"level\"] <= 20)]\n",
|
||||
"\n",
|
||||
"tirisfal_glades_quests_1_10 = tirisfal_glades_quests[(tirisfal_glades_quests[\"level\"] >= 1) & (tirisfal_glades_quests[\"level\"] <= 10)]\n",
|
||||
"tirisfal_glades_quests_11_20 = tirisfal_glades_quests[(tirisfal_glades_quests[\"level\"] >= 11) & (tirisfal_glades_quests[\"level\"] <= 20)]\n",
|
||||
"\n",
|
||||
"zephras_quests_1_10 = zephras_quests[(zephras_quests[\"level\"] >= 1) & (zephras_quests[\"level\"] <= 10)]\n",
|
||||
"zephras_quests_11_20 = zephras_quests[(zephras_quests[\"level\"] >= 11) & (zephras_quests[\"level\"] <= 20)]\n",
|
||||
"\n",
|
||||
"print(f\"\\n\\nTotal quests for each starting zone and level bracket:\")\n",
|
||||
"print(f\"Durotar 1-10: {len(durotar_quests_1_10)}\")\n",
|
||||
"print(f\"Durotar 11-20: {len(durotar_quests_11_20)}\")\n",
|
||||
"print(f\"Mulgore 1-10: {len(mulgore_quests_1_10)}\")\n",
|
||||
"print(f\"Mulgore 11-20: {len(mulgore_quests_11_20)}\")\n",
|
||||
"print(f\"Tirisfal Glades 1-10: {len(tirisfal_glades_quests_1_10)}\")\n",
|
||||
"print(f\"Tirisfal Glades 11-20: {len(tirisfal_glades_quests_11_20)}\")\n",
|
||||
"print(f\"Zephras Isle 1-10: {len(zephras_quests_1_10)}\")\n",
|
||||
"print(f\"Zephras Isle 11-20: {len(zephras_quests_11_20)}\")\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Now we calculate the total experience available from quests for each zone and level bracket\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "e826b3eb",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"brackets = {\n",
|
||||
" (\"Durotar\", \"1-10\"): durotar_quests_1_10,\n",
|
||||
" (\"Durotar\", \"11-20\"): durotar_quests_11_20,\n",
|
||||
" (\"Mulgore\", \"1-10\"): mulgore_quests_1_10,\n",
|
||||
" (\"Mulgore\", \"11-20\"): mulgore_quests_11_20,\n",
|
||||
" (\"Tirisfal Glades\", \"1-10\"): tirisfal_glades_quests_1_10,\n",
|
||||
" (\"Tirisfal Glades\", \"11-20\"): tirisfal_glades_quests_11_20,\n",
|
||||
" (\"Zephras Isle\", \"1-10\"): zephras_quests_1_10,\n",
|
||||
" (\"Zephras Isle\", \"11-20\"): zephras_quests_11_20,\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"def quest_xp(rewards) -> int:\n",
|
||||
" if isinstance(rewards, dict) and rewards.get(\"xp\"):\n",
|
||||
" return rewards[\"xp\"]\n",
|
||||
" return 0\n",
|
||||
"\n",
|
||||
"xp_summary = pd.DataFrame([\n",
|
||||
" {\"zone\": zone, \"bracket\": bracket, \"quests\": len(quests), \"total_xp\": quests[\"rewards\"].apply(quest_xp).sum()}\n",
|
||||
" for (zone, bracket), quests in brackets.items()\n",
|
||||
"])\n",
|
||||
"xp_summary[\"avg_xp\"] = (xp_summary[\"total_xp\"] / xp_summary[\"quests\"]).round(0)\n",
|
||||
"xp_summary"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "ab76fa6f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Now we try to calculate travel requirements for each quest. We define travel as the distance from the quest giver to the objective area, and then from the objective area to the quest turn-in. For delivery/talk-to quests, we just measure straight from giver to turn-in.\n",
|
||||
"# An additional challenge is that the coordinates given are percentage based based off of the map frame.\n",
|
||||
"# Some digging online found some map size estimates, and they are the closest I have to a reliable source for now.\n",
|
||||
"\n",
|
||||
"OBJECTIVE_ROLES = (\"requirement\", \"sourcerequirement\")\n",
|
||||
"\n",
|
||||
"def zone_coords(locations, roles, zone_name):\n",
|
||||
" return [loc[\"coord\"] for loc in locations\n",
|
||||
" if loc.get(\"role\") in roles and loc.get(\"zone\") == zone_name and loc.get(\"coord\")]\n",
|
||||
"\n",
|
||||
"def distance(a, b):\n",
|
||||
" if a is None or b is None:\n",
|
||||
" return np.nan\n",
|
||||
" return float(np.linalg.norm(np.subtract(a, b)))\n",
|
||||
"\n",
|
||||
"def quest_travel(row, zone_name):\n",
|
||||
" locations = row[\"locations\"] if isinstance(row[\"locations\"], list) else []\n",
|
||||
" starts = zone_coords(locations, (\"start\",), zone_name)\n",
|
||||
" ends = zone_coords(locations, (\"end\",), zone_name)\n",
|
||||
" objectives = zone_coords(locations, OBJECTIVE_ROLES, zone_name)\n",
|
||||
"\n",
|
||||
" start = starts[0] if starts else None\n",
|
||||
" end = ends[0] if ends else None\n",
|
||||
" # Objective area = mean of every objective npc/object's representative coord\n",
|
||||
" objective = np.mean(objectives, axis=0) if objectives else None\n",
|
||||
"\n",
|
||||
" if objective is None:\n",
|
||||
" # Delivery / talk-to quests: straight from giver to turn-in\n",
|
||||
" to_objective, from_objective = np.nan, np.nan\n",
|
||||
" total = distance(start, end)\n",
|
||||
" else:\n",
|
||||
" to_objective = distance(start, objective)\n",
|
||||
" from_objective = distance(objective, end)\n",
|
||||
" total = to_objective + from_objective\n",
|
||||
"\n",
|
||||
" return pd.Series({\n",
|
||||
" \"start_x\": start[0] if start else np.nan,\n",
|
||||
" \"start_y\": start[1] if start else np.nan,\n",
|
||||
" \"objective_x\": objective[0] if objective is not None else np.nan,\n",
|
||||
" \"objective_y\": objective[1] if objective is not None else np.nan,\n",
|
||||
" \"end_x\": end[0] if end else np.nan,\n",
|
||||
" \"end_y\": end[1] if end else np.nan,\n",
|
||||
" \"to_objective\": to_objective,\n",
|
||||
" \"from_objective\": from_objective,\n",
|
||||
" \"total_travel\": total,\n",
|
||||
" })\n",
|
||||
"\n",
|
||||
"def build_travel(quests: pd.DataFrame, zone_name: str, bracket: str) -> pd.DataFrame:\n",
|
||||
" travel = quests.apply(lambda row: quest_travel(row, zone_name), axis=1)\n",
|
||||
" travel.insert(0, \"zone\", zone_name)\n",
|
||||
" travel.insert(1, \"bracket\", bracket)\n",
|
||||
" travel.insert(2, \"id\", quests[\"id\"])\n",
|
||||
" travel.insert(3, \"name\", quests[\"name\"])\n",
|
||||
" travel.insert(4, \"level\", quests[\"level\"])\n",
|
||||
" travel.insert(5, \"xp\", quests[\"rewards\"].apply(quest_xp))\n",
|
||||
" return travel\n",
|
||||
"\n",
|
||||
"travel_df = pd.concat(\n",
|
||||
" [build_travel(quests, zone, bracket) for (zone, bracket), quests in brackets.items()],\n",
|
||||
" ignore_index=True,\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"travel_summary = travel_df.groupby([\"zone\", \"bracket\"]).agg(\n",
|
||||
" quests=(\"id\", \"count\"),\n",
|
||||
" with_objective=(\"objective_x\", \"count\"),\n",
|
||||
" total_xp=(\"xp\", \"sum\"),\n",
|
||||
" total_to_objective=(\"to_objective\", \"sum\"),\n",
|
||||
" total_from_objective=(\"from_objective\", \"sum\"),\n",
|
||||
" total_travel=(\"total_travel\", \"sum\"),\n",
|
||||
" avg_travel=(\"total_travel\", \"mean\"),\n",
|
||||
")\n",
|
||||
"travel_summary[\"xp_per_travel\"] = (travel_summary[\"total_xp\"] / travel_summary[\"total_travel\"]).round(1)\n",
|
||||
"travel_summary.round(1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "7fe45672",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Afterwards, we use X-means clustering to find hotspots for quest objective locations.\n",
|
||||
"# X-means = k-means that keeps splitting clusters in two while the split improves the\n",
|
||||
"# BIC score (Pelleg & Moore, 2000), so we don't have to pick k ourselves.\n",
|
||||
"\n",
|
||||
"def kmeans(points: np.ndarray, centers: np.ndarray, iterations: int = 100):\n",
|
||||
" for _ in range(iterations):\n",
|
||||
" labels = np.argmin(np.linalg.norm(points[:, None] - centers[None], axis=2), axis=1)\n",
|
||||
" new_centers = np.array([\n",
|
||||
" points[labels == k].mean(axis=0) if np.any(labels == k) else centers[k]\n",
|
||||
" for k in range(len(centers))\n",
|
||||
" ])\n",
|
||||
" if np.allclose(new_centers, centers):\n",
|
||||
" break\n",
|
||||
" centers = new_centers\n",
|
||||
" return labels, centers\n",
|
||||
"\n",
|
||||
"def bic(points: np.ndarray, labels: np.ndarray, centers: np.ndarray, min_variance: float = 1.25) -> float:\n",
|
||||
" r, m = points.shape\n",
|
||||
" k = len(centers)\n",
|
||||
" if r <= k:\n",
|
||||
" return -np.inf\n",
|
||||
" # Many quests share the exact same objective coord, so without a floor a tiny cluster gets ~0 variance and an infinite likelihood. 1.0 = roughly 1% of the map.\n",
|
||||
" variance = max(np.sum((points - centers[labels]) ** 2) / (m * (r - k)), min_variance)\n",
|
||||
" log_likelihood = 0.0\n",
|
||||
" for i in range(k):\n",
|
||||
" r_i = np.sum(labels == i)\n",
|
||||
" if r_i == 0:\n",
|
||||
" continue\n",
|
||||
" log_likelihood += (r_i * np.log(r_i) - r_i * np.log(r)\n",
|
||||
" - r_i * m / 2 * np.log(2 * np.pi * variance)\n",
|
||||
" - (r_i - 1) * m / 2)\n",
|
||||
" free_params = k * (m + 1)\n",
|
||||
" return log_likelihood - free_params / 2 * np.log(r)\n",
|
||||
"\n",
|
||||
"def best_split(members: np.ndarray, rng, attempts: int):\n",
|
||||
" # k-means only finds a local optimum, so try a few random starts and keep the best split\n",
|
||||
" best_score, best_children = -np.inf, None\n",
|
||||
" for _ in range(attempts):\n",
|
||||
" child_labels, children = kmeans(members, members[rng.choice(len(members), 2, replace=False)])\n",
|
||||
" score = bic(members, child_labels, children)\n",
|
||||
" if score > best_score:\n",
|
||||
" best_score, best_children = score, children\n",
|
||||
" return best_score, best_children\n",
|
||||
"\n",
|
||||
"def xmeans(points: np.ndarray, k_max: int = 15, split_attempts: int = 10, seed: int = 0):\n",
|
||||
" rng = np.random.default_rng(seed)\n",
|
||||
" labels, centers = kmeans(points, points.mean(axis=0, keepdims=True))\n",
|
||||
" score = bic(points, labels, centers)\n",
|
||||
" while True:\n",
|
||||
" new_centers = []\n",
|
||||
" for k, center in enumerate(centers):\n",
|
||||
" members = points[labels == k]\n",
|
||||
" if len(members) < 4:\n",
|
||||
" new_centers.append(center)\n",
|
||||
" continue\n",
|
||||
" parent_score = bic(members, np.zeros(len(members), dtype=int), center[None])\n",
|
||||
" child_score, children = best_split(members, rng, split_attempts)\n",
|
||||
" new_centers.extend(children if child_score > parent_score else [center])\n",
|
||||
" if len(new_centers) == len(centers) or len(new_centers) > k_max:\n",
|
||||
" return labels, centers\n",
|
||||
" # The per-cluster test is lenient on small clusters, so only keep the splits if they also improve the BIC of the whole zone\n",
|
||||
" new_labels, new_centers = kmeans(points, np.array(new_centers))\n",
|
||||
" new_score = bic(points, new_labels, new_centers)\n",
|
||||
" if new_score <= score:\n",
|
||||
" return labels, centers\n",
|
||||
" labels, centers, score = new_labels, new_centers, new_score\n",
|
||||
"\n",
|
||||
"# Cluster each zone + bracket's objective areas separately, then classify every questin the travel data by the hotspot its objective falls in.\n",
|
||||
"# Hotspot ids are only unique within a zone + bracket.\n",
|
||||
"travel_df[\"objective_hotspot\"] = pd.NA\n",
|
||||
"travel_df[\"hotspot_distance\"] = np.nan\n",
|
||||
"hotspots = {}\n",
|
||||
"\n",
|
||||
"for (zone_name, bracket), bracket_travel in travel_df.groupby([\"zone\", \"bracket\"]):\n",
|
||||
" has_objective = bracket_travel.dropna(subset=[\"objective_x\", \"objective_y\"])\n",
|
||||
" points = has_objective[[\"objective_x\", \"objective_y\"]].to_numpy()\n",
|
||||
" if len(points) < 2:\n",
|
||||
" continue\n",
|
||||
" labels, centers = xmeans(points)\n",
|
||||
" hotspots[(zone_name, bracket)] = centers\n",
|
||||
" travel_df.loc[has_objective.index, \"objective_hotspot\"] = labels\n",
|
||||
" travel_df.loc[has_objective.index, \"hotspot_distance\"] = np.linalg.norm(points - centers[labels], axis=1)\n",
|
||||
" print(f\"{zone_name} {bracket}: {len(centers)} hotspots from {len(points)} objectives\")\n",
|
||||
"\n",
|
||||
"hotspot_summary = travel_df.dropna(subset=[\"objective_hotspot\"]).groupby([\"zone\", \"bracket\", \"objective_hotspot\"]).agg(\n",
|
||||
" center_x=(\"objective_x\", \"mean\"),\n",
|
||||
" center_y=(\"objective_y\", \"mean\"),\n",
|
||||
" quests=(\"id\", \"count\"),\n",
|
||||
" total_xp=(\"xp\", \"sum\"),\n",
|
||||
" avg_to_objective=(\"to_objective\", \"mean\"),\n",
|
||||
" avg_from_objective=(\"from_objective\", \"mean\"),\n",
|
||||
")\n",
|
||||
"hotspot_summary.round(1)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": ".venv (3.14.6)",
|
||||
"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.14.6"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
2070
quest_analyzer/experiments-2-ally.ipynb
Normal file
2070
quest_analyzer/experiments-2-ally.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
2580
quest_analyzer/experiments-2.ipynb
Normal file
2580
quest_analyzer/experiments-2.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
109
quest_analyzer/output/early_quests.csv
Normal file
109
quest_analyzer/output/early_quests.csv
Normal file
@@ -0,0 +1,109 @@
|
||||
zone,bracket,quests,total_xp,avg_xp
|
||||
Ashenvale,19-21,7,2150,307.0
|
||||
Blackrock Depths,1-3,1,0,0.0
|
||||
Darkmoon Faire,1-3,1,0,0.0
|
||||
Druid,1-3,2,125,62.0
|
||||
Druid,10-12,11,4540,413.0
|
||||
Druid,13-15,5,3300,660.0
|
||||
Druid,16-18,4,3025,756.0
|
||||
Druid,19-21,8,5225,653.0
|
||||
Durotar,1-3,20,1540,77.0
|
||||
Durotar,10-12,38,21430,564.0
|
||||
Durotar,13-15,6,4005,668.0
|
||||
Durotar,4-6,35,10525,301.0
|
||||
Durotar,7-9,19,12045,634.0
|
||||
Herbalism,16-18,1,1150,1150.0
|
||||
Hillsbrad Foothills,19-21,3,2085,695.0
|
||||
Hunter,1-3,4,205,51.0
|
||||
Hunter,10-12,19,9540,502.0
|
||||
Loch Modan,10-12,1,225,225.0
|
||||
Mage,1-3,3,120,40.0
|
||||
Mage,10-12,4,1850,462.0
|
||||
Mage,13-15,3,1955,652.0
|
||||
Mage,16-18,1,1150,1150.0
|
||||
Mage,19-21,1,0,0.0
|
||||
Miscellaneous,10-12,2,1260,630.0
|
||||
Miscellaneous,19-21,1,0,0.0
|
||||
Miscellaneous,7-9,1,530,530.0
|
||||
Mulgore,1-3,11,1165,106.0
|
||||
Mulgore,10-12,29,16585,572.0
|
||||
Mulgore,13-15,4,2120,530.0
|
||||
Mulgore,4-6,32,10420,326.0
|
||||
Mulgore,7-9,17,8725,513.0
|
||||
Orgrimmar,10-12,29,11235,387.0
|
||||
Orgrimmar,13-15,13,8335,641.0
|
||||
Orgrimmar,16-18,9,4750,528.0
|
||||
Orgrimmar,19-21,21,11560,550.0
|
||||
Paladin,1-3,2,125,62.0
|
||||
Paladin,10-12,13,7505,577.0
|
||||
Paladin,4-6,2,270,135.0
|
||||
Priest,1-3,2,80,40.0
|
||||
Priest,10-12,12,2100,175.0
|
||||
Priest,13-15,3,540,180.0
|
||||
Priest,19-21,6,1560,260.0
|
||||
Priest,4-6,4,720,180.0
|
||||
Ragefire Chasm,13-15,1,1050,1050.0
|
||||
Ragefire Chasm,16-18,5,6080,1216.0
|
||||
Rogue,1-3,4,205,51.0
|
||||
Rogue,10-12,2,420,210.0
|
||||
Rogue,13-15,6,3185,531.0
|
||||
Rogue,16-18,6,2575,429.0
|
||||
Rogue,19-21,4,3010,752.0
|
||||
Ruins of Lordaeron,19-21,4,6600,1650.0
|
||||
Shaman,1-3,4,205,51.0
|
||||
Shaman,10-12,11,6820,620.0
|
||||
Shaman,13-15,3,2300,767.0
|
||||
Shaman,19-21,5,3120,624.0
|
||||
Shaman,4-6,8,1880,235.0
|
||||
Silverpine Forest,10-12,17,9665,569.0
|
||||
Silverpine Forest,13-15,13,10675,821.0
|
||||
Silverpine Forest,16-18,14,12125,866.0
|
||||
Silverpine Forest,19-21,5,7050,1410.0
|
||||
Stonetalon Mountains,16-18,7,7395,1056.0
|
||||
Stonetalon Mountains,19-21,11,13020,1184.0
|
||||
The Barrens,10-12,25,11905,476.0
|
||||
The Barrens,13-15,31,25190,813.0
|
||||
The Barrens,16-18,35,37795,1080.0
|
||||
The Barrens,19-21,46,47470,1032.0
|
||||
Thunder Bluff,10-12,30,11545,385.0
|
||||
Thunder Bluff,13-15,7,4825,689.0
|
||||
Thunder Bluff,16-18,10,8070,807.0
|
||||
Thunder Bluff,19-21,9,4595,511.0
|
||||
Thunder Bluff,7-9,3,1660,553.0
|
||||
Tirisfal Glades,1-3,15,1470,98.0
|
||||
Tirisfal Glades,10-12,45,24840,552.0
|
||||
Tirisfal Glades,13-15,4,2835,709.0
|
||||
Tirisfal Glades,4-6,32,9940,311.0
|
||||
Tirisfal Glades,7-9,16,8805,550.0
|
||||
Uncategorized,1-3,23,1060,46.0
|
||||
Uncategorized,10-12,29,16645,574.0
|
||||
Uncategorized,13-15,7,3045,435.0
|
||||
Uncategorized,19-21,16,2480,155.0
|
||||
Uncategorized,4-6,72,20930,291.0
|
||||
Uncategorized,7-9,30,15090,503.0
|
||||
Undercity,13-15,11,7420,675.0
|
||||
Undercity,16-18,10,9680,968.0
|
||||
Undercity,19-21,36,23690,658.0
|
||||
Undercity,7-9,4,1585,396.0
|
||||
Wailing Caverns,16-18,6,6405,1068.0
|
||||
Wailing Caverns,19-21,1,2050,2050.0
|
||||
Warlock,1-3,4,310,78.0
|
||||
Warlock,10-12,6,3220,537.0
|
||||
Warlock,19-21,15,13850,923.0
|
||||
Warlock,4-6,2,390,195.0
|
||||
Warrior,1-3,5,245,49.0
|
||||
Warrior,10-12,10,5280,528.0
|
||||
Warrior,19-21,3,2485,828.0
|
||||
Warsong Gulch,19-21,2,2180,1090.0
|
||||
Westfall,16-18,5,4040,808.0
|
||||
Westfall,19-21,2,3000,1500.0
|
||||
Winter Veil,1-3,4,10,2.0
|
||||
Winter Veil,10-12,1,0,0.0
|
||||
Winter Veil,19-21,1,0,0.0
|
||||
Zephras Isle,1-3,13,1475,113.0
|
||||
Zephras Isle,10-12,41,25465,621.0
|
||||
Zephras Isle,13-15,7,3045,435.0
|
||||
Zephras Isle,16-18,0,0,
|
||||
Zephras Isle,19-21,0,0,
|
||||
Zephras Isle,4-6,30,8780,293.0
|
||||
Zephras Isle,7-9,30,15090,503.0
|
||||
|
109
quest_analyzer/output/quests.csv
Normal file
109
quest_analyzer/output/quests.csv
Normal file
@@ -0,0 +1,109 @@
|
||||
zone,bracket,quests,total_xp,avg_xp
|
||||
Ashenvale,7: 19-21,7,2150,307.0
|
||||
Blackrock Depths,1: 1-3,1,0,0.0
|
||||
Darkmoon Faire,1: 1-3,1,0,0.0
|
||||
Druid,1: 1-3,2,125,62.0
|
||||
Druid,4: 10-12,11,4540,413.0
|
||||
Druid,5: 13-15,5,3300,660.0
|
||||
Druid,6: 16-18,4,3025,756.0
|
||||
Druid,7: 19-21,8,5225,653.0
|
||||
Durotar,1: 1-3,20,1540,77.0
|
||||
Durotar,2: 4-6,35,10525,301.0
|
||||
Durotar,3: 7-9,19,12045,634.0
|
||||
Durotar,4: 10-12,38,21430,564.0
|
||||
Durotar,5: 13-15,6,4005,668.0
|
||||
Herbalism,6: 16-18,1,1150,1150.0
|
||||
Hillsbrad Foothills,7: 19-21,3,2085,695.0
|
||||
Hunter,1: 1-3,4,205,51.0
|
||||
Hunter,4: 10-12,19,9540,502.0
|
||||
Loch Modan,4: 10-12,1,225,225.0
|
||||
Mage,1: 1-3,3,120,40.0
|
||||
Mage,4: 10-12,4,1850,462.0
|
||||
Mage,5: 13-15,3,1955,652.0
|
||||
Mage,6: 16-18,1,1150,1150.0
|
||||
Mage,7: 19-21,1,0,0.0
|
||||
Miscellaneous,3: 7-9,1,530,530.0
|
||||
Miscellaneous,4: 10-12,2,1260,630.0
|
||||
Miscellaneous,7: 19-21,1,0,0.0
|
||||
Mulgore,1: 1-3,11,1165,106.0
|
||||
Mulgore,2: 4-6,32,10420,326.0
|
||||
Mulgore,3: 7-9,17,8725,513.0
|
||||
Mulgore,4: 10-12,29,16585,572.0
|
||||
Mulgore,5: 13-15,4,2120,530.0
|
||||
Orgrimmar,4: 10-12,29,11235,387.0
|
||||
Orgrimmar,5: 13-15,13,8335,641.0
|
||||
Orgrimmar,6: 16-18,9,4750,528.0
|
||||
Orgrimmar,7: 19-21,21,11560,550.0
|
||||
Paladin,1: 1-3,2,125,62.0
|
||||
Paladin,2: 4-6,2,270,135.0
|
||||
Paladin,4: 10-12,13,7505,577.0
|
||||
Priest,1: 1-3,2,80,40.0
|
||||
Priest,2: 4-6,4,720,180.0
|
||||
Priest,4: 10-12,12,2100,175.0
|
||||
Priest,5: 13-15,3,540,180.0
|
||||
Priest,7: 19-21,6,1560,260.0
|
||||
Ragefire Chasm,5: 13-15,1,1050,1050.0
|
||||
Ragefire Chasm,6: 16-18,5,6080,1216.0
|
||||
Rogue,1: 1-3,4,205,51.0
|
||||
Rogue,4: 10-12,2,420,210.0
|
||||
Rogue,5: 13-15,6,3185,531.0
|
||||
Rogue,6: 16-18,6,2575,429.0
|
||||
Rogue,7: 19-21,4,3010,752.0
|
||||
Ruins of Lordaeron,7: 19-21,4,6600,1650.0
|
||||
Shaman,1: 1-3,4,205,51.0
|
||||
Shaman,2: 4-6,8,1880,235.0
|
||||
Shaman,4: 10-12,11,6820,620.0
|
||||
Shaman,5: 13-15,3,2300,767.0
|
||||
Shaman,7: 19-21,5,3120,624.0
|
||||
Silverpine Forest,4: 10-12,17,9665,569.0
|
||||
Silverpine Forest,5: 13-15,13,10675,821.0
|
||||
Silverpine Forest,6: 16-18,14,12125,866.0
|
||||
Silverpine Forest,7: 19-21,5,7050,1410.0
|
||||
Stonetalon Mountains,6: 16-18,7,7395,1056.0
|
||||
Stonetalon Mountains,7: 19-21,11,13020,1184.0
|
||||
The Barrens,4: 10-12,25,11905,476.0
|
||||
The Barrens,5: 13-15,31,25190,813.0
|
||||
The Barrens,6: 16-18,35,37795,1080.0
|
||||
The Barrens,7: 19-21,46,47470,1032.0
|
||||
Thunder Bluff,3: 7-9,3,1660,553.0
|
||||
Thunder Bluff,4: 10-12,30,11545,385.0
|
||||
Thunder Bluff,5: 13-15,7,4825,689.0
|
||||
Thunder Bluff,6: 16-18,10,8070,807.0
|
||||
Thunder Bluff,7: 19-21,9,4595,511.0
|
||||
Tirisfal Glades,1: 1-3,15,1470,98.0
|
||||
Tirisfal Glades,2: 4-6,32,9940,311.0
|
||||
Tirisfal Glades,3: 7-9,16,8805,550.0
|
||||
Tirisfal Glades,4: 10-12,45,24840,552.0
|
||||
Tirisfal Glades,5: 13-15,4,2835,709.0
|
||||
Uncategorized,1: 1-3,23,1060,46.0
|
||||
Uncategorized,2: 4-6,72,20930,291.0
|
||||
Uncategorized,3: 7-9,30,15090,503.0
|
||||
Uncategorized,4: 10-12,29,16645,574.0
|
||||
Uncategorized,5: 13-15,7,3045,435.0
|
||||
Uncategorized,7: 19-21,16,2480,155.0
|
||||
Undercity,3: 7-9,4,1585,396.0
|
||||
Undercity,5: 13-15,11,7420,675.0
|
||||
Undercity,6: 16-18,10,9680,968.0
|
||||
Undercity,7: 19-21,36,23690,658.0
|
||||
Wailing Caverns,6: 16-18,6,6405,1068.0
|
||||
Wailing Caverns,7: 19-21,1,2050,2050.0
|
||||
Warlock,1: 1-3,4,310,78.0
|
||||
Warlock,2: 4-6,2,390,195.0
|
||||
Warlock,4: 10-12,6,3220,537.0
|
||||
Warlock,7: 19-21,15,13850,923.0
|
||||
Warrior,1: 1-3,5,245,49.0
|
||||
Warrior,4: 10-12,10,5280,528.0
|
||||
Warrior,7: 19-21,3,2485,828.0
|
||||
Warsong Gulch,7: 19-21,2,2180,1090.0
|
||||
Westfall,6: 16-18,5,4040,808.0
|
||||
Westfall,7: 19-21,2,3000,1500.0
|
||||
Winter Veil,1: 1-3,4,10,2.0
|
||||
Winter Veil,4: 10-12,1,0,0.0
|
||||
Winter Veil,7: 19-21,1,0,0.0
|
||||
Zephras Isle,1: 1-3,13,1475,113.0
|
||||
Zephras Isle,2: 4-6,30,8780,293.0
|
||||
Zephras Isle,3: 7-9,30,15090,503.0
|
||||
Zephras Isle,4: 10-12,41,25465,621.0
|
||||
Zephras Isle,5: 13-15,7,3045,435.0
|
||||
Zephras Isle,6: 16-18,0,0,
|
||||
Zephras Isle,7: 19-21,0,0,
|
||||
|
107
quest_analyzer/output/travel-horde.csv
Normal file
107
quest_analyzer/output/travel-horde.csv
Normal file
@@ -0,0 +1,107 @@
|
||||
zone,bracket,quests,with_objective,total_xp,total_to_objective,total_from_objective,total_travel,avg_travel,xp_per_travel
|
||||
Ashenvale,7: 19-21,7,3,2150,86.22196857922745,86.22196857922745,172.4439371584549,43.110984289613725,12.5
|
||||
Blackrock Depths,1: 1-3,1,0,0,0.0,0.0,0.0,,
|
||||
Darkmoon Faire,1: 1-3,1,0,0,0.0,0.0,0.0,,
|
||||
Druid,1: 1-3,2,0,125,0.0,0.0,0.0,,inf
|
||||
Druid,4: 10-12,11,0,4540,0.0,0.0,0.0,,inf
|
||||
Druid,5: 13-15,5,0,3300,0.0,0.0,0.0,,inf
|
||||
Druid,6: 16-18,4,0,3025,0.0,0.0,0.0,,inf
|
||||
Druid,7: 19-21,8,0,5225,0.0,0.0,0.0,,inf
|
||||
Durotar,1: 1-3,20,2,1540,7.2496867579747235,7.2496867579747235,30.238752090540732,1.6799306716967073,50.9
|
||||
Durotar,2: 4-6,35,8,10525,88.02397548674963,83.42527428521277,349.3591211947182,12.93922671091549,30.1
|
||||
Durotar,3: 7-9,19,6,12045,96.01873824079449,96.01873824079449,232.18705387598337,15.479136925065557,51.9
|
||||
Durotar,4: 10-12,38,13,21430,167.21238250331842,167.21238250331842,402.6859851873704,22.37144362152058,53.2
|
||||
Durotar,5: 13-15,6,1,4005,0.5,0.4123105625617633,0.9123105625617633,0.4561552812808817,4390.0
|
||||
Herbalism,6: 16-18,1,0,1150,0.0,0.0,0.0,,inf
|
||||
Hillsbrad Foothills,7: 19-21,3,0,2085,0.0,0.0,49.53804374193411,24.769021870967055,42.1
|
||||
Hunter,1: 1-3,4,0,205,0.0,0.0,0.0,,inf
|
||||
Hunter,4: 10-12,19,0,9540,0.0,0.0,0.0,,inf
|
||||
Loch Modan,4: 10-12,1,0,225,0.0,0.0,0.0,,inf
|
||||
Mage,1: 1-3,3,0,120,0.0,0.0,0.0,,inf
|
||||
Mage,4: 10-12,4,0,1850,0.0,0.0,0.0,,inf
|
||||
Mage,5: 13-15,3,0,1955,0.0,0.0,0.0,,inf
|
||||
Mage,6: 16-18,1,0,1150,0.0,0.0,0.0,,inf
|
||||
Mage,7: 19-21,1,0,0,0.0,0.0,0.0,,
|
||||
Miscellaneous,3: 7-9,1,0,530,0.0,0.0,0.0,,inf
|
||||
Miscellaneous,4: 10-12,2,0,1260,0.0,0.0,0.0,,inf
|
||||
Miscellaneous,7: 19-21,1,0,0,0.0,0.0,0.0,,
|
||||
Mulgore,1: 1-3,11,2,1165,15.016765583909526,15.016765583909526,64.20695016256053,6.420695016256053,18.1
|
||||
Mulgore,2: 4-6,32,7,10420,96.15671294456787,91.41318248010322,303.51664696952895,13.196375955196912,34.3
|
||||
Mulgore,3: 7-9,17,7,8725,67.14906023022141,67.14906023022141,200.3751243453758,13.358341623025053,43.5
|
||||
Mulgore,4: 10-12,29,7,16585,109.14986184665257,92.74152938439545,179.4939094457104,17.94939094457104,92.4
|
||||
Mulgore,5: 13-15,4,0,2120,0.0,0.0,0.0,,inf
|
||||
Orgrimmar,4: 10-12,29,3,11235,66.6682266317423,66.6682266317423,143.17769302278322,14.317769302278322,78.5
|
||||
Orgrimmar,5: 13-15,13,2,8335,20.607473974613356,20.607473974613356,114.77562613212774,12.752847348014193,72.6
|
||||
Orgrimmar,6: 16-18,9,0,4750,0.0,0.0,22.3785663382064,5.5946415845516,212.3
|
||||
Orgrimmar,7: 19-21,21,2,11560,9.648892006374707,9.648892006374707,53.59341479474561,4.466117899562135,215.7
|
||||
Paladin,1: 1-3,2,0,125,0.0,0.0,0.0,,inf
|
||||
Paladin,2: 4-6,2,0,270,0.0,0.0,0.0,,inf
|
||||
Paladin,4: 10-12,13,0,7505,0.0,0.0,0.0,,inf
|
||||
Priest,1: 1-3,2,0,80,0.0,0.0,0.0,,inf
|
||||
Priest,2: 4-6,4,0,720,0.0,0.0,0.0,,inf
|
||||
Priest,4: 10-12,12,0,2100,0.0,0.0,0.0,,inf
|
||||
Priest,5: 13-15,3,0,540,0.0,0.0,0.0,,inf
|
||||
Priest,7: 19-21,6,0,1560,0.0,0.0,0.0,,inf
|
||||
Ragefire Chasm,5: 13-15,1,0,1050,0.0,0.0,0.0,,inf
|
||||
Ragefire Chasm,6: 16-18,5,0,6080,0.0,0.0,0.0,,inf
|
||||
Rogue,1: 1-3,4,0,205,0.0,0.0,0.0,,inf
|
||||
Rogue,4: 10-12,2,0,420,0.0,0.0,0.0,,inf
|
||||
Rogue,5: 13-15,6,0,3185,0.0,0.0,0.0,,inf
|
||||
Rogue,6: 16-18,6,0,2575,0.0,0.0,0.0,,inf
|
||||
Rogue,7: 19-21,4,0,3010,0.0,0.0,0.0,,inf
|
||||
Ruins of Lordaeron,7: 19-21,4,0,6600,0.0,0.0,0.0,,inf
|
||||
Shaman,1: 1-3,4,0,205,0.0,0.0,0.0,,inf
|
||||
Shaman,2: 4-6,8,0,1880,0.0,0.0,0.0,,inf
|
||||
Shaman,4: 10-12,11,0,6820,0.0,0.0,0.0,,inf
|
||||
Shaman,5: 13-15,3,0,2300,0.0,0.0,0.0,,inf
|
||||
Shaman,7: 19-21,5,0,3120,0.0,0.0,0.0,,inf
|
||||
Silverpine Forest,4: 10-12,17,5,9665,62.84900392030974,55.482907861999436,229.08623704351567,19.090519753626307,42.2
|
||||
Silverpine Forest,5: 13-15,13,4,10675,73.58580941279655,73.58580941279655,190.0637154217843,21.11819060242048,56.2
|
||||
Silverpine Forest,6: 16-18,14,4,12125,121.59726463408211,91.80316366368211,218.47823083334725,31.21117583333532,55.5
|
||||
Silverpine Forest,7: 19-21,5,3,7050,116.64678523566371,116.64678523566371,233.29357047132743,77.76452349044247,30.2
|
||||
Stonetalon Mountains,6: 16-18,7,3,7395,29.031685770877647,29.031685770877647,58.063371541755295,58.063371541755295,127.4
|
||||
Stonetalon Mountains,7: 19-21,11,5,13020,73.75785042074442,80.10713311165387,153.86498353239827,38.46624588309957,84.6
|
||||
The Barrens,4: 10-12,25,2,11905,7.917834652519845,7.917834652519845,86.58476283999335,8.658476283999335,137.5
|
||||
The Barrens,5: 13-15,31,12,25190,106.26158293857759,106.26158293857759,274.209754384025,12.46407974472841,91.9
|
||||
The Barrens,6: 16-18,35,19,37795,229.9489971737371,231.2475440436149,550.3258938868469,19.65449621024453,68.7
|
||||
The Barrens,7: 19-21,46,20,47470,208.72855582400518,209.74167113110244,496.02927419544613,16.534309139848204,95.7
|
||||
Thunder Bluff,3: 7-9,3,1,1660,5.702144952974186,5.702144952974186,11.404289905948373,11.404289905948373,145.6
|
||||
Thunder Bluff,4: 10-12,30,2,11545,48.7382207185583,48.7382207185583,151.33684524232066,15.133684524232066,76.3
|
||||
Thunder Bluff,5: 13-15,7,0,4825,0.0,0.0,0.0,0.0,inf
|
||||
Thunder Bluff,6: 16-18,10,0,8070,0.0,0.0,52.02189621860649,17.340632072868832,155.1
|
||||
Thunder Bluff,7: 19-21,9,0,4595,0.0,0.0,0.0,0.0,inf
|
||||
Tirisfal Glades,1: 1-3,15,5,1470,40.25494036916621,40.25494036916621,90.13212886750887,6.933240682116066,16.3
|
||||
Tirisfal Glades,2: 4-6,32,11,9940,96.91431336829991,64.66016634811038,350.2220496377767,12.076622401302645,28.4
|
||||
Tirisfal Glades,3: 7-9,16,7,8805,104.3267005186916,104.3267005186916,281.23572692502677,21.63351745577129,31.3
|
||||
Tirisfal Glades,4: 10-12,45,16,24840,239.4624763900186,272.9735205879254,683.3871411878215,18.982976144106154,36.3
|
||||
Tirisfal Glades,5: 13-15,4,3,2835,48.23489964898144,48.23489964898144,96.46979929796288,48.23489964898144,29.4
|
||||
Uncategorized,1: 1-3,23,0,1060,0.0,0.0,0.0,,inf
|
||||
Uncategorized,2: 4-6,72,0,20930,0.0,0.0,0.0,,inf
|
||||
Uncategorized,3: 7-9,30,0,15090,0.0,0.0,0.0,,inf
|
||||
Uncategorized,4: 10-12,29,0,16645,0.0,0.0,0.0,,inf
|
||||
Uncategorized,5: 13-15,7,0,3045,0.0,0.0,0.0,,inf
|
||||
Uncategorized,7: 19-21,16,0,2480,0.0,0.0,0.0,,inf
|
||||
Undercity,3: 7-9,4,0,1585,0.0,0.0,0.0,0.0,inf
|
||||
Undercity,5: 13-15,11,1,7420,38.25748291972724,18.57045004630836,151.85004641939378,25.30834106989896,48.9
|
||||
Undercity,6: 16-18,10,0,9680,0.0,0.0,22.253285400387767,5.563321350096942,435.0
|
||||
Undercity,7: 19-21,36,1,23690,1.9075548306926227,1.9075548306926227,52.5200230196221,3.0894131188013,451.1
|
||||
Wailing Caverns,6: 16-18,6,0,6405,0.0,0.0,0.0,,inf
|
||||
Wailing Caverns,7: 19-21,1,0,2050,0.0,0.0,0.0,,inf
|
||||
Warlock,1: 1-3,4,0,310,0.0,0.0,0.0,,inf
|
||||
Warlock,2: 4-6,2,0,390,0.0,0.0,0.0,,inf
|
||||
Warlock,4: 10-12,6,0,3220,0.0,0.0,0.0,,inf
|
||||
Warlock,7: 19-21,15,0,13850,0.0,0.0,0.0,,inf
|
||||
Warrior,1: 1-3,5,0,245,0.0,0.0,0.0,,inf
|
||||
Warrior,4: 10-12,10,0,5280,0.0,0.0,0.0,,inf
|
||||
Warrior,7: 19-21,3,0,2485,0.0,0.0,0.0,,inf
|
||||
Warsong Gulch,7: 19-21,2,0,2180,0.0,0.0,0.0,,inf
|
||||
Westfall,6: 16-18,5,1,4040,54.90280123824708,54.90280123824708,169.65665621242402,42.414164053106006,23.8
|
||||
Westfall,7: 19-21,2,2,3000,46.411668147220254,46.411668147220254,92.82333629444051,46.411668147220254,32.3
|
||||
Winter Veil,1: 1-3,4,0,10,0.0,0.0,0.0,,inf
|
||||
Winter Veil,4: 10-12,1,0,0,0.0,0.0,0.0,,
|
||||
Winter Veil,7: 19-21,1,0,0,0.0,0.0,0.0,,
|
||||
Zephras Isle,1: 1-3,13,4,1475,14.526626524171727,14.526626524171727,42.18306281701619,3.2448509859243226,35.0
|
||||
Zephras Isle,2: 4-6,30,9,8780,62.595018153829784,62.595018153829784,251.40715666795938,8.380238555598646,34.9
|
||||
Zephras Isle,3: 7-9,30,17,15090,182.35203024809363,183.20317500773706,501.8040603510491,16.726802011701636,30.1
|
||||
Zephras Isle,4: 10-12,41,20,25465,251.0154804558676,186.694070988593,645.9601977575601,16.149004943939,39.4
|
||||
Zephras Isle,5: 13-15,7,3,3045,23.09501377109359,23.09501377109359,54.02903258109359,10.805806516218718,56.4
|
||||
|
127
quest_analyzer/output/travel.csv
Normal file
127
quest_analyzer/output/travel.csv
Normal file
@@ -0,0 +1,127 @@
|
||||
zone,bracket,quests,with_objective,total_xp,total_to_objective,total_from_objective,total_travel,avg_travel,xp_per_travel
|
||||
Alchemy,3: 7-9,1,0,700,0.0,0.0,0.0,,inf
|
||||
Anvilmar,2: 4-6,1,0,405,0.0,0.0,0.0,,inf
|
||||
Ashenvale,6: 16-18,5,0,4910,0.0,0.0,0.0,,inf
|
||||
Ashenvale,7: 19-21,16,4,17250,43.48682271513522,73.4378044700066,169.29512805417096,14.10792733784758,101.9
|
||||
Blackrock Depths,1: 1-3,1,0,0,0.0,0.0,0.0,,
|
||||
Blacksmithing,4: 10-12,1,0,910,0.0,0.0,0.0,,inf
|
||||
Blacksmithing,6: 16-18,1,0,1150,0.0,0.0,0.0,,inf
|
||||
Cooking,3: 7-9,2,0,1260,0.0,0.0,0.0,,inf
|
||||
Cooking,4: 10-12,1,0,910,0.0,0.0,0.0,,inf
|
||||
Darkmoon Faire,1: 1-3,1,0,0,0.0,0.0,0.0,,
|
||||
Darkshore,1: 1-3,2,0,0,0.0,0.0,0.0,0.0,
|
||||
Darkshore,4: 10-12,13,6,9440,55.25260876595058,71.74918457229674,134.89102650757374,13.489102650757374,70.0
|
||||
Darkshore,5: 13-15,25,6,18165,89.73167339632545,95.09239954545124,313.72205966930886,14.939145698538518,57.9
|
||||
Darkshore,6: 16-18,24,8,25055,127.9146094434045,145.73004621768075,389.068006383087,22.886353316652176,64.4
|
||||
Darkshore,7: 19-21,20,6,22680,159.5844363435948,159.5844363435948,608.4263538107444,46.80202721621111,37.3
|
||||
Darnassus,4: 10-12,33,1,12680,63.82383333355096,63.82383333355096,268.18045603234043,17.878697068822696,47.3
|
||||
Darnassus,5: 13-15,3,0,1570,0.0,0.0,0.0,,inf
|
||||
Deeprun Tram,4: 10-12,2,0,1000,0.0,0.0,0.0,,inf
|
||||
Druid,1: 1-3,2,0,125,0.0,0.0,0.0,,inf
|
||||
Druid,4: 10-12,11,0,4540,0.0,0.0,0.0,,inf
|
||||
Druid,5: 13-15,5,0,3300,0.0,0.0,0.0,,inf
|
||||
Druid,6: 16-18,4,0,3025,0.0,0.0,0.0,,inf
|
||||
Druid,7: 19-21,8,0,5225,0.0,0.0,0.0,,inf
|
||||
Dun Morogh,1: 1-3,19,3,1390,23.253891449566066,23.253891449566066,101.82856998072529,5.989915881219135,13.7
|
||||
Dun Morogh,2: 4-6,32,7,9720,50.08524493955694,50.08524493955694,313.19743687280356,11.18562274545727,31.0
|
||||
Dun Morogh,3: 7-9,20,9,10015,68.86140632021898,68.86140632021898,216.3254391975046,10.81627195987523,46.3
|
||||
Dun Morogh,4: 10-12,36,9,17170,68.3171822128801,76.85951191462325,302.2427492562249,16.79126384756805,56.8
|
||||
Dun Morogh,5: 13-15,7,3,5930,15.756432626061837,12.79481144839578,42.78613417088434,14.262044723628113,138.6
|
||||
Dun Morogh,6: 16-18,3,0,2715,0.0,0.0,0.0,,inf
|
||||
Durotar,3: 7-9,1,0,780,0.0,0.0,0.0,0.0,inf
|
||||
Durotar,4: 10-12,1,1,880,6.230228281888587,6.230228281888587,12.460456563777173,12.460456563777173,70.6
|
||||
Duskwood,7: 19-21,6,3,4840,92.75232931209018,92.75232931209018,356.5280738259673,59.42134563766121,13.6
|
||||
Dustwallow Marsh,7: 19-21,1,0,0,0.0,0.0,0.0,,
|
||||
Elwynn Forest,1: 1-3,21,6,1615,69.79003749304204,78.46992582193789,174.62618608517332,9.190851899219648,9.2
|
||||
Elwynn Forest,2: 4-6,34,7,8960,69.23047417066707,75.42530613926694,384.3753377194917,12.39920444256425,23.3
|
||||
Elwynn Forest,3: 7-9,21,11,12720,177.34875083455742,166.88813990157476,382.9310664541583,19.146553322707916,33.2
|
||||
Elwynn Forest,4: 10-12,37,7,19445,95.9792603985216,109.5204005260423,368.0893413128177,16.003884404905115,52.8
|
||||
Fishing,4: 10-12,2,0,1365,0.0,0.0,0.0,,inf
|
||||
Herbalism,6: 16-18,1,0,1150,0.0,0.0,0.0,,inf
|
||||
Hunter,1: 1-3,3,0,165,0.0,0.0,0.0,,inf
|
||||
Hunter,4: 10-12,23,0,12480,0.0,0.0,0.0,,inf
|
||||
Ironforge,1: 1-3,5,0,55,0.0,0.0,44.01942177022199,11.004855442555497,1.2
|
||||
Ironforge,4: 10-12,37,0,13095,0.0,0.0,139.0138443929029,10.693372645607916,94.2
|
||||
Ironforge,5: 13-15,13,1,7505,49.48878485601215,49.48878485601215,166.74611077858142,27.791018463096904,45.0
|
||||
Kharanos,4: 10-12,1,0,85,0.0,0.0,0.0,,inf
|
||||
Leatherworking,6: 16-18,1,0,1350,0.0,0.0,0.0,,inf
|
||||
Loch Modan,4: 10-12,13,4,8315,72.13647553589269,72.13647553589269,178.71534910648603,29.78589151774767,46.5
|
||||
Loch Modan,5: 13-15,19,4,14375,97.86979000880527,97.86979000880527,301.86249093510827,23.220191610392945,47.6
|
||||
Loch Modan,6: 16-18,14,7,14620,111.3865260164705,126.71951597741982,296.500435444576,26.954585040416,49.3
|
||||
Loch Modan,7: 19-21,9,2,9825,86.69187657745643,88.34718184137823,229.88051265536777,32.84007323648111,42.7
|
||||
Mage,1: 1-3,3,0,165,0.0,0.0,0.0,,inf
|
||||
Mage,4: 10-12,6,0,3445,0.0,0.0,0.0,,inf
|
||||
Mage,5: 13-15,3,0,1955,0.0,0.0,0.0,,inf
|
||||
Mage,6: 16-18,1,0,1150,0.0,0.0,0.0,,inf
|
||||
Mage,7: 19-21,1,0,0,0.0,0.0,0.0,,
|
||||
Miscellaneous,2: 4-6,1,0,405,0.0,0.0,0.0,,inf
|
||||
Miscellaneous,4: 10-12,2,0,1260,0.0,0.0,0.0,,inf
|
||||
Miscellaneous,7: 19-21,1,0,0,0.0,0.0,0.0,,
|
||||
Paladin,1: 1-3,2,0,80,0.0,0.0,0.0,,inf
|
||||
Paladin,4: 10-12,13,0,1945,0.0,0.0,0.0,,inf
|
||||
Paladin,5: 13-15,12,0,7300,0.0,0.0,0.0,,inf
|
||||
Paladin,7: 19-21,4,0,1220,0.0,0.0,0.0,,inf
|
||||
Priest,1: 1-3,4,0,160,0.0,0.0,0.0,,inf
|
||||
Priest,2: 4-6,6,0,1080,0.0,0.0,0.0,,inf
|
||||
Priest,4: 10-12,28,0,4620,0.0,0.0,0.0,,inf
|
||||
Priest,5: 13-15,7,0,1620,0.0,0.0,0.0,,inf
|
||||
Priest,7: 19-21,13,0,3510,0.0,0.0,0.0,,inf
|
||||
Redridge Mountains,5: 13-15,10,0,5055,0.0,0.0,56.173623446759436,11.234724689351888,90.0
|
||||
Redridge Mountains,6: 16-18,14,4,11775,63.97863749901971,63.97863749901971,145.4226604472326,24.237110074538766,81.0
|
||||
Redridge Mountains,7: 19-21,10,6,13405,130.85022762249795,130.85022762249795,261.7004552449959,32.71255690562449,51.2
|
||||
Rogue,1: 1-3,5,0,245,0.0,0.0,0.0,,inf
|
||||
Rogue,4: 10-12,7,0,4410,0.0,0.0,0.0,,inf
|
||||
Rogue,6: 16-18,6,0,1155,0.0,0.0,0.0,,inf
|
||||
Rogue,7: 19-21,5,0,3245,0.0,0.0,0.0,,inf
|
||||
Ruins of Lordaeron,7: 19-21,1,0,1650,0.0,0.0,0.0,,inf
|
||||
Shaman,1: 1-3,1,0,40,0.0,0.0,0.0,,inf
|
||||
Shaman,2: 4-6,4,0,985,0.0,0.0,0.0,,inf
|
||||
Shaman,4: 10-12,3,0,1500,0.0,0.0,0.0,,inf
|
||||
Shaman,5: 13-15,4,0,3480,0.0,0.0,0.0,,inf
|
||||
Shaman,7: 19-21,2,0,780,0.0,0.0,0.0,,inf
|
||||
Stonetalon Mountains,7: 19-21,12,2,12160,28.785210207029003,28.785210207029003,57.99468448276993,19.331561494256643,209.7
|
||||
Stormwind City,1: 1-3,5,0,355,0.0,0.0,37.31255221936733,9.328138054841833,9.5
|
||||
Stormwind City,4: 10-12,41,1,12405,2.6534505836740276,2.6534505836740276,94.1507884354622,6.276719229030814,131.8
|
||||
Stormwind City,5: 13-15,21,3,13420,72.95021870001224,69.27331129740946,233.74537567420907,23.37453756742091,57.4
|
||||
Stormwind City,6: 16-18,18,0,8530,0.0,0.0,209.3126255632573,29.901803651893903,40.8
|
||||
Teldrassil,1: 1-3,12,3,1200,12.911301433847976,12.911301433847976,51.55593562478292,4.686903238616629,23.3
|
||||
Teldrassil,2: 4-6,33,4,9875,37.75323029138802,37.75323029138802,292.4724855000118,10.832314277778217,33.8
|
||||
Teldrassil,3: 7-9,20,9,11765,95.18597364882127,95.18597364882127,263.9455842809509,15.526210840055937,44.6
|
||||
Teldrassil,4: 10-12,38,5,18245,57.63840505556519,57.63840505556519,218.74146445318962,12.152303580732756,83.4
|
||||
The Barrens,5: 13-15,7,3,3890,10.33358142695701,10.33358142695701,52.82410524031706,7.546300748616723,73.6
|
||||
The Barrens,6: 16-18,10,7,13400,103.06424213810307,104.3627890079809,265.62525869569134,26.562525869569136,50.4
|
||||
The Barrens,7: 19-21,8,2,11075,22.51985498435451,23.532970291451754,46.05282527580626,15.350941758602088,240.5
|
||||
The Deadmines,6: 16-18,3,0,3950,0.0,0.0,0.0,,inf
|
||||
The Deadmines,7: 19-21,2,0,3100,0.0,0.0,0.0,,inf
|
||||
The Hall of Thanes,5: 13-15,2,0,2400,0.0,0.0,0.0,,inf
|
||||
The Hall of Thanes,6: 16-18,1,0,1450,0.0,0.0,0.0,,inf
|
||||
Uncategorized,1: 1-3,24,0,1100,0.0,0.0,0.0,,inf
|
||||
Uncategorized,2: 4-6,70,0,20530,0.0,0.0,0.0,,inf
|
||||
Uncategorized,3: 7-9,25,0,11665,0.0,0.0,0.0,,inf
|
||||
Uncategorized,4: 10-12,34,0,19360,0.0,0.0,0.0,,inf
|
||||
Uncategorized,5: 13-15,8,0,3590,0.0,0.0,0.0,,inf
|
||||
Uncategorized,7: 19-21,14,0,2170,0.0,0.0,0.0,,inf
|
||||
Wailing Caverns,6: 16-18,3,0,4300,0.0,0.0,0.0,,inf
|
||||
Wailing Caverns,7: 19-21,1,0,2050,0.0,0.0,0.0,,inf
|
||||
Warlock,1: 1-3,2,0,80,0.0,0.0,0.0,,inf
|
||||
Warlock,2: 4-6,2,0,710,0.0,0.0,0.0,,inf
|
||||
Warlock,4: 10-12,4,0,2100,0.0,0.0,0.0,,inf
|
||||
Warlock,7: 19-21,6,0,6570,0.0,0.0,0.0,,inf
|
||||
Warrior,1: 1-3,6,0,285,0.0,0.0,0.0,,inf
|
||||
Warrior,4: 10-12,17,0,8280,0.0,0.0,0.0,,inf
|
||||
Warrior,7: 19-21,1,0,155,0.0,0.0,0.0,,inf
|
||||
Warsong Gulch,7: 19-21,2,0,2180,0.0,0.0,0.0,,inf
|
||||
Westfall,3: 7-9,1,0,590,0.0,0.0,0.0,,inf
|
||||
Westfall,4: 10-12,13,3,7420,51.317162056350654,51.317162056350654,135.78743121699839,16.973428902124798,54.6
|
||||
Westfall,5: 13-15,16,8,11455,146.9468925585264,146.9468925585264,293.8937851170528,26.717616828822983,39.0
|
||||
Westfall,6: 16-18,20,4,16445,141.15163730169672,141.15163730169672,391.20624027019295,39.120624027019296,42.0
|
||||
Westfall,7: 19-21,3,2,3390,46.411668147220254,46.411668147220254,92.82333629444051,46.411668147220254,36.5
|
||||
Wetlands,7: 19-21,8,2,6205,26.648894532194912,70.57294012382732,146.96995432149998,48.98998477383333,42.2
|
||||
Winter Veil,1: 1-3,4,0,10,0.0,0.0,0.0,,inf
|
||||
Winter Veil,4: 10-12,1,0,0,0.0,0.0,0.0,,
|
||||
Winter Veil,7: 19-21,1,0,0,0.0,0.0,0.0,,
|
||||
Zephras Isle,1: 1-3,13,4,1475,14.526626524171727,14.526626524171727,41.88673899354562,3.2220568456573555,35.2
|
||||
Zephras Isle,2: 4-6,27,8,8110,35.71619407858668,35.71619407858668,184.01279337048854,6.815288643351427,44.1
|
||||
Zephras Isle,3: 7-9,25,14,11665,113.71564109511881,114.56678585476223,346.74531378109714,13.869812551243886,33.6
|
||||
Zephras Isle,4: 10-12,44,20,26290,224.09935785103906,187.10360409621305,623.7704107429465,14.50628862192899,42.1
|
||||
Zephras Isle,5: 13-15,8,4,3590,64.72751277403864,64.72751277403864,132.76863385323347,22.12810564220558,27.0
|
||||
|
3
quest_analyzer/requirements.txt
Normal file
3
quest_analyzer/requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
pandas
|
||||
numpy
|
||||
sklearn
|
||||
BIN
quest_analyzer/resources/Durotar.jpg
Normal file
BIN
quest_analyzer/resources/Durotar.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 137 KiB |
BIN
quest_analyzer/resources/Mulgore.jpg
Normal file
BIN
quest_analyzer/resources/Mulgore.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 121 KiB |
BIN
quest_analyzer/resources/Tirisfal_Glades.jpg
Normal file
BIN
quest_analyzer/resources/Tirisfal_Glades.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 133 KiB |
BIN
quest_analyzer/resources/Zephras_Isle.jpg
Normal file
BIN
quest_analyzer/resources/Zephras_Isle.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 131 KiB |
5443
quest_analyzer/resources/quests.csv
Normal file
5443
quest_analyzer/resources/quests.csv
Normal file
File diff suppressed because it is too large
Load Diff
5442
quest_analyzer/resources/quests.jsonl
Normal file
5442
quest_analyzer/resources/quests.jsonl
Normal file
File diff suppressed because one or more lines are too long
43
quest_analyzer/resources/scales.csv
Normal file
43
quest_analyzer/resources/scales.csv
Normal file
@@ -0,0 +1,43 @@
|
||||
zone,continent,area_km2,area_sq_mi,estimate,notes
|
||||
The Barrens,Kalimdor,12.3,4.8,False,
|
||||
Tanaris,Kalimdor,10.5,4.0,False,
|
||||
Winterspring,Kalimdor,9.8,3.8,False,
|
||||
Feralas,Kalimdor,7.8,3.0,False,
|
||||
Silithus,Kalimdor,6.2,2.4,False,
|
||||
Un'Goro Crater,Kalimdor,5.1,2.0,False,
|
||||
Azshara,Kalimdor,4.9,1.9,False,
|
||||
Ashenvale,Kalimdor,4.8,1.8,False,
|
||||
Mulgore,Kalimdor,4.6,1.7,False,
|
||||
Durotar,Kalimdor,4.2,1.6,False,
|
||||
Desolace,Kalimdor,4.1,1.5,False,
|
||||
Dustwallow Marsh,Kalimdor,3.9,1.5,False,
|
||||
Thousand Needles,Kalimdor,3.8,1.4,False,
|
||||
Felwood,Kalimdor,3.7,1.4,False,
|
||||
Stonetalon Mountains,Kalimdor,3.5,1.3,False,
|
||||
Darkshore,Kalimdor,3.3,1.2,False,
|
||||
Teldrassil,Kalimdor,2.8,1.1,False,
|
||||
Moonglade,Kalimdor,1.3,0.5,False,
|
||||
Mount Hyjal,Kalimdor,3.6,1.4,True,Forever zone; level 60
|
||||
Shen'dralas,Kalimdor,3.0,1.2,True,Forever zone
|
||||
Eastern Plaguelands,Eastern Kingdoms,5.6,2.2,False,
|
||||
Wetlands,Eastern Kingdoms,4.4,1.7,False,
|
||||
Stranglethorn Vale,Eastern Kingdoms,4.0,1.5,False,
|
||||
Tirisfal Glades,Eastern Kingdoms,3.7,1.4,False,
|
||||
Western Plaguelands,Eastern Kingdoms,3.4,1.3,False,
|
||||
Elwynn Forest,Eastern Kingdoms,3.3,1.2,False,
|
||||
The Hinterlands,Eastern Kingdoms,3.2,1.2,False,
|
||||
Arathi Highlands,Eastern Kingdoms,2.9,1.1,False,
|
||||
Alterac Mountains & Hillsbrad Foothills,Eastern Kingdoms,2.8,1.1,False,combined; separate zones in quest data
|
||||
Westfall,Eastern Kingdoms,2.6,1.0,False,
|
||||
Duskwood,Eastern Kingdoms,2.5,0.96,False,
|
||||
Loch Modan,Eastern Kingdoms,2.4,0.9,False,
|
||||
Silverpine Forest,Eastern Kingdoms,2.3,0.8,False,
|
||||
Badlands,Eastern Kingdoms,2.1,0.8,False,
|
||||
Swamp of Sorrows,Eastern Kingdoms,2.0,0.7,False,
|
||||
Burning Steppes,Eastern Kingdoms,1.9,0.7,False,
|
||||
Redridge Mountains,Eastern Kingdoms,1.8,0.7,False,
|
||||
Blasted Lands,Eastern Kingdoms,1.7,0.6,False,
|
||||
Searing Gorge,Eastern Kingdoms,1.3,0.5,False,
|
||||
Deadwind Pass,Eastern Kingdoms,1.0,0.4,False,upper bound (< 1.0)
|
||||
Riverglades,Eastern Kingdoms,4.0,1.5,True,Forever zone; levels 35-45
|
||||
Zephras Isle,Skywall,2.5,0.97,True,Forever zone; Skyborne start 1-12
|
||||
|
Reference in New Issue
Block a user