Updated portfolio side of the site
|
@ -3,7 +3,8 @@ module.exports = {
|
||||||
title: 'The Paper Pilot',
|
title: 'The Paper Pilot',
|
||||||
description: 'The Paper Pilot portfolio site',
|
description: 'The Paper Pilot portfolio site',
|
||||||
head: [
|
head: [
|
||||||
['link', { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,400;0,600;1,400' }],
|
['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }],
|
||||||
|
['link', { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Pacifico&family=Roboto+Mono:ital,wght@0,400;0,600;1,400&display=swap' }],
|
||||||
['link', { rel: 'manifest', href: '/site.webmanifest' }],
|
['link', { rel: 'manifest', href: '/site.webmanifest' }],
|
||||||
['script', { defer: true, 'data-domain': 'thepaperpilot.org', src: 'https://plausible.io/js/plausible.js' }],
|
['script', { defer: true, 'data-domain': 'thepaperpilot.org', src: 'https://plausible.io/js/plausible.js' }],
|
||||||
['meta', { name: 'og:description', content: 'The Paper Pilot portfolio site' }]
|
['meta', { name: 'og:description', content: 'The Paper Pilot portfolio site' }]
|
||||||
|
@ -11,6 +12,7 @@ module.exports = {
|
||||||
lastUpdated: true,
|
lastUpdated: true,
|
||||||
cleanUrls: 'with-subfolders',
|
cleanUrls: 'with-subfolders',
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
|
outline: 'deep',
|
||||||
nav: [
|
nav: [
|
||||||
{ text: "Guide to Incrementals", link: "/guide-to-incrementals/", activeMatch: "^/guide-to-incrementals" },
|
{ text: "Guide to Incrementals", link: "/guide-to-incrementals/", activeMatch: "^/guide-to-incrementals" },
|
||||||
{ text: "Projects", link: "/projects/", activeMatch: "^/projects" },
|
{ text: "Projects", link: "/projects/", activeMatch: "^/projects" },
|
||||||
|
@ -27,28 +29,38 @@ module.exports = {
|
||||||
text: "Ludology",
|
text: "Ludology",
|
||||||
collapsible: true,
|
collapsible: true,
|
||||||
items: [
|
items: [
|
||||||
{ text: "Defining the Genre", link: "/guide-to-incrementals/ludology/definition/" },
|
{ text: "Defining the Genre", link: "/guide-to-incrementals/ludology/definition" },
|
||||||
{ text: "Appeal to Players", link: "/guide-to-incrementals/ludology/appeal-games/" },
|
{ text: "Appeal to Players", link: "/guide-to-incrementals/ludology/appeal-games" },
|
||||||
{ text: "Appeal to Developers", link: "/guide-to-incrementals/ludology/appeal-developers/" },
|
{ text: "Appeal to Developers", link: "/guide-to-incrementals/ludology/appeal-developers" },
|
||||||
{ text: "What is Content?", link: "/guide-to-incrementals/ludology/content/" }
|
{ text: "What is Content?", link: "/guide-to-incrementals/ludology/content" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"projects": [
|
"projects": [
|
||||||
{
|
{
|
||||||
text: "Games",
|
text: "Play Now",
|
||||||
items: [
|
items: [
|
||||||
{ text: "Kronos", link: "/Kronos" },
|
{ text: "Kronos", link: "/kronos/" },
|
||||||
{ text: "Game Dev Tree", link: "/gamedevtree" },
|
{ text: "Game Dev Tree", link: "/gamedevtree/" },
|
||||||
{ text: "Lit", link: "/lit" },
|
{ text: "Lit", link: "/lit/" },
|
||||||
{ text: "The Ascension Tree", link: "/the_ascension_tree" },
|
{ text: "The Ascension Tree", link: "/the_ascension_tree/" },
|
||||||
{ text: "Dream Hero", link: "/dream" }
|
{ text: "Dream Hero", link: "/dream/" },
|
||||||
|
{ text: "My Itch Page", link: "https://thepaperpilot.itch.io/" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "More",
|
text: "Downloads",
|
||||||
items: [
|
items: [
|
||||||
{ text: "My Itch Page", link: "https://thepaperpilot.itch.io/" }
|
{ text: "Dice Armor", link: "/projects/dice/" },
|
||||||
|
{ text: "Capture the Citadel", link: "/projects/citadel/"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Non-Games",
|
||||||
|
items: [
|
||||||
|
{ text: "V-ecs", link: "/projects/vecs/" },
|
||||||
|
{ text: "OptiSpeech", link: "/projects/optispeech/" },
|
||||||
|
{ text: "Babble Buds", link: "/projects/babble/" }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
7
site/.vitepress/theme/custom.css
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
:root {
|
||||||
|
--vp-font-family-mono: Roboto Mono, monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .name .clip {
|
||||||
|
font-family: Pacifico, cursive;
|
||||||
|
}
|
4
site/.vitepress/theme/index.ts
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import DefaultTheme from 'vitepress/theme'
|
||||||
|
import './custom.css'
|
||||||
|
|
||||||
|
export default DefaultTheme
|
|
@ -1 +1 @@
|
||||||
Subproject commit 656dd585ef220638f0bd9e4b36b8bc73f4d993a1
|
Subproject commit 3e58fb5753a6815bb8761589c0af5c4a023221cd
|
|
@ -3,5 +3,9 @@ title: The Paper Pilot
|
||||||
layout: home
|
layout: home
|
||||||
hero:
|
hero:
|
||||||
name: The Paper Pilot
|
name: The Paper Pilot
|
||||||
tagline: I'm Anthony, or The Paper Pilot, and I make fun games and tools using code!
|
tagline: I'm Anthony, or The Paper Pilot, and I make fun games and tools!
|
||||||
|
actions:
|
||||||
|
- theme: brand
|
||||||
|
text: My Projects
|
||||||
|
link: /projects/
|
||||||
---
|
---
|
||||||
|
|
BIN
site/projects/babble/babblemmscreenshot.png
Normal file
After Width: | Height: | Size: 872 KiB |
30
site/projects/babble/index.md
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
---
|
||||||
|
title: Babble Buds
|
||||||
|
---
|
||||||
|
# Babble Buds
|
||||||
|
|
||||||
|
[Babble Buds Homepage](http://babblebuds.xyz/)
|
||||||
|
|
||||||
|
Source Code:
|
||||||
|
- [Babble Buds](https://github.com/thepaperpilot/Babble-Buds)
|
||||||
|
- [Babble Movie Maker](https://github.com/thepaperpilot/BabbleMovieMaker)
|
||||||
|
- [babble.js](https://github.com/thepaperpilot/babble.js)
|
||||||
|
- [babble.cs](https://github.com/thepaperpilot/babble.cs)
|
||||||
|
|
||||||
|
Babble buds is a free, open-source virtual puppet show software. It is heavily based on the non-public software called "Puppet Pals", used in URealms Live. The software is written in javascript using React, a rendering library called PIXI.js, and electron.
|
||||||
|
|
||||||
|
Users can create puppets with different faces for different emotions, and then use the puppet on a stage where you and other users can each make your respective puppets move, change emotions, and "babble" at each other. The stage has a green screen feature and can be popped out, which gives the users tons of possibilities in terms of using the program for a role-playing live stream, faux video chatting with friends, game development, or whatever else you want!
|
||||||
|
|
||||||
|
Users can connect to the public server and create private rooms so that they and their friends can see each other's puppets and use the software however they please. For the security conscious, you can also use the server's source code to self-host your private server.
|
||||||
|
|
||||||
|
![Babble Buds Screenshot](./screenshot.png)
|
||||||
|
|
||||||
|
## Engine
|
||||||
|
|
||||||
|
The engine originally made to make the Babble Buds program was separated into a separate engine called `babble.js`, so that projects created in Babble Buds can be used in other projects. For example, a game can create puppets in Babble Buds and then use them for cutscenes or player agency inside of the game. Additionally, it has been ported to C# (called `babble.cs`) for use with Unity, for the same kinds of purposes. You can check out [Tower Offense](https://thepaperpilot.itch.io/tower-offense) for a pixi.js game using Babble Buds puppets for the cutscenes, or [Dice Armor](../dice) for a unity game using Babble Buds puppets for the cutscenes.
|
||||||
|
|
||||||
|
## Babble Movie Maker
|
||||||
|
|
||||||
|
Babble Movie Maker is a cutscene editor for Babble Buds puppets. You open a babble buds project in it, and you can add actors to a stage and have them move and change expressions, etc., on a timeline. You can then use the cutscene in a game using `babble.js` or `babble.cs`, or export the cutscene into a video file. There is even support for defining custom commands with custom fields, so that if you've expanded upon the default actions provided in `babble.js` or `babble.cs`, you can still use Movie Maker to create your cutscenes.
|
||||||
|
|
||||||
|
![Babble MM Screenshot](./babblemmscreenshot.png)
|
BIN
site/projects/babble/screenshot.png
Normal file
After Width: | Height: | Size: 549 KiB |
10
site/projects/citadel/index.md
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
title: Capture the Citadel
|
||||||
|
---
|
||||||
|
# Capture the Citadel
|
||||||
|
|
||||||
|
A 3D VR re-envisioning of a Slay the Spire-style game by Anthony Lawn and Grant Barbee for their VR class in college's final project.
|
||||||
|
|
||||||
|
For more details, visit [Grant's page on the game](https://grantcbarbee.github.io/conquer-the-citadel.html).
|
||||||
|
|
||||||
|
![Screenshot](./screenshot.png)
|
BIN
site/projects/citadel/screenshot.png
Normal file
After Width: | Height: | Size: 962 KiB |
BIN
site/projects/dice/da1.png
Normal file
After Width: | Height: | Size: 1.8 MiB |
BIN
site/projects/dice/da2.png
Normal file
After Width: | Height: | Size: 4.3 MiB |
BIN
site/projects/dice/da3.png
Normal file
After Width: | Height: | Size: 7 MiB |
BIN
site/projects/dice/da6.png
Normal file
After Width: | Height: | Size: 669 KiB |
BIN
site/projects/dice/da7.png
Normal file
After Width: | Height: | Size: 2.8 MiB |
BIN
site/projects/dice/da8.png
Normal file
After Width: | Height: | Size: 6.3 MiB |
BIN
site/projects/dice/da9.png
Normal file
After Width: | Height: | Size: 7.9 MiB |
BIN
site/projects/dice/editors.png
Normal file
After Width: | Height: | Size: 201 KiB |
46
site/projects/dice/index.md
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
---
|
||||||
|
title: Dice Armor
|
||||||
|
---
|
||||||
|
# Dice Armor
|
||||||
|
|
||||||
|
[Download Here](https://drive.google.com/open?id=18rwqEIdMChdGtB-9LdI4wiqeM5C5ViOL)
|
||||||
|
|
||||||
|
Dice Armor is a game that started development as a semester-long project by a team of nine: a producer, a creative director, a narrative writer, an artist, two programmers, and 3 game designers. The information here is about my contributions as the lead programmer over the semester because I can show off stuff like the editor scripts I wrote. I was doing everything from interface coding, editor scripts, integrating Babble Buds, and of course, everything related to the gameplay itself. To date I'm still the lead programmer for the game; for more up-to-date information on the current state of the game please visit the official site.
|
||||||
|
|
||||||
|
The build available here was created for showing off at the end of the semester, and as such has some buttons present to make the game easier to skip parts of the game to see all the content: You start with all the dice in the game already in the shop, there's a button to give yourself free money to buy these dice with, and in the duel, there are buttons to force a win or a loss, which can be used to skip the tutorial (not recommended for first-time players).
|
||||||
|
|
||||||
|
![Tutorial](./da2.png)
|
||||||
|
|
||||||
|
Dice Armor is a dice dueling game. Players can use abilities, flip dice, and attack each other to win in a dice game that puts chance into the hands of the players. This is what the dueling scene looks like, with a tutorial cutscene happening on top to guide the player through the basics. Also, all the dice are constructed dynamically, using quaternion math to figure out the placement of each component relative to the face it is going on. The die in the middle has one of the player' and opponents' portraits on each of its sides.
|
||||||
|
|
||||||
|
![Editors](./editors.png)
|
||||||
|
|
||||||
|
For many of the objects I've created, I've made scriptable objects so that game designers can add and modify them easily. Additionally, I would create custom inspectors for the objects to help make them as easy to understand and edit as possible. The opponent's artificial intelligence is made up of many strategies, in a prioritized list. When it is the opponents' turn they go through each strategy and check if they can be run, and if so then the opponent performs the strategy and starts back over at the top of the list of strategies. The + sign under the list of strategies opens an organized dropdown of all the various strategies.
|
||||||
|
|
||||||
|
![Simulator](./simulator.JPG)
|
||||||
|
|
||||||
|
In addition to custom inspector code, I've created new tools for the editor for our game designers to use. This is a duel simulator that will take two opponents and simulate an arbitrary number of duels between them, and output the results and summarize them for you, much much quicker than manually going through the duels, even with an absurdly high timeScale. This will become incredibly useful in making balance changes and testing new dice against existing sets. This is a screenshot of it in edit mode, but in play mode it removes the "Dueling Managers" field and will use whatever the current duel balance settings are, allowing for the GDs to test freely in play mode without worrying about undoing all their changes afterward.
|
||||||
|
|
||||||
|
![Cutscene](./da1.png)
|
||||||
|
|
||||||
|
I created the Babble Buds puppet editor and ported the rendering library I wrote for it to C# so it could be used in Unity. Dice Armor has a full campaign using cutscenes made using the Babble Buds cutscene editor, taking advantage of its support for custom commands and fields to control things like talking, giving the player dice and money, starting duels, and controlling player progression through the story.
|
||||||
|
|
||||||
|
![Action Wheel](./da6.png)
|
||||||
|
|
||||||
|
When a cutscene ends, its final command is to either start a duel or set the next cutscene in the story. In the latter case, there is an additional field for what to call the next cutscene, and what location it takes place. The cutscene is then added to the player's save file, and when they visit the city locations are greyed out until they have at least one action to do there. Each location has a dynamically populated action wheel with a custom range of acceptable angles.
|
||||||
|
|
||||||
|
![Shop](./da7.png)
|
||||||
|
|
||||||
|
The dice shop is dynamically populated by a list of dice available to the player, which can be changed during cutscenes, and is checked against the dice owned by the player to generate sold-out indicators. On the left, the player can choose to filter the options down to a single dice effect, which also updates the "Buy All" button to buy only all the dice in the current filter.
|
||||||
|
|
||||||
|
![Inventory](./da8.png)
|
||||||
|
|
||||||
|
The inventory works most the same as the shop, but for equipping dice. It also allows you to drag individual dice or entire sets to the equipped dice glyph. While dragging it will highlight all the slots the new dice will be equipped into.
|
||||||
|
|
||||||
|
![Dice Rolling](./da3.png)
|
||||||
|
|
||||||
|
The dice rolling uses the physics engine and detects once the dice have stopped moving, then determines which side is face up based on which of the normals is closest to straight up. It flags the die as cocked if that smallest angle is above a threshold. The dice sink into the table when not rolling to not interfere with any dice that are rolling.
|
||||||
|
|
||||||
|
![Missile Storm](./da9.png)
|
||||||
|
|
||||||
|
During certain events like winning the game or having the face of a die broken, the players' portraits will flash an emotion for a second. After winning, a random living die from the winning player is chosen to play their "finisher move", a flashy and dramatic effect to end the game. Shown is the arcane mechana's finisher, "Missile Storm".
|
|
@ -1,3 +1,31 @@
|
||||||
---
|
---
|
||||||
title: Projects
|
title: Projects
|
||||||
|
lastUpdated: false
|
||||||
---
|
---
|
||||||
|
# Games!
|
||||||
|
|
||||||
|
I make games regularly! Check them out in the sidebar or on my [itch.io](https://thepaperpilot.itch.io/) page.
|
||||||
|
|
||||||
|
# Profectus!
|
||||||
|
|
||||||
|
I contributed to a modding framework called The Modding Tree and then made [Profectus](https://moddingtree.com) as an alternative that gives developers more control. Profectus is a game engine for the web that uses TS and Vue.
|
||||||
|
|
||||||
|
# [V-ecs!](./vecs/)
|
||||||
|
|
||||||
|
V-ecs (pronounced "Vex") is a Vulkan-based engine I made for making highly moddable games and tools in Lua centered around the ECS design pattern and a work-stealing job system.
|
||||||
|
|
||||||
|
# [OptiSpeech!](./optispeech/)
|
||||||
|
|
||||||
|
I led a team updating a legacy Unity project for research on speech therapy to use a modern version with a focus on extensibility to facilitate future maintenance and features.
|
||||||
|
|
||||||
|
# [Babble Buds!](./babble/)
|
||||||
|
|
||||||
|
Babble Buds is a free, open-source virtual puppet show engine I made for various platforms including HTLM5 and Unity, as well as an accompanying electron-based puppet editor and multiplayer stage.
|
||||||
|
|
||||||
|
# [Dice Armor](./dice/)
|
||||||
|
|
||||||
|
I was the lead programmer on a team of nine creating this game in a semester-long college course. I programmed all the gameplay systems as well as incorporated Babble Buds for the cutscenes and tutorial.
|
||||||
|
|
||||||
|
# [Capture the Citadel](./citadel/)
|
||||||
|
|
||||||
|
A 3D VR re-envisioning of a Slay the Spire-style game by Anthony Lawn and Grant Barbee.
|
||||||
|
|
BIN
site/projects/optispeech/documentation.png
Normal file
After Width: | Height: | Size: 41 KiB |
26
site/projects/optispeech/index.md
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
---
|
||||||
|
title: OptiSpeech
|
||||||
|
---
|
||||||
|
# OptiSpeech
|
||||||
|
|
||||||
|
The Optispeech project involves designing and testing a real-time tongue model that can be viewed in a transparent head while a subject talks — for the purposes of treating speech errors and teaching foreign language sounds. This work has been conducted in partnership with Vulintus and with support from the National Institutes of Health (NIH). The UT Dallas Speech Production Lab is currently updating the program to use updated versions of Unity and adding support for more features and hardware.
|
||||||
|
|
||||||
|
![System Architecture](./system-architecture-600.jpg)
|
||||||
|
|
||||||
|
<iframe width="560" height="315" src="https://www.youtube.com/embed/9uHqIRs7ZjM" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen style="display: block; margin: auto;"></iframe>
|
||||||
|
|
||||||
|
This video shows a talker with WAVE sensors placed on the tongue hitting a virtual target sphere located at the alveolar ridge. When an alveolar consonant is hit (e.g., /s/, /n/, /d/) the sphere changes color from red to green.
|
||||||
|
|
||||||
|
<iframe width="560" height="315" src="https://www.youtube.com/embed/Oz42mKvlzqI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen style="display: block; margin: auto;"></iframe>
|
||||||
|
|
||||||
|
This video shows an American talker learning a novel sound not found in English. When the post-alveolar consonant is hit, the target sphere changes color from red to green. Here, the NDI WAVE system serves as input.
|
||||||
|
|
||||||
|
The program is being updated by a team in the UT Dallas Speech Production Lab led by Anthony Lawn, so the program uses a more modern version of Unity, has an easier-to-use interface, can more easily support new features, and can connect to additional EMA systems, namely the Carstens AG501.
|
||||||
|
|
||||||
|
![New Interface](./new-interface.png)
|
||||||
|
|
||||||
|
In addition, the program now includes documentation and unit tests to improve program stability and maintainability going forward.
|
||||||
|
|
||||||
|
![Documentation](./documentation.png)
|
||||||
|
|
||||||
|
![Unit Tests](./unittests.png)
|
BIN
site/projects/optispeech/new-interface.png
Normal file
After Width: | Height: | Size: 918 KiB |
BIN
site/projects/optispeech/system-architecture-600.jpg
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
site/projects/optispeech/unittests.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
site/projects/vecs/debug.png
Normal file
After Width: | Height: | Size: 96 KiB |
18
site/projects/vecs/index.md
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
title: V-ecs
|
||||||
|
---
|
||||||
|
# V-ecs
|
||||||
|
|
||||||
|
![V-ecs Screenshot](./screenshot.png)
|
||||||
|
|
||||||
|
V-ecs (pronounced "Vex") is a Vulkan-based engine I made for making highly moddable games and tools in Lua centered around the ECS design pattern and a work-stealing job system.
|
||||||
|
|
||||||
|
The engine works with "worlds", which are collections of systems and renderers. The engine comes with several worlds using systems and renderers I made, including a voxel world, an incremental game, and some test scenes. All of these include systems to render the fps as well as show a debug console by typing the grave key (\`). The default world is a title screen that detects any worlds in the "worlds" folder and displays a button for each of them.
|
||||||
|
|
||||||
|
![Debug Menu](./debug.png)
|
||||||
|
|
||||||
|
The original plans were to eventually put it on the steam workshop so people could more easily share their creations amongst each other, but I never became happy enough with the performance of the engine - the parallelization of the lua code involved a lot of overhead that severely limited performance.
|
||||||
|
|
||||||
|
Instead, I made a couple of worlds by myself - an infinite procedurally generated voxel world, a simple incremental game, and a more complex incremental game I call "Sands of Time".
|
||||||
|
|
||||||
|
![Sands of Time](./sandsoftime.png)
|
BIN
site/projects/vecs/sandsoftime.png
Normal file
After Width: | Height: | Size: 558 KiB |
BIN
site/projects/vecs/screenshot.png
Normal file
After Width: | Height: | Size: 265 KiB |