adding encoding systems, puzzles and mazes and maps notebooks

master
manetta 2 years ago
parent 2fc85c67f9
commit 04f0c6ba87

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1001 KiB

@ -0,0 +1,467 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Labyrinths and mazes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```\n",
"🐭\n",
"┃┣━━━┳━━━━┳━━┓\n",
"┃┗┓┏┛┃╻╺━━┛╺┓┃\n",
"┣┓┃┗┓┗┻━━━┳╸┃┃\n",
"┃┃┣╸┣━━┳━┓┗━┛┃\n",
"┃┃┃┏┛┏╸┃╻┣━┳╸┃\n",
"┃┗━┫╻┣━━┫┗╸┃┏┫\n",
"┃┏━┫┃┃╺┓┗━┓┃┃┃\n",
"┃┃┃┃┃┗┓┗━┓┗┻╸┃\n",
"┗━┫┏┻━━━━┻━━━┛\n",
" 🧀\n",
"```\n",
"http://xahlee.info/comp/unicode_drawing_shapes.html by [Xah Lee](http://xahlee.org/index.html)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Situationist Times #04: International Labyrinth Edition\n",
"\n",
"[![](https://vandal.ist/thesituationisttimes/covers/st04.cover.m.jpg)](https://vandal.ist/thesituationisttimes/04/)\n",
"\n",
"Jacqueline de Jong (one of the makers of the Situationist Times) talking about [printed mazes with overlay](https://vandal.ist/thesituationisttimes/04/index.html#8/-1.869/118.973).\n",
"\n",
"The PDFs of the Situationist Times are [available on Monoskop](https://monoskop.org/Situationist_Times)! "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 10 PRINT\n",
"\n",
"Nick Montfort and others compilation of maze generation and other simple scripts from early home computing.\n",
"\n",
"https://hub.xpub.nl/bootleglibrary/book/583\n",
"\n",
"Some links to nice parts:\n",
"\n",
"* Including [what is a maze](https://hub.xpub.nl/bootleglibrary/read/583/pdf#page=47), and the ever useful (controversial?) distinction between maze and labyrinth...\n",
"\n",
"> The terms “maze” and “labyrinth” are generally synonyms in colloquial English. Still, many scholars and historians have argued over the distinction between these two terms. In the most popular proposed distinction, “labyrinth” refers only to single-path (unicursal) structures, while “maze” refers only to branching-path (multicursal) structures.In this book, the terms “maze” and “labyrinth” are not used to distinguish two different categories of structure or image. Instead, the two terms indicate a single conceptual category, with this book primarily using the term “maze” for both\n",
"\n",
"* the [map from Atari adventure](https://hub.xpub.nl/bootleglibrary/read/583/pdf#page=62), \n",
"* the (missing) [Vera Molnar work](https://hub.xpub.nl/bootleglibrary/read/583/pdf#page=78) but which you can see [online](https://www.centrepompidou.fr/fr/ressources/oeuvre/cez6op), \n",
"* the [commodore keyboard](https://hub.xpub.nl/bootleglibrary/read/583/pdf#page=227) and the [PETSCII table in the manual](https://hub.xpub.nl/bootleglibrary/read/583/pdf#page=238)\n",
"\n",
"AND an interesting link to the conversation about popular culture and the middle-class:\n",
"\n",
"![](Screenshot-c64-ad.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Fun With Python #1: Maze Generator\n",
"\n",
"This notebook is based on the Medium article \"Fun with Python part 1: Maze Generator\" written by [Orestis Zekai](https://orestiszekai.com/) in 2020. \n",
"\n",
"It is a nice tutorial which talks you through a Python implementation of a maze generator. \n",
"\n",
"You can find the tutorial here: https://medium.com/swlh/fun-with-python-1-maze-generator-931639b4fb7e\n",
"\n",
"The maze generator is based on a **randomized version of Prim's algorithm**, which is one of the [maze algorithms](https://en.wikipedia.org/wiki/Maze_generation_algorithm) that is used to generate a maze:\n",
"\n",
"* Start with a grid full of walls.\n",
"* Pick a cell, mark it as part of the maze. Add the walls of the cell to the wall list.\n",
"* While there are walls in the list:\n",
" * Pick a random wall from the list. If only one of the cells that the wall divides is visited, then:\n",
" * Make the wall a passage and mark the unvisited cell as part of the maze.\n",
" * Add the neighboring walls of the cell to the wall list.\n",
" * Remove the wall from the list."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generating mazes on paper\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"600\"\n",
" height=\"400\"\n",
" src=\"maze-algorithm-on-paper.pdf\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x7f5b1838ec18>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import IFrame\n",
"IFrame(\"maze-algorithm-on-paper.pdf\", width=600, height=400)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Maze Generator\n",
"\n",
"The code below is a slightly adapted version of `maze.py` written by Orestis Zekai: https://github.com/OrWestSide/python-scripts/blob/master/maze.py\n",
"\n",
"You can use the code to generate custom mazes. \n",
"\n",
"Change the following variables in the code, to make your maze bigger or smaller and to change how your maze looks like!\n",
"\n",
"```\n",
"# --------------------------\n",
"wall_tile = \"▓\"\n",
"cell_tile = \"░\"\n",
"height = 11\n",
"width = 27\n",
"# --------------------------\n",
"\n",
"```\n",
"\n",
"**NOTE**: The code below is a slightly different version of the code from the tutorial. The variable names are changed in the double for-loops, to make them connect to the other canvas examples in the other notebooks. For example, a for loop to move block by block through the maze is written below in the following way, using `y` and `x` to refer to the coordinates of a block:\n",
"\n",
"```\n",
"for y in range(height):\n",
" for x in range(width):\n",
" if (maze[y][x] == \"u\"):\n",
" print(unvisited, end=\"\")\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"▓░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n",
"▓░▓▓░▓▓░▓░▓░░░░░░░░▓░░░░░░▓\n",
"▓░░░░░░░░░░░▓▓░▓░▓░░░▓░▓▓▓▓\n",
"▓░▓▓▓▓▓▓▓▓░▓▓▓░▓░▓▓▓░▓░░░░▓\n",
"▓░░░░░░░░▓▓▓░▓▓▓░░▓▓▓▓▓▓▓▓▓\n",
"▓░▓░▓▓▓▓░░░░░░░▓▓░░░▓░▓▓▓▓▓\n",
"▓░▓░░▓▓▓▓▓▓▓░▓░░▓░▓░░░░░░░▓\n",
"▓░▓▓░░░░░░▓▓░▓▓░▓░▓░▓▓░▓░▓▓\n",
"▓▓▓▓▓░▓▓▓▓▓▓░░▓░▓▓▓░░▓░▓▓▓▓\n",
"▓░░░░░░░░░░▓░▓▓░▓▓░░▓▓░░░░▓\n",
"▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░▓\n"
]
}
],
"source": [
"# Maze generator -- Randomized Prim Algorithm\n",
"\n",
"## Imports\n",
"import random\n",
"\n",
"## Functions\n",
"def printMaze(maze):\n",
" for y in range(height):\n",
" for x in range(width):\n",
" if (maze[y][x] == \"u\"):\n",
" print(unvisited, end=\"\")\n",
" elif (maze[y][x] == \"c\"):\n",
" print(cell_tile, end=\"\")\n",
" else:\n",
" print(wall_tile, end=\"\")\n",
" \n",
" print(\"\")\n",
"\n",
"# Find number of surrounding cells\n",
"def surroundingCells(rand_wall):\n",
" s_cells = 0\n",
" if (maze[rand_wall[0]-1][rand_wall[1]] == \"c\"):\n",
" s_cells += 1\n",
" if (maze[rand_wall[0]+1][rand_wall[1]] == \"c\"):\n",
" s_cells += 1\n",
" if (maze[rand_wall[0]][rand_wall[1]-1] == \"c\"):\n",
" s_cells +=1\n",
" if (maze[rand_wall[0]][rand_wall[1]+1] == \"c\"):\n",
" s_cells += 1\n",
"\n",
" return s_cells\n",
"\n",
"## Main code\n",
"\n",
"# Init variables\n",
"# --------------------------\n",
"wall_tile = \"▓\"\n",
"cell_tile = \"░\"\n",
"height = 11\n",
"width = 27\n",
"# --------------------------\n",
"wall = \"w\"\n",
"cell = \"c\"\n",
"unvisited = \"u\"\n",
"maze = []\n",
"\n",
"# Denote all cells as unvisited\n",
"for y in range(height):\n",
" line = []\n",
" for x in range(width):\n",
" line.append(unvisited)\n",
" maze.append(line)\n",
"\n",
"# Randomize starting point and set it a cell\n",
"starting_height = int(random.random()*height)\n",
"starting_width = int(random.random()*width)\n",
"if (starting_height == 0):\n",
" starting_height += 1\n",
"if (starting_height == height-1):\n",
" starting_height -= 1\n",
"if (starting_width == 0):\n",
" starting_width += 1\n",
"if (starting_width == width-1):\n",
" starting_width -= 1\n",
"\n",
"# Mark it as cell and add surrounding walls to the list\n",
"maze[starting_height][starting_width] = cell\n",
"walls = []\n",
"walls.append([starting_height - 1, starting_width])\n",
"walls.append([starting_height, starting_width - 1])\n",
"walls.append([starting_height, starting_width + 1])\n",
"walls.append([starting_height + 1, starting_width])\n",
"\n",
"# Denote walls in maze\n",
"maze[starting_height-1][starting_width] = \"w\"\n",
"maze[starting_height][starting_width - 1] = \"w\"\n",
"maze[starting_height][starting_width + 1] = \"w\"\n",
"maze[starting_height + 1][starting_width] = \"w\"\n",
"\n",
"while (walls):\n",
" # Pick a random wall\n",
" rand_wall = walls[int(random.random()*len(walls))-1]\n",
"\n",
" # Check if it is a left wall\n",
" if (rand_wall[1] != 0):\n",
" if (maze[rand_wall[0]][rand_wall[1]-1] == \"u\" and maze[rand_wall[0]][rand_wall[1]+1] == \"c\"):\n",
" # Find the number of surrounding cells\n",
" s_cells = surroundingCells(rand_wall)\n",
"\n",
" if (s_cells < 2):\n",
" # Denote the new path\n",
" maze[rand_wall[0]][rand_wall[1]] = \"c\"\n",
"\n",
" # Mark the new walls\n",
" # Upper cell\n",
" if (rand_wall[0] != 0):\n",
" if (maze[rand_wall[0]-1][rand_wall[1]] != \"c\"):\n",
" maze[rand_wall[0]-1][rand_wall[1]] = \"w\"\n",
" if ([rand_wall[0]-1, rand_wall[1]] not in walls):\n",
" walls.append([rand_wall[0]-1, rand_wall[1]])\n",
"\n",
" # Bottom cell\n",
" if (rand_wall[0] != height-1):\n",
" if (maze[rand_wall[0]+1][rand_wall[1]] != \"c\"):\n",
" maze[rand_wall[0]+1][rand_wall[1]] = \"w\"\n",
" if ([rand_wall[0]+1, rand_wall[1]] not in walls):\n",
" walls.append([rand_wall[0]+1, rand_wall[1]])\n",
"\n",
" # Leftmost cell\n",
" if (rand_wall[1] != 0): \n",
" if (maze[rand_wall[0]][rand_wall[1]-1] != \"c\"):\n",
" maze[rand_wall[0]][rand_wall[1]-1] = \"w\"\n",
" if ([rand_wall[0], rand_wall[1]-1] not in walls):\n",
" walls.append([rand_wall[0], rand_wall[1]-1])\n",
"\n",
" # Delete wall\n",
" for wall in walls:\n",
" if (wall[0] == rand_wall[0] and wall[1] == rand_wall[1]):\n",
" walls.remove(wall)\n",
"\n",
" continue\n",
"\n",
" # Check if it is an upper wall\n",
" if (rand_wall[0] != 0):\n",
" if (maze[rand_wall[0]-1][rand_wall[1]] == \"u\" and maze[rand_wall[0]+1][rand_wall[1]] == \"c\"):\n",
"\n",
" s_cells = surroundingCells(rand_wall)\n",
" if (s_cells < 2):\n",
" # Denote the new path\n",
" maze[rand_wall[0]][rand_wall[1]] = \"c\"\n",
"\n",
" # Mark the new walls\n",
" # Upper cell\n",
" if (rand_wall[0] != 0):\n",
" if (maze[rand_wall[0]-1][rand_wall[1]] != \"c\"):\n",
" maze[rand_wall[0]-1][rand_wall[1]] = \"w\"\n",
" if ([rand_wall[0]-1, rand_wall[1]] not in walls):\n",
" walls.append([rand_wall[0]-1, rand_wall[1]])\n",
"\n",
" # Leftmost cell\n",
" if (rand_wall[1] != 0):\n",
" if (maze[rand_wall[0]][rand_wall[1]-1] != \"c\"):\n",
" maze[rand_wall[0]][rand_wall[1]-1] = \"w\"\n",
" if ([rand_wall[0], rand_wall[1]-1] not in walls):\n",
" walls.append([rand_wall[0], rand_wall[1]-1])\n",
"\n",
" # Rightmost cell\n",
" if (rand_wall[1] != width-1):\n",
" if (maze[rand_wall[0]][rand_wall[1]+1] != \"c\"):\n",
" maze[rand_wall[0]][rand_wall[1]+1] = \"w\"\n",
" if ([rand_wall[0], rand_wall[1]+1] not in walls):\n",
" walls.append([rand_wall[0], rand_wall[1]+1])\n",
"\n",
" # Delete wall\n",
" for wall in walls:\n",
" if (wall[0] == rand_wall[0] and wall[1] == rand_wall[1]):\n",
" walls.remove(wall)\n",
"\n",
" continue\n",
"\n",
" # Check the bottom wall\n",
" if (rand_wall[0] != height-1):\n",
" if (maze[rand_wall[0]+1][rand_wall[1]] == \"u\" and maze[rand_wall[0]-1][rand_wall[1]] == \"c\"):\n",
"\n",
" s_cells = surroundingCells(rand_wall)\n",
" if (s_cells < 2):\n",
" # Denote the new path\n",
" maze[rand_wall[0]][rand_wall[1]] = \"c\"\n",
"\n",
" # Mark the new walls\n",
" if (rand_wall[0] != height-1):\n",
" if (maze[rand_wall[0]+1][rand_wall[1]] != \"c\"):\n",
" maze[rand_wall[0]+1][rand_wall[1]] = \"w\"\n",
" if ([rand_wall[0]+1, rand_wall[1]] not in walls):\n",
" walls.append([rand_wall[0]+1, rand_wall[1]])\n",
" if (rand_wall[1] != 0):\n",
" if (maze[rand_wall[0]][rand_wall[1]-1] != \"c\"):\n",
" maze[rand_wall[0]][rand_wall[1]-1] = \"w\"\n",
" if ([rand_wall[0], rand_wall[1]-1] not in walls):\n",
" walls.append([rand_wall[0], rand_wall[1]-1])\n",
" if (rand_wall[1] != width-1):\n",
" if (maze[rand_wall[0]][rand_wall[1]+1] != \"c\"):\n",
" maze[rand_wall[0]][rand_wall[1]+1] = \"w\"\n",
" if ([rand_wall[0], rand_wall[1]+1] not in walls):\n",
" walls.append([rand_wall[0], rand_wall[1]+1])\n",
"\n",
" # Delete wall\n",
" for wall in walls:\n",
" if (wall[0] == rand_wall[0] and wall[1] == rand_wall[1]):\n",
" walls.remove(wall)\n",
"\n",
" continue\n",
"\n",
" # Check the right wall\n",
" if (rand_wall[1] != width-1):\n",
" if (maze[rand_wall[0]][rand_wall[1]+1] == \"u\" and maze[rand_wall[0]][rand_wall[1]-1] == \"c\"):\n",
"\n",
" s_cells = surroundingCells(rand_wall)\n",
" if (s_cells < 2):\n",
" # Denote the new path\n",
" maze[rand_wall[0]][rand_wall[1]] = \"c\"\n",
"\n",
" # Mark the new walls\n",
" if (rand_wall[1] != width-1):\n",
" if (maze[rand_wall[0]][rand_wall[1]+1] != \"c\"):\n",
" maze[rand_wall[0]][rand_wall[1]+1] = \"w\"\n",
" if ([rand_wall[0], rand_wall[1]+1] not in walls):\n",
" walls.append([rand_wall[0], rand_wall[1]+1])\n",
" if (rand_wall[0] != height-1):\n",
" if (maze[rand_wall[0]+1][rand_wall[1]] != \"c\"):\n",
" maze[rand_wall[0]+1][rand_wall[1]] = \"w\"\n",
" if ([rand_wall[0]+1, rand_wall[1]] not in walls):\n",
" walls.append([rand_wall[0]+1, rand_wall[1]])\n",
" if (rand_wall[0] != 0): \n",
" if (maze[rand_wall[0]-1][rand_wall[1]] != \"c\"):\n",
" maze[rand_wall[0]-1][rand_wall[1]] = \"w\"\n",
" if ([rand_wall[0]-1, rand_wall[1]] not in walls):\n",
" walls.append([rand_wall[0]-1, rand_wall[1]])\n",
"\n",
" # Delete wall\n",
" for wall in walls:\n",
" if (wall[0] == rand_wall[0] and wall[1] == rand_wall[1]):\n",
" walls.remove(wall)\n",
"\n",
" continue\n",
"\n",
" # Delete the wall from the list anyway\n",
" for wall in walls:\n",
" if (wall[0] == rand_wall[0] and wall[1] == rand_wall[1]):\n",
" walls.remove(wall)\n",
" \n",
"# Mark the remaining unvisited cells as walls\n",
"for y in range(height):\n",
" for x in range(width):\n",
" if (maze[y][x] == \"u\"):\n",
" maze[y][x] = \"w\"\n",
"\n",
"# Set entrance and exit\n",
"for x in range(width):\n",
" if (maze[1][x] == \"c\"):\n",
" maze[0][x] = \"c\"\n",
" break\n",
"\n",
"for x in range(width-1, 0, -1):\n",
" if (maze[height-2][x] == \"c\"):\n",
" maze[height-1][x] = \"c\"\n",
" break\n",
"\n",
"# Print final maze\n",
"printMaze(maze)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,484 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generating maps"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A*maze*ing maps with game assets\n",
"\n",
"Our journey begins here...\n",
"\n",
"https://www.kenney.nl/assets/cartography-pack"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [],
"source": [
"!wget \"https://www.kenney.nl/content/3-assets/26-cartography-pack/cartographypack.zip\"\n",
"!mkdir cartographypack\n",
"!unzip cartographypack.zip -d cartographypack"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!ls cartographypack/PNG/Default/path*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from glob import glob\n",
"import os\n",
"from IPython.display import display, HTML\n",
"\n",
"html = \"\"\n",
"\n",
"for img_path in glob(\"cartographypack/PNG/Default/path*\"):\n",
"\n",
" html += f'<img src=\"{ img_path }\" style=\"float:left;\">'\n",
"\n",
"display(HTML(html))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from random import choice\n",
"\n",
"pieces = glob(\"cartographypack/PNG/Default/path*\")\n",
"html = \"\"\n",
"\n",
"for i in range(100):\n",
" piece = choice(pieces)\n",
" html += f'<img src=\"{ piece }\" style=\"float:left;\">'\n",
" \n",
"display(HTML(html))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stepping away from random.choice(): writing an algorithm to generate patterns"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to generate patterns in a non-random way, we might want to move around through our canvas in a **non-linear way**, to make the patterns a bit more complex.\n",
"\n",
"### moving through the canvas\n",
"\n",
"Each character on our \"canvas\" has a specific position and thus is connected to a `x` and `y` coordinate.\n",
"\n",
"How can we do that?\n",
"\n",
"We will use a `list-of-lists`... or in other words: \n",
"\n",
"we make **one big list**, that contains a # of **rows** (**the `y` axis, or *height* of the canvas**), with a # of **characters** (**the `x` axis, or *width* of the canvas**). \n",
"\n",
"To make this `list-of-lists`, we will use a `loop-in-a-loop`:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"width = 10\n",
"height = 10\n",
"\n",
"canvas = []\n",
"\n",
"for y in range(height):\n",
" \n",
" row = []\n",
"\n",
" for x in range(width):\n",
" row.append(x)\n",
" \n",
" canvas.append(row)\n",
" \n",
"print(canvas)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's print the canvas row for row, to make it easier to see it as a x-y canvas:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for row in canvas:\n",
" print(row)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"And let's bring it back into an plain text pattern: turn this `list-of-lists` into a `multiline string`:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# canvas is our list-of-lists\n",
"# canvas_string is the plain text version that we want to create\n",
"\n",
"canvas_string = ''\n",
"\n",
"for row in canvas:\n",
" row_string = ''\n",
" for character in row:\n",
" row_string += str(character)\n",
" canvas_string += row_string + \"\\n\"\n",
"\n",
"print(canvas_string)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's save this as a function that we can reuse later!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def plain(canvas):\n",
" canvas_string = ''\n",
" for row in canvas:\n",
" row_string = \"\".join(row)\n",
" canvas_string += row_string + \"\\n\"\n",
"\n",
" return canvas_string"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, we can work with the `x` and `y` axes of the canvas, by *slicing* the `canvas`:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"canvas[0][0]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"canvas[1][9]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### My first algorithm"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's write a short algorithm, to generate a map.\n",
"\n",
"We will start by writing the **rules** of our algorithm.\n",
"\n",
"Let's first think of these rules without writing them in code. \n",
"\n",
"How would you like to generate a pattern?\n",
"\n",
"For example: \n",
"\n",
"**Characters**\n",
"\n",
"* `.` is used as background\n",
"* `░` as light shade\n",
"* `▒` as darker shade\n",
"\n",
"**Rules** \n",
"\n",
"* `░` always appears in horizontal ánd vertical blocks of 3\n",
"\n",
"```\n",
".....\n",
"..░..\n",
".░░░.\n",
"..░..\n",
".....\n",
"```\n",
"\n",
"* `▒` surrounds the blobs of light shade on the left side of each light shadow \n",
"\n",
"```\n",
".....\n",
".▒░..\n",
"▒░░░.\n",
".▒░..\n",
".....\n",
"```\n",
"\n",
"Let's try this!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First we create a new canvas and fill it with `.`'s."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"width = 100\n",
"height = 25\n",
"\n",
"canvas = []\n",
"for y in range(height):\n",
" row = []\n",
" for x in range(width):\n",
" row.append('.')\n",
" canvas.append(row)\n",
"\n",
"print(plain(canvas))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's add the light shade..."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from random import randrange\n",
"\n",
"light_shade = '░'\n",
"\n",
"for y in range(height):\n",
" for x in range(width):\n",
" \n",
" # To work with a degree of chance, \n",
" # we \"roll the dice\" and only add a ░\n",
" # when the number is lower then 5\n",
" random_number = randrange(0, 100, 1)\n",
" if random_number < 3: \n",
" \n",
" # If so, then we add a ░\n",
" canvas[y][x] = light_shade\n",
" \n",
" # Check is there is a character on the left, right, \n",
" # top and bottom AT ALL, before adding them...\n",
" if x - 1 >= 0:\n",
" canvas[y][x - 1] = light_shade\n",
" if x + 1 < width:\n",
" canvas[y][x + 1] = light_shade\n",
" if y - 1 >= 0:\n",
" canvas[y - 1][x] = light_shade\n",
" if y + 1 < height:\n",
" canvas[y + 1][x] = light_shade\n",
" \n",
" else:\n",
" continue\n",
" \n",
"print(plain(canvas))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's add the darker shade..."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from random import randrange\n",
"\n",
"light_shade = '░'\n",
"darker_shade = '▒'\n",
"\n",
"for y in range(height):\n",
" for x in range(width):\n",
" \n",
" # First we check if the current character is a light shade\n",
" if canvas[y][x] == light_shade:\n",
" \n",
" # If that is the case, we need to look around, to see if we need to place a shade on the left, right, top or bottom\n",
" \n",
" # Check is there is a left character AT ALL\n",
" if x - 1 >= 0:\n",
" # If so, then we check if the left character is a '.'\n",
" if canvas[y][x - 1] == '.':\n",
" # If so, then we replace it with a dark shade\n",
" canvas[y][x - 1] = '▒'\n",
" \n",
" else:\n",
" continue\n",
" \n",
"print(plain(canvas))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "raw",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Could we make a maze generator with the cartographypack now?\n",
"\n",
":---)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,98 @@
_ _ _ _ __ __ _ _ _ ____ U ___ u __ __ ____ _ _ _____ _ _ ____
|'| |'|U |"|u| |U|' \/ '|uU /"\ u | \ |"| U /"___| \/"_ \/U|' \/ '|uU| _"\ uU |"|u| ||_ " _| ___ | \ |"| U /"___|u
/| |_| |\\| |\| |\| |\/| |/ \/ _ \/ <| \| |> \| | u | | | |\| |\/| |/\| |_) |/ \| |\| | | | |_"_| <| \| |>\| | _ /
U| _ |u | |_| | | | | | / ___ \ U| |\ |u | |/__.-,_| |_| | | | | | | __/ | |_| | /| |\ | | U| |\ |u | |_| |
|_| |_| <<\___/ |_| |_| /_/ \_\ |_| \_| \____|\_)-\___/ |_| |_| |_| <<\___/ u |_|U U/| |\u |_| \_| \____|
// \\(__) )( <<,-,,-. \\ >> || \\,-. _// \\ \\ <<,-,,-. ||>>_ (__) )( _// \\_.-,_|___|_,-.|| \\,-._)(|_
(_") ("_) (__) (./ \.) (__) (__)(_") (_/ (__)(__) (__) (./ \.) (__)__) (__)(__) (__)\_)-' '-(_/ (_") (_/(__)__)
. . . . . . . . . . . . . . . ╓ WALL LIST ╖
╟ ╢
. . . . . . . . . . . . . . . ╟ ╢
╟ ╢
. . . . . . . . . . . . . . . ╟ ╢
╟ ╢
. . . . . . . . . . . . . . . ╟ ╢
╟ ╢
. . . . . . . . . . . . . . . ╟ ╢
╟ ╢
. . . . . . . . . . . . . . . ╟ ╢
╟ ╢
╟ ╢
╟ ╢
╟ ╢
╟ ╢
╟ ╢
╟ ╢
╟ ╢
╟ ╢
╟ ╢
╟ ╢
╔═══════════════════════════╗ ╟ ╢
║Randomized Prim's Algorithm║ ╟ ╢
╚═══════════════════════════╝ ╟ ╢
╟ ╢
- Start with a grid full of walls. ╟ ╢
╟ ╢
- Pick a cell, mark it as part of the maze. ╟ ╢
Add the walls of the cell to the wall list. ╟ ╢
╟ ╢
- While there are walls in the list: ╙ ╜
- Pick a random wall from the list.
If only one of the cells that the wall
divides is visited, then:
- Make the wall a passage and mark
the unvisited cell as part of
the maze.
- Add the neighboring walls of the
cell to the wall list.
- Remove the wall from the list.
,. ( . ) . "
(" ) )' ,' ) . (` '`
.; ) ' (( (" ) ;(, (( ( ;) " )"
_"., ,._'_.,)_(..,( . )_ _' )_') (. _..( '..jb
ASCII font "Dancing Font" http://patorjk.com/software/taag/
Randomized Prim's Algorithm from
https://en.wikipedia.org/wiki/Maze_generation_algorithm
Based on Orestis Zekai's maze generator
https://medium.com/swlh/fun-with-python-1-maze-generator-931639b4fb7e
ASCII fire by jb https://hopemoji.com/text-art-ascii/fire/
Made in the context of Special Issue 17: Productive Play
XPUB™

