Spaces:
Running
Running
Ron Au
commited on
Commit
·
5c239ba
1
Parent(s):
8a661fa
Initial D
Browse files- README.md +3 -6
- app.py +61 -0
- lists/attacks.json +0 -0
- lists/descriptions.json +0 -0
- lists/names.json +907 -0
- lists/species.json +0 -0
- models/.gitkeep +0 -0
- modules/details.py +124 -0
- modules/inference.py +61 -0
- requirements.txt +2 -0
- static/favicon.ico +0 -0
- static/index.js +239 -0
- static/style.css +370 -0
- templates/index.html +22 -0
README.md
CHANGED
|
@@ -1,12 +1,9 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
colorTo: yellow
|
| 6 |
sdk: gradio
|
| 7 |
app_file: app.py
|
| 8 |
pinned: false
|
| 9 |
-
license: mit
|
| 10 |
---
|
| 11 |
-
|
| 12 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces#reference
|
|
|
|
| 1 |
---
|
| 2 |
+
title: This Pokémon Does Not Exist
|
| 3 |
+
emoji: 🧬
|
| 4 |
+
colorFrom: blue
|
| 5 |
colorTo: yellow
|
| 6 |
sdk: gradio
|
| 7 |
app_file: app.py
|
| 8 |
pinned: false
|
|
|
|
| 9 |
---
|
|
|
|
|
|
app.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import time
|
| 2 |
+
from flask import Flask, jsonify, render_template, request
|
| 3 |
+
|
| 4 |
+
from modules.details import load_lists, rand_details
|
| 5 |
+
from modules.inference import generate_image
|
| 6 |
+
|
| 7 |
+
app = Flask(__name__)
|
| 8 |
+
app.config['TEMPLATES_AUTO_RELOAD'] = True
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
@app.route('/')
|
| 12 |
+
def index():
|
| 13 |
+
return render_template('index.html', **rand_details())
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
tasks = {}
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
@app.route('/task/create')
|
| 20 |
+
def create_task():
|
| 21 |
+
prompt = request.args.get('prompt') or "покемон"
|
| 22 |
+
|
| 23 |
+
task_id = f"{str(time.time())}_{prompt}"
|
| 24 |
+
|
| 25 |
+
tasks[task_id] = {
|
| 26 |
+
"task_id": task_id,
|
| 27 |
+
"prompt": prompt,
|
| 28 |
+
"status": "pending",
|
| 29 |
+
"poll_count": 0,
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
return jsonify(tasks[task_id])
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
@app.route('/task/queue')
|
| 36 |
+
def queue_task():
|
| 37 |
+
task_id = request.args.get('task_id')
|
| 38 |
+
|
| 39 |
+
tasks[task_id]["value"] = generate_image(tasks[task_id]["prompt"])
|
| 40 |
+
|
| 41 |
+
tasks[task_id]["status"] = "complete"
|
| 42 |
+
|
| 43 |
+
return jsonify(tasks[task_id])
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
@app.route('/task/poll')
|
| 47 |
+
def poll_task():
|
| 48 |
+
task_id = request.args.get('task_id')
|
| 49 |
+
|
| 50 |
+
tasks[task_id]["poll_count"] += 1
|
| 51 |
+
|
| 52 |
+
return jsonify(tasks[task_id])
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
@app.route('/details')
|
| 56 |
+
def generate_details():
|
| 57 |
+
return jsonify(rand_details())
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
if __name__ == '__main__':
|
| 61 |
+
app.run(host='0.0.0.0', port=7860)
|
lists/attacks.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
lists/descriptions.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
lists/names.json
ADDED
|
@@ -0,0 +1,907 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
"Bulbasaur",
|
| 3 |
+
"Ivysaur",
|
| 4 |
+
"Venusaur",
|
| 5 |
+
"Charmander",
|
| 6 |
+
"Charmeleon",
|
| 7 |
+
"Charizard",
|
| 8 |
+
"Squirtle",
|
| 9 |
+
"Wartortle",
|
| 10 |
+
"Blastoise",
|
| 11 |
+
"Caterpie",
|
| 12 |
+
"Metapod",
|
| 13 |
+
"Butterfree",
|
| 14 |
+
"Weedle",
|
| 15 |
+
"Kakuna",
|
| 16 |
+
"Beedrill",
|
| 17 |
+
"Pidgey",
|
| 18 |
+
"Pidgeotto",
|
| 19 |
+
"Pidgeot",
|
| 20 |
+
"Rattata",
|
| 21 |
+
"Raticate",
|
| 22 |
+
"Spearow",
|
| 23 |
+
"Fearow",
|
| 24 |
+
"Ekans",
|
| 25 |
+
"Arbok",
|
| 26 |
+
"Pikachu",
|
| 27 |
+
"Raichu",
|
| 28 |
+
"Sandshrew",
|
| 29 |
+
"Sandslash",
|
| 30 |
+
"Nidoran♀",
|
| 31 |
+
"Nidorina",
|
| 32 |
+
"Nidoqueen",
|
| 33 |
+
"Nidoran♂",
|
| 34 |
+
"Nidorino",
|
| 35 |
+
"Nidoking",
|
| 36 |
+
"Clefairy",
|
| 37 |
+
"Clefable",
|
| 38 |
+
"Vulpix",
|
| 39 |
+
"Ninetales",
|
| 40 |
+
"Jigglypuff",
|
| 41 |
+
"Wigglytuff",
|
| 42 |
+
"Zubat",
|
| 43 |
+
"Golbat",
|
| 44 |
+
"Oddish",
|
| 45 |
+
"Gloom",
|
| 46 |
+
"Vileplume",
|
| 47 |
+
"Paras",
|
| 48 |
+
"Parasect",
|
| 49 |
+
"Venonat",
|
| 50 |
+
"Venomoth",
|
| 51 |
+
"Diglett",
|
| 52 |
+
"Dugtrio",
|
| 53 |
+
"Meowth",
|
| 54 |
+
"Persian",
|
| 55 |
+
"Psyduck",
|
| 56 |
+
"Golduck",
|
| 57 |
+
"Mankey",
|
| 58 |
+
"Primeape",
|
| 59 |
+
"Growlithe",
|
| 60 |
+
"Arcanine",
|
| 61 |
+
"Poliwag",
|
| 62 |
+
"Poliwhirl",
|
| 63 |
+
"Poliwrath",
|
| 64 |
+
"Abra",
|
| 65 |
+
"Kadabra",
|
| 66 |
+
"Alakazam",
|
| 67 |
+
"Machop",
|
| 68 |
+
"Machoke",
|
| 69 |
+
"Machamp",
|
| 70 |
+
"Bellsprout",
|
| 71 |
+
"Weepinbell",
|
| 72 |
+
"Victreebel",
|
| 73 |
+
"Tentacool",
|
| 74 |
+
"Tentacruel",
|
| 75 |
+
"Geodude",
|
| 76 |
+
"Graveler",
|
| 77 |
+
"Golem",
|
| 78 |
+
"Ponyta",
|
| 79 |
+
"Rapidash",
|
| 80 |
+
"Slowpoke",
|
| 81 |
+
"Slowbro",
|
| 82 |
+
"Magnemite",
|
| 83 |
+
"Magneton",
|
| 84 |
+
"Farfetch'd",
|
| 85 |
+
"Doduo",
|
| 86 |
+
"Dodrio",
|
| 87 |
+
"Seel",
|
| 88 |
+
"Dewgong",
|
| 89 |
+
"Grimer",
|
| 90 |
+
"Muk",
|
| 91 |
+
"Shellder",
|
| 92 |
+
"Cloyster",
|
| 93 |
+
"Gastly",
|
| 94 |
+
"Haunter",
|
| 95 |
+
"Gengar",
|
| 96 |
+
"Onix",
|
| 97 |
+
"Drowzee",
|
| 98 |
+
"Hypno",
|
| 99 |
+
"Krabby",
|
| 100 |
+
"Kingler",
|
| 101 |
+
"Voltorb",
|
| 102 |
+
"Electrode",
|
| 103 |
+
"Exeggcute",
|
| 104 |
+
"Exeggutor",
|
| 105 |
+
"Cubone",
|
| 106 |
+
"Marowak",
|
| 107 |
+
"Hitmonlee",
|
| 108 |
+
"Hitmonchan",
|
| 109 |
+
"Lickitung",
|
| 110 |
+
"Koffing",
|
| 111 |
+
"Weezing",
|
| 112 |
+
"Rhyhorn",
|
| 113 |
+
"Rhydon",
|
| 114 |
+
"Chansey",
|
| 115 |
+
"Tangela",
|
| 116 |
+
"Kangaskhan",
|
| 117 |
+
"Horsea",
|
| 118 |
+
"Seadra",
|
| 119 |
+
"Goldeen",
|
| 120 |
+
"Seaking",
|
| 121 |
+
"Staryu",
|
| 122 |
+
"Starmie",
|
| 123 |
+
"Mr. Mime",
|
| 124 |
+
"Scyther",
|
| 125 |
+
"Jynx",
|
| 126 |
+
"Electabuzz",
|
| 127 |
+
"Magmar",
|
| 128 |
+
"Pinsir",
|
| 129 |
+
"Tauros",
|
| 130 |
+
"Magikarp",
|
| 131 |
+
"Gyarados",
|
| 132 |
+
"Lapras",
|
| 133 |
+
"Ditto",
|
| 134 |
+
"Eevee",
|
| 135 |
+
"Vaporeon",
|
| 136 |
+
"Jolteon",
|
| 137 |
+
"Flareon",
|
| 138 |
+
"Porygon",
|
| 139 |
+
"Omanyte",
|
| 140 |
+
"Omastar",
|
| 141 |
+
"Kabuto",
|
| 142 |
+
"Kabutops",
|
| 143 |
+
"Aerodactyl",
|
| 144 |
+
"Snorlax",
|
| 145 |
+
"Articuno",
|
| 146 |
+
"Zapdos",
|
| 147 |
+
"Moltres",
|
| 148 |
+
"Dratini",
|
| 149 |
+
"Dragonair",
|
| 150 |
+
"Dragonite",
|
| 151 |
+
"Mewtwo",
|
| 152 |
+
"Mew",
|
| 153 |
+
"Chikorita",
|
| 154 |
+
"Bayleef",
|
| 155 |
+
"Meganium",
|
| 156 |
+
"Cyndaquil",
|
| 157 |
+
"Quilava",
|
| 158 |
+
"Typhlosion",
|
| 159 |
+
"Totodile",
|
| 160 |
+
"Croconaw",
|
| 161 |
+
"Feraligatr",
|
| 162 |
+
"Sentret",
|
| 163 |
+
"Furret",
|
| 164 |
+
"Hoothoot",
|
| 165 |
+
"Noctowl",
|
| 166 |
+
"Ledyba",
|
| 167 |
+
"Ledian",
|
| 168 |
+
"Spinarak",
|
| 169 |
+
"Ariados",
|
| 170 |
+
"Crobat",
|
| 171 |
+
"Chinchou",
|
| 172 |
+
"Lanturn",
|
| 173 |
+
"Pichu",
|
| 174 |
+
"Cleffa",
|
| 175 |
+
"Igglybuff",
|
| 176 |
+
"Togepi",
|
| 177 |
+
"Togetic",
|
| 178 |
+
"Natu",
|
| 179 |
+
"Xatu",
|
| 180 |
+
"Mareep",
|
| 181 |
+
"Flaaffy",
|
| 182 |
+
"Ampharos",
|
| 183 |
+
"Bellossom",
|
| 184 |
+
"Marill",
|
| 185 |
+
"Azumarill",
|
| 186 |
+
"Sudowoodo",
|
| 187 |
+
"Politoed",
|
| 188 |
+
"Hoppip",
|
| 189 |
+
"Skiploom",
|
| 190 |
+
"Jumpluff",
|
| 191 |
+
"Aipom",
|
| 192 |
+
"Sunkern",
|
| 193 |
+
"Sunflora",
|
| 194 |
+
"Yanma",
|
| 195 |
+
"Wooper",
|
| 196 |
+
"Quagsire",
|
| 197 |
+
"Espeon",
|
| 198 |
+
"Umbreon",
|
| 199 |
+
"Murkrow",
|
| 200 |
+
"Slowking",
|
| 201 |
+
"Misdreavus",
|
| 202 |
+
"Unown",
|
| 203 |
+
"Wobbuffet",
|
| 204 |
+
"Girafarig",
|
| 205 |
+
"Pineco",
|
| 206 |
+
"Forretress",
|
| 207 |
+
"Dunsparce",
|
| 208 |
+
"Gligar",
|
| 209 |
+
"Steelix",
|
| 210 |
+
"Snubbull",
|
| 211 |
+
"Granbull",
|
| 212 |
+
"Qwilfish",
|
| 213 |
+
"Scizor",
|
| 214 |
+
"Shuckle",
|
| 215 |
+
"Heracross",
|
| 216 |
+
"Sneasel",
|
| 217 |
+
"Teddiursa",
|
| 218 |
+
"Ursaring",
|
| 219 |
+
"Slugma",
|
| 220 |
+
"Magcargo",
|
| 221 |
+
"Swinub",
|
| 222 |
+
"Piloswine",
|
| 223 |
+
"Corsola",
|
| 224 |
+
"Remoraid",
|
| 225 |
+
"Octillery",
|
| 226 |
+
"Delibird",
|
| 227 |
+
"Mantine",
|
| 228 |
+
"Skarmory",
|
| 229 |
+
"Houndour",
|
| 230 |
+
"Houndoom",
|
| 231 |
+
"Kingdra",
|
| 232 |
+
"Phanpy",
|
| 233 |
+
"Donphan",
|
| 234 |
+
"Porygon2",
|
| 235 |
+
"Stantler",
|
| 236 |
+
"Smeargle",
|
| 237 |
+
"Tyrogue",
|
| 238 |
+
"Hitmontop",
|
| 239 |
+
"Smoochum",
|
| 240 |
+
"Elekid",
|
| 241 |
+
"Magby",
|
| 242 |
+
"Miltank",
|
| 243 |
+
"Blissey",
|
| 244 |
+
"Raikou",
|
| 245 |
+
"Entei",
|
| 246 |
+
"Suicune",
|
| 247 |
+
"Larvitar",
|
| 248 |
+
"Pupitar",
|
| 249 |
+
"Tyranitar",
|
| 250 |
+
"Lugia",
|
| 251 |
+
"Ho-Oh",
|
| 252 |
+
"Celebi",
|
| 253 |
+
"Treecko",
|
| 254 |
+
"Grovyle",
|
| 255 |
+
"Sceptile",
|
| 256 |
+
"Torchic",
|
| 257 |
+
"Combusken",
|
| 258 |
+
"Blaziken",
|
| 259 |
+
"Mudkip",
|
| 260 |
+
"Marshtomp",
|
| 261 |
+
"Swampert",
|
| 262 |
+
"Poochyena",
|
| 263 |
+
"Mightyena",
|
| 264 |
+
"Zigzagoon",
|
| 265 |
+
"Linoone",
|
| 266 |
+
"Wurmple",
|
| 267 |
+
"Silcoon",
|
| 268 |
+
"Beautifly",
|
| 269 |
+
"Cascoon",
|
| 270 |
+
"Dustox",
|
| 271 |
+
"Lotad",
|
| 272 |
+
"Lombre",
|
| 273 |
+
"Ludicolo",
|
| 274 |
+
"Seedot",
|
| 275 |
+
"Nuzleaf",
|
| 276 |
+
"Shiftry",
|
| 277 |
+
"Taillow",
|
| 278 |
+
"Swellow",
|
| 279 |
+
"Wingull",
|
| 280 |
+
"Pelipper",
|
| 281 |
+
"Ralts",
|
| 282 |
+
"Kirlia",
|
| 283 |
+
"Gardevoir",
|
| 284 |
+
"Surskit",
|
| 285 |
+
"Masquerain",
|
| 286 |
+
"Shroomish",
|
| 287 |
+
"Breloom",
|
| 288 |
+
"Slakoth",
|
| 289 |
+
"Vigoroth",
|
| 290 |
+
"Slaking",
|
| 291 |
+
"Nincada",
|
| 292 |
+
"Ninjask",
|
| 293 |
+
"Shedinja",
|
| 294 |
+
"Whismur",
|
| 295 |
+
"Loudred",
|
| 296 |
+
"Exploud",
|
| 297 |
+
"Makuhita",
|
| 298 |
+
"Hariyama",
|
| 299 |
+
"Azurill",
|
| 300 |
+
"Nosepass",
|
| 301 |
+
"Skitty",
|
| 302 |
+
"Delcatty",
|
| 303 |
+
"Sableye",
|
| 304 |
+
"Mawile",
|
| 305 |
+
"Aron",
|
| 306 |
+
"Lairon",
|
| 307 |
+
"Aggron",
|
| 308 |
+
"Meditite",
|
| 309 |
+
"Medicham",
|
| 310 |
+
"Electrike",
|
| 311 |
+
"Manectric",
|
| 312 |
+
"Plusle",
|
| 313 |
+
"Minun",
|
| 314 |
+
"Volbeat",
|
| 315 |
+
"Illumise",
|
| 316 |
+
"Roselia",
|
| 317 |
+
"Gulpin",
|
| 318 |
+
"Swalot",
|
| 319 |
+
"Carvanha",
|
| 320 |
+
"Sharpedo",
|
| 321 |
+
"Wailmer",
|
| 322 |
+
"Wailord",
|
| 323 |
+
"Numel",
|
| 324 |
+
"Camerupt",
|
| 325 |
+
"Torkoal",
|
| 326 |
+
"Spoink",
|
| 327 |
+
"Grumpig",
|
| 328 |
+
"Spinda",
|
| 329 |
+
"Trapinch",
|
| 330 |
+
"Vibrava",
|
| 331 |
+
"Flygon",
|
| 332 |
+
"Cacnea",
|
| 333 |
+
"Cacturne",
|
| 334 |
+
"Swablu",
|
| 335 |
+
"Altaria",
|
| 336 |
+
"Zangoose",
|
| 337 |
+
"Seviper",
|
| 338 |
+
"Lunatone",
|
| 339 |
+
"Solrock",
|
| 340 |
+
"Barboach",
|
| 341 |
+
"Whiscash",
|
| 342 |
+
"Corphish",
|
| 343 |
+
"Crawdaunt",
|
| 344 |
+
"Baltoy",
|
| 345 |
+
"Claydol",
|
| 346 |
+
"Lileep",
|
| 347 |
+
"Cradily",
|
| 348 |
+
"Anorith",
|
| 349 |
+
"Armaldo",
|
| 350 |
+
"Feebas",
|
| 351 |
+
"Milotic",
|
| 352 |
+
"Castform",
|
| 353 |
+
"Kecleon",
|
| 354 |
+
"Shuppet",
|
| 355 |
+
"Banette",
|
| 356 |
+
"Duskull",
|
| 357 |
+
"Dusclops",
|
| 358 |
+
"Tropius",
|
| 359 |
+
"Chimecho",
|
| 360 |
+
"Absol",
|
| 361 |
+
"Wynaut",
|
| 362 |
+
"Snorunt",
|
| 363 |
+
"Glalie",
|
| 364 |
+
"Spheal",
|
| 365 |
+
"Sealeo",
|
| 366 |
+
"Walrein",
|
| 367 |
+
"Clamperl",
|
| 368 |
+
"Huntail",
|
| 369 |
+
"Gorebyss",
|
| 370 |
+
"Relicanth",
|
| 371 |
+
"Luvdisc",
|
| 372 |
+
"Bagon",
|
| 373 |
+
"Shelgon",
|
| 374 |
+
"Salamence",
|
| 375 |
+
"Beldum",
|
| 376 |
+
"Metang",
|
| 377 |
+
"Metagross",
|
| 378 |
+
"Regirock",
|
| 379 |
+
"Regice",
|
| 380 |
+
"Registeel",
|
| 381 |
+
"Latias",
|
| 382 |
+
"Latios",
|
| 383 |
+
"Kyogre",
|
| 384 |
+
"Groudon",
|
| 385 |
+
"Rayquaza",
|
| 386 |
+
"Jirachi",
|
| 387 |
+
"Deoxys",
|
| 388 |
+
"Turtwig",
|
| 389 |
+
"Grotle",
|
| 390 |
+
"Torterra",
|
| 391 |
+
"Chimchar",
|
| 392 |
+
"Monferno",
|
| 393 |
+
"Infernape",
|
| 394 |
+
"Piplup",
|
| 395 |
+
"Prinplup",
|
| 396 |
+
"Empoleon",
|
| 397 |
+
"Starly",
|
| 398 |
+
"Staravia",
|
| 399 |
+
"Staraptor",
|
| 400 |
+
"Bidoof",
|
| 401 |
+
"Bibarel",
|
| 402 |
+
"Kricketot",
|
| 403 |
+
"Kricketune",
|
| 404 |
+
"Shinx",
|
| 405 |
+
"Luxio",
|
| 406 |
+
"Luxray",
|
| 407 |
+
"Budew",
|
| 408 |
+
"Roserade",
|
| 409 |
+
"Cranidos",
|
| 410 |
+
"Rampardos",
|
| 411 |
+
"Shieldon",
|
| 412 |
+
"Bastiodon",
|
| 413 |
+
"Burmy",
|
| 414 |
+
"Wormadam",
|
| 415 |
+
"Mothim",
|
| 416 |
+
"Combee",
|
| 417 |
+
"Vespiquen",
|
| 418 |
+
"Pachirisu",
|
| 419 |
+
"Buizel",
|
| 420 |
+
"Floatzel",
|
| 421 |
+
"Cherubi",
|
| 422 |
+
"Cherrim",
|
| 423 |
+
"Shellos",
|
| 424 |
+
"Gastrodon",
|
| 425 |
+
"Ambipom",
|
| 426 |
+
"Drifloon",
|
| 427 |
+
"Drifblim",
|
| 428 |
+
"Buneary",
|
| 429 |
+
"Lopunny",
|
| 430 |
+
"Mismagius",
|
| 431 |
+
"Honchkrow",
|
| 432 |
+
"Glameow",
|
| 433 |
+
"Purugly",
|
| 434 |
+
"Chingling",
|
| 435 |
+
"Stunky",
|
| 436 |
+
"Skuntank",
|
| 437 |
+
"Bronzor",
|
| 438 |
+
"Bronzong",
|
| 439 |
+
"Bonsly",
|
| 440 |
+
"Mime Jr.",
|
| 441 |
+
"Happiny",
|
| 442 |
+
"Chatot",
|
| 443 |
+
"Spiritomb",
|
| 444 |
+
"Gible",
|
| 445 |
+
"Gabite",
|
| 446 |
+
"Garchomp",
|
| 447 |
+
"Munchlax",
|
| 448 |
+
"Riolu",
|
| 449 |
+
"Lucario",
|
| 450 |
+
"Hippopotas",
|
| 451 |
+
"Hippowdon",
|
| 452 |
+
"Skorupi",
|
| 453 |
+
"Drapion",
|
| 454 |
+
"Croagunk",
|
| 455 |
+
"Toxicroak",
|
| 456 |
+
"Carnivine",
|
| 457 |
+
"Finneon",
|
| 458 |
+
"Lumineon",
|
| 459 |
+
"Mantyke",
|
| 460 |
+
"Snover",
|
| 461 |
+
"Abomasnow",
|
| 462 |
+
"Weavile",
|
| 463 |
+
"Magnezone",
|
| 464 |
+
"Lickilicky",
|
| 465 |
+
"Rhyperior",
|
| 466 |
+
"Tangrowth",
|
| 467 |
+
"Electivire",
|
| 468 |
+
"Magmortar",
|
| 469 |
+
"Togekiss",
|
| 470 |
+
"Yanmega",
|
| 471 |
+
"Leafeon",
|
| 472 |
+
"Glaceon",
|
| 473 |
+
"Gliscor",
|
| 474 |
+
"Mamoswine",
|
| 475 |
+
"Porygon-Z",
|
| 476 |
+
"Gallade",
|
| 477 |
+
"Probopass",
|
| 478 |
+
"Dusknoir",
|
| 479 |
+
"Froslass",
|
| 480 |
+
"Rotom",
|
| 481 |
+
"Uxie",
|
| 482 |
+
"Mesprit",
|
| 483 |
+
"Azelf",
|
| 484 |
+
"Dialga",
|
| 485 |
+
"Palkia",
|
| 486 |
+
"Heatran",
|
| 487 |
+
"Regigigas",
|
| 488 |
+
"Giratina",
|
| 489 |
+
"Cresselia",
|
| 490 |
+
"Phione",
|
| 491 |
+
"Manaphy",
|
| 492 |
+
"Darkrai",
|
| 493 |
+
"Shaymin",
|
| 494 |
+
"Arceus",
|
| 495 |
+
"Victini",
|
| 496 |
+
"Snivy",
|
| 497 |
+
"Servine",
|
| 498 |
+
"Serperior",
|
| 499 |
+
"Tepig",
|
| 500 |
+
"Pignite",
|
| 501 |
+
"Emboar",
|
| 502 |
+
"Oshawott",
|
| 503 |
+
"Dewott",
|
| 504 |
+
"Samurott",
|
| 505 |
+
"Patrat",
|
| 506 |
+
"Watchog",
|
| 507 |
+
"Lillipup",
|
| 508 |
+
"Herdier",
|
| 509 |
+
"Stoutland",
|
| 510 |
+
"Purrloin",
|
| 511 |
+
"Liepard",
|
| 512 |
+
"Pansage",
|
| 513 |
+
"Simisage",
|
| 514 |
+
"Pansear",
|
| 515 |
+
"Simisear",
|
| 516 |
+
"Panpour",
|
| 517 |
+
"Simipour",
|
| 518 |
+
"Munna",
|
| 519 |
+
"Musharna",
|
| 520 |
+
"Pidove",
|
| 521 |
+
"Tranquill",
|
| 522 |
+
"Unfezant",
|
| 523 |
+
"Blitzle",
|
| 524 |
+
"Zebstrika",
|
| 525 |
+
"Roggenrola",
|
| 526 |
+
"Boldore",
|
| 527 |
+
"Gigalith",
|
| 528 |
+
"Woobat",
|
| 529 |
+
"Swoobat",
|
| 530 |
+
"Drilbur",
|
| 531 |
+
"Excadrill",
|
| 532 |
+
"Audino",
|
| 533 |
+
"Timburr",
|
| 534 |
+
"Gurdurr",
|
| 535 |
+
"Conkeldurr",
|
| 536 |
+
"Tympole",
|
| 537 |
+
"Palpitoad",
|
| 538 |
+
"Seismitoad",
|
| 539 |
+
"Throh",
|
| 540 |
+
"Sawk",
|
| 541 |
+
"Sewaddle",
|
| 542 |
+
"Swadloon",
|
| 543 |
+
"Leavanny",
|
| 544 |
+
"Venipede",
|
| 545 |
+
"Whirlipede",
|
| 546 |
+
"Scolipede",
|
| 547 |
+
"Cottonee",
|
| 548 |
+
"Whimsicott",
|
| 549 |
+
"Petilil",
|
| 550 |
+
"Lilligant",
|
| 551 |
+
"Basculin",
|
| 552 |
+
"Sandile",
|
| 553 |
+
"Krokorok",
|
| 554 |
+
"Krookodile",
|
| 555 |
+
"Darumaka",
|
| 556 |
+
"Darmanitan",
|
| 557 |
+
"Maractus",
|
| 558 |
+
"Dwebble",
|
| 559 |
+
"Crustle",
|
| 560 |
+
"Scraggy",
|
| 561 |
+
"Scrafty",
|
| 562 |
+
"Sigilyph",
|
| 563 |
+
"Yamask",
|
| 564 |
+
"Cofagrigus",
|
| 565 |
+
"Tirtouga",
|
| 566 |
+
"Carracosta",
|
| 567 |
+
"Archen",
|
| 568 |
+
"Archeops",
|
| 569 |
+
"Trubbish",
|
| 570 |
+
"Garbodor",
|
| 571 |
+
"Zorua",
|
| 572 |
+
"Zoroark",
|
| 573 |
+
"Minccino",
|
| 574 |
+
"Cinccino",
|
| 575 |
+
"Gothita",
|
| 576 |
+
"Gothorita",
|
| 577 |
+
"Gothitelle",
|
| 578 |
+
"Solosis",
|
| 579 |
+
"Duosion",
|
| 580 |
+
"Reuniclus",
|
| 581 |
+
"Ducklett",
|
| 582 |
+
"Swanna",
|
| 583 |
+
"Vanillite",
|
| 584 |
+
"Vanillish",
|
| 585 |
+
"Vanilluxe",
|
| 586 |
+
"Deerling",
|
| 587 |
+
"Sawsbuck",
|
| 588 |
+
"Emolga",
|
| 589 |
+
"Karrablast",
|
| 590 |
+
"Escavalier",
|
| 591 |
+
"Foongus",
|
| 592 |
+
"Amoonguss",
|
| 593 |
+
"Frillish",
|
| 594 |
+
"Jellicent",
|
| 595 |
+
"Alomomola",
|
| 596 |
+
"Joltik",
|
| 597 |
+
"Galvantula",
|
| 598 |
+
"Ferroseed",
|
| 599 |
+
"Ferrothorn",
|
| 600 |
+
"Klink",
|
| 601 |
+
"Klang",
|
| 602 |
+
"Klinklang",
|
| 603 |
+
"Tynamo",
|
| 604 |
+
"Eelektrik",
|
| 605 |
+
"Eelektross",
|
| 606 |
+
"Elgyem",
|
| 607 |
+
"Beheeyem",
|
| 608 |
+
"Litwick",
|
| 609 |
+
"Lampent",
|
| 610 |
+
"Chandelure",
|
| 611 |
+
"Axew",
|
| 612 |
+
"Fraxure",
|
| 613 |
+
"Haxorus",
|
| 614 |
+
"Cubchoo",
|
| 615 |
+
"Beartic",
|
| 616 |
+
"Cryogonal",
|
| 617 |
+
"Shelmet",
|
| 618 |
+
"Accelgor",
|
| 619 |
+
"Stunfisk",
|
| 620 |
+
"Mienfoo",
|
| 621 |
+
"Mienshao",
|
| 622 |
+
"Druddigon",
|
| 623 |
+
"Golett",
|
| 624 |
+
"Golurk",
|
| 625 |
+
"Pawniard",
|
| 626 |
+
"Bisharp",
|
| 627 |
+
"Bouffalant",
|
| 628 |
+
"Rufflet",
|
| 629 |
+
"Braviary",
|
| 630 |
+
"Vullaby",
|
| 631 |
+
"Mandibuzz",
|
| 632 |
+
"Heatmor",
|
| 633 |
+
"Durant",
|
| 634 |
+
"Deino",
|
| 635 |
+
"Zweilous",
|
| 636 |
+
"Hydreigon",
|
| 637 |
+
"Larvesta",
|
| 638 |
+
"Volcarona",
|
| 639 |
+
"Cobalion",
|
| 640 |
+
"Terrakion",
|
| 641 |
+
"Virizion",
|
| 642 |
+
"Tornadus",
|
| 643 |
+
"Thundurus",
|
| 644 |
+
"Reshiram",
|
| 645 |
+
"Zekrom",
|
| 646 |
+
"Landorus",
|
| 647 |
+
"Kyurem",
|
| 648 |
+
"Keldeo",
|
| 649 |
+
"Meloetta",
|
| 650 |
+
"Genesect",
|
| 651 |
+
"Chespin",
|
| 652 |
+
"Quilladin",
|
| 653 |
+
"Chesnaught",
|
| 654 |
+
"Fennekin",
|
| 655 |
+
"Braixen",
|
| 656 |
+
"Delphox",
|
| 657 |
+
"Froakie",
|
| 658 |
+
"Frogadier",
|
| 659 |
+
"Greninja",
|
| 660 |
+
"Bunnelby",
|
| 661 |
+
"Diggersby",
|
| 662 |
+
"Fletchling",
|
| 663 |
+
"Fletchinder",
|
| 664 |
+
"Talonflame",
|
| 665 |
+
"Scatterbug",
|
| 666 |
+
"Spewpa",
|
| 667 |
+
"Vivillon",
|
| 668 |
+
"Litleo",
|
| 669 |
+
"Pyroar",
|
| 670 |
+
"Flabébé",
|
| 671 |
+
"Floette",
|
| 672 |
+
"Florges",
|
| 673 |
+
"Skiddo",
|
| 674 |
+
"Gogoat",
|
| 675 |
+
"Pancham",
|
| 676 |
+
"Pangoro",
|
| 677 |
+
"Furfrou",
|
| 678 |
+
"Espurr",
|
| 679 |
+
"Meowstic",
|
| 680 |
+
"Honedge",
|
| 681 |
+
"Doublade",
|
| 682 |
+
"Aegislash",
|
| 683 |
+
"Spritzee",
|
| 684 |
+
"Aromatisse",
|
| 685 |
+
"Swirlix",
|
| 686 |
+
"Slurpuff",
|
| 687 |
+
"Inkay",
|
| 688 |
+
"Malamar",
|
| 689 |
+
"Binacle",
|
| 690 |
+
"Barbaracle",
|
| 691 |
+
"Skrelp",
|
| 692 |
+
"Dragalge",
|
| 693 |
+
"Clauncher",
|
| 694 |
+
"Clawitzer",
|
| 695 |
+
"Helioptile",
|
| 696 |
+
"Heliolisk",
|
| 697 |
+
"Tyrunt",
|
| 698 |
+
"Tyrantrum",
|
| 699 |
+
"Amaura",
|
| 700 |
+
"Aurorus",
|
| 701 |
+
"Sylveon",
|
| 702 |
+
"Hawlucha",
|
| 703 |
+
"Dedenne",
|
| 704 |
+
"Carbink",
|
| 705 |
+
"Goomy",
|
| 706 |
+
"Sliggoo",
|
| 707 |
+
"Goodra",
|
| 708 |
+
"Klefki",
|
| 709 |
+
"Phantump",
|
| 710 |
+
"Trevenant",
|
| 711 |
+
"Pumpkaboo",
|
| 712 |
+
"Gourgeist",
|
| 713 |
+
"Bergmite",
|
| 714 |
+
"Avalugg",
|
| 715 |
+
"Noibat",
|
| 716 |
+
"Noivern",
|
| 717 |
+
"Xerneas",
|
| 718 |
+
"Yveltal",
|
| 719 |
+
"Zygarde",
|
| 720 |
+
"Diancie",
|
| 721 |
+
"Hoopa",
|
| 722 |
+
"Volcanion",
|
| 723 |
+
"Rowlet",
|
| 724 |
+
"Dartrix",
|
| 725 |
+
"Decidueye",
|
| 726 |
+
"Litten",
|
| 727 |
+
"Torracat",
|
| 728 |
+
"Incineroar",
|
| 729 |
+
"Popplio",
|
| 730 |
+
"Brionne",
|
| 731 |
+
"Primarina",
|
| 732 |
+
"Pikipek",
|
| 733 |
+
"Trumbeak",
|
| 734 |
+
"Toucannon",
|
| 735 |
+
"Yungoos",
|
| 736 |
+
"Gumshoos",
|
| 737 |
+
"Grubbin",
|
| 738 |
+
"Charjabug",
|
| 739 |
+
"Vikavolt",
|
| 740 |
+
"Crabrawler",
|
| 741 |
+
"Crabominable",
|
| 742 |
+
"Oricorio",
|
| 743 |
+
"Cutiefly",
|
| 744 |
+
"Ribombee",
|
| 745 |
+
"Rockruff",
|
| 746 |
+
"Lycanroc",
|
| 747 |
+
"Wishiwashi",
|
| 748 |
+
"Mareanie",
|
| 749 |
+
"Toxapex",
|
| 750 |
+
"Mudbray",
|
| 751 |
+
"Mudsdale",
|
| 752 |
+
"Dewpider",
|
| 753 |
+
"Araquanid",
|
| 754 |
+
"Fomantis",
|
| 755 |
+
"Lurantis",
|
| 756 |
+
"Morelull",
|
| 757 |
+
"Shiinotic",
|
| 758 |
+
"Salandit",
|
| 759 |
+
"Salazzle",
|
| 760 |
+
"Stufful",
|
| 761 |
+
"Bewear",
|
| 762 |
+
"Bounsweet",
|
| 763 |
+
"Steenee",
|
| 764 |
+
"Tsareena",
|
| 765 |
+
"Comfey",
|
| 766 |
+
"Oranguru",
|
| 767 |
+
"Passimian",
|
| 768 |
+
"Wimpod",
|
| 769 |
+
"Golisopod",
|
| 770 |
+
"Sandygast",
|
| 771 |
+
"Palossand",
|
| 772 |
+
"Pyukumuku",
|
| 773 |
+
"Type: Null",
|
| 774 |
+
"Silvally",
|
| 775 |
+
"Minior",
|
| 776 |
+
"Komala",
|
| 777 |
+
"Turtonator",
|
| 778 |
+
"Togedemaru",
|
| 779 |
+
"Mimikyu",
|
| 780 |
+
"Bruxish",
|
| 781 |
+
"Drampa",
|
| 782 |
+
"Dhelmise",
|
| 783 |
+
"Jangmo-o",
|
| 784 |
+
"Hakamo-o",
|
| 785 |
+
"Kommo-o",
|
| 786 |
+
"Tapu Koko",
|
| 787 |
+
"Tapu Lele",
|
| 788 |
+
"Tapu Bulu",
|
| 789 |
+
"Tapu Fini",
|
| 790 |
+
"Cosmog",
|
| 791 |
+
"Cosmoem",
|
| 792 |
+
"Solgaleo",
|
| 793 |
+
"Lunala",
|
| 794 |
+
"Nihilego",
|
| 795 |
+
"Buzzwole",
|
| 796 |
+
"Pheromosa",
|
| 797 |
+
"Xurkitree",
|
| 798 |
+
"Celesteela",
|
| 799 |
+
"Kartana",
|
| 800 |
+
"Guzzlord",
|
| 801 |
+
"Necrozma",
|
| 802 |
+
"Magearna",
|
| 803 |
+
"Marshadow",
|
| 804 |
+
"Poipole",
|
| 805 |
+
"Naganadel",
|
| 806 |
+
"Stakataka",
|
| 807 |
+
"Blacephalon",
|
| 808 |
+
"Zeraora",
|
| 809 |
+
"Meltan",
|
| 810 |
+
"Melmetal",
|
| 811 |
+
"Grookey",
|
| 812 |
+
"Thwackey",
|
| 813 |
+
"Rillaboom",
|
| 814 |
+
"Scorbunny",
|
| 815 |
+
"Raboot",
|
| 816 |
+
"Cinderace",
|
| 817 |
+
"Sobble",
|
| 818 |
+
"Drizzile",
|
| 819 |
+
"Inteleon",
|
| 820 |
+
"Skwovet",
|
| 821 |
+
"Greedent",
|
| 822 |
+
"Rookidee",
|
| 823 |
+
"Corvisquire",
|
| 824 |
+
"Corviknight",
|
| 825 |
+
"Blipbug",
|
| 826 |
+
"Dottler",
|
| 827 |
+
"Orbeetle",
|
| 828 |
+
"Nickit",
|
| 829 |
+
"Thievul",
|
| 830 |
+
"Gossifleur",
|
| 831 |
+
"Eldegoss",
|
| 832 |
+
"Wooloo",
|
| 833 |
+
"Dubwool",
|
| 834 |
+
"Chewtle",
|
| 835 |
+
"Drednaw",
|
| 836 |
+
"Yamper",
|
| 837 |
+
"Boltund",
|
| 838 |
+
"Rolycoly",
|
| 839 |
+
"Carkol",
|
| 840 |
+
"Coalossal",
|
| 841 |
+
"Applin",
|
| 842 |
+
"Flapple",
|
| 843 |
+
"Appletun",
|
| 844 |
+
"Silicobra",
|
| 845 |
+
"Sandaconda",
|
| 846 |
+
"Cramorant",
|
| 847 |
+
"Arrokuda",
|
| 848 |
+
"Barraskewda",
|
| 849 |
+
"Toxel",
|
| 850 |
+
"Toxtricity",
|
| 851 |
+
"Sizzlipede",
|
| 852 |
+
"Centiskorch",
|
| 853 |
+
"Clobbopus",
|
| 854 |
+
"Grapploct",
|
| 855 |
+
"Sinistea",
|
| 856 |
+
"Polteageist",
|
| 857 |
+
"Hatenna",
|
| 858 |
+
"Hattrem",
|
| 859 |
+
"Hatterene",
|
| 860 |
+
"Impidimp",
|
| 861 |
+
"Morgrem",
|
| 862 |
+
"Grimmsnarl",
|
| 863 |
+
"Obstagoon",
|
| 864 |
+
"Perrserker",
|
| 865 |
+
"Cursola",
|
| 866 |
+
"Sirfetch'd",
|
| 867 |
+
"Mr. Rime",
|
| 868 |
+
"Runerigus",
|
| 869 |
+
"Milcery",
|
| 870 |
+
"Alcremie",
|
| 871 |
+
"Falinks",
|
| 872 |
+
"Pincurchin",
|
| 873 |
+
"Snom",
|
| 874 |
+
"Frosmoth",
|
| 875 |
+
"Stonjourner",
|
| 876 |
+
"Eiscue",
|
| 877 |
+
"Indeedee",
|
| 878 |
+
"Morpeko",
|
| 879 |
+
"Cufant",
|
| 880 |
+
"Copperajah",
|
| 881 |
+
"Dracozolt",
|
| 882 |
+
"Arctozolt",
|
| 883 |
+
"Dracovish",
|
| 884 |
+
"Arctovish",
|
| 885 |
+
"Duraludon",
|
| 886 |
+
"Dreepy",
|
| 887 |
+
"Drakloak",
|
| 888 |
+
"Dragapult",
|
| 889 |
+
"Zacian",
|
| 890 |
+
"Zamazenta",
|
| 891 |
+
"Eternatus",
|
| 892 |
+
"Kubfu",
|
| 893 |
+
"Urshifu",
|
| 894 |
+
"Zarude",
|
| 895 |
+
"Regieleki",
|
| 896 |
+
"Regidrago",
|
| 897 |
+
"Glastrier",
|
| 898 |
+
"Spectrier",
|
| 899 |
+
"Calyrex",
|
| 900 |
+
"Wyrdeer",
|
| 901 |
+
"Kleavor",
|
| 902 |
+
"Ursaluna",
|
| 903 |
+
"Basculegion",
|
| 904 |
+
"Sneasler",
|
| 905 |
+
"Overqwil",
|
| 906 |
+
"Enamorus"
|
| 907 |
+
]
|
lists/species.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
models/.gitkeep
ADDED
|
File without changes
|
modules/details.py
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import random
|
| 2 |
+
import json
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
def load_lists(list_names, base_dir="lists"):
|
| 6 |
+
lists = {}
|
| 7 |
+
|
| 8 |
+
for name in list_names:
|
| 9 |
+
with open(f"{base_dir}/{name}.json", "r") as f:
|
| 10 |
+
lists[name] = json.load(f)
|
| 11 |
+
|
| 12 |
+
return lists
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
def rand_name(names):
|
| 16 |
+
return random.choices(names)[0]
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
def rand_hp():
|
| 20 |
+
# Weights from https://bulbapedia.bulbagarden.net/wiki/HP_(TCG)
|
| 21 |
+
|
| 22 |
+
hp_range = list(range(30, 340 + 1, 10))
|
| 23 |
+
|
| 24 |
+
weights = [156, 542, 1264, 1727, 1477, 1232, 1008, 640, 436, 515, 469, 279, 188,
|
| 25 |
+
131, 132, 132, 56, 66, 97, 74, 23, 24, 25, 7, 15, 6, 0, 12, 18, 35, 18, 3]
|
| 26 |
+
|
| 27 |
+
return random.choices(hp_range, weights)[0]
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
def rand_type(types=['Grass', 'Fire', 'Water', 'Lightning', 'Fighting',
|
| 31 |
+
'Psychic', 'Colorless', 'Darkness', 'Metal', 'Dragon', 'Fairy'], can_be_none=False):
|
| 32 |
+
if can_be_none:
|
| 33 |
+
return random.choices([random.choices(types)[0], None])[0]
|
| 34 |
+
else:
|
| 35 |
+
return random.choices(types)[0]
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
def rand_species(species):
|
| 39 |
+
random_species = random.choices(species)[0]
|
| 40 |
+
|
| 41 |
+
return f'{random_species.capitalize()}'
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
def rand_length():
|
| 45 |
+
# Weights from https://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_height
|
| 46 |
+
|
| 47 |
+
feet_ranges = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '16',
|
| 48 |
+
'17', '18', '19', '20', '21', '22', '23', '24', '26', '28', '30', '32', '34', '35', '47', '65', '328']
|
| 49 |
+
|
| 50 |
+
weights = [30, 220, 230, 176, 130, 109, 63, 27, 17, 17, 5, 5, 6,
|
| 51 |
+
4, 3, 2, 2, 2, 1, 2, 3, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1]
|
| 52 |
+
|
| 53 |
+
return {
|
| 54 |
+
"feet": random.choices(feet_ranges, weights)[0],
|
| 55 |
+
"inches": random.randrange(0, 11 + 1, 1)
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def rand_weight():
|
| 60 |
+
# Weights from https://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_weight
|
| 61 |
+
|
| 62 |
+
weight_ranges = [{"start": 1, "end": 22}, {"start": 22, "end": 44}, {"start": 44, "end": 55}, {"start": 55, "end": 110}, {"start": 110, "end": 132}, {"start": 132, "end": 218}, {"start": 218, "end": 220}, {"start": 221, "end": 226}, {
|
| 63 |
+
"start": 226, "end": 331}, {"start": 331, "end": 441}, {"start": 441, "end": 451}, {"start": 452, "end": 661}, {"start": 661, "end": 677}, {"start": 677, "end": 793}, {"start": 794, "end": 903}, {"start": 903, "end": 2204}]
|
| 64 |
+
|
| 65 |
+
# 'weights' as in statistical weightings
|
| 66 |
+
weights = [271, 145, 53, 204, 57, 122, 1, 11, 57, 28, 7, 34, 4, 17, 5, 31]
|
| 67 |
+
|
| 68 |
+
start, end = random.choices(weight_ranges, weights)[0].values()
|
| 69 |
+
|
| 70 |
+
random_weight = random.randrange(start, end + 1, 1)
|
| 71 |
+
|
| 72 |
+
return f'{random_weight} lbs.'
|
| 73 |
+
|
| 74 |
+
|
| 75 |
+
def rand_attack(attacks, name):
|
| 76 |
+
random_attack = random.choices(attacks)[0]
|
| 77 |
+
random_attack['text'] = random_attack['text'].replace('<name>', name)
|
| 78 |
+
|
| 79 |
+
return random_attack
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
def rand_attacks(attacks, name, n=2):
|
| 83 |
+
attack1 = rand_attack(attacks, name)
|
| 84 |
+
|
| 85 |
+
if n > 1:
|
| 86 |
+
attack2 = rand_attack(attacks, name)
|
| 87 |
+
while attack1['text'] == attack2['text']:
|
| 88 |
+
attack2 = rand_attack(attacks, name)
|
| 89 |
+
return [attack1, attack2]
|
| 90 |
+
else:
|
| 91 |
+
return [attack1]
|
| 92 |
+
|
| 93 |
+
return attacks
|
| 94 |
+
|
| 95 |
+
|
| 96 |
+
def rand_retreat():
|
| 97 |
+
return random.randrange(0, 4, 1)
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
def rand_description(descriptions):
|
| 101 |
+
return random.choices(descriptions)[0]
|
| 102 |
+
|
| 103 |
+
|
| 104 |
+
def rand_rarity():
|
| 105 |
+
return random.choices(['●', '◆', '★'], [10, 5, 1])[0]
|
| 106 |
+
|
| 107 |
+
|
| 108 |
+
def rand_details(lists=load_lists(['attacks', 'descriptions', 'names', 'species'])):
|
| 109 |
+
name = rand_name(lists["names"])
|
| 110 |
+
|
| 111 |
+
return {
|
| 112 |
+
"name": name,
|
| 113 |
+
"hp": rand_hp(),
|
| 114 |
+
"energy_type": rand_type(),
|
| 115 |
+
"species": rand_species(lists["species"]),
|
| 116 |
+
"length": rand_length(),
|
| 117 |
+
"weight": rand_weight(),
|
| 118 |
+
"attacks": rand_attacks(lists["attacks"], name),
|
| 119 |
+
"weakness": rand_type(can_be_none=True),
|
| 120 |
+
"resistance": rand_type(can_be_none=True),
|
| 121 |
+
"retreat": rand_retreat(),
|
| 122 |
+
"description": rand_description(lists["descriptions"]),
|
| 123 |
+
"rarity": rand_rarity(),
|
| 124 |
+
}
|
modules/inference.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
print("Preparing for inference...") # noqa
|
| 2 |
+
|
| 3 |
+
from rudalle.pipelines import generate_images
|
| 4 |
+
from rudalle import get_rudalle_model, get_tokenizer, get_vae
|
| 5 |
+
from huggingface_hub import hf_hub_url, cached_download
|
| 6 |
+
import torch
|
| 7 |
+
from io import BytesIO
|
| 8 |
+
import base64
|
| 9 |
+
|
| 10 |
+
print(f"GPUs available: {torch.cuda.device_count()}")
|
| 11 |
+
device = "cuda" if torch.cuda.is_available() else "cpu"
|
| 12 |
+
fp16 = torch.cuda.is_available()
|
| 13 |
+
|
| 14 |
+
file_dir = "./models"
|
| 15 |
+
file_name = "pytorch_model.bin"
|
| 16 |
+
config_file_url = hf_hub_url(
|
| 17 |
+
repo_id="minimaxir/ai-generated-pokemon-rudalle", filename=file_name)
|
| 18 |
+
cached_download(config_file_url, cache_dir=file_dir, force_filename=file_name)
|
| 19 |
+
|
| 20 |
+
model = get_rudalle_model('Malevich', pretrained=False,
|
| 21 |
+
fp16=fp16, device=device)
|
| 22 |
+
model.load_state_dict(torch.load(
|
| 23 |
+
f"{file_dir}/{file_name}", map_location=f"{'cuda:0' if torch.cuda.is_available() else 'cpu'}"))
|
| 24 |
+
|
| 25 |
+
vae = get_vae().to(device)
|
| 26 |
+
tokenizer = get_tokenizer()
|
| 27 |
+
|
| 28 |
+
print("Ready for inference")
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
def english_to_russian(english_string):
|
| 32 |
+
word_map = {
|
| 33 |
+
"grass": "трава",
|
| 34 |
+
"fire": "Пожар",
|
| 35 |
+
"water": "вода",
|
| 36 |
+
"lightning": "молния",
|
| 37 |
+
"fighting": "борьба",
|
| 38 |
+
"psychic": "психический",
|
| 39 |
+
"colorless": "бесцветный",
|
| 40 |
+
"darkness": "темнота",
|
| 41 |
+
"metal": "металл",
|
| 42 |
+
"dragon": "Дракон",
|
| 43 |
+
"fairy": "сказочный"
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
return word_map[english_string.lower()]
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
def generate_image(prompt):
|
| 50 |
+
if prompt.lower() in ['grass', 'fire', 'water', 'lightning', 'fighting', 'psychic', 'colorless', 'darkness', 'metal', 'dragon', 'fairy']:
|
| 51 |
+
prompt = english_to_russian(prompt)
|
| 52 |
+
|
| 53 |
+
result, _ = generate_images(
|
| 54 |
+
prompt, tokenizer, model, vae, top_k=2048, images_num=1, top_p=0.995)
|
| 55 |
+
|
| 56 |
+
buffer = BytesIO()
|
| 57 |
+
result[0].save(buffer, format="PNG")
|
| 58 |
+
base64_bytes = base64.b64encode(buffer.getvalue())
|
| 59 |
+
base64_string = base64_bytes.decode("UTF-8")
|
| 60 |
+
|
| 61 |
+
return "data:image/png;base64," + base64_string
|
requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Flask
|
| 2 |
+
rudalle==1.0.0
|
static/favicon.ico
ADDED
|
|
static/index.js
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* HTML generation */
|
| 2 |
+
|
| 3 |
+
const TYPES = {
|
| 4 |
+
Grass: '🍃',
|
| 5 |
+
Fire: '🔥',
|
| 6 |
+
Water: '💧',
|
| 7 |
+
Lightning: '⚡',
|
| 8 |
+
Fighting: '✊',
|
| 9 |
+
Psychic: '👁️',
|
| 10 |
+
Colorless: '⭐',
|
| 11 |
+
Darkness: '🌑',
|
| 12 |
+
Metal: '⚙️',
|
| 13 |
+
Dragon: '🐲',
|
| 14 |
+
Fairy: '🧚',
|
| 15 |
+
};
|
| 16 |
+
|
| 17 |
+
const energyHTML = (type, types = TYPES) => {
|
| 18 |
+
return `<span title="${type} energy" class="energy ${type.toLowerCase()}">${types[type]}</span>`;
|
| 19 |
+
};
|
| 20 |
+
|
| 21 |
+
const attackDescriptionHTML = (text) => {
|
| 22 |
+
if (!text) {
|
| 23 |
+
return '';
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
let fontSize;
|
| 27 |
+
|
| 28 |
+
if (text.length > 185) {
|
| 29 |
+
fontSize = 0.7;
|
| 30 |
+
} else if (text.length > 140) {
|
| 31 |
+
fontSize = 0.8;
|
| 32 |
+
} else if (text.length > 90) {
|
| 33 |
+
fontSize = 0.9;
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
return `<span class="attack-details"${fontSize ? ` style="font-size: ${fontSize.toString()}em"` : ''}>${text}</span>`;
|
| 37 |
+
};
|
| 38 |
+
|
| 39 |
+
const attackRowsHTML = (attacks) => {
|
| 40 |
+
return attacks
|
| 41 |
+
.map((attack) => {
|
| 42 |
+
const { cost, damage, name, text } = attack;
|
| 43 |
+
|
| 44 |
+
return `
|
| 45 |
+
<li class="attacks-row grid-three">
|
| 46 |
+
<div class="attack-cost">
|
| 47 |
+
${cost.map((energy) => energyHTML(energy)).join('')}
|
| 48 |
+
</div>
|
| 49 |
+
<span class="attack-text">
|
| 50 |
+
<span class="attack-name">${name}</span>
|
| 51 |
+
${attackDescriptionHTML(text)}
|
| 52 |
+
</span>
|
| 53 |
+
<span class="attack-damage">${damage ? damage : ''}</span>
|
| 54 |
+
</li>
|
| 55 |
+
<hr role="presentation" />`;
|
| 56 |
+
})
|
| 57 |
+
.join('');
|
| 58 |
+
};
|
| 59 |
+
|
| 60 |
+
const cardHTML = (details) => {
|
| 61 |
+
const { hp, energy_type, species, length, weight, attacks, weakness, resistance, retreat, description, rarity } =
|
| 62 |
+
details;
|
| 63 |
+
|
| 64 |
+
const poke_name = details.name; // `name` would be reserved JS word
|
| 65 |
+
|
| 66 |
+
return `
|
| 67 |
+
<div class="pokecard ${energy_type.toLowerCase()}" data-displayed="true">
|
| 68 |
+
<p class="evolves">Basic Pokémon</p>
|
| 69 |
+
<header>
|
| 70 |
+
<h1 class="name">${poke_name}</h1>
|
| 71 |
+
<div>
|
| 72 |
+
<span class="hp">${hp} HP</span>
|
| 73 |
+
${energyHTML(energy_type)}
|
| 74 |
+
</div>
|
| 75 |
+
</header>
|
| 76 |
+
<img class="picture frame" alt="AI generated Pokémon called ${poke_name}" />
|
| 77 |
+
<div class="species frame">
|
| 78 |
+
${species} Pokémon. Length: ${length.feet}'${length.inches}", Weight: ${weight}
|
| 79 |
+
</div>
|
| 80 |
+
<ul class="attacks">
|
| 81 |
+
${attackRowsHTML(attacks)}
|
| 82 |
+
</ul>
|
| 83 |
+
<div class="multipliers">
|
| 84 |
+
<div class="weakness">
|
| 85 |
+
<span>weakness</span>
|
| 86 |
+
${weakness ? energyHTML(weakness) : ''}
|
| 87 |
+
</div>
|
| 88 |
+
<div class="resistance">
|
| 89 |
+
<span>resistance</span>
|
| 90 |
+
${resistance ? energyHTML(resistance) : ''}
|
| 91 |
+
<span class="resistance-total"
|
| 92 |
+
>${resistance ? '-30' : ''}</span
|
| 93 |
+
>
|
| 94 |
+
</div>
|
| 95 |
+
<div class="retreat-cost">
|
| 96 |
+
<span>retreat cost</span>
|
| 97 |
+
<div>${energyHTML('Colorless').repeat(retreat)}</div>
|
| 98 |
+
</div>
|
| 99 |
+
</div>
|
| 100 |
+
<p class="description frame">${description}</p>
|
| 101 |
+
<div class="footer grid-three">
|
| 102 |
+
<span
|
| 103 |
+
><a
|
| 104 |
+
href="https://huggingface.co/minimaxir/ai-generated-pokemon-rudalle"
|
| 105 |
+
>Illus. Max Woolf</a
|
| 106 |
+
></span
|
| 107 |
+
>
|
| 108 |
+
<span><a href="">2022 Hugging Face</a></span>
|
| 109 |
+
<span>${rarity}</span>
|
| 110 |
+
</div>
|
| 111 |
+
</div>`;
|
| 112 |
+
};
|
| 113 |
+
|
| 114 |
+
/* Utility */
|
| 115 |
+
|
| 116 |
+
const getBasePath = () => {
|
| 117 |
+
return document.location.origin + document.location.pathname;
|
| 118 |
+
};
|
| 119 |
+
|
| 120 |
+
const generateDetails = async () => {
|
| 121 |
+
const details = await fetch(`${getBasePath()}/details`);
|
| 122 |
+
return await details.json();
|
| 123 |
+
};
|
| 124 |
+
|
| 125 |
+
const createTask = async (prompt) => {
|
| 126 |
+
const taskResponse = await fetch(`${getBasePath()}task/create?prompt=${prompt}`);
|
| 127 |
+
const task = await taskResponse.json();
|
| 128 |
+
|
| 129 |
+
return task;
|
| 130 |
+
};
|
| 131 |
+
|
| 132 |
+
const queueTask = (task_id) => {
|
| 133 |
+
fetch(`${getBasePath()}task/queue?task_id=${task_id}`);
|
| 134 |
+
};
|
| 135 |
+
|
| 136 |
+
const pollTask = async (task) => {
|
| 137 |
+
const taskResponse = await fetch(`${getBasePath()}task/poll?task_id=${task.task_id}`);
|
| 138 |
+
|
| 139 |
+
return await taskResponse.json();
|
| 140 |
+
};
|
| 141 |
+
|
| 142 |
+
const longPollTask = async (task, interval = 5_000, max) => {
|
| 143 |
+
if (task.status === 'complete' || (max && task.poll_count > max)) {
|
| 144 |
+
return task;
|
| 145 |
+
}
|
| 146 |
+
|
| 147 |
+
const taskResponse = await fetch(`${getBasePath()}task/poll?task_id=${task.task_id}`);
|
| 148 |
+
|
| 149 |
+
task = await taskResponse.json();
|
| 150 |
+
|
| 151 |
+
if (task.status === 'complete' || task.poll_count > max) {
|
| 152 |
+
return task;
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
await new Promise((resolve) => setTimeout(resolve, interval));
|
| 156 |
+
|
| 157 |
+
return await longPollTask(task, interval, max);
|
| 158 |
+
};
|
| 159 |
+
|
| 160 |
+
/* DOM */
|
| 161 |
+
|
| 162 |
+
const generateButton = document.querySelector('button.generate');
|
| 163 |
+
|
| 164 |
+
const rotateCard = () => {
|
| 165 |
+
const RANGE = 0.1;
|
| 166 |
+
const INTERVAL = 13; // ~75 per second
|
| 167 |
+
let previousTime = 0;
|
| 168 |
+
|
| 169 |
+
// Throttle closure
|
| 170 |
+
return (card, containerMouseEvent) => {
|
| 171 |
+
const currentTime = performance.now();
|
| 172 |
+
|
| 173 |
+
if (currentTime - previousTime > INTERVAL) {
|
| 174 |
+
previousTime = currentTime;
|
| 175 |
+
|
| 176 |
+
const rect = card.getBoundingClientRect();
|
| 177 |
+
|
| 178 |
+
const rotateX = (containerMouseEvent.clientY - rect.y - rect.height / 2) * RANGE;
|
| 179 |
+
const rotateY = -(containerMouseEvent.clientX - rect.x - rect.width / 2) * RANGE;
|
| 180 |
+
|
| 181 |
+
card.style.setProperty('--rotate-x', rotateX + 'deg');
|
| 182 |
+
card.style.setProperty('--rotate-y', rotateY + 'deg');
|
| 183 |
+
}
|
| 184 |
+
};
|
| 185 |
+
};
|
| 186 |
+
|
| 187 |
+
const cardRotationInitiator = (renderSection) => {
|
| 188 |
+
let currentCard;
|
| 189 |
+
|
| 190 |
+
return () => {
|
| 191 |
+
let handleMouseMove;
|
| 192 |
+
|
| 193 |
+
if (currentCard) {
|
| 194 |
+
handleMouseMove = rotateCard().bind(null, currentCard);
|
| 195 |
+
renderSection.removeEventListener('mousemove', handleMouseMove, true);
|
| 196 |
+
}
|
| 197 |
+
|
| 198 |
+
const newCard = document.querySelector('.pokecard');
|
| 199 |
+
|
| 200 |
+
currentCard = newCard;
|
| 201 |
+
|
| 202 |
+
handleMouseMove = rotateCard().bind(null, newCard);
|
| 203 |
+
renderSection.addEventListener('mousemove', handleMouseMove, true);
|
| 204 |
+
};
|
| 205 |
+
};
|
| 206 |
+
|
| 207 |
+
generateButton.addEventListener('click', async () => {
|
| 208 |
+
const details = await generateDetails();
|
| 209 |
+
console.log({ details });
|
| 210 |
+
|
| 211 |
+
const renderSection = document.querySelector('section.render');
|
| 212 |
+
const durationSeconds = document.querySelector('.duration > .seconds');
|
| 213 |
+
const initialiseCardRotation = cardRotationInitiator(renderSection);
|
| 214 |
+
let duration = 0.0;
|
| 215 |
+
|
| 216 |
+
try {
|
| 217 |
+
const task = await createTask(details.energy_type);
|
| 218 |
+
|
| 219 |
+
queueTask(task.task_id);
|
| 220 |
+
|
| 221 |
+
const incrementSeconds = setInterval(() => {
|
| 222 |
+
duration += 0.1;
|
| 223 |
+
durationSeconds.textContent = duration.toFixed(1).toString();
|
| 224 |
+
}, 100);
|
| 225 |
+
|
| 226 |
+
const completedTask = await longPollTask(task);
|
| 227 |
+
|
| 228 |
+
clearInterval(incrementSeconds);
|
| 229 |
+
|
| 230 |
+
renderSection.innerHTML = cardHTML(details);
|
| 231 |
+
|
| 232 |
+
const picture = document.querySelector('img.picture');
|
| 233 |
+
picture.src = completedTask.value;
|
| 234 |
+
|
| 235 |
+
initialiseCardRotation();
|
| 236 |
+
} catch (err) {
|
| 237 |
+
console.error(err);
|
| 238 |
+
}
|
| 239 |
+
});
|
static/style.css
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
:root {
|
| 2 |
+
--card-h: 47;
|
| 3 |
+
--card-s: 95%;
|
| 4 |
+
--card-l: 58%;
|
| 5 |
+
--card-color: hsl(var(--card-h) var(--card-s) var(--card-l));
|
| 6 |
+
}
|
| 7 |
+
|
| 8 |
+
html,
|
| 9 |
+
body {
|
| 10 |
+
overflow: scroll;
|
| 11 |
+
}
|
| 12 |
+
|
| 13 |
+
body {
|
| 14 |
+
display: grid;
|
| 15 |
+
place-items: center;
|
| 16 |
+
height: 100vh;
|
| 17 |
+
font-family: 'Gill Sans', 'Gill Sans Mt', 'sans-serif';
|
| 18 |
+
background-color: whitesmoke;
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
.duration {
|
| 22 |
+
text-align: right;
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
button {
|
| 26 |
+
padding: 0.5rem 1rem;
|
| 27 |
+
margin: 1rem;
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
section.render {
|
| 31 |
+
perspective: 100rem;
|
| 32 |
+
margin: 0.5rem;
|
| 33 |
+
height: 40rem;
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
.grass {
|
| 37 |
+
--h: 90;
|
| 38 |
+
--s: 60%;
|
| 39 |
+
--l: 40%;
|
| 40 |
+
}
|
| 41 |
+
.grass.energy {
|
| 42 |
+
filter: contrast(0.75) grayscale(1) sepia(1) saturate(10) hue-rotate(55deg) drop-shadow(0 0 0.1rem green);
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
.fire {
|
| 46 |
+
--h: 0;
|
| 47 |
+
--s: 75%;
|
| 48 |
+
--l: 45%;
|
| 49 |
+
}
|
| 50 |
+
.fire.energy {
|
| 51 |
+
filter: contrast(0.75) grayscale(1) sepia(1) saturate(10) hue-rotate(335deg) drop-shadow(0 0 0.1rem red);
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
.water {
|
| 55 |
+
--h: 210;
|
| 56 |
+
--s: 100%;
|
| 57 |
+
--l: 58%;
|
| 58 |
+
}
|
| 59 |
+
.water.energy {
|
| 60 |
+
filter: contrast(0.75) grayscale(1) sepia(1) saturate(10) hue-rotate(180deg) drop-shadow(0 0 0.1rem cyan);
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
.lightning {
|
| 64 |
+
--h: 50;
|
| 65 |
+
--s: 100%;
|
| 66 |
+
--l: 58%;
|
| 67 |
+
}
|
| 68 |
+
.lightning.energy {
|
| 69 |
+
filter: contrast(0.75) grayscale(1) sepia(1) saturate(10) hue-rotate(5deg) drop-shadow(0 0 0.1rem gold);
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
.fighting {
|
| 73 |
+
--h: 25;
|
| 74 |
+
--s: 72%;
|
| 75 |
+
--l: 36%;
|
| 76 |
+
}
|
| 77 |
+
.fighting.energy {
|
| 78 |
+
filter: contrast(0.75) grayscale(1) sepia(1) saturate(10) hue-rotate(320deg) drop-shadow(0 0 0.1rem brown);
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
.psychic {
|
| 82 |
+
--h: 299;
|
| 83 |
+
--s: 43%;
|
| 84 |
+
--l: 44%;
|
| 85 |
+
}
|
| 86 |
+
.psychic.energy {
|
| 87 |
+
filter: grayscale(1) sepia(1) saturate(10) hue-rotate(240deg) drop-shadow(0 0 0.1rem purple);
|
| 88 |
+
}
|
| 89 |
+
|
| 90 |
+
.colorless {
|
| 91 |
+
--h: 21;
|
| 92 |
+
--s: 27%;
|
| 93 |
+
--l: 85%;
|
| 94 |
+
}
|
| 95 |
+
.colorless.energy {
|
| 96 |
+
font-size: 0.9em;
|
| 97 |
+
border-radius: 50%;
|
| 98 |
+
background-color: hsl(0 0% 100% / 15%);
|
| 99 |
+
filter: contrast(100) grayscale(1) drop-shadow(0 0 0.1rem white);
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
.darkness {
|
| 103 |
+
--h: 100;
|
| 104 |
+
--s: 3%;
|
| 105 |
+
--l: 17%;
|
| 106 |
+
}
|
| 107 |
+
.darkness.energy {
|
| 108 |
+
filter: drop-shadow(0 0 0.1rem black);
|
| 109 |
+
}
|
| 110 |
+
.darkness :not(.species) {
|
| 111 |
+
color: whitesmoke;
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
.metal {
|
| 115 |
+
--h: 240;
|
| 116 |
+
--s: 20%;
|
| 117 |
+
--l: 77%;
|
| 118 |
+
}
|
| 119 |
+
.metal.energy {
|
| 120 |
+
filter: drop-shadow(0 0 0.1rem silver);
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
.dragon {
|
| 124 |
+
--h: 30;
|
| 125 |
+
--s: 6%;
|
| 126 |
+
--l: 44%;
|
| 127 |
+
}
|
| 128 |
+
.dragon.energy {
|
| 129 |
+
filter: contrast(0.75) grayscale(1) sepia(1) saturate(10) hue-rotate(15deg) drop-shadow(0 0 0.1rem gold);
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
.fairy {
|
| 133 |
+
--h: 334;
|
| 134 |
+
--s: 74%;
|
| 135 |
+
--l: 55%;
|
| 136 |
+
}
|
| 137 |
+
.fairy.energy {
|
| 138 |
+
filter: contrast(0.75) grayscale(1) sepia(1) saturate(10) hue-rotate(300deg) drop-shadow(0 0 0.1rem pink);
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
.pokecard,
|
| 142 |
+
.pokecard * {
|
| 143 |
+
box-sizing: border-box;
|
| 144 |
+
}
|
| 145 |
+
|
| 146 |
+
.pokecard {
|
| 147 |
+
--color: hsl(var(--h) var(--s) var(--l));
|
| 148 |
+
--lighter: hsl(var(--h) var(--s) calc(var(--l) + 10%));
|
| 149 |
+
--lightest: hsl(var(--h) var(--s) calc(var(--l) + 30%));
|
| 150 |
+
--rotate-x: 0deg;
|
| 151 |
+
--rotate-y: 0deg;
|
| 152 |
+
--rotate-z: 0deg;
|
| 153 |
+
display: flex;
|
| 154 |
+
flex-direction: column;
|
| 155 |
+
width: 25rem;
|
| 156 |
+
aspect-ratio: 63 / 88;
|
| 157 |
+
padding: 0.5rem 1rem;
|
| 158 |
+
border: 1rem solid;
|
| 159 |
+
border-radius: 0.75rem;
|
| 160 |
+
border-color: var(--card-color);
|
| 161 |
+
background-image: linear-gradient(
|
| 162 |
+
45deg,
|
| 163 |
+
var(--lighter) 0%,
|
| 164 |
+
var(--lightest) 15%,
|
| 165 |
+
var(--lightest) 30%,
|
| 166 |
+
var(--color) 50%,
|
| 167 |
+
var(--lightest) 90%,
|
| 168 |
+
var(--lighter) 100%
|
| 169 |
+
);
|
| 170 |
+
transform-origin: center;
|
| 171 |
+
transform-style: preserve-3d;
|
| 172 |
+
transform: rotateX(var(--rotate-x)) rotateY(var(--rotate-y)) translate3d(10px, 10px, 10px);
|
| 173 |
+
transition: transform 0.5s ease-out;
|
| 174 |
+
}
|
| 175 |
+
|
| 176 |
+
.pokecard[data-displayed='true'] {
|
| 177 |
+
display: flex;
|
| 178 |
+
}
|
| 179 |
+
.pokecard[data-displayed='false'] {
|
| 180 |
+
display: none;
|
| 181 |
+
}
|
| 182 |
+
|
| 183 |
+
.pokecard :where(header, p) {
|
| 184 |
+
font-family: 'Gill Sans', 'Gill Sans Mt', 'sans-serif';
|
| 185 |
+
}
|
| 186 |
+
.pokecard :is(.evolves) {
|
| 187 |
+
font-family: 'Century Gothic', 'sans-serif';
|
| 188 |
+
}
|
| 189 |
+
.pokecard :where(header, p) {
|
| 190 |
+
font-family: 'Gill Sans', 'Gill Sans Mt';
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
.evolves {
|
| 194 |
+
margin: 0;
|
| 195 |
+
font-weight: bold;
|
| 196 |
+
font-size: 0.5rem;
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
header {
|
| 200 |
+
display: flex;
|
| 201 |
+
flex-direction: row;
|
| 202 |
+
justify-content: space-between;
|
| 203 |
+
}
|
| 204 |
+
|
| 205 |
+
header > * {
|
| 206 |
+
display: inline-block;
|
| 207 |
+
}
|
| 208 |
+
|
| 209 |
+
.name {
|
| 210 |
+
justify-self: left;
|
| 211 |
+
font-size: 1.25rem;
|
| 212 |
+
margin: 0;
|
| 213 |
+
}
|
| 214 |
+
|
| 215 |
+
.hp {
|
| 216 |
+
font-size: 1.25rem;
|
| 217 |
+
color: hsl(0 100% 50%);
|
| 218 |
+
}
|
| 219 |
+
|
| 220 |
+
header .energy {
|
| 221 |
+
display: inline-block;
|
| 222 |
+
transform: translateY(-0.15rem);
|
| 223 |
+
}
|
| 224 |
+
|
| 225 |
+
.frame:is(.picture, .species, .description) {
|
| 226 |
+
--lighter: hsl(var(--card-h) var(--card-s) calc(var(--card-l) + 15%));
|
| 227 |
+
--lightest: hsl(var(--card-h) var(--card-s) calc(var(--card-l) + 30%));
|
| 228 |
+
--darker: hsl(var(--card-h) var(--card-s) calc(var(--card-l) - 15%));
|
| 229 |
+
border-color: var(--darker) var(--card-color) var(--lighter);
|
| 230 |
+
}
|
| 231 |
+
|
| 232 |
+
.picture {
|
| 233 |
+
width: 100%;
|
| 234 |
+
aspect-ratio: 4 / 3;
|
| 235 |
+
object-fit: contain;
|
| 236 |
+
background-color: white;
|
| 237 |
+
border: 0.375rem solid;
|
| 238 |
+
box-shadow: 0.25rem 0.25rem 0.5rem black;
|
| 239 |
+
user-select: none;
|
| 240 |
+
}
|
| 241 |
+
|
| 242 |
+
.species {
|
| 243 |
+
width: 90%;
|
| 244 |
+
padding: 0.1rem;
|
| 245 |
+
margin: 0.25rem auto;
|
| 246 |
+
text-align: center;
|
| 247 |
+
font-size: 0.75rem;
|
| 248 |
+
font-style: italic;
|
| 249 |
+
font-weight: bold;
|
| 250 |
+
background-image: linear-gradient(90deg, var(--card-color), var(--lightest) 45% 55%, var(--card-color));
|
| 251 |
+
border-width: 0 0.2rem;
|
| 252 |
+
border-style: solid;
|
| 253 |
+
border-image: linear-gradient(var(--lightest), var(--darker)) 1 100%;
|
| 254 |
+
}
|
| 255 |
+
|
| 256 |
+
.grid-three {
|
| 257 |
+
display: grid;
|
| 258 |
+
grid-template-columns: repeat(3, 1fr);
|
| 259 |
+
}
|
| 260 |
+
|
| 261 |
+
.grid-three > *:first-child {
|
| 262 |
+
text-align: left;
|
| 263 |
+
}
|
| 264 |
+
|
| 265 |
+
.grid-three > span:last-child {
|
| 266 |
+
text-align: right;
|
| 267 |
+
}
|
| 268 |
+
|
| 269 |
+
.attacks {
|
| 270 |
+
list-style-type: none;
|
| 271 |
+
padding: 0;
|
| 272 |
+
margin: 0.1rem auto 0;
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
.attacks-row {
|
| 276 |
+
max-height: 5rem;
|
| 277 |
+
grid-template-columns: 3rem 10fr 1fr;
|
| 278 |
+
align-items: center;
|
| 279 |
+
gap: 1rem;
|
| 280 |
+
font-size: 0.95em;
|
| 281 |
+
}
|
| 282 |
+
|
| 283 |
+
.attack-text > span:only-child {
|
| 284 |
+
display: block;
|
| 285 |
+
margin-left: -2rem;
|
| 286 |
+
text-align: center;
|
| 287 |
+
}
|
| 288 |
+
|
| 289 |
+
.attack-cost {
|
| 290 |
+
display: flex;
|
| 291 |
+
justify-content: space-evenly;
|
| 292 |
+
flex-flow: row wrap;
|
| 293 |
+
text-align: justify;
|
| 294 |
+
}
|
| 295 |
+
|
| 296 |
+
.energy {
|
| 297 |
+
width: fit-content;
|
| 298 |
+
aspect-ratio: 1 / 1;
|
| 299 |
+
cursor: default;
|
| 300 |
+
user-select: none;
|
| 301 |
+
}
|
| 302 |
+
|
| 303 |
+
.energy:only-child {
|
| 304 |
+
justify-self: flex-start;
|
| 305 |
+
margin: auto;
|
| 306 |
+
}
|
| 307 |
+
|
| 308 |
+
.attack-name {
|
| 309 |
+
font-weight: bold;
|
| 310 |
+
}
|
| 311 |
+
|
| 312 |
+
.attack-damage {
|
| 313 |
+
min-width: 2.25rem;
|
| 314 |
+
font-size: 1.375rem;
|
| 315 |
+
text-align: center;
|
| 316 |
+
}
|
| 317 |
+
|
| 318 |
+
hr {
|
| 319 |
+
background-color: black;
|
| 320 |
+
border: 0.5px solid black;
|
| 321 |
+
}
|
| 322 |
+
|
| 323 |
+
.multipliers {
|
| 324 |
+
display: flex;
|
| 325 |
+
flex-direction: row;
|
| 326 |
+
justify-content: space-between;
|
| 327 |
+
height: 2rem;
|
| 328 |
+
margin-top: -0.5rem;
|
| 329 |
+
text-align: center;
|
| 330 |
+
font-size: 0.75rem;
|
| 331 |
+
font-weight: bold;
|
| 332 |
+
}
|
| 333 |
+
|
| 334 |
+
.multipliers > div {
|
| 335 |
+
display: flex;
|
| 336 |
+
flex-direction: column;
|
| 337 |
+
align-items: center;
|
| 338 |
+
margin: 0;
|
| 339 |
+
}
|
| 340 |
+
|
| 341 |
+
.resistance {
|
| 342 |
+
position: relative;
|
| 343 |
+
}
|
| 344 |
+
|
| 345 |
+
.resistance-total {
|
| 346 |
+
position: absolute;
|
| 347 |
+
top: 1rem;
|
| 348 |
+
left: 2.5rem;
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
+
.description {
|
| 352 |
+
padding: 0.1rem 0.5rem;
|
| 353 |
+
margin: 0.25rem 0 0.5rem;
|
| 354 |
+
border: 0.15rem solid;
|
| 355 |
+
font-size: 0.65rem;
|
| 356 |
+
font-style: italic;
|
| 357 |
+
font-weight: bold;
|
| 358 |
+
}
|
| 359 |
+
|
| 360 |
+
.footer {
|
| 361 |
+
text-align: center;
|
| 362 |
+
font-weight: bold;
|
| 363 |
+
font-size: 0.6rem;
|
| 364 |
+
margin: auto 0;
|
| 365 |
+
}
|
| 366 |
+
|
| 367 |
+
a {
|
| 368 |
+
text-decoration: none;
|
| 369 |
+
color: black !important;
|
| 370 |
+
}
|
templates/index.html
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>This Pokémon Does Not Exist</title>
|
| 7 |
+
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" />
|
| 8 |
+
<link rel="stylesheet" id="stylesheet-tag" />
|
| 9 |
+
<script type="module" id="script-tag"></script>
|
| 10 |
+
<script>
|
| 11 |
+
const basePath = document.location.origin + document.location.pathname;
|
| 12 |
+
document.getElementById('script-tag').src = `${basePath}static/index.js`;
|
| 13 |
+
document.getElementById('stylesheet-tag').href = `${basePath}static/style.css`;
|
| 14 |
+
</script>
|
| 15 |
+
</head>
|
| 16 |
+
<body>
|
| 17 |
+
<h1>This Pokémon Does Not Exist</h1>
|
| 18 |
+
<div class="duration"><span class="seconds">0.0</span>/500s</div>
|
| 19 |
+
<button class="generate">Generate Pokémon Card with AI</button>
|
| 20 |
+
<section class="render"></section>
|
| 21 |
+
</body>
|
| 22 |
+
</html>
|