update; footer, gdd, style, planner

small-nav
chimchooree 2 years ago
parent 08e79978da
commit ffa56fde81

@ -30,7 +30,7 @@ def find_gallery(name):
gal = [name]
if name == "Abbey":
gal.append("FlightRising")
gal.append([["dragon.png","Abbey being lazy"], ["FlightRising.png","Abbey's sprite in FlightRising"],["BlackReshiram_Artfight.png","2022 Artfight attack by BlackReshiram"]])
gal.append([["dragon.png","lazy Abbey"], ["FlightRising.png","Abbey's sprite in FlightRising"],["BlackReshiram_Artfight.png","2022 Artfight attack by BlackReshiram"]])
if name == "Aloin":
gal.append("Sims")
gal.append([["alchemy.png","Morning alchemy before work"],["dream.jpg","Stupid dream bubbles"]])
@ -373,6 +373,8 @@ def curate_files(files):
# remove
clean = []
for f in files:
if f == '':
files.remove(f)
if is_it_time(f):
clean.append(f)
return clean
@ -391,6 +393,8 @@ def gather_and_sort(loc):
return sort_files(curate_files(gather_files(loc)))
def is_it_time(date):
if date == '':
return False
today = datetime.datetime.now()
today_string = today.strftime("%y") + today.strftime("%m") + today.strftime("%d")
return int(date) <= int(today_string)
@ -425,7 +429,7 @@ def error404(error):
return "unfortunately, a 404 error. the page you're searching for doesn't exist. (or is it just in hiding?) try another page! "
@error(500)
def error500(error):
return "unfortunately, a 500 error. something is wrong with the page you're trying to find, if it exists at all. try another page! <a href=https://www.blessfrey.me/>return to blessfrey.me.</a>"
return "unfortunately, a 500 error. something is wrong with the page you're trying to find, if it exists at all. try another page! <a href=/>return to blessfrey.me.</a>"
@error(502)
def error502(error):
return "unfortunately, a 502 error. this was likely due to website maintenance. usually it'll be back up before you finish reading this, but otherwise, I'll notice something's wrong soon! <a href=https://www.blessfrey.me/>return to blessfrey.me.</a>"
@ -458,25 +462,11 @@ def char(char_name):
TEMPLATE_PATH.insert(0, abs_views_path )
return template(os.path.join(abs_views_path,'char.tpl'), info)
# OCs Page
#@route('/characters')
#def characters():
# """characters"""
# info = {'css': 'me', 'title': 'about me', 'year': find_year(),
#'persona': ["Lune"],
#'blessfrey': ["Helia", "Angel", "Aries", "Bless", "Chloe", "Dia", "Night", "Rune", "Tessa", "WISE"],
#'lemonland': ["CustomsOffice","BlessTheChild"],
#'cw': ["Cass", "Funwa", "Tilhar", "HOME", "Chandra", "Colt", "Lisbet", "Freefall", "Trace", "Window", "Dymn", "Newcomer"],
#'rp': ["Abbey", "Calder", "Helba", "Silke", "Nephele"],
#'games': ["Aloin", "Bijoux", "Fifi", "Faber", "Helmut", "Tilly"],
#'mmos': ["Belfry", "CatMan", "Pixie", "Aristen", "Chimchooree", "Leslie"]}
# return template('characters.tpl', info)
# Blessfrey Credits Page
@route('/credits')
def credits():
"""credits"""
info = {'css': 'credits', 'title': 'blessfrey credits', 'year': find_year()}
info = {'css': 'doc', 'title': 'blessfrey credits', 'year': find_year()}
return template('credits.tpl', info)
# Blessfrey Demo Page
@ -486,6 +476,13 @@ def demo():
info = {'css': 'demo', 'title': 'blessfrey demo', 'year': find_year()}
return template('demo.tpl', info)
# Blessfrey Presskit Page
@route('/blessfrey-gdd')
def gdd():
"""Game Design Document"""
info = {'css': 'gdd', 'title': 'blessfrey gdd', 'year': find_year()}
return template('bf-gdd.tpl', info)
# Diary Page
@route('/diary') # Start on first Diary page if no page given
def diary2():
@ -508,7 +505,7 @@ def entry(page):
if not is_it_time(page):
return error404(404)
loc = 'diary/entries/'
info = {'css': 'entry', 'title': 'blessfrey - developer diary', 'year': find_year(), 'entry': prepare_diary_entry(page, loc), 'recommends': list_rec(page), 'articles': "Articles", 'latest': list_headlines(gather_and_sort(loc)[0:5]), 'tags': fill_word_cloud(curate_files(gather_files(loc))), 'page': page}
info = {'css': 'entry', 'title': 'blessfrey developer diary', 'year': find_year(), 'entry': prepare_diary_entry(page, loc), 'recommends': list_rec(page), 'articles': "Articles", 'latest': list_headlines(gather_and_sort(loc)[0:5]), 'tags': fill_word_cloud(curate_files(gather_files(loc))), 'page': page}
abs_app_dir_path = os.path.dirname(os.path.realpath(__file__))
abs_views_path = os.path.join(abs_app_dir_path, 'views')
TEMPLATE_PATH.insert(0, abs_views_path )
@ -521,6 +518,13 @@ def fashion():
info = {'css': 'fashion', 'title': 'blessfrey fashion', 'year': find_year()}
return template('fashion.tpl', info)
# Blessfrey Game Design Document Page
@route('/gdd')
def gdd():
"""game design document"""
info = {'css': 'doc', 'title': 'blessfrey game design document', 'year': find_year()}
return template('bf-gdd.tpl', info)
# Home Page - Index Template
@route('/')
def home():
@ -536,19 +540,33 @@ def me():
info = {'css': 'me', 'title': 'about me', 'year': find_year()}
return template('me.tpl', info)
# Blessfrey Feature Requirements Page
@route('/milestones')
def milestones():
"""feature requirements"""
info = {'css': 'doc', 'title': 'blessfrey milestones', 'year': find_year()}
return template('requirements.tpl', info)
# Planner Page
@route('/planner')
def planner():
"""planner"""
info = {'css': 'doc', 'title': 'personal planner', 'year': find_year()}
return template('planner.tpl', info)
# Blessfrey Presskit Page
@route('/blessfrey-presskit')
def presskit():
"""presskit"""
info = {'css': 'presskit', 'title': 'blessfrey presskit', 'year': find_year()}
info = {'css': 'doc', 'title': 'blessfrey presskit', 'year': find_year()}
return template('blessfrey-presskit.tpl', info)
# Blessfrey Requirements Page
@route('/milestones')
def req():
"""requirements"""
info = {'css': 'req', 'title': 'blessfrey milestones', 'year': find_year()}
return template('requirements.tpl', info)
# Blessfrey Style Guide Page
@route('/style')
def style():
"""style guide"""
info = {'css': 'doc', 'title': 'blessfrey style guide', 'year': find_year()}
return template('style-guide.tpl', info)
# Search Diary by Tag
@route('/diary/tag/<tagin>') # Start on first Diary tag page if no page given
@ -560,9 +578,16 @@ def tag(tagin, page):
loc = 'diary/entries/'
assert isinstance(tagin, str)
assert isinstance(page, int)
info = {'css': 'diary', 'title': 'blessfrey - developer diary', 'year': find_year(), 'snippets': list_snippets(pull_tag(gather_and_sort(loc), tagin)), 'latest': list_headlines(gather_and_sort(loc)[0:5]), 'tags': fill_word_cloud(curate_files(gather_files(loc))), 'total': len(curate_files(gather_files(loc))), 'limit': 8, 'cluster': 3, 'page': page}
info = {'css': 'diary', 'title': 'blessfrey developer diary', 'year': find_year(), 'snippets': list_snippets(pull_tag(gather_and_sort(loc), tagin)), 'latest': list_headlines(gather_and_sort(loc)[0:5]), 'tags': fill_word_cloud(curate_files(gather_files(loc))), 'total': len(curate_files(gather_files(loc))), 'limit': 8, 'cluster': 3, 'page': page}
return template('diary.tpl', info)
# GDD Pages
@route('/vibe')
def vibe():
"""GDD Page"""
info = {'css': 'doc', 'title': 'blessfrey gdd - vibe', 'year': find_year()}
return template('vibe.tpl', info)
## Main ##
if __name__ == '__main__':

