fixed box css; use credit css now; ideabox pads out rest of table if not enough words; added email; added more credits; added an about me blurb to contact; articles

small-nav
chimchooree 4 years ago
parent f1589d597d
commit 836971838e

@ -1,4 +1,4 @@
<!--201210,201029-->
<!--210218,201029-->
<h1>tidying up my skill phases </h1>
november 12, 2020<br>
#programming #skills<br>

@ -4,25 +4,48 @@ december 10, 2020<br>
#writing<br>
<br>
<br>
I like collecting common tropes from games I play. Maybe it can inspire some game beats? Here's a few of them listed with some games I've seen them in ~ <br>
I like collecting common tropes from games I play. Maybe it can it root out cliches? Or inspire some game beats? Here's a few tropes spotted in multiple games ~ <br>
<br>
If you're worried about spoilers, games mentioned are The Cat Lady, Dreamfall: The Longest Journey, Fire Emblem, Guild Wars, Guild Wars 2, Half-Life, Mass Effect, Neverwinter Nights 2, Oblivion, Persona 4, Planescape: Torment, RuneScape 2
If you're worried about spoilers, games mentioned are Arcanum, The Cat Lady, Divine Divinity, Dreamfall: The Longest Journey, Fable, Fire Emblem, Guild Wars, Guild Wars 2, Half-Life, Jade Empire, Legend of Zelda: A Link to the Past, The Longest Journey, Mass Effect, Neverwinter Nights 2, Oblivion, Persona 4, Planescape: Torment, RuneScape 2 <br>
<br>
<br>
<h2>opening scene + first level </h2>
<ul>
<li><b>dream sequence</b> - A Link to the Past </li>
<li><b>prison escape</b> - Oblivion, City of Heroes (villains) </li>
<li><b>sparring</b> - Jade Empire </li>
<li><b>starter village attacked, probably burned down</b> - Fable, Dragon Age: Origins </li>
<li><b>toll bandits blocking the bridge/road exiting the starter village</b> - Arcanum, Dragon Age: Origins </li>
<li><b>tutorial island</b> - RuneScape, Guild Wars: Factions + Nightfall </li>
<li><b>waking up</b> - Divine Divinity, The Longest Journey, Planescape: Torment </li>
</ul>
<br><br>
<h2>protagonist </h2>
<ul>
<li><b>amnesiac protagonist</b> - every game, especially MMOs. </li>
</ul>
<br><br>
<h2>levels, story points, fights </h2>
<ul>
<li><b>amnesiac protagonist</b> - every game, especially MMOs. way overdone. </li>
<li><b>arena/tournament arc</b> - Fable, Oblivion </li>
<li><b>city building</b>Neverwinter Nights 2's Crossroad Keep, RuneScape's Miscellania + Etceteria</li>
<li><b>city building</b> - Neverwinter Nights 2's Crossroad Keep, RuneScape's Miscellania + Etceteria, Nightfall's Sunspear Sanctuary </li>
<li><b>courtroom hearing (usually resolved with the loser pulling out the 'trial by combat' card)</b> - Guild Wars: Nightfall, Guild Wars 2, Neverwinter Nights 2, Mass Effect </li>
<li><b>elevator fight</b> - Half-Life, Metroid </li>
<li><b>fight yourself</b> - Guild Wars's Augury Rock, Mask of the Betrayer, Persona 4
<li><b>final boss is all previous bosses in one room</b> - Fire Emblem, Nightfall </li>
<li><b>infiltrate a fancy party</b> - Guild Wars 2's A Society Function, Mass Effect Kasumi DLC
<li><b>maze level</b> - Mask of the Betrayer's Skein, Planescape: Torment </li>
<li><b>minigame tournament</b> - The Witcher's Dice Poker, Eye of the North's Polymock </li>
<li><b>play as a side character</b> - The Cat Lady's cat, Mass Effect's Joker, </li>
<li><b>play as a side character</b> - The Cat Lady's cat, Mass Effect's Joker </li>
<li><b>raise someone </b> - the original Kingmaker concept for Oblivion, The Witcher 2 </li>
<li><b>really long fetch quest</b> - Dreamfall's mulled wine </li>
<li><b>solo boss battle</b> - Guild Wars Augury Rock, Neverwinter Nights 2 </li>
<li><b>trapped for a level, especially without your stuff</b> Divine Divinity's Castle + Dungeon, Mask of the Betrayer's Planescape: Torment's Skein</li>
<li><b>solo boss battle</b> - Guild Wars Augury Rock, Neverwinter Nights 2's trial </li>
<li><b>trapped for a level, especially without your stuff</b> Divine Divinity's Castle + Dungeon, Mask of the Betrayer's Skein</li>
</ul>
<br><br>
<h2>side content </h2>
<ul>
<li><b>minigame tournament</b> - The Witcher's Dice Poker, Eye of the North's Polymock </li>
<li><b>really long fetch quest</b> - Dreamfall's mulled wine, Planescape Torment's Moridor's Box </li>
</ul>
<br>
last updated: 2/21/2021
<br>

