small-nav
chimchooree 4 years ago
parent 057033d172
commit c91c7f5ba6

@ -1,23 +1,16 @@
<!--201015,210121--> <!--201015,210121-->
<h1>making an rss feed</h1> <h1>generating an RSS feed with python bottle</h1>
march 18, 2021<br> march 18, 2021<br>
#rss #webdev <br> #bottle #rss #webdev <br>
<br> <br>
After a few months of quietly running my blog as practice, I want to start sharing my articles with other people. I looked over my favorite gamedev communities and saw that <a href="https://gamedev.net/">GameDev.net</a> apparently allows you syndicate a blog through RSS. I never thought about making an RSS feed, so why not? <br> After a few months of quietly running my blog as practice, I want to start sharing my articles with other people. I looked over my favorite gamedev communities and saw that <a href="https://gamedev.net/">GameDev.net</a> apparently allows you to syndicate a blog through RSS. I never thought about making an RSS feed, so why not? <br>
<br> <br>
<h2>what is RSS? </h2><br> <h2>what is RSS? </h2><br>
Before the massive centralized content platforms came into the mainstream, the internet was more like a constellation of individual websites. In lieue of algorithm-driven feeds + push notifications from major social media, RSS was designed to bring content from individuals into one place. <br> Before the massive centralized content platforms came into the mainstream, the internet was more like a constellation of individual websites. In lieue of algorithm-driven feeds and push notifications from major social media, RSS was designed to bring content from scattered websites into one place. <br>
<br> <br>
RSS and its predecessors have been around since the 90s. RSS 2.0 (what blessfrey.me uses) was published in 2002. Even through it's old and falling in popularity, it's still used by some large aggregator websites today like <a href="https://publishercenter.google.com/publications#p:id=pfehome">Google News</a> <br> and <a href="https://podcasters.spotify.com/submit">Spotify</a>. <br> RSS and its predecessors have been around since the 90s. RSS 2.0 (what blessfrey.me uses) was published in 2002. Even through it's old and falling in popularity, it's still used by some large aggregators today like <a href="https://publishercenter.google.com/publications#p:id=pfehome">Google News</a> and <a href="https://podcasters.spotify.com/submit">Spotify</a>. <br>
<br> <br>
RSS files themselves are written in XML. They should contain the latest 10-15 entries with their things like their title, link, summary, date, and author. <br> Here's a few examples from around the internet, a mix of large + small news websites and forums: <br>
<br>
<h2>how to make an RSS feed </h2><br>
Blogging platforms like <a href="https://wordpress.org/support/article/wordpress-feeds/">WordPress</a> already take care of the RSS feed, but there's no shortage of third-party RSS creators on the internet. Since I have already written code to display + summarize my articles on the <a href="https://www.blessfrey.me/diary">diary</a> page, the 'latest' box in the diary's sidebar, and the 'news' box on the <a href="https://www.blessfrey.me/">index</a> page, I'm confident the process for generating an XML file with the same info won't too different. <br>
<br>
Apparely I need a DOM or ElementTree or something
<h2>examples of RSS feeds </h2><br>
Here's a few examples from around the internet: <br>
<ul> <ul>
<li><a href="https://www.theguardian.com/world/rss">The Guardian</a> </li> <li><a href="https://www.theguardian.com/world/rss">The Guardian</a> </li>
<li><a href="https://www.gamasutra.com/blogs/rss/">Gamasutra</a> </li> <li><a href="https://www.gamasutra.com/blogs/rss/">Gamasutra</a> </li>
@ -28,3 +21,141 @@ Here's a few examples from around the internet: <br>
<li><a href="https://www.temptalia.com/feed/">Temptalia</a> </li> <li><a href="https://www.temptalia.com/feed/">Temptalia</a> </li>
</ul> </ul>
<br> <br>
<h2>what goes into an RSS feed? </h2><br>
RSS files themselves are written in XML. They should contain the latest 10-15 entries along with things like their title, link, summary, date, and author. <br>
<br>
Blogging platforms like <a href="https://wordpress.org/support/article/wordpress-feeds/">WordPress</a> already take care of the RSS feed, but there's no shortage of third-party RSS creators on the internet. Since I have already written code to display + summarize my articles on the <a href="https://www.blessfrey.me/diary">diary</a> page, the 'latest' box in the diary's sidebar, and the 'news' box on the <a href="https://www.blessfrey.me/">index</a> page, I figure I can format the data one more time into an XML file. <br>
<br>
Here's truncated version of blessfrey.me's feed as an example (also available on <a href="https://pastebin.com/bbrVp58E">Pastebin</a>: <br>
<br>
<code>&lt;?xml version="1.0" encoding="utf-8"?&gt;</code><br>
<code>&lt;rss version="2.0"&gt;</code><br>
<code>&lt;channel&gt;</code><br>
<code>&lt;title&gt;blessfrey.me&lt;/title&gt;</code><br>
<code>&lt;link&gt;https://www.blessfrey.me/&lt;/link&gt;</code><br>
<code>&lt;description&gt;chimchooree's dev space&lt;/description&gt;</code><br>
<code>&lt;language&gt;en-us&lt;/language&gt;</code><br>
<code>&lt;webMaster&gt;chimchooree@mail.com (chimchooree)&lt;/webMaster&gt;</code><br>
<code>&lt;item&gt;</code><br>
<code>&lt;title&gt;making an rss feed&lt;/title&gt;</code><br>
<code>&lt;link&gt;https://www.blessfrey.me/diary/entries//diary/entries/210318&lt;/link&gt;</code><br>
<code>&lt;description&gt;After a few months of quietly running my blog as practice, I want to start sharing my articles with ... &lt;/description&gt;</code><br>
<code>&lt;pubDate&gt;Thu, 18 Mar 2021 8:05 CST&lt;/pubDate&gt;</code><br>
<code>&lt;guid&gt;https://www.blessfrey.me/diary/entries//diary/entries/210318&lt;/guid&gt;</code><br>
<code>&lt;/item&gt;</code><br>
<code>&lt;/channel&gt;</code><br>
<code>&lt;/rss&gt;</code><br>
<br>
I'll explain each tag, but they are also described on the RSS Advisory Board's <a href="https://www.rssboard.org/rss-profile">Best Practices Profile</a>. There are more tags, too, so research documentation + examples to see what suits your website. <br>
<br>
<h3>XML declaration</h3><br>
Identifies the document as XML and defines the version + character encoding. It's required and must be the first line. <br>
<br>
<h3>RSS</h3><br>
The top-level element that defines version number. It's required. <br>
<br>
<h3>channel</h3><br>
Nested within the RSS tags and describes the RSS feed. It's required. <br>
<br>
There's some tags nested within the channel. <code>Title</code>, <code>Link</code>, and <code>Description</code> are required. <br>
<br>
<ul>
<li><b>title</b> - defines the title. Mine is just my website name, but large websites may have multiple feeds. It's required. </li>
<li><b>link</b> - defines the link to the channel. So, either your website or a specific area of your website. It's required. </li>
<li><b>description</b> - describe the channel in a few words. I used my website's tagline. It's required. </li>
<li><b>language</b> - defines the language, using a <a href="https://www.rssboard.org/rss-language-codes">RSS language code</a>. It's optional. </li>
<li><b>webMaster</b> - provide the contact email + name for technical issues regarding the feed. It should look something like <code>example@example.com (Name McName). It's optional. </code> </li>
</ul>
<br>
<h3>item</h3><br>
Nested within the channel. Each article will be defined with the item. <br>
<br>
There's some tags nested within the item. <code>Title</code>, <code>Link</code>, and <code>Description</code> are required. <br>
<br>
<ul>
<li><b>title</b> - defines the title of the article. It's required. </li>
<li><b>link</b> - defines the link to the article. It's required. </li>
<li><b>description</b> - summarize the article in one or two sentences. It's required. </li>
<li><b>pubDate</b> - indicates the date and time of publication, conforming to the <a href="https://www.rssboard.org/rss-profile#data-types-datetime">RFC 822 Date and Time Specification</a>. Follow a pattern like Mon, 15 Oct 2007 14:10:00 GMT. </li>
<li><b>guid</b> - A unique identifying string, which helps aggregators detect duplicates. Aggregators may ignore this field or use it in combination with the title and link values. </li>
</ul>
<br>
<h2>how to make an RSS feed </h2><br>
I'm generating the RSS every time I update my website. That way, it always exists on the server and can be served as a static file. If I used a template, the RSS file would not exist unless it was accessed. I'm not sure if that would be an issue and haven't experimented. <br>
<br>
Since Bottle is just Python, I can generate the file similar to how I format my articles into diary snippets, pages, and headlines. <br>
<br>
I'll share the main code, but the full code can be viewed on <a href="https://pastebin.com/E0PvNtbp">Pastebin</a>. <br>
<br>
<h3>code example </h3><br>
def make_rss(): <br>
loc = 'diary/entries/' <br>
info = {'items': list_items(gather_and_sort(loc)[0:15])} <br>
<br>
# Return list of items <br>
def list_items(articles): <br>
f_name = "static/xml/blessfrey.xml" # the RSS file <br>
loc2 = 'https://www.blessfrey.me/' <br>
loc = 'diary/entries/' <br>
loc3 = loc2 + loc <br>
result = [] <br>
<br>
for article in articles: <br>
path = loc + article <br>
text = [] <br>
a = [] <br>
length = 0 <br>
text = article2list(article, loc) <br>
a.append(find_title(text)) <br>
a.append(find_url(path)) <br>
a.append(clean_tags(prepare_rss_summary(text, path))) <br>
a.append(find_timestamp(text)) <br>
result.append(a) <br>
<br>
clear_file(f_name) <br>
f = open(f_name, 'w') <br>
f.write("&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;" + '\n') <br>
f.write("&lt;rss version=\"2.0\"&gt;" + '\n') <br>
f.write("&lt;channel&gt;" + '\n') <br>
f.write("&lt;title&gt;blessfrey.me&lt;/title&gt;" + '\n') <br>
f.write("&lt;link&gt;https://www.blessfrey.me/&lt;/link>" + '\n') <br>
f.write("&lt;description&gt;chimchooree's dev space&lt;/description&gt;" + '\n') <br>
f.write("&lt;language&gt;en-us&lt;/language&gt;" + '\n') <br>
f.write("&lt;webMaster&gt;chimchooree@mail.com (chimchooree)&lt;/webMaster&gt;" + '\n') <br>
<br>
for r in result: <br>
f.write("&lt;item&gt;" + '\n') <br>
f.write("&lt;title&gt;" + r[0] + "&lt;/title&gt;" + '\n') <br>
f.write("&lt;link&gt;" + loc3 + r[1] + "&lt;/link&gt;" + '\n') <br>
f.write("&lt;description&gt;" + r[2] + "&lt;/description&gt;" + '\n') <br>
code = r[1].replace(loc,'') <br>
code = code.replace('/','') <br>
f.write("&lt;pubDate&gt;" + format_rss_time(code) + "&lt;/pubDate&gt;" + '\n') <br>
f.write("&lt;guid&gt;" + loc3 + r[1] + "&lt;/guid>" + '\n') <br>
f.write("&lt;/item&gt;" + '\n') <br>
<br>
f.write("&lt;/channel&gt;" + '\n') <br>
f.write("&lt;/rss&gt;" + '\n') <br>
f.close() <br>
<br>
return result <br>
<br>
# Serve XML <br>
@route('/static/xml/&lt;filename:path&gt;') <br>
def serve_xml(filename): <br>
return static_file(filename, root='static/xml', mimetype='text/xml') <br>
<br>
## Main ## <br>
<br>
if __name__ == '__main__': <br>
make_rss() <br>
run(host='127.0.0.1', port=9001) <br>
<br>
<h2>double-check </h2><br>
The <a href="https://www.rssboard.org/rss-validator/">RSS Advisory Board</a> and <a href="<a href="https://validator.w3.org/feed/">W3C</a> have feed validation services that can check the syntax of Atom or RSS feeds. It's nice to check but don't feel pressured to meet all the recommendations if they don't suit your needs. <br>
<br>
<h2>double-check </h2><br>
Now I have an RSS feed, available at <a href="/static/xml/blessfrey.xml">https:/blessfrey.me/static/xml/blessfrey.xml</a>. Feel free to use it if you prefer to read through an aggregator and contact me if there's technical problems. <br>
<br>
Last updated March 19, 2021 <br>
<br>

@ -14,13 +14,13 @@ april 1, 2021<br>
<h3>tuesday, march 2 </h3> <h3>tuesday, march 2 </h3>
<ul> <ul>
<li>wrote articles for blessfrey.me </li> <li>wrote articles for blessfrey.me </li>
<li>I don't think I moved the new files to the server, so March 1's article might not have been up yesterday. Oops sorry. <li> <li>I don't think I moved the new files to the server, so March 1's article might not have been up yesterday. Oops sorry. </li>
</ul> </ul>
<br> <br>
<h3>wednesday, march 3 </h3> <h3>wednesday, march 3 </h3>
<ul> <ul>
<li>The server's timezone is so different from mine. It's 5 A.M. there and 11 P.M. here. I guess it's not a big deal, but it's confusing to see my March 4 article already up. </li> <li>The server's timezone is so different from mine. It's 5 A.M. there and 11 P.M. here. I guess it's not a big deal, but it's confusing to see my March 4 article already up. </li>
<li>editted articles <li> <li>editted articles </li>
<li>Currently, the slime's state machine loop is to target, choose to attack, swing once, and decide whether to swing again. This means the attack speed is dependent on the AI's thinking speed. The physical act of attacking should be dependent on the character's body, not its mind. Instead, I want a pulse timer to determine the rate of swings. The body should be told to begin attacking, and the mind can tell it to stop. </li> <li>Currently, the slime's state machine loop is to target, choose to attack, swing once, and decide whether to swing again. This means the attack speed is dependent on the AI's thinking speed. The physical act of attacking should be dependent on the character's body, not its mind. Instead, I want a pulse timer to determine the rate of swings. The body should be told to begin attacking, and the mind can tell it to stop. </li>
<li>Instead of swinging, the character's attack method sets up a pulse timer with a wait time equal to the character's attack rate. (Later, it will be modified by the sum of attack-rate-modifying effects.) The swing method sends information back to the body + mind but will swinging on every timeout until told to stop. The stop method halts the timer. </li> <li>Instead of swinging, the character's attack method sets up a pulse timer with a wait time equal to the character's attack rate. (Later, it will be modified by the sum of attack-rate-modifying effects.) The swing method sends information back to the body + mind but will swinging on every timeout until told to stop. The stop method halts the timer. </li>
</ul> </ul>
@ -34,7 +34,7 @@ april 1, 2021<br>
<br> <br>
<h3>friday, march 5 </h3> <h3>friday, march 5 </h3>
<ul> <ul>
<li>Developed an RSS feed to blessfrey.me. It's served as a static file through Bottle right now. I wonder if that's okay. </li> <li>Developed an RSS feed for blessfrey.me's dev diary. It's served as a static file through Bottle right now. I wonder if that's okay. I'll need to test it later. </li>
</ul> </ul>
<br> <br>
<h3>saturday, march 6 </h3> <h3>saturday, march 6 </h3>
@ -43,7 +43,66 @@ april 1, 2021<br>
<li>I had an Old School RuneScape account under the official blessfrey email? lol why </li> <li>I had an Old School RuneScape account under the official blessfrey email? lol why </li>
<li>When I get a working version of Blessfrey that has all the current features together again, I'll upload it to blessfrey.me and itch.io. It'd be nice to just have something up at all, even if it's not so great. </li> <li>When I get a working version of Blessfrey that has all the current features together again, I'll upload it to blessfrey.me and itch.io. It'd be nice to just have something up at all, even if it's not so great. </li>
<li>I also should start seriously thinking about making videos, streams, podcasts, etc. I have lots of gamedev experience to draw from now that could make okay video essays + tutorials. I just...need to learn how to make videos. I wonder how much effort it would take to make one video a month? That wouldn't be a great gamedev channel, but just the idea of having videos sounds nice. Streaming would be easier once all the pretty scenes and channel art is set up. The format's better suited towards "watch me code"-style content, so I could probably stream more often than release videos. It's just awkward to explain what you're doing and make mistakes and read documentation live. </li> <li>I also should start seriously thinking about making videos, streams, podcasts, etc. I have lots of gamedev experience to draw from now that could make okay video essays + tutorials. I just...need to learn how to make videos. I wonder how much effort it would take to make one video a month? That wouldn't be a great gamedev channel, but just the idea of having videos sounds nice. Streaming would be easier once all the pretty scenes and channel art is set up. The format's better suited towards "watch me code"-style content, so I could probably stream more often than release videos. It's just awkward to explain what you're doing and make mistakes and read documentation live. </li>
<li>Too bad the little-bitty streaming sites never stay around for long - I prefer streaming on the smaller, more engaged communities than on Twitch or Youtube any day. Rest in peace. </li> <li>Too bad the little-bitty streaming sites never stay around for long - I prefer streaming on the smaller, more engaged communities than on Twitch or Youtube any day. Rest in peace, my favorite stream sites. </li>
<li>At the end of the day, I'm mostly looking to have fun. I don't really have anything I want to promote or sell right now, but I like talking to people about gamedev. </li> <li>At the end of the day, I'm mostly looking to have fun. I don't really have anything I want to promote or sell right now, but I like talking to people about gamedev. </li>
</ul> </ul>
<br> <br>
<h3>monday, march 8 </h3>
<ul>
<li>Working on the attack loop. (In Blessfrey, you begin weapon attacking and stop attacking, instead of having to spam attack input. Attack tick is determined by the equipped weapon + keyword modifiers applied to the attacker.) </li>
</ul>
<br>
<h3>friday, march 12 </h3>
<ul>
<li>Added a taskbox page to blessfrey.me. The HTML isn't working within the grid, and I probably want a grid per priority/completion level anyways, but it's fun to look at. </li>
<li>Updated some other pages. </li>
</ul>
<br>
<h3>saturday, march 13 </h3>
<ul>
<li>Attack loop is fixed. It yields in the proper places for the proper amount of time. The attacks communicate their results to the AI via signals. </li>
</ul>
<br>
<h3>sunday, march 14 - Pi Day </h3>
<ul>
<li>I mostly goofed off. I need to work on movement AI, patrol AI, equipment, barriers, teams, stats, and status effects before I can start working on the demo content. After movement + patrol AI are done, I'll release a playable snapshot on blessfrey.me.</li>
<li>For the movement AI, it would be easier to test with a static NPC. (My slime keeps running around + attacking.) So...I added a target dummy NPC. </li>
<li>He can take damage without dying and doesn't have an AI. He'll be more useful later if I can get him to calculate DPS, simulate different resistances, etc. For now, a boring old dummy is fine. </li>
</ul>
<br>
<h3>friday, march 19 </h3>
<ul>
<li>worked on RSS feed again</li>
<li>Looks like movement AI is good. Time for implementing a basic patrol for the slime. </li>
<li>I don't really know where to start with patrols. It's difficult. </li>
<li>I did something similar to patrol routes in the past. Time to look at <a href="https://docs.godotengine.org/en/stable/getting_started/step_by_step/your_first_game.html">Dodge the Creeps</a> again. (I did this tutorial the first day I installed Godot years ago.) </li>
<li>In DtC, monsters spawn from the edges of the screen. To do this, the <a href="https://docs.godotengine.org/en/stable/getting_started/step_by_step/your_first_game.html#spawning-mobs">tutorial</a> uses a <a href="https://docs.godotengine.org/en/stable/classes/class_path2d.html#class-path2d">Path2D</a> and a <a href="https://docs.godotengine.org/en/stable/classes/class_pathfollow2d.html#class-pathfollow2d">PathFollow2D</a>. </li>
</ul>
<br>
<h3>saturday, march 20 </h3>
<ul>
<li>Why am I worrying about making a pathfinding system so much when I already have one? The Knowledge Base can not only trigger an NPC to go to another point after reaching a certain point -- it can also allow the NPC's patrol to respond to triggers. So if an NPC is supposed to swap with another NPC but he never arrives at that point, the NPC can go searching for his buddy. </li>
</ul>
<br>
<h3>friday, march 26 </h3>
<ul>
<li>Added a "Forgot" feature to the KnowledgeBase to support cyclical events (like slime patrols) </li>
</ul>
<br>
<h3>saturday, march 27 </h3>
<ul>
<li>Added patrols to slime, but it doesn't work yet </li>
</ul>
<br>
<h3>sunday, march 28 </h3>
<ul>
<li>Game runs again. Maybe I need to refactor movement. </li>
</ul>
<br>
<h3>monday, march 29 </h3>
<ul>
<li>Refactored character movement. </li>
</ul>
<br>
Last Updated: April 2, 2021 <br>
<br>

@ -0,0 +1,56 @@
<!--210218,210107-->
<h1>a look into my achievement system </h1>
april 2, 2021<br>
#achievements #knowledgebase <br>
<br>
Designing an achievement system without any octopus tangles.<br>
<br>
<center><img src="/static/img/ent/KB_octopus.png" alt="(image: an illustration of an octopus tangling up UI, Dialog, and other game systems.)" width="500" height="396.75"></center> <br>
<br>
<h2>what does blessfrey consider an achievement? </h2><br>
<br>
An achievement is generally an objective used to create a metagame. They can vary in difficulty from an obscure discovery to repetitive use of mechanics to basic participation in the main story. Achievements can even be entirely external to the base game's system like <a href="https://steamcommunity.com/stats/221910/achievements">The Stanley Parable's "Go outside" achievement<a>, requiring you to not play for five years. Since achievements can be earned through any in-game system, the achievement system is closely tied to all other game systems. <br>
<br>
Completing an achievement usually awards a trophy, gamer points, or possibly something more practical, like a new game mode or an in-game item. <br>
<br>
Blessfrey feeds <i>every</i> in-game interaction through its achievement system, and its reward delivery is flexible enough not only to give a trophy but to cause <i>anything</i> to happen in response. Giving a trophy for finding a secret room is technically similar to gaining a Fire Resistance skill after standing on a bed of coals for 2 minutes or opening a new store after $1000 is spent at the mall. The only difference is actually notifying the player that an achievement was completed. Ironically, even though I ignore achievements in most games, Blessfrey's achievement system has become the backbone of player progression and world events. <br>
<br>
<br>
<h2>how to design an achievement system </h2><br>
<br>
Octopus-tangling is a major design concern for a system that is so interconnected with every other system. I could scatter achievement code through every other system, but that would be a problem if I ever need to make a fundamental change to the achievement system. Also, it will clutter the other systems if each system has a bunch of achievements tacked onto the bottom. <br>
<br>
Instead, Blessfrey's achievement system, the Knowledge Base, looks more like a mailman between game progress and the achievement system. A mailman Each granular action or world event that contributes to earning an achievement is called a piece of <b>knowledge</b>, which is identified by a <b>key</b> id number. Knowledge is categorized into <b>topics</b>. <b>Event handlers</b> subscribe to topics, waiting for news that a specific piece of knowledge has been encountered. The <b>Knowledge Base</b> itself stores all knowledge and facilitates the learning and forgetting of pieces of knowledge. Event handlers subscribed to the "knowledge_learned" topic will pay out awards. The <b>MessageBus</b> is the mailman that receives information about encountered knowledge and passes it off to all event handlers subscribed to that topic. The event handlers allow me to freely make and delete achievements, and the MessageBus keeps everything separate. <br>
<br>
<br>
<h2>an example</h2><br>
<br>
Let's say you get an achievement for finding the Nurse's Office. The moment the player loads into the Nurse's Office, data will zip back and forth between the MessageBus and the nurse's office object, different event handlers and the Knowledge Base. <br>
<br>
<ol>
<li>(Event Handler) At ready, event handlers call the MessageBus and subscribe to topics. </li>
<li>(Nurse's Office) The player enters the Nurse's Office. The room object sends itself to the MessageBus. </li>
<li>(MessageBus) Receives room object + sends it to all event handlers subscribed to the "place_entered" topic. </li>
<li>(Event Handler) NursesOfficeEntered receives room object. If the room is the Nurse's Office, send its corresponding knowledge key to the MessageBus. It can also verify pre-requisites and gather additional data for the Knowledge Base. This way, the system supports anything I'd like to track about when or how knowledge was learned. </li>
<li>(MessageBus) Receives the knowledge key + sends it to the Knowledge Base. </li>
<li>(Knowledge Base) Finds the knowledge identified by the incoming key. "Learns" by setting that knowledge to true and filling in additional fields if extra data was sent. Sends the knowledge key to the MessageBus. </li>
<li>(MessageBus) Receives the knowledge key + sends it to all "learned" event handlers. </li>
<li>(Event Handler) KnowledgeLearned receives the knowledge key + calls code for any changes resulting from learning this knowledge. Maybe you'll get a Steam achievement, but if the Knowledge Base was being to facilitate game progression, a quest could update, the dialog system could unlock the option to ask about the Nurse's Office, or you could gain a Codex entry about the new location. The changes can be conditional, too, so the handler can track whether all necessary keys have been received before enacting the change. </li>
</ol><br>
<br>
To use the achievement system for cyclical world events, you could trigger knowledge to be "forgotten" or ultimately set back to false in the Knowledge Base. This way, the phases of an event could begin anew. <br>
<br>
<br>
<h2>summary</h2><br>
<br>
Achievements can come from any combination of in-game actions, so an achievement system should be designed separately from the rest of the game. I achieve this through a couple of separate objects. <br>
<br>
<ul>
<li>Event Handlers: The tracking, verifying, and reward payout should be contained within event handlers, which can be generated and freed as needed. They subscribe to general topics and wait for their specific event to occur. </li>
<li>The Knowledge Base tracks the status of all knowledge in the game and can be used to understand how far the player and world have progressed. </li>
<li>The MessageBus is very light and only allows event handlers to subscribe to topics and for incoming message to be transmitted through that topic. It has absolutely no unique checks or code to execute, impartially delivering mail to the address on the envelope. </li>
<li>Another set of event handlers is concerned about the outcome of encountering and learning knowledge and can prompt changes or directly impact other systems, depending on pre-requisites met. </li>
<br>
<br>
Last updated April 2, 2021 <br>
<br>

@ -0,0 +1,37 @@
<!--210218,210107-->
<h1>designing a tutorial with bingo cards </h1>
april 15, 2021<br>
#gamedesign #tutorial<br>
<br>
Give your players more freedom during the tutorial by having them play bingo. <br>
<br>
<h2>what's bingo? </h2><br>
<br>
Bingo is a game where the player is given a card with a grid filled with random squares. Someone will call out squares, and the player will cover the called squares with tokens. The goal is to fill a line of squares with tokens: a diagonal, a horizontal, or a vertical. Sometimes the game is played until a full card is covered. Since each card has different squares, it's a game of chance. <br>
<br>
Bingo's a popular gambling game in America, but it can be modified into an educational game, too. My music class played spurts of classical music in lieu of calling squares, so we had to identify the instrument in order to cover squares. <br>
<br>
<br>
<h2>using bingo to design a videogame </h2><br>
<br>
I like the bingo board as a game world because there are multiple paths to winning the game. The design of the board strikes a nice balance between game designer choice and player choice. The player is free to choose their own board based on their own criteria, but the designer ensured each board is reasonably equal. There's no board with 24 B4 squares on it, for instance. <br>
<br>
This balance of freedom and control is great for something like a game tutorial. Usually, tutorials are set in extremely confined areas with strong limits on player exploration and choice. That's a good idea in theory because it will teach the player exactly what he needs to know at a pace that won't overwhelm him, but it's boring in practice. <br>
<br>
You can think of a traditional tutorial as a row of squares on a bingo card. The squares are probably something like "move forward," "talk to an NPC," "double jump," "equip gun," and "hit the bulls-eye." If that was only one line on the board and all the other lines were filled with similar objectives, the player has a little more freedom to choose their own tutorial. The designer retains control over what the player learns because he can ensure each line is reasonably equal in its ability to prepare the player for the real game. The designer loses control of the order in which tasks are completed, but it's guaranteed that the player finished a complete set of tasks. <br>
<br>
<h2>blessfrey bingo </h2><br>
<br>
<center><img src="/static/img/ent/blessfreybingo.png" alt="(image: a bingo card filled with game objectives like Visit Nurse's Office, Talk to Chloe, Win a Sparring Match, and Buy Cheese Crackers.)"></center> <br>
<br>
To play the main content in Blessfrey, the player needs to have basic knowledge of combat, dialog, different characters, and different areas on the map. There's also less vital information that the player should encounter quickly, like shopping, using phone apps, and randomized loot. So, almost every line has some basic combat, character interaction, and zone exploration. There's some more obscure tasks scattered around to hint at what kind of things are possible in the game. <br>
<br>
<h2>bingo and the players </h2><br>
<br>
If you physically present the full card to the players, they will respond differently. Completionists might want to cover the entire board before leaving the tutorial area, so it would be fun to reward them. 1 bingo is a ticket out of Tutorial Land, but there can be further rewards for additional bingos and a big prize for the full board. Speedrunners (any%) are going to figure out which path is the fastest and only take that one. Most players are probably going to explore at their own pace and complete the objectives that seem easy or cool, though. <br>
<br>
<h2>in closing </h2><br>
So long as the board and potential rewards are balanced, why not consider taking some inspiration from a bingo board when designing your tutorial? There doesn't have to be a literal board anywhere. The idea of alternate but equal paths to completing a tutorial already brings in more potential for player choice while retaining designer control. <br>
<br>
Last updated April 15, 2021 <br>
<br>

@ -0,0 +1,31 @@
<!--210401,210601-->
<h1>may 2020: AI</h1>
may 1, 2021<br>
<br>
<br>
<h2>week 1, april 1 - 3 </h2><br>
# <br>
<br>
<h3>thursday, april 1 - April Fool's Day </h3>
<ul>
<li>I got gnomed by a group leader, and FlightRising's rotated dragons made me think my graphics card was broken. I'm the April Fool. </li>
<li>To be fair, my graphics card did spark yesterday. It was scary. ;-; </li>
</ul>
<br>
<h3>friday, april 2 </h3>
<ul>
<li>maintained blessfrey.me. I like my website and it's starting to get a nice amount of content on it. I should do a graphics update sometime and make the diary and diary snippets pretty. I should at least choose my own color scheme instead of still using the first few colors <a href="https://coolors.co/">Coolors</a> gave me. </li>
</ul>
<br>
<h3>wednesday, april 13 </h3>
<ul>
<li>I've been writing and drawing a lot lately. </li>
<li>I feel more comfortable defining the mayor's character, which is great because she's a major antagonist. She's supposed to be somewhat close in age and maturity to the teen protagonists, despite being in control of a city. I like the idea of a manchild leader with a powerful artifact. Since I'm not necessarily comfortable with writing conflicts between her and the main characters as life-or-death maximum evil encounters, I've been coming up with other stakes for the cast. It should be more like my-valuables-at-risk maximum petty encounters. </li>
<li>I even have an idea what her name should be. Since the player's default name is Helia (a sun name), I want the mayor to have a moon name. Celeste and Selene feel overused in fantasy, so I was considering Chandra (is that too Hindi? It has a strong local association with the Chandra space mission + it sounds like the boomer name Shondra), Charon, Lunette, Dione, Liviana, and Mona... </li>
</ul>
<br>
<h3>thursday, april 14 </h3>
<ul>
<li>I'm partially vaccinated against COVID now. It hurts... More Americans are eligible for the vaccines, so maybe you can get one now, too. </li>
</ul>
<br>

@ -53,6 +53,7 @@ buried treasure
butter cake butter cake
butterfly woman butterfly woman
café café
cambion
camel camel
candlelight candlelight
candy store candy store
@ -74,6 +75,7 @@ chalcedony
chameleon chameleon
chamomile chamomile
chandelier chandelier
changeling
chant chant
charmeuse charmeuse
cheese bread cheese bread
@ -114,6 +116,7 @@ dark paradise
death's-head hawkmoth death's-head hawkmoth
deep space deep space
denarius denarius
dhampir
diadem diadem
Diana Diana
diorama diorama
@ -147,9 +150,9 @@ eternal youth
ettin ettin
evil twin evil twin
fable fable
falling leaves
fairy lights fairy lights
fairy ring fairy ring
falling leaves
faun faun
favored soul favored soul
feather feather
@ -199,16 +202,18 @@ guilty pleasure
hall of monuments hall of monuments
halo halo
hand of God hand of God
the hanged man The Hanged Man
hanging garden hanging garden
happy place happy place
haunted haunted
haunted house haunted house
headscarf headscarf
heart heart
hearth goddess
heather heather
hermit hermit
hermit crab hermit crab
hobgoblin
holly holly
holy grail holy grail
honeycomb honeycomb
@ -242,6 +247,7 @@ koi pond
La Belle Sans Merci La Belle Sans Merci
labyrinth labyrinth
lady cat lady cat
Lady Luck
Lady of Shallot Lady of Shallot
Lady of the Lake Lady of the Lake
lady in black lady in black
@ -323,6 +329,7 @@ muse
naga naga
necromancer necromancer
nectar nectar
Nephilim
nightlight nightlight
nightmare nightmare
nocturnality nocturnality
@ -512,6 +519,7 @@ water nymph
waterfall room waterfall room
waterlily waterlily
weeping willow weeping willow
Wheel of Fortune
Whip-Poor-Will Whip-Poor-Will
whisper whisper
white Christmas white Christmas

@ -11,7 +11,6 @@ def clean_tags(raw):
# RSS Generation # RSS Generation
def make_rss(): def make_rss():
loc = 'diary/entries/' loc = 'diary/entries/'
list_items(gather_and_sort(loc)[0:15])
info = {'items': list_items(gather_and_sort(loc)[0:15])} info = {'items': list_items(gather_and_sort(loc)[0:15])}
# Delete old version # Delete old version
@ -21,10 +20,13 @@ def clear_file(f_name):
os.remove(f_name) os.remove(f_name)
f = open(f_name, 'a+') f = open(f_name, 'a+')
def format_rss_time(date):
return datetime.datetime.strptime(date, '%y%m%d').strftime('%a') + ', ' + datetime.datetime.strptime(date, '%y%m%d').strftime('%d %b %Y') + " 05:00:05 GMT"
# Return list of items using list of articles # Return list of items using list of articles
def list_items(articles): def list_items(articles):
f_name = "static/xml/rss.xml" f_name = "static/xml/blessfrey.xml"
loc2 = 'https://www.blessfrey.me/' loc2 = 'https://www.blessfrey.me'
loc = 'diary/entries/' loc = 'diary/entries/'
loc3 = loc2 + loc loc3 = loc2 + loc
result = [] result = []
@ -47,19 +49,20 @@ def list_items(articles):
f.write("<rss version=\"2.0\">" + '\n') f.write("<rss version=\"2.0\">" + '\n')
f.write("<channel>" + '\n') f.write("<channel>" + '\n')
f.write("<title>blessfrey.me</title>" + '\n') f.write("<title>blessfrey.me</title>" + '\n')
f.write("<description>chimchooree's dev space</description>" + '\n')
f.write("<link>https://www.blessfrey.me/</link>" + '\n') f.write("<link>https://www.blessfrey.me/</link>" + '\n')
f.write("<description>chimchooree's dev space</description>" + '\n')
f.write("<language>en-us</language>" + '\n') f.write("<language>en-us</language>" + '\n')
f.write("<webMaster>chimchooree@mail.com</webMaster>" + '\n') f.write("<webMaster>chimchooree@mail.com (chimchooree)</webMaster>" + '\n')
for r in result: for r in result:
f.write("<item>" + '\n') f.write("<item>" + '\n')
f.write("<title>" + r[0] + "</title>" + '\n') f.write("<title>" + r[0] + "</title>" + '\n')
f.write("<link>" + loc3 + r[1] + "</link>" + '\n') f.write("<link>" + loc2 + r[1] + "</link>" + '\n')
f.write("<description>" + r[2] + "</description>" + '\n') f.write("<description>" + r[2] + "</description>" + '\n')
#f.write("<language>en-US</language>" + '\n') code = r[1].replace(loc,'')
f.write("<pubDate>" + "Mon, 22 Feb 2021 19:01 EST"+ "</pubDate>" + '\n')#r[3].replace('\n','') + "</pubDate>" + '\n') code = code.replace('/','')
#f.write("<dc:creator>chimchooree</dc:creator>" + '\n') f.write("<pubDate>" + format_rss_time(code) + "</pubDate>" + '\n')
f.write("<guid>" + loc2 + r[1] + "</guid>" + '\n')
f.write("</item>" + '\n') f.write("</item>" + '\n')
f.write("</channel>" + '\n') f.write("</channel>" + '\n')

@ -7,7 +7,7 @@ a {
text-decoration: none; text-decoration: none;
} }
ul { list-style-position: inside; } ul,ol { list-style-position: inside; }
.grid { .grid {
display: grid; display: grid;
@ -114,6 +114,7 @@ ul { list-style-position: inside; }
padding: 20px; padding: 20px;
margin-top: 40px; margin-top: 40px;
margin-bottom: 30px; margin-bottom: 30px;
word-wrap: break-word;
} }
.sidebar { .sidebar {

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>blessfrey.me</title>
<link>https://www.blessfrey.me/</link>
<description>chimchooree's dev space</description>
<language>en-us</language>
<webMaster>chimchooree@mail.com (chimchooree)</webMaster>
<item>
<title>designing a tutorial with bingo cards </title>
<link>https://www.blessfrey.me/diary/entries/210415</link>
<description>Give your players more freedom during the tutorial by having them play bingo. what's bingo? Bingo ... </description>
<pubDate>Thu, 15 Apr 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210415</guid>
</item>
<item>
<title>a look into my achievement system </title>
<link>https://www.blessfrey.me/diary/entries/210402</link>
<description>Designing an achievement system without any octopus tangles. what does blessfrey consider an ... </description>
<pubDate>Fri, 02 Apr 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210402</guid>
</item>
<item>
<title>march 2020: AI</title>
<link>https://www.blessfrey.me/diary/entries/210401</link>
<description>week 1, february 28 - march 6 #ai #webdev monday, march 1 I went on a walk for 3 hours. ... </description>
<pubDate>Thu, 01 Apr 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210401</guid>
</item>
<item>
<title>generating an RSS feed with python bottle</title>
<link>https://www.blessfrey.me/diary/entries/210318</link>
<description>After a few months of quietly running my blog as practice, I want to start sharing my articles with ... </description>
<pubDate>Thu, 18 Mar 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210318</guid>
</item>
<item>
<title>python writes my skills for me</title>
<link>https://www.blessfrey.me/diary/entries/210304</link>
<description>Similar to Magic: The Gathering cards, the functionality of my skills is composed of keywords. For ... </description>
<pubDate>Thu, 04 Mar 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210304</guid>
</item>
<item>
<title>february 2020: AI</title>
<link>https://www.blessfrey.me/diary/entries/210301</link>
<description>I just feel like rambling about games. week 1, february 1-6 #design #localization #writing tuesday, ... </description>
<pubDate>Mon, 01 Mar 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210301</guid>
</item>
<item>
<title>refactoring characters: black box </title>
<link>https://www.blessfrey.me/diary/entries/210218</link>
<description>The character script was one of blessfrey's first scripts. Since it's never seen a serious ... </description>
<pubDate>Thu, 18 Feb 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210218</guid>
</item>
<item>
<title>new year's resolution - making the most of 2021 </title>
<link>https://www.blessfrey.me/diary/entries/210204</link>
<description>Everyone had difficulties during 2020. A small part of that was losing my energy for programming ... </description>
<pubDate>Thu, 04 Feb 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210204</guid>
</item>
<item>
<title>january 2020: new year</title>
<link>https://www.blessfrey.me/diary/entries/210201</link>
<description>week 1, january 1-2 friday, january 1 - New Year's2020 is over. Things probably won't be ... </description>
<pubDate>Mon, 01 Feb 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210201</guid>
</item>
<item>
<title>web development resources</title>
<link>https://www.blessfrey.me/diary/entries/210121</link>
<description>I'll collect frequently used resources for web design here. CSS Grid Generator - build a ... </description>
<pubDate>Thu, 21 Jan 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210121</guid>
</item>
<item>
<title>inventory as a system diagram </title>
<link>https://www.blessfrey.me/diary/entries/210107</link>
<description>System diagrams illustrate how components interact within a system. It saves so much headache to ... </description>
<pubDate>Thu, 07 Jan 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210107</guid>
</item>
<item>
<title>december 2020: holiday season☆</title>
<link>https://www.blessfrey.me/diary/entries/210101</link>
<description>I didn't keep a diary very well this month;; This is mostly pieced together from my git history. I ... </description>
<pubDate>Fri, 01 Jan 2021 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/210101</guid>
</item>
<item>
<title>blessfrey graphic updates + mockups </title>
<link>https://www.blessfrey.me/diary/entries/201224</link>
<description>I iterate over the graphics periodically, so I can practice without worrying about polish. Here's ... </description>
<pubDate>Thu, 24 Dec 2020 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/201224</guid>
</item>
<item>
<title>common tropes from media </title>
<link>https://www.blessfrey.me/diary/entries/201210</link>
<description>I like collecting common tropes from games I play. Maybe it can it root out cliches? Or inspire ... </description>
<pubDate>Thu, 10 Dec 2020 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/201210</guid>
</item>
<item>
<title>november 2020: dear diary </title>
<link>https://www.blessfrey.me/diary/entries/201201</link>
<description>on topic Between the 8th and 15th, I wrote a Python script for generating Godot skill scenes from ... </description>
<pubDate>Tue, 01 Dec 2020 05:00:05 GMT</pubDate>
<guid>https://www.blessfrey.me/diary/entries/201201</guid>
</item>
</channel>
</rss>

@ -1,100 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>blessfrey.me</title>
<description>chimchooree's dev space</description>
<link>https://www.blessfrey.me/</link>
<language>en-us</language>
<webMaster>chimchooree@mail.com</webMaster>
<item>
<title>python writes my skills for me</title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/210304</link>
<description>Similar to Magic: The Gathering cards, the functionality of my skills is composed of keywords. For ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>february 2020: AI</title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/210301</link>
<description>I just feel like rambling about games. week 1, february 1-6 #design #localization #writing tuesday, ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>refactoring characters: black box </title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/210218</link>
<description>The character script was one of blessfrey's first scripts. Since it's never seen a serious ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>new year's resolution - making the most of 2021 </title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/210204</link>
<description>Everyone had difficulties during 2020. A small part of that was losing my energy for programming ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>january 2020: new year</title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/210201</link>
<description>week 1, january 1-2 friday, january 1 - New Year's2020 is over. Things probably won't be ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>web development resources</title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/210121</link>
<description>I'll collect frequently used resources for web design here. CSS Grid Generator - build a ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>inventory as a system diagram </title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/210107</link>
<description>System diagrams illustrate how components interact within a system. It saves so much headache to ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>december 2020: holiday season☆</title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/210101</link>
<description>I didn't keep a diary very well this month;; This is mostly pieced together from my git history. I ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>blessfrey graphic updates + mockups </title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/201224</link>
<description>I iterate over the graphics periodically, so I can practice without worrying about polish. Here's ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>common tropes from media </title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/201210</link>
<description>I like collecting common tropes from games I play. Maybe it can it root out cliches? Or inspire ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>november 2020: dear diary </title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/201201</link>
<description>on topic Between the 8th and 15th, I wrote a Python script for generating Godot skill scenes from ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>pretendOS - a game inspired by windows XP </title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/201126</link>
<description>Getting started with blessfrey's AI was overwhelming, so I took a break and worked on a new game. I ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>tidying up my skill phases </title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/201112</link>
<description>In Godot Engine, you can call methods from a parent class by prefixing it with a period (.). So to ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>october 2020: a blog that works</title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/201101</link>
<description>week 1 #bottle #python #regularexpression #website thursday, october 1 blessfrey.me's diary ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
<item>
<title>blessfrey in japanese </title>
<link>https://www.blessfrey.me/diary/entries//diary/entries/201029</link>
<description>Instead of hard-coding text, keep it in a spreadsheet instead. It's easier to organize, edit, and ... </description>
<pubDate>Mon, 22 Feb 2021 19:01 EST</pubDate>
</item>
</channel>
</rss>
Loading…
Cancel
Save