@ -42,9 +42,13 @@ h1,h2,h3,h4,img,i {
background-color: transparent;
}
.mundane {color:#aca79e;}
.common {color:#5576d1;}
.unusual {color:#9873AC;}
.rare {color:#EBBC4E;}
.unique {color:#00a86b;}
.center {
width: 60%;
width: 80%;
padding: 2em;
margin: auto;
color: white;

@ -0,0 +1,6 @@
.content-grid {
grid-area: 3 / 1 / 4 / 4;
color: white;
width: 80%;
margin: auto;
}

@ -16,7 +16,7 @@
.content-right {
grid-area: 1 / 2 / 3 / 3;
background-image: url(../img/prom/runebless.png);
background-size: contain;/*80% auto;*/
background-size: contain;
background-repeat: no-repeat;
background-position: left;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

@ -0,0 +1,22 @@
% import random
% rebase('frame.tpl')
<div class="content-grid"><div class="center">
<h1>blessfrey game design document </h1>
<p>The vision for Blessfrey <br></p>
<br>
<ul>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/vibe>art direction</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/blessfrey-cast>characters</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/credits>credits</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/entities>entities</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/jobs>jobs</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/keywords>music</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/milestones>milestones</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/music>music</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/setting>setting</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/skills>skills</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/story>story</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/style>style guide</a></li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<a href=/terms>terms</a></li>
</ul>
</div></div>

@ -46,8 +46,7 @@ The dual-class and skill systems are inspired by Guild Wars 1 and Magic: The Gat
<div class="textbox dev">
<h2>Developer </h2>
<br>
Chimchooree has a programming and art background, studying both in school and at home since she was a kid. Her five favorite games are Oblivion (more as a hobby horse to endlessly write mods for than a game), Guild Wars 1, Arcanum, Divine Divinity, and Anachronox. Keep up with her activity on her <a href="/diary">dev diary</a> and <a href="https://twitter.com/lilchimchooree">Twitter</a>. <br>
Chimchooree has a programming and art background, studying both in school and at home since she was a kid. Her five favorite games are Oblivion, Guild Wars 1, Arcanum, Divine Divinity, and Anachronox. Keep up with her activity on her <a href="/diary">dev diary</a> and <a href="https://twitter.com/lilchimchooree">Twitter</a>. <br>
</div>
<div class="textbox videos"> </div>
@ -56,14 +55,10 @@ The dual-class and skill systems are inspired by Guild Wars 1 and Magic: The Gat
<h2>Graphics</h2>
<br>
<img src="/static/img/prom/BlessFREY_logo.png" alt="(link: BLESSFREY" class="logo"><br>
<a target="_blank" href="/static/img/prom/godotengine.png">
<img src="/static/img/prom/godotengine.png" alt="(image: screenshot of the godot editor">
</a><br>
</div>
<div class="textbox contact">
<h2>Contact</h2>
<br>
Please message me on <a href="https://twitter.com/lilchimchooree">Twitter (@lilchimchooree) or Discord (CustomsOfficer#3449)</a>.
</div>
@ -80,7 +75,6 @@ The dual-class and skill systems are inspired by Guild Wars 1 and Magic: The Gat
<div class="textbox permissions">
<h2>Permission</h2>
<br>
Freely use all of the content on this page, even for commercial use, at your own risk. <br>
</div>
</div>

@ -1,4 +1,5 @@
% import random
<!--Footer-->
<footer>
&#169; chimchooree 2020-{{year}}<br>
<a href=/milestones>milestones</a> {{random.choice(['.','•','☆','★'])}} <a href=/gdd>game design document</a> {{random.choice(['.','•','☆','★'])}} <a href=/blessfrey-presskit>presskit</a> {{random.choice(['.','•','☆','★'])}} &#169; chimchooree 2020-{{year}}<br>
</footer>

@ -0,0 +1,105 @@
% rebase('frame.tpl')
<div class="content-grid">
<h1>blessfrey game design document </h1>
<p>Follow this style guide to avoid confusing bugs. Code doesn't always need to
follow the style guide, but a comment needs to be left by the offending code
explaining why it's necessary. The guide is not set in stone, and can be
disputed and altered. <br></p>
<br>
<p>(many parts written by my husband) <br></p>
<br>
<h2>node paths </h2>
<p>Node paths should be treated as though they have private access. Any node
within a scene can be thought of as within scope of that scene. Nodes higher in
the tree or inside instanced scenes are out of scope of the current scene.
However, the root of an instanced scene is within scope, so a path to that is
safe. Using an "out of scope" node path will result in null pointer exceptions
at best or confusing bugs at worse if a scene's structure is ever altered. <br></p>
<br>
<p>Add methods to the root of a scene that does whatever is needed to the nodes
inside. <br></p>
<br>
<p>If a property is needed from a node inside a scene, a getter in the
scene's root can return the value its child node's property. (see Setters and
Getters) <br></p>
<br>
<ul>
<li>don't use node paths to nodes higher than the scene's root </li>
<li>don't use node paths into instanced scenes </li>
<li>do add methods to the root of a scene that manipulates the inner nodes </li>
</ul>
<h2>child nodes </h2>
<p>It's fair for a script to depend on a consistent internal tree structure.
Only scripts inside a scene may alter the structure of its own tree. The tree's
structre is primarily altered by adding or removing children. Adding or
removing child nodes higer than the scene's root, or inside instanced scenes,
will cause inconsistent structure. Without this guideline, each scene would
need to constantly validate its own structure to be sure it hasn't been altered
by another script. <br></p>
<br>
<p>Add methods to the root of a scene that can add or remove children. These
methods can keep track of which nodes have been added or removed, so the
script can be aware of any changes to the scene's structure. <br></p>
<br>
<ul>
<li>don't add child nodes to nodes higher than the scene's root </li>
<li>don't add child nodes to instanced scenes </li>
<li>do add methods to the root of a scene for adding or removing children </li>
</ul>
<h2>setters + getters </h2>
<p>Often, some action always needs to be taken whenever a variable is changed.
Putting these actions in a setter method for that variable ensure that they're
always executed. If a setter is not made for a variable, there's some risk
that it may be changed without those actions being taken, and the source of
the change may be difficult to track. <br></p>
<br>
<p>Furthermore, a variable may not exist at all, but be derived from some
computation. In that case, a getter can create the illusion of a single
variable. <br></p>
<br>
<p>One more benifit, is that a setter can be deferred called or connected to a
signal, since its a method. <br></p>
<br>
<p>Variables can be changed to use getters and setters seamlessly, since they're
used no differently from variables that don't have getters and setters. If
there is a need to take some action whenever a value is set, a setter can be
added to it seamlessly. <br></p>
<br>
<ul>
<li>setters can execute any action when a property is changed </li>
<li>setters can be added seamlessly, without changing how the property is set </li>
</ul>
<h2>serialization </h2>
<p> <br></p>
<br>
<ul>
<li> </li>
</ul>
<h2>translations </h2>
<p>add a fake language from the start <br></p>
<br>
<ul>
<li> </li>
</ul>
<h2>documentation </h2>
<p> <br></p>
<br>
<ul>
<li> </li>
</ul>
<h2>time </h2>
<p>pausing <br></p>
<p>time control (every variable affected by time must be modified by time control) <br></p>
<p>decouple drawing and logic <br></p>
<br>
<ul>
<li> </li>
</ul>
<h2>moddability </h2>
<p>Commonly, this means making a base, then loading in the game as a mod. The content is written in a light scripting language, and it's best if I use the same API/tools a modder would. <br></p>
<br>
<ul>
<li> </li>
</ul>
</div>

@ -1,42 +0,0 @@
<h2>0.25 - foundation </h2>
<ul>
<li><span class=mundane></span> </li>
</ul>
<h2>0.5 - chapter 1 </h2>
<ul>
<li><span class=mundane>intro cutscene</span> </li>
<li><span class=mundane>quest: Angel's welcome </span> </li>
<li><span class=mundane>zone: Uncle's house</span> </li>
<li><span class=mundane>quest: Angel sleepover</span> </li>
<li><span class=mundane>zone: Tidwell's house</span> </li>
<li><span class=mundane>quest: first last day of school</span> </li>
<li><span class=mundane>quest: mingle & bingo</span> </li>
<li><span class=mundane>quest: do you dare? OR lost and found</span> </li>
<li><span class=mundane>location: school - classroom, hallway, principal's office, supply room, restrooms, playground, courtyard (space used as auditorium)</span> </li>
<li><span class=mundane>boss: Aries</span> </li>
<li><span class=mundane>quest: haunted sleepover OR lost and found</span> </li>
<li><span class=mundane>zone: haunted theatre OR security HQ + security tunnels</span> </li>
<li><span class=mundane>boss: slime</span> </li>
<li><span class=mundane>quest: sinkhole appears</span> </li>
<li><span class=mundane>zone: wilds buffer</span> </li>
<li><span class=mundane>boss: Rune & Bless</span> </li>
<li><span class=mundane>entity: destructible terrain</span> </li>
<li><span class=mundane>zone: slime kingdom</span> </li>
<li><span class=mundane>boss: slime king</span> </li>
<li><span class=mundane>zone: Santa's factory</span> </li>
<li><span class=mundane>boss: Dia</span> </li>
<li><span class=mundane>zone: holding cell, local security HQ</span> </li>
<li><span class=mundane>quest: freedom - parents come retrieve their children and apologize. no one comes for Helia, so eventually Ray comes over and lets her out himself. </span> </li>
<li><span class=mundane>zone: Lucrest shopping center - Mayor's Mansion, gym, apothecary, library, QuestionMart, sporting goods, clothing store, theatre, arcade, cable company, atelier, woks, cafe, photobooth, stage, gondolier, carousel, splash sidewalk, piano sidewalk (look at Disney World for fun sidewalk ideas) </span> </li>
<li><span class=mundane>zone: Lucrest residential zone - uncle's, Tidwell's, McIntyre's, St Martin's, playground, walking trail</span> </li>
<li><span class=mundane>zone: Lucrest - church</span> </li>
<li><span class=mundane>zone: woods - secret grove, waterfall room</span> </li>
<li><span class=mundane>zone: lake - fishing pier, fishing shop</span> </li>
<li><span class=mundane>zone: botanical gardens</span> </li>
<li><span class=mundane>boss: brood mother</span> </li>
<li><span class=mundane>boss: gator</span> </li>
<li><span class=mundane>entity: training dummy - tells you your DPS, inflicted keywords, etc</span> </li>
<li><span class=mundane>character routines, idles</span> </li>
<li><span class=mundane>Lucrest sidequests</span> </li>
<li><span class=mundane>quest: keep going! (text from Tessa to suit up and train)</span> </li>
</ul>

@ -0,0 +1,64 @@
% rebase('frame.tpl')
<div class="content-grid">
<h1>planner </h1>
<p>Stuff I need to do. <br></p>
<br>
<h2>daily</h2>
<ul>
<li>Bible reading </li>
<li>devotional reading </li>
<li>skincare </li>
<li>Japanese flashcards </li>
</ul>
<br>
<h2>quarterly </h2>
<ul>
<li>get the house painted </li>
<li>buy some furniture - filing cabinet, desk, chair for bedroom, chair for living room, chairs for table </li>
<li>decorate - cover table in bedroom </li>
<li>buy a vacuum cleaner </li>
<li>hang up pegboard, towel rack </li>
<li>replace all the doorstops, add ones to doors that don't have one </li>
</ul>
<br>
<h2>MWF - 10 | 11 | 12 | 1 | 2 | 3 | 4 </h2>
<ul>
<li>exercise </li>
<li>Bible/Dev </li>
<li>online class #1 + breakfast </li>
<li>Tae Kim </li>
<li>translate I Make Clothes </li>
<li>Bulfinch's or The Language of Creation </li>
<li>Blessfrey </li>
<li>play Culpa Innata </li>
<li>skincare </li>
</ul>
<br>
<h2>TTH - 9 | 11 | 1 | 3 | 5 </h2>
<ul>
<li>Bible/Dev </li>
<li>online class #2 + breakfast</li>
<li>translate Houseki no Kuni </li>
<li>drawing </li>
<li>work on bomber jacket </li>
<li>update website </li>
<li>HNHN </li>
<li>Etidorhpa </li>
<li>house chores </li>
<li>skincare </li>
</ul>
</div>
<h2>moocs </h2>
<ul>
<li>Bible/Dev </li>
<li>online class #2 + breakfast</li>
<li>translate Houseki no Kuni </li>
<li>drawing </li>
<li>work on bomber jacket </li>
<li>update website </li>
<li>HNHN </li>
<li>Etidorhpa </li>
<li>house chores </li>
<li>skincare </li>
</ul>
</div>

@ -1,7 +1,7 @@
% import random
% rebase('frame.tpl')
<div class="content-grid">
<div class="">
<h1>release requirements </h1>
<div class="content-grid">
<h1>blessfrey milestones </h1>
<p>This is a list of everything I need to add before the Blessfrey is complete. I can add more in subsequent updates, but I have to draw the line somewhere. The list is broken into versions. <br></p>
<br>
<p>Focus and finish the game! <br></p>
@ -9,228 +9,222 @@
<p>Legend: <span class=mundane>nothing at all</span>, <span class=common>designed</span>, <span class=unusual>basic implementation</span>, <span class=rare>intentionally designed, tested</span>, <span class=unique>more or less finalized</span>
<h2><span class=unique>0.0 - first</span> </h2>
<ul>
<li><span class=unusual>feature: export, embed</span> </li>
<li><span class=mundane></span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>feature: export, embed</span> </li>
</ul>
<h2><b>0.1 - bingo</b> </h2>
<h2><b><span class=unusual>0.1 - bingo</span></b> </h2>
<ul>
<li><span class=rare>feature: KnowledgeBase - achievements, progression </li>
<li><span class=common>~70 new skills</span> </li>
<li><span class=unusual>solid, extendable base for skills, keywords, skill equips, DMVs</span> </li>
<li><span class=unusual>ignore input during main menu, etc</span> </li>
<li><span class=unusual>basic dialog</span> </li>
<li><span class=unusual>basic serialization - save, load, config</span> </li>
<li><span class=unusual>basic pathfinding</span> </li>
<li><span class=unusual>basic obstructions - walls</span> </li>
<li><span class=unusual>basic AI - states, transitions</span> </li>
<li><span class=unusual>basic combat - life, spirit, attacks, skills, hitbox, aggro</span> </li>
<li><span class=unusual>basic UI - start screen, controls screen, credits screen</span> </li>
<li><span class=mundane>basic audio - BGM, attack SFX, skill SFX, ambience</span> </li>
<li><span class=unusual>basic audio adjustments - volume slider, mute button</span> </li>
<li><span class=mundane>pause button</span> </li>
<li><span class=unusual>activator - button, switch</span> </li>
<li><span class=unusual>item pickup</span> </li>
<li><span class=unusual>inventory</span> </li>
<li><span class=unusual>interact - character, container</span> </li>
<li><span class=unusual>containers</span> </li>
<li><span class=unusual>travel between rooms</span> </li>
<li><span class=unusual>drop items</span> </li>
<li><span class=unusual>inspect</span> </li>
<li><span class=unusual>spawnpoints</span> </li>
<li><span class=unusual>XP, levels</span> </li>
<li><span class=unusual>skillbar - drag & drop, enforces deckbuilding rules</span> </li>
<li><span class=unusual>attack loop</span> </li>
<li><span class=mundane>skill use - out of range, cancel</span> </li>
<li><span class=mundane>learning skills</span> </li>
<li><span class=mundane>room skills</span> </li>
<li><span class=unusual>life/spirit regen</span> </li>
<li><span class=mundane>multiple idle animations</span> </li>
<li><span class=mundane>idle barks - contextual, story-based, character relationship-based</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=rare>feature: KnowledgeBase - achievements, progression </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=common>~70 new skills</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>solid, extendable base for skills, keywords, skill equips, DMVs</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>ignore input during main menu, etc</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>basic dialog</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>basic serialization - save, load, config</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>basic pathfinding</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>basic obstructions - walls</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>basic AI - states, transitions</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>basic combat - life, spirit, attacks, skills, hitbox, aggro</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>basic UI - start screen, controls screen, credits screen</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>basic audio - BGM, attack SFX, skill SFX, ambience</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>basic audio adjustments - volume slider, mute button</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>pause button</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>activator - button, switch</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>item pickup</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>inventory</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>interact - character, container</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>containers</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>travel between rooms</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>drop items</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>inspect</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>spawnpoints</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>XP, levels</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>skillbar - drag & drop, enforces deckbuilding rules</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>attack loop</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>skill use - out of range, cancel</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>learning skills</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>room skills</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>life/spirit regen</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>multiple idle animations</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>idle barks - contextual, story-based, character relationship-based</span> </li>
</ul>
<h2>0.11 - AI factions </h2>
<h2><span class=mundane>0.11 - AI factions</span> </h2>
<ul>
<li><span class=mundane>feature: factions - disposition towards other factions</span> </li>
<li><span class=unusual>pathfinding</span> </li>
<li><span class=mundane>teams</span> </li>
<li><span class=unusual>death</span> </li>
<li><span class=unusual>drop tables</span> </li>
<li><span class=mundane>item rarity</span> </li>
<li><span class=mundane>flocking</span> </li>
<li><span class=unusual>idle, wander</span> </li>
<li><span class=unusual>patrol routes</span> </li>
<li><span class=unusual>aggro range</span> </li>
<li><span class=unusual>targeting, prioritization</span> </li>
<li><span class=mundane>skill use prioritization</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>feature: factions - disposition towards other factions</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>pathfinding</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>teams</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>death</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>drop tables</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>item rarity</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>flocking</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>idle, wander</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>patrol routes</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>aggro range</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>targeting, prioritization</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>skill use prioritization</span> </li>
</ul>
<h2>0.12 - boss fight </h2>
<h2><span class=mundane>0.12 - boss fight</span> </h2>
<ul>
<li><span class=mundane>feature: multiphase, dynamic boss</span> </li>
<li><span class=unusual>obstacles - impermeable walls, permeable walls, opaque walls, transparent walls, destructible walls</span> </li>
<li><span class=mundane>boss splash screen</span> </li>
<li><span class=mundane>cutscene-like scripting</span> </li>
<li><span class=mundane>resurrection</span> </li>
<li><span class=unusual>projectiles</span> </li>
<li><span class=mundane>only change skill in noncombat rooms</span> </li>
<li><span class=mundane>interrupt</span> </li>
<li><span class=mundane>items - use to impart keywords</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>feature: multiphase, dynamic boss</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>obstacles - impermeable walls, permeable walls, opaque walls, transparent walls, destructible walls</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>boss splash screen</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>cutscene-like scripting</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>resurrection</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>projectiles</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>only change skill in noncombat rooms</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>interrupt</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>items - use to impart keywords</span> </li>
</ul>
<h2>0.13 - job </h2>
<h2><span class=mundane>0.13 - job</span> </h2>
<ul>
<li><span class=mundane>feature: 3 basic jobs</span> </li>
<li><span class=mundane>side jobs</span> </li>
<li><span class=mundane>changing side job</span> </li>
<li><span class=mundane>stats - impact skills</span> </li>
<li><span class=mundane>perks - impact character</span> </li>
<li><span class=mundane>gear - impact incoming keywords</span> </li>
<li><span class=mundane>weapons - impact outgoing keywords</span> </li>
<li><span class=mundane>environmental weaponry</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>feature: 3 basic jobs</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>side jobs</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>changing side job</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>stats - impact skills</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>perks - impact character</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>gear - impact incoming keywords</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>weapons - impact outgoing keywords</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>environmental weaponry</span> </li>
</ul>
<h2>0.14 - UI </h2>
<h2><span class=mundane>0.14 - UI</span> </h2>
<ul>
<li><span class=unusual>feature: phone</span> </li>
<li><span class=mundane>codex app</span> </li>
<li><span class=mundane>messenging app</span> </li>
<li><span class=unusual>inventory app</span> </li>
<li><span class=unusual>music app</span> </li>
<li><span class=mundane>settings app</span> </li>
<li><span class=unusual>app store</span> </li>
<li><span class=mundane>store page, functionality</span> </li>
<li><span class=mundane>store sales, promotions</span> </li>
<li><span class=mundane>pop-up notifications, tool tips</span> </li>
<li><span class=unusual>skill library, skillbar</span> </li>
<li><span class=mundane>skill library - sort by job, classifications, alphabetical, order obtained, frequency of use</span> </li>
<li><span class=unusual>containers</span> </li>
<li><span class=unusual>highlight</span> </li>
<li><span class=unusual>main menu, submenus</span> </li>
<li><span class=unusual>inspect menu</span> </li>
<li><span class=mundane>forms, questionnaires, homework sheets</span> </li>
<li><span class=mundane>iron out canvas layer layers</span> </li>
<li><span class=mundane>dialog - name, rich text, emoticons, options, </span> </li>
<li><span class=mundane>dialog portraits</span> </li>
<li><span class=mundane>all text ready for translation</span> </li>
<li><span class=mundane>titles related to KnowledgeBase</span> </li>
<li><span class=mundane>custom cursors</span> </li>
<li><span class=mundane>custom font</span> </li>
<li><span class=mundane>applied keywords</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>feature: phone</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>codex app</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>messenging app</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>inventory app</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>music app</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>settings app</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>app store</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>store page, functionality</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>store sales, promotions</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>pop-up notifications, tool tips</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>skill library, skillbar</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>skill library - sort by job, classifications, alphabetical, order obtained, frequency of use</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>containers</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>highlight</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>main menu, submenus</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>inspect menu</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>forms, questionnaires, homework sheets</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>iron out canvas layer layers</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>dialog - name, rich text, emoticons, options, </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>dialog portraits</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>all text ready for translation</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>titles related to KnowledgeBase</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>custom cursors</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>custom font</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>applied keywords</span> </li>
</ul>
<h2>0.25 - foundation </h2>
<h2><span class=mundane>0.25 - foundation</span> </h2>
<ul>
<li><span class=mundane></span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>destructible terrain that requires specific keywords - slash or burn webs</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>disposition, affinity system</span> </li>
</ul>
<h2>0.5 - chapter 1 </h2>
<h2><span class=mundane>0.5 - chapter 1</span> </h2>
<ul>
<li><span class=mundane>intro cutscene</span> </li>
<li><span class=mundane>quest: Angel's welcome </span> </li>
<li><span class=mundane>zone: Uncle's house</span> </li>
<li><span class=mundane>quest: Angel sleepover</span> </li>
<li><span class=mundane>zone: Tidwell's house</span> </li>
<li><span class=mundane>quest: first last day of school, welcome party</span> </li>
<li><span class=mundane>quest: mingle & bingo</span> </li>
<li><span class=mundane>quest: do you dare? OR lost and found</span> </li>
<li><span class=mundane>location: school - classroom, hallway, principal's office, supply room, restrooms, playground, courtyard (space used as auditorium)</span> </li>
<li><span class=mundane>boss: Aries</span> </li>
<li><span class=mundane>quest: haunted sleepover OR lost and found</span> </li>
<li><span class=mundane>zone: haunted theatre OR security HQ + security tunnels</span> </li>
<li><span class=mundane>boss: slime</span> </li>
<li><span class=mundane>quest: sinkhole appears</span> </li>
<li><span class=mundane>zone: wilds buffer</span> </li>
<li><span class=mundane>boss: Rune & Bless</span> </li>
<li><span class=mundane>entity: destructible terrain</span> </li>
<li><span class=mundane>zone: slime kingdom</span> </li>
<li><span class=mundane>boss: slime king</span> </li>
<li><span class=mundane>zone: Santa's factory</span> </li>
<li><span class=mundane>boss: Dia</span> </li>
<li><span class=mundane>zone: holding cell, local security HQ</span> </li>
<li><span class=mundane>quest: freedom - parents come retrieve their children and apologize. no one comes for Helia, so eventually Ray comes over and lets her out himself. </span> </li>
<li><span class=mundane>zone: Lucrest shopping center - Mayor's Mansion, gym, apothecary, library, QuestionMart, sporting goods, clothing store, theatre, arcade, cable company, atelier, woks, cafe, photobooth, stage, gondolier, carousel, splash sidewalk, piano sidewalk (look at Disney World for fun sidewalk ideas) </span> </li>
<li><span class=mundane>zone: Lucrest residential zone - uncle's, Tidwell's, McIntyre's, St Martin's, playground, walking trail</span> </li>
<li><span class=mundane>zone: Lucrest - church</span> </li>
<li><span class=mundane>zone: woods - secret grove, waterfall room</span> </li>
<li><span class=mundane>zone: lake - fishing pier, fishing shop</span> </li>
<li><span class=mundane>zone: botanical gardens</span> </li>
<li><span class=mundane>boss: brood mother</span> </li>
<li><span class=mundane>boss: gator</span> </li>
<li><span class=mundane>entity: training dummy - tells you your DPS, inflicted keywords, etc</span> </li>
<li><span class=mundane>character routines, idles</span> </li>
<li><span class=mundane>Lucrest sidequests</span> </li>
<li><span class=mundane>quest: keep going! (text from Tessa to suit up and train)</span> </li>
<li><span class=mundane>zone: Eden's threshold</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>intro cutscene</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>quest: Angel's welcome </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: Uncle's house</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>quest: Angel sleepover</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: Tidwell's house</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>quest: first last day of school, welcome party</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>quest: mingle & bingo</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>quest: do you dare? OR lost and found</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>location: school - classroom, hallway, principal's office, supply room, restrooms, playground, courtyard (space used as auditorium)</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>boss: Aries</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>quest: haunted sleepover OR lost and found</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: haunted theatre OR security HQ + security tunnels</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>boss: slime</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>quest: sinkhole appears</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: wilds buffer</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>boss: Rune & Bless</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>entity: destructible terrain</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: slime kingdom</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>boss: slime king</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: Santa's factory</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>boss: Dia</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: holding cell, local security HQ</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>quest: freedom - parents come retrieve their children and apologize. no one comes for Helia, so eventually Ray comes over and lets her out himself. </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: Lucrest shopping center - Mayor's Mansion, gym, apothecary, library, QuestionMart, sporting goods, clothing store, theatre, arcade, cable company, atelier, woks, cafe, photobooth, stage, gondolier, carousel, splash sidewalk, piano sidewalk (look at Disney World for fun sidewalk ideas) </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: Lucrest residential zone - uncle's, Tidwell's, McIntyre's, St Martin's, playground, walking trail</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: Lucrest - church</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: woods - secret grove, waterfall room</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: lake - fishing pier, fishing shop</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: botanical gardens</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>boss: brood mother</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>boss: gator</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>entity: training dummy - tells you your DPS, inflicted keywords, etc</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>character routines, idles</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>Lucrest sidequests</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>quest: keep going! (text from Tessa to suit up and train)</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>zone: Eden's threshold</span> </li>
</ul>
<h2>0.75 - chapter 2 </h2>
<h2><span class=mundane>0.75 - chapter 2</span> </h2>
<ul>
<li><span class=mundane></span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane></span> </li>
</ul>
<h2>0.9 - chapter 3 </h2>
<h2><span class=mundane>0.9 - chapter 3</span> </h2>
<ul>
<li><span class=mundane></span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane></span> </li>
</ul>
<h2>1.97 - full game </h2>
<h2><span class=mundane>0.97 - full game</span> </h2>
<ul>
<li><span class=mundane>feature: the completed game</span> </li>
<li><span class=mundane>full main story</span> </li>
<li><span class=mundane>all major characters</span> </li>
<li><span class=mundane>complete soundtrack</span> </li>
<li><span class=mundane>all levels</span> </li>
<li><span class=mundane>all skills - icons, functionality, FX</span> </li>
<li><span class=mundane>sound effects, visual effects, responsive game with feedback </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>feature: the completed game</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>full main story</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>all major characters</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>complete soundtrack</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>all levels</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>all skills - icons, functionality, FX</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>sound effects, visual effects, responsive game with feedback </span> </li>
</ul>
<h2>1.98 - involve other people (obv review after every milestone) </h2>
<h2><span class=mundane>0.98 - involve other people (obv review after every milestone)</span> </h2>
<ul>
<li><span class=mundane>feature: improvements based on suggestions</span> </li>
<li><span class=mundane>playtesting - diverse playtesters like colorblind, French keyboard users, different res/older computers, etc</span> </li>
<li><span class=mundane>maintain my community - forums, Discord, Twitter, any forums tied to store platforms, etc</span> </li>
<li><span class=mundane>press - YouTubers, Twitch streamers, bloggers, game journalists, local news, etc. I'll def reach out to Godot's showcase. </span> </li>
<li><span class=mundane>festivals/contests - local conventions, Godot con, Indie Games Expo, PAX, GDC. I'll seriously consider a booth/panel at the cons in my town. </span> </li>
<li><span class=mundane>booths - computers, keyboards, mouses, decorations, fliers, freebie promo items </span> </li>
<li><span class=mundane>funding - kickstarter, etc (no reason not to try. Even if I can finish the game in my freetime, I can set it up to cover fees then set wild stretch goals like getting Trigger to do my animations or hiring my favorite voice actor and composer or something)</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>feature: improvements based on suggestions</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=unusual>playtesting - diverse playtesters like colorblind, French keyboard users, different res/older computers, etc</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>maintain my community - forums, Discord, Twitter, any forums tied to store platforms, etc</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>press - YouTubers, Twitch streamers, bloggers, game journalists, local news, etc. I'll def reach out to Godot's showcase. </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>festivals/contests - local conventions, Godot con, Indie Games Expo, PAX, GDC. I'll seriously consider a booth/panel at the cons in my town. </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>booths - computers, keyboards, mouses, decorations, fliers, freebie promo items </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>funding - kickstarter, etc (no reason not to try. Even if I can finish the game in my freetime, I can set it up to cover fees then set wild stretch goals like getting Trigger to do my animations or hiring my favorite voice actor and composer or something)</span> </li>
</ul>
<h2>1.99 - release </h2>
<h2><span class=mundane>1 - release</span> </h2>
<ul>
<li><span class=mundane>feature: store pages</span> </li>
<li><span class=mundane>store page - tagline</span> </li>
<li><span class=mundane>store page - paragraph</span> </li>
<li><span class=mundane>store page - big writeup</span> </li>
<li><span class=mundane>store page - screenshots</span> </li>
<li><span class=mundane>store page - trailer, gameplay trailer</span> </li>
<li><span class=mundane>keyart - desktop icon</span> </li>
<li><span class=mundane>small thumbnail cover art thing online platforms do</span> </li>
<li><span class=mundane>keyart - boxart-like vertical thing online platforms do</span> </li>
<li><span class=mundane>keyart - banner art</span> </li>
<li><span class=mundane>platform achievements, cloud saves, overlays, </span> </li>
<li><span class=mundane>downloadable extras - manual, soundtrack, artbook, novel, 4koma, wallpapers (desktop, mobile, probably others), emoticons for messengers, paper dolls, paper fold crafts</span> </li>
<li><span class=mundane>merch </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>feature: store pages</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>store page - tagline</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>store page - paragraph</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>store page - big writeup</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>store page - screenshots</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>store page - trailer, gameplay trailer</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>keyart - desktop icon</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>small thumbnail cover art thing online platforms do</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>keyart - boxart-like vertical thing online platforms do</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>keyart - banner art</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>platform achievements, cloud saves, overlays, </span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>downloadable extras - manual, soundtrack, artbook, novel, 4koma, wallpapers (desktop, mobile, probably others), emoticons for messengers, paper dolls, paper fold crafts</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>merch </span> </li>
</ul>
<h2>??? - post-release, if ever </h2>
<h2><span class=mundane>??? - post-release, if ever</span> </h2>
<ul>
<li><span class=mundane>play as a boy</span> </li>
<li><span class=mundane>translate into additional languages</span> </li>
<li><span class=mundane>add your own music to music folder, appears in music app. pixelate cover to match-ish game graphics</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>feature: ideas that haven't been assigned to a release yet. probably not everything can fit into the game by 1.0, if ever</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>play as a boy</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>translate into additional languages</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>add your own music to music folder, appears in music app. pixelate cover to match-ish game graphics</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>background music</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>sound effects</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>ambience</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>voice acting, even if just for the trailer or intro cutscene or whatever</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>rebindable controls</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>support as many input devices as possible, though this probably isn't an XBOX controller-friendly game. keyboard, mouse, touchscreen, voice commands</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>emotes</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>skill SFX</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>character creation - day/night, sample outfits</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>emotes for player (screenshot fodder) - sleep in beds, sit on seats, cry, confess, dance</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>change phone background</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>real web browser on phone</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>store screenshots in phone gallery</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>gear changes sprite appearance</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>gear changes companions' sprite appearance</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>gear changes dialog portaits - paper doll</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>holidays</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>fishing minigame</span> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;<span class=mundane>hide UI for screenshots optionally</span> </li>
</ul>
<h2>??? - overflow </h2>
<ul>
<li><span class=mundane>feature: ideas that haven't been assigned to a release yet. probably not everything can fit into the game by 1.0, if ever</span> </li>
<li><span class=mundane>background music</span> </li>
<li><span class=mundane>sound effects</span> </li>
<li><span class=mundane>ambience</span> </li>
<li><span class=mundane>voice acting, even if just for the trailer or intro cutscene or whatever</span> </li>
<li><span class=mundane>rebindable controls</span> </li>
<li><span class=mundane>support as many input devices as possible, though this probably isn't an XBOX controller-friendly game. keyboard, mouse, touchscreen, voice commands</span> </li>
<li><span class=mundane>emotes</span> </li>
<li><span class=mundane>skill SFX</span> </li>
<li><span class=mundane>character creation - day/night, sample outfits</span> </li>
<li><span class=mundane>emotes for player (screenshot fodder) - sleep in beds, sit on seats, cry, confess, dance</span> </li>
<li><span class=mundane>change phone background</span> </li>
<li><span class=mundane>real web browser on phone</span> </li>
<li><span class=mundane>store screenshots in phone gallery</span> </li>
<li><span class=mundane>gear changes sprite appearance</span> </li>
<li><span class=mundane>gear changes companions' sprite appearance</span> </li>
<li><span class=mundane>gear changes dialog portaits - paper doll</span> </li>
<li><span class=mundane>destructible terrain that requires specific keywords - slash or burn webs</span> </li>
<li><span class=mundane>disposition, affinity system</span> </li>
<li><span class=mundane>holidays</span> </li>
<li><span class=mundane>fishing minigame</span> </li>
<li><span class=mundane>hide UI for screenshots optionally</span> </li>
</ul>
</div>
</div>

@ -1,6 +1,6 @@
% import random
% rebase('frame.tpl')
<div class="content-grid">
<div class="">
<div class="content-grid">
<h1>style guide </h1>
<p>Follow this style guide to avoid confusing bugs. Code doesn't always need to
follow the style guide, but a comment needs to be left by the offending code
@ -25,9 +25,9 @@ scene's root can return the value its child node's property. (see Setters and
Getters) <br></p>
<br>
<ul>
<li>don't use node paths to nodes higher than the scene's root </li>
<li>don't use node paths into instanced scenes </li>
<li>do add methods to the root of a scene that manipulates the inner nodes </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;don't use node paths to nodes higher than the scene's root </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;don't use node paths into instanced scenes </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;do add methods to the root of a scene that manipulates the inner nodes </li>
</ul>
<h2>child nodes </h2>
<p>It's fair for a script to depend on a consistent internal tree structure.
@ -43,9 +43,9 @@ methods can keep track of which nodes have been added or removed, so the
script can be aware of any changes to the scene's structure. <br></p>
<br>
<ul>
<li>don't add child nodes to nodes higher than the scene's root </li>
<li>don't add child nodes to instanced scenes </li>
<li>do add methods to the root of a scene for adding or removing children </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;don't add child nodes to nodes higher than the scene's root </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;don't add child nodes to instanced scenes </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;do add methods to the root of a scene for adding or removing children </li>
</ul>
<h2>setters + getters </h2>
<p>Often, some action always needs to be taken whenever a variable is changed.
@ -67,26 +67,26 @@ there is a need to take some action whenever a value is set, a setter can be
added to it seamlessly. <br></p>
<br>
<ul>
<li>setters can execute any action when a property is changed </li>
<li>setters can be added seamlessly, without changing how the property is set </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;setters can execute any action when a property is changed </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9;setters can be added seamlessly, without changing how the property is set </li>
</ul>
<h2>serialization </h2>
<p> <br></p>
<br>
<ul>
<li> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9; </li>
</ul>
<h2>translations </h2>
<p>add a fake language from the start <br></p>
<br>
<ul>
<li> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9; </li>
</ul>
<h2>documentation </h2>
<p> <br></p>
<br>
<ul>
<li> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9; </li>
</ul>
<h2>time </h2>
<p>pausing <br></p>
@ -94,14 +94,13 @@ added to it seamlessly. <br></p>
<p>decouple drawing and logic <br></p>
<br>
<ul>
<li> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9; </li>
</ul>
<h2>moddability </h2>
<p>Commonly, this means making a base, then loading in the game as a mod. The content is written in a light scripting language, and it's best if I use the same API/tools a modder would. <br></p>
<br>
<ul>
<li> </li>
<li class="latest">{{random.choice(['.','•','☆','★'])}}&#9; </li>
</ul>
</div>
</div>

@ -0,0 +1,59 @@
% rebase('frame.tpl')
<div class="content-grid">
<h1>blessfrey gdd - vibe</h1>
<p>The overall vibe of Blessfrey will be warm, fun, upbeat, pop, and stylish with pink colors. I need to find some pervasive motiff, especially one that symbolizes home for Helia. <br></p>
<br>
<h2>fantasy, modern, slice-of-life </h2>
<p>The initial inspiration for Blessfrey comes from those dollhouse mods in Oblivion that bring modern comforts like motorcycles, potato chips, and steamy bathroom mirrors into a world with steel armor, spider daedra and awesome swords. It's closely related to the isekai trend, even though many of these mods predate the anime releases of all those <a href="https://syosetu.com/">小説家になろう series</a> (Re:Zero, Drugstore in Another World, Restaurant to Another World, In Another World with My Smartphone, etc). <br></p>
<br>
<p>I have a list of the exact mods somewhere, but these are the few off the top of my head: <br></p>
<ul>
<li><a href="https://www.nexusmods.com/oblivion/mods/17054">Honda NR500 Motorcycle by Regard</a> </li>
<li><a href="https://www.nexusmods.com/oblivion/mods/44730">Converse Shoes - Robert by Ranaline</a> </li>
<li><a href="https://www.nexusmods.com/oblivion/mods/34130">Bonds Studio Apartment by Bond123</a> </li>
<li>my unuploaded mod where I converted several of the ebooks I own into in-game books </li>
</ul>
<br>
<p>The other goofiest place I've seen this juxtaposition pop up is that frame of some Avengers movie where the heroes are just hanging out at a normal restaurant. Some Quora guy claims the scene was popular, and I'll take his word for it. The overly dramatic, max stakes stuff isn't always as interesting as seeing what these fantasy people do during their down-time. My husband always thinks it's really funny to imagine the big bad of various series doing something really normal like eating ice cream. <br></p>
<img src="/static/img/gdd/avengers.jpeg" alt="(stolen screenshot of the Avengers eating at a casual restaurant in full costumes: fun fact #2815: Marvel's The Avengers movie caused shawarma sales to SKYROCKET nationwide)"><br>
<br>
<h2>socializing </h2>
<p>I like those 'group of kids save the world' shows like Code Lyoko, Winx Club, and W.I.T.C.H and would like to emulate that balance of otherworld exploration and heroics against hanging out and maintaining responsibilities at school and home. <br></p>
<br>
<p>Persona falls under that, too, but its life management sim, social links, and dungeon-crawling are so interlocked that I don't think you can take just one part of the formula without it feeling flat. For game system inspiration, I'd most like to follow Neverwinter Nights 2's influence system. Your dialog choices and game actions impact your relationship with a given companion, tracked as an integer score. This changes their dialog and how they'll act in critical story scenes. You can't play the middle ground without offending the extreme companions, so you must choose stances. You can even upset several companions so badly, they'll leave you or betray you. The influence system suits a nonlinear game with multiple outcomes well. <br></p>
<br>
<p>It also ties into romance, but the only male romance option is a middle-aged adulterous fedora-tipping cradle-robbing creep who can barely remember your alignment, much less anything else about your personality, so ew. The other half-romance option is the epitome of the bad boy trope, no thanks. Don't know how NWN2 romance is handled and don't want to lol. Generally, I wouldn't mind adding dating to Blessfrey, but I think it's unnatural how it's treated as the climax of a long friendship in most games. I wouldn't be surprised if most dates are made outside of a friend group, especially if you include couples who only hung out a few times before dating. I didn't meet my husband through my friends either. It's also bordering on too serious for teens. The couples in my high school lasted a few weeks tops with rare exceptions. <br></p>
<br>
<h2>nickajack setting </h2>
<p>Southern stories aren't very common in video media, especially in games. Atlanta eats up most of the ones we do get. I grew up in the South, so I spent a lot of time in church, playing neighborhood games, and eavesdropping on grownup gossip about local politics, local myths, Cherokee legends. I just think it'd be cool to have some of my world in a game, thorns and all. It seems like a chance to differentiate, too. I've barely seen any of my childhood Sunday School songs, clapping games, or grid paper games in media about US kids. <br></p>
<br>
<p>(Honestly, it's kind of weird. Are cartoon and teen sitcom writers on the major networks a bunch of lazy trope-copiers? I swear, they all go straight for the dumb jerk jock clique and ugly geeks when high school isn't like that. The former high school quarterbacks I've met have been a well-rounded people with soccer moms who forced them to learn an instrument. There weren't really sitcom geeks so much as kids that run like Naruto, born-in-the-wrong-century girls, quiet metalheads, etc. Am I off-base lol? At least the shallow cheerleader bully clique trope was real in my middleschool.) <br></p>
<br>
<h2>inspo </h2>
<ul>
<li>Meeting your elf boyfriend at the mall with cool anime swords </li>
<li>Modern stuff like motorcycles, smartphones, synthetic materials </li>
<li>Cute people with cute streetwear, cute hairstyles, accessories, cute homes, girly rooms </li>
<li>Screenshot friendly - posing, special animations, etc - sleeping, forgiving, crying, confessing, dancing, etc </li>
<li>Cute companions and pets </li>
<li>Small details from real life - steamy kitchen, foggy bathroom, working toilets and shower, bath, working oven, refrigerator, thoughtful cabinet and storage space for lots of collecting and organizing and theme grouping, counter space, working clocks, feasible utilities, beautiful horizons and ideal spots to gaze out at them, see-through windows with city bustle viewable </li>
<li>Yummy food - Even if a lot of people thought Final Fantasy XV was weird for the series, the food was meme-worthy. </li>
<li>Clutter - lots of familiar, comfy objects with a sense of sentimentalism and abundance, a touch of magic clutter like beauty-enhancing potions in the bathroom or an alchemy table in the study </li>
<li>Pencil and gel pen doodles next to school notes </li>
<li>School subjects (chemistry, geometry) right next to battle technique, strategy </li>
<li>Magic in the real world - Boys complain about girls that use too much beauty-enhancing magic, girls love it as self-expression and pampering. Everyone gossips about the girl who obviously pads her chest with alteration magic and the guy who does the same for his height. A controversy pops up periodically about whether athletics should be a display of purely physical prowess or if those who augment their abilities with magic can compete at the same level.
<li>Teenaged life - it's right at that transition between childhood and adulthood where people explore their self-image and deepen their relationships. They are relatively independent, hold jobs, and have complex and developed opinions and strongly held beliefs, though they still lack enough experience to be taken seriously by adults. </li>
</ul>
<br>
<h2>games </h2>
<p>I'll list out any old games I recall here: <br></p>
<br>
<p>Concentration 64 (my favorite), Big Booty, Little Sally Walker, Telephone, Heads Up, Seven Up!, Sparkle, Bible drills, Dots and Boxes, paper fortune tellers, M.A.S.H., I Spy, Monkey in the Middle, Musical Chairs, Red Light Green Light, Simon Says, Ice Cream Soda, Skip to my Lou, A Sailor Went to Sea Sea Sea, plus all those awkward icebreaker games like Two Truths and a Lie <br></p>
<br>
<p>Younger kids play some of those, but they have their own games like <br></p>
<br>
<p>Patty Cake, London Bridge is Falling Down, Five Little Monkeys, Itsy Bitsy Spider, Rain Rain Go Away, This Little Piggy, Here are Mother's Knives and Forks, Red Rover Red Rover (absolutely hated this one), Finger Family, The Muffin Man, Row Row Row Your Boat, Eenie Minnie Minie Moe, clean up songs, Father Abraham Had Many Sons, B-I-N-G-O, He's Got the Whole World in His Hands, Jesus Loves Me, Jesus Loves the Little Children, This Little Light of Mine, Head Shoulders Knees and Toes, Duck Duck Goose, Baa Baa Black Sheep, Sharks and Minnows, Cops and Robbers, Freeze Tag, How Much Wood Would a Woodchuck Chuck?, Guess What Chicken Butt, One Two Buckle My Shoe, Frere Jacques, If wishes were horses, You're a Grand Ole Flag, The Ants Go Marching One by One <br></p>
<br>
<p>Honestly, people are very musical, especially when they are younger. I can find most of these online, but we regularly made up our own songs, too. </p>
</div>
Loading…
Cancel
Save