import sqlite3 from flask import Flask, render_template, jsonify from collections import defaultdict import os app = Flask(__name__) def load_pokemon_data(): pokemon_list = [] conn = sqlite3.connect('pokemon_forms.db') cursor = conn.cursor() # First query: Get all Pokémon data cursor.execute(''' WITH EarliestGamePerPokemon AS ( SELECT e.pfic, MIN(g.generation) as min_generation, MIN(g.id) as earliest_game_id FROM encounters e JOIN games g ON e.game_id = g.id GROUP BY e.pfic ) SELECT pf.national_dex, pf.name, pf.form_name, pf.PFIC, pf.generation, ps.storable_in_home, g.name as earliest_game, m.icon_path as mark_icon, m.id as mark_id, pf.is_baby_form FROM pokemon_forms pf JOIN pokemon_storage ps ON pf.PFIC = ps.PFIC LEFT JOIN EarliestGamePerPokemon eg ON pf.PFIC = eg.pfic LEFT JOIN games g ON eg.earliest_game_id = g.id LEFT JOIN mark_game_associations mga ON g.id = mga.game_id LEFT JOIN marks m ON mga.mark_id = m.id WHERE ps.storable_in_home = 1 ORDER BY pf.PFIC ''') pokemon_data = cursor.fetchall() # Second query: Get evolution chain with generation info cursor.execute(''' WITH RECURSIVE EvolutionChain AS ( SELECT to_pfic AS PFIC, from_pfic, pf.generation FROM evolution_chains ec JOIN pokemon_forms pf ON ec.to_pfic = pf.PFIC UNION ALL SELECT ec.to_pfic, e.from_pfic, pf.generation FROM evolution_chains ec JOIN EvolutionChain e ON ec.from_pfic = e.PFIC JOIN pokemon_forms pf ON ec.to_pfic = pf.PFIC ) SELECT PFIC, MIN(from_pfic) AS base_pfic, MIN(generation) AS base_generation FROM EvolutionChain GROUP BY PFIC ''') evolution_data = {row[0]: (row[1], row[2]) for row in cursor.fetchall()} # Process the data current_group = [] current_generation = None current_dex_number = None pokemon_forms = [] for row in pokemon_data: national_dex, name, form_name, pfic, generation, storable_in_home, earliest_game, mark_icon, mark_id, is_baby_form = row # Find the base form for the mark, considering generation base_pfic = pfic base_generation = generation while base_pfic in evolution_data: prev_pfic, prev_generation = evolution_data[base_pfic] if prev_pfic is not None and prev_generation == base_generation: base_pfic = prev_pfic else: break # If the base form is different, we need to fetch its earliest game and mark if base_pfic != pfic: cursor.execute(''' SELECT g.name, m.icon_path, m.id FROM encounters e JOIN games g ON e.game_id = g.id LEFT JOIN mark_game_associations mga ON g.id = mga.game_id LEFT JOIN marks m ON mga.mark_id = m.id WHERE e.pfic = ? AND g.generation = ? ORDER BY g.id LIMIT 1 ''', (base_pfic, base_generation)) base_data = cursor.fetchone() if base_data: earliest_game, mark_icon, mark_id = base_data pokemon = { 'pfic': pfic, 'ID': national_dex, 'Name': name, 'Form': form_name if form_name else "Default", 'Image': f"images/pokemon/{pfic}.png", 'IsDefault': form_name is None or form_name == '', 'Generation': generation, 'EarliestGame': earliest_game, 'StorableInHome': storable_in_home, 'MarkIcon': mark_icon, 'MarkID': mark_id } if national_dex != current_dex_number: if pokemon_forms: for form in pokemon_forms: current_group.append(form) if len(current_group) == 30: pokemon_list.append(current_group) current_group = [] pokemon_forms = [] current_dex_number = national_dex if form_name is None or form_name == '': if current_generation is None or generation != current_generation: if current_group: while len(current_group) < 30: current_group.append(None) # Add empty slots pokemon_list.append(current_group) current_group = [] current_generation = generation pokemon_forms.append(pokemon) # Add the last set of forms for form in pokemon_forms: current_group.append(form) if len(current_group) == 30: pokemon_list.append(current_group) current_group = [] # Add any remaining Pokémon if current_group: while len(current_group) < 30: current_group.append(None) # Add empty slots to the last group pokemon_list.append(current_group) conn.close() return pokemon_list @app.route('/') def index(): pokemon_list = load_pokemon_data() return render_template('index.html', grouped_pokemon=pokemon_list) @app.route('/pokemon/') def pokemon_details(pfic): conn = sqlite3.connect('pokemon_forms.db') cursor = conn.cursor() cursor.execute(''' SELECT pf.form_name, g.name, g.id as game_id, e.location, e.day, e.time, e.dual_slot, e.static_encounter, e.static_encounter_count, e.extra_text, e.stars, e.fishing, e.rods, e.starter FROM pokemon_forms pf JOIN encounters e ON pf.PFIC = e.pfic JOIN games g ON e.game_id = g.id WHERE pf.pfic = ? ORDER BY g.id, pf.form_name, e.location ''', (pfic,)) encounters = [ { 'form': form, 'game': game, 'game_id': game_id, 'location': location, 'day': day, 'time': time, 'dual_slot': dual_slot, 'static_encounter': static_encounter, 'static_encounter_count': static_encounter_count, 'extra_text': extra_text, 'stars': stars, 'fishing': fishing, 'rods': rods, 'starter': starter } for form, game, game_id, location, day, time, dual_slot, static_encounter, static_encounter_count, extra_text, stars, fishing, rods, starter in cursor.fetchall() ] conn.close() return jsonify(encounters) if __name__ == '__main__': extra_files = ['.'] extra_dirs = ['./templates/', './static/'] for extra_dir in extra_dirs: for dirname, dirs, files in os.walk(extra_dir): for filename in files: filename = os.path.join(dirname, filename) if os.path.isfile(filename): extra_files.append(filename) app.run(debug=True, extra_files=extra_files)