diff --git a/src/diary/entries/hold/240221 b/src/diary/entries/hold/240221
new file mode 100644
index 0000000..de9e9be
--- /dev/null
+++ b/src/diary/entries/hold/240221
@@ -0,0 +1,67 @@
+
+
making of blessfrey.me
+october 15, 2020
+#bottle #css #html #simpletemplate #webdesign #webdevelopment
+
+Blessfrey.me is a personal website I use to showcase projects and blog my process. It was originally written in PHP, but now it uses Bottle, a Python web framework.
+
+
why not use a premade blogging platform like WordPress?
+Blessfrey.me's needs are fairly simple - some static pages and a blog page. Generalized blogging platforms are overkill for my purposes. I don't need support for multiple authors, comments, localization, e-commerce, and so on. Unused features bog down the website at best and contribute to security vulnerabilities at worst.
+
+Also, it's fun to write my own platform. I'm learning a lot as I take my website from initial sketches, to Hello World, to various prototypes, to something polished enough to show my friends. Regardless, since it can be considered my programming portfolio, it makes sense that it itself should be something I programmed.
+
+
why Bottle?
+I originally wrote Blessfrey.me in PHP. I switched to Bottle after looking for a templating engine. Bottle comes with SimpleTemplate and can do everything PHP can do but faster and with less verbosity. Plus, I get to write in Python, a much more enjoyable language.
+
+
how does blessfrey.me work?
+
SimpleTemplate
+Instead of existing as a static collection of HTML pages on my server, Blessfrey.me's pages are constructed upon request by the website's Bottle script from SimpleTemplate templates.
+
+Every page uses the frame template pictured below, so the basic skeleton is consistent without requiring copy-pasted code. Each page is individualize through bringing in a new template within {{!base}}. (Double curly brackets refer to variables, and exclamation marks disable escaping.)
+
+
+
+(The code can be found on Pastebin.)
+
+The header template below (brought in at % include('header.tpl')) has some variables, too, which are supplied by the Bottle script. If Bottle doesn't provide a title, it defaults to 'blessfrey.me.' Variables can also be used in paths and URLs.
+
+
+
+(The code can be found on Pastebin.)
+
+You can insert Python code into the templates for dynamic pages. Below is an excerpt of the template for the diary page. This code fills the page with diary entry previews using a for loop. Not shown is the first line % rebase('frame.tpl'), which tells SimpleTemplate to insert this content at the {{!base}} variable in the frame template.
+
+
+
+(The code can be found on Pastebin.)
+
+The Bottle script sends the max number of snippets per page (the limit) and a list of lists containing all the diary snippets. It receives the page number from the URL. For the snippets that will appear on the given page, it converts the list data into HTML code to be displayed in the browser.
+
+
+
Bottle
+Bottle takes URLs and generates the corresponding web page upon request. Each URL is tied to a method, which returns a template and a dictionary of data to be used in the template. Since Bottle is a Python framework, you have access to all the Python libraries you need.
+
+
+
+(The code can be found on Pastebin.)
+
+This is what the methods for specific routes look like. So every time you go to Blessfrey.me/diary, one of the above methods is called, depending on whether also you supplied an integer. To generate the page content, it calls a lot of Python functions to find my diary entries, convert them into previews for the snippets section and headlines for the sidebar, and get the current time for the footer.
+
+
+
+
CSS
+The website is styled using CSS, heavily relying on the CSS Grid and a bit of Flexbox. CSS Grids can be used inside CSS Grids, so my pages are generally blocked out, with smaller internal grids managing specific content.
+
+
+
+
+The projects page is an example of nested grids. Almost every page uses the yellow general layout. The content unique to the projects page is mapped out in green, with a section for the header, featured projects, and other projects. The other projects use a 2-column grid in blue to evenly space out all the little thumbnails.
+
+The CSS code for project's general grid and the nested unfeatured grid are shown below.
+
+
+
+(The code can be found on Pastebin, but you can always see a web page's CSS by right-clicking and viewing the source.)
+
+Last updated June 8, 2021
+
diff --git a/src/diary/entries/hold/240222 b/src/diary/entries/hold/240222
new file mode 100644
index 0000000..0932b9d
--- /dev/null
+++ b/src/diary/entries/hold/240222
@@ -0,0 +1,70 @@
+
+
my first game jam - #weeklygamejam
+september 3, 2020
+#gamejam
+
+WeeklyGameJam is a weekly theme-based game jam hosted through itch.io. It's fairly laid-back for a jam, giving you a full week's time, allowing for premade/stock assets and code, and being understanding towards late submissions. Most people make videogames, but any kind of game is allowed. At the end of the week, streamers will play and critique the submissions while the developers hang out in their chatrooms.
+
+
+
+
small thing that makes things
+
+I participated in Week 85 under the theme Offspring, submitting my game on February 27, 2019. My game was Small Thing That Makes Things, an adventure platformer. You can play it on itch.io.
+
+You play as Hamish T. Elwell, the hero accountant of an overcrowded animal shelter, investigating the recent explosion of the local stray population. You can walk, jump on platforms, collect items, and chat with NPCs. There's multiple endings, depending on your choices.
+
+
positives
+
+For a week-made game, I think STTMT is pretty cute, and I'm pretty happy with it.
+
+I actually finished a game, and someone actually finished playing it on a stream. That's really cool, even if STTMT isn't all that good. The deadline forced me to make final decisions, complete features, and move on, and there's a lot of value in that.
+
+The short time-frame forced me to get around to every aspect of game development, many of which I had never done before. I had to learn how to export a Godot project, upload an HTML5 game to itch, and make sure the exported game was complete and playable. Lots of the features were first-times for me, too. I've never written code for platformer movements or moving cameras. This also was the first time I've really gotten branching and conditional dialog working in Godot, which was a skill I immediately applied to Blessfrey.
+
+
mistakes
+
+I recolored OPP's pixel art and lost the high contrast for the rock ledges. They blend into the rocky background, so you can't tell you can jump on them. I didn't even notice until Joshua McLean pointed this out during his stream. Having more eyes on your game is so important.
+
+Also the level design is just not interesting. I spent lots of time on the choices and adventure game aspects, while the platforming as an extreme afterthought. It's a game jam, though, what do you expect?
+
+I took the easy way out with animation. I might have learned more working from scratch, but modifying OPP's sprites to suit my character designs was way faster when I was already struggling to finish on time.
+
+
screenshots + progression
+
+
+
+
+Experimenting with Small Thing's summoning mechanic. In this version, the characters are just blocks with collision that can move around the flat, empty world with WASD.
+
+
+
+
+The dog spawning physics was (and still is) really broken, so dogs go flying pretty frequently. It was reliable enough in this version to be used as a moving platform.
+
+
+
+
+Dogs rain down upon Elwell's animal shelter in the finished version.
+
+
+If you're looking for a jam to jump into, WeeklyGameJam is a cute one to try. You aren't too rushed, you get to watch people play your game, you get useful criticism, and the community is pretty chill. The themes are always inspiring, too.
+
+
+november 26, 2020
+#sideproject
+
+Getting started with blessfrey's AI was overwhelming, so I took a break and worked on a new game. I didn't get very far. It's not even on my hard drive anymore. It's cute, though.
+
+Unlike blessfrey, where coding takes up 90% of the effort, pretendOS is mostly graphical assets + sounds with barely any functionality. It's a UI game, after all. Since it's a game requiring a completely opposite skill-set, I was able to make progress on something while reading up on game AI. I also got to work on new things like particle effects.
+
+
+
Inspiration
+
+
Windows XP
+The game takes strong aesthetic inspiration from Windows XP and the NDS. It almost fits the 90s vaporwave trend, but I'm too young to really remember Windows 95. I obviously have nostalgia for it as my first operating system (as far as I remember - I was a toddler then), but I mostly knew it as the Lego Island machine propped up in the dining room. As my family upgraded computers over the years, Windows never really impacted me as anything more than something that can run some videogames and whatever popular web browser of the time. That is, until Windows XP.
+
+XP really hooked me. It was the first operating system I spent as much time exploring as I spent using software. XP's edition of Paint was my favorite yet, I loved fiddling with the themes and accessibility options, especially Microsoft Sam, Rover, and Clippy. I started watching YouTube videos on how to use the Command Prompt. XP was just fun to use. I've found better desktop environments and operating systems since, but I never got over that aesthetic: smooth, blended graphics with hard pixel edges in 32-bit color with an alpha channel, right at the cusp between pixel art and vector graphics. Vaporwave for me is Luna olive green, or the "Fisher-Price interface" as Ars Technica users called it.
+
+
+(screenshot from Wikipedia - referencing articles from PCWorld and Ars Technica)
+
+
+There were a few other experiences behind the game, too.
+
+
Mother's Day E-Card
+I finally got my husband to try Godot Engine, and he used it to make a digital Mother's Day card for his mom. (Cute.) Opening the card displayed a 3D heart (a "cardioid") that bounced to the beat of a song while 2D cardioid particles rained down. It was all programmatically generated using geometry instead of 3D + 2D assets, so the application was very small. He made the graphics side of things look really interesting, and I wanted to play around with particles, too. Just...not as fancy;;
+
+
Secret Little Haven
+I also just played a cute pretend OS game on itch called Secret Little Haven It's quite short, very story-driven, and kind of buggy, telling Alex's struggle with gender identity through IMs. Honestly, pretend OS games and coming-of-age chat sims are nothing special, but Secret Little Haven's believability makes it really stand out. Instead of defending against cheesy + inaccurate deep web hacking attempts, you use an in-game terminal to get around child locks set by Alex's dad. Those terminal puzzles are the most realistic and relatable hacking I've seen in these games. SLH isn't super sophisticated or in-depth, but it shows how cute and believable a pretend OS game can be. I'd love to make a little environment like that, that's as fun to fiddle around with as XP.
+
+
+
pretendOS
+
+So what's pretendOS? Like I said, not much besides pictures. I only worked on it for a few days.
+
+What really bogged it down was Cat Chat. I wanted an AI chat personality that talked like a cat. I could do that, but that kind of thing takes a lot of time, when this project was really just procrastinating working on AI.
+
+The rest is cute, though. The icon winks when you click it, the cursor's kinda 2000s-free-animated-cursors, and it's got those Fisher-Price colors and bubbly sounds everywhere that I liked as a kid.
+
+
+
+It's cute. I'd like it to be finished in some way. I went ahead and cloned my old repo. Maybe I'll fill it out with more applications during a game jam or something or at least finally get that cool Secret Little Haven curved screen shader working.
+
diff --git a/src/diary/entries/hold/240224 b/src/diary/entries/hold/240224
new file mode 100644
index 0000000..70a6565
--- /dev/null
+++ b/src/diary/entries/hold/240224
@@ -0,0 +1,43 @@
+
+
blessfrey graphic updates + mockups
+december 24, 2020
+#mockups #screenshots
+
+I iterate over the graphics periodically, so I can practice without worrying about polish. Here's some screenshots of different styles I've tried. (Though April 23, 2019's is actually a mockup, that style did run in-engine for a few weeks.)
+
+
+
+
+
+August 15, 2018 - Early experimenting with Godot Engine. Collision was just added for sprites and walls. The buttons to the right are for switching between characters (who each have different skillbars).
+
+
+
+
+January 13, 2019 - Videogame perspective is so different from perspective in illustration. Scale of characters vs environment is another quirk of games I had 0 experience with. I was vaguely going for an old Western RPG style with tall, somewhat realistic sprites with non-distinct faces. Something like Divine Divinity.
+
+
+
+
+April 23, 2019 - This is a mockup, but the game did look like this for a while. The fireball projectile didn't come until later, though. Here, I was trying to get a little more of a top-down view but not really. Instead of cats, Angel's fighting with a coyote. The government stopped removing coyotes from my old neighborhood, so they killed all the neighborhood cats except one and I saw him running away from a big coyote during a storm, so maybe he's gone now, too. It's just not right.
+
+
+
+
+May 25, 2019 - The slanted edition was so annoying. It's not isometric, it's just at an obscure angle because I drew these assets more for fun than to actually be practical. I do reuse the tree + bushes a lot, though. I also tried a more chibi sprite because they are soo common, might as well try it out.
+
+
+
+
+June 29, 2019 - Trying a shopping center level now. It's reeally spaced apart. It's inspired by a real shopping center;;
+
+
+
+
+July 25, 2020 - There's some missing in this gap, so I'll add in more pics if I find any. This is the first version of a cavern level for the blessfrey demo. It's inspired by local caves.
+
+
+
you're up to date.
+
+Hope you enjoyed seeing the different art I've used for blessfrey over the years. Even if I never really polish anything, it's nice to iterate to get a sense of game art and blessfrey's personal style. Hopefully it ends up looking okay okay when I do start polishing. But until then, in the words of YandereDev, "All art is placeholder."
+
diff --git a/src/diary/entries/hold/240225 b/src/diary/entries/hold/240225
new file mode 100644
index 0000000..fd80ed6
--- /dev/null
+++ b/src/diary/entries/hold/240225
@@ -0,0 +1,56 @@
+
+
a look into an RPG achievement system
+april 2, 2021
+#achievements #knowledgebase
+
+Designing an achievement system without any octopus tangles.
+
+
+The Singles sheet has a row for each parent and a field for sex, breeding status, breed, breed's cooldown, date bred, nest ready, date ready to breed again, and a cooldown countdown. I'm not usually interested in this information by itself, but it's used by the Pairs sheet.
+
+
sex
+The sex field is limited to ♂ or ♀ and can be selected using a dropdown menu. The content will color the cell blue or pink.
+
+I made the dropdown menu through Data Validity (Data > Validity...).
+
+The possibilities are in a column in the Calculator sheet and set the criteria to allow that cell range as the source. The color is dictated by Conditional Formatting (Format > Conditional Formatting).
+
+There's one condition for boys and one for girls. I set the condition to look for 'cell value is' 'equal to' then either "♂" or "♀" with the quotes. For Apply Style, I made a new style with a blue background for ♂ cells and a pink one for ♀s.
+
+
breeding status
+Depending on the breed's cooldown and date of last breeding, the cell will say "Ready" or "Cooldown" in green or red.
+
+The formula is =IF(H2<=TODAY(),"Ready","Cooldown"). IF takes three parameters here: the condition (if the date ready is today or earlier), the text to display if the condition's true, and the text for false. The colors come from Conditional Formatting again.
+
breed
+The breed, like the sex, is a Data Validity-determined dropdown menu. The list of breeds is sourced from a column in Calculator.
+
+
breed's cooldown
+Each breed has a different cooldown duration. The field uses a formula to refer to the Breed field and search in Calculator for the corresponding cooldown information. The formula is =VLOOKUP($D2,$Calculator.$G$3:$H$18,2,0). Here, I take the breed, take it to the breed + cooldown columns in the Calculator sheet, and return with the data from the 2nd column in that group.
+
+
date bred
+Every time I breed a dragon, I type the date in its Date Bred field. If the dragon is unbred, I use its birthday instead.
+
nest ready
+This is a simple formula - the date bred + 6 days. It's 6 because 6 days is amount of time it takes for an egg to hatch.
+
+
date ready to breed again
+This is another simple formula - the date bred + the cooldown.
+
+
cooldown countdown
+This one is relatively simple. It's just today minus the cooldown, but I added some steps to add " days" after the number. If there are 0 or less days, I opted for it to say nothing because the default "#N/A" is annoying to look at. The formula is =IF($H2-TODAY()>0,CONCAT($H2-TODAY()," days"),""). You can see IF's three parameters: (condition) there's more than 0 days until cooldown ends, (if true) return that number + " days", (if false), return nothing. CONCAT concatenates the two parameters it's given, so it finds the number of days and adds " days". That means it'll use the plural even for 1. I could use another IF to fix that, but I barely refer to this sheet myself anyways.
+
+
dragon pairs
+The Pairs sheet is the sheet I check every time a nest opens. At a glance, it tells me which pairs are ready and which ones will be soon. It also lets me check whether my goal is within range of the pair and which of their offspring most closely resembles my goal. The fields are Project, Male, Female, Status, Date Ready, Countdown, Colors, Genes, Best Son, and Best Daughter.
+
+
project
+I add the project, so I know my goal for the pair. It's helpful when prioritizing or sorting.
+
male + female
+I add the dragon pair's names here. Data validity makes sure the name corresponds to a dragon from the Singles sheet.
+
+
status
+Both members of the pair must be ready before the pair is ready. =IF(AND((VLOOKUP($B2,$Singles.$A:$C,3,)="Ready"),(VLOOKUP(C2,$Singles.A:C,3,)="Ready")),"Ready","Cooldown"). There's a new function AND, which just takes its parameters and considers them together. All together, the formula wants to take each name in the pair, hunt down that dragon's row in the Singles sheet, and check its status. I use AND so that the condition won't be true unless both dragons are ready.
+
+
date ready
+I find the date for when the pair is ready with =MAX(VLOOKUP($B2,$Singles.$A:$H,8,),VLOOKUP($C2,$Singles.$A:$H,8,)). MAX takes its parameters and returns the larger value. Basically, it wants to use each dragon's name to check when their cooldown will be ready on the Singles sheet. I use MAX because the pair isn't ready until the parent with the longest cooldown is ready.
+
+
countdown
+The formula =IF($E2-TODAY()>0,CONCAT($E2-TODAY(), " days"),"") is similar to the one from Singles, but this time, I used Conditional Formatting to make countdowns of 1-5 days an eye-catching yellow.
+
+
colors + genes
+I can't always find parents that are in range of my goal, so noting the range helps me prioritize. PST stands for Primary, Secondary, and Tertiary, since each dragon's appearance is determined by three colors and three genes.
+
+I really only track cash shop genes, since they can only be obtained through breeding or real world money. If I want an in-game cash gene, it's a lot easier to earn money than to gamble with RNG.
+
best son + best daughter
+Space is limited, so I want to know which dragons contribute the most to their projects. It can take several generations of dragons to get the desired offspring, so I want to make sure I'm narrowing the color and gene range with each generation.
+
calculator + data
+The Calculator sheet is a catch-all for data and extra formulas. I have everything needed for Data Validity on other sheets here, and I keep calculators to help know what to write on other sheets.
+
+
colors
+FlightRising's dragon colors exist in a color wheel. If one dragon has a Cream primary color and mates with an Antique dragon, the offspring can have a primary in Cream, Antique, or White. Since the colors were arbitrarily chosen by the developers, you won't know what to expect without referring to a color chart. The one below was made by Rauxel and also contains the original, much smaller color range.
+
+When going for a particular color, the parents should be as close to that color as possible. I could manually count the colors in-between, but that's unreasonable when there's almost 200 colors. Instead, I have all the colors in a column and a little calculator to tell me how far over or under the parent's colors are. I enter primary, secondary, and tertiary colors of the goal dragon and dream dragon. The distance's magnitude and direction from the goal are calculated automatically.
+
+The formula for magnitude is =ABS(MATCH($C3,$F$2:$F$178, )-MATCH($B3,$F$2:$F$178, )). MATCH takes the color and returns the position within the color chart. ABS gives the absolute value of its parameter. In other words, I subtract the parent's colors from the goal's colors and get the absolute value.
+
+The formula for direction is =IF((MATCH($C3,$F$2:$F$178,)-MATCH($B3,$F$2:$F$178,))>0,"↓","↑"). Here, it displays ↓ if the parent's colors are below the goal's, and ↑ if otherwise.
+
+The calculator ignores the fact that the color chart is a circle. Honestly, I don't breed along the extremes (white and pink), so I haven't fixed this yet. If you need to, you can find the distance between the parent color and the distance the nearest extreme (either Maize or Pearl), the distance between that extreme and the goal color, then add them together. If you're not sure which extreme is nearer, complete the process for both then take the smaller number - that's what the final formula's going to do anyways.
+
breeding info
+These are the columns used by the breeding pages for validity and VLOOKUP.
+
breeding day calculator
+If I need to know how long ago a dragon was bred, I can use today's date and the cooldown to find it out. The formula is very simple, just the given date minus the cooldown.
+
project sheets
+Here I list the dragons by project, tracking their genealogy, sex, colors, genes, and average distance from goal colors.
+
+
father + mother
+Dragons cannot breed with relatives within 5 generations. To ensure I'm keeping bloodlines separate, I plan a family tree separately from my spreadsheets. Using the father and mother's names, I can remember which family the dragon's in or if it's related to the other dragons at all.
+
sex
+Male or female, with colored conditional formatting so I can scan by sex more easily.
+
primary, secondary, + tertiary colors
+I usually need to use the color calculator on Calculators for this information. I list the parent's distance from the goal color in each field. In the first row, I list my goal colors for reference.
+
gene 1, 2, + 3
+If the parent has one of the goal genes, I list it here. That way, I can prioritize by gene. I keep the other fields empty. For expensive genes, I only allow parents with genes of equal rarity, so the chance of passing down the goal gene is always 50/50. If my goal is a gene I can just buy, I don't care to track it since buying is easier than breeding.
+
average
+Genes are 50/50, but my goal colors are usually around a 1/20 chance. Consequently, I'm much more concerned about the color of a dragon than his genes. To give me a general evaluation of how close a dragon is to the goal colors, I use =AVERAGE(E3,G3,I3). The AVERAGE function adds its parameters and divides by the quantity of parameters given. If I had a parent with perfect colors, it would have an average of 0, so ideally, dragons with the lowest average are my most valuable for breeding. Genes usually factor in as well.
+
that's all~
+In closing, I'll share a few of my cutest dragons (all of which are obviously using official FlightRising assets). See you two Thursdays from now!
+
+
+Last updated May 26, 2021
+
diff --git a/src/diary/entries/hold/240227 b/src/diary/entries/hold/240227
new file mode 100644
index 0000000..d8cbace
--- /dev/null
+++ b/src/diary/entries/hold/240227
@@ -0,0 +1,69 @@
+
+
sewing my own clothes
+june 24, 2021
+#offtopic
+
+I've spent more time pattern-making than programming, so let's take a fashion break this week!
+
+
my life story told through clothes
+Hand-me-downs from older girls at school and church have been a staple in my wardrobe for the majority of my life. Anything that was too big, I kept around to grow into later. I loved them because they weren't like anything my peers were wearing. My cousin's old boxy denim dress with white embroidery received comments that I looked like I was from a different fashion era - maybe an insult, but it's a really curious way to be described. Also, sometimes they were old enough to swing back around to the cusp of fashion, like the story of my wide leg jeans.
+
+When I grew up, I thought I could finally invest in a few nice work and event clothes for my adult wardrobe, since everyone said I was finished growing. Then I get a freakish growth spurt in my early 20s. My doctor wasn't concerned, but nothing fit around my shoulders anymore...everything but hand-me-downs from a old boss's daughter. I welcomed the opportunity to once again lean into hand-me-downs and avoid the costly and demotivating search for clothing in my size. And with the initial pressure of having no clothes resolved, I never really tried to replace my wardrobe. I'm even on trend, since thrifting has exploded in popularity.
+
+After months of pandemic-era shelter-in-place orders, I crave normalcy and looking cute again. I still don't really have anything in my style, though, just other people's clothes. I'm at a more stable and independent point in my life, so I should dress like it.
+
+
capsule wardrobe concept
+I do nothing without a thesis. With a higher-level concept to guide me, everything down to the little details can stay consistent. Obviously taking a design-oriented approach applies to gamedev, too. It's kind of like a style guide for sewing.
+
+My functional goal is to fill out my wardrobe with some solid core pieces that are easy to mix and match. I'll worry about more fashion-oriented or niche pieces later. My more abstract concept stems from my story above - my attachment to my old hand-me-downs, my desire to have an individualized style, and a lingering pandemic preference for comfy, unfussy natural fibers. Technically, this translates to playing with the sizing of clothes and mixing of inspirations across decades, genders, and cultures.
+
+
sketches
+I'll make 3 mock turtlenecks, a button-down shirt, a bodice, a pair of pants, two shorts, a light bomber jacket, a kimono, two pajama sets, a swimsuit, and a few hair accessories.
+
+
+
+
+Bomber: I've had a favorite light rayon bomber jacket for 10 years, but it's wearing out and has some weird bleach stains. This is basically a knockoff of a BB Dakota design. This one is a shiny pink polyester (a lustrous exception to my natural fiber rule) with multicolored lace trim, a metal zipper, and a beige drawstring. I think I can keep the old BBD jacket, too, but it needs embroidery or appliques over the stains.
+
+Bodice: This is a light layering top made from batiste. It will have ruffles at the shoulders and long straps from the waist to wrap around and tie in a bow.
+
+Kimono: I have a favorite purple floral chiffon kimono that has a fraying seam. After three repairs, it needs a semi-retirement. This design but with rayon batiste and a dark inky print...if Mood ever restocks the Penitentiary Block print!
+
+泣き虫 (Cry Bug): An oversized poplin button-down with short sleeves and an oversized beetle print. It has black piping along seams, a pocket, and black glass shank buttons. The fit is meant to resemble your dad's shirt where the short sleeves come down too far, the armholes are too deep, and the pocket is too big, but the collar and length will be appropriately proportioned for me. It's white with an oversized print that visually plays up the unusually large proportions of the shirt. The piping and glass shank buttons remain the correct proportions, though.
+
+Mock Turtle: There's three light mock turtlenecks. This is my favorite staple, but I lost my charcoal gray one 2 moves ago. (RIP) One will be a foil knit with thumbholes, one is a striped knit, and one is a 4x2 rib knit.
+
+
+
+
+Pants: Straight-legged plaid linen pants with a fly-front closure, belt loops, side pockets, and blind hems. Linen feels great in the summer and lends itself to a well-tailored staple.
+
+Shorts: Two pairs of linen shorts, one with stripes and striped fringe ribbon trim and the other with a dragon fruit print and cuffs and a bow belt.
+
+
+
+
+Swimsuit: The one piece swimsuit is made out of pastel seafoam and pink neoprene with pops of sulfurous yellow in an abstract swampy design. I actually lived around wetlands for most of my life, so it's cool to see a wetlands design instead of another tropical beach or flowering meadow print. It has long sleeves, a mock turtleneck, and an invisible zipper at the center back. The focus is the obi belt made from a contrasting black neoprene. There are three panel-and-tier ruffles over the bottom to give some illusion of volume against the closely-fitted belt and top without adding more unnecessary bulk. I'm not 100% on materials yet and may need to bring in a thinner swimwear tricot for the layers.
+
+Pajama sets: The pajamas are not my design. They are basically knock-offs from Yahoo! Japan shopping, since I don't feel like importing mall-tier pajamas. (The originals are Japanese-style yukata-style long sleeve pajama set for spring and fall from OPEN-CLOTHES and summer pajama set for ladies in their 20s with flared collar and cute short sleeves from kittyshop.) The only real design change is using oversized rick rack instead of ruffles on that second set. Pajamas are the most pressing sartorial area in my life in which I need a self-assertion. People like to gift me pajamas, but they always ask me my size then buy a size or two down. Why won't anyone believe I'm not an XS! The one time I got something that fit, it was unwearably heavy fleece for my year-round hot climate. I don't want to be ungrateful or wasteful, though, so I've either crammed myself into tiny pajamas or sweated since I was little. That's so silly, especially now that I'm an adult. There's beautiful but unused jacquard fabric hanging in my closet. There's nothing stopping me from turning it into cute Japanese jacquard pajamas that actually fit.
+
+
pattern-making and sewing so far
+I'm working on the 泣き虫 button-down shirt first, but while waiting for the buttons to arrive, I went ahead and got one version of the mock turtleneck pattern done.
+
+
+
+
+
+
+
+I'm in the middle of sewing the button-down. The sleeves are cuffed and reinforced with interfacing (finally available again after the early pandemic mask-making frenzy) and decorated with the piping. Next, I'll set the sleeves in and work on the button placard.
+
+
+
+
+After the button-down is finished, I really want to tackle a swimsuit next. I was prioritizing everyday clothes, but I've been thinking it would more fun to have a swimsuit as soon as possible. Since I was planning to take my time with it, the obi swimsuit is not only made from the most challenging fabric, but it also has the most elaborate design. It'll be worth the effort, though.
+
+Anyway, thanks for reading an off-topic post. Back to gamedev next time!
+
+Last Updated January 11, 2021
+
diff --git a/src/diary/entries/hold/240228 b/src/diary/entries/hold/240228
new file mode 100644
index 0000000..3e6b5c5
--- /dev/null
+++ b/src/diary/entries/hold/240228
@@ -0,0 +1,41 @@
+
+
how to attack a moving target
+july 8, 2021
+#ai #character #combat #design #movement
+
+I'll share my tentative design for the attack-movement loop.
+
+The attack-movement loop needs to allow the character maintain attack range while attacking. The flow is complicated to follow, but this is how it works for now:
+
+The code is color-coded by object. Warm gray is input, orange is the character's action module, yellow is the character, yellow-green is the character's equipment module, blue-green is the attack handler, blue is the AI's attack module, purple is the AI's movement module, pink is the AI, brown is the KnowledgeBase's MessageBus, and cool gray is the character's kinematic body.
+
+
the loop explained
+Upon attack input, the character sets up for attacking and creates an attack timer. On timeout, the character's weapon swings. If the character is out of range, the "out_of_range" signal is emitted. Otherwise, the weapon successfully swings, either emitting "target_dead" or "hit."
+
+The AI receives these signals. If the target was out of range, it sets up to follow attack target.
+
+Every AI tick, it prompts the character to pathfind to the target then sets the character's velocity to the current_dot (the first node the character is trying to reach in path) minus the character's global_position.
+
+Every frame, the character's _process(delta) method calls move_and_collide with velocity * speed * delta. If the character's velocity isn't 0,0, the "moved" event is published to the Knowledge Base's MessageBus.
+
+The movement handlers are subscribed to "moved," and will emit signals if the character reached either the next waypoint (the target or the chosen goal point at the end of the path) or the current dot (the first point along the pathfinding between the character and the goal point).
+
+The AI receives these signals. If the next waypoint is reached, it's removed from the list of waypoints, the "arrived_at_attack_target" signal is emitted, and movement is cleared.
+
+Then the AI receives the "arrived_at_attack_target" signal and prompts the character to begin the attack all over again.
+
+
in-game
+It works in-game, too, but it's pretty janky, especially without animations. If the slime is slow enough, the player character attacks until it gets too far away, moves back in range, and continues attacking. If it's too fast, though, she never gets to attack and jitters constantly after the slime.
+
+Too fast:
+
+
+I'll work it out sooner or later, dependent on how hectic moving turns out to be.
+
+(By the way, that's my first gif recorded and edited entirely in ffmpeg. It's not pretty, but at least I could write my own bash script without relying on copypasta forum code this time. I was trying to follow the documentation website before, but it's arcane. The man page is much easier to understand and search through.)
+
+
+Last Updated November 13, 2021
+
diff --git a/src/diary/entries/hold/240229 b/src/diary/entries/hold/240229
new file mode 100644
index 0000000..827c333
--- /dev/null
+++ b/src/diary/entries/hold/240229
@@ -0,0 +1,52 @@
+
+
skills aren't a manor; they're the DMV
+april 7, 2022
+#skill #redesign
+
+
designing on autopilot
+Phases are necessary for skills to be reactive. For instance, take Blessed Purity: Cure 2 poisons from target. Heal for 35 per poison removed. So the Cure keyword comes first, and Heal cannot activate until the Cure phase resolves. To lay out these phases, I partially copied Guild War's skill effects without much thought: initial effect -> main function (not sure if there's even a name for this) -> end effect. Most keywords are thrown into the main phase, anything that needs to happen immediately goes in initial, and anything that happens at the end goes in the end.
+
+Naturally, I had a lot of problems with flow. Some keywords (like Bleeding) can last up to half a minute, while others (like Attack) are executed instantly. When I let the skill run without breaks, the end effect executed long before earlier keywords finished up. When I forced keywords to execute one at a time, I had projectiles that awkwardly stuck around until an unrelated keyword timed out.
+
+It's time to actually turn my brain on and design with diagrams.
+
+
+
+The concept of a phase brings nothing to skills. Even Guild Wars seems to use "initial effect" and "end effect" more like conditions than integral structure. The majority of skills don't operate in phases anyway.
+
+Some keywords need to know what skill they belong to, what skill other keywords belong to, and who their user and target are. The poorly understood flow of skills sometimes causes this information to be freed with the skill before it's needed.
+
+Also, in general, keywords within the same phase run sequentially when that isn't necessarily my intention. It kind of invalidates the entire concept of phases, too. Sure, an end effect keyword is certainly called after an initial effect keyword, but in most versions of Blessfrey's skill.gd, the flow is identical when putting the same keywords one after the other into the main phase.
+
+It makes me wonder what a phase even is. I can't even define the boundaries of the phase in the diagram because it's so arbitrary. Do my skills need phases at all?
+
+Keywords already have structure built into them. Keywords lock their effect behind an entry condition (like curing 1 or 2 poisons) and guard the exit with another condition (like bleeding lasting 30 seconds). It would make more sense if end effect keywords were replaced by keywords that trigger upon the completion of earlier keywords, while other keywords are free to fire off simultaneously.
+
+
+
skills should feel like going to the DMV
+Most DMVs I've suffered through in my life have been all-day affairs of standing in lines that stretch around the building through the bad side of town, attended by only one service desk manned by a slow, error-prone clerk. Honestly, that's not too far off from my original skill design. I'm not referring to those DMVs, though. The DMV that's closest to my new location is much more efficient, lets you sit as you wait, and has (novel concept) multiple service windows. That's a much better model for my skill.
+
+
+Since my "DMV" will be a separate entity from the skill (basically an event handler), the fate of the skill is less important when it comes to data it holds inside. Flow is also more controlled, since the skill itself cannot progress its own current state.
+
+As for flow, obviously, skills without triggers can fire off immediately. The DMV will connect to the KnowledgeBase and begin listening for any event topics that could trigger the keywords. Once a keyword's conditions are met, it will become active and be applied to the target. The DMV also sets up a timer for its duration or listens for exit cues to know when to remove the keyword. Some keywords will never activate, but they will be freed once they had their chance. If Blessed Purity cures 0 poisons, heal will receive a sad "0" and free quietly.
+
+Under the DMV model, the skill's flow becomes more circular.
+
+Nothing's ever going to be perfect, but taking time to plan and be intentional gives a better outcome. Never thought I'd prefer the DMV, but you can learn design concepts from anywhere.
+
+
+Last updated April 7, 2022
+
diff --git a/src/diary/entries/hold/240301 b/src/diary/entries/hold/240301
new file mode 100644
index 0000000..956693a
--- /dev/null
+++ b/src/diary/entries/hold/240301
@@ -0,0 +1,140 @@
+
+
css grid with angular (break into 2?)
+may 5, 2022
+#angular #css #webdev
+
+
start from the beginning
+Angular's documentation shares the process for beginning a new project, but I'll explain it, too.
+
+
+
Installation process will differ depending on your operating system. These commands are for Linux Mint, downstream from Ubuntu and Debian.
sudo npm install -g @angular/cli (you can decide whether to share analytics)
+
+
+
grab the template
+Now you're ready to start an Angular project. Begin in the folder you'd like your project folder to be. Instructions and files are also available on Angular's github.
+
+
+
ng new Example (accept Angular routing and CSS) Change out the name 'Example' with your project name.
+
Now you'll have a folder named 'Example,' containing your skeleton. If you didn't already have git initialized in the folder, it'll automatically do so for you.
+
+
test run
+Now you can run your example project in the browser.
+
+
+
cd Example/
+
npm start
+
Now you can browse to your project. By default, it used port 4200, so it's viewable @ http://localhost:4200/
+
When you're done, stop the script by entering ctrl + c into the terminal.
+
+
+If you see the page below, you have everything you need to get started on your own project.
+
+With a basic HTML/CSS website (like blessfrey.me), the CSS Grid allows you to align its nested divs into rows and columns. Angular allows you to break each area into a component to be styled by the grid.
+
+I'll use the petsite browser game I'm making as an example:
+
sudo npm install -g @angular/cli (you can decide whether to share analytics)
+
+
+
grab the template
+Now you're ready to start an Angular project. Begin in the folder you'd like your project folder to be. Instructions and files are also available on Angular's github.
+
+
+
ng new Example (accept Angular routing and CSS) Change out the name 'Example' with your project name.
+
Now you'll have a folder named 'Example,' containing your skeleton. If you didn't already have git initialized in the folder, it'll automatically do so for you.
+
+
test run
+Now you can run your example project in the browser.
+
+
+
cd Example/
+
npm start
+
Now you can browse to your project. By default, it used port 4200, so it's viewable @ http://localhost:4200/
+
When you're done, stop the script by entering ctrl + c into the terminal.
+
+
+If you see the page below, you have everything you need to get started on your own project.
+
+With a basic HTML/CSS website (like blessfrey.me), the CSS Grid allows you to align its nested divs into rows and columns. Angular allows you to break each area into a component to be styled by the grid.
+
+I'll use the petsite browser game I'm making as an example:
+
+These two contain all the subcomponents generated earlier.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Then the CSS grid takes place in the CSS file.
+
+
+Last updated April 12, 2022
+
diff --git a/src/index.py b/src/index.py
index 845a846..f213fba 100644
--- a/src/index.py
+++ b/src/index.py
@@ -87,10 +87,10 @@ def find_gallery(name):
gal.append([["stilllife.png","Still Life"],["dragon.png","lazy Abbey"], ["FlightRising.png","Abbey's sprite in FlightRising"],["BlackReshiram_Artfight.png","2022 Artfight attack by BlackReshiram"]])
if name == "Angel":
gal.append("Blessfrey")
- gal.append([["Chibipixel.png","One of Angel's sprites. I prefer taller, less cartoony sprites, but this style is so popular it was worth trying."],["pixelangel.png","Pixelart"],["AngelHeadphones.png","Pencil sketch"],["AngelHeadshot.png","Headshot of Angel and all her hair"],["picrew.png","made in あの子がこっちを見ている on Picrew"]])
+ gal.append([["Chibipixel.png","One of Angel's sprites. I prefer taller, less cartoony sprites, but this style is so popular it was worth trying."],["pixelangel.png","Pixelart"],["AngelHeadphones.png","Pencil sketch"],["AngelHeadshot.png","Headshot of Angel and all her hair"],["picrew.png","made in あの子がこっちを見ている on Picrew"],["AriesAngel.png","made in なさや式CPメーカー on Picrew"]])
if name == "Aries":
gal.append("Blessfrey")
- gal.append([["picrew.png","made in あの子がこっちを見ている on Picrew"]])
+ gal.append([["picrew.png","made in あの子がこっちを見ている on Picrew"],["AriesAngel.png","made in なさや式CPメーカー on Picrew"]])
if name == "Aristen":
gal.append("Black Desert Online")
gal.append([["menu.jpg","Aristen's fancy set"], ["scarf.jpg", "Newbie Aristen"], ["marine.jpg","Aristen in the Epheria Marine Classic Set"]])
diff --git a/src/static/img/art/20220622_131328.jpg~ b/src/static/img/art/20220622_131328.jpg~
new file mode 100644
index 0000000..381341c
Binary files /dev/null and b/src/static/img/art/20220622_131328.jpg~ differ
diff --git a/src/static/img/art/HeliaWarrior.png b/src/static/img/art/HeliaWarrior.png
new file mode 100644
index 0000000..c99ea58
Binary files /dev/null and b/src/static/img/art/HeliaWarrior.png differ
diff --git a/src/static/img/art/HeliaWarriorthumb.png b/src/static/img/art/HeliaWarriorthumb.png
new file mode 100644
index 0000000..e6d7ef7
Binary files /dev/null and b/src/static/img/art/HeliaWarriorthumb.png differ
diff --git a/src/static/img/art/RuneBlessSketch.png b/src/static/img/art/RuneBlessSketch.png
new file mode 100644
index 0000000..2511f55
Binary files /dev/null and b/src/static/img/art/RuneBlessSketch.png differ
diff --git a/src/static/img/art/RuneBlessSketch.png-autosave.kra b/src/static/img/art/RuneBlessSketch.png-autosave.kra
new file mode 100644
index 0000000..05aba8c
Binary files /dev/null and b/src/static/img/art/RuneBlessSketch.png-autosave.kra differ
diff --git a/src/static/img/art/RuneBlessSketchthumb.png b/src/static/img/art/RuneBlessSketchthumb.png
new file mode 100644
index 0000000..f5e09e8
Binary files /dev/null and b/src/static/img/art/RuneBlessSketchthumb.png differ
diff --git a/src/static/img/char/Angel/AriesAngel.png b/src/static/img/char/Angel/AriesAngel.png
new file mode 100644
index 0000000..201901a
Binary files /dev/null and b/src/static/img/char/Angel/AriesAngel.png differ
diff --git a/src/static/img/char/Angel/AriesAngelthumb.png b/src/static/img/char/Angel/AriesAngelthumb.png
new file mode 100644
index 0000000..170f92d
Binary files /dev/null and b/src/static/img/char/Angel/AriesAngelthumb.png differ
diff --git a/src/static/img/char/Aries/AriesAngel.png b/src/static/img/char/Aries/AriesAngel.png
new file mode 100644
index 0000000..201901a
Binary files /dev/null and b/src/static/img/char/Aries/AriesAngel.png differ
diff --git a/src/static/img/char/Aries/AriesAngelthumb.png b/src/static/img/char/Aries/AriesAngelthumb.png
new file mode 100644
index 0000000..170f92d
Binary files /dev/null and b/src/static/img/char/Aries/AriesAngelthumb.png differ
diff --git a/src/views/art.tpl b/src/views/art.tpl
index f99c500..368d5f1 100644
--- a/src/views/art.tpl
+++ b/src/views/art.tpl
@@ -24,6 +24,8 @@
["Tessa.png","Tessa in athleisure"],
["WISE.png","WISE, a lost Canaanite virtual assistant."],
["Rune_bank.png","Learning about American culture with Rune"],
+ ["HeliaWarrior.png","Helia, copying the pose from Warrior's concept art for Guild Wars"],
+ ["RuneBlessSketch.png","Rune and Bless"],
["pencilsketchangelchloe.png","Angel and Chloe"],
["dgbanner.png","Old Blessfrey character art"],
["Willa.png","The original concept for Helia, back when her name was Willa"]