{
"cells": [
{
"cell_type": "code",
"execution_count": 93,
"id": "8eac6073",
"metadata": {},
"outputs": [],
"source": [
"import sqlite3\n",
"\n",
"import pandas as pd\n",
"import plotly.io as pio\n",
"from plotly import express as px\n",
"\n",
"pio.renderers.default = \"plotly_mimetype+notebook_connected\""
]
},
{
"cell_type": "code",
"execution_count": 94,
"id": "b5fca0c7",
"metadata": {},
"outputs": [],
"source": [
"db_file = \"thaumaturge_dpr.db\"\n",
"\n",
"\n",
"def query(query: str) -> pd.DataFrame:\n",
" con = sqlite3.connect(db_file)\n",
" df = pd.read_sql_query(query, con)\n",
" con.close()\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 95,
"id": "033c5462",
"metadata": {},
"outputs": [],
"source": [
"seed_query = \"\"\"\n",
"DROP TABLE IF EXISTS player;\n",
"CREATE TABLE player (\n",
" level INTEGER,\n",
" charisma INTEGER,\n",
" strength INTEGER,\n",
" esoteric_lore_training INTEGER,\n",
" weapon_proficiency INTEGER,\n",
" weapon_specialization INTEGER,\n",
" weapon_tracking INTEGER,\n",
" weapon_damage_dice INTEGER\n",
");\n",
"INSERT INTO player (\n",
" level,\n",
" charisma,\n",
" strength,\n",
" esoteric_lore_training,\n",
" weapon_proficiency,\n",
" weapon_specialization,\n",
" weapon_tracking,\n",
" weapon_damage_dice\n",
") VALUES\n",
"(1,4,3,2,2,0,0,1),\n",
"(2,4,3,2,2,0,1,1),\n",
"(3,4,3,4,2,0,1,1),\n",
"(4,4,3,4,2,0,1,2),\n",
"(5,4,4,4,4,2,1,2),\n",
"(6,4,4,4,4,2,1,2),\n",
"(7,4,4,6,4,2,1,2),\n",
"(8,4,4,6,4,2,1,2),\n",
"(9,4,4,6,4,2,1,2),\n",
"(10,5,4,6,4,2,2,2),\n",
"(11,5,4,6,4,2,2,2),\n",
"(12,5,4,6,4,2,2,3),\n",
"(13,5,4,6,6,3,2,3),\n",
"(14,5,4,6,6,3,2,3),\n",
"(15,5,5,8,6,3,2,3),\n",
"(16,5,5,8,6,3,3,3),\n",
"(17,5,5,8,6,3,3,3),\n",
"(18,5,5,8,6,3,3,3),\n",
"(19,5,5,8,6,3,3,4),\n",
"(20,6,5,8,6,3,3,4);\n",
"\n",
"DROP TABLE IF EXISTS monster;\n",
"CREATE TABLE monster (\n",
" level INTEGER,\n",
" extreme_ac INTEGER,\n",
" hard_ac INTEGER,\n",
" moderate_ac INTEGER,\n",
" low_ac INTEGER,\n",
" dc INTEGER\n",
");\n",
"delete from monster\n",
";\n",
"INSERT INTO monster (level, extreme_ac, hard_ac, moderate_ac, low_ac, dc)\n",
"VALUES\n",
"(0,19,16,15,13,14),\n",
"(1,19,16,15,13,15),\n",
"(2,21,18,17,15,16),\n",
"(3,22,19,18,16,18),\n",
"(4,24,21,20,18,19),\n",
"(5,25,22,21,19,20),\n",
"(6,27,24,23,21,22),\n",
"(7,28,25,24,22,23),\n",
"(8,30,27,26,24,24),\n",
"(9,31,28,27,25,26),\n",
"(10,33,30,29,27,27),\n",
"(11,34,31,30,28,28),\n",
"(12,36,33,32,30,30),\n",
"(13,37,34,33,31,31),\n",
"(14,39,36,35,33,32),\n",
"(15,40,37,36,34,34),\n",
"(16,42,39,38,36,35),\n",
"(17,43,40,39,37,36),\n",
"(18,45,42,41,39,38),\n",
"(19,46,43,42,40,39),\n",
"(20,48,45,44,42,40),\n",
"(21,49,46,45,43,42),\n",
"(22,51,48,47,45,44),\n",
"(23,52,49,48,46,46),\n",
"(24,54,51,50,48,48);\n",
"\n",
"DROP TABLE IF EXISTS level_diff;\n",
"CREATE TABLE level_diff (\n",
" value INTEGER\n",
");\n",
"INSERT INTO level_diff\n",
"(value)\n",
"VALUES\n",
"(-4),\n",
"(-3),\n",
"(-2),\n",
"(-1),\n",
"(0),\n",
"(1),\n",
"(2),\n",
"(3),\n",
"(4);\n",
"\n",
"\n",
"DROP TABLE IF EXISTS weapon_die;\n",
"CREATE TABLE weapon_die (\n",
" die TEXT,\n",
" value DECIMAL(1,2)\n",
");\n",
"INSERT INTO weapon_die\n",
"(die, value)\n",
"VALUES\n",
"('d4', '2.5'),\n",
"('d6', '3.5'),\n",
"('d8', '4.5'),\n",
"('d10', '5.5')\n",
"\"\"\"\n",
"\n",
"con = sqlite3.connect(db_file)\n",
"with con:\n",
" for q in seed_query.split(\";\"):\n",
" con.execute(q + \";\")\n",
"con.close()"
]
},
{
"cell_type": "code",
"execution_count": 96,
"id": "a9ea4e4d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" \n",
" \n",
" "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"hovertemplate": "Monster Level=%{x}
Monster DC=%{y}