Before

Width:  |  Height:  |  Size: 519 B

After

Width:  |  Height:  |  Size: 519 B

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 287 B

@ -1,129 +0,0 @@
± ° ° ±
Û° ÛÛ± ²ÛÛ °Û
ÛÛ ÛÛÛÛ²± ±²ÛÛÛÛ ÛÛ
ÛÛÛ ÛÛÛÛÛÛÛ² ²ÛÛÛÛÛÛÛ ÛÛÛ
ÛÛÛ² ÛÛÛÛÛÛÛÛÛ²± ±²ÛÛÛÛÛÛÛÛÛ ²ÛÛÛ
ÛÛÛÛ± ÛÛÛÛÛÛÛÛÛÛÛÛ² ²ÛÛÛÛÛÛÛÛÛÛÛÛ ²ÛÛÛÛ
ÛÛÛÛÛ± ÛÛÛÛÛÛÛÛÛÛÛÛÛÛ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ±ÛÛÛÛÛ
ÛÛÛÛÛÛ° ÛÛÛÛÛÛÛÛÛÛÛÛ² ²ÛÛÛÛÛÛÛÛÛÛÛÛ °ÛÛÛÛÛÛ
ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛ²± ±²ÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛ²² ²²ÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛ ÛÛÛÛ±° °±ÛÛÛÛ ÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛ² ÛÛ± ²ÛÛ ²ÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛ± ° ÜÛÜ ° ±ÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛ° ÛÛÛÛÛ °ÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛ ßÛß ÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ² ÜÛÜ ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ± ÛÛÛÛÛ ±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ± ßÛß ±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ° °ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ² ÜÛÜ ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ² ÛÛÛÛÛ ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ± ßÛß ±ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ° °ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ² ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ² ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ²ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
ÛÛÛ° ÛÛÛÛÛÛÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛÛÛÛÛ°
ÛÛÛ° ÛÛÛÛÛÛÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛÛÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛ² ²ÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ ÛÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛÛÛ° ÛÛÛ° ÛÛÛÛÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛÛÛ° ÛÛÛ° ÛÛÛÛÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛ°
ÛÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛÛÛÛÛ° ÛÛÛÛÛÛÛ°
ÛÛÛ° ÛÛÛ° ÛÛÛ° ÛÛÛÛÛÛÛ° ÛÛÛÛÛÛÛ°
ß ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ß
title: C64 TrueType v1.2.1 type: fonts
date: April 15, 2019 platform: Any OS/web
Ü ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ Ü
>> What the hell is it?
Our C64 TrueType fonts provide monospace and
variable pitch versions of the legendary C64
character set. For programmers, each font contains
Unicode mappings to accomodate either a direct
PETSCII mapping or a screencode mapping. For users,
the fonts map to some obvious code points (like the
Unicode box drawing range) and should also support
easy mapping from applicable code points in cp437
and cp1252. Our goal is to provide all 304 necessary
glyphs in the C64 character set in as small a file
as possible while still being programmer-friendly.
Finally, six additional glyphs are included to round
out the US-ASCII table with \, ^, `, {, }, and ~ for
the sake of providing a usable PETSCII experience
in code editors/IDEs.
This update corrects some bounding box issues as
reported in the updated Microsoft Font Validator,
left side bearing on one glyph, and updates some
PS names.
This update also adds a 'proper' OpenType format
(.otf) with CFF outlines. All files should be
smaller than the previous release. SVG format
has been dropped.
"C64 Pro Mono" is the fixed pitch while "C64 Pro"
is a variable pitch (propertional) version. In the
legacy folder you can also find "C64 Elite Mono"
which was used in DirMaster v2.x - we don't
recommend using it for anything else other than
if you need it for running an older version of
DirMaster. The "C64 Pro Mono" in this release is
the same as what ships with DirMaster v3.1.2 but
will work with any older 3.x version of DirMaster.
>> What does the future hold?
The Unicode Consortium (or acolytes thereof)
recently tackled the issue of missing legacy
computing character sets. The first attempt
has omitted several of the C64's vertical and
horizontal 'quarter-bar' characters. Pending
the final outcome we'll add whatever new
mappings that are relevant to the C64 when
the next Unicode update drops.
>> Previous releases:
v1.0 - Oct 1, 2010
v1.2 - Sep 2, 2014
>> For more information:
http://style64.org/c64-truetype
http://style64.org/c64-truetype/license
http://style64.org/petscii
ß ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ß
Keep scene spirit alive!
Ü ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ Ü

@ -1,16 +0,0 @@
ß ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ß
C64 TrueType v1.2.1/Style
Ü ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ Ü
² Û² ²Û ² ßßßßßßßßßßßßßßß
Û± ÛÛÛÜ°ÜÛÛÛ ±Û release type:
ÛÛ° ÛÛÛß°ßÛÛÛ °ÛÛ þ fonts
ÛÛÛ Û² ²Û ÛÛÛ
ÛÛÛ² Û ²ÛÛÛ for platform:
ÛÛÛÛ± ±ÛÛÛÛ þ Any OS/web
ÛÛÛÛÛ° Û °ÛÛÛÛÛ
ÛÛÛÛÛÛ ÛÛÛÛÛÛ released on:
ÛÛÛÛÛÛÛ Û ÛÛÛÛÛÛÛ þ 2019-04-15
ÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
ÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛ úúú[01/01]úúú

@ -1,8 +0,0 @@
Fonts in this package are (c) 2010-2019 Style.
This license is applicable to each font file included in this package in all their variants (ttf, otf, eot, woff, woff2, svg).
You MAY NOT: sell this font; include/redistribute the font in any font collection regardless of pricing; provide the font for direct download from any web site, modify or rename the font. You MAY: link to "http://style64.org/c64-truetype" in order for others to download and install the font; embed the font (without any modification or file renaming) for display on any web site using @font-face rules; use this font in static images and vector art; include this font (without any modification or file renaming) as part of a software package but ONLY if said software package is freely provided to end users. You may also contact us to negotiate a (possibly commercial) license for your use outside of these guidelines at "http://style64.org/contact-style".
At all times the most recent version of this license can be found at "http://style64.org/c64-truetype/license".

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

@ -1,170 +0,0 @@
<html>
<head>
<title> C64 Pro Mono: EOT (Embedded OpenType) test </title>
<style type="text/css">
@font-face{font-family:"C64 Pro Mono Local";src:url(../fonts/C64_Pro_Mono-STYLE.eot);src:url(../fonts/C64_Pro_Mono-STYLE.eot?#iefix) format('embedded-opentype')}@font-face{font-family:"C64 Pro Local";src:url(../fonts/C64_Pro-STYLE.eot);src:url(../fonts/C64_Pro-STYLE.eot?#iefix) format('embedded-opentype')}.c64pm{font:normal 24pt/32px "C64 Pro Mono Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.c64p{font:normal 24pt/32px "C64 Pro Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.px8{font-size:6pt;line-height:8px}.px16{font-size:12pt;line-height:16px}.px24{font-size:18pt;line-height:24px}.px32{font-size:24pt;line-height:32px}.px40{font-size:30pt;line-height:40px}table,td,tr{padding:0;margin:0}tbody,td,thead,tr{background-color:inherit}td{font:inherit;border-right:2px solid #888;border-bottom:2px solid #888}td:first-child{border-left:2px solid #888}tr:first-child td{border-top:2px solid #888}td:hover{background-color:#000!important;color:#fff!important}table{border-top:4px solid #000;border-left:4px solid #000;border-right:4px solid #000;border-bottom:4px solid #000}.d020-00{background-color:#000}.d021-00{color:#000}.d020-06{background-color:#352879}.d021-06{color:#352879}.d020-0e{background-color:#6c5eb5}.d021-0e{color:#6c5eb5}
</style>
</head>
<body>
<div>
<div class="c64p px16">
See: <a href="http://caniuse.com/#feat=eot">http://caniuse.com/#feat=eot</a>
<p>If you do not see the font, you may be using a browser that disallows local font loading due to CORS (probably Firefox or IE).</p>
</div>
<br/>
<br/>
<div style="float: left; margin-right: 8px; margin-bottom:16px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;upper/graphics</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ee00;</td> <td>&#x0ee01;</td> <td>&#x0ee02;</td> <td>&#x0ee03;</td> <td>&#x0ee04;</td> <td>&#x0ee05;</td> <td>&#x0ee06;</td> <td>&#x0ee07;</td>
<td>&#x0ee08;</td> <td>&#x0ee09;</td> <td>&#x0ee0a;</td> <td>&#x0ee0b;</td> <td>&#x0ee0c;</td> <td>&#x0ee0d;</td> <td>&#x0ee0e;</td> <td>&#x0ee0f;</td>
</tr>
<tr>
<td>&#x0ee10;</td> <td>&#x0ee11;</td> <td>&#x0ee12;</td> <td>&#x0ee13;</td> <td>&#x0ee14;</td> <td>&#x0ee15;</td> <td>&#x0ee16;</td> <td>&#x0ee17;</td>
<td>&#x0ee18;</td> <td>&#x0ee19;</td> <td>&#x0ee1a;</td> <td>&#x0ee1b;</td> <td>&#x0ee1c;</td> <td>&#x0ee1d;</td> <td>&#x0ee1e;</td> <td>&#x0ee1f;</td>
</tr>
<tr>
<td>&#x0ee20;</td> <td>&#x0ee21;</td> <td>&#x0ee22;</td> <td>&#x0ee23;</td> <td>&#x0ee24;</td> <td>&#x0ee25;</td> <td>&#x0ee26;</td> <td>&#x0ee27;</td>
<td>&#x0ee28;</td> <td>&#x0ee29;</td> <td>&#x0ee2a;</td> <td>&#x0ee2b;</td> <td>&#x0ee2c;</td> <td>&#x0ee2d;</td> <td>&#x0ee2e;</td> <td>&#x0ee2f;</td>
</tr>
<tr>
<td>&#x0ee30;</td> <td>&#x0ee31;</td> <td>&#x0ee32;</td> <td>&#x0ee33;</td> <td>&#x0ee34;</td> <td>&#x0ee35;</td> <td>&#x0ee36;</td> <td>&#x0ee37;</td>
<td>&#x0ee38;</td> <td>&#x0ee39;</td> <td>&#x0ee3a;</td> <td>&#x0ee3b;</td> <td>&#x0ee3c;</td> <td>&#x0ee3d;</td> <td>&#x0ee3e;</td> <td>&#x0ee3f;</td>
</tr>
<tr>
<td>&#x0ee40;</td> <td>&#x0ee41;</td> <td>&#x0ee42;</td> <td>&#x0ee43;</td> <td>&#x0ee44;</td> <td>&#x0ee45;</td> <td>&#x0ee46;</td> <td>&#x0ee47;</td>
<td>&#x0ee48;</td> <td>&#x0ee49;</td> <td>&#x0ee4a;</td> <td>&#x0ee4b;</td> <td>&#x0ee4c;</td> <td>&#x0ee4d;</td> <td>&#x0ee4e;</td> <td>&#x0ee4f;</td>
</tr>
<tr>
<td>&#x0ee50;</td> <td>&#x0ee51;</td> <td>&#x0ee52;</td> <td>&#x0ee53;</td> <td>&#x0ee54;</td> <td>&#x0ee55;</td> <td>&#x0ee56;</td> <td>&#x0ee57;</td>
<td>&#x0ee58;</td> <td>&#x0ee59;</td> <td>&#x0ee5a;</td> <td>&#x0ee5b;</td> <td>&#x0ee5c;</td> <td>&#x0ee5d;</td> <td>&#x0ee5e;</td> <td>&#x0ee5f;</td>
</tr>
<tr>
<td>&#x0ee60;</td> <td>&#x0ee61;</td> <td>&#x0ee62;</td> <td>&#x0ee63;</td> <td>&#x0ee64;</td> <td>&#x0ee65;</td> <td>&#x0ee66;</td> <td>&#x0ee67;</td>
<td>&#x0ee68;</td> <td>&#x0ee69;</td> <td>&#x0ee6a;</td> <td>&#x0ee6b;</td> <td>&#x0ee6c;</td> <td>&#x0ee6d;</td> <td>&#x0ee6e;</td> <td>&#x0ee6f;</td>
</tr>
<tr>
<td>&#x0ee70;</td> <td>&#x0ee71;</td> <td>&#x0ee72;</td> <td>&#x0ee73;</td> <td>&#x0ee74;</td> <td>&#x0ee75;</td> <td>&#x0ee76;</td> <td>&#x0ee77;</td>
<td>&#x0ee78;</td> <td>&#x0ee79;</td> <td>&#x0ee7a;</td> <td>&#x0ee7b;</td> <td>&#x0ee7c;</td> <td>&#x0ee7d;</td> <td>&#x0ee7e;</td> <td>&#x0ee7f;</td>
</tr>
<tr>
<td>&#x0ee80;</td> <td>&#x0ee81;</td> <td>&#x0ee82;</td> <td>&#x0ee83;</td> <td>&#x0ee84;</td> <td>&#x0ee85;</td> <td>&#x0ee86;</td> <td>&#x0ee87;</td>
<td>&#x0ee88;</td> <td>&#x0ee89;</td> <td>&#x0ee8a;</td> <td>&#x0ee8b;</td> <td>&#x0ee8c;</td> <td>&#x0ee8d;</td> <td>&#x0ee8e;</td> <td>&#x0ee8f;</td>
</tr>
<tr>
<td>&#x0ee90;</td> <td>&#x0ee91;</td> <td>&#x0ee92;</td> <td>&#x0ee93;</td> <td>&#x0ee94;</td> <td>&#x0ee95;</td> <td>&#x0ee96;</td> <td>&#x0ee97;</td>
<td>&#x0ee98;</td> <td>&#x0ee99;</td> <td>&#x0ee9a;</td> <td>&#x0ee9b;</td> <td>&#x0ee9c;</td> <td>&#x0ee9d;</td> <td>&#x0ee9e;</td> <td>&#x0ee9f;</td>
</tr>
<tr>
<td>&#x0eea0;</td> <td>&#x0eea1;</td> <td>&#x0eea2;</td> <td>&#x0eea3;</td> <td>&#x0eea4;</td> <td>&#x0eea5;</td> <td>&#x0eea6;</td> <td>&#x0eea7;</td>
<td>&#x0eea8;</td> <td>&#x0eea9;</td> <td>&#x0eeaa;</td> <td>&#x0eeab;</td> <td>&#x0eeac;</td> <td>&#x0eead;</td> <td>&#x0eeae;</td> <td>&#x0eeaf;</td>
</tr>
<tr>
<td>&#x0eeb0;</td> <td>&#x0eeb1;</td> <td>&#x0eeb2;</td> <td>&#x0eeb3;</td> <td>&#x0eeb4;</td> <td>&#x0eeb5;</td> <td>&#x0eeb6;</td> <td>&#x0eeb7;</td>
<td>&#x0eeb8;</td> <td>&#x0eeb9;</td> <td>&#x0eeba;</td> <td>&#x0eebb;</td> <td>&#x0eebc;</td> <td>&#x0eebd;</td> <td>&#x0eebe;</td> <td>&#x0eebf;</td>
</tr>
<tr>
<td>&#x0eec0;</td> <td>&#x0eec1;</td> <td>&#x0eec2;</td> <td>&#x0eec3;</td> <td>&#x0eec4;</td> <td>&#x0eec5;</td> <td>&#x0eec6;</td> <td>&#x0eec7;</td>
<td>&#x0eec8;</td> <td>&#x0eec9;</td> <td>&#x0eeca;</td> <td>&#x0eecb;</td> <td>&#x0eecc;</td> <td>&#x0eecd;</td> <td>&#x0eece;</td> <td>&#x0eecf;</td>
</tr>
<tr>
<td>&#x0eed0;</td> <td>&#x0eed1;</td> <td>&#x0eed2;</td> <td>&#x0eed3;</td> <td>&#x0eed4;</td> <td>&#x0eed5;</td> <td>&#x0eed6;</td> <td>&#x0eed7;</td>
<td>&#x0eed8;</td> <td>&#x0eed9;</td> <td>&#x0eeda;</td> <td>&#x0eedb;</td> <td>&#x0eedc;</td> <td>&#x0eedd;</td> <td>&#x0eede;</td> <td>&#x0eedf;</td>
</tr>
<tr>
<td>&#x0eee0;</td> <td>&#x0eee1;</td> <td>&#x0eee2;</td> <td>&#x0eee3;</td> <td>&#x0eee4;</td> <td>&#x0eee5;</td> <td>&#x0eee6;</td> <td>&#x0eee7;</td>
<td>&#x0eee8;</td> <td>&#x0eee9;</td> <td>&#x0eeea;</td> <td>&#x0eeeb;</td> <td>&#x0eeec;</td> <td>&#x0eeed;</td> <td>&#x0eeee;</td> <td>&#x0eeef;</td>
</tr>
<tr>
<td>&#x0eef0;</td> <td>&#x0eef1;</td> <td>&#x0eef2;</td> <td>&#x0eef3;</td> <td>&#x0eef4;</td> <td>&#x0eef5;</td> <td>&#x0eef6;</td> <td>&#x0eef7;</td>
<td>&#x0eef8;</td> <td>&#x0eef9;</td> <td>&#x0eefa;</td> <td>&#x0eefb;</td> <td>&#x0eefc;</td> <td>&#x0eefd;</td> <td>&#x0eefe;</td> <td>&#x0eeff;</td>
</tr>
</table>
</div>
<div style="float: left; margin-right: 8px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;lower/upper</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ef00;</td> <td>&#x0ef01;</td> <td>&#x0ef02;</td> <td>&#x0ef03;</td> <td>&#x0ef04;</td> <td>&#x0ef05;</td> <td>&#x0ef06;</td> <td>&#x0ef07;</td>
<td>&#x0ef08;</td> <td>&#x0ef09;</td> <td>&#x0ef0a;</td> <td>&#x0ef0b;</td> <td>&#x0ef0c;</td> <td>&#x0ef0d;</td> <td>&#x0ef0e;</td> <td>&#x0ef0f;</td>
</tr>
<tr>
<td>&#x0ef10;</td> <td>&#x0ef11;</td> <td>&#x0ef12;</td> <td>&#x0ef13;</td> <td>&#x0ef14;</td> <td>&#x0ef15;</td> <td>&#x0ef16;</td> <td>&#x0ef17;</td>
<td>&#x0ef18;</td> <td>&#x0ef19;</td> <td>&#x0ef1a;</td> <td>&#x0ef1b;</td> <td>&#x0ef1c;</td> <td>&#x0ef1d;</td> <td>&#x0ef1e;</td> <td>&#x0ef1f;</td>
</tr>
<tr>
<td>&#x0ef20;</td> <td>&#x0ef21;</td> <td>&#x0ef22;</td> <td>&#x0ef23;</td> <td>&#x0ef24;</td> <td>&#x0ef25;</td> <td>&#x0ef26;</td> <td>&#x0ef27;</td>
<td>&#x0ef28;</td> <td>&#x0ef29;</td> <td>&#x0ef2a;</td> <td>&#x0ef2b;</td> <td>&#x0ef2c;</td> <td>&#x0ef2d;</td> <td>&#x0ef2e;</td> <td>&#x0ef2f;</td>
</tr>
<tr>
<td>&#x0ef30;</td> <td>&#x0ef31;</td> <td>&#x0ef32;</td> <td>&#x0ef33;</td> <td>&#x0ef34;</td> <td>&#x0ef35;</td> <td>&#x0ef36;</td> <td>&#x0ef37;</td>
<td>&#x0ef38;</td> <td>&#x0ef39;</td> <td>&#x0ef3a;</td> <td>&#x0ef3b;</td> <td>&#x0ef3c;</td> <td>&#x0ef3d;</td> <td>&#x0ef3e;</td> <td>&#x0ef3f;</td>
</tr>
<tr>
<td>&#x0ef40;</td> <td>&#x0ef41;</td> <td>&#x0ef42;</td> <td>&#x0ef43;</td> <td>&#x0ef44;</td> <td>&#x0ef45;</td> <td>&#x0ef46;</td> <td>&#x0ef47;</td>
<td>&#x0ef48;</td> <td>&#x0ef49;</td> <td>&#x0ef4a;</td> <td>&#x0ef4b;</td> <td>&#x0ef4c;</td> <td>&#x0ef4d;</td> <td>&#x0ef4e;</td> <td>&#x0ef4f;</td>
</tr>
<tr>
<td>&#x0ef50;</td> <td>&#x0ef51;</td> <td>&#x0ef52;</td> <td>&#x0ef53;</td> <td>&#x0ef54;</td> <td>&#x0ef55;</td> <td>&#x0ef56;</td> <td>&#x0ef57;</td>
<td>&#x0ef58;</td> <td>&#x0ef59;</td> <td>&#x0ef5a;</td> <td>&#x0ef5b;</td> <td>&#x0ef5c;</td> <td>&#x0ef5d;</td> <td>&#x0ef5e;</td> <td>&#x0ef5f;</td>
</tr>
<tr>
<td>&#x0ef60;</td> <td>&#x0ef61;</td> <td>&#x0ef62;</td> <td>&#x0ef63;</td> <td>&#x0ef64;</td> <td>&#x0ef65;</td> <td>&#x0ef66;</td> <td>&#x0ef67;</td>
<td>&#x0ef68;</td> <td>&#x0ef69;</td> <td>&#x0ef6a;</td> <td>&#x0ef6b;</td> <td>&#x0ef6c;</td> <td>&#x0ef6d;</td> <td>&#x0ef6e;</td> <td>&#x0ef6f;</td>
</tr>
<tr>
<td>&#x0ef70;</td> <td>&#x0ef71;</td> <td>&#x0ef72;</td> <td>&#x0ef73;</td> <td>&#x0ef74;</td> <td>&#x0ef75;</td> <td>&#x0ef76;</td> <td>&#x0ef77;</td>
<td>&#x0ef78;</td> <td>&#x0ef79;</td> <td>&#x0ef7a;</td> <td>&#x0ef7b;</td> <td>&#x0ef7c;</td> <td>&#x0ef7d;</td> <td>&#x0ef7e;</td> <td>&#x0ef7f;</td>
</tr>
<tr>
<td>&#x0ef80;</td> <td>&#x0ef81;</td> <td>&#x0ef82;</td> <td>&#x0ef83;</td> <td>&#x0ef84;</td> <td>&#x0ef85;</td> <td>&#x0ef86;</td> <td>&#x0ef87;</td>
<td>&#x0ef88;</td> <td>&#x0ef89;</td> <td>&#x0ef8a;</td> <td>&#x0ef8b;</td> <td>&#x0ef8c;</td> <td>&#x0ef8d;</td> <td>&#x0ef8e;</td> <td>&#x0ef8f;</td>
</tr>
<tr>
<td>&#x0ef90;</td> <td>&#x0ef91;</td> <td>&#x0ef92;</td> <td>&#x0ef93;</td> <td>&#x0ef94;</td> <td>&#x0ef95;</td> <td>&#x0ef96;</td> <td>&#x0ef97;</td>
<td>&#x0ef98;</td> <td>&#x0ef99;</td> <td>&#x0ef9a;</td> <td>&#x0ef9b;</td> <td>&#x0ef9c;</td> <td>&#x0ef9d;</td> <td>&#x0ef9e;</td> <td>&#x0ef9f;</td>
</tr>
<tr>
<td>&#x0efa0;</td> <td>&#x0efa1;</td> <td>&#x0efa2;</td> <td>&#x0efa3;</td> <td>&#x0efa4;</td> <td>&#x0efa5;</td> <td>&#x0efa6;</td> <td>&#x0efa7;</td>
<td>&#x0efa8;</td> <td>&#x0efa9;</td> <td>&#x0efaa;</td> <td>&#x0efab;</td> <td>&#x0efac;</td> <td>&#x0efad;</td> <td>&#x0efae;</td> <td>&#x0efaf;</td>
</tr>
<tr>
<td>&#x0efb0;</td> <td>&#x0efb1;</td> <td>&#x0efb2;</td> <td>&#x0efb3;</td> <td>&#x0efb4;</td> <td>&#x0efb5;</td> <td>&#x0efb6;</td> <td>&#x0efb7;</td>
<td>&#x0efb8;</td> <td>&#x0efb9;</td> <td>&#x0efba;</td> <td>&#x0efbb;</td> <td>&#x0efbc;</td> <td>&#x0efbd;</td> <td>&#x0efbe;</td> <td>&#x0efbf;</td>
</tr>
<tr>
<td>&#x0efc0;</td> <td>&#x0efc1;</td> <td>&#x0efc2;</td> <td>&#x0efc3;</td> <td>&#x0efc4;</td> <td>&#x0efc5;</td> <td>&#x0efc6;</td> <td>&#x0efc7;</td>
<td>&#x0efc8;</td> <td>&#x0efc9;</td> <td>&#x0efca;</td> <td>&#x0efcb;</td> <td>&#x0efcc;</td> <td>&#x0efcd;</td> <td>&#x0efce;</td> <td>&#x0efcf;</td>
</tr>
<tr>
<td>&#x0efd0;</td> <td>&#x0efd1;</td> <td>&#x0efd2;</td> <td>&#x0efd3;</td> <td>&#x0efd4;</td> <td>&#x0efd5;</td> <td>&#x0efd6;</td> <td>&#x0efd7;</td>
<td>&#x0efd8;</td> <td>&#x0efd9;</td> <td>&#x0efda;</td> <td>&#x0efdb;</td> <td>&#x0efdc;</td> <td>&#x0efdd;</td> <td>&#x0efde;</td> <td>&#x0efdf;</td>
</tr>
<tr>
<td>&#x0efe0;</td> <td>&#x0efe1;</td> <td>&#x0efe2;</td> <td>&#x0efe3;</td> <td>&#x0efe4;</td> <td>&#x0efe5;</td> <td>&#x0efe6;</td> <td>&#x0efe7;</td>
<td>&#x0efe8;</td> <td>&#x0efe9;</td> <td>&#x0efea;</td> <td>&#x0efeb;</td> <td>&#x0efec;</td> <td>&#x0efed;</td> <td>&#x0efee;</td> <td>&#x0efef;</td>
</tr>
<tr>
<td>&#x0eff0;</td> <td>&#x0eff1;</td> <td>&#x0eff2;</td> <td>&#x0eff3;</td> <td>&#x0eff4;</td> <td>&#x0eff5;</td> <td>&#x0eff6;</td> <td>&#x0eff7;</td>
<td>&#x0eff8;</td> <td>&#x0eff9;</td> <td>&#x0effa;</td> <td>&#x0effb;</td> <td>&#x0effc;</td> <td>&#x0effd;</td> <td>&#x0effe;</td> <td>&#x0efff;</td>
</tr>
</table>
</div>
</div>
</body>
</html>

@ -1,170 +0,0 @@
<html>
<head>
<title> C64 Pro Mono: OTF (OpenType) test </title>
<style type="text/css">
@font-face{font-family:"C64 Pro Mono Local";src:url(../fonts/C64_Pro_Mono-STYLE.otf) format("opentype")}@font-face{font-family:"C64 Pro Local";src:url(../fonts/C64_Pro-STYLE.otf) format("opentype")}.c64pm{font:normal 24pt/32px "C64 Pro Mono Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.c64p{font:normal 24pt/32px "C64 Pro Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.px8{font-size:6pt;line-height:8px}.px16{font-size:12pt;line-height:16px}.px24{font-size:18pt;line-height:24px}.px32{font-size:24pt;line-height:32px}.px40{font-size:30pt;line-height:40px}table,td,tr{padding:0;margin:0}tbody,td,thead,tr{background-color:inherit}td{font:inherit;border-right:2px solid #888;border-bottom:2px solid #888}td:first-child{border-left:2px solid #888}tr:first-child td{border-top:2px solid #888}td:hover{background-color:#000!important;color:#fff!important}table{border-top:4px solid #000;border-left:4px solid #000;border-right:4px solid #000;border-bottom:4px solid #000}.d020-00{background-color:#000}.d021-00{color:#000}.d020-06{background-color:#352879}.d021-06{color:#352879}.d020-0e{background-color:#6c5eb5}.d021-0e{color:#6c5eb5}
</style>
</head>
<body>
<div>
<div class="c64p px16">
See: <a href="http://caniuse.com/#feat=otf">http://caniuse.com/#feat=otf</a>
<p>If you do not see the font, you may be using a browser that disallows local font loading due to CORS (probably Firefox or IE).</p>
</div>
<br/>
<br/>
<div style="float: left; margin-right: 8px; margin-bottom:16px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;upper/graphics</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ee00;</td> <td>&#x0ee01;</td> <td>&#x0ee02;</td> <td>&#x0ee03;</td> <td>&#x0ee04;</td> <td>&#x0ee05;</td> <td>&#x0ee06;</td> <td>&#x0ee07;</td>
<td>&#x0ee08;</td> <td>&#x0ee09;</td> <td>&#x0ee0a;</td> <td>&#x0ee0b;</td> <td>&#x0ee0c;</td> <td>&#x0ee0d;</td> <td>&#x0ee0e;</td> <td>&#x0ee0f;</td>
</tr>
<tr>
<td>&#x0ee10;</td> <td>&#x0ee11;</td> <td>&#x0ee12;</td> <td>&#x0ee13;</td> <td>&#x0ee14;</td> <td>&#x0ee15;</td> <td>&#x0ee16;</td> <td>&#x0ee17;</td>
<td>&#x0ee18;</td> <td>&#x0ee19;</td> <td>&#x0ee1a;</td> <td>&#x0ee1b;</td> <td>&#x0ee1c;</td> <td>&#x0ee1d;</td> <td>&#x0ee1e;</td> <td>&#x0ee1f;</td>
</tr>
<tr>
<td>&#x0ee20;</td> <td>&#x0ee21;</td> <td>&#x0ee22;</td> <td>&#x0ee23;</td> <td>&#x0ee24;</td> <td>&#x0ee25;</td> <td>&#x0ee26;</td> <td>&#x0ee27;</td>
<td>&#x0ee28;</td> <td>&#x0ee29;</td> <td>&#x0ee2a;</td> <td>&#x0ee2b;</td> <td>&#x0ee2c;</td> <td>&#x0ee2d;</td> <td>&#x0ee2e;</td> <td>&#x0ee2f;</td>
</tr>
<tr>
<td>&#x0ee30;</td> <td>&#x0ee31;</td> <td>&#x0ee32;</td> <td>&#x0ee33;</td> <td>&#x0ee34;</td> <td>&#x0ee35;</td> <td>&#x0ee36;</td> <td>&#x0ee37;</td>
<td>&#x0ee38;</td> <td>&#x0ee39;</td> <td>&#x0ee3a;</td> <td>&#x0ee3b;</td> <td>&#x0ee3c;</td> <td>&#x0ee3d;</td> <td>&#x0ee3e;</td> <td>&#x0ee3f;</td>
</tr>
<tr>
<td>&#x0ee40;</td> <td>&#x0ee41;</td> <td>&#x0ee42;</td> <td>&#x0ee43;</td> <td>&#x0ee44;</td> <td>&#x0ee45;</td> <td>&#x0ee46;</td> <td>&#x0ee47;</td>
<td>&#x0ee48;</td> <td>&#x0ee49;</td> <td>&#x0ee4a;</td> <td>&#x0ee4b;</td> <td>&#x0ee4c;</td> <td>&#x0ee4d;</td> <td>&#x0ee4e;</td> <td>&#x0ee4f;</td>
</tr>
<tr>
<td>&#x0ee50;</td> <td>&#x0ee51;</td> <td>&#x0ee52;</td> <td>&#x0ee53;</td> <td>&#x0ee54;</td> <td>&#x0ee55;</td> <td>&#x0ee56;</td> <td>&#x0ee57;</td>
<td>&#x0ee58;</td> <td>&#x0ee59;</td> <td>&#x0ee5a;</td> <td>&#x0ee5b;</td> <td>&#x0ee5c;</td> <td>&#x0ee5d;</td> <td>&#x0ee5e;</td> <td>&#x0ee5f;</td>
</tr>
<tr>
<td>&#x0ee60;</td> <td>&#x0ee61;</td> <td>&#x0ee62;</td> <td>&#x0ee63;</td> <td>&#x0ee64;</td> <td>&#x0ee65;</td> <td>&#x0ee66;</td> <td>&#x0ee67;</td>
<td>&#x0ee68;</td> <td>&#x0ee69;</td> <td>&#x0ee6a;</td> <td>&#x0ee6b;</td> <td>&#x0ee6c;</td> <td>&#x0ee6d;</td> <td>&#x0ee6e;</td> <td>&#x0ee6f;</td>
</tr>
<tr>
<td>&#x0ee70;</td> <td>&#x0ee71;</td> <td>&#x0ee72;</td> <td>&#x0ee73;</td> <td>&#x0ee74;</td> <td>&#x0ee75;</td> <td>&#x0ee76;</td> <td>&#x0ee77;</td>
<td>&#x0ee78;</td> <td>&#x0ee79;</td> <td>&#x0ee7a;</td> <td>&#x0ee7b;</td> <td>&#x0ee7c;</td> <td>&#x0ee7d;</td> <td>&#x0ee7e;</td> <td>&#x0ee7f;</td>
</tr>
<tr>
<td>&#x0ee80;</td> <td>&#x0ee81;</td> <td>&#x0ee82;</td> <td>&#x0ee83;</td> <td>&#x0ee84;</td> <td>&#x0ee85;</td> <td>&#x0ee86;</td> <td>&#x0ee87;</td>
<td>&#x0ee88;</td> <td>&#x0ee89;</td> <td>&#x0ee8a;</td> <td>&#x0ee8b;</td> <td>&#x0ee8c;</td> <td>&#x0ee8d;</td> <td>&#x0ee8e;</td> <td>&#x0ee8f;</td>
</tr>
<tr>
<td>&#x0ee90;</td> <td>&#x0ee91;</td> <td>&#x0ee92;</td> <td>&#x0ee93;</td> <td>&#x0ee94;</td> <td>&#x0ee95;</td> <td>&#x0ee96;</td> <td>&#x0ee97;</td>
<td>&#x0ee98;</td> <td>&#x0ee99;</td> <td>&#x0ee9a;</td> <td>&#x0ee9b;</td> <td>&#x0ee9c;</td> <td>&#x0ee9d;</td> <td>&#x0ee9e;</td> <td>&#x0ee9f;</td>
</tr>
<tr>
<td>&#x0eea0;</td> <td>&#x0eea1;</td> <td>&#x0eea2;</td> <td>&#x0eea3;</td> <td>&#x0eea4;</td> <td>&#x0eea5;</td> <td>&#x0eea6;</td> <td>&#x0eea7;</td>
<td>&#x0eea8;</td> <td>&#x0eea9;</td> <td>&#x0eeaa;</td> <td>&#x0eeab;</td> <td>&#x0eeac;</td> <td>&#x0eead;</td> <td>&#x0eeae;</td> <td>&#x0eeaf;</td>
</tr>
<tr>
<td>&#x0eeb0;</td> <td>&#x0eeb1;</td> <td>&#x0eeb2;</td> <td>&#x0eeb3;</td> <td>&#x0eeb4;</td> <td>&#x0eeb5;</td> <td>&#x0eeb6;</td> <td>&#x0eeb7;</td>
<td>&#x0eeb8;</td> <td>&#x0eeb9;</td> <td>&#x0eeba;</td> <td>&#x0eebb;</td> <td>&#x0eebc;</td> <td>&#x0eebd;</td> <td>&#x0eebe;</td> <td>&#x0eebf;</td>
</tr>
<tr>
<td>&#x0eec0;</td> <td>&#x0eec1;</td> <td>&#x0eec2;</td> <td>&#x0eec3;</td> <td>&#x0eec4;</td> <td>&#x0eec5;</td> <td>&#x0eec6;</td> <td>&#x0eec7;</td>
<td>&#x0eec8;</td> <td>&#x0eec9;</td> <td>&#x0eeca;</td> <td>&#x0eecb;</td> <td>&#x0eecc;</td> <td>&#x0eecd;</td> <td>&#x0eece;</td> <td>&#x0eecf;</td>
</tr>
<tr>
<td>&#x0eed0;</td> <td>&#x0eed1;</td> <td>&#x0eed2;</td> <td>&#x0eed3;</td> <td>&#x0eed4;</td> <td>&#x0eed5;</td> <td>&#x0eed6;</td> <td>&#x0eed7;</td>
<td>&#x0eed8;</td> <td>&#x0eed9;</td> <td>&#x0eeda;</td> <td>&#x0eedb;</td> <td>&#x0eedc;</td> <td>&#x0eedd;</td> <td>&#x0eede;</td> <td>&#x0eedf;</td>
</tr>
<tr>
<td>&#x0eee0;</td> <td>&#x0eee1;</td> <td>&#x0eee2;</td> <td>&#x0eee3;</td> <td>&#x0eee4;</td> <td>&#x0eee5;</td> <td>&#x0eee6;</td> <td>&#x0eee7;</td>
<td>&#x0eee8;</td> <td>&#x0eee9;</td> <td>&#x0eeea;</td> <td>&#x0eeeb;</td> <td>&#x0eeec;</td> <td>&#x0eeed;</td> <td>&#x0eeee;</td> <td>&#x0eeef;</td>
</tr>
<tr>
<td>&#x0eef0;</td> <td>&#x0eef1;</td> <td>&#x0eef2;</td> <td>&#x0eef3;</td> <td>&#x0eef4;</td> <td>&#x0eef5;</td> <td>&#x0eef6;</td> <td>&#x0eef7;</td>
<td>&#x0eef8;</td> <td>&#x0eef9;</td> <td>&#x0eefa;</td> <td>&#x0eefb;</td> <td>&#x0eefc;</td> <td>&#x0eefd;</td> <td>&#x0eefe;</td> <td>&#x0eeff;</td>
</tr>
</table>
</div>
<div style="float: left; margin-right: 8px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;lower/upper</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ef00;</td> <td>&#x0ef01;</td> <td>&#x0ef02;</td> <td>&#x0ef03;</td> <td>&#x0ef04;</td> <td>&#x0ef05;</td> <td>&#x0ef06;</td> <td>&#x0ef07;</td>
<td>&#x0ef08;</td> <td>&#x0ef09;</td> <td>&#x0ef0a;</td> <td>&#x0ef0b;</td> <td>&#x0ef0c;</td> <td>&#x0ef0d;</td> <td>&#x0ef0e;</td> <td>&#x0ef0f;</td>
</tr>
<tr>
<td>&#x0ef10;</td> <td>&#x0ef11;</td> <td>&#x0ef12;</td> <td>&#x0ef13;</td> <td>&#x0ef14;</td> <td>&#x0ef15;</td> <td>&#x0ef16;</td> <td>&#x0ef17;</td>
<td>&#x0ef18;</td> <td>&#x0ef19;</td> <td>&#x0ef1a;</td> <td>&#x0ef1b;</td> <td>&#x0ef1c;</td> <td>&#x0ef1d;</td> <td>&#x0ef1e;</td> <td>&#x0ef1f;</td>
</tr>
<tr>
<td>&#x0ef20;</td> <td>&#x0ef21;</td> <td>&#x0ef22;</td> <td>&#x0ef23;</td> <td>&#x0ef24;</td> <td>&#x0ef25;</td> <td>&#x0ef26;</td> <td>&#x0ef27;</td>
<td>&#x0ef28;</td> <td>&#x0ef29;</td> <td>&#x0ef2a;</td> <td>&#x0ef2b;</td> <td>&#x0ef2c;</td> <td>&#x0ef2d;</td> <td>&#x0ef2e;</td> <td>&#x0ef2f;</td>
</tr>
<tr>
<td>&#x0ef30;</td> <td>&#x0ef31;</td> <td>&#x0ef32;</td> <td>&#x0ef33;</td> <td>&#x0ef34;</td> <td>&#x0ef35;</td> <td>&#x0ef36;</td> <td>&#x0ef37;</td>
<td>&#x0ef38;</td> <td>&#x0ef39;</td> <td>&#x0ef3a;</td> <td>&#x0ef3b;</td> <td>&#x0ef3c;</td> <td>&#x0ef3d;</td> <td>&#x0ef3e;</td> <td>&#x0ef3f;</td>
</tr>
<tr>
<td>&#x0ef40;</td> <td>&#x0ef41;</td> <td>&#x0ef42;</td> <td>&#x0ef43;</td> <td>&#x0ef44;</td> <td>&#x0ef45;</td> <td>&#x0ef46;</td> <td>&#x0ef47;</td>
<td>&#x0ef48;</td> <td>&#x0ef49;</td> <td>&#x0ef4a;</td> <td>&#x0ef4b;</td> <td>&#x0ef4c;</td> <td>&#x0ef4d;</td> <td>&#x0ef4e;</td> <td>&#x0ef4f;</td>
</tr>
<tr>
<td>&#x0ef50;</td> <td>&#x0ef51;</td> <td>&#x0ef52;</td> <td>&#x0ef53;</td> <td>&#x0ef54;</td> <td>&#x0ef55;</td> <td>&#x0ef56;</td> <td>&#x0ef57;</td>
<td>&#x0ef58;</td> <td>&#x0ef59;</td> <td>&#x0ef5a;</td> <td>&#x0ef5b;</td> <td>&#x0ef5c;</td> <td>&#x0ef5d;</td> <td>&#x0ef5e;</td> <td>&#x0ef5f;</td>
</tr>
<tr>
<td>&#x0ef60;</td> <td>&#x0ef61;</td> <td>&#x0ef62;</td> <td>&#x0ef63;</td> <td>&#x0ef64;</td> <td>&#x0ef65;</td> <td>&#x0ef66;</td> <td>&#x0ef67;</td>
<td>&#x0ef68;</td> <td>&#x0ef69;</td> <td>&#x0ef6a;</td> <td>&#x0ef6b;</td> <td>&#x0ef6c;</td> <td>&#x0ef6d;</td> <td>&#x0ef6e;</td> <td>&#x0ef6f;</td>
</tr>
<tr>
<td>&#x0ef70;</td> <td>&#x0ef71;</td> <td>&#x0ef72;</td> <td>&#x0ef73;</td> <td>&#x0ef74;</td> <td>&#x0ef75;</td> <td>&#x0ef76;</td> <td>&#x0ef77;</td>
<td>&#x0ef78;</td> <td>&#x0ef79;</td> <td>&#x0ef7a;</td> <td>&#x0ef7b;</td> <td>&#x0ef7c;</td> <td>&#x0ef7d;</td> <td>&#x0ef7e;</td> <td>&#x0ef7f;</td>
</tr>
<tr>
<td>&#x0ef80;</td> <td>&#x0ef81;</td> <td>&#x0ef82;</td> <td>&#x0ef83;</td> <td>&#x0ef84;</td> <td>&#x0ef85;</td> <td>&#x0ef86;</td> <td>&#x0ef87;</td>
<td>&#x0ef88;</td> <td>&#x0ef89;</td> <td>&#x0ef8a;</td> <td>&#x0ef8b;</td> <td>&#x0ef8c;</td> <td>&#x0ef8d;</td> <td>&#x0ef8e;</td> <td>&#x0ef8f;</td>
</tr>
<tr>
<td>&#x0ef90;</td> <td>&#x0ef91;</td> <td>&#x0ef92;</td> <td>&#x0ef93;</td> <td>&#x0ef94;</td> <td>&#x0ef95;</td> <td>&#x0ef96;</td> <td>&#x0ef97;</td>
<td>&#x0ef98;</td> <td>&#x0ef99;</td> <td>&#x0ef9a;</td> <td>&#x0ef9b;</td> <td>&#x0ef9c;</td> <td>&#x0ef9d;</td> <td>&#x0ef9e;</td> <td>&#x0ef9f;</td>
</tr>
<tr>
<td>&#x0efa0;</td> <td>&#x0efa1;</td> <td>&#x0efa2;</td> <td>&#x0efa3;</td> <td>&#x0efa4;</td> <td>&#x0efa5;</td> <td>&#x0efa6;</td> <td>&#x0efa7;</td>
<td>&#x0efa8;</td> <td>&#x0efa9;</td> <td>&#x0efaa;</td> <td>&#x0efab;</td> <td>&#x0efac;</td> <td>&#x0efad;</td> <td>&#x0efae;</td> <td>&#x0efaf;</td>
</tr>
<tr>
<td>&#x0efb0;</td> <td>&#x0efb1;</td> <td>&#x0efb2;</td> <td>&#x0efb3;</td> <td>&#x0efb4;</td> <td>&#x0efb5;</td> <td>&#x0efb6;</td> <td>&#x0efb7;</td>
<td>&#x0efb8;</td> <td>&#x0efb9;</td> <td>&#x0efba;</td> <td>&#x0efbb;</td> <td>&#x0efbc;</td> <td>&#x0efbd;</td> <td>&#x0efbe;</td> <td>&#x0efbf;</td>
</tr>
<tr>
<td>&#x0efc0;</td> <td>&#x0efc1;</td> <td>&#x0efc2;</td> <td>&#x0efc3;</td> <td>&#x0efc4;</td> <td>&#x0efc5;</td> <td>&#x0efc6;</td> <td>&#x0efc7;</td>
<td>&#x0efc8;</td> <td>&#x0efc9;</td> <td>&#x0efca;</td> <td>&#x0efcb;</td> <td>&#x0efcc;</td> <td>&#x0efcd;</td> <td>&#x0efce;</td> <td>&#x0efcf;</td>
</tr>
<tr>
<td>&#x0efd0;</td> <td>&#x0efd1;</td> <td>&#x0efd2;</td> <td>&#x0efd3;</td> <td>&#x0efd4;</td> <td>&#x0efd5;</td> <td>&#x0efd6;</td> <td>&#x0efd7;</td>
<td>&#x0efd8;</td> <td>&#x0efd9;</td> <td>&#x0efda;</td> <td>&#x0efdb;</td> <td>&#x0efdc;</td> <td>&#x0efdd;</td> <td>&#x0efde;</td> <td>&#x0efdf;</td>
</tr>
<tr>
<td>&#x0efe0;</td> <td>&#x0efe1;</td> <td>&#x0efe2;</td> <td>&#x0efe3;</td> <td>&#x0efe4;</td> <td>&#x0efe5;</td> <td>&#x0efe6;</td> <td>&#x0efe7;</td>
<td>&#x0efe8;</td> <td>&#x0efe9;</td> <td>&#x0efea;</td> <td>&#x0efeb;</td> <td>&#x0efec;</td> <td>&#x0efed;</td> <td>&#x0efee;</td> <td>&#x0efef;</td>
</tr>
<tr>
<td>&#x0eff0;</td> <td>&#x0eff1;</td> <td>&#x0eff2;</td> <td>&#x0eff3;</td> <td>&#x0eff4;</td> <td>&#x0eff5;</td> <td>&#x0eff6;</td> <td>&#x0eff7;</td>
<td>&#x0eff8;</td> <td>&#x0eff9;</td> <td>&#x0effa;</td> <td>&#x0effb;</td> <td>&#x0effc;</td> <td>&#x0effd;</td> <td>&#x0effe;</td> <td>&#x0efff;</td>
</tr>
</table>
</div>
</div>
</body>
</html>

@ -1,169 +0,0 @@
<html>
<head>
<title> C64 Pro Mono: TTF (TrueType) test </title>
<style type="text/css">
@font-face{font-family:"C64 Pro Mono Local";src:url(../fonts/C64_Pro_Mono-STYLE.ttf) format("truetype")}@font-face{font-family:"C64 Pro Local";src:url(../fonts/C64_Pro-STYLE.ttf) format("truetype")}.c64pm{font:normal 24pt/32px "C64 Pro Mono Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.c64p{font:normal 24pt/32px "C64 Pro Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.px8{font-size:6pt;line-height:8px}.px16{font-size:12pt;line-height:16px}.px24{font-size:18pt;line-height:24px}.px32{font-size:24pt;line-height:32px}.px40{font-size:30pt;line-height:40px}table,td,tr{padding:0;margin:0}tbody,td,thead,tr{background-color:inherit}td{font:inherit;border-right:2px solid #888;border-bottom:2px solid #888}td:first-child{border-left:2px solid #888}tr:first-child td{border-top:2px solid #888}td:hover{background-color:#000!important;color:#fff!important}table{border-top:4px solid #000;border-left:4px solid #000;border-right:4px solid #000;border-bottom:4px solid #000}.d020-00{background-color:#000}.d021-00{color:#000}.d020-06{background-color:#352879}.d021-06{color:#352879}.d020-0e{background-color:#6c5eb5}.d021-0e{color:#6c5eb5}
</style>
</head>
<body>
<div>
<div class="c64p px16">
See: <a href="http://caniuse.com/#feat=ttf">http://caniuse.com/#feat=ttf</a>
<p>If you do not see the font, you may be using a browser that disallows local font loading due to CORS (probably Firefox or IE).</p>
</div>
<br/>
<br/>
<div style="float: left; margin-right: 8px; margin-bottom:16px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;upper/graphics</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ee00;</td> <td>&#x0ee01;</td> <td>&#x0ee02;</td> <td>&#x0ee03;</td> <td>&#x0ee04;</td> <td>&#x0ee05;</td> <td>&#x0ee06;</td> <td>&#x0ee07;</td>
<td>&#x0ee08;</td> <td>&#x0ee09;</td> <td>&#x0ee0a;</td> <td>&#x0ee0b;</td> <td>&#x0ee0c;</td> <td>&#x0ee0d;</td> <td>&#x0ee0e;</td> <td>&#x0ee0f;</td>
</tr>
<tr>
<td>&#x0ee10;</td> <td>&#x0ee11;</td> <td>&#x0ee12;</td> <td>&#x0ee13;</td> <td>&#x0ee14;</td> <td>&#x0ee15;</td> <td>&#x0ee16;</td> <td>&#x0ee17;</td>
<td>&#x0ee18;</td> <td>&#x0ee19;</td> <td>&#x0ee1a;</td> <td>&#x0ee1b;</td> <td>&#x0ee1c;</td> <td>&#x0ee1d;</td> <td>&#x0ee1e;</td> <td>&#x0ee1f;</td>
</tr>
<tr>
<td>&#x0ee20;</td> <td>&#x0ee21;</td> <td>&#x0ee22;</td> <td>&#x0ee23;</td> <td>&#x0ee24;</td> <td>&#x0ee25;</td> <td>&#x0ee26;</td> <td>&#x0ee27;</td>
<td>&#x0ee28;</td> <td>&#x0ee29;</td> <td>&#x0ee2a;</td> <td>&#x0ee2b;</td> <td>&#x0ee2c;</td> <td>&#x0ee2d;</td> <td>&#x0ee2e;</td> <td>&#x0ee2f;</td>
</tr>
<tr>
<td>&#x0ee30;</td> <td>&#x0ee31;</td> <td>&#x0ee32;</td> <td>&#x0ee33;</td> <td>&#x0ee34;</td> <td>&#x0ee35;</td> <td>&#x0ee36;</td> <td>&#x0ee37;</td>
<td>&#x0ee38;</td> <td>&#x0ee39;</td> <td>&#x0ee3a;</td> <td>&#x0ee3b;</td> <td>&#x0ee3c;</td> <td>&#x0ee3d;</td> <td>&#x0ee3e;</td> <td>&#x0ee3f;</td>
</tr>
<tr>
<td>&#x0ee40;</td> <td>&#x0ee41;</td> <td>&#x0ee42;</td> <td>&#x0ee43;</td> <td>&#x0ee44;</td> <td>&#x0ee45;</td> <td>&#x0ee46;</td> <td>&#x0ee47;</td>
<td>&#x0ee48;</td> <td>&#x0ee49;</td> <td>&#x0ee4a;</td> <td>&#x0ee4b;</td> <td>&#x0ee4c;</td> <td>&#x0ee4d;</td> <td>&#x0ee4e;</td> <td>&#x0ee4f;</td>
</tr>
<tr>
<td>&#x0ee50;</td> <td>&#x0ee51;</td> <td>&#x0ee52;</td> <td>&#x0ee53;</td> <td>&#x0ee54;</td> <td>&#x0ee55;</td> <td>&#x0ee56;</td> <td>&#x0ee57;</td>
<td>&#x0ee58;</td> <td>&#x0ee59;</td> <td>&#x0ee5a;</td> <td>&#x0ee5b;</td> <td>&#x0ee5c;</td> <td>&#x0ee5d;</td> <td>&#x0ee5e;</td> <td>&#x0ee5f;</td>
</tr>
<tr>
<td>&#x0ee60;</td> <td>&#x0ee61;</td> <td>&#x0ee62;</td> <td>&#x0ee63;</td> <td>&#x0ee64;</td> <td>&#x0ee65;</td> <td>&#x0ee66;</td> <td>&#x0ee67;</td>
<td>&#x0ee68;</td> <td>&#x0ee69;</td> <td>&#x0ee6a;</td> <td>&#x0ee6b;</td> <td>&#x0ee6c;</td> <td>&#x0ee6d;</td> <td>&#x0ee6e;</td> <td>&#x0ee6f;</td>
</tr>
<tr>
<td>&#x0ee70;</td> <td>&#x0ee71;</td> <td>&#x0ee72;</td> <td>&#x0ee73;</td> <td>&#x0ee74;</td> <td>&#x0ee75;</td> <td>&#x0ee76;</td> <td>&#x0ee77;</td>
<td>&#x0ee78;</td> <td>&#x0ee79;</td> <td>&#x0ee7a;</td> <td>&#x0ee7b;</td> <td>&#x0ee7c;</td> <td>&#x0ee7d;</td> <td>&#x0ee7e;</td> <td>&#x0ee7f;</td>
</tr>
<tr>
<td>&#x0ee80;</td> <td>&#x0ee81;</td> <td>&#x0ee82;</td> <td>&#x0ee83;</td> <td>&#x0ee84;</td> <td>&#x0ee85;</td> <td>&#x0ee86;</td> <td>&#x0ee87;</td>
<td>&#x0ee88;</td> <td>&#x0ee89;</td> <td>&#x0ee8a;</td> <td>&#x0ee8b;</td> <td>&#x0ee8c;</td> <td>&#x0ee8d;</td> <td>&#x0ee8e;</td> <td>&#x0ee8f;</td>
</tr>
<tr>
<td>&#x0ee90;</td> <td>&#x0ee91;</td> <td>&#x0ee92;</td> <td>&#x0ee93;</td> <td>&#x0ee94;</td> <td>&#x0ee95;</td> <td>&#x0ee96;</td> <td>&#x0ee97;</td>
<td>&#x0ee98;</td> <td>&#x0ee99;</td> <td>&#x0ee9a;</td> <td>&#x0ee9b;</td> <td>&#x0ee9c;</td> <td>&#x0ee9d;</td> <td>&#x0ee9e;</td> <td>&#x0ee9f;</td>
</tr>
<tr>
<td>&#x0eea0;</td> <td>&#x0eea1;</td> <td>&#x0eea2;</td> <td>&#x0eea3;</td> <td>&#x0eea4;</td> <td>&#x0eea5;</td> <td>&#x0eea6;</td> <td>&#x0eea7;</td>
<td>&#x0eea8;</td> <td>&#x0eea9;</td> <td>&#x0eeaa;</td> <td>&#x0eeab;</td> <td>&#x0eeac;</td> <td>&#x0eead;</td> <td>&#x0eeae;</td> <td>&#x0eeaf;</td>
</tr>
<tr>
<td>&#x0eeb0;</td> <td>&#x0eeb1;</td> <td>&#x0eeb2;</td> <td>&#x0eeb3;</td> <td>&#x0eeb4;</td> <td>&#x0eeb5;</td> <td>&#x0eeb6;</td> <td>&#x0eeb7;</td>
<td>&#x0eeb8;</td> <td>&#x0eeb9;</td> <td>&#x0eeba;</td> <td>&#x0eebb;</td> <td>&#x0eebc;</td> <td>&#x0eebd;</td> <td>&#x0eebe;</td> <td>&#x0eebf;</td>
</tr>
<tr>
<td>&#x0eec0;</td> <td>&#x0eec1;</td> <td>&#x0eec2;</td> <td>&#x0eec3;</td> <td>&#x0eec4;</td> <td>&#x0eec5;</td> <td>&#x0eec6;</td> <td>&#x0eec7;</td>
<td>&#x0eec8;</td> <td>&#x0eec9;</td> <td>&#x0eeca;</td> <td>&#x0eecb;</td> <td>&#x0eecc;</td> <td>&#x0eecd;</td> <td>&#x0eece;</td> <td>&#x0eecf;</td>
</tr>
<tr>
<td>&#x0eed0;</td> <td>&#x0eed1;</td> <td>&#x0eed2;</td> <td>&#x0eed3;</td> <td>&#x0eed4;</td> <td>&#x0eed5;</td> <td>&#x0eed6;</td> <td>&#x0eed7;</td>
<td>&#x0eed8;</td> <td>&#x0eed9;</td> <td>&#x0eeda;</td> <td>&#x0eedb;</td> <td>&#x0eedc;</td> <td>&#x0eedd;</td> <td>&#x0eede;</td> <td>&#x0eedf;</td>
</tr>
<tr>
<td>&#x0eee0;</td> <td>&#x0eee1;</td> <td>&#x0eee2;</td> <td>&#x0eee3;</td> <td>&#x0eee4;</td> <td>&#x0eee5;</td> <td>&#x0eee6;</td> <td>&#x0eee7;</td>
<td>&#x0eee8;</td> <td>&#x0eee9;</td> <td>&#x0eeea;</td> <td>&#x0eeeb;</td> <td>&#x0eeec;</td> <td>&#x0eeed;</td> <td>&#x0eeee;</td> <td>&#x0eeef;</td>
</tr>
<tr>
<td>&#x0eef0;</td> <td>&#x0eef1;</td> <td>&#x0eef2;</td> <td>&#x0eef3;</td> <td>&#x0eef4;</td> <td>&#x0eef5;</td> <td>&#x0eef6;</td> <td>&#x0eef7;</td>
<td>&#x0eef8;</td> <td>&#x0eef9;</td> <td>&#x0eefa;</td> <td>&#x0eefb;</td> <td>&#x0eefc;</td> <td>&#x0eefd;</td> <td>&#x0eefe;</td> <td>&#x0eeff;</td>
</tr>
</table>
</div>
<div style="float: left; margin-right: 8px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;lower/upper</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ef00;</td> <td>&#x0ef01;</td> <td>&#x0ef02;</td> <td>&#x0ef03;</td> <td>&#x0ef04;</td> <td>&#x0ef05;</td> <td>&#x0ef06;</td> <td>&#x0ef07;</td>
<td>&#x0ef08;</td> <td>&#x0ef09;</td> <td>&#x0ef0a;</td> <td>&#x0ef0b;</td> <td>&#x0ef0c;</td> <td>&#x0ef0d;</td> <td>&#x0ef0e;</td> <td>&#x0ef0f;</td>
</tr>
<tr>
<td>&#x0ef10;</td> <td>&#x0ef11;</td> <td>&#x0ef12;</td> <td>&#x0ef13;</td> <td>&#x0ef14;</td> <td>&#x0ef15;</td> <td>&#x0ef16;</td> <td>&#x0ef17;</td>
<td>&#x0ef18;</td> <td>&#x0ef19;</td> <td>&#x0ef1a;</td> <td>&#x0ef1b;</td> <td>&#x0ef1c;</td> <td>&#x0ef1d;</td> <td>&#x0ef1e;</td> <td>&#x0ef1f;</td>
</tr>
<tr>
<td>&#x0ef20;</td> <td>&#x0ef21;</td> <td>&#x0ef22;</td> <td>&#x0ef23;</td> <td>&#x0ef24;</td> <td>&#x0ef25;</td> <td>&#x0ef26;</td> <td>&#x0ef27;</td>
<td>&#x0ef28;</td> <td>&#x0ef29;</td> <td>&#x0ef2a;</td> <td>&#x0ef2b;</td> <td>&#x0ef2c;</td> <td>&#x0ef2d;</td> <td>&#x0ef2e;</td> <td>&#x0ef2f;</td>
</tr>
<tr>
<td>&#x0ef30;</td> <td>&#x0ef31;</td> <td>&#x0ef32;</td> <td>&#x0ef33;</td> <td>&#x0ef34;</td> <td>&#x0ef35;</td> <td>&#x0ef36;</td> <td>&#x0ef37;</td>
<td>&#x0ef38;</td> <td>&#x0ef39;</td> <td>&#x0ef3a;</td> <td>&#x0ef3b;</td> <td>&#x0ef3c;</td> <td>&#x0ef3d;</td> <td>&#x0ef3e;</td> <td>&#x0ef3f;</td>
</tr>
<tr>
<td>&#x0ef40;</td> <td>&#x0ef41;</td> <td>&#x0ef42;</td> <td>&#x0ef43;</td> <td>&#x0ef44;</td> <td>&#x0ef45;</td> <td>&#x0ef46;</td> <td>&#x0ef47;</td>
<td>&#x0ef48;</td> <td>&#x0ef49;</td> <td>&#x0ef4a;</td> <td>&#x0ef4b;</td> <td>&#x0ef4c;</td> <td>&#x0ef4d;</td> <td>&#x0ef4e;</td> <td>&#x0ef4f;</td>
</tr>
<tr>
<td>&#x0ef50;</td> <td>&#x0ef51;</td> <td>&#x0ef52;</td> <td>&#x0ef53;</td> <td>&#x0ef54;</td> <td>&#x0ef55;</td> <td>&#x0ef56;</td> <td>&#x0ef57;</td>
<td>&#x0ef58;</td> <td>&#x0ef59;</td> <td>&#x0ef5a;</td> <td>&#x0ef5b;</td> <td>&#x0ef5c;</td> <td>&#x0ef5d;</td> <td>&#x0ef5e;</td> <td>&#x0ef5f;</td>
</tr>
<tr>
<td>&#x0ef60;</td> <td>&#x0ef61;</td> <td>&#x0ef62;</td> <td>&#x0ef63;</td> <td>&#x0ef64;</td> <td>&#x0ef65;</td> <td>&#x0ef66;</td> <td>&#x0ef67;</td>
<td>&#x0ef68;</td> <td>&#x0ef69;</td> <td>&#x0ef6a;</td> <td>&#x0ef6b;</td> <td>&#x0ef6c;</td> <td>&#x0ef6d;</td> <td>&#x0ef6e;</td> <td>&#x0ef6f;</td>
</tr>
<tr>
<td>&#x0ef70;</td> <td>&#x0ef71;</td> <td>&#x0ef72;</td> <td>&#x0ef73;</td> <td>&#x0ef74;</td> <td>&#x0ef75;</td> <td>&#x0ef76;</td> <td>&#x0ef77;</td>
<td>&#x0ef78;</td> <td>&#x0ef79;</td> <td>&#x0ef7a;</td> <td>&#x0ef7b;</td> <td>&#x0ef7c;</td> <td>&#x0ef7d;</td> <td>&#x0ef7e;</td> <td>&#x0ef7f;</td>
</tr>
<tr>
<td>&#x0ef80;</td> <td>&#x0ef81;</td> <td>&#x0ef82;</td> <td>&#x0ef83;</td> <td>&#x0ef84;</td> <td>&#x0ef85;</td> <td>&#x0ef86;</td> <td>&#x0ef87;</td>
<td>&#x0ef88;</td> <td>&#x0ef89;</td> <td>&#x0ef8a;</td> <td>&#x0ef8b;</td> <td>&#x0ef8c;</td> <td>&#x0ef8d;</td> <td>&#x0ef8e;</td> <td>&#x0ef8f;</td>
</tr>
<tr>
<td>&#x0ef90;</td> <td>&#x0ef91;</td> <td>&#x0ef92;</td> <td>&#x0ef93;</td> <td>&#x0ef94;</td> <td>&#x0ef95;</td> <td>&#x0ef96;</td> <td>&#x0ef97;</td>
<td>&#x0ef98;</td> <td>&#x0ef99;</td> <td>&#x0ef9a;</td> <td>&#x0ef9b;</td> <td>&#x0ef9c;</td> <td>&#x0ef9d;</td> <td>&#x0ef9e;</td> <td>&#x0ef9f;</td>
</tr>
<tr>
<td>&#x0efa0;</td> <td>&#x0efa1;</td> <td>&#x0efa2;</td> <td>&#x0efa3;</td> <td>&#x0efa4;</td> <td>&#x0efa5;</td> <td>&#x0efa6;</td> <td>&#x0efa7;</td>
<td>&#x0efa8;</td> <td>&#x0efa9;</td> <td>&#x0efaa;</td> <td>&#x0efab;</td> <td>&#x0efac;</td> <td>&#x0efad;</td> <td>&#x0efae;</td> <td>&#x0efaf;</td>
</tr>
<tr>
<td>&#x0efb0;</td> <td>&#x0efb1;</td> <td>&#x0efb2;</td> <td>&#x0efb3;</td> <td>&#x0efb4;</td> <td>&#x0efb5;</td> <td>&#x0efb6;</td> <td>&#x0efb7;</td>
<td>&#x0efb8;</td> <td>&#x0efb9;</td> <td>&#x0efba;</td> <td>&#x0efbb;</td> <td>&#x0efbc;</td> <td>&#x0efbd;</td> <td>&#x0efbe;</td> <td>&#x0efbf;</td>
</tr>
<tr>
<td>&#x0efc0;</td> <td>&#x0efc1;</td> <td>&#x0efc2;</td> <td>&#x0efc3;</td> <td>&#x0efc4;</td> <td>&#x0efc5;</td> <td>&#x0efc6;</td> <td>&#x0efc7;</td>
<td>&#x0efc8;</td> <td>&#x0efc9;</td> <td>&#x0efca;</td> <td>&#x0efcb;</td> <td>&#x0efcc;</td> <td>&#x0efcd;</td> <td>&#x0efce;</td> <td>&#x0efcf;</td>
</tr>
<tr>
<td>&#x0efd0;</td> <td>&#x0efd1;</td> <td>&#x0efd2;</td> <td>&#x0efd3;</td> <td>&#x0efd4;</td> <td>&#x0efd5;</td> <td>&#x0efd6;</td> <td>&#x0efd7;</td>
<td>&#x0efd8;</td> <td>&#x0efd9;</td> <td>&#x0efda;</td> <td>&#x0efdb;</td> <td>&#x0efdc;</td> <td>&#x0efdd;</td> <td>&#x0efde;</td> <td>&#x0efdf;</td>
</tr>
<tr>
<td>&#x0efe0;</td> <td>&#x0efe1;</td> <td>&#x0efe2;</td> <td>&#x0efe3;</td> <td>&#x0efe4;</td> <td>&#x0efe5;</td> <td>&#x0efe6;</td> <td>&#x0efe7;</td>
<td>&#x0efe8;</td> <td>&#x0efe9;</td> <td>&#x0efea;</td> <td>&#x0efeb;</td> <td>&#x0efec;</td> <td>&#x0efed;</td> <td>&#x0efee;</td> <td>&#x0efef;</td>
</tr>
<tr>
<td>&#x0eff0;</td> <td>&#x0eff1;</td> <td>&#x0eff2;</td> <td>&#x0eff3;</td> <td>&#x0eff4;</td> <td>&#x0eff5;</td> <td>&#x0eff6;</td> <td>&#x0eff7;</td>
<td>&#x0eff8;</td> <td>&#x0eff9;</td> <td>&#x0effa;</td> <td>&#x0effb;</td> <td>&#x0effc;</td> <td>&#x0effd;</td> <td>&#x0effe;</td> <td>&#x0efff;</td>
</tr>
</table>
</div>
</div>
</body>
</html>

@ -1,170 +0,0 @@
<html>
<head>
<title> C64 Pro Mono: WOFF (Web Open Font Format) test </title>
<style type="text/css">
@font-face{font-family:"C64 Pro Mono Local";src:url(../fonts/C64_Pro_Mono-STYLE.woff) format("woff")}@font-face{font-family:"C64 Pro Local";src:url(../fonts/C64_Pro-STYLE.woff) format("woff")}.c64pm{font:normal 24pt/32px "C64 Pro Mono Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.c64p{font:normal 24pt/32px "C64 Pro Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.px8{font-size:6pt;line-height:8px}.px16{font-size:12pt;line-height:16px}.px24{font-size:18pt;line-height:24px}.px32{font-size:24pt;line-height:32px}.px40{font-size:30pt;line-height:40px}table,td,tr{padding:0;margin:0}tbody,td,thead,tr{background-color:inherit}td{font:inherit;border-right:2px solid #888;border-bottom:2px solid #888}td:first-child{border-left:2px solid #888}tr:first-child td{border-top:2px solid #888}td:hover{background-color:#000!important;color:#fff!important}table{border-top:4px solid #000;border-left:4px solid #000;border-right:4px solid #000;border-bottom:4px solid #000}.d020-00{background-color:#000}.d021-00{color:#000}.d020-06{background-color:#352879}.d021-06{color:#352879}.d020-0e{background-color:#6c5eb5}.d021-0e{color:#6c5eb5}
</style>
</head>
<body>
<div>
<div class="c64p px16">
See: <a href="http://caniuse.com/#feat=woff">http://caniuse.com/#feat=woff</a>
<p>If you do not see the font, you may be using a browser that disallows local font loading due to CORS (probably Firefox or IE).</p>
</div>
<br/>
<br/>
<div style="float: left; margin-right: 8px; margin-bottom:16px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;upper/graphics</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ee00;</td> <td>&#x0ee01;</td> <td>&#x0ee02;</td> <td>&#x0ee03;</td> <td>&#x0ee04;</td> <td>&#x0ee05;</td> <td>&#x0ee06;</td> <td>&#x0ee07;</td>
<td>&#x0ee08;</td> <td>&#x0ee09;</td> <td>&#x0ee0a;</td> <td>&#x0ee0b;</td> <td>&#x0ee0c;</td> <td>&#x0ee0d;</td> <td>&#x0ee0e;</td> <td>&#x0ee0f;</td>
</tr>
<tr>
<td>&#x0ee10;</td> <td>&#x0ee11;</td> <td>&#x0ee12;</td> <td>&#x0ee13;</td> <td>&#x0ee14;</td> <td>&#x0ee15;</td> <td>&#x0ee16;</td> <td>&#x0ee17;</td>
<td>&#x0ee18;</td> <td>&#x0ee19;</td> <td>&#x0ee1a;</td> <td>&#x0ee1b;</td> <td>&#x0ee1c;</td> <td>&#x0ee1d;</td> <td>&#x0ee1e;</td> <td>&#x0ee1f;</td>
</tr>
<tr>
<td>&#x0ee20;</td> <td>&#x0ee21;</td> <td>&#x0ee22;</td> <td>&#x0ee23;</td> <td>&#x0ee24;</td> <td>&#x0ee25;</td> <td>&#x0ee26;</td> <td>&#x0ee27;</td>
<td>&#x0ee28;</td> <td>&#x0ee29;</td> <td>&#x0ee2a;</td> <td>&#x0ee2b;</td> <td>&#x0ee2c;</td> <td>&#x0ee2d;</td> <td>&#x0ee2e;</td> <td>&#x0ee2f;</td>
</tr>
<tr>
<td>&#x0ee30;</td> <td>&#x0ee31;</td> <td>&#x0ee32;</td> <td>&#x0ee33;</td> <td>&#x0ee34;</td> <td>&#x0ee35;</td> <td>&#x0ee36;</td> <td>&#x0ee37;</td>
<td>&#x0ee38;</td> <td>&#x0ee39;</td> <td>&#x0ee3a;</td> <td>&#x0ee3b;</td> <td>&#x0ee3c;</td> <td>&#x0ee3d;</td> <td>&#x0ee3e;</td> <td>&#x0ee3f;</td>
</tr>
<tr>
<td>&#x0ee40;</td> <td>&#x0ee41;</td> <td>&#x0ee42;</td> <td>&#x0ee43;</td> <td>&#x0ee44;</td> <td>&#x0ee45;</td> <td>&#x0ee46;</td> <td>&#x0ee47;</td>
<td>&#x0ee48;</td> <td>&#x0ee49;</td> <td>&#x0ee4a;</td> <td>&#x0ee4b;</td> <td>&#x0ee4c;</td> <td>&#x0ee4d;</td> <td>&#x0ee4e;</td> <td>&#x0ee4f;</td>
</tr>
<tr>
<td>&#x0ee50;</td> <td>&#x0ee51;</td> <td>&#x0ee52;</td> <td>&#x0ee53;</td> <td>&#x0ee54;</td> <td>&#x0ee55;</td> <td>&#x0ee56;</td> <td>&#x0ee57;</td>
<td>&#x0ee58;</td> <td>&#x0ee59;</td> <td>&#x0ee5a;</td> <td>&#x0ee5b;</td> <td>&#x0ee5c;</td> <td>&#x0ee5d;</td> <td>&#x0ee5e;</td> <td>&#x0ee5f;</td>
</tr>
<tr>
<td>&#x0ee60;</td> <td>&#x0ee61;</td> <td>&#x0ee62;</td> <td>&#x0ee63;</td> <td>&#x0ee64;</td> <td>&#x0ee65;</td> <td>&#x0ee66;</td> <td>&#x0ee67;</td>
<td>&#x0ee68;</td> <td>&#x0ee69;</td> <td>&#x0ee6a;</td> <td>&#x0ee6b;</td> <td>&#x0ee6c;</td> <td>&#x0ee6d;</td> <td>&#x0ee6e;</td> <td>&#x0ee6f;</td>
</tr>
<tr>
<td>&#x0ee70;</td> <td>&#x0ee71;</td> <td>&#x0ee72;</td> <td>&#x0ee73;</td> <td>&#x0ee74;</td> <td>&#x0ee75;</td> <td>&#x0ee76;</td> <td>&#x0ee77;</td>
<td>&#x0ee78;</td> <td>&#x0ee79;</td> <td>&#x0ee7a;</td> <td>&#x0ee7b;</td> <td>&#x0ee7c;</td> <td>&#x0ee7d;</td> <td>&#x0ee7e;</td> <td>&#x0ee7f;</td>
</tr>
<tr>
<td>&#x0ee80;</td> <td>&#x0ee81;</td> <td>&#x0ee82;</td> <td>&#x0ee83;</td> <td>&#x0ee84;</td> <td>&#x0ee85;</td> <td>&#x0ee86;</td> <td>&#x0ee87;</td>
<td>&#x0ee88;</td> <td>&#x0ee89;</td> <td>&#x0ee8a;</td> <td>&#x0ee8b;</td> <td>&#x0ee8c;</td> <td>&#x0ee8d;</td> <td>&#x0ee8e;</td> <td>&#x0ee8f;</td>
</tr>
<tr>
<td>&#x0ee90;</td> <td>&#x0ee91;</td> <td>&#x0ee92;</td> <td>&#x0ee93;</td> <td>&#x0ee94;</td> <td>&#x0ee95;</td> <td>&#x0ee96;</td> <td>&#x0ee97;</td>
<td>&#x0ee98;</td> <td>&#x0ee99;</td> <td>&#x0ee9a;</td> <td>&#x0ee9b;</td> <td>&#x0ee9c;</td> <td>&#x0ee9d;</td> <td>&#x0ee9e;</td> <td>&#x0ee9f;</td>
</tr>
<tr>
<td>&#x0eea0;</td> <td>&#x0eea1;</td> <td>&#x0eea2;</td> <td>&#x0eea3;</td> <td>&#x0eea4;</td> <td>&#x0eea5;</td> <td>&#x0eea6;</td> <td>&#x0eea7;</td>
<td>&#x0eea8;</td> <td>&#x0eea9;</td> <td>&#x0eeaa;</td> <td>&#x0eeab;</td> <td>&#x0eeac;</td> <td>&#x0eead;</td> <td>&#x0eeae;</td> <td>&#x0eeaf;</td>
</tr>
<tr>
<td>&#x0eeb0;</td> <td>&#x0eeb1;</td> <td>&#x0eeb2;</td> <td>&#x0eeb3;</td> <td>&#x0eeb4;</td> <td>&#x0eeb5;</td> <td>&#x0eeb6;</td> <td>&#x0eeb7;</td>
<td>&#x0eeb8;</td> <td>&#x0eeb9;</td> <td>&#x0eeba;</td> <td>&#x0eebb;</td> <td>&#x0eebc;</td> <td>&#x0eebd;</td> <td>&#x0eebe;</td> <td>&#x0eebf;</td>
</tr>
<tr>
<td>&#x0eec0;</td> <td>&#x0eec1;</td> <td>&#x0eec2;</td> <td>&#x0eec3;</td> <td>&#x0eec4;</td> <td>&#x0eec5;</td> <td>&#x0eec6;</td> <td>&#x0eec7;</td>
<td>&#x0eec8;</td> <td>&#x0eec9;</td> <td>&#x0eeca;</td> <td>&#x0eecb;</td> <td>&#x0eecc;</td> <td>&#x0eecd;</td> <td>&#x0eece;</td> <td>&#x0eecf;</td>
</tr>
<tr>
<td>&#x0eed0;</td> <td>&#x0eed1;</td> <td>&#x0eed2;</td> <td>&#x0eed3;</td> <td>&#x0eed4;</td> <td>&#x0eed5;</td> <td>&#x0eed6;</td> <td>&#x0eed7;</td>
<td>&#x0eed8;</td> <td>&#x0eed9;</td> <td>&#x0eeda;</td> <td>&#x0eedb;</td> <td>&#x0eedc;</td> <td>&#x0eedd;</td> <td>&#x0eede;</td> <td>&#x0eedf;</td>
</tr>
<tr>
<td>&#x0eee0;</td> <td>&#x0eee1;</td> <td>&#x0eee2;</td> <td>&#x0eee3;</td> <td>&#x0eee4;</td> <td>&#x0eee5;</td> <td>&#x0eee6;</td> <td>&#x0eee7;</td>
<td>&#x0eee8;</td> <td>&#x0eee9;</td> <td>&#x0eeea;</td> <td>&#x0eeeb;</td> <td>&#x0eeec;</td> <td>&#x0eeed;</td> <td>&#x0eeee;</td> <td>&#x0eeef;</td>
</tr>
<tr>
<td>&#x0eef0;</td> <td>&#x0eef1;</td> <td>&#x0eef2;</td> <td>&#x0eef3;</td> <td>&#x0eef4;</td> <td>&#x0eef5;</td> <td>&#x0eef6;</td> <td>&#x0eef7;</td>
<td>&#x0eef8;</td> <td>&#x0eef9;</td> <td>&#x0eefa;</td> <td>&#x0eefb;</td> <td>&#x0eefc;</td> <td>&#x0eefd;</td> <td>&#x0eefe;</td> <td>&#x0eeff;</td>
</tr>
</table>
</div>
<div style="float: left; margin-right: 8px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;lower/upper</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ef00;</td> <td>&#x0ef01;</td> <td>&#x0ef02;</td> <td>&#x0ef03;</td> <td>&#x0ef04;</td> <td>&#x0ef05;</td> <td>&#x0ef06;</td> <td>&#x0ef07;</td>
<td>&#x0ef08;</td> <td>&#x0ef09;</td> <td>&#x0ef0a;</td> <td>&#x0ef0b;</td> <td>&#x0ef0c;</td> <td>&#x0ef0d;</td> <td>&#x0ef0e;</td> <td>&#x0ef0f;</td>
</tr>
<tr>
<td>&#x0ef10;</td> <td>&#x0ef11;</td> <td>&#x0ef12;</td> <td>&#x0ef13;</td> <td>&#x0ef14;</td> <td>&#x0ef15;</td> <td>&#x0ef16;</td> <td>&#x0ef17;</td>
<td>&#x0ef18;</td> <td>&#x0ef19;</td> <td>&#x0ef1a;</td> <td>&#x0ef1b;</td> <td>&#x0ef1c;</td> <td>&#x0ef1d;</td> <td>&#x0ef1e;</td> <td>&#x0ef1f;</td>
</tr>
<tr>
<td>&#x0ef20;</td> <td>&#x0ef21;</td> <td>&#x0ef22;</td> <td>&#x0ef23;</td> <td>&#x0ef24;</td> <td>&#x0ef25;</td> <td>&#x0ef26;</td> <td>&#x0ef27;</td>
<td>&#x0ef28;</td> <td>&#x0ef29;</td> <td>&#x0ef2a;</td> <td>&#x0ef2b;</td> <td>&#x0ef2c;</td> <td>&#x0ef2d;</td> <td>&#x0ef2e;</td> <td>&#x0ef2f;</td>
</tr>
<tr>
<td>&#x0ef30;</td> <td>&#x0ef31;</td> <td>&#x0ef32;</td> <td>&#x0ef33;</td> <td>&#x0ef34;</td> <td>&#x0ef35;</td> <td>&#x0ef36;</td> <td>&#x0ef37;</td>
<td>&#x0ef38;</td> <td>&#x0ef39;</td> <td>&#x0ef3a;</td> <td>&#x0ef3b;</td> <td>&#x0ef3c;</td> <td>&#x0ef3d;</td> <td>&#x0ef3e;</td> <td>&#x0ef3f;</td>
</tr>
<tr>
<td>&#x0ef40;</td> <td>&#x0ef41;</td> <td>&#x0ef42;</td> <td>&#x0ef43;</td> <td>&#x0ef44;</td> <td>&#x0ef45;</td> <td>&#x0ef46;</td> <td>&#x0ef47;</td>
<td>&#x0ef48;</td> <td>&#x0ef49;</td> <td>&#x0ef4a;</td> <td>&#x0ef4b;</td> <td>&#x0ef4c;</td> <td>&#x0ef4d;</td> <td>&#x0ef4e;</td> <td>&#x0ef4f;</td>
</tr>
<tr>
<td>&#x0ef50;</td> <td>&#x0ef51;</td> <td>&#x0ef52;</td> <td>&#x0ef53;</td> <td>&#x0ef54;</td> <td>&#x0ef55;</td> <td>&#x0ef56;</td> <td>&#x0ef57;</td>
<td>&#x0ef58;</td> <td>&#x0ef59;</td> <td>&#x0ef5a;</td> <td>&#x0ef5b;</td> <td>&#x0ef5c;</td> <td>&#x0ef5d;</td> <td>&#x0ef5e;</td> <td>&#x0ef5f;</td>
</tr>
<tr>
<td>&#x0ef60;</td> <td>&#x0ef61;</td> <td>&#x0ef62;</td> <td>&#x0ef63;</td> <td>&#x0ef64;</td> <td>&#x0ef65;</td> <td>&#x0ef66;</td> <td>&#x0ef67;</td>
<td>&#x0ef68;</td> <td>&#x0ef69;</td> <td>&#x0ef6a;</td> <td>&#x0ef6b;</td> <td>&#x0ef6c;</td> <td>&#x0ef6d;</td> <td>&#x0ef6e;</td> <td>&#x0ef6f;</td>
</tr>
<tr>
<td>&#x0ef70;</td> <td>&#x0ef71;</td> <td>&#x0ef72;</td> <td>&#x0ef73;</td> <td>&#x0ef74;</td> <td>&#x0ef75;</td> <td>&#x0ef76;</td> <td>&#x0ef77;</td>
<td>&#x0ef78;</td> <td>&#x0ef79;</td> <td>&#x0ef7a;</td> <td>&#x0ef7b;</td> <td>&#x0ef7c;</td> <td>&#x0ef7d;</td> <td>&#x0ef7e;</td> <td>&#x0ef7f;</td>
</tr>
<tr>
<td>&#x0ef80;</td> <td>&#x0ef81;</td> <td>&#x0ef82;</td> <td>&#x0ef83;</td> <td>&#x0ef84;</td> <td>&#x0ef85;</td> <td>&#x0ef86;</td> <td>&#x0ef87;</td>
<td>&#x0ef88;</td> <td>&#x0ef89;</td> <td>&#x0ef8a;</td> <td>&#x0ef8b;</td> <td>&#x0ef8c;</td> <td>&#x0ef8d;</td> <td>&#x0ef8e;</td> <td>&#x0ef8f;</td>
</tr>
<tr>
<td>&#x0ef90;</td> <td>&#x0ef91;</td> <td>&#x0ef92;</td> <td>&#x0ef93;</td> <td>&#x0ef94;</td> <td>&#x0ef95;</td> <td>&#x0ef96;</td> <td>&#x0ef97;</td>
<td>&#x0ef98;</td> <td>&#x0ef99;</td> <td>&#x0ef9a;</td> <td>&#x0ef9b;</td> <td>&#x0ef9c;</td> <td>&#x0ef9d;</td> <td>&#x0ef9e;</td> <td>&#x0ef9f;</td>
</tr>
<tr>
<td>&#x0efa0;</td> <td>&#x0efa1;</td> <td>&#x0efa2;</td> <td>&#x0efa3;</td> <td>&#x0efa4;</td> <td>&#x0efa5;</td> <td>&#x0efa6;</td> <td>&#x0efa7;</td>
<td>&#x0efa8;</td> <td>&#x0efa9;</td> <td>&#x0efaa;</td> <td>&#x0efab;</td> <td>&#x0efac;</td> <td>&#x0efad;</td> <td>&#x0efae;</td> <td>&#x0efaf;</td>
</tr>
<tr>
<td>&#x0efb0;</td> <td>&#x0efb1;</td> <td>&#x0efb2;</td> <td>&#x0efb3;</td> <td>&#x0efb4;</td> <td>&#x0efb5;</td> <td>&#x0efb6;</td> <td>&#x0efb7;</td>
<td>&#x0efb8;</td> <td>&#x0efb9;</td> <td>&#x0efba;</td> <td>&#x0efbb;</td> <td>&#x0efbc;</td> <td>&#x0efbd;</td> <td>&#x0efbe;</td> <td>&#x0efbf;</td>
</tr>
<tr>
<td>&#x0efc0;</td> <td>&#x0efc1;</td> <td>&#x0efc2;</td> <td>&#x0efc3;</td> <td>&#x0efc4;</td> <td>&#x0efc5;</td> <td>&#x0efc6;</td> <td>&#x0efc7;</td>
<td>&#x0efc8;</td> <td>&#x0efc9;</td> <td>&#x0efca;</td> <td>&#x0efcb;</td> <td>&#x0efcc;</td> <td>&#x0efcd;</td> <td>&#x0efce;</td> <td>&#x0efcf;</td>
</tr>
<tr>
<td>&#x0efd0;</td> <td>&#x0efd1;</td> <td>&#x0efd2;</td> <td>&#x0efd3;</td> <td>&#x0efd4;</td> <td>&#x0efd5;</td> <td>&#x0efd6;</td> <td>&#x0efd7;</td>
<td>&#x0efd8;</td> <td>&#x0efd9;</td> <td>&#x0efda;</td> <td>&#x0efdb;</td> <td>&#x0efdc;</td> <td>&#x0efdd;</td> <td>&#x0efde;</td> <td>&#x0efdf;</td>
</tr>
<tr>
<td>&#x0efe0;</td> <td>&#x0efe1;</td> <td>&#x0efe2;</td> <td>&#x0efe3;</td> <td>&#x0efe4;</td> <td>&#x0efe5;</td> <td>&#x0efe6;</td> <td>&#x0efe7;</td>
<td>&#x0efe8;</td> <td>&#x0efe9;</td> <td>&#x0efea;</td> <td>&#x0efeb;</td> <td>&#x0efec;</td> <td>&#x0efed;</td> <td>&#x0efee;</td> <td>&#x0efef;</td>
</tr>
<tr>
<td>&#x0eff0;</td> <td>&#x0eff1;</td> <td>&#x0eff2;</td> <td>&#x0eff3;</td> <td>&#x0eff4;</td> <td>&#x0eff5;</td> <td>&#x0eff6;</td> <td>&#x0eff7;</td>
<td>&#x0eff8;</td> <td>&#x0eff9;</td> <td>&#x0effa;</td> <td>&#x0effb;</td> <td>&#x0effc;</td> <td>&#x0effd;</td> <td>&#x0effe;</td> <td>&#x0efff;</td>
</tr>
</table>
</div>
</div>
</body>
</html>

@ -1,170 +0,0 @@
<html>
<head>
<title> C64 Pro Mono: WOFF2 (Web Open Font Format 2.0) test </title>
<style type="text/css">
@font-face{font-family:"C64 Pro Mono Local";src:url(../fonts/C64_Pro_Mono-STYLE.woff2) format("woff2")}@font-face{font-family:"C64 Pro Local";src:url(../fonts/C64_Pro-STYLE.woff2) format("woff2")}.c64pm{font:normal 24pt/32px "C64 Pro Mono Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.c64p{font:normal 24pt/32px "C64 Pro Local",verdana,helvetica,sans-serif;letter-spacing:0;padding:0;margin:0}.px8{font-size:6pt;line-height:8px}.px16{font-size:12pt;line-height:16px}.px24{font-size:18pt;line-height:24px}.px32{font-size:24pt;line-height:32px}.px40{font-size:30pt;line-height:40px}table,tr,td{padding:0;margin:0}thead,tbody,tr,td{background-color:inherit}td{font:inherit;border-right:2px solid #888;border-bottom:2px solid #888}td:first-child{border-left:2px solid #888}tr:first-child td{border-top:2px solid #888}td:hover{background-color:#000!important;color:#fff!important}table{border-top:4px solid #000;border-left:4px solid #000;border-right:4px solid #000;border-bottom:4px solid #000}.d020-00{background-color:#000}.d021-00{color:#000}.d020-06{background-color:#352879}.d021-06{color:#352879}.d020-0e{background-color:#6C5EB5}.d021-0e{color:#6C5EB5}
</style>
</head>
<body>
<div>
<div class="c64p px16">
See: <a href="http://caniuse.com/#feat=woff2">http://caniuse.com/#feat=woff2</a>
<p>If you do not see the font, you may be using a browser that disallows local font loading due to CORS (probably Firefox or IE).</p>
</div>
<br/>
<br/>
<div style="float: left; margin-right: 8px; margin-bottom:16px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;upper/graphics</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ee00;</td> <td>&#x0ee01;</td> <td>&#x0ee02;</td> <td>&#x0ee03;</td> <td>&#x0ee04;</td> <td>&#x0ee05;</td> <td>&#x0ee06;</td> <td>&#x0ee07;</td>
<td>&#x0ee08;</td> <td>&#x0ee09;</td> <td>&#x0ee0a;</td> <td>&#x0ee0b;</td> <td>&#x0ee0c;</td> <td>&#x0ee0d;</td> <td>&#x0ee0e;</td> <td>&#x0ee0f;</td>
</tr>
<tr>
<td>&#x0ee10;</td> <td>&#x0ee11;</td> <td>&#x0ee12;</td> <td>&#x0ee13;</td> <td>&#x0ee14;</td> <td>&#x0ee15;</td> <td>&#x0ee16;</td> <td>&#x0ee17;</td>
<td>&#x0ee18;</td> <td>&#x0ee19;</td> <td>&#x0ee1a;</td> <td>&#x0ee1b;</td> <td>&#x0ee1c;</td> <td>&#x0ee1d;</td> <td>&#x0ee1e;</td> <td>&#x0ee1f;</td>
</tr>
<tr>
<td>&#x0ee20;</td> <td>&#x0ee21;</td> <td>&#x0ee22;</td> <td>&#x0ee23;</td> <td>&#x0ee24;</td> <td>&#x0ee25;</td> <td>&#x0ee26;</td> <td>&#x0ee27;</td>
<td>&#x0ee28;</td> <td>&#x0ee29;</td> <td>&#x0ee2a;</td> <td>&#x0ee2b;</td> <td>&#x0ee2c;</td> <td>&#x0ee2d;</td> <td>&#x0ee2e;</td> <td>&#x0ee2f;</td>
</tr>
<tr>
<td>&#x0ee30;</td> <td>&#x0ee31;</td> <td>&#x0ee32;</td> <td>&#x0ee33;</td> <td>&#x0ee34;</td> <td>&#x0ee35;</td> <td>&#x0ee36;</td> <td>&#x0ee37;</td>
<td>&#x0ee38;</td> <td>&#x0ee39;</td> <td>&#x0ee3a;</td> <td>&#x0ee3b;</td> <td>&#x0ee3c;</td> <td>&#x0ee3d;</td> <td>&#x0ee3e;</td> <td>&#x0ee3f;</td>
</tr>
<tr>
<td>&#x0ee40;</td> <td>&#x0ee41;</td> <td>&#x0ee42;</td> <td>&#x0ee43;</td> <td>&#x0ee44;</td> <td>&#x0ee45;</td> <td>&#x0ee46;</td> <td>&#x0ee47;</td>
<td>&#x0ee48;</td> <td>&#x0ee49;</td> <td>&#x0ee4a;</td> <td>&#x0ee4b;</td> <td>&#x0ee4c;</td> <td>&#x0ee4d;</td> <td>&#x0ee4e;</td> <td>&#x0ee4f;</td>
</tr>
<tr>
<td>&#x0ee50;</td> <td>&#x0ee51;</td> <td>&#x0ee52;</td> <td>&#x0ee53;</td> <td>&#x0ee54;</td> <td>&#x0ee55;</td> <td>&#x0ee56;</td> <td>&#x0ee57;</td>
<td>&#x0ee58;</td> <td>&#x0ee59;</td> <td>&#x0ee5a;</td> <td>&#x0ee5b;</td> <td>&#x0ee5c;</td> <td>&#x0ee5d;</td> <td>&#x0ee5e;</td> <td>&#x0ee5f;</td>
</tr>
<tr>
<td>&#x0ee60;</td> <td>&#x0ee61;</td> <td>&#x0ee62;</td> <td>&#x0ee63;</td> <td>&#x0ee64;</td> <td>&#x0ee65;</td> <td>&#x0ee66;</td> <td>&#x0ee67;</td>
<td>&#x0ee68;</td> <td>&#x0ee69;</td> <td>&#x0ee6a;</td> <td>&#x0ee6b;</td> <td>&#x0ee6c;</td> <td>&#x0ee6d;</td> <td>&#x0ee6e;</td> <td>&#x0ee6f;</td>
</tr>
<tr>
<td>&#x0ee70;</td> <td>&#x0ee71;</td> <td>&#x0ee72;</td> <td>&#x0ee73;</td> <td>&#x0ee74;</td> <td>&#x0ee75;</td> <td>&#x0ee76;</td> <td>&#x0ee77;</td>
<td>&#x0ee78;</td> <td>&#x0ee79;</td> <td>&#x0ee7a;</td> <td>&#x0ee7b;</td> <td>&#x0ee7c;</td> <td>&#x0ee7d;</td> <td>&#x0ee7e;</td> <td>&#x0ee7f;</td>
</tr>
<tr>
<td>&#x0ee80;</td> <td>&#x0ee81;</td> <td>&#x0ee82;</td> <td>&#x0ee83;</td> <td>&#x0ee84;</td> <td>&#x0ee85;</td> <td>&#x0ee86;</td> <td>&#x0ee87;</td>
<td>&#x0ee88;</td> <td>&#x0ee89;</td> <td>&#x0ee8a;</td> <td>&#x0ee8b;</td> <td>&#x0ee8c;</td> <td>&#x0ee8d;</td> <td>&#x0ee8e;</td> <td>&#x0ee8f;</td>
</tr>
<tr>
<td>&#x0ee90;</td> <td>&#x0ee91;</td> <td>&#x0ee92;</td> <td>&#x0ee93;</td> <td>&#x0ee94;</td> <td>&#x0ee95;</td> <td>&#x0ee96;</td> <td>&#x0ee97;</td>
<td>&#x0ee98;</td> <td>&#x0ee99;</td> <td>&#x0ee9a;</td> <td>&#x0ee9b;</td> <td>&#x0ee9c;</td> <td>&#x0ee9d;</td> <td>&#x0ee9e;</td> <td>&#x0ee9f;</td>
</tr>
<tr>
<td>&#x0eea0;</td> <td>&#x0eea1;</td> <td>&#x0eea2;</td> <td>&#x0eea3;</td> <td>&#x0eea4;</td> <td>&#x0eea5;</td> <td>&#x0eea6;</td> <td>&#x0eea7;</td>
<td>&#x0eea8;</td> <td>&#x0eea9;</td> <td>&#x0eeaa;</td> <td>&#x0eeab;</td> <td>&#x0eeac;</td> <td>&#x0eead;</td> <td>&#x0eeae;</td> <td>&#x0eeaf;</td>
</tr>
<tr>
<td>&#x0eeb0;</td> <td>&#x0eeb1;</td> <td>&#x0eeb2;</td> <td>&#x0eeb3;</td> <td>&#x0eeb4;</td> <td>&#x0eeb5;</td> <td>&#x0eeb6;</td> <td>&#x0eeb7;</td>
<td>&#x0eeb8;</td> <td>&#x0eeb9;</td> <td>&#x0eeba;</td> <td>&#x0eebb;</td> <td>&#x0eebc;</td> <td>&#x0eebd;</td> <td>&#x0eebe;</td> <td>&#x0eebf;</td>
</tr>
<tr>
<td>&#x0eec0;</td> <td>&#x0eec1;</td> <td>&#x0eec2;</td> <td>&#x0eec3;</td> <td>&#x0eec4;</td> <td>&#x0eec5;</td> <td>&#x0eec6;</td> <td>&#x0eec7;</td>
<td>&#x0eec8;</td> <td>&#x0eec9;</td> <td>&#x0eeca;</td> <td>&#x0eecb;</td> <td>&#x0eecc;</td> <td>&#x0eecd;</td> <td>&#x0eece;</td> <td>&#x0eecf;</td>
</tr>
<tr>
<td>&#x0eed0;</td> <td>&#x0eed1;</td> <td>&#x0eed2;</td> <td>&#x0eed3;</td> <td>&#x0eed4;</td> <td>&#x0eed5;</td> <td>&#x0eed6;</td> <td>&#x0eed7;</td>
<td>&#x0eed8;</td> <td>&#x0eed9;</td> <td>&#x0eeda;</td> <td>&#x0eedb;</td> <td>&#x0eedc;</td> <td>&#x0eedd;</td> <td>&#x0eede;</td> <td>&#x0eedf;</td>
</tr>
<tr>
<td>&#x0eee0;</td> <td>&#x0eee1;</td> <td>&#x0eee2;</td> <td>&#x0eee3;</td> <td>&#x0eee4;</td> <td>&#x0eee5;</td> <td>&#x0eee6;</td> <td>&#x0eee7;</td>
<td>&#x0eee8;</td> <td>&#x0eee9;</td> <td>&#x0eeea;</td> <td>&#x0eeeb;</td> <td>&#x0eeec;</td> <td>&#x0eeed;</td> <td>&#x0eeee;</td> <td>&#x0eeef;</td>
</tr>
<tr>
<td>&#x0eef0;</td> <td>&#x0eef1;</td> <td>&#x0eef2;</td> <td>&#x0eef3;</td> <td>&#x0eef4;</td> <td>&#x0eef5;</td> <td>&#x0eef6;</td> <td>&#x0eef7;</td>
<td>&#x0eef8;</td> <td>&#x0eef9;</td> <td>&#x0eefa;</td> <td>&#x0eefb;</td> <td>&#x0eefc;</td> <td>&#x0eefd;</td> <td>&#x0eefe;</td> <td>&#x0eeff;</td>
</tr>
</table>
</div>
<div style="float: left; margin-right: 8px;">
<span class="c64pm px16">&ldquo;C64 Pro Mono/Style&rdquo;</span><br/>
<span class="c64pm px16">&nbsp;&nbsp;&nbsp;lower/upper</span>
<table cellspacing="0" cellpadding="0" class="c64pm px32 d020-06 d021-0e" style="margin-top: 4px;">
<tr>
<td>&#x0ef00;</td> <td>&#x0ef01;</td> <td>&#x0ef02;</td> <td>&#x0ef03;</td> <td>&#x0ef04;</td> <td>&#x0ef05;</td> <td>&#x0ef06;</td> <td>&#x0ef07;</td>
<td>&#x0ef08;</td> <td>&#x0ef09;</td> <td>&#x0ef0a;</td> <td>&#x0ef0b;</td> <td>&#x0ef0c;</td> <td>&#x0ef0d;</td> <td>&#x0ef0e;</td> <td>&#x0ef0f;</td>
</tr>
<tr>
<td>&#x0ef10;</td> <td>&#x0ef11;</td> <td>&#x0ef12;</td> <td>&#x0ef13;</td> <td>&#x0ef14;</td> <td>&#x0ef15;</td> <td>&#x0ef16;</td> <td>&#x0ef17;</td>
<td>&#x0ef18;</td> <td>&#x0ef19;</td> <td>&#x0ef1a;</td> <td>&#x0ef1b;</td> <td>&#x0ef1c;</td> <td>&#x0ef1d;</td> <td>&#x0ef1e;</td> <td>&#x0ef1f;</td>
</tr>
<tr>
<td>&#x0ef20;</td> <td>&#x0ef21;</td> <td>&#x0ef22;</td> <td>&#x0ef23;</td> <td>&#x0ef24;</td> <td>&#x0ef25;</td> <td>&#x0ef26;</td> <td>&#x0ef27;</td>
<td>&#x0ef28;</td> <td>&#x0ef29;</td> <td>&#x0ef2a;</td> <td>&#x0ef2b;</td> <td>&#x0ef2c;</td> <td>&#x0ef2d;</td> <td>&#x0ef2e;</td> <td>&#x0ef2f;</td>
</tr>
<tr>
<td>&#x0ef30;</td> <td>&#x0ef31;</td> <td>&#x0ef32;</td> <td>&#x0ef33;</td> <td>&#x0ef34;</td> <td>&#x0ef35;</td> <td>&#x0ef36;</td> <td>&#x0ef37;</td>
<td>&#x0ef38;</td> <td>&#x0ef39;</td> <td>&#x0ef3a;</td> <td>&#x0ef3b;</td> <td>&#x0ef3c;</td> <td>&#x0ef3d;</td> <td>&#x0ef3e;</td> <td>&#x0ef3f;</td>
</tr>
<tr>
<td>&#x0ef40;</td> <td>&#x0ef41;</td> <td>&#x0ef42;</td> <td>&#x0ef43;</td> <td>&#x0ef44;</td> <td>&#x0ef45;</td> <td>&#x0ef46;</td> <td>&#x0ef47;</td>
<td>&#x0ef48;</td> <td>&#x0ef49;</td> <td>&#x0ef4a;</td> <td>&#x0ef4b;</td> <td>&#x0ef4c;</td> <td>&#x0ef4d;</td> <td>&#x0ef4e;</td> <td>&#x0ef4f;</td>
</tr>
<tr>
<td>&#x0ef50;</td> <td>&#x0ef51;</td> <td>&#x0ef52;</td> <td>&#x0ef53;</td> <td>&#x0ef54;</td> <td>&#x0ef55;</td> <td>&#x0ef56;</td> <td>&#x0ef57;</td>
<td>&#x0ef58;</td> <td>&#x0ef59;</td> <td>&#x0ef5a;</td> <td>&#x0ef5b;</td> <td>&#x0ef5c;</td> <td>&#x0ef5d;</td> <td>&#x0ef5e;</td> <td>&#x0ef5f;</td>
</tr>
<tr>
<td>&#x0ef60;</td> <td>&#x0ef61;</td> <td>&#x0ef62;</td> <td>&#x0ef63;</td> <td>&#x0ef64;</td> <td>&#x0ef65;</td> <td>&#x0ef66;</td> <td>&#x0ef67;</td>
<td>&#x0ef68;</td> <td>&#x0ef69;</td> <td>&#x0ef6a;</td> <td>&#x0ef6b;</td> <td>&#x0ef6c;</td> <td>&#x0ef6d;</td> <td>&#x0ef6e;</td> <td>&#x0ef6f;</td>
</tr>
<tr>
<td>&#x0ef70;</td> <td>&#x0ef71;</td> <td>&#x0ef72;</td> <td>&#x0ef73;</td> <td>&#x0ef74;</td> <td>&#x0ef75;</td> <td>&#x0ef76;</td> <td>&#x0ef77;</td>
<td>&#x0ef78;</td> <td>&#x0ef79;</td> <td>&#x0ef7a;</td> <td>&#x0ef7b;</td> <td>&#x0ef7c;</td> <td>&#x0ef7d;</td> <td>&#x0ef7e;</td> <td>&#x0ef7f;</td>
</tr>
<tr>
<td>&#x0ef80;</td> <td>&#x0ef81;</td> <td>&#x0ef82;</td> <td>&#x0ef83;</td> <td>&#x0ef84;</td> <td>&#x0ef85;</td> <td>&#x0ef86;</td> <td>&#x0ef87;</td>
<td>&#x0ef88;</td> <td>&#x0ef89;</td> <td>&#x0ef8a;</td> <td>&#x0ef8b;</td> <td>&#x0ef8c;</td> <td>&#x0ef8d;</td> <td>&#x0ef8e;</td> <td>&#x0ef8f;</td>
</tr>
<tr>
<td>&#x0ef90;</td> <td>&#x0ef91;</td> <td>&#x0ef92;</td> <td>&#x0ef93;</td> <td>&#x0ef94;</td> <td>&#x0ef95;</td> <td>&#x0ef96;</td> <td>&#x0ef97;</td>
<td>&#x0ef98;</td> <td>&#x0ef99;</td> <td>&#x0ef9a;</td> <td>&#x0ef9b;</td> <td>&#x0ef9c;</td> <td>&#x0ef9d;</td> <td>&#x0ef9e;</td> <td>&#x0ef9f;</td>
</tr>
<tr>
<td>&#x0efa0;</td> <td>&#x0efa1;</td> <td>&#x0efa2;</td> <td>&#x0efa3;</td> <td>&#x0efa4;</td> <td>&#x0efa5;</td> <td>&#x0efa6;</td> <td>&#x0efa7;</td>
<td>&#x0efa8;</td> <td>&#x0efa9;</td> <td>&#x0efaa;</td> <td>&#x0efab;</td> <td>&#x0efac;</td> <td>&#x0efad;</td> <td>&#x0efae;</td> <td>&#x0efaf;</td>
</tr>
<tr>
<td>&#x0efb0;</td> <td>&#x0efb1;</td> <td>&#x0efb2;</td> <td>&#x0efb3;</td> <td>&#x0efb4;</td> <td>&#x0efb5;</td> <td>&#x0efb6;</td> <td>&#x0efb7;</td>
<td>&#x0efb8;</td> <td>&#x0efb9;</td> <td>&#x0efba;</td> <td>&#x0efbb;</td> <td>&#x0efbc;</td> <td>&#x0efbd;</td> <td>&#x0efbe;</td> <td>&#x0efbf;</td>
</tr>
<tr>
<td>&#x0efc0;</td> <td>&#x0efc1;</td> <td>&#x0efc2;</td> <td>&#x0efc3;</td> <td>&#x0efc4;</td> <td>&#x0efc5;</td> <td>&#x0efc6;</td> <td>&#x0efc7;</td>
<td>&#x0efc8;</td> <td>&#x0efc9;</td> <td>&#x0efca;</td> <td>&#x0efcb;</td> <td>&#x0efcc;</td> <td>&#x0efcd;</td> <td>&#x0efce;</td> <td>&#x0efcf;</td>
</tr>
<tr>
<td>&#x0efd0;</td> <td>&#x0efd1;</td> <td>&#x0efd2;</td> <td>&#x0efd3;</td> <td>&#x0efd4;</td> <td>&#x0efd5;</td> <td>&#x0efd6;</td> <td>&#x0efd7;</td>
<td>&#x0efd8;</td> <td>&#x0efd9;</td> <td>&#x0efda;</td> <td>&#x0efdb;</td> <td>&#x0efdc;</td> <td>&#x0efdd;</td> <td>&#x0efde;</td> <td>&#x0efdf;</td>
</tr>
<tr>
<td>&#x0efe0;</td> <td>&#x0efe1;</td> <td>&#x0efe2;</td> <td>&#x0efe3;</td> <td>&#x0efe4;</td> <td>&#x0efe5;</td> <td>&#x0efe6;</td> <td>&#x0efe7;</td>
<td>&#x0efe8;</td> <td>&#x0efe9;</td> <td>&#x0efea;</td> <td>&#x0efeb;</td> <td>&#x0efec;</td> <td>&#x0efed;</td> <td>&#x0efee;</td> <td>&#x0efef;</td>
</tr>
<tr>
<td>&#x0eff0;</td> <td>&#x0eff1;</td> <td>&#x0eff2;</td> <td>&#x0eff3;</td> <td>&#x0eff4;</td> <td>&#x0eff5;</td> <td>&#x0eff6;</td> <td>&#x0eff7;</td>
<td>&#x0eff8;</td> <td>&#x0eff9;</td> <td>&#x0effa;</td> <td>&#x0effb;</td> <td>&#x0effc;</td> <td>&#x0effd;</td> <td>&#x0effe;</td> <td>&#x0efff;</td>
</tr>
</table>
</div>
</div>
</body>
</html>

@ -1,149 +0,0 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# *bits*, *ASCII*, *Unicode*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Encoding systems\n",
"\n",
"As a computer can only work with numbers, it cannot process of letters text directly. In order to work with text, textual characters need to be translated into numbers and vice versa. This is done via the process of text encodings.\n",
"\n",
"It might be your first reaction to think that this shouldnt be so difficult. We could represent the letter in binary code. An a encoded as a 0, b as a 1 and c as a 01 etc. And in fact this is more or less how text encodings work. However, at the time when computing was being developed different encodings emerged.\n",
"\n",
"## ASCII encoding\n",
"\n",
"The dominant encoding at the time became ASCII (for American Standard Code for Information Interchange.), which was created on behalf of the U.S. Government in 1963 to allow for information interchange between their different computing systems.\n",
"\n",
"The encoding uses a 7-bit system, which means that they could only store characters in 128 (2^7=128) numbers (0000 0000 until 0111 1111). The resulting encoding schema assigned to each of these 128 numbers:\n",
"\n",
" all the letters in the English alphabet\n",
" numbers from 0-9\n",
" punctuation marks\n",
" and control characters\n",
"\n",
"Thanks to the simplicity of the encoding it quickly became a standard for the American computing industry.\n",
"\n",
"## ASCII imperialism\n",
"\n",
"Thanks to the power of the US Military and US corporations the American computing industry became the global computing industry. Computers that we use today are rooted in American networking history, and so is the ASCII standard. However, the reality is that ASCII can only represent 26 Latin letters in the English alphabet but computers are used all over the world, by people speaking different languages. They would often end up with American computers that could not represent their language in ASCII. Think for example of scripts like Greek, Cyrillic and Arabic or even Latin scripts that use accents such as the ü or ø. Altough 128 might sound like a lot of characters, it is not enough to represent all different languages."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ASCII flavours: PETSCII\n",
"\n",
"### Commodore 64 (1982)\n",
"\n",
"![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Commodore-64-Computer-FL.jpg/320px-Commodore-64-Computer-FL.jpg)\n",
"\n",
"> The Commodore 64, also known as the C64 or the CBM 64, is an 8-bit home computer introduced in January 1982 by Commodore International (first shown at the Consumer Electronics Show, January 710, 1982, in Las Vegas). It has been listed in the Guinness World Records as the highest-selling single computer model of all time, with independent estimates placing the number sold between 12.5 and 17 million units. \n",
"\n",
"> Preceded by the Commodore VIC-20 and Commodore PET, the C64 took its name from its 64 kilobytes (65,536 bytes) of RAM. With support for multicolor sprites and a custom chip for waveform generation, the C64 could create superior visuals and audio compared to systems without such custom hardware. \n",
"\n",
"https://en.wikipedia.org/wiki/Commodore_64\n",
"\n",
"> Part of the Commodore 64's success was its sale in regular retail stores instead of only electronics or computer hobbyist specialty stores. Commodore produced many of its parts in-house to control costs, including custom integrated circuit chips from MOS Technology. In the United States, it has been compared to the Ford Model T automobile for its role in bringing a new technology to middle-class households via creative and affordable mass-production.\n",
"\n",
"Kahney, Leander (September 9, 2003). \"Grandiose Price for a Modest PC\". CondéNet, Inc. Archived from the original on September 14, 2008. Retrieved September 13, 2008.\n",
"\n",
"![](https://upload.wikimedia.org/wikipedia/commons/4/48/C64_startup_animiert.gif)\n",
"\n",
"### PETSCII \n",
"\n",
"![](https://www.pagetable.com/docs/c64ref_charset/colorscheme.gif)\n",
"\n",
"> The Commodore PET's lack of a programmable bitmap-mode for computer graphics, as well as it having no redefinable character set capability, may be one of the reasons PETSCII was developed; by creatively using the well-thought-out block graphics, a higher degree of sophistication in screen graphics is attainable than by using plain ASCII's letter/digit/punctuation characters. In addition to the relatively diverse set of geometrical shapes that can thus be produced, PETSCII allows for several grayscale levels by its provision of differently hatched checkerboard squares/half-squares. Finally, the reverse-video mode (see below) is used to complete the range of graphics characters, in that it provides mirrored half-square blocks. \n",
"\n",
"https://en.wikipedia.org/wiki/PETSCII\n",
"\n",
"Draw PETSCII art in the browser:\n",
"\n",
"* https://petscii.krissz.hu/\n",
"* https://www.masswerk.at/pet/\n",
"\n",
"Use PETSCII as a font!\n",
"\n",
"* https://style64.org/c64-truetype\n",
"\n",
"PETSCII bots!\n",
"\n",
"* https://twitter.com/PETSCIIBOTS"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Unicode universalism\n",
"\n",
"As electronic text was increasingly being exchanged online and between language areas, issues emerged when text encoded in one language was shared and read on systems assuming an encoding in another language. Unicode was a response to the incompatible text encoding standards that were proliferating.\n",
"\n",
"When different encodings assign the same binary numbers to different characters, this results in illegible documents. The solution, partly made possible by increased computing capacity, was to strive for a single universal encoding which would encompass all writing systems 6\n",
"\n",
"You can experience this following this exercise.\n",
"\n",
"So in order to overcome the limitations of ASCII people created the Unicode Consortium to create a single universal character encoding:\n",
"\n",
"The Unicode standards are designed to normalise the encoding of characters, to efficiently manage the way they are stored, referred to and displayed in order to facilitate cross-platform, multilingual and international text exchange. The Unicode Standard is mammoth in\n",
"size and covers well over 110,000 characters, of which [..] 1,000 are [..] emoji. 7\n",
"\n",
"In effect the Unicode Standard combined all the different national character encodings together into a single large ledger in order to try to represent all languages.\n",
"\n",
"It is divided in so called blocks, which are basically number tables that describe which number is connected to which character.\n",
"\n",
"The table starts counting at 0x0 and continues all the way up to 0x10FFFF.\n",
"\n",
"The first block actually corresponds with ASCII:\n",
"\n",
"https://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF\n",
"\n",
"It contains many different scripts for supporting large and smaller language groups, including for example Ethiopian and Cherokee:\n",
"\n",
"https://en.wikibooks.org/wiki/Unicode/Character_reference/1000-1FFF\n",
"\n",
"However there are also blocks that describe Arrows and other symbols:\n",
"\n",
"https://en.wikibooks.org/wiki/Unicode/Character_reference/2000-2FFF\n",
"\n",
"Emoji are also part of the unicode table."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

File diff suppressed because one or more lines are too long

@ -1,158 +0,0 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generating mini-games with random.choice()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
". . . . .. . . .. \n",
" . . . . . . . . . . . \n",
" . . . .. .. . . .\n",
" . . . . . . . . \n",
" . . . . . . . . . . \n",
" . . . . . . . . . \n",
" . . . . . . .. \n",
" . . . .. . . . . .. . .. \n",
" . . . . . . . .. . \n",
". . . . . . . . .. . \n",
". . . .. . . \n",
" . . . . . . . .. . \n",
" . . . . . \n",
" . . . . . . . \n",
" . . . . . . . .\n",
". . . .. . . . . . \n",
" .. . . . . \n",
" . . . . . . . . . . . \n",
" . . . . . . . .. \n",
" . . . . . \n",
" . . . . . . . . . . . . \n",
" . . . . . . . . . . . \n",
" . . . . . . . . . . \n",
" . . . . . . . . . \n",
" . . . . . . . . . \n"
]
}
],
"source": [
"from random import choice\n",
"\n",
"characters = ['.', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']\n",
"width = 100\n",
"height = 25\n",
"\n",
"for y in range(height):\n",
" for x in range(width):\n",
" print(choice(characters), end='')\n",
" print('')"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" a o it m i i m f c \n",
" c i ag n o amf f o i \n",
" o i o f i a g af i g\n",
" m i f a t g c f t i\n",
" n o f a f tnf o f \n",
" a i i i i i t in c caa \n",
" t fa n f i t a i o\n",
" o i ag ig g g a i i i n ag \n",
" n m gt a i o f i o ni i i \n",
" m i f i a a a o i m a g c \n",
" f am a c o i f cna f mi\n",
" t a i c f g f n i c o o g \n",
" o f t a g ng i a i a n n o a t oi i it\n",
" o t n o m f g a i a m ni \n",
" f i i g m o i a n t a i a a m i a i a\n",
"i a a ac i a t i tn t a \n",
" o f tf i an i n o f i t t \n",
" c g fg i o o ca i o o o m t \n",
" f o i i i c i ta i ca c f \n",
" c n aa g i m g m i c \n",
" c i c i f i n m f i i \n",
" a o i g m o ot a i a c f m i \n",
" i a a i f f a c g i\n",
" to in a t og im i o i f n c \n",
"ao m g ii c n a to t \n"
]
}
],
"source": [
"from random import choice\n",
"\n",
"character_set = 'gamification '\n",
"characters = [character for character in character_set]\n",
"width = 100\n",
"height = 25\n",
"\n",
"for y in range(height):\n",
" for x in range(width):\n",
" print(choice(characters), end='')\n",
" print('')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# More games plz!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Try to make some more mini-games yourself.\n",
"\n",
"You can restrict yourself to using **ASCII characters only** (see https://en.wikipedia.org/wiki/ASCII) and stay in touch with early computer graphics ASCII art...\n",
"\n",
"Or you can extend your pallete with **Unicode characters**. This is a nice website that highlights specific character sets: http://xahlee.info/comp/unicode_index.html"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -4,22 +4,17 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Labyrithns"
"# Generating crossword puzzles"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"https://en.wikipedia.org/wiki/Maze_generation_algorithm"
"![](https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/CrosswordUSA.svg/480px-CrosswordUSA.svg.png)\n",
"\n",
"https://github.com/akhof/pyCrossword"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {

@ -0,0 +1,313 @@
# make_wordsearch.py
import os
import sys
import random
from copy import deepcopy
# Maximum number of rows and columns.
NMAX = 32
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def circle_mask(grid):
"""A circular mask to shape the grid."""
r2 = min(ncols, nrows)**2 // 4
cx, cy = ncols//2, nrows // 2
for irow in range(nrows):
for icol in range(ncols):
if (irow - cy)**2 + (icol - cx)**2 > r2:
grid[irow][icol] = '*'
def squares_mask(grid):
"""A mask of overlapping squares to shape the grid."""
a = int(0.38 * min(ncols, nrows))
cy = nrows // 2
cx = ncols // 2
for irow in range(nrows):
for icol in range(ncols):
if a <= icol < ncols-a:
if irow < cy-a or irow > cy+a:
grid[irow][icol] = '*'
if a <= irow < nrows-a:
if icol < cx-a or icol > cx+a:
grid[irow][icol] = '*'
def no_mask(grid):
"""The default, no mask."""
pass
# A dictionary of masking functions, keyed by their name.
apply_mask = {
None: no_mask,
'circle': circle_mask,
'squares': squares_mask,
}
def make_grid(mask=None):
"""Make the grid and apply a mask (locations a letter cannot be placed)."""
grid = [[' ']*ncols for _ in range(nrows)]
apply_mask[mask](grid)
return grid
def _make_wordsearch(nrows, ncols, wordlist, allow_backwards_words=True,
mask=None):
"""Attempt to make a word search with the given parameters."""
grid = make_grid(mask)
def fill_grid_randomly(grid):
"""Fill up the empty, unmasked positions with random letters."""
for irow in range(nrows):
for icol in range(ncols):
if grid[irow][icol] == ' ':
grid[irow][icol] = random.choice(alphabet)
def remove_mask(grid):
"""Remove the mask, for text output, by replacing with whitespace."""
for irow in range(nrows):
for icol in range(ncols):
if grid[irow][icol] == '*':
grid[irow][icol] = ' '
def test_candidate(irow, icol, dx, dy, word):
"""Test the candidate location (icol, irow) for word in orientation
dx, dy)."""
for j in range(len(word)):
if grid[irow][icol] not in (' ', word[j]):
return False
irow += dy
icol += dx
return True
def place_word(word):
"""Place word randomly in the grid and return True, if possible."""
# Left, down, and the diagonals.
dxdy_choices = [(0,1), (1,0), (1,1), (1,-1)]
random.shuffle(dxdy_choices)
for (dx, dy) in dxdy_choices:
if allow_backwards_words and random.choice([True, False]):
# If backwards words are allowed, simply reverse word.
word = word[::-1]
# Work out the minimum and maximum column and row indexes, given
# the word length.
n = len(word)
colmin = 0
colmax = ncols - n if dx else ncols - 1
rowmin = 0 if dy >= 0 else n - 1
rowmax = nrows - n if dy >= 0 else nrows - 1
if colmax - colmin < 0 or rowmax - rowmin < 0:
# No possible place for the word in this orientation.
continue
# Build a list of candidate locations for the word.
candidates = []
for irow in range(rowmin, rowmax+1):
for icol in range(colmin, colmax+1):
if test_candidate(irow, icol, dx, dy, word):
candidates.append((irow, icol))
# If we don't have any candidates, try the next orientation.
if not candidates:
continue
# Pick a random candidate location and place the word in this
# orientation.
loc = irow, icol = random.choice(candidates)
for j in range(n):
grid[irow][icol] = word[j]
irow += dy
icol += dx
# We're done: no need to try any more orientations.
break
else:
# If we're here, it's because we tried all orientations but
# couldn't find anywhere to place the word. Oh dear.
return False
print(word, loc, (dx, dy))
return True
# Iterate over the word list and try to place each word (without spaces).
for word in wordlist:
word = word.replace(' ', '')
if not place_word(word):
# We failed to place word, so bail.
return None, None
# grid is a list of lists, so we need to deepcopy here for an independent
# copy to keep as the solution (without random letters in unfilled spots).
solution = deepcopy(grid)
fill_grid_randomly(grid)
remove_mask(grid)
remove_mask(solution)
return grid, solution
def make_wordsearch(*args, **kwargs):
"""Make a word search, attempting to fit words into the specified grid."""
# We try NATTEMPTS times (with random orientations) before giving up.
NATTEMPTS = 10
for i in range(NATTEMPTS):
grid, solution = _make_wordsearch(*args, **kwargs)
if grid:
print('Fitted the words in {} attempt(s)'.format(i+1))
return grid, solution
print('I failed to place all the words after {} attempts.'
.format(NATTEMPTS))
return None, None
def show_grid_text(grid):
"""Output a text version of the filled grid wordsearch."""
for irow in range(nrows):
print(' '.join(grid[irow]))
def show_wordlist_text(wordlist):
"""Output a text version of the list of the words to find."""
for word in wordlist:
print(word)
def show_wordsearch_text(grid, wordlist):
"""Output the wordsearch grid and list of words to find."""
show_grid_text(grid)
print()
show_wordlist_text(wordlist)
def svg_preamble(fo, width, height):
"""Output the SVG preamble, with styles, to open file object fo."""
print("""<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" width="{}" height="{}" >
<defs>
<style type="text/css"><![CDATA[
line, path {{
stroke: black;
stroke-width: 4;
stroke-linecap: square;
}}
path {{
fill: none;
}}
text {{
font: bold 24px Verdana, Helvetica, Arial, sans-serif;
}}
]]>
</style>
</defs>
""".format(width, height), file=fo)
def grid_as_svg(grid, width, height):
"""Return the wordsearch grid as a sequence of SVG <text> elements."""
# A bit of padding at the top.
YPAD = 20
# There is some (not much) wiggle room to squeeze in wider grids by
# reducing the letter spacing.
letter_width = min(32, width / ncols)
grid_width = letter_width * ncols
# The grid is centred; this is the padding either side of it.
XPAD = (width - grid_width) / 2
letter_height = letter_width
grid_height = letter_height * nrows
s = []
# Output the grid, one letter at a time, keeping track of the y-coord.
y = YPAD + letter_height / 2
for irow in range(nrows):
x = XPAD + letter_width / 2
for icol in range(ncols):
letter = grid[irow][icol]
if letter != ' ':
s.append('<text x="{}" y="{}" text-anchor="middle">{}</text>'
.format(x, y, letter))
x += letter_width
y += letter_height
# We return the last y-coord used, to decide where to put the word list.
return y, '\n'.join(s)
def wordlist_svg(wordlist, width, height, y0):
"""Return a list of the words to find as a sequence of <text> elements."""
# Use two columns of words to save (some) space.
n = len(wordlist)
col1, col2 = wordlist[:n//2], wordlist[n//2:]
def word_at(x, y, word):
"""The SVG element for word centred at (x, y)."""
return ( '<text x="{}" y="{}" text-anchor="middle" class="wordlist">'
'{}</text>'.format(x, y, word) )
s = []
x = width * 0.25
# Build the list of <text> elements for each column of words.
y0 += 25
for i, word in enumerate(col1):
s.append(word_at(x, y0 + 25*i, word))
x = width * 0.75
for i, word in enumerate(col2):
s.append(word_at(x, y0 + 25*i, word))
return '\n'.join(s)
def write_wordsearch_svg(filename, grid, wordlist):
"""Save the wordsearch grid as an SVG file to filename."""
width, height = 1000, 1414
with open(filename, 'w') as fo:
svg_preamble(fo, width, height)
y0, svg_grid = grid_as_svg(grid, width, height)
print(svg_grid, file=fo)
# If there's room print the word list.
if y0 + 25 * len(wordlist) // 2 < height:
print(wordlist_svg(wordlist, width, height, y0), file=fo)
print('</svg>', file=fo)
def get_wordlist(wordlist_filename):
"""Read in the word list from wordlist_filename."""
wordlist = []
with open(wordlist_filename) as fi:
for line in fi:
# The word is upper-cased and comments and blank lines are ignored.
line = line.strip().upper()
if not line or line.startswith('#'):
continue
wordlist.append(line)
return wordlist
# Read the wordlist filename and grid dimensions (nrows, ncols) from the
# command line.
wordlist_filename = sys.argv[1]
nrows, ncols = int(sys.argv[2]), int(sys.argv[3])
mask = None
if len(sys.argv) > 4:
mask = sys.argv[4]
if nrows > NMAX or ncols > NMAX:
sys.exit('Maximum number of rows and columns is {}'.format(NMAX))
wordlist = sorted(get_wordlist(wordlist_filename), key=lambda w: len(w),
reverse=True)
# Obviously, no word can be longer than the maximum dimension.
max_word_len = max(nrows, ncols)
if max(len(word) for word in wordlist) > max_word_len:
raise ValueError('Word list contains a word with too many letters.'
'The maximum is {}'.format(max(nrows, ncols)))
# This flag determines whether words can be fitted backwards into the grid
# (which makes the puzzle a bit harder).
allow_backwards_words = False
# If using a mask, specify it by a key to the apply_mask dictionary.
grid, solution = make_wordsearch(nrows, ncols, wordlist, allow_backwards_words,
mask)
# If we fitted the words to the grid, show it in text format and save SVG files
# of the grid and its solution.
if grid:
show_wordsearch_text(grid, wordlist)
filename = os.path.splitext(wordlist_filename)[0] + '.svg'
write_wordsearch_svg(filename, grid, wordlist)
filename = os.path.splitext(wordlist_filename)[0] + '-solution.svg'
write_wordsearch_svg(filename, solution, [])

@ -0,0 +1,86 @@
. .. . . . .
. . .. . . . . .. .
. . . . . . . . . . . .. .
. . . . . . . .. .
. . . . . .. .. . . .
. . . . .
. . . . . ..
. . . . .
. . . . . . . .
. . . . . . .. . . . . . .
. . . . . . . . . . .. .. .
. . . .. . . . . .
. . . . . . . . .
... . . . . . . . .. . .. .
.. . . . ... . . . .
. . . . .
. . . . . . . . . . ..
. . . . .. . .. .. .. . .
. . . . . . . . .
. . . . .. .
. . . . .. . . .. . ..
. .. . . . .
.. . . . .
. . . . . . . .. .
. . . . . . . . . .
. .. . . . .
. . .. . . . . .. .
. . . . . . . . . . . .. .
. . . . . . . .. .
. . . . . .. .. . . .
. . . . .
. . . . . ..
. . . . .
. . . . . . . .
. . . . . . .. . . . . . .
. . . . . . . . . . .. .. .
. . . .. . . . . .
. . . . . . . . .
... . . . . . . . .. . .. .
.. . . . ... . . . .
. . . . .
. . . . . . . . . . ..
. . . . .. . .. .. .. . .
. . . . . . . . .
. . . . .. .
. . . . .. . . .. . ..
. .. . . . .
.. . . . .
. . . . . . . .. .
. . . . . . . . . .
. . . . .
. . . . . ..
. . . . .
. . . . . . . .
. . . . . . .. . . . . . .
. . . . . . . . . . .. .. .
. . . .. . . . . .
. . . . . . . . .
... . . . . . . . .. . .. .
.. . . . ... . . . .
. . . . .
. . . . . . . . . . ..
. . . . .. . .. .. .. . .
. . . . . . . . .
. . . . .. .
. . . . .. . . .. . ..
. .. . . . .
.. . . . .
. . . . . . . .. .
. . . . . . . . . .
. .. . . . .
. . .. . . . . .. .
. . . . . . . . . . . .. .
. . . . . . . .. .
. . . . . .. .. . . .
. . . . .
. . . . . ..
. . . . .
. . . . . . . .
. . . . . . .. . . . . . .
. . . . . . . . . . .. .. .
. . . .. . . . . .
. . . . . . . . .
... . . . . . . . .. . .. .
.. . . . ... . . . .

@ -0,0 +1,368 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Generating mini-puzzles with random.choice()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dots-and-boxes & Connect the dots & ... ?\n",
"\n",
"![](https://upload.wikimedia.org/wikipedia/commons/b/b7/Dots-and-boxes-chains.png)\n",
"\n",
"![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d8/Connect_the_dots_puzzle_%28partially_solved%29.png/400px-Connect_the_dots_puzzle_%28partially_solved%29.png)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" . . . . . . \n",
" . . . .. . \n",
" . . . . . . . \n",
" . . . . . . . . .. \n",
" . . . . . . . . . .\n",
" . . . .. . . . . . \n",
" . . . . . \n",
" . . . . . . \n",
" . .. . . . \n",
" . . . .. . . . \n",
" . . . . . . . \n",
". . . . . . . . \n",
" . . . . .. .. . . . \n",
" . . . . . . . . . . . . . \n",
" . . . . . . \n",
" . ... . .. . . . . . . . . . .. \n",
" . . . . . . . . . \n",
" . . ... .. . .. . . . . . . \n",
" . . . . .. . . ... . \n",
" . . . . . . . . . . \n",
" . . . . . . . .. . . . .. \n",
" . . . . . . . . \n",
". . . . . . . . .. . . . . . \n",
" . . . .. .\n",
" . . .. . . . . . . . \n"
]
}
],
"source": [
"from random import choice\n",
"\n",
"characters = ['.', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']\n",
"width = 100\n",
"height = 25\n",
"\n",
"for y in range(height):\n",
" for x in range(width):\n",
" print(choice(characters), end='')\n",
" print('')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generate a \"Connect the dots\" with jp2a"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](play.jpg)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": true,
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"jp2a 1.0.6\n",
"Copyright (C) 2006 Christian Stigen Larsen\n",
"Distributed under the GNU General Public License (GPL) v2.\n",
"\n",
"Usage: jp2a [ options ] [ file(s) | URL(s) ]\n",
"\n",
"Convert files or URLs from JPEG format to ASCII.\n",
"\n",
"OPTIONS\n",
" - Read images from standard input.\n",
" --blue=N.N Set RGB to grayscale conversion weight, default is 0.1145\n",
" -b, --border Print a border around the output image.\n",
" --chars=... Select character palette used to paint the image.\n",
" Leftmost character corresponds to black pixel, right-\n",
" most to white. Minimum two characters must be specified.\n",
" --clear Clears screen before drawing each output image.\n",
" --colors Use ANSI colors in output.\n",
" -d, --debug Print additional debug information.\n",
" --fill When used with --color and/or --html, color each character's\n",
" background color.\n",
" -x, --flipx Flip image in X direction.\n",
" -y, --flipy Flip image in Y direction.\n",
" -f, --term-fit Use the largest image dimension that fits in your terminal\n",
" display with correct aspect ratio.\n",
" --term-height Use terminal display height.\n",
" --term-width Use terminal display width.\n",
" -z, --term-zoom Use terminal display dimension for output.\n",
" --grayscale Convert image to grayscale when using --html or --colors\n",
" --green=N.N Set RGB to grayscale conversion weight, default is 0.5866\n",
" --height=N Set output height, calculate width from aspect ratio.\n",
" -h, --help Print program help.\n",
" --html Produce strict XHTML 1.0 output.\n",
" --html-fill Same as --fill (will be phased out)\n",
" --html-fontsize=N Set fontsize to N pt, default is 4.\n",
" --html-no-bold Do not use bold characters with HTML output\n",
" --html-raw Output raw HTML codes, i.e. without the <head> section etc.\n",
" --html-title=... Set HTML output title\n",
" -i, --invert Invert output image. Use if your display has a dark\n",
" background.\n",
" --background=dark These are just mnemonics whether to use --invert\n",
" --background=light or not. If your console has light characters on\n",
" a dark background, use --background=dark.\n",
" --output=... Write output to file.\n",
" --red=N.N Set RGB to grayscale conversion weight, default 0.2989f.\n",
" --size=WxH Set output width and height.\n",
" -v, --verbose Verbose output.\n",
" -V, --version Print program version.\n",
" --width=N Set output width, calculate height from ratio.\n",
"\n",
" The default mode is `jp2a --term-fit --background=dark'.\n",
" See the man-page for jp2a for more detailed help text.\n",
"\n",
"Project homepage on http://jp2a.sf.net\n",
"Report bugs to <csl@sublevel3.org>\n"
]
}
],
"source": [
"! jp2a --help"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMWMMMMMMMMMMMMMMMMMMMMWNMMNNWMMMMNWNNMMMMMMMMMMMMMMMMWMMMMMMMMWMMMMMMMMKNNWMMMMMMMMMMMMMMMMMMMM\n",
"MMKdWWNXMMMxNWNNWNNONNNWNNNNWokWMNNXNNNMMWNXMMMMMMMMM0NNNNXNNNNoXWWKMMMMMMMdKMMNXMMM00NXWMMM00NNNMMM\n",
"MM0oMMMNMMM;NMMMMMM;KXWMMMMXXKcMMxkMMMNXkkXMMMMMMMMMMcMMMMXNMMW:XMMNMMMMMMOkMMMMNXXONMMMNNNkXMMMXNMM\n",
"MMXlMMMNMMMcXMX00KXNXkxMMMWXMM00KKoOXMWNNNNNMMMMMMMMMcMMMXNxxMW:0MMNMMMMMXdMMKlMMNox0MMMMMXMMMWXWMMM\n",
"MMNcMMMNWWN,0MMXXNMMM0xMMMXWMMMMMMMKK00oWMMWNMMMMMMMMcMMMWWXWNXx0MMWWWWNXoWMMKcKMMNXKxxKMMMMMNNMMMMM\n",
"MMMlMMMMMMM,0MMWWWNNM0kMMMXMMMMMMWdNNNNXMMMMXMMMMMMMMcMMMMXXNMMkkMMMMMMMcXMMMMMMMMMNNMMcMMMMMNMMMMMM\n",
"MMMcMMWWWXN:kNXXXXXWMKd0KWXMMMMMMoOMMMMMMWNXMMMMMMMMMcMMMMXMMMMOxMWWWNXNlKMMNXXcXMNNNMMcNWWWMNMMMMMM\n",
"MMMKXXKXXXNNXNMMMMMMMMMMX0WMMMMMMMKO0KKXNWMMMMMMMMMMMXKKKKNMMMMWKXXKXXXWMKk0NMMWONWMMMMNXKKXKWMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n"
]
}
],
"source": [
"! jp2a play.jpg --width=100"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" \n",
" \n",
" \n",
" . .. ... .... . . .... \n",
" ...... ..................... ...... ... ............... .. .. ..... ..... \n",
" .. . .. .... .... .. ..... . .. ... . .. ..... ..... .. \n",
" .. . .. ......... .. ....... ...... . .... ... . .. .. .... . ... \n",
" .. ...... ... .. .. ...... .. . ........ ........ ... ...... .. \n",
" . .. ..... .. . ....... . . ... .. .. .. . . \n",
" . .............. ...... .. ... . . .. ........ ..... ... ..... . \n",
" ........... ... ........ ...... ......... .... .... ....... \n",
" \n",
" \n",
" \n"
]
}
],
"source": [
"img = '''MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMWMMMMMMMMMMMMMMMMMMMMWNMMNNWMMMMNWNNMMMMMMMMMMMMMMMMWMMMMMMMMWMMMMMMMMKNNWMMMMMMMMMMMMMMMMMMMM\n",
"MMKdWWNXMMMxNWNNWNNONNNWNNNNWokWMNNXNNNMMWNXMMMMMMMMM0NNNNXNNNNoXWWKMMMMMMMdKMMNXMMM00NXWMMM00NNNMMM\n",
"MM0oMMMNMMM;NMMMMMM;KXWMMMMXXKcMMxkMMMNXkkXMMMMMMMMMMcMMMMXNMMW:XMMNMMMMMMOkMMMMNXXONMMMNNNkXMMMXNMM\n",
"MMXlMMMNMMMcXMX00KXNXkxMMMWXMM00KKoOXMWNNNNNMMMMMMMMMcMMMXNxxMW:0MMNMMMMMXdMMKlMMNox0MMMMMXMMMWXWMMM\n",
"MMNcMMMNWWN,0MMXXNMMM0xMMMXWMMMMMMMKK00oWMMWNMMMMMMMMcMMMWWXWNXx0MMWWWWNXoWMMKcKMMNXKxxKMMMMMNNMMMMM\n",
"MMMlMMMMMMM,0MMWWWNNM0kMMMXMMMMMMWdNNNNXMMMMXMMMMMMMMcMMMMXXNMMkkMMMMMMMcXMMMMMMMMMNNMMcMMMMMNMMMMMM\n",
"MMMcMMWWWXN:kNXXXXXWMKd0KWXMMMMMMoOMMMMMMWNXMMMMMMMMMcMMMMXMMMMOxMWWWNXNlKMMNXXcXMNNNMMcNWWWMNMMMMMM\n",
"MMMKXXKXXXNNXNMMMMMMMMMMX0WMMMMMMMKO0KKXNWMMMMMMMMMMMXKKKKNMMMMWKXXKXXXWMKk0NMMWONWMMMMNXKKXKWMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n",
"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'''\n",
"\n",
"for line in img.split(\"\\n\"):\n",
" for letter in line:\n",
" if letter == \"M\":\n",
" img = img.replace(letter, \" \")\n",
" else:\n",
" img = img.replace(letter, \".\")\n",
" \n",
"print(img)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## World Wheel but different\n",
"\n",
"![](https://literacystarter.files.wordpress.com/2014/11/word-wheel.png)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" a a n i i i o a f i fi i \n",
" a cm i i a \n",
" c ti n a c ii a n n \n",
" a f i g n a i i c \n",
" nt i c i n c o \n",
" a a m o m fg a cm g m \n",
" i a i n ia a a o g i t\n",
"nm g n i a f i i i i a i n o i if t \n",
"o c i a i gt o g a a i i \n",
" g o o i o f c a c a i i\n",
" o g f i i a t c i an t a i i f n\n",
" i i o a gm g f i \n",
" i g f c a a ca i t c a t \n",
" i a to a n o n o c io \n",
" f o f iam c i i a \n",
" g g a a m g a n a n i g \n",
" c f o o t n o g n m t c \n",
" f i g ng o m i i im \n",
" a iim a i i t i i n \n",
" c oa m a c g a n g ig i naag \n",
" f i o a f o a a o t o g m \n",
" t t i a i a a fa c c n \n",
" o g m i a i i n g m m i f n i i \n",
" n g a m i i o ft i f i f\n",
" t m ia g i i \n"
]
}
],
"source": [
"from random import choice\n",
"\n",
"character_set = 'gamification '\n",
"characters = [character for character in character_set]\n",
"width = 100\n",
"height = 25\n",
"\n",
"for y in range(height):\n",
" for x in range(width):\n",
" print(choice(characters), end='')\n",
" print('')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# More games plz!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What other mini-games can we make?\n",
"\n",
"You can restrict yourself to using **ASCII characters only** (see https://en.wikipedia.org/wiki/ASCII) and stay in touch with early computer graphics ASCII art...\n",
"\n",
"Or you can extend your pallete with **Unicode characters**. This is a nice website that highlights specific character sets: http://xahlee.info/comp/unicode_index.html"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

@ -0,0 +1,18 @@
# Word Search Puzzle
A simple word search made in python
![#demo](./demo.png)
## Usage
```
$ python3 main.py -h
usage: main.py [-h] [-c] [-f FILE]
Generates a word search puzzle
optional arguments:
-h, --help show this help message and exit
-c, --cheated Hightlight words
-f FILE, --file FILE Path to a custom words file. One word per line.
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

@ -0,0 +1,50 @@
from word_grid import *
import argparse
# Initialize parser
parser = argparse.ArgumentParser(description="Generates a word search puzzle")
# Adding optional argument
parser.add_argument("-c", "--cheated", action="store_true", help = "Hightlight words")
parser.add_argument("-f", "--file", type=str, default="words.txt", help = "Path to a custom words file. One word per line.")
parser.add_argument("-s", "--size", type=int, default=20, help = "Sets a custom grid size (Default: 20)")
# Read arguments from command line
args = parser.parse_args()
def main(cheated=False, words_file=None, size=20):
# generating words from file
# words = ["wear", "variable", "print", "minimum", "graduate", "room", "bulk", "advise", "completed", "memory"]
file1 = open(words_file, 'r')
# lines = file1.readlines() # !!! THIS LINE BLOCKED CUSTOM WORD FILES !!! -- mb
words = [word.strip() for word in file1.readlines()] # !!! STRIP() IS ADDED !!! -- mb
file1.close()
# appending words to array
# for _ in range(10):
# words.append(lines[random.randint(0, len(lines)-1)].strip())
# creating the word grid
grid = WordGrid(size)
print("┌────────────────────┐")
print("│ Word Search Puzzle │")
print("└────────────────────┘")
grid.cheated = cheated
grid.generate_with_words(words)
# printing the words to find
print("Words:")
count = 0
for word in words:
count += 1
print(f"{count}. {word}", end=" | ")
print()
if __name__ == "__main__":
main(cheated=args.cheated, words_file=args.file, size=args.size)
# Created by Magoninho

@ -0,0 +1,6 @@
import random
alphabet = 'abcdefghijklmnopqrstuvwxyz'
def get_random_letter():
return alphabet[random.randint(0, len(alphabet)-1)]

@ -0,0 +1,50 @@
from word_grid import *
import argparse
# Initialize parser
parser = argparse.ArgumentParser(description="Generates a word search puzzle")
# Adding optional argument
parser.add_argument("-c", "--cheated", action="store_true", help = "Hightlight words")
parser.add_argument("-f", "--file", type=str, default="words.txt", help = "Path to a custom words file. One word per line.")
parser.add_argument("-s", "--size", type=int, default=20, help = "Sets a custom grid size (Default: 20)")
# Read arguments from command line
args = parser.parse_args()
def main(cheated=False, words_file=None, size=20):
# generating words from file
# words = ["wear", "variable", "print", "minimum", "graduate", "room", "bulk", "advise", "completed", "memory"]
file1 = open(words_file, 'r')
# lines = file1.readlines() # !!! THIS LINE BLOCKED CUSTOM WORD FILES !!! -- mb
words = [word.strip() for word in file1.readlines()] # !!! STRIP() IS ADDED !!! -- mb
file1.close()
# appending words to array
# for _ in range(10):
# words.append(lines[random.randint(0, len(lines)-1)].strip())
# creating the word grid
grid = WordGrid(size)
print("┌────────────────────┐")
print("│ Word Search Puzzle │")
print("└────────────────────┘")
grid.cheated = cheated
grid.generate_with_words(words)
# printing the words to find
print("Words:")
count = 0
for word in words:
count += 1
print(f"{count}. {word}", end=" | ")
print()
if __name__ == "__main__":
main(cheated=args.cheated, words_file=args.file, size=args.size)
# Created by Magoninho

@ -0,0 +1,115 @@
from math import sqrt
from alphabet import *
import random
HORIZONTAL = 0
VERTICAL = 1
class WordGrid:
def __init__(self, width) -> None:
self.grid = []
self.width = width
self.area = width**2
self.cheated = False
# creating the grid array
for col in range(self.area):
self.grid.append(get_random_letter())
self.available_spots = []
# all the available spots that a letter can be placed
# True: can be placed
# False: can not be placed
for spot in range(self.area):
self.available_spots.append(True) # all spots are available at the beginning
# generates the word grid with words
# if this method is not called before printing the grid,
# it will print just some random letters
def generate_with_words(self, words):
# check if there are too much letters
if self.can_generate(words):
for word in words:
finded_place_to_enter_word = False
while not finded_place_to_enter_word:
# chooses a random direction
random_direction = random.choice([HORIZONTAL, VERTICAL])
# random x and y positions of the first letter of the current word
random_x = random.randint(0, self.width-1)
random_y = random.randint(0, self.width-1)
# making sure the word won't go out of bounds
if random_x + len(word) > self.width and random_direction == HORIZONTAL:
random_x -= (random_x + len(word)) - self.width
if random_y + len(word) > self.width and random_direction == VERTICAL:
random_y -= (random_y + len(word)) - self.width
# checking if the word can be placed before placing it
if self.is_placeable(word, random_x, random_y, random_direction):
self.place_word(word, random_x, random_y, random_direction)
finded_place_to_enter_word = True
# when generating finishes, print itself
self.print()
# sets a word in a position and with a particular direction
def place_word(self, word, x, y, direction):
# for every letter on the word
for l in range(len(word)):
if direction == HORIZONTAL:
# place horizontally
self.grid[x+l + y * self.width] = "\033[32m" + word[l] + "\033[0m" if self.cheated else word[l]
self.available_spots[x+l + y * self.width] = False # making the horizontal spot unavaliable
elif direction == VERTICAL:
# place vertically
self.grid[x + (y+l) * self.width] = "\033[32m" + word[l] + "\033[0m" if self.cheated else word[l]
self.available_spots[x + (y+l) * self.width] = False # making the vertical spot unavaliable
# checks if a word can be placed in a position and with a particular direction
def is_placeable(self, word, x, y, direction):
# for every letter on the word
for l in range(len(word)):
spot_available = self.available_spots[x+l + y * self.width] if direction == HORIZONTAL else self.available_spots[x + (y+l) * self.width]
# if the spot is available, then continue checking
if spot_available:
continue
# if a spot is unavaliable, then is not placeable, returns false
else:
return False
# if the loop finishes without returning false, it means that is placeable, returns true
return True
def can_generate(self, words):
letter_count = 0
for word in words:
for letter in word:
letter_count += 1
# if there are much more letters than the grid area
if letter_count > self.area:
print("\nToo many words for a little grid!")
return False
if len(word) > self.width:
print(f"\nYou entered a word too big for the grid size! (Grid size: {self.width})")
return False
return True
# prints the grid on the terminal
def print(self):
print("\033[96m┌" + (""*(2*(self.width)+1)) + "\033[0m" ) # just a nice little line
for y in range(self.width):
print("\033[96m│\033[0m", end=" ")
for x in range(self.width):
print(self.grid[x + y * self.width], end=" ")
print("\033[96m│\033[0m")
print("\033[96m└" + (""*(2*(self.width)+1)) + "\033[0m" )

@ -0,0 +1,108 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generating word search puzzles"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![](https://mario.wiki.gallery/images/thumb/3/31/WordSearch_178_1.png/683px-WordSearch_178_1.png)\n",
"\n",
"https://github.com/Magoninho/word-search-puzzle-generator.git"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"! git clone https://github.com/Magoninho/word-search-puzzle-generator.git"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**NOTE**: two small changes need to be made in main.py to make this code work.\n",
"\n",
"Comment this line out: \n",
"\n",
"`# words = [\"wear\", \"variable\", \"print\", \"minimum\", \"graduate\", \"room\", \"bulk\", \"advise\", \"completed\", \"memory\"]`\n",
"\n",
"And change this line...\n",
"\n",
"`lines = file1.readlines()`\n",
"\n",
"into: \n",
"\n",
"`words = [word.strip() for word in file1.readlines()]`\n",
"\n",
"Now it should work!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"! python3 word-search-puzzle-generator/src/main.py -h"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"! python3 word-search-puzzle-generator/src/main.py --file word-search.txt -s 20 -c"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}

@ -0,0 +1,10 @@
hello
world
and
what
other
words
can
i
play
with

@ -0,0 +1,69 @@
a o it m i i m f c
c i ag n o amf f o i
o i o f i a g af i g
m i f a t g c f t i
n o f a f tnf o f
a i i i i i t in c caa
t fa n f i t a i o
o i ag ig g g a i i i n ag
n m gt a i o f i o ni i i
m i f i a a a o i m a g c
f am a c o i f cna f mi
t a i c f g f n i c o o g
o f t a g ng i a i a n n o a t oi i it
o t n o m f g a i a m ni
f i i g m o i a n t a i a a m i a i a
i a a ac i a t i tn t a
o f tf i an i n o f i t t
c g fg i o o ca i o o o m t
f o i i i c i ta i ca c f
c n aa g i m g m i c
c i c i f i n m f i i
a o i g m o ot a i a c f m i
i a a i f f a c g i
to in a t og im i o i f n c
ao m g ii c n a to t
c a of g m g i a c n m a i c m i g
fm f oi i c t g g f a c c i i n
i i mf a in n m n
o a i o t g o m ag
m o o t c m c i i
i f gii a f ic m oc m f
m c m i t a i m go i
n mn m a n i a i i
i i i c i g
iii c i a a i a o ai t i c a
a c m i o o an f t m i a a g
g g a c f a n c m a m f o m c i
a g a a i n g a n
ani a t m c n f i o g a t
i f in i n m g ita o i a o i mc a
in i i f ci a i to tf i ct i
i a t o ga i t n t
a a ii o mt fi n g f a t n a i
g f in t ig a o i a g m ma o
o o o g a o ni n i in f i
i i a a n i f
a i o i g a f a ta c a o g a i
t tc a f i n g t i fg no
f ot i a a a i i i g n t i t m c i n
ic a n a i i i mi ni m a t i
Loading…
Cancel
Save