website update; added bash scripts
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
<!--201217,200903-->
|
||||
<h1>what is blessfrey? </h1>
|
||||
august 6, 2020<br>
|
||||
#gamedescription <br>
|
||||
<br>
|
||||
<b>blessfrey</b> is a 2D action RPG developed for PC by chimchooree. <br>
|
||||
<br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_June292019.png">
|
||||
<img src="/static/img/ent/screenshot_June292019.png" alt="(image: Lots of Angels and other characters at a shopping center)" width="500" height="278.66">
|
||||
</a><br>
|
||||
<br>
|
||||
The game is designed to pit your skill + creativity against a series of combat + puzzle challenges while exploring the depths of the downtown dungeon. <br>
|
||||
<br>
|
||||
Class progression is freeform, and virtually no decision is permanent. At character creation, you will choose a permanent First Class, but you can unlock several new classes for multiclassing through gameplay. Through swapping out Second Classes, you can find a combination to express your playstyle. <br>
|
||||
<br>
|
||||
Each class has its own style of skills associated with it. Skills are individual powers gained through gameplay which give specific effects according to their rules. Your skillbar only has 8 skill slots and can only be edited in safe areas. The challenge comes from building winning strategies + synergies against the next area. <br>
|
||||
<br>
|
||||
Skills are gained through exploration of the game world. As you encounter enemies, meet people, and reach new areas, you will translate those experiences into new skills. There are multiple paths to learning, so you can focus on parts of the game you prefer. <br>
|
||||
<br>
|
||||
blessfrey has been lots of fun to work on. I hope you enjoy it once a demo and eventually a game drops. <br>
|
||||
<br>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!--201224,201015-->
|
||||
<h1>free pixel font </h1>
|
||||
august 20, 2020<br>
|
||||
#assets<br>
|
||||
<br>
|
||||
<b><a href="https://fontstruct.com/fontstructions/show/1596262/pixel-joy">pixel joy</a></b> is a small, round sans-serif pixel font, made using <a href="https://fontstruct.com/">FontStruct's FontStructor</a> for an old version of blessfrey. Freely use and edit for your personal and commercial projects. No credit needed. <br>
|
||||
<br>
|
||||
Download it from <a href="https://fontstruct.com/fontstructions/show/1596262/pixel-joy">FontStruct</a>.<br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/pixeljoy.jpeg" alt="image: pixel joy font preview"></center> <br>
|
||||
<br>
|
||||
Font released under public domain. Sample text in the preview image is from Imogen Heap's "Pocket Sun," and the colors are from <a href="https://lospec.com/palette-list/aap-64">Adigun Polack's AAP-64 palette</a>. :)<br>
|
||||
<br>
|
||||
@@ -0,0 +1,87 @@
|
||||
<!--200930,201031-->
|
||||
<h1>august 2020: new server, new site</h1>
|
||||
september 1, 2020<br>
|
||||
#apache #css #html #nginx #php #server #website<br>
|
||||
<br>
|
||||
<h2>tuesday, august 4 </h2>
|
||||
<ul>
|
||||
<li>CentOS VPS obtained through OVH. Always wanted a server. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>wednesday, august 5 </h2>
|
||||
<ul>
|
||||
<li>design the website </li>
|
||||
<li>prototype of website running on the server </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>thursday, august 6 </h2>
|
||||
<ul>
|
||||
<li>create some placeholder graphics, articles + CSS </li>
|
||||
<li>add a <a href="https://publish.twitter.com/#">Twitter timeline embed</a> </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>friday, august 7 </h2>
|
||||
<ul>
|
||||
<li>decide to use PHP for manage blessfrey's blog </li>
|
||||
<li>set up a local Apache server for practice. It was a little confusing! </li>
|
||||
<li>wrote a vaguely functioning Hello World script in PHP </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>saturday, august 8 </h2>
|
||||
<ul>
|
||||
<li>added images to live site despite conflicts with Linux's security </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>sunday, august 9 </h2>
|
||||
<ul>
|
||||
<li>studied PHP with <a href="https://www.w3schools.com/php/php_intro.asp">W3Schools</a> </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>monday, august 10 </h2>
|
||||
<ul>
|
||||
<li>studied PHP with <a href="https://www.w3schools.com/php/php_intro.asp">W3Schools</a> </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>saturday, august 15 </h2>
|
||||
<ul>
|
||||
<li>Made a Python script that spits out new skill scenes for Godot after answering a little command line questionnaire. I could make it an plugin for the engine, but it would be a lot slower to develop + functionally no better. </li>
|
||||
<li>Maybe I can rewrite it later in JSON, since Godot can read JSON. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>monday, august 17 </h2>
|
||||
<ul>
|
||||
<li>Research PHP + MySQL while attending. I think MySQL is overkill for my purposes, since all my articles couldn't possibly be that much data. It might be interesting for analyzing data, though, like adding a word cloud of the most common tags or a search feature. I'll keep things simple for now. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>august 18 - august 21 </h2>
|
||||
<ul>
|
||||
<li>Help run a FlightRising community event while trying out ArcheAge, since my friends play it. </li>
|
||||
<li>I told a friend I would play Go with him soon but was too busy with the raffle. Then someone told him I was online a lot in ArcheAge...oops...that looked bad lol. It wasn't like I played more than a few minutes at a time. I'm sorry, friend;; </li>
|
||||
<li>finally get access to the code for an MMO some friends work on. I start familiarizing myself with the code and start planning my new feature. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>saturday, august 22 </h2>
|
||||
<ul>
|
||||
<li>I work on pagination. The concept boggles my mind, but I can break it into pieces to solve like any other problem. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>sunday, august 23 </h2>
|
||||
<ul>
|
||||
<li>I work on my friends' MMO more. I make my own branch and make my first changes. The work environment is Windows-only, and the server is live with active players. Pretty cool experience. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>monday, august 24 </h2>
|
||||
<ul>
|
||||
<li>Still working on pagination in PHP to create a navigation bar for my development blog. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>tuesday, august 25 </h2>
|
||||
<ul>
|
||||
<li>Play around with CSS + HTML for the website. The CSS Grid didn't exist the last time I used CSS (for 2000s petsite profiles), so I'm more comfortable with floats. The Grid looks so worth learning, though, for more consistent and responsive web design. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>wednesday, august 26 </h2>
|
||||
<ul>
|
||||
<li>Get the landing page looking okay while using the CSS Grid. </li>
|
||||
</ul>
|
||||
<br>
|
||||
@@ -0,0 +1,76 @@
|
||||
<!--200806,201126-->
|
||||
<h1>my first game jam - #weeklygamejam </h1>
|
||||
september 3, 2020<br>
|
||||
#gamejam<br>
|
||||
<br>
|
||||
<b><a href="https://weeklygamejam.itch.io/">WeeklyGameJam</a></b> is a weekly theme-based game jam hosted through itch.io. It's fairly laid-back for a jam, giving you a full week's time, allowing for premade/stock assets and code, and being understanding towards late submissions. Most people make videogames, but any kind of game is allowed. At the end of the week, streamers will play and critique the submissions while the devs hang out in their chatrooms. <br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/SmallThingThatMakesThings.png" alt="(image: Key art of Elwell and Small Thing, buried in dogs)" width="500" height="223.77"></center> <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>small thing that makes things</h2>
|
||||
<br>
|
||||
I participated in Week 85 under the theme Offspring, submitting my game on February 27, 2019. My game was Small Thing That Makes Things, an adventure platformer. You can play it on <a href="https://chimchooree.itch.io/small-thing-that-makes-things">itch.io</a>. <br>
|
||||
<br>
|
||||
You play as Hamish T. Elwell, the hero accountant of an overcrowded animal shelter, investigating the recent explosion of the local stray population. You can walk, jump on platforms, collect items, and chat with NPCs. There's multiple endings, depending on your choices. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>positives </h2>
|
||||
<br>
|
||||
For a week-made game, I think STTMT is pretty cute, and I'm pretty happy with it.<img src="/static/img/emo/star.gif" alt=":)"> <br>
|
||||
<br>
|
||||
I actually finished a game, and someone actually finished playing it on a stream. That's really cool, even if STTMT isn't all that good. The deadline forced me to make final decisions, complete features, and move on, and there's a lot of value in that. <br>
|
||||
<br>
|
||||
The short time-frame forced me to get around to every aspect of game development, many of which I had never done before. I had to learn how to export a Godot project, upload an HTML5 game to itch, and make sure the exported game was complete and playable. Lots of the features were first-times for me, too. I've never written code for platformer movements or moving cameras. This also was the first time I've really gotten branching and conditional dialog working in Godot, which was a skill I immediately applied to blessfrey. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>mistakes</h2>
|
||||
<br>
|
||||
I recolored OPP's pixel art and lost the high contrast for the rock ledges. They blend into the rocky background, so you can't tell you can jump on them. I didn't even notice until <a href="https://www.twitch.tv/mrjoshuamclean">Joshua McLean</a> pointed this out during his stream. Having more eyes on your game is so important.<br>
|
||||
<br>
|
||||
Also the level design is just not interesting. I spent lots of time on the choices and adventure game aspects, while the platforming as an extreme afterthought. It's a game jam, though, what do you expect?<br>
|
||||
<br>
|
||||
I took the easy way out with animation. I might have learned more working from scratch, but modifying OPP's sprites to suit my character designs was way faster when I was already struggling to finish on time.<br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>screenshots + progression </h2>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/SmallThingThatMakesThings_flatland.png">
|
||||
<img src="/static/img/ent/SmallThingThatMakesThings_flatland.png" alt="(image: Elwell and Small Thing in a jumble of dogs)" width="500" height="300.92">
|
||||
</a><br>
|
||||
Experimenting with Small Thing's summoning mechanic. In this version, the characters are just blocks with collision that can move around the flat, empty world with WASD.<br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/chimchooree_weekly_game_jam.gif">
|
||||
<img src="/static/img/ent/chimchooree_weekly_game_jam.gif" alt="(gif: Elwell rides a broken-physics dog across the valley)" width="500" height="215.77">
|
||||
</a><br>
|
||||
The dog spawning physics was (and still is) really broken, so dogs go flying pretty frequently. It was reliable enough in this version to be used as a moving platform. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/SmallThingThatMakesThings_rainingdogs.png">
|
||||
<img src="/static/img/ent/SmallThingThatMakesThings_rainingdogs.png" alt="(image: Elwell watches the rainfall of dogs from his window)" width="500" height="282">
|
||||
</a><br>
|
||||
Dogs rain down upon Elwell's animal shelter in the finished version. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/SmallThingThatMakesThings_rainingdogs.png">
|
||||
<img src="/static/img/ent/SmallThingThatMakesThings_dialog.png" alt="(image: Dialog)" width="500" height="265.12">
|
||||
</a><br>
|
||||
Dialog between Elwell and his boss. <br>
|
||||
</center>
|
||||
<br>
|
||||
<br>
|
||||
<h2>conclusion</h2>
|
||||
<br>
|
||||
If you're looking for a jam to jump into, WeeklyGameJam is a cute one to try. You aren't too rushed, you get to watch people play your game, you get useful criticism, and the community is pretty chill. The themes are always inspiring, too.<img src="/static/img/emo/heart.gif" alt="<3"> <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>credits</h2>
|
||||
<ul>
|
||||
<li>coding + art by chimchooree</li>
|
||||
<li>Open Pixel Project (OPP) (animations & tiles, edited to fit my characters & palette) @ <a href="http://www.openpixelproject.com/">http://www.openpixelproject.com/</a></li>
|
||||
<li>Music track "forest" by syncopika under CC-BY 3.0 @ <a href="https://opengameart.org/content/forest">https://opengameart.org/content/forest</a> & <a href="https://greenbearmusic.bandcamp.com/album/bgm-fun-vol-5">https://greenbearmusic.bandcamp.com/album/bgm-fun-vol-5</a></li>
|
||||
<li>Bad ending image from Wikimedia, credit to Jon Sullivan @ <a href="https://tinyurl.com/y6oswx8v">https://tinyurl.com/y6oswx8v</a> (URL contains spoilers)</li>
|
||||
<li>SimpleJPC-16 Palette by Adigun Polack @ <a href="https://lospec.com/palette-list/simplejpc-16">https://lospec.com/palette-list/simplejpc-16</a></li>
|
||||
<li>pixel joy font by chimchooree @ <a href="https://fontstruct.com/fontstructions/show/1596262/pixel-joy">https://fontstruct.com/fontstructions/show/1596262/pixel-joy</a></li>
|
||||
<li>Tools: <a href="https://godotengine.org/">Godot Engine 3.0.6</a>, <a href="https://graphicsgale.com/us/">GraphicsGale</a></li>
|
||||
<li>Weekly Game Jam 85, "Offspring" theme @ <a href="https://itch.io/jam/weekly-game-jam-85">https://itch.io/jam/weekly-game-jam-85</a></li>
|
||||
</ul>
|
||||
<br>
|
||||
@@ -0,0 +1,81 @@
|
||||
<!--201001,201112-->
|
||||
<h1>coroutines in godot engine </h1>
|
||||
september 17, 2020<br>
|
||||
#programming<br>
|
||||
<br>
|
||||
<b>Coroutines</b> are functions that, instead of running to completion, can yield until certain criteria are met. Godot Engine supports coroutines through <a href="https://docs.godotengine.org/en/stable/classes/class_@gdscript.html#class-gdscript-method-yield"><b>yield</b> ( Object object=null, String signal="")</a>, <a href="https://docs.godotengine.org/en/stable/classes/class_gdscriptfunctionstate.html#class-gdscriptfunctionstate-method-resume"><b>resume</b></a>, and the <a href="https://docs.godotengine.org/en/stable/classes/class_gdscriptfunctionstate.html"><b>GDScriptFunctionState</b></a> object.<br>
|
||||
<br>
|
||||
<h2>why use a coroutine? </h2>
|
||||
<br>
|
||||
Coroutines allow for scripted game scenarios that respond dynamically to the player and the changing game world. They let you bounce between functions, step-by-step, and respond to interruptions. This means functions can be automatically called at the completion of other functions, animations, player actions, in-game events, or timers. Add in interruptions and conditionals, and you have a tool for building a responsive game world. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>stoplight example </h2>
|
||||
<br>
|
||||
As a basic example of coroutines in Godot Engine, I made a stoplight. Follow along with my code on <a href="https://gitlab.com/chimchooree/stoplight">GitLab</a>. <br>
|
||||
<br>
|
||||
In my example, the light changes every few seconds, going from green, yellow, then finally red. The light changes immediately if the Walk Button is pressed. This project demonstrates methods that can wait, resume, and be affected through player action. <br>
|
||||
<br>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/stoplight_demonstration.gif">
|
||||
<img src="/static/img/ent/stoplight_demonstration.gif" alt="(gif: demonstration)" width="500" height="281.67">
|
||||
</a><br>
|
||||
</center>
|
||||
<br>
|
||||
<br>
|
||||
<h2>how does it work? </h2>
|
||||
<br>
|
||||
<h3>node hierarchy </h3>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/stoplight_nodehierarchy.png" alt="(image: node hierarchy - Root is a node named Main. It's children are TextureRect BG, AnimatedSprite Stoplight, Sprite WalkButton, and a Label. Stoplight's child is a Sprite. WalkButton's child is a TextureButton.)"><br>
|
||||
</center>
|
||||
<br>
|
||||
<br>
|
||||
I have a TextureRect background, an AnimatedSprite stoplight, a Sprite walk button with a TextureButton, and a label for displaying a timer. Since this is a simple example, most of the code is attached to the root. It's better to have code closer to where it's being used and to watch your separation of concerns in real projects, though. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>animation</h3>
|
||||
<br>
|
||||
<center>
|
||||
<img src="/static/img/ent/stoplight_animationframes.png" alt="(image: the AnimatedSprite Stoplight has 4 animations - default (which is no light), green, red, and yellow.)"><br>
|
||||
</center><br>
|
||||
The light is changed by setting its animation to one of these options. Each is one-frame - just the stoplight with the one or none of the lights colored in. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>the code </h3>
|
||||
<br>
|
||||
This project has two scripts: Main.gd, which is attached to the root node, and Label.gd, which is attached to the Label. <br>
|
||||
<br>
|
||||
<b>Main.gd</b> - code available on <a href="https://gitlab.com/chimchooree/stoplight/-/blob/master/Main.gd">GitLab</a><br>
|
||||
<center>
|
||||
<img src="/static/img/ent/stoplight_main.png" alt="(image: Main script.)"><br>
|
||||
</center>
|
||||
<br>
|
||||
<b>Label.gd</b> - code available on <a href="https://gitlab.com/chimchooree/stoplight/-/blob/master/Label.gd">GitLab</a><br>
|
||||
<center>
|
||||
<img src="/static/img/ent/stoplight_label.png" alt="(image: Label script.)"><br>
|
||||
</center>
|
||||
<br>
|
||||
<br>
|
||||
<h3>how the code works </h3>
|
||||
<br>
|
||||
At <code>_ready()</code>, <code>wait()</code> is assigned to the GDScriptFunctionState <code>result</code> and is called for the first color, green. <code>_ready()</code> yields until the given function <code>wait()</code> is completed. <br>
|
||||
<br>
|
||||
The wait method yields for the given amount of seconds then sets the stoplight to the given color. <br>
|
||||
<br>
|
||||
At <code>wait()</code>'s completion, <code>_ready()</code> calls <code>wait()</code> for yellow, then red. Each is called one at a time, waiting for the color to complete before moving on. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>interrupting the stoplight </h3>
|
||||
<br>
|
||||
The Wait Button interrupts the wait times between colors. Before <code>_ready()</code> yields, it connects the <code>'pressed'</code> signal on the Wait Button. <br>
|
||||
<br>
|
||||
If the Wait Button is clicked during <code>wait()</code>'s yield, the GDScriptFunctionState <code>result</code> resumes immediately, ignoring <code>wait()</code>'s yield timer. This time, <code>result</code> has a string arg <code>'interrupted on green'</code>, so it will print the result, change the stoplight's color, then print <code>'done: green'</code>. The <code>wait</code> method is complete, so <code>_ready()</code> resumes and calls <code>wait()</code> for the next color. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>applications </h2>
|
||||
<br>
|
||||
The outcomes in this example be swapped out for anything. I use coroutines in blessfrey's skills to manage the flow of phases from activation, different phases of effects, cooldown, and interactions with any counters. I also use it in the basic weapon attack so the character continuously swings at the rate of his attack speed until he cancels, uses a skill, or moves. It could also be used for something like cars that stop and honk when the player walks in front of them and drive off once the path is clear. <br>
|
||||
<br>
|
||||
Coroutines enable lots of practical ways to improve the flow and interactivity of your game, so just keep experimenting. <br>
|
||||
<br>
|
||||
@@ -0,0 +1,37 @@
|
||||
<!--200831,201031-->
|
||||
<h1>september 2020: bye php, hello bottle</h1>
|
||||
october 1, 2020<br>
|
||||
#bottle #css #git #html #regex #regularexpressions #website<br>
|
||||
<br>
|
||||
<h2>wednesday, september 2 </h2>
|
||||
<ul>
|
||||
<li>Study examples of my favorite blogs, popular blogs, and just any blogs I can find from modern gaming, retro gaming, tech, cooking, beauty, and any genre </li>
|
||||
<li>Determine essential features for my blog </li>
|
||||
<li>Plan design of blog </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>friday, september 18 </h2>
|
||||
<ul>
|
||||
<li>decided to switch from PHP to Bottle </li>
|
||||
<li>Hello World in Bottle </li>
|
||||
<li>created templates for main pages </li>
|
||||
<li>Used Bottle to fill values in a template using variables </li>
|
||||
<li>Used Bottle to avoid repeating HTML code in navigation pane, header, and footer </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>friday, september 25</h2>
|
||||
<ul>
|
||||
<li>Diary snippets are formatted from data taken from their articles. The article preview is cut to the character limit.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>saturday, september 26</h2>
|
||||
<ul>
|
||||
<li>Updated the blessfrey.me script to serve static content like CSS stylesheets + images. Now the pages are actually styled.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>wednesday, september 30</h2>
|
||||
<ul>
|
||||
<li>fix bugs for blessfrey.me's static pages - no footer in the middle of the body, no unclosed <ul> tags from diary entry snippets breaking the CSS.</li>
|
||||
<li><a href="https://validator.w3.org/nu/">w3's Nu Html Checker</a> (lol @ the nu name) is really handy for automatically checking whether all my HTML tags are closed and CSS is valid, especially the parts generated through Bottle + SimpleTemplate. </li>
|
||||
</ul>
|
||||
<br>
|
||||
@@ -0,0 +1,68 @@
|
||||
<!--201224,200806-->
|
||||
<h1>making of blessfrey.me</h1>
|
||||
october 15, 2020<br>
|
||||
#bottle #css #html #simpletemplate #webdesign #webdev<br>
|
||||
<br>
|
||||
blessfrey.me is a personal website I use to showcase projects + blog my process. I originally wrote it in PHP, but now it's written in <a href="https://bottlepy.org/docs/dev/">Bottle</a>, a Python web framework. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>why not use a premade blogging platform like WordPress? </h2><br>
|
||||
blessfrey.me's needs are fairly simple - just some static pages and a blog page. Generalized blogging platforms are overkill. I don't need support for multiple users, localization, e-commerce, and so on. Unused features only bog down the website, potentially contributing to poor performance + security vulnerabilities. <br>
|
||||
<br>
|
||||
Also, it's just fun to write my own. I'm learning a lot as I take my website from initial sketches, to Hello World, to various prototypes, to something polished enough to show my friends. Also, since it can be considered a programming portfolio, it just makes sense that it itself should be something I programmed. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>why Bottle? </h2><br>
|
||||
I originally wrote blessfrey.me in PHP. I switched to Bottle after looking for a templating engine. Bottle comes with SimpleTemplate and can do everything PHP can do but faster + with less verbosity. Plus, you get to write in Python, which is always fun. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>how does blessfrey.me work? </h2><br>
|
||||
<h3>SimpleTemplate </h3><br>
|
||||
Instead of a static collection of HTML pages on my server, blessfrey.me's pages are constructed from SimpleTemplate templates and filled in using a Bottle script upon request. <br>
|
||||
<br>
|
||||
Every page uses the frame template below, so the basic skeleton is consistent and code for repetitive elements only has to exist in one place. Each page's content is made unique by bringing in a different template as <code>{{!base}}</code>. (Double curly brackets refer to variables, and exclamation marks disable escaping.) <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_alltemplate.png" alt="(image: basic template code.)"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/mQuGX3Xa">Pastebin</a>.) <br>
|
||||
<br>
|
||||
The header template below (brought in at <code>% include('header.tpl')</code>) has some variables, too, which are supplied by the Bottle script. If Bottle doesn't provide a title, it defaults to 'blessfrey.me.' Variables can also be used in paths and URLs. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_headertemplate.png" alt="(image: header template code.)" width="500" height="54"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/JcEU4xTm">Pastebin</a>.) <br>
|
||||
<br>
|
||||
You can insert Python code into the templates for dynamic pages. Below is an excerpt of the template for the diary page. This code fills the page with diary entry previews using a for loop. Not shown is the first line <code>% rebase('frame.tpl')</code>, which tells SimpleTemplate to insert this content at the <code>{{!base}}</code> variable in the frame template. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_snippettemplate.png" alt="(image: diary snippet code from diary template.)" width="500" height="401"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/ckEj9Bf2">Pastebin</a>.) <br>
|
||||
<br>
|
||||
The Bottle script sends the max number of snippets per page (the <code>limit</code>) and a list of lists containing all the diary snippets. It receives the page number from the URL. For the snippets that will appear on the given page, it converts the list data into HTML code to be displayed in the browser. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>Bottle </h3><br>
|
||||
Bottle takes URLs and generates the corresponding web page upon request. Each URL is tied to a method, which returns a template and a dictionary of data to be used in the template. Since Bottle is a Python framework, you have access to all the Python libraries you need. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_diaryscript.png" alt="(image: Bottle script excerpt for diary routes.)" width="500" height="288"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/Bf96F9Ha">Pastebin</a>.) <br>
|
||||
<br>
|
||||
This is what the methods for specific routes look like. So every time you go to blessfrey.me/diary, one of the above methods is called, depending on whether also you supplied an integer. To generate the page content, it calls a lot of Python functions to find my diary entries, convert them into previews for the snippets section + headlines for the sidebar, and get the current time for the footer. <br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<h3>CSS </h3><br>
|
||||
The website is styled using CSS, heavily relying on the CSS Grid and a bit of Flexbox. CSS Grids can be used inside CSS Grids, so my pages are generally blocked out, with smaller internal grids managing specific content. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_cssgrid.png" alt="(image: CSS Grid traced over screenshot of projects page.)" width="500" height="491"><br>
|
||||
</center>
|
||||
<br>
|
||||
The projects page is an example of nested grids. Almost every page uses the yellow general layout. The content unique to the projects page is mapped out in green, with a section for the header, featured projects, and other projects. The other projects use a 2-column grid in blue to evenly space out all the little thumbnails. <br>
|
||||
<br>
|
||||
The CSS code for project's general grid + the nested unfeatured grid are shown below.<br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/blessfrey_website_projectcss.png" alt="(image: projects css code.)"><br>
|
||||
</center>
|
||||
(The code can be found on <a href="https://pastebin.com/pVgkmT5k">Pastebin</a>, but you can always see a web page's CSS by right-clicking and viewing the source.) <br>
|
||||
<br>
|
||||
@@ -0,0 +1,65 @@
|
||||
<!--201001,201112-->
|
||||
<h1>blessfrey in japanese </h1>
|
||||
october 29, 2020<br>
|
||||
#internationalization #localization<br>
|
||||
<br>
|
||||
Instead of hard-coding text, keep it in a spreadsheet instead. It's easier to organize, edit, and it also makes possible future translations a much smoother process. <br>
|
||||
<br>
|
||||
I followed along with GoTut's <a href="https://www.gotut.net/localisation-godot/">"Localisation in Godot"</a> guide, but the process is pretty simple. It's a great guide, so honestly just follow theirs instead. I'll echo the process here in case it's taken down, though. <br>
|
||||
<br>
|
||||
<h2>step 1 - make your spreadsheet </h2>
|
||||
<br>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/internationalization_spreadsheet.png">
|
||||
<img src="/static/img/ent/internationalization_spreadsheet.png" alt="(image: spreadsheet with three columns - id, en, and ja. id has ids, en has English text, and ja has Japanese text.)" width="500" height="232.26">
|
||||
</a><br>
|
||||
</center>
|
||||
<br>
|
||||
Instead of writing your text directly into Godot, refer to the text by ids instead. These ids will be kept in the first column of your spreadsheet. Don't use spaces. <br>
|
||||
<br>
|
||||
The rest of the columns will hold the corresponding text in different languages. Name these columns after the language's locale code. English's is en, and Japanese's is ja. You can find the more codes in the <a href="https://docs.godotengine.org/en/latest/tutorials/i18n/locales.html#doc-locales">Godot Docs</a>. <br>
|
||||
It works just fine if you're only using one language. If you have multiple languages but don't provide a translation for a specific id, whenever your game is set to that language, references to that script will show blank text. <br>
|
||||
<br>
|
||||
Save your spreadsheet as a .CSV file. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>step 2 - import your spreadsheet </h2>
|
||||
<br>
|
||||
Make sure your .CSV spreadsheet is in your game folder, so Godot can automatically import files. Wherever you import your text, make sure you check 'Comma' for the delimiter or separator options. You'll get a few .TRANSLATION files. <br>
|
||||
<br>
|
||||
<center>
|
||||
<img src="/static/img/ent/internationalization_translations.png" alt="(image: Project Settings>Localization>Translations shows a TRANSLATION file for each language.)"><br>
|
||||
</center>
|
||||
<br>
|
||||
From Godot's top menu, go to Project>Project Settings...>Localization>Translations and add all your .TRANSLATION files. They'll be right next to wherever you saved your .CSV. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>step 3 - refer to your ids in your scripts </h2>
|
||||
<br>
|
||||
<center>
|
||||
<img src="/static/img/ent/internationalization_script.png" alt="(image: example of an id used in a script)"><br>
|
||||
</center>
|
||||
<br>
|
||||
It's really simple stuff. Anywhere you would have written a string, like "quit", you instead use its id wrapped in tr(). So instead of <code>label.set_text("quit")</code>, you'd write <code>label.set_text(tr("quit_game"))</code>. In this example, the id is "quit_game" and its corresponding text in English is "quit."
|
||||
<br>
|
||||
<br>
|
||||
<h2>step 4 - set the game's language </h2>
|
||||
<br>
|
||||
<center>
|
||||
<img src="/static/img/ent/internationalization_setlocale.png" alt="(image: example of setting the locale in a script)"><br>
|
||||
</center>
|
||||
<br>
|
||||
Set the locale in your script, somewhere like _ready() or on a 'change language' button. Here's the line for setting the locale: <code><a href="https://docs.godotengine.org/en/stable/classes/class_translationserver.html">TranslationServer</a>.<a href="https://docs.godotengine.org/en/stable/classes/class_translationserver.html#class-translationserver-method-set-locale">set_locale</a>(<a href="https://docs.godotengine.org/en/stable/tutorials/i18n/locales.html">"ja"</a>)</code>
|
||||
<br>
|
||||
<br>
|
||||
<h2>step 5 - continue adding to your spreadsheet </h2>
|
||||
<br>
|
||||
Now that everything's in place, you can keep adding new ids + translations, and Godot will automatically use your changes in-game. <br>
|
||||
<br>
|
||||
<h2>that's the basics </h2>
|
||||
<center>
|
||||
<img src="/static/img/ent/internationalization_japanese.png" alt="(image: blessfrey screenshot in Japanese)" width="500" height="370.46"><br>
|
||||
</center>
|
||||
<br>
|
||||
It all comes together for an old screenshot of blessfrey's main menu in my broken Japanese. やべーな!<br>
|
||||
<br>
|
||||
@@ -0,0 +1,85 @@
|
||||
<!--200930,201130-->
|
||||
<h1>october 2020: a blog that works</h1>
|
||||
november 1, 2020<br>
|
||||
#css #html #python #webdev #website<br>
|
||||
<br>
|
||||
<h2>week 1 </h2><br>
|
||||
#bottle #python #regularexpression #website <br>
|
||||
<br>
|
||||
<h3>thursday, october 1 </h3><br>
|
||||
<ul>
|
||||
<li>blessfrey.me's diary properly displays snippets for all articles: a header taken from the title, a truncated view of the article, the date + a place for social media share links, and a link to the article.</li>
|
||||
<li>Cleaning the snippets enough to look okay and not break the page was a challenge. I used regular expressions to remove HTML link + header tags, <a href="https:/git sta/stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags">which is apparently a lost cause Stack Overflow users stand against daily, hourly even</a>. It's not so bad if it's not user content and the content is pretty predictable, right?
|
||||
<li><a href="https://pythex.org/">Pythex</a> is useful for checking whether your regular expression will catch your target strings</li>
|
||||
<li>First command line git merge. I usually do it on the website. It's really simple - switch to the branch you're merging the second branch into, type '<code>git merge second-branch</code>' (<code>second-branch</code> = name of the second branch obviously), and fix any conflicts.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>friday, october 2 </h3><br>
|
||||
<ul>
|
||||
<li>All articles are kept in the same folder. There's really no reason to split them up. If I want to differentiate types of articles, I can use tags or something.</li>
|
||||
<li>Set up blog navigation</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>saturday, october 3 </h3><br>
|
||||
<ul>
|
||||
<li>Blog removes HTML tags through regex patterns.</li>
|
||||
<li>Fixed footer strangely appearing in the middle of the body on pages.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>week 2 </h2><br>
|
||||
#bottle #python #website<br>
|
||||
<br>
|
||||
<h3>sunday, october 4 </h3><br>
|
||||
<ul>
|
||||
<li>Started using absolute paths when needed. Diary snippet links to articles work now. Articles use CSS now.</li>
|
||||
<li>Improved navigation for diary. The number link cluster around the current page stays static in length - very early pages compensate by adding more links to the right</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>monday, october 5 </h3><br>
|
||||
<ul>
|
||||
<li>made 'latest' box in sidebar of diary + articles with working links to the 5 latest articles</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>tuesday, october 6 </h3><br>
|
||||
<ul>
|
||||
<li>researched + added a robots.txt, sitemap, nofollow links</li>
|
||||
<li>added social media share links to all snippets that allow you to share the title and a link to Twitter, Facebook, or email. Not sure if Facebook or email work because I don't feel like getting Facebook or connecting email to my browser.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>wednesday, october 7 </h3><br>
|
||||
<ul>
|
||||
<li>Added a simple Contact page.</li>
|
||||
<li>Moved diary entries under a diary directory for that /diary/whatever-entry URL, so people like me can backspace on that URL to get to the higher level page.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>saturday, october 10 </h3><br>
|
||||
<ul>
|
||||
<li>For testing, all colors were taken from the latest colors on random color websites, and all divs are stark. Instead, I have added margins, padding, sans-serif font choices, and an okay color palette. I'll pick something more true-to-brand later, but at least it isn't embarrassing now.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>tuesday, october 13</h3><br>
|
||||
<ul>
|
||||
<li>updated site skillbar nav background art.</li>
|
||||
<li>continue working on CSS files.</li>
|
||||
<li>made Twitter timeline's background transparent on index page</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>tuesday, october 16</h3><br>
|
||||
<ul>
|
||||
<li>edit game and presskit pages and some diary entries</li>
|
||||
<li>for site navigation, CSS buttons are now image links with superimposed text. I think keeping text as text instead of part of images helps with accessibility. I use a lot of foreign websites, so personally, I like websites where I can copy + paste.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>saturday, october 17 </h3><br>
|
||||
<ul>
|
||||
<li>worked at the cafe today. Since my husband's battery is dead, he finally read some May I Ask For One Final Thing? I love that manga!!</li>
|
||||
<li>Refactored the main Bottle script. Before, I wrote it hard and fast, so it was reading all the diary entries multiple times per refresh. It's not only cleaner now, it also only reads the files twice.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>monday, october 19 </h3><br>
|
||||
<ul>
|
||||
<li>did some sketches for the story slideshow for the game page. they are an iteration of some cg art for the real game, too. I really don't draw enough...</li>
|
||||
<li>added the 'recommended articles' section to the bottom of diary entries.</li>
|
||||
<li>added 'extra' articles, for articles that are unlisted from the main directory. I'm using it to include more GDC talk notes per talk while keeping the GDC talk article general and summarized.</li>
|
||||
</ul>
|
||||
<br>
|
||||
@@ -0,0 +1,39 @@
|
||||
<!--201210,201029-->
|
||||
<h1>tidying up my skill phases </h1>
|
||||
november 12, 2020<br>
|
||||
#programming #skills<br>
|
||||
<br>
|
||||
In Godot Engine, you can call methods from a parent class by prefixing it with a period (.). So to access the <code>move()</code> method from a parent, call <code>.move()</code>. This is called a <b>super method</b>. <br>
|
||||
<br>
|
||||
Being called super doesn't mean there isn't a better way, though. I used to use super methods to build customs skills in blessfrey, but subfunctions is tidier. <br>
|
||||
<br>
|
||||
(Just so you know, blessfrey's skills have a number of phases of effects that must happen in order: skill press > activation > initial phase > main phase > end phase > cooldown.) <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>the old way </h2><br>
|
||||
Initially, I used super methods to give each phase custom effects and call the next phase. This was messy. If I ever redesigned the flow of the skill phases, I'd have to edit every single skill script. It also causes a lot of repetitive code in the individual skill scripts while the base script is tiny. The one-time script being the small one is no fair. <br>
|
||||
<br><center>
|
||||
<img src="/static/img/ent/supermethod_old.png" alt="(image: GDscript code using old method)"><br>
|
||||
</center>
|
||||
(You can see the old method's code on <a href="https://pastebin.com/DDu1Q7Q6">Pastebin</a>.)
|
||||
<br>
|
||||
<br>
|
||||
<h2>the new way </h2><br>
|
||||
<br>
|
||||
Instead, I can bring all the repetitive steps into the base class, sandwiching in a subfunction where the custom effects would take place. Now I only need to add what makes my skill unique inside the subfunction. <br>
|
||||
<br>
|
||||
I named the subfunction after its main function and added an underscore to the front. So in the base script, I fit <code>_functionality(user, action_target)</code> into <code>functionality(user, action_target)</code>. Then the individual skill scripts only need the subfunction, none of the other repetitive code from before. The subfunction is empty in the base class and filled with unique code in the child classes. Since skills inherit, the unique <code>_functionality</code> subfunction will be called automatically from the base script's <code>functionality</code>. <br>
|
||||
<br>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/supermethod_old.png">
|
||||
<img src="/static/img/ent/supermethod_new.png" alt="(image: GDscript code using new method)" width="500" height="355.36">
|
||||
</a>
|
||||
</center>
|
||||
(You can see the new method's code on <a href="https://pastebin.com/teeYn9jP">Pastebin</a>.)
|
||||
<br>
|
||||
<br>
|
||||
<h2>problem solved! </h2><br>
|
||||
<br>
|
||||
The base script holds all the lengthy code in one place, while I only need to write the unique effects in all the hundreds of skill scripts. That saves me time making, refactoring, and maintaining skills. Yay. <br>
|
||||
<br>
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
<!--200806,200903-->
|
||||
<h1>pretendOS - a game inspired by windows XP </h1>
|
||||
november 26, 2020<br>
|
||||
#sideproject<br>
|
||||
<br>
|
||||
Getting started with blessfrey's AI was overwhelming, so I took a break and worked on a new game. I didn't get very far. It's not even on my hard drive anymore. It's cute, though. <br>
|
||||
<br>
|
||||
Unlike blessfrey, where coding takes up 90% of the effort, pretendOS is mostly graphical assets + sounds with barely any functionality. It's a UI game, after all. Since it's a game requiring a completely opposite skill-set, I was able to make progress on <i>something</i> while reading up on game AI. I also got to work on new things like particle effects. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>Inspiration </h2>
|
||||
<br>
|
||||
<h3>Windows XP</h3>
|
||||
The game takes strong aesthetic inspiration from Windows XP. It almost fits the 90s vaporwave trend, but I'm too young to really remember Windows 95. I obviously have nostalgia for it as my first operating system (as far as I remember - I was a toddler then), but I mostly knew it as the Lego Island machine propped up in the dining room. As my family upgraded computers over the years, Windows never really impacted me as anything more than something that can run some videogames and whatever popular web browser of the time. That is, until Windows XP. <br>
|
||||
<br>
|
||||
XP really hooked me. It was the first operating system I spent as much time exploring as I spent using software. XP's edition of Paint was my favorite yet, I loved fiddling with the themes and accessibility options, especially Microsoft Sam, Rover, and Clippy. I started watching YouTube videos on how to use the Command Prompt. XP was just fun to use. I've found better desktop environments and operating systems since, but I never got over that aesthetic: smooth, blended graphics with hard pixel edges in 32-bit color with an alpha channel, right at the cusp between pixel art and vector graphics. Vaporwave for me is Luna olive green, or the "Fisher-Price interface" as Ars Technica users called it. <br>
|
||||
<br>
|
||||
<img src="/static/img/ent/wikipedia_luna.png" alt="(image: Wikipedia excerpt: Critics who did not like the theme characterized it as a 'Fisher-Price interface'.)"><br>
|
||||
(screenshot from <a href="https://en.wikipedia.org/wiki/Windows_XP_visual_styles">Wikipedia</a> - referencing articles from <a href="https://web.archive.org/web/20091008081626/http://www.pcworld.com/article/117427/full_disclosure_your_take_on_windows_worst_irritations.html">PCWorld</a> and <a href="https://arstechnica.com/information-technology/2014/04/memory-lane-before-everyone-loved-windows-xp-they-hated-it/">Ars Technica</a>)<br>
|
||||
<br>
|
||||
<br>
|
||||
There were a few other experiences behind the game, too. <br>
|
||||
<br>
|
||||
<h3>Mother's Day E-Card</h3>
|
||||
I finally got my husband to try Godot Engine, and he used it to make a digital Mother's Day card for his mom. (Cute.) Opening the card displayed a 3D heart (a "cardioid") that bounced to the beat of a song while 2D cardioid particles rained down. It was all programmatically generated using geometry instead of 3D + 2D assets, so the application was very small. He made the graphics side of things look really interesting, and I wanted to play around with particles, too. Just...not as fancy;; <br>
|
||||
<br>
|
||||
<h3>Secret Little Haven</h3>
|
||||
I also just played a cute pretend OS game on itch called <a href="https://ristar.itch.io/secret-little-haven">Secret Little Haven</a> It's quite short, very story-driven, and kind of buggy, telling Alex's struggle with gender identity through IMs. Honestly, pretend OS games and coming-of-age chat sims are nothing special, but Secret Little Haven's believability makes it really stand out. Instead of defending against cheesy + inaccurate deep web hacking attempts, you use an in-game terminal to get around child locks set by Alex's dad. Those terminal puzzles are the most realistic and relatable hacking I've seen in these games. SLH isn't super sophisticated or in-depth, but it shows how cute and believable a pretend OS game can be. I'd love to make a little environment like that, that's as fun to fiddle around with as XP. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>pretendOS </h2>
|
||||
<br>
|
||||
So what's pretendOS? Like I said, not much besides pictures. I only worked on it for a few days. <br>
|
||||
<br>
|
||||
What really bogged it down was Cat Chat. I wanted an AI chat personality that talked like a cat. I could do that, but that kind of thing takes a lot of time, when this project was really just procrastinating working on AI. <br>
|
||||
<br>
|
||||
The rest is cute, though. The icon winks when you click it, the cursor's kinda 2000s-free-animated-cursors, and it's got those Fisher-Price colors and bubbly sounds everywhere that I liked as a kid. <br>
|
||||
<br>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/pretendOS_catchat.jpeg">
|
||||
<img src="/static/img/ent/pretendOS_catchat.jpeg" alt="(image: pretend desktop with a Cat Chat application)" width="500" height="281.25">
|
||||
</a><br>
|
||||
</center>
|
||||
<br>
|
||||
<br>
|
||||
<h2>the future</h2>
|
||||
<br>
|
||||
It's cute. I'd like it to be finished in some way. I went ahead and cloned my old repo. Maybe I'll fill it out with more applications during a game jam or something or at least finally get that cool Secret Little Haven curved screen shader working. <br>
|
||||
<br>
|
||||
@@ -0,0 +1,33 @@
|
||||
<!--2001031,201231-->
|
||||
<h1>november 2020: dear diary </h1>
|
||||
december 1, 2020<br>
|
||||
#blogging #bottle #skills #webdev<br>
|
||||
<br>
|
||||
<h2>on topic </h2>
|
||||
Between the <b>8th and 15th</b>, I wrote a Python script for generating Godot skill scenes from JSON files. As opposed to the questionnaire script I used before, this one can generate multiple skills at a click of a button. It isn't a perfect solution either, though, since my JSON script and the skills I have in the game aren't synced. It'd be better for the skills to be something like JSON files that are read by the game at run-time, unless that would be too costly. That way, I only edit skills in one location and don't need to worry about different versions. <br>
|
||||
<br>
|
||||
Skill inheritance is more sophisticated now and allows the script to generate a lot of the functionality of most types of skills now. <br>
|
||||
<br>
|
||||
I spend a lot of time on how to make skills because this is a core mechanic of my game, and I plan to have a hundred or more of them. I need an efficient way to update and create the game's skill pool. <br>
|
||||
<br>
|
||||
On <b>November 24, 2020</b>, I finally added a diary navigation bar <i>under</i> the diary snippets, so you don't have to scroll back up to go to the next page anymore. I was really putting that off for how essential that is. <br>
|
||||
<br>
|
||||
On <b>November 25, 2020</b>, I began retroactively adding diary entries based on old tweets. I added one for my pixel font, one for my Weekly Game Jam submission, one for my inventory system diagram, and one for blessfrey's graphic updates. I finally got Bottle to support self-hosted images instead of using Imgur for everything (lol), and fixed lots of bugs related to actually having embedded images in articles. <br>
|
||||
<br>
|
||||
As cool as it is to work on gamedev, this website is also a priority for me as a sort of portfolio. So it would be nice to have lots of articles about my process and different projects. It would be super nice to have pretty graphics everywhere, but as usual, the placeholders are probably going to stay around for a while since they're already half-decent-looking. <br>
|
||||
<br>
|
||||
<b>November 26, 2020</b> is Thanksgiving during a pandemic. Wrote up an article for my pretendOS game and my coroutines example. Also, the diary shows 8 snippets per page instead of 4. I finally have enough articles to test an optimal amount shown per page. <br>
|
||||
<br>
|
||||
<b>November 27, 2020</b> is Black Friday. I ordered navy eye shadow and fancy sunscreen.<img src="/static/img/emo/star.gif" alt="<3"> Added an article for skill phases + super methods and slimeAI's state transition diagram.<br>
|
||||
<br>
|
||||
<b>November 28, 2020</b> is my birthday. <img src="/static/img/emo/heart.gif" alt="<3"> I replaced the game page with a projects page with pretty CSS grid formatting and little thumbnail links to different projects, either to diary entries or git repos. <br>
|
||||
<br>
|
||||
<b>November 29, 2020</b>, I make sure all the thumbnails are consistent sizes for the projects page make the images and descriptions into links. I also add a thumbnail for the website itself because why not? It doesn't have anything suitable to link to, so I wrote up an article explaining blessfrey.me's development. I touched up the presskit page and added a PDF download to the page. Downloads are way easier to add than I thought they'd be - seriously took me less than a minute. The presskit page is still ugly, but at least it has better images on it now. I'm getting close to actually letting people see my website (even though it's been publicly accessible pretty much since August but whatever), so I went through my articles again and improved their readability and removed most stuff that isn't really relevant. <br>
|
||||
<br>
|
||||
<b>November 30, 2020</b>, I reordered the diary entries again. The daily diaries really should be released after the month is over instead of on the last day of the month. Duh. Also, the 3-week-nonstop-earworm of Seungri's <a href="https://www.youtube.com/watch?v=FHhWO-N4bl4">"Let's Talk About Love"</a> finally went away. It was becoming pathological. <br>
|
||||
<br>
|
||||
<h2>off-topic </h2><br>
|
||||
I joined a Japanese manga translation group on a whim and now provide Japanese-to-English transcripts for a new chapter of a manga about every week and a half. It wasn't obvious, but understanding Japanese is a different skill than rewriting Japanese into English while keeping the jokes, character voice, and cliffhangers/foreshadowing intact;; <br>
|
||||
<br>
|
||||
Also, Election Day-turned-Weeks took up a few extra days of nonstop news watching than it usually does, even though I tuned out long before Georgia was called. <br>
|
||||
<br>
|
||||
@@ -0,0 +1,43 @@
|
||||
<!--200810-->
|
||||
<h1>blessfrey graphic updates + mockups </h1>
|
||||
december 24, 2020<br>
|
||||
#mockups #screenshots<br>
|
||||
<br>
|
||||
I iterate over the graphics periodically, so I can practice without worrying about polish. Here's some screenshots of different styles I've tried. (Though April 23, 2019's is actually a mockup, that style did run in-engine for a few weeks.)<br>
|
||||
<br>
|
||||
<center>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_August152018.jpeg">
|
||||
<img src="/static/img/ent/screenshot_August152018.jpeg" alt="(image: Cassia and Bad Cat on the pink carpet tilemap)" width="500" height="313">
|
||||
</a><br>
|
||||
August 15, 2018 - Early experimenting with Godot Engine. Collision was just added for sprites and walls. The buttons to the right are for switching between characters (who each have different skillbars). <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_January132019.jpeg">
|
||||
<img src="/static/img/ent/screenshot_January132019.jpeg" alt="(image: Angel in a periwinkle room full of Bad Cats)" width="500" height="330.72">
|
||||
</a><br>
|
||||
January 13, 2019 - Videogame perspective is so different from perspective in illustration. Scale of characters vs environment is another quirk of games I had 0 experience with. I was vaguely going for an old Western RPG style with tall, somewhat realistic sprites with non-distinct faces. Something like Divine Divinity. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_April232019.png">
|
||||
<img src="/static/img/ent/screenshot_April232019.png" alt="(image: Angel blasting a neighborhood coyote with fire)" width="500" height="375">
|
||||
</a><br>
|
||||
April 23, 2019 - This is a mockup, but the game did look like this for a while. The fireball projectile didn't come until later, though. Here, I was trying to get a little more of a top-down view but not really. Instead of cats, Angel's fighting with a coyote. The government stopped removing coyotes from my old neighborhood, so they killed all the neighborhood cats except one and I saw him running away from a big coyote during a storm, so maybe he's gone now, too. It's just not right. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_May252019.png">
|
||||
<img src="/static/img/ent/screenshot_May252019.png" alt="(image: Angel and Chloe in front of a slanted house)" width="500" height="375.18">
|
||||
</a><br>
|
||||
May 25, 2019 - The slanted edition was so annoying. It's not isometric, it's just at an obscure angle because I drew these assets more for fun than to actually be practical. I do reuse the tree + bushes a lot, though. I also tried a more chibi sprite because they are soo common, might as well try it out. <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_June292019.png">
|
||||
<img src="/static/img/ent/screenshot_June292019.png" alt="(image: Lots of Angels and other characters at a shopping center)" width="500" height="278.66">
|
||||
</a><br>
|
||||
June 29, 2019 - Trying a shopping center level now. It's reeally spaced apart. It's inspired by a real shopping center;; <br>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_July252020.png">
|
||||
<img src="/static/img/ent/screenshot_July252020.png" alt="(image: Angel and some slimes in a cavern)" width="500" height="281.04">
|
||||
</a><br>
|
||||
July 25, 2020 - There's some missing in this gap, so I'll add in more pics if I find any. This is the first version of a cavern level for the blessfrey demo. It's inspired by local caves. <br>
|
||||
<br><br>
|
||||
</center>
|
||||
<h2>you're up to date.</h2>
|
||||
<br>
|
||||
Hope you enjoyed seeing the different art I've used for blessfrey over the years. Even if I never really polish anything, it's nice to iterate to get a sense of game art and blessfrey's personal style. Hopefully it ends up looking okay okay when I do start polishing. But until then, in the words of YandereDev, "All art is placeholder."<br>
|
||||
<br>
|
||||
@@ -0,0 +1,53 @@
|
||||
<!--201201,210201-->
|
||||
<h1>december 2020: holiday season☆</h1>
|
||||
january 1, 2021<br>
|
||||
<br>
|
||||
<br>
|
||||
I didn't keep a diary very well this month;; This is mostly pieced together from my git history. I did play Legacy of Kain: Soul Reaver and Planescape: Torment a lot, though. <br>
|
||||
<br>
|
||||
<h2>week 1, december 1-5 </h2><br>
|
||||
#python <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>worked on Skillmaker, a Python script that can use JSON data to generate skill scenes + scripts for Godot Engine </li>
|
||||
<li>Skillmaker can generate descriptions that fit a standard format. It's not used in-game, though, it's just plopped in a comment on the skill script. In the future, I want Skillmaker to generate a CSV file, so Godot can read in the generated description instead of the text being hard-coded inside the engine. That way, editing + translating will be easier. </li>
|
||||
<li>those descriptions use variables. In the future, those variables will allow skill values to grow with the character's stats. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>week 2, december 6-12 </h2><br>
|
||||
#python<br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>updated Skillmaker's readme, since expected input has changed a lot </li>
|
||||
<li>after 8 years, Cyberpunk 2077 finally came out. I can't do $59.99 + 100GB, so the closest I can do is watch Batman Beyond instead. </li>
|
||||
<li>lots of FlightRising. my flight competed against Light for Dominance. They won, but they had to raffle off a <a href="https://www1.flightrising.com/game-database/item/910">priceless Kickstarter item</a> during the final hours to flip us off the top. I can't imagine how costly that win was for Light, and even then, it wasn't definitive...I wish I tried harder. </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>week 3, december 13-19 </h2><br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>probably nothing really very productive</li>
|
||||
<li>finished reading <a href="https://www.gutenberg.org/files/19942/19942-h/19942-h.htm">Voltaire's Candide</a>. Not sure if it was the best year for a literary attack against the optimistic view that everything turns out for the best, but it's a fun + easy read nonetheless. </li>
|
||||
<li>started reading <a href="http://www.gutenberg.org/files/32825/32825-h/32825-h.htm">William Bradshaw's The Goddess of Atvatabar</a>, a Utopian hollow Earth novel. If inner earth is interesting, I attached a list to a <a href="https://www1.flightrising.com/dragon/62304375">dragon</a>...credits go to all the article writers I didn't credit </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>week 4, december 20-26 </h2><br>
|
||||
#python #skills #statuseffects<br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>Merry Christmas!! </li>
|
||||
<li>(keywords are the smallest component of a skill - reusable segments of code for producing a skill effect) </li>
|
||||
<li>added summon + bleeding keywords </li>
|
||||
<li>added Skillmaker support for generating skills that use those keywords </li>
|
||||
<li>maintain this website a little </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>week 5, december 27-31 </h2><br>
|
||||
#dia #events #story<br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>I finally found a diagram editor I like - <a href="http://dia-installer.de/index.html.en">Dia</a> :) It's in Mint's package manager, too. </li>
|
||||
<li>it's nice for planning branching the flow of events and branching dialog. I wrote a few events with it and made an outline for the game. </li>
|
||||
<li>I keep the events in my GDD repository now. I used to keep these all over the place, in paper + text documents. (Why didn't I do this earlier?) </li>
|
||||
</ul>
|
||||
<br>
|
||||
@@ -0,0 +1,40 @@
|
||||
<!--200917,201112-->
|
||||
<h1>inventory as a system diagram </h1>
|
||||
october 1, 2020<br>
|
||||
#design #systemdiagram #gamemechanics<br>
|
||||
<br>
|
||||
<b>System diagrams</b> illustrate how components interact within a system. It saves so much headache to step back and plan with a system diagram before jumping into code. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>stop + plan before coding </h2><br>
|
||||
I want to move blessfrey's inventory into an app on the player character's smartphone. Before, it was displayed in a random pop-up window. It was poorly planned, so the programmatic inventory and the UI were too tightly coupled to easily pop into the phone screen. Instead of wrestling, it's easier to start over and actually plan before I code this time. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>list out your nouns </h2><br>
|
||||
A simple way to start thinking about a system is to list out its nouns + verbs. Jot down the entities that interact with your system. <br>
|
||||
<br>
|
||||
<center><img src="/static/img/ent/systemdiagram_inventory.jpeg" alt="(image: system diagram for inventory)" width="500" height="250"></center> <br>
|
||||
<br>
|
||||
For blessfrey's inventory, that's the inventory (programmatic), the player character, the inventory app (UI), and base items. The inventory app is related to the smartphone and inventory items. Items are related to floor items, which are related to rooms. <br>
|
||||
<br>
|
||||
(blessfrey has three different kinds of items. <br>
|
||||
<br><ul>
|
||||
<li><b>Base Item</b>: holds all the data regardless of how the item is currently expressed </li>
|
||||
<li><b>Floor Item</b>: sits on the ground and gets picked up by characters. </li>
|
||||
<li><b>Inventory Item</b>: displayed in inventories, store windows, containers, etc </li>
|
||||
</ul><br>
|
||||
Floor + Inventory Items hold a base item inside them that gets popped out and traded around as the item gets expressed in different forms.) </br>
|
||||
<br>
|
||||
<h2>connect your nouns with verbs </h2><br>
|
||||
I wrote the entities in pink and moved them around until the placement was decently readable. Then I connected the concepts with arrows. These arrows represent the verbs, which I explicitly labeled in yellow. <br>
|
||||
<br>
|
||||
The flow of these arrows can be very important. If you are modeling AI, for instance, no matter what path the program takes, there shouldn't be dead-ends. Seeing mistakes like that is easier with a diagram than lines of code. Otherwise, the flow is always generally useful for figuring out which methods are needed for each class and how they connect. <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>write the code </h2><br>
|
||||
At this point, coding is a bit easier now that it's in some ways a transcription of the diagram. The entities are data (classes or objects), and the arrows are logic (methods). <br>
|
||||
<br>
|
||||
<br>
|
||||
<h2>conclusion </h2><br>
|
||||
Your diagram doesn't have to be fancy or formal to get the point across to yourself, and it just takes a minute to save all the headache later. Don't skip this step or you'll have to rewrite the inventory system just to display it in a different window. <br>
|
||||
<br>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!--201224,200806-->
|
||||
<h1>web development resources</h1>
|
||||
october 15, 2020<br>
|
||||
#accessibility #color #css #html #webdesign<br>
|
||||
<br>
|
||||
I'll collect frequently used resources for web design here. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li><a href="https://cssgrid-generator.netlify.app/"><b>CSS Grid Generator</b></a> - build a basic CSS Grid by changing the number of columns + rows, adjusting their dimensions, and adding containers. </li>
|
||||
<li><a href="https://validator.w3.org/nu/#textarea"><b>W3's Nu Html Checker</b></a> - automatically check the validity of your HTML + CSS. </li>
|
||||
<li><a href="https://webaim.org/resources/contrastchecker/"><b>WebAIM's Contrast Checker</b></a> - check whether your font color contrasts well against your background color, at least in the eyes of a computer. </li>
|
||||
<li><a href="https://coolors.co/75dbcd-c9dbba-dcdba8-f5cda7-faa381"><b>Coolors</b></a> - select and lock colors then generate palettes by pressing space. Click on a color to view shades + tints, so you can tweak contrast without losing hues. </li>
|
||||
</ul>
|
||||
@@ -0,0 +1,28 @@
|
||||
<!--200810-->
|
||||
<h1>my favorite GDC talks </h1>
|
||||
january 7, 2020<br>
|
||||
#gamedesign #marketing<br>
|
||||
<br>
|
||||
I really should be keeping a list of these with descriptions, so why not keep them in an article? <br>
|
||||
<br>
|
||||
<h2><a href="https://www.youtube.com/watch?v=W20t1zCZv8M">Automated Testing and Instant Replays in Retro City Rampage </a></h2><br>
|
||||
Vblank Entertainment's Brian Provinciano (2015) <br>
|
||||
log button inputs to replay the game, for use in preproducing bugs, sharing replays on the community leaderboard, running cutscenes, and even controlling AI. It is 100% accurate in deterministic engines but also helpful in less deterministic engines.
|
||||
<br>
|
||||
<ul>
|
||||
<li><a href="/static/extra/SimpleInputRec.cpp">I backed up the code he shared here. </a> It is a simple example of how to record and playback button input, written in C++.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<br>
|
||||
<h2><a href="https://www.youtube.com/watch?v=UJiv14uPOac">Empathizing with Steam: How People Shop for Your Game </a></h2><br>
|
||||
Chris Zukowski (2020) <br>
|
||||
tips for how to design your Steam store page based on Zukowski's screenshare and shopping diary observations of ordinary people shopping on Steam <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>Essentially, make your gameplay genre absolutely clear within the first 4 screenshots and in the short description so that people will wishlist your game to buy during a seasonal Steam Sale. </li>
|
||||
<li>Approach your wishlisters as complete newcomers. Jazz up your Steam page before a Steam Sale. Release an update, post in your forums, put a Santa hat on your character. When wishlisters return to your page, they will see an active game and be sold on it all over again. </li>
|
||||
<li>His conclusions are very similar to how I shop on Steam, except I could care less for the tag section. </li>
|
||||
<li>The romantic indie fiction section on Amazon dwarves the indie game section on Steam. To be immediately visible to their audience, romance authors follow a clear visual language on their covers to communicate their genres and sub-genres. Zukowski uses this as an extreme method for attracting your audience using the tropes of your genre, pointing out common UI elements and the shooter guy on every FPS cover. </li>
|
||||
<li>More notes @ <a href="/diary/entries/extra/gdc-design-steam-store">/diary/entries/extra/gdc-design-steam-store </a>
|
||||
</ul>
|
||||
<br>
|
||||
@@ -0,0 +1,94 @@
|
||||
<!--200810-->
|
||||
<h1>questionnaire for making a fantasy race </h1>
|
||||
march 4, 2021, 2020<br>
|
||||
#design #lore #worldbuilding<br>
|
||||
<br>
|
||||
<h2>Aspects of Culture </h2>
|
||||
General things to consider about your fantasy race to fill out their culture. Obviously not every point is going to be relevant. <br>
|
||||
<br>
|
||||
<h3>Basics </h3>
|
||||
<ul>
|
||||
<li>Basic Needs </li>
|
||||
<li>Reproduction </li>
|
||||
<li>Survival </li>
|
||||
<li>Climate </li>
|
||||
<li>Enemies </li>
|
||||
<li>Allies </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>Lifecycles </h3>
|
||||
<ul>
|
||||
<li>Birth - how and where are offspring born? who is allowed to give birth? </li>
|
||||
<li>Parenthood </li>
|
||||
<li>Childhood </li>
|
||||
<li>Coming of Age </li>
|
||||
<li>Love </li>
|
||||
<li>Mating </li>
|
||||
<li>Marriage </li>
|
||||
<li>Death </li>
|
||||
<li>Education </li>
|
||||
<li>Career </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>Religion + Legend </h3>
|
||||
<ul>
|
||||
<li>Dominant Religions </li>
|
||||
<li>Denominations </li>
|
||||
<li>Cults </li>
|
||||
<li>Atheism </li>
|
||||
<li>Religious Figures </li>
|
||||
<li>Central themes of the religious teachings </li>
|
||||
<li>Explanations for the natural world - how the world came to be? the origin of Man? </li>
|
||||
<li>Afterlife - where do they go after they die? </li>
|
||||
<li>Evidence for religion </li>
|
||||
<li>Local legends </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>Climate </h3>
|
||||
<ul>
|
||||
<li>Preferred climate, climates inhabitted </li>
|
||||
<li>How do they adapt to their climate? </li>
|
||||
<li>Danger </li>
|
||||
<li>How does their climate connect and separate them from other cultures? </li>
|
||||
<li>What raw materials are available to them? </li>
|
||||
<li>What seasons do they have? </li>
|
||||
<li>Weather </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>History </h3>
|
||||
<ul>
|
||||
<li>How is history recorded and shared? Is it accurate? </li>
|
||||
<li>Origin of their people, nation </li>
|
||||
<li>Significant events - expansion, wars, diaspora, exile, mass murder, transfers of power </li>
|
||||
<li>Local history - early settlement, original population, development, local heroes, times that national events or figures that visited the local area </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>Culture </h3>
|
||||
<ul>
|
||||
<li>Cultural Identity </li>
|
||||
<li>Housing </li>
|
||||
<li>Cuisine, Dining </li>
|
||||
<li>Leading Industries, Imports, Exports, Trade </li>
|
||||
<li>Class Stratification, Castes </li>
|
||||
<li>Factions, Politics </li>
|
||||
<li>Gender, Gender Roles </li>
|
||||
<li>Race, Sub-race - Where and when did the other races or subraces arrive? Where do they tend to live? Influence on the greater culture, and vice versa? Race relations? Stereotypes? How are biracial people perceived? </li>
|
||||
<li>Foreign culture - immigration policies to and from, perception of immigrants </li>
|
||||
<li>Crime - Forms of crime, punishment </li>
|
||||
<li>Health </li>
|
||||
<li>Beauty, Fashion - Beauty Standards/Desired traits for mating, Differences among different demographics + factions, Influences </li>
|
||||
<li>Rituals, Holidays, Festivals, Fairs, Masquerades </li>
|
||||
<li>Language </li>
|
||||
<li>Naming practices - when are names received? how many names are given? are names ever changed? what are naming conventions and how do they differ among the different factions? are there naming authorities or rules? </li>
|
||||
<li>Etiquette </li>
|
||||
<li>Art - Architecture </li>
|
||||
<li>Entertainment - sports, hobbies</li>
|
||||
<li>Symbols, Color associations </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h3>Others </h3>
|
||||
<ul>
|
||||
<li>Time </li>
|
||||
<li>
|
||||
</ul>
|
||||
<br>
|
||||
Binary file not shown.
@@ -0,0 +1,28 @@
|
||||
<!--200810-->
|
||||
<h1>my favorite GDC talks </h1>
|
||||
september 18, 2020<br>
|
||||
game design, marketing<br>
|
||||
<br>
|
||||
I really should be keeping a list of these with descriptions, so why not keep them in an article? <br>
|
||||
<br>
|
||||
<h2><a href="https://www.youtube.com/watch?v=W20t1zCZv8M">Automated Testing and Instant Replays in Retro City Rampage </a></h2><br>
|
||||
Vblank Entertainment's Brian Provinciano (2015) <br>
|
||||
log button inputs to replay the game, for use in preproducing bugs, sharing replays on the community leaderboard, running cutscenes, and even controlling AI. It is 100% accurate in deterministic engines but also helpful in less deterministic engines.
|
||||
<br>
|
||||
<ul>
|
||||
<li><a href="/static/extra/SimpleInputRec.cpp">I backed up the code he shared here. </a> It is a simple example of how to record and playback button input, written in C++.</li>
|
||||
</ul>
|
||||
<br>
|
||||
<br>
|
||||
<h2><a href="https://www.youtube.com/watch?v=UJiv14uPOac">Empathizing with Steam: How People Shop for Your Game </a></h2><br>
|
||||
Chris Zukowski (2020) <br>
|
||||
tips for how to design your Steam store page based on Zukowski's screenshare and shopping diary observations of ordinary people shopping on Steam <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>Essentially, make your gameplay genre absolutely clear within the first 4 screenshots and in the short description so that people will wishlist your game to buy during a seasonal Steam Sale. </li>
|
||||
<li>Approach your wishlisters as complete newcomers. Jazz up your Steam page before a Steam Sale. Release an update, post in your forums, put a Santa hat on your character. When wishlisters return to your page, they will see an active game and be sold on it all over again. </li>
|
||||
<li>His conclusions are very similar to how I shop on Steam, except I could care less for the tag section. </li>
|
||||
<li>The romantic indie fiction section on Amazon dwarves the indie game section on Steam. To be immediately visible to their audience, romance authors follow a clear visual language on their covers to communicate their genres and sub-genres. Zukowski uses this as an extreme method for attracting your audience using the tropes of your genre, pointing out common UI elements and the shooter guy on every FPS cover. </li>
|
||||
<li>More notes @ <a href="/diary/entries/extra/gdc-design-steam-store">/diary/entries/extra/gdc-design-steam-store </a>
|
||||
</ul>
|
||||
<br>
|
||||
@@ -0,0 +1,67 @@
|
||||
<!--article,article-->
|
||||
<h1>title in lowercase </h1>
|
||||
date in lowercase<br>
|
||||
#accessibility #ai #apache #blogging #bottle #color #css #design #gamedescription #gamedesign #gamejam #gamemechanics #git #html #internationalization #json #localization #marketing #mockup #nginx #php #programming #python #regex #regularexpression #server #simpletemplate #skills #systemdiagram #webdev #webdesign #website<br>
|
||||
<br>
|
||||
<b>term</b> is etc. <br>
|
||||
<br>
|
||||
Capitalize some words. <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>CSS, HTML, JSON, PHP </li>
|
||||
<li>CSS Grid, Flexbox </li>
|
||||
<li>MMO, RPG </li>
|
||||
<li>NPC, WASD, XP </li>
|
||||
<li>.CSV </li>
|
||||
<li>IM, PC, UI, URL, VPS </li>
|
||||
<li>GDC, YouTube</li>
|
||||
<li>2D, 3D </li>
|
||||
<li>First Class, Second Class</li>
|
||||
</ul>
|
||||
<br>
|
||||
<br>
|
||||
<h2>lowercase </h2>
|
||||
<ul>
|
||||
<li>blessfrey, chimchooree, pixel joy, pixel sparrow </li>
|
||||
<li>gamedev, webdev </li>
|
||||
</ul>
|
||||
<br>
|
||||
<ul>
|
||||
<li>coroutine </li>
|
||||
<li>lol </li>
|
||||
</ul>
|
||||
<br>
|
||||
How to spell words... <br>
|
||||
<br>
|
||||
<ul>
|
||||
<li>Chatroom </li>
|
||||
<li>Cooldown </li>
|
||||
<li>Eye Shadow </li>
|
||||
<li>Freeform </li>
|
||||
<li>Gameplay </li>
|
||||
<li>Hello World</li>
|
||||
<li>Multiclassing </li>
|
||||
<li>Mockup </li>
|
||||
<li>Petsite </li>
|
||||
<li>Playstyle </li>
|
||||
<li>Plugin </li>
|
||||
<li>Premade </li>
|
||||
<li>Skillbar </li>
|
||||
<li>Subfunction </li>
|
||||
<li>Videogame </li>
|
||||
<li>Web Page </li>
|
||||
</ul>
|
||||
<br>
|
||||
<h2>subtitle </h2><br>
|
||||
spacing like this <br>
|
||||
<br>
|
||||
<br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_June292019.png">
|
||||
<img src="/static/img/ent/screenshot_June292019.png" alt="(image: Lots of Angels and other characters at a shopping center)" width="500" height="278.66">
|
||||
<br><br>
|
||||
<h3>subsubtitle with BrandName or CSS or chloe </h3>
|
||||
<br><br>
|
||||
<a target="_blank" href="/static/img/ent/screenshot_June292019.png">
|
||||
<img src="/static/img/ent/screenshot_June292019.png" alt="(image: Lots of Angels and other characters at a shopping center)" width="500" height="278.66">
|
||||
</a><br>
|
||||
<br>
|
||||
@@ -0,0 +1,288 @@
|
||||
<code>/******************************************************************************/</code>
|
||||
<code>// SIMPLE INPUT RECORD/PLAYBACK</code>
|
||||
<code>// (c) 2015 Brian Provinciano</code>
|
||||
<code>//</code>
|
||||
<code>// You are free to use this code for your own purposes, no strings attached.</code>
|
||||
//
|
||||
// This is a very basic sample to record and playback button input.
|
||||
// It's most useful when activated on startup, deactivated on shutdown for
|
||||
// global button recording/playback.
|
||||
//
|
||||
// For details on more advanced implementations, see my GDC 2015 session:
|
||||
// -> Automated Testing and Instant Replays in Retro City Rampage
|
||||
// The slides and full video will be available on the GDC Vault at a later date.
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
// wrap it so it can be conditionally compiled in.
|
||||
// for example, set INPUTREPLAY_CAN_RECORD to 1 to play the game and record the input, set it to 0 when done
|
||||
// INPUTREPLAY_CAN_RECORD takes priority over INPUTREPLAY_CAN_PLAYBACK
|
||||
|
||||
#define INPUTREPLAY_CAN_PLAYBACK 1
|
||||
#define INPUTREPLAY_CAN_RECORD 1
|
||||
|
||||
#define INPUTREPLAY_INCLUDED (INPUTREPLAY_CAN_PLAYBACK || INPUTREPLAY_CAN_RECORD)
|
||||
/******************************************************************************/
|
||||
|
||||
#if INPUTREPLAY_INCLUDED
|
||||
|
||||
#define INPUT_BUTTONS_TOTAL 32 // up to 32
|
||||
#define MAX_REC_LEN 0x8000 // the buffer size for storing RLE compressed button input (x each button)
|
||||
|
||||
/******************************************************************************/
|
||||
typedef struct
|
||||
{
|
||||
unsigned short *rledata;
|
||||
unsigned short rlepos;
|
||||
unsigned short datalen;
|
||||
unsigned short currentrun;
|
||||
} ButtonRec;
|
||||
/******************************************************************************/
|
||||
|
||||
// if INPUTREPLAY_CAN_RECORD, as soon as this class is instanced, it will automatically record when instanced/created.
|
||||
// statically creating this as a global will blanket the entire play session
|
||||
//
|
||||
// if INPUTREPLAY_CAN_PLAYBACK, playback will begin as soon as LoadFile() is used
|
||||
//
|
||||
class SimpleInputRec
|
||||
{
|
||||
unsigned int m_buttonstate;
|
||||
ButtonRec m_buttons[INPUT_BUTTONS_TOTAL];
|
||||
bool m_bRecording;
|
||||
|
||||
unsigned char* m_data;
|
||||
|
||||
public:
|
||||
SimpleInputRec()
|
||||
: m_buttonstate(0)
|
||||
, m_data(NULL)
|
||||
, m_bRecording(true)
|
||||
{
|
||||
}
|
||||
|
||||
~SimpleInputRec()
|
||||
{
|
||||
if(m_data)
|
||||
{
|
||||
#if INPUTREPLAY_CAN_RECORD
|
||||
WriteToFile();
|
||||
#endif
|
||||
delete[] m_data;
|
||||
}
|
||||
}
|
||||
|
||||
// run each frame before the game uses the live button input.
|
||||
// when recording, it saves the live input
|
||||
// during playback, it overwrites the live input
|
||||
void Update(bool bForce = false);
|
||||
|
||||
// to start a playback
|
||||
#if INPUTREPLAY_CAN_PLAYBACK
|
||||
bool LoadFile(KSTR szfilename);
|
||||
#endif
|
||||
|
||||
// to finish recording
|
||||
#if INPUTREPLAY_CAN_RECORD
|
||||
void WriteToFile();
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
void SimpleInputRec::Update(bool bForce)
|
||||
{
|
||||
#if INPUTREPLAY_CAN_RECORD
|
||||
if(m_bRecording)
|
||||
{
|
||||
unsigned int newbuttons = nesinput.buttons;
|
||||
|
||||
// allocate and initialize
|
||||
if(!m_data)
|
||||
{
|
||||
m_data = new unsigned char[INPUT_BUTTONS_TOTAL * MAX_REC_LEN * 2];
|
||||
unsigned short* dataptr = (unsigned short*)m_data;
|
||||
|
||||
for(int i=0; i<INPUT_BUTTONS_TOTAL; ++i)
|
||||
{
|
||||
ButtonRec& btn = m_buttons[i];
|
||||
|
||||
btn.rledata = dataptr;
|
||||
dataptr += MAX_REC_LEN;
|
||||
|
||||
btn.rlepos = 0;
|
||||
btn.currentrun = 0;
|
||||
btn.datalen = MAX_REC_LEN;
|
||||
}
|
||||
}
|
||||
|
||||
// write RLE button bit streams
|
||||
for(int i=0; i<INPUT_BUTTONS_TOTAL; ++i)
|
||||
{
|
||||
ButtonRec& btn = m_buttons[i];
|
||||
|
||||
if(bForce || (newbuttons&(1<<i)) != (m_buttonstate&(1<<i)) || btn.currentrun==0x7FFF)
|
||||
{
|
||||
if(btn.currentrun)
|
||||
{
|
||||
int bit = (m_buttonstate>>i)&1;
|
||||
btn.rledata[btn.rlepos++] = (bit<<15) | btn.currentrun;
|
||||
}
|
||||
btn.currentrun = bForce? 0 : 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
++btn.currentrun;
|
||||
}
|
||||
}
|
||||
|
||||
m_buttonstate = newbuttons;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if INPUTREPLAY_CAN_PLAYBACK
|
||||
if(!m_bRecording)
|
||||
{
|
||||
bool bIsRunning = false;
|
||||
for(int i=0; i<INPUT_BUTTONS_TOTAL; ++i)
|
||||
{
|
||||
ButtonRec& btn = m_buttons[i];
|
||||
if(btn.rledata)
|
||||
{
|
||||
bIsRunning = true;
|
||||
if(!btn.currentrun && btn.rlepos<btn.datalen)
|
||||
{
|
||||
unsigned short value = btn.rledata[btn.rlepos++];
|
||||
btn.currentrun = value&0x7FFF;
|
||||
m_buttonstate &= ~(1<<i);
|
||||
m_buttonstate |= ((value>>15)&1)<<i;
|
||||
--btn.currentrun;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(btn.currentrun)
|
||||
{
|
||||
--btn.currentrun;
|
||||
}
|
||||
else if(btn.rlepos==btn.datalen)
|
||||
{
|
||||
btn.rledata = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(bIsRunning)
|
||||
{
|
||||
// TODO: this is where you can overwrite the live button state to the prerecorded one
|
||||
systeminput.buttons = m_buttonstate;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#if INPUTREPLAY_CAN_PLAYBACK
|
||||
bool SimpleInputRec::LoadFile(KSTR szfilename)
|
||||
{
|
||||
for(int i=0; i<INPUT_BUTTONS_TOTAL; ++i)
|
||||
{
|
||||
ButtonRec& btn = m_buttons[i];
|
||||
|
||||
btn.datalen = 0;
|
||||
btn.rledata = NULL;
|
||||
btn.rlepos = 0;
|
||||
btn.currentrun = 0;
|
||||
}
|
||||
|
||||
delete[] m_data;
|
||||
m_bRecording = false;
|
||||
|
||||
if(fcheckexists(szfilename))
|
||||
{
|
||||
FILE* f = fopen(szfilename, "wb");
|
||||
if(f)
|
||||
{
|
||||
// WARNING: You'll want to do more error checking, but just to keep it simple...
|
||||
|
||||
fseek(f,0,SEEK_END);
|
||||
unsigned long filelen = ftell(f);
|
||||
fseek(f,0,SEEK_SET);
|
||||
|
||||
m_data = new unsigned char[filelen];
|
||||
fread(m_data, 1, filelen, f);
|
||||
fclose(f);
|
||||
|
||||
unsigned char* bufptr = m_data;
|
||||
int numbuttons = bufptr[0] | (bufptr[1]<<8);
|
||||
bufptr += 2;
|
||||
if(numbuttons <= INPUT_BUTTONS_TOTAL)
|
||||
{
|
||||
for(int i=0; i<numbuttons; ++i)
|
||||
{
|
||||
ButtonRec& btn = m_buttons[i];
|
||||
|
||||
btn.datalen = bufptr[0] | (bufptr[1]<<8);
|
||||
bufptr += 2;
|
||||
}
|
||||
|
||||
for(int i=0; i<numbuttons; ++i)
|
||||
{
|
||||
ButtonRec& btn = m_buttons[i];
|
||||
if(btn.datalen)
|
||||
{
|
||||
// WARNING: Endian dependent for simplcicity
|
||||
btn.rledata = (unsigned short*)bufptr;
|
||||
bufptr += btn.datalen*2;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#if INPUTREPLAY_CAN_RECORD
|
||||
void SimpleInputRec::WriteToFile()
|
||||
{
|
||||
if(m_data && m_bRecording)
|
||||
{
|
||||
Update(true);
|
||||
|
||||
FILE* f = fopen("_autorec.rec","wb");
|
||||
if(f)
|
||||
{
|
||||
fputc(INPUT_BUTTONS_TOTAL, f);
|
||||
fputc(0, f);
|
||||
|
||||
for(int i=0; i<INPUT_BUTTONS_TOTAL; ++i)
|
||||
{
|
||||
ButtonRec& btn = m_buttons[i];
|
||||
|
||||
fputc((unsigned char)btn.rlepos, f);
|
||||
fputc(btn.rlepos >> 8, f);
|
||||
}
|
||||
for(int i=0; i<INPUT_BUTTONS_TOTAL; ++i)
|
||||
{
|
||||
ButtonRec& btn = m_buttons[i];
|
||||
|
||||
// WARNING: Endian dependent for simplcicity
|
||||
fwrite(btn.rledata, 2, btn.rlepos, f);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#endif // INPUTREPLAY_INCLUDED
|
||||
</code>
|
||||
@@ -0,0 +1,36 @@
|
||||
<!--200918-->
|
||||
<h1>my favorite GDC talks: Empathizing with Steam: How People Shop for Your Game by Chris Zukowski (2020) </h1>
|
||||
september 18, 2020<br>
|
||||
marketing, sale, steam, wishlist<br>
|
||||
<br>
|
||||
<a href="https://www.youtube.com/watch?v=UJiv14uPOac">Empathizing with Steam: How People Shop for Your Game by Chris Zukowski (2020)</a> - tips for how to design your Steam store page based on Zukowski's screenshare and shopping diary observations of ordinary people shopping on Steam
|
||||
<ul>
|
||||
<li>Essentially, make your gameplay genre absolutely clear within the first 4 screenshots and in the short description so that people will wishlist your game to buy during a seasonal Steam Sale.</li>
|
||||
<li>Approach your wishlisters as complete newcomers. Jazz up your Steam page before a Steam Sale. Release an update, post in your forums, put a Santa hat on your character. When wishlisters return to your page, they will see an active game and be sold on it all over again.</li>
|
||||
<li>His conclusions are very similar to how I shop on Steam, except I could care less for the tag section.</li>
|
||||
<li>first 4 images are shown when hovering over thumbnail in Steam. Make them represent the pillars of your gameplay, so the genre is clear.</li>
|
||||
<li>don't try to coerce new audiences into trying your game. try to find your audience and show them exactly what they are looking for.
|
||||
<li>include UI in screenshots, so gamers can decipher the genre and some gameplay mechanics</li>
|
||||
<li>Gamers naturally compare new games with the leading games of their genres to decide whether they will enjoy it.</li>
|
||||
<li>indie romance authors (who compete on a market of 8 million vs. steam's 40 thousand) use clear visual language in their coverart: tartan kilt + sword + distant castle = highland romance; animal behind a hunk = shapeshifter romance; woman in front of group of hunks = reverse harem. So a reader who sees a cover with multiple guys and a wolf, she knows it's a reverse harem of shape-shifting wolf boys without any descriptions or trailers.</li>
|
||||
<li>applying the wisdom of the romance authors, understand your audience's genre interests as sub-sub-sub-genres and make your genre crystal clear in your store page.</li>
|
||||
<li>Apply the tropes of your genre. The FPS coverart guy with the gun on all CoD and BF games, the two Street Fighter healthbars on the top of any fighter game</li>
|
||||
<li>Part 4 - How to manage a Steam sale</li>
|
||||
<li>People check their wishlist during sales, looking for discounts.</li>
|
||||
<li>People don't remember why they wishlisted games, so your page must look fresh even to your wishlist crew. Before a sale, post an update, theme your capsule image, post an announcement, upload a small patch, and comment in the forums.</li>
|
||||
<li>People remember games that are always on sale. Frequent sales increase familiarity.</li>
|
||||
<li>Power users use gg.deals or steamdb to track historic lows. Strategically staircase your way down over time. Coincide your all-time-lows with Big Steam Sales. Harness the fear of missing out.</li>
|
||||
<li>How to get from wishlist to cart</li>
|
||||
<li>Before clicking 'buy,' they check developer and publisher for someone they recognize or trust. They check 'more from this studio' to check familiarity with the dev's other games.</li>
|
||||
<li>Release more games to build this trust and familiarity.</li>
|
||||
<li>They check the 'relevant to you' bar to see if the genre matches games they've played and that friends with similar taste also like the game.</li>
|
||||
<li>How to manage your sales pricing</li>
|
||||
<li>How to get from cart to library</li>
|
||||
<li>After loading cart, they ask their friends whether they should go for it.</li>
|
||||
<li>Your current customers have to become ambassadors to complete this purchase loop. Treat them well! </li>
|
||||
<li>Abandon cart recovery in other online retailers beckons shoppers back before the sale ends. Steam lacks this, potentially losing devs 10% in revenue - https://www.annexcloud.com/blog/31-shopping-cart-abandonment-statistics-for-2018/</li>
|
||||
<li>Do a second marketing push during the last day of a sale.</li>
|
||||
<li>5 - How to wishlisters into buyers</li>
|
||||
<li></li>
|
||||
</ul>
|
||||
<br>
|
||||
@@ -0,0 +1,443 @@
|
||||
abyssal whip
|
||||
adamantine
|
||||
airship
|
||||
aloe
|
||||
alpine
|
||||
amber fossil
|
||||
ambrosia
|
||||
amulet
|
||||
anachronism
|
||||
anagram
|
||||
animal parade
|
||||
aphrodisiac
|
||||
apple
|
||||
apothecary
|
||||
apricot
|
||||
asterism
|
||||
atelier
|
||||
bad cat
|
||||
Baldur
|
||||
bamboo
|
||||
bandit camp
|
||||
bandit king
|
||||
basil
|
||||
bell tower
|
||||
birthday dress
|
||||
birthstone
|
||||
black bear
|
||||
The Black Hand
|
||||
black knight
|
||||
black water
|
||||
black widow
|
||||
blackguard
|
||||
bloodstone
|
||||
blue and yellow
|
||||
blue blood
|
||||
blue rose
|
||||
bluebell
|
||||
bonfire
|
||||
box garden
|
||||
breath of life
|
||||
bubble bath
|
||||
bubble tea
|
||||
bunny boy
|
||||
buried treasure
|
||||
butterfly woman
|
||||
camel
|
||||
candlelight
|
||||
cashmere
|
||||
castle
|
||||
cat café
|
||||
cat familiar
|
||||
cat man
|
||||
catacombs
|
||||
celestial
|
||||
cemetery
|
||||
chained to rocks
|
||||
chain mail
|
||||
chameleon
|
||||
chamomile
|
||||
chandelier
|
||||
charmeuse
|
||||
cheese bread
|
||||
chimera
|
||||
chives
|
||||
chocolate factory
|
||||
chronomancer
|
||||
cipher
|
||||
citadel
|
||||
city of the dead
|
||||
clipart
|
||||
coin flip
|
||||
cold iron
|
||||
confetti
|
||||
constellation
|
||||
copycat
|
||||
cotton
|
||||
couture
|
||||
cove
|
||||
crab
|
||||
crazy quilt
|
||||
Crossroad Keep
|
||||
crucibled
|
||||
crystal sea
|
||||
daeva
|
||||
dark horse
|
||||
dark hour
|
||||
dark paradise
|
||||
death's-head hawkmoth
|
||||
deep space
|
||||
diadem
|
||||
Diana
|
||||
diorama
|
||||
dimetrodon
|
||||
dire wolf
|
||||
dollhouse
|
||||
donkey
|
||||
doppelgänger
|
||||
dragonfruit
|
||||
dragonstone
|
||||
dreamweaver
|
||||
Dymer
|
||||
dystopia
|
||||
ectoplasm
|
||||
edelweiss
|
||||
egg hunt
|
||||
elemental
|
||||
elipse
|
||||
elixir of life
|
||||
emberlight
|
||||
Entrana
|
||||
eventide
|
||||
epitaph
|
||||
Epsom salt
|
||||
eternal youth
|
||||
ettin
|
||||
evil twin
|
||||
fable
|
||||
falling leaves
|
||||
fairy lights
|
||||
fairy ring
|
||||
faun
|
||||
favored soul
|
||||
femme covert
|
||||
femme fatale
|
||||
fiery sword
|
||||
fire ball
|
||||
fire opal
|
||||
firebrand
|
||||
fishing village
|
||||
floating
|
||||
flower woman
|
||||
flying
|
||||
folklore
|
||||
fountain of youth
|
||||
forge
|
||||
fortress
|
||||
freezing fog
|
||||
fringe
|
||||
frog prince
|
||||
fullness of time
|
||||
gallows
|
||||
Garden of Eden
|
||||
gargoyle
|
||||
genie
|
||||
geode
|
||||
ghost orchid
|
||||
ghost ship
|
||||
ghost town
|
||||
girl in the internet
|
||||
girl in white
|
||||
glow stick
|
||||
glow-in-the-dark stars
|
||||
goblin
|
||||
gold rush
|
||||
gold standard
|
||||
golden apple
|
||||
golden orb weaver
|
||||
golem
|
||||
gray weather
|
||||
griffon
|
||||
grove
|
||||
guild
|
||||
guilty pleasure
|
||||
hall of monuments
|
||||
halo
|
||||
hand of God
|
||||
the hanged man
|
||||
hanging garden
|
||||
happy place
|
||||
haunted house
|
||||
headscarf
|
||||
heart
|
||||
hermit
|
||||
holly
|
||||
honeydew
|
||||
hot air balloon
|
||||
hot and cold game
|
||||
hot cocoa
|
||||
hydrangea
|
||||
igari makeup
|
||||
illuminated text
|
||||
imp
|
||||
incense
|
||||
invisible man
|
||||
iridescence
|
||||
ironwood
|
||||
jack-o'-lantern
|
||||
jacquard
|
||||
jade
|
||||
jasmine
|
||||
juicebox
|
||||
kaleidoscope
|
||||
kesi silk
|
||||
kigurumi
|
||||
kingdom
|
||||
La Belle Sans Merci
|
||||
labyrinth
|
||||
lady cat
|
||||
Lady of Shallot
|
||||
Lady of the Lake
|
||||
lady in black
|
||||
lake of fire
|
||||
lair
|
||||
lamentation
|
||||
lavender
|
||||
lemonade
|
||||
life-giver
|
||||
lighthouse
|
||||
lip oil
|
||||
Little Red Riding Hood
|
||||
lizardman
|
||||
lobster
|
||||
locket
|
||||
Lokasenna
|
||||
loner
|
||||
loom
|
||||
lost city
|
||||
lost continent
|
||||
lost soul
|
||||
lotus
|
||||
love letter
|
||||
love potion
|
||||
low poly
|
||||
lullaby
|
||||
macramé
|
||||
mages guild
|
||||
magic carpet
|
||||
man in the moon
|
||||
mandrake
|
||||
manna
|
||||
marine
|
||||
Mars
|
||||
mask
|
||||
masquerade
|
||||
mead of poetry
|
||||
mean girl
|
||||
melon soda
|
||||
memento mori
|
||||
memoir
|
||||
mercury rivers and lakes
|
||||
metamorphosis
|
||||
meteorite
|
||||
metropolis
|
||||
miasma
|
||||
Midas Touch
|
||||
millennial moon
|
||||
miniature
|
||||
mirror of Venus
|
||||
mirror on the wall
|
||||
mithril
|
||||
monastery
|
||||
money tree
|
||||
monkey and bear
|
||||
moon rock
|
||||
moonflower
|
||||
moonglow
|
||||
moonstone
|
||||
morning glory
|
||||
mossy cobblestone
|
||||
moth
|
||||
mudskipper
|
||||
mural
|
||||
muse
|
||||
necromancer
|
||||
nightlight
|
||||
nocturnality
|
||||
oneiromancer
|
||||
oblivion
|
||||
odalisque
|
||||
omen
|
||||
opal
|
||||
orb
|
||||
orichalcum
|
||||
orphan
|
||||
palace
|
||||
panda eyes
|
||||
paper crane
|
||||
paper fan
|
||||
pearl
|
||||
periwinkle
|
||||
personality test
|
||||
phantom residue
|
||||
phantom thief
|
||||
pharisee
|
||||
philosopher's stone
|
||||
pickpocketing
|
||||
pilgrimage
|
||||
pixie stick
|
||||
pinwheel
|
||||
planetary weather
|
||||
plastic vampire fangs
|
||||
plushie
|
||||
poetry and prose
|
||||
pomegranate
|
||||
poppy
|
||||
post-rock
|
||||
pretzel
|
||||
princess of Kentucky
|
||||
principality
|
||||
prism
|
||||
prison planet
|
||||
poinsettia
|
||||
popcorn
|
||||
porcelain
|
||||
propaganda
|
||||
prophecy
|
||||
proverb
|
||||
psalm
|
||||
pseudonym
|
||||
pumpkin carving
|
||||
quiz show
|
||||
rainbow
|
||||
raw honey
|
||||
reaper
|
||||
reclining woman
|
||||
red
|
||||
reverse trap
|
||||
road roller
|
||||
rooibos tea
|
||||
rose gold
|
||||
rose petal
|
||||
runestone
|
||||
s'more
|
||||
sailor fuku
|
||||
Sanctum
|
||||
sandalwood
|
||||
sandcastle
|
||||
sandman
|
||||
sanguine, my brother
|
||||
sardonic
|
||||
satire
|
||||
satyr
|
||||
scrying pool
|
||||
scythe
|
||||
sea foam
|
||||
sea glass
|
||||
sea of stars
|
||||
sea storm
|
||||
seastrand
|
||||
secret garden
|
||||
secret passageway
|
||||
secret room
|
||||
seven deadly sins
|
||||
seven heavenly virtues
|
||||
shapeshifter
|
||||
sheep
|
||||
shipwreck
|
||||
shoegaze
|
||||
shooting star
|
||||
silk
|
||||
silk embroidery
|
||||
singing sword
|
||||
skeleton
|
||||
skipping stone
|
||||
slide puzzle
|
||||
slime
|
||||
smoke and mirrors
|
||||
snow globe
|
||||
soma
|
||||
soulmate
|
||||
space cowboy
|
||||
spooky chews
|
||||
squid
|
||||
spellbook
|
||||
spelunking
|
||||
spice cookie
|
||||
spirit animal
|
||||
spy
|
||||
stained-glass
|
||||
stardust
|
||||
stargazer
|
||||
starry sky
|
||||
statuesque
|
||||
sticker
|
||||
stinky cat
|
||||
stone face
|
||||
stone people
|
||||
storm cloud
|
||||
strawberries and cream
|
||||
strawberry blonde
|
||||
strawberry shortcake
|
||||
sunflower
|
||||
swamp light
|
||||
swan song
|
||||
sword in the stone
|
||||
taffy
|
||||
talking forest
|
||||
tatting
|
||||
tea garden
|
||||
tears of Guthix
|
||||
terrarium
|
||||
three women
|
||||
tide pool
|
||||
tiger's eye
|
||||
toasted marshmallow
|
||||
topiary
|
||||
treasure trails
|
||||
tree of life
|
||||
trick or treat
|
||||
trickster
|
||||
tulip
|
||||
tungsten
|
||||
underwater
|
||||
underworld
|
||||
unicorn horn
|
||||
unstoppable mailman
|
||||
urban legend
|
||||
utopia
|
||||
vanity of vanities
|
||||
Venus
|
||||
waiting room
|
||||
waking dream
|
||||
walled city
|
||||
wampus cat
|
||||
wandering eye
|
||||
wanderlust
|
||||
wasp lady
|
||||
watchmen on the wall
|
||||
water bearer
|
||||
water nymph
|
||||
waterfall room
|
||||
weeping willow
|
||||
Whip-Poor-Will
|
||||
whisper
|
||||
white Christmas
|
||||
will-o'-wisp
|
||||
wind chimes
|
||||
wings
|
||||
wishing well
|
||||
witchhouse
|
||||
witching hour
|
||||
wizard tower
|
||||
wolf's-bane
|
||||
woman and serpent
|
||||
the woodsman
|
||||
wormwood
|
||||
wreath
|
||||
wyvern
|
||||
yak
|
||||
Yggdrasil
|
||||
Ys
|
||||
zealot
|
||||
zoo
|
||||
Reference in New Issue
Block a user