@ -16,7 +16,7 @@ february 1, 2021<br>
<br>
<h3>sunday, january 3 </h3>
<ul>
<li>Trendmood leaked <a href="https://www.temptalia.com/colourpop-x-animal-crossing-collection-swatches/">Colourpop×Animal Crossing</a>. That's one of my favorite IPs and one for which a makeup collaboration was unimaginable, and I'm not even excited. I don't know if it's the market oversaturation or I'm just salty about New Horizons cutting out all the villager-related game mechanics. Animal Crossing collabs are a dime a dozen now. (<a href="https://blackmilkclothing.com/collections/blackmilk-x-animal-crossing-new-horizons?utm_campaign=136203_animalcrossing-release-13oct20">BlackMilkClothing×AC</a> is still up after months, even after discounts.) Feels like Nintendo's devolving back into the toy business. </li>
<li>Trendmood leaked <a href="https://www.temptalia.com/colourpop-x-animal-crossing-collection-swatches/">Colourpop×Animal Crossing</a>. That's one of my favorite IPs and one for which a makeup collaboration was unimaginable, and I don't care. I don't know if it's the market oversaturation or I'm just salty about New Horizons simplifying the villagers. Animal Crossing collabs are a dime a dozen now. (<a href="https://blackmilkclothing.com/collections/blackmilk-x-animal-crossing-new-horizons?utm_campaign=136203_animalcrossing-release-13oct20">BlackMilkClothing×AC</a> is still up after months, even after discounts, ouch.) Feels like Nintendo's devolving back into the toy business sometimes. </li>
<li>Imagine if more videogame makeup leads to Urban Decay×SMT somehow, though...so grungy and neon! </li>
<li>The character script is completely broken up - methods have been moved closer to where they are used. So, methods for calculating xp + level are moved from character to an attribute subscript. </li>
<li>Replaced constants to subnode paths with getters. Some _ready methods need to call methods off child nodes, but those nodes will still be null. I don't understand why very well. ;-; Using a getter, plus being more conscientious about what order to call things within _ready, fixed it. I should probably document it in an article because that's been a perplexing problem since I first starting working on character movement. </li>
@ -32,8 +32,8 @@ february 1, 2021<br>
<br>
<h3>wednesday, january 6 </h3>
<ul>
<li>Today, the March for Trump produced unbelievable photos of random people breaking into the Capitol offices. Kind of resembles a videogame. </li>
<li>Organize files better. (Great idea when the game hasn't been able to start since the character restructure.) Fixed a hundred dependencies, file path references. </li>
<li>I watched streams of the March for Trump against the Capitol. I collected some riot photos into a <a href="https://www.blessfrey.me/diary/entries/extra/stop-the-steal">gallery</a>. </li>
<li>I organized files better. (Great idea when the game hasn't been able to start since the character restructure.) Fixed a hundred dependencies, file path references. </li>
</ul>
<br>
<h3>thursday, january 7 </h3>
@ -150,6 +150,17 @@ february 1, 2021<br>
<li>Update website, tweak website code. </li>
</ul>
<br>
<h3>wednesday, january 27 </h3>
<ul>
<li>Worked on character development. Listed out my key characters and bulleted out their backstory, shortcomings/bad experiences, how that affects their relationships with other characters, why that involves them in the story, the changing point in their arc, and where their story can end. I still need to do this exercise for Chloe, the pastor, and Angel's dad. </li>
<li>The main character's still just kind of there, being dragged around in the story. It's difficult for me to add character motivation for a playable character. For the player, that's going to be coming from the game's hook and pacing and personal reaction to the game world. Some people say it's harder to get involved with a cardboard main character, but I don't know. I was absolutely hooked on Lost Eden's story, even if Prince Adam is so empty that clicking on him just takes you to the options menu void. At the same time, a quirky main character adds a lot to the fun for me. I really enjoyed picking all the clueless, amnesiac options for Ren in Persona 5 and making him low-key gay for Akechi. I was also bemused by Sophie's belligerent atheism and her in her Atelier game. I just...never wrote a game story before and don't know how to do it. ;-; </li>
<li>Initially, I had a big cast of characters who didn't have a lot going on with them, but it would be a pain to make resources for all of them. Combining and cutting helped make the characters more interesting. Still, they didn't really have arcs. I also didn't really have the first antagonist as more than a shallow concept until this month. I still don't know her name and appearance...if I even want her to be a girl. </li>
<li>I also worked on plot. I only have a grasp on the plot up to the mid-point and don't know where to finish it. Watching Youtube writing channels helped flesh out what I already had, at least. Since it's a game, it's more fun to have lots of paths and let the player their own place among the different factions. That's ridiculous for scope, though. I hope when I add story missions, it'll be more obvious where to go? But it would sure be easier to edit the story before all the coding and assets are made. ;-; </li>
<li>Maybe I'm too worried about the story. Mechanics are most important at the end of the day. Even among people who play games for the story, they apparently retain very poor comprehension of the story. Instead, their attention is fully on the characters. (citation - some GDC talk) So, so long as I have cute characters, it's all good, right? </li>
<li><a href="https://www.youtube.com/watch?v=v-I9N5LsvPM">How to Plot Your Novel FAST | Writing Advice - Ellen Brock</a> was the best video I watched for understanding the process an editor uses to build a prompt into a plot. </li>
<li><a href="https://www.gdcvault.com/play/1020031/Using-User-Research-to-Improve">Deborah Hendersen's Microsoft user research study</a> talks about how players don't remember anything but the characters. I just found some slides. <a href="https://www.youtube.com/watch?v=4mgK2hL33Vw">Jeremy Bernstein's Creating Strong Video Game Characters</a> mentions it, but there was another that went into more detail...but I haven't watched GDC talks in forever so don't remember. </li>
</ul>
<br>
<h3>thursday, january 28 </h3>
<ul>
<li>The language-change button does something for the first time. Now, choosing English or 日本語 will automatically update all the text. I put all text-bearing objects in a group and update their text from the UI singleton. It's useful if I want more language options, but it's also useful to ensure each text is in my spreadsheet instead of embedded directly in the engine. It's also an opportunity to make my text-displaying code more consistent across my game. </li>
@ -163,9 +174,23 @@ february 1, 2021<br>
<li>Serialization works again after the character refactor. </li>
<li>I finally tried using <a href="https://docs.godotengine.org/en/stable/classes/class_theme.html">themes</a> instead of customizing a font for each individual object. Now I can just change the theme instead of each individual object. </li>
<li>Fixed a highlight problem. Used to, when you hovered from one object to an immediate neighbor, you would change targets before you could unhighlight the old target. Now all highlightable targets belong to a group. When you hover over a new target, all members of that group unhighlight. </li>
<li>basically lots of removing the hard-coding and making things more
<li>basically lots of removing the hard-coding </li>
</ul>
<br>
<h3>saturday, january 30 </h3>
<ul>
<li>Refactored skills + updated the skillmaker python script. </li>
<li>Fixed UI bugs as I found them. </li>
<li>Made a system for meaningful object ids. They're in hexadecimal so they can be succinct + flexible at the same time. </li>
</ul>
<br>
<h2>week 6, january 31 </h2><br>
#<br>
<br>
<h3>sunday, january 31 </h3>
<ul>
<li>I left a pen in the laundry and ruined a nice sweater TT_TT </li>
<li>Fixed more bugs, a little more refactoring for skills + character, and now it's time to add my slime character back into the game. During this refactor, all characters were removed, so the PC's getting lonely. </li>
<li>My refactor was biased towards there only being a PC, so I move some of the player-only logic out of the base character object. </li>
</ul>
<br>
last updated 3/2/2021<br>

File diff suppressed because one or more lines are too long

@ -1,18 +1,64 @@
<!--200917,201112-->
<h1>Writing Resources </h1>
<!--210107,201112-->
<h1>refactoring characters: black box </h1>
february 18, 2021<br>
<br>
#character #refactor <br>
<br>
Blessfrey has a story and character arcs. Let's get more confident with our story with online resources. <br>
The character script was one of blessfrey's first scripts. Since it's never seen a serious refactor, it has retained its clueless beginner style to this day. Every single line of code related to characters was buried somewhere in this unmanageable monolith. The time has finally come for refactoring. <br>
<br>
<h2>plot </h2><br>
<ul>
<li><a href="https://www.youtube.com/watch?v=v-I9N5LsvPM">Ellen Brock - How to Plot Your Novel FAST | Writing Advice</a> - She takes a randomly generated story idea and builds the plot using techniques she uses with her clients. Summarize the basic idea, ask questions about what you don't know, answer the questions, make a list of all the scenes you know should be included, go back and flesh things out. </li>
</ul>
The two biggest problems with my character script were the lack of structure + encapsulation. <br>
<br>
<h2>general </h2><br>
<ul>
<li><a href="https://www.youtube.com/c/QuotidianWriter/videos">Diane Callahan - Quotidian Writer</a> </li>
<li><a href="https://tvtropes.org/">TV Tropes</a> </li>
</ul>
<h2>adding structure </h2><br>
An entire game can fit in one mega script, but an object-oriented approach is more manageable. It's good to keep your code close to where it is implemented. <br>
<br>
First, I expanded the character's <b>node hierarchy</b>. I combed through the code, forming abstract categories for each section. These categories became my subnodes. (Nodes are objects in Godot, by the way.) If a subnode was too complex, it was broken into another level of subnodes. Then, I cut+pasted as much code as I could into these subscripts. My tree now looks like this, when before, it just had the AI, Body, and UI nodes: <br>
<br>
<a target="_blank" href="/static/img/ent/characternodehierarchy.png">
<img src="/static/img/ent/characternodehierarchy.png" alt="(image: character's node tree. Character's children are AI, Body, DropTable, Actions, UI, Inventory, Skillbar, Serialization, InspectMenu, Equipment, Properties, Effects, Events, SkillLibrary, and Class. Under Properties are Health, Energy, and XP. Under Skillbar is Skillslot. Under SkillLibrary is Skill. Under Class is FirstClass and SecondClass. Under AI is State. Under Body is ClickableArea, RangeBubble, Camera, Sprite, Hitbox, Feet, Effects, Animation, Light, and Debug. Under the Body's Sprite is Highlight.)" width="500" height="195">
</a><br>
<br>
<h2>adding encapsulation </h2><br>
Within the monolith, every part of the character had direct access to every other part. A major step towards getting everything running again was adding <b>encapsulation</b>, or grouping related logic + data into objects then restricting direct access of its internal components from other objects. I did this through designating entrypoints as the only way of performing actions or accessing data. These entrypoints are the character's verbs and setters + getters. <br>
<br>
<h3>verbs </h3>
<b>Verbs</b> are what the object does. Some of them are obvious, like "use skill," "be damaged," and "pick up item," but some of them are more abstract, like "calculate level." <br>
<br>
The character script should act as a central hub, executing verbs by contacting subnodes for the actual logic and passing back the output. These subnodes should act as <b>black boxes</b>, so the character script only worries about input + output, not how the request is performed. <br>
<br>
<center><img src="/static/img/ent/blackbox.png" alt="(image: illustration of the concept of a black box: input goes in, output comes out, it doesn't matter what happens inside.)"></center> <br>
<br>
Before, I didn't apply this concept to the character at all. Outside objects would travel all over the tree to pick out specific methods. That resulted in code like <code>body.get_parent().UI.skillbar.healthbar.label.set_value("100")</code> instead of something like <code>character.set_health(100)</code>. As I modified systems, all the outside references made it difficult to remove old versions. Since everything didn't necessarily use the entrypoint, there was a lot of redundant code + unexpected behavior. <br>
<br>
<center><a target="_blank" href="/static/img/ent/characterrefactor_oldvsnewcode.png">
<img src="/static/img/ent/characterrefactor_oldvsnewcode.png" alt="(image: a code excerpt's before and after, can also be read @ https://pastebin.com/xhJqVVKe.)" width="500" height="122.38">
</a></center><br>
<br>
<h3>setters + getters </h3>
Another closely related concept is <b>setters + getters</b>. If you tack a <code>setget</code> followed by method names onto a variable, those methods will be called whenever you access that variable. The first method is the setter and is conventionally prefixed with "set_", while the second is the getter. If you don't want a setter, don't write anything before the comma: <code>setget , get_whatever</code>. If you don't want a getter, don't even add the comma: <code>setget set_whatever</code>. <br>
<br>
<center><img src="/static/img/ent/setters+getters_dollars.png" alt="(image: code example of setters and getters, can also be read @ https://pastebin.com/y6AJVBMu.)"></center> <br>
<br>
Setters + getters are related because they increase consistency. If something needs to happen every time a variable is changed, the setter is a good entrypoint. If a variable needs to be obtained in a specific way, that process can be taken care of inside a <code>get_thing()</code>. This way, your variable-specific code is encapsulated, and you are no longer encouraged to manipulate them outside of their little box. <br>
<br>
Unsurprisingly, using verbs, black boxes, and setters + getters fixed a lot of long-running bugs. <br>
<br>
<h2>controlling flow </h2><br>
Another problem popped up concerning when the tree's nodes initialize. Now that everything isn't in the same script, everything isn't ready at the same time. To see the initialization order, I made a small project. Each node prints its name when at ready, and, as you see, it works from lowest level to highest level, top node to bottom node.<br>
<br>
<center><img src="/static/img/ent/nodetree_ready.png" alt="(image: The order goes from top-to-bottom node, lowest level to highest level. The tree, code, and output can be read @ https://pastebin.com/Z4VG9ey5.)"></center> <br>
<br>
To have more control over the flow of my character, dependency-sensitive nodes rely more on a setup method than the _ready method. Also, characters who inherit from the base script use a super _setup method called from the setup method for their own specialized needs. (Super methods are discussed in <a href="https://www.blessfrey.me/diary/entries/201112">tidying up my skill phases</a>.) This way, I can ensure a node is ready and has all its properties set at the moment it's needed. <br>
<br>
<center><img src="/static/img/ent/setup_base.png" alt="(image: the base character's _ready is broken into more methods. Supermethod are used for calling specialized code at a specific time.)"></center> <br>
<center><img src="/static/img/ent/setup_player.png" alt="(image: the player no longer uses _ready. It uses a supermethod called off the base character's setup method.)"></center> <br>
<br>
<h2>happy script </h2><br>
The refactor paid off immediately. So many "known issues" were immediately resolved. The character scripts are way easier to maintain now. The main script's halved in size. And I feel like I've improved a lot since I first started working on blessfrey. I wanted to go through the rest of the program and apply these concepts throughout, but it turned out I was already using them. It was just this ancient mess of a script that was left behind. <br>
<br>
I'll finish with a before + after of the base character script. <br>
<br>
<center><img src="/static/img/ent/characterrefactor_before+after.png" alt="(image: 604 lines of spaghetti code vs 374 lines of verbs + setup code)"></center><br>
<br>
Enjoy your day! <br>
<br>
last updated 2/21/21<br>
<br>

@ -0,0 +1,119 @@
<!--210201,210401-->
<h1>february 2020: AI</h1>
march 1, 2021<br>
<br>
<br>
I just feel like rambling about games. <br>
<br>
<h2>week 1, february 1-6 </h2><br>
#design #localization #writing <br>
<br>
<h3>tuesday, february 2 </h3>
<ul>
<li>I miss programming at the library. </li>
<li>I want to redesign my basic slime monster, but couldn't focus. Worked on writing events instead (meeting your first friend + the conclusion of the first boss fight) </li>
<li>Worked on first non-tutorial boss's motives. They were cliche before and didn't really connect to the plot. Now, his backstory ties into other characters more and prompts a new questline. :) </li>
<li>I used brainstorming advice from Diane Callahan - Quotidian Writer's video <a href="https://www.youtube.com/watch?v=CwJGon94Sx4">Writing Exercise: Fleshing Out Your Characters</a>, starting at 5:01. To write how a character would react in a situation, she suggests making a list of 10 possibilities. Usually, the early items are obvious, while the later ones are more interesting. (Maybe that's obvious advice, but it helps me.) </li>
</ul>
<br>
<h3>wednesday, february 3 </h3>
<ul>
<li>My Japanese translations have been reuploaded by several people without credit. I finally participated in something appreciated enough to be stolen lol. </li>
</ul>
<br>
<h3>thursday, february 4 </h3>
<ul>
<li>Finished reading Robert Jordan's New Spring in The Wheel of Time series. It's the prequel oops. The Eye of the World is Book 1. I barely read widely-read books, so I felt like reading something that book youtubers talk about. </li>
<li>Designed the slime's skills, state machine. </li>
<li>In general, I'm working on a particular level of the game that would make for a decent demo: the Slime Kingdom. Depending on your actions, you may meet the Slime King, but I haven't thought of him beyond generic big ole' slime. Maybe he should be a slime boy. </li>
</ul>
<br>
<h3>thursday, february 5 </h3>
<ul>
<li>Procrastination. Fixed lots of "known issues" that would confuse a playtester. The most exciting one to me is the language button. All the text changes immediately, no reloading necessary. I think I'll have a lot of writing in the game, so additional languages are a lofty dream, but having such a system in place allows for any kind of text changes. Now the text can change to pig latin or pirate-speak or the character can become dyslexic or something. Regardless, it forced me to move all the embedded text to a spreadsheet, so it'll be much easier to edit now. </li>
</ul>
<br>
<h3>thursday, february 9 - second impeachment trial of the president begins (first time in U.S. history) </h3>
<br>
<h2>week 2, february 7-13 </h2><br>
#design #writing <br>
<h3>thursday, february 11 </h3>
<ul>
<li>Tried making a worldbuilding bible again. I can never format it in a way I like, though. I did draw some concept art of the Abyss with colored markers. </li>
</ul>
<br>
<h2>week 3, february 14-20 </h2><br>
#design #writing <br>
<h3>wednesday, february 17 </h3>
<ul>
<li>At one point, you befriend Rune, an exiled angel with a teleportation skillset. He's like a lost puppy, so he'll imprint on MC if she's kind to him. His powers provide a lot of opportunity for influencing events. If MC is teleported away suddenly, he can follow her. He can also travel and hide almost anywhere, so he would make a great spy. </li>
<li>He reminds me of two other characters with travel powers. </li>
<li>Gann of Mask of the Betrayer - Maybe it's because he's in a masterful game (definitely in my top 5), but he's kind of cute lol. If you chip away at his (absolutely obnoxious) exterior enough, he support the Spirit-Eater through anything. Since he's a dreamwalker and the campaign involves numerous lengthy dream sequences + visions, that means he can join what would have been solo missions for the Spirit-Eater. (Not to mention his stat bonuses are the best.) The game is hard, too, so his presence is a lifesaver. He also walks in Spirit-Eater's dreams, so he understands her in a deeply personal way. For a guy with deep emotional + personality issues, his loyalty (can you use that word with him?) + intimate connection with the Spirit-Eater is sweeter than it deserves to be. </li>
<li>Strahd - Another D&D guy, coincidentally. I know him from the Ravenloft DOS games. (never got to play tabletop but once at a con ;-;) He has all sorts of extradimensional powers, so he can spy on the party from other dimensions. You can never really be sure when he's watching. That's honestly so creepy. Since he also employs lots of spies, you can never really let your guard down anywhere. </li>
</ul>
<br>
<h3>thursday, february 18 - Perseverance Rover Landing on Mars </h3>
<ul>
<li>I didn't get to watch, though, because every time I checked the news, they were showing the snow in Israel instead;; </li>
<li>We got 5 inches of snow. Amazing! It only snows a few inches every 5-or-so years here. </li>
<li>I wrote more events today (a popup petshop quest + a conversation with an archivist about the lost school of Chronomancy) </li>
<li>There's lots of games with time-altering mechanics (Braid, SUPERHOT, Life is Strange,...), but I'm salty about Guild Wars's canceled campaign, Utopia. From my understanding, it was to introduce the Chronomancer profession, but because they would have to modify the engine so significantly to support it, they decided they might as well make Guild Wars 2 instead. So they scraped Eye of the North together from the remnants of Utopia and switched to seriously developing Guild Wars 2. Then, not only did they not release the Chronomancer for Guild Wars 2, they said they never would. Then they did anyways as some minor skill set for the Mesmer or something idek. It could have been cool, especially Eye of the North was excellent. But no. Instead, it was the impetus for yet another boring WoW-ripoff MMO where you kill everything by running around and spamming 1. </li>
<li>If I put aside how salty just the word <em>Chronomancy</em> makes me, it's an inspiring concept. Doubtless one that's difficult to program, test, and design content for, but still. </li>
<li>For instance, save scumming is a classic issue with gamers (similar to overusing wikis/walkthroughs). There's a lot of pressure to have a perfect playthrough and always win everything and always say the right things and always get lucky with RNG. Maybe through chronomancy, you could provide a mechanic-based way to basically save scum. I'm very interested in the idea of a skill that lets you redo the previous mission or start over from this morning. It would be easier to track and respond to skill usage than saving/loading, so you could work it into the challenges or story. Especially since a skillset that powerful would be highly controversial in-universe. </li>
</ul>
<br>
<h3>friday, february 19 </h3>
<ul>
<li>Entities were based on hex, but it's confusing to know when the engine's recognizing them as string or ints. I changed them to color. </li>
<li>Color can be more of a floating math-thing, so I hope that's not bad. I thiink the numbers will stay the same enough for ids, since I'm using hex and int comparisons. </li>
<li>Since the colors are 6-digit hex numbers, I can't be as specific with each digit's meaning. Oh well. Only assigning meaning to the first 2-3 digits is probably adequate. </li>
<li>Also, every object is now going to inherit from the "entity" that stores + compares ids. </li>
<li>Worked a lot on slime AI - fixes, rewriting code, refactors. The hex stuff was to help the slime differentiate skills on his skillbar. </li>
<li>Tried writing the event for the first encounter with rebel Prince Lotus. I really love Nocturne's candelabrum fights, so it took place in a pocket dimension prison that warps in the MC. I've tried writing his encounter a few times but am never really happy with it. I haven't designed the Abyss's resistance movement very much. </li>
</ul>
<br>
<h3>saturday, february 20 </h3>
<ul>
<li>Website maintenance + article writing </li>
</ul>
<br>
<h2>week 4, february 21 - 27 </h2><br>
#ai #webdev <br>
<h3>sunday, february 21 </h3>
<ul>
<li>working on slime's AI a little bit more. It's not really using the Update() method from its current state. </li>
<li>wrote some more bash scripts for maintaining the website. </li>
<li>Uh, since when has the <a href="https://www.blessfrey.me/credits">credits page</a> been so messed up? It's just straight, unformatted text, and all the other pages using its CSS are fine. </li>
</ul>
<br>
<h3>monday, february 22 </h3>
<ul>
<li>Still investigating why the loop within the slime's planning state doesn't behave as expected. </li>
</ul>
<br>
<h3>thursday, february 25 </h3>
<ul>
<li>The slime's skills are always empty. The first two slots should have skills in them, though. I can't figure out why. </li>
</ul>
<br>
<h3>friday, february 26 </h3>
<ul>
<li>The slime was randomly choosing an index of the skillbar, checking whether its skill was valid, then recursively calling the method again until a valid skill was selected. Instead, the slime now collects the valid skill indices, randomly chooses one, and extracts the valid skill. </li>
<li>...but no skills are ever valid. </li>
</ul>
<br>
<h3>saturday, february 27 </h3>
<ul>
<li>Went on a cafe date with laptops. :) I haven't gone out further than the mailbox in 5 weeks (is that right?), so my productivity needed that so bad. Now back to indefinitely sheltering in place. </li>
<li>During its planning phase, the slime chooses a valid skill to use. </li>
<li>Characters were wiping their skillbar near the start of the game. No skills = no valid skills to choose from. I figured out it was because the skills didn't belong to any class...so when the skillbar rules were enforced, none of the skills belonged to the character's classes. </li>
<li>The slime had a wait timer so it could attack a little before making a new decision. Now it uses coroutines. </li>
</ul>
<br>
<h2>week 5, february 28 - march 6 </h2><br>
#nothing <br>
<h3>sunday, february 28 </h3>
<ul>
<li>Completed my first translated volume of manga. :) Now to translate more things! </li>
</ul>
<br>

@ -0,0 +1,139 @@
<!--210218,210107-->
<h1>python writes my skills for me</h1>
march 4, 2021<br>
#godotengine #json #python <br>
<br>
Similar to Magic: The Gathering and Guild Wars 1, the functionality of my skills is composed of keywords. For instance, a skill with the 'damage' keyword + 'bleeding' keyword will inflict pure damage + a bleeding status effect. <br>
<br>
Since skills derive their effects from existing keywords, each individual skill has very little to no unique code. Repetitive, formulaic tasks are better left to scripts, so I wrote a skillmaker to write skills for me. <br>
<br>
<h2>what do blessfrey skills look like? </h2><br>
<br>
(Click on the shrunk images for an expanded view.) <br>
<br>
They are Godot scenes composed of a single <a href="https://docs.godotengine.org/en/stable/classes/class_node.html">node</a> with an attached script. <br>
<br>
<center><img src="/static/img/ent/skillscenetree.png" alt="(image: That's it - the tree's just one node with a script.)"></center> <br>
<br>
The .TSCN and .GD files look like this in the engine. <br>
<br>
<center><a target="_blank" href="/static/img/ent/skillsceneshot.png">
<img src="/static/img/ent/skillsceneshot.png" alt="(image: Screenshot from the engine - the node tree, attached script, properties, and groups are all neatly displayed.)" width="500" height="281">
</a></center> <br>
<br>
But Godot files are just simple text, so you can open them in any text editor. Really, you could write the bulk of a Godot game in Notepad, if you wanted to. That's perfect for me! <br>
<br>
The same files look like this in xed (similar program to Notepad): <br>
<br>
<center><a target="_blank" href="/static/img/ent/skillscene_xed.png">
<img src="/static/img/ent/skillscene_xed.png" alt="(image: The same files displayed in xed.)" width="500" height="275">
</a></center> <br>
<br>
The .GD file is identical to what gets displayed in Godot Engine, but the .TSCN is a little cryptic. If I learn how the syntax, I can make a script to write it for me. I don't understand all of it, since I only deciphered what I need for making a skill. <br>
<br>
<h2>examining the skill scene file </h2><br>
<br>
<center><a target="_blank" href="/static/img/ent/skillscene_cipher.png">
<img src="/static/img/ent/skillscene_cipher.png" alt="(image: The .TSCN file broken into color-coded sections.)" width="500" height="552">
</a></center> <br>
(You can also see the text @ <a href="https://pastebin.com/1mzmDFM5">Pastebin</a>.) <br>
<br>
Since I designed Blessfrey skills to have a simple, consistent structure, the .TSCN for any two skills will be very similar. <br>
After experimenting in + out of Godot Engine, I've found that that first line is always the same. <br>
<br>
<h3>red + yellow resources </h3><br>
The red + yellow sections are the scene's resources. This includes any .GD files attached to nodes in the scene tree and any resources (textures, fonts, etc) you load as properties. Those are the properties that look like my icon: <br>
<br>
<center><img src="/static/img/ent/skillscene_resproperty.png" alt="(image: This is what resources look like after being loaded into the properties.)"></center> <br>
<br>
The script + the resources look so similar because they are both treated as properties of the node. The formula is... <br>
<br>
<ul>
<li><code>[ext_resource path="</code> </li>
<li>obviously followed by the path of the resource. If resources are kept in a predictable place, it's easier on the script. </li>
<li><code>" type=" </code> </li>
<li>whatever the resource type is (examples include Script, Texture, DynamicFontData) </li>
<li><code>" id=</code> </li>
<li>a unique number (obviously used for referencing) </li>
</ul>
<br>
<h3>green groups</h3><br>
Green marks the groups of each node in the scene. You can see the groups are just an array of strings. <br>
<br>
Broken into pieces, that looks like <br>
<br>
<ul>
<li><code>[node </code> </li>
<li><code>name="CuttheGuy"</code> - the name of the node (node.name) goes between the quotation marks </li>
<li><code>type="Node"</code> - the type of the node, so something like Node, Node2D, or Label </li>
<li><code>groups=[</code> </li>
<li><code>"group_name", </code> - each group name is wrapped in quotation marks and separated by commas + line-breaks. </li>
<li><code>]]</code> - close all brackets </li>
</ul>
<br>
Two interesting things about the group_name property. One, the engine adds a comma at the end of every line, even to last or only group of the node. Two, if your scene node has no groups, this property will be omitted from the node. If CuttheGuy belonged to no groups, it would just look like <code>[node name="CuttheGuy" type="Node"]</code>. <br>
<br>
<h3>blue properties</h3><br>
The properties are inside blue. Since scripts are treated the same as any other resource property, the attached script is referenced in this section. <br>
<br>
Resources look like <code>icon = ExtResource( 2 )</code>.
<br>
<br>
<code>Icon</code> is my variable. I declared it in a script that the skill inherits from as <code>export(Texture) var icon = preload('res://res/art/skillIcons/EmptySkillSlot.png') setget , get_icon</code>. The <code>script</code> variable was declared by the engine and isn't in my .GD files. <br>
<br>
The <code>2</code> is an id from the yellow section. It must match the resource's number from earlier. <br>
<br>
If I store all my skill icons in the skillIcons directory and give them the proper name, they'll be found when they're needed, no manually loading necessary. This is a test skill with a generic skill icon, but it would be named something like <code>CuttheGuy.png</code>. <br>
<br>
Other properties are more straight-forward. They are the same <a href="https://docs.godotengine.org/en/stable/getting_started/scripting/gdscript/gdscript_exports.html">exported member variables</a> declared in the node's attached .GD script, followed by an equal sign and the value. <br>
</ul>
<br>
<h3>overall </h3><br>
They aren't so confusing when read as text files. The Godot team must have planned them to be human-readable. :) <br>
<br>
<h2>altar of spellmaking </h2><br>
So as you modify the groups and properties of a node, the engine is actually just formatting your input into text files. Since I have a functional understanding of how to manually format data, I can write a skill-formatting script to do it for me. <br>
<br>
The tool is named "Altar of Spellmaking" as an Oblivion reference and uses JSON + Python3. <a href="https://docs.godotengine.org/en/stable/classes/class_json.html">Godot can interpret JSON files on its own</a>, so maybe someday the game will automatically generate skills from on the JSON file at load time. For now, though, I see a frivolous excuse to use Python, so the interpreter is going to be in Python. Its input shall be a JSON file, and its output shall be matching .TSCN + .GD files. <br>
<br>
<h3>writing a skill with JSON </h3><br>
JSON isn't a Turing complete language, just a notation. It looks like a dictionary and uses attribute-value relationships. It's good at storing nested groups of information and can be easily interpretted by other languages. Since my skills can be described as a collection of attributes + keyword effects, they can wrestled into the JSON format. <br>
<br>
<center><img src="/static/img/ent/skill_json.png" alt="(image: The skill as it appears in the JSON file.)"></center>
(You can also see the text @ <a href="https://pastebin.com/aYvSr3NQ">Pastebin</a>.) <br>
<br>
All the repetitive, obvious, or derivative aspects of the skill do not need to appear in the JSON, since Python will be compensating. <br>
<br>
I identify the skill by its name in lower-case + underscores just for my sake. The program doesn't care what the skill's id is or if it has an id at all. <br>
<br>
Inside, I have some basic attributes like the id and associated class + stat. The tags will become some of the node's groups. The keywords take place in the skill's phases, which are lists of dictionaries. To build the skill phase, Python will interate over each item in the dictionary and use the internal data to supply the keyword's necessary input or conditions. <br>
<br>
Conditional effects look like the image below. <br>
<br>
<center><a target="_blank" href="/static/img/ent/skill_json_cond.png">
<img src="/static/img/ent/skill_json_cond.png" alt="(image: A skill entry with a conditional effect.)" width="500" height="255.24">
</a> <br></center>
(You can also see the text @ <a href="https://pastebin.com/khSwk8js">Pastebin</a>.) <br>
<br>
The <code>cond</code> consists of the <code>code</code> (literal GDscript code) and <code>desc</code> (an English translation of that code). It's not perfect, but it's quicker for me to just write the code and write the skill description than try to have Python translate. This does mean my code has to be perfect, and I have pressure to adhere to the standard language of a skill description. That's a problem, but it is much smaller than the problem of not using JSON at all. <br>
<br>
Eventually, I would prefer the desc to be an id from the translation spreadsheet instead of hard-coded text. (I discussed translation in <a href="https://www.blessfrey.me/diary/entries/201029">blessfrey in japanese</a>.) <br>
<br>
<h3>writing a Godot scene with Python3 </h3><br>
Using Python to format JSON values into a Godot scene + script is kind of ridiculous, so I have 168 lines of code and half of them start with <code>f.write</code>. Now that it's written, though, it's easy to maintain. Since the overall structure doesn't change, all I have to do is tweak a line here or there to reflect refactors. I'll include a picture of the main method, so you can get a sense of the flow of the program: <br>
<br>
<center><a target="_blank" href="/static/img/ent/skill_python.png">
<img src="/static/img/ent/skill_python.png" alt="(image: The main method in the Python script.)" width="500" height="272.73">
</a> <br></center>
(You can also see the text @ <a href="https://pastebin.com/2kV2LGCn">Pastebin</a>.) <br>
<br>
The output is a nested directory of all the skills, so I can just copy + paste the <code>skills</code> folder over the one in the engine. And it works! The first skill image's code looks machine-generated because it was. <br>
<br>
<center><a target="_blank" href="/static/img/ent/skill_dir.png">
<img src="/static/img/ent/skill_dir.png" alt="(image: skills>Common>Brawler>DirtyFighting>CuttheGuy, same directories as the engine.)" width="500" height="128.11">
</a> <br></center>
<br>
<h2>is it better than just making skills in the engine? </h2>
<br>
If I only had ten or eleven skills, then probably not. I'm planning on having around 40 skills per class, though, and I'm only one person. Since the skills are very formulaic, I'd rather have Python do all the copying + pasting for me while I worry about what makes my skills unique! <br>
<br>

@ -0,0 +1,34 @@
<!--210201,210401-->
<h1>march 2020: AI</h1>
april 1, 2021<br>
<br>
<br>
<h2>week 1, february 28 - march 6 </h2><br>
#ai #webdev <br>
<br>
<h3>monday, march 1 </h3>
<ul>
<li>I went on a walk for 3 hours. Before social distancing, I used to walk everywhere every day. It's so unhealthy to be inside all the time. </li>
</ul>
<br>
<h3>tuesday, march 2 </h3>
<ul>
<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>
</ul>
<br>
<h3>wednesday, march 3 </h3>
<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>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>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>
<br>
<h3>thursday, march 4 </h3>
<ul>
<li>Worked on the website. </li>
<li>Webpages that used my minimal CSS file were broken for a few days. I finally fixed it. It was so simple - the global margins were set too high. I also made the news box on the homepage a little taller. </li>
<li>Made the <a href="https://www.blessfrey.me/credits">credits</a> more compliant with Godot Engine's <a href="https://docs.godotengine.org/en/latest/about/complying_with_licenses.html">Complying with Licenses</a> page. </li>
</ul>
<br>

File diff suppressed because one or more lines are too long

@ -0,0 +1,18 @@
<!--200917,201112-->
<h1>writing resources </h1>
march 4, 2021<br>
<br>
<br>
Blessfrey has a story and character arcs. Let's get more confident with our story with online resources. <br>
<br>
<h2>plot </h2><br>
<ul>
<li><a href="https://www.youtube.com/watch?v=v-I9N5LsvPM">Ellen Brock - How to Plot Your Novel FAST | Writing Advice</a> - She takes a randomly generated story idea and builds the plot using techniques she uses with her clients. Summarize the basic idea, ask questions about what you don't know, answer the questions, make a list of all the scenes you know should be included, go back and flesh things out. </li>
</ul>
<br>
<h2>general </h2><br>
<ul>
<li><a href="https://www.youtube.com/c/QuotidianWriter/videos">Diane Callahan - Quotidian Writer</a> </li>
<li><a href="https://tvtropes.org/">TV Tropes</a> </li>
</ul>
<br>

@ -86,6 +86,7 @@ citrine
city of the dead
clipart
clover
cobweb
coin flip
cold iron
confetti
@ -423,6 +424,7 @@ squid
spellbook
spelunking
spice cookie
spiderweb
spirit animal
spy
stained-glass

@ -3,5 +3,63 @@
january 6, 2020<br>
<br>
<br>
Today, the March for Trump resulted in a Capitol break-in. The photos are like something out of a videogame. I took them from Twitter, so I can't easily credit. <br>
The March for Trump interrupted Congress during the joint session to certify the Electoral College vote. It looks like a Far Cry game. All photos are stolen from Twitter, so sorry for inconsistent credits + quality. <br>
<br>
<center><a target="_blank" href="/static/img/ext/stealthevote_18.png">
<img src="/static/img/ext/stealthevote_18.png" alt="(image: pro-Trump crowds gather around Capitol Hill)" width="500" height="371.35">
</a></center>pro-Trump crowds gather around Capitol Hill <br>credit: Anadolu Agency, Getty Images <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_16.jpeg">
<img src="/static/img/ext/stealthevote_16.jpeg" alt="(image: civilians scale Capitol Hill)" width="500" height="333.25">
</a></center>civilians scale Capitol Hill <br>credit: Stephanie Keith, REUTERS <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_2.jpeg">
<img src="/static/img/ext/stealthevote_2.jpeg" alt="(image: civilians scale Capitol Hill)" width="500" height="667">
</a></center>civilians scale Capitol Hill <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_20.png">
<img src="/static/img/ext/stealthevote_20.png" alt="(image: civilians clash with D.C. police)" width="500" height="333">
</a></center>civilians clash with D.C. police <br>credit: Julio Cortez, AP <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_1.jpeg">
<img src="/static/img/ext/stealthevote_1.jpeg" alt="(image: civilians clash with D.C. police)" width="500" height="333.25">
</a></center>civilians clash with D.C. police <br>credit: Julio Cortez, AP <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_4.jpeg">
<img src="/static/img/ext/stealthevote_4.jpeg" alt="(image: civilian dangles from Senate Chamber)" width="500" height="333.44">
</a></center>civilian dangles from Senate Chamber <br>credit: Win McNamee, Getty Images <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_17.jpg">
<img src="/static/img/ext/stealthevote_17.jpg" alt="(image: protestors breach the Capitol Building)" width="500" height="333.57">
</a></center>civilians confront Capitol security <br>credit: Manuel Balce Ceneta, AP <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_10.jpeg">
<img src="/static/img/ext/stealthevote_10.jpeg" alt="(image: civilian clashes with Capitol security)" width="500" height="358.09">
</a></center>civilian clashes with Capitol security <br>credit: Kevin Dietsch / Pool, EPA <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_7.png">
<img src="/static/img/ext/stealthevote_7.png" alt="(image: representatives take cover in the Capitol)" width="500" height="333.33">
</a></center>representatives take cover in the Capitol <br>credit: Tom Williams / CQ-Roll Call, Inc, Getty Images <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_3.jpeg">
<img src="/static/img/ext/stealthevote_3.jpeg" alt="(image: armed standoff with police as civilians break into House Chamber)" width="500" height="333">
</a></center>armed standoff with police as civilians break into the House Chamber <br>credit: J. Scott Applewhite, AP <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_11.png">
<img src="/static/img/ext/stealthevote_11.png" alt="(image: Capitol Building in disarray during breach)" width="500" height="667">
</a></center>Capitol Building in disarray during breach <br>credit: Olivier Douliery, AFP <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_12.png">
<img src="/static/img/ext/stealthevote_12.png" alt="(image: Capitol Building in disarray during breach)" width="500" height="667">
</a></center>Capitol Building in disarray during breach <br>credit: Olivier Douliery, AFP <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_9.png">
<img src="/static/img/ext/stealthevote_9.png" alt="(image: police munition explosion on Capitol Hill)" width="500" height="333.25">
</a></center>police munition explosion on Capitol Hill <br>credit: Evelyn Hockstein, The Washington Post <br>
<br><br>
<center><a target="_blank" href="/static/img/ext/stealthevote_8.png">
<img src="/static/img/ext/stealthevote_8.png" alt="(image: Capitol Hill engulfed in tear gas and smoke)" width="500" height="333.25">
</a></center>Capitol Hill engulfed in tear gas and smoke <br>credit: Leah Millis, REUTERS <br>
<br>
last updated 2/21/21 <br>
<br>

@ -0,0 +1,72 @@
<!---->
<h1>to do </h1>
january 30, 2020<br>
<br>
<br>
A to-do list I can see anywhere with Wi-Fi. <br>
<br>
<h2>UI </h2>
<ul>
<li>Get close to something that does something - it is highlighted. Character, floor item, activator, door. </li>
<li>Adjust layer for all canvas layers </li>
<li>Can click & drag UI elements - Phone, Skill Library, Bingo Card, etc. </li>
<li>Can modify and save/load/default all UI elements </li>
</ul>
<br>
<h2>Skill </h2>
<ul>
<li>Description values update with stat changes </li>
</ul>
<br>
<h2>Tools </h2>
<ul>
<li>Match Altar of Spellmaking output to current refactored skill script/scenes </li>
</ul>
<br>
<h2>Codes </h2>
<ul>
<li>1 - skill </li>
<li>2 - char </li>
<li>3 - item </li>
<li>4 - location </li>
<li>5 - app </li>
</ul>
<br>
<h3>Skill - 0x100f00f00f </h3>
<ul>
<li>1 - skill </li>
<li>00f - profession. Brawler(1) </li>
<li>00f - stat </li>
<li>00f - individual skill </li>
</ul>
<br>
<h3>Char - 0x3f0f00f00f </h3>
<ul>
<li>3 - char </li>
<li>f - category. DG(1), NPC(2), Boss(3) </li>
<li>0f - race. Human(1), Angel(2), Cat(3), Slime(4)</li>
<li>00f - faction. None(0), DG(1) </li>
<li>00f - individual </li>
</ul>
<br>
<h3>Item - 0x31f00f000f </h3>
<ul>
<li>3 - item </li>
<li>1 - essential </li>
<li>f - category. Currency(1), Consumable(2), Equipment(3), Trophy(4), Sign(5), Literature(6) </li>
<li>00f - subcategory </li>
<li>000f - individual </li>
</ul>
<br>
<h3>Loc - 0x41f00f000f </h3>
<ul>
<li>4 - location </li>
<li>1 - interior/exterior </li>
<li>0f - category. Dungeon(1), School(2), Mall(3) </li>
<li>0f - subcategory </li>
<li>000f - individual </li>
</ul>
<br>

@ -288,7 +288,7 @@ def box():
@route('/credits')
def credits():
"""credits page"""
info = {'css': 'box', 'title': 'blessfrey - credits', 'year': datetime.datetime.now()}
info = {'css': 'contact', 'title': 'blessfrey - credits', 'year': datetime.datetime.now()}
return template('credits.tpl', info)
@ -296,7 +296,7 @@ def credits():
@route('/contact')
def contact():
"""contact page"""
info = {'css': 'box', 'title': 'blessfrey - contact chimchooree', 'year': datetime.datetime.now()}
info = {'css': 'contact', 'title': 'blessfrey - contact chimchooree', 'year': datetime.datetime.now()}
return template('contact.tpl', info)
# Idea Box Page - Box Template

@ -1,6 +1,5 @@
* {
padding:25;
margin:25;
font-family: trebuchet ms; arial; calibri; gill sans; helvetica neue; candara; geneva; verdana; sans-serif;
}
a {
@ -43,6 +42,7 @@ body {
.content { grid-area: 3 / 2 / 4 / 3; }
.nav-row { grid-area: 2 / 1 / 3 / 4; }
.nav-grid {
grid-area: 2 / 2 / 3 / 3;
display: flex;

@ -0,0 +1,118 @@
* {
padding:0;
margin:0;
font-family: trebuchet ms; arial; calibri; gill sans; helvetica neue; candara; geneva; verdana; sans-serif;
font-size: 18px;
}
a {
text-decoration: none;
}
a:link {
color: red;
}
a:visited {
color: hotpink;
}
a:hover {
color: green;
}
a:active {
color: blue;
}
mark {
background-color: #900C3F;
color: hotpink;
}
ul { list-style-position: inside; }
h1 { font-size: 30px;}
h2 { font-size: 25px;}
.grid {
display: grid;
grid-template-columns: auto 800px auto;
grid-template-rows: 25px 90px auto;
grid-column-gap: 0px;
grid-row-gap: 0px;
}
body {
background-color: #e5c5d1;
color: #900C3F;
}
.whitespace { grid-area: 1 / 1 / 2 / 4; }
.blessfrey-logo { grid-area: 1 / 2 / 2 / 3; }
.body-row { grid-area: 3 / 1 / 4 / 4; }
.content { grid-area: 3 / 2 / 4 / 3;}
.nav-row { grid-area: 2 / 1 / 3 / 4; }
.nav-grid {
grid-area: 2 / 2 / 3 / 3;
display: flex;
flex-direction:column;
justify-content:flex-end;
display: grid;
grid-template-columns: auto repeat(4, 70px) auto;
grid-template-rows: 90px;
grid-column-gap: 17px;
grid-row-gap: 0px;
align-items: end;
justify-items: center;
}
.nav-bar {
grid-area: 1 / 1 / 2 / 7;
background-image: url(../img/ele/navbar.png);
height: 86px;
width: 800px;
}
.nav-index {
grid-area: 1 / 2 / 2 / 3;
padding-bottom: 3px;
position: relative;
}
.nav-game {
grid-area: 1 / 3 / 2 / 4;
padding-bottom: 3px;
position: relative;
}
.nav-diary {
grid-area: 1 / 4 / 2 / 5;
padding-bottom: 3px;
position: relative;
}
.nav-presskit {
grid-area: 1 / 5 / 2 / 6;
padding-bottom: 3px;
position: relative;
}
.nav-link {
position: absolute;
top: 45%;
left: 50%;
transform: translate(-50%, -50%)
}
.nav-link a {
font-size: 18px;
}
.nav-link a:link {
color: #66C7F4;
}
.nav-link a:visited {
color: #CB9CF2;
}
.nav-link a:hover {
color: #F9B3D7;
}
.nav-link a:active {
color: #f463ad;
}
.footer-content {
padding-top: 5px;
text-align: right;
overflow: hidden;
}

@ -138,7 +138,7 @@ a {
flex-direction:column;
background-color: #581845;
color: #F9B3D7;
height: 85px;
height: 150px;
overflow-y: scroll;
margin-right: 0px;
margin-left: 0px;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 780 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

@ -1,13 +1,22 @@
% rebase('frame.tpl')
<!--Content-->
<div class="content">
<h1>chimchooree</h1>
<h2>contact - general + business</h2>
Reach me through Twitter as <a href="https://twitter.com/lilchimchooree" rel="nofollow">@lilchimchooree</a> or Discord as chimchooree#7250.<br>
<br><br>
<h1>chimchooree</h1> <br>
<h2>hello</h2> <br>
I'm just a US-based indiedev who's learning to program through game development + web development. My hobbies include enjoy studying Japanese, translating isekai manga for others, and playing 90s/00s CRPGs + JRPGs. <br>
<br>
To practice different languages, I bounce among a few solo projects in Godot Engine, Java, and Python. My main project is a widely scoped ARPG dungeon crawler called Blessfrey, which I hope to release a demo for soon. <br>
<br>
Feel free to say hello, especially if you're interested in gamedev, too. <br>
<br>
<h2>general + business contact</h2><br>
<ul>
<li>chimchooree<span style="display: none;">OBFUSCATION</span>@mail.com</li>
<li>twitter: <a href="https://twitter.com/lilchimchooree" rel="nofollow">@lilchimchooree</a> </li>
<li>flightrising: <a href="https://flightrising.com/main.php?p=lair&tab=userpage&id=525948">Aristene</a> </li>
</ul>
<br>
<h2>a few personal pages</h2>
<ul>
<li>Books </li>
</ul>
<br><br><br><br>
</div>
<div class="footer-row"> </div>

@ -1,70 +1,160 @@
% rebase('frame.tpl')
<!--Content-->
<div class="content">
<h1>Credits</h1><br>
<br>
game + art by chimchooree<br>
(all assets are placeholder)<br>
<br>
game engine: <a href="https://godotengine.org/">godot engine</a>, by <a href="https://github.com/godotengine/godot/blob/master/AUTHORS.md">Juan Linietsky, Ariel Manzur and contributors</a><br>
<h2>engine </h2><br>
game engine: <b><a href="https://godotengine.org/">Godot Engine</a></b> <br>
<a href="https://github.com/godotengine/godot/blob/master/AUTHORS.md">Juan Linietsky, Ariel Manzur and contributors</a> <br>
license: <a href="https://godotengine.org/license">MIT License</a> <br>
text: <br>
"Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. <br>
Copyright (c) 2014-2021 Godot Engine contributors. <br>
<br>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: <br>
<br>
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software. <br>
<br>
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. <br>
<br>
-- Godot Engine <a href=https://godotengine.org>&lthttps://godotengine.org&gt</a>" <br>
<br>
<br>
<h3>third parties used by Godot Engine </h3><br>
I may or may not use these. <br>
<br>
<b><a href="https://www.freetype.org">FreeType</a></b> <br>
license: <a href="https://gitlab.freedesktop.org/freetype/freetype/-/blob/master/docs/FTL.TXT">FreeType License</a> <br>
text: <br>
"Portions of this software are copyright © <year> The FreeType Project (www.freetype.org). All rights reserved." <br>
<br>
<b><a href="http://enet.bespin.org/">ENet</a></b> <br>
Lee Salzman <br>
<a href="https://enet.bespin.org/License.html">license</a> <br>
text: <br>
"Copyright (c) 2002-2020 Lee Salzman <br>
<br>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: <br>
<br>
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. <br>
<br>
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." <br>
<br>
<b><a href="https://tls.mbed.org/">MBedTLS</a></b> <br>
The Mbed TLS Contributors <br>
license: <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> <br>
text: <br>
"Copyright The Mbed TLS Contributors <br>
<br>
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at <br>
<br>
<a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a> <br>
<br>
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." <br>
<br><br>
<h2>audio </h2><br>
background music: "straight" <br>
Benjamin "Bensound" Tissot<br>
<a href="https://www.bensound.com/royalty-free-music/track/straight">https://www.bensound.com/royalty-free-music/track/straight</a><br>
license: Creative Commons License<br>
<a href="https://www.bensound.com/royalty-free-music/track/straight">https://www.bensound.com/royalty-free-music/track/straight</a> <br>
license: <a href="https://www.bensound.com/licensing">Free License With Attribution</a> <br>
text: "Royalty Free Music from Bensound" <br>
<br>
background music: "energy" <br>
Benjamin "Bensound" Tissot<br>
<a href="https://www.bensound.com/royalty-free-music/track/energy">https://www.bensound.com/royalty-free-music/track/energy</a><br>
license: Creative Commons License<br>
license: <a href="https://www.bensound.com/licensing">Free License With Attribution</a> <br>
text: "Royalty Free Music from Bensound" <br>
<br>
background music: "save"<br>
LokiF<br>
<a href="https://opengameart.org/content/gui-sound-effects">https://opengameart.org/content/gui-sound-effects</a><br>
license: Public Domain CC0<br>
license: <a href="https://creativecommons.org/publicdomain/zero/1.0/">Public Domain CC0</a> <br>
<br>
door sound: "Abandoned Villa- Thailand! Door Knocker & Door Knocking Sound Effects"<br>
freetousesounds <a href="https://freetousesounds.bandcamp.com/album/abandoned-villa-thailand-door-knocker-door-knocking-sound-effects">https://freetousesounds.bandcamp.com/album/abandoned-villa-thailand-door-knocker-door-knocking-sound-effects</a><br>
license: Attribution 3.0 Unported (CC BY 3.0) <br>
freetousesounds <br>
<a href="https://freetousesounds.bandcamp.com/album/abandoned-villa-thailand-door-knocker-door-knocking-sound-effects">https://freetousesounds.bandcamp.com/album/abandoned-villa-thailand-door-knocker-door-knocking-sound-effects</a><br>
license: <a href="https://creativecommons.org/licenses/by/3.0/">Attribution 3.0 Unported (CC BY 3.0)</a> <br>
<br>
click sound: "Click 1" from the UI SFX set<br>
Kenney Vleugels<br>
<a href="https://www.kenney.nl/assets/ui-audio">https://www.kenney.nl/assets/ui-audio</a><br>
license: Public Domain CC0<br>
license: <a href="https://creativecommons.org/publicdomain/zero/1.0/">Public Domain CC0 1.0 Universal</a> <br>
<br>
wrong sound: "Wrong 02"<br>
NoiseForFun.com <br>
<a href="https://www.noiseforfun.com/2012-sound-effects/wrong-02/">https://www.noiseforfun.com/2012-sound-effects/wrong-02/</a><br>
license: CC-BY-ND 3.0 Attribution license<br>
license: <a href="https://creativecommons.org/licenses/by-nd/3.0/">CC-BY-ND 3.0 Attribution license</a> <br>
<br>
skill failure sound: "Negative" from the GUI Sound Effects set<br>
LokiF<br>
<a href="https://opengameart.org/content/gui-sound-effects">https://opengameart.org/content/gui-sound-effects</a><br>
license: Public Domain CC0<br>
license: <a href="https://creativecommons.org/publicdomain/zero/1.0/">Public Domain CC0</a> <br>
<br>
appraise sound: "Shimmer Glimmer Magic"<br>
The Berklee College of Music <br>
submitted to Open Game Art by qubodup<br>
<a href="https://opengameart.org/content/shimmer-glitter-magic">https://opengameart.org/content/shimmer-glitter-magic</a><br>
license: CC-BY 3.0<br>
license: <a href="https://creativecommons.org/licenses/by/3.0/">CC-BY 3.0</a> <br>
<br>
summon sound: "Elemental Spell"<br>
Iwan "qubodup" Gabovitch<br>
<a href="https://opengameart.org/content/elemental-spell">https://opengameart.org/content/elemental-spell</a><br>
license: CC Attribution-ShareAlike 3.0 Unported<br>
Copyright 2012 Iwan 'qubodup' Gabovitch http://qubodup.net qubodup@gmail.com | License: CC Attribution-ShareAlike 3.0 Unported <a href="http://creativecommons.org/licenses/by-sa/3.0/">http://creativecommons.org/licenses/by-sa/3.0/</a><br>
license: <a href="https://creativecommons.org/licenses/by-sa/3.0/">CC Attribution-ShareAlike 3.0 Unported</a> <br>
text: "Copyright 2012 Iwan 'qubodup' Gabovitch <a href="http://qubodup.net">http://qubodup.net</a> qubodup<span style="display: none;">OBFUSCATION</span>@gmail.com | License: CC Attribution-ShareAlike 3.0 Unported <a href="http://creativecommons.org/licenses/by-sa/3.0/">http://creativecommons.org/licenses/by-sa/3.0/</a>" <br>
<br>
bingo win sound: "Positive"<br>
Lokif<br>
<a href="https://opengameart.org/content/gui-sound-effects">https://opengameart.org/content/gui-sound-effects</a><br>
license: Public Domain CC0<br>
<br>
license: <a href="https://creativecommons.org/publicdomain/zero/1.0/">Public Domain CC0</a> <br>
<br><br>
<h2>fonts </h2><br>
font: JFドットjiskan16 (JF Dot Jiskan16)<br>
Sony Corp<br>
<a href="http://jikasei.me/font/jf-dotfont/">http://jikasei.me/font/jf-dotfont/</a><br>
license: Public Domain, stored in art/Fonts/Documentation/JF Dot Jiskan16/readme.txt<br>
license: <a href="https://creativecommons.org/publicdomain/zero/1.0/">Public Domain</a>, stored in res/fonts/Documentation/JF Dot Jiskan16/readme.txt<br>
text: <br>
"8x16 / 8x16rk / 12x24 / 12x24rk <br>
------------------------------- <br>
<br>
Copyright 1989 by Sony Corp. <br>
<br>
Permission to use, copy, modify, and distribute this software and
its documentation for any purpose and without fee is hereby granted,
provided that the above copyright notices appear in all copies and
that both those copyright notices and this permission notice appear
in supporting documentation, and that the name of Sony Corp.
not be used in advertising or publicity pertaining to distribution
of the software without specific, written prior permission. Sony
Corp. makes no representations about the suitability of this
software for any purpose. It is provided "as is" without express or
implied warranty. <br>
<br>
SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL SONY BE LIABLE FOR ANY
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE." <br>
<br>
font: pixel joy<br>
chimchooree<br>
<a href="https://fontstruct.com/fontstructions/show/1596262/pixel-joy">https://fontstruct.com/fontstructions/show/1596262/pixel-joy</a><br>
license: Public Domain<br>
font: pixel joy <br>
chimchooree <br>
<a href="https://fontstruct.com/fontstructions/show/1596262/pixel-joy">https://fontstruct.com/fontstructions/show/1596262/pixel-joy</a> <br>
license: <a href="https://creativecommons.org/publicdomain/zero/1.0/">Public Domain<a/> <br>
<br><br>
<div class="footer-row"> </div>
</div>

@ -2,7 +2,11 @@
<div class="sidebar">
<div class="about-box">
<h1>about</h1>
<b>blessfrey</b> is a 2D action RPG developed for PC. Build the best skillbar against the next challenge.<br>
<b>blessfrey</b> is a 2D action RPG developed for PC in Godot Engine. <br>
<br>
Edit your skillbar from hundreds of skills to fight enemies, solve puzzles, + explore. <br>
<br>
Inspired by Guild Wars 1 and Magic: The Gathering. <br>
</div>
<div class="twitter-box">

@ -80,14 +80,14 @@
href='http://twitter.com/share?text={{s[4]}}
&url=https://blessfrey.me{{s[3]}}&via=lilchimchooree'
target="_blank">tweet</a>
• <a class="social-link social-fb"
href='http://www.facebook.com/share.php?u={{s[3]}}'>facebook</a>
<!--• <a class="social-link social-fb"
href='http://www.facebook.com/share.php?u={{s[3]}}'>facebook</a> -->
% message = "Hey,+check+out+this+post:+" + s[1] + ".,+" + s[3]
% message = message.replace('+','\+')
% message = re.sub('\s+?','+', message)
% message = message.replace('\\','')
% message = re.sub('<.*?>','', message)
• <a class="social-link social-email" href='mailto:?body={{message}}'>email</a></b>
<!--• <a class="social-link social-email" href='mailto:?body={{message}}'>email</a>--></b>
</div>
<div class="snippet-link">
<a href={{s[3]}} rel="nofollow"><b>read more</b></a>

@ -18,6 +18,20 @@
But there's more than slimes beneath the city. There's a whole secret world down there. <br>
<br>
</div>
<div class="textbox characters">
<h1>Characters</h1><br>
<br>
<h2>Main Characters</h2><br>
Helia - the main character. They don't have as strong a culture of self-defense where she comes from, so she has to pick her specializations at the start of the game. <br>
Angel - the first character you meet. She's really tall but easily pushed around. She specializes in heavy swords + computers. <br>
Tessa - a silly girl that can take jokes too far. She's half-French but has a better grade in Spanish than French class. She specializes in hand-to-hand combat and pets. <br>
Chloe - the orphan girl who lives in the church. She wants to make other people happy and will never confront someone. She specializes in performing miracles. <br>
Aries - Angel's twin brother. He's quick to make decisions + act on them, but can be too assertive. He specializes in ranged weapons + short swords. <br>
Night - the local apothecary. He's high-school-aged, too, but already completed a clinical residency. He specializes in poisons + daggers. <br>
Rune - a mysterious horned boy found living under the town. He's generally clueless about everything and can barely speak English. <br>
<br>
<h2>Side Character </h2>
</div>
<div class="textbox system">
<h1>System</h1><br>
<br>

@ -14,10 +14,15 @@
% if j + i * limit < len(words):
<th>{{words[j + i * limit]}}</th>
% end
% if i >= ((math.ceil(len(words) / limit)) - 1) and j >= limit - 1:
% for k in range(limit - (len(words) % limit)):
<th> </th>
% end
% end
% end
% end
</tr>
% end
</table>
<br>
</div>
<div class="footer-row"> </div>

@ -16,7 +16,7 @@
<li><b>Platforms:</b> Linux, Windows, possibly more</li>
<li><b>Engine:</b> Godot Engine</li>
<li><b>Website:</b> blessfrey.me</li>
<li><b>Contact + Social:</b> <a href="https://twitter.com/lilchimchooree" rel="nofollow">Twitter @lilchimchooree</a></li>
<li><b>Contact + Social:</b> Email: chimchooree<span style="display: none;">OBFUSCATION</span>@mail.com, <a href="https://twitter.com/lilchimchooree" rel="nofollow">Twitter: @lilchimchooree</a></li>
</ul><br>
</div>

@ -0,0 +1,6 @@
#!/bin/bash
python3 -m venv venv/
source venv/bin/activate
cd src/
python3 index.py
Loading…
Cancel